OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのアクセス修飾子でクイズ

## はじめに
PHPでクイズを作りたいと思い、間違いやすそうな部分を問題にしました。

## PHPのアクセス修飾子
```php
// PHPのバージョンは8.0.3とする
class Super {
  // public、protected、privateそれぞれのパターン
  アクセス修飾子 $name;

  public function __construct(string $name)
  {
    $this->setName($name);
  }

  public function setName(string $name): void
  {
    $this->name = $name;
  }

  public function getName(): string
  {
    return $this->name;
  }
}

class Sub extends Super {
  public function __construct(string $name)
  {
    parent::__construct($name);
  }
}

$sub = new Sub('佐藤さん');
$sub->name = '鈴木さん';
$sub->setName('高橋さん');
// 出力結果
echo $sub->getName();
```
## 問題
#### Superクラスの$nameがpublic、protected、privateのそれぞれのケースでの出力結果を下記の選択肢から選んでください。
**1．エラーが表示される**
**2．佐藤さんが表示される**
**3．鈴木さんが表示される**
**4．高橋さんが表示される**

## 解答
#### publicの場合
<details><summary>表示</summary>

**4．高橋さんが表示される**

**解説**
最後の`$sub->setName('高橋さん')`で
Superクラスの`$name`へセットされて表示される。
</details>

#### protectedの場合
<details><summary>表示</summary>

**1．エラーが表示される**

**解説**
エラー内容は
`Fatal error: Uncaught Error: Cannot access protected property Sub::$name`
原因は下記のコードで`protected`は**自身のクラスと自身のクラスを継承したクラスと
親クラスからのみでしかアクセスできないため、エラー**となる。

</details>

#### privateの場合
<details><summary>表示</summary>

**3．鈴木さんが表示される**

**解説**
結果から`$name`はSuperクラスとSubクラスの両方で所持されている。

Subクラスの`$name`は、**最初は定義されていないが、
PHPは未定義のプロパティに対して動的に生成する**ため、
`$user->name = '鈴木さん'`この段階でSubクラスに存在する。

Superクラスの`$name`は、
`$sub = new Sub('佐藤さん')`、`$sub->setName('高橋さん')`の2回セットされており
最後にセットされた高橋さんが値がセットされている。

出力するときはSubクラスで生成された`public $name`にアクセスされる。

※なお、動的プロパティは**PHP 8.2では非推奨**になり、**PHP9.0ではエラー**となる模様。
https://wiki.php.net/rfc/deprecate_dynamic_properties
</details>
【AWS】大量データ転送について

# データ転送の計算式（そもそも）
これはもう具体例でやった方がわかりやすい。
70TBの大量データを0.5GBのインターネット回線で転送するのにかかる時間を計算する。
それぞれのパラメータをビット数に変換してあげる。



>(1)データ容量をビット単位に変換
615,726,511,554,560bit = 70TBtye ×1024×1024×1024×1024 × 8bit
(2)回線速度をビット単位に変換（＝1秒間に転送できるbit数）
500,000,000bit = 0.5Gbps ×1000×1000×1000
(3)転送に掛かる秒数を計算
1231453.02秒 = 615,726,511,554,560bit ÷ 500,000,000bit × 伝送効率
(4)転送速度の変換（bps⇔B/s）
62.50MB/s = 0.5Gbps ÷ 8bit × 伝送効率

1byteは1bitだよ。
https://www.networld.co.jp/sp/learn_first/storage/p22_24.html


伝送効率が100%ならば342時間かかる......！！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/56b44ec7-08a4-eabd-44aa-33ec4b21bc92.png)



神サイトがこちら。

https://note.cman.jp/network/speed.cgi


# Storage Gateway
AWSで提供されている、オンプレミスにあるデータをクラウドへ連携するための受け口を提供するサービス。
Storage Gatewayを使って連携されたデータの保存先には、耐久性が高く低コストなストレージ（S3,S3 Glacierなど）が利用される。※下図参照

何か独自のストレージが誕生したわけではなく、ただ単に既存のオンプレとAWS間のデータ連携を容易にするためのインタフェースを提供しているだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/7c9bfb4b-4b9c-f32e-42c4-cbe54c4096c8.png)
画像引用：[AWS Storage Gateway](https://aws.amazon.com/jp/storagegateway/)

使い分け方の一例として、
高頻度にアクセスされるデータはオンプレ環境の高速ストレージに保管
あんまりアクセスされないデータはStorage Gatewayを利用してクラウド上に保管する。といったやり方がある。


# AWS Snowball Edge
とんでもなく大容量（ペタバイト級）のデータをAWSへ移行/持ち出しをする際に使うサービス。
ちなみにペタバイトとは。。。。。。。
　・ビット（Bit）
　・バイト（Byte）
　・キロバイト（KB）
　・メガバイト（MB）
　・ギガバイト（GB）
　・テラバイト（TB）
　・ペタバイト（PB）
なのでめちゃくちゃ大きい。

ちなみにサービスを申し込むと下のような筺が配送業者によって送られてくる。引き渡しから１週間程度でS3にデータが移行されるとのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/9b8d8d79-f47b-d9ab-3d17-6033ea22a66b.png)
画像引用：[AWS Snowball Edge デバイスの使用](https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/using-device.html)
[エンジニア未経験者] 研修・OJT期間での心得

## はじめに
この記事では、エンジニア未経験者に向けて、新人研修やOJTでの心得を自分の苦労したことや反省点も交えて書いています。
私は、2022年4月にエンジニア業務未経験（スクールなどにも行っていない）で入社しました。
入社後は一ヶ月ほど新卒の社員の方々と一緒に全職種共通の新人研修を受講させていただき、5月からエンジニアチームに配属されました。
配属後、一ヶ月半ほどのエンジニア新人研修を受けて、今はOJTで少しづつですが実務を行なっています。

苦労したこと・していることを改めて振り返り、それをどのように解消していくかを心得としてまとめていきます。

## 苦労したこと

* 研修期間中、短期間に複数の言語や技術を覚えること

* 行ったことをメモに取ったりまとめたりするのに時間がかかってしまうこと
* gitの扱いになど慣れず、開発の手順を理解するのに時間がかかったこと
* プロジェクトの進め方がわからないこと
* 勉強方法が分からないこと



## 心得
苦労したことへの解決策を、反省も込めて心得としてまとめていきます。

#### 苦労1:　研修期間中、短期間に複数の言語や技術を覚えること
まずは全部完璧に暗記しようとせずに、概要や考え方を身につけることを意識して取り組むべきだと思います。
また、重要そうなポイントや実務でよく使う可能性のある内容は別で控えておいて（もしくは頭に叩き込んで）分からない時にすぐに見つけられるようにしておくことも有効。

最初はインプットすることが多すぎて全てを完璧にその場で覚えるのは難易度が高いなと感じていました。
筆者の会社の新人研修はpaizaというオンラインプログラミング講座をメインで行なっていましたが、講座によって学んだ用語や文法を自分のメモに十分に残しておけていなかったことも...
結果、実務（OJT）に入ったときに、「paizaでやったあの内容が使えそう！」と思っても、それがメモに残っていない講座の場合、また一からネットや本で調べたりするという手間が発生していました。
きちんとまとめている時間がない場合、必要そうな単語だけすぐ確認できるように記録しておいて、実際に使うときにメモから単語を見つけて詳細を調べ直すというやり方でも十分だと思います。

#### 苦労2: 行ったことをメモに取ったりまとめたりするのに時間がかかってしまうこと
これは、時間がかかってもある程度はきちんと取ったほうがいいと思っています。
全てを綺麗にまとめる必要はありませんが、後で自分で見返して同じ操作ができるレベルで記録しておくことを意識していました。
特にOJT期間（実務）は先輩方と一緒に行ってできたことでも、後で自分でもう一度行おうとすると、きちんと手順が把握できていなかったり、意味が理解できていなかったりということがあると思います。メモにまとめることで自分自身の理解を深めたり、わからない部分を把握して調べ直すということができるはずです。
また、上司や先輩社員に同じことを聞くという無駄な工数を抑えるためにも、メモ取りや記録を残すのは重要だと思います。

