OmniAICreator/Qiita-1.07M huggingface dataset:
フロントエンドエンジニアのためのWebAPI入門・エンドポイント設計編

<h2>はじめに

2021年8月からフロントエンドエンジニアをしております。
フロントエンドエンジニアとして働いているとサーバー周りの知識が疎くなりがちだと思います。
特にAPIの実装はフロントエンドエンジニアでも任されることが多いかと思うので、まとめました。

<h2>WebAPIとは</h2>
すごくざっくりいうと、別のサービスのデータを取得したりデータを書き換えたりして開発の助けをしてくれるものです。<br/>

例えば、Google MapのAPIを使えば、全く関係ない個人のWebサイトでGoogle Map接続しているように目的地周辺の地図を確認したりできます。<br/>

これを自前で実装しようとすると、マップのアプリを作るところから膨大なリソースが必要になります。APIを使用することによって、サービスの開発を助けてくれます。

※TwitterやAmazon、YouTube等多くのWebアプリがWebAPIを公開しています。

<h2>エンドポイントの設計</h2>
エンドポイントとは、API に アクセスするための URI を指します。
ではどのような設計が良いのでしょうか？
結論以下の観点について意識すると良いです。

* 短く入力しやすいURI
* 人間が読んで理解できるURI
* 大文字小文字が混在していないURI
* 改造しやすいURI
* サーバー側のアーキテクチャが反映されていないURI
* ルールが統一されたURI

ひとつひとつ見ていきます。

<h3>短く入力しやすいURI</h3>
`例
×
http://api.example.com/service/api/search`

ここでは、searchが入っているので検索用のAPIということは推測できます。
apiがホスト名に入っているのと、serviceというのもいまいち何を表しているのかわかりません。
ですので、以下のURIにしたほうがシンプルでよいです。

```
◯ http://api.example.com/search
```

<h3>人間が読んで理解できるURI</h3>

```
例
× http://api.example.com/sv/u
```

こちらのAPIはURLだけで何を表しているのかわかりません。
先程短いURIがよい書きましたが、URIを設計する場合には、不用意に省略しないことです。
また、URIは世界的な共通語である英語にするのが最も適切です。

大文字小文字が混在していないURI
基本はすべて小文字を使います。

<h3>改造しやすいURI</h3>

```
◯ http://api.example.com/v1/items/12346
```

直感的にIDが12346のアイテムを指していることがわかります。なんとなく、数字の部分を変えれば、別のアイテムの情報にもアクセスできそうと予想できます。
URIの構造は、ドキュメントで管理されるべきですが、直感的に分かることが重要です。

<h3>サーバー側のアーキテクチャが反映されていないURI</h3>

```
×　http://api.example.com/v1/get-user.php?user=100
```
PHPで書かれているんだろうなと予想できてしまいます。こちらは、URIのアーキテクチャの特定を容易にしてしまい、攻撃を受ける可能性を上げてしまい、NGです。
ちなみにプログラミング言語が異なっていてもAPI通信することができます。

<h3>ルールが統一されたURI</h3>
ルールとはURIの構造を指しています。
以下の２つのURIはどうでしょうか。

```
× 友達の取得
http://api.example.com/friends?id=100

× メッセージの取得
http://api.example.com/friend/100/message
```

```
◯ 友達の取得
http://api.example.com/friends/100
◯ メッセージの取得
http://api.example.com/friends/100/messages
```

前者では、複数形単数形がバラバラであり、idをクエリパラメータで指定するなど統一感がありません。
基本的に**複数形**にするのが良しとされているようです。

<h2>参考</h2>

https://www.oreilly.co.jp/books/9784873116860/
【VSCode・初心者】pythonファイルをショートカットキーで実行

<h2>VSCodeでのショートカット作成
<p>

