OmniAICreator/Qiita-1.07M huggingface dataset:
【Go】ビットを利用したフラグ管理

## 概要
Goでビット演算を利用したフラグ管理を行う実装を記述します。
複数指定可能なオプションを、constで定義している際などに使える便利な小技です。
Go以外でも、ビット演算を利用したオプション管理を実装している方は割と少なくないと思いますが、私自身これまでにビット演算を実装で使ったことがなく、「これは便利だわ〜」と感じたので、勉強ログ的なテンションで記述していきます。

## ビット演算子
|演算子|説明|
| :---: | :---: |
|x &#124; y|x と y の ビット論理和|
|  x ^ y  |x と y のビット排他的論理和|
|  x & y  |x と y のビット論理積|
|  x << n  |x の n ビット左シフト|
|  x >> n  |x と n ビット右シフト|

## 実装
```Go
type AmazonPrimeOpt uint64

const (
    Video AmazonPrimeOpt = 1 << iota
    Music
    Photos
    Reading
    Gaming
)
```
上記のようにオプションをconstで定義します。
Goでenumを作成する際に多く用いられる`iota`を使用します。

上記constを二進数で表すと以下の定義になります。
```
Video   = 1
Music   = 10
Photos  = 100
Reading = 1000
Gaming  = 10000
```
これらの定数と論理和（|）や論理積(&)を使ってコードを書きます。
```Go
func main() {
    // 組み合わせて設定
    var opt AmazonPrimeOpt
    opt = Photos | Reading

    if opt & Photos != 0 {
        fmt.Println("オプションに「Photos」が含まれています")
    }
}
```

ビット演算の内訳は以下のような感じ
```markdown
// `opt = Photos | Reading`
 0100
+1000
------
 1100

// `opt & Photos`
 1100
*0100
------
 0100

// `opt & Photos` ※Photosがオプションに含まれていなかった場合
 1000 ・・・ オプションにPhotosが含まれないため、optの値は二進数で「1000」となる
*0100
------
 0000 ・・・ 結果は0
```

