OmniAICreator/Qiita-1.07M huggingface dataset:
「GPT、今日の日付を絵柄の上に表示するコードをちょうだい」

## プロンプトの概要
ここで紹介するプロンプトを使うと、[「2071年のドーナツ部長」](https://twitter.com/WinstonDreamer/status/1665369102360399873?s=20)の一部の機能を持ったコードを生成することが可能です。


### どんなプロンプトなのか？
2枚のPNG画像（背景透過）と3種類のテキストを重ね合わせて、
ブラウザで表示可能にするコードを生成します。
※プロンプトは自由に改変いただいても構いません。もちろん、商用利用も可能です！

今日の日付を取得し、画像の上に表示しますので、Javascriptを改修することで
ブラウザ上で動く時計として拡張させることも可能です。

また、このアウトプットをIPFSへ保存することで、動的に絵柄の変わるNFTにも
応用ができます。

### 出力レイヤ
#### 出力レイヤー構成
─ Text2
┣ Text1
┣ img2
┣ img1
┣ Text3
┣ Background

#### 出力物
・HTML
・CSS
・javascript

### 使用GPT
GPT-4を想定しています

## どんなアウトプットが期待できるのか
### 出力レイヤー構成
─ Text2：Hello Worldにて白色で表示します
┣ Text1：今日の日付を「年月日形式」にて黄色で表示します
┣ img2：1600 × 1600サイズのpng画像をご用意ください（img2.png）
┣ img1：1600 × 1600サイズのpng画像をご用意ください（img1.png）
┣ Text3：縦書きで「拝啓」と白色で表示します
┣ Background：青色のベタ塗りです

### 出力物
・HTML
・CSS
・javascript

### 注意事項
※まれにHTMLとCSSのみになることがありますが、「Javascriptも追加して」とオーダーを追加することで解決できます
※ご利用には、コードエディタ（テキストエディタ）が必要です

## プロンプト
### 以下のプロンプトをご利用ください
あなたはプロのプログラマです。HTMLとCSS、場合によってはJavascriptを使って、Webページを作成することができます。

以下の条件でHTMLとCSSを作成し、ブラウザで表示ができるようにしてください。

#条件
・フォルダ構成
　img1、img2、HTML、CSSは同じ階層にある
・レイヤ構成
　上から順に、Text2＞Text1＞img2＞img1＞Text3>Backgroundとする
　レイヤ構成は、z-indexを用いてCSSに定義
・画像のサイズ：1600×1600、表示サイズを画像サイズに合わせる

・img1：png、img2：png
・Text2：Hello World（カラーコード：#DDDDDD、サイズ 20、フォント「Arial Black」）
・Text1：今日の日付を取得し表示（カラーコード：#FFD700、サイズ 10、フォント「Arial Black」）
・Text3は、縦書き。 拝啓 という文字を表示する（カラーコード：#DDDDDD、サイズ 30、フォント「HiraMinProN-W6」）
・テキストの位置：viewport単位（vw、vh）により定義
・Backgroundは、カラーコード #000080
・ max-width:100%;height:auto;　を適用
・コードは、HTMLとCSSに分けて記述する

### 出力物をカスタマイズするポイント
### テキストの大きさを変えるには？
「style.css」をコードエディタで開いて、「#text1」または「#text2」の「font-size:」の数字を変更し、上書き保存してください。

（例）

text1 {
position: absolute;
top: 50vh;
left: 50vw;
font-family: 'Arial Black', sans-serif;
font-size: 10px;
color: #FFD700;
z-index: 4;
}

※上記の「font-size: 10px;」を「font-size: 50px;」と変更すると、大きくなります。

#### テキストの位置を変えるには？
「style.css」をコードエディタで開いて、「#text1」または「#text2」の「top:」「left:」の数字を変更し、上書き保存してください。

（例）

text2 {
position: absolute;
top: 40vh;
left: 40vw;
font-family: 'Arial Black', sans-serif;
font-size: 20px;
color: #DDDDDD;
z-index: 5;
}

※上記の「top: 40vh;」を「top: 80vh;」と変更すると、下に移動します。
※上記の「left: 40vw;」を「left: 60vw;」と変更すると、右に移動します。

#### テキストの色を変えるには？
「style.css」をコードエディタで開いて、「#text1」または「#text2」の「color: #DDDDDD;」のカラーコード（ #DDDDDD）を変更し、上書き保存してください。

※カラーコードは、「CSS カラーコード」と検索するとわかると思います。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/18/prompt-001/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
端末で色着きの文字に色を着ける


`ansicolumn` というコマンドを作っていて、こんな風にテキストファイルをマルチカラムで表示することができる。

```sh
less lib/App/ansicolumn.pm | ansicolumn -DPC2 | less
```

![スクリーンショット 2023-06-18 19.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/8f47061d-f533-bc54-659c-0235b3c4217e.png)

最初に `less` を使ってるのはなぜかというと、それによってソースコードをハイライトする設定になっているからだ。具体的には `LESSOPEN` という環境変数を設定して、最終的にはこんなコマンドが実行されているのだが、めんどくさくて打ってられない。

```sh
source-highlight -f esc -i lib/App/ansicolumn.pm
```

`ansicolumn` は、この例のように各ページに枠をつけることができる。これは `--border-style` というオプションで指定できて、上で使っているのは `heavy-box` というスタイルで `--cm BORDER=C` というオプションでシアン色を指定している。さて、少し前に、枠線ではなくボード状の形式で表示してみようと思って `--black-board` というスタイルを作ってみた。

```sh
ansicolumn -DPC2 --black-board lib/App/ansicolumn.pm | less
```

![スクリーンショット 2023-06-18 19.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/af369e6f-241a-af61-2d50-2f0b89ea20ce.png)

なかなかいいじゃないの。これは、`--inner-box ` というスタイルを使って、枠の色とテキストの背景色を合わせることで実現している。しかし、ハイライトしたデータを表示するとこうなった。

```sh
less lib/App/ansicolumn.pm | ansicolumn -DPC2 --black-board | less
```

![スクリーンショット 2023-06-18 19.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/3704bb79-2560-6eda-e34d-5431fe228934.png)

台無しだ。`ansicolumn` は `Term::ANSIColor::Concise` というライブラリを使ってそれぞれのテキスト行に色を着けている。これはまあまあよくできていて、すでに色情報が一部に含まれている文字列に着色する場合、色が着いていないすべての部分にそれを適用するようになっている。そのような工夫をしないライブラリの場合には、最初の既存の着色部分でリセットされてしまうので、それより後方には効果が反映されない。

しかし、それぞれの着色部分の終わりでリセットしているので、既存の着色部分の中には効果が及ばない。ハイライトで指定しているのはテキスト色だけなので、背景色の指定とは両立可能なのにだ。

今回ライブラリをアップデートして終了部分ではリセットしないようにした。その結果がこれ。

![スクリーンショット 2023-06-18 19.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/950d0522-e957-b122-b0b5-b626f3b5d09b.png)

いいじゃないの。ちなみに `green-board`、`white-board`、`slate-board` というオプションも定義されている。

![スクリーンショット 2023-06-18 19.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/1c7be0b8-539c-b45f-d7f2-76db49441e7d.png)

オプションの定義はこう。

```
option --board-color --bs=inner-box --cm=BORDER=Z$<2>,TEXT=$<shift>/$<shift>

option --white-board --board-color 000 L24
option --black-board --board-color 555 L05
option --green-board --board-color 555 (30,77,43)
option --slate-board --board-color 555 <dark_slategray>
```

`--board-color` はテキスト色と背景色の2つのパラメータを受ける。これを使って独自のオプションを定義することもできる。

`ansicolumn` コマンドについては、こちらの記事をどうぞ。

https://qiita.com/kaz-utashiro/items/1cdd71d44eb11f3fb36e

インストールはこんな風に。

```sh
cpanm -n App::ansicolumn
```

リポジトリはこちら。

https://github.com/tecolicom/App-ansicolumn

https://github.com/tecolicom/Term-ANSIColor-Concise
電子の海を漂っていたら音楽鑑賞趣味人向けのSnakeoil OSなるものを見つけた話

## ラズパイオーディオもやりにくくなってきた昨今

今のRaspberry Pi、高くないスか？半導体が足りないのがまだ続いている昨今、Raspberry Piもご多分に漏れず生産量が足りなくて、値段が高止まりしている状況。

## ThinkCentre Tinyを中古で買って適当なUSB DACをつけてオーディオPCを作りたい

数年前に3万くらいで買ったCore i5第4世代あたりのThinkCentre TinyをオーディオPCにしたい！

Ubuntu Studioはフットプリントが大きすぎて、そもそもこのOS作る方の人向けじゃんと思ってやめて、Kona Linux6を入れて「常時起動マシンには向いてない」と作者が書いててそれもやめにして、じゃあVolumioだと思って入れてみたらUSBメモリで運用するような感じになってしまってそれもなんかううーん、って感じで。

## 夜中に発見したSnakeoil OS

https://www.snakeoil-os.net

なんだこれは、と。日本語の情報を探そうとしても見つからない。ならば私がエバンジェリストになろう。

「無料版」と「寄付した版」があって、無料版だとSqueezeliteかmpdしか使えない。私の用途ではこれで事足りた、のだが、2ドルくらい寄付するとアクティベーションコードが送られてきて、mpdのバージョン違い、Squeezeliteのバージョン違いを楽しめたり、別途有料になる再生ソフトやらCLEMENTINEやら入れられたりする。

面白そう！！！

## どうやって入れるんだい

Ubuntu Serverを入れて(SSH Serverが入っていればいい)、そこに100MBくらいのインストールファイルを転送して、
```
sudo bash ～～～～.sh
```

を叩けば勝手にインストールが進んでいく。楽ちん。

![2023-06-18 19.59.51 snakeoil.local dd78c0ef4253.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/7e27e80c-aeca-f36d-f50c-f13b164ae411.jpeg)

こんな感じで、Webから操作していく感じになります。

![2023-06-18 20.01.50 snakeoil.local f11618943600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/deac66ea-a7a6-edee-3314-136b496f80db.jpeg)

寄付版だとこのくらいインストールできるソフトウェアが増えます。寄付以前のは取り忘れました。

![2023-06-18 20.03.25 snakeoil.local 883ea46a3c8e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/4957d04f-abba-13b6-f29b-c2a8c57d09c5.jpeg)

アップデートなどはここから。.fwファイルなどを投げ込めば勝手にインストールされます。

## 寄付版使いたい！！

基本はPaypalから寄付をする形になります。つまり、日本からはできない。ただ、Patronで一度2ドルくらい寄付して、寄付したからアクティベーションコードをおくれ、とメールすると数時間くらいたつと送られてきます。Paypal経由だとものの5分で送られてくるらしいのですが。

## Logitech Media Serverが入れられる、ということは

らじるこプラグインガ使えて、Radikoエリアフリーだと全国の民放局が聞けます。

![2023-06-18 20.09.33 192.168.1.42 2d32833df47f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/46050a3c-1bf1-b936-2549-00aa756f667b.jpeg)

こんなふうに。

また、昔はSpotify Connectを入れられたのですが、今は入れられないのでLMSのSpottyを使う形になります。

![2023-06-18 20.11.40 192.168.1.42 95b09ea0bf57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/5efb743a-dd4d-9800-1d79-7f7f8b6b0acf.jpeg)

Spottyを使う上で気をつけたいのは、サーバー設定のファイルタイプのところでSpottyの「Ogg Vorbis」の所を無効にしてあげないとSqueezeliteが落ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/ed234b3a-e3f9-18de-d760-839419a1dce5.png)

