OmniAICreator/Qiita-1.07M huggingface dataset:
ポート番号/NAT/NAPTの学習メモなど

自分用のメモです。

■HTTP（GET・POST）について

・GETメソッドとは、サーバにあるリソースを取りに行くメソッド
リソースとはhtml/img/jsなどを指す。

・POSTメソッドとは、何かを作ったり追加したりするメソッド
英語で言うとmake,add,sendが近い感覚。

・HTTPとはプロトコル（通信のルール）の一種。
プロトコルは説明書のイメージ


■リクエストメッセージ

・プロトコル・ホスト名・ポート番号がセットで書かれたものをoriginと表現する
originという概念は今後の学習で大切
例：http://yahoo.co.jp:7676
same origin policy

・ブラウザとはWebページを見るために使うアプリケーション

・Refererとはひとつ前にいたページ


■レスポンスメッセージ

・レスポンスステータスコードとは「404 not found」など

・Content-typeとは送られてきたファイルの形式


■GETメソッド・POSTメソッドのまとめ

・GETメソッドはサーバからさまざまなリソースを取ってくるメソッド

・POSTメソッドはサーバへ情報を追加するメソッド

・他にもメソッドにはPUT、DELETEなども存在する


■CPUとは

・パソコンの三大原則
①メモリ：机の広さ
②CPU：頭の良さ
③ストレージ：引き出しの多さ

・CPUは小さければ小さいほどいい。大きいと不良品の部分が増えてしまう。
→CPUの中身にはトランジスタと呼ばれるパーツが入っている
トランジスタ一個一個は非常に小さいから、不良品が生じやすい
CPUにたくさんのトランジスタがあればあるほど、不良品が生じる確率が上がってしまう

・バブルソートとは隣同士の値を比較して並び替えるアルゴリズム

・アルゴリズムとは計算の手順
合計する、平均値を算出するなどは全てアルゴリズム
バブルソートは数字を並び替えるアルゴリズム

■OSI参照モデル

・ネットワークの世界を7つの階層に分解したのがOSI参照モデル

・物理層はUSBの挿入口、コンセントなど

・インターフェースとは「境界面・接触点」の意味
物理層は機器のインターフェース

・データリンク層はMACアドレス同士の通信を規定する
MACアドレスとは「機器に割り当てられた住所」のイメージ
機器のNIC（Network Interface Card）に割り当てられている

・NICとはLANケーブルが挿さる部分
MACアドレス同士を通信するためにはケーブルで機器を繋ぐ必要がある
データリンク層は隣接したコンピュータをあたかも専用の電線で接続されているかのように見せかける技術

・ネットワーク層はIPアドレス同士の通信を規定する


■パケットとは

・フレームとパケットの違い

・フレームはデータリンク層の話。パケットはネットワーク層の話

・ひとつのパケットをさらに囲うのがフレーム


■ポート番号

・ポート番号とはTCP/IP通信においてコンピュータが通信に使用するプログラムを識別するための番号
相手のサーバのどのプログラムに対して通信を送るかを特定する

・IPアドレスにより送り先を「ある程度」は特定可能。でもどのプログラムに届けるかはIPアドレスだけでは決定できない
例：IPアドレスによりマンションまでは特定可能、でも何号室かまではIPアドレスだけではわからない

・http:サーバの80番ポートに届く
・https:サーバの443番ポートに届く
・ssh:サーバの22番ポートに届く
例：「https://〇〇.org:80/」と本来ならばポート番号が80と指定されているけど通常は省略

・どのプログラムか特定できないと通信できない、だからポート番号が必要

・もしポート番号が存在しなかった場合、、、
クライアント：Google検索をしたい
サーバ：メールサーバ、ウェブサーバの2つの役割を果たしている
→どちらのプログラムに通信を送ればいいかわからない

・ポート番号の種類
0〜1023（Well known）：IANAで管理している有名なサーバのポート番号
1024〜49151（Registered）：IANAに登録されたサーバのポート番号

・常に動いているプログラムを「常駐プログラム」という。「daemon」と表現。


■ここまでの整理

・MACアドレス
　・OSI参照モデルの第2層
・IPアドレス
　・OSI参照モデル第3層
　・相手の住所
・ポート番号
　・IPアドレス
　・OSI参照モデルの第3層の話
　・コンピュータの中で動いているプログラムの番号


■NAT/NAPTとは？

・NATとはNetwork Address Translationの略

・NAPTとはNetwork Address Port Translationの略

・グローバルIPアドレスはインターネットに接続できるアドレス

・プライベートIPアドレスはインターネットに接続できないアドレス

・グローバルIPアドレスとプライベートIPアドレスを紐づけて変換するのがNAT

・私たちが普段使っているPCはプライベートIPアドレスしか持っていない
NATを使ってグローバルIPアドレスに変換することでインターネットと接続している

・NAPTはポート番号を利用することで1つのグローバルIPアドレスと複数のプライベートIPアドレスを紐づけられる
【EC2の再起動時にスクリプトを毎回実行するにはMIME-MULTIPART形式でかけばいい。】

今回はEC2を毎回起動するたびに実行しなければいけないコマンドを自動で実行してくれるようにしていきます。
やり方としては、「AmazonLinuxのUserDataにシェルスクリプトかcloud-configで書き込んでいく」らしいです。そもそもUserDataとは、「**Linux インスタンスの起動時に実行するコマンド」を指定できる項目のこと**」です。（以下参照）

https://techracho.bpsinc.jp/kotetsu75/2018_08_15/60857#:~:text=EC2%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF,%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%84%E3%83%8D%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%99%E3%81%AD%EF%BC%89%E3%80%82

ユーザーデータはマネジメントコンソールから編集できます。（なぜか調べてもcli経由の記事ばかりだったけど）
停止中のインスタンスを選択 → アクション → インスタンスの設定 → ユーザーデータを編集
以下のような画面になる。「ユーザーデータをここに配置」のところにbashスクリプトを書いていけば、初回起動時のみ実行されるスクリプトになる。

![975F530F-F18E-43DA-B385-1DF441FECAEA_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530710/3cbcc77e-2fa3-0901-69bc-6b1f84573036.jpeg)

ここにMIME-MULTIPART形式で書いていけば再起動するたびに実行されるスクリプトになる。

**MIME-MULTIPART形式とは？**
MIME TYPEのひとつで、application/gzipやtext/html、image/jpegなどのような、タイプ/サブタイプで決められた文書やファイルの形式の型を決めるやつらの仲間ということらしい。
multipart/form-data ← このように表す。
（multipart/form-dataは二重ダッシュ `-` で始まる文字列によって区切られる）

https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data

以下のtextをユーザーデータ項目に貼り付ければ、再起動ごとに
`/bin/echo "Hello World" >> /tmp/testfile.txt`が実行されるスクリプトになる。

```bash
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--
```
（以下参照）

https://dev.classmethod.jp/articles/execute-ec2-cloud-init-user-data-for-every-start/
@material-ui v4で material-ui-chip-inputがインストールできない問題


##material-ui-chip-inputをインストールできない

material-ui v4で material-ui-chip-inputがインストールしようとするとエラーが...

```
could not resolve dependencypeer @material-ui/core@"^1.0.0 || ^3.1.0" from material-ui-chip-input@1.1
```

自分の開発環境は以下のとおりです。

```
@material-ui/core": "^4.12.3"
"react": "^17.0.2",

node -v
v16.13.0

npm -v
8.1.0

```

色々調べてみると
同じエラーが出ている人も何人かいるようですね。

https://github.com/TeamWertarbyte/material-ui-chip-input/issues/351

##解決策
解決策は現状２つ?

* ① 上記のURLリンクの記事にもあるように --forceをつけてインストール

```
npm i --save material-ui-chip-input@next --force
```

* ② material-uiのバージョンを5にあげて?

```
npm i material-ui-chip-input
```

2つ目の方法はやっていないので本当に解決できるかわかりません...

自分は1つ目の方法でやってみてなんとか動きました。


```
"material-ui-chip-input": "^2.0.0-beta.2",
```
C#でint型データのx桁目のbitの状態を取得する

```C#
	/// <summary>
	/// int型データの指定ビット目が1か0か判定
	/// </summary>
	/// <param name="data">元データ</param>
	/// <param name="digit">判定するビット桁</parma>
	/// <returns>指定データの指定ビットが1の場合はTRUE、0の場合はFALSEを返す</returns>
	bool IsOn(int data, int digit){
		// チェックしたいビットを1桁目に右シフトする
		// (例) 1101 の3桁目をチェックしたい場合、2ビット右シフト 1101 → 0011
		int x = data >> (digit - 1);

		// 1とのAND演算をして1ビット目だけを 1 or 0 の状態にする
		// (例) 0011 & 0001 -> 0001
		int y = x & 1;

		// 結果が1か0かを判定
		bool isOn = y == 1;

		return isOn;
	}
```