## まとめ
go/toolsの、[ssa.BuilderModels](https://github.com/golang/tools/blob/68c7d11ad44a78c01f1edd434c509337ebdec1d9/go/ssa/mode.go#L21)の実装を見るともっとわかりやすいですし、面白かったのでぜひ。

## 参考書籍
https://www.oreilly.co.jp/books/9784873119694/
XCTMemoryMetricが動かない場合のワークアラウンド

XCTestでは、measureを使うと使用メモリや実行時間を計測できるが実行時間以外のメトリクスはうまく動いてくれない。

```
final class MeasureTests: XCTestCase {
    func testSingleContextLayer() {
        measure(metrics: [XCTMemoryMetric(), XCTClockMetric()]) {
        }
    }
}
```

どうもiOSシミュレータでは動いてくれないようなので、実行ターゲットをMacにすると使えるようになる。

![CleanShot 2022-08-14 at 02.13.29@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/98214ed3-4550-7cc7-f79f-0f6d0ae9553b.png)
Retoolでwpのような繰り返しフィールドを作成する

管理画面が作れるローコードツール「Retool」でクイズアプリ使ってみます。

繰り返しフィールドはスクラッチであれば、そのままコードを書けばいいので考える事は無いのですが...
Retoolだと、どうやればいいかはまったのでメモとして残します。

## 使うもの
<ul>
  <li>retool</li>
  <li>スプレッドシート (手軽に検証したいためデータベース代わり)</li>
</ul>

### csv
クイズの題名
```csv:quiz.csv
id,name,create_date,update_date
1,htmlの質問集,,2022-08-13T15:28:28.226Z
```

質問集
```csv:quiz_res.csv
id,quiz_id,name,question1,question2,question3,res
1,1,htmlに見た目を整えるのは？,css,テストphp,ruby,1
2,1,htmlに見た目を整えるのは？,css,テストphp,ruby,1
3,1,htmlに見た目を整えるのは？,css,php,ruby,1
4,1,htmlに見た目を整えるのは？,css,php,ruby,1
5,1,htmlに見た目を整えるのは？,css,php,ruby,1
```

## コンポーネント
<ul>
  <li>listview → セットしたデータ分だけ子要素のコンポーネントを繰り返す</li>
  <li>container → 名前の通り囲む</li>
</ul>


![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/0e24ba3f-2546-ade8-bd87-1b25eb8945d7.jpeg)


## コード

### 質問を追加
listviewで繰り返す数をtemporary statusで管理して追加した時足す

参考url
https://community.retool.com/t/dynamic-listview-row-numbers/4922

temporary status
```
{{res_query.data.filter(function(data) {
    return data.quiz_id == table1.selectedRow.data.id;
  }).length}}
```

### 質問の追加・更新
質問集は複数行のデータを更新しないといけなく「Resource query」単体では対応できなさそうなので、「javascript query」をループさせて「Resource query」を呼び出し更新をかけるようにする。

※注意点としてadditionalScopeを使用することで「Resource query」変数に渡せる。(ここがどうやるか分からずはまった。

↓javascript query
```
form1.data.listView1.forEach(function(item, i){
    if(item.textid != ""){
        //更新時
        res_up_query.trigger({
            additionalScope: { i: i }, // ここで変数`i`を上書きします
            // onSuccess関数でデータを取得するために引数を使用することができます
            onSuccess: function(data) {
            //最後の時だけ再度データを取得
                if(i + 1 == form1.data.listView1.length){
                      res_query.trigger();
                }
            },
            onFailure: function(error) {
              // errorsTextを発生したすべてのエラーで更新します
            }
          });
    }else{
        //新規追加時
        res_insert_query.trigger({
            additionalScope: { i: i }, // ここで変数`i`を上書きします
            // onSuccess関数でデータを取得するために引数を使用することができます
            onSuccess: function(data) {
                if(i + 1 == form1.data.listView1.length){
                      res_query.trigger();
                }
            },
            onFailure: function(error) {
              // errorsTextを発生したすべてのエラーで更新します
            }
          });
    }
});
```


## まとめ
海外のツールなのでちょっと敬遠していましたが、使った見た感じ業務でも使えるように感じました。
reactで作られていそうなので知見がある人は、もっと複雑システムが構築できそうなのでぜひ触ってください！
(今回はクラウド版を使いましたが、オンプレミスも出来るようです
【メモ】「Python 実践データ分析１００本ノック」のpulpエラーについて

`前提条件`
- macOS Monterey 12.4
- Anaconda 4.12.0
- Python 3.8.8
- jupyter-notebook 6.4.10

condaコマンドを用いてpulpライブラリーを追加すると第７章のノック61において以下のようなエラーが出た。

```
Pulp: Error while trying to execute, use msg=True for more detailscbc
```
詳細はわからないが、condaでpulpをインストールするとダメなようで`pipでインストールする`と解決した。
（※``condaとpipを混ぜると環境が壊れることもあるらしい``ので自己責任でお願いします。）
既にcondaでpulpをインストールしている場合は以下のコマンドを実行してからpipでインストールし直す。

```
% pip uninstall pulp
```
アンインストールが完了したら、以下のコマンドを実行する。
まだpulpをインストールをしていない場合も同様に以下のコマンドでインストールすればできる。
```
% pip install pulp
```
ちなみに、同じタイミングで出てくるortoolpyもpipでインストールしないといけないです。
参照：(https://github.com/coin-or/pulp/discussions/384)
【wsl2】wsl2のホスト名って変えられるんですか？

# wsl2のホスト名って変えられるんですか？
とある日。

後輩ちゃん「wsl2上で作業するときに、**ホスト名**に**自分のマシン名**が表示されるの嫌だな～」
後輩ちゃん「wsl2のホスト名って変えられないのかな～」
後輩ちゃん「ほらほら、良く黒い画面のキャプチャとか撮ること多いじゃないですか～」

すずこ（独り言かな）
すずこ（また黒い画面って言ってるし...）

後輩ちゃん「Linuxのホスト名変更コマンドだと上手くいかなかったし～」
後輩ちゃん「変更方法知ってる人いないかな～((ﾁﾗﾁﾗ」

すずこ「分かったよ、教えるよっ！！！」

ということで、wsl2のホスト名変更手順を説明することになった。

## wsl2のホスト名変更方法

すずこ「後輩ちゃんの言う通り、wslでは下記のような表示になるね」
```
root@[マシン名]:~#
```
すずこ「マシン名のところを、任意のホスト名に変更したい場合、」
すずこ「`/etc/wsl.conf`に記載するのが手っ取り早いよ」

### /etc/wsl.conf に記載する
すずこ「wsl2内の`/etc/wsl.conf`に下記を記載してごらん」
すずこ「`/etc/wsl.conf`が存在しない場合は作成して記載して」

``` [/etc/wsl.conf]
[network]
hostname = wsl ← お好きなホスト名でOK
```

すずこ「記載できたら保存して、wslを再起動してみよう」

wsl2再起動後...

```
root@wsl:~#
```
後輩ちゃん「ありがとうございます、ちゃんと変わってます！」
後輩ちゃん「これで、マシン名表示されなくてハッピーです！」

---
と、こんなやりとりがありましたとさ。


## 余談
### hostnamectl set-hostnameだとエラーが出る理由

すずこ「ところで、冒頭で言ってた、**Linuxのホスト名変更コマンド**って下記のことかな？」
```
root@[マシン名]:~# hostnamectl set-hostname hostname
```

すずこ「この方法だと、確かにエラーがでるね」

すずこ「このコマンドは、Linuxのhostname変更コマンドなんだけど、」
すずこ「wsl2上で実行すると下記のようなエラーが起きるんだ」

```
root@[マシン名]:~# hostnamectl set-hostname wsl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down
```

後輩ちゃん「そうです、そのエラーが出ました」

すずこ「エラーの内容はざっくり、**systemdをinitシステム(PID 1)として起動してないから`systemctl`は使えないぜ**って感じ」

すずこ「wsl2上でプロセスの確認をしてごらん」

```
root@[マシン名]:~# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0    896   528 ?        Sl   23:22   0:00 /init
```

後輩ちゃん「`PID 1`が`/init`になってますね」
後輩ちゃん「じゃあ、`PID 1`を`systemd`になるように変更すれば、この方法でも実行できるんですか？」

すずこ「おそらくできると思うが、やったことないので自分で確かめてみて」

後輩ちゃん「いつかやってみます！」

すずこ（絶対やらんな...）

おしまい。
Logging参考資料

# 背景
PythonのLog周りのライブラリ選定ついでにLoggingについて調べ、自分でまとめる必要性が無いくらいに情報が豊富だったので資料をプールしておきたいだけ

# 参考資料
Loggingの仕組みを分かりやすく書いてある
https://hackers-high.com/python/logging-overview/

Loggingを使う際のベストプラクティス的なコードがある
https://qiita.com/FukuharaYohei/items/92795107032c8c0bfd19

Loggingの注意点
https://qiita.com/amedama/items/b856b2f30c2f38665701

公式ドキュメント
https://docs.python.org/ja/3/howto/logging.html

複数ファイルにまたがる際の書き方
http://joemphilips.com/post/python_logging/
Befungeはドドスコする夢を見るのか？

面白いツイートを見かけたので、今更ながら流れに乗ってみました。
何番煎じかわかりませんがお盆休みなので許してください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【問題】配列{&quot;ドド&quot;,&quot;スコ&quot;}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点)</p>&mdash; ((🐑++)) (@Sheeeeepla) <a href="https://twitter.com/Sheeeeepla/status/1554028833942441984?ref_src=twsrc%5Etfw">August 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Befungeで書いてみた
```dodosuko.bef
vv  " Love Chew New!"  <
 >#v,,,,,,,,,,,,,,,#v@
>  ?"DD",, #v      >?>#, #,"D"<
,  >      vv?<,,"SC"<
,  v,,"SC" <>        ^
^ >?     ###v        ^
   >"CS",,> ?>"DD",,v
^"SC"v#   < <v,,"SC"?^
 v   ?<,,"SC"?     #^^
 >  #"  >>  #^ #"    ^
 >  #C,,  v     >"CS", ^
 ^  "SC"<
 v"DD"<
 >   ,,>?^"#    ?<
     ,#> ?"CS",,^
     v  ^^<
^"SC"?^
     ^
```
```:出力
SCDDDDSCDDSCSCDDSCSCDDDDSCDDSCDDSCSCSCSCSCDDDDDDSCDDSCSCDDSCDDDDSCDDSCSCDDSCSCSCSCSCDDSCSCSCSCSCSCSCSCDDSCDDDDDDSCDDSCSCSCSCDDSCSCSCSCSCSCSCSCSCDDSCSCDDDDSCSCSCDDSCDDSCSCSCSCDDDDSCDDDDSCSCDDDDSCSCSCDDSCSCSCDDSCDDDDDDDDDDSCDDSCDDDDDDSCDDSCSCSCSCSCDDSCDDSCSCDDSCDDDDSCDDSCSCSCDDDDSCSCDDSCSCDDDDSCDDSCDDSCDDDDDDSCSCSCSCSCSCSCSCSCDDSCDDSCDDDDSCSCSCDDDDDDSCDDDDDDSCDDDDDDSCSCSCSCSCSCDDSCDDDDDDDDSCSCSCDDSCDDSCSCSCDDSCSCSCDDSCSCSC Love Chew New!
```
## Befungeとは
ひたすらコンパイルの難しさのみを追求したEsolangの一種、要は難解ネタ言語です。詳しくは[EsolangのWiki](https://esolangs.org/wiki/Befunge)をご覧ください。
2次元平面上を自由に行き来する[Brainf**k](https://esolangs.org/wiki/Befunge)だと思うとわかりやすいかと思います。ちなみにBefungeの3次元バージョンの[Trefunge](https://esolangs.org/wiki/Funge-98#rcfunge_.28in_Trefunge_mode.29)というものもあります。~~酔狂~~勉強熱心な方はぜひ手元でいじってみてください。

### Hello, World!
例えば、Hello, World! はこうなります。
```
>               v
> ,,,,,,,,,,,,,@
^"Hello, World!"<
```
1. 左上からスタートします。
1. ">"があるので右に進路を取ります。
1. 右上の"v"まで来ると今度は下に進みます。
1. 右下の"<"で左に進みます。
1. "Hello, World!"を後ろから順にスタックにプッシュしていきます。
1. 左下の"^"で上に進みます。
1. 2行目の">"で右に進みます。
1. ","はスタックをポップして出力します。
1. "@"にたどり着くとプログラム停止です。

## 補足
ブラウザでも実行できます。実際にどうやって進んでいるのかリアルタイムで眺めることができます。子供の頃、蟻の行列を眺めるのが好きだった僕のような方は延々と楽しめると思います。
[HTML5 Befunge93 Interpreter](http://qiao.github.io/javascript-playground/visual-befunge93-interpreter/) 
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726727/ebeedfab-bc98-9a33-8e1c-663551b208e2.png)

## 反省会
アスキー文字以外が使えないので(使えたところで醍醐味であるコードの表示がずれる)、"ドドスコ"を"DDSC"、"ラブ注入♡"を"Love Chew New!"としました。ソースコードの最小文字数を目指すゴルフ路線も考えたのですが、このご時世、ソースコードの中だけでもせめて自由に動き回りたいなと思い、縦横無尽に移動することをコンセプトとしました。
粗末なコードですが多めに見てくださると幸いです。

https://github.com/NI57721/dodosuko-funge/tree/main
GolangでCloudFrontのAliaseドメインを更新するサンプル


## メモ
- 実際にCloudFrontの構成情報を更新するためには、指定したい部分を更新するというよりかは、構成情報をすべて送るイメージで実装する
  - そのため、一度構成情報を落としてきて、それに対し変更を加えて、それをPUSHするというような流れを組む必要がある
- ETagとよばれるトランザクション管理するような値があり、更新系メソッドには必要
  - 参照系メソッドを呼んだときに一緒に返却される

## サンプル

```go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/cloudfront"
)

func main() {
	id := "XXXXXXXXXXXXX"
	sub_domain := "test02"
	hosted_zone_name := "vamdemic.com"

	svc := cloudfront.New(session.New())

	// CloudFront設定情報の読み込み
	DistrbutionConfig, err := GetCloudFrontDistributionConfig(svc, id)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(DistrbutionConfig)

	// サブドメインエイリアスを追加
	Added_DistributionConfig, err := AddCloudFrontDistributionConfig(DistrbutionConfig.DistributionConfig, sub_domain, hosted_zone_name)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(Added_DistributionConfig)

	// CloudFront設定のアップデート
	UpdateCloudFrontDistribution(svc, id, Added_DistributionConfig, *DistrbutionConfig.ETag)
}

func GetCloudFrontDistributionConfig(svc *cloudfront.CloudFront, id string) (*cloudfront.GetDistributionConfigOutput, error) {
	input := &cloudfront.GetDistributionConfigInput{
		Id: aws.String(id),
	}

	result, err := svc.GetDistributionConfig(input)
	if err != nil {
		if aerr, ok := err.(awserr.Error); ok {
			switch aerr.Code() {
			case cloudfront.ErrCodeNoSuchDistribution:
				fmt.Println(cloudfront.ErrCodeNoSuchDistribution, aerr.Error())
			case cloudfront.ErrCodeAccessDenied:
				fmt.Println(cloudfront.ErrCodeAccessDenied, aerr.Error())
			default:
				fmt.Println(aerr.Error())
			}
		} else {
			// Print the error, cast err to awserr.Error to get the Code and
			// Message from an error.
			fmt.Println(err.Error())
		}
		return nil, err
	}
	return result, nil
}

func AddCloudFrontDistributionConfig(DistributionConfig *cloudfront.DistributionConfig, sub_domain string, hosted_zone_name string) (*cloudfront.DistributionConfig, error) {

	domain := fmt.Sprintf("%s.%s", sub_domain, hosted_zone_name)

	// Alias部分の配列にドメイン名を追加
	DistributionConfig.Aliases.Items = append(DistributionConfig.Aliases.Items, &domain)

	// Aliasをカウントする要素をインクリメント
	// ※ここがDistributionConfig.Aliases.Itemsの数と一致しないと、UpdateDistributionをするときに400になって怒られる
	*DistributionConfig.Aliases.Quantity++

	return DistributionConfig, nil
}

func UpdateCloudFrontDistribution(svc *cloudfront.CloudFront, id string, DistributionConfig *cloudfront.DistributionConfig, etag string) {
	input := &cloudfront.UpdateDistributionInput{
		DistributionConfig: DistributionConfig, //ドメイン追加した構成情報を指定する
		Id:                 aws.String(id),
		IfMatch:            aws.String(etag), // ETagと呼ばれるトランザクションIDのようなものを指定する必要がある。コレは、GetDistributionConfigをしたときに取得できるのでそこから引っ張る
	}
	result, err := svc.UpdateDistribution(input)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(result)
}
```
LPIC1学習用のサーバー構築手順【AWS EC2】

## 作業環境
- macOS Monterey バージョン12.4
- Win場合もだいたい同じかと

## はじめに
- AWS,Linuxはじめて触るよーって人向け
- 最小限の手順のみ
- 分からないところはぐぐってね ※LPICの勉強にもなります

## 出来ること
- CLIを体験できます
- `man`コマンドを打てます
- 長くとも１時間くらいで構築できます 
>manページとは、UNIXおよびUnix系オペレーティングシステムの man システムのコンテンツであり、電子化されたドキュメントのこと。

&ensp;  

## 手順
[手順書作りました。](https://github.com/norikata99/hello_git/blob/9ad570a005122f9cf2a2f82954dec54096a50e9b/LPIC1sv-man.md)  

&ensp;  

## 補足
ここまで書いといてなんですが、個人的にLPIC1は実機での学習はそこまで重要じゃないと思います。  
しかしコマンドだけは実際に打ってみた方が頭に入ってきたので、がっつり実機じゃないひとはこの方法がおすすめです。  
&ensp; 　

# 最後に
無駄を省いてLPIC1の学習用にコマンドが実際に打てる環境構築のみに注力しました。  
サーバー構築というには多少大げさかもしれませんが、LPIC1の学習にはこれくらいで十分かと思います。  
あんまり時間もかからないのでサクッとやっていただければ^^
【開発者必見】UbuntuにDockerインストールして仮想マシンを構築する

# 前置き

本番環境でも使えるが、今回は開発用Ubuntu 22.04LTS（デスクトップ）で仮想マシンを構築する方法を記載します。
なぜ仮想マシンが必要かというと、理由は「壊れても作り直せばいいから」「間違っても元に戻せるから」などがあげられます。
とりあえず、今回は、サクッと構築する方法を記述していきます。

※ターミナルを使います。

# 構築環境
記事を書いたPCの環境です。
|項目|スペック|
|:-----------|------------:|
|OS|Ubuntu 22.04LTS (Desktop)|
|CPU|4Core|
|Memory|16GB|
|Storage|512MB|

それでは、さっそくDockerをインストールしてみましょう。

# 1. パッケージをアップデートする
パッケージをアップデートして最新版にしておきます。
```bash
$ sudo apt update -y
$ sudo apt upgrade -y
```
# Dockerをインストールします
さっそくDockerをインストールします。
イントール手順は以下のとおりです。
```bash
$ sudo apt install lsb-release ca-certificates apt-transport-https software-properties-common -y
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update -y
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
```

もうこれでDockerのインストールが完了です。

# sudoなしでDockerコマンドを利用できるようにする。

```bash
$ sudo groupadd docker
$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker
```
これでsudoなしでDockerコマンドが利用できるようになったので早速試してみましょう。

# docker docker-compose インストールの確認
```bash
$ docker -v
Docker version 20.10.17, build 100c701

$ docker-compose
docker-compose version 1.29.2, build unknown
```
バージョンが表示されればOKです。
では早速、最新のUbuntuOSをDocker上にインストールしてみましょう。

# docker-composeを使って最新のUbuntuOSをDocker上にインストールする
ここでは任意の場所にディレクトリを作成します。

```bash
$ mkdir ~/temp && cd ~/temp
$ touch docker-compose.yml
$ vim docker-compose.yml
```

docker-compose.ymlを以下のとおりにします。（シンプル構成）
```docker-compose.yml
version: '3'
services:
  ubuntu:
    image: ubuntu:latest
    tty: true
```

# docker-composeを利用して最新のUbuntuをDocker上で動かす
さあ、いよいよDocker上でUbuntuを動かします。

```bash
$ docker-compose up -d
```
たったこれだけです。しばらく待ちます。

# docker上でUbuntuが動いているか確認してログインする
```bash
docker ps
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS         PORTS     NAMES
4b671926c5cd   ubuntu:latest   "bash"    5 minutes ago   Up 5 minutes             docker_ubuntu_1
```
一つ仮想マシンが動いていますね！大成功
それでは、仮想マシンにログインしてみます。上記、CONTAINER IDをコピーして以下コマンドを実行します。

```bash
docker exec -it 4b671926c5cd /bin/bash
root@4b671926c5cd:/#
```
rootでログインできました！それではパッケージをアップデートしてみましょう。
```bash
root@4b671926c5cd:/# apt update -y && apt upgrade -y
```

「exit」でコンテナの外にでることができます。

# 仮想マシンを停止する
ずっと仮想マシンを動かしているわけにはいきませんね。それでは、仮想マシンを止めてみます。
```bash
$ docker-compose stop
```

# Docker仮想マシンを全て消去する
マシンのリソースを消費することがあるので、消去することも必要になってきます。
抹消方法を紹介しておきます。

```bash
$ docker-compose down
$ docker system prune -f -a
```

以上です。
LightGBM の木を可視化するとき日本語フォントにする

[lightgbm.create_tree_digraph](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.create_tree_digraph.html) に以下のようにパラメータを渡すと好きなフォントに変更できます。
※ matplotlib でその日本語フォントを利用できるようにしてあることが前提です。
※ 環境設定として日本語フォントを設定しておく方法もあると思います。

```python
import warnings
warnings.simplefilter('ignore', UserWarning)
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 6)  
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = datasets.load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)

# あえて特徴の名前を日本語にする
iris.feature_names = ['萼片の長さ(cm)', '萼片の幅(cm)', '花弁の長さ(cm)', '花弁の幅(cm)']
lgb_train = lgb.Dataset(X_train, y_train, feature_name=iris.feature_names)
lgb_eval = lgb.Dataset(X_test, y_test, feature_name=iris.feature_names, reference=lgb_train)
params = {'seed': 0, 'task': 'train', 'boosting_type': 'gbdt', 'objective': 'multiclass',
          'metric': {'multi_logloss'}, 'num_class': 3, 'learning_rate': 0.1,
          'num_leaves': 20, 'min_data_in_leaf': 3, 'num_iteration': 10, 'verbose': -1}
model = lgb.train(params, lgb_train, valid_sets=lgb_eval,
                  early_stopping_rounds=20, verbose_eval=False)
model.save_model('model.txt', num_iteration=model.best_iteration)
y_pred = model.predict(X_test, num_iteration=model.best_iteration)
y_pred_max = np.argmax(y_pred, axis=1)
accuracy = accuracy_score(y_pred_max, y_test)
print(f'accuracy score: {accuracy:0.4f}')

# 以下で可視化すると日本語が表示できず豆腐がもたらされる (※ 環境設定による)
# lgb.plot_tree(
#     model, tree_index=0, show_info=['internal_value', 'data_percentage'],
#     orientation='vertical')
# plt.show()

# create_tree_digraph には graphviz.Digraph のコンストラクタに渡すパラメータを指定できる
graph = lgb.create_tree_digraph(
    model, show_info=['internal_value', 'data_percentage'],
    orientation='vertical',
    node_attr={'fontname': 'M PLUS 1', 'fontsize': '11'},  # 日本語フォント
    edge_attr={'fontname': 'M PLUS 1', 'fontsize': '10'},  # 日本語フォント
)
graph.format = 'png'
graph
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177688/a277cefe-2b53-84cb-131f-f1944f44cfed.png)
[Swift]リリースビルドのビルドを失敗させる

リファクタリングや、リリースバージョンによるマイグレーションなど、コードを書いている時には仮の実装をしておくが、リリース時には絶対に実装しなくてはいけないコードが時々あります。
リリース後にソースコードから
```swift
// ここはリリース前に書き換える
```
といったコメントが出てきた肝が冷えた体験がある人もいるのでは無いでしょうか。

Swiftでは`#error()`でビルドを失敗させることができるため、次のように記述することでデバッグビルド以外でビルドを失敗させることが出来ます。

```swift
#if !DEBUG
#error("リリース前に必ず実装する")
#endif
```

これでリリースビルドは作られなくなり、安全にコードを運用することが出来ました
【結果・アンケート】ソフトウェア・テストについて知りたいもの

一週間前、discussionどしてアンケートを投稿したことがありました。（https://qiita.com/cheuora/questions/56b061e4f78e5e0b1686）

回答してくれた方は８人なので結果として意味があるかは疑られますが、一応ここで結果を示してみます。

* アンケート期間：2022-08-05 ~ 2022-08-12
* 参加人数：８人

![](https://armitagenaver.github.io/cdns/question_answer.drawio.png)



ちなみに同質問を韓国ITエンジニアで聞いてみましたが、やっぱり「テスト・ケースを上手に書き方」がトップだったし二番目は「テストしやすいコードを作り方」でした（回答数: 98人)



回答をしてくださった皆さんありがとうございました。
AtCoderログ：ABC264

# ABC264に参加しました
今回はA, Bの2完でした。
A：2分
B：20分

## 今回のコンテストでのレート変動
179→189（灰）

## A問題-"atcoder".substr()
単純にsubstrを使用するのみでした。

```cpp
// 提出コード
int main() {
  string s = "atcoder";
  int l, r;
  cin >> l >> r;

  cout << s.substr(l - 1, (r - l) + 1) << endl;
  return 0;
}

```

## B問題-Nice Grid
完全に沼りました。
簡潔に解こうと思いながらも思いつくことができなかったので早めに自前で盤面を作成して判定するようにすればよかったです。
自身の解答では盤面をループで作成しましたが、このループも一工夫が必要なものなので, 公式解説のように文字列で盤面を定義してしまうのが良かったです。（チェビシェフ距離なんて知りません...）

```cpp
// 提出コード
int main() {
  int r, c;
  cin >> r >> c;
  string arr[16][16];
  rep3(i, 1, 16) {
    rep3(j, i, 17 - i) {
      if (i % 2 == 1) {
        arr[i][j] = "black";
        arr[j][i] = "black";
        arr[16 - i][j] = "black";
        arr[j][16 - i] = "black";
      } else {
        arr[i][j] = "white";
        arr[j][i] = "white";
        arr[16 - i][j] = "white";
        arr[j][16 - i] = "white";
      }
    }
  }
  cout << arr[r][c] << endl;
  return 0;
}
```

## C問題-Matrix Reducing
大半はこの問題と格闘していました。
解いている途中でbit全探索を使用して解けるであろうことは気づけたのですが最終的な実装までは辿りつきませんでした。
大体こういうのは試験時間が終わるとすっと解けたりしてしまう...

```
1 3 4 5
6 8 9 10
11 13 14 15
16 18 19 20
```
を変換して
```
6 8 9
16 18 19
```
に出来るかどうかを判定する必要がありました。
H1 * W1 の行列を H2 * W2に変換するので

* H1ある行から h行（h == H2）
* W2ある列から w列（w == W2）

抽出することを考えます。
その抽出する行, 列を選ぶ作業に**bit全探索**を使用しました。

```cpp
// コンテスト後に提出したコード
int main() {
  int h, w, a, h2, w2, b;
  cin >> h >> w;
  vector<vector<int>> A(h);
  rep(i, h) {
    rep(j, w) {
      cin >> a;
      A[i].push_back(a);
    }
  }
  cin >> h2 >> w2;
  vector<vector<int>> B(h2);
  rep(i, h2) {
    rep(j, w2) {
      cin >> b;
      B[i].push_back(b);
    }
  }

  // bit全探索
  for (int i = 0; i < (1 << h); i++) {
    for (int j = 0; j < (1 << w); j++) {
      vector<int> H, W;
      vector<vector<int>> b(h2);
      for (int k = 0; k < h; k++) if ((i & (1 << k)) == 0) H.push_back(k);
      for (int k = 0; k < w; k++) if ((j & (1 << k)) == 0) W.push_back(k);
      if (H.size() != h2 || W.size() != w2) continue;
      else {
        bool flag = true;
        rep(k, h2) {
          rep(l, w2) {
            if (A[H[k]][W[l]] != B[k][l]) flag = false;
          }
        }
        if (flag) {
          cout << "Yes" << endl;
          return 0;
        }
      }
    }
  }

  cout << "No" << endl;

  return 0;
}
```

## 感想
やっぱり本番に練習の100%を出すのは難しいと再認識しました。
とりあえず、典型90問の★2〜3とABC-B問題埋めをやっていこうと思います。
[GCE] VMインスタンスを自動起動・停止させる


Compute Engine（GCE）で、VMインスタンスを自動起動・停止させる手順の覚書き。
いくつか方法がありますが、本手順ではコンソール画面からの設定を実施します。


# 手順

## 1. 権限設定

まず、Compute Engine サービス エージェントに必要な権限を付与します。


(1) Google Cloudのコンソール画面を開き、「IAMと管理」（①） > 「IAM」をクリック（②）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/edc0ce15-18fc-a1ea-9649-b21166ce3a7f.png)

(2) 「IAM」の画面が開いたら、「Google権限のロール付与を含みます」にチェックを入れ（①）、フィルタに「compute-system.iam.gserviceaccount.com」と入力して検索（②）、ヒットしたプリンシパルのいちばん右隣の「プリンシパルを編集します」をクリック（③）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e5f3e6a9-bebe-1345-5d79-e6d53276a26a.png)

(3) ロールのプルダウンから、「Computeインスタンス管理者」を選択し、「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/26a54e98-975c-f756-e714-439633347512.png)

VM インスタンスの起動、停止に必要な権限は以下の通り

|権限 |内容  |
|---|---|
|compute.instances.start  |VM インスタンスの起動をスケジュール  |
|compute.instances.stop  |VM インスタンスの停止 |

上記の権限を持つものであれば、他ロールでもかまいません

## 2. スケジュールの作成

続いてスケジュールの作成を行います

(1) 左メニューから、「Compute Engine」（①） > 「VMインスタンス」（②）の順でクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/48885e51-3dd5-fe79-ee45-9f60172a636f.png)

(2) 「その他の操作」（①） > 「スケジュールの作成」（②）をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/bd1a4c11-20b9-7916-8510-94f486e2c988.png)

(3) 「新しいスケジュールの作成」が開いたら、入力欄に必要事項を入力して、「送信」（⑥）をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/239ea01a-3771-6a4c-5555-bf96d5a7b1ab.png)

うち、上記キャプチャの①～⑤は必須項目です

内容的には以下の通り

|項目名  |内容 |備考 |
|---|---|---|
|名前  |スケジュールに名前をつけます  |キャプチャの①（必須） |
|説明  | スケジュールの説明を入力 |省略可  |
|リージョン  | 設定予定のインスタンスの属するリージョンを選択 |キャプチャの②（必須）   |
|開始時間、終了時間  |開始時間、終了時間を選択  |キャプチャの③（どちらか必須）  |
|タイムゾーン  |タイムゾーンを選択  |キャプチャの④（必須）<br/>*印ついてないですが、必須項目です|
|Initlate date、End date  |スケジュールの開始日、終了日を入力します |未設定の場合は即日適用 |
|頻度  |スケジュールの頻度をプルダウンから選択  |キャプチャの⑤ （必須） |

今回は、毎日22:00にインスタンスを停止する設定にしました
（名前と整合性取れてない点はご容赦を・・）

## 3. VMインスタンスの接続

2で作成したスケジュールに、設定したいVMインスタンスを紐づけます
今回は既存のVMインスタンスにスケジュール設定します

(1) 「インスタンススケジュール」タブをクリックし（①）、作成したスケジュールの名前をクリックします（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/8290e97f-66c5-9369-5c51-1efea17ad805.png)

(2) 「スケジュールにインスタンスを追加」をクリックし、右側に「スケジュールにインスタンスを追加」が出現したら、対象のインスタンスにチェックを入れ（②）、「追加」をクリック（③）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b0fd6c53-6da8-d4d0-1310-917a39f8eba9.png)