#### 苦労3: gitの扱いになど慣れず、開発の手順を理解するのに時間がかかったこと
gitは、どの開発を行う上でも必須ですぐに使う状況が訪れるため、早めの段階で習得しておくと良いと思いました。
また、案件・お客様ごとに開発環境やブランチを分けるなどの決まりごとも、事前に確認するようにしましょう。
（筆者は１つのローカル環境に複数の案件のブランチを作成してしまったため、後々ブランチの切り替えなどが大変に..）

#### 苦労4: プロジェクトの進め方がわからないこと
これは、WBSを作成する仕事を行ったときに直面しました。
筆者のようにプロジェクト型の仕事に携わったことがない方は、開発モデル（ウォータフォールモデル・アジャイルなど）について学んでみたり、他の社内プロジェクトの流れや成果物を参考にしてみるのも良いかと思います。

#### 苦労5: 勉強方法が分からないこと
プログラミングの勉強方法については、本・オンライン講座・ネット記事など色々あると思いますが、わからない場合は社内の先輩方に聞いて参考にするのも良いかと思います。会社で契約しているオンライン講座や社内勉強会、会社で購入している本などが活用できる場合もあるため、分からない場合早めの段階で一度確認してみましょう。

（余談）筆者の勉強方法・教材は以下の通りです。
＜オンライン講座＞
・paiza（新人研修で使用）
・progate（git講座）

＜本＞
・詳細！ PHP8+MySQL 入門ノート/大重美幸/ソーテック社/2021年7月31日初版
（PHP使用する際の辞書的な存在）
・1回で受かる！ ITパスポート合格テキスト'22年版/藤川美香子/成美堂出版/2022年1月20日発行
（ITに関する基礎的な情報や開発モデルについての復習）
・その他物流系の本
（倉庫管理システムを開発している会社のため）



## 終わりに
以上、私の反省点も踏まえた上での新人としての心得です。
配属されてから約3ヶ月間のことを改めて振り返ったことで、自分自身の課題も見えてきました。
これからも、実務に勉強に精進していきます！
【AWS】セキュリティポリシーについて

# セキュリティポリシーの設定について
S3バケットポリシーとIAMポリシーがあるが、ぶっちゃけどっちからでも制御できるのは？という疑問。結論から言うと、クロスアカウントアクセスである場合は両方のポリシーを突破してあげる必要がある。