１.  まずVSCodeを開き、キーボードで __⌘(command）+ k__ を入力してから __⌘(command）+ s__ を入力します。 
</p>

<p>

２. そうすると、検索バーが表示されるので __python terminal__ と入力します。
</p>

<p>

３. 検索結果として、
日本語であれば __Python: ターミナルでPythonファイルを実行__
英語であれば __Run Python File in Terminal__ 
が表示されるので、そこにカーソルを合わせ __＋__ を押すとショートカットキーを新しく入力できます。

<p>ちなみに、自分はshift ＋ option ＋ p で登録しました。
</p>

<h2>おまけ
<p>

同じように __Terminal: Focus Terminal__ を登録すると、ショートカットキーを使いエディタからターミナルに移動できる。
SVMでの行列計算式について

# はじめに
サポートベクトルマシンについて勉強中に、気になる式変形があったので備忘です。
文系の学部卒の備忘ですので、何卒ご容赦ください。


#  変形前

次の数式についてです。

```math
\nabla f(\boldsymbol{a})_t = 1 - \sum^n_{l = 1}a_l y_t y_l \boldsymbol{x}^T_t \boldsymbol{x}_l \\
```


$\boldsymbol{a}$はn次元ベクトルで、nはデータの個数に相当します。  
$\boldsymbol{x}_t (t = 1, \cdots, n)$は、d次元ベクトルで、特徴量の個数に相当します。  
なお、$a_t (t = 1, \cdots, n)$は、途中過程で出てくるラグランジュ未定乗数です。

# 変形後
上式が、以下の式に変形されているようでした。
(実際に下式が記載されていた訳ではないのですが、プログラム実装例では、この形式を念頭に行列計算が行われているようでした。)

```math  
\nabla f(\boldsymbol{a}) = \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix} - 
diag(\boldsymbol{y}) \boldsymbol{X} \boldsymbol{a}^T \boldsymbol{y} \boldsymbol{X}^T \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix}  
```

# 式変形手順の備忘  

変形前の状態です。

```math
\nabla f(\boldsymbol{a})_t = 1 - \sum^n_{l = 1}a_l y_t y_l \boldsymbol{x}^T_t \boldsymbol{x}_l \\
```

2項目に着目し、シグマに関係ない添字をシグマ外に分離し、さらにシグマ計算を2つに分けます。

```math  
\sum^n_{l = 1}a_l y_t y_l \boldsymbol{x}^T_t \boldsymbol{x}_l 
= y_t \boldsymbol{x}^T_t \sum^n_{l=1} a_l y_l \sum^n_{l=1} \boldsymbol{x}_l 
```

ここで、$\sum^n_{l = 1} a_l y_l = \boldsymbol{a}^T \boldsymbol{y}$とすることで  

```math  
y_t \boldsymbol{x}^T_t \sum^n_{l=1} a_l y_l \sum^n_{l=1} \boldsymbol{x}_l  
= y_t \boldsymbol{x}^T_t \boldsymbol{a}^T \boldsymbol{y}  \sum^n_{l=1} \boldsymbol{x}_l \tag{1}

```

と変形します。  
上式の最後のシグマ計算は、$\boldsymbol{x}_l$が縦ベクトルであることに注意して  
```math  
\sum^n_{l=1} \boldsymbol{x}_l = (\boldsymbol{x}_1, \cdots, \boldsymbol{x}_n) \begin{pmatrix}1 \\ \vdots \\ 1 \end{pmatrix}
```
と変形することができます。ここで、$\boldsymbol{x}_l$はd次元縦ベクトルなので、上式右辺の左側の行列はd×n行列となります。  
これを転置し、n×d行列としたものを$\boldsymbol{X}$とすると(1)の右辺は次のように変形されます。  

```math  
y_t \boldsymbol{x}^T_t \boldsymbol{a}^T \boldsymbol{y}  \sum^n_{l=1} \boldsymbol{x}_l
= y_t \boldsymbol{x}^T_t \boldsymbol{a}^T \boldsymbol{y} \boldsymbol{X}^T \begin{pmatrix}1 \\ \vdots \\ 1 \end{pmatrix} \tag{2}
```
ここで、$y_t \boldsymbol{x}^T_t$について考えてみます。  
$\boldsymbol{x}^T_t$はd次元横ベクトルですが、上式の計算結果はスカラーになので、$\boldsymbol{x}^T_t$より右側の計算結果はd次元縦ベクトルとなる必要があります。  
(実際、見るからにそうですが・・・)  
この右側の部分は、添字tの影響を受けないので、fの勾配ベクトル(n次元(縦)ベクトル)の各要素の算式において共通部品となります。なので、勾配ベクトルを次のように表記することが可能です。

```math
\begin{eqnarray}
\nabla f(\boldsymbol{a})_t &=& 1 - \sum^n_{l = 1}a_l y_t y_l \boldsymbol{x}^T_t \boldsymbol{x}_l  \\
\leftrightarrow \nabla f(\boldsymbol{a}) &=& \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix} - 
\begin{pmatrix} y_1 \boldsymbol{x}^T_1 \\ \vdots \\ y_n \boldsymbol{x}^T_n  \end{pmatrix} \boldsymbol{a}^T \boldsymbol{y} \boldsymbol{X}^T \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix}
\end{eqnarray}  
\\
```

ここで、2項目の最初の行列は$\boldsymbol{X}$の各行に$y_t$を乗じた行列です。  
即ち$y_t (t = 1, \cdots ,n)$を対角要素に配置した対角行列と$X$の積になります。
以上から、以下の式変形を得ることができました。

```math  
\nabla f(\boldsymbol{a}) = \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix} - 
diag(\boldsymbol{y}) \boldsymbol{X} \boldsymbol{a}^T \boldsymbol{y} \boldsymbol{X}^T \begin{pmatrix} 1 \\ \vdots \\ 1 \end{pmatrix} \\
```
GOポインタの勉強

#メモリのしくみ

コンピュータのメモリにアドレス信号を制御する場所が10か所あるとしたら、それぞれに0か1が入るので、
2^10=1024とおりの住所が作成できる。言い換えると1024byte=1KBのメモリ容量となる。

現在のメモリは0か1かの制御を1.2～1.5Vの電圧の差で行い、3200MHz(32億回/秒)の送受信ができる。

#ポインタについて

住所は16進数で表され、その住所を直接知りたいときは「ポインタ型」という変数の型をつかい、
その型で宣言された変数を「ポインタ型変数」という。

「ポインタ型」だけでは宣言できない。どのリテラルのポインタ型か(intとかstrとか)も宣言する。


```

func main() {

	var a string = "hello"
	fmt.Println(a)
    //hello

    //str型のポインタ型変数pを宣言する
	var p *string


            /* ×な例
            p = a 
            上記ではポインタのアドレスpにaを格納することはできない
            aはstr型　pはstr型ポインタ型で別物なので代入できない
            */


    p = &a
    	//変数aのポインタを取り出すには&をつけて&aとする
	
    fmt.Println(p)  //ポインタのアドレスをそのまま出力
        //0xc000088220  ...アドレスが出力される

        fmt.Println(*p) 
        //*をつけるとデリファレンスされる。デリファレンスとは参照先を見に行くということ。
        //すなわち*アドレスでアドレスから数値をとりにいく
        //hello

	var b string = "world"
	fmt.Println(b)   //world
	fmt.Println(&b) //&でポインタ型変数に。もとのstr型をつけてくれるらしい。
    //0xc000088250

 /*
  var  c *string
	c = p+30
	fmt.Println(c)

    アドレスは16進数の数字だけど、int型と足し算はできない
 */


}

```
getsメソッドを利用したプログラムの備忘録

今日も学んだことを忘れないてためにメモします。


## getsメソッドの種類
getsメソッドが実行されるとターミナルがコマンド入力待ちの状態に変わりユーザーがエンターキーを押すまで文字を入力できる。
送られてきた文字列オブジェクトの後には改行が入る。
gets.chompとすることで改行が入らない。
getsとgets.chompは「数字」を入力しても「文字列」の扱いにしてしまう。
gets.to_iとすることで「数字」として扱える


## プログラム内容
getsメソッドを利用しての位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムになります。
```
> 二桁の整数を入力してください
> 15

# 1 + 5 と 1 × 5 をそれぞれ計算

> 足し算結果と掛け算結果の合計値は11です
```

10の位は整数を10で割ったものを更に10で割った計算結果、
1の位は整数を10で割った計算結果の余りで求められる。

Rubyの性質上、整数同士（integer型）の計算だと返り値は整数になるので、小数点以下は切り捨てられる。

## 記述内容
```
def addition(a, b)
  a + b
end

def multiplication(a,b)
  a * b
end

def slice_num(num)
  tens_place = (num / 10) % 10
  ones_place = (num / 1) % 10
  return tens_place, ones_place
end

puts "二桁の整数を入力してください"
input = gets.to_i
X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)
puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"
```
slice_numメソッドでは10の位と1の位を取得して、その返り値をX,Yという変数に代入している。
変数は定義する際に、カンマで区切ることによって、同時に複数の変数を定義できる。
Xに10の位、Yに1の位を同時に代入している。

additionメソッドで10の位と1の位の数字の足し算、multiplicationメソッドで十の位と一の位の数字の掛け算をそれぞれ行いadd_resultとmultiple_resultに代入。


最後にその結果を足して合計値を出力。

## 補足
ある整数について、任意の桁の数字を取り出す手順は、以下の通り。
①取り出したい数字の桁数で割る
② ①の結果をさらに10で割った、そのあまりが任意の桁の数字

```
# 1000の位
one_thousand_place = (num / 1000) % 10
# 100の位
hundred_place = (num / 100) % 10
# 10の位
tens_place = (num / 10) % 10
# 1の位
ones_place = (num / 1) % 10
```

以上になります。
【Mac】複数のGitアカウントを切り替える

## やりたいこと
- 複数のGitアカウントを切り替える
- 簡単に切り替えれるように自作関数を作成する

## 方法
ターミナルを開いて、以下のコマンドを実行する。
```zsh:ターミナル
code ~/.zshrc #vscodeをインストールしている場合
vi  ~/.zshrc #vscodeをインストールしていない場合
```
それぞれエディタが立ち上がるので、以下のコードを任意の場所に追加する。

```zsh:zsh
#職場で使う用のアカウント
function gitMain() {  #関数名はカスタマイズできます。
  git config --global user.name "[username]" #職場用のusername
  git config --global user.email "[email]"　 #職場用のemail
}

#個人で使う用のアカウント
function gitPri() {
  git config --global user.name "[username]"  #個人用のusername
  git config --global user.email "[email]"  #個人用のemail
}
```
コードが追加できたら、ファイルを保存します。

作成したファイルを適応させます。

```zsh:ターミナル
source ~/.zshrc
```
これで準備は完了！！

```zsh:ターミナル
gitMain #職場用
gitPri #個人用
```
これで複数のアカウントを簡単に切り替えることができます〜！！

## 参考
https://qiita.com/petitviolet/items/b1e8b5139169dd530919
https://qiita.com/0084ken/items/f4a8b0fbff135a987fea

## 最後に
簡単にgitアカウントを変えることができました。
gitアカウントを利用して、より良いプログラミング生活を！！
Unity+JetBrains RiderをArch Linux 環境下で使用する際コードの補完が効かない場合の対処法

# 問題
Arch Linux環境下においてUnityのコードエディタとしてJetBrains Riderを使用する際、コード補完が効かない。
# 環境
- Arch Linux
- Unity (2021.3.10f1 Personal)
- JetBrains Rider (2022.2.3)
# 対処法
 monoパッケージと msbuild パッケージをインストール
```
sudo pacman -S mono
yay msbuild
```
その後再起動すると正常に補完が効くようになる。
Express.JSアプリケーション Deploying to Vercel ⑤

# 参考動画
https://youtu.be/qwfE7fSVaZM?t=179

https://github.com/john-smilga/node-express-course

# 完成したアプリケーション
https://node-project-3g21.vercel.app/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/8654b973-0e24-8ca8-8af3-c9033f2b46b0.png)


# ソースコード

https://github.com/iwasaki-hub/node-project

# How to create and deploy an Express.js app to Vercel?
https://syntackle.live/blog/how-to-create-and-deploy-an-express-js-app-to-vercel-ljgvGrsCH7ioHsAxuw3G/

# 設定ファイル
```json:vercel.json
{
  "version": 2,
  "builds": [
    {
      "src": "app.js",
      "use": "@now/node"
    }
  ],
  "routes": [
    {
      "src": "/(.*)",
      "dest": "app.js"
    }
  ]
}
```

```javascript:app.js
require("dotenv").config();
const express = require("express");
const connectDB = require("./db/connect");
const app = express();
const path = require("path");
const tasksRoute = require("./routes/tasks");

const PORT = process.env.PORT || 5000;

// middleware
app.use(express.json());
app.use(express.static("./public"));

// routes
app.get("/", (req, res) => {
  res.sendFile("index.html", { root: path.join(__dirname, "public") });
});

app.use("/api/v1/tasks", tasksRoute);

const start = () => {
  try {
    connectDB(process.env.MONGO_URI);
    app.listen(PORT, () => {
      console.log(`server is listening on port ${PORT}`);
    });
  } catch (error) {
    console.log(error);
  }
};

start();

module.exports = app;
```

```json:package.json
{
  "name": "free",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "engines": {
    "node": "14.x"
  },
  "scripts": {
    "start": "nodemon app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^16.0.2",
    "express": "^4.18.1",
    "mongoose": "^6.6.1",
    "nodemon": "^2.0.20"
  }
}
```
【SwiftUI】フォルダ内の画像を表示する方法

# 「Swiftで画像を表示」と検索すると...

Assets.xcassets（画像を格納するフォルダ）に画像を格納し、Image()で表示させる方法が出てきます。
しかし今回は、Assets外、プロジェクト直下に格納した画像を表示する方法を解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/f7104c98-b4f1-c029-af8c-fbd5b3a62e9e.png)

```swift
struct ContentView: View {
    var body: some View {
        Image("sample")    // 画像（sample）を表示
    }
}
```




# Assets.xcassets外に格納した画像を表示させる方法

プロジェクト直下に画像（sample.png)が配置されています。
これをView内で表示させるための手順を示します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/f2cb66c6-0094-786d-c45f-8f317e62ba80.png" width=300 />