このように。

で、やはりLMSなのでこういうこともできます。

![2023-06-18 20.16.24 192.168.1.42 1f3f6fb9bade.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/cebab516-a765-5867-10b9-e90bc37cc1c2.jpeg)

DI.FM系のラジオ局も聞けるようになるんですね。私的にはこれだけ音楽ソースがあれば十分。一日中音楽聞くのに困りません。

音質もいいのですが、このお手軽さに脱帽しました。

そうそう、LMSでこんな画面見たことないよって人はLMS マテリアルスキンで検索してみてください。見つかると思います。


最初のshファイルはSnakeoil OSのフォーラムに参加しないとダウンロードできないようですが、それに抵抗がなければ是非お試ししていただきたいものになります。

以上、ばりっぴでした。
後置インクリメントでJavaのコードをちょっとスッキリさせる

# はじめに
後置インクリメントの特性を活かして、ちょっとだけコードをスッキリさせる1例を紹介します。
本当にちょっとだけなので既に何となくやってた人は参考にならないかもしれません…

# 後置・前置
まず、後置・前置についてJavaを学習されてた方なら聞いたことあるかもしれません。
ある変数をインクリメント・デクリメントする際に演算を **前もって行うか** **後で行うか** の違いになります。


では、次で後置インクリメントの特性を活かしてコードをちょっとスッキリさせる例を紹介します。

## Listから要素を取得した後、インデックスをカウントアップしたい
あるリストから要素を一つ取り出す際に、Listクラスのget()メソッドを使用するとします。
引数に取得したいインデックスを別の変数で定義して、
取得する度にインデックスの変数をインクリメントする時、以下の方法で行っている方もいると思います。

```java:
private List<Obj> objList = new ArrayList<Obj>();

private nextListIdx = 0;

:

public Obj getListOne() {
    int listIdx = nextListIdx;
    nextListIdx++;
    return objList.get(listIdx);
}

```
まぁ、別に間違ってはないし動くは動くので上のコードでも全然問題はないと思うのですが、
後置インクリメントを使用すると以下のようになります。

```java:
private List<Obj> objList = new ArrayList<Obj>();

private nextListIdx = 0;

:

public Obj getListOne() {
    int listIdx = nextListIdx++; // 次取得する添え字を渡した後、カウントアップしている
    return objList.get(listIdx);
}
```
本当にちょっとだけスッキリしましたね。

ちなみに、前置インクリメントでは期待する結果が違ってくるので注意が必要です。
```java:
private List<Obj> objList = new ArrayList<Obj>();

private nextListIdx = 0;

:

public Obj getListOne() {
    int listIdx = ++nextListIdx; // これだとカウントアップしてから渡してしまっている
    return objList.get(listIdx);
}
```

# おわりに
後置インクリメントでJavaのコードをちょっとだけスッキリさせてみました。
パッと見では自分はどういう処理を書いているか少し分かりにくく
見えてしまうのでそこが懸念点かもしれません。

そうは見えない、それでも構わないという方は使用してみてはいかがでしょうか。

https://www.javadrive.jp/start/ope/index6.html#section1
ダブルクォーテーションって三種類あるらしい。

"、“、”…この３種類。

プログラム学習で、何かのサイトを見てコードを入力していたとき
ただのコメントに過ぎない文字列を入力するのがめんどくさくてダブルクォーテーションで括られた部分をコピーしたらダブルクォーテーションが使えないというメッセージが出てきた。


何となく、自分でShit + 2でダブルクォーテーションをタイプしたらエラーが解決。
どういう事かと思ったら、全角のダブルクォーテーションが存在してそいつがどういうわけか幅が半角の様だ。


"…半角の二重引用符
“…全角、左二重引用符(引用のスタートを表すらしい)
”…全角、二重引用符(引用の終わりを表すらしい)


分かったからと言ってどうというわけではないが、こんな感じで変換されたりしている事もあるらしい。
シングルクォーテーションにも幅が半角なのに、全角のやつもある。
ただ…半角のダブルクォーテーションとシングルクォーテーションは何らかの機能をもっているやつがあるので用途はあるんだよな。

理解して使えると便利なのかもしれない。
AWS EC2 ストレージの容量追加

ボリューム追加することになったので、対応

一度増やしたボリュームは減らせないですが、追加は結構手軽に行えました

こちらに記事を参考にさせてもらいました

https://qiita.com/t_n/items/0b376269bf7f3b088699

## 1.追加したいボリュームを確認

ec2の画面から対象のec2インスタンスを選択します。
ストレージのタブから、アタッチされているボリュームが確認できます
ボリュームIDのリンクから対象のボリュームに移動できます
![スクリーンショット 2023-04-27 10.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/d106fdc3-70c6-d242-a90e-a7b00f1e7546.png)

## 2.EBSボリュームの変更

対象のボリューム選択後、アクションのボリューム変更からボリューム変更
画面に従って変更します

![スクリーンショット 2023-04-27 10.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/13f90c8d-f7af-caa4-16f0-1fedfcc21fc9.png)

これで完了！

## 3.割当設定

になればいいのですが、確認しても、まだ増えてません、、

```
[ec2-user@ip-172-31-21-253 ~]$ df -h
ファイルシス サイズ 使用 残り 使用 マウント位置
devtmpfs   474M    0 474M  0%   /dev
tmpfs      483M    Ө 483M  0%   /dev/shm
tmpfs      483M 520K 483M  1%   /run
/dev/xvda1  10G 9.1G 980M 91%   /
tmpfs       97M    0  97M  0%   /run/user/1000
```

lsblkでボリュームを確認
```
[ec2-user@ip-172-31-21-253 ~]$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0   0  20G  0 disk　　・・・ 20G使える容量あるのに
L xvda1 202:1   0  10G  0 part / ・・・ 10Gしか使えてない、、
```


#### パーティションを拡張する
今回xvdaだったので、次の手順に、
すべて使えるように、xvda1に全て割り当てます

```
 sudo growpart /dev/xvda 1
```

xvdaの場合、これで使えるようになります。

### ファイルタイプを調べる

```
$ df -T
ファイルシス   タイプ   1K-ブロック    使用   使用可 使用% マウント位置
devtmpfs       devtmpfs     1991776       0  1991776    0% /dev
tmpfs          tmpfs        2000824       0  2000824    0% /dev/shm
tmpfs          tmpfs        2000824     552  2000272    1% /run
tmpfs          tmpfs        2000824       0  2000824    0% /sys/fs/cgroup
/dev/xvda1     xfs        104845292 6442856 98402436    7% /
tmpfs          tmpfs         400168       0   400168    0% /run/user/1000
```

/dev/xvda1　のタイプを確認し、ファイルタイプを確認しましょう

ファイルタイプによってファイルシステムを拡張する方法が違います

#### xfsの場合
xfsの場合

```
sudo xfs_growfs -d /
```

### それ以外

```
sudo resize2fs /dev/xvda1
```


ここまでやって完了です。
お疲れ様でした！
JavaScriptからRails APIにGETする画面にて､無限リロードに陥った話