# クロスアカウント？？
AWSアカウントは今や1つだけのアカウントだけで運用するものではなく、目的別に（dev/prod用など）運用するものになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/afcba584-d078-0da4-5ad7-37de991cfc6e.png)
画像引用：[IAMでクロスアカウントスイッチロールを設定してみた](https://blog.logical.co.jp/entry/2020/04/09/103000)


# IAMポリシー

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::[ターゲットバケット名]/*"
        }
    ]
}
```
引用：[S3バケットポリシーとIAMポリシーの関係を整理する](https://www.bioerrorlog.work/entry/s3-bucket-policy-vs-iam-policy)

# S3バケットポリシー

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウントid]:role/[EC2にアタッチしたRole名]"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::[バケット名]/*"
            ]
        }
    ]
}
```
引用：[S3バケットポリシーとIAMポリシーの関係を整理する](https://www.bioerrorlog.work/entry/s3-bucket-policy-vs-iam-policy)



# 参考

https://www.bioerrorlog.work/entry/s3-bucket-policy-vs-iam-policy
100日後くらいに個人開発するぞ！day063

## 今日はWebについて学んでみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/bed22561-da8f-c683-e6a0-c605c47084c4.png)


## 今日の学び

### Webとは
* Webとはインターネット上にある情報を見る仕組み
* Web上の情報それぞれにURLが与えられている
* サーバーの情報を取得するコンピュータをクライアントという


### クライアントとサーバーの情報のやりとり
* クライアントの要求（リクエスト）を元にサーバーが応答（レスポンス）する流れでやり取りをしている
* リクエストをする際はURLを用いてサーバーの場所とサーバーの中の情報の場所を指定する
    * URL：https://〜〜〜/〇〇〇
        * 「〜〜〜」がサーバーの場所
        * 「〇〇〇」がサーバーの中の情報の場所


### Webページが表示されるまでの流れ
* サーバーにはWebページのHTMLが保存されており、HTMLを表示するクライアントを「ブラウザ」という
* ブラウザとサーバーのやりとりの流れ
    * ①ブラウザがサーバーにリクエストを送る
    * ②サーバーがURLに応じてHTMLをブラウザに返す
    * ③ブラウザにHTMLが表示される
「きれいなPythonプログラミング」を読んで

# はじめに
書籍[「きれいなPythonプログラミング」](https://book.mynavi.jp/ec/products/detail/id=127578)を読みました。非常に参考にり、そして「感動」した書籍でしたので、面白かったトピックを記載します

# 作者
Al Sweigart（アル・スウェイガート）さんという方で、この書籍以外にも[「退屈なことはPythonにやらせよう」](https://www.oreilly.co.jp/books/9784873117782/)なども書いている方です。また、「きれいなPythonプログラミング」も含め無料の英語版をクリエイティブ・コモンズ・ライセンスのもと[www.inventwithpython.com](https://www.inventwithpython.com/)で公開されています。


# 基本的なことは理解したが、次は何をしようと考えている人向け
原題は「Python で基本的なことを超えて(Beyond the Basic Stuff with Python)」となっており、書籍の「はじめに」の部分にもありましたが、pythonのチュートリアルを読み終えて、次は何をしようと考えている人向けです。また、ある程度経験を積まれた方にも「自分の手法の確認」などのためにも良いと思います。


# 速攻で内容を理解したい人へ
各章の最後にある「まとめ」を読むと、大体内容がわかります。


# 印象に残った記事

## コードフォーマットを整える(3章より)
black:フォーマット成型ツールです。文字間隔などを一定のルール、ほぼPEP8にそって修正してくれます。
vs-codeで使えsaveするたびに成型することもできます
->vs-codeでの設定方法は[「blackで始める妥協のないPythonコードフォーマッティング」](https://qiita.com/84zume/items/ac969931b5f08fef0841)を参照

## Pythonのよくある落とし穴(8章より)
むかし自分もハマったことがある記事が満載でした。

### ループ時にリストの追加・削除をしない(8.1章より)
むかし、これをやってしまいデバッグが大変だったことを思い出しました。
この記事の結びが
Pythonの中心的な開発者であるレイモンドヘッテンガーの話として
Q.「ループ中にリストを変更するためのベスト プラクティスは何ですか?」
A.「しないでください。」
が印象的でした。


### copy.copy()copy.deepcopy()を使う(8.2章より)
そう、なぜか知らないが変数の値がいつのまにか変わっている事件はよくありました。
「デフォルトの引数に可変値を使用しない」も同様の現象を引き起こします。
そして、ここで検証用に使われている[ツール](https://autbor.com/listcopygotcha1)も魅力的です。


## 文字列連結で文字列をつくらない(8.4章より)
私はpandasで、これと同様の原因で大幅なレスポンス悪化に悩みました。

## cProfile(13.2章より)
python以外でもそうですが、レスポンスで引っ掛かるのは
短い命令が非常に大量にループして実行されている時などで見つけるのが大変だったことを思い出します。
このツールがあれば楽勝です


## おすすめの読み方
私は、すでに知っていることが書いてありそうな章でも(書籍にもそう書いてありますが)飛ばさずにじっくり読むことをお勧めします。
「へーー」がいっぱいです。また、「プロジェクトの実践」(14章)では、コードを実際に書きますが、これも手間でも実際に自分でコードを打ち込むことをお勧めします。

## ほかにも
ここに記載したことは、ほんの一例です。ほかにも「質問の仕方」、「わかりやすいネーミング」、「enumerate」、「f-string」、「**switch文の代わりに辞書を使う**」、「git」、「プリントデバッグ」・・・興味を引く記事が満載です。また、**多くの有用な参照記事へのリンクも魅力的**です。

# 参考
[マイナビ books きれいなPythonプログラミング](https://book.mynavi.jp/ec/products/detail/id=127578)
[きれいなPythonプログラミング（パイソニックなコードを書こう）を読んでみた](きれいなPythonプログラミング（パイソニックなコードを書こう）を読んでみた)
【AWS】ライフサイクル機能

# ライフサイクル機能とは？
S3に保存されたオブジェクトの「人生」を決めてくれるもの。大学に行って〜結婚して〜みたいな感じで、S3に保管されたオブジェクトの「人生」を決めることができる。具体的には、オブジェクト作成当時は頻繁にアクセスされるが、いずれ低頻度のアクセスになるであろうオブジェクトに関しては「90日後に低頻度アクセスのストレージクラスへ移行する」といった設定が可能。
AWS内でライフサイクル機能を有しているのはS3とAWS BackUpのみ。（EBSにはライフサイクル機能はない）

# S3 Glacier
ほとんど参照されないアーカイブ目的のデータを保存するストレージクラス。
オブジェクト作成当時にこのクラスを選択することはできない。
ライフサイクル機能で設定してあげることによって、初めて利用可能となる。
低頻度のアクセスが想定されているストレージクラスのため、Glacierに保管されているデータにアクセスするには事前にアクセスをリクエストしてあげる必要がある。（そしてアクセスできるようになるまでに数時間かかる）
データの取り出しには標準で３〜5時間もかかる！

# AWS BackUp
下図でも分かるように、全てのリソースに対するバックアップを指す。壮大な話。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/ac21cbcc-3cd9-b6af-3a6a-500c2d97ae3b.png)
画像引用：[AWS Backup AWS のサービス全体でバックアップを集中管理および自動化](https://aws.amazon.com/jp/backup/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc)
【Flutter/Dart】エミュレータの言語設定をかえよう

# 1.はじめに
これまでに7つのAndroidStudio&Flutter&Dart記事を書いている。以下は内容、

- 【Flutter/Dart】環境構築方法の紹介
https://qiita.com/my_programming/items/ad1493e3fef2fb63e036

- 【Flutter/Dart】簡単なプロジェクトの設定と共有方法の紹介
https://qiita.com/my_programming/items/cec09574a3b6e39be277

- **【Flutter/Dart】エミュレータの言語設定をかえよう（今回説明する内容）**

- 【Flutter/Dart】Dartの文法について学ぼう
https://qiita.com/my_programming/items/9ba25114ef217d077ca5

- 【Flutter/Dart】タスク管理アプリを作ろう
https://qiita.com/my_programming/items/9ed2276f6e9076f43444

- 【Flutter/Dart】Google地図アプリを作ろう
https://qiita.com/my_programming/items/26b9ac6f0d2b3d1bd766

- 【Flutter/Dart】情報管理アプリ＋Google地図アプリを作ろう
https://qiita.com/my_programming/items/5bd1bb7b789b642635b4

今回はエミュレータで日本語を表示＆入力できる様に言語設定を変更する。
デフォルトでは英語の表示＆入力だけとなっており、この後のアプリ開発で不便である。

# 2.エミュレータを日本語化しよう
①DeviceManagerからエミュレータを起動する。起動したら画面下部をマウスでクリックしたまま画面中央までマウスポインタを動かす。
<img width="100" alt="emulator1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/9fb010c0-6034-436e-0573-c49d889d143a.png">

②Settingsアイコンを押す。
<img width="100" alt="emulator2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/c545f0ba-0c53-9076-501b-bef770bf3cb3.png">


③Sytemアイコンを押す。
<img width="100" alt="emulator3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/625cb471-36d6-8ea6-9f23-cf498e607756.png">

④Languages&Inputを押す。
<img width="100" alt="emulator4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/26a70e85-dd4c-9120-a212-48f6ff33d98f.png">

⑤Add a languageから日本語を追加する。日本語の右側の二重線を押したままEnglishと順序を入れ替えて一番上に移動させる。エミュレータの言語が自動的に日本語に変換される。
<img width="100" alt="emulator5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/921748d8-6792-1a49-f6cc-7ed98ce63f68.png">

⑥検索エディットボックスなどで日本語を入力できる様になる。日本語を入力できない場合はパソコンの入力モードが日本語になっていない場合が考えられる。
<img width="100" alt="emulator6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/5d275703-18e2-5432-4796-37e47324b34c.png">

# 3.まとめ
エミュレータで日本語を表示＆入力できる様に言語設定を変更した。
【Flutter/Dart】Flutterをはじめよう

# 1.はじめに
- **【Flutter/Dart】環境構築方法の紹介（今回説明する内容）**
- 【Flutter/Dart】簡単なプロジェクトの設定と共有方法の紹介
https://qiita.com/my_programming/items/cec09574a3b6e39be277

- 【Flutter/Dart】エミュレータの言語設定をかえよう
https://qiita.com/my_programming/items/6c67fed22c624fd9494b

- 【Flutter/Dart】Dartの文法について学ぼう
https://qiita.com/my_programming/items/9ba25114ef217d077ca5

- 【Flutter/Dart】タスク管理アプリを作ろう
https://qiita.com/my_programming/items/9ed2276f6e9076f43444

- 【Flutter/Dart】Google地図アプリを作ろう
https://qiita.com/my_programming/items/26b9ac6f0d2b3d1bd766

- 【Flutter/Dart】情報管理アプリ＋Google地図アプリを作ろう
https://qiita.com/my_programming/items/5bd1bb7b789b642635b4

スマホやパソコンでアプリを開発してみたい方向けに、Flutterでのアプリ開発方法を説明していく。
今回は、Flutterのインストール方法とAndroidStudioのインストール方法を紹介する。
なお、インストール先はLinux環境として説明するが、WindowsやMacでも環境構築方法は同じである。

# 2.環境構築
## 2-1.Flutterのインストール
一番簡単なインストール方法はsnapの利用
```
$ sudo snap install flutter --classic
```
インストールできているかSDKパスを表示してみる
```
$ flutter sdk-path
```
flutterをどこからでも呼び出せる様に実行pathをマシンに覚えさせる。
```
$ export PATH="$PATH:/home/[user_name]/snap/flutter/common/flutter/bin"
```
依存関係や必要事項がそろっているかを確認
```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.1, on Ubuntu 18.04.6 LTS 5.4.0-113-generic, locale ja_JP.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2021.2)
[✓] VS Code (version 1.67.0)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!
```
このような表示がでたらチェックが入るようにエラー対応が必要。
対応作をみつけるためには表示内容をそのままググると解答がたくさんヒットするはず。
```
[-] Android toolchain - develop for Android devices
    • Android SDK at /Users/obiwan/Library/Android/sdk
    ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ
    • Try re-installing or updating your Android SDK,
      visit https://docs.flutter.dev/setup/#android-setup for detailed instructions.
```

## 2-2.AndsroidStudioのインストール
以下からインストーラをダウンロード。OSに応じて最適なインストーラが自動で選択される
https://developer.android.com/studio

AndroidStudioがインストールされたらアプリを起動。
起動画面からPluginsを選択した後、AndroidStudioにFlutterとDartをインストール。
インストール後はRestartIDEのボタンを押してアプリを再起動。
赤枠位置に表示された`Start a new Flutter project`というボタンをクリック。
<img width="200" alt="image_android_stduio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/b1a08958-e133-b9ef-e470-e652f3f11b61.png">
SDKパスをFlutter SDK Pathと書かれたエディットボックスに入力して`Next`ボタンをクリック。
<img width="200" alt="image_sdk_path.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/7a5f5eb4-6a91-10c8-c5d1-f8bb93e26c84.png">
Project Name欄だけ埋めたら`Finish`ボタンをクリック。
新しいプロジェクトが~/StudioProjectsディレクトリに作成される。
main.dartウィンドウをトップにした下記画面が立ち上がる。
<img width="400" alt="image_new_project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892339/c3cfbc04-0ca7-d0c5-50c6-779fa9038d87.png">
ここまでくれば環境構築は無事修了。

# 3.まとめ
Flutterのインストール方法とAndroidStudioのインストール方法を紹介した。
環境構築がすんだのでプログラミングを開始できるようになった。
【AWS】特定のURIリクエストのみAWS WAFルールを適用させない方法

# はじめに
AWS WAFを導入し、運用していると、誤検知問題にぶつかることがあります。

本来なら問題なく、動作してほしいアクションに対しても、WAFが良かれと思ってブロックしてしまい、想定通りのアクションが行えないことがあります。

そこで、WAFに対して（あらかじめ安全だと確認できている）特定のURI時のリクエストに対してブロックルールを適用しないようにする方法を記載します。

# 手順
今回は、例として`/uploads`のURIのみWAFのルールを適用させたくない場合を想定します。

![スクリーンショット 2022-07-28 18.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/4ced3e51-a125-900a-6c49-8bc6dd166b8f.png)


## `Regex pattern sets`を作成
AWS WAFのマネジメントコンソールから`Regex pattern sets`を選択し、登録するURIを追加する。

ワイルドカード表記もできるので、ルールを適用させたくない任意のURLを設定。

![スクリーンショット 2022-07-26 15.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/7d2fb990-5b65-989a-b199-ac8d7ef50c2e.png)

## ルールグループを作成
CloudWatchメトリクスにも記録されるようです。
WAFへのアクセスログをCloudWatchのロググループに配信している場合は、作成したメトリクスが反映されます。

![スクリーンショット 2022-07-26 15.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/530841d4-1fc6-b10a-9418-2575e691123e.png)

先ほど、登録した`Regex pattern sets`を選択。

![スクリーンショット 2022-07-26 15.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/5badd378-0362-40cd-c421-5e35b92da286.png)

アクションを`Allow`にすることで、本来`BLOCK`されてしまう特定URI時のリクエストを許可します。

![スクリーンショット 2022-07-26 15.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/28a0e3b9-8f80-3c56-b93f-124c494543cb.png)

## ルールグループをWAFに適用

![スクリーンショット 2022-07-26 15.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/304e06d7-8e89-45f2-0fd1-44ea98b73215.png)

先ほど作成した`Rule Group`を選択

![スクリーンショット 2022-07-26 15.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/c6349321-e8e4-e3c1-d029-2d33119dae44.png)


これでWAFへのルールとして適用することができます！

**【※注意点】**
作成した`Rule Group`の優先度を、ブロックされてしまうルールよりも高く設定しておくこと。

# 確認
`/uploads`にアクセスしてみて、WAFでブロックされていないことを確認できればOKです！

![スクリーンショット 2022-07-28 18.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/897f1b6a-a828-1fef-f7e8-f87dd62ac8ff.png)




# 参考
https://qiita.com/hirai-11/items/252705c33914dcab000c#upload%E3%81%AE%E3%83%91%E3%82%B9%E3%81%AE%E3%81%BF%E3%82%B3%E3%82%A2%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95
２０２２年７月３１日のｅｂｉｔｅｎのメモ

# 画像の読み込み

　golang1.15以降の画像読み込みですが、

```golang
	var err error

	f, err := os.ReadFile(file)
	if err != nil {
		log.Fatal(err)
	}

	/*	resp, err := http.Get("https://hoge.hoge/" + file)
		if err != nil {
			log.Fatal(err)
		}
		f, _ := io.ReadAll(resp.Body);
		defer resp.Body.Close()
	*/

	img, _, err := image.Decode(bytes.NewReader(f))
	if err != nil {
		log.Fatal(err)
	}

	gazo = ebiten.NewImageFromImage(img)
	if err != nil {
		log.Fatal(err)
	}
```

ってコードで、ファイルを埋め込まずに読み込んでます。邪道でしょうか？

# wasmでのバイナリファイルの読み込み

　ebitenのプログラムをwasm対応して音声ファイルを読み込もうとしたらエラーが出たのですが。ファイルはWEBサーバーで置いてあるのでhttpで読み込めば良いやと

```golang
	var err error

    /*	f, err := os.ReadFile(file)
    	if err != nil {
    		log.Fatal(err)
    	}
    */

	resp, err := http.Get("https://hoge.hoge/" + file)
	if err != nil {
		log.Fatal(err)
	}
	f, _ := io.ReadAll(resp.Body);
	defer resp.Body.Close()

	d, err := vorbis.DecodeWithSampleRate(44100, bytes.NewReader(f))
	if err != nil {
		log.Fatal(err)
	}

	player, err = audio.NewPlayer(audioContext, d)
	if err != nil {
		log.Fatal(err)
	}
```

で、読み込んでました

# wasmでのプリント・デバッグ

　fmt.Println で、デベロッパーツールのコンソールへ、メッセージを表示できます

以上です、キャップ！
時系列の欠損値を線形補間する(SPSS Modeler データ加工逆引き5-9)

# 時系列の欠損値を線形補間（欠損値の補完）

![5_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bf0fd934-42e6-713f-8d8f-a5526f3a1f3a.png)


## 1.想定される利用目的

・論理在庫の推定
・設備IoTデータの欠損値の処理

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/missing_values2linear.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-15 15.17.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/63fb4c34-05a9-6062-2c61-0ed92f476033.png)

a.入力するデータは以下の通りです。[置換]ノードで意図的に欠損値を発生させています。
![スクリーンショット 2022-07-15 15.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a12d45f8-ed47-e5f8-2321-b1515729ce43.png)

b.[時系列]ノードを編集します。予測対象を温度にします。
![スクリーンショット 2022-07-15 15.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/901447d0-fa5a-af63-642b-c96d88e8ebce.png)

[データ指定]タブの[期間フィールド]を[Time]に設定します。
![スクリーンショット 2022-07-15 15.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f2b5c68c-5605-6089-78a1-8ab0e2484037.png)

[データ指定]タブの[欠損値の処理]を[線形補間]に設定します。説明変数としての温度の欠損を線形補間します。
![スクリーンショット 2022-07-15 15.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/11fc17b7-1f22-8eaf-de67-324990210056.png)

[テーブル]を実行します。
![スクリーンショット 2022-07-15 15.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/db4517ae-4fcc-3fed-01ef-a9791356b3a5.png)


#### 注意点

線形補間された温度の他に予測フィールドも作成されますが、これはトレンドを考慮した予測です。用途によってはこちらが有効な場合も考えられます。

## 4.参考情報

#### 線形補間について解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-03/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【GitHub】Personal access tokenの取得方法

## 取得方法
GitHub Packagesに公開などをするには認証が必要です。  
以下の手順でパーソナルアクセストークンの設定をします。  

GitHubのSettingsページを開きます。
![image220730_080233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/14c246e6-70d9-7fd7-3d05-0155e24eeb20.png)

左サイドバー一番下の「Developer settings」を選択します。
![image220730_080909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/4e5c8cff-a85e-98b6-c83b-d5e379ba535f.png)

左サイドバーの「Personal access tokens」を選択します。
![image220730_081141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/066fa4c1-de28-efb4-857c-e306db42bc4d.png)


「Generate new token」を選択します。
![image220730_081329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a2978e2c-1fd3-5caa-381a-98748e3f5f3a.png)


「Note」にわかりやすい名称を入力します。
![image220730_081453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/19690a42-56b8-d8e6-f337-c9f4a96dad66.png)


「Select scopes」でスコープを設定します。
![image220730_081711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ac65a36e-a0f2-f8bd-407d-b3a66e24f1bb.png)

「Generate token」をクリックします。
![image220730_081643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/0ac81b28-5b93-9499-bbb2-96ce63a8f99f.png)
【css】本番環境とローカル環境のレスポンシブ対応がが違う！

タイトル通り、Webアプリからスマホ用のレスポンシブを設計後、本番環境でサイトを確認すると、レイアウトがローカルとは違ったものになるという問題に遭遇しました。

### 原因として考えられるもの
一通りググった結果、
・normalize.cssと呼ばれるブラウザ側の環境によらず、同じようにサイトを表示するための機能が既存のcssを削除してしまう
・OSやブラウザのレンダリングモードの違いによって、ファイルパスやcssセレクタの大文字小文字の違いの解釈が異なることにより読み込まれない場合
・修正はされているが、ブラウザに残っているキャッシュが適用されているため、表示が変わっていない
・htmlのheadの読み込み部分で、reset.cssが読み込まれていない。または、読み込む順序に不備がある
・reset.cssにリセットのためのcodeがない

自身のサイトをよく見た結果、input要素とsubmit要素に共通してレイアウト崩れがあるのがわかりました。検証した結果、今回は一番最後のものが原因だとわかりました。

### 結論
reset.cssにて、リセットしていない設定があったため、ブラウザやバージョンが異なる環境でレイアウトに違いが出ていました。したがってreset.cssの記述を変更することで解決します。

リセットcssのサンプルはこちら

https://web-camp.io/magazine/archives/30817

###参考サイト

https://fhiyo.github.io/2017/08/13/different-responsive-behavior.html

https://teratail.com/questions/180232

https://qiita.com/oyuki04/items/1f198ae767c1ef352604

https://teratail.com/questions/327430
MIPSのSIMD其の参

さすがにユーザープロセスを起動するとカーネルが落ちるのは最強の脆弱性なので、とりあえず落ちないようにしてみる事にしました。

処理はIllegal instructionと同じにすればよいはずです。

Table B.4 Exception Code values in Cause[ExcCode]

|Val|Code|What just happened?|
|:--|:--|:--|
|10|RI|Instruction code not recognized (or not legal)|
|26|DSP|Tried to run an instruction from the MIPS DSP ASE, but it’s not enabled (that is, Status[MX] is zero).|

で、sys/mips/include/trap.hにDSPを追加します。

```diff
diff --git a/sys/mips/include/trap.h b/sys/mips/include/trap.h
index a88784f869c5..613df63c47e0 100644
--- a/sys/mips/include/trap.h
+++ b/sys/mips/include/trap.h
@@ -69,6 +69,7 @@
 #define T_C2E                   18      /* Exception from coprocessor 2 */
 #define        T_DWATCH                23      /* Data Watch address reference */
 #define T_MCHECK                24      /* Received an MCHECK */
+#define T_DSP                   26      /* Not enable DSP ASE */
 #define        T_VCED                  31      /* Virtual coherency data */
 
 #define        T_USER                  0x20    /* user-mode flag or'ed with type */
```

処理はsys/mips/mips/trap.cに追加します。

```diff
diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c
index 50747ff85dd2..fb92c8dd0f24 100644
--- a/sys/mips/mips/trap.c
+++ b/sys/mips/mips/trap.c
@@ -894,6 +894,7 @@ trap(struct trapframe *trapframe)
                }
 
        case T_RES_INST + T_USER:
