OmniAICreator/Qiita-1.07M huggingface dataset:
Google Firebase ソーシャル認証機能を設定

<!-- wp:paragraph -->
<p>前回(<a rel="noreferrer noopener" href="https://www.mkhs.work/wordpress2/?p=257" target="_blank">https://www.mkhs.work/wordpress2/?p=257</a>) Google Firebaseでプロジェクトを作成しました。今回はプロジェクトにソーシャル認証を設定して、Vue.jsから認証できる準備をします。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Google Firebaseの認証機能を使うと、Google、Twitterの認証などを簡単に実装できます。今回はGoogle Firebase側の設定を行います。コンソールの左メニューになる Authenticationを選択、右画面に現れる 始める を押下します。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/64541beb-8c64-ad87-8688-656ea25c76b5.png)

<!-- wp:paragraph -->
<p>Sign-in methodが選択されている画面に変わります。いろいろな認証プロバイダーに対応している事がわかります。今回は Googleを選択します。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/5e6fa940-5667-54d5-65aa-5aa062880e89.png)


<!-- wp:paragraph -->
<p>右上の 有効にするを設定すると、プロジェクトの公開名、サポートメールのデフォルト値が表示されます。そのまま 保存ボタンを押します。、</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/573bdfcc-315b-2ea2-4d64-7ac6208c8fa1.png)

<!-- wp:paragraph -->
<p>Googleが有効になりました。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/c7d2e9ca-d5e4-060d-e36a-0e208d262ace.png)
SPAN設定


###モニターしたいインターフェース
(config)#

```
monitor session [セッション番号] source interface [インターフェース番号]
```


###モニターするインターフェース
(config)#

```
monitor session [セッション番号] destination interface [インターフェース番号]
```


###例

1番インターフェースを
24番インターフェースにミラーリング(つまり1番ポートの内容を24番で確認)したいとき
(config)#

```
monitor session 1 source interface g1/0/1
monitor session 1 destination interface g1/0/24
```

※セッション番号は揃える
アプリを一括でダウンロードする方法(windows)

みなさんは複数のアプリをWindowsで
ダウンロードしたくなったときはありませんか。

本日はバッチファイルを用いて複数アプリをダウンロードする方法を紹介します。

このサイトを参考に作成しました。

https://jj-blues.com/cms/wantto-readfilelinewithfor/

https://docs.microsoft.com/ja-jp/windows/package-manager/winget/

[準備]
appinstaller.bat : ファイルをインストールするためのバッチファイル
requirements.txt : インストールしたいアプリの一覧
この二つのファイルを同じ階層に作成しておく。
（batファイルにパスを通しておくと、使いまわししやすくなる）

[方法]
１．下記のコードをバッチファイル(appinstaller.bat)として登録する
２．requirements.txtを作成し、インストールしたいアプリを箇条書きに書き込む
３．appinstaller.batを実行すると、インストールが始まる

```appinstaller.bat
@echo off
for /f %%a in (requirements.txt) do (
  winget install %%a 
)
```

```requirements.txt
twitter
facebook
instagram
```
この方法でダウンロードすると、下のように三つのアプリをインストールすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/1436ff80-e3de-0885-7714-0ce35240e7f4.png)
備忘録：requireメソッドの使い方（二次元ハッシュの場合）

# form_forで送られたparamsをデータベースへ保存する方法

①requireメソッドを使います。

②paramsの中身を確認して、以下のような二次元ハッシュになっている事を確認する。

```
{ review{ }  }
```

③前述の②のような二次元ハッシュ構造のときは以下の雛形で入力した情報を取り出す。

```
params.require(:モデル名).permit(:カラム名)
```

>引用元：https://chkc.hatenablog.com/entry/2019/07/26/171616
キューイングについて

# キューイング
* 2つの主体の間でデータの受け渡しを非同期に行う手法
* 先入先出

# キューイングの例
## 印刷機器
コンピューターから、プリンターにデータを送信する際
データ送信速度と、プリンターが印刷する速度では、印刷速度の方が圧倒的に遅い。

そうすると、コンピュータは殆どの時間を待たされることとなる。

それを回避するために、一旦キューへ退避してプリンタの処理の進み具合を見て、制御プログラムが少しずつデータを転送する

https://e-words.jp/w/%E3%82%AD%E3%83%A5%E3%83%BC.html#:~:text=%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A6%81%E7%B4%A0,%E3%81%BB%E3%81%86%E3%81%8C%E5%9C%A7%E5%80%92%E7%9A%84%E3%81%AB%E9%81%85%E3%81%84%E3%80%82
AWS Amazon Linux2 インスタンスに samtools・bcftools をインストールする

# 初めに

今回は samtools と bcftools を Linux 2 インスタンスにインストールする手順について書きます。

ユーザーは ec2-user、ボリュームは 100 GiB の gp2 を使用しました。デフォルトの 8 GiB では前回足りなくなりました。

前回は BWA を Linux 2 インスタンスにインストールしました。

https://qiita.com/quryu/items/e713fefb645b0283580a

# samtools をインストールする

以下のページからファイルをダウンロードします。

http://www.htslib.org/download/

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/13f18f02-0b2c-8116-076e-1f68b17fcc52.png)

必要なパッケージをインストールします。

```
sudo yum install ncurses-devel
sudo yum install xz-devel
sudo yum install bzip2-devel
sudo yum install libcurl-devel
```

以下のコマンドを順に実行しビルドします。

```
tar -jxvf samtools-1.14.tar.bz2
cd samtools-1.14/
./configure --prefix=/usr/bin/
make
sudo cp samtools /usr/bin/
```

バージョンを確認し、インストールされたことを確認します。

```
$ samtools --version
samtools 1.14
Using htslib 1.14
Copyright (C) 2021 Genome Research Ltd.
```

# bcftools をインストールする

先ほどと同様にビルドします。

```
tar -jxvf bcftools-1.14.tar.bz2
cd bcftools-1.14
./configure --prefix=/usr/bin/
make
sudo cp samtools /usr/bin/
```

こちらもバージョンを確認し、インストールされたことを確認します。

```
$ bcftools --version
bcftools 1.14
Using htslib 1.14
Copyright (C) 2021 Genome Research Ltd.
License Expat: The MIT/Expat license
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

# リファレンスファイルをダウンロードする

今回はこちらのリファレンスファイルを使用します。

https://support.illumina.com/content/dam/illumina-support/help/Illumina_DRAGEN_Bio_IT_Platform_v3_7_1000000141465/Content/SW/Informatics/Dragen/GenerateHA19Reference_fDG_dtREF.htm

```
wget hgdownload.cse.ucsc.edu/goldenPath/hg19/bigZips/chromFa.tar.gz
tar -zxvf chromFa.tar.gz
cat chr*.fa > hg19.fa
mkdir fa_files
cp chr*.fa fa_files
```

# バリアントコール

samtools、bcftools を使用してバリアントコールをします。

まず ART を使用して FASTQ ファイルを作成します。

```
$ art_illumina -ss HS25 -sam -i fa_files/chr5.fa -p -l 150 -f 20 -m 200 -s 10 -o paired_dat
$ head -5000 paired_dat1.fq > paired_1.fq
$ head -5000 paired_dat2.fq > paired_2.fq
```

マッピングします。

```
$ bwa index fa_files/hg19.fa
$ bwa mem -t 8 -o output.sam fa_files/hg19.fa paired_1.fq paired_2.fq
```

ソートし、インデックスファイルを作成します。

```
$ samtools sort -@ 4 -o output.bam output.sam
$ samtools index output.bam
```

バリアントコールします。

```
$ samtools mpileup -uf fa_files/hg19.fa output.bam | bcftools call -mv > output.vcf
```

# 参考記事

- Samtools 公式ページ

http://www.htslib.org/

- samtools のインストール

https://kazumaxneo.hatenablog.com/entry/2019/01/04/220013

- VCFやBCF を扱う bcftools

https://kazumaxneo.hatenablog.com/entry/2020/10/16/103000

- Generate an HG19 Reference

https://support.illumina.com/content/dam/illumina-support/help/Illumina_DRAGEN_Bio_IT_Platform_v3_7_1000000141465/Content/SW/Informatics/Dragen/GenerateHA19Reference_fDG_dtREF.htm
KivyでOS付属の日本語フォントの指定方法

マルチプラットフォーム対応のアプリを開発するときにPythonのKivyを選択肢として調査しているときに、WindwosなどOS付属の日本語ってどうやって対応するの？って段階で挫折しないためのメモ

# 参考にした場所
マルチプラットフォーム対応のアプリを開発で比較調査

* [KivyフレームワークとKivyMDライブラリの機能の概要](https://tech-ja.netlify.app/articles/ja546684/index.html)
* [Kivy vs Flutter | Learn the Key Differences between Kivy and Flutter](https://www.educba.com/kivy-vs-flutter/)

Kivyで日本語を使う時
* [Tofu issue 日本語フォントの表示 - Kivy Advent Calendar 2013] (https://cheeseshop.hatenadiary.org/entry/20131202/1385936070)
* [システムフォントついて](https://www.phenomena.co.jp/blog/2021/04/12/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%A4%E3%81%84%E3%81%A6/)
* [font-familyについて本気で考えてみた](https://qiita.com/tsuka-rinorino/items/b30e03ce10aa38ac2a10)
* [Python Kivyの使い方① ～Kv Languageの基本～ - Qiita](https://qiita.com/dario_okazaki/items/7892b24fcfa787faface)
* [PythonをインストールしてPygameを動かすまで - Qiita](https://qiita.com/i-tanaka730/items/ad56461a4f223fdbb4e5)

pygame
* [pygame.font](https://www.pygame.org/docs/ref/font.html#pygame.font.get_fonts)
* [pygame.font 日本語訳](http://westplain.sakuraweb.com/translate/pygame/Font.cgi#pygame.font.get_fonts)
* [【備忘録】Pygameでのテキスト入力処理サンプル(ただし機能は限定的)【Python】](https://qiita.com/kedama_nth/items/7e6e80ce98fe070ab23e)


# 日本語対応方向性
OS付属のsystem fontが使えれば、新規のフォントファイルを内包しなくても済むはず

# やり方
動作環境によてOS付属のフォントから日本語の使えるフォントを指定する。フォントファイルの場所を見つけるのが面倒なので[pygame](https://www.pygame.org/)ライブラリから機能を拝借する。

## 準備
[Windows10 64bit Python ３.10.x へのKivy 2.x開発環境の構築手順](https://qiita.com/2tama3/items/42057f2ba7fa61465329)

```console
pip install pygame
```


## 実装
```python:
import pygame
import platform
from kivy.core.text import LabelBase, DEFAULT_FONT

