OmniAICreator/Qiita-1.07M huggingface dataset:
TableauのカスタムSQLでエラーが出た話


A5で動いたものがTableau Prep（2021-3）のカスタムSQLで動かなかったのでした。
なんでだろうね。

# エラー版
```
SELECT
 h.hoge AS ほげ,
 g.huga AS ふが
FROM 
 SCH.HDATA  AS 'h',
 SCH.GDATA  AS 'g'
;
```

# 解消版

```
SELECT
 h.hoge  ほげ,
 g.huga  ふが
FROM 
 SCH.HDATA  h,
 SCH.GDATA  g
```

セミコロン抜かして、ASとクォーテーション抜かしました。
なぜクォーテーションつけてたのかは知らない。過去の自分のみぞ知る。
ちなみにFROM句のAS入れるとエラー出ますが、SELECT句の方は入れても問題なかったです。
なんで？？？


# 参考
https://oshiete.goo.ne.jp/qa/6024633.html
https://deamu.hatenablog.com/entry/20140908/1410163461
【AWS】Elastic Beanstalkで作成されたS3バケットを削除する場合の注意点

## はじめに
検証でAWS ElasticBeanstalkでアプリを立てた後、整理のため削除した。
S3を確認したところバケットも作成されていたので、削除したところ、アクセス権限がないため削除できなかった。
改めてElasticBeanstalkの作成プロセスを理解するために備忘録として残しておきます。
![スクリーンショット 2022-05-10 9.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/9e5e9820-ed9c-87e5-161c-5ea11de75461.png)

## 結論
S3バケットが作成されていることを知らなかったのが原因でした。
ちゃんと作成プロセスを把握しよう。

## ElasticBeanstalkの作成プロセス
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.S3.html)の記載によると、ElasticBeanstalkを作成したらS3バケットが環境を作成した各リージョンに対して作成されるようです。

## ElasticBeanstalkの削除プロセス
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.S3.html#AWSHowTo.S3.content)の記載には、自動的に削除されるものと手動で削除しないといけないものがあるようです。
大部分の関連オブジェクトなどは削除されるのですが、不要なストレージコストを避けるのであれば中身を確認してしっかり削除することをオススメします。