+       case T_DSP + T_USER:
                {
                        InstFmt inst;
                        inst = *(InstFmt *)(intptr_t)trapframe->pc;
```

74Kでも落ちなくなりました。

```
# ./bitrev 
Illegal instruction
```

さーて、サポートコードも考えてみるか。

warnerさんから指摘されたんだけどtoolchainどうするかって話で、gcc 4.2.1はmdspのサポートがありますが、mdspr2はないです。ただbinutilは両方に対応しているのでasで使う分には問題ないと思います。

ちなみにmdspr2はgcc 4.3.xから入ったようです。

私のFreeBSDのレポジトリのgcc 4.2.1にdspr2の差分追加しました。

gcc 4.9.2でのdefineはこうなります。

```
% echo | ./mips-gcc -dM -E - | grep dsp
% echo | ./mips-gcc -mdsp -dM -E - | grep dsp
#define __mips_dsp_rev 1
#define __mips_dsp 1
% echo | ./mips-gcc -mdspr2 -dM -E - | grep dsp
#define __mips_dsp_rev 2
#define __mips_dspr2 1
#define __mips_dsp 1
```

gcc 4.2.1では-mdspはサポートされていますが、__mips_dspは定義されてないので注意が必要です。
[Amplify]ホスティング機能でURLパラメータを利用することが困難

## 概要
Amplifyのホスティング機能でSPAを公開する場合URLパラメータ(クエリストリング・クエリ文字列)を利用することが困難なケースがあるため解説いたします。
2022/7/31現在未解決です。下記issue内でも議論されていますが、Amplifyの設計思想による仕様である可能性があります。そのため今後解消されるかは不明です。

**GitHubのissue**
https://github.com/aws-amplify/amplify-hosting/issues/97

## 解説
Amplifyのホスティング機能を利用してSPAを公開した場合、ルート(/)以外へのリンクはURLパラメータが消されたうえでトップページへのリダイレクトが発生します。一方で、ルートへアクセス後のSPAのHistory APIによるページ遷移ではURLパラメータを利用できます。
そのため、ルート以外ではクエリパラメータを利用することができません。

SPAでは通常のページ遷移と異なり、単一のファイル内で仮想的にページ遷移を行います。そのため一般的にはルート以外(例：/about)へのアクセスが行われた場合、一度ルートへリダイレクトするよう設定しておき、その後パスとURLパラメータを解析しページを表示するよう設定します。
一方でAmplifyのホスティングではどう設定してもURLパラメータはリダイレクト後にクリアされてしまいます。

## 一時的な解決方法
別ページで処理を行いたい場合もルートへアクセスさせ、アプリケーション内でページへのリダイレクトとURLパラメータの引き渡しを行います。
私の場合はリダイレクトしたいパスをパラメータとして渡しました。

例：
```
# アプリ内で "/hoge-page/?name=fuga" に変換してリダイレクトする
/?path=hoge-page&name=fuga
```

場当たり的な対応となりますが、どうしてもURLパラメータを利用したいケースでは動作します。
対応に苦慮しましたのでどなたかの助けになればと思います。

もしより良い対応をご存知の方がいれば教えていただければ幸いです。
VB.net ASP.net 備忘録

## 入力候補
|項目|説明|備考|
|----|----|----|
|★マーク|よく使われるプロパティやメソッド||
|立方体|メソッドまたは関数||
|直方体|フィールドまたは変数||
|スパナ|プロパティ||

https://learn.microsoft.com/ja-jp/visualstudio/ide/class-view-and-object-browser-icons?view=vs-2022

## ソリューションエクスプローラー 特定のファイルが見えない
### 「プロジェクトから除外」になっている
「すべてのファイルを表示」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/b7134f08-77a6-6e1f-aa3a-d62b0c0c8fc0.png)
表示させたいフォルダおよびファイルを右クリックし「プロジェクトに含める」を押下

## 「runat="server"」
指定エレメントをASP.NETエンジンの処理対象にする。
指定したエレメントのID名をVB側でオブジェクトとして扱える。
|記述箇所|記述例|
|----|----|
|aspx側|\<asp:TextBox ID="txtName" <b>runat="server"</b>\>\</asp:TextBox\>||
|vb側|Dim name As String<br>name =<b>txtName</b>.Text||

## 「AutoPostBack=ture」 Changeイベント
DropDownListやCheckBox、RadioButtonなどのコントロールに変化があった際、サーバへ処理を送信したい場合に使う。
|記述箇所|記述例|
|----|----|
|aspx側|\<asp:DropDownList <b>AutoPostBack="true" OnSelectedIndexChanged="DdlTEST_SelectedChanged"</b> ID="DdlTEST" runat="server"\>||
|vb側|Protected Sub <b>DdlTEST_SelectedChanged</b>(sender As Object, e As EventArgs) Handles <b>DdlTEST</b>.SelectedIndexChanged||

## 「ex.StackTrace」例外発生箇所と内容出力

```vb
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            'InvalidCastException
            Debug.WriteLine("てすと" + 1)

        Catch ex As Exception
            Debug.WriteLine("内容" & ex.StackTrace & " ここまで:内容")
        End Try
    End Sub
End Class
```



```ex.StackTrace 無
例外がスローされました: 'System.InvalidCastException' (Microsoft.VisualBasic.Core.dll の中)
```
ex.StackTrace が有りは、例外がどこで起きたのかわかるため、デバッグ時に役立つ

```ex.StackTrace 有
例外がスローされました: 'System.InvalidCastException' (Microsoft.VisualBasic.Core.dll の中)
内容   at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value)
at WinSampleFormsApp.Form1.Button1_Click(Object sender, EventArgs e) in C:\Users\user\source\repos\WinSampleFormsApp\WinSampleFormsApp\Form1.vb:line 5 ここまで:内容
```

## 現在のメソッド名取得
```
Debug.WriteLine("method名：" & System.Reflection.MethodBase.GetCurrentMethod.Name)
```

## コンフィグファイル作成
https://dobon.net/vb/dotnet/programing/appconfigfile.html

## xlmファイルの読み書き
```sample.xlm
<?xml version="1.0" encoding="utf-8"?>
<configration>
  <PATH>
    <Sample>aaa</Sample>
  </PATH>