### 1. フォルダ内の画像をUIImageに変換する

これにはextensionを用います。

```swift
extension Image {
    init(path: String) {
        self.init(uiImage: UIImage(named: path)!)
    }
}
```

### 2. View内に画像を表示させる

1のextensionに画像のパスを入力することにより、画像が表示されます。
プロジェクト直下のパスは、Bundle.main.pathにより取得されます。forResourceには画像名、ofTypeには拡張子が入ります。

```swift
Image(path: Bundle.main.path(forResource: "sample", ofType: "png")!)
```


# コード全体

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing:0){
            Text("Image")
                .frame(width: bodyView.size.width, alignment: .center)
                .font(.largeTitle)
                .fontWeight(.black)
                .padding(.bottom)
            Image(path: Bundle.main.path(forResource: "sample", ofType: "png")!)
        }
    }
}

extension Image {
    init(path: String) {
        self.init(uiImage: UIImage(named: path)!)
    }
}

```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/cf8b7e04-59cb-c6aa-faa9-2a3d775aaf7f.jpeg" width=300 />


# 追記

デフォルトのImageを用いるもっと簡便な方法が見つかったので追記します。
後半にbundle: .mainと記載するだけです。

```swift
Image("sample", bundle: .main)
```

これを用いれば、extensionを使う必要もありません。
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing:0){
            Text("Image")
                .frame(width: bodyView.size.width, alignment: .center)
                .font(.largeTitle)
                .fontWeight(.black)
                .padding(.bottom)
            Image("sample", bundle: .main)
                .resizable()
                .frame(width: 300.0, height: 300.0, alignment: .leading)
        }
    }
}
```


参考サイト
1. https://capibara1969.com/1861/
2. https://stackoverflow.com/questions/63470030/how-to-use-bundle-in-swiftui-with-image
3. https://qiita.com/renchild8/items/14c0aa08b0bc7f4744c9
PySimpleGUIのラジオボタンを保守性良く記述

PySimpleGUIを使うと簡単にGUIアプリを作ることができて便利です。
ただ、その中でも、ラジオボタンは直接記述すると煩雑で保守性が悪くなってしまいます。
そこで、リストと辞書を活用して保守性の良い記述を考えてみました。

```python
import PySimpleGUI as sg

rdco = {    #ラジオボタン共通設定(辞書)
    'font':('meiryo', 16),
    'enable_events':True
}
l_rd = [    #ラジオボタン設定 [group_id, デフォルト選択key, {共通オプション}, [[text, key]]]
    ['rtype', '-RD_RT_NORM-', rdco, [
            ['白米', '-RD_RT_NORM-'],
            ['雑穀米', '-RD_RT_ZAKKOU-']
        ]
    ],
    ['rsize', '-RD_RS1-', rdco, [
            ['小盛', '-RD_RS0-'],
            ['普通', '-RD_RS1-'],
            ['大盛', '-RD_RS2-']
        ]
    ]
]
l_rdFr = [  #ラジオボタンフレーム設定 [group_id, title]
    ['rtype', 'ごはんの種類'],
    ['rsize', 'ごはんの量']
]
RD = {gid : [sg.Radio(n, key=k, group_id=gid, default=(df==k), **op) for n, k in rs]
 for gid, df, op, rs in l_rd}

layout =[[sg.Frame(gn, [RD[gid]])] for gid, gn in l_rdFr]
window = sg.Window('radio buttons', layout)

while True:
    event, values = window.read()
    print(event, values)
    if event in (sg.WIN_CLOSED, 'Exit'):
        break
window.close()
```

![PySimpleGUI_Radio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/83e5b349-59d7-a011-8802-c1c54c390106.png)
任意のディレクトリ以下のnode_modulesをまとめて削除する


使っていないnode_modulesを削除して容量削減したいとき用のメモ


任意のディレクトリ以下のnode_modulesを見つける

```sh
$ find . -name 'node_modules' -type d -prune 
```

あとは、削除するなりzipに固めるなりお好きに

```sh
#削除する
$ find . -name 'node_modules' -type d  -prune | awk '{print "rm -rf", $0}' | sh
```
Gitの基本の「キ」 part4 GitHubにSSHを登録する方法

# はじめに
エンジニアを志して皆さん勉強を始めていきますが、gitに関して知らない方、結構多い印象ですね。
わかってしまえば非常に便利なgitですが、概念が少し分かりづらいですよね。
いきなり触るとなった場合にも困る事がないよう、経験のない方向けにシリーズとしてまとめていこうと思います。