引数のバリデーションなど細かい部分は割愛
開発環境一覧(2022年版)

いろいろ手広く開発環境を使っているので、現状を書いて見ました。

8080 => asm8080(MacOS X,FreeBSD)
PC-8001,z80 -> zmac + ld80(MacOS X,FreeBSD,Windows 7)
各種マイコン => PlatformIO Core3,4,5(MacOS X,FreeBSD:Linuxulator)
rtlbm-mruby => RealtekSDK(FreeBSD:Linuxulator)
bcmbm,admbm-mruby => FreeBSD-gcc4-mips
ksbm-mruby => FreeBSD-gcc4-arm
FreeDOS,PC-9801 => Open-Watcom V2(FreeBSD:Linuxulator)
FreeBSD/i386 => FreeBSD/amd64+BastilleBSD
FreeBSD/mips => ZRouter.org + FreeBSD/amd64
PIC18 => MPLAB X(Windows 7)
PIC32MX => Penguino,PlatformIO(MacOS X)
MAX(CPDL) => Quatus II(Windows 7)
GAL => EQN2JED(FreeDOS)
Windows => Visiual Studio(Windows 7)

作ったものはほとんどgithubに上げてあります。Windows 7はgitが不自由なのであまり使いたくありません。

昔は開発環境ってばか高いものが多かったのですが、すべて無料で手に入るよい時代になったものです。

無料でもispLEVERのようにいきなり有料にされて使えなくなるような、痛い思いをする事があるので、ライセンス発行が必要なものは使わないようにしてます。
【SQL】文字列結合の方法

SQLでの文字列結合に関する備忘録になります。
各DBMSごとに使用できる関数が異なりますが、今回はOracle向けの内容をまとめていきます。

#1. Oracleでの文字列結合
　Oracleで文字列を連結したい場合、「||」演算子を使うか「CONCAT」関数を使います。ただ「CONCAT」関数の場合、３つ以上の文字列を連結した書き方が少しややこしいので、個人的には「||」演算子を使うことをおすすめします。

##①「||」演算子の使い方

```
SQL> SELECT 'Hello' || 'World' as 文字列連結 FROM dual;
```
SQLの実行結果は下記になります。

```
文字列連結
--------------------
HelloWorld
```

また、「||」演算子では3つ以上の文字列を連結することが可能です。
やり方は２つの文字列を連結する場合と変わりません。

```
SQL> SELECT 'Hello' || 'World' || '!!' as 文字列連結 FROM dual;
```

SQLの実行結果は下記になります。

```
文字列連結
--------------------------
HelloWorld!!!
```



##② CONCAT関数の使い方
　以下が「CONCAT」関数の基本的な構文になります。
CONCAT(string1,string2)

```
SQL> SELECT CONCAT('Hello', 'World') as 文字列連結 FROM dual;
```
SQLの実行結果は下記になります。

```
文字列連結
--------------------
HelloWorld
```
Oracleの「CONCAT」関数は、引数を２つしか指定することが出来ません。そのため、「CONCAT」関数で３つ以上の文字列を結合するには、以下のようにネストする必要があります。

```
SQL> SELECT CONCAT('Hello', CONCAT('World', '!!')) as 文字列連結 FROM dual;
```
SQLの実行結果は下記になります。

```
文字列連結
--------------------------
HelloWorld!!
```
ただし、上記で記載してある通り、Oracleには「||」演算子があるので、２つ以上の値の結合はこちらのほうが使い勝手がよく、コードも見やすくなります。

OracleのCONCAT関数でNULLを連結する場合、NULLは空文字列となって文字列が連結されます。

```
SQL> SELECT CONCAT('Hello', 'Null') as 文字列連結 FROM dual;
```
SQLの実行結果は下記になります。

```
文字列連結
--------------------------
Hello
```

#まとめ
Oracleで文字列を結合するにはCONCAT関数や「||」演算子を使用します。
CONCAT関数は指定できる引数の数やNULLの扱いなど、DBMSによって仕様が異なります。
AWSの公式動画がおすすめ(ハンズオン・Black Belt Online Seminar)

## 概要

全然知らなかったのですが、AWSって公式動画が充実してるんですね。
個人的には感動するレベルで有用だったのですが、動画の再生回数を見るとそこまで多くない印象(3000~1.5万くらい)だったので、周知のため記事にしてみました。