## 状況
ローカル環境でToDoアプリの開発中､トップ画面で無限リロードが発生し､トップページが操作できなくなりました｡
トップページでは､JavaScriptからRails APIに対しGETして､作成したタスクを表示する実装のため､リロードされる度にGETされ続ける状況です｡

## 原因&結論
VS CodeのLive Serverが原因でした｡Live Serverがオンのため､ページが常にリロードされ続けていました｡最初はJavaScriptの無限ループかと思って右往左往していましたが､こんな簡単なことに気づけないとは・・・

今後JavaScriptからHTTPメソッドを投げる実装中は､LiveServerの切り忘れに気をつけよう・・・という記事でした｡

ここまでご覧いただき､ありがとうございました｡
この記事が同じ状況に陥った初学者の方の一助になれば幸いです｡
Lit+TypeScriptでデコレーターのエラーが出るときの対処法

Litの[公式チュートリアル](https://lit.dev/tutorials/intro-to-lit/)にあるコードを書いていると、デコレーター部分に次のようなエラーが表示されます。これは、チュートリアルではなく自分で書いたコードでも、同様にエラーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/b440f237-4d4d-3c5b-72f7-9a1cd62c4f4e.png)

> 式として呼び出される場合、クラス デコレーターのシグネチャを解決できません。
> The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.

このエラーを解決するには、チュートリアルとは別のページに記載されている手順を実行する必要があります。一応公式ドキュメントですが、チュートリアルに書いておいて欲しいですね。

- [Decorators – Lit](https://lit.dev/docs/components/decorators/#decorators-typescript)

> To use decorators with TypeScript, enable the experimentalDecorators compiler option.
>
> You should also ensure that the useDefineForClassFields setting is false. Note, this should only be required when the target is set to esnext or greater, but it's recommended to explicitly ensure this setting is false.
> ```typescript
> "experimentalDecorators": true,
> "useDefineForClassFields": false,
> ```
> Enabling emitDecoratorMetadata is not required and not recommended.

つまり、TypeScriptの設定で``experimentalDecorators``を``true``に設定し、``useDefineForClassFields``を``false``に設定するということです。後者の設定は必須ではなく、``target``が``esnext``以降に設定されている場合にのみ必須ですが、明示的に``false``にすることが推奨されています。

これらの設定を変更すると、画像のように、エラーが出なくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/b7c6a4c3-da00-7275-bb13-c628c48806f1.png)
Rubyでbit配列をファイルに書き込む方法

例えば、`01000001 01000010 01000011`というbit配列をファイルに書き込みたいとする。

## (予備知識1) array#pack

以下のように、配列の中の各Intgerを、それに対応するcharにマッピングする。

```ruby
[29] pry(main)> [65, 66, 67].pack("C*")
=> "ABC"
```

## (予備知識2) Integerを、bit配列チックに書く方法


Integerを、bit配列チックに書くには以下のようにすれば２進数表記(`0b`)を使えば良い。

```ruby
[30] pry(main)> 0b01000001
=> 65
```


## bit配列をファイルに書き込む方法

```ruby
[23] pry(main)> [0b01000001, 0b01000010, 0b01000011].pack("C*")
=> "ABC"
```

これをファイルにバイナリモードで(?)書き込んでやれば良い。つまり、

```Ruby
[32] pry(main)> File.open("file", "wb") do |f|
[32] pry(main)*   f.write([0b01000001, 0b01000010, 0b01000011].pack("C*"))
[32] pry(main)* end  
=> 3
```

`c`の説明をしておく。

今回は、それぞれの`0bxxxxxxxx`を1byteにマッピングする必要があるので、C=`unsigned char (8bit 符号なし整数)`を使用した。
他アプリに直接文字入力をするときに使う『UTF-8』ってなんだろう？

# はじめに
今回は　アプリ内から他SNSへシェアをするときに、にアプリ側から直接文字入力をしたときに使われていた　**UTF-8**　という文字について　気になったので調べて記事にします。

# UTF-8 とは
下のほうで参考にしたページでは以下のように表していました。
>UTF-8とは、世界的にも最もポピュラーな文字コードで、Unicode用の符号化方式の1つです。

コンピューター上で文字を扱うための重要な要素みたいで、他の文字コードに比べて
ASCIIコードとの互換性が高いことから、世界中の多くのソフトウェアが用いています。

１文字を１〜４バイトで表現するもので　**文字化けを防ぐため**に必要なもののようです。

AndroidではURLで使えない文字を使うために
文字列をURLエンコードする**URLEncorder**で　第一引数に文字列　第二引数に文字コードを指定するときに使われます。
他にもUTF-16やWindows-31J　というものがあるみたいですが、指定しない場合は自動的にUTF-8になるらしい。

# 参考
https://ferret-plus.com/7006


https://flytech.work/blog/15558/
【作業メモ】アプリを GKE クラスタにデプロイする（GCPクイックスタート）

## はじめに
コンテナを触ってみたくなったのでトライ。
GKEクラスタを立ててコンテナ化されたアプリをデプロイする。

https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster?hl=ja

## 1. Artifact Registry APIと Google Kubernetes Engine APIを有効にする
クイックスタートからGCPのGUIに飛ぶと、[有効にする]をクリックするだけでAPIが有効になる。

## 2. GKEクラスタを作成する
Cloud Shellからクラスタを作って認証情報を登録する。

## 3. アプリケーションをデプロイする
サンプルアプリが用意されているのでCluod Shellでさくっとデプロイする。

今回はDeploymentオブジェクトとServiceオブジェクトを作成する。
オブジェクトって何ぞやってなったらKubernetesの公式ドキュメントをチェック。

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/

Kubernetesのオブジェクトはクラスターの状態（どのノードでアプリが動いているか、とかアプリの振る舞いのポリシーなどなど）を表す。GKEでもオブジェクトのイメージは同様と考えてよさそう。

### Deploymentオブジェクトを作成する
kubectl create deploymentコマンドを打つ。

### Serviceオブジェクトを作成する
アプリをインターネットに公開するためにServiceを作成する。
kubectl expose deploymentコマンドを打つ。コマンドではロードバランサと公開用ポート、ターゲットポートも指定する。

:::note warn
ロードバランサは課金対象
:::

ブラウザからアプリにアクセスしてHello worldと表示されているのを確認したら手順は完了。

## 4. おわりに
サンプルアプリはコンテナ化されているのであんまりコンテナ触っている感なかった...。
ただKubernetesの公式ドキュメント読むきっかけになったのでよかった。

クイックスタートはコマンド打つだけなので全体通しても15分かかるかかからないかくらい。
デプロイ自体はさっくり終わったので、今度は簡単なアプリ作ってデプロイしてみようかな。
QGISのOSGeo4W ShellをWindows Teminalのプロファイルに追加する

# 概要
QGISのプラグイン開発等で必要となるOSGeo4W ShellをWindows Teminalから利用するための設定方法を紹介します。

# 環境
- QGIS 3.28.7 LTR
- Windows Terminal 1.17.11461.0

# Windows Terminalのプロファイルの追加方法
Windows Terminalを起動し、設定から `新しいプロファイルを追加します` をクリックします。

![新しいプロファイルを追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/77b1bca3-bbc1-718b-7471-7df0ced13cf3.png)

`新しい空のプロファイル` を選択します。

![新しい空のプロファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/697f446c-fc45-2bcb-9037-3b682417eb44.png)

以下の3項目を設定します。

![設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/9d81d94e-576a-7c82-3ab4-92626c8c840e.png)

設定する値は以下の通りです。

|項目|設定値|
|---|---|
|名前|`OSGeo4W Shell` (任意)|
|コマンドライン|`%SystemRoot%\System32\cmd.exe /k "C:\PROGRA~1\QGIS32~1.7\OSGeo4W.bat;popd"`|
|アイコン|`C:\PROGRA~1\QGIS32~1.7\OSGeo4W.ico`|

パス中の `QGIS32~1.7` の部分はQGISのバージョンによって異なります。QGISのオプションの `システム` > `環境` に記載されている環境変数などで確認することができます。

![QGISシステムパス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/23ac5806-138e-22c7-f7a8-42a02da3d615.png)

設定値を入力した後、`保存` を押して設定は完了です。

# Windows Terminal から OSGeo4W Shell を起動
正しく設定されていると、以下のようにOSGeo4W Shellがプロファイルとして選択できるようになっています。

![OSGeo4W Shellを起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/dfb0f8de-201e-86bb-e640-da6bd2ea369b.png)

OSGeo4W Shell を起動し、GDAL (`gdalinfo`) や `pyrcc5` コマンドが利用可能なことが確認できれば完了です。

![コマンドの実行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/420cbcd4-65c4-1b0f-04cb-5c2580157c17.png)

# 関連記事
VSCodeを使ったQGISプラグインの開発環境の構築方法をこちらの記事でも紹介しています。

https://nujust.hatenablog.com/entry/2023/06/11/003337
iPaaS(make(integromat))を使ってNotionデータベースのフィルター処理を行う際に躓いたこと

# 躓いたこと
「Search Objects」アクションでフィルター処理を行う際に、Notionデータベースで「ステータス(status)」タイプのプロパティが選択肢に表示されない。

例えば、以下のプロパティを有するデータベースにおいて、
![CleanShot 2023-06-18 at 18.57.41@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/ae2cb273-d2e5-c309-41af-bb52327679d5.png)

以下黄色枠内のように、ステータスタイプのプロパティが選択肢に出てこない。
![CleanShot 2023-06-18 at 18.59.35@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/180a1c64-faea-b63b-45cd-dc6bed7161ea.png)

# 解決策
(データ量が少ない場合に限られるが、)以下のように対応する。
![CleanShot 2023-06-18 at 19.04.10@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/d52d55f7-7a5d-a94b-c5f7-7f7b5981e898.png)

# 補足
ステータス以外にも、表示されないタイプがあるかもしれない。(例：リレーション)
Rails 7 通常モードとAPIモードの差分

## はじめに

Ruby on Rails 7 の学習中、通常モードとAPIモードの違い（差分）が気になったので簡単にまとめてみました。


### 動作環境

```
Rails 7.0.5
```


## 主な差分

- APIモードでは`app`ディレクトリ下の`assets`、`javascript`ディレクトリが無い
- `Gemfile`の内容が異なる
- `config`ディレクトリ下のいくつかの設定ファイルの内容が異なる

これら以外にも、こまごまとした違いがいくつかありました。
この中で一番違いが見られた`Gemfile`について以下でもう少し掘り下げていきます。

## Gemfileの違い
[RubyGems.org](https://rubygems.org/)の各Gemページにリンクしてあります。

### 通常モードのみ記載があるGem　（APIモードでは未記載）
- [sprockets-rails](https://rubygems.org/gems/sprockets-rails)
    - JavaScript、CSS、画像などの静的アセットを管理、圧縮、最小化するためのgem。
- [importmap-rails](https://rubygems.org/gems/importmap-rails)
    - JavaScriptモジュールを効率的にインポートするためのマッピングを管理するgem。
- [turbo-rails](https://rubygems.org/gems/turbo-rails)
    - RailsアプリケーションにHotwireの一部であるTurboを統合するgem。
- [stimulus-rails](https://rubygems.org/gems/stimulus-rails)
    - StimulusというJavaScriptフレームワークをRailsアプリケーションに統合するgem
- [web-console](https://rubygems.org/gems/web-console)
    - 開発中、エラーが発生した際、ブラウザ上で対話的なコンソール（REPL）を提供するgem。デバッグ用。
- [capybara](https://rubygems.org/gems/capybara)
    - 自動化ブラウザテストのためのgem。ユーザーがブラウザで行うアクションをシミュレートすることが可能。
- [selenium-webdriver](https://rubygems.org/gems/selenium-webdriver)
    - ブラウザの自動化テストを可能にするgem。JavaScriptを含む動的なWebページをテストするために使用。
- [webdrivers](https://rubygems.org/gems/webdrivers)
    - ブラウザ用のWebDriverのインストールと管理を自動化するgem。CapybaraやSeleniumと組み合わせて使用。

※ `capybara`　~　`webdrivers`　の3つはテスト関係のgem

#### デフォルトではコメントアウト
- [sassc-rails](https://rubygems.org/gems/sassc-rails)
    - Sassを使用するためのgem。

### 両モード記載があるがAPIモードではデフォルトでコメントアウト
- [jbuilder](https://rubygems.org/gems/jbuilder)
    - JSONのビューを作成・管理するためのテンプレートエンジンgem
- [rack-cors](https://rubygems.org/gems/rack-cors)
    - CORS (Cross-Origin Resource Sharing)のルールを設定し、クロスオリジンのHTTPリクエストを管理するgem。




## おわりに
APIモードという機能の特性を踏まえると当然と言えば当然な差ですが、実際に見比べ、gemを調べることによって学びが深まりました。

今回私はエディターの差分チェック機能で検証しました。
他にもLinuxコマンドの`diff`やGitHubでコミット間・ブランチ間の差分を確認する方法があるので、気になった方はぜひご自身でチェックしてみてください。

最後までお読みいただきありがとうございます。
記事内に不備がありましたら遠慮なくご指摘いただけると嬉しいです。
購入するパソコンで悩んだのでChatGPTに聞いてみた話

初めてデスクトップパソコンを買おう思い調べていた時にどれを買えばいいか悩んだのでChatGPTにどのぐらいのスペックのパソコンが良いか聞いてみました。

# 前提準備
まずChatGPTを使うためにアカウント作成orログインを[https://openai.com/blog/chatgpt](https://openai.com/blog/chatgpt)でする

アカウント作成はこちらのサイトを参考にさせていただきました。
https://openai-chatgpt.jp/chatgpt%e3%80%80%e5%a7%8b%e3%82%81%e6%96%b9/

# 実践
ゲームとプログラミング両方できるようなパソコンが欲しいのでまずは大雑把に聞いてみます。
![chat.openai.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473138/c8f6d7f1-9860-7d38-0d5a-8f9263ff4e78.png)
なんのゲームか、どんなツールを使うのかを入れていないので合っているかどうかなどは確認できませんが細かく返答が返ってきました。
ただこれだと自分がやりたいことに適しているかが分からないのでもう少し詳しく聞いてみたいと思います。
<br>
次はゲーム名を書いて聞いてみたいと思います。最近リリースされたスターレイル（リリースから2か月くらい）をプレイしたいのでどのくらいのスペックが必要か聞いてみたいと思います。
![chat.openai.com_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473138/b7219be9-0cdc-9254-7057-8c739882c58e.png)

一応回答によると比較的軽量なゲームで一般的なパソコンでもプレイできるそうです。
今回は公式のサイトの方でも推奨スペックが提示されているのでそれを引用すると
>デバイス：Intel Core i7/8G RAM/dGPU、NVIDIA GTX 1060、またはそれ以上のスペック
>システム：Windows 10 64ビット版またはそれ以上
>>参照
>>https://hsr.hoyoverse.com/ja-jp/news/111202

とのことでこの情報はリリース直前のものなので現在は少し違うかもしれませんがこのくらいのスペックが推奨されているもののようです。

ChatGPTの答えと比較すると
・比較的軽量と記述があるがそこまで軽量ではないように思える
・プロセッサの情報がcore i5 となっているが公式ではcore i7が推奨スペックになっている
など少し違う部分はありますが、他の項目に関してはおおむね合っているなという印象でした。
<br>
次はAndoroid Studioを使いたいのでそれについて聞いてみたいと思います。
![chat.openai3.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473138/c16769f3-a151-9688-1263-0fc1bda76b81.png)
聞き方が少し変わってしまい先ほどと記述の仕方が違う状態になってしまいましたが、基本的にはメモリやGPUの情報など一通りの情報を教えてくれました。

こちらも公式のサイトの方で一部ですがスペックの情報があったので引用すると

>64 ビット Microsoft® Windows® 8 / 10 / 11
>x86_64 CPU アーキテクチャ、第 2 世代の Intel Core 以降、または Windows Hypervisor をサポートする AMD CPU
>8 GB 以上の RAM
>8 GB 以上の空きディスク容量（IDE + Android SDK + Android Emulator）
>1,280 × 800 以上の画面解像度
>>参照
>>https://developer.android.com/codelabs/basic-android-kotlin-compose-install-android-studio?hl=ja#1

こちらに関してはおそらく動かすための最低条件が書かれているため快適な動作環境とは違いますが実際にAndroid Studioを使ったことがある自分からするとAndoroidスマホの画面をパソコン上で映し出すのである程度高いスペックがないと起動に時間がかかったり動き自体が重いことが多かったためChatGPTの返答は比較的正しいかなという印象でした。
<br>
次は今までした質問を組み合わせて同時に聞いてみたいと思います。
![chat.openai4.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473138/b32cf825-3993-b9db-f015-4a894e4c4c56.png)
先ほどの2つの質問で出た推奨スペックを組み合わせた情報を出してくれました。ただ聞き方の問題でスターレイルも開発ツールとして誤認されていたのと両方が動くパソコンの要件では無いのではないかとが気になったので質問の仕方を少し変えてもう一度聞いてみたところ
![chat.openai5.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473138/da2a67c6-5b1b-24ef-a2c4-aa754706342c.png)

今度はしっかりゲームとして認識した状態で両方が動作するスペックを教えてくれました。

# 使ってみた感想
実際に使用してみて一部間違った返答も来ましたがおおむね合っていましたし、質問の仕方次第でより正確な返答をしてくれたので、聞きたいことが伝わりやすい質問の仕方をしっかり覚えれば今まで調べていた時間を大幅に短縮できるのではないかと感じました。

# まとめ
今回は購入するパソコンについてChatGPTに聞いてみた時のことを書いていきました。今回はパソコンについて質問しましたが、他にもプログラムのコードについても聞けるそうなのでいろんなことで活用できそうだなと思いました。
すごく便利ですが質問の仕方によって返答の正確性も変わってしまうことや、個人情報などに関わることは質問するのは少し危ないのかなとも思ったためこれからも気を付けながら、考えながら使用していきたいと思います。
【未完】Javaエンジニアがcosmosdb-chatgptを読むのに苦闘している その1（さらっと読んでみる編）

# はじめに

はじめまして。
SPA, JavaEE, Tomcat, Wildfly, PostgreSQL……という世界で生きてきたのですが、MicrosoftによるChatGPTアプリのサンプルを動かさねばならないことになりました。
タイトルにある、[Azure-Samples/cosmosdb-chatgpt](https://github.com/Azure-Samples/cosmosdb-chatgpt)です。
なにしろMicrosoftの言語やらプラットフォームやらは、ここ20年くらい触っていないし、業務で触ったことは（ほぼ）皆無です。
そこそこ色々見てきているので、まったくできないことはないだろう、と思ってはいるのですが……

ということで、Java屋がASP.NETの（わりかし新しめな）コードを読むとこうなる、という記録を残しておくことにしました。

# 注意

以下、「～です。」のように言い切っている箇所がありますが、これらはあくまでも私の理解です。
間違い等ある可能性があります。
（華麗にスルーor気が向いたらコメントなどいただけると嬉しいです）

# アーキテクチャの概要

| # |サンプルの方式|Javaのスタックの似てるやつ|ここは判らない|
|----|----|----|----|
|言語|C#|Java||
|フレームワーク|Blazor Server|JSF|プレゼンテーション層だけではない？|
|DI|Microsoft.Extensions.DependencyInjection|CDI||
|実行環境|ASP.NET App Service|AWS Elastic Beanstalk|EC2しか使ったことがないので、知識で判断|
|DB|ASP.NET Cosmos DB|AWS DocumentDB(MongoDB)|RDSしか使ったことがないので、知識で判断|

## Blazor Serverについて

UIを構築するためのフレームワークです。
同じBlazorでも、Blazor WebAssemblyを使うと、ブラウザのWebAssemblyランタイムで実行されるコードになります。
WebAssemblyとは、（ここは割と不勉強なのですが）ブラウザに内蔵されているバイトコード実行環境で、JavaScriptインタプリタと併置されるイメージです。

# まず読んだコード

## Pages/*.razor

JSFでいうところの*.xhtmlです。
中身を見てもJSFっぽいですが、ソースの下の方にBacking Beanに該当するハンドラが書かれています。
（これは個人的にわかりやすくて好きです）

## Services/*.cs

画面から使われるチャットサービス、チャットサービスから使われるDBアクセス、OpenAIアクセスのサービスがあります。
DDDでいうところのアプリケーションサービスでしょうか。

## Models/*.cs

ドメインモデル（エンティティ）です。

## Options/*.cs

そろそろ判らなくなってきました。DI設定ファイル？の型？

# 感想

さらっと読んで、大体の構造を掴むのであれば、Javaと類推できる部分は多いかも。
ですが、こいつをどうデプロイして……というMicrosoftのエコシステムの話になると、簡単ではない気配。
続く……と思う！
Goで複数のバージョンを利用する(goenv不使用)

ローカル環境のgoをバージョンを管理する必要がある場合に[goenv](https://github.com/syndbg/goenv)を使っていませんか？
anyenv系が便利だと脳に染み付いていたので僕も最初は使っていましたが、本家で出来るならと思って乗り換えてみました。

## 前提条件
```bash
% sw_vers                                                                                                                                                                                                                                                                [main]
ProductName:	macOS
ProductVersion:	11.4
BuildVersion:	20F71

% brew --version                                                                                                                                                                                                                                                         [main]
Homebrew 4.0.23
Homebrew/homebrew-core (git revision 2c206559b9d; last commit 2023-02-20)
Homebrew/homebrew-cask (git revision 75526d18ed; last commit 2023-02-20)

% which go                                                                                                                                                                                                                                                               [main]
/opt/homebrew/bin/go

% go version                                                                                                                                                                                                                                                             [main]
go version go1.19.2 darwin/arm64
```

## 方法
### 使用できるバージョンの一覧
ここから指定するバージョンを選ぶことができます。
https://go.dev/dl/

### ローカル環境の手順
```bash
## すでにgoenvを使っている場合、念の為リネーム
## 不要なことが確認できたらディレクトリごと掃除(brewで入れてる人はuninstall)
% mv ~/.goenv ~/.goenv_bk

## (ここでは例として)go1.18.7のインストール
## 使用できるバージョンの一覧から、ほしいバージョンを選択して読み替える
% go install golang.org/dl/go1.18.7@latest
% go1.18.7 download

## Golandを使用している場合、これで確認した内容をGolandのプロジェクト上のGOROOTに設定
% go1.18.7 env GOROOT
```

### .zshrcなどの設定
```zsh
# goenvの設定をコメントアウトか削除しておく
#export GOENV_ROOT="$HOME/.goenv"
#export PATH="$GOENV_ROOT/bin:$PATH"
#eval "$(goenv init -)"

# ローカルgoの設定
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

これで`go{インストールしたバージョン}`コマンドで利用できるようになります。
`go` コマンドにオーバーライドできないのはちょっと面倒ですが、切り替え不要で利用できる点は複数プロジェクトを触る場合に便利ですね。

### メリット
- バージョンの切り替えを行わなくても同時に別バージョンを利用できる
  - goenvも`.go-version`が置かれているプロジェクトは特に意識する必要はない
- 新バージョンの提供が早い
### デメリット
- CLI利用時の読み替えが面倒

## 参考
https://go.dev/doc/manage-install
最近傍補間（Nearest Neighbor Interpolation）

最近傍補間とは1次元以上の多変量補間を行う最もシンプルな方法です。最も近くにある既知の値と全く同じ値で補間を行います。噛み砕いて言えば、富士山の地点1が標高$z_1$、地点3が$z_3$の時、その間にある地点2の標高はどのくらいか推定する方法の一種。
## 理論
#### 補間
補間のゴールは一様サンプリングされた画素$v_{m, n}$を持つ画像$v$が与えられた時、下記の条件を満足する関数$u(x, y)$を見つけることである。
```math
v_{m, n} = u(m, n) \quad for\, all\, m, n\in\mathbb Z
```

また、線形補間はサンプル$v$を関数$u:=Z(v)$に写す線形演算子$Z$として抽象的に記述することができる。ここで$Z$に二つの性質を定義する。
- $S_{k, l}:=v_{m-k, n-l}$
$S_{k, l}$はシフトを表す。ここで全ての$v$と$(k, l)$に対して$Z$はshift-invariantと呼ばれる。
```math
Z(S_{k, l}(v))(x, y)=Z(v)(x-k, y-l)
```
- $v^{N}$は$v$に対する集合$\{-N, ...,+N}^2$の制約で$Z$は全ての$v$と$(x, y)$に対して局所的と言われる。
```math
Z(v)(x, y)=lim_{N\rightarrow \infty}Z(v^N)(x,y)
```
もし$Z$が線形、shit-invariant、$l^\infty(\mathbb Z^2)$から$L^\infty(\mathbb R^2)$の中で局所的な時、Z(v)が畳み込みとしてかけるような補間カーネル$K$が存在する。
```math
Z(v)(x,y)=\Sigma_{m,n\in Z}v_{m,n}K(x-m, y-n)
```
#### 最近傍補間
最近傍補間の場合、関数$u(x, y)$は次式で表される。
```math
u(x, y) = v_{[x], [y]} 
```
ここでvは入力画像でu(x, y)は補間後の関数、[.]は最も近い整数に丸めることを示す。
補間カーネル$K(x,y)$は
```math
K(x,y)=K_1(x)K_1(y),\quad K_1(t)=\left\{
\begin{array}{ll}
1 & if\, -\frac{1}{2}\leq t<\frac{1}{2} \\
0 & otherwise
\end{array}
\right.

```
![スクリーンショット 2023-06-22 21.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482751/c7511756-a364-049d-5f54-8be4ae5fec2d.png)


## 実装方法
#### 既知のデータを入力
point:地点
height:標高
```Python
point = [1, 2, 3, 4, 5]
height = [9, 18, 7, 5, 13]
```
#### 現状わかっている山の外観
```Python
import matplotlib.pyplot as plt
plt.scatter(point, height, c="red", label="known")
plt.xlabel("Point")
plt.ylabel("Height")
plt.legend()
plt.grid()
```
![スクリーンショット 2023-06-18 17.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482751/412f6a5e-0b48-820e-8536-6e06c4477b9c.png)
#### 標高を推定する地点の用意
```Python
import numpy as np
between = np.linspace(min(point), max(point), 100)
```
#### 補間
```Python
equation = lambda x, y: interpolate.interp1d(x, y, kind="nearest")
interpolation = equation(point, height)
```
#### 推定した山の標高
```Python
plt.plot(between, interpolation(between), c="green", label="estimate")
plt.scatter(point, height, c="red", label="known")
plt.xlabel("Point")
plt.ylabel("Height")
plt.grid()
```
![スクリーンショット 2023-06-18 17.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482751/b4e4a292-bfba-28a9-ec40-dc3bf484ed4c.png)
参考文献
Pascal Getreuer(2011). Linear Methods for Image Interpolation
充電器の修理

充電器のケーブルが根元と先で外皮が切れたのを補修しました。

Before

![写真（2023-06-18 16.14）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/aebf3c3f-51d6-b871-794f-c0fe641fe9e6.jpeg)

熱収縮チューブは先のコネクタが大きいので適当な太さのものが入らないので、いったんケーブルを切って、熱収縮チューブで補修してから、つなぎました。

After

![写真（2023-06-18 17.47）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3830cbec-9ace-b430-fbf5-43f5ce2e8238.jpeg)
sympyで三角形の外心を求める

***【問題】三点の座標$p1, p2, p3$が与えられた時その3点を頂点とする3角形の外心$p$の座標を求めよ***

三点が決まれば外心（3点から等距離にある点）は求められると知っていてもその計算はかなり大変です。これを楽をしてsympyにやってもらおうということです。

### 三点の座標から作った方程式をsympyに渡して解く



```math
2点p,qの距離をd(p,q)と表すと　\\
外心pはp1, p2, p3との距離がすべて等しいので \\
d(p,p1) = d(p,p2) = d(p,p3) \\ 
```
これを素直にsympyに渡します、関数の**d2**はルートを取らなくて良いように$d^2$を返します。

```python 
from sympy import *
def d2(p1, p2):
  return (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2

def circumcente(p1,p2,p3):  # get circumcente
  x, y = symbols('x y')
  p = (x,y)
  eq = [ Eq(d2(p,p1), d2(p,p2)),Eq(d2(p,p1), d2(p,p3))]
  return tuple(solve(eq, (x, y)).values())

print(circumcente((3,5),(2,-2),(-6,2)))
# (-1, 2)
```

solveでは{x:1, y:2} のようにDICT形式で返るので、values()を使って答えだけをtupleで返すようにしました。

このやり方は式を与えるだけなので、方程式が解ける問題ならどんなものでもつかえます。ただし大量の問題を解かせるには効率的ではないので、一般解を出す方法を考えます。

### 三点の座標をsymbolで渡して一般解を求める

先ほど作った関数**circumcente**に対して数値の代わりに**symbol**を渡すと一般解が得られます（かなり長いですが）

```python
x, y, x1, y1, x2, y2, x3, y3 = symbols('x y x1 y1 x2 y2 x3 y3')
p = circumcente((x1,y1), (x2,y2), (x3,y3))
print("x =", p[0])
print("y =", p[1])
# x = (x1**2*y2 - x1**2*y3 - x2**2*y1 + x2**2*y3 + x3**2*y1 - x3**2*y2 + y1**2*y2 - y1**2*y3 - y1*y2**2 + y1*y3**2 + y2**2*y3 - y2*y3**2)/(2*x1*y2 - 2*x1*y3 - 2*x2*y1 + 2*x2*y3 + 2*x3*y1 - 2*x3*y2)
# y = (-x1**2*x2 + x1**2*x3 + x1*x2**2 - x1*x3**2 + x1*y2**2 - x1*y3**2 - x2**2*x3 + x2*x3**2 - x2*y1**2 + x2*y3**2 + x3*y1**2 - x3*y2**2)/(2*x1*y2 - 2*x1*y3 - 2*x2*y1 + 2*x2*y3 + 2*x3*y1 - 2*x3*y2)
```

### この一般解を使って関数を作る

この一般解の式を使って計算すれば高速な関数を作ることが出来ます。ただコードを見てもなぜそうなるのかは、わかりずらいですけど、、、

```python 
def circumcente1(p1,p2,p3):  # get circumcente
  (x1, y1), (x2, y2), (x3, y3)  = p1, p2, p3
  x = (x1**2*y2 - x1**2*y3 - x2**2*y1 + x2**2*y3 + x3**2*y1 - x3**2*y2 + y1**2*y2 - y1**2*y3 - y1*y2**2 + y1*y3**2 + y2**2*y3 - y2*y3**2)/(2*x1*y2 - 2*x1*y3 - 2*x2*y1 + 2*x2*y3 + 2*x3*y1 - 2*x3*y2)
  y = (-x1**2*x2 + x1**2*x3 + x1*x2**2 - x1*x3**2 + x1*y2**2 - x1*y3**2 - x2**2*x3 + x2*x3**2 - x2*y1**2 + x2*y3**2 + x3*y1**2 - x3*y2**2)/(2*x1*y2 - 2*x1*y3 - 2*x2*y1 + 2*x2*y3 + 2*x3*y1 - 2*x3*y2)
  return (x,y)
```

（開発環境：Google Colab）

この考え方はProject Euler Problem 727: Triangle of Circular Arcsを解くのに役に立ちます。
gdi32.GetDIBits() failedの対処法

# gdi32.GetDIBits() failed
最近Pythonのライブラリの一つである**mss**を使っていた際に発生した**gdi32.GetDIBits() failed**の対処法をメモとして残しておきます。

# 対処法
[Github](https://github.com/BoboTiG/python-mss/issues/122)で調べたところ以下の記述を見つけました。
> With this information in hand, I resolved the issue in MY code by simply going back to instantiating "with mss.mss() as sct:" on every screenshot called.

どうやら、withを使わずfor文などで繰り返して使用するとリソースが食われ、それでエラーが発生するらしい。
確かに考えてみれば当たり前のことである。
問題の箇所を"with mss.mss() as sct:"に修正したところ、エラーも発生せず問題なく動作した。

これまであまりwithやリソースについて深く考えなかったが、考える良いキッカケとなった。
Elixirの対話モードでErlangとの相互運用の動作を確認してみた

# 概要
Elixirの対話モードでErlangとの相互運用の動作を確認してみました。以下のページを参考にしました。

https://elixirschool.com/ja/lessons/intermediate/erlang

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> defmodule Example do
...(1)> def timed(fun, args) do
...(1)> {time, result} = :timer.tc(fun, args)
...(1)> IO.puts("Time: #{time} μs")
...(1)> IO.puts("Result: #{result}")
...(1)> end
...(1)> end
{:module, Example,
 <<70, 79, 82, 49, 0, 0, 6, 232, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 207,
   0, 0, 0, 22, 14, 69, 108, 105, 120, 105, 114, 46, 69, 120, 97, 109, 112, 108,
   101, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, {:timed, 2}}
iex(2)> Example.timed(fn (n) -> (n * n) * n end, [100])
Time: 14 μs
Result: 1000000
:ok
iex(3)> is_list('Example')
true
iex(4)> is_list("Example")
false
iex(5)> is_binary("Example")
true
iex(6)> <<"Example">> === "Example"
true
iex(7)> x = 10
10
iex(8)> x = 20
20
iex(9)> x1 = x + 10
30
iex(10)> 
```

# まとめ
何かの役に立てばと。
Macのターミナルに表示される~noMacbook-Airを消す


Macbook のターミナルを開いた時や Bluetooth 名などに表示される、

```:
******@******no Macbook-Air

```

が邪魔なので消す。

## やりかた

1. 左上リンゴマークから"システム設定"に移動

2. "一般"タブに移動

3. 一番上の"情報"に移動

4. コンピュータ名をクリック、入力が可能になるので好きな名前を入力
   ![スクリーンショット 2023-06-18 17.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/0664db83-c21c-bde6-7606-9f4ee0929002.png)

これで完了です。
Railsのunicornをsystemdで起動できるようにしてみた話

# この記事について
この記事はインフラ初心者がWebページをVPS上で公開したい！って思ってやったことを備忘録として書き残したものです。素人が書いているため情報の信憑性は保証しません。詳細は各自で調べながらやることをおすすめします。記事のとおりにやっておかしなことになっても責任は取れませんのでご了承ください。

# serviceファイルの作成
```
sudo vi /etc/systemd/system/unicorn.service
```
でserviceファイルの編集を行います。serviceファイルの内容は次のようにします。

```
[Unit]
Description=The unicorn process
Before=nginx.service
After=network.target remote-fs.target

[Service]
User=memadmin
WorkingDirectory=/var/www/rails_app/current
SyslogIdentifier=unicorn
PIDFile=/var/www/rails_app/shared/tmp/pids/unicorn.pid
Type=simple
Restart=always
EnvironmentFile=/path/to/.env
Environment=RAILS_ENV=production
Environment=UNICORN_CONF=/var/www/rails_app/current/config/unicorn.conf.rb
ExecStart=/bin/zsh -l -c 'path/to/bundle exec unicorn -c ${UNICORN_CONF} -E ${RAILS_ENV} -D'
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/usr/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
```

# 起動設定
下記のコマンドで、起動時に自動でunicornのサービスが立ち上がるようになります。
```
systemctl enable unicorn.service
```
手動で起動/停止したい場合は
```
systemctl start unicorn.service # 起動
systemctl stop unicorn.service # 停止
systemctl restart unicorn.service # 再起動
```
で出来ます。
```
systemctl status unicorn.service
```
で正常に起動されたか確認しましょう。

# 参考文献
systemdでunicornの自動起動を設定してみた
https://qiita.com/Unimaru/items/c4af76e8f28837b85a44
ABC306 - C - Centers 自己解法

# 問題
https://atcoder.jp/contests/abc306/tasks/abc306_c

# 考察
各々の数字において、2回目が現れたのが若い順に並べて出力してくださいという問題です。そこで、各数字が何回現れたかを記録する配列を持たせておきます。ここでは$Bucket$と呼ぶことにします。$A$の要素を前から順に確認し、$Bucket_{A_i}$の要素に1を足す。これを繰り返し、$Bucket$の各要素が2になった順に答えを出力すればいいということになります。2になった順番を記録するにはキューなどを用意して$Bucket$の各要素が2になったときその添字をキューにプッシュすればいいです。
$N≦10^5$で計算量も$O(N)$であることから十分間に合いそうです。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc306/submissions/42713272

ご不明点などがあれば教えていただけると幸いです。
Next.js+TypeScriptな環境にEmotionを導入する

こんにちは。
今回は[Next.js](https://nextjs.org/)（13.4.6 / 2023年6月最新版）+ TypeScriptな環境でCSS in JSの一つである[Emotion](https://emotion.sh/docs/introduction)を導入する際の作業について備忘録的にご紹介します。

# 今回の環境
導入されているパッケージは以下の通りです。
```
├── @types/node@20.3.1
├── @types/react-dom@18.2.5
├── @types/react@18.2.12
├── eslint-config-next@13.4.6
├── eslint@8.43.0
├── next@13.4.6
├── react-dom@18.2.0
├── react@18.2.0
└── typescript@5.1.3
```
インストールするEmotionは`@emotion/react`の`11.11.1`です。

# Emotionをインストールする
以下のコマンドで`@emotion/react`をインストールします。
```
npm install --save @emotion/react
```

# `tsconfig.json`に`jsxImportSource`を加える
インストールしただけでは動きません。`tsconfig.json`の`compilerOptions`に`jsxImportSource`の項目を以下の通りに追加します。
```json:tsconfig.json
{
    "compilerOptions" {
    ...
    "jsxImportSource": "@emotion/react",
    ...
    }
}
```
これで導入は完了です。

# 実際に使ってみる
先述の通り、EmotionはCSS in JSを可能とするライブラリです。その名の通り、CSSをJavaScript（今回だとTypeScript）のファイル内に記述することができます。

## Before
以下のようなコンポーネントがあったとします。ただテキストを表示するだけのものです。今回は文字色を`Red`にすることをゴールとします。
```tsx:Title.tsx
export default function Title(){
    return (
        <div>
            <h1>This is Title</h1>
        </div>
    )
}
```

## After
Emotionを使ってCSS in JSするとこうなります。（一例）
```tsx:Title.tsx
import { css } from "@emotion/react"

export default function Title(){
    return (
        <div>
            <h1 css={titleStyle}>This is Title</h1>
        </div>
    )
}

const titleStyle = css ({
    color: `red`,
})
```

# Reference
https://nextjs.org/docs

https://emotion.sh/docs/install

以上がNext.js+TypeScriptな環境へのEmotion導入でした。
ご精読ありがとうございました！
【Vim】基本操作をまとめてみた

今回は`Vim`についてをざっと学習したのでまとめてみます

# Vimとは
`Vi`というテキストエディタの拡張版です。CUI(エンジニアがよく使っているターミナルでのコマンド操作)ベースで、マウスレスを使わずに操作ができる、つまり、キーボードから手を離さずにコードが書けるのです！
(というか、Vimの操作中はマウスでのカーソル移動はできません。)
自分はGoogle Chromeで`Vimium`という拡張機能を使っていたことがあるのですが、Vimが元になっていると今回始めてわかりました。また、Gitの操作でコミットをする際に`git commit -v`を打つとVimモードになってコミットメッセージを入力できるので、それで使ったことがありました。

# Vimのコマンド
以下に特に使用頻度が高そうなコマンドをまとめました。
キーボードで各コマンドを打ち、文字の入力は、英数モードになっていることを確認して`I`を打ち`Insert`モードにして行います。
再びコマンド操作をしたいときは英数モードになっていることを確認して`esc`を押します。

### 移動
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>実行内容</th>
    </tr>
  </thead>
  <tr>
    <td> h </td> <td>左へ移動</td>
  </tr>
  <tr>
    <td> j </td> <td>下へ移動</td>
  </tr>
  <tr>
    <td> k </td> <td>上へ移動</td>
  </tr>
  <tr>
    <td> l </td> <td>右へ移動</td>
  </tr>
  <tr>
    <td> gj </td> <td>下へ一つ移動</td>
  </tr>
  <tr>
    <td> gk </td> <td>上へ一つ移動</td>
  </tr>
  <tr>
    <td> 0 </td> <td>行の先頭へ移動</td>
  </tr>
  <tr>
    <td> w </td> <td>次の単語へ移動</td>
  </tr>
  <tr>
    <td> gg </td> <td>一番上の行へ移動</td>
  </tr>
  <tr>
    <td> G </td> <td>一番下の行へ移動</td>
  </tr>

</table>

### 編集
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>実行内容</th>
    </tr>
  </thead>
  <tr>
    <td> yy </td> <td>カーソル行をコピー</td>
  </tr>
  <tr>
    <td> dd </td> <td>カーソル行を削除</td>
  </tr>
  <tr>
    <td> D </td> <td>カーソルから後ろを削除</td>
  </tr>
  <tr>
    <td> p </td> <td>カーソルの行の下に貼り付け</td>
  </tr>
  <tr>
    <td> P </td> <td>カーソルの行の上に貼り付け</td>
  </tr>
  <tr>
    <td> x </td> <td>1文字削除</td>
  </tr>
  <tr>
    <td> :q </td> <td>保存せず終了(確認あり)</td>
  </tr>
  <tr>
    <td> :q! </td> <td>保存せず終了</td>
  </tr>
  <tr>
    <td> :w </td> <td>保存</td>
  </tr>
  <tr>
    <td> :wq </td> <td>保存して終了</td>
  </tr>
</table>

### 検索
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>実行内容</th>
    </tr>
  </thead>
  <tr>
    <td> /検索文字 </td> <td>カーソルから後ろを検索</td>
  </tr>
  <tr>
    <td> ?検索文字 </td> <td>カーソルから前を検索</td>
  </tr>
  <tr>
    <td> # </td> <td>カーソル位置の単語を検索</td>
  </tr>
  <tr>
    <td> n </td> <td>検索結果を順にたどる</td>
  </tr>
  <tr>
    <td> N </td> <td>検索結果を順にたどる</td>
  </tr>
</table>

### 置換
<table>
  <thead>
    <tr>
      <th>コマンド</th> <th>実行内容</th>
    </tr>
  </thead>
  <tr>
    <td> :s/置換したい文字A/置換後の文字B/g </td> <td>カーソル行の全てのAをBに置換</td>
  </tr>
  <tr>
    <td> :%s/置換したい文字A/置換後の文字B/g </td> <td>すべてのAをBに置換</td>
  </tr>
</table>
Linux ディスク容量 備忘録


ディスク容量確認

```bash
sudo df -h
```

フォルダ容量確認

```bash
sudo du -hd1 .
```

仮想ディスク（[スパースファイル](https://wiki.archlinux.jp/index.php/%E3%82%B9%E3%83%91%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)）容量確認

```bash
sudo ls -lsh
total 15G
15G -rw------- 1 libvirt-qemu kvm 129G Jun 18 17:25 vm0.qcow2
```
AWSのリソースにつける「名前」について

## リソースの名前について
今回の記事は、AWSのリソースをインターネット上で一意に識別するARNの話ではなく、利用者が扱うときに利用する名前についてのお話です。

実はほとんどのリソースにおいて、NameがKeyとなっているタグのValueがそのリソースの名前となっています。

以下はセキュリティーグループのリソースです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/7d8d620c-e06e-f228-c502-9e81e3e6c8d2.png)

確かに、KeyがNameでValueがhogehogeのリソースの名前が、hogehogeとなっています。

Nameのタグを変えるとどうなるでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/8bf19cc6-b46a-4d02-0115-53f6075947b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/23081ff2-4977-0607-e48e-777b3ac21955.png)

このように、リソースのNameは変更しなくても、タグの変更に紐づいてリソースのNameが変更されます。



## ただし、全てリソースがそうではない
では、すべてのリソースの名前をNameというKeyのタグで管理できるかというと、そうではありません。
ロードバランサーを見ていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/9bf8055d-d4f0-990e-a008-4a88bdc6ca97.png)
こちらのロードバランサー（NLB）には、MyNetworkLoadBalancerというリソース名がついていますが、KeyがNameのタグのValueはhogehogeとなっています。

このように、すべてのリソースで「KeyがNameのタグのValue = リソース名」が成り立つではないので、要注意です。


ちなみに、気づいたきっかけはCloudFormationでした。
CloudFormationでNLBを作成した際に、Resourceの項目にNameとTagがありました。
Nameのvalueと、KeyがNameのタグのValueを同時に記入して作成したところ、このようにばらばらになっている状態で発見されてしまったという経緯です。

Nameの項目をつけず、KeyがNameのタグのみ記入した場合、リソース名はランダムにつけられてしまいます。
つまり、今回の場合はKeyがNameのタグとリソース名は完全に別のものだと言えそうです。

さらに、ロードバランサーは作成後に名前を変更することは不可能です。
名前を変更したい場合、同じ設定のロードバランサーを作成し、その際に希望する名前を使用して付け替えるしかありません......



## 間違えて覚えていくしかない

この他にもリソースごとに、他のリソースでは共通の仕様となっているが、当該のリソースには差異が見られることは割とあります。
いちいち事前にすべてを調べられないので、経験を積んでいくしかないのかなと思います。
【3Dモデル自動生成AI】Shap-Eを使った感想とトラブルシューティング

# Shap-Eとは
テキストや画像をもとに3Dモデルを自動生成してくれるAIです。

# 作業環境
* Windows11
* Python 3.10.6
* CUDA 11.8
* torch 2.0.1+cu118
* torchvision 0.15.2+cu118
* pip 22.2.1
* GPU RTX4090
* GPUドライバー バージョン536.23(Game Ready)

# 公式リポジトリ
https://github.com/openai/shap-e

# 出力結果
何はともあれまずは出力結果を見てみましょう。

### text_to_3d
実行するスクリプト: shap-e\shap_e\examples\sample_text_to_3d.ipynb

##### 魚
prompt: a fish
ポリゴン数: 28,920
![スクリーンショット 2023-06-18 142133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/0605e3dd-6f8f-0c00-0384-86b84ce6b074.png)
![スクリーンショット 2023-06-18 142258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/b8af57c5-a00e-1301-4818-1dcea5a179aa.png)

##### ドラゴン
prompt: a dragon
ポリゴン数: 27,428
![スクリーンショット 2023-06-18 155830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/d2a93716-fe3e-cb8f-d7f5-24b64c50c87b.png)
![スクリーンショット 2023-06-18 155841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/8cc23a85-3422-ef90-b045-ff6e4a51032d.png)

##### 地球
prompt: an earth
ポリゴン数: 307,064
![スクリーンショット 2023-06-18 154441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/fc909169-e554-2af3-8d6f-200b7be79107.png)
![スクリーンショット 2023-06-18 154458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/d6cd4d8a-c65f-e72e-e8e9-acf0652e7a95.png)

### image_to_3d
試したら書きます。

# 気づいたこと・考察
* 不要なメッシュが多い（最適なトポロジーで出力されるわけではない）
* 形状が粗い
* 単純な形状の方がポリゴン数が多い
* 色はテクスチャやマテリアルではなく頂点カラーで出力される
* 頂点カラーを使用しているため、形状より配色の方がポリゴン数に与える影響が大きい？

# トラブルシューティング(2023/06/18 16:20現在)
### ライブラリ不足のエラーが発生する場合
`pyyaml`と`ipywidgets`を手動でインストールする(公式ドキュメントの`pip install -e .`ではインストールされない)

### GPUがあるのにCPUで実行される場合
CUDAとPyTorchのバージョンの互換性の関係でGPUが認識されずCPUが使用される場合がある。`sample_latents`メソッドを実行するセルの実行にあまりにも時間がかかる場合はCPUを使用してしまっている可能性があるため、以下の手順で確認する。

##### CPUとGPUのどちらを使用しているかを確認する方法
1. `device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')`の実行後に`print(device)`を追加して実行する
1. `cpu`と表示されたらCPUが使用されているため、以下の手順で環境を整える

##### GPUを使用するためにやったこと
1. ライブラリを再インストールする
    1.1. 公式サイト( https://pytorch.org/ )中段で自分の環境用のコマンドを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/a8990a28-45db-e8f8-ea8f-1a2f85205106.png)
    1.2. `Run this Command:`に記載されているライブラリを一旦自分の環境からアンインストールする
    1.3. `Run this Command:`のコマンドを実行してライブラリを再インストールする
1. CUDAのバージョンを確認し、必要に応じて再インストールする
例えばWindows11の場合、上記の画像の通りCUDA 11.7もしくは11.8しか対応していない。
```
nvcc -V
```

##### その他試したこと
* 最新のGPUドライバーのインストール
* PCの再起動

### 出力された3Dモデルに色が付いていない
3DCGツールの頂点カラーモードで確認する

# まとめ
質を気にせず大量のモデルを作りたい場合など、状況次第ではリメッシュや穴埋めと組み合わせることで作業を効率化して実用的に使用できる場合もあるのかなと思いました。（「質を気にせず大量のモデルを作りたい状況」を思いつきませんが...。もしありましたらお声かけください。）
Qiita初心者のMarkdownメモ

# 基本的なMarkdownメモ
- Qiitaの記事を書くにあたってMarkdownについて調べてみました。Markdownとは、テキストベースの軽量なマークアップ言語であり、文書を簡単にフォーマットするために使用されるらしいです。
## 見出し: '#'（ハッシュ記号）を使って見出しを作成。<br># の数が多いほど見出しのレベルが下がる
```
# 見出し1
## 見出し2
### 見出し3
```
# 見出し1
## 見出し2
### 見出し3

## 強調: *（アスタリスク）または _（アンダースコア）を使ってテキストを強調
```
**強調１**
__強調2__
```

**強調1**
__強調2__


## リスト: 箇条書きリストを作成するには、-（ハイフン）または *（アスタリスク）
```
- アイテム1
- アイテム2
- アイテム3
```
- アイテム1
- アイテム2
- アイテム3

## リンクを作成する
```
[表示テキスト](リンクURL)
```
[公式マークダウンのドキュメント](https://www.markdownguide.org/)

## 画像を表示する
```
![代替テキスト](画像URL)
```

## Markdownでコードを表現したい。バッククォート（`）またはトリプルバッククォート（```）を使う
```
# 実際に書くときには""は必要ないです。
"```"
a = 0
print(a)
"```"
```

## 番号付きリスト
```
1. アイテム1
1. アイテム2
1. アイテム3
```
1. アイテム1
1. アイテム2
1. アイテム3

## 引用: テキストの引用：行の先頭に >（大なり記号）を使用
```
> 引用されたテキスト
```
> 引用されたテキスト 

## 水平線を作成:3つ以上のハイフン、アスタリスク、またはアンダースコアを使用
```
---
***
___
```
---
***
___

## テーブルを作成するには、パイプ（|）を使って列と行を区切ります。
```
| 列1 | 列2 |
| --- | --- |
| 値1 | 値2 |
| 値3 | 値4 |
```
| 列1 | 列2 |
| --- | --- |
| 値1 | 値2 |
| 値3 | 値4 |

## 打ち消し線: テキストを打ち消し線にするには、~~（チルダ2つ）で囲む
```
~~打ち消し線~~
```
~~打ち消し線~~

## 終わりに
今回は初めてQiitaで記事を書くにあたり、Markdownについて調べてみました。
これからはpythonのデータ分析のためのpandasやpaiza・SIGNATEについての記事を書いていく予定です。
Rubyにおける真偽値で終わるメソッドの命名について

Rubyで真偽値を返すメソッドを作るときの命名について、今までちゃんと気にしたことがなかったので調べてみた。

具体的には真偽値を返すメソッドの命名について、大きくは以下のようなパターンが考えられると思う。

```ruby
oo?
is_oo
is_oo? can_oo?
xxable (できるか?的な意味で)
```

変数名には?は付けられないので、真偽値を返す変数名にはis_ooのようにisをつけて変数を定義することが多いはず。
でもメソッドには?をつけることができ、また、?をつけることが多いとなんとなく思っていた。
ただ、本当にoo?でいいのか、is_で始めたらダメなのか？とか色々思ったので調べてみた。

検索してみたら以下のように書いてあった。
>Predicate Methods Suffix
>The names of predicate methods (methods that return a boolean value) should >end in a question mark (i.e. Array#empty?). Methods that don’t return a >boolean, shouldn’t end in a question mark.
>
>日本語訳
述語メソッド (ブール値を返すメソッド) の名前は疑問符で終わる必要があります (例: Array#empty?)。ブール値を返さないメソッドは疑問符で終わるべきではありません。
>
>ソース：https://rubystyle.guide/#bool-methods-qmark

```ruby
# 例
# bad
def even(value)
end

# good
def even?(value)
end
```

なのでoo?で終わらせるのがいいことはわかった。
xxable (できるか?的な意味で)的なものも、xxable?としてしまうのが良さそう。

次に、isと?のどちらもつけて、is_oo?とするのはどうなのかについては、以下のように書いてあった。

>Predicate Methods Prefix
>Avoid prefixing predicate methods with the auxiliary verbs such as is, does, or can. These words are redundant and inconsistent with the style of boolean methods >in the Ruby core library, such as empty? and include?.
>
>日本語訳
述語メソッドの前に is、dos、can などの助動詞を付けることは避けてください。これらの単語は冗長であり、Ruby コア ライブラリのブール メソッドのスタイル (empty? など) と矛盾しています。
>
> ソース：https://rubystyle.guide/#bool-methods-prefix

```ruby
# 例
# bad
class Person
  def is_tall?
    true
  end

  def can_play_basketball?
    false
  end

  def does_like_candy?
    true
  end
end

# good
class Person
  def tall?
    true
  end

  def basketball_player?
    false
  end

  def likes_candy?
    true
  end
end
```

とのこと。

そもそもisとかcanをつけること自体が良くないみたい。
なので結論としては、oo?とするのが良い。


## 思ったこと
このような言語のお作法的なところは、お作法自体を知らないとなんとなくの雰囲気で書いてしまうことが多い。

今回の例でいうと、もしisをつけてしまっても不具合は起きないはずだが、is_oo、is_oo?、oo?みたいに規則がバラバラだと、読む人が分かりづらいと感じることもあるだろうし、そもそもバラバラなこと自体が気持ち悪い。知っておいた方が悩む時間が減るというメリットもありそう。

rubocopで指摘してくれる箇所みたいなので、rubocopを入れているとこういう知識を増やしていけるという点はいいなと改めて思った。

また、``Rubyコアライブラリのブールメソッドのスタイル (empty? など) と矛盾している``
と書いてあるのを見て、確かに迷ったらコアリブラリを直接みてそれに合わせるのがいいなとも思った。

## 参考
https://rubystyle.guide/#bool-methods-prefix
https://docs.rubocop.org/rubocop/cops_naming.html#namingpredicatename