</configration>
```
```xmlDoc.vb
Dim xmlDoc As New XmlDocument()
Dim filename As String = "setting.xml"
Dim str As String
xmlDoc.Load(filename)

str = xmlDoc.DocumentElement.SelectSingleNode("PATH/Sample").InnerText
Debug.Print str '結果→ aaa

'aaaをbbbに変更して保存
xmlDoc.DocumentElement.SelectSingleNode("PATH/Sample").InnerText = "bbb" 
xmlDoc.Save(filename)'保存

str = xmlDoc.DocumentElement.SelectSingleNode("PATH/Sample").InnerText
Debug.Print Debug.Print str '結果→ bbb

```


## TabControl
### タブの名前変更
プロパティ> TabPagesの[...]を押下 > TabPageコレクションエディタ[表示]の[Text]を変更 

## Visual Studio 2022でインストーラ作成

https://www.osadasoft.com/visual-studio-2022%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E4%BD%9C%E6%88%90/
2022/8/1主にITとかセキュリティの記事

サイバー攻撃、同じ企業が何度も被害に(7/30)
https://www.zaikei.co.jp/article/20220730/683223.html

ネットバンキングの不正送金はどのくらい発生している？ 身近な対策方法も解説(7/29)
https://financial-field.com/living/entry-152788

最新フィッシングメール動向: 従業員が最も引っかかりやすい件名は人事部門やIT部門からのメールを装う通達やお知らせ(7/29)
https://www.jiji.com/jc/article?k=000000103.000053624&g=prt

Apple iOSアプリのサイドローディングに反対！ウィルス感染はAndroidとWindowsで7割以上(7/30)
https://www.appps.jp/368812/

ソラナ（SOL）の発展と課題・今後の重要イベントについて、Messari社レポート(7/29)
https://coinpost.jp/?p=372014

モバイル決済アプリを危険にさらす10の詐欺に注意(7/30)
https://news.mynavi.jp/techplus/article/20220730-2410283/

頓挫しかけているビッグテック規制、11月までの決着なるか?(7/29)
https://news.mynavi.jp/techplus/article/svalley-928/

架空の振込みを呼びかけるメールに関する注意(7/29)
https://arrows.red/news/info/n202207292/

KDDI補償に便乗、詐欺メールにご用心　むやみにアクセスしないで(7/29)
https://news.yahoo.co.jp/articles/1029ea21d8abff92236d47395fd3d6552d8ba8f3

マイナンバーで買い物する日がやって来る？－倶楽部情報局(7/29)
https://ascii.jp/elem/000/004/099/4099172/?rss

譲渡可能なガバナンストークンでDAOは可能か？ ヴィタリック・ブテリン氏が問題提起(7/30)
https://jp.cointelegraph.com/news/eth-founder-speaks-against-transferable-governance-community-responds

イーサリアムネットワーク、「マージ」直前のテストネット最終統合が来週に予定(7/29)
https://jp.cointelegraph.com/news/ethereum-dev-confirms-goerli-merger-date-the-final-update-before-the-merge

アップル、メタバースを阻害：専門家(7/30)
https://www.coindeskjapan.com/155765/

KDDI障害報告、雑感(7/30)
https://www.orangeitems.com/entry/2022/07/30/182742

ニンテンドーWi-Fiネットワークアダプタに脆弱性、使用の停止を-JPCERT/CC(7/30)
https://news.mynavi.jp/techplus/article/20220730-2411195/
goのdbのチュートリアルのos.Getenvが正しく環境変数を参照しない問題への暫定的な解決策

# 発生している問題

Go言語でリレーショナルデータベースにアクセスするチュートリアル、[Tutorial: Accessing a relational database](https://go.dev/doc/tutorial/database-access#set_up_database)の「Get a database handle and connect」のセクションで`os.Getenv`で環境変数を参照する箇所が存在する。

そこで、環境変数DBUSERをキーに指定した際に`root`を表示したいものの、`username`と表示されてしまう。resourceコマンドで`~/.zshrc`を更新しても同様の状況になりDBへ接続できない。

## 暫定的な解決策
UserとPasswdのバリューに直接rootとrootのパスワードを追加する。

```go