_platform = platform.system()
if _platform == 'Windows':
 LabelBase.register(DEFAULT_FONT, pygame.font.match_font('yugothic'))
```

これで、システムにあらかじめ入ってる日本語が使えるフォントを簡単に固定できるので、フォントを同梱しなくってもマルチプラットフォームの日本語対応が簡単にできますよ。もっと凝るならplatformでOSの版数などを確認してさらに分岐


## システムフォントの一覧を調査するには
```python
import pygame
print(pygame.font.get_fonts())
```
自分で使うグリフ(Glyph)や領域が入ったフォントの名前さえ調べとけばマルチプラットフォームのアプリ開発に簡単です。
AWS認定ソリューションアーキテクトアソシエイトの勉強法まとめ

# はじめに
2021/12にAWS認定ソリューションアーキテクト アソシエイトの試験に合格したので、メモとして勉強法をまとめておく。

### 学習時間
AWSについては、EC2やDBを少し使用したことがある程度で、ほぼAWSについては知識ゼロベースで学習を開始。
アソシエイトの学習時間は3ヶ月、ざっくり、100時間ほどで、隙間時間に無料オンライン問題を行った。

### 勉強方法
基本、Udemy + AWS公式模擬試験 + オンライン問題 (+ たまに動画)。

- Udemy(有料)　Udemyセール時に購入
    - 基本講義部分で学習を進め、分かりにくいと思ったサービスはAWSの無料範囲内でハンズオンを実施
    - 各サービスの学習の後、まとめ問題を実施(まとめ問題で結果が悪い場合、やり直し)
    - 学習の際は「なぜこのサービスや構成を選定するのか」を意識して学習した。
    - 総合テストとして、Udemyの模擬試験を実施（合格レベルに達するまでやり直し)
    - 以下使用した講座
        - 「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）」　https://www.udemy.com/course/aws-associate/
        - 「AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）　」　https://www.udemy.com/course/aws-uoyc/

- AWS BlackBeltOnline(無料)
    - 重点的に学習したい場合や疑問に思った時など、AWSが提供する動画を確認
    https://www.youtube.com/channel/UCnjKWUK2t5QJYfeqqilhJhQ
    - 公式ではないがクラスメソッドの資料や動画がうまく纏まっておりBlackBeltOnlineと合わせて利用した
https://dev.classmethod.jp/tags/aws/

- オンライン問題(無料)
    - 隙間時間の学習で活用。サイトによっては、試験問題が古い場合もあるので要注意。以下、利用したサイト(1例)
https://aws-exam.com/saa/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E5%95%8F%E9%A1%8C%E9%9B%86/

- 模擬試験(有料) 2回
    - 模擬試験では20問、30分の模擬試験となる。

### 試験準備メモ(よかったこと、足りなかったことなど)
- 知識の丸暗記ではなく、学習の際は「なぜこのサービスや構成を選定するのか」を意識した学習
- AWS公式の模擬試験を受験は、下記のメリットがあった
    - 試験ペースを掴める
    - 自身の現状のレベルを確認できる
    - 画面(ブラウザ)を見てテストを解くことに慣れる

- 問題の解き方について作戦を立てたこと(わからない問題、迷った問題はタグをつけ飛ばし、全ての問題を解いた後に再び解いた。自分の場合、全問を90分で解いて、残りの40分で見返した。)
- 試験直前に見返せるようなまとめ資料を作成していなかった(自分が間違えやすい問題について、ピンポイントで知りたい情報を得るのに若干苦労した。。)
メモ:データベースを使ったFlaskをPyinstallerでパッケージングしたら500エラーが出たときの対処法

#問題
タイトル通り、データベースを使ったFlaskをPyinstallerでパッケージングしたら500エラーが出た。
#対処法
Pyinstallerの--onefileオプションを外し、データベースのファイルを.exeファイルと同じ階層に置く。
##備考
データベースを事前に作成しておいておく方式のガバガバ開発で飲み使えるTipsなのでかなり限られた状況でだけ役に立つ
。
新人エンジニア2022年の過ごし方

新年あけましておめでとうございます。nishioです。

昨年はエンジニアへ転職して12月からスタートを切り出しました。

# 昨年の反省点
昨年は、コミュニケーション、文章、説明といった基礎ができておらず、面接や、仕事において苦労しました。
また、現在ではJavaの研修を受けているのですが、クラスの動かし方やメソッドとクラスの違いについてなんとなく一色単にしていました。

# 今年の過ごし方
今年の過ごし方としてはコミュニケーション、文章、説明といった基礎を作るべく、まずは小説などの本を読む習慣をつけることを行っていきたいです、
次に、IT業界では用語の意味を厳密に取り扱っているため、自分で何か用語の説明をする際に、本当にあっているのか確かめ、よく考えてから研修に臨みたいと思います。

今年もよろしくお願い致します。
updateメソッドについて

##問題
顧客情報の追加（更新）画面を作成するために、updateメソッドを使用した。
<a href="https://gyazo.com/f19beff83087508524a42dd58b4b5b42"><img src="https://i.gyazo.com/f19beff83087508524a42dd58b4b5b42.png" alt="Image from Gyazo" width="326"/></a>
サーバーを起動して挙動を確認するも、下記エラーが発生する。
<a href="https://gyazo.com/33a99299dbde86939324ab4198b418a1"><img src="https://i.gyazo.com/33a99299dbde86939324ab4198b418a1.png" alt="Image from Gyazo" width="473"/></a>
エラー内容によると、引数が１つ渡されるはずが、渡されていないとのことである。
##updateメソッドとは
そもそも、updateメソッドは、

①変数に、更新したいレコードの情報を代入する
ex)今回では 「@customer=current_customer」
②その変数に対してupdateメソッドを使用するが、updateメソッドの引数には、変更後のデータをハッシュ形式で与える

この２つの手順を踏む必要がある。
##原因
明らかであるが、updateメソッドに引数を渡していなかったことが原因だった。
##解決
下記のように修正した。
<a href="https://gyazo.com/f56f647c2c744051871307ee1eb193ba"><img src="https://i.gyazo.com/f56f647c2c744051871307ee1eb193ba.png" alt="Image from Gyazo" width="302"/></a>
また、上記は「customer_params」というストロングパラメータを使用しているが、
<a href="https://gyazo.com/c7d9842114c1e077d6ee835209d6ef05"><img src="https://i.gyazo.com/c7d9842114c1e077d6ee835209d6ef05.png" alt="Image from Gyazo" width="1190"/></a>
ストロングパラメータでは、返り値がハッシュであり、今回でいうと、
{last_name: 入力した値, first_name: 入力した値...}
というように返ってくることから、結果的に変更後のデータをハッシュ形式で取得することができている。
今後はこういう細やかな知識も習得していきたいと思うし、こういうことが分かればスムーズに作成することが可能になる思う。
##参照
https://pikawaka.com/rails/update
https://pikawaka.com/rails/strong_parameter
Angular勉強メモ

目的
Angularを用いてアプリケーションを作成をし、Angularを学ぶ
（アプリケーション：スタンプラリー予定）

###アプリ実行

```ruby:qiita.rb
cd MyApp
ng serve
```
-> を実行、`Compiled successfully. `と表示されたらブラウザで` http://localhost:4200/ `にアクセスし以下の画面が出たらOK。