今回は[前回](https://qiita.com/YuukiYoshida/items/8c8e5717390814121480)に続き、part4、GitHubにsshを登録する手順を解説しようと思います。

前提として、GitHubアカウントの登録済みである前提でお話を進めていきます。
また、環境はMacをベースとした解説です。

# 手順その１：sshを発行する
まず、クローンするにあたり、sshを登録する必要があります。
※sshとは、セキュアシェルの略でネットワークを通じて別のコンピュータを安全に遠隔操作するための通信手段です。

:::note info
ちなみにGitHubでは基本的にsshを登録してリモートにアクセスするケースが多いですが、アクセストークンを作成してhttpsでやり取りする方法もあります。
今回は基本的なsshを使用した登録方法を説明しますので、これは後日解説しますね。
:::

sshの発行方法は主に二つあると思います。
①ターミナル上での発行
②gitクライアントでの発行

まず、①の発行方法から解説します。

ターミナルを開き、以下を実行します。

```
$cd ~/.ssh
```
初めて生成する際は、中身は特に何もありません。

次に、以下を実行します。
```
$ssh-keygen -t rsa
```
上記コマンドを実行すると3回ほど以下のような質問で回答を求められますが、全てエンターで問題ありません。

```
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

上記コマンドで発行完了です。
発行後は以下コマンドにてコピーしておきます。

```
$pbcopy < ~/.ssh/id_rsa.pub
```
以上で①の発行方法は以上です。

次に、②のgitクライアントを使用した発行方法を説明します。
説明にはSourceTreeを使用して解説します。

まず、Sourcetreeを開き、以下手順で環境設定を開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/5f0732b9-1878-50f4-5a0b-5868c695f6ab.png" width="220px">

アカウントタブを開き、左下の追加ボタンから、以下アカウント接続ウィンドウを開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/b5d3393f-b8bd-2f89-aa85-8339e676580d.png" width="320px">

ホストをGitHubを選択し、アカウントを接続を選択することで、SourcetreeとGitHubを連携させます。
連携が完了すると`クリップボードにコピー`と記載されたボタンが有効になっているはずなので、こちらを選択することでsshをコピーできます。
これで②の手順は終了です。

sshをコピーするまでの手順はどちらでも問題ないはずなので、やりやすい方を選択してもらえればと思います。

# 手順その2：sshを登録する
上記手順でsshを発行、コピーできたら、次はGitHubに登録します。
GitHubを開き、`ユーザーアイコン > Settnigs`を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/dc5b51d3-df7b-cfaf-1955-f90f9afccf49.png" width="190px">

設定画面を開くと、左側のメニューに`SSH and GPG keys`という項目があるので、選択します。
上記を選択したあと、`new SSH key`というボタンがあるので、選択します。

上記ボタンを選択すると、以下画面が出ると思いますが、key欄にコピーしておいたsshをペーストし、`Add SSH key`を押下することで、登録は完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/32118621-34e3-bb5a-a143-fb318336d875.png" width="400px">

# さいごに
慣れていない頃はよくSSHの登録をうっかり忘れてgitが操作不能な問題に陥りがちです。
クローンできない場合などは、以下コマンドを叩くことでsshが正しく登録できているか確認ができるので、ご活用ください。

```
$ssh -T git@github.com
```
ただし、sshキーの名称を変えている場合はconfigファイルを作成するなどの工夫が必要なの要注意です。
【GitHub】コードレビュー略語のバッチ集

# はじめに
配色は適当なのでなんかイメージと違うなどあればコメントください！！

# LGTM
![LGTM](https://img.shields.io/badge/review-LGTM-green)
```
![LGTM](https://img.shields.io/badge/review-LGTM-green)
```
「Looks Good To Me」 = 良いと思います

# WIP
![WIP](https://img.shields.io/badge/review-WIP-purple)
```
![WIP](https://img.shields.io/badge/review-WIP-purple)
```
「Work In Progress」 = 対応中

# FYI
![FYI](https://img.shields.io/badge/review-FYI-pink)
```
![FYI](https://img.shields.io/badge/review-FYI-pink)
```
「For Your Information」 = 参考までに

# must
![must](https://img.shields.io/badge/review-must-red)
```
![must](https://img.shields.io/badge/review-must-red)
```
「must」 = 必須

# want
![want](https://img.shields.io/badge/review-want-skyblue)
```
![want](https://img.shields.io/badge/review-want-skyblue)
```
「want」 = できれば

# imo
![imo](https://img.shields.io/badge/review-imo-orange)
```
![imo](https://img.shields.io/badge/review-imo-orange)
```
「in my opinion」 = 私の意見では

# imho
![imho](https://img.shields.io/badge/review-imho-yellow)
```
![imho](https://img.shields.io/badge/review-imho-yellow)
```
「in my humble opinion」 = 私のつたない意見では（控えめな意見・謙虚な意見）

# imnsho
![imnsho](https://img.shields.io/badge/review-imnsho-brown)
```
![imnsho](https://img.shields.io/badge/review-imnsho-brown)
```
「in my no so humble opinion」 = ハッキリ言わせていただくと

# imao
![imao](https://img.shields.io/badge/review-imao-gold)
```
![imao](https://img.shields.io/badge/review-imao-gold)
```
「in my arrogant opinion」 = 私の大胆な意見（ぶっちゃけ）

# nits
![nits](https://img.shields.io/badge/review-nits-yellowgreen)
```
![nits](https://img.shields.io/badge/review-nits-yellowgreen)
```
「nitpick」 = 些細な指摘（重箱の隅をつつくの意味）

# GOTCHA
![GOTCHA](https://img.shields.io/badge/review-GOTCHA-beige)
```
![GOTCHA](https://img.shields.io/badge/review-GOTCHA-beige)
```
「I've got you」 = やったぜ！

# NP
![NP](https://img.shields.io/badge/review-NP-darkgreen)
```
![NP](https://img.shields.io/badge/review-NP-darkgreen)
```
「No Problem」 = 問題ない

# 参考にした記事
https://qiita.com/kamihork/items/be0d7bdad8ae5a8082fb
ベジェ曲線、カトマルロム


サンプルを書こうと思ったけど、良い物があったのでメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/06017a88-3640-37bd-9861-0d75c0b58f61.png)

こちらの書籍の七章のサンプル
https://github.com/ryukbk/mobile_game_math_unity
【AWS】Javaのアプリをデプロイ part2

jarファイルを使用している為かtomcatをインストールしなくてもデプロイして起動する事が
出来ました。



<h1>【JDK インストール】</h1>
//ルートユーザーに変更

「sudo su」
//Java11をインストール
「sudo yum install java-11-amazon-corretto-headless」
//インストール後に確認
「java --version」
「javac --version」

<h1>【apache インストール】</h1>
//apacheをインストール

「yum install -y httpd」
//インストール後にapacheを確認
まずapacheを起動させます。
「systemctl start httpd」
ブラウザにEC2のIPアドレスを入力してapacheのページが
開ければ確認完了。

<h1>Postgres インストール</h1>
//インストール

「sudo yum install -y postgresql postgresql-server postgresql-devel postgresql-contrib postgresql-docs」

//インストール後の確認
「psql --version」
※バージョンが表示されればインストール完了

//初期化を行う
「 sudo /sbin/service postgresql initdb」

//Postgresを起動
「sudo service postgresql start」

//※起動出来ない場合は下記コマンドで原因を確認
「systemctl status postgresql.service」

//DBへの接続ユーザを作成
「sudo passwd postgres」
ユーザー postgres のパスワードを変更。
新しいパスワード:**************
新しいパスワードを再入力してください:**************

//ユーザ変更の確認
「su - postgres」

-bash-4.2$ psql
※-bash-4.2$ exitで解除
↓
postgres=# 「ここにsql文を入力します」
※postgres=#￥qで解除
※create database ~ //DB作成コマンド

//対象のDBへ接続
「psql -h localhost -p 5432 -U postgres -d student」
これで対象のDBにアクセスできます。
アクセスが出来たら必要なテーブルやカラムを作成して下さい。


//詰まった箇所
「Ident authentication failed for user "postgres"」//error
DBへ接続をした際に上記エラーが出ました。
posgresのconfファイル(pg_hba.conf)の設定を変更する必要があります。
このファイルは「/var/lib/pgsql/data」にありました。

//pg_hba.confの設定の変更
上記ディレクトリ(/var/lib/pgsql/data)まで移動。
「vim pg_hba.conf」でファイルの中身を下記のように書き換えます。
host all 127.0.0.1/32 ident→ident の部分をtrustに変更。

![db_変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/ce0971df-a0c5-590d-1465-03ad2ccd24b1.png)


<h1>【jarファイルの作成】</h1>
※springbootからjarファイルを作成します。
対象プロジェクトを右クリック。
↓
「Run As」を選択
↓
Maven Installを選択

これでプロジェクトの「targetディレクトリ」にjarファイルが出来ています。

このjarファイルをteratermで開いているサーバへドラッグします。

//jarファイルを実行
「java -jar ファイル名」

実行後ブラウザにURL(パブリックIPアドレス:8080/~)を入力すれば完了です。
例:/54.***.***.***:8080/index等
ROCm pytorch で Whisper で ASR(音声認識)を極めたいメモ

ROCm pytorch で ASR(音声認識, speech to text) やりたい...

ROCm で Stable Diffusion 動きます
https://qiita.com/syoyo/items/5d361ef5ff95d8ca70ee

最近(2022 年), ROCm Pytorch も結構安定して動作する感じになりましたので, Whisper も動かしてみます.

## 環境

* Ubuntu 20.04
* CPU メモリ 64 GB
* RX6800(RDNA2)
* ROCm 5.2.3
* Docker ROCm pytorch

## セットアップ

Docker イメージは `rocm/pytorch:rocm5.2.3_ubuntu20.04_py3.7_pytorch_1.12.1` を使いました.

あとは github にある手順通りです.

https://github.com/openai/whisper

```
pip install git+https://github.com/openai/whisper.git 
```

## 実行

あとは動かすだけです!
せっかくなので日本語ためしてみたいですね.

Common voice https://commonvoice.mozilla.org/ja/datasets あたりを使うといいかも.

```
$ whisper input.wav --language Japanese --model medium
```

Voila!

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ROCm PyTorch で Whisper 動作きたーーーーーーーーーーーーーーーーーー！！！！！！🎉🎉🎉🎉🎉💪💪💪💪💪💪💪💪💪💪💪💪✊✊✊✊✊✊✊✊✊✊ <a href="https://t.co/s2hNVr5hsM">pic.twitter.com/s2hNVr5hsM</a></p>&mdash; syoyo.eth 🌸 レイトラ ® 🐯 4 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1574011087439400960?ref_src=twsrc%5Etfw">September 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

1 分の音声で, 起動時間ふくめ処理時間は medium で 1 分ほどでした.
medium model では GPU メモリ消費 5 GB くらいでした.
(https://github.com/openai/whisper#available-models-and-languages モデルのサイズと大体同じかな)

large model ですと GPU メモリ消費 8 GB(`rocm-smi` でメモリ利用率 50%)くらいでした.
large は RX6700 のような 12GB モデルでも動きそうです.
(また, 3080 10 GB で試したが, 10 GB では足りなかった)

## Common voice 

https://dev.commonvoice.allizom.org/ja/datasets

の合計 51 時間の音声データで,

RX6800 110W poerlimit で, large で

`common_voice_ja_1*.mp3` で 35 分

`common_voice_ja_2*.mp3` は 32 時間(1927 分)

```
real    1927m47.658s
user    1812m7.297s
sys     35m10.677s
```

`common_voice_ja_3*.mp3` は T.B.W. でした 13.6 時間(816 分).

```
real    816m1.038s
user    752m37.050s
sys     54m56.290s
```

概ね 47 時間で, 等速よりちょっと速いで認識できている感じですね

## その他

抑揚情報とかも取得できたりするんじゃろか?

## TODO

* [ ] 抑揚情報取得できるなら, それを Diffusion model とか使ったナウでヤングな TTS に使ってより自然な TTS(Text-to-speech)を極める.
Reactで言うところのbootstrapはTailwindCss

まずはお決まりの
```
npx create-react-app sample-react-tailwind
```
```
cd sample-react-tailwind
```

ライブラリのインストール
```
npm install -D tailwindcss postcss autoprefixer
```
```
npx tailwindcss init -p
```
上記でtailwind.config.js と postcss.config.jsを作成する。
フォルダ内に
 tailwind.config.jsと postcee.config.jsができる

tailwind.config.jsの「content」を以下のように修正。Tailwind CSSを反映させたいファイルを指定する。
```
@type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```
画面に読み込んでいる./src/index.cssファイルに、以下の記述を追記する。
```
@tailwind base;
@tailwind components;
@tailwind utilities;
```
```
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="border border-gray-400 rounded-2xl p-2 m-2 flex justify-around items-center">
      <h1 className="text-3xl font-bold underline">
        Hello Tailwind CSS!
      </h1>
      <p className="m-0 text-gray-400">Tailwind CSSです</p>
      <button className="bg-gray-300 border-0 p-2 rounded-md hover:bg-gray-400 hover:text-white">ボタン</button>
    </div>
  );
}

export default App;
```

こんな感じで使えるよ.
下記は参考サイト。コンポーネントのまとめ

https://omkz.net/tailwind-tools/

https://kitwind.io/products

追記
npm run startする。npm startでは駄目
Symbolブロックチェーンで実現できるAliceからBobへのモザイク転送制御12パターン

速習Symbolの各所で紹介したモザイクの送信・受信パターン12種類をまとめて紹介します。

https://github.com/xembook/quick_learning_symbol

##### 送信

Bobの許諾を得ることなく、AliceからBobへモザイクを送信します。
最もオーソドックスなパターンです。

##### オプトイン送信
Bobの許諾を得てAliceからBobへモザイクを送信します。
Bobの自分自身へのダミートランザクションをアグリゲートすることで実現します。

##### 交換
第三者アカウントが仲介することなく、AliceからBobへモザイク送信すると同時にBobからAliceへモザイクを送信します。

##### マルチシグ送信

Aliceのマルチシグアカウントの署名によってAliceが所有するモザイクをBobへ送信します。
- AND送信
    - Aliceの資産を動かせるCarolかつDaveの双方が署名をすることによって、送信を実施します。
- OR送信
    - Aliceの送信を動かせるCarolまたはDaveのどちらかが署名をすることによって、送信を実施します。



#####  転送不可送信
Bobが他人に譲渡できないモザイクをAliceから送信します。
Aliceのモザイク生成時に転送不可設定をしておく必要があります。

##### 還収
Bobの許可を得ることなく、AliceがBobからモザイクを還収します
モザイク生成時にリボーカブル設定をしておく必要があります。

##### HTLC送信
AliceがロックしたモザイクをBobが共通パスワードを提示することでモザイクを受信します。

##### タイマー送信
AliceからBobへとモザイク送信すると同時に同額のモザイクをBobからAliceへシークレットロック送信します。
シークレットロックの期限切れでBobに返却されることで、Bobへの送信が実現します。

##### 受信拒否
Bobが事前に受け取り拒否をしておくことで、Aliceからの送信を拒否します。

##### 返還拒否
転送不可モザイクをAliceが受信拒否にすることで、Bobが返還できないモザイクを送信します。

##### グローバル制限
あらかじめ経済圏への所属を設定しておくことで、その制限下でAliceからBobにモザイクを送信します。

##### 送信不可設定
AliceのXYM残高0で、XYMの受信拒否設定することでAliceのモザイク送信を不可能にします。
(手数料0のTXを受け入れるノードがハーベストした場合は受信拒否設定を解除できる可能性があります)
index.htmlだけでCSVを検索するシステムを更に改善する

# 概要

- 以前に自分がつくったツールを改善する記事を投稿しました

https://qiita.com/tamoco/items/7a0c1c63e262709f0cdc

- 上記の記事にですが改善前後ともに使っていただいているようでちょっとしたご要望もいただいたり・・・
- 今回は更に改善するということで機能を追加していきます

# 要望（からの今回は何をするのか？）

- 以前のバージョンでは数値を比較して検索できる機能があった
- 改善した新バージョンではテーブルにして見やすくなったけど数値の検索機能が切り落とされた
- 今回、数値の検索機能を追加する！！！

# 開発

## コードと公開先

### ソースコード
https://gitlab.com/tamoco-mocomoco/csv-search-2

### 公開先
https://tamoco-mocomoco.gitlab.io/csv-search-2

### 変更した内容

#### 数値比較のチェックマークを入れると数値比較の設定をするラジオボタンが表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/a3171249-f507-6958-e3b7-2e3d613fda1e.png)


#### 数値を比較して検索

- データ元のCSVがISBNが数値データになるので数値比較可能
- 数値以外のデータは検索されない設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/7324a049-7815-c6d9-55a4-1b9e6b351e7c.png)

- 低い数値を入れて以上で数値比較すると件数が増える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/416ad740-d108-1a08-c7ea-c5d000067090.png)

## 課題

- 数値を検索するモードを以前の構成をベースに作成してしまった
  - 別の配列に数値を検索するモードを格納して管理している
  - `csvColsObj`に入れてしまって統合管理してもよさそう
    - 数値の検索するモードはViewで設定する側と整合性があるわけでないので`v-model`でバインドさせる構成にしたい
- 検索結果が`computed`であるがゆえに数値の検索するモードのラジオボタンで発火させるため検索キーワードを入れ直す処理を入れている
  - `computed`をやめればいいかもしれないが`methods`にするのは微妙
  - とはいえ`computed`を発火させるためにムリしているのはダサい

# ふりかえり

- 数値を比較して検索したいというのは意外にもご要望があるようでした
- 改善という意味では要望があったら機能として追加すべきだと思い実装してみました
- 東京都のオープンデータのサイトでもプレビューがありテーブルベースな感じです
  - 使い勝手は個人的な感じではありますが蔵人向けなイメージです
- テーブルベースならExcel風に表示するライブラリもあるのでそちらを採用するのもよさそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/29c59eea-3ad1-cb9a-af1e-1db53c522f91.png)
時間割アプリの説明(技術寄り)

# docker
docker を使うことで、クラウド上で簡単に構築できるようにしている。database 用のデータは public にしてはいけないので、初期化用の sql は scp で送信して、docker compose の volume bind を用いた。

# 公開化
データを隠す必要がある。docker で mysql を 2 つ立ち上げてもよかったが、クラウドの無料枠を使いたいため、スペック上の問題で 1 つの sql, 2 つの database とした。アプリは公開用と内部用 2 つ立ち上げた。
もちろん user を分けないといけないので、初期化の sql 文で公開用データにアクセスするユーザーを作成、docker compose の env_file で 2 つのアプリに設定する環境変数を変えて、同じ docker image を用いるようにしている。
公開用データベースも、内部用データベースの初期化 sql を変えると自動的に(クラウドに上げる手順の中で)変わるようにして、公開用のためだけのメンテナンスは基本いらないようにしている。

# gcp への移行
aws は無料期間が過ぎたため、gcp に移ることでコスト削減を図った。

# CI/CD
CI は commit, push 時に githooks で導入した。
commit 時は golangci-lint, push 時は go test と go build ができるかどうかをチェックしている。

CD は merge 時(PR 後ブランチ削除時)に github actions で導入した。
gcp に移行出来ていない。
【資格合格記】AWS SOAに合格したので振り返る

結構前の話になりますが、2022/03/26にAWS認定試験の一つであるSysOpsアドミニストレータ（SOA）に合格しました。

![スクリーンショット 2022-07-24 190841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/d148a071-4a89-c855-2429-74384d487f7b.png)

使った教材や本番試験で感じたことを振り返り、SOA合格を目指している人の参考になればと思います。

# SOA-C02について

自分が受験したときはSOAの試験が新しくなったあとだったため、SOA-C02になります。
そのため、前半の選択問題と後半の実技問題の試験でした。

しっかり[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Exam-Guide_C02.pdf)を確認しておきましょう。


# 所有資格（AWS関連）

- クラウドプラクティショナー（CLF）
    - 2021/05/23 合格
    - 学習期間は１か月程度
- デベロッパーアソシエイト（DVA）
    - 2021/10/30 合格
    - 学習期間は１か月程度
- ソリューションアーキテクト（SAA）
    - 2021/12/11 合格
    - 学習期間は１か月程度

# 学習期間

合格までの学習期間はニヶ月くらいです。
他のアソシエイト試験と比べて長い期間学習しました。

実は2月に一度SOAを受験して、落ちました。
700ちょいのスコアだったので、かなり悔しい思いをしました。
そこからさらに一ヶ月学習を続け、3月に無事合格しています。

# 受験した感想

選択問題については次に紹介する教材から学習することができるので問題はないと思います。
自身が付くまで解いて不安要素をなくしましょう。
残り時間に余裕を持って選択問題を１周することが出来ました。


難しいのは実技の方かと思います。
業務でAWSを触ったことがあるなら良いですが、あまり触ったことがないなら実機をいじってみた方が絶対良いです。
AWSのサービスもたくさんありますが、SOAの試験範囲の中でよく触るサービスをもっと重点的に見ておけばよかったと思います。


# 使用した教材

自分が受験した当時はSOAの書籍はなかったので、自分は使用していません。
今は書籍があるようなので、これから受ける人は参考にすると良さそうです。

## [【SOA-C02版】AWS 認定SysOpsアドミニストレーター アソシエイト模擬試験問題集（全4回分294問）](https://www.udemy.com/course/aws-sysops-53195-q/)

オススメ度：★★☆

新しく出た後半の実技の問題もあるとのことだったので、購入。
実技問題については情報がほぼなかったので、少しでも慣れたいと思っていましたが、個人的には微妙でした。

問題文（これからやりたいこと）に対して、それを実現するための操作方法が選択肢にズラッと書かれています。
下記のような手順が6~7ほどある選択肢が4つほど出て、どの手順が正解かを選ぶ形式です。
そのため、一つの選択肢の分量がかなり多いです。

>１．○○を押して△△の画面に移動
２．○○を選択し～～

実技部分の問題を作るの難しいのは重々承知していますが、これでは手順を覚えるだけのような学習になってしまうと感じました。
結果、自分は後半の問題は行わず、前半の選択問題だけを取り組む形で利用させていただきました。

## [aws web問題集で学習しよう](https://techstock.jp/)

オススメ度：★★★

他のアソシエイト試験でもお世話になったkoiwaの問題集です。
空いた時間にちょっとやるのに最適です。

本番試験の難易度も、こちらの問題集と近いと感じました。
正解の選択肢になる理由、他の選択肢がどうして間違いなのかを理解できていなければ、
ノートにメモを取り理解力を深めることが出来ました。
MigemoをPythonで

## はじめに

日本語の文章をローマ字で検索できるMigemo検索を、Pythonで利用したいと思ったことはないでしょうか。
MigemoのPython実装であるpymigemoをPyPIで公開したので、その利用方法を解説します。

## Migemoとは

Migemoはローマ字で入力するだけで、漢字を含む様々な単語を検索できる検索手法です。
例えば、「吾輩は猫である」という文章の「猫」を検索したい場合、「neko」と入力するだけで、「猫」に検索がヒットします。

Migemoの仕組みは簡単で、「neko」を仮名に変換し「ねこ」を得ます。次に、「ねこ」に完全一致か前方一致する単語を列挙し、その単語の一覧にヒットする正規表現を生成します。

「ねこ」の場合、以下の正規表現が生成されます。

```
(猫|ねこ|ネコ|寐転|寝[転込]|寢込|弥固|根[刮子掘瘤]|ﾈｺ)
```

あとはこの正規表現で検索を行えば、文章の「猫」部分にヒットします。

## Python実装での工夫

Pythonは様々なツールの開発で使われており、もしかしたらMigemoを使いたいという需要があるかもしれません。
そこで、PythonでMigemoを実装しました。

### ピュアPython

C言語で実装されたC/MigemoにバインディングするPythonライブラリはすでにありました。
そちらの方が性能的には優れているのですが、環境に依存するというデメリットがあります。

pymigemoは全てPythonで実装されているので、特別なインストール手順は必要ありません。
`pip install pymigemo` のみでインストールできます。

ついでに依存パッケージもありませんので、バージョン衝突なども発生しません。

### 辞書構造がLOUDSトライで省メモリ

LOUDSトライというデータ構造で辞書データを格納しています。
そのため、C/Migemoのメモリ使用量が26MBに対し、pymigemoは7MBと小さくなっています。

### 辞書がBSDライセンス

C/MigemoではGPLライセンスの辞書でしたが、pymigemoではBSDライセンスの辞書を同梱しています。
そのため、皆さんの開発するツールに組込みやすくなっています。

## 利用方法

### pipコマンドでインストール

Pythonと一緒に導入されているpipコマンドで、PyPIからダウンロードしインストールします。
```
> pip install pymigemo
```

ちなみにアンインストールは、以下のコマンドです。

```
> pip uninstall pymigemo
```

### CLIで使ってみる

インストールが完了すると、CLIツールとして利用できます。
pymigemoを実行すると、「QUERY:」と出力されますので、検索したい単語のローマ字を入力します。
例えば、「kensaku」とエンターを入力すると、以下のように出力されます。

```
> pymigemo
QUERY: kensaku
PATTERN: (賢作|謙作|腱索|羂索|研削|県作|献策|検索|憲作|建策|兼作|健[策作]|けんさく|ｋｅｎｓａｋｕ|kensaku)
QUERY:
```

再度表示される「QUERY:」でエンターのみを入力すると、CLIツールが終了します。

もし、「QUERY:」「PATTERN:」という出力がいらない、再度の入力要求もいらないという場合、「-w」オプションを使います。

```
> pymigemo -w kensaku
(賢作|謙作|腱索|羂索|研削|県作|献策|検索|憲作|建策|兼作|健[策作]|けんさく|ｋｅｎｓａｋｕ|kensaku)
```

### スクリプトで使ってみる

Pythonスクリプト上でMigemoを使ってみましょう。

まずは、pymigemoパッケージからmigemoをインポートします。

```py
import migemo
```

次に、Migemoインスタンスを初期化します。
このとき、パッケージに同梱の辞書ファイルが自動的に読み込まれます。

```py
m = migemo.Migemo()
```

最後に、検索したい単語のローマ字をqueryメソッドに渡します。

```py
m.query('kensaku')
# => '(賢作|謙作|腱索|羂索|研削|県作|献策|検索|憲作|建策|兼作|健[策作]|けんさく|ｋｅｎｓａｋｕ|kensaku)'
```

queryメソッドは状態を内部に持たないので、queryメソッドを複数のスレッドから同時に呼び出すことができます。

## まとめ

PythonでMigemoを簡単に利用できるので、ぜひ使ってみてください。

pymigemoへのコメントや要望等は、この記事にコメントするか、[GitHubのIssue](https://github.com/oguna/pymigemo)からご連絡ください。
Dockerってなんだ

<h1>Dockerってなんだ</h1>
<p>Dockerを勉強したので用語を初心者なりにまとめてみます。</p>

<h2>Docker</h2>
<p>
    DockerはDockerfileに記入した設定を元に環境構築を行うプラットフォーム。
    例えば、mysqlとgolangでAPIサーバーを作ろうとすると、それぞれの実行環境をローカルに用意する。
    対してDockerは、コンテナに実行環境を用意する。
</p>

<h2>DockerとDockerFile</h2>
<p>
    DockerはDockerFileから環境構築を行い、アプリケーションの開発環境を管理する文章を用意してくれる。
    大工と設計図。
</p>

<h2>DockerCompose</h2>
<p>
    Docker上に複数のコンテナをまとめて稼働させる指示書がDockerCompose。
    町全体の開発計画を書きこむ紙を大工に渡すと、街並みを考えて建物を建ててくれる。
    大工の能力が遺憾なく発揮されてる。
</p>

<h2>学習教材</h2>
<a href="https://docs.docker.com/language/golang/build-images/">公式tutorial</a><br>
<a href="https://y-ohgi.com/introduction-docker/">入門 Docker</a>
LAMP環境に入れたWordPressを全ディレクトリから探す

## はじめに
LAMP環境でwordpressを入れたものの、wordpressの場所がわからなくなった人に向けて書いています。


### 環境

OS::CentOS stream 8

### 全ディレクトリの検索
findコマンドを使います
今回はwordpressディレクトリがどこにあるか検討もつかないので
```sudo find / -name wordpress```
参考::[find 全ディレクトリを検索対象する方法](https://mebee.info/2020/07/16/post-12097/#outline__2)


### 結果
```
sudo find / -name wordpress
/var/lib/mysql/wordpress
/var/www/wordpress
/var/www/wordpress/wp-includes/js/tinymce/plugins/wordpress
/var/www/html/wp-includes/js/tinymce/plugins/wordpress
/var/www/html/wp-includes/js/tinymce/skins/wordpress
```
var/ディレクトリ以下にあることがわかったかが**var**てなんだっけ？てなったので深堀り
/var/
動的なデータ（キャッシュやログなど）を扱う。メールやウェブサービスに必須
/var/www/
Apacheのデフォルトデータが管理されているディレクトリ
参考::[Linuxの基本の基本。Linuxの基本的なディレクトリ構成](https://oxynotes.com/?p=5987)

## 最後に
今回WordPressの場所を調べたいと思ったきっかけは、WordPressをカスタマイズしたいと思ったからです。バックアップ取らないと間違ってデータ消したとき大変です。次回はHTMLとかCSSの記事を書くかもです。
【Zsh】特定の日時を出力する方法

## 1日前

1日前の日時を取得するには以下のように実行する。

```zsh
date -v-1d
```

```zsh
$ date
2022年 9月25日 日曜日 19時34分06秒 JST

$ date -v-1d
2022年 9月24日 土曜日 19時34分13秒 JST
```

## 1日後
1日後の日時を取得するには以下のように実行する。

```zsh
date -v+1d
```

```zsh
$ date
2022年 9月25日 日曜日 19時35分23秒 JST

% date -v+1d
2022年 9月26日 月曜日 19時36分00秒 JST
```
zコマンドで素早いディレクトリ移動


# zコマンド
zコマンドはcdによって移動して記憶された**移動履歴**をもとに**ディレクトリ名の一部だけ**の指定でも移動できるようにするやつ．

```sh
$cd ~/example/src  #一度cdで移動しておけば
$z src             #zで一部の指定で簡単に移動できる
```
# インストール
以下のコマンドより`~`(ホームディレクトリ)にクローン
```sh
$git clone https://github.com/rupa/z ~/z
```

.bashrc等に以下を追記
```sh:.bashrcとか.zshrc
#z command
. ~/z/z.sh
```

# 使用方法
簡単な使い方

#### cdでzを学習させる.
```sh
$cd ~/example/src  #学習させることで使えるようになる．
```

#### zで学習されたデータ(移動履歴)を表示
左の数字は重要度．高いほうが優先される．
重要度はcdでたくさんアクセスしたものが高くなる．
```sh
$z
1686       /example/src  #一回でもcdをすれば登録される．
1686       /mnt
2748678    /mnt/c/Users/trims/Downloads
4888826    /mnt/c/Users/trims
```

#### z ディレクトリ名
上の学習データに基づくと以下のように指定するだけで`/example/src`に移動できる．
```sh:例
$z sr
$z src
$z rc
```


# 終
便利ですな

詳しい使い方などは公式レポを参照

https://github.com/rupa/z
【AWS】Javaのアプリをデプロイ　part1

今回はAWSの設定の仕方からJavaのアプリ(jarファイル)をデプロイする方法を記述します。
※メモになるので内容は拙いです。

<h1>【VPCの起動とサブネットを構成】</h1>
VPCダッシュボードで「VPCを作成」をクリックします。
・作成するリソースはVPCのみ。
・名前タグは「aws_test」とします。
・CIDRブロックは「10.0.0.0/16」にしておきます。

その他の設定はデフォルトです。


![vpc_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/01884a11-85ef-c504-68a6-833035110163.png)

続いてサブネットの構成を行います。

VPC IDは先程作成したVPCを選択して下さい。

![サブネット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/e3934058-249b-7bfa-a223-b9681afd0d45.png)

プライベートサブネットとして下記のように構成を行います。

![サブネット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/032a8d44-d045-1430-4cef-b514d52113e2.png)



<h1>【EC2を起動】</h1>

インスタンスタイプは「t2.micro」を選択。
![ec2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/d72b87ea-7190-d3a5-3a41-b5f7ef328e50.png)

VPCとサブネットは上記で作成したものを選択します。
パブリックIPは自動割り当てを選択します。
セキュリティグループは既存のもので「default」を選択して下さい。
※後でインバウンドルールを変更します。


![ec2_2ver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/e422022e-76de-db6e-de50-886853a8f2a8.png)

<h1>【セキュリティグループの設定を変更】</h1>
EC2(aws_test)からセキュリティタグを選択。

![セキュリティグループ_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/bbc9dcfe-a351-2d70-48b4-cebb6786b7df.png)

各タイプのインターネット接続が出来るように設定します。
「カスタムTCP」を選択する事で開きたいポートの範囲を設定する事も可能です。


![セキュリティグループ_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/ec78a624-aed1-346b-429c-745b9ab424a2.png)

<h1>【インターネットゲートウェイ/ルートテーブルの設定】</h1>
インターネットゲートウェイはVPCからインターネットへ接続する為の門としての役割を果たします。
VPCのダッシュボードから作成が可能です。
作成後は「アクション」からVPC(aws_test)へattachを行います。

続いてルートテーブルの設定を行います。

メインルートテーブルをクリックします。

![ルート_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/0d131950-8d6f-d4e2-eb54-50700fc9f116.png)

ルート編集から作成した「インターネットゲートウェイ」を選択します。
送信先は画像の通りです。

![ルート_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665680/580da2b9-ce55-bb76-b226-a0d24e1356ad.png)



<h1>【EC2】へ接続</h1>
teratermを使用してEC2インスタンスのパブリックIPアドレスを入力します。
その後にユーザ名と秘密キーを選択してCUIが開けばアクセス完了です。

part2に続きます。
[Rails7]JavaScriptでTurboを無効化する方法


# リロードしないとJavaScriptが動かない

Rails7のTurboが原因。
JSファイルで`turbo:load`イベントを使用する。

```javascript:test.js
document.addEventListener('turbo:load', function() {
  console.log('turbo無効化');
});
```

`turbolinks`ではなく`turbo`なので気をつけてください。

参考

https://blog.willnet.in/entry/2021/02/14/154101
データベースが吹き飛ばされた件

# あっやｂ
先日、にらBOTのメインサーバーである「RaspberryPi」に、かねてから気になっていた`MongoDB`というものを入れようとしました。
この`MongoDB`というのは、いわゆるNoSQLのデータベースで、使いやすいらしいです。（小並感）
そして、考えるのが嫌だった私はとりあえず`apt`で入れることにしました。

```sh
$ sudo apt update
$ sudo apt install mongo
```

...うーん遅い。
これはけつあな確ｔ((
というわけで、Windows TerminalのSSHとにらめっこする私。
数分が立って、「流石にちょっとやめよう」と思って`Ctrl+C`を押した所、なぜかRaspberryPiのaptではなく、WindowsのSSHのプロセスが終了しました。
驚く私。再度接続してみると、何事もなかったかのようにつながるRaspberryPi。
Discordを見ると、オフラインになっているにらBOT。

## 私のパソコンに何が起きたのですか？
にらBOTや、いろんなサーバーを動かしているRaspberryPiは、`watchdog`による`heartbeat`監視を行っていました。
これは、RaspberryPiがフリーズして動かなくなった際に、本来ならシステムから送られるはずの`heartbeat`が止まったことをハードウェアWatchdogが検知して、強制的にシステムを再起動させるというものです。
これは、システムにてカーネルパニックやフリーズが発生した際に、勝手に再起動してくれてﾍﾞﾝﾘ-というものなんです。
しかし、今回はこれが裏目に出て、タイミング的に最悪なときに勝手に再起動してくれたっていうわけで...

## さーて復旧作業するかー
まず、BOTを起動させようとした所、データベースへの接続エラーがでたので、データベースを起動させようとしました。

...

```sh
Traceback (most recent call last):
  File "<データベースのディレクトリ>/main.py", line 44, in <module>
    DATAS = joblib.load(SETTING["location"])
  File "/usr/local/lib/python3.10/site-packages/joblib/numpy_pickle.py", line 587, in load
    obj = _unpickle(fobj, filename, mmap_mode)
  File "/usr/local/lib/python3.10/site-packages/joblib/numpy_pickle.py", line 506, in _unpickle
    obj = unpickler.load()
  File "/usr/local/lib/python3.10/pickle.py", line 1213, in load
    dispatch[key[0]](self)
KeyError: 0
```

ん？？？？？

このエラーについて色々調べましたが、PythonやJoblibのバージョン違いなど、色々な情報が出ましたが、どれも当てはまらず...

そこで友人の一言
`「パッケージが壊れた（インストール時に一部が依存関係の問題で消された）とか、単純にデータ破損のような気がしてならないのだが…」`
そして私の返し
`「データ破損だとするとちょっと辛いかもしれない」`

続々とフラグがたてられました。

恐る恐る[Stirling](https://www.vector.co.jp/soft/win95/util/se079072.html)でデータのファイルを見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/72787f71-01f5-9e5f-935b-39f62204c777.png)

__ﾊｲﾃﾞｰﾀｾﾞﾝﾌﾞﾌｯﾄﾝﾃﾞﾏｽ!!!!!!!!__

そういうわけで、Watchdogにより、中身が全部`00`の172306バイトにも及ぶ空ファイルが出来上がりましたとさ...

# 対策を取ろう
さて、今回は何がいけなかったのでしょうか。

まず1つに、むやみやたらにソフトを入れることですね。
まぁ、過ぎてしまったことは仕方ないです。

そして、今回バックアップを全然取っていませんでした。
前回のメジャーアップデートである「8/15」のデータが最新のバックアップでした。
実に1ヶ月分のデータが消滅したというわけです。
なので、**こまめにバックアップを取る**ということはすごく大事だと思い知らされました。

また、今回の一件を受けて、実機でのデータベース運用も見直すことになりました。
今後はVPS等のクラウドデータベースを使用する予定になりました。
クラウドを使うっていうのも一つの手です。

あとは...そうですね...
無理にデータベース構造を自作なんかしないで、最初っから有名所のデータベース機構を使ってればよかったんですよ！！！
というわけで、そんな奇行な記事はこちらです。

https://qiita.com/nattyan_tv/items/4435be1e96e397944854

バックアップは大事です。余裕のある方は毎分でもとりましょう。
以上です。

---

データの書き戻しに付きまして、この場をお借りして謝罪させていただきます。
大変申し訳ございませんでした。
いくら「そんな重要なデータなんかないだろ( ᐙ )」とかいっても、データはデータですので...
【Amazon Lightsail】LAMP環境構築チュートリアル③（アプリケーション編）

# 構築作業

[前回の②](https://qiita.com/LingmuSajun/items/73dc0069db3199ab66ff)では、DBの構築まで完了しました。ここからはアプリケーションをデプロイしていきたいと思います。

## 1. Git Clone

- [Amazon Lightsailのホーム画面](https://lightsail.aws.amazon.com/ls/webapp/home/instances)にアクセスし、「LAMP_TEST」インスタンスにSSH接続します。

![スクリーンショット 2022-09-11 20.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304307/6d600bca-9d93-f5f8-db3b-9f4da4c6406b.png)

- SSHクライアントのWindow上で下記コマンドを実行します。

```
$ cd /opt/bitnami/apache2/htdocs
$ git clone https://github.com/LingmuSajun/lamp_test.git
```

## 2. phpdotenvインストール

- SSHクライアントのWindow上で下記コマンドを実行します。

```
$ cd /opt/bitnami/apache2/htdocs/lamp_test
$ composer require vlucas/phpdotenv
```

## 3. .env作成・編集

- SSHクライアントのWindow上で下記コマンドを実行します。

```
$ cd /opt/bitnami/apache2/htdocs/lamp_test
$ vi .env
```

- 下記の通り.envを編集します。

```
DB_HOST = 'mysql:dbname=lamp_test;host=localhost;charset=utf8'
DB_USER_NAME = 'ユーザー名'
DB_PASSWORD = 'パスワード'
```

## Webサイト表示確認

- [Amazon Lightsailのホーム画面](https://lightsail.aws.amazon.com/ls/webapp/home/instances)に戻り、「LAMP_TEST」インスタンスのIPアドレスを確認し、コピーます。

![スクリーンショット 2022-07-31 19.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304307/6c288c63-5e4c-1c63-9878-0610dfd90ed8.png)

- ブラウザからコピーしたIPアドレスにアクセスし、下記のページが開くことを確認します。

```
http://コピーしたIPアドレス/lamp_test/Countries.html
```

![スクリーンショット 2022-09-25 19.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304307/91a92ce2-1aec-0ef4-b521-2431dd47866e.png)
二進数について

二進法を１〜31まで記入してみた。


２進数
 0 = 0
 1 = 1
 2 = 10
 3 = 11
 4 = 100
 5 = 101
 6 = 110
 7 = 111
 8 = 1000
 9 = 1001
10 = 1010
11 = 1011
12 = 1100 
13 = 1101
14 = 1110
15 = 1111
16 = 10000
17 = 10001
18 = 10010
19 = 10011
20 = 10100
21 = 10101
22 = 10110
23 = 10111
24 = 11000
25 = 11001
26 = 11010 
27 = 11011
28 = 11100
29 = 11101
30 = 11110
31 = 11111
ASP.NET Core MVCアプリで便利なNuGetパッケージ

データベースを操作するのに便利なEntity Framework Coreのパッケージをインストールするコマンドです。

ASP.NET初心者の忘備録です

`Microsoft.EntityFrameworkCore.SQLite`
`Microsoft.VisualStudio.Web.CodeGeneration.Design`
`Microsoft.EntityFrameworkCore.SqlServer`
`Microsoft.EntityFrameworkCore.Design`

また、codegeneratorをインストールしていない場合は下のコマンドでインストールできます。
`dotnet tool install --global dotnet-aspnet-codegenerator`

公式のドキュメントを参考にしました。
https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/first-mvc-app/adding-model?view=aspnetcore-5.0&tabs=visual-studio-mac
ニフクラ mobile backendを拡張するNCMBプロキシを開発中です（データストア、認証周り）

ニフクラ mobile backendでは認証やデータストア（クラウドデータベース）、ファイルストア（ファイルストレージ）、プッシュ通知など様々な機能があります。そして、サーバーレスで拡張できるスクリプト機能もあります。

しかし、実際のアプリ要件は多彩で、場合によっては他にも様々な機能が望まれます。すべての需要を満たすのは困難な場合もあります。そこで、NCMBのフロントとして動作するプロキシソフトウェアを開発中です。

このプロキシを使うことによって、小さなニーズはプロキシ側で実装できるようになります。認証やデータストア周りの実装はできたので、その使い方を解説します（まだ絶賛開発中です）。

## 現状について

現状はデータストア、認証、プッシュ通知、デバイストークン登録、ロールなどのCRUD操作について、プロキシを経由できます。後はファイルストアとスクリプトをサポートすれば、プロキシとして十分に動作するでしょう。

## 追加する機能（予定）

現状は透過的なプロキシでしかありませんが、以下のような機能を実装する予定です。

- 認証をJSON Web Tokenに
- GitHub認証
- ソーシャル認証（標準ではサーバー認証が必要ですが、プロキシだけで認証できるように）
- WebSocket（リアルタイム通信）
- Webhooks
- 署名なしでデータストア操作
- 署名なしで実行できるスクリプト
- 全リクエストログ記録

他にもデータストアの集計機能、GraphQL機能なども追加できると便利そうです。なお、Webhooksなどの機能はプロキシ経由でしか実現できませんので注意してください（管理画面で操作しても実行されません）。

## インストール

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)のリポジトリをクローンします。

```
git clone git@github.com:NCMBMania/ncmb-proxy.git
```

ライブラリをインストールします。

```
npm i
```

## 設定の編集

`setting.example.yml` をコピーして `setting.yml` を作成します。そして、ファイル内にあるアプリケーションキー、クライアントキーをそれぞれお持ちのものに書き換えてください。

```yaml
applicationKey: YOUR_APPLICATION_KEY
clientKey: YOUR_CLIENT_KEY
```

## サーバーを起動

サーバーを起動する際には、以下のコマンドを実行します（まだ開発中なので、開発用サーバーが立ち上がります）。

```
npm run dev
```

例えばローカルの場合、 `http://localhost:3000` にてサーバーが立ち上がります。

## 使い方

今回はJavaScript SDKでの使い方です。実際に利用するアプリケーション側でJavaScript SDKを初期化する際に、以下のように指定します。

```js
const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "localhost",
	protocol: "http",
	port: 3000
});
```

この `fqdn` や `protocol` 、 `port` を実際に運用するサーバーのものに書き換えて利用できます。本番運用できるレベルになったら、 `protocol` や `port` は不要でしょう。恐らく以下のようになるはずです。

```js
const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "example.com",
});
```

これでJavaScript SDKは直接ニフクラ mobile backendにはリクエストせず、 `example.com` へリクエストするようになります。

## まとめ

ニフクラ mobile backendは便利なmBaaSですが、機能が足りなくて別サービスと組み合わせて使うこともあるでしょう。そうした場合に2つのサービスをクライアントから呼び出すのではなく、プロキシを使うことで1つのサービスであるかのように利用できます。

開発はまだまだこれからですが、ぜひご期待ください。

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)
STM32G071で有機エレクトロルミネッセンス時計。(DS1307)(Adafruit SSD1306,Adafruit GFX)



x ライブラリのインストール方法は、めんどいので省略
x サイズは、約34KB

x 時間合わせは、別
x STM32G071は、ST様で貰ったNUCLEO-G071RBの事

x 非営利、研究調査目的で引用する。

目的
OLEDのテスト
アイテンドウの0.96 128x64(OLED) OLED096UNO-A
秋月のDS1307ZN+T&R I-06950


![o_con801.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/38d0448f-1441-ca84-e777-48900a8527ce.jpeg)


![o_con625.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/034158e3-8af5-d0ff-b0ef-e7f491387b76.jpeg)



参考


https://qiita.com/jakalada/items/793a6cf5ff2796db4e86



```c++



#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif

// RSTピンがない互換品を使用するので-1を指定
//Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
}


// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000

char data_read[16];


void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);


  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (int ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }
  delay(1);




  //表示変換する
  char str1[16];
  str1[0] = '0' + (data_read[2] >> 4);
  str1[1] = '0' + (data_read[2] & 0xf);
  str1[2] = ':';
  str1[3] = '0' + (data_read[1] >> 4);
  str1[4] = '0' + (data_read[1] & 0xf);
  str1[5] =  0;




  // 1行目に"Hello"を表示
  display.println(str1);
  // 2行目に"World!"を表示
  //display.println("World!");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}



```
Lottie-Androidを使用する方法

今回はLottie-Androidを使用してアニメーションの実装する方法です。

綺麗なアニメーションを簡単に実装することができます。

ただし、アニメーションファイルは別途必要です。


# Lottie for Androidの導入


[Lottie for Android](https://github.com/airbnb/lottie-android)
を導入します。

``` build.gradle
dependencies {
    implementation "com.airbnb.android:lottie:${latest.version}"
}
```

# アニメーションファイル

res.rawフォルダにアニメーションファイルを追加する。
今回はlottie_animationと命名。

# LottieAnimationView

```lottie_animation_view.xml
 <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/animation_view"
        android:layout_width="26dp"
        android:layout_height="26dp"
        app:lottie_rawRes="@raw/lottie_animation" />
```

※　表示後すぐにアニメーションさせたい場合
```
app:lottie_autoPlay="true"
```
※アニメーションをループさせたい場合
```
app:lottie_loop="true"
```
基本的にあまりこのような使い方をする場合は少ないのかもしれません。


自分が実際に使用したいタイミングはタップした後でした。
なので、任意のタイミングでアニメーションさせたい場合があると思います。

```AnimationView.kt
binding.animationView.playAnimation()
```

`playAnimation()`を呼ぶとアニメーションが実行されます。なのでクリック時など任意のタイミングでこちらを呼ぶと良いでしょう！


AnimatorListenerにも対応してます。

```AnimationView.kt
 binding.animationView.addAnimatorListener(object : Animator.AnimatorListener {
     override fun onAnimationStart(animator: Animator) {
        //アニメーションの開始を通知します。
     }

     override fun onAnimationEnd(animator: Animator) {
        //アニメーションの終了を通知します。
     }

     override fun onAnimationCancel(animator: Animator) {
        //アニメーションのキャンセルを通知します。
    }
     
    override fun onAnimationRepeat(animator: Animator) {
        //アニメーションの繰り返しを通知します。
    }
})
```
アニメーションの開始やアニメーションの終了タイミングがわかるのはいいですね！

以上です！