(3) 「接続されたインスタンス」に対象のインスタンスが追加されていれば完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b4d6d8f4-1bfe-8d4f-525b-6371481388d6.png)

※実際に起動・停止するまでに数分のタイムラグが生じることがあります
　気長に待ちましょう

# 終わりに

以下「参考」欄のリンク先の通りなのですが、権限設定回りで地味にハマったので、覚書きにしました


# 参考

* [VM インスタンスの起動と停止をスケジュールする |  Compute Engine |Google Cloud](https://cloud.google.com/compute/docs/instances/schedule-instance-start-stop?hl=ja)
* [Compute Engine サービス エージェント - サービスアカウント | Compute Engine | Google Cloud](https://cloud.google.com/compute/docs/access/service-accounts?hl=ja#compute_engine_service_account)
CORSとは

# はじめに

最近、AWSの勉強をしていますが、
S3で`CORS`という用語がでてきたので概要だけ少し調べてみました。

# CORSとは
`Cross-Origin Resouce Sharing`  の略。
異なるオリジン間でリソース（データ）のやり取りをできるようにすること。

# オリジンとは
リソース自身のURLの「スキーム（プロトコル）」「ドメイン名（ホスト）」「ポート」の組み合わせ。

`https://www.example.com:80`を例にすると、
- スキーム = https
- ドメイン名 = www.example.com
- ポート:80

となる。

# 具体例
Youtubeとtwitterを例に考えてみる。

- Youtubeのオリジン
`https://www.youtube.com:80`
- Twitterのオリジン
`https://www.twitter.com:80`

上記の通り、これらは別々のオリジンであり、通常はリソースの共有ができない。
イメージ的には、「TwitterでYoutubeの動画を使ったつぶやきをしたいができない。」みたいな感じでしょうか。
（ブラウザには通常、セキュリティの観点から異なるオリジン間の通信を拒否する仕組みがある。）

この別々のオリジン間でリソースの共有ができるようにする仕組みが`CORS`。

# さいごに

現在の私のレベルだとこれくらいで十分かなと。
実際に利用する機会があって、理解が深まったら、追記していきたいと思います。

# 参考

https://www.youtube.com/watch?v=8fE2TmbPqlU

https://developer.mozilla.org/ja/docs/Glossary/Origin

https://atmarkit.itmedia.co.jp/ait/articles/1311/26/news007.html
/var/log/messagesの日付フォーマットの変更

# 概要
- ラズパイの/var/logm/messegesの日付フォーマットを変更
- 変更前：Aug 13 21:36:37
- 変更後：2022/08/13 22:06:41

# 実行コマンド
````
# /etc/rsyslog.d/にtemplate.confを作成
touch /etc/rsyslog.d/template.conf
chmod 644 /etc/rsyslog.d/template.conf

# 以下を書き込み
$template template, "%timegenerated:::date-year%/%timegenerated:::date-month%/%timegenerated:::date-day% %timegenerated:::date-hour%:%timegenerated:::date-minute%:%timegenerated:::date-second% %HOSTNAME% %syslogtag% %msg%\n"
# 日付をyyyy/MM/ddの形で表示

# rsyslog.confの編集（以下は編集結果）
# diff /etc/rsyslog.conf_org /etc/rsyslog.conf
87c87
<       mail,news.none          -/var/log/messages
---
>       mail,news.none          -/var/log/messages;template

# プロセス再起動
systemctl restart rsyslog
systemctl status rsyslog
````

# 参考サイト
- [syslogのフォーマット変更をしたい](https://qiita.com/goto_yoshiki/items/ddc466bee0607b603954)
AWSクラウドプラクティショナー取得には無料WEB問題集を使おう

# はじめに
私の専門は情報工学ではなく、ましてやクラウドなんて？？？といった状況であったが、私の所属する会社でも昨今はDXという言葉が流行りだし、クラウド活用の動きが始まっている。
しかし、社内でクラウドを理解している人はほとんどおらず、何が何だかわからないまま
「クラウド便利なんでしょ？」「AWSがクラウドで一番流行ってるし、AWSでいいんじゃないか？」
となんとも残念な推進のされ方をしている。

そのためAWSとは何か、またソリューションアーキテクトの方と話をする上で向こうの言っていることを理解できるようにと勉強してみたくAWS資格の中でもエントリーレベルに位置する、
AWSクラウドプラクティショナーの受験をしてみた。

しかし、会社は非IT系ということもあり、業務に関係する資格以外は補助が出ない。
そのため、受験料の１万円は自腹、参考書類も自腹となる。
受験料はどうしようもないが、参考書くらいはなんとかコスト削減をしようと試み、タイトルにもある無料WEB問題集を利用した。

# 使用した参考サイト
タイトルにある無料WEB問題集は以下のサイトである。
https://aws-exam.net/clf/

使用方法も至ってシンプル。とりあえず繰り返し解く、その中でわからない単語はすべて調べる。
紛らわしいところはノートにまとめることも行った。

これだけで、１週間の勉強で合格することができた。CBT形式は好きな時に受験できるのでほんとに便利！

# 最後に
AWS全体の概要を理解することができたので受験してよかったと思っている。
しかしAWSの資格は受験料が高い上に維持費がかかるので、この上位資格を取得したらいらない資格だなとも思った。
Glideで以前作った勤怠確認ツールを改善したい

## 勤怠確認出来るもの、作ってみた結果
はじめまして。小売業の仕事をしています。
小売業ということで、勤務スケジュールがカレンダー通りではなく不定期のため、休みを確認したい事が多いのですが、勤怠の確認のためにはわざわざ会社のPCを起動しなければならず、不便と感じる事が多々あります。
不便さを解決しようと、会社のPCを起動する必要なく勤怠スケジュールを返してくれるLINE Botを以前作成しました。

https://qiita.com/yamakazu443/items/1f0629f0e2f2a7eca36d

このBotの仕組みを簡単に説明すると、日付と勤怠スケジュールを記載したGoogleスプレッドシートを作成し、日付を打ち込むとその日の勤怠スケジュールを返してくれるというものになります。(詳細は上記の記事になります。)

このBotを、同じ会社で働く同期に紹介し、いくつかフィードバックをもらうことが出来ました。
（下記リンク先の②の記事になります。）

https://note.com/yamakazu443/n/n5c04cfdc505d

## 改善策

もらったフィードバックの中で、日付と勤怠を記載したGoogleスプレッドシートの管理が大変そうというものがありました。
・自分だけの勤怠ならまだしも、部署メンバー全員分の勤怠を記載したスプレッドシートを作成するのが大変
・勤怠の変更があった際、スプレッドシートの中身も編集し直す必要があり、わざわざPCで編集するのが手間

そこで、Googleスプレッドシートの編集の手間を少しでも減らすため、Glideを用いてGoogleスプレッドシートをアプリ化し、PCを使わずスマホから簡単に編集出来るようにしてみました。

## 作ったアプリ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">アプリ化（制作時間数分）<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/NBzWETyRhM">pic.twitter.com/NBzWETyRhM</a></p>&mdash; やまかず (@nobita_gkb) <a href="https://twitter.com/nobita_gkb/status/1558418497796841473?ref_src=twsrc%5Etfw">August 13, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

スプレッドシートをスマホから簡単に編集できるようになりました。
![スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728254/41c2abe5-7c8f-71fb-51f5-df6fcf5bfba1.png)
アプリ化した元のシート

## スマホから入れるようにはなったけど、、、
作成したアプリを、フィードバックをくれた会社の同期に試してもらって、再びもらったフィードバックがこちら
・スプレッドシートをPCを介さず、普段使ってるスマホから編集できるのはすごく助かる（PCが職場にしかないため、どこでも編集できるのは大きい）
・部署メンバー全員分の勤怠を記載するのが大変なのは解決してない。シートのscheduleのところに部署メン全員全員の出欠を全部文章で書くのは負担。

## 課題
スプレッドシートの中身をもっと工夫する必要があると感じました。
例えば、縦列にメンバー、横列に日付の表をスプレッドシートで作成し、そこに○か×を書くだけで良いようにするとか、、
まだまだ現場で実装するにはほど遠いです、、、
ここまで読んでいただき、ありがとうございました。
Dockerを使用してGoでMySQLに接続しようと思ったら詰まった話

## 概要

現在**Golang**を学習しています。その中で**MySQL**との接続に詰まってしまったのでその解決方法を共有したいと思います。

## 前提

私は基本的に学習するときはローカルの環境を汚したくないので**Docker**を使用しています。
なので今回もDockerを使用して行います。
なお今回は、Dockerの構成を最低限しか設定しません。

### Dockerfile構成

```dockerfile
FROM golang:1.19.0-alpine3.16
WORKDIR /app
COPY . .
```

### docker-compose.yml構成

```docker-compose.yml
version: '3.9'
services:
  db:
    image: mysql:8.0
    container_name: mysql
    env_file: .env
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DB_NAME}
    volumes:
      - ./mysql:/var/db/mysql
  web:
    build:
      context: .
    container_name: web
    volumes:
      - .:/app
    depends_on:
      - db
volumes:
  mysql:
```

## 詰まった部分

今回詰まったところは、Go側からMySQLへの接続部分です。

下記のように設定ファイルを記載し、`Ping()`を利用し接続を確認しました。

```app/models/base.go
package models

import (
	"database/sql"
	"fmt"
	"log"

	"github.com/soicchi/golang-todo-app/config"

	_ "github.com/go-sql-driver/mysql"
)

var Db *sql.DB

var err error

func init() {
	connectionInfo := fmt.Sprintf("root:%s@/%s", config.Config.Password, config.Config.DbName)
	Db, err = sql.Open(config.Config.SQLDriver, connectionInfo)
	if err != nil {
		log.Fatalln(err)
	}

	err = Db.Ping()
	if err != nil {
		log.Fatalln(err)
	}
	log.Println("データベース接続完了")
}
```

上記のコードを呼び出すために簡易的に下記のように`main.go`からグローバル変数`Db`を呼び出してみます。

```main.go
package main

import (
	"fmt"

	"github.com/soicchi/golang-todo-app/app/models"
)

func main() {
	fmt.Println(models.Db)
}
```

すると下記のようなエラーが返ってきました。

```terminal
2022/08/13 12:17:15 base.go:30: dial tcp 127.0.0.1:3306: connect: connection refused
```

どうやら接続できていないようです。

## 解決方法

下記の記事を参考にするとDockerを使用している場合、接続情報に`docker-compose.yml`で定義したコンテナ名を入れないといけないらしい。

https://stackoverflow.com/questions/57566060/panic-dial-tcp-127-0-0-13306-connect-connection-refused

つまり、先ほどの`app/models/base.go`を下記のように変更しないといけません。

```app/models/base.go
package models

import (
	"database/sql"
	"fmt"
	"log"

	"github.com/soicchi/golang-todo-app/config"

	_ "github.com/go-sql-driver/mysql"
)

var Db *sql.DB

var err error

func init() {
	connectionInfo := fmt.Sprintf("root:%s@tcp(mysql)/%s", config.Config.Password, config.Config.DbName) // root:%s@/%s → root:%s@tcp(mysql)/%sに変更
	Db, err = sql.Open(config.Config.SQLDriver, connectionInfo)
	if err != nil {
		log.Fatalln(err)
	}

	err = Db.Ping()
	if err != nil {
		log.Fatalln(err)
	}
	log.Println("データベース接続完了")
}
```

もう一度`main.go`を実行してみると

```terminal
2022/08/13 12:19:39 base.go:32: データベース接続完了
&{0 0x40000a8058 0 {0 0} [0x4000226000] map[] 0 1 0x400008e0c0 false map[0x4000226000:map[0x4000226000:true]] map[] 0 0 0 0 <nil> 0 0 0 0 0xbf060}
```

無事接続されました。

## まとめ

今回は**Docker**を使用したことで接続に手間取ってしまいましたが、
それでも**Docker**はかなり便利なので手放せないですね（笑）
間違った指摘があるようでしたら、是非ともご指摘いただけると幸いです。
最後まで閲覧していただきありがとうございました。
Solidityで「お薬手帳」を作る -事前準備編- Block 1

# はじめに
初投稿かつプログラミング完全未経験で緊張しています、
Takeno Kinoko です。

- 本記事では Smart Contract を記述するための準備作業を紹介します。
- 主題の件を思い立った理由について
先日コロナにかかったのですが、病院で「お薬手帳はお持ちですか？」と聞かれました。
初めてのことでなんじゃそりゃ？と思いましたが、どうも飲んでいるお薬を記録する手帳で、
普段から何かしらの薬を飲んでいる人に対して飲み合わせの悪い薬を処方しないようにするためのものらしいです。
\
””手帳持っていくのだるいし、なくしたら終わりやん””
そう思い、自分のスマホやPCが壊れてもデータが消えない Ethereum の分散台帳上に記録すればいいじゃないか！
と考えた次第です。
※すべては自分の Solidity スキルの向上のためです

# 事前準備
環境構築は以下のYouTube動画を参考にしました。
英語ですがとても分かりやすいです。
長めの動画で、私も最後のほうは飛ばしてしまいましたが、宝くじを作るところまでは一通りやってみるといいかもしれません。

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

- brownie のインストールでハマった人へ
	1. 以下のChainlinkのサイトを参考にして`C++ build tools`をインストール
	参考URL： https://chain.link/bootcamp/brownie-setup-instructions
	2. setuptoolsをアップグレードする
	`pip install --upgrade setuptools`
	
	3. その後、brownie を実施する
	`pip install eth-brownie`
	
	4. ターミナル上の以下の記載が黄色くなっているはずで、そこの近くに書かれているPathをシステム環境変数に設定する
		`Consider adding this directory to the PATH, or if you prefer to suppress this warning, use --no-warn-script-location`
		上記記載が出ない人は下記のコマンドで一度アンインストールしてから 4 を実施すると黄色いパスが出てくる...はず
		`pip uninstall eth-brownie`

# 作業フォルダーを作成する
私は上の動画に出てくる Visual Studio Code を使用しています。
以下のコマンドで作業フォルダーを作成します。

```powershell:例
PS C:\Users\taken\Documents\demos> mkdir medicineNotebook
PS C:\Users\taken\Documents\demos> cd medicineNotebook
PS C:\Users\taken\Documents\demos\medicineNotebook> brownie init
```

- 各種コマンドの意味

| コマンド | 意味 |
| :--- | :--- |
| mkdir ～ | 例の場合、demosフォルダに「medicineNotebook」のフォルダを作成する |
| cd ～ | 例の場合、demosフォルダーにある「medicineNotebook」に入る |
| brownie init | 例の場合、brownieを使って開発するためのフォルダが自動で作成される |

### Brownieとは？
https://eth-brownie.readthedocs.io/en/stable/
上記のサイトに以下の記述があります。
>Brownie is a Python-based development and testing framework for smart contracts targeting the Ethereum Virtual Machine.

”EVMをターゲットにした、pythonベースのスマートコントラクト開発＆テスト用フレームワーク” のようです。

# フォルダ構成の確認
ここまでで、作業フォルダーは以下のようになっているはず。（2022/08/13現在）

```
demos/
 └─ medicineNotebook/
    ├─ build/
    │  ├─ contracts/
    │  ├─ deployments/
    │  └─ interfaces/
    ├─ contracts/
    ├─ interfaces/
    ├─ reports/
    ├─ scripts/
    ├─ tests/
    ├─ .gitattributes
    └─ .gitignore
```

# Solidity Scriptファイル ( 拡張子 .sol ) の作成
- Smart Contractを記述するための .sol ファイルを作成する。
medicineNotebook 直下の contractsフォルダに”medicineNotebook.sol”というファイルを作成する。
※ build フォルダ内の contracts には絶対に作成しないこと。

# いったん休憩

今回は Smart Contract を書き始めるまでの準備作業を紹介した。
ここで休憩。次回へ続く
ReactでのCSSの書きかた4選！

## はじめに
ReactのCSSの書き方が複数個あったので、自分ようにまとめます。

### ①各タグにそのままstyle属性を適用

```
 <Button style={{ color:'inherit' }}>LOGIN</Button>
```


### ②CSSオブジェクトをあらかじめ定義しておく

```
export const App () =>{
  const buttonStyle={
    color:"inherit"
  };

  return (
  <>
    <Button style={ buttonStyle }>LOGIN</Button>
  </>
  )
}

```

### ③MaterialUIやReact-BootstrapといったライブラリやCSSフレームワークを用いる方法
今回は、MaterialUIを用いたCSSの編集を紹介します。

まずは、muiライブラリをダウンロード
```
npm install @mui/material @emotion/react @emotion/styled
```

Muiのcolorに関しては、色の指定方法が2種類あります
#### 1種類目(直接指定)

```
<Button variant="contained" color="inherit">LOGIN</Button>
```

#### 2種類目(sxプロパティを用いた指定)
Buttonでcolorプロパティの値に"primary", "inherit"などBootstrap等でよくもちいられる色の文字列にするとエラーが出てしまう。
その場合、以下の様に色を指定することができる。
```
<Button variant="contained" sx={"background-color: blue;"}>LOGIN</Button>
```

### おわりに
初心者なので、間違っている点も多々あるかと思います。
間違った箇所など指摘がありましたら、よろしくお願い致します。

#### 参考文献
https://mui.com/

https://lightgauge.net/language/javascript/mui-button-color-change

### 追記：CSS Modulesという書き方が一般的だったみたいです、、、
ちゃんと調べて後ほどまとめます。。
[Unity]Playmode tintでUnityの実行画面に色をつけてみた

こんにちは！
突然ですが、皆さんは「unityの実行中にコードを変更してしまった経験」はありませんか？
実行中に変更したものは停止後元に戻ってしまうので、たくさん変更して後で気づいた時の絶望感えぐいですよね😅
そうならないためにも！！
今回はタイトルにある通り、Playmode tintでUnityの実行画面に色をつけてみようと思います！
めちゃ簡単なので、ささっとやってしまいましょう✨

# Step1 Unityでプロジェクトを開く
まずは、Unityでプロジェクトを開きます。

# Step2 Preferenceを開く
写真のように、左上に表示されているUnityからPreferenceを選択して開きます。
![スクリーンショット 2022-08-13 0.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782402/ec1bf0f2-6500-ce77-5116-aef880762cea.png)

# Step3 Playmode tintの色を変える
Preferenceが開けたら、Analysis→Colors→General→Playmode tintと探していきましょう。
写真のように好きな色を選択してみましょう！(デフォルトだとグレーだと思いますが自分はグリーンにしてみました👏)
※勝手に保存されるので、特にセーブとかは意識しなくてOKです。

# Step4 確認してみよう
ここまで完了したら、Preferenceを閉じて実行してみましょう！
写真のように色が変わっていれば成功です✨
![スクリーンショット 2022-08-13 0.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782402/60818c6b-5fdd-43bf-e913-fe9399792b5f.png)

# 最後に
ということで今回は、Playmode tintでUnityの実行画面に色をつけてみました。
実行中と停止中の画面をしっかり区別して開発していきましょう！
最後まで読んでいただきありがとうございました😊
SSHポートフォワーディング


## SSH ポートフォワーディングとは

https://e-words.jp/w/%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0.html

>ポートフォワーディングとは、IPネットワーク上のある機器が、自らのIPアドレスのTCPやUDPの特定のポート番号への通信を、別のアドレスの特定のポートへ自動的に転送すること。また、ネットワーク機器などの持つそのような機能。

> SSHの機能を用いて外部の機器との間で暗号化された通信経路を用意することを特にSSHポートフォワーディングという。


https://qiita.com/mechamogera/items/b1bb9130273deb9426f5

> localの8081番にアクセスするとremoteからアクセスできるtarget:80に繋げる例
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/62248526-a7bb-20cc-67da-e20541216495.png)



https://gigazine.net/news/20210209-ssh-tunnel/

localhost にアクセスすると AWS の EC2 を踏み台にして RDS にアクセスする。みたいなことができるらしい。

通信経路を確立した状態で、

> ```:通信経路確立
> $ ssh -fNC \
> -L 13306:ssh-test-rds.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 \
> -i ~/.ssh/wakuwaku-ssh-test.pem \
> ec2-user@xxx.xxx.xxx.xxx
> ```

ローカルのポートにアクセスすると RDS にアクセスできる

> ```:通信経路確立時に利用したローカルホスト上のポートにアクセス
> $ mysql -usampleuser -psamplepass  -h 127.0.0.1 --port=13306
> ```


## 転送の種類

https://gigazine.net/news/20210209-ssh-tunnel/

### ローカルポート転送

> 青色のローカルサーバーから、SSHサーバーを経由し、オレンジ色のリモートサーバーへポート転送を行う
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/014ab3b5-a199-887d-518c-7d0f83693a5a.png)

### リモートポート転送

> ローカルポート転送とは逆に、リモートサーバーからローカルサーバーにSSHトンネルを確立する
> インターネット上にないサーバーにSSHトンネルを「引き込む」場合などに利用されます。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/57f741fe-5664-4394-9197-a3570efc8dbb.png)