[AWS クラウドサービス活用資料集トップ](https://aws.amazon.com/jp/aws-jp-introduction/)
[AWS 初心者向けハンズオン](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)
[AWS サービス別資料(AWS Black Belt Online Seminarなど)](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

## AWS 初心者向けハンズオン

>AWS 初心者向けに「AWS Hands-on for Beginners」と題し、初めて AWS を利用する方や、初めて対象のサービスを触る方向けに、操作手順の解説動画を見ながら自分のペースで進められるハンズオンをテーマごとにご用意しています。

![スクリーンショット 2022-01-26 20.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/20c6bf50-1a57-e77b-bf5e-f4d5a226602a.png)

ハンズオン形式でAWSコンソールを触りながら、テーマで設定されたアーキテクチャを作っていきます。
「Network編#1 AWS上にセキュアなプライベートネットワーク空間を作成する」「スケーラブルウェブサイト構築編」などは、業務未経験の方がポートフォリオを作成する際などに良さそうです。

私が未経験からエンジニアになった際も、「VPCってなんで使うんですか？」と採用面接時に質問されて、「（ネットワーク空間を区切ることで）セキュリティを確保するためです...」と内心合ってるのか怖々答えたりしました笑

こちらのハンズオンだと、手を動かしながら周辺情報も含めて説明があるので、視聴していたらもっと自信を持って答えられた気がしますw

「サーバーレスアーキテクチャで翻訳 Web API を構築する」も個人的にすごいよかったです。
(Lambdaの実行環境ってコンテナだったんですね。知リませんでした。。。)


## AWS Black Belt Online Seminar

>AWS Black Belt Online Seminar シリーズは、製品・サービス別、ソリューション別、業種別のそれぞれのテーマに分かれて、アマゾン ウェブ サービス ジャパン株式会社が主催するオンラインセミナーシリーズです。
全国どこからでも、インターネット環境があればご参加いただけます。ご質問いただくこともできますので、会場まで足を運ぶのが難しい方もお気軽にご参加ください。
その他、過去に開催されたオンラインセミナーのプレゼンテーションを網羅した「AWS クラウドサービス活用資料集」をご用意しております。
https://pages.awscloud.com/JAPAN-event-OE-blackbelt-202012-reg-event-LP.html

![スクリーンショット 2022-01-27 19.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/4cb60935-d09c-d1e8-c229-ab7999732b33.png)


[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)に記載の動画がほとんどAWS Black Belt Online Seminarみたいですね。

今もオンラインセミナーとして継続して開催されているようですが、過去に実施された動画がYoutubeにアップロードされていて、そちらを閲覧することができます。

動画ではサービスの概要や特徴・ユースケースなどについて説明されているので、**まだ使ったことのないサービスや、使ったことはあるけど今一度サービスに関して包括的に把握したい**といった場合に有用です。

EC2・RDS・ECS・Lambdaなど一通り視聴しましたが、中でもSQSに関する動画の中で、コンポーネント間の繋がりを疎結合にし、システムとして柔軟性を高めるために、「つなぐ」コンポーネントを入れる話が大変わかりやすくて良かったです。

![スクリーンショット 2022-01-27 20.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555201/5504c8ed-b147-afd7-857a-35b556dacfe3.png)
[20190717 AWS Black Belt Online Seminar Amazon Simple Queue Service](https://www.youtube.com/watch?v=avfc0gQ7X0A)

経験豊富な方でも、後輩にリファレンス資料として紹介してあげる際などに役立つかもしれません。

おすすめです！
package.jsonのライセンスの書き方

# ライセンス
package.jsonのライセンスのデフォルト値のISCは、BSDライセンスの派生になります。
非コピーレフトのライセンスから選ぶのが良いかなと思います。

|ライセンス|ライセンスの表示・複製・再配布・改変|改変部分のソースコードの公開|他のソースコードと組み合わせた場合、他コードの開示|主なライセンス|
|---|---|---|---|---|
|コピーレフト|○|○|○|GNU GPL V2|
|準コピーレフト|○|○|×|MPL|
|非コピーレフト|○|×|×|BSD Licence, MIT Licence, Apache Licence|
Github push出来ない!!

#はじめに
完全未経験からswiftを初め1ヶ月、早速Git関連で躓いたので、自分への戒めを込めて記事にしました。

#1.git pushが出来ない!!
初めてのアプリ(模倣)を製作し、いざgithubのリポジトリにpushし、出来た！
と思ったのも束の間、エラーが出てしまい、どうやらエラーコードの文面と睨めっこしていると、ファイルサイズ100MB以上だとgit push出来ないとのこと。

じゃあどうするの!?

と悩みまくっていたら、gitignoreという存在があることを教えて頂きました。

#2.gitignoreとは

gitignoreを簡単に説明すると、Gitの管理下に含めたくないファイルを入れる箱、という認識でいます。
gitignoreディレクトリに指定のファイルを入れる事で、そもそも100MB以上のファイルをgitpushしない→エラーにならない!!

という事です。

じゃあgitignoreに100MB以上のファイルを入れて、早速gitpushすれば一件落着だ!!

・・・という訳では無く、手順を踏まなければgitpushに至らなかったので、順番に処理を行っていきましょう！!

#3.git pushするまでの道のり

###・gitignoreファイルの作成
 まずはターミナルを開き、


```
cd "指定のファイル"
```
へ行き、

```
touch .gitignore
```
で.gitignoreファイルを作成して下さい。
ちなみに、.ignoreは隠しファイルになります。
Findar上で表示させたい場合、Shift + ⌘ + . でファイルを表示させることができます。

そして、.gitignoreディレクトリの中に、100MB以上のファイルを入れます。

僕の場合は、Podsファイルが100MB以上のファイルでしたので、.gitignoreファイルに

```
Pods/
```
と入れました。
これはPodsディレクトリ以下のファイルを全て除外する。という意味になります。

###・100MB位以上のファイルをcommitする前のcommitに巻き戻す!!

次に、100MB以上のファイルをgit pushした以前のcommitに巻き戻します。

そうしないと100MB以上のファイルをpushした状態のcommit分までpushしようとしてしまうからです。

```
git log
```
でcommit番号を調べてから

```
git reset --soft "100MB以上のファイルをgit pushした以前のcommit番号"
```
を実行し、commitを戻しましょう!!

ここからはケースバイケースみたいなのですが、

```
git rm -r --cashed .
```
でキャッシュを削除しないとpush出来ない場合もあるようです。(なぜなのかはまだ理解しておらず)

###・git pushを実行!!

```
git push origin "既存のブランチ名"
```

で無事ファイルをpushできれば成功です。


#4.おわりに

同じようなエラーが出てしまった方は参考になればありがたいです。
これからもpushしまくっていきます!!
吉祥寺.pm28 をながら視聴したので、その感想

https://kichijojipm.connpass.com/event/236031/

> 久しぶりの開催なので、テーマは「リブート」
> 皆さんなりのリブートを教えてください

https://twitter.com/kichijojipm

https://kichijojipm.connpass.com/

> 色々なテックトークが聞ける「吉祥寺.pm」というイベントをやっています。
> イベントアカウントをフォローしておくと、随時イベント情報をお知らせいたします。

過去: [初参加　リモートだけど　吉祥寺（吉祥寺.pm26に参加）　#kichijojipm | マドびっ！ Madosan's View](https://madowindahead.info/2021/04/kichijojipm26/)

ということでいろんな話題がでてくるトークとLightningtalk式の勉強会です（初めて）。表題の通り「ながら視聴」、ほぼラジオで聴いてしまったのですが、ゆるい雰囲気が伝わりたのしかったです。資料を回収しました。

## 本編

### ワーケーションに関する考察

https://twitter.com/__papix__/status/1486671051677659138?s=20

<script async class="speakerdeck-embed" data-id="5af46275579648e5a85c0d7f13ac5c4e" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

https://qiita.com/teckl/items/59366bdc0bb6f43b9e77

こんな記事も。


### レベル1エンジニア、最強コミッタに憧れOSSコミュニティ活動を始める

https://twitter.com/RhythmyDev

https://twitter.com/beajourneyman/status/1486672312661274625?s=20


### Podcast配信システムを自作したら捗った話

<script async class="speakerdeck-embed" data-id="488ceffbf41b426b877dfb8109068afc" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>


### 技術を的に当てる技術について

<script async class="speakerdeck-embed" data-id="bb51a4a198f748bb8ff191bb915ff3e7" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


### 堕落した人間をリブートさせる習慣づけ

<script async class="speakerdeck-embed" data-id="19b132378b8d40deaee34089b76b9f6d" data-ratio="1.77725118483412" src="//speakerdeck.com/assets/embed.js"></script>

論語～～

### コーポレートエンジニアとして自分のキャリアをリブートした話

<script async class="speakerdeck-embed" data-id="68bf126f83104e25ac8ddc38782d6dab" data-ratio="1.77725118483412" src="//speakerdeck.com/assets/embed.js"></script>


### cpanを理解せず使ってサーバーを破壊した話

https://twitter.com/teckl/status/1486687572369698824?s=20



### AWS を辞めて現場に戻った後で AWS 認定を取り直している話

https://twitter.com/iwamot/status/1486690902748065792?s=20

https://docs.google.com/presentation/d/1uZh4DklLXW7JQRzl3150aUMlvR0XiFPltlRSUAVInrw/edit#slide=id.g10fa012cf7c_0_110

[吉祥寺.pm28でLTした](http://iwamot.ldblog.jp/archives/2526979.html)


## まとめ

川柳: https://twitter.com/tomcha_/status/1486669126969937929?s=20
オンライン開催のいま、吉祥寺は概念。

https://twitter.com/teckl/status/1486665238837854209?s=20

とてもゆるやかな雰囲気で楽しかったです。開催ありがとうございました～
Ubuntu導入 備忘録 自分用

*Ubuntu*の初回導入時に行っていることを、書いていきます。環境は*Ubuntu22.04*です。OSのインストール完了後からの話です。

# 最初に

まず最初に、
```
LANG=C xdg-user-dirs-gtk-update
```

を行い**フォルダ名の英語化**を行いましょう。でないとコマンドでの操作にあたって非常に不便です。

また、最初に行わないと下層にファイルを置かれたフォルダは、これを打ち込んでも**英語化できなくなります。**。  

次に、**日本語化**について。

```
sudo gnome-language-selector
```

を行い、表示されたアプリの*システム全体に適用*をクリックして日本語と英語を全体に適用してください。

*Update*にかんしては、

```
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo snap refresh
```

を最初に行いましょう。少し時間がかかりますよ。

# 各種アプリの導入

次に、使用するアプリの導入を行います。
  
個人的には、  

```
sudo apt install tree clamtk whois vlc git
```
くらいはしておいたほうが、あとあと便利だと思います。 

*GUI*でパッケージをダウンロードしてインストールするのは、

[Visual Studio Code – コード エディター | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

[Google Chrome - Google の高速で安全なブラウザをダウンロード](https://www.google.co.jp/chrome/)

[Microsoft Edge Web ブラウザーをダウンロード | Microsoft](https://www.microsoft.com/ja-jp/edge)

[インストール - Dropbox](https://www.dropbox.com/ja/install)


くらいでしょうか。

余談ですが、*Edge*が正式に*Ubuntu*に対応してから、*MS Office*がクラウドで使用可能になりましたね。


# その他あれこれ

18.04まではデフォルトで`exfat`へ非対応でしたので、

```
sudo apt install exfat-utils
```
などとする必要がありましたが、*Ubuntu20.04*以後はその必要性はなくなりましたね。

以上です。
2022年からの新しいとりくみ

備忘録を兼ねて日々のプログラミング生活で行ったことの概要メモを作ることにしました。
すでに多少の公開メンタリティも身につけたので、特に始めることへの躊躇のカベはなかったです。

プログラミングをすることが日常になってしまっているのですが、たまに自分のコード体系に質的な大転換があったりして、それはそれで脳内革命というか机上革命という内的激動があったりするのですが、いかんせん人間とは忘れる生物であり、あの時の変化がいつあったのかを遡及できなくなったりします。

また、プログラムとしては、秒単位までは言わなくても日単位でいつの時点で思いついたものかという遡及がしたくなります。日単位により、自分のプログラミングの変化の履歴の時間感覚が身につき、意外と時間感覚がプログラミング・スキルにとって重要だったりします(あまり、経験という肉感的言葉は重視はするものの強調しすぎたくない気持ちがあります)。

どちらかというと人間が意味(Sinn)として理解できる質レベルでの記録が便宜にかなうと思ったので、日記形式となりえるQiitaを選択しました。日本在住であれば、このサイトが一番ではないかとも思いました。

毎日アップデートはしないですが、プログラミング生活での変化の記録を小さなものから大きなものまでメモしていこうと思います。
M1 MacにRuby on Rails 6のDocker環境を構築する

## 概要
M1 MacにRuby on Rails 6のDocker環境を構築する

## 手順

1. 必要なファイルの用意

Dockerfile

```Dockerfile
FROM ruby:3.0.2

RUN wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list
RUN set -x && apt-get update -y -qq && apt-get install -yq nodejs yarn

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
```

docker-compose.yml

```yml
version: '3'
services:
  app:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
  db:
    platform: linux/x86_64
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:
```

Gemfile

```Gemfile
source 'https://rubygems.org'
gem 'rails', '6.1.4'
```

entrypoint.sh

```sh
#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"
```

空のGemfile.lockを作成
```sh
touch Gemfile.lock
```

2. アプリ作成コマンド実行

```sh
docker-compose run app rails new . --force --database=mysql
```

3. DBファイルの修正
config/database.yml
(変更前)

```
~略~
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost
~略~
```

(変更後)

```
~略~
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
~略~
```

4. build

```
 docker-compose build
```

5. 起動

```
 docker-compose up -d
```

6. DB作成

```
docker-compose run app rails db:create
```

## 参考文献
~~https://zenn.dev/tmasuyama1114/articles/rails-docker-6x-how-to~~
→M1 macでは挙動怪しかった

https://norix.tokyo/environment/443/


https://halkyo.com/web/gpg-no-valid-openpgp-data-found/
【React】preventDefaultについて【JavaScript】

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

## preventDefaultについて

### preventDefaultとは
preventDefaultとは、イベントに対するデフォルトの動作を止めるメソッドです。
以下のように記述することで、フォームに入力しEnterが押下された際にページがリロードされないようにできます。


```input.jsx
import React from 'react';
import { v4 as uuid } from 'uuid';
import { createTodo } from '../../../lib/api/Todo';

export const TaskAddInput = ({
  inputText,
  setInputText,
  setTaskList,
  taskList
}) => {

  const handleSubmit = async (event) => {
    const taskId = uuid();
    // 画面の更新を制御
    event.preventDefault();
    if(inputText === ""){
      return;
    };
      // taskCardを追加する
      setTaskList([
        // 既存の配列
        ...taskList,
        {
          // 既存の配列にinputTextを追加
          draggableId: `task-${taskId}`,
          titile: inputText,
        }
      ]);
      // フォームを空にする
      setInputText("");
    // データ送信
    try {
      const res = await createTodo(taskList)
      console.log(res)
    } catch (error) {
      console.log(error)
    }
  }



  const handleChange = (event) => {
    setInputText(event.target.value);
  };

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input
          type="text"
          placeholder="タスクを追加"
          className='taskAddInput'
          onChange={handleChange}
          value={inputText}
        />
      </form>
    </div>
  );
}

```
ISBNで詳しい書籍情報を取得 （国立国会図書館API）

国立国会図書館APIを使用した詳しい情報を出す方法が探してもなかったので、公式が出している書籍管理Excelのマクロの中身を探して何とかAPIのリンクをゲットできたので備忘録として載せておく。

# 探してダメなら、、、

https://iss.ndl.go.jp/information/2020/03/16_exceltool/

探してたらこんなものを見つけた。
もしやと思ってマクロをのぞいたら、、、APIのリンクが使われている！ってなったので処理を追って組み合わせてみた。

```
https://iss.ndl.go.jp/api/sru
```

まずこれはアクセス先のリンクなので最初に置く。

```
operation=searchRetrieve
```

どうやらこれは必須なようなので入れる。

```
version=1.2
```

APIを利用するときに互換性を保つために指定。


```
recordSchema=dcndl
```

これが重要っぽい。
デフォルトだと、dcになっていてまともな情報が出ない。


```
onlyBib=true
```

書籍以外のIDとかの情報はいらないので返さないように指定。
ちなみにdcndlに指定してないと使えないっぽい

```
recordPacking=xml
```

データのパッキング方法指定。stringでも行けるけど、私はとりあえずxmlにした


```
query=isbn="XXXXXXXXXXXXX"
```

そしたらISBNを指定する。完全一致じゃないと出てこないようなので、安心。`XXXXXXXXXXXXX` の部分に任意のISBNを代入する。

```
dpid=iss-ndl-opac
```

ついでにqueryに追加
これをつけないと国立国会図書館オンライン以外のDBからもデータを取得するようなので指定して取得するデータを一つにする。queryのところのやつなのでANDをつけて付加する

#API
長々と書いたが、要するにこれをAPIとして使えばいい。 `XXXXXXXXXXXXX`は任意のISBN

```
https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&version=1.2&recordSchema=dcndl&onlyBib=true&recordPacking=xml&query=isbn="XXXXXXXXXXXXX" AND dpid=iss-ndl-opac
```

# C-Sharp
因みにC-Sharpで利用するとこうなる
Jsonに変換したりもできるので一応書いてる。

```csharp
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Web;
using System.Xml;

var ISBN = 0000000000000;
var uri = $"https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&version=1.2&recordSchema=dcndl&onlyBib=true&recordPacking=xml&query=isbn=\"{ISBN}\" AND dpid=iss-ndl-opac";
var xml = HttpUtility.HtmlDecode(new HttpClient().GetStringAsync(uri).Result);

var doc = new XmlDocument();
doc.LoadXml(xml);
var json = JsonConvert.SerializeXmlNode(doc);
var jObject = JObject.Parse(json);
Console.WriteLine(jObject.ToString());
```

#参考

https://iss.ndl.go.jp/information/2020/03/16_exceltool/

https://iss.ndl.go.jp/information/api/riyou/

https://iss.ndl.go.jp/information/wp-content/uploads/2021/03/ndlsearch_api_20210329_jp.pdf

https://iss.ndl.go.jp/information/wp-content/uploads/2021/12/ndlsearch_api_ap1_20211220_jp.pdf
WordleをPythonに解かせる

## Wordleとは
URL:https://www.powerlanguage.co.uk/wordle/

Wordleは2021年末に公開された，巷で話題の英単語推測ゲームです．お題となる5文字の英単語が存在し，それを合計6回の試行で特定します．

回答者は一度英単語を入力すると，その単語とお題の単語のどの文字が一致しているかを知ることができ，文字も場所も一致している場合は<span style="color: green; ">緑</span>，文字は合っているが場所が一致していない場合は<span style="color: yellow; ">黄</span>，文字も場所もあっていない場合は<span style="color: black; ">黒</span>で表示されます．

1日1題出題だけされ，なかなか楽しいゲームなのですが，やっぱりコンピュータにも解かせてみたいですよね．ということでWordleをPythonに解かせてみました．

## 5文字の英単語リストを取得する
まず，Wordleのお題になる条件である"5文字の英単語"のリストを作成する必要があります．

自分でWordleを解いてみると感じるんですが，特定の文字を使う/使わない5文字の英単語を見つけるだけでも結構難しいんですよね(私の英語力がないだけかもしれません)．

今回は日本語 WordNetというサイトの"Japanese Wordnet and English WordNet in an sqlite3 database"というデータベースを用いていきます．こちらはsqlite3形式で，Pythonで簡単に利用することができます．

URL:http://compling.hss.ntu.edu.sg/wnja/

ダウンロードしたら，

```python
import sqlite3
conn=sqlite3.connect("wnjpn.db")
cur = conn.execute("select lemma from word where lang='eng'")
for row in cur:
    print(row[0])
```
などとすると，英単語がずらっと出力されます．今回は5文字の英単語だけが欲しいので，

```python
import sqlite3
conn=sqlite3.connect("wnjpn.db")
cur = conn.execute("select lemma from word where lang='eng'")
for row in cur:
    if (len(row[0])==5:
        print(row[0])
```
のようにすると，5文字のものだけが得られます．初めに5文字のものだけ他ファイルに出力しておいて次からはそれを使うのでも良いでしょう．
## Wordleを解かせる
準備ができたら，あとは自分の好きなアルゴリズムでWordleを解かせるだけです．これはなんでも良いですが，換字暗号解読の時に用いたアルファベットの出現頻度を参考にしました．
参考サイトURL:https://tex2e.github.io/blog/crypto/letter-frequency
各色と次に入力する英単語の比較のために以下のような関数を設定し，

```python
def count_index(word,str_g):
    count=0
    for i in range(5):
        if str_g[i]==word[i]:
            count=count+1
    return count
def count_max_length(str_g):
    count=0
    for i in range(5):
        if str_g[i] is not None:
            count=count+1
    return count
def count_not_match(word,str_b):
    count=0
    for alp in str_b:
        if alp in word:
            count=count+1
    return count==0
def count_match(word,str_y):
    count=0
    for alp in str_y:
        if alp in word:
            count=count+1
    return count==len(str_y)
```
アルファベット頻度頻度順に検証していきました．

## 結果
今回はサーバに負荷をかけないために入力は手動で行いました．

![スクリーンショット 2022-01-28 2.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510592/3b54bbd9-c42a-ce30-c2cb-8717d8b2a1d8.png)

結果はこんな感じになりました．私はそもそもPERKYなんて単語知らないですし，途中のPERCHなんかも私じゃ思いつかないアプローチで，流石って感じです．

Wordleがどこまでマイナーな単語を出題するのかわかりませんが，あまりにもマイナーな単語を選択肢から省いたり，単語そのものの出現頻度とかを利用したらもっと効率よく答えを探せるかもしれませんね．
初めてPCを自作してみたんですが、意外となんとかなりました　～②購入編～

[①事前検討編](https://qiita.com/rararalanlan/items/3d7cadb3c1583e1db0bb)はこちら


#買ってきました！


|<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510570/5d9dcd51-1063-7e3e-23a0-58bbe3adafc0.jpeg">|
:-:
|         すぐに組みたかったので、強引に持ち帰ってきた         |

<br>

#パーツ一覧

購入したものは以下の通り。

| パーツ要素 |製品名| 価格 |
|:-:|:-:|:-:|
| OS        |Windows 10 Pro 64bit 日本語 DSP版|   ¥18,000|
| CPU       |Intel® Core™ i5-12600K           |   ¥35,455|
|CPUクーラー |ID-COOLING SE-224-XT            |   ¥3,255|
|マザーボード|B660 PRO RS                     |   ¥15,400|
|メモリ      |XPG GAMMIX D20                  |   ¥6,600|
| SSD       |500GB WD BLUE SN570             |   ¥5,891|
|光学ドライブ|I-O DATA  DVRP-U8LK             |   ¥2,280|
|PCケース    |CORSAIR 4000D                   |   ¥9,073|
|電源ユニット|Hydro GSM LITE PRO 750W         |   ¥8,164|
|キーボード  |HERMES L1 赤軸                  |   ¥5,982|
|変換ケーブル|LAD-DPHDMI                      |   ¥1,437|
| その他     |CPU取り付けサービス、紙袋        |   ¥520|
|計（税込） |   |￥123,592   |

BTOのセットが¥121,000だったので、ほとんど変わらない値段で組めた。

<br>

#検討時からの変更点

店頭で相談した結果、検討時から大きく変更したパーツが以下の４点。

###CPU
検討時はIntel Core i7-11700（11世代）を考えていたが、**11世代i7よりも12世代i5の方が処理性能がいい**と聞き、
Intel Core i5-12600Kに変更した。

###CPUクーラー
店員さん曰くあった方がいいとのことで追加。
予算にも余裕があったので。

###キーボード
パチパチと鳴るもの（青軸）を予定していたが、**想定の10倍くらいうるさかった**ので泣く泣くあきらめた。
（在宅勤務時にも使うため。議事録取れない）
店頭で確かめて良かった……。

###CPU取り付けサービス
CPUをマザボに取り付ける作業を店員さんがやってくれるサービス。
CPUの取り付けは最も難易度の高い作業（取り付け時にピンが折れる可能性がある）なので、これだけは代行してもらった。

<br>

#ドライバーが必要だぞ！（絶対に忘れるな）
家に帰って即日組み立てようとしたところ、**ドライバーを買い忘れている**ことが判明。
その日は組み立てられなかった。2時間くらいかけて持って帰ってきたのに……。
また日を改めて挑戦することにした。

③組み立て編へ続く！
頻出するDAX関数5選(初心者向け)

# はじめに
いわゆる「Legacy Excel文化」が根強い組織において、Power Pivotを推進しようとすると、
Power Pivotを全く知らない方に対して、初歩的なことから入念に説明する必要性が発生する。
例：「DAXとは何か」「メジャーとは何か」

そして、こうした初心者の方に効率的に説明するのに最適な記事は意外と少ないため、
Modern Excel上級者の方が日本各地で疲弊していると想像している。
(特に上級者が初心者に運用を引き継ぐタイミングで)

そこで本記事では、
上級者が初心者の方に「これさえ読めば大体なんとかなる」と言って配布できるような、
Power Pivotの超基本的な知識(今回はDAX関数に特化)を解説する。

※あくまでもPower Pivot初心者にDAXへの心理的抵抗を軽減してもらうための記事です。
したがって、情報量を徹底的に削っていて、正確性を重視していない旨をあらかじめご了承ください。

# DAXとは

初心者にはこの記事をオススメする。

https://soft-zou.jp/2020/08/06/powerbi-dax/

※個人的には、事前に概要理解を頑張ろうとするよりも、
実際にDAXの使用例にたくさん触れるのを優先したほうが学習効率が高いのではないか？と思う。
したがって、本記事ではDAXの概要には詳しく触れない。


# 最低限覚えたいDAX関数2選
以下2つの関数は、あらゆるPower Pivotでほぼ確実に使用されるDAX関数である。
一方で、Legacy Excelと関連付けやすい関数であることから、学習コスパは高いといえる。

### `sum` 合計
解説不要。いわゆる「普通のsum関数」と同じ。
違いは、セルではなく列名を引数としている点にある。
※基本中の基本として、dax関数にセルという概念は存在しない
例. `sum(Sales[売上金額])` ：Salesテーブルの売上金額合計を算出する。

### `countrows` 行数のカウント
テーブルの行数を数える関数である。sumと同じぐらい頻出する。
例. `countrows(Sales)` ：Salesテーブルの行数を算出する

ちなみにcountもDAX関数として存在するものの、countrows関数を使う機会のほうが多い。
#### 関連docs

https://docs.microsoft.com/ja-jp/dax/best-practices/dax-countrows#recommendation


# Legacy Excelで登場しないDAX特有の関数3選
以下3つの関数は、Legacy Excelユーザーにとってはすべて初見の関数である。
したがって、特に心理的抵抗感が発生しやすいと考えられる。

### `divide` 「安全な」割り算
Legacy Excelに慣れている方は、`=iferror(100/0,"")`をイメージすると良い。
要は、割る数がゼロである場合に、エラーにならないようにする関数である。

以下のフレーズを暗記しておけば、ほとんど困らない。
> Legacy Excelでの`=iferror(100/0,"")`は、Modern Excelでの`=divide(100,0)`と同義である。

### `calculate` フィルターする
Modern Excel初心者が最も理解するのに苦労する関数である。
ある程度慣れている方であっても、厳密に理解するのがとても大変である。

初心者の段階では、「フィルターする関数」とだけ覚えておくのが効率的と考えられる。
したがって、Legacy Excelで頻出するフィルター機能を思い浮かべながら、以下の式を読むとイメージしやすい。
※sumifs関数をイメージしても良いかもしれない

```DAX
CALCULATE(
    SUM(Sales[Sales Amount]),
    'Sales'[Product Color] = "Blue"
)
```
もしイメージが難しい場合は、以下のように読むと理解しやすい。
> Salesテーブルにフィルターをかけて、Product Color列がBlueの行を抽出する。
そして、抽出後のSalesテーブルにおいて、Sales Amount列の合計を算出する。

### `sameperiodlastyear` 1年前のデータを集計する
関数名のとおり、1年前のデータを集計する関数。
上述のcalculateと組み合わせて使用されることが多い。

```DAX
CALCULATE(
    SUM(Sales[Sales Amount]), 
    SAMEPERIODLASTYEAR(Calendar[Date])
)
```
他人が作ったPower Pivotを引き継げれば十分というケースでは、
`Calendar[Date]`を無視して以下のように読めれば、しばらくの間はなんとかなることが多い。
> Salesテーブルにおいて、ちょうど１年前のSales Amount列の合計を算出する。

# 参考にした記事・docs
## 「Legacy Excel」
「Legacy Excel」は以下の記事から引用させていただきました。

https://qiita.com/k_maki/items/a733e8e72e02d10cb1a0

## 公式docs
https://docs.microsoft.com/ja-jp/dax/dax-function-reference
/*Java入門*/ intとIntegerの違いから

# intとIntegerの違い
簡単に言えば：

* intはプリミティブ型(primitive type)、Integerは参照型(reference type)
* Integerはintのラッパークラス(wrapper class)


# プリミティブ型とは
Javaには8種類の組込み型(built-in data types)があり、プリミティブ型(primitive type)と呼ばれます。
また、各プリミティブ型には対応しているラッパークラスがあります。

|型| 説明| 範囲 |例　 | ラッパークラス |
|:-|:-|:-|:-|:-|
| boolean | 真偽値　| true / false | true | java.lang.Boolean |
| byte  | 8bit整数値  | -128 ~ 127  | 123 | java.lang.Byte |
| short  | 16bit整数値 | -32768 ~ 32767  | 123 | java.lang.Short |
| int  | 32bit整数値 | -2147483648 ~ 2147483647 | 123 |java.lang.Integer |
| long  | 64bit整数値 | $-2^{63} \sim 2^{63}-1 $ | 123L | java.lang.Long |
| float | 32bit浮動小数点値 |絶対値範囲 $2^{-149} \sim  (2-2^{-23})*2^{127}$| 123.45f | java.lang.Float |
| double  | 64bit浮動小数点値 | 絶対値範囲　$2^{-1024} \sim (2-2^{-52})*2^{1023}$ | 123.45 | java.lang.Double |
| char  | 16bit Unicode値 | \u0000 ~ \uffff $\Leftrightarrow$ 0 ~ 65535| 'a' | java.lang.Character |

- プリミティブ型はメモリ上にただの値です。
- 全てのJavaオブジェクトはプリミティブ型の複合です。


# 参照型とは
参照型(reference type)はオブジェクト（クラスのインスタンス）を参照(refer to)するデータの型(type of data)です。
参照(reference)はオブジェクトの所在場所のメモリアドレスを保存することによってこのオブジェクトを指しています。

参照型にはnullを割り当てる(assign)ことができますが、プリミティブ型にはできません。

```java:Test.java
public class Test {
	public static void main(String[] args) {
		String str = null; // str does not currently refer to an object
		int num = null; // DOES NOT COMPILE
	}
}
```

```bash:result
 % javac Test.java
Test.java:4: エラー: 不適合な型: <null>をintに変換できません:
		int num = null;
		          ^
エラー1個
```

# Integerを使う
Integerはintに対応しているオブジェクト型なので、nullを割り当てることやメソッドを呼び出すことができます。
ここで、Oracle公式ドキュメントを読むのがおすすめです→[Integer日本語](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html), [Integer英語](https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html)

```java:Test.java
import java.lang.Integer;

public class Test {
	public static void main(String[] args) {

		// フィールド
		System.out.println("Integerはプリミティブ型" + Integer.TYPE + "のラッパークラスです");
		System.out.println("Integer値を表すビット数は：" + Integer.SIZE);
		System.out.println("Integer値を表すバイト数は：" + Integer.BYTES);
		System.out.println("Integer値に設定可能な最大値は：" + Integer.MAX_VALUE);
		System.out.println("Integer値に設定可能な最小値は：" + Integer.MIN_VALUE);

		// int, Integer, Stringの間の変換
		// int -> Integer
		// Integer notGood = new Integer(123); // NOT RECOMMENDED
		Integer num0 = Integer.valueOf(123);
		Integer num1 = 123; // autoboxing

		// String -> Integer
		Integer num2 = Integer.valueOf("123");
		// Integer bad0 = Integer.valueOf("12.3"); // throws NumberFormatException

		// Integer -> int
		int num3 = num0.intValue();
		
		// String -> int
		int num4 = Integer.parseInt("123"); 
		// int bad1 = Integer.parseInt("12.3"); // throws NumberFormatException

		// int -> String
		String numStr0 = Integer.toString(123);

		// Integer -> String
		String numStr1 = num0.toString();
	}
}
```

```bash:result
% javac Test.java
% java Test      
Integerはプリミティブ型intのラッパークラスです
Integer値を表すビット数は：32
Integer値を表すバイト数は：4
Integer値に設定可能な最大値は：2147483647
Integer値に設定可能な最小値は：-2147483648
```
ubuntuでコマンドラインからgitのブランチ名を取得する（アスタリスクは除きたい）

ubuntuでコマンドラインからgitのブランチ名を取得する（アスタリスクは除きたい）

通常の`git branch`だと、`*`が含まれてしまう。

```bash
$ git branch
* main
```

`cut`で`*`が取れるが、ちょっと不恰好である

```bash
$ git branch | cut -d' ' -f2
main
```

以下で取れるが、ちょっと長くて覚えられない、、

```bash
$ git for-each-ref --sort='-committerdate' --format="%(refname:short)" refs/heads/
main
```

以下が一番シンプルのように思える。

```
$ git branch --show-current
main
```

# 参考

`git branch -h`を参考にしました

```bash
$ git branch -h
usage: git branch [<options>] [-r | -a] [--merged | --no-merged]
   or: git branch [<options>] [-l] [-f] <branch-name> [<start-point>]
   or: git branch [<options>] [-r] (-d | -D) <branch-name>...
   or: git branch [<options>] (-m | -M) [<old-branch>] <new-branch>
   or: git branch [<options>] (-c | -C) [<old-branch>] <new-branch>
   or: git branch [<options>] [-r | -a] [--points-at]
   or: git branch [<options>] [-r | -a] [--format]

Generic options
    -v, --verbose         show hash and subject, give twice for upstream branch
    -q, --quiet           suppress informational messages
    -t, --track           set up tracking mode (see git-pull(1))
    -u, --set-upstream-to <upstream>
                          change the upstream info
    --unset-upstream      Unset the upstream info
    --color[=<when>]      use colored output
    -r, --remotes         act on remote-tracking branches
    --contains <commit>   print only branches that contain the commit
    --no-contains <commit>
                          print only branches that don't contain the commit
    --abbrev[=<n>]        use <n> digits to display SHA-1s

Specific git-branch actions:
    -a, --all             list both remote-tracking and local branches
    -d, --delete          delete fully merged branch
    -D                    delete branch (even if not merged)
    -m, --move            move/rename a branch and its reflog
    -M                    move/rename a branch, even if target exists
    -c, --copy            copy a branch and its reflog
    -C                    copy a branch, even if target exists
    -l, --list            list branch names
    --show-current        show current branch name
    --create-reflog       create the branch's reflog
    --edit-description    edit the description for the branch
    -f, --force           force creation, move/rename, deletion
    --merged <commit>     print only branches that are merged
    --no-merged <commit>  print only branches that are not merged
    --column[=<style>]    list branches in columns
    --sort <key>          field name to sort on
    --points-at <object>  print only branches of the object
    -i, --ignore-case     sorting and filtering are case insensitive
    --format <format>     format to use for the output
```
SourceTree/Git Hub 備忘録

##SourceTree
→Gitを使うためのツール
##リポジトリの作成方法
→貯蔵庫。管理するファイルを置いておく場所。

* sourceTreeの画面で「Create」
* 保存先のパス、名前 > 作成
* 出力先ディレクトリのエラー > はい(特にエラーではないので)
* リポジトリに「.git」という隠しファイルができる

##コミット
→追加・変更したファイルをGitに登録する機能

* sourceTreeの画面で「History」を押下してHistory画面に切り替え
* 「コミットされていない変更があります」を選択
* ステージ(コミットするファイルの指定) 。
→全ての場合は「全てインデックスに追加」/戻す際は「.*インデックスから除く」
* sourceTreeの左上アイコンの「コミット」を押下してコミット画面に切り替え
* 必要に応じてコメント > 右下「コミット」

##チェックアウト
→ファイルの状態を特定の時点に戻す機能

* sourceTreeの画面で「History」を押下してHistory画面に切り替え
* 戻したい時点を選択してダブルクリック
* 「作業コピー切り替えの確認」> 「OK」

##GitHub
→Gitをオンライン上で管理するウェブサービス

##フォーク
→ユーザが管理するリポジトリを<b>GitHub上の自分のアカウントに</b>コピーする機能

* GitHubの画面右上の「Y Fork」
* Forking開始
* 自分のアカウントにフォークしたリポジトリが作成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/9ea07305-429d-2d87-6bd2-76cad469eb08.png)


##クローン
→フォークしてきたリモートリポジトリを自分のPCにダウンロードする機能

* フォークしてきたGitHubのリポジトリ画面で「↓Code」>「HTTPS」タブ > URLのコピーボタン
* SourceTreeの画面上「ファイル」 > 「新規/クローンを作成する」
* 上でコピーしたURLを貼り付け > 「リポジトリの保存先」「名前」 を指定
* 「クローン」を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/7116d647-a9c7-fe4c-b724-bcac5b3a4ea7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/e04f1418-3a98-af0b-60fc-2b6de8690887.png)

##プッシュ

* SourceTreeの画面上の「リポジトリ」> 「リポジトリ設定」 
* 「追加」>　「リモート名」「URL/パス」「ユーザー名」を入力
* 「プッシュ」> 「プッシュ先」と対象を選択し、「プッシュ」を押下
* 「manager-core」> 「select」> IDとパスワード入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/935292f8-604d-df87-71fa-c850cffe287e.png)
RuboCop で inheritance を利用しルールや設定が重複してしまった際に設定を統合する方法


## これはなに

- RuboCop には Inheritance というオプションがあり、設定を複数ファイルに記述またはリモートのファイルを参照し、読み込むことができる
- Inheritance の設定をしても、ルールが重複している場合、意図したルールが適用されなかったため対応した際のメモを記事にしました

## Inheritance とは

RuboCop のルールは `rubocop.yml` に設定を記載することが多いが、共通の設定を読み込む場合 remote URL を指定したり、 Gemfile 等に定義している gem の中から定義を参照できます
`rubocop --auto-gen-config` のコマンドを実行して生成する `.rubocop_todo.yml` も `inherit_from` で読み込むため、自然に利用している人も多いはずです

`inherit_from` の詳細については、以下 URL の「Inheriting configuration from a remote URL」を確認してください

https://docs.rubocop.org/rubocop/1.10/configuration.html#inheriting-configuration-from-a-remote-url

## `inherit_mode` を指定する

Inheritance で複数設定を参照しつつ、定義が重複したときにどのように振る舞うか設定を `inherit_mode` で定義することができます
`inherit_mode` は `override` と `merge` を設定することができデフォルトは `override` になっています

以下は `.rubocop.yml` と `.rubocop_todo.yml` の各ルールで定義されている Exclude 条件を merge する場合に利用します

```yml:.rubocop.yml
inherit_from:
  - .rubocop_todo.yml

inherit_mode:
  merge:
    - Exclude

```

## 最後に

なるべくルールや設定の重複は避け上書きしていくべきと考えていますが、
プロジェクトの方針や状況に応じて柔軟な適用を必要とされるケースもあることを実感しました。

## Reference

https://docs.rubocop.org/rubocop/1.10/configuration.html#merging-arrays-using-inherit_mode
【Django】 django-environでシークレットキーを読み込んだ際に起こりうるエラー

#はじめに
・django-environを使用し、シークレットキーを読み取れなかった時の対処法を書きます。

今回些細すぎるミスにより、４時間ほど解決のために時間を費やしたので、自分への戒めと備忘録として書きます。
また、どの記事にも単純なミスすぎて記載されてなかったので、記事を書きます。

#前提
- Python 3.9.7
- Django 3.2.5
- django-environ 0.4.5
- 仮想環境
 - venv

# 解決方法
環境におけるdatabase.ymlを参照できていなかった。今回はcredintialsにdatabase.ymlのデータベースの設定を入れ、参照させることで解消した。

```
app
├── base
├── config
│   └── settings.py
├── manage.py
├── requirements.txt
└── secrets
    ├── .env.dev
    └── .env.prod
```
今回、開発環境でシークレットキーを渡したかったため、「.env.dev」ファイルとしています。

```secrets/.env.dev
SECRET_KEY＝「シークレットキー」　　#「」は不要です
DEBUG=True
ALLOWED_HOSTS=＊
```
```config/settings.py

from pathlib import Path
import environ #追記

BASE_DIR = Path(__file__).resolve().parent.parent

#追記
env = environ.Env()
root = environ.Path(BASE_DIR / 'secrets') #manage.pyの階層にあるsecretsを読み込む

#下記の二つはif文で本番と開発環境を分けると後々楽です。
# 本番環境用
# env.read_env(root('.env.prod'))

# 開発環境用
env.read_env(root('.env.dev'))

#シークレットキーはギットハブに絶対にあげない
SECRET_KEY = env('SECRET_KEY')

DEBUG = env.bool('DEBUG')

ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')

```

# 動作確認
```
python manage.py runsevere
```
こちらで問題なく動作するはずが

```
raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable
```
前提のコードで記述するとこういうエラーが出ます。

#考えられる原因

考えられる原因は２点考えられると思います。
１つ目

```
root = environ.Path(BASE_DIR / 'secrets')
env.read_env(root('.env.dev'))
```
ここの記述が間違えており、``env.read_env``で読み込めていない。

２つ目
こちらは前提の記述

```
SECRET_KEY＝「シークレットキー」　　#「」は不要です
```
もしこちらが

```
SECRET_KEY= 「シークレットキー」　　#「」は不要です
```
上記のように = と「シークレットキー」の間に無駄な余白があれば上手く読み込めないエラーになります。

でも読み込めていない原因は上記の二つではありませんでした

#解決方法
単純にタイプミスでした。

前提↓

```
SECRET_KEY＝「シークレットキー」　　#「」は不要です
```
解決できるコード↓

```
SECRET_KEY=「シークレットキー」　　#「」は不要です
```

お分かりかもしれませんが、「=」がかな文字の「＝」でした。

#おわりに
くだらない記事を最後まで見て頂いてありがとうございます。
現在未経験で、知見も技術もない初学者ですが、こういうミスでプログラムが動かなくなるんだと知ることができたのでよかったかもしれません、、

同じように「シークレットキー」が何故か読み取れないみたいな人は、「＝」も注意して見て欲しいです。

誰かのお役に立つことを願っております。
誠にありがとうございました。
vue add vuetifyが「ERROR  Error: Line 15: Unexpected token ...」で失敗する時の解決方法

### エラーログ
``` shell
$ vue add vuetify
 WARN  There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes

📦  Installing vue-cli-plugin-vuetify...

yarn add v1.22.17
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ vue-cli-plugin-vuetify@2.4.5
info All dependencies
└─ vue-cli-plugin-vuetify@2.4.5
✨  Done in 3.94s.
✔  Successfully installed plugin: vue-cli-plugin-vuetify

? Choose a preset: Default (recommended)

🚀  Invoking generator for vue-cli-plugin-vuetify...
 ERROR  Error: Line 15: Unexpected token ...
Error: Line 15: Unexpected token ...
    at ErrorHandler.constructError (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:5012:22)
    at ErrorHandler.createError (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:5028:27)
    at Parser.unexpectedTokenError (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:1985:39)
    at Parser.throwUnexpectedToken (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:1995:21)
    at Parser.parseObjectPropertyKey (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2499:33)
    at Parser.parseObjectProperty (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2534:25)
    at Parser.parseObjectInitializer (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2602:35)
    at Parser.inheritCoverGrammar (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2285:37)
    at Parser.parsePrimaryExpression (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2354:38)
    at Parser.inheritCoverGrammar (/Users/~~~/.config/yarn/global/node_modules/esprima/dist/esprima.js:2285:37)
```

<br />

### 解決策
事前に作ってしまっていたvue.config.jsファイルを削除してから再度`vue add vuetify`を実行する。
（削除ではなく中身を空にするだけでも良いかも）
【個人開発】おもしろTikTok動画とにらめっこするアプリを作りました

## はじめに
笑ってはいけない場面で笑いを堪えるのが苦手なので、耐性をつけるためにおもしろ動画とにらめっこするアプリを作りました。
短時間で笑えるゲームになっているので、気分転換に遊んでみて頂けると嬉しいです！

## 概要
https://niramekko.herokuapp.com

### 1. にらめっこゲーム機能

おもしろTikTok動画とにらめっこするゲーム機能です。
3〜5個の動画でプレイリストが組まれるので、笑いを堪えながら順に再生していきます。
現在以下3つのモードがあります。

 - ノーマルモード：ランダムな5つの動画でプレイリストが組まれ、最終スコアを競うモード。
 - 道場モード：最も笑われている最新ベストに挑むモード(※1)。
 - リベンジモード：過去に笑ってしまった動画に再挑戦するモード(※1 ※2)。

### 2. おもしろ動画共有機能

笑えるTikTok動画を共有する機能です(※2)。
おもしろ動画を見つけて共有しましょう！
投稿した動画が最新ベスト入りを果たすと、総スコア([後述](https://qiita.com/slmk/items/6e0a8879fd5dc80ccdbb#2-ゲーム成績の振り返り))が加算されます。
***
 ※1 一定値以上笑うとゲームオーバーになります。
 ※2 要ユーザー登録

## 使い方
### にらめっこゲーム
![niramekko_tutorial.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1374119/d3a959aa-3a2d-3595-48a1-141dea4d193e.gif)

### ユーザー登録するとできること
#### 1. おもしろビデオの投稿
![スクリーンショット 2021-12-20 15.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1374119/58ca3ad3-1fc2-8bd1-f8fc-30f3f94ea29e.png)

#### 2. ゲーム成績の振り返り
ユーザーページにはこれまでのゲームの総スコアと、取得タイトルとその数が表示され、振り返りができます。
また投稿したビデオが最新ベスト入りを果たすと、そのビデオが平均して笑われた程度に応じてスコアが加算されます。
![スクリーンショット 2021-12-20 15.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1374119/46706c2a-2035-6c5e-2ee6-8382eefa1716.png)

他にも投稿ビデオ一覧表示、削除、ビデオの非表示設定などができるようになります。

## 主な使用技術
- フロントエンド
 - Nuxt.js (v2.15.8)
 - face-api.js (v0.22.2)
 - vue-chartjs (v3.5.1)
- バックエンド
 - Ruby on Rails (v6.1.4)
 - omniauth(gem) (v1.9.1)

## ER図
![qiita_niramekko.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1374119/2cde9530-10fb-44db-7af9-5b92c53ecd10.png)

#### メインのテーブル
users：ユーザー情報
videos：TikTokビデオ情報

#### ゲーム関連
game_results：ゲーム結果
laughed_videos：どのユーザーがどの動画を見てどのくらい笑ったかを格納
hidden_videos：非表示設定動画情報

#### ユーザー通知関連
user_notifications：ユーザー通知内容
latest_top_records：最新ベスト入りした動画の投稿ユーザーにスコアを付与する用

#### その他
contacts：ご意見・ご要望

## 技術面の工夫
#### 1. TikTok動画の表示切り替え
ゲームで次のTikTok動画を表示する際にTikTok埋め込み用JSを再読み込みしないとうまく表示されませんでした。
`vuex`で表示中アイテムのポインタを保持しておき、以下のようにフラグを用意して、`script`の`async` `body`の`true` `false`を切り替えることで再読み込みさせています。

```vuejs
<script>
export default {
  head() {
    const flg = this.itemsPointer % 2 == 0;
	return {
	  script: [
        {
		  type: "text/javascript",
		  src: "https://www.tiktok.com/embed.js",
		  async: flg,
		  body: flg,
		},
	  ],
	};
  },
  computed: {
	...mapGetters({
		itemsPointer: "video/itemsPointer",
	}),
  },
};
</script>
```

#### 2. ゲーム結果の登録処理
[ゲーム関連のテーブル](https://qiita.com/slmk/items/6e0a8879fd5dc80ccdbb#ゲーム関連)のうち、game_resultsは1ゲームごとに必ず1レコードのみインサートされますが、その他2つのテーブルに関しては複数レコードをインサートする可能性があります。レコード数分フロント・バック間の通信が発生してしまうのを避けるため、それぞれに対応するCollectionモデルを用意し、一度の通信で複数レコードを登録しています。以下の記事を参考にしました。

https://qiita.com/Ryoga_aoym/items/91a3940cfa4de268fca4

#### 3. ログイン機能
Omniauthを使っているので、フロントエンド、バックエンド間をリダイレクトで繋いでいるのですが、バックエンドで保存したセッションがうまく引き継がれなくて苦戦しました(axiosであれば問題なし)。セッションやクッキーの設定を色々変更したり、フロント、バックのサブドメインを揃えたりと試してみたのですが、うまく行きませんでした。一旦、外部プロバイダの認証後、フロントにリダイレクトしてから再度バックエンドにaxios通信した上でセッション情報を格納するようにしています。

## おわりに
追加したい機能がいくつかあるので、改善しつつ運用していければと思っています。
ご要望、ご意見、不具合等ございましたら[こちら](https://niramekko.herokuapp.com/contact)からメッセージを頂けると助かります。よろしくお願いします！
VS Codeで*.js, *.ts, *.jsx, *.tsxのみにデフォルトフォーマッタとしてPrettierを設定する

デフォルトフォーマッタや自動フォーマッティングの設定を言語ごとに変えたいときがある。
VS Codeで特定の拡張子のみに適用したい設定は、settings.jsonに記述する。

今回はjs, ts, jsx, tsxのファイルのみで<a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a>をデフォルトフォーマッタとして設定し、自動フォーマッティングを有効にする場合の書き方を記す。

command+shift+Pでsettings.jsonを開き、下記を追記する。

```
{
"[javascript]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascriptreact]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}
```

以上。
Pulumi で resource の rename を行う方法


## はじめに

- Pulumi は `terraform state mv` に相当する、定義済みの resource の rename を行うことが出来ません
- `pulumi state mv` を出来るようにすべきとの議論も行われているため、近々出来るようになる可能性もあります

## resource の rename を行う

1. `pulumi state delete <resource URN>` を実行し state から resource を管理外に変更
1. `pulumi import [type] [name] [id]` を実行し resource を取り込む

- 必要に応じて、`pulumi import` 後に `pulumi unprotect` を実行してください
  - `terraform state mv` を忠実に再現したい場合
  - `terraform import` 後に謝って resource を削除しそうになった方は protect のままにしておくことをおすすめします

### `pulumi state` コマンドについて

`pulumi state` で実行できる処理は `delete` と `unprotect` のみです。

`unprotect`は `pulumi import` で取り込んだ resource を誤って削除しないための機能です
`terraform import` した resource を誤って削除しそうになった方は有効にしておくことよいでしょう

## Reference

https://www.pulumi.com/docs/reference/cli/pulumi_state/

https://www.pulumi.com/docs/reference/cli/pulumi_import/

https://github.com/pulumi/pulumi/issues/458
ブロックチェーン入門：Bitcoinソースコードからビルド

ブロックチェーンのソースコードを読みたい、公式実装である[Bitcoin Core](https://github.com/bitcoin/bitcoin)があります。他のブロックチェーンの実装でもBitcoin Coreをフォークした実装が多く、自分のブロックチェーンを作るのであればBitcoin Coreをフォークするのがよさそう。Bitcoin Coreをソースからビルドして見る。

# Bitcoinビルド環境

- Ubuntu18.04
- [Bitcoin Core v22.99.0](https://github.com/bitcoin/bitcoin)
- Qt バージョン 5.9.5

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

```
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install build-essential 
sudo apt-get install libtool 
sudo apt-get install autotools-dev 
sudo apt-get install autoconf 
sudo apt-get install pkg-config 
sudo apt-get install libssl-dev 
sudo apt-get install libevent-dev 
sudo apt-get install libboost-all-dev 
sudo apt-get install libminiupnpc-dev 
sudo apt-get install libqt4-dev 
sudo apt-get install libprotobuf-dev
sudo apt-get install protobuf-compiler 
sudo apt-get install libqrencode-dev
sudo apt-get install libdb-dev
sudo apt-get install libdb++-dev
```

Qt5をインストールする場合（推奨）

```
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
```

# GCCバージョンを8にアップグレード

```
sudo apt install g++-8 gcc-8 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8
```

# Bitcoinソースコードの取得

```
mkdir ~/bitcoinsource
cd ~/bitcoinsource
git clone https://github.com/bitcoin/bitcoin
```

# Bitcoinのビルド

```
cd bitcoin
./autogen.sh 
./configure
make 
sudo make install
```

# Bitcoinの起動

```
$ bitcoin-qt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/815d2c14-cae0-923b-14d7-c28a6dfa2aed.png)

インストールしたBitcoin Coreのブロックチェーンデータベースが古いので、
全世界最新ブロックチェーンデータベースより10年ぐらい遅れています。
最新のデータベースから同期必要があります。
同期完了までに結構時間がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/7a49f30a-9541-6daf-d477-5068e122b648.png)

同期中のP2Pのピア一覧を見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/d7d6cae7-f0ab-12e8-1dec-0e81a379e12c.png)

現在、全世界最新ブロックチェーンデータベースが400Gがあるので、自分のPCにこんな大きなデータを保存できないので、最新の部分だけを保存するように保存容量を制限してよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/80143ae9-bf72-ee89-21d8-aea14b1013e2.png)


保存容量を制限すると、制限した最新部分が保存されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/9c69344b-6de9-3fce-acd2-79ec22182b06.png)


# IDEツール（Qt Creator）でBitcoinソースコードを見る

File → File/Projectを新規 → import ProjectよりBitcoinソースコードをインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/8224af3e-09dc-5bc1-bc41-2f0765bc8ab2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/e8c7e34d-da26-3489-1208-5f0a6a05a3c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/34d233a3-ecb6-0f41-944e-e1eae8822f2f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/727af0e8-4285-701e-6574-7c87c47d4d66.png)