###google-map
Maps JavaScript API を利用
→だいたい何でもできるやつ（？）。学習用途くらいなら課金不要。
Angular Material に追加された google-maps を利用
→タグでﾍﾟｯってできるらしい
参考：https://qiita.com/kjugk/items/b37cae7177fe0ff4bda0
【一眼で確認するだけの】 NATインスタンスと、NATゲートウェイの違い

### NATインスタンス
  * プライベートIPから、グローバルIPへの変換を行う
  * NATゲートウェイでは出来ない、踏み台サーバーやポート転送を行える
  * ユーザーが管理
  * パブリックIP or EIP
  * 実態はEC2（セキュリティグループ使用可能）

### NATゲートウェイ
  * VPC内のプライベートサブネットから、インターネットへアクセスする際に使用
  * パブリックサブネットに配置する
  * AWSが管理
  * EIPのみ
  * セキュリティグループ使用不可

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-comparison.html
GitHub Actions で Flutter プロジェクトを自動ビルド(CD)

#はじめに
毎回手でビルドするのが面倒だから、GitHub　ActionsがCD機能付いてるので、ソースをmasterにプッシュのダミーミングでプロジェクトが自動ビルドができます。
### yaml内容説明
```
name: Android CD

#発火条件
on:
  #ソースをmasterブランチにプッシュする時
  push:
    branches: [ master ]
  #他のブランチをmasterブランチにマッジする時
  pull_request:
    branches: [ master ]

jobs:
  build:
    #ビルド環境
    runs-on: ubuntu-latest

    steps:
      #リポジトリからソースをダンロード
      - uses: actions/checkout@v2
      #JAVA環境構築
      - name: install java 8.x
        uses: actions/setup-java@v1
        with:
          java-version: '8.x'

      - name: setup cache
        uses: actions/cache@v1
        with:
          path: /Users/runner/hostedtoolcache/flutter
          key: ${{ runner.OS }}-flutter-install-cache

      #Flutter環境構築
      - name: install flutter
        uses: subosito/flutter-action@v1
        with:
          #Flutterのバージョン
          flutter-version: '2.5.3'
          channel: 'stable'

      - name: flutter dependencies install
        #ライブラリーの導入
        run: flutter pub get

      - name: build apk
        run: |
          echo '${{ secrets.KEYSTORE_BASE64 }}' | base64 -d > android/release.keystore
          export KEYSTORE_PASSWORD='${{ secrets.KEYSTORE_PASSWORD }}'
          export KEY_ALIAS='${{ secrets.KEY_ALIAS }}'
          export KEY_PASSWORD='${{ secrets.KEY_PASSWORD }}'
          flutter build apk --release

      - name: Upload artifact
        uses: actions/upload-artifact@v1.0.0
        with:
          name: android
          path: build/app/outputs/flutter-apk/app-release.apk

```

###Gradleに情報を改修
用意した鍵を埋め込んだり、リリース用の設定をするために Gradle ファイルを修正していく。
下記のコードをandroid {}に追加

```
 signingConfigs {
        release {
            keyAlias System.getenv('KEY_ALIAS')
            keyPassword System.getenv('KEY_PASSWORD')
            storeFile rootProject.file('release.keystore')
            storePassword System.getenv('KEYSTORE_PASSWORD')
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
```

GitHubにSettingsタブをクリックして、下記のように秘密鍵を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906922/a0e4ac14-431f-8322-ca49-2470dc92f67a.png)

上記の秘密鍵をyamlファイルに関連

```
          echo '${{ secrets.KEYSTORE_BASE64 }}' | base64 -d > android/release.keystore

          export KEYSTORE_PASSWORD='${{ secrets.KEYSTORE_PASSWORD }}'

          export KEY_ALIAS='${{ secrets.KEY_ALIAS }}'

          export KEY_PASSWORD='${{ secrets.KEY_PASSWORD }}'
```


ターミナルでこのコマンド　cat release.keystore | base64　を実行すればKEYSTORE_BASE64の値が見えます。
###プッシュして確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906922/cb602a14-2744-112a-52f7-032722b84c6a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906922/6d26afdc-c917-136d-bf0b-78e9bc26da40.png)
成功時にはこのようになるはずだ。
###終わり
GitHub Actions を使った Android 向けの自動デプロイの方法をまとめた。
参考リポジトリ：https://github.com/zhanghangcode/flutter_water
rails c について

## 問題
rails c してもターミナル上に入力したはずのデータが表示されない。
「Object doesn't support」のエラーメッセージが表示される。

## 原因
rails c でコンソールを起動してから、exit　で脱コンソールしてからも、コンソール自体は裏で起動しているため、最新の情報が表示されないらしい。

## 解決
spring status　で状況を確認して、spring running の時は、spring stop　で停止する。その後、再度 rails c　すると無事データが表示された。

# 参照
こちらの記事が参考になりました。
https://mophie-blog.com/2020/12/30/rails-error-object-doesnt-support-inspect/#toc1
timeoutコマンドを使う（whoisコマンドで応答がない時などの対応例）


http://command.appios.net/timeout.1.html

```bash
$ cat whois-timeout-test.sh
#!/bin/sh

for i in `seq 1 255`; do
  HOST=2.1.1.$i
  echo ${HOST}
  timeout 1 whois ${HOST} | grep -i country | head -n 1
  sleep 1
done

$ ./whois-timeout-test.sh
2.1.1.1
Interrupted by signal 15...
2.1.1.2
country:        FR
2.1.1.3
country:        FR
2.1.1.4
country:        FR
2.1.1.5
country:        FR
2.1.1.6
country:        FR
2.1.1.7
country:        FR
2.1.1.8
country:        FR
2.1.1.9
country:        FR
2.1.1.10
country:        FR
2.1.1.11
country:        FR
2.1.1.12
country:        FR
2.1.1.13
country:        FR
```

```zsh
$ cat test1.sh
#!/bin/sh

echo "STARTED..."
for i in `seq 1 10`; do
  echo "${i} DONE."
  sleep 1
done
echo "ENDED..."


$ timeout 5 ./test1.sh
STARTED...
1 DONE.
2 DONE.
3 DONE.
4 DONE.
5 DONE.

$ echo $?
124
$
```
WinForms の TreeView をエクスプローラースタイルにする方法

# WinForms の TreeView をエクスプローラースタイルにする方法

### 通常のツリービュー

- 非アクティブ時に選択状態が見え難い

![tv_normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298163/d956b85c-7318-c1db-5da5-bdb8b9f3a094.png)

### エクスプローラースタイル

- 展開記号が矢印
- 非アクティブ時も選択状態が見え易い

![tv_explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298163/2df8739a-9c6b-e4c7-e058-bfb5ab60013a.png)

## サンプルコード

```C#
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

static class NativeMethods
{
	[DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
	public static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList);
}

static void InitializeTreeView(TreeView tv)
{
	tv.FullRowSelect = true;
	tv.HideSelection = false;
	tv.ShowLines = false;

	NativeMethods.SetWindowTheme(tv.Handle, "explorer", null);
}
```
[JSTQB AL TAE]　1.テスト自動化の概要と目的　を視覚的にまとめてみた