### ダイナミックポート転送

> ローカルサーバーのSOCKSプロキシからSSHサーバーを経由し、他のサーバーと通信を行うことができる仕組み。SSHサーバーの固定IPアドレスを送信元IPアドレスとしてローカルサーバーで利用したい場合などに利用されます。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/02e0a92b-34e1-4ca2-1b2c-ee392f560966.png)


## ローカルポート転送を試す

### AWS の環境を構築

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/51b5e62e-5905-5191-862d-cc507cdfb46b.png)


- public サブネットに EC2 インスタンスを作成
    - ssh で接続できることを確認
- private サブネットに RDS を作成
    - EC2 の mysql クライアントからアクセスできることを確認
    - ローカルからはもちろんアクセスできない


```
ssh -L 13306:database.xxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 \
-i ~/.ssh/aws-handson-key.pem \
ec2-user@xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com
```

```
mysql -uadmin -p -h 127.0.0.1 --port=13306
```

接続できた!!

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
Docker環境でbinding.pryを使用→binding.pryで処理が止まらない

# 概要
pry-byebugを使ってデバッグしようとしたところ、binding.pryで動作が止まらずデバッグできなかった。
# 目次
 - [環境](#環境)
 - [現状](#現状)
 - [対策](#対策)
 - [結果](#結果)
 - [おわりに](#おわりに)
 
# 環境
Ruby 3.1.2
Rails 7.0.3
# 現状
このようにデバッカーの入力待ちにならず、HTMLが生成されてしまいます。

```
my_app $ docker attach my_app_web_1
Started GET "/boards/new" for 172.18.0.1 at 2022-08-13 11:38:59 +0000
Processing by BoardsController#new as HTML
  Rendering layout layouts/application.html.erb
  Rendering boards/new.html.erb within layouts/application
  Rendered boards/new.html.erb within layouts/application (Duration: 1.6ms | Allocations: 870)
  Rendered layouts/_header.html.erb (Duration: 0.0ms | Allocations: 17)
  Rendered layout layouts/application.html.erb (Duration: 30.0ms | Allocations: 4102)
Completed 200 OK in 34ms (Views: 32.3ms | ActiveRecord: 0.0ms | Allocations: 4455)
```


# 対策
調べたところ、binding.pryで止めるためにdocker-compose.ymlの設定をいじらないといけないと判明。
app:またはweb:のところに以下のコードを追加するだけです。
```ruby
tty: true
    stdin_open: true
```
全体的にこんな感じ
```ruby
web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/my_app
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true
```
# 結果
```ruby
Started GET "/boards/new" for 172.18.0.1 at 2022-08-13 11:54:18 +0000
Processing by BoardsController#new as HTML

From: /my_app/app/controllers/boards_controller.rb:9 BoardsController#new:

    6: def new
    7:   @board = Board.new
    8:   binding.pry
 => 9: end

[1] pry(#<BoardsController>)>
```
無事に止まりました。
# おわりに
自分と同じ状態で困ってる方の役に立てれたらうれしいです:relaxed:
【Windows】Node.js のバージョンアップ

Node.js のバージョンアップをしたときの記録を書きます

## 環境
OS: Windows 10
Node.js: v14.16.1

## Node.js バージョン確認方法
- PowerShellまたはコマンドプロンプトを開く
- `node -v`コマンドを実行する
```
PS C:■■■■■■■■■> node -v
v14.16.1
```

## 手順
- Node.jsの公式サイトにアクセスする
    - https://nodejs.org/ja/download/
![スクリーンショット 2022-08-13 205028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/1a3285bf-0995-3109-1edd-27b6609a062b.png)

- Window版のインストーラをダウンロードする
    - 私はnode-v16.16.0-x64.msi をダウンロードしました
- インストーラを実行する
- インストールが完了するまで待つ
- インストールが完了したら、Node.js のバージョンを確認する
```
PS C:■■■■■■■■■> node -v
v16.16.0
```

## 余談
- いくつかのサイトを見るとn  というバージョン管理ツールを使った方法が出てきますが、Windowsでは使えないようです
DjangoのMVTモデル

# MVTモデルとは？
実態はMVCモデルとほぼ同じ感じ。
MVCモデルの方がよく聞くので、なんか違うのかと思ったけど呼び方違うだけって認識しても良さげだった。
・Model
・View
・Template
の3つで構成される。
## Model
WebアプリとDB間のやりとりを担う。
## View(MVCで言うController)
全体制御。
リクエスト内容に対応する処理を書く。
## Template(MVCで言うView)
WebアプリのUIを担う。
HTMLに変数入れたりできるらしい。
# 実際の開発において
MVTを知った上でDjangoの構成も知っておくと良い。

Djangoは、
①プロジェクトフォルダを作成し、Webアプリが動作する基盤を作る。
②プロジェクト内にアプリケーションフォルダを作成し、開発に必要なプログラムを組み込んでいく。このアプリケーションが、MVTの処理していく。つまり、Djangoはアプリケーション毎にMVTコンポーネントが用意され、プログラムが構築される。
React Native ExpoをCloud9上に構築

## 概要

手元の環境がChromeOSだったが手っ取り早くReact Native Expoの環境を作成したかったので実施。

- Cloud9上にReact Native Expoの環境を構築
- 手元のiOS、Android端末からExpo Goで疎通確認


## 前提条件

- AWSアカウントを準備済みであること

AWSの設定等は細かく記載していません。また、expo関連の記載も詳細には記載していません。

本記事記述時に取得した各パッケージのバージョンは以下の通りです。

```
ec2-user:~/environment $ nvm -v
0.39.0
ec2-user:~/environment $ npm -v
8.11.0
ec2-user:~/environment $ expo --version
6.0.2

```

## Cloud9の準備

### EC2インスタンスの作成

詳細は割愛。マネジメントコンソールから作成。


## サンプルアプリの準備

### expo-cliの準備

npmでexpo-cliをインストール

```
npm install -g expo-cli
```

### サンプルアプリの作成

expo-cliを使用して新規アプリを作成
今回は`blank (TypeScript)`を指定して作成した

```
expo init sample-application
```

### サンプルアプリの起動

```
cd sample-application
expo start
```

上記でMetro Bundler Serverが起動する
あとはExpo Goから接続するだけ・・・なんですが、問題が2つ。

## 問題と対策：２つ

### 問題1 ネットワークの問題

これはまぁ、当たり前といえば当たり前。
Cloud9上に起動したサーバなので、外部からのアクセスを受け付けられない。

AWSマネジメントコンソールから、EC2＞セキュリティグループの設定を確認し、
expoで使用するポート(`19000 - 19006`など)を開放する。
今回は、各端末が作業しているPCと同じWi-fi接続のため、接続元にマイIPを指定することで、
単一のグローバルIPに対して、接続を許可した。

また、ElasticIPを作成、割当し、外部公開のIPアドレスを固定で設定した。

### 問題2 QRコードがうまく表示されない問題

これはちょっとふふっwってなりましたが、
Cloud9のWebコンソール上でのQAコードの表示が・・・
AAみたいになってました。(バージョンとか設定とか・・・？詳しくは調べてないですが)

```
ec2-user:~/environment/sample-application (master) $ expo start

This command is being executed with the global Expo CLI.
To use the local CLI instead (recommended in SDK 46 and higher), run:
› npx expo start

Starting project at /home/ec2-user/environment/sample-application
Starting Metro Bundler
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ ▄▄▄▄▄ ██▄▄ ▀▄██ █ ▄▄▄▄▄ █
█ █   █ █▀▄  █▀ █▄█ █   █ █
█ █▄▄▄█ █▄▀ █▄ ▄█▀█ █▄▄▄█ █
█▄▄▄▄▄▄▄█▄▀▄█ █▄▄█
█ ▄▀▀▀ ▄▄▀                ▄ 
█ ▄  ▀▀▄ ▄▄▀ ▄█▀ ▀▄██▄▄█▄ █
█ ▀████▀ █                █　
█ ████ ▄▀▀ ██▀██▄ ▀▄  ▄   █
█▄█▄█▄▄▄█▀  ▄▄█
█ ▄▄▄▄▄ █  █▀▄▄▄█ █▄█ ███ █
█ █   █ ██▄▄▄ ▄█▄▄▄  ▄ ▄▀▀█
█ █▄▄▄█ █▀█▄█ ███ ▄▀▀██▄█ █
█▄▄▄▄▄▄▄█▄▄█▄██▄▄▄█▄▄▄███▄█

› Metro waiting on exp://xxx.xxx.xxx.xxx:19000
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)

› Press a │ open Android
› Press w │ open web

› Press r │ reload app
› Press m │ toggle menu

› Press ? │ show all commands

Logs for your project will appear below. Press Ctrl+C to exit.
Started Metro Bundler
```
※一部マスク、編集済み。

Expo GoアプリやQAコードリーダーでは表示できないので、
上記の表示内の`exp://xxx.xxx.xxx.xxx:19000`を別途、QAコード生成サービスを使用して
QAコードを生成し、そちらを読み込むことで対応しました。

## 最終的に

生成したQREコードを使用して、各端末からExpo GoでMetoroBundleServerに接続し、
`expo init` で生成したアプリケーションに接続することができました。
手間を減らして売上をあげよう！

# 紙で集約＞エクセル入力＞メール送信という流れから卒業したい！
こんにちは！東海地方の某スーパーで働いています。
商品訴求を担当し、毎月社内販売を行っているのですが、この集約が地味にめんどくさいのです。
手作りのチラシ兼注文書を用意し期限を決めて集約し、エクセルへ入力、そしてメールで発注（または製造依頼）という作業を行っています。「そんなの欲しい人がGoogle Formに入力すればいいじゃん」と思う方！スーパーの従業員には、スマホに慣れていてもパソコンの前に座ることにハードルがある方も少なからず存在するのです。

今回、私が毎月苦痛に感じながら行っている作業の軽減を目的に、Glideを使って予約アプリを作ってみました。弊社がFC契約を結ぶ「ミスタードーナツ」の予約販売を想定しています。
※TABなどの用語はGlide上の表記で統一しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/8d9f5048-bd6b-7a4a-e4b4-218a2abf81f8.png)
# 使用ツール

+ [Glide](https://www.glideapps.com/templates)

+ Google Spread Sheet(以下GSS)
# 作成フロー
#### 1. GSSにTABで必要な項目を入力します。

その際に、項目に応じたデータをあらかじめ入力しておくと実装の際に表示されるためわかりやすくなります。また、今回予約注文という性質上USERのメールアドレス項目は必須です。理由は後述しますが、これが分からなくて少し悩みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/18499e8a-a8c2-209c-2951-b3327b5bf1c8.png)
#### 2. 日付、部門は選択としたのでシートを別に用意しています。
こちらも項目の行を忘れずに入力します。名前はUSERが自分で入力します。ご利用の説明をいれたかったので、専用にシートを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/b198c524-251d-1dac-5d4e-b17dafa9f0f8.png)
#### 3. ご利用説明と注文画面はこんなイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/c93dd3b8-bb22-be4f-d31b-04ae7251408c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/49c4fc53-fb19-2d9a-1736-908d3508054d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/520dcebd-9c7a-3846-4f1b-0acf96ffa6cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/17edeba4-78df-e786-fa77-81813e022840.png)
#### 4. USERが入力するとGSSに反映されます。これを、ドライブ内で発注先（または製造先）の担当と共有します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/416019fa-d51d-cb75-b02d-b950bf6491e6.png)
# USERレビュー
店舗の従業員と関係者にこのアプリを使用してもらい、レビューをもらいました。

+ 背景が黒くてかっこいい！(背景を黒くしたつもりはないのですが。。。)(社員)
+ 使いやすそう。(ほとんどのパートの意見)
+ 使いやすいと思う。(社員)
+ <font color="red">**全員の注文履歴が見えるし、編集もできてしまうのは問題点(社員)**</font>
:::note warn
**そうなんです。そのままだと注文履歴に異なるUSERの履歴がすべて見えてしまう上に他人が編集までできてしまいます。**
:::
# 改善
話が前後しますが、最初にGSS項目でアドレスを入力しているのは、アプリにサインインの際に聞かれるアドレスとUSERを紐づけて、USERのみの情報を表示させるためです。
参考記事を見たら簡単ですが、見つけられずに少し苦労しました(汗)

#### 1. 対象のTABのListからOptionsを選択し、フィルターの設定をします。
GSSに入力したアドレスとサインインのアドレスが一致している場合に表示されるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/f73dba61-f8f5-577f-d543-7148a0a0305e.png)
#### 2.公開前にSetting画面からPrivacy画面に移り、GSSにアドレスが入力されている人のみがサインインできるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724492/011e4a5c-7d7e-aea0-5bdc-f4adf00041f2.png)
#### 参考記事

https://note.com/shinya_matsui/n/n5fb2ab9d997b


# まとめ

USERのアドレスを事前に入力する手間はあるものの、一度入力してしまえばあとは商品だけ変えていけばよいというメリットがあります。商品の販売情報も事前にメールしておけば、私が何もしなくても売れている。。。なんて世の中そんなに甘くないのは重々承知。それでも、少しは手間が省けそうです！
AWSで作ったインスタンスを調べたい


### やりたいこと
とあるAWS環境全体で、自分が作ったインスタンスを削除したい

### 前提
会社から貸与されたアカウントであり、使えるサービスに制限がある。

### 方法
Cost Explorerでタグ検索し、IAMユーザごとの料金を表示させることで、なんのサービスに課金されているかを調べる。

### 手順
1. マネジメントコンソール右上、AWSアカウントが表示されているところをクリック
1. 請求ダッシュボードをクリック
1. Cos & Usage Reportsをクリック
1. 「その他のレポート」から、「AWS Cost Explorerを使用してコストと使用状況を分析する」をクリック
1. 右側にある「フィルター」から、タグ>aws:createdBy>自分のIAMユーザ名をクリック。フォーマットは　IAMUser：（アカウントID or アクセスキー）：ユーザー名
1. 表示されたグラフの上部にある「グループ化の条件」で「サービス」をクリック
1. 表示されたグラフと凡例をもとに、使っているインスタンスを確認する


### 補足
もっといい検索方法あれば教えてくだしゃい・・・
請求ダッシュボード＞コスト配分タグで検索しようとしましたが、アクセス拒否になって検索できませんでした。。

「これお金がかかってなかったら表示されないんじゃない・・・？」という疑問を胸に、私はamazonの奥地へと・・・
【Linux】ファイルがどこにあるか分からなくなった場合

所定のフォルダに存在するはずのファイルがない場合ですが、findコマンド等でファイルの検索を行う事があります。
今回は後輩君から「ファイルがない」と相談を受け、調査を行いました。
その手順についてを記載しておこうと思います。

とりあえず、自分の目でファイルが本当に存在していないかのを確認します。
txtベースのファイルという事をお伺いしたので、*.txtでファイル有無の確認を行います。
いくつかファイルが見つかりましたが、目的のファイルではありませんでした。

```
[root@localhost test_01]# pwd
/home/test_01
[root@localhost test_01]# ls *.txt
01_test.txt  02_test.txt  03_test.txt
```
txtベース以外の情報をヒアリングします。
何時頃に作成/更新をあったか分かるか？と伺ったところ、今さっきに更新をかけたばかりという事が分かりました。

findコマンドでルートディレクトリから検索する事にします。
現在分かっている情報はtxtベースのファイルである事/今さっきに更新をかけたという事なので、それらを反映して検索を行います。

まず検索箇所は、「.(カレントディレクトリ)」で指定します。
-nameオプションでファイル名の指定を行います。「*.txt」で指定しました。
-mminオプションで時間の指定を行えます。「-30」を指定しました。
-30を指定した場合は30分以内に更新が入ったファイルの検索を行います。
‐をつけずに30で指定した場合は30分前に更新が入ったファイルを検索します。

何かそれらしきものが出てきたので、お伝えすると該当するファイルである事が分かりました。
意図せずにrootで作業を行っていた事が要因となるそうです。(rootでログイン出来るのは良くないですが)

```
[root@localhost test_01]# cd /
[root@localhost /]# pwd
/
[root@localhost /]# find . -name "*.txt" -mmin -30
./root/memo.txt
```

findコマンドを知っていても、意外と更新時間等で検索出来る事を知らない人もいると思います。

以上、何かの参考になれば幸いです。