func main() {
    cfg := mysql.Config{
        // 本来はこのように書きたいが、username、localhostと表示される。 
        //User:   os.Getenv("DBUSER"),
        //Passwd: os.Getenv("DBPASS"),

        //良くないけど、このように直書きすると接続に成功する
        User:   "root",
        Passwd: "rootのパスワード",
        
        //以下略
    }
}
```
PlatformIO(VSCode)でMicrosoft謹製のシリアルモニターを使う

ArduinoやESP32系マイコンの開発はもっぱら[PlatformIOでやっているのですが](https://elix.jp/app/tools/qiita_index.html?uuid=ELIXIR&tag=PlatformIO)、
ボーレートの変更やシリアルの入出力チェック等、PlatformIOのターミナルではできない/やりにくいことが多いです。
いままではSerialPortHelperを使っていたのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a0ba3257-544a-78eb-8f01-502dd0d512ca.png)
最近これが起動に失敗するようになってしまいまして、[Readme](https://github.com/imlinhanchao/vsc-serialport-helper/wiki/How-To-Build-SerialPort-Node-module)をみながら修正を試みていたのですが、ふと見ると
[Serial Monitor](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-serial-monitor) というMicrosoft謹製のツールが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f1cb7145-e82a-e39b-bfdc-567c09a32c62.png)
ということで早速試してみました。


インストールするとコンソールのところに SERIAL MONITOR というタブが追加されるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/77e80e83-e1db-50b2-1e12-abce8417db31.png)
TERMINALをつなぐ前に、もしくはつないだTERMINALを切断してから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c3f73cde-6413-a766-f6af-123b1162aab4.png)
SERIAL MONITORタブを選択し、Start Monitoringを押すとモニターを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/84e0c934-aeb5-08d8-4183-1b74af91b1c2.png)
PortにはArduino Unoを接続しているのですが、文字化けしちゃっていますね(Windows10)。まあよしとしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/13608285-9ba1-9282-bdff-146937e51047.png)
こんな感じでモニタリングができます。ボーレートも自由に変えられますし、歯車ボタンを押すとさらに細かい設定も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/00b36493-e41b-11d0-9bcf-f1a47c30c639.png)
また最下段のテキストボックスに文字列を入力して Send Message ボタンを押すと、文字列をシリアルに送ることが可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1ceb4ca5-5555-9438-bac1-ef601c37dbe5.png)
今のところ申し分ない使い勝手なので、しばらくSerialPortHelperは放置して、こちらのシリアルモニターを使ってみたいと思います。
【Swift】URLから画像を保存する

# はじめに
画像を保存する機能を作る機会があったので今後再利用することも考えて記事に残しておきます。

# 事前設定
Info.plistに以下を設定
`NSPhotoLibraryAddUsageDescription`

:::note warn
注意点
https://qiita.com/SNQ-2001/items/85528c59b2310dcc7a82
:::

# 実装
```swift
class ViewModel: NSObject, ObservableObject {
    // 画像保存
    public func savingImage(url: String) {
        guard let url = URL(string: url) else {
            print("エラー")
            return
        }
        do {
            let data = try Data(contentsOf: url)
            guard let image = UIImage(data: data) else {
                print("エラー")
                return
            }
            UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.didFinishSavingImage), nil)
        } catch {
            print("エラー")
        }
    }

    @objc private func didFinishSavingImage(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        if error == nil {
            print("成功")
        } else {
            print("失敗")
        }
    }
}
```
:::note warn
注意点
`NSObject`は必須です。
:::


# 使い方
```swift
struct ContentView: View {
    @ObservedObject private var viewModel = ViewModel()
    var body: some View {
        Button("画像保存") {
            viewModel.savingImage(url: "https://taishin-miyamoto.com/ShadowBan/image/shadow_ban_icon.png")
        }
    }
}
```

# おわり
`NSPhotoLibraryAddUsageDescription`の設定を忘れがち
やってないとクラッシュします
Laravel + Vue.jsでaxiosからのリクエストが失敗した単純なミス

## 環境
* Laravel：6
* Vue.js：2.6.14
* axios：0.19
## 事象
Laravel + Vue.jsでaxiosからの`put`リクエストでデータを更新しようとしたのですが、
以下のようなエラーでうまくいきませんでした。

```javascript:resources/js/components/ExampleComponent.vue
 const response = await axios.put('books/', {
    data: val,
 }).catch(e => {
    console.log(e);
 });