# はじめに
QAエンジニアのMa5am1nです。
冬休みの課題としてテスト自動化エンジニアの[シラバス](http://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TAE_Version2016.J01.pdf)[^1]を読んでいます。理解促進のために、図など視覚的に入ってきやすそうな形式でまとめてみます。

[^1]: テスト技術者資格制度 Advanced Level シラバス テスト自動化エンジニア　（Version 2016.J01）
**※あくまで私個人の解釈で作成したものです。内容が100%シラバスの通りであることは保証できませんので、ご了承ください。**
**※スライドの青文字、青線になっている箇所は、シラバスに記載されていない、私独自の解釈で記載した内容です。**

このページでは、1.テスト自動化の概要と目的について扱います。


# 1.テスト自動化の概要と目的
## 1.1テスト自動化の目的
![JSTQB TAE (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/6624ca5c-a8d0-13da-1894-045e2371a4a8.png)
![JSTQB TAE (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/fce30950-e84d-af1f-ccd7-59e00dbf73d9.png)
![JSTQB TAE (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/4fe020c4-252a-c579-7440-828cb91b84d8.png)
![JSTQB TAE (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/26e60cdd-1a23-768c-d302-d4073bf5cdf8.png)
![JSTQB TAE (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/4c7b1ee4-8775-f3b8-dbb1-af167ba07108.png)
![JSTQB TAE (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/77b21f1c-0493-1168-e73e-ba3aa1d5fe70.png)
![JSTQB TAE (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/2cdfd652-a310-b163-4f2a-5998195329eb.png)


## 1.2テスト自動化の成功要因
![JSTQB TAE (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/f77f44b1-c6bf-c1ba-df3d-d607682b87cd.png)
![JSTQB TAE (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/18f81e32-8685-16f2-ef07-1d705145fbaa.png)
![JSTQB TAE (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/0293336e-3254-8fb6-38ab-3e6cf9111fe1.png)
![JSTQB TAE (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/8acb2670-1498-ed01-dd07-e3bea8fed38c.png)
Nuxt.jsのライフサイクルフックについて

## 概要
Nuxt.jsのライフサイクルフックについて
自分の中で曖昧な部分が多々ありましたのでアウトプットしたいと思います。

## ライフサイクルフックとは
一言で言うとWEBページを表示する手順のこと。
全部で10個のフックが存在し、各フックで行われることが異なる。

## WEBページが表示される手順

### 1. serverMiddleware
__サーバーのみで実行されるフック__であり、__サーバー固有の処理__を記載したりする。
APIサーバーを`serverMiddleware`を使って作成することもできる。
処理を書いたファイルを`nuxt.config.js`の`serverMiddleware`に登録するだけで使用できる。

### 2. nuxtServerInit
`severMiddleware`と同様に__サーバーのみで実行されるフック__で
__クライアント側に処理を渡す前にサーバー側で行う処理__を記載する。
サーバーからクライアント側へ初期値を渡す処理や、クッキーの取得処理などを記載できる。

### 3. RouteMiddleware
__サーバーとクライアントの両方で実行されるフック__で
サーバーでは１回、クライアント側ではページ遷移のたびに呼び出される。
__ルーティング処理__などを記載する。
たとえば、認証していないユーザーはログインページにリダイレクトされるなど。
`middleware`ディレクトリ内にファイルを作成し、`nuxt.config.js`の`middleware`に登録することで
処理を反映できる。

### 4. Validate
__サーバーでSSR時に１回、クライアント側でページ遷移のたびに呼び出されるフック__。
各コンポーネントで__バリデーション処理__を設定できる。
コンポーネント内ので`validate`メソッドを定義することで使用できる。

### 5. asyncData
__サーバーでSSR時に１回、クライアント側でページが読み込まれるたびに呼び出される__。
__APIからデータを取得し、ローカルデータに格納するような処理__を行う。
コンポーネント内で`asyncData`メソッドを定義して使用する。

### 6. beforeCreate
__Vueインスタンスが初期化されるときに呼び出される__フック。
注意点としてインスタンスは初期化されるが、`this`を使ったようなデータにはアクセスできない。

### 7. created
__Vueインスタンスが初期化され、データも初期化されたときに呼び出される__。
ここで、`beforeCreate`では使用できなかった、`this`を使用したデータへのアクセスが可能になる。
なお、`created`以降から`this`を使用してローカルのデータにアクセスできるようになる。

### 8. fetch
__サーバー側でSSR時に１回、クライアント側でページ遷移ごと呼び出される__。
__APIからデータを取得する処理__などを記載する。

##### 備考：　fetchとasyncDataの違い
| asyncData | fetch |
| --------- | ----- |
| thisは使用できない | thisを使用できる|
| pagesディレクトリ配下のファイルでのみ使用可 | すべてのコンポーネントファイルで使用可 |

### 9. beforeMount
__Vueインスタンスが実際のDOMにマウントされる前にクライアントでのみ呼び出される__フック。
ちなみに__マウント__とは、既存のDOMをVueインスタンスが生成するDOMで置き換えること。

### 10. mounted
__VueインスタンスがDOMにマウントされた後にクライアントで呼び出される__フック。
__DOMを操作する処理__を記載する。
DOMが生成された後なので、classやidを取得することができる。

## 参考文献
[Nuxt.js公式ドキュメント](https://nuxtjs.org/docs/concepts/nuxt-lifecycle)
[Vue.js公式ドキュメント](https://v3.ja.vuejs.org/api/options-lifecycle-hooks.html#created)
[Nuxt.jsのライフサイクルフックを丁寧に解説してみた。](https://takabeeblog.com/nuxtjs-lifecyclehook/)
適切なヒストグラムの描き方

別の記事で描かれているのはヒストグラムではなく plot.bar による棒グラフです。そこに示されているプログラムは必ず原点から描き始めるので，負の値を含むデータに対応しないとか，原点から大きく離れたデータ群の場合に左側に広大な空間ができるとかの欠点があります。

作者は bin の数を指定した場合に思うようjなヒストグラムにならないと思ったのでしょうが，以下のように bin を階級の区切り値ベクトルで定義すれば，思うような簡単にきれいなヒストグラムが書けます。

以下のプログラム例では，階級幅 classW を指定すれば，bins をベクトル指定するための min_x, max_x を計算します。min_x, max_x を別の計算式で求めるとか，plt.hist の他のパラメータの指定はお好きなように。

要するに，bin をベクトルで指定しましょうということです。例えば，ヒストグラムの特徴でもあるが，bin を不等間隔にすることもできます。

```Python
# data
data = [84, 63, 77, 65, 82, 70, 76, 69, 69, 72, 77, 71, 83, 69, 72, 75, 75, 64, 83, 75, 76, 76, 76, 70, 67, 73, 69, 76, 76, 75, 67]

# class width
classW = 5

min_x = int(min(data) / classW) * classW
max_x = int(max(data) / classW + 2) * classW

from matplotlib import pyplot as plt
plt.hist(data, bins=range(min_x, max_x, classW))
# plt.xticks(x, rotation=90)
plt.show()
```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/7e0fb008-8f99-183f-48c9-9fefaba9d559.png)
【AWS】S3 CLI  オブジェクトにタグをつける方法



#やりたかったこと
S3へオブジェクト（画像ファイル）をアップロードし、それとあわせてオブジェクトにタグを付与する。
※なお、今回は「S3RVER」というモックS3にアップする方法です。

#ハマった点
一生懸命、1コマンドでアップロードとタグつけをしようとしてましたが、どうも同時にできないようでした。


#解決できたコマンド
まずはオブジェクトをS3にアップロードし、アップロードしたオブジェクトにタグをつけるという２ステップが必要でした。

```sh
#アップロード 

$ aws --endpoint http://localhost:4568/ s3api put-object --bucket バケット名 --key アップ後のオブジェクトのパス --body アップするファイルのフルパス --content-type image/jpg --profile s3local
```

```sh
#タグ付与
 
$ aws --endpoint http://localhost:4568/ s3api put-object-tagging --bucket バケット名 --key アップ後のオブジェクトのパス --tagging "TagSet=[{Key=tagKey,Value=tagValue}]" --profile s3local 
```


###コマンドの違い
####put-object
オブジェクトをS3にアップするコマンド。--taggingオプションは使えるようだが、今回はタグを設定できなかった。
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html
####put-object-tagging
すでにS3にアップ済みのオブジェクトに対し、タグを付与するコマンド。--bodyオプションは使えない。
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-tagging.html
###各オプションの説明
####--bucket
バケットを指定します。バケットとは、S3配下の最上位の入れ物のことです。
####--key
アップ後のオブジェクトのフルパス。アップ後は設定したこの一意のkeyを指定することで、オブジェクトを指定、取得できます。
####--body
これからアップする（今回はローカル）ファイルのフルパスを指定します。
####--content-type
オブジェクトのタイプです。今回は画像なので、`image/jpg`としています。
####--profile
ユーザー名
####--tagging
付けたいタグをkey valueで指定します。タグ付け後は、keyを渡せば、valueが取得できるようになります。
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-tagging.html

 

##おまけ
###バケット配下にフォルダだけ作る方法
S3ではそもそも、フォルダという概念がないらしいです。--key の値を`/`で終わらせれば、フォルダがオブジェクトとして作られるようです。

```sh
$ aws --endpoint http://localhost:4568/ s3api put-object --bucket バケット名 --key folderName/ --profile s3local 
```

#参考にした記事
https://qiita.com/ajhsscs3/items/7615c01ed02bddd88606
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-tagging.html
https://dev.classmethod.jp/articles/amazon-s3-folders/
【Project Euler】Problem 36: 10進数と2進数で回文数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 36： 10進数と2進数で回文数

原文 [Problem 36: Double-base palindromes](https://projecteuler.net/problem=36)

**問題の要約：$N<10^6$で10進数と2進数両方で回文数になる$N$の合計を求めよ**

回文数のチェックは「[【Project Euler】Problem 4: 回文数になる積](https://qiita.com/masa0599/items/6d2cb8251213aa810101)」で作った関数**isPalind**を使って作ると以下のようになります。

```python
ans = 0
for n in range(1,10**6):
  if isPalind(str(n)) and isPalind(str(bin(n))[2:]):    
    ans += n

print(f"Answer is {ans}")
```
これでも問題ないですが、10進数の回文数を作って2進数の回文チェックを行えばループをN=1000まで減らせます。回文数生成関数**makePalinds**です。1つの数に対して偶数と奇数の2個の回文数を生成します。

```python 
def makePalinds(n):
  ns = str(n)
  return int(ns+ns[::-1]), n if len(ns) <= 1 else int(ns+ns[-2::-1])

for i in [1, 23, 450]:
  print(makePalind(i))
# (11, 1)
# (2332, 232)
# (450054, 45054)
```

これを使って書くと以下のようになります。同じ答えがでるはずです。

```python 
ans = 0
for i in range(1,1000):
  for dp in makePalinds(i):
    if isPalind(str(bin(dp))[2:] ):
      ans += dp

print(f"Answer is {ans}")
```
【Project Euler】Problem 4: 回文数になる積

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて解答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします

### 問題 4： 回文数になる積

原文 [Problem 4: Largest palindrome product](https://projecteuler.net/problem=4)

**問題の要約：2個の3桁の数を掛けて回文数(palindrome)になる数の最大値を求めよ**

まず回文数チェック関数**isPalind**を作ります。数字だけでなく文字列全般に使えるように入力は文字列です。文字列も逆順は$[::-1]$で得られます

```python
def isPalind(s):   # s: string
  return s==s[::-1]
```

後は3桁の数の積のすべての組み合わせをitertoolsのcombinations_with_replacementを使って生成し回文数チェックを行います

```python
import itertools
mpr = 0
for i, j in itertools.combinations_with_replacement(range(100,1000), 2):
  pr = i*j
  if isPalind(str(pr)) and pr > mpr: 
    mpr = pr
print(mpr)     
```
（開発環境：Google Colab）
Google Firebase プロジェクト作成

<!-- wp:paragraph -->
<p>Google Firebaseは Webアプリケーション向けのプラットフォームです。認証機能、メッセージングなど自身で実装するとたいへんな機能を提供してくれます。今回はソーシャル認証の機能をFirebaseのSDKを使って実装するために、Firebaseの準備をします。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>プロジェクトを作成します。プロジェクトを追加 を選択します。</p>
<!-- /wp:paragraph -->
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/7346b429-c056-a69d-6db4-4c2dbeb03bf0.png)


<!-- wp:paragraph -->
<p>プロジェクトに名前をつけます。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/8473ec1f-a5a8-c1a7-1157-4e282545270d.png)


<!-- wp:paragraph -->
<p>下記画面が表示されます。そのまま 続行ボタンを押します。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/24a00416-9487-5a57-9867-ce24087a8309.png)


<!-- wp:paragraph -->
<p>アナリティクスで利用するアカウントを作成、既存のアカウントを選択、プロジェクトを作成ボタンを押下します。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/5738d2e9-55ab-fa13-4125-76aeb445cf61.png)


<!-- wp:paragraph -->
<p>成功すると、プロジェクトの画面が表示されます。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/1a7c1579-ab6e-d4e8-694c-69858246b3f4.png)


<!-- wp:paragraph -->
<p>左メニューの最上位、プロジェクトの概要にある設定ボタンを押下、プロジェクトの設定メニューを選択します。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":271,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="https://www.mkhs.work/wordpress2/wp-content/uploads/2022/01/image-11.png" alt="" class="wp-image-271"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>プロジェクト名など今後必要になる情報になります。実装時に確認できるように表示方法を覚えときましょう。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/11213130-aa6e-6faf-6e25-97bd29a2dfe0.png)
【Django】フォームを無効化（読み取り専用）にする方法

# やりたいこと

・Formの無効化
・サーバーに送信された場合でも受け取った値を無視する



## ModelFormの場合

```python:
from django import forms
from .models import Sample

class SampleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.fields['hoge'].disabled = True
        super().__init__(*args, **kwargs)

    class Meta:
        model = Sample
```

## Formの場合

```python:
from django import forms

class SampleForm(forms.Form):
    hoge = forms.CharField(disabled=True)
```

もしくは

```python:
from django import forms

class SampleForm(forms.Form):
    hoge = forms.CharField(label='hoge')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['hoge'].disable = True
```

### 参考資料
公式サイトの内容を日本語訳しました。

```
disabledブール引数をTrueに設定すると、HTMLのdisable属性を使用してフォームフィールドが無効になり、ユーザーが編集できなくなります。
ユーザーがサーバーに送信されたフィールドの値を改ざんしたとしても、無視してフォームの初期データの値を優先します。
```

[Djangoドキュメント](https://docs.djangoproject.com/en/4.0/ref/forms/fields/#disabled)
vue.jsで「The template root requires exactly one element.」とエラーが表示された時は？

# 目的
vue.jsでとあるアプリを作ってみようとして下記のようなコードを書いていたところ、inputのところにエラーが表示されてしまった

```vuejs
<template>
  <div>
    <button v-on:click="getInfo">メンバー情報を取得</button>
    <div v-for="(member, key) in Members" :key="key">
      <hr>
      <p>{{ member.username }}</p>
      <p>{{ member.gender }}</p>
      <p>{{ member.introduction }}</p>
      <p>{{ member.job }}</p>
      <hr>
    </div>
  </div>
  <input type="text" placeholder="username" v-bind:value="username">
  <input type="text" placeholder="password" v-bind:value="password">
</template>
```

```terminal
vue/no-multiple-template-root
Component template should contain exactly one root element.
```

# 実施環境
### ハードウェア環境
| 項目 | 情報 |
|:-:|:-:|
| OS  |macOS Catalina(10.15.7)   |
|ハードウェア   |  MacBook Air (11-inch, Early 2015) |
|プロセッサ   | 1.6 GHz デュアルコアIntel Core i5|
|メモリ   |  4 GB 1600 MHz DDR3 |
|グラフィックス   |  intel HD Graphics 6000 1536 MB |
### ソフトウェア環境
| 項目 | 情報 |
|:-:|:-:|
| homebrew  | 3.3.8 |
| mysql | Ver 8.0.27 for macos10.15 on x86_64 |
| python  | 3.8.12 |
| django  | 3.1.2 |
| anaconda  | 4.10.1 |
| pip  | 21.2.4 |

# 原因究明

```terminal
vue/no-multiple-template-root
Component template should contain exactly one root element.
```
単純にこの文をよく読んでみると、
テンプレートコンポーネントにはroot要素を一つしか含めることができない。と言っている。

つまり

```vuejs
<template>
 <div>
 </div>
 <div>
 </div>
</template>
```
このようにtemplateの中にいくつもの要素を入れることができない。

# 解決
root要素は一つでなければいけないと言うことであるため、

```vuejs
<template>
 <div>
 </div>
</template>
```
このようにtemplateの下のdivを一つにすれば良い。
ちなみに割とtemplateの下にdivタグを入れるのは決まり事のようなものらしい。

```vuejs
<template>
  <div>
    <button v-on:click="getInfo">メンバー情報を取得</button>
    <div v-for="(member, key) in Members" :key="key">
      <hr>
      <p>{{ member.username }}</p>
      <p>{{ member.gender }}</p>
      <p>{{ member.introduction }}</p>
      <p>{{ member.job }}</p>
      <hr>
    </div>
    <input type="text" placeholder="username" v-bind:value="username">
    <input type="text" placeholder="password" v-bind:value="password">
  </div>
</template>

```

# 参考
[Nuxt.js(Vue.js)で良くある【Component template should contain exactly one root element. 】の対処法](https://qiita.com/TK-C/items/ac05dfbd1c093b3c55e1)
条件分岐の記述について【その１】

###__複数の条件を分岐させる記述__

__条件１__
ログインユーザーか未ログインユーザーか？

__条件２__
_商品出品者とユーザーが一致するのか？_

__条件３__
_商品が有れば購入ボタンが有る、商品が無ければ購入ボタンが無い_

```hello.cpp
<% if user_signed_in? %> //←ログインしているかを判定
  <%if current_user.id == @item.user_id %>　//←商品出品者とユーザーが一致するかを判定
    <%= link_to "商品の編集", edit_item_path(@item.id), method: :get, class: "item-red-btn" %>
    <p class="or-text">or</p>
    <%= link_to "削除", item_path(@item.id), method: :delete, class:"item-destroy" %>
  <% elsif @item.purchase_management.blank? %> //←商品モデルの中の購入履歴が空かを判定
    <%= link_to "購入画面に進む", item_orders_path(@item.id) ,class:"item-red-btn"%>
  <% end %>
<% end %>
```

##学んだポイント

__条件文もアソシエーションとの関係を前提に記述する__
今回苦労した実装は【条件３】を正常に挙動させることでした。
この記述の辿り着くまでに　@order.purchase_management_id = nil や他の記述で試すもエラーが起こり、悪戦苦闘しておりました。アソシエーションとの関連を無視してどのような条件で記述すればいいのかを気づけていなかったのが、時間がかかった要因かと思います。

【item】 has_one 【purchase_management】
このアソシエーションを前提に記述することを気づけていれば、、、

つまり、itemがpurchase_managementを持っているかどうか？
purchase_managementは購入履歴のモデルです。

itemがpurchase_managementを持っていれば、売り切れ。
itemがpurchase_managementを持っていなければ在庫あり。
ということになります。

あとは、その真偽をどのように判定するか、、、

今回は【blank?】を用いました。
blank?メソッドは、オブジェクトが空白の場合はtrueを返し、オブジェクトが空白ではない場合はfalseを返すメソッドです。

この反対のメソッドは【present?】メソッドです。
for文、for..in、for..of文はどれを使うの？

# 配列(反復可能オブジェクト)のループ
for文、またはfor..of文を使います。
添字が必要な場合はfor文を使います。

# オブジェクトのループ
Object.keys、Object.values、Object.entriesを使い、配列や反復可能オブジェクトに変換した後、for文、またはfor..of文を使います。
for...in文を使う場合は、列挙可能性に注意する必要があります。
ペットが映った瞬間にだけシャッターを切りたい　そういうフレームワークをAppleが出している

#デジカメに積んでそうな機能をiOSで実現する

犬や猫がスマホのカメラに映った瞬間にだけシャッターを切るカメラを作る方法です。

<img src="https://user-images.githubusercontent.com/23278992/147860769-c0db0553-ad45-433c-96e3-36fbef5ff6be.gif">

#動物を自動で検知できるか？
ペットは動く。
フレームにペットが映ったら自動的にシャッターを切るようにしておけば、可愛い瞬間を逃さずに写真にできる。
そのためには動物を検知する必要があるが、そんなことはスマホでできるのか？

#Appleが動物を検知するフレームワーク出している
機械学習で動物を自動検知するiOSフレームワークをアップルが出していて、それが使える。

#Visionを使う

**VNRecognizeAnimalsRequest** という動物を検出するリクエストをつかえば、犬または猫が映っているかがわかる。

```swift
let animalRequest = VNRecognizeAnimalsRequest()
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientation, options: [:])
do {
    try imageRequestHandler.perform([animalRequest])
} catch {
    print(error)
}
guard let observation = animalRequest.results?.first as? VNRecognizedObjectObservation else { return }
// 動物検知結果があれば、シャッターを切る
capturePhoto()
```

![Jan-02-2022 06-41-41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b5fcb84f-a300-3af9-2fd2-fd700fd5238a.gif)


動物の位置ボックスもとれる。

写真切り取りライブラリの[SemanticImage](https://github.com/john-rocky/SemanticImage)では、このボックスを使って猫の写真を切り取っている。

https://github.com/john-rocky/SemanticImage

![スクリーンショット 2022-01-02 6.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6b1ef3bc-bf50-265c-e26f-d697aade1772.png)

#ペット見守りカメラも作れる

リクエストはビデオフレームでも実行できるので、留守番をしているペットが映っているかどうかなど、便利な機能が色々作れそうです。

自動ペット撮影カメラの全体のコードです↓

https://github.com/john-rocky/AutoCatDogCam/tree/main

AppStoreにも出てます。

https://apps.apple.com/gb/app/pet-camera-automatic/id1498145440

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

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Swift】Dependency Injectionに慣れよう

#はじめに
Dependency Injection(以下DI)はテストコードを書きやすくするために用いられることが多い手法です。
DIは二種類あるので、一つ一つ見ていきましょう。

#コンストラクタインジェクション
コンストラインジェクションはイニシャライズするときにインスタンスを注入します。
①プロトコルを用意する
②用意したプロトコルに準拠するクラスを用意する
③イニシャライズするときに準拠したクラスを注入する

```swift
// ①プロトコルを用意する
protocol UserRepositoryProtocol {
    func login()
}

// ②用意したプロトコルに準拠するクラスを用意する
// 本番用クラス
class UserRepository: UserRepositoryProtocol {
    func login() {
        print("本番")
    }
}

// ②用意したプロトコルに準拠するクラスを用意する
// 偽物クラス
class UserRepository偽物: UserRepositoryProtocol {
    func login() {
        print("偽物")
    }
}

class UserUseCase {
    private let repository: UserRepositoryProtocol
    init(repository: UserRepositoryProtocol) {
        self.repository = repository
    }
    func login() {
        repository.login()
    }
}

let repositroy = UserRepository()
// let repository偽物 = UserRepository偽物()
// ③イニシャライズするときに準拠したクラスを注入する
let userUseCase = UserUseCase(repository: repositroy)
userUseCase.login() // 本番

```

具体的なRepositoryクラス(UserRepositoryやUserRepository偽物)にUserUseCaseが依存するのではなく、インターフェース(プロトコル)に依存し、具体的なクラスをUserUseCaseをイニシャライズするときに注入します。これにより、本番用クラス(UserRepository)と偽物クラス(UserRepository偽物)をインスタンスする箇所で簡単に切り替えられるのでテストコードが書きやすくなります。


#セッターインジェクション
セッターインジェクションはイニシャライズした後にコンポーネントを注入します。

```swift
protocol ViewModelProtocol {
    func printName()
}
class ViewModel: ViewModelProtocol {
    func printName() {
        print("REON")
    }
}
class ViewController: UIViewController {
    private var viewModel: ViewModelProtocol?
    func inject(viewModel: ViewModelProtocol) {
        self.viewModel = viewModel
    }
    func printName() {
        viewModel?.printName()
    }
}
let vc = UIStoryboard(name: "VC", bundle: nil)
    .instantiateInitialViewController() as! ViewController
let viewModel = ViewModel()
vc.inject(viewModel: viewModel) // 注入
vc.printName() // REON
```

UIViewControllerをUIStoryboardから初期化する場合、コンストラクタインジェクションを使えないので、セッターインジェクションを用います。
しかし、セッターインジェクションは注入し忘れる可能性があるので、コンストラクタインジェクションを基本的に使えば良いでしょう。


#おわりに
DIはよく使うのでこれを機にマスターしておきましょう。
Heroku の dyno type を API で変更する方法（Ruby）


## 背景
Heroku の dyno type を柔軟に変更したいケースがあるかと思いますが、Platform API を利用すれば簡単に実現する事が出来ました。
重めの処理が走る時だけ dyno を Performance-M に変更し、処理が終わったら Standard 1X に戻すなどの操作が可能です。

## 実装

```:Gem
$ gem install platform-api
```

```ruby
require 'platform-api'

heroku = PlatformAPI.connect_oauth("#{platform_api_token}")
heroku.formation.update("#{app_id_or_app_name}", "#{formation_id_or_formation_type}", {"size" => "Standard-1X"})
```

## 参照
- [Platform API Reference | Heroku Dev Center](https://devcenter.heroku.com/articles/platform-api-reference)
- [Platform API (A real world example) | GitHub](https://github.com/heroku/platform-api#a-real-world-example)
- [Class: PlatformAPI::Formation #update | Documentation for platform-api (0.6.0)](https://heroku.github.io/platform-api/PlatformAPI/Formation.html#update-instance_method)
Udemyの動画再生停止時における再生画面中央に配置される再生ボタンを非常時にする chromeの拡張機能の紹介


# 拡張機能紹介
皆さん,udemyは使用されていますか?
私はプログラム学習にudemyを使用しています.
udemyには様々な分野の講座があり非常に便利なのですが，学習するにあたり一つだけ, 非常に不便に思うことがありました．
**それは，以下のように動画の再生を停止したときに, 再生画面中央に再生ボタンが配置されることです！**
![play_video_crrenn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550504/7842bab8-a6dd-d6d4-c1ab-c7df96ca8a85.png)

これでは画面を注視するために動画を停止したのに，画面が返って見辛いくなってしまいます．

そこで，再生停止中の中央に配置される再生ボタンを非表示にするchromeの拡張機能を作成しました．
ぜひご活用ください．

https://chrome.google.com/webstore/detail/hide-play-button-for-udem/ahmbcnebonghgfhcmdcgmoinffabbckd

#ソースコード
https://github.com/elgonic/udemy-play-button-hiden

#作成に当たり参考にしたサイト
https://qiita.com/RyBB/items/32b2a7b879f21b3edefc

https://qiita.com/3mc/items/c3c580ca5de4a2d3990d
Kindle for PC(Windows)を意地でもキーボード操作する

#0. はじめに

Kindle for PC(Windows)を意地でもキーボード操作する人向けです。
バージョン1.34.0(63047)で確認しています。
表紙一覧で確認していて、リスト表示は試していません。

#1. 表紙一覧にフォーカスがある場合

↑↓←→で選択本の移動
PageUp、PageDownで一画面移動
Homeで左上、Endで右下へ移動
EnterまたはCtrl+Oで、ダウンロード開始または本を開く
アプリケーションキーで右クリックメニューを開く
Ctrl+Fで検索ボックスへフォーカス移動
Tabで左ペインへフォーカス移動(数秒～十数秒かかる。Tab×4以上だと早そう)

#2. 本を開いている場合

F11でフルスクリーン、F11またはEscでウィンドウ表示に戻る。
←→でページ移動
Ctrl+Gで任意のページに移動。1、Enterで先頭。最大ページ以上の数字、Enterで最後。Escでキャンセル。
Ctrl+Wで本を閉じる

#3. 検索ボックスにフォーカスがある場合

文字キー入力で絞り込み、Ctrl+A、Delでクリア(HomeやEnd等も使用可能)
Tabで表紙一覧に移動

#4. 左ペインにフォーカスがある場合

↑↓で「すべて」「ダウンロード済み」「PDF」の移動
Ctrl+Fで検索ボックスにフォーカス移動(表紙一覧に移動したい場合には、Ctrl+F、Tab)

#5. 表紙一覧、検索ボックス、左ペイン共通

F5で再読み込み
Ctrl+Qで終了
ヒストグラムを作る（python）

# ヒストグラムをつくるプログラム
タイトルのままです。`matplotlib`標準のヒストグラム（参考：[[Python]Matplotlibでヒストグラムを描画する方法](https://qiita.com/supersaiakujin/items/be4a78809e7278c065e6) ）が妙に使いにくいと感じたため、作りました。

入力はリスト型のデータ系列（当たり前だがfloat型かint型）と階級幅、出力がヒストグラムの縦軸（各度数）と横軸（各階級幅の上限）。
以下、ソースコード。
データはアジア各国の平均寿命（総務統計局「世界の統計2020」より）。参考サイトは、http://www.stat.go.jp/naruhodo/4_graph/shokyu/histogram.html まで。

```ruby:makeHistgram.py
def makeHistgram(data:list, classW:float)->list:
    maxValue = max(data)
    histgram = [0] * (int(maxValue / classW)+1)
    for h in data:
        h_class = int(h / classW)
        histgram[h_class] += 1
    x = [(e)*classW for e in range(len(histgram))]
    y = histgram
    return x, y

# data
data = [84, 63, 77, 65, 82, 70, 76, 69, 69, 72, 77, 71, 83, 69, 72, 75, 75, 64, 83, 75, 76, 76, 76, 70, 67, 73, 69, 76, 76, 75, 67]
# class width
classW = 5

# make histgram
x,y = makeHistgram(data, classW)
print(x,y)

# make graph
from matplotlib import pyplot as plt
plt.bar(x,y,classW-1)
plt.xticks(x, rotation=90)
plt.show()
```

出力結果は

```ruby:result
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 6, 12, 4]
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/bac953da-8a0e-fe0a-c8c2-b0c5a0ac94b3.png)
Express Tour #3 Basic routing

ルーティング(routing)とは、クライアントのリクエストに応答する方法として、URI(またはパス)と特定のHTTPリクエストメソッド(GET,POSTなど)を決定することです。
各ルートには1つ以上のハンドラー関数があり、ルートが一致したときに実行されます。

ルートの定義方法は次のような構造になります。

```javascript
app.METHOD(PATH, HANDLER)
```

各部分の意味は次の通りです。

* appは、`express`のインスタンスです。
* `METHOD`は、HTTPリクエストメソッドです。
* `PATH`は、サーバー上のパスです。
* `HANDLER`は、ルートが一致したときに実行される関数です。

以下、単純なルート定義の例

ホームページで`GET`メソッドに対して`Hello World!`と応答する。

```javascript
app.get('/', function (req, res) {
  res.send('Hello World!')
});
```

ホームページで`POST`メソッドに対して応答する。

```javascript
app.get('/', function (req, res) {
  res.send('Got a POST request')
});
```

`/user`ルートに対する`PUT`メソッドに対して応答する。

```javascript
app.get('/user', function (req, res) {
  res.send('Got a PUT request at /user')
});
```

`/user`ルートに対する`DELETE`メソッドに対して応答する。

```javascript
app.get('/user', function (req, res) {
  res.send('Got a DELETE request at /user')
});
```

## 参考
http://expressjs.com/en/starter/basic-routing.html
実行形式ファイルをPythonで作ってみた。

#掲題の通り。
ちゃ○るずに課金しないで使い続けたいという熱い思い、、、
29分に1回再起動するようにしたい、、、
色々やってみた。

##準備
Pythonの開発環境として、オールインワンパッケージのanacondaをインストール。

##実行形式ファイルのコーディング・作成
```python
import subprocess

for i in range(10):
    subprocess.run('open -a cha**es;sleep 1740', shell=True)
    subprocess.run('osascript -e \'quit app "cha**es"\';open -a cha**es', shell=True)

print("お疲れ〜")

```
もちろん、これをそのまま実行してもちゃんと29分に一回再起動してくれます。
ちゃんと実行形式にしてMac起動時に毎回起動するようにします。

pyinstallerというフレームワークがいい感じに実行形式ファイルにしてくれるみたいです。（SUGEE…）

```console
pip install pyinstaller
$ pyinstaller /Users/ユーザー名/Desktop/.py --onefile
```
これで実行形式を作ります。
あとはスタートアップ的なのに打ち込むだけ。

#まとめ
課金した方が色々と良い。
通信保存してくれるならまあまあ実用性はあると思う。
（あと、シェルスクリプト使えってな、、、）

#参考資料
https://note.com/norimac7/n/n55c154a58290

https://techacademy.jp/magazine/46562

https://tyottozutu.com/mac%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92python%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/

https://weekly.ascii.jp/elem/000/001/810/1810136/
【React】React Hooksについて

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

##React 入門

###React Hooksとは
以前はクラスコンポーネントでしか使えなかったstateやライフサイクルを関数コンポーネントでも使える機能です。
フックを使うことでよりシンプルに記述をすることができるようになりました。

主なフックは以下の通りです。

`useState()`
`useEffect()`

### useStateの使い方
関数コンポーネントでローカルstateを使用することができます。

```Sample.js
// useStateをインポート
import React, { useState } from 'react';

// 宣言
const [state変数名, state更新関数名] = useState(state初期値)

// stateの呼び出し
{ state変数名 }

```

### useEffectの使い方
ライフサイクルメソッドの代替として、関数コンポーネントで利用できます。
具体的には、以下のメソッドの代替として使用できます。
`componentDidMout()`
`componentDidUpdate()`
`componentWillUnmount()`

```Sample.js
// レンダー毎に実行する場合
useEffect(() => {
  // コンポーネントがレンダーされる時（再レンダー含む）に実行
  return () => {
    // コンポーネントが破棄される時に実行
  }
})

// マウント時のみ実行する場合
useEffect(() => {
  // コンポーネントがレンダーされる時に実行
}, [])

// 特定のstateやpropsが更新された時に実行する場合
useEffect(() => {
  // コンポーネントがレンダーされる時に実行される。
  return () => {
    // コンポーネントが破棄される時に実行される。
  }
}, [変更されるstateやprops])


// マウント時とアンマウント時のみ実行する場合
useEffect(() => {
  // コンポーネントがレンダーされる時に実行される。
  return () => {
    // コンポーネントが破棄される時に実行される。
  }
}, [])


```


## まとめ

- hookはstateやライフサイクルを関数コンポーネントでも使えるようになる機能
- useState()はstateの代替
- useEffect()はライフサイクルメソッドの代替
Linux xargs コマンド -I オプション（i の大文字）についてのメモ

# 初めに

`xargs -I R` について、いつも忘れるのでメモとして残しておきます。

# 使い方

```
-I R   same as --replace=R (R must be specified)
```

```
$ echo 'John' | xargs -I name echo 'hello! name. You are name!'
hello! John. You are John!
```

# 参考記事

https://www.ibm.com/docs/ja/aix/7.2?topic=x-xargs-command
SSL証明書の発行者の情報（メモ）

SSL証明書について勉強中。

発行者の項目で表示される「CN」や「OU」などの意味が気になったので調べてみた。

**CN**：「Common Name」のこと

**OU**：「Organization Unit」のこと

**O**：「Organization」のこと

**L**：「Locality」のこと

**S/ST**：「State or Province」のこと

**C**：「Country」のこと
応用情報を知識ゼロから受けるぽんこつのメモ

1から勉強を始めている文系新卒エンジニア見習いが、
応用情報技術者試験取得を目指してこれからアウトプットとして利用していきます。

## 7の法則(the Rule of Seven)
同じ結果が7回連続で出てきた場合になんらかの原因があるとみなす品質管理の考え方。
## プリエンプティブ方式
OSがCPUやシステム資源を管理し、CPU使用時間や優先度などによりタスクを実行状態や実行可能状態に切り替える方式。
⇔ノンプリエンティブ方式
## システムバス
CPUと構成部品を管理するチップセットを繋ぐバス(伝送路)。
## ポリモーフィズム
オブジェクトへの操作呼び出しが、呼び出し側でなく受け手側の特性で決まる特性。同じメッセージを送っても受け手によって行われる操作が異なる様子。
## ヒープソート
未整列の最小値を取り出して整列済の部分に移す。この操作を繰り返して，未整列の部分を縮めていくこと。
## 逆ポーランド表記法
演算子を被演算子の右側に記述する表記法のこと。
例）a＋b×c　=>　abc×＋
## データのオーナに相当する部門
データに関して監督責任をもつ部門のこと。

## 計算問題で覚えるべき公式や前提
・1バイト＝8ビット
・線形探索法：n／2m＋m／2

## SQL
#### ・create view productlist as select id, name from product;
あるテーブルをもとにして、データを取得する（読み取り専用）ために作成するもの
SQLのHAVING句で全称量化（Vol.1）

## はじめに

馴染みのない単語（全称量化）だと思うので、まずは用語の定義から確認しましょう。

### 全称量化と存在量化

SQLを支える基礎理論には、集合論と述語理論（predicate logic）があります。

SQLでいう述語とは、戻り値が真理値になる関数のことを言うそうです。

述語論理には、全称量化と存在量化が存在します。

それぞれ、以下のような意味です。

- 全称量化は「すべてのxが条件Pを満たす」
    - 例：すべてのサメは肉食である
- 存在量化は「条件Pを満たすxが(少なくとも1つ)存在する」
    - 例：魚類の中には肉食に分類されるものも存在する

SQLは、全称量化を実装していないそうです。

存在量化の表現を、ド・モルガンの法則を使って、全称量化表現ができるからです。それが `NOT EXISTS` です。 

- 全称量化は
    - 「すべてのxが条件Pを満たす」 = 「条件Pを満たさないxが 存在しない」（これは`NOT EXISTS`で表現できる）
        - 二重否定で分かりにくいですが、結構使えます。
- 存在量化
    - 「条件Pを満たすxが(少なくとも1つ)存在する」 = 「すべてのxが条件Pを満たさない　わけではない」

### 今回の例題にて用いるデータ

実行結果はこちらで確認できます。

https://www.db-fiddle.com/

#### 用いるデータ

```sql
 CREATE TABLE members (
   id INT NOT NULL PRIMARY KEY auto_increment,
   class TEXT,
   status TEXT
);

INSERT INTO members VALUES
   (1,  'A', 'ready'),
   (2,  'A', 'running'),
   (3,  'A', 'ready'),
   (4,  'B', 'running'),
   (5,  'B', 'dormant'),
   (6,  'C', 'ready'),
   (7,  'C', 'ready'),
   (8,  'C', 'ready'),
   (9,  'D', 'ready'),
   (10, 'E', 'running'),
   (11, 'E', 'dormant'),
   (12, 'E', 'ready');
```

| id  | class | status  |
| --- | ----- | ------- |
| 1   | A     | ready   |
| 2   | A     | running |
| 3   | A     | ready   |
| 4   | B     | running |
| 5   | B     | dormant |
| 6   | C     | ready   |
| 7   | C     | ready   |
| 8   | C     | ready   |
| 9   | D     | ready   |
| 10  | E     | running |
| 11  | E     | dormant |
| 12  | E     | ready   |


このデータを用いた例題を解いていきましょう

#### 今回の例題

`members`テーブルには何かしらの行動が開始できるかどうかのステータスがデータ化されています。

この時「クラスの全メンバーが行動可能な状態（`ready`）　であることがわかるクエリ」を書いてください。

##### CASE1

まず、全称量化で表現できますよね。日本語にすると

「待機中ではないメンバーが1人もいない」

これをクエリで表現すると

```sql
-- 全称文を述語で表現
SELECT class, id
FROM members M1
WHERE NOT EXISTS (
	SELECT *
	FROM members M2
	WHERE M1.class = M2.class AND status <> 'ready'
)
```

結果は

| class | id  |
| ----- | --- |
| C     | 6   |
| C     | 7   |
| C     | 8   |
| D     | 9   |

##### CASE2

HAVING句を使った書き方もできます。

日本語にすると「クラスのすべてのメンバーが行動可能な状態（`ready`）　である」

```sql
-- 全称文を集合で表現
SELECT class
FROM members
GROUP BY class
HAVING COUNT(*) = SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END)
```

結果は

| class |
| ----- |
| C     |
| D     |

欲しい集合はCとDです。

この2つが持っていて他のクラスが持っていないものは、**readyなメンバー数（行数）とそのクラスの集合全体のメンバー数（行数）が一致している**ということです。

以下のような4列目のフラグを持たせて、各クラスの全員が1の集合だけ抽出しているイメージです。

| id  | class | status  | flag |
| --- | ----- | ------- | ---- |
| 1   | A     | ready   | 1    |
| 2   | A     | running | 0    |
| 3   | A     | ready   | 1    |
| 4   | B     | running | 0    |
| 5   | B     | dormant | 0    |
| 6   | C     | ready   | 1    |
| 7   | C     | ready   | 1    |
| 8   | C     | ready   | 1    |
| 9   | D     | ready   | 1    |
| 10  | E     | running | 0    |
| 11  | E     | dormant | 0    |
| 12  | E     | ready   | 1    |


ちなみに、クエリは以下

```sql
SELECT
  *,
  CASE WHEN status = 'ready' THEN 1 ELSE 0 END AS flag
FROM members
```

これをCASE式で表現しています。

本日は以上です。

次回はCASE 3を見ていきましょう！

## 参照

https://www.amazon.co.jp/dp/4798157821/

120 - 122p

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103