OmniAICreator/Qiita-1.07M huggingface dataset:
統計検定 統計調査士 試験対策

# 概要
受験者数の少ないややマニアックな試験。
数理統計学的な知識は統計検定2級レベルで充分。日本の公的統計の概要を抑えれば合格できる。
参考書はたぶん 1 冊しかない。問題集を解きながら参考書の内容を頭にたたき込む。
同じ問題集に収載されている専門統計調査士の内容まで頭に入れれば、最優秀成績賞も獲得できる。

# 参考書
日本の公的統計・統計調査（2019年）
https://www.amazon.co.jp/dp/4866931256/

# 問題集
日本統計学会公式認定　統計検定　統計調査士・専門統計調査士　公式問題集［2017〜2019年］
https://jitsumu.hondana.jp/book/b505613.html

# 持ち物
- 電卓　例）MW-12GT-N
【Docker】artisan storage:link　で作成したらフォルダではなくファイルになってしまう時。

### 原因
```php
./vender/bin/sail artisan storage:link
or
php artisan storage:link
```
この二つのコマンドで結果が変わってしまいます。

sailコマンドはlaravel特有のもので
今回のstorageフォルダはDockerコンテナ上で起動しているので
参考：https://dkssksk.com/php-storage-image/

```php
php artisan storage:link
```
を使う必要があります。

これで解決です。

正直、sailとphpコマンドの違いを深く理解できていないので
間違いがあればご教授いただきたいです。
M1チップ搭載のMacのAngularなどの環境構築

# はじめに
最近Macの初期化をすることが多く、いちいち設定するのが面倒なのでまとめた。
以下を入れる
- Homebrew
- Chrome
- Slack
- Sourcetree
- VScode
- Zoom
- Nodejs
- angular cli

# TL;DR
前提
- M1チップではない、もしくはRosettaを有効化済み
- Homebrewがインストール済み
- zsh

```bash
brew install --cask google-chrome slack sourcetree visual-studio-code zoom; brew install nodebrew; nodebrew -v; nodebrew setup; nodebrew install-binary v14.19.0; nodebrew use v14.19.0; echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile; source ~/.zprofile; npm install -g @angular/cli; ng --version;
```


# M1チップを利用している場合
- Rosettaのインストール
    - https://support.apple.com/ja-jp/HT211861
- Rosettaを有効化
    - Finder > アプリケーション > ターミナル右クリック > 情報を見る 

# Homebrewのインストール
[Homebrewの公式サイト](https://brew.sh/index_ja)からスクリプトをターミナルにコピペして実行。
以下のコマンドを実行しHomebrewのバージョンが表示されればOK
```bash
brew --version
```

# 各ツールのインストール
Chrome, Slack, Sourcetree, VScode, Zoom
```bash
brew install --cask google-chrome slack sourcetree visual-studio-code zoom
```

# Nodejsのインストール
## インストール
以下のコマンドを実行。
```bash
brew install nodebrew; nodebrew -v; nodebrew setup; nodebrew install-binary v14.19.0; nodebrew use v14.19.0
```

`nodebrew -v` で `nodebrew 1.1.0` などと表示されればOK


## PATHを通す
bash
```bash
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile; source ~/.bash_profile
```
zsh
```bash
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile; source ~/.zprofile
```

以下を実行して `v14.19.0` と出ればOK
```bash
node -v
```

# angular cliのインストール
```bash
npm install -g @angular/cli; ng --version;
```
Avaloniaを使ってYoutube再生リストを編集できるデスクトップアプリを作ってみた

## 概要

個人で開発したYoutubeの再生リストを編集できるアプリを開発しました。
一区切りつき、自分なりに勉強できたと感じたため、ここまでにやったことを記事として整理したものになります。

このアプリでは、以下の機能を持っています。

- 再生リストを追加・削除できます。
- 再生リストに動画を追加・削除できます。
- 再生リストの動画を他の再生リストに移動できます。
- 公開されている再生リストの動画を一括で自身の再生リストに追加できます。
- チャンネルを検索して、そのチャンネルの動画を追加、または再生リストの動画を自身の再生リストに追加できます。

以下は、一部の動作をキャプチャしたものになります。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452291/b3e1049b-40d2-4eed-8369-76c226940704.gif)

## 利用した技術

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452291/9605fd53-62f7-eaaa-b69b-827e5f020b77.png" width="600">

- Avalonia
    - デスクトップアプリを作成するためのWPFに近いフレームワークです。マルチプラットフォームで動作します。（ただ、自分のビルド環境がWindowsなので、実際に動くのはWindowsのみだと思います。）
- Google.Apis
    - 認証し、実際にYouTubeから情報を取得しているライブラリです。今回自分が利用したのは、YouTubeから情報取得している箇所のみですが、他にもさまざまなAPIがGoogleから提供されているため、見てみると楽しいかもしれません。

作成したコードは（ダーティですが）、以下から確認できます。
<https://github.com/niimima/youtube-desktop-app>

## 利用するために

少しハードルが高いです。動かしてみたいな、と思った方は以下のURLからRelease.zipをダウンロードし、以下の手順を実施してください。
<https://github.com/niimima/youtube-desktop-app/releases>

- もし、.NET5ランタイムがない場合は、以下URLの".NETデスクトップ ランタイム"を自身の環境に合わせて以下からインストールしてください。
<https://dotnet.microsoft.com/ja-jp/download/dotnet/5.0>
- 個人でOAuthクライアントIDを作っていただく必要があります。以下のサイトの手順を参考に実施してください。UIが変わっている場合もあるため注意してください。
（アプリケーションとして公開するには、Googleにアプリケーションを登録しなければならず少しハードルが高かったため手間がかかってしまっています）
<https://iceagegeneration.com/blog/2020/06/01/auth-youtube-data-api/>
- 上記で取得したOAuthクライアントIDをReleaseフォルダの"loocal.settings.json"の、"client_id"と"client_secret"の値に置き換えてください。

## 振り返り

- 一番やりたかったのは[後で見る]に入れた動画を整理することだったが、APIがなく、断念した
- 再生リストの移動や動画のプレビューなどもしたいな、と思ったがそれもまだやれてない
- ページングがAPIの口として提供されているが、それも未実装（50件までしか取れない…）
- Avaloniaを初めて触ったので、ベストプラクティスが分からない。その結果、コードビハインドに処理を直書きしてしまっている（MVVMになってない）

…などなど、課題を挙げると沢山ありますが、個人的にAvaloniaを少し触れられ、かつそのついでにある程度アプリっぽいものができたため満足しています。
また新しい技術としてMAUIに触れてみたいな、と思っているのでここで作ったものをベースにし、上記の課題を少しでも解消できたらなと思っています。
これからもモノづくりを楽しんでいこうと思います。
WebサーバからGmailのSMTP設定をしてメール送信する方法

これまでGmail経由でメールを送ろうと思ったら、smtp.gmail.comに接続してGmailのアカウントとパスワードで接続すればよかったのですが、Gmailのセキュリティが厳しくなったようで急にメールが送れなくなってしまいました。

原因を調べたところ、Gmailに２段階認証を設定していると外部からのSMTP接続できなくなるようです。
２段階認証を利用継続しながらSMTP接続するためには以下の設定が必要になります。

1. アプリパスワードを生成する
1. SMTP接続元でアプリパスワードを設定する

# アプリパスワードを生成する
以下のサイトを参考にGmailのアカウント管理画面でアプリパスワードを生成してください。

https://blog.saboh.net/smtpgmailcom/

# SMTP接続元でアプリパスワードを設定する
私の場合はLaravelを稼働させているサーバからSMTP接続していたので.envファイル内に以下の設定を行いました。

```.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=[Gmailで使っているメールアドレス]
MAIL_PASSWORD="[生成したアプリパスワード]"
MAIL_ENCRYPTION=ssl
```

# 補足
後日、今度はテストサーバではSSL証明書に関するエラーも発生したので、その場合は以下の対応も必要になりそうです。

https://programming.sincoston.com/laravel6-local-ssl-error/

# まとめ
Gmailをメールサーバとして利用する場合は、こうしたGoogleアカウント設定の影響を受けることは気にしておく必要がありそうですね。
商談の勝率を計算するレポート

研究対象としては面白そうです。

元の質問 : [Help with Summary formula?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FXcXPSA1)

参考になる回答 : [Create an Open to Closed Won Ratio for Opportunity value.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A81XCSAZ)

私が試したこと

F(WON:SUM =0,0,WON:SUM/RowCount)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac6df0b4-7dab-518f-b3c7-190f25747e62.png)
iOSのLaunchScreen(スプラッシュ)が更新されない

スプラッシュ画像を変更しようとしたところ、Xcodeの`LaunchScreen.storyboard`上は更新が反映しているが、Runしたりipa配布すると古いスプラッシュ画像のままという現象に遭遇してドハマリしたので解決方法を共有します。
10年以上iOSアプリ開発してるけど、今まではハマった記憶がない。。

### 解決方法
* xcassetsの外に、元の画像名と異なる名前で画像を作成する
* LaunchScreen.storyboardからは↑で作成した画像を参照する

### 原因
iOSのSpringBoardのキャッシュのせいみたいです。
デバイスを再起動すれば反映されるけど、開発者はそれでよくてもエンドユーザーには頼めないよね。ということで上記の方法をとりました。