```

ChromeのDevToolsより
```
Request Method: PUT
Status Code: 405 Method Not Allowed
```
エラー405が返ってきてしまいました。
## 原因
そもそもLaravelのルーティングのメソッドが`patch`だったのに、axiosのエイリアスを`put`にしていたことが原因でした。

```php:routes/web.php
Route::patch('books/', 'BookController@update');
```

こちらが修正したコード。
```javascript:resources/js/components/ExampleComponent.vue
 const response = await axios.patch('books/', {
    data: val,
 }).catch(e => {
    console.log(e);
 });
```

## おまけ
このような単純なミスでしたが、色々調べて脱線していきまして
axios側を以下のようにしても大丈夫でした。

```javascript:resources/js/components/ExampleComponent.vue
const response = await axios.post('books/', {
    data: val,
    _method: 'patch',
}).catch(e => {
    console.log(e);
});
```
今回はわざわざ`post`にして`_method: 'patch'`を追加する必要はなかったですが、
putリクエストやpatchリクエストが正常に取得できない場合に使うそうです。

参考記事

https://stackoverflow.com/questions/51170564/axios-patch-axios-put-is-not-working-in-vue-and-laravel


## 結論
axiosのエイリアス側とLaravelのルーティングのメソッドを合わせればいいだけでした。
putとpatchが似ている分、混在してしまった単純なミスでした。
Laravelでメールサーバを複数利用する

# はじめに
とあるシステムで外部メールサーバと社内メールサーバを切り分けて利用するケースがありましたので、備忘録がてら記載します。

FWというか通常のシステムでも複数メールサーバの切り分けはあんまりやらない気がするので、需要は薄いと思いますが・・・

# やること
以下のメール設定値をオーバーライドして、メール送信時の設定を切り替える。

## 1. 環境設定値の追加
```diff_php:.env
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

+ CUSTOM_MAIL_HOST=mailhog
+ CUSTOM_MAIL_PORT=1025
+ CUSTOM_MAIL_USERNAME=null
+ CUSTOM_MAIL_PASSWORD=null
+ CUSTOM_MAIL_ENCRYPTION=null
+ CUSTOM_MAIL_FROM_ADDRESS="hello@example.com"
+ CUSTOM_MAIL_FROM_NAME="${APP_NAME}"
```

## 2. 環境設定値を参照するメール設定値の追加
```diff_php:mail.php
'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'local_domain' => env('MAIL_EHLO_DOMAIN'),

+        'custom' => [
+            'transport' => 'smtp',
+            'host' => env('CUSTOM_MAIL_HOST', 'smtp.mailgun.org'),
+            'port' => env('CUSTOM_MAIL_PORT', 587),
+            'encryption' => env('CUSTOM_MAIL_ENCRYPTION', 'tls'),
+            'username' => env('CUSTOM_MAIL_USERNAME'),
+            'password' => env('CUSTOM_MAIL_PASSWORD'),
+            'timeout' => null,
+            'local_domain' => env('CUSTOM_MAIL_EHLO_DOMAIN'),
        ],
```


## 3. メール送信の実装
設定値をもとに戻さないと変更がそのまま引き継がれます。
```diff_php
+ // ↓設定一時変更
+ config(['mail.default' => 'custom']);

// メール送信

+ // ↓設定初期化
+ config(['mail.default' => 'smtp']);