## バケットポリシーを確認する
S3バケットが作成されると同時にバケットポリシーも付与されます。
バケットの誤った削除を防止するための目的でポリシーが適用されているようです。
[Elastic Beanstalk Amazon S3バケットの削除](https://docs.aws.amazon.com/ja_jp/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.S3.html#AWSHowTo.S3.delete-bucket)

以下、付与されていたバケットポリシーです。
s3:DeleteBucketに対するアクセス拒否が入っていますので、このアクセス権限を削除するかバケットポリシーを削除しましょう。
これでバケットは削除できました。

※{AWS AccountId}はAWSアカウントに置き換えて読んでください
```
{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "eb-ad78f54a-f239-4c90-adda-49e5f56cb51e",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::{AWS AccountId}:role/aws-elasticbeanstalk-ec2-role"
			},
			"Action": "s3:PutObject",
			"Resource": "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-{AWS AccountId}/resources/environments/logs/*"
		},
		{
			"Sid": "eb-af163bf3-d27b-4712-b795-d1e33e331ca4",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::{AWS AccountId}:role/aws-elasticbeanstalk-ec2-role"
			},
			"Action": [
				"s3:ListBucket",
				"s3:ListBucketVersions",
				"s3:GetObject",
				"s3:GetObjectVersion"
			],
			"Resource": [
				"arn:aws:s3:::elasticbeanstalk-ap-northeast-1-{AWS AccountId}",
				"arn:aws:s3:::elasticbeanstalk-ap-northeast-1-{AWS AccountId}/resources/environments/*"
			]
		},
		{
			"Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b",
			"Effect": "Deny",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:DeleteBucket",
			"Resource": "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-{AWS AccountId}"
		}
	]
}
```
エンジニアに営業力は必要か？


## 営業力とは？
営業力とは様々な能力の複合的なものなので、明確にコレと定義するのは難しいものですが、
この記事では、営業力に含まれるであろう「関係構築力」「提案力」「傾聴力」に絞って、エンジニアに営業力が必要かどうかを考えていきたいと思います。

## 関係構築力
関係構築力とは、言ってしまうと社交術ですが、
言わずもがなクライアントと商談する際のコミュニケーションは超重要です。

特に雑談力があるとクライアントとの信頼関係の構築において武器になります。

雑談によって相手との心理的障壁を取り払うことで、システム開発においても、
ある程度の融通が効いたり、こちらの提案も通りやすくなるでしょう。

当然ですがクライアントとの関係が作れると、次の仕事にも繋がりやすくなります。

少し話は逸れますが、
[SOFT SKILLS](https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA/dp/4822251551)の第4章でも社交術の重要性が説かれていますので、興味ある方は是非。

## 提案力
提案力は「企画立案力」と「プレゼン力」に大きく分けられます。

物事がより良い方向に進むための方法を考えるのが企画立案力で、
そしてそれを相手が正しく理解でき、納得してもらえるように提案するのがプレゼン力です。

エンジニアの提案力は、普段から上流工程で顧客折衝を行うエンジニアや、フリーランスとして個人で活躍されている方ほど重要だと認識されているかと思います。

もしエンジニアが仕様や金額、納期と言った内容を直接クライアントと取り決めなければならない場合、
提案力が無いと、相手の言い分でこちらにとって不利な条件を飲まされてしまう事態にもなりかねません。

理想として、「不利な立場からでも、ブレずにこちらの提案を通す」ということができればベストだと思います。
ちなみに有利な立場から行うのは、「提案」でなくただの「要求」になることが多いので
提案力は身につかないと思ったほうがいいです。

## 傾聴力
これは主にチームリーダーが行う、1 on 1やヒアリング等で求められる能力かと思います。
またクライアントの課題を把握し、提案に活かせる内容を検討するために
相手の考えや要望を訊く、傾聴力が大切です。

有名なものにカール・ロジャーズ氏が提唱した積極的傾聴があります。

>ロジャーズの3原則
>1.共感的理解 (empathy, empathic understanding)
>相手の話を、相手の立場に立って、相手の気持ちに共感しながら理解しようとする。

>2.無条件の肯定的関心 (unconditional positive regard)
>相手の話を善悪の評価、好き嫌いの評価を入れずに聴く。相手の話を否定せず、なぜそのように考えるようになったのか、その背景に肯定的な関心を持って聴く。そのことによって、話し手は安心して話ができる。

>3.自己一致 (congruence)
>聴き手が相手に対しても、自分に対しても真摯な態度で、話が分かりにくい時は分かりにくいことを伝え、真意を確認する。分からないことをそのままにしておくことは、自己一致に反する。

若干内容がコンサルっぽい感じにもなりますが、上記を意識するだけで、
クライアントやヒアリング相手から信頼を得ることができると思います。
ここでは特に書きませんが、傾聴のテクニックもたくさんあるので、興味があれば調べてみてもいいかもしれません。

## まとめ
エンジニアとして営業力は必須かというと必ずしもそうではないでしょう。
コードを書くだけであれば、別になくても全然問題ないと思います。

しかしTwitterなどで営業力が無いエンジニアが、いざ独立しようとして失敗したというケースもよく見受けられます。
安易に営業代行やエージェントに頼るのも手ではありますが、
エンジニアでもできれば身に着けておきたい能力と言えるかもしれません。

とくにこれから上流工程を目指すエンジニアや、フリーランスとして独立したい方(ちなみに私はエンジニアとしてはフリーランスで活動したことはないです)、
キャリアアップのチャンスも増えるかと思います。

どなたかの参考になれば幸いです。

## 注記
この記事はフリーランスを推奨しているわけではないです。

## 参考

https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA/dp/4822251551


https://kokoro.mhlw.go.jp/listen/listen001/
VirtualBoxをアップデートしたらNS_ERROR_FAILUREになった

MacにVirtualBoxを入れて CentOS 上でWeb開発を行なっているのですが、時々VirtualBoxのアップデートを促されます。

少し時間があったのでアップデートをしたところ、NS_ERROR_FAILUREエラーが出て仮想マシンが起動しなくなるというのが何度かありました。

MacOSのセキュリティが高くなってきているので、新しいアプリケーションをインストールするといくつかのセキュリティ設定を加えないといけないようで、下記のサイト（英語サイト）をもとに対応をしました。

https://www.mytecbits.com/apple/macos/virtualbox-error-ns_error_failure-0x80004005


# 対応内容概要
書いてある対応策は以下のことを一つずつ試してみるというものです。
1. Macの再起動
1. SIPを有効にする
1. 環境設定でデバイスへのアクセス権許可設定をし直す
1. 環境設定でVirtualBoxのアプリ実行権限を設定し直す
1. VirtualBoxをアップデートする
1. VirtualBoxに関する設定を削除して再インストールする

# 結果
私の場合は、VirtualBoxのアプリ実行権限の設定をし直すところまでを全て確認、設定し直すことで仮想マシンが正常稼働しました。
VirtualBoxのアップデート時にはおそらく今後も同じ対応が必要になりそう。
connpass 本文に張り付ける画像の保存用にAWS S3を使う




connpass の本文画像を張り付けるには、画像の保存先のURLが必要です。

connpass本文のMarkdown の書き方

```
![イメージ](画像ファイルのURL)  
```


その画像ファイルをAWSのS3に保存する方法を、毎回忘れるので、自分用メモとして記録します。

## S3でバケット作成
AWS S3 > バケットを作成

バケット名入力、
リージョン選択

このバケットのブロックパブリックアクセス設定
「パブリックアクセスをすべて ブロック」のチェックを外し、
「パブリックアクセスのブロックをすべてオフにすると・・・」のチェックを入れる。

[![Image from Gyazo](https://i.gyazo.com/7880ebe5882877ee797f7ba0d3e2bc08.png)](https://gyazo.com/7880ebe5882877ee797f7ba0d3e2bc08)


バケットができる。

## バケットポリシーの編集

アクセス許可　＞　バケットポリシー　を編集

ポリシーを以下のように設定する

```
{
   "Version":"2012-10-17",
   "Statement":[{
    "Sid":"PublicReadForGetBucketObjects",
         "Effect":"Allow",
      "Principal": "*",
       "Action":["s3:GetObject"],
       "Resource":["arn:aws:s3:::[バケット名]/*"
       ]
     }
   ]
 }
```

以上で、
S3のこのバケットに直接ウェブから画像をアップロードできて、外部からもこのバケットに保存した画像を参照することができます。
Kali Linux2022.1 でハッキングラボをつくってみる7　Metasploitable2をハッキングする6 Unreal IRCのバックドアを利用

# はじめに
「ハッキング・ラボのつくりかた」のp.398-407を参考にしています。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# Unreal IRCのバックドアに接続する
ポートスキャンの結果から、unreal IRCのデーモンが稼働していて、ポートが開かれていることがわかっている。
どのようなバージョンが使われているか調べるために、IRCクライアントのhexchatでアクセスしてみる。
```
sudo apt install hexchat
hexchat
```
hexchatを起動した後の設定
「追加」をクリックして、"Metasploitable 2"を追加する。

「編集」をクリックして、"Metasploitable2のIPアドレス/6667"を「サーバー」欄に追加する。（ここでは、IPアドレスは"192.168.56.5"である。）

「接続」をクリックする。チャンネルには参加しないようにする。
バージョンは、3.2.8.1だと判明した。
Exploit DBで検索すると、[UnrealIRCd 3.2.8.1 - Backdoor Command Execution](https://www.exploit-db.com/exploits/16922)という脆弱性があり、Metasploitでexploitが用意されていることが判明。
```:msf >
use exploit/unix/irc/unreal_ircd_3281_backdoor
set rhost 192.168.56.5ばｃ
run
```
しかし、うまく行かなかった。「ペイロードが選択されていない」と出力されるが、適当なペイロードを設定しても同様だった。
![VirtualBox_kali-linux-2022.1-A_payload_has_not_been_selected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/512da58e-5c1f-0094-c450-6f582e2e9fad.png)

# おわりに
~~エラーの解決は今後に持ち込みます・・・~~
[追記:2022/09/14]
2022/09/14現在でも解決せず。

参考にしたもの

「ハッキング・ラボのつくりかた」(IPUSIRON著)

https://www.exploit-db.com/exploits/16922
【Django+Nginx】静的ファイルを配信する時のNginx の設定ファイルのlocationの書き方

環境
```
Django4.0
ubuntu 22.04 LTS
```

この記事では, 以下のプロジェクト構成を前提とします.
```
myProject
|  --manage.py
|  --db.sqlite3
|
|  --config
|    |--init.py
|    |--settings.py
|    |--...
|    
|  --static
|    |--css
|    |  |--...
|    |--image
|    |  |---...
```

# Djangoの設定ファイル
まずはDjangoの設定ファイル(settings.py)を見ていきます.
以下の3つの設定を書きます.
値は例です.

**STATIC_ROOT**
python manage.py collectstaticコマンドを打った時の静的ファイルの格納場所となる絶対パス

```:settings.py
STATIC_ROOT = '/var/www/myProject/static'
```

**STATIC_URL**
STATIC_ROOTに格納されている静的ファイルを参照するための値で，静的ファイルのURLに含まれる.
例えば，STATIC_URL='/static/'で，/css/style.cssファイルを配信する時，URLは
http\://example.com/static/css/style.css
となる．
```:settings.py
STATIC_URL = '/static/'
```

**STATICFILES_DIRS**
プロジェクト内の静的ファイルのディレクトリ

```:settings.py
STATICFILES_DIRS = [BASE_DIR / 'static']
```

# Nginxの設定ファイル
次にNginxの設定ファイルを/etc/nginx/sites-available/に作ります.ファイル名をconfig(設定ディレクトリ名)とします.
```:config
server {

        略

        location /static/ {
               root /var/www/myProject;
        }

        略

}
```
locationの横の/static/はSTATIC_URLと同じ値にします.
rootの右のパスはSTATIC_ROOTの/staticを抜いた値と同じにします.

locationの/static/はURLと比較される部分です.
例えば, リクエストのURLがhttp\://example.com/static/image/one.pngだった場合, URLの/static/の部分がlocationの/static/と合致するのでこのブロックが実行されます. そして, rootの右のパス(/var/www/myProject)の後ろに/static/image/one.pngが追加されます.
つまり, /var/www/myProject/static/image/one.pngとなり目的の静的ファイルが配信されます.

# 参考資料
[現場で使えるDjangoの教科書](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Django-%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%80%8A%E5%9F%BA%E7%A4%8E%E7%B7%A8%E3%80%8B%EF%BC%BB3-2-LTS-%E5%AF%BE%E5%BF%9C%E7%89%88%EF%BC%BD/dp/B09K235CTP/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1HO91QWLY1JH3&keywords=Django+%E6%95%99%E7%A7%91%E6%9B%B8&qid=1652128496&sprefix=django+%E6%95%99%E7%A7%91%E6%9B%B8%2Caps%2C193&sr=8-1)
[Django 公式ドキュメント](https://docs.djangoproject.com/en/4.0/ref/settings/#static-files)
[NginxのBeginner’s Guide](http://nginx.org/en/docs/beginners_guide.html)
[How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu 22.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-22-04)
ターミナル上・コマンドでササッと翻訳

ターミナル上でササッと翻訳する方法について、`trans`コマンドのご紹介です。

# transコマンド

https://github.com/soimort/translate-shell

インストールは適当なパッケージマネージャ使って。そのほかのインストール方法については上のGitHubページを参照。

# transコマンドの使い方

## 英語から日本語

```
trans en:ja philtrum
```

単純に英単語を渡すだけで日本語に翻訳してくれる：
![philtrum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/50483f39-8ab4-8d92-5b4b-1ceaaf05ad2d.png)

## 日本語から英語

```
trans ja:en 人中
```

## 読み上げ
`-p`：英文と翻訳文を読み上げる
`-speak`：英文だけ読む

（もちろん英語以外の外国語も可能です。ここでは分かりやすく”英文”としています。）

## 言語コード一覧表示

```
trans -R
```

訳したいファイルを指定

```
trans -i <ファイル名>
```

結果を別のファイルにアウトプットしたい場合は`-o <ファイル名>`と指定。

## 文をそのまま引数に渡して翻訳

次のように`-j`オプションを指定すれば、それらを一文として訳してくれる。
![jop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/dc0a7496-170b-264d-9f77-a9767d3b60c6.png)

`-j`オプションを指定しない場合：
![noj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/c105ac91-c78f-5ce1-79a5-1fdd8fc800d5.png)

## 日本語（翻訳結果）だけ表示

`-b`オプションを指定
![2bop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/5c1a8445-6b87-ee0e-02d2-9df32e328548.png)

## 何語か？

```
trans -identify <謎の言語>
```

それが何語かを教えてくれる。
![whatlang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/1132864b-c49d-eeca-bc71-0ac57367d466.png)

## 日本語の発音（ローマ字）を非表示

```
-show-translation-phonetics n
```

と指定すればよい。
[iOS]CircleCIで No Space Left on deviceエラーに遭遇した場合の対処法


# はじめに

CircleCI導入検証を進めていたところ、表題のエラーに遭遇しました。

docker利用時の対処法に関する記事はいくつかあったものの、iOSの情報を見つけるのにちょっと手間取ったので書いておきます

# エラー内容

```bash
/usr/local/share/chruby/chruby.sh: line 50: cannot create temp file for here document: No space left on devic
```

# 解消した方法

- エラー発生原因は文字通り、容量が不足していることのようなので、不要なファイル群を削除し容量を確保します
- 外部記事を参考にしつつ、下記commandを定義しました
    - ※ 適宜必要なディレクトリは削除対象から外す

```bash
remove-unnecessary: # 不要なファイル群を削除 
    steps:
      - run: sudo rm -rf /Library/Developer/CoreSimulator/Profiles/Runtimes/
      - run: sudo rm -rf /usr/local/android-sdk-linux
      - run: sudo rm -rf /usr/local/go
      - run: sudo rm -rf /usr/local/android-ndk
      - run: sudo rm -rf /home/ubuntu/nvm
      - run: sudo rm -rf /home/ubuntu/.android
```

# 参照

[Freeing up Disk Space on macOS](https://support.circleci.com/hc/en-us/articles/360037142773-Freeing-up-Disk-Space-on-macOS)

[MacOS Xcode 10 claims device is out of space](https://discuss.circleci.com/t/macos-xcode-10-claims-device-is-out-of-space/25331)
Micro:bitで土壌水分を測る

# はじめに

土壌水分センサーはMicro:bit用のものが販売されています。
私は手に取ってみてがっかりしました。
センサーがFR-4プリント基板で電極は金鍍金した銅板。
土の直流抵抗を測るものでした。


# 問題点
- 電極の銅が溶け出し、土壌を汚染する。
- 電気分解が起きて、酸素塩素水素が発生する。
- 分極が起き測定値は不安定になる。
- たとえ防水してもこういった問題があるので、1時間の授業中に「実験？」するのが関の山である。
- 土壌が汚染されるのでたとえ収穫しても食べられない。

# 環境
この解説は次の環境で検証した。
- micro:bit v1 v2.2
- MakeCode
- Windows 11

# 目標
- ケースに入れ防水さえすれば実圃場で測定。
- 市販測定器と同等の安定性。
- Micro:bitに外付けする部品は最小限とする
- あるものを使って安く仕上げる

# 材料
- Micri:bit v1
- 同エッジコネクタ
- 25V0.1μF積セラコン(c1)
- 1kΩ 1/8W x2 (うち一本は試験用)(R1)
- マイクケーブル MVVS 2S (センサー用長さ適宜）
- ステンレス釘Φ2.7x50mm　x2
- 無洗浄型高性能やに入りハンダ Superot RA SWA-12

- UVレジン
- PETボトルの蓋

## センサーの製作
- 無洗浄型高性能やに入りハンダ Superot RA SWA-12でSUS釘頭を予備半田する。
- 説明書きには無洗浄でよい旨の記載があるが、汚い。アルコールで拭いた方が良い。

![代替テキスト](https://sat02pap002files.storage.live.com/y4mQK5w7zBThsxyiF6VZQvltUWt-N2_15U66q4XAzW1VbpAFprX7WMHJYYNh85jyp0hGSwH6o9ADAP0yS5AIgfZmQJC-OnkLNL8YGZYc47sExY5h9IeaM4-z3l2Isizy-iOtMTKQh56vlBk_OSr4uJTYHxeCGI2Kp8eK5vDAgQn3wkfHgSAB3ZR2zyeTRt6ccCf?encodeFailures=1&width=1322&height=885)

- ケーブルを剥いて芯線を出し、半田付けする。
- PETボトルキャップにΦ2.6の穴を20mm間隔で2個開ける。
- ケーブルを付けた釘を圧入する。

![代替テキスト](https://sat02pap002files.storage.live.com/y4mnP2QNs5uJ8jYMn8J8Up8NUtrjocw6xBlxUNHEEwJi0IySXfqc7bIeOUM9bLtNppvF3jD-g308mWhKB9eoE3FagaEYyrVd77ZmhxaDpUjaN4br6MP-rMAcxFpyJrk4GWuNHZwmx-bD4HqzULyI8xR0cEIXm8-fIzKdsjKXhbaJuQOjKonEuabkoAemZUu9SvBNFWvzP-Oaex56WsAna1CMAfWuWt3Izu9rRqhobabWok?encodeFailures=1&width=1322&height=885)

![代替テキスト](https://sat02pap002files.storage.live.com/y4mWTwETkZ8MMjAuvpJQwDGmFipUcVH_LFmlYf33WtCkBy2FWkByU4G-9qKRqUnkh2pJwSmwU3ZwfLXLHS8iCb7bQwSEI0uesd-vRng86ooru7cFoUUzCyE5NOEKJRXiN0hYgERFee88yj-8I1YimDDXNH47qWRLFoFW1RonXGf7oSbACijUfroNZbKHbUQ1aE8mivbCky25qXjxqgXZRmLroJrukzBu3L3-SEz8FWLWKw?encodeFailures=1&width=1322&height=885)

- UVレジンでモールドし、UV UEDでキュアする。
- ケーブル反対側も剥いておく

# Micro:bit付加回路

- PO - P1 にR1 1kΩを付ける
- P2 - GNDにC1 0.1μFを付ける

- P1にセンサーの片側を付ける
- P2にもう片側を付ける
- GNDにシールドを繋ぐ
![Qiita](https://sat02pap002files.storage.live.com/y4muvw9R8WYHq79uSf2RJnX-j94c88ViOQ0zpWxLSmBQrclmGrjBFiRxBzkk8LpV0PjvKOCdetCz6Oo6HxBbAa4TNSROD4JWvGcQ01BN1cfC8x1Nzd3gxWdrt7YE9lWnSG46cvdbcL4Z9EHOGmGGKKY3zWSIp0bCP7MZSgITEZc5tDOuhlILmbUVXFoa6B8TqyM?encodeFailures=1&width=1322&height=885)

# プログラム
下記からダウンロードしてください。
https://makecode.microbit.org/_20Ri8MdXzFdu

![Qiiia](https://sat02pap002files.storage.live.com/y4mU6W9yCRHsCDDc9OH9mHAnIhxiEO9-mQYISOAz3YYYCJNiobkjT5sbKjTLRtGu5z5Kgm9ucSkDV2wuPvSWU0eH3xIsdMiwFHoPrqWVt58C49UFRb-oCtorfzMbxqG0eh2QwGqoTCiK2ntRTD88ZWZBAajy-zyuuGtSMRjQzcx5k-V7XK4ivMaoLcF14XVUXovWw6-bBO1haPnjfBcmA0uFKXRlpf6FtPtWq_zFbxgMts?encodeFailures=1&width=1472&height=828 )


# 回路図とシミュレーション

![Qiita](https://sat02pap002files.storage.live.com/y4msxnQ3s_jsFtG0dOAyW0BK44UJmwzOYxSYfNc7TuGUB0o3M1uHE7B5O_CfQyP5f-BJUTvOfByt9nGhG8RBsGrz9naX_FCIz8iQnOgnO79T81TUVgIckSkV2WSVz__RCmcazrnvTEqKFPkCwU94QUhhqcz4rQtS4_pmx7vr1X-mlHvjopIlyvtQdkmiqST_qX0uApZW59MBtPCncxSsY9YgDNC3DTu8zWj0dOjAPPL5qY?encodeFailures=1&width=1472&height=828)
Geocoding.jp API を使ってみる

住所文字列（東京都新宿区西新宿二丁目８番１号など）から緯度経度を求めることをジオコーディングと言います。ジオコーディングのサービスはいろいろありますが、その中で[Geocoding.jp API](https://www.geocoding.jp/api/)を使ってみました。

## Geocoding.jp API とは

URL は https://www.geocoding.jp/api/ です。個人の方が運営しているサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/f1bccd12-3848-3314-6b98-eca1264fd240.png)

「Geocoding.jp APIについて」をクリックすると使い方などが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/51b59130-86c8-c53c-596a-0bbaff9b3bb8.png)

無料で利用可能ですし、 API キーも必要ありません。

重要なのは「検索の頻度を、10秒に1回程度に抑えてください。」です。あくまでも個人の方が運営されているサービスであることに注意しましょう。

## 使ってみる

とりあえず使うだけなら、ウェブのフォームに住所文字列を入れて「GPS座標検索」をクリックすればOKです。結果として XML が返ってきます。

測地系は WGS84 です。tokyo97風も可能ということですが、"風"ということですので WGS84 から計算で求めているのだろうと思われます。

まずフォームに東京都庁の住所である「東京都新宿区西新宿二丁目８番１号」を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/1e105a08-397a-2aed-4cb7-5607cf2ecc2f.png)

「GPS座標変換」をクリックすると、ジオコーディング結果が XML で返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/16418d62-149e-a601-bc5f-700cf9c3f53f.png)

緯度 35.688408, 経度 139.692005 が返ってきましたので、Google マップで確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/a0bbc3cc-ab4d-2d2b-af6d-66064d1d27b3.png)

ちゃんと東京都庁になっていますね。

## 使い勝手など

ジオコーディングに失敗するとエラーが返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/eea02acd-7098-e93a-dd1c-b03b9f70051c.png)

「東京都新宿区西新宿二丁目８番１号」「東京都新宿区西新宿2丁目8番1号」「東京都新宿区西新宿2-8-1」はどれも同じ緯度経度を返してくれますので、住所の揺らぎには結構対応してくれます。

ここまでフォームから使ってきましたが、もちろん API としてプログラムからも使えます。PHP でサンプルコードを書くと以下のようになります。

```php
<?php
$geocode = simplexml_load_file("https://www.geocoding.jp/api/?q=" . urlencode("東京都新宿区西新宿二丁目８番１号"));
if($geocode && property_exists($geocode, "coordinate")) {
  $latitude = $geocode->coordinate->lat;
  $longitude = $geocode->coordinate->lng;
  print "$latitude, $longitude\n";
}
sleep(10);
```
Summer22のでのエラー


あちゃー、Sandboxがバージョンアップしてますねぇ。早速バグ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/284ee44f-f225-35eb-58f2-ef451fdcb211.png)


+ [Summer22のサンドボックスでのエラー](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDAnT)

言語設定見たいです。
新しいICUロケールを有効にして、提案された手順を実行しましたか？。　と回答されている模様。

既知の問題に出た 2022/05/11
[複数のエンティティにアクセスしているときにUIに「誤ったロケール情報が提供されました」というエラーが表示される「ユーロ」を含むユーザーのロケール](https://trailblazer.salesforce.com/issues_view?title=user-s-locale-which-contains-euro-giving-errors-incorrect-locale-information-provided-in-ui-while-accessing-multiple-entities&Id=a1p4V000002aKI4)

回避策
可能であれば、ユーザーのロケールが「フランス語（フランス、ユーロ）」に設定されている場合は、ロケールを「フランス語（フランス）」として使用できます。ロケールドイツ語（ドイツ、ユーロ）の場合と同様に、ドイツ語（ドイツ）を使用できます。

+[Hi Am getting this error whenever am clicking on the opportunity and accounts objects. Can Any one pls help appreciated](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000H1lWk)
+[Error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDCDeSAP)

+ [How to resolve - We can't open this flow right now. Please try again. Error ID: 230479222](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDAmzSAH)
+ [The type for the input parameter "Picklist 1 Required" doesn't match the type for the assigned value.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDBSlSAP)
+ [子供から親への挑戦を伝える](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H1nY8)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/496989ea-14f8-753a-17e3-8ef2daa888a1.png)

------------------------------------------------------

+ [レポートタイプフィルターはどこにありますか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H2Bhj)

この機能はクローズドベータ版であり、アクセスするにはSalesforceに連絡する必要があります。リリースノートにそれが記載されていないのは謎です。（いいえ、それは実際には謎ではありません。Salesforceです。）
pandasのデータ読み込みで「Initializing from file failed」というエラーが出てしまった時の対処法[anaconda] 

# はじめに
初投稿
いつもお世話になっているので、ド素人のメモとしてなるべくわかりやすくミスったとこをまとめます。

# 背景
「python実践データ分析100本ノック（秀和システム）」において、1-1の最初のcsvデータファイルの読み込みで「Initializing from file failed」が発生し読み込めなかった。

# 対策
csvファイルの中に日本語が含まれているためと記載あり
pandasのアップデートで解決するとのこと
https://qiita.com/gdofrank/items/ffeb750569b6bc42d799

JupyterNotebookを使用しており、anaconda環境のpandasアップデートの必要あり。
https://qiita.com/saspy/items/a9a66d510e180ed8d326
長いこと他のパッケージもアップデートしていないので、
Anaconda　Promptから

```
conda update --all
```

でanacondaにあるパッケージを全部アップデート使用してアップデート
（この時にupdateをupdataにして、updateの間違いやろとずっと怒られてました。笑）

# 結果
20分ぐらいかかったが、アップデートが完了した。
メソッドまとめ　第一弾

メソッドまとめ

まずは数値クラスから見ていきましょう。

〜〜数値クラスのメソッド〜〜

数値.round 四捨五入
数値.floor 切り下げ
数値.ceil  切り上げ
数値.truncafe 切り捨て
数値.zero?　０かどうか確かめる
数値.odd?　奇数かどうか確かめる
数値.even?　偶数かどうか確かめる
文字列.to_i　数値に変わる
数字.to_s 文字列に変わる 
（?がつくと真偽値を返します。）

```
num = 7.77

num.round => 8
num.floor => 7
num.ceil  => 8
num.trancafe => 7
0.zero? => true
```




次は文字列クラスのメソッドです。

〜〜文字列の演算式〜〜

```
"abc" + "xyz" => "abcxyz"
"abc" * 3 => "abcabcabc"
"abc" << "xyz" => "abcxyz" //+との違いは元の変数の中身も+をしたものになる
"aaa@aaa.com" =~ /@/ => 3 //=~は調べたい変数がどこにいるのかを示してくれる。
"abc".size => 3  //文字列の数を数える
"abc".length => 3　//文字列の数を数える
```

```

str = "abcde"
str[3] => "d"  //変数[数字]でその数字の文字を取り出すことができる
str[3] = "z" => "abcze"　//代入することができる
str[0..2] => "abc"
str[0,3] => "abc"

//〜〜間違いやすいメソッド〜〜
"abcde".index("de") => 3
"abcde".delete("cd") => "abc"
"abcde".delete("ca") => "bde"
"abcde".chop => "abcd"  //最後の文字を消すことができる
"abcd/n".chomp => "abcd" 改行を消せる

str = "ababab"
str.sub(/ab/, "xy") => "xyabab" //始めに一致した値を入れ替えることができる
str.gsub(/ab/, "xy") => "xyxyxy"　//一致した値を全て入れ替えることができる
```

型変換について見ていきましょう。
```
"aa bb cc".split => ["aa", "bb", "cc"]  //文字列から配列に変換することができる
"aa,bb,cc".split(",") => ["aa", "bb", "cc"]  //引数を渡して、その引数の所で文字列から配列に変換する。


array = ["aa", "bb", "cc"]
array.join => "aabbcc"  //配列を文字列に変換することができる
array.join(" ") =>"aa bb cc" 　//引数を指定することで、文字列で区切る際に見やすくなる。

"abc".upcase => "ABC" //小文字を大文字に変換する
"ABC".downcase => "abc"　//大文字を小文字に変換する
"abc".reverse => "cba"　//文字の向きを逆にする
"abcde".slice(2..3) => "cd"　//指定したか箇所の文字を取り出す
" abc ".strip => "abc"　//前後の空白を取り除く
```
STM32L010のI2Cの速度を変える


x Mbed2リビジョン125


目的
低速または、高速のI2Cが使いたい



![o_con415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/547e0e61-4bb6-fa37-d29d-e4a92421d626.jpeg)


![o_con414.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9f72bd9d-9194-54aa-165c-ba9cfa5d400a.jpeg)


![o_con416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f5d6ffd1-d87f-96ec-4007-99b89f20e945.jpeg)


https://qiita.com/caa45040/items/5032e6905c9425f41495


資料


https://os.mbed.com/users/yasuyuki/notebook/I2C/



https://os.mbed.com/users/yasuyuki/notebook


```c++


//i2c_frequency_010

#include "mbed.h"

I2C i2c(PA_10, PA_9); //010

char data_read[8];    //i2cバッファー

int main() {

    i2c.frequency(400000);

    while(1){

        data_read[0]='0';
        i2c.write(0x80, data_read, 1); //wait_ms(1);

    wait_ms(1000);

    } // while

} // main


//容量削減
void error(const char* format, ...){}





```
STM32F767でソフトウェアI2Cで遊ぶ　(100KHz)(マスター)



目的
I2C-USART用
低電力液晶等


![o_con412.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/15086fda-b4f8-ebbf-f1e1-c146c1808e40.jpeg)



![o_con413.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a76bc469-3b89-4b33-eccc-ed3f3b4dcc5b.jpeg)




イメージです。

-368


![o_con368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/28fc701e-99c2-6474-73cf-3fbe9820b3d5.jpeg)


使った I2C-USART-USBコンバーター
STM32G031のデバッグ用に1カ月ぐらい掛けて作った。
ほぼ、輸送時間で深川?から香港までが異常に時間が掛っていたみたい。


https://qiita.com/caa45040/items/5032e6905c9425f41495



プログラム



```c++




//soft_i2c_test_767_1

#include <Arduino.h>


//A5
#define SCK_0_HIGH()  digitalWrite(A5, HIGH)
#define SCK_0_LOW()   digitalWrite(A5, LOW)

//A4
#define SDA_0_HIGH()  digitalWrite(A4, HIGH)
#define SDA_0_LOW()   digitalWrite(A4, LOW)
#define SDA_O         A4

// 1000us   1kh
//  100us  10kh
//   20us  50kh
//   10us 100kh
#define myDelay()  delayMicroseconds(10);

int soft_i2c(char add_p, char data_p) {

  int ii;

  //待ち
  SDA_0_HIGH();
  SCK_0_HIGH();
  myDelay();
  myDelay();
  myDelay();

  //START
  SDA_0_LOW();
  myDelay();
  SCK_0_LOW();
  myDelay();

  for (ii = 0; ii < 8; ii++) {
    SCK_0_LOW();
    if ( ((add_p << ii) & 0x80) == 0 ) {
      SDA_0_LOW();
    } else {
      SDA_0_HIGH();
    }//endif
    myDelay();
    SCK_0_HIGH();
    myDelay();
  }//for

  //ack
  SCK_0_LOW();
  SDA_0_HIGH();
  myDelay();
  SCK_0_HIGH();
  myDelay();

  for (ii = 0; ii < 8; ii++) {
    SCK_0_LOW();

    if ( ((data_p << ii) & 0x80) == 0 ) {
      SDA_0_LOW();
    } else {
      SDA_0_HIGH();
    }//endif

    myDelay();
    SCK_0_HIGH();
    myDelay();
  }//for

  //ack
  SCK_0_LOW();
  SDA_0_HIGH();
  myDelay();
  SCK_0_HIGH();
  myDelay();

  //STOP
  SCK_0_LOW();
  SDA_0_LOW();
  myDelay();
  SCK_0_HIGH();
  myDelay();
  SDA_0_HIGH();
  myDelay();

  return (0);

}//soft_i2c


void setup() {

  pinMode(A4, OUTPUT_OPEN_DRAIN);
  pinMode(A5, OUTPUT_OPEN_DRAIN);
  digitalWrite(A4, HIGH);
  digitalWrite(A5, HIGH);

}//setup


void loop() {

  soft_i2c(0x80, '0');

  delay(1000); //1秒の待ち

}//loop




```
100日後くらいに個人開発するぞ！day021

## 今日もHTML＆CSS初級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/87f6c6a9-cba6-a85d-9158-50d3e6c5b5f4.png)

２度目のHTML＆CSS初級編が修了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/d325eda4-5cc6-715f-d75f-2eb0771ed237.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/4f1268ff-a718-c8af-49af-8b1d61efd684.png)


## 今日の備忘録


### 入力欄を作る要素
- input要素：入力された１行のテキストを受け取る要素
- textarea要素：入力された複数行のテキスト入力を受け取る要素

### 送信ボタンの作り方
- 送信ボタンはinput要素を用いて作る
    - type属性を指定して入力する内容の種類を選べる
        - submitを指定すると送信ボタンになる（テキストはデフォルトで「送信」になる）
            - 例：`<input type="submit">`
        - value属性を指定して表示されるテキストを変更できる
            - 例：`<input type="submit" value="送信">`

### 複数のセレクタに同じCSSを指定する方法
- 複数のセレクタに同じCSSを指定するには複数のセレクタをコンマ(,)で区切ることで同じCSSを適用できる
    - 例：`input,testarea{border:3px solid #ff0000}`
【Next.js】ESlintとPrettierの導入方法

## ESlintとPrettierを導入する方法
### Next.js のプロジェクトを作成する
ディレクトリを作成し、ターミナルで`npx create-next-app app_name`を実行します。
```:ターミナル
$ npx create-next-app app_name --ts
```
すると以下のようにファイルなどが作成されます。
![image220509_033202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/acfcadee-4d7d-9529-4c96-e186da2851a6.png)

`pages`と`styles`ディレクトリを`src`ディレクトリを作成してそこに移動します。

移動後は以下のようになります。
![98B22D7A-81B9-4322-AFBC-4F915F29E1D7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d9ede515-39cb-6c1b-c391-8d86917e25ff.png)


### Path aliasを設定する
`tsconfig.json`を以下のように変更してPath aliasを設定します。
```tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    // 以下path aliasの設定のため追記
    "baseUrl": "./",
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}
```
上記のようにすることで`import`の際に相対パスではなく以下のように記述できるようになります。
```sample.tsx
import sampleModule from '@/modules/sample';
```

### ESLintの対象を変更する
ESlintの対象を`src`ディレクトリに限定するため`package.json`を以下のように追記します。
```package.json
{

   "scripts": {

    "lint": "next lint --dir src",
    "lint:fix": "yarn lint --fix"
  },

}
```

### Prettierを導入する
以下のコマンドを実行して必要なパッケージをインストールします。
```:ターミナル
$ yarn add -D prettier eslint-config-prettier
```
インストールが完了したらESlintと干渉しないように`eslintrc.json`を編集します。
```eslintrc.json
{
  "extends": [
    "next/core-web-vitals",
    "prettier"
  ]
}
```
次にPrettierの設定をするために`.prettierrc.json`ファイルを作成します。
```.prettierrc.json
{
  "trailingComma": "all",
  "semi": false,
  "singleQuote": true,
  "jsxSingleQuote": true
}
```
設定可能なオプションについては以下のページをご参照ください。

https://prettier.io/docs/en/options.html

以上でESLintとPrettierが使用できるようになります。

```:ターミナル
$ yarn lint
✔ No ESLint warnings or errors

$ yarn format
.eslintrc.json 24ms
next-env.d.ts 173ms
next.config.js 6ms
package.json 3ms
postcss.config.js 1ms
src/pages/_app.tsx 7ms
src/pages/api/hello.ts 5ms
src/pages/index.tsx 7ms
tailwind.config.js 2ms
tsconfig.json 3ms
```
2022/5/10主にITとかセキュリティの記事

富士通製のセキュリティ帯域制御製品に深刻な脆弱性
https://www.security-next.com/136318

「OpenSSL」に4件の脆弱性 - アップデートが公開
https://www.security-next.com/136315

メールアカウントに不正アクセス、スパムの踏み台に - サエラ薬局
https://www.security-next.com/136309

シスコの複数製品に緊急の脆弱性、ただちにアップデートを(5/6)
https://news.mynavi.jp/techplus/article/20220506-2338810/

ロシアのウクライナ侵攻に関連したサイバー攻撃でアルコール流通一時停止(5/8)
https://news.mynavi.jp/techplus/article/20220508-2340744/

健康アプリ続々、期待と不安　効果の適正表示へ国が指針(5/7)
https://www.nikkei.com/article/DGXZQOUA31CV80R30C22A3000000/

議員投稿を転載 告訴検討…箕面市 不正アクセスの可能性(5/7)
https://www.yomiuri.co.jp/local/kansai/news/20220507-OYO1T50005/

クラウド国産化・・なんて夢のまた夢(5/8)
https://www.orangeitems.com/entry/2022/05/08/120000

TikTokは、いかに社会に影響を及ぼしているのか　 「見えないアルゴリズム」を解き明かす研究者たちの挑戦(5/8)
https://www.sankei.com/article/20220508-2UDSSHGJIBO7NEHP2HKG7S3XIU/

「Slack」で通知が届かない問題を解決するには(5/7)
https://japan.zdnet.com/article/35187013/

WindowsのACL（Access Control List） エクスプローラーが扱うACL(5/8)
https://ascii.jp/elem/000/004/090/4090885/?rss

ビットコイン法定化から半年、エルサルバドルの今。システム不具合続出も大統領は強気(5/8)
https://ampmedia.jp/2022/05/08/bitcoin-el-salvador/

【Windows 10】必要なくなったソフト(アプリ)をアンインストールする方法(5/8)
https://gunosy.com/articles/efqbP

Google WorkspaceのSMTPリレーサービス、スパマーによる悪用が急増(5/8)
https://www.zaikei.co.jp/article/20220508/671157.html

今こそ経営とIT一体化　返済の努力、継続を(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/042700290/042700003/

JAL・日清・ヤフー…取り組みは数年越し(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/042700290/042700002/

国内企業で「脱PPAP」の動き広がる　受け取りを今後「禁止予定」が3割超(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/042600113/

オンラインでのファイル共有にリスク　相次ぐ情報漏洩を止められるか(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/042800076/

東数西算（The East-data-west-computing Project）(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/042800114/

技術的負債の「正体」　適正水準で破産を防ぐ(5/9)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/042700290/042700001/
AWS SAA(ソリューションアーキテクト アソシエイト)試験対策

SAA取得まで

# ロードマップ
- 開始日：4/10
- 受験日：GW内
- 合格達成に必要な学習：
  - Udemy模擬試験
    - AWS認定テキストで各サービスが実現できる要件とその際の制約事項を把握した後は、本講座の演習を通じて、問題文から満たすべき要件を読み解く練習をすれば十分合格できる
    - 試験①②を7〜80％以上取れるまで繰り返す。
- 予想学習時間：70H（基本知識：ハンズオン（動画＋テストで45）、模擬試験15、当記事アウトプット10）
- 学習スケジュール：
GWまでに基本知識を詰める。資格取得のみでなくAWS学習が目的なので、ハンズオン（動画＋テストで45H）で実施。
まず1日1時間でハンズオンの想定時間通り進むか確認する。
（ハンズオンなので想定より遅れる可能あり。その場合はGWを犠牲にする。。→2倍速で見れるから思ったより余裕だった、が、GW前に残業祭りであまり進まず・・）
Udemy模擬試験をGWに2日間でやる。
ちなみに会社の想定学習時間は3〜40H。自分はまだ経験浅いのとクラウド実務経験ない、
かつハンズオンでの学習を行うので70Hと少しバッファを積んで見積もる。

## 試験概要（求める能力）
顧客要件に基づくアーキテクチャ設計原則を使ったソリューション定義。
PJのライフサイクルを通じたベストプラクティスに基づく実装ガイダンスの提供。
推奨：1年間のAWS実務経験

# 試験を終えて
先日受験し結果は合格。
所感として多分点数はギリギリな気がする。
確実にコレだ！って思える解答がそんなに選択できなかった。
難易度は問題自体は模擬試験より少し難しい程度。しかし選択肢は本試験の方が絞りやすい。
結果としては良い感じに同レベルくらいかなと。
最大のミスは、学習スケジュールが思い通りに行かなかったこと。
理由は想定よりGW前の仕事が忙しかったこと。ハンズオンが後半につれ煩雑化し時間かかったこと。
GW中に完了させるためにハンズオンの後半はカットして、模擬試験3周やるつもりだったところ1〜2周にした。
今回の模擬試験はAWS CLFの時とは違って、単語を覚えるというより内容を理解する必要があったかので解説読めば2周目でほぼ満点取れるようになった。それでなんとか当日に間に合わせた。。
ハンズオンに関しては計算が甘すぎた。
ハンズオン資料は45Hあり、2倍速で進めて短縮化しようとしたが、ハンズオン部分の大半は倍速じゃとても追いつけないし、そもそも解説者が早口でハンズオン以外の部分でも倍速はできなかった。
アウトプットも自分なりにまとめていたが、資料で既にベストにまとめられていたので、
後半からは資料をそのままコピーしてまとめた。（なので今回アウトプット記事は非公開設定）
今思えば、資料を利用しないのは、かなり効率の悪いアウトプット方法だった。
これに気づいてかなり時間短縮ができた。
あと、リスケとバッファの重要性を思い知らされた。
次はもっと余裕を持って見積もってリスケを挟みつつマイルストーンを設置したりしてみるか。
AtCoder Beginner Contest 250 参戦記

# AtCoder Beginner Contest 250 参戦記

## [ABC250A - Adjacent Squares](https://atcoder.jp/contests/abc250/tasks/abc250_a)

4分半で突破. 書くだけ.

```python
H, W = map(int, input().split())
R, C = map(int, input().split())

result = 0
if R != 1:
    result += 1
if C != 1:
    result += 1
if R != H:
    result += 1
if C != W:
    result += 1
print(result)
```

## [ABC250B - Enlarged Checker Board](https://atcoder.jp/contests/abc250/tasks/abc250_b)

9分半で突破. 書くだけ.

```python
N, A, B = map(int, input().split())

l = ('.' * B + '#' * B) * N

for i in range(N):
    for _ in range(A):
        if i % 2 == 0:
            print(l[:N * B])
        else:
            print(l[B:(N + 1) * B])
```

## [ABC250C - Adjacent Swaps](https://atcoder.jp/contests/abc250/tasks/abc250_c)

10分で突破. *x* のある位置を毎回探していると *O*(*NQ*) = 4×10<sup>10</sup> になって TLE するので、*x* の存在位置も管理するだけ.

```python
from sys import stdin

readline = stdin.readline

N, Q = map(int, readline().split())

a = list(range(N))
b = list(range(N))
for _ in range(Q):
    x = int(readline()) - 1
    i = b[x]
    if i != N - 1:
        j = i + 1
    else:
        j = i - 1
    y = a[j]
    a[i] = y
    a[j] = x
    b[x] = j
    b[y] = i
print(*[i + 1 for i in a])
```

## [ABC250D - 250-like Number](https://atcoder.jp/contests/abc250/tasks/abc250_d)

45分半で突破. *q* を基準に *O*(*N*) で *p* を探すと TLE になりそうなので、尺取法だよなあとあっさり方針は決まったけど、結構バグらせて時間がかかった.

```python
N = int(input())

def make_prime_table(n):
    sieve = list(range(n + 1))
    sieve[0] = -1
    sieve[1] = -1
    for i in range(4, n + 1, 2):
        sieve[i] = 2
    for i in range(3, int(n ** 0.5) + 1, 2):
        if sieve[i] != i:
            continue
        for j in range(i * i, n + 1, i * 2):
            if sieve[j] == j:
                sieve[j] = i
    return sieve

prime_table = make_prime_table(10 ** 6)
primes = [i for i in range(10 ** 6 + 1) if prime_table[i] == i]

result = 0
l = 0
for r in range(len(primes) - 1, 0, -1):
    while primes[l] * (primes[r] ** 3) <= N and l < r:
        l += 1
    result += l
    if l == r:
        l -= 1
print(result)
```

## [ABC250E - Prefix Equality](https://atcoder.jp/contests/abc250/tasks/abc250_e)

解けず. 単調増加になる順で解けばいいやと正しい方針は立ったもののなかなかに実装が重くて間に合わず. ハッシュが取れれば簡単だけど、出現順が変わると同じ値にならないしなあと思っていたら、解説で集合用のハッシュである Zobrist Hash が紹介されていて、これだーってなった. Zobrist Hash 自体は昔にやねうらおさんのブログで見ていたようなのだが、当時は競プロしてなかったしなあ(笑).

```python
from sys import stdin
from random import sample

readline = stdin.readline

N = int(readline())
a = list(map(int, readline().split()))
b = list(map(int, readline().split()))

v = set(a + b)
d = {}
for x, y in zip(v, sample(range(10 ** 18), len(v))) :
    d[x] = y

def hash(xs):
    result = []
    appeared = set()
    h = 0
    for x in xs:
        if x not in appeared:
            appeared.add(x)
            h ^= x
        result.append(h)
    return result

ha = hash(d[x] for x in a)
hb = hash(d[x] for x in b)

Q = int(readline())
result = []
for _ in range(Q):
    x, y = map(int, readline().split())
    if ha[x - 1] == hb[y - 1]:
        result.append('Yes')
    else:
        result.append('No')
print(*result, sep='\n')
```
53 解答

## Memoizationを使った解法

```Java
public int maxSubArray(int[] nums) {
	    int ans = nums[0];
	    int[] sumArray =  new int[nums.length];
	    sumArray[0] = nums[0];
	 
	    for(int i=1; i<nums.length; i++){
	        sumArray[i] = Math.max(nums[i], sumArray[i-1] + nums[i]);
	        ans = Math.max(ans, sumArray[i]);
	    }
	 
	    return ans;
	}

```

別解

```Java
public int maxSubArray(int nums[]) {

		int size = nums.length;
		int ans = Integer.MIN_VALUE;
		int tempSubArraySum = 0;

		for (int i = 0; i < size; i++) {
			tempSubArraySum += nums[i];

			if (ans < tempSubArraySum) {
				ans = tempSubArraySum;

			}

			if (tempSubArraySum < 0) {
				tempSubArraySum = 0;

			}
		}
		return ans;

	}

```
ここがよくわからなかった↓
```Java
if (tempSubArraySum < 0) {
				tempSubArraySum = 0;
}

```

[参考文献](https://www.programcreek.com/2013/02/leetcode-maximum-subarray-java/#:~:text=Find%20the%20contiguous%20subarray%20within,has%20the%20largest%20sum%20%3D%206.)
Markdown ファイルが黄色くなっちゃった話

# Visual Studio Code 更新したら md ファイルが黄色くなっちゃった

VSCode のバージョンが相当古かったので最新化した。
今まで綺麗だった md ファイルに黄色がいっぱい…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/f16c66f4-3c76-e5ef-0763-22a331f031bb.png)

## Markdown にも記法ルールがある

原因はわからないですが、コーディング規約をチェックしてくれるプラグインmarkdownLintが働いてくれた様子。
規約守らなくてもmdファイルとしては大丈夫なそうですが、先人たちがまとめてくれた規約は知っておいた方がいいし、従わない理由がないなら従った方がいい。

## MD022 blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines

タイトル行はブランク行で囲みましょうね、とのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/d70505eb-5d89-8057-2236-90dee5ea72e2.png)

## 他にはどんなルールが？

markdownLint さんには50個のルールが書かれた。
プラグインの「詳細はここ見てね」に、がっつり書かれてる。
[DavidAnson/markdownlint](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md)

2019年08月の記事なので47とありますが、よく引っかかってしまうルールを日本語で分かりやすく解説してくださっている記事も参考になりました。
[Markdown 47のルール](https://qiita.com/antk/items/e11cac45f9da343e7bf0)

## memo

markdown のコーディング規約を調べていたら、普段使っている python や JavaScript のコーディング規約も興味がでてきました。
PEP8 というものがあるらしい…調べてみる。
データベース

## データベース
<b>一定の規則に従って関連性のあるデータを蓄積したもの。
## データモデル
<b>実世界におけるデータの集合をデータベース上で利用可能にするもの。
階層モデル、ネットワートモデル、関係モデルがある。
### 関係モデル
<b>データの関係を数学モデル(集合論)で表現したもの。

![26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/ac09b9ce-573c-d4ce-c34f-3676ee85cccb.gif)
※定義域 - 属性が取り得る値の集合のこと。整数型、文字列型などと同じ意味
### 関係データベース
<b>行と列から構成される2次元の表によって表現されるデータベース。
<font color = blue>リレーショナルデータベース</font>とも言われている
## スキーマ
<b>データの形式や性質、他のデータとの関連などのデータ定義の集合。
一般に、「外部」・「概念」・「内部」が用いられて<font color = blue>3層スキーマ</font>と言われている。

![dev_db04_fig02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/0910128b-bd44-c346-04e9-a824ef6a4440.gif)

## データベース管理システム
<b>複数の利用者で大量のデータを共同利用できるように管理するソフトウェア
保全機能
障害回復機能
機密保護機能
がある。

### 再編成
<b>データベースに対する変更操作が繰り返されることで、データの操作に異常が発生すること。
これを修復し、アクセス性能を向上させること。
ROC 曲線

# ROC曲線のテンプレート
- 自分用に作成している勉強用・備忘録のノートです。
- 専門的な内容は有りません。
- 間違いなどが有りましたらコメントよろしくおねがいします。


目的:
- コードのテンプレート化


## とりあえず実装(statsmodels)
ここでは、statsmodelsのライブラリを用いて実装。


### まず必要なライブラリの読み込み

```python
import numpy as np 
import matplotlib.pyplot as plt

# ROC 曲線を描くためのライブラリ
from sklearn.metrics import roc_curve
# AUC を求めるためのライブラリ 
from sklearn import metrics
```


### データを準備

```python
# 特別ソートなどは必要ない
# 正解ラベル
y_true = [0, 0, 0, 0, 1, 1, 1, 1]
# 予測スコア
y_score = [0.2, 0.3, 0.6, 0.8, 0.4, 0.5, 0.7, 0.9]
```


```python

# matplotlib の roc_curve を用いるとプロット用の出力が得られる。
fpr, tpr, thresholds = roc_curve(y_true, y_score)

# FPR（偽陽性率）
print(fpr)
# TPR（真陽性率）
print(tpr)
# 閾値
print(thresholds)

```

### AUC の計算
AUC(area under curve; ROC曲線下の面積)
```python
# AUC の計算
auc = metrics.auc(fpr, tpr)
```

### ROC 曲線をプロット
matplotlib でROC 曲線をプロット

```python
fig = plt.figure()
ax = fig.add_subplot()

# FPR を横軸, TPRを縦軸に設定する。

ax.plot(fpr, tpr, marker='o',  label='ROC curve (area = %.2f)'%auc)

ax.plot(np.linspace(1, 0, len(fpr)), np.linspace(1, 0, len(fpr)), 
        label='Random curve (area = %.2f)'%0.5, linestyle = '--',)

ax.plot((0,0,1),(0,1,1), 
        label='Ideal curve (area = %.2f)'%1.0, linestyle = '--',)

plt.title("ROC curve")
plt.xlabel('FPR: False positive rate')
plt.ylabel('TPR: True positive rate')
plt.grid()
plt.legend()

plt.show()
```
最終的にこのような画像がプロットされる

![roc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1644027/e728cfe7-f682-ff0b-e2ce-6aef024daada.png)




# 少しだけ知識の整理
**混合行列の要素**
- 真陰性(True Negative, TN)：検査で陰性とされ、実際に陰性である場合
- 偽陰性(False Negative, FN)：検査で陰性とされたものの、実際には陽性である場合
- 偽陽性(False Positive, FP)：検査で陽性とされたものの、実際には陰性である場合
- 真陽性(True Positive, TP)：検査で陽性とされ、実際に陽性である場合

**適合率 (Precision）**

$\text{Precision} = \displaystyle \frac{TP}{TP + FP} = \frac{\text{予測が陽性で実際に陽性}}{予測が陽性としたものすべて}$  
使い所は誤って陽性と判断しては困る状況。例えばがんの検出など.

## 使い方（解釈）
ROC曲線のAUCが低いからと言って作成したモデルが有益ではないと決めるのは早計である。
例えば、閾値以上の中に陰性データが多いほど利益が高くなり、陽性データが閾値以上のグループに入ればその分大きく損害が発生するシステムを考える。ROC曲線の立ち上がりが良いほど陽性データを弾くための閾値を小さく設定しよりたくさんの陰性データを閾値以上のグループに仕分ける事ができる。逆に同じAUCでも立ち上がりが遅いROC曲線だとその分閾値を大きく設定する必要があるため、閾値以上に入る陰性データが少なくなり結果として利益を生み出すことができない。

このように問題となる背景によってはAUCの値だけではなくROC曲線を確認することが重要になることが分かる。


# 付録(PR曲線)

```python
## PR曲線
precision, recall, thresholds = metrics.precision_recall_curve(y_true, y_score)

auc = metrics.auc(recall, precision)
print(auc)

plt.plot(recall, precision, label='PR curve (area = %.2f)'%auc)
plt.legend()
plt.title('PR curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.grid(True)
plt.show()

```

![roc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1644027/3c33189d-a4aa-2634-2719-f24b09c23ef9.png)



## 参考文献

- [scikit-learnでROC曲線とそのAUCを算出](https://note.nkmk.me/python-sklearn-roc-curve-auc-score/)
- [ROC曲線とPR曲線の違いについての考察](https://qiita.com/skyshk/items/016cd1820650ea78d101)
Shodanの使い方（検索クエリとか）

Shodanの使い方、特に検索クリエについてまとめます。

# Shodanの検索クエリ

## 都市（city）
```
city:Tokyo

city:"San Diego"
```

## 国（country）

```
country: jp
```
※「ja」じゃなくて「jp」

国コード一覧はこちら：

https://iss.ndl.go.jp/help/help_ja/help_country_codes.html

# かつ（AND）、または（OR）否定（NOT）

AND検索は単純にクエリを半角スペースで並べればよい。
![tokyoandjp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/13475298-3f56-081a-f4c0-7c706e6e3e01.png)

ORは、カンマで区切る。

例えば「sshでポート番号が22または3333」を検索するには

```
ssh port:22,3333
```

NOTはクエリの前にマイナス記号（-）をつける。

例えば「sshでポート番号が22じゃないもの」は

```
ssh -port:22
```

「ページのタイトルに "WordPress"という単語を含まない」ようにするには

```
-http.title:"WordPress"
```

# ページタイトル（http.title）

ページのタイトルに "hacked by" が含まれるwebページを探すなら

```
http.title:"hacked by"
```

クラッキングされたであろうwebページをみつけることができる：
![music1337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/d684fb07-57a4-4a6b-93be-139d17f9775c.png)

![psycotic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/5a1dff0c-82e9-537a-b3ba-1868a3ea7f9d.png)

# ポート（port）

```
port:22
```

# OS

```
os:"windows xp"

os:"windows server 2003"
```

プーチン大統領周りのコンピュータがいまだにWindows XPを使ってるんだって：

<br>

<iframe width="100%" height="400" src="https://www.youtube.com/embed/GudY7XYouRk?start=1696" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# httpステータスコード

```
http.status:200

-http.status:503
```

まぁこれは検索クエリというか、普通に検索欄に「HTTP/1.1 200 OK」とか入れとけばヒットする。

# 製品名（product）

そのサービスを動かしているソフトウェアの名前を指定
```
product:Samsung
product:Apache
product:minecraft
```

# CVE番号、既知の脆弱性を検索（vuln）

Heartbleedの脆弱性：

```
vuln:CVE-2014-0160
```

EternalBlueの脆弱性：

```
vuln:ms17-010
```

# Explore

https://www.shodan.io/explore

##  InternetObservatory

国ごとに、どれくらいインターネット上に晒されているかを見やすくまとめたもの。

現時点での日本の状況：
![exposurejp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/e4197c8a-425f-3761-6d51-a278ec732e99.png)

EternalBlueやHeartbleedの脆弱性がいまだに残っている。

## tag

ExploreのページにPopular Tagsというのがある。

押してみると検索例が出てくる。
![queryexamp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/58db508c-3c9f-72d8-33b7-cbe584a13d37.png)

## Industrial Control Systems

産業用制御システム（ICS）。石油・ガス、電力、製造などを動かすシステム。ここを攻撃されると国レベルでダメージを受ける可能性がある。

- SCADA（Supervisory Control And Data Acquisition）：

  - 大きな施設やインフラなどを構成している装置・設備から得られる情報を、ネットワークを利用して一箇所に集めて監視・制御するシステム
  - 施設内の機器を一箇所で管理・コントロールできる
  - （例）機械の作動状況や使用する部材のストック、進捗などの情報を一見管理し、その情報を元に必要に応じて操作や補充

- DSC（distributed control system）

  - システムを構成する各機器ごとに制御装置を設けるシステム
  - それぞれの制御装置はネットワークで接続され、お互いに通信を行い監視する
  - 化学系プラントや製薬会社、貨物船などで導入をされてきており、現在では主にポンプなどで使用されている

- PLC（Programmable Logic Controller）

  - 機械を自動的に制御する装置の名称
  - 状況に応じて機械の動作を変更するのではなく、機械が行う動作に対して事前に順序を付けて記憶させることで、効率的に機械を動かせる
  - （例）工場や発電所、変電所といった大規模な施設だけでなく、エアコンや全自動洗濯機などの家庭用電化製品をはじめ、エレベーターや信号機、自動販売機、自動ドアで用いられる

参照：

https://www.scada-magazine.com/faq/scada-dcs-plc.html

# 主なフィルタ一覧

https://github.com/JavierOlmedo/shodan-filters


参考：

https://github.com/jakejarvis/awesome-shodan-queries
ユーザーストーリーマッピング

# 概要

[O'REILLY ユーザーストーリーマッピング](https://www.oreilly.co.jp/books/9784873117324/)の内容を概要レベルで記載する

以下の点を重点的に記載する

- ユーザーストーリーマッピングの目的は何か
- スクラムにおいて開発者がどのようにユーザーストーリーマッピングにかかわっていくか

# ユーザーストーリーとは

- プロダクトを利用する顧客(エンドユーザー)目線で、そのプロダクトで顧客にどのような価値を提供するかを簡単に記述したもの
    - ストーリーの会話は誰のためなのか、なぜなのか、誰のためかについても話す
    - アウトプットではなくアウトカム(成果)にフォーカスがある
- ストーリーは、共通理解を作成するために作成する
    - 共有ドキュメントは共通理解ではない
        - 共通理解があることとは、互いに相手がイメージしていることとその理由を理解していること。

## ユーザーストーリー作成までのプロセス

以下のサイトの記載が詳しいので、こちらを参照する
(ロンジェフリーズの3Cについては少し説明が雑なので後に補足)
https://it-trend.jp/development_tools/article/32-0045


# ユーザーストーリーマッピングとは

ユーザーストーリーマッピングには以下の記載がある


`ストーリーマップを作ると、ユーザーとそのエクスペリエンスに意識を集中でき、より良い会話を交わすことができ、最終的には良い製品が生まれる。`


アジャイルやリーンプロセスを使うことで、ストーリーを使うことで小さいことを作ることに注目しているため、アプリの全体像が分からなくなってしまうことがある。

ユーザーストーリーマッピングは、アプリケーションの全体像をつかみ、**ビジョンを共有し、会話を交わし、良いアイデアをプロダクトに追加するため**に作成する
(思考の穴があった場合、追加することが出来る)

また、ストーリーマッピングではカードを並び替えるだけでコミュニケーションができる
(カードを並び替えながら共通理解を作り出すことが出来る、カードの配置は優先順位を表す)

以下のページに記載されている図がわかりやすい
(さらに追加でペルソナを定めることが多いと思う)
https://qiita.com/Koki_jp/items/6aebc73bedd0a932dcb8


## ユーザーストーリーマッピングで実現できること

1. (MVP)リリースのスコープを定める
    - MVPは仮説を証明または反証するために作れる、あるいは実行できる最小のもの
    - 生み出せる機能ではなく、特定の成果に絞ってリリースを区切ろう
        - ペルソナを定めることによりリリースのスコープを狭める
1. リリースロードマップを作成する
    - スライスごとにリリースするとは限らない
        - スライスはそれぞれの学習目的が達成できているかチームメンバーが立ち止まって振り返るタイミングである

## ユーザーストーリーマッピングのステップ

書籍には以下の方法が一例として紹介されている

1. 問題の枠組みを明らかにする
    - なぜマップを作っているか(何のために共通認識を作りたいのか)
1. 全体像をマッピングする
    - ユーザーが感じてる苦痛、喜びを含めて現状をマッピングする
1. 掘り下げる
    - ユーザーストーリーを切り出す
    - スケッチ、プロトタイプ、ソリューションの改良案のアイデアなども出す
1. リリース戦略を切り出す
1. 学習戦略を切り出す
    - MVPから学習できることを洗い出す(構築-学習-測定ループの定義)
        - 参考資料:https://www.e-mtb.space/practice-lean-startup-simple-summary/
1. 開発戦略を立てる
    - MVPの中でも早めに構築するもの、後回しにするものを定める
        - 例.) 開発リスクの高いものは早めに着手する


以下のページに、上のステップの2~4の部分までについて詳細に記載があるので、こちらも参考にしてほしい
https://do-scrum.com/userstory/

# 開発の流れ

開発の全体像をつかむために、ストーリーを細かい粒度に分解しデリバリーするまでの流れを以下に記載する
また、各ステップの詳細を以下に記載する

1. オポチュニティを評価する
1. MVPをディスカバリしストーリーを分割
1. ストーリーの細部について決定する
1. 評価を行う
1. リリースしユーザーからのフィードバックを得る

## 1. オポチュニティを評価する

- オポチュニティとは、実現する新機能や新製品、機能改善のこと
    - エピックとも呼ばれる
- オポチュニティバックログという形でリスト化されているとよい

## 2. MVPをディスカバリしストーリーを分割

- オポチュニティをユーザーストーリーに変換する 
- ユーザーストーリーマッピングこの段階で行われる
- ワイヤーフレームやプロトタイプはこの段階で作成される
- プロダクトオーナーが率いる組織横断チームがプロダクトディスカバリーを行う??
    - 大きなアイデアを実際に実行可能なサイズに変換する
    - プロダクトディスカバリーはデザインの専門能力と技術的な専門能力を持ったメンバーで構成される   

## 3. ストーリーの細部について決定する

- 具体的に何を構築するかを意見を一致させる
    - チームメンバーとともに、ストーリーの細部を掘り下げストーリーの受入れ基準について意見を一致させる
    - スクラムでいうところの、**バックログリファインメント**にあたる
- またバックログの受け入れ条件についても合意をとる
- スプリント内で作っているなかでも細部について会話を続ける


## 4. 評価を行う

大きく以下の三つの評価がある

- チーム内部での評価
    - 製品の品質、スプリントのプラン二ング、作業方法が適切だったかを振り返る
    - スクラムでいうところの**スプリントレビュー、スプリントレトロスペクティブ**
- ユーザー・顧客との評価(期待を満たしているか)
- ビジネスステークホルダーとの評価(期待を満たしているか)

## 5. リリースしユーザーからのフィードバックを得る

リリースできる状態になれば、ユーザー・顧客向けにリリースする
その結果、ユーザーからのフィードバックをとともに、次のオポチュニティバックログを得る(構築-学習-測定ループ)
[Rails]before_actionで先にincludesした時の罠

Railsでincludesメソッドを使用してデータの読み込み速度をあげようとした時にタイトルにある通り、罠に引っ掛かりました。

**※コードは一部抜粋して内容も変更しています。**
```ruby
before_action :set_user

def destroy
  return head :unprocessable_entity unless @user.unfollow(@follow)

  render json: @user
end

private

  def set_user
    @user = User.includes(:following).find(params[:user_id])
    @follow = User.find(params[:follow_id])
  end
```

このコードはフォロー機能を実装しているコードの一部で、destroyアクション内ではフォローを解除出来た場合はuserのデータを返しています。

開発環境で実際にフォローのボタンを押してみると200レスポンスが返り、データも返ってきています。

しかし、フォローボタンがリアクティブに反応しません。
原因は、フォロー解除後のデータではなくフォロー解除前のデータが返っていました。


unfollowメソッドを実行する前にincludesメソッドでfollowing(userがフォローしている他のuser達)を先読みしているため、フォローを解除する前のデータを先読みしてしまっていたのです。
よくよく考えてみれば当たり前ですよね笑

リファクタリングをした時に起きた問題だったので、リファクタリングをするためには機能実装以上に知識が求められるなと感じました。
【VSCode】デバッグコンソールに出力される重複した値のまとめ表示をOFFにする方法

VSCodeの機能の一つである、デバッグコンソールにループ文等で重複した値が
出力されると、デフォルトでなぜかまとめられて表示されてしまう。
この謎の設定をなんとかOFFにしたいという一心でひたすらググりまくるも、参考になる記事が見当たらず。。。
そして模索していたらついに解決策を見つけたので、ご興味がある方は是非参考にしてみてください！
簡単なのであっという間に終わります！

ーーーーーーーーーーーーーーーーーーーーーーーーー

● 起こっている現象
以下のように、重複した値がまとめられて表示される
![20220510-162307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/f08d01a9-cec9-8e54-0049-accd6e3fc1e8.png)



● 解決手順
①設定画面を開く
・ctrl + , (windows)
・⌘ + , (Mac)
・もしくは下記キャプチャのように左下の設定ボタン:gear:(歯車マーク)をクリックして表示
![20220509-231232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/23ee1953-8424-3a62-bed2-c4a369ef1413.png)

②「機能」の項目にある「デバッグ」をクリック
![20220509-232147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/35a6c1a0-0737-be0d-47f8-f12a2d210523.png)

③「Collapse Identical Lines」のチェックを外す
![20220509-233739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/816e3ac8-6b09-53a9-1ca9-9bcbe4f352dc.png)
たったこれだけです！！

● 最後にデバッグコンソールの表示を確認
![20220510-162328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/90413126-360f-81b0-daa3-dfd0c0b3d87b.png)

上記のように、値が重複していても今度は
まとめられることなく、それぞれの値が表示できています！

● まとめ
以上が、デバッグコンソールに出力される値の重複表示をOFFにする方法です。
また、「そもそもデバッグコンソール画面に出力がうまくされない」という方は、わかりやすい記事を見つけましたので、以下の内容をご参照ください。
https://jpdebug.com/p/2818359

ーーーーーーーーーーーーーーーーーーーーーーーーー

今回、初めてQiitaに投稿させていただきました！
拙い文章の記事ですが、1人でも多くの方の問題解決に繋がれば幸いです。
また、これまで仕事中や自己学習の中でも多くの方の記事に助けられてきたので、
今後は気づいたことなどを、自分自身でも少しずつ発信していければと思います！