### 参考
http://arsenkin.com/launch_screen_image_cache.html
ESETクライアント管理のクラウド対応オプションの後継ソリューションへの移行について

# はじめに
<!-- 発端や概要を記載 -->
現在、「ESETクライアント 管理クラウド対応オプション」を使用していますが、
 2022/06/30に販売終了します。
後継ソリューションの対象が何になるのかを記載しています。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [現状の使用商品](#Chapter1)
1. [対象の後継機は？　インストール済みの製品はどうなる？](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 現状の使用商品
【使用製品】
・ESET Endpoint Protection Standard
・ESETクライアント管理 クラウド対応オプション


上記の製品は、2022年6月30日で従来の製品の更新手続きが終了する。
[【参考リンク】ESETクライアント 管理クラウド対応オプション 販売終了と後継ソリューションのご案内](https://eset-info.canon-its.jp/business/info/20210701-cloudop-eos/)



<a id="#Chapter2"></a>
# 対象の後継機は？　インストール済みの製品はどうなる？

<h3>後継製品は以下に移行になります</h3>
・「ESET PROTECT Essential クラウド」

・「ESET PROTECT Entry クラウド」



<h3>移行後、インストール済みの製品はどうなる？</h3>
セキュリティソフトもクラウド管理環境も継続でご利用いただけます。

移行の詳細につきましては以下URLをご参照いただければと存じます。
[【ESETクライアント管理クラウド対応オプション向け】ESET PROTECT Cloud 移行手順について](https://eset-support.canon-its.jp/faq/show/19659?site_domain=business)



<a id="#reference"></a>
# 最後に
参考になれば幸いです。
building could produce unreliable results. This usually can be resolved by moving the target's Headers build phase before Compile Sources. が Expoで出たときは

Expoで開発しているとたまにこんなエラーが出ることがあります。

主に `expo build:ios`　を実行したときです。


```
Cycle inside "YOUR_APPS"; building could produce unreliable results. This usually can be resolved by moving the target's Headers build phase before Compile Sources.
```

裏ではNativeBuildが走っているのですが、この記事の通り、何らかのビルドサイクルが狂ったときに起きるようです。

https://qiita.com/keisukeYamagishi/items/60aa5cf9d00ac6cf3b86

今回私が遭遇したパターンだと、ビルド中、もしくはiOS Simulatorで実行中に(ローカルサーバーが動いている状態)マシンを再起動したときです。

## 解決方法
上記の記事ではXCodeを使った開発の場合です。

我々のようにExpoで開発しているプロジェクトの場合は、ルートディレクトリにある `iOS`　フォルダを削除してから再度実行してみてください。
FreezedのFactory Constructor(Flutter)

## 名前付き引数を使用し、エラーを防止

前回のおさらいとして、コンストラクタで定義されている引数の順番が違っても正しく割り当てて初期化してくれる機能が`Dart`にはあります。
```dart
void main() {
  var dog = new Dog(animal: 'dogs', dog_breed: 'shiba');
}

class Dog {
  String dog_breed;
  String animal;

  Dog({required this.dog_breed, required this.animal});

  toString() => {
    '$dog_breed, $animal';
  }
}
```
`required`を引数に追加すれば、必須パラメータになります。次に`api`用にデータクラスを用意します。
## toJsonとfromJsonを持ったクラス
```lib/views/dog.dart
class DogReq {
  final String animal;
  final String dog_breed;

  DogReq({
    this.animal = "",
    this.dog_breed = "",  
  });

  Map<String, dynamic> toJson() => {
        'animal': dogs,
        'dog_breed': shiba,
      };
}

class DogRes {
  final String animalRes;
  final String dogBreedRes;

  DogRes.fromJson(Map<String, dynamic> json)
      : animalRes = json['animal_response'],
        dogBreedRes = json['breed_response'];
}
```
## freezedを使って書き換えてみる
```lid/models/dog_json.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';

  part 'auth.freezed.dart';
  part 'auth.g.dart';

@freezed
class DogReq with _$DogReq {
  const factory DogReq(
      {@JsonKey(name: 'dog_breed') required String shiba,
      @JsonKey(name: 'animal') required String dogs}) = _DogReq;

  factory DogReq.fromJson(Map<String, dynamic> json) =>
      _$DogReqFromJson(json);
}

@freezed
class DogRes with _$DogRes {
  const factory DogRes(
          {@JsonKey(name: 'animal_response') required String animalRes,
          @JsonKey(name: 'breed_response') required String dogBreedRes}) =
      _DogRes;

  factory DogRes.fromJson(Map<String, dynamic> json) =>
      _$DogResFromJson(json);
}
```
`/models`内に`dog.freezed.dart`と`dog.g.dart`ファイルを用意します。クラスに`@freezed`アノテーションを付与し、`@JsonKey`でjson内のラベル名とクラス内の変数名を`required`も付与して分けて使えるようにします。
`fromJson`まで定義して下記コマンドで`dog.freezed.dart`と`dog.g.dart`ファイルを自動生成します。
```dart
flutter packages pub run build_runner build --delete-conflicting-outputs
```
`--delete-conflicting-outputs`オプションは`dog.g.dart`を削除してから再生成してくれます。
ノートPCのサーバ化のデメリット

# はじめに
<!-- 発端や概要を記載 -->
サーバをゲートウェイの機能で使用する役割で設置しようとしています。
転送する為のノードの為、低スペックで良いです。
その為、ノートPCで代用できないか検討することになりました。
その中で浮上したノートPCをサーバにするデメリットを記載します。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [ノートPCのサーバ化のデメリット](#Chapter1)
1. [最後に](#Chapter2)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ノートPCのサーバ化のデメリット
（１）ノートPCは内蔵ストレージメディアの耐久性や高温耐性が弱いので24H365D稼働には耐えられないケースが多い
（２）本用途では、同時に動くセッションは多くないかもしれませんが、クライアントOS（Windows10など）のセッション制限がある
（３）リモート管理機能が無い（DELLサーバのDRACやHPEサーバのiLOのようなもの）
（４）可搬性が良すぎるので盗難リスクやセキュリティリスクが比較的高い
（５）PCの保守サービス内容のレベルが低く、保守延長などができないケースが多い
（６）HPEの場合、UPSの保守は費用をかけずに同時購入のサーバ保守と同等レベルになる
（７）ノートPCは製品の提供期間が短い（販売完了が早い）ため、機種やスペックの変更サイクルが早い
（８）ノートPCの蓋をとじた状態での稼働が不確実（実証をしていない為）

■そもそも無理説（以下より）
（９）ポートが1つしかなく、GWとして使用するには2つ以上必要
　　　→「USB変換LANポート」故障で踏み台使えない、現地行かざるをえない場合がある
（１０）壊れた時の費用(2~3年で壊れて、交換費用(PC代、交通費、人件費等)を考えた方がいい
（１１）勝手に自動で再起動が起こることがある


<a id="#Chapter1"></a>
# 最後に
本件は以上です。
何かの参考になれば幸いです。
nuxt+express+ecs でクイズアプリを作成

<h1>はじめに</h1>
<p>独学でプログラミングの勉強を初めてはや1年。四苦八苦して完成したアプリとともにQiita初投稿します。クイズアプリを作成しようと思っている方の参考になれば幸いです。</p>
<p><a href="https://github.com/kota926/bar-exam">githubのコードはこちら</a></p>
<h1>アプリ概要</h1>
<p>司法試験予備試験の短答式試験の過去問を解くことができるアプリです。ユーザー登録なしでも利用できますが、登録をすると各単元をどこまで解いたか及び最後に解いた問題を記録できるようになっています。</p>
<p><a href="https://lawapp.link/unit?subject=cons">https://lawapp.link</a></p>

![bar_exam_movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1269121/8c5cb46b-fdbe-2aa5-e143-51f5a69a83ee.gif)
<h1>機能</h1>
<ul>
<li>O・Xクイズ</li>
<li>問題一覧表示</li>
<li>ユーザー登録</li>
<li>ユーザー情報変更</li>
<li>続きから解く</li>
<li>単元ごとに学習済み問題を記録</li>
</ul>
<h1>素材集め</h1>
<p>試験の過去問は法務省の<a href="https://www.moj.go.jp/jinji/shihoushiken/shikaku_saiyo_index.html">ホームページ</a>から拾ってきます。pythonでスクレイピングを行い、平成13年から令和3年までの過去問pdfを一瞬でローカルマシンへダウンロードできました！（pythonの学習時間と差し引きマイナス）</p>
<p>このpdfファイルをpythonで読み取り、データをmysqlに保存...と行きたいところですが、機械はpdfの読み取りが苦手な模様。ところどころデータにズレがあります。それに教科ごとに出題形式が異なるため、その処理をプログラミングで行おうとすると一筋縄では行かなそう。</p>
<p>結局人力でexcelファイルにデータを打ち込むことになりました。力不足です（泣）</p>
<p>処理されたexcelデータをsqlalchemy（pythonのorm）を用いてローカルのmysqlに保存し、データセットの完成です。</p>
<h1>環境構築</h1>
<p>dockerを用いてコンテナ上で開発します。</p>

```
.
├── api
├── frontend
├── docker
│   ├── back
│   │   └── Dockerfile
│   ├── front
│   │   └── Dockerfile
│   └── mysql
│       ├── Dockerfile
│       └── my.cnf
└─── docker-compose.yml
```
<h1>フロントエンド</h1>
<p>使った技術</p>
<ul>
<li>nuxt 2</li>
<li>nuxtjs/composition-api</li>
<li>typescript</li>
<li>vuetify</li>
<li>axios</li>
<li>nuxt-auth</li>
<li>nuxtjs/fontawesome</li>
<li>nuxtjs/pwa</li>
</ul>
<p>ログイン機能はnuxt-authに任せました。スキーマはローカルを選択します。スマホで継続的に学習することを想定してPWA機能を追加します。</p>
<h1>バックエンド</h1>
<p>使った技術</p>
<ul>
<li>node.js</li>
<li>express.js</li>
<li>typescript</li>
<li>typeorm</li>
<li>bcryptjs</li>
<li>nodemailer</li>
<li>jsonwebtoken</li>
</ul>
<p>bcryptとjsonwebtokenでログイン機能を実装しました。nodemailerでサインアップしたユーザーに認証メールを送ることで、ユーザーの登録が完了する仕組みになっています。</p>
<h1>DB設計</h1>
<img
alt="スクリーンショット 2022-02-28 9.34.46.png"
src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1269121/1123584b-b880-3d07-51c5-4b3064b5e017.png" >
<p>TempUserにユーザー情報を仮登録し、認証ができたらそのユーザー情報から本登録します。Constitution〜Companyは単元を数字に対応させて、各科目の学習履歴を記録します。</p>
<h1>インフラ</h1>

![aws_bar_exam_drowing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1269121/13bad3c3-07fc-f5f6-4ec7-364cc5f30275.png)
<p>docker-compose push でローカルからECRにコンテナイメージを保存します。フロントエンドとバックエンドでサービスを分け、ALBのパスベースルーティングにより "https://lawapp.link/backend/*" へのリクエストは backend-service に転送し、それ以外は frontend-service に転送します。サービス間の通信はサービスディスカバリを使用しました。
 </p>
<h1>最後に</h1>
<p>問題を解くだけで解説がないのは学習アプリとして有用性にかけると思いましたが、時間と労力を考えると途方も無いので断念。法学部の勉強のついでに地道に解説機能を追加していこうと思います。</p>
<p>初投稿のため読みにくい部分が多々あったと思いますが、最後まで読んでいただきありがとうございました。</p>
40 代おっさんAWS（AmazonLinux2）環境でPython3の環境構築をしてみる

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 構築環境

・EC2:Amazon Linux2
・Cloud9使用
こちらを参照してください
<https://qiita.com/kou1121/items/56f2e075d33fbf345787>
<https://qiita.com/predora005/items/bb3a5ef93acbd351a686>

## Pythonのバージョン確認

Amazon Linux2では標準でPython2系が入っています。
これを3系にするのが今回の目的になります。

バージョン確認

```bash
python -V
```

Python 2.7.18
とコンソールに出たと思います。

Python3を使うのに必要な物もあるのでそちらも確認

```bash
pip --version
pipenv --version
```

どちらも
command not found
になっていると思います。

## Python3のインストール

＊ちなみ今回はpython3.8を使用します。

```bash
sudo amazon-linux-extras install -y python3.8
```

インストールできましたが
python -V
をしても
Python 2.7.18
のままだと思います。

### alias設定

エイリアスとは
エイリアスとは、偽名、別名、通称などの意味を持つ英単語。

つまり、コマンドの別名を設定して使えるようにすること

```bash
echo 'alias python=python3.8' >> ~/.bashrc
source ~/.bashrc
```

これで
python -V
すると
Python 3.8.5
となったと思います。

## pip

pipとは
Pythonのパッケージを管理するためのツール
詳しくは
<https://www.sejuku.net/blog/50417>

Python3インストール時一緒に入っているみたいです。

確認

```bash
pip3.8 --version
```

pip 9.0.3 from /usr/lib/python3.8/site-packages (python 3.8)
となったと思います。

## pipenv

pipenvとは
pip と venv の両方の機能を兼ね備えたサードパーティ製のパッケージ管理ツールです。venv で仮想環境を作成してから pip でパッケージをインストールするまでの手順では下記のように異なるコマンドを実行する必要がありますが、これを 1 つのコマンドで実行できるようにしたもの
詳しくは
<https://rinatz.github.io/python-book/ch04-05-pipenv/>

色々なインストール方法があるみたいですので気になる方は調べてください。
とりあえず自分は

```bash
sudo pip3.8 install pipenv
```

確認

```bash
pipenv --version
```

pipenv, version 2022.1.8
と出たと思います。

## パッケージのインストール

Pipfileとは
pip にはインストールしたいパッケージをテキストファイルに記述しておく requirements.txt という仕組みがありましたが、pipenv はこれの代替として Pipfile というテキストファイルが使用できます。先程の requests をインストールするとディレクトリ内に Pipfile が作成されていると思います。

Pipfileにパッケージを追加

```bash
pipenv install numpy 
```

Pipfileを見ると

```toml
[packages]
numpy = "*"
```

## 開発用パッケージのインストール

```bash
pipenv install --dev autopep8 flake8
```

Pipfileを見ると

```toml
[dev-packages]
autopep8 = "*"
flake8 = "*"
```

## 参考資料

<https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a>
<https://qiita.com/hiren/items/17984191da2ab8955174>
Gitのタブ補完を設定する

## 環境
Ubuntu 20.4

## はじめに
Gitはデフォルトではタグ補完ができるようになっていないため、タブ補完ができるように設定をおこなう。タブ補完をするには、ぐぐると**git-completion.bash**を組み込む方法が多々ヒットされる。動作環境がmacの場合は、その方法でいいのだが、動作環境がUbuntuの場合は、もっと簡単な方法で実現する方法がある。Ubuntuでも、**git-completion.bash**を使って実現しようと思えばできるようではある。

## 手順
Gitが入っているようであれば、次のファイルが既に存在しているはずなので、存在していることを確認する。

```
cat /usr/share/bash-completion/completions/git
```

上記の**gitファイル**は、中身を見てのとおり、シェルスクリプトファイルである。**gitファイル**を実行すれば、それだけでタブ補完ができるようになる。

```
source /usr/share/bash-completion/completions/git
```

タブ補完ができるようになっていることが確認できれば、**.bashrc**に組み込んで、OS起動時に自動で実行されるようにする

```
echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc
```

**./bashrc**の中身を見て、最終行に１行追加されていることを確認する

```
vi ~./bashrc
```
Lambdaでデプロイしたのに反映されない？と思ったらエイリアスを確認

# Lambdaのデプロイが反映されない
最近ジョインしたプロダクトの開発環境にて、修正したLambda関数をサクッと確認してみようとしたところ「あれ？ デプロイしたのに反映されていない……？」となったので以下対応メモします。

## 事象
既にCloudformationその他で構築され問題なく動作しているAWS環境にて、Lambdaのソース(Python3.7)を修正して動かしてみたところ、明らかにソースが反映されていない(修正前のコードで動いている)という事象が発生。

デプロイのやり方としてはとてもシンプルで、Lambdaのチュートリアルとかでもよくある「コンソール画面でソースを修正して、『Deploy』クリック」するという方法。

↓画像の「Deploy」をクリック
![コメント 2022-03-01 124222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319998/682df768-17c0-ce83-1a31-41595d982b29.png)

その後別のデプロイ方法(zipファイルをアップ、S3の特定の階層に置く、などなど)を試したが変わらず……。

## 解決方法⇒「エイリアスを設定する」
どうやらLambdaのエイリアスで厳密なバージョン管理が行われていたらしく、特定のバージョンをポインタとして指定していたため、修正コードがアプリケーションに反映されていないようでした。

今回は開発環境での動作確認がしたいだけなので、サクッとLambda関数の「エイリアス」タブから現在のエイリアスを編集しました。

以下のように、バージョンプルダウンの中から「$LATEST」を選択。

![コメント 2022-03-01 125714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319998/477e0bd7-f4c2-32d0-b49b-dd400c20d76c.png)

もう一度動作確認してみたところ、無事修正後のコードで動作しました！

## あれ？反映されていない？となったらエイリアスの確認
アプリケーションのバージョン管理の部分なので、むやみやたらに触るのは良くないとは思います。

ただ、今回のようにちょっとしたコード修正の動作確認を開発検証環境で試したいだけの場合、一時的にエイリアスのバージョンを最新のものにするのもありかな、と思いました。

Lambdaのエイリアス設定の理解が曖昧だったので、いい勉強になりました。


以下の記事がとても参考になりました。

https://zenn.dev/amarelo_n24/articles/158a166d832487
Anacondaにnodejs(v≧12)をインストールする方法

 m1 mac miniを購入して色々環境構築をしている時にハマったこと。解決方法を殴り書きします。
 homebrewとnodebrewをインストールして、nodebrewからnode（version=17.）をインストールした。
 AnacondaのjupyterLabで拡張機能を使うにはversion$\geq 12$のnodejsが必要。そもそもnodebrewでインストールしたnodejsとAnacondaで要求されたnodejsは場所的に別物なので、Anaconda側でもインストールする必要がある。
 baseではicu>65を満たさないためnodejsの古いバージョンしかインストールできない。

そこで、**baseとは別に仮想環境を作って**、そこで

```
% conda install nodejs -c conda-forge --repodata-fn=repodata.json
```

を実行すれば、

```
% node -v
v12.4.0
```
となって、成功。

初めての投稿で大分適当ですが、お許しください。

## 追記
機械学習の環境を構築しようと思って色々調べていくと、m1チップでGPUの恩恵が受けられるのがTensorflowのみであることが判明。その時にAnacondaではインストールできないので、サヨウナラをした。ARMチップ(=Apple Sillicon, M1チップ)では、Miniforge3一択のようである。
音ゲー中の通知を自動で防ぐ簡単な方法

# はじめに
音ゲーや何かしらのアプリで楽しんでいる時に通知が来たらイラッとしたり邪魔だったりしますよね。
そんなストレスを簡単に解消できる設定をご紹介します。

:::note warn
この記事はiOS限定です。
:::

# ショートカットApp
iOSにはApple純正のショートカットというAppがあります。
[ショートカット on AppStore](https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id1462947752)
![d230a25cb974f8908871af04caad89a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588777/a5cef692-d129-75c5-cf4a-4df5f217019b.png)

これを使えばワンタップで煩雑な一連の作業を自動で実行してくれたり、ある条件になると勝手にショートカットを実行してくれたりする便利なAppです。
今回はこれを使ってサクッと作っていきたいと思います。

# 作成
ショートカットAppを開いて、下の「オートメーション」タブを開き、右上の「＋」から新規オートメーションを作成します。
下図のような選択画面になるので、上の「個人用オートメーションを作成」を押します。
![IMG_0088.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588777/583da8ff-a468-0174-a331-6701fdb13f93.png)

1. 「メール」や「メッセージ」などの選択肢の中から、「App」を選択し、「いつ」というタイトルが表示されている画面に遷移します。
2. ここで、使用中に通知が来て欲しくないアプリを選択し、「開いている」にチェックが入っていることを確認して次に進みます。
3. 「集中モードを設定」アクションを追加し、「おやすみモードをオフ時までオンにする」と設定して、完了です。
![IMG_0098.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588777/721704d7-c3ab-8f42-17af-0d6133cfb51b.png)

4. 下図の左のような画面になると思いますので、「実行前に尋ねる」をオフにして、完了ボタンを押すと、作成完了です！

また、Appを閉じた時のオートメーションも作成します。
以下の2点のみ、先ほどの手順と異なります。
- 先ほどの手順2.で、「開いている」にチェックを入れましたが、ここでは「閉じている」にチェックを入れましょう。
- 手順3.のアクションは、「おやすみモードをオフにする」と設定します。
![IMG_0099.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588777/47377838-078b-f5de-2a49-b83941146e7d.png)

2つのオートメーションが作成できたら、作業は完了です！

実際にアプリを開いてみると、「"XXXが開きました"　オートメーションを実行中」と通知が出てくるので、コントロールセンターを確認すると、おやすみモードがオンになっていることが確認できます。
また、ホーム画面に戻ったりアプリを閉じたりすると、おやすみモードがオフになっていることが確認できたと思います。

おめでとうございます！これで前よりも快適なiPhoneライフが送れますね！

# あとがき
このオートメーションを作成してから、アプリを使用している時（特に音ゲー）のストレスが激減しました。
みなさんもぜひオートメーション・ショートカットを作成してiPhoneを便利にしていきましょう。
Javaを使用してWord文書を暗号化および復号化する方法

一部の重要なドキュメントでは、ドキュメントの内容が漏洩しないようにするために、ファイルを暗号化する必要があります。ファイルを表示するときは、正しいパスワードを入力してファイルを開く必要があります。以下では、Wordファイルにパスワード保護を追加する比較的簡単な方法と、暗号化されたWordファイルのパスワード保護をキャンセルする方法を紹介します。

**使用したツール：Free Spire.Doc for Java**

JARファイルのインポート：

公式ウェブサイトから[ダウンロード](https://www.e-iceblue.com/Download/doc-for-java-free.html)します。ダウンロード後、ファイルを解凍し、libフォルダー内のSpire.Doc.jarファイルをJavaプログラムにインポートします。次のインポート結果を参照してください。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/1e9898db-ab7c-dc6e-e9b0-39b03e81cfd3.png)

## Javaコード例

【例1】Wordのパスワード保護を設定する

```
import com.spire.doc.*;

public class Encrypt {
    public static void main(String[] args){
        //テストドキュメントをロードする
        String input = "C:\\Users\\Administrator\\Desktop\\test.docx";
        String output= "result.docx";
        Document doc = new Document(input);

        doc.encrypt("123");//ドキュメントのオープンパスワードを設定する
        //doc.protect(ProtectionType.Allow_Only_Reading,"123");//ドキュメントを読み取り専用に設定する
        //doc.protect(ProtectionType.Allow_Only_Comments,"123");
        //doc.protect(ProtectionType.Allow_Only_Revisions,"123");

        //暗号化されたドキュメントを保存する
        doc.saveToFile(output);
        doc.dispose();
    }
}
```
ファイル暗号化の結果：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b819c5ed-fcb8-2fbc-665f-8cc155f79d43.png)

【例2】Wordのパスワード保護を解除する

```
import com.spire.doc.*;

public class Decrypt {
    public static void main(String[] args){
        //パスワードを使用してファイルをロードし、元のパスワードを入力してリリースする
        Document doc = new Document();
        doc.loadFromFile("result.docx",FileFormat.Docx_2013,"123");

        //復号化されたドキュメントを次のように保存する
        doc.saveToFile("Decrypt.docx",FileFormat.Docx_2013);
    }
}
```
プログラムの実行後、結果のファイルはパスワードで保護されなくなります。
## 結語
今回のWord文書を暗号化および復号化する方法は以上でした、最後まで読んでいただきありがとうございます。
どうしても ECS Exec できないとき。

```
クラスター名: sample-prod
サービス名: web
タスクID: xxxxx0
```

## 権限チェック
#### 自分の権限を確認
![Cursor_と_IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/a8100b68-3c85-d3b3-1b88-33ebbedac430.png)

自分はAdministratorAccess権限なのに...🤔

#### タスクに権限がついているか確認
![Cursor_と_Amazon_ECS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/9004de63-ccfe-9b64-d59f-8adbb555c82d.png)

AmazonSSMFullAccessをつけること。
![Cursor_と_IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/d951528d-4cc3-dee4-ef1b-fd2d55c263df.png)

#### `enableExecuteCommand`をtrueにする
現状確認コマンド

```
 % aws ecs describe-services --cluster sample-prod --services web | grep enableExecuteCommand

→"enableExecuteCommand": false
```
trueに変更するコマンド
```
aws ecs update-service --region ap-northeast-1 --cluster sample-prod --service web --enable-execute-command
```

## amazon-ecs-exec-checkerを使ってみる
execできるかチェックしてくれる。

https://github.com/aws-containers/amazon-ecs-exec-checker

githubを見ると使い方がわかる。

```ターミナル
$ export AWS_PROFILE=sample

$ bash <( curl -Ls https://raw.githubusercontent.com/aws-containers/amazon-ecs-exec-checker/main/check-ecs-exec.sh ) sample-prod xxxxx0
```

ユーザーの認証情報を変更して、コマンドを打つとチェックしてくれる。
エラーが出たらそれをヒントに頑張る。

ecs execまでは自力で行えるようになりたい！！
aws-sdk-goでcredentialを指定するには

# 結論
`Credentials`を指定して、静的な値を入れる。

> You can hard-code credentials in your application by passing the access keys to a configuration instance, as shown in the following snippet.

```:go
aws.Config{
	Region: aws.String(cfg.Region),
	Credentials: credentials.NewStaticCredentials(
		"AWS_ACCESS_KEY_ID",
		"AWS_SECRET_ACCESS_KEY",
		"TOKEN",)
}
```

# 経緯
アプリケーションをデプロイする際に、dockerコンテナの環境変数と本番環境の環境変数が被っていた。
この環境変数は、ElasticSearchを使うにあたって必要だったので命名を変更。
`AWS_ACCESS_KEY_ID` => `ES_A_K_ID`
`AWS_SECRET_ACCESS_KEY` => `ES_S_A_K`

## エラー
```
NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
```

`aws-sdk-go`が、秘匿情報が読めてないことが発覚。
いままで何の気なしに使っていたので、どうしたもんかと調べる:tea:

# 修正前
`aws-sdk`の仕様で、 環境変数(`AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`)を自動で読み出していた。
コンテナの環境変数に存在しないので、空の値。

```
func ConnectDB(cfg *config.Server) (RepoInterface, error) {
	session, err := session.NewSession()
	if err != nil {
		return nil, err
	}
	db := dynamo.New(session, &aws.Config{Region: aws.String(cfg.Region)})
　　　　　　　　# 中略
	return &repository{db: db}, nil
}
```

# 修正後
まとめの通りに`Credential`を入れ込んであげる。

```
func ConnectDB(cfg *config.Server) (RepositoryInterface, error) {
	session, err := session.NewSession()
	if err != nil {
		return nil, err
	}
	db := dynamo.New(session, &aws.Config{
		Region: aws.String(cfg.Region),
		Credentials: credentials.NewStaticCredentials(
			cfg.ESAKID,
			cfg.ESSAK,
			"",
		),
	})
　　　　　　　　# 中略
	return &repository{db: db}, nil
}
```

# REF
https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
【GLSL】smoothstepで滑らかな境界を作成するときの端の処理

シェーダーを書いていて、実質的なしきい値は一つだけでも境界部分が滑らかになるように`smoothstep`を以下のように使用する場面があります。

```glsl
float smoothThresholdForward(float threshold, float smoothness, float x) {
	return smoothstep(threshold - smoothness, threshold, x);
}

float smoothThresholdBackward(float threshold, float smoothness, float x) {
	return smoothstep(threshold, threshold + smoothness, x);
}

float smoothThresholdCentral(float threshold, float smoothness, float x) {
	float s = 0.5 * smoothness;
	return smoothstep(threshold - s, threshold + s, x);
}
```

このような使用方法でしきい値と入力値に取りうる範囲がある場合、しきい値が最小ならば範囲内の入力値に対して出力値が常に1、しきい値が最大ならば範囲内の入力値に対して出力値が常に0になってほしいところですが、先ほどのコードではそのようになりません。

smoothstepで滑らかな境界を作成しつつ、この条件を満たす方法を2つ考えてみました。

1つ目です。`threshold == minThreshold`のときsmoothstepの１番目の引数が`minThreshold - smoothness`、2番目の引数が`minThreshold`、`threshold == maxThreshold`のときsmoothstepの1番目の引数が`maxThreshold`、2番目の引数が`maxThreshold + smoothness`になるようにして、間を線形補間しています。しきい値が最小値に近いときは`smoothThresholdForward`を使用し、しきい値が最大値に近いときは`smoothThresholdBackward`を使用するようなイメージです。

```glsl
float smoothThresholdA(float threshold, float minThreshold, float maxThreshold, float smoothness, float x) {
	float r = maxThreshold - minThreshold;
	float edge1 = (threshold - minThreshold) / r * (r + smoothness) + minThreshold;
	return smoothstep(edge1 - smoothness, edge1, x);
}
```

2つ目です。こちらは基本的には`smoothThresholdCentral`ですが、しきい値が端に近いときは範囲に収まるようにsmoothstepによる補間の幅を狭めています。

```glsl
float smoothThresholdB(float threshold, float minThreshold, float maxThreshold, float smoothness, float x) {
	float b = 0.5 * max(0.0, min(smoothness, min(threshold - minThreshold, maxThreshold - threshold)));
	return threshold == maxThreshold ? 0.0 : b == 0.0 ? step(threshold, x) : smoothstep(threshold - b, threshold + b, x);
}
```

作成した関数を比較してみます。入力値を横方向の座標、しきい値を時間にして、上から`smoothThresholdForward`、`smoothThresholdBackward`、`smoothThresholdCentral`、`smoothThresholdA`、`smoothThresholdB`の値を描画しています。
![SmoothThreshold.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/738f561b-deb2-9520-d4a7-972b1c94981c.gif)
コード全文はこちらにあります。
https://glslsandbox.com/e#79574.0

下2つは挙動は異なりますが、どちらもしきい値が最小のときはすべて白(1)、しきい値が最大のときはすべて黒(0)になっていることが確認できました。
Pixivのヘッダー固定


## 初めに
こんにちは。
Pixivのホームページには、ヘッダーがついてこないのです。
今回はそれを改善する内容になっています。
さらに拡張機能として公開することでより多くの人に使ってもらおうと思いました

:::note info
Pixivを使わない人にとってはどうでもいいかもしれません。
:::

## 現在の問題点

ヘッダーが画面に固定されていません。
自分は漫画を読んだ後、トップページに戻り、おすすめを見ています。
こうなると漫画を読んだ後、Pixivのトップページに戻るには、一番上までスクロールしなければなりません。
Pixiv使っている人はどうぞ体感してください。 [Pixivはこちら](https://www.pixiv.net/)



## 自作した拡張機能
このようなコードにしました。
まとめてダウンロードしたい人はこちらから[Google Drive](https://drive.google.com/file/d/1bpS8u-99-U9a3Spu7Y2ngdYZR0kJ4VaJ/view?usp=sharing)
このファイル解凍をChromeのパッケージされていない拡張機能でインストールしてください。

```json:manifest.json
{
   "name": "Pixiv_header", // 拡張機能の名前
   "version": "1.0", // バージョン
   "manifest_version": 3, // マニフェストのバージョン。最新バージョンは3です。
   "description": "Pixivを変えるChrome拡張です", // 説明文
   "content_scripts": [
       {
           "matches": ["https://www.pixiv.net/*"], // どのURLでファイルを読み込むか。正規表現が使えます。
           "css": ["mystyle.css"], // 読み込むCSSファイルのパス
           "js":["script.js"]
       }
   ]
}
```

```css:mystyle.css
.iUhfll{
  position: fixed !important;
  z-index: 1000 !important;
  border-bottom: solid 7px #333 !important;
  grid-template-columns: 1fr minmax(0px, 1000px) 1fr !important;
}
```
## 終わりに
~~qittaのようなヘッダーにはなれなかったです。既存のヘッダーのidの対象範囲が微妙に狭かったのが原因です。~~
grid-template-columnsをいじったら解決しました。
これでほぼ不満のないヘッダーになりました。
Amazon Kinesis Firehoseって？何が嬉しいの？

## はじめに

最近AWSでログ基盤を構築する方法について調べています。

そういう時にAWSの数多あるサービスで何が使われているか調べていると、**Amazon Kinesis Firehose**というサービスをよく目にしました。

しかしAmazon Kinesisの公式ページを見ていても初見ではあまりイメージが湧かず、どうしたものかなと思いました。

ですが色々ググってみたりハンズオンセミナーで手を動かしてみた結果、「あ、こういうことかあ」と思えたのでそれをシェアします。

私のように公式ページを見ただけではイマイチ理解できなかった方は読んでみてください！

## まず結論から
Amazon Kinesis Firehoseとは、
**アクセスログやアクティビティログなどの継続的に発生するデータを
Amazon S3などのデータストアに保存できるサービス**です。

その際にAmazon Lambdaと連携させることで
そのデータを扱いやすいように加工した上で保存することができるようになります。

## それの何が嬉しいの？
一言でいえば、**データ分析がしやすくなります。**

1. S3などのデータストアに集約すること
1. Lamdaなどでデータを加工して保存すること

これらそれぞれがデータ分析のしやすさに繋がるので少し解説します。

## データを集約することのメリット

例えばアクセスログを分析する場合を考えてみましょう。

WEBサーバーを冗長構成で2台立てているとしたら、
アクセスログが2箇所に存在することになりますね。

ということはそれらを分析したいと思ったら、
**まずは何かしらの仕組みを作ってそれらをどこかのサーバーに一元的に保存しておく、
といった仕組みを作ることが必要**になってきます。

Amazon Kinesis Firehoseはその仕組みを提供してくれるんですね。

## データを加工して保存することのメリット

通常ログ等のデータはそのままの形だと分析がしにくいです。

例えばNginxのアクセスログは以下のような形で出力されていることが多いかと思います。

```
127.0.0.1 - - [28/Feb/2022:10:00:00 +0900] "POST /hoge/ HTTP/1.1" 200 3 "-" "" 0.1
```

こういったログに対して少しでも複雑な分析をしようとすると
まあまあ複雑なスクリプトを組む必要がありますよね。

URL別の1日のアクセス数を出す、といった程度ならワンライナーでも容易かと思いますが、それ以上に複雑だったり対象が1日だけじゃなくなったりすると、ちょっと見るのが嫌になってくるスクリプトになってきます。笑

しかし、Amazon Lambda等でそれらのログを分析しやすいように加工した上でS3等のデータストアに保存しておけばどうでしょう？

**複雑なスクリプトなんて組む必要なく分析することが可能になります！**

もちろんデータを加工する時にAmazon Lambdaでしなければいけないというわけではなく、FluentdなどでしてももちろんOKです。

ただLamdaの場合はログを加工する関数が予め用意されていたりするので、
これらを使うとかなり開発時間を短縮できて便利です！

## CAUTION;分析する時は別のサービスが必要
Amazon Kinesis Firehoseはあくまでも加工して保存するまでがスコープのサービスなので、その**保存したデータに対して分析する場合は別のサービスを利用する必要があります！**

例えば、Amazon GlueとAmazon QuickSightの組み合わせや、
S3に保存するのではなくDatadogに保存するようにする、などです！

ここら辺もまた勉強したらシェアしたいと思います。

## あとがき
最初はよく理解できなかったAmazon Kinesis Firehoseですが、
手を動かしながらドキュメントを読むことを反復しているとおぼろげながらその良さが見えてきました。

私は割と手を動かす前にまずは理解したいと思うタイプなのですが、
最近は何が何だか分からない状態の場合はまず手を動かすことが突破口になる場合が多いことに気づいてきたので今後もそうしていきたいと思います。

ちなみにKinesis Firehoseを手を動かして学びたいと思った方は、
[AWS ではじめるデータ分析〜データレイクハンズオン〜](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-self-paced-hands-on-85234/hol-1-aws-summit-online-2020-datalake-720p)
このAWS公式のハンズオンセミナーがオススメです！

## 参考情報
[AWS Black Belt Online Seminar 2017 Amazon Kinesis](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-kinesis)
[ストリーミングデータとは](https://aws.amazon.com/jp/streaming-data/)
[Amazon Kinesis](https://aws.amazon.com/jp/kinesis/)
新卒エンジニアが１ヶ月で、AWS SAAを取得した方法

# はじめに
<!-- 発端や概要を記載 -->
投稿主の業務内容は金融システムの監視オペレーター業務なため、自宅以外でAWSを触ることはありませんでした。:whale2:

資格名：AWS ソリューションアーキテクト　アソシエイト (AWS SAA)
合格日：2021年11月05日(金)
学習期間：2021年10月1(金)~11月05日(金) 1日 30分~2時間

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [学習手順](#学習手順)
1. [使用した教材](#使用した教材)
1. [参考文献](#参考文献)
1. [所感](#所感)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 学習手順
1. 出題範囲を理解し勉強量を削減するために、
疑似問題をさらっと確認し、どの程度の内容が問われるかをなんとなく把握する。 (Udemy講座①)
4. Udemy講座①の疑似問題を解いていく。
   (正解/不正解にこだわらず、なぜその回答になるのかを自分で説明できるようになるまで復習する)

:star: [『Maruchin tech chさんのAWS SAA対策動画』](https://youtu.be/fsz6G45A4H4/)
→ 通勤時間や移動の際など暇さえあればラジオの要領で聴きまくりました。
※正直、この動画が無ければ落ちてたと思います。

<a id="#Chapter2"></a>
# 使用した教材
 - [Udemy講座① 『【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）』](https://www.udemy.com/course/aws-knan/)
 - [Maruchin tech ch『AWS ソリューションアーキテクト アソシエイト試験 対策動画』](https://youtu.be/fsz6G45A4H4/)
 
<a id="#reference"></a>
# 参考文献
- [AWS公式ドキュメント](https://docs.aws.amazon.com/)
※今回は使用せずに試験を受けました。

<a id="#Chapter3"></a>
# 所感
前回の[AWS CLF対策記事](https://qiita.com/me_beginner/items/b01868f541d1d7b60dbf)と同じように試験勉強を進めていきましたが、ハンズオンは行わずに受験しました。
AWS CLF合格者であれば、Udemyの疑似問題集とYoutubeの対策動画のみで合格出来ると思います。
次回は、AWS SAPの受験を予定しているのでそちらの体験談の記事を書きたいと思います。
100日でSQLの達人になる@LeetCode! Day29 <累積和の出し方、SUM() OVER(ORDER BY句)の復習>

## 1204. Last Person to Fit in the Bus （問題レベル: Medium）要課金
今日の問題はこれ。
番号順に順番に体重を足していって、１０００ｋｇを超える直前の人の名前をリストするという問題。

これまでに学習してきたことを発揮できれば解ける問題であったがまだ十分に身についていないことを実感できた問題だった。

復習ポイントの１つ目、累積和を求める方法
```:SQL
SELECT a.id, SUM(b.weight)
FROM table a
JOIN table b
ON a.id >= b.id
GROUP BY a.id
ORDER BY sum(b.weight) ASC
```
簡単そうでなかなか書けない。ポイントは、`a.id >= b.id`と`GROUP BY a.id`。
`a.id`毎に`SUM(b.weight)`をまとめていくわけだ。

`SUM() OVER(ORDER BY句)`を使えばもっとシンプルに記載できる。
```:SQL
SELECT id, SUM(weight) OVER(ORDER BY id ASC)
FROM table
```
今日のもう一つのポイントは、`SUM() OVER(ORDER BY句)`。

最初の方法を使った解法がこれ。
```:SQL
SELECT TOP 1 a.person_name
FROM queue a
JOIN queue b
ON a.turn >= b.turn
GROUP BY a.person_name
HAVING SUM(b.weight) <=1000
ORDER BY SUM(b.weight) DESC
```

もう一つの解法がこれ。
```:SQL
SELECT TOP 1 t.person_name
FROM (SELECT person_name, turn, SUM(weight) OVER(ORDER BY turn ASC) AS total　FROM queue) t
WHERE t.total <=1000
ORDER BY t.total DESC
```
どちらもスラスラ書けるようにしておきたい。

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
PostgreSQLのリストア

# はじめに
備忘録としてまとめました。

# リストアの方法

```
psql -U ユーザー名 -h ホスト名 -p ポート リストア先のDB < リストアするファイル
```

__注意__
* リストアするときは、リストアするファイルはフルパスか指定か、もしくはファイルのあるディレクトリに移動してファイル名のみ指定して実行する。
Git CLIメモ

# username/email設定
```
git config --global user.name "hogehoge"
git config --global user.email "hogehoge@gmail.com"
```
# ローカルブランチ削除
```
git branch -D branch_name
```
# リモートブランチ削除
```
git push --delete origin branch_name
```
# 直前のコミットのコメント修正
```
git commit --amend -m "commnet"
```
# 直前のコミットの取り消し
```
# windows
git reset --soft "HEAD^"

# mac
git reset --soft HEAD^
```
オプショナルチェーン


## オプショナルチェイニング演算子とは
Optional Chainingとは、?.構文を用いてnullやundefinedになりうる値へ安全にアクセスできる仕組みです。

```
A?.B
// AがnullかundefinedでないときBを返す
```
ちなみに、if文に書き換えられそうですがそうではないです。

```
const adventurer = {
  name: 'アリス',
  cat: {
    name: 'ねこ'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName);
// 結果：undefined

const dogName = adventurer.dog?."aaa";
console.log(dogName);
// 結果：Error: Unexpected string
```


つまり、`dog`がundefindであれば、後ろのには繋がらないので`Error: Unexpected string`が返却される

## A?.BのAがnullの時でもundefindに変換する

```
const A = null;
console.log(A?.B);
```

### 結果

```
undefind
```


## nullとundefindの

### ざっくり
undefined は`変数`を宣言し、値を代入する前の状態 (メモリは確保したが、値は未確定)
null は NULL というシンボル (0 が割り当てられている)

#### 詳しく
undefinedとnullは大きなくくりで「値がない」ことを意味する点は共通しています。意味的な違いがあるとしたら、undefinedは「値が代入されていないため、値がない」、nullは「代入すべき値が存在しないため、値がない」という微妙な違いです。

とういいつしておけばメリット

参考 

> 使い分け意識を育てる労力は、それに見合うメリットが少ない
2種類を使い分けるとなると、コードの各所でどちらを使うべきかの意思決定が必要になります。意思決定は個人作業ならまだしも、チームワークとなるとハードルが上がってきます。チームで「こういう場合はundefinedを使うべき」「こういうときはnullを使う」といったルールと具体例を共通認識として持つ必要がでてきます。共通認識が確立されていないと、コーディング中に質問が出てきたり、コードレビューで指摘されて手直しが発生したりと、あまり本質的でないところで開発が一時停止していまいがちです。使い分けをするために、ルール策定や意識のすり合わせすることは不可能ではありませんが、その労力に見合うほど、undefinedとnullを使い分けるメリットは大したものではないというが実際のところです。

> 一方で、「nullは使わずundefinedに統一しよう」はシンプルなルールです。これなら共通認識として持つことがしやすく、チームワークもしやすくなります。実際にTypeScriptの開発チームでは「nullは使わない」というたった1行のシンプルなガイドラインを示し、数多くの開発者が参加しやすくなるようにしています。

#### 基本的にチーム開発では統一した方が良さそう。

「値がない」ことを意味するものがundefinedとnullの2種類あることが混乱の元なので、どちらか一方を使うようにするほうがコーディング上の意思決定を減らせます。なので、nullに寄せていく方法も考えられます。しかし、それはお勧めしません。undefinedはいたるところで自然に発生してくるので、それらをすべてnullにしようとすると、記述量がどんどん増えていくからです。

変数宣言で初期値をnullにする程度なら簡単ですが、存在しないオブジェクトプロパティや配列要素にアクセスしたときにもnullを返すようにするところまでやろうとすると難しくなってきます。したがって、統一するとしたらundefinedに寄せるほうが現実的です。
超小型カメラで物体検出　M5UnitV2 AICamera

# IoTデバイスのM5UnitV2で物体検出を行う方法です
![スクリーンショット 2022-03-01 11.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2b1b3f7c-61d6-6a0a-4a9d-69222ea9f2bb.png)

# いろいろな業界でエッジAIが活躍する

自動運転や製造ラインのチェック、倉庫。。。
機械学習による機能が小型デバイスでも実行できるようになってきたことで、これからIoTでのAI活用がさらに広がっていくと思っています。

# 小型カメラデバイスM5UnitV2を試してみる
とりあえずなんかやってみることが大事、
ということで、CPUを内蔵したカメラM5UnitV2を試してみます。
９０００円くらいでした。

手のひらサイズです。

 <img src="https://user-images.githubusercontent.com/23278992/156093803-edb9b5ed-c398-4fe2-b764-9788aa4e8525.png", width=400>

# 手順

ここからドライバをインストールします。

https://docs.m5stack.com/en/quick_start/unitv2/base_functions

USBでパソコンと接続します。

コマンドラインで、デバイス接続を探します。

```shell
ifconfig
```

こういうのを探します。

>en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=6467<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	ether 00:e0:99:31:c6:93 
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: inactive

再アクティベートします。

```shell
sudo ifconfig en5 down
sudo ifconfig en5 up
```

ブラウザで

http://10.254.239.1/

にアクセスします。

接続がうまく行っていれば、UnitV2のUIが表示され、プリセットのAIカメラタスクにアクセスできます。

![スクリーンショット 2022-03-01 11.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2b1b3f7c-61d6-6a0a-4a9d-69222ea9f2bb.png)

# さまざまなタスクに

小型でとても軽いので、さまざまなタスクに応用していきたいですね。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
MacでChromeをどうしてもフルHD（1920 * 1080）にしたい時に打つコマンド

以下コマンドをターミナルで打つと、Google Chromeのどれかが強制的にウィンドウサイズと場所を提題の通りにしてくれます
```
osascript -e 'tell application "Chrome"' -e 'set bounds of front window to {0, 0, 1920, 1080}' -e 'end tell'
```
Reactのbutton要素内でFont Awesomeアイコンを使う時の注意点

## 目的

クリックイベントで関数を呼び出すボタン要素の中にFont Awesomeコンポーネントを使ってアイコンを表示させたい。
しかしなぜか指定したnameがundefinedになってしまう...
```react
samples.map( sample => {
    return (
        <button onClick={handle} name={sample.id} className="border-0">
　　　　          <FontAwesomeIcon icon={faTrashCan} />
        </button>
    )

const deleteMemo = (e) => {
        const id = e.target.name //undefined...
        console.log(id); //undefined...?
        axios
            //割愛
```

## 原因

以下のようにevent.targetをコンソールに表示してみたところ、
```react
const handle = (e) => {
    console.log(e.target)
}
```
Font Awesomeコンポーネントの内容（svg）がevent.targetになっていた。
```html
<svg aria-hidden="true" focusable="false" data-prefix="far" data-icon="trash-can" class="svg-inline--fa fa-trash-can" role="img"></svg>
```

## 解決法

Font Awesomeコンポーネントにcssを当ててeventが発火しないように変更
```css
pointer-events: none;
```

自分はemotionを使っているのでとりあえず以下のように記述したところ想定の挙動をするようになりました。
```react
<button onClick={handle} name={sample.id} className="border-0">
　　　　　　　　<FontAwesomeIcon css={css`pointer-events: none;`} icon={faTrashCan} />
</button>
```

svg要素にonclick属性がついてるの初めて知った...
テストの並列実行に使うpytest-xdistの便利な使い方まとめ(主にUIテスト向け)

## pytest-xdistとは

`pytest-xdist`はテストの並列実行・分散実行に使う`pytest`のプラグインです。
これをインストールし、実行時に並列ノード数をオプションとして渡すだけで、勝手にテストを振り分けて実行してくれます。

https://github.com/pytest-dev/pytest-xdist

本記事では`pytest-xdist`を実際に使ってみて分かった便利な使い方、オプションなどをメモとしてまとめます。
なお、私は`pytest`をユニットテストではなく、主に`Selenium`や`Playwright`を使ったUIテスト用途に利用しているため、それに特化した内容になっていることをご承知おきください。
内容は随時更新します。

https://pytest-xdist.readthedocs.io/en/latest/index.html

## インストール

> pip install pytest-xdist

## テストの並列実行

> `pytest -n 4 test.py`

`-n`のあとにテストを並列実行するノード数(ワーカー数)を入力します。
数値の代わりに`auto`を指定すると利用可能なCPUのコア数が自動的に代入されます。

> `pytest -n auto test.py`

コア数以上の値を代入すればノードをその分だけ展開することも可能ですが、CPUのコア数の制限を受けます。
展開したノード上で厳密な並列処理はできないことに注意ください。

## ノードの特定

`pytest-xdist`の実行時には`worker_id`fixtureが呼び出せます。
これを使うと、テストを実行したノードの特定が可能です。

```test_identify_worker.py
def test_worker_id(self, user_id):
    hoge = f"このテストは{user_id}で実行されています"
    # fixture user_idにworker id(gw0, gw1, ...)が入る
```

## print文の出力

`pytest-xdist`を使用すると、`pytest`で利用可能な`-s/--capture=no`オプションが無効化され、そのままではprint文を表示することができなくなります。
print文を表示させたい場合は標準エラーに出力してください。

```test_print_worker.py
import sys
		 
def test_print_worker(self, user_id):
    message = "(ワーカーごとの処理結果)"
    print(f"{user_id}: {message}", file=sys.stderr)
```

## オプション入力の省略(設定ファイル)

`pytest-xdist`実行時のオプションが固定化されている場合、設定ファイル`pyproject.toml`を作成し、以下のように記載することで毎回のオプション入力を省略できます。

```pyproject.toml		 
[tool.pytest.ini_options]
addopts = "-n auto"
```

`pytest`の設定ファイルには`pyproject.toml`の他に`pytest.ini`なども利用できます。
`poetry`など他ツールとの一元管理ができる`pyproject.toml`に優位性があると考え、私は`pyproject.toml`による設定を採用しています。
https://docs.pytest.org/en/7.0.x/reference/customize.html

## 全ノードでの同一テストの実行

UIテストでは、稀に「同時にnブラウザからアクセスする」といった負荷テスト的な項目を確認する場合があります。
この際は`pytest-xdist`の`dist`オプションを以下のように指定すれば全ノードで同じテストを実行できます。

> `pytest -n 4 --dist each test.py`

負荷テストそれ自体は基本的にAPIリクエスト等を経由して実現するほうが効果的です。
あくまでUI経由で実行する合理的な理由がある際にのみこの方法を採用するといいと思います。

## 余談: pytest-parallelについて

`pytest`でテストを並列実行できるプラグインとして、`pytest-parallel`というものも存在します。

https://pypi.org/project/pytest-parallel/

`pytest-parallel`の`pytest-xdist`に対する優位点は以下の3点であると述べられています。

>pytest-parallel is better for some use cases (like Selenium tests) that:
>- can be threadsafe
>- can use non-blocking IO for http requests to make it performant
>- manage little or no state in the Python environment

スレッドセーフであるため、並列実行においては`pytest-parallel`の方がより安全であると言えます。
しかし一方で使用者の多さ、プラグインの更新頻度、Issueに対するレスポンスの良さなどは`pytest-xdist`の方が勝る印象です。
私は`pytest-xdist`を優先的に利用しています。
「コンテナの中に入って確かめて」と言われたら。。

## とりあえずコンテナの中に入りたい。

### ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html

ドキュメント読んでもわからないよ...。

### 下準備
- Session Manager plugin のインストール

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos-signed

- ログイン情報を保存しておく(aws configureに認証情報を保存する)
↓↓↓↓
### ログイン情報設定・確認のコマンドまとめ
#### 全ての認証情報を確認
```
 % vim ~/.aws/credentials
```
![Cursor_と_nagaikanae_—_vim____aws_credentials_—_207×26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/032c01c7-bd7a-64c8-542d-e947a87f37e8.png)

#### sampleという認証情報の作成
```
% aws configure --profile=sample
```
![Cursor_と_nagaikanae_—_-zsh_—_207×26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/a5e05b20-8029-28e2-b803-8f054735d655.png)
もう一度叩くと正しく設定されたかを確認することができる

![Cursor_と_nagaikanae_—_aws_configure_--profile_sample_—_207×26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/7f8e357e-ec61-45cc-28d5-a02ab309b9e9.png)

#### 現在の認証情報の確認
```
% aws configure list
```
defaultが呼ばれているみたい。
![Cursor_と_nagaikanae_—_-zsh_—_207×30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/b098ff9c-17aa-1591-280e-6ec8e56aaa9f.png)


#### 使いたい認証情報の設定
管理の方法は複数あるが自分は環境変数で設定している。

```
% export AWS_PROFILE=sample
```

#### 現在の認証情報がsampleになったか確認
```
% aws configure list
```
![Cursor_と_nagaikanae_—_-zsh_—_207×30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/07b4cd51-0653-56aa-6241-90e3015133b3.png)

### コンテナの中に入る

```
クラスター名：sample-php
タスクid：xxxxxxxxxxxxxxxxxx0
コンテナ名： web
```
```
% aws ecs execute-command --cluster sample-php \
    --task xxxxxxxxxxxxxxxxxx0 \
    --container web \
    --interactive --profile=sample\
    --command "/bin/sh"
```

コンテナの中に入る時は、オプションでprofileを指定できるが、環境変数ごと変更しておくことでECRにpushするときの思わぬエラーなどを防ぐことができる。aws cliを使うときは、profileを変更しておいた方が吉だと思う。

どうしてもExecできないとき↓↓↓

https://qiita.com/gebageba/items/6f86418f8ba072dc4dce
2022年3月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2022年3月1日の検索結果 (リスティング広告)

![20220301_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/46a32f8b-9f94-8a78-c27b-51172060c518.png)

* ServiceNow
* IBM
* Splunk
* LogicMonitor

リスティング広告だと、トップが ServiceNow でした。IBM、Splunk、LogicMonitor と続いています。
先月表示された3社 (Dynatrace、NTTデータ、Vitria) が、今月は表示されていません。

先月の結果はこちら --> [2022年2月 AIOps 定点観測](https://qiita.com/mkodera/items/eac508bfbd6864854352)

# 2022年3月1日の検索結果 (広告以外)

![20220301_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/d2bb7c0d-e8aa-53e4-e87d-e13362c6905a.png)

* Splunk
* JBSVC
* ITmedia
* マクロセンド
* NTTデータ
* 日本情報通信株式会社 (IBM Watson)
* ServiceNow

広告以外だと、上位4位までは先月と変わりません。その後に NTTデータ、日本情報通信、ServiceNow と続いています。
日本情報通信株式会社は NTT と日本IBM が出資して設立した会社のようです。 

先月の結果はこちら --> [2022年2月 AIOps 定点観測](https://qiita.com/mkodera/items/eac508bfbd6864854352)
Cookieとセッション

定番のCookieとセッションについてです。

Cookieとは、ブラウザとサーバー間において暗黙の情報交換を行うための仕組みで、サーバーからの指示によって、ブラウザがクライアントコンピュータ内に保存します。
その内容はWebサイトのドメイン名やCookiの有効期限といった基本情報のほかにその処理独自の値によって構成されています。Cookieによって保存された情報は、アクセスしたURLがCookie内の情報と一致する場合、自動的にサーバーへと送信されます。この仕組みにより、Webサイトはユーザーを識別することが可能になり、アクセスするユーザーに応じてブラウザへの表示内容を切り替えることが可能になります。

一方、セッションもCookieと同じく、各ユーザーごとに固有のデータを格納するための仕組みです。セッションは個々のセッションを識別するためのセッションIDと各セッションIDに紐づくセッションデータを持っています。
ユーザーからの初回アクセス時、サーバーはセッションを作成してサーバーへ保存する一方、セッションIDをCookieに格納し、クライアントへ渡します。同じユーザーが2回目以降にアクセスしたとき、クライアントはCookieとその中のセッションIDをサーバーへ送信し、サーバーは受け取ったセッションIDを使用してそれに紐づくセッションデータを取得、そのデータを基にユーザー認証やユーザーごとにブラウザへの表示内容を切り替えます。

これだけ見ればCookieもセッションもやっていることはほぼ同じように見えます。「なぜ、わざわざセッションIDをCooikeに格納する、なんてまどっろこしいことをしているんだろう？」と思われたかもしれません。

実は、Cookieには大きな弱点が2つあります。
1つ目は、Cookieは保持できるデータの容量が少ないということ、2つ目はCookieによって保存される情報は一切暗号化がされていないということです。特に2つ目の弱点は致命的で、容易に改ざんが可能であったり、第三者がCookieの情報を盗み取ったりすることが可能なのです。

そのような問題に対応するために、セッション生み出されたというわけです。
中華 自動散水灌漑システム土壌水分センサーポンプモジュールの仕様

### 概要
aliexpressなどで見かける、以下のような自動散水キットの仕様を確認したので記載する
![IMG_20220228_231748_850_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436645/063906cc-3eaa-a1be-f6bb-2b17eb71e110.jpeg)

なお、当方2021/11購入時は、商品208円、送料665円　2週間弱で到着だった

### キット概要
説明書等はなく、上記商品が袋に入っていた。
購入元によっては、aliexpressに自動翻訳の手短な説明が添えられているが
基本的に自己解決が求められる内容


1.DC5V駆動水中ポンプ
2.透明チューブ　50cm
3.土中水分センサー
4.コンパレータボード
5.5Vリレー
6.単4 4本電池ケース(6V)
7.USB typeA - ピンジャック
8.デュポンワイヤー1 (メス-メス 2線 21cm)
9.デュポンワイヤー2 (メス-メス 10線 21cm)

### 各部品仕様
#### 1.水中ポンプ
- 概要：清水専用 5V駆動水中ポンプ。黒0V 赤5V加えると、結構な勢いで吐出される
- 屋内でテストする際はバケツの中などで行わないと辺りが水浸しになるので注意
- 水中以外では駆動させないこと　と書かれている
- 耐久性は今後確認
 

#### 3.土中水分センサー
- 水分が増えると抵抗が下がるもの。以下は個体差もあるので参考値。なお水没させてはいけないと書いてあったので注意
- 乾燥状態での抵抗値 　18.3MΩ
- 一度先端5mm水没後、センサをタオルで拭いた後　3.5MΩ または　1.6MΩ　※端子２つあるがテスタを当てると向きによって値が違うようだ。0.5パイ程度の穴内はタオルでは拭けないので水分が残っている状態。コンパレータ側はGND指示があるが、センサーには極性指示なし。ただ、状況的に入れ替えると特性が変わる恐れあるので注意が必要。
- 先端5mm水没　1.00MΩ
- 半分水没　　　220kΩ
- センサ部全水没　220kΩ
- 土中で電圧かけた状態２か月ほどでセンサ銀箔部は溶けてなくなるという噂
- 同aliexpressで見かけるキャパシタ計測式なら長持ちするか　は未確認

#### 4.コンパレータボード
- 概要：5V負論理で散水必要状態を出力するボード
- コネクタ：センサ接続端子2ピンと、電源/出力端子４ピン　電源/出力端子は　VCC/GND/DO(デジタル出力)/AO(アナログ出力)
- D0デジタル出力：ボード上のボリュームで調整した値より抵抗が下がったら、ボード上の緑LEDを点灯させつつD0端子からL出力、抵抗値が高かったら、ボード上の緑LEDを消灯させつつD0端子からH出力
- A0アナログ電圧出力：同キットでは使わない端子。5V系Arduinoなど5V ADCを接続するためのピン

#### 6.電池ケース
- 概要：同キットを電池駆動させるためのもの
- コネクタはないので、はんだ付けなどが必要

#### 7.USB typeA - ピンジャック
- 概要：USB typeAを電源として使うためのサービス品
- メスピンジャックは付属しないので、自分でメスピンジャックを用意するか、切断してはんだ付けかデュポンオスを自分でつける

### 実際の土での反応

#### びちょびちょの土
散水不要判定　〇正解

#### まだやらなくて良いが、フカフカの土
散水必要判定　×間違い
※土を押さえつけて密着させると、散水不要判定になる

#### もうそろそろやっていい土
散水必要判定　〇正解

#### カサカサの土
散水必要判定　〇正解

### 所感
- 概ねデフォの状態で判定は間違いないが、新品入れたての培養土など、空気含有率が高い土は散水必要判定が出やすいので
　過湿状態になる可能性がある
- センサは反応するので、短期間の暫定利用にはお買い得だと思う。が、このキット素で室内植物を灌漑させるのはリスクが高そと判断する
- センサ・リレーの不具合で水が止まらなくなり、辺りが水浸しにならないか、
- 水タンクが空になって回り続けた際に壊れるだけならよいが、発火しないか　

など注意された方が良いかもしれない
【クエリビルダ】デザインしたクエリを再利用する

クエリビルダは、Sharperlightアップリケーション群で共通に使用されるクエリ作成支援ツールです。クエリビルダで作成したクエリは、ファイルやクリップボードに保存可能で、別のSharperlightアップリケーションから開いたクエリビルダにインポートしてそのまま使用したり、テンプレートとして編集し直して使用することができます。

# クエリの保存
## ファイルへ
クエリビルダのフィルター領域で、右クリックメニューを表示します。
メニューから、”保存”を選択します。
![2022-03-01 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6e3e9584-509b-541e-1d58-1d6442887a0c.png)
ファイル保存ダイアログが表れ、拡張子 .qty のファイルが保存可能になります。
![2022-03-01 Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/13ad4ebd-4e7d-3147-7743-08cf69095633.png)
Save(保存)を押して完了です。
## クリップボードへ
クエリビルダのフィルター領域で、右クリックメニューを表示します。
メニューから、”クリップボードにコピー”を選択します。直ちにクリップボードにコピーされます。
![2022-03-01 Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d843e945-2429-204f-ecd1-310a22fc1e5c.png)
# クエリのインポート
## ファイルから
クエリビルダのフィルター領域で、右クリックメニューを表示します。
メニューから、”クエリのインポート” -> ”ファイル”を選択します。
![2022-03-01 Figure 04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e5b9d0b2-2e1a-b10f-8101-9cb8be446442.png)
クエリーダイアログが表れ、拡張子 .qty のファイルが選択可能になります。
![2022-03-01 Figure 05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e57a2aa0-c7c1-08c8-0988-b22ee8cb51b6.png)
Open(開く)を押して完了です。
## クリップボードから 
:bulb: **クリップボードにクエリをコピーした直後で、クリップボードにクエリが存在している場合のみ機能します。**
クエリビルダのフィルター領域で、右クリックメニューを表示します。
メニューから、”クエリのインポート” -> ”クリップボードから”を選択します。直ちにクリップボードからコピーされます。
![2022-03-01 Figure 06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6e32c8df-8448-1886-a77e-2be5f2d4c816.png)
:postbox:[お問い合わせ](https://sharperlight.jp/about-us/contact-us/)
ActiveStorageでRspec実行時に生成された画像データをテスト終了後自動で削除する方法

## 概要
`ActiveStorage`で`Rspec`実行時に生成した画像ファイルをテスト終了後に自動で削除する方法をメモとして残しておきます。
`Rails`で`Rspec`を用いてテストする際に画像を生成する場合があると思います。
その際に生成されたテスト用画像データは下記のように`config/storage.yml`に設定された保存先に保存されます。

```ruby
test: # 'root'にテスト時に生成された画像を保存する場所を指定している
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>
```
テストを行っていくとどんどんと保存先のストレージが生成された画像で圧迫されてしまいます。
しかし、ある設定をすることでテスト終了後はストレージをクリーンアップすることができます。

## 方法
_*spec/rails_helper.rb*_

```ruby
RSpec.configure do |config|
  config.after(:all) do
    FileUtils.rm_rf(ActiveStorage::Blob.service.root) if Rails.env.test?
  end
end
```

上記の設定を`spec/rails_helper.rb`に記載すれば自動的に画像のクリーンアップが実行されます。

### 備考
`minitest`でテストを行っている場合は下記ドキュメントに詳しく乗っていますので参照してください。

https://railsguides.jp/active_storage_overview.html