```

## 4. 例外時にもメール設定値を戻す
ここでも戻さないと、例外時にメール送信をしていた場合は、別の設定で送信されてしまいます。
```diff_php:Handler.php
public function report(Exception $exception)
{
+    // ↓設定初期化
+    config(['mail.default' => 'smtp']);
```

# 注意事項
設定変更は、オーバーライドしたままになるため、設定値をもとに戻す必要があります。
例えば、もとに戻さない状態だと、後続処理のメール送信設定や、エラー発生時の送信設定が意図しないもので動作してしまいます。
UbuntuにWordPressをインストールしてみた

先日、WordPressをUbuntuにインストールしてみたので、その時のメモを残します。

# apache2、php、mysqlのインストール

下のコマンドで、apache2やphp、mysqlなどのWordPressに必要なツールをインストールします。

```
$ sudo apt install apache2 php mysql-server php-mysql
```

phpによるアップロードのファイルサイズ制限が2MBytesと少ないため、20MBytesまで拡大します。

```
$ sudo nano /etc/php/[バージョン]/apache2/php.ini
・・・
upload_max_filesize = 20M
```

その後、apache2とmysqlのサービスを起動します。

```
$ sudo service apache2 start
$ sudo service mysql start
```

# mysqlのデータベース構築

WordPressが使用するデータベース（データベース名：wp_database）を作成し、そのデータベースを使用するユーザ（ユーザ名：wp_user、パスワード：wp_password）を登録後、そのユーザに先に作成したデータベースの全権限を与えます。

```
$ sudo mysql
mysql> create database wp_database default character set utf8;
mysql> create user wp_user@localhost identified by 'wp_password';
mysql> grant all on wp_database.* to wp_user@localhost;
```

# WordPressのインストール

WordPressのサイトから最新のWordPress（zipファイル）をダウンロードします。ダウンロードしたzipファイルを展開して作成されたファイルを全て`/var/www/html/`にコピーします。

```
$ sudo cp -r * /var/www/html/
```

ただ、WordPressが使用するコンフィグファイルがないため、`wp-config-sample.php`を`wp-config.php`としてコピーします。

```
$ sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
```

コピーした`wp-config.php`を編集します。mysqlで登録したデータベース名(wp_database)、ユーザ名(wp_user)、パスワード(wp_password)に書き換えます。

```
$ sudo nano /var/www/html/wp-config.php
define( 'DB_NAME', 'wp_database' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'wp_password' );
```

# WordPressの設定

サーバのブラウザのURL欄に`http://[サーバのFQDN]/wp-login.php`と入力し、WordPressの画面を起動します。そこで、管理者のアカウントを作成し「WordPressをインストール」を押します。
![wpadmin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/584c7f5c-eb6f-b80e-07db-b89cb5151e97.png)
その後、「一般設定」の画面を出し、「サイトのタイトル」や「WordPressのアドレス」などを確認・訂正し「設定を保存」を押せば、インストール作業は完了です。
![wpsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/ef4d909c-bf98-8e24-a388-6917b01a9faa.png)

# さいごに

プラグインのサイズが20MBytes以上ある場合には、phpインストール時に書き換えたphp.iniの`upload_max_filesize = 20M`をファイルサイズより大きくしてください。

またWordPress上からプラグインがインストールできない時は、`/etc/www/html/`のフォルダをwww-dataユーザが使えるようにします。ただ、`/etc/www/html/`上のファイルをwww-dataがいつでも読み書きできるのはセキュリティ的に問題がありそうなので、自己責任でお願いします。

```
$ sudo chown -R www-data:www-data /etc/www/html/*
```
AgoutiでWebブラウザの操作を自動化してテストする

# 概要

GolangのWebDriverであるAgoutiを使用して、UIテストを自動化する方法を紹介します。
本記事ではID/パスワードでログインを行うようなサイトでのデモを紹介します。

:::note
AgoutiではUIテストの自動化だけでなく、Webスクレイピング的に情報取得の自動化もできます。
:::

:::note warn
物によってはブラウザゲームの自動化やログインボーナスの収集ツールのようなものも作れますが、利用規約等に従って活用するようにしましょう。
:::

# 前提条件

- この記事内ではWindows環境前提での紹介とします。
- Goバージョン1.18.4
- ブラウザはChromeを前提とします。

# 事前準備


Chromeのバージョンに従って、ChromeDriverをインストールする。

![2022-07-31_16h50_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/08edc687-eece-3b17-9ca1-3958ff885e63.png)


[chromedriver](https://chromedriver.chromium.org/downloads) から確認したChromeバージョンに対応したChromeDriverをダウンロードしておく。

![2022-07-31_16h49_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/7496f937-fc97-ec71-710e-066dc6582dba.png)

:::note
Chromeのバージョンが更新されたときにChromeDriverのバージョンとずれて動かなくなるケースがあるため、動かなくなった場合はバージョンの見直しを行いましょう。
:::


:::note
ChromeDriverは以下で作成するソースと同じディレクトリに置くことでそこのChromeDriverが使用されますが、PATHを通しておくことで都度ChromeDriverを配置しなくても良くなるので、複数のテストコードを記述する場合環境変数に登録しておくことをおすすめします。
:::

# 実装

## デモ用サイト

テスト用デモサイトとして公開されている以下のサイトを使用させていただきます。

https://hotel.testplanisphere.dev/ja/

## 実装内容

複数ソースに渡るため、githubに公開しておりますのでご参照ください。

https://github.com/g-iki/agoutiDemo

- loginDemo
    - ユーザ1人の情報を渡してログインする処理を実行します
- multiLoginDemo
    - 複数ユーザの情報を渡してその分だけブラウザを開き、ログインする処理を実行します

## よく使う(かも知れない)スニペット

### 要素を探し出して文字列を入力

```
page.FindByID("email").Fill("test@example.com")
```

### 要素を探し出してクリック

```
page.FindByID("btnLogin").Click()
```

### スクリーンショットを撮る

引数にはファイル名を指定します(すでに同じ名前のファイルがあれば上書きします)

```
fileName := "screenshot.png"
page.Screenshot(fileName)
```

### 任意のスクリプトを実行する

サンプルでは`window.alert()`を呼んでいますが、
フロント処理で実装されている処理を発火させることもできます。

```
script := "window.alert('test!!!')"
page.RunScript(script, nil, nil)
```

# ドキュメント等



### github

https://github.com/sclevine/agouti

### goDoc

https://pkg.go.dev/github.com/sclevine/agouti
UbuntuでexFATフォーマットのディスクをマウントするための備忘録

Ubuntu20ではexFATのディスクドライブをデフォルトでマウント出来ます．しかし，少々困った問題が有ります．実際に見てみます．以下のコマンドでマウント対象のexFATフォーマットのディスクを探します．

```bash
sudo fdisk -l
```

今回は`/dev/sdb1`がマウント対象のディスクなので`/mnt/ssd`にマウントしてみます．

```bash
$ sudo mkdir /mnt/ssd
$ sudo mount -t exfat -o rw /dev/sdb1 /mnt/ssd
```

マウント出来たら，直下にディレクトリを作成してみます．ところが，権限が無く作成出来ませんでした．無論`root権限`を用いれば作成出来ます．しかし，これは少々困った問題です．現在ログインしているユーザーの権限で(コマンドライン操作による)ファイル操作が一切出来ないことを意味します．

```bash
$ mkdir ssd/test
mkdir: ディレクトリ ssd/test を作成できません: 許可がありません
$ sudo mkdir ssd/test
$ sudo rmdir ssd/test
```

ここでは一旦マウントしたディスクをアンマウントしておきます．

```bash
$ sudo umount /mnt/ssd
```
この問題を解決するアプリケーションとしてexfat-fuseとexfat-utilsが有ります．まずは念の為，既にインストール済ではないか確認します．

```bash
$ dpkg -l exfat-fuse
dpkg-query: exfat-fuse に一致するパッケージが見つかりません
```

それでは`apt`を用いてインストールします．

```bash
sudo apt install -y exfat-fuse exfat-utils
```

以下の実行例のように，どちらかのインストールを実行すると，依存アプリケーションとしてもう片方もインストールされます．

```bash
$ sudo apt install -y exfat-fuse
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfwupdplugin1
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  exfat-utils
以下のパッケージが新たにインストールされます:
  exfat-fuse exfat-utils
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
65.3 kB のアーカイブを取得する必要があります。
この操作後に追加で 302 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 exfat-fuse amd64 1.3.0-1 [24.6 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 exfat-utils amd64 1.3.0-1 [40.7 kB]
65.3 kB を 0秒 で取得しました (330 kB/s)
以前に未選択のパッケージ exfat-fuse を選択しています。
(データベースを読み込んでいます ... 現在 195568 個のファイルとディレクトリがインストールされています。)
.../exfat-fuse_1.3.0-1_amd64.deb を展開する準備をしています ...
exfat-fuse (1.3.0-1) を展開しています...
以前に未選択のパッケージ exfat-utils を選択しています。
.../exfat-utils_1.3.0-1_amd64.deb を展開する準備をしています ...
exfat-utils (1.3.0-1) を展開しています...
exfat-utils (1.3.0-1) を設定しています ...
exfat-fuse (1.3.0-1) を設定しています ...
man-db (2.9.1-1) のトリガを処理しています ...
```

インストールが完了したら，再度マウント操作を実行します．実行方法は変わりません．しかし，以下のように実行後`FUSE exfat 1.3.0`と出力されます．

```bash
$ sudo mount -t exfat -o rw /dev/sdb1 /mnt/ssd/
FUSE exfat 1.3.0
```

それではマウントしたディスク直下にディレクトリを作成して，作成したディレクトリを削除してみます．今度は`root`権限無しで操作が実行出来ました．

```bash
$ mkdir ssd/test
$ rmdir ssd/test/
```

アンマウントの方法も変わりません．

```bash
sudo umount /mnt/ssd
```

# Reference

https://qiita.com/sasayabaku/items/bcfcc37e8a34b00ca6e9

https://askubuntu.com/questions/772179/ntfs-filesystem-on-external-drive-isnt-recognised-mount-wrong-fs-type-bad-o

https://www.xmisao.com/2015/05/17/how-to-mount-exfat-in-debian.html
UbuntuでFTPサーバを立ててみた

UbuntuでFTPサーバを立ててみました。

# サーバ側

下のコマンドでインストールします。

```
$ sudo apt install vsftpd
```

設定ファイル`/etc/vsftpd.conf`の中の下の行をコメントアウトします。

```
write_enable=YES             # ユーザによるサーバへの書き込みを可能にする
ascii_upload_enable=YES      # asciiモードによるアップロードを可能にする
ascii_download_enable=YES    # asciiモードによるダウンロードを可能にする
```

下のコマンドでサービスを開始します。

```
$ sudo service vsftpd start
```

再起動してもvsftpdを起動したい時は、下のコマンドを実行します。

```
$ sudo systemctl enable vsftpd
```

# クライアント側

Ubuntu22.04だと、FTPのクライアント側のツールはインストール済みです。よって、下のコマンドでサーバに接続できます。

```
$ ftp [サーバのIPアドレス]
```

FTPの接続後にIDとパスワードを求められます。その時入力するIDとパスワードは、サーバ(Ubuntu)のログインユーザとそのパスワードです。
dockerとdocker-composeは別モノだった！（ドドーン）

いや、知ってはいたんですよ……
知ってたはずなんですけどねー……
昨日の自分を○したいです (c)東京ダイナマイト

## Unsupported config option for …: 'platform' に苦しめられる

とある docker-compose.yml を M1 Mac で動くようにしたかったんです。

`platform: "linux/x86_64" って書けば動くようになるよ`

という情報を見てそのまま書いたんですけどね。

```
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.xxx: 'platform'
```

ん？そんなオプションはないよ？ `platform` というオプションはない？
どういうこと？

で、なんか一生懸命、 `dockerをいじってました。`
設定いじったりね。デフォルト設定に戻したりね。
アンインストールしてインストールしたりね。

……そして気がつく Ultra Soul！（違）

```
% docker-compose -v
docker-compose version 1.23.2, build 1110ad0
```

めちゃくちゃ古い。だから `platform` もないんです。
（ちなみに 1.23.2 は 2018年11月29日）
（そして、 `platform` が使えるようになったのは恐らく 1.28.5(2021-02-26) 以降）

で、docker-composeも M1 Mac版 ってあるんですかね？

```
sudo curl -L https://github.com/docker/compose/releases/download/2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     9  100     9    0     0     23      0 --:--:-- --:--:-- --:--:--    23
```

ってのをコピーして実行したんですが、9バイトの何かが落ちてくるだけ。
（ちなみに中身は `Not Found`）

```
% uname -s
Darwin
% uname -m
arm64
```

該当するバージョンが存在しないんですね。

```
% sudo curl -L https://github.com/docker/compose/releases/download/v2.8.0/docker-compose-darwin-x86_64 -o /usr/local/bin/docker-compose

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 27.4M  100 27.4M    0     0  3817k      0  0:00:07  0:00:07 --:--:-- 5643k

% docker-compose -v
Docker Compose version v2.8.0
```

ようやくバージョンが上がって、 `platform` を解するようになってくれました 👏