OmniAICreator/Qiita-1.07M huggingface dataset:
Mackerel-agent-linuxプラグインを使用する

# はじめに
mackerel-agent.confには色々なプラグインが用意されているので
どんなもんか試してみる。

# もともとの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/89e22870-5d69-eb9a-6cbd-79294dad7e6a.png)

見た目がどう変わるのか、参考のために残しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/2de9b5f3-66b7-16bf-8047-c717cd7811ce.png)

# mackerel-plugin-linux
★やり方

```
vi /etc/mackerel-agent/mackerel-agent.conf
```

ってやってから↓↓のようにコメントをはずすだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e130ffd5-a558-4578-4470-0b55579f5c4a.png)

★反映のやり方

```
mackerel-agent configtest         # コンフィグテスト
systemctl restart mackerel-agent  # mackerel-agent再起動
```

結果がコチラ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/0e434d10-ffcc-d80a-66ea-9b7728ec20d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e79292b7-f8b6-9bbc-39bc-82c45756434b.png)

# MackerelのHost画面での反映具合を確認する
カスタムメトリックって箇所が現れてグラフが増えた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e29ae988-9813-8685-f619-40f92f1b7a09.png)


# ちなみにmackerelのHOSTS画面から見なくてもOK
今回手順を試すにあたって参考にした

https://soudai.hatenablog.com/entry/mackerel-plugin-linux

によると、プロンプトで直接コマンド入力するだけでも結果が見える。
基本的にはmackerel-agent.confに記載されていたコマンドを実行するだけでＯＫ。

```
mackerel-plugin-linux
```

実行結果がコチラ。Mackerelの画面にでてこないときは、このやり方でちゃんと数字が出るかを確認するとかに使えそうだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f0dc6e4b-aa95-4007-6c43-e00217f1457f.png)
2021/07/12開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[AWSの基礎を学ぼう 第四十九回](https://awsbasics.connpass.com/event/216364/)|[AWS エバンジェリストシリーズ　AWSの基礎を学ぼう](https://awsbasics.connpass.com/)|395||
|:two:|[【AutoML】自動化された機械学習を学ぼう！ Section4【 Live!人工知能 #57】](https://liveai.connpass.com/event/216426/)|[Live!人工知能](https://liveai.connpass.com/)|131||
|:three:|[「量子コンピュータによる機械学習」読書会 20](https://qmlclub.connpass.com/event/218519/)|[QML Club](https://qmlclub.connpass.com/)|22||
|:four:|[アプリのUI/UXデザイン業務を体験しよう【オンライン開催】](https://codebasetokyo.connpass.com/event/217321/)|[CODE BASE TOKYO](https://codebasetokyo.connpass.com/)|14||
|:five:|[PyCon JP 2021 スタッフ全体mtg (7/12)](https://pyconjp-staff.connpass.com/event/218816/)|[PyCon JP スタッフ](https://pyconjp-staff.connpass.com/)|10||
深層学習。DeepMind(Google)のPerceiverのココが気になる。

# 概要
以下のDeepMind(Google)のPerceiver、

Jaegle, A., Gimeno, F., Brock, A., Zisserman, A., Vinyals, O., & Carreira, J. (2021). Perceiver: General perception with iterative attention. arXiv preprint arXiv:2103.03206.

Perceiver: General Perception with Iterative Attention
https://arxiv.org/abs/2103.03206

に関して、気になることをメモする。

# 気になること

## Discussionの記載内容
下記の引用において、『モダリティ固有の事前知識の量を減らしています』とあるが、無理に減らすとか、減ることを常に良いことだと考えると、、、、可笑しなことになる気がする。
（音と映像と言語と、違っていいじゃない。映像と言語の共通性は、おのずと、全体からすると、狭い範囲になることのほうが正しい？と思う。）


Discussionの記載内容は、引用すると以下。
>私たちは、10万以上の入力に対応するTransformerベースのモデルであるPerceiverを発表しました。これにより、入力に関する仮定が少なく、任意のセンサー構成を扱うことができ、あらゆるレベルの情報の融合を可能にする一般的な知覚アーキテクチャのための新たな道が開かれます。大きな柔軟性には大きなオーバーフィッティングがつきものですが、私たちの設計上の決定の多くはこの問題を軽減するために行われました。将来的には、非常に大規模なデータを用いて画像分類モデルを事前に学習させたいと考えています（Dosovitskiy et al.2021）。大規模なAudioSetデータセットでは、170万件の例があり、Perceiverは、オーディオ、ビデオ、およびその両方の組み合わせにおいて、強力な最新のエントリーと競合する結果を得ました。ImageNetでは、このモデルはResNet-50やViTと同等の性能を示しました。本論文で検討したすべての異なるモダリティとその組み合わせでこれらのモデルを比較すると、全体的にPerceiverが最も優れています。モデルに含まれるモダリティ固有の事前知識の量を減らしていますが、モダリティ固有の補強と位置のエンコーディングは引き続き採用しています。エンド・ツー・エンドのモダリティにとらわれない学習は、依然として興味深い研究の方向性です。

## github他での実装サンプルの公開

具体的なトレーニングや、推論が実行できるような、実装サンプル等が、githubとかに、広く出回るようになれば、盛り上がる気がする！！！

## 図３の説明

この説明は、さすがに、**おかしい**と思う。
(↑↑↑　誰か、賛同して欲しいな。。。:tada:）

フーリエしているだけなので、元の画が残っているだけだとおもう。
<font color="orange">**犬の左前脚とか、全然、追えてないし。**</font>


以下、引用。
>視覚化されたアテンションマップは、入力画像に重ねて表示されているわけではありません。見かけ上の画像構造は、アテンションマップ自体に存在しています（最初のモジュールのアテンションマップのいくつかには、犬がはっきりと見えています）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/797ac437-9c24-54c3-bd24-84ab0787658b.png)

# まとめ
特になし。

# 関連記事（本人）

[深層学習。DeepMind(Google)のPerceiver(2021.06.23)は面白そう。ただ、もう難しいですね。](https://qiita.com/enoughspacefor/items/d9782a6efba3f0fb2160)

[DeepMind(Google)のPerceiverの記事でわかりやすい思った記事N選　(まだ、N＝2）](https://qiita.com/enoughspacefor/items/866d579b743400ed3da6)
IceVisionを手元で使いたい

#これは何
2021年で**最もイケている物体検出フレームワーク**と言っても過言ではない[IceVision](https://airctic.com/0.8.0/)を手元環境で実行するためのメモ

#IceVisionとは
Mobility Technologyさんによる[解説記事](https://lab.mo-t.com/blog/icevision-introduction)に詳しい。(2021/7/14時点で日本語文献がこれ以外に存在しない？)
PyTorch-Lightning/fastaiを用いた物体検出フレームワークであり、複雑怪奇なgithubを読んでも実装がよくわからない物体検出手法を同一のmoduleで扱えるようにしよう、という設計思想です。
MMDetectionとDetectron2やPytorchのpretrainedモデルに比べ、[最先端のモデル](https://airctic.com/0.8.0/models/)が実装される点にメリットがあります。(現状はMMDetectionの実装+Torchvisionの実装+EfficientDet+YOLOv5があるようです。また、timmも近々追加されるようです。)
これがあれば最新の物体検出手法が一気に試せる！

#動機
[公式のinstallation](https://airctic.com/0.8.0/install/)が一般人である私には難しかった。
Google Colab上で長時間の学習を行うのは避けたかった。

#環境
Windowsでのインストールがサポートされていないようなので、わざとWindowsを使ってインストールを行う。

Ryzen Threadripper 3970X
Nvidia RTX A6000
RAM 256 GB, Storage NVMe SSD 2 TB
**Windows 11 pro** (21H2, build:22000.65)

#手順
まず、今回はカスタムデータセットでの学習を行うことを最終目標としているため、[CUDA on WSL2](https://qiita.com/ksasaki/items/ee864abd74f95fea1efa)を使える状態にしておく。多分今使えるdeveloper modeはWindows 11のみになっている。WSLとしてUbuntu20.04を利用。

まずは[conda](https://qiita.com/knkm3001/items/37614597fcd20c89d658)で環境を作る。(Windows11上のWSL-CUDA上のdockerを扱いたくなかったため。)

```shell
conda -V
#conda 4.10.1
conda create -n icevision-dev python=3.7
conda activate icevision-dev
```

なんかwsl上のcondaは動きが遅い気がします。色々大変なんでしょうか。
pycocotoolsは執筆時になぜかpipで入れられなかったため、condaで入れました。

```shell
conda install -c conda-forge -y pycocotools
```

続けて、環境の依存関係をあまり考えたくなかったので[google colab用のシェルスクリプト](https://github.com/airctic/icevision/blob/master/install_colab.sh)を流用します。ここでPytorchと一緒にcudatoolkitを指定して入れるから、WSL立てたあとに入れなくてもいいっぽい？
GPUがAmpereなのでcu111を使っていますが、執筆時点でのcolab用シェルスクリプトではcu102が使われていました。

```shell
pip install PyYAML
pip install datascience
pip install tensorflow==2.4.0
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 torchtext==0.9.1 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name())"
# True
# Nvidia RTX A6000
python -c "import torch;print(torch.max(torch.rand((30,30),device='cuda')))"
# tensor(0.9998, device='cuda:0')みたいな感じ
pip install fastai==2.3.1
pip install icevision[all] 
pip install icedata
pip install yolov5-icevision
pip install mmcv-full==1.3.7 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html
pip install mmdet==2.13.0
```

これで環境ができるはず。

#追記
現状のWindows11では、なぜかjupyter上でのimportができない(そのほかではできる)ようです。

[標準データセットでのfine-tuning](https://qiita.com/Ikwus/items/7f7558745e5e7221c7b6)に続く。
claspの開発でGASの補完が効かなくなった話

# きっかけ
claspを使ってVSCodeでGASの開発を行っていましたが、気づくと補完が効かなくなっていることに気づきました。さすがに不便だったので解決しようといろいろなところを調べたので、載せます。ご参考までに。

# 解決方法
claspのコマンドでいつも通りローカルにプロジェクトをクローンした後、以下のことを行いました。

## 型定義ファイルのインストール
プロジェクトのあるフォルダまで移動し、次のコマンドを実行。

```
npm init --y
npm install @types/google-apps-script --save-dev
```

これでフォルダの中に型定義のファイルがインストールできました。

## つなげる
なぜかこれだけだと認識しなかったので、同じフォルダの中に「jsconfig.json」を作成し、中身を以下のようにした。

```{jsconfig.json}
{
    "compilerOptions": {
      "target": "ES6"
    }
}
```

これで、さっきインストールした型定義ファイルたちを読み込み、補完が効き始めると思います。

# 参考にしたサイト
以下のwebサイトを参考にさせていただきました。


- https://qiita.com/ubatanosuke/items/6952f663963985129bc0
- https://qiita.com/ume3003/items/31fde6b5c9f2c682c685
- https://gas.excelspeedup.com/claspautocomplete/
隠しファイルの表示方法

<h1>疑問</h1>
元々pythonはバージョン3.6を使っていて、追加でバージョン3.8をインストールしたが、バージョン3.6しかエクスプローラーに存在していなかった。しかしエクスプローラーの検索機能で検索するとバージョン3.6と同じところにバージョン3.8も存在していることが分かった。

今回は、エクスプローラの検索やコマンドプロンプトのディレクトリの移動ではファイルの存在が確認できるが、エクスプローラーにはファイルが存在していなかったのはなぜか解説する。



<h2>解決方法</h2>

初めはこのような状態でPython36しかフォルダが存在していない。
![2021-07-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1760582/573f9441-fd42-2c06-e425-4f95a66f5a26.png)


左上の表示を押す。

![2021-07-14 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1760582/59785d51-d41e-8464-3baa-98b5ddcbb40c.png)



表示を選択すると下のように画面が切り替わるので、右にある隠しファイルのチェック欄にチェックを入れると隠れていたファイルが表示される。

![2021-07-14 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1760582/3e0bf302-6810-09c4-9c9c-342b0886e8b9.png)


以上。
ec2-linux(cent)でdpkgできない場合の3行

```bash
$ sudo amazon-linux-extras install epel
$ sudo yum repolist
$ sudo yum -y install dpkg-devel dpkg-dev
```
1行目は「sudo yum install epel」と書きたいところですが、
歯を食いしばって「sudo amazon-linux-extras install epel」と書いてみましょう。
RUNNING LEAN 1章

# 本記事の目的

書籍「RUNNING LEAN 実践リーンスタートアップ」を読んだ学びをアウトプットすること。

# 1章のまとめ
- [言語化しろ、のちに体型的にテストできるから。](#言語化しろのちに体型的にテストできるから)
- [俯瞰しろ、リスクが見えるから。](#俯瞰しろリスクが見えるから)
- [仮説を検証しろ、PMFに近づけるから。](#仮説を検証しろpmfに近づけるから)

# 言語化しろ、のちに体型的にテストできるから。

[リーンキャンバス](https://monstar-lab.com/dx/solution/lean-canvas/)作れ

# 俯瞰しろ、リスクが見えるから。

### だれも欲しがっていないものを作ってしまわないように、

- リーンキャンバスの中からリスクが高いものを見つけろ
- ソリューションにこだわるな
- ビジネスモデルの全体像を把握して、各要素をうまくまとめろ

# 仮説を検証しろ、PMFに近づけるから。

### 実験

アイデア（仮説）
↓
仮説をテストする成果物（ランディングページなど）を**構築**
↓
見込み顧客の反応を定性的・定量的に**計測**
↓
そのデータを仮説の検証や反証の**学習**に使う
↓
再び**構築**

### イテレーション

PMFの目標に近づけるために、**実験**を複数回まとめる。

課題を理解する（PSF）
↓
ソリューションを決定する（PSF）
↓
定性的に検証する(PMF)
↓
定量的に検証する(PMF)


# 次回記事

https://qiita.com/KentaroJay/items/82f175cf8c29bb64b1bd
Firebase のサービスをざっと眺めたメモ

Fireabaseのサービスをざっと眺めた。すごいと思ったところだけを箇条書きでメモる。


## Development


- FireStoreではクライアントとデータベースは、HTTP2でgPRC通信している。(FireBaseのRealtimeDBはだとWeb socketによる通信だった)
- Firebase ML (β)は、デバイスから直接GoogleのAPIを叩き、MLの結果を取得できる
- Firebase ML Kit は、on-device APIセット(MLモデルかアプリ内に載っているので、バックエンドとの通信が不要になるという認識)
- Firebase Cloud Function は、Cloud Functionのラッパーのイメージ
- Firebase Hostingは、静的ウェブサイトを、グローバルにCDNに簡単に展開できる。デフォルトでSSL証明書が自動でプロビジョニングできる。
- Firebase Cloud StorageのSDKは、ファイルをダウンロード中に通信が途切れた場合、通信が回復したら途中からダウンロードを再開できる。

## Growth

- Cloud Messaging でpush通知を送信できる。トピックメッセージだと、特定のトピックをサブスクライブしているユーザー全てにpush通知が送信される。(サーバーサイドで自前で管理しなくて良くなる、例えばユーザーがあるトピックをアンスクライブするとしたら、それを明示的に自前のDBで管理する必要はなくなる)
- In-App messaging(β)を使うことで、ユーザーが実際にアプリを開いているときに重要なタイミングでメッセージを送信できる。
    - AnalyticsやFirebase Predictionを使用することでパーソナライズができる
- Firebase Predictionsを使用して、チャーンの予測や購入者予測ができる
- Firebase remove config は、FirebaseのコンソールorAPI上で設定を切り替えることができる。
    - 例えば、画面の色をだしわける、ABテストする、とかできる
    - remote config personalization(α)を使えば、config parameterを自動的に選択して目的に合わせて最適化するところまでやってくれる
- Firebase Dynamic Liksを使用することで、Deeplink生成、トラッキング機能が使用できる


## Quality

- Crashlyticsで、クラッシュ検知ができる。影響人数、影響ユーザーも簡単に確認できる
- Performanceで、パフォーマンスの監視、ボトルネックの同定
    - 例えばキャッシュのヒット率といったカスタムのメトリックスを追加することも可能
- Test Labで実機検証。localeとかを設定できる。有償。
- App Distribution(β)でベータ版のアプリを特定のユーザー(テスター)のみがインストールできる。
    - Clashlyticsと相性が良く、リリース前のクラッシュレポート作成もできる

## Firebase Extensions

- extensionとしてアプリの機能をfirebase consoleからインストールできる。
- 有料。裏側で動いているgoogleのリソースに合わせて課金される。
- Stripeなど。
- 組織内で自前でextensionを開発し、privateなものとして使用することもできる。



## その他

- Firebaseに強く実装が依存するのは良くないので、アプリケーションアーキテクチャーを気にしつつfirebseを活用しよう。
【Ruby on Rails】deviceで構築したログイン機能のログアウト時、”Couldn't find User with～”のエラーが発生した

#経緯
Railsのチュートリアルとしてあるアプリを作成している際に、deviceによってログイン機能を実装しようとしたところ、おっと大変、ログアウト時にエラーが発生した。
自分のためにも、解決までの道筋も記しておこうと思う。

#環境
Ruby  2.7.3
Rails   6.1.3

#エラー内容
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144388/1669c2c9-e966-5033-8544-4ed809e23407.png)

Railsお初にしては何事もなく実装が進み、さーてログアウトしてホームページに戻ってみるぞ～と思ったところ、写真のようなエラーが発生した。

###試したこと1
ガーン、、、と思いつつ、とにもかくにもエラー内容を見てみると、

""Couldn't find User with 'id'=sing_out""

と出ていたので「idにそんなの渡してないよな？？？」と思いつつ、idについてのコードをいじってみるが解決せず。
そもそもそれ以外が動いているので、ここではないと判断し次を試すことに。

###試したこと2
じゃあルートがミスっているのかと思い、ルート周りを確認してみるも、そもそもそこまで長いコードでもないし、ミスってそうにもない。

タイプミスを疑い、数十分ほど考え倒したが解決しないのでここでネットへ。

#解決方法
エラー内容でググると何とびっくり、全く同じエラーでQiitaに記事が！！！
(少し時間の無駄を感じたけれど、考えることは大切？！)

記事によると、**sign_outのHttpメソッドがDELETEになっているとGETできない**ようだ。

そこで、記事にのっとり、**config/initializers/devise.rb**の**config.sign_out_via**の値をDELETE→GETに編集した。
(結構下のほうに記載してあった)


```config/initializers/devise.rb
config.sign_out_via = :get
```


すると、見事にエラーは解消された。

私のような初学者からすると、このようなエラーは一生解決できないので非常に助かった。
未来のためにも、定期的にエラーの解決法も書いていこうかなと思う。

(記事はこちら)[https://qiita.com/chisaki0606/items/f1f03a6c226e49b5f7b3]
javascriptで作る〇✕ゲーム

##はじめに
最近、javascriptを学ぶ機会があり簡単なアプリを開発したいと思いました。
そこで、〇✕ゲームを開発しようと考え今回に至ります。
これを作ることができれば、友達との対戦が可能になるので是非見てください！！



##〇✕ゲームとは？
3×3 の格子を用意し、二人が交互に「○」と「×」を書き込んでいき3つ並べるゲームのこと。



##コード
###javascriptのコード

```
   <script>

        var turn = '×';
        
        function clickHear(e){
            if (turn == '○') {
                turn = '×';
                e.textContent = turn;
            } else {
                turn = '○'
                e.textContent = turn;
        }
    }


       
      
        
    </script>

```







###HTMLのコード

```
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>〇✕ゲーム</title>


  <style>
      td{
          font-size: 60px;
          width: 120px;
          height: 120px;
          text-align: center;
      }
  </style>

  
 
</head>



<body>

    <h1>〇☓ゲーム</h1>
    <table border="1">
    <tr>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
       
    </tr>
    <tr>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
       
    </tr>

    <tr>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
        <td class="cell" onclick="clickHear(this)"></td>
       
    </tr>
    </table>


</body>
</html>

```



##感想
javascriptの処理コードは思ったより少なかった。
スタイルに関しては、好みで変えてね！！
vbsでpc起動時にブラウザを操作する

今、令和やでって声が聞こえそうですが、vbsを使ってみたら便利だったので、備忘録として書きます。

##vbsとは
vbsとはVisual Basic Scriptの略です。
Windowsだと標準で使えるので何かをインストールしたり環境構築する必要はありません。


##勘違いしていたこと
vbsってofficeソフト内でしか使えないでしょ？と勘違いしていました。
もちろんofficeソフトでも活躍しますが、意外にもwebサイトをスクレイピングしたりブラウザ操作が手軽にできるようです。
(正し操作するブラウザはie限定...)


##実際にコードを書いてみた

```
'変数の宣言を強制します
Option Explicit

'変数objIEを宣言します
Dim objIE

'objIEにInternetExplorer.Applicationのオブジェクトをセットします
Set objIE = WScript.CreateObject("InternetExplorer.Application")



' objIE.Visible = True
objIE.Navigate "https//〇〇"

Do Until objIE.Busy = False
    '1秒間待ちます
    WScript.Sleep(1000)
Loop

' 8時30分以降に起動したとき
'参考 https://keisan.casio.jp/exec/system/1220028550
If Timer >=  30600 Then

If objIE.document.getElementById("hoge01") is Nothing = False Then
Dim objbutton01
' hoge01ボタンをclick
Set objbutton01 = objIE.document.getElementById("hoge01")
objbutton01.click
End If

End If

' 18時00以降に起動でなにかする
If Timer >=  64800 Then

If objIE.document.getElementById("hoge02") is Nothing = False Then
Dim objbutton02
' hoge02ボタンをclick
Set objbutton02 = objIE.document.getElementById("hoge02")
objbutton02.click
End If

End If



'インターネットエクスプローラーを閉じます
objIE.Quit

```


##感想
利用シーンとして思いついたのは出勤確認をwebサービスで管理している場合、出勤ボタンのclickを自動化することができそうです。
実際にスクリプトを動かすのはタスク スケジューラを使ってPC起動時やシャットダウン時など登録しておいて、スクリプトを起動させます。


今更、覚える必要ありませんが習得は比較的容易なので、手軽に自動化したいって方にはありかも？
(セキュリティが心配ですが...)
awkへシェル変数の値を渡す

こんにちは。
awk へシェル変数の値を渡しました[^1] [^2]。下記例では ```str="$str"``` の部分です。第一フィールドが空（```""```）という条件で行の抽出に使っています。

[^1]: 参考: [Shell Quoting Issues](https://www.gnu.org/software/gawk/manual/html_node/Quoting.html) (The GNU Awk User’s Guide)
[^2]: 参考: [Quoting](https://www.gnu.org/software/bash/manual/html_node/Quoting.html) (Bash Reference Manual)

```console
$ str=""
$ awk -F, '$1==str' str="$str" sample.csv
$ awk -F, "\$1==str" str="$str" sample.csv
$ awk -F, -v str="$str" '$1==str' sample.csv
$ awk -F, -v str="$str" "\$1==str" sample.csv
,aa
,bb
```

* シェルでは、single quotation mark 内を除き、特定の記号へはエスケープ記号を前置する必要があります（例：```"\$"```）。


#### プログラム文内でシェルの文字列展開を使う

またシェルの文字列展開をプログラム文内で使い同等の動作を行いました。

```console
$ awk -F, '$1=="'"$str"'"' sample.csv
$ awk -F, "\$1==\"$str\"" sample.csv
$ awk -F, \$1==\""$str"\" sample.csv
```

```awk``` コマンドへ渡される文字列を確認しますと、

```console
$ echo -F, '$1=="'"$str"'"' sample.csv
-F, $1=="" sample.csv
```
PPPoE とは

## 勉強前イメージ

通信させるものってイメージで詳細は知らない

## 調査

### PPPoE とは

PPP over Ethernet の略で、PPPというプロトコルの機能を ethernet上で利用できようにしたものです。
PPPoEの次世代型にはIPoEが存在する。
網終端装置を中継することから `トンネル方式` と呼ばれています。

#### PPP とは

PPPとはPoint-to-Point Protocolの略で、電話回線などの通信回線を使用し1対1の通信で利用されるプロトコルのことを指します。
PPPoEは上記のPPPをカプセル化してethernetで送信します。
PPPはIETFで標準化されていて、PPPを使用することで独自の回線接続のプロトコルを使用しているルーターを異なるメーカーと接続可能にします。
現在、ほとんどのPCやルーターにPPPは実装されています。

### ethernet とは

有線LANの標準の一つで、一番普及している規格。
規格の世代によって通信速度が違うので、注意しないといけない。

### IPoE とは

PPPoEの次世代型で、 IP over Ethernetの略です。
インターネットの接続の際にプロバイダーのネットワークに直接接続するためPPPoEより安定して環境を利用できます。
PPPoEがトンネル方式と呼ばれていますが、IPoEは `ネイティブ方式` と呼ばれています。

### PPPoEとIPoEの違いは？

- 通信速度

PPPoEは電話回線を使用していた技術なので、200Mbps
IPoEは100Gbpsになります。
基本的にはIPoEの方が早くなります。

- 設定方法

PPPoEは専用の機器やアダプタが必要ですが、IPoEなら対応したルーターに接続するだけでインターネットを利用することが出来ます。

- 見れるwebページ

PPPoEはIPv4のページしか見れませんが、
IPoEはIPv6のページも対応しています。
PPPoEでも接続機器を使用すればIPv6のページに接続することが出来ます。

## 勉強後イメージ

最近は大体IPoEなのかな？

## 参考

- [PPP](https://www.otsuka-shokai.co.jp/words/ppp.html)
- [PPPoEとは](https://www.nic.ad.jp/ja/basics/terms/pppoe.html)
- [PPPoEとは？IPoEの5つの違いやIPv4・IPv6との組み合わせを知ろう](https://www.fenet.jp/infla/column/network/pppoe%E3%81%A8%E3%81%AF%EF%BC%9Fipoe%E3%81%AE5%E3%81%A4%E3%81%AE%E9%81%95%E3%81%84%E3%82%84ipv4%E3%83%BBipv6%E3%81%A8%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%82%92%E7%9F%A5%E3%82%8D/#%E5%BE%93%E6%9D%A5%E5%9E%8B%E3%81%AE%E3%80%8CPPPoE%E3%80%8D)
XSS問題(攻撃)の対処法について

XSS問題(攻撃)について、備忘録としてまとめていこうと思います。


#XSS問題(攻撃)とは
XSS(クロスサイトスクリプティング)問題(攻撃)とは、アプリケーション製作者の意図とは別に第三者がJavaScriptコードを埋め込むことで、リンクへのクリックなどによるページ遷移等のコードが読み込まれたタイミングで、保存のCookieを取得させることにより個人情報が漏洩する問題のことを指します。安全性の低いWebサイト等で別ページへ遷移する際に全く関係のない偽ページへ飛ぶ、個人情報が抜き取られるなどは、このXSSによる攻撃であるケースが1つとして考えられ、アプリケーション制作の際に最も対処が必要な問題の1つです。


#解決策
###1,エスケープする
HTML特殊文字（ < , > , " など）を実体参照(HTML エンティティ)に置換することをエスケープと言います。
このエスケープをするためには、htmlspecialchars関数を使います。

```
function h($str) {
    $message = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
```

###２,コード全体構造
上のコードを実際にHTML内に書き込んだ場合このようになります。

```
<!DOCTYPE html>
<html lang = "ja">
<head><meta charset = "UFT-8">
<title>XSS対策</title>
</head>
<body>
<form action = "index.php" method = "get">
<input type = "text" name ="message"><br/>
<a href="javascript:alert('Test')">Test</a><br/>
<input type="checkbox" name="hoby[]" value="musicappreciation">音楽鑑賞<br/>
<input type="checkbox" name="hoby[]" value="moviegoing">映画鑑賞<br/>
<input type="checkbox" name="hoby[]" value="reading">読書<br/>
<input type="checkbox" name="hoby[]" value="fishing">釣り<br/>
<input type="checkbox" name="hoby[]" value="message">マッサージ<br/>
<input type = "submit" value ="submit">
<?php
  // HTML特殊文字をエスケープする
  function h($str){
    $message = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
  }
  
  echo h($_GET['message']);
  echo "<br>";
?>
</form>
</body>
</html>
```



以上が説明になります。
正直まだ理解が浅く拙い箇所が多々ありますが、今後理解が深まったら編集で追記していこうと思います。
自分が直面したことに対しどのように解決したかの自分なりに噛み砕いて解釈した備忘録的要素が強いため、
ここの理解が間違っているというような指摘がある場合ぜひいただきたいです。


#参考HPサイト
・XSSの概要：
https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_5.html
↑リンク先のページ冒頭部にある構図がXSSは何かを理解する上でわかりやすかったです。
・実際の対策：
https://qiita.com/mpyw/items/565b3670dd0c7f9162fa
https://tech-lab.sios.jp/archives/21780
【テックキャンプを受講した感想】

僕はテックキャンプを受講してみてよかったことだらけでした！！
その理由は以下の通りです。

・挫折せず取り組めむことができた
⇨質問環境が良かった
・同期と話せる環境で楽しく続けられた
⇨同期がそれなりに人数もいて、明るい方が多かった
・キャリアアドバイザーが頼もしかった
⇨経験豊富で話しやすい方が就職の相談に乗ってくれた
・未経験から就職の大きな一歩に繋がった
⇨基本的な知識が身についたことで臆することなく面接に挑めるようになった

本当に完全未経験の状態からでも最後まで続けることが出来ましたし、自分の新しい可能性を見つけることが出来ました。
僕は受講して良かったと心から思います！！

マコなり社長ありがとう〜〜〜〜〜〜〜
git push -u origin masterしたらエラーが出た。。

##開発環境
Mac OS X:10.14.6
git version 2.20.1

#結論
``git push -u origin master``じゃなく、``git push -u origin main``だった。

##理由/背景
2020年10月にブランチ名のデフォルトがmasterからmainになった。
米国ミネソタ州ミネアポリスで5月25日に発生した、警官が黒人男性を拘束し窒息死に至らしめた事件と、その動画がソーシャルメディアなどで拡散したことをきっかけに広がった人権運動を背景にしたものです。

masterとSlave(主人と奴隷）と昔のアメリカの黒人を奴隷にした時代を思い起こさせる単語とみなされたようです。それと同時に、ブラックリストとホワイトリストも人種を使った言葉ということで、IT業界もその流れが入ってきているということを知っていればいいでしょう。

##参考
https://www.publickey1.jp/blog/20/githubmainmastermain.html

 https://www.mtioutput.com/entry/git-pusherror-refspec

1日ぐらい粘って、粘ってやっとたどり着いた答えでしたが。僕の現時点の環境で動いただけかもしれないので、情報として覚えという程度だと思ってください。
残プロ　第-42回　~hiddenタイプのinputを利用した文字列の受け渡し~

# \<input type="hidden">

HTMLではinput要素の属性をhiddenとすることで，ブラウザ上に表示されない文字列が扱えます．

~~~ html:
<input type="hidden" id="test_id" name="test_name" value="I say hello.">
~~~


Flask側ではrequest.formメソッドによりinput内のvalueが取得できます．

~~~ python:
from flask import request

goodbye = request.form.get("test_name")
~~~

JavaScriptによってvalueを変更することにより，動的な文字列の受け渡しが可能となります．
初学者がハマったLambda@Edgeの落とし穴たち

# 概要

私はAWS歴1年目のおじさんエンジニアです。当記事は、私が初めてLambda@Edgeを書くにあたってハマったポイントの備忘録です。

ご存じの方には今更な内容かと存じます。基本的には[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)に記載してあることばかりです。

なお、私の都合上、ランタイムはNode.js前提です。

# 落とし穴たち

## リージョンはus-east-1(バージニア北部)のみ

これは皆さま最初に驚くポイントかと思いますが、Lambda@Edgeを設置できるリージョンは**us-east-1**のみです。

## 環境変数が使えない

Lambda@Edgeでは環境変数が使えません。私は今回扱いませんでしたが、どうしてもLambda@Edgeで機微情報を扱いたい場合には、SecretsManager等を参照する手段が一般的な様です。

## メモリなどの制約が厳しい

Lambda@Edgeは、起動するタイミングによってオリジンとビューワーに大別されますが、下表のとおり、それぞれ通常のLambdaよりも厳しい制約が設けられています。特にビューワーのリクエスト/レスポンスはごく小さなプログラムしか実行できません。

|| オリジンリクエスト/レスポンス | ビューワーリクエスト/レスポンス |
| --- | --- | --- |
|メモリサイズ|通常のLambdaと同様|128MB|
|タイムアウト|30秒|5秒|
|レスポンスのサイズ|1MB|40KB|
|バンドルのサイズ|50MB|1MB|

## 提供AWS SDKはV2のみ

これはLambda一般の話ですが、Lmabda関数の実行環境ではAWS SDKが提供されています。従ってLambdaから他AWSサービスへのアクセスをしたい場合にも、SDKをバンドルに含める必要はありません。

SDKのバージョンについて、Node.jsで利用するAWS SDK for JavaScriptは[2020年12月から](https://aws.amazon.com/jp/about-aws/whats-new/2020/12/aws-sdk-javascript-version-3-generally-available/)バージョン3が公開されています。

しかしながら、**2021年7月13日現在、Lambda環境上で提供されるSDKはV2のみ**です。

通常のLambdaでは、マイナーバージョン固定のためにSDKをバンドルする場合もあるかと思いますし、大きな問題にはなりません。しかしLambda@Edgeでは前述のバンドルサイズ制約のため、V3の利用はほぼ不可能です。アップデートを待ちましょう。[最新の状況はこちら](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-nodejs.html)。

### [余談] Serverless Framework にてAWS SDKをバンドルから除外する手段

私は現在Serverless Frameworkを利用しています。Serverless FrameworkでLambda@Edgeをデプロイするにあたって、AWS SDKをバンドル対象から除外する方法を調べるのに思いのほか時間がかかったため、ここに遺しておきます。

#### ① devDependenciesにする

dependenciesでなくdevDependenciesに指定すればバンドルから外れます。が、依存は事実であるためかっこよくはないです。

#### ② serverless.ymlのserverless-webpackの設定で除外する

serverless-webpackを利用している場合、特定のパッケージをバンドルから除外する設定があります。[こちらのissue](https://github.com/serverless-heaven/serverless-webpack/issues/292#issuecomment-641665113)で見つけました。

```
custom:
  webpack:
    includeModules:
      forceExclude:
        - aws-sdk
```



以上。
オブジェクトのoriginal属性からデータを取り出す。Eloquent Model 【Laravel】


##オブジェクトのoriginal属性からデータを取り出す。


###やりたいこと
モデル名->取り出したい変数名とするとattributesから取り出されてしまうが、originalから取り出したい。



```php
  

     #attributes: array:6 [▼
        "id" => 1097
        "user_id" => 1
        "title" => "タイトル"
        "body" => "ボディー"
        "created_at" => "2021-05-13 00:08:27"
        "updated_at" => "2021-05-13 00:08:27"
      ]
      #original: array:10 [▼
        "id" => 1097
        "user_id" => 1
        "title" => "タイトル"
        "body" => "ボディー"
        "created_at" => "2021-05-13 00:08:27"
        "updated_at" => "2021-05-13 00:08:27"
        "pivot_user_id" => 1
        "pivot_language_id" => 1097
        "pivot_created_at" => "2021-06-10 19:32:40"
        "pivot_updated_at" => "2021-06-10 19:32:40"
```

とりだしたいのはpivot_created_atの時間。

```php
 $post->getOriginal()['pivot_created_at'];
```

解決。
未経験の方がエンジニア転職の前になぜ共同開発をやるべきか

# なぜ共同開発が必要か
***エンジニアに就職すると個人開発ではなく共同開発がメイン***です。
***共同開発は個人開発では学べないことが学べます***。

最近だと未経験でも「共同開発くらいやったことあるよね？」って風潮があります。

# どんなことがあるか
- ```コンフリクトの解消```
- ```エラー解決の思考```
- ```Gitの操作```
- ```タスク管理```
- ```お客様　　仲間　上司が求めていることをことを汲み取る力```
- ```相手から適切なアドバイスをもらえる質問力```
- ```正しく理解し正しく伝える言語化スキル```
- ```他の人がやっていることを把握しながらタスクを進める```

これだけのことは個人開発では学べないので***企業側は実務経験や共同開発経験を重視***します。
オンラインサロン,共同開発ができるスクール,企業での研修開発に参加など
をして共同開発の経験を積みましょう。

# 実務で頭が真っ白にならないために
これは以前強強エンジニアから教わったことですが、実務でタスクを任せられて、
頭が真っ白になった場合の対処法を教わりました。

***CRUD処理と認証機能を実装***することです。
実際に***これらを共同開発でやってから実務案件に入ったら、頭が真っ白にはならなかった***です。

https://read-engineer.com/2023/09/15/saiteigen/

# 個人開発もメリットがある
個人開発もメリットはあります。理由は***上流工程から下流工程まで全部できる***からです。
これを自分はやっておいてもよかったなと思いました。

サービスの運用までできれば未経験でも転職は無双できたりします。


# 共同開発ができる環境
自分が知っている範囲だと以下のサロンやスクールが共同開発ができそうです。

-　```Zero to Hero```
 ***実務経験が積めるサロン***です。自分はここ出身です。なかなか未経験の肩書きが外せない場合は
このサロンに落ち合わせしてみてください。***値段もかなり安い***です。
 一度ご自身でアプリケーションを開発(ポートフォリオ作成)するか共同開発を終えてから入ると効果があります。
 
https://zero2hero.jp/


- ```やんばるエキスパート```
自分はこのスクール出身ではないですが、評判はかなりいいです。

https://yanbaru-expert.com/

- ```株式会社グッドファミリア```
こちらの方は自分の知り合いで30代の未経験からエンジニアになった方なので、***30代からチャレンジしたい方***は問い合わせしてみてください。

https://www.youtube.com/channel/UCXYwkB3h0YZD-x8VHq6JehQ
ubuntu18.04でpyenv,virtualenvをインストールする

ubuntu18.04でpyenv,virtualenvをインストールする
ubuntu向け記事が少なかったので作成（Mac向け記事は多かった）

インストール

```
git clone https://github.com/pyenv/pyenv.git  ~/.pyenv
git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
```

`~/.bashrc`に以下の内容を追記

```
#pyenv 
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

有効化

```
$ source ~/.bashrc
```

pyenvで利用するpythonバージョンのインストール

```
pyenv install x.x.x
ex) python 3.9.1 をインストールする場合
pyenv install 3.9.1
```

利用可能なバージョンは`pyenv install --list`で確認可能

```
pyenv install --list
```

仮想環境を作成する(ex. myenv)

```
pyenv virtualenv 3.9.1 myenv
```

仮想環境に入る

```
$ pyenv activate myenv
```

`python3`バージョン確認(3.9.1と表示されればOK)


```
python3 -V
```

pip3を使ってpython3のパッケージをインストールする

```
pip3 install numpy
```

仮想環境を抜ける

```
$ pyenv deactivate
```

仮想環境を削除する

```
$ pyenv uninstall myenv
```

これでOK

# pythonのバージョンが切り替わらない

pyenv local 3.9.1 と指定してもpythonはホストPCのバージョンを使うという現象があった。
以下など色々触っているうちに解決した。原因分からないが備忘録として残しておく。

> [pythonのバージョンが切り替わらない](https://qiita.com/mckyhrs/items/94a2db3506287df0420e)

[公式GitHub](https://github.com/pyenv/pyenv#uninstalling-python-versions)を参考に、
`~/.bashrc`に以下の内容を追記するなどした

```
#pyenv 
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"
```

# `pyenv activate myenv`時に`Failed to activate virtualenv.`とエラーが出る

エラー内容

```
Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.
```

以下を実行すると解決した

```
# enable pyenv (if necessary)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

# 参考
[pyenv + pyenv-virtualenv の使い方](https://note.com/npaka/n/n597d1cea0432#QerBh)
[pyenv と pyenv-virtualenv で環境構築](https://qiita.com/Kodaira_/items/feadfef9add468e3a85b)
[pyenv と pyenv-virtualenv をインストールする](https://qiita.com/shigechiyo/items/198211e84f8e0e9a5c18)
[pyenvとpyenv-virtualenvの自分流使い方](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)
[pyenvでpythonの仮想環境を構築](https://qiita.com/nsas454/items/c5bd3a535205d434234e)
[pyenv の activate って何？ ( pyenv shell との違い )](https://qiita.com/YumaInaura/items/c2074b176d9ca0b8dfbb)
[Pythonにおける仮想環境「venv」について](https://qiita.com/overflowfl/items/1db8746b9831bb15e9b5)
JIRAチケットのコメント全て取り出す

```
ykishi@dezembro GENERAL % cat get_jira_comments.py
#!/usr/bin/env python3

import datetime
from jira import JIRA
import json
import os
import sys
import pandas as pd

#---------------------
# CSVファイル名
#---------------------
dir = "./jira-tickets"
d_today = datetime.date.today()
csv_filename = dir + "/" + \
    "comments_for_each_JIRA_ticket_" + str(d_today) + ".csv"

#-----------------------------
# JIRA REST APIへの接続設定
#-----------------------------
user = "ykishi@oh-my-spaghetti.com"
server = "https://oh-my-spaghetti-support.atlassian.net"

try:
  apikey = os.getenv("JIRA_API_TOKEN")
except KeyError as err:
  print("Environment variable not found:", err)
  sys.exit()

options = {"server": server}

jira = JIRA(options, basic_auth=(user, apikey))

# ===========================================================
# 空のdataframeを作成
# ===========================================================
colnames = [
    "Ticket#",
    "Comment_id",
    "Comment_body",
    "Comment_authtor",
    "Comment_created",
    "Comment_updated",
]
df = pd.DataFrame([], columns=colnames)

size = 100
count = 0
while True:
  start = count * size

  issues = jira.search_issues("project=ESD", start, size)

  if len(issues) == 0:
    break

  count += 1

  # ------------------------------------------------------------------------------
  # チケット単位で全てのコメントを取り出し、dataframeにmergeしていく
  # ------------------------------------------------------------------------------
  for issue in issues:
    print(issue)

    # print(jira.comments(issue))
    # print(type(jira.comments(issue)))

    for comment in jira.comments(issue):
      # print("===============================================")
      # print(type(comment))
      # print(vars(comment))
      # print(comment.id)
      # print(comment.body)
      # print(comment.author)
      # print(comment.created)
      # print(comment.updated)
      # print("===============================================")

      temp = pd.Series(
          [
              issue,
              comment.id,
              comment.body,
              comment.author,
              comment.created,
              comment.updated,
          ],
          index=df.columns,
      )

      # print(temp)

      df = df.append(temp, ignore_index=True)

# ---------------------------------
# Output into a CSV file
# ---------------------------------
print(df)
df.to_csv(csv_filename)
ykishi@dezembro GENERAL % 
```
[Dart] リストから重みつきrandom choice


リストから,各要素に任意の重み付けをして要素をランダム取得しようと思ったのですが、Dartのmath.Randomクラスにはそのようなメソッドがなさそうだったので、力技ですが自作してみました。
(「Dart 重み random」 とかでググると、Dartではなくダーツの話をしているJavascript記事が出てきてしまう。。)


```dart
import "dart:math";

void main() {
  // 候補となる要素と、対応する重みの配列を用意
  List<String> fruits = ["apple", "orange", "grape", "banana"];
  List<int> weights = [1, 2, 3, 4];

  
  List<int> l = [];
  weights.asMap().forEach((int idx, int weight) { // weightsの各要素とそのindexを取得
    l += List.filled(weight, idx); // 長さ:weight, 全要素がidxの作成してlに連結していく
  });
  print(l); // ["0", "1", "1", "2", "2", "2", "3", "3", "3", "3", ]

  // 上記で生成した配列から1つ選ぶことで、重みつきのchoiceを実行
  var _random = new Random();
  int idx = l[_random.nextInt(l.length)];

  print(fruits[idx]);
}
```
※Dartに慣れていないため、コメントが冗長ですがご容赦ください。


よりスマートな方法があればコメントいただけると幸いです。
JIRAチケットのカスタムフィールド情報を取り出す

```
ykishi@dezembro GENERAL % cat check_values_stored_in_custom_fields.py
#!/usr/bin/env python3

import datetime
from jira import JIRA
import json
import os
import sys
import pandas as pd

user = "ykishi@oh-my-spaghetti.com"
server = "https://oh-my-spaghetti-support.atlassian.net"

dir = "./jira-tickets"
d_today = datetime.date.today()
csv_filename = dir + "/" + "all_the_JIRA_tickets_" + str(d_today) + ".csv"

try:
  apikey = os.getenv("JIRA_API_TOKEN")
except KeyError as err:
  print("Environment variable not found:", err)
  sys.exit()

options = {"server": server}

jira = JIRA(options, basic_auth=(user, apikey))

# ===========================
# Fetch all fields
# ===========================
allfields = jira.fields()
print(allfields)
print("-----------------------------------------------")

# ==============================================
# Make a map from field name -> field id
# ==============================================
nameMap = {field["name"]: field["id"] for field in allfields}

# =============================
# Retrieve all the records
# =============================
size = 100
count = 0
while True:
  start = count * size

  issues = jira.search_issues("project=ESD", start, size)

  if len(issues) == 0:
    break

  count += 1

  for issue in issues:
    # print(type(issue))
    # print(vars(issue))
    print(str(issue) + ": " + str(getattr(issue.fields, nameMap["問い合わせ種別"])))
ykishi@dezembro GENERAL % 
```
診断メーカーから診断結果を取得(Python, Bash)

# 何？

[診断メーカー](https://shindanmaker.com)から結果を取得したい

## 手段

- 要Session
- 診断ページに以下のパラメータをPOST:
  - `_token`: 診断ページから取得
  - `shindanName`: 任意
      - ここをランダムにするとランダムな結果が得られて楽しい
  - `hiddenName`: 診断ページから取得
- 要UA偽装
  - [ここ](https://developers.whatismybrowser.com/useragents/explore/)とかから好きなのを指定する


## Python

CLI+ライブラリを書いた。`pip install shindan-cli`で入る。
https://github.com/eggplants/shindan-cli

- pythonから:

```python
from shindan_cli import shindan

shindan.shindan(1036646, 'hoge', wait=False)
#=>'ねこって、むしだ。\n\n𝙐𝙉𝙄𝙌𝙇𝙊'
```

- CLIから:

```bash
$ shindan 1036646 hoge
ねこって、むしだ。

𝙐𝙉𝙄𝙌𝙇𝙊
```

## Bash

Bashスクリプトを書いた。
https://github.com/eggplants/shindan-cli/blob/master/shindan.sh

```bash
$ curl -Lo shindan git.io/JDjZ2
$ chmod +x shindan
$ ./shindan 1068122 twst
モハ・・・・・・・・・・・・・・・・・はよっはっはっよっひゃおひゃおおおっはおおんはよはよよよよよよよよよよよよっよよよよよよ
おおおよよンンンンンンン大照
```
KaggleチュートリアルのHouse Priceに取り組んでみた

# はじめに
前回の[Titanic(タイタニック)](https://qiita.com/Helvetica822/items/d035ea0eeca5b409e32a "Titanic(タイタニック)")に続いてKaggleの回帰問題における初心者向けチュートリアルであるHouse Priceに取り組んでみました。
Titanicでは乗客の生死についていずれであるか予測しましたが、このHouse Priceは住宅の販売価格の連続値を予測します。

今回いくつかのモデルを試してみましたが、結果は以下のようにElastic Netが試した中では一番良い結果となりました(もちろんハイパーパラメータの値によっては変わりうると思いますが)。
ハイパーパラメータは参考にしたページの値をそのまま使用させていただいています。

__Lasso < ランダムフォレスト回帰 < Ridge < Elastic Net__

Elastic Netのスコア：0.13585
順位：5,444 / 14,101 (38.6%)

最初にElastic Netで出して最後に出し直したら、やってること変わってないけど多少精度落ちました…(Notebookのスコアはちょっと落ちたスコア)

# 参考にした記事
[【Kaggle】「House Prices」をパクりながらやってみた。](https://qiita.com/muscle_nishimi/items/901ed94f3cdf1c8d893a "【Kaggle】「House Prices」をパクりながらやってみた。")
[住宅価格を予測する〜Kaggle House Priceチュートリアルに挑む](https://yolo-kiyoshi.com/2018/12/17/post-1003/ "住宅価格を予測する〜Kaggle House Priceチュートリアルに挑む")
[kaggleの住宅価格予測問題（House Prices）を解いてみる](https://medium-s.jp/kaggle-house-prices/ "kaggleの住宅価格予測問題（House Prices）を解いてみる")
[Blend&Stack LR&GB = [0.10649] {House Prices} v57](https://www.kaggle.com/itslek/blend-stack-lr-gb-0-10649-house-prices-v57/ "Blend&Stack LR&GB = [0.10649] {House Prices} v57")

# Notebook
コードやグラフ等は下記のNotebookを参照してください。

[Kaggle Notebook](https://www.kaggle.com/helvetica822/house-price "Kaggle Notebook")

交差検証の時の自由度調整済み決定係数算出に使うデータ件数は、分割前の全件か分割後の$K$1つ分かだけ疑問。

# やってみて感じたこと
* 連続値の値の処理
販売価格(SalePrice)について対数変換して可視化してたものの、当初はデータフレームに反映するのを忘れていて全く収束しない状態になっていました。(RMSEの値が1万とか)
標準化にしろ対数変換にしろ、連続値の値をどう処理するかということは気をつけなければならない。

* 欠損値の意味
欠損値は必ずしもデータが漏れているということを示すとは限らない。
今回の場合、例えばプールの品質(PoolQC)はほとんどが欠損していたが、品質以前にプールがないからデータなしとなっていたレコードがほとんどである。

# 次の予定
今度は実際のコンペに挑戦していってみようと思います。
今度からはOptuna使ったりもしつつ、銅メダルを目指していきたいところです。
製造業　工場でよく使われるソフトウェア　現状把握編

製造業において主に使われるソフトウェア、そしてその使い方について現状を把握する意味でも記しておく
この記事は数年後、（こんな時代もあったな）と振り帰ることができるのだろう　多分

##Microsoft Excel

おそらく現場で最も使われているであろう、誰もがご存じ天下のMicrosoft社製ソフトウェア。
その使用範囲の広さは、決して「表計算ソフトウェア」という枠には収まらない。
むしろ表計算という本来の目的に使われる方が少ないとまで言える。
報告書の作成、一覧表の作成、資料の作成、このソフトさえあれば、他のソフトは不要と言ってもいい。
オブジェクトで絵を書くのは勿論、図形を駆使して立体図を書いてしまうこともよくある。
その際には何百も重なったオブジェクトが、印刷や保存により、ズレが生じてしまうなどは誰もが経験するだろう。
さらにそれを画像として保存すればズレないことに気づき、画像として保存されたオブジェクトは編集が困難と気づくまでがワンセット。

本来の目的の表計算についても、少し関数や絶対参照などを覚えると驚くほど便利だ。
しかし、その「少し」が高い壁になって立ちはだかる人が多いのも事実である。
関数を使いこなせれば、「パソコンができる人」という称号は手に入ったも同然。
調子に乗って「マクロ」や「VBA」に手を出し始めることもあるが、メンテナンスをできるのが作った本人だけになり、後々自分の首を絞めることになるだろう。しっかりとした運用や、マクロやVBAを理解できる人物が複数人いるなら別である。

個人的な思いとしては、このソフトは日本の製造現場を支えている。IoTを進めても、このソフトは必須のままだろう。

##Microsoft Outlook

言わずと知れたメール、スケジュール管理ソフト。
Excelと同じく必須ソフト。特にマネジメント側。
偉くなればなるほど、スケジュールやタスク管理まで要求される。
ただの作業者としては何日か見なくても特に支障はない。

##Microsoft PowerPoint

発表・プレゼン資料を作るのに適している。その使用目的にわりとちゃんと沿って使われている有能ソフト。
大きいモニタやプロジェクターが普及したのもその使用率と関係していると思う。

##Microsoft Word

上記の発表資料の原稿を書いたりするのに使われる。
使いこなせば割と便利で有能なのだが、使用頻度は低い。
おそらく　Excelで良くない？　と思われている。

##Microsoft Access

一部データ管理で使われているソフト。その仕組みは現場の人間にとってはブラックボックス。
ここまで来ると専用の知識が必要になり、かなりしっかりとした目的がないと触らない。

##その他システム

在庫管理、勤怠管理などいくつかに分かれている。業務上必須のシステム。
その部門に分かれて管理されているため、システム自体はそれぞれ別部門管理。
種類はあるが、業務上必須なので、みんな覚えている。

##アクセサリ（メモ帳、ペイント、電卓など）

地味に役立つ物たち。

#最後に

まとめみて、現在いかに「Microsoft Office」に頼り切っているかが、わかった。
そして、IoTを推進、導入したところで、このリストに例えば「PowerBI」などのデータ見える化ツールが入り込む余地があるのか？　と疑問はやはりある。
使用率の高い「Excel」「Outlook」というソフトは、やはり「必須」なのだ。時間が無い現場においては、そのツールが「必須」に近くないと使用されるようになる、とは思えない。
必須に近くなるような仕組みづくり。一朝一夕ではできそうにないが、これからも考えていきたい。
Flutter+Amplify(DataStore)でデータ登録がAWS側に反映されない

# 内容
公式の手順に沿ってAmplifyのDataStore使ってデータ登録してるのに、
ローカルには保存出来てるっぽいが、クラウド側のDynamoDB見ててもデータ全然入ってこない！

コンソール見ててもそれっぽいログ流れてこないし、めっっちゃ悩んだ。

※公式は以下を参照
https://docs.amplify.aws/lib/datastore/getting-started/q/platform/flutter

```dart
    Todo newTodo = Todo(name: 'HOGE');

    try {
      await Amplify.DataStore.save(newTodo);
      List<Todo> todos = await Amplify.DataStore.query(Todo.classType);
      print(todos);　// ここでは取得出来ているので、どうやらクラウド側への反映がうまくいってない？
    } on DataStoreException catch (e) {
      print('Query failed: $e');
    }
```

# 解決
どうやらクラウド側への反映はgraphqlのAPIを使ってるっぽく、
flutter_apiの設定もしてやる必要があるっぽい。。。
(書いといてくれよぉ。。。)

なのでAPIの設定してやる。

- amplify_apiの追加

```yaml:pubspec.yaml
    amplify_api: ^0.2.0
```

- Amplify.addPluginの追加

```dart:main.dart
    await Amplify.addPlugin(AmplifyAPI());
```

これで完成！
※AmplifyAPIのconfigrationは公式の手順通りやってれば、「amplify add api」のタイミングで自動生成されてる、、、はず。
laravel5.8 検索機能

laravelの検索機能を作成したのでアウトプットしていこうと思います。

#画面
商品名:あいまい検索
商品カテゴリー:プルダウン検索
![スクリーンショット 2021-07-11 22.37.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/7b1ea3bb-3632-bdca-3c7a-1e3a03098bc1.png)

入力保持:検索した値が残る
![スクリーンショット 2021-07-11 22.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/73b6e1e5-6ba5-3e9b-f931-b5b8fcfb890e.png)

#実装
###▪️View
```php:views/product/search.blade.php
 <form class="search" enctype="multipart/form-data" action="{{route('product.index')}}" accept-charset="UTF-8" method="get">
        @csrf
        <div class="row">
            <div class="input-group mt-4 col-md-7 offset-2">
                <h2 class="mr-4">商品名</h2>
                <input type="text" name="product_name" class="form-control" value="{{isset($product_name) ? $product_name : "" }}"> 
                <span class="input-group-btn">
                    <input type="submit" class="btn btn-primary ml-4" value="検索">
                </span>
            </div>
        </div>

        <div class="row">
            <div class="input-group mt-4 col-md-7 offset-2">
                <h2>商品カテゴリ</h2>
                <select id="category_id" name="category_id" class="form-control">
                    @foreach(config('categories') as $id => $category)
                    <option name="category_id" value="{{$id}}"　@if ($id === $category_id_int) {{$id}} selected @endif>{{$category}}</option>
                    @endforeach
                </select>
            </div>
        </div>
    </form>
```

@foreach(config('categories') as $id => $category)
セレクトボックスの値はconfig/categories.phpに配列を持ってきています。

入力保持
・テキストボックス
value="{{isset($product_name) ? $product_name : "" }}"

・セレクトボックス
value="{{$id}}"　@if ($id === $category_id_int) {{$id}} selected @endif>

なぜかold関数が使えなかったので今回の方法で入力保持しました。
これが正解かどうかはわかりませんが、参考になればと思います。

イメージとしては
値をコントローラに送って、送った値を再び表示させているイメージです。

```php:routes/web.php
<?php
return array(
    '0'=>'未選択',
    '1'=>'肉類',
    '2'=>'魚介類',
    '3'=>'果物類',
    '4'=>'野菜類',
    '5'=>'飲み物類',
    '6'=>'漬物類',
    '7'=>'菓子類',
);
```

###▪️Controller 

```php:Controller/ProductsController.php

    /**
     * 商品検索
     * @return $datas
     */
    public function index(Request $request)
    {
        $query = Product::query();

        $product_name = $request->product_name;
        $category_id = $request->category_id;

        //商品名の値が存在&商品名の値が空ではなかった場合
        if ($request->has('product_name') && $product_name !== '') {
            $query->where('product_name', 'like', '%' . $product_name . '%')->get();
        }

        //カテゴリーの値が存在&カテゴリーの値が0ではなかった場合
        if ($request->has('category_id') && $category_id !== '0') {
            $query->where('category_id', $category_id)->get();
        }

        $datas = $query->paginate(15);

        //型変換
        $category_id_int = intval($category_id);

        return view('product.search', ['datas' => $datas, 'product_name' => $product_name, 'category_id_int' => $category_id_int]);
    }

```

###▪️route 
```php:routes/web.php
Route::prefix('products')->group(function () {
        Route::get('/', 'ProductsController@index')->name('product.index');
    });
Flutter+Amplify+graphqlのcodegenで生成されたmodelがnullsafety対応にならない

# 内容
Amplifyのflutterがnullsafety対応したので、私が開発しているプロジェクトにも適応しようと思い公式見ながら色々やっていたところ、codegenで生成されたmodelがどう見てもnullsafety対応されていない状態(エラーが出る)で困った。

Amplifyのバージョン：5.1.0

ちなみに公式は以下のページを参照しながらやった。
https://docs.amplify.aws/lib/datastore/getting-started/q/platform/flutter

```graphql:schema.graphql
type Todo @model {
  id: ID!
  name: String!
  description: String
}
```

```cmd:実行コマンド
# amplify codegen models
```

```dart:Todo.dart
class Todo extends Model {
  static const classType = const TodoType();
  final String id;
  final String name;
  final String description;

  @override
  getInstanceType() => classType;

  @override
  String getId() {
    return id;
  }

  const Todo._internal(
      {@required this.id, @required this.name, this.description});

  factory Todo(
      {@required String id, @required String name, String description}) {
    return Todo._internal(
        id: id == null ? UUID.getUUID() : id,
        name: name,
        description: description);
  }

  ...
```

# 結論
どうもamplifyフォルダの直下にcli.jsonを作成し、そこでnullsafety適用の設定を書く必要があったそうだ。

以下をamplifyフォルダの直下に作成。

```json:amplify/cli.json
{
  "features": {
    "codegen": {
      "useAppSyncModelgenPlugin": true,
      "enableDartNullSafety": true
    }
  }
}
```

私は「enableDartNullSafety」さえtrueで設定されていれば良いと思っていて、何回やってもnullsafety対応にならないのでAmplifyCliのバグではないかと疑ってました。。。

「enableDartNullSafety」の設定だけでもcodegen時に以下のようなメッセージ出てたので。
(ひっかけじゃない？)

```
Detected Dart SDK version 2.12.0 or above
Detected feature flag: “enableDartNullSafety : true”
Generating Dart Models with null safety. To opt out of null safe models, turn off the “enableDartNullSafety” feature flag. Learn more: https://docs.amplify.aws/lib/project-setup/null-safety/q/platform/flutter
```

これでちゃんとnullsafety対応版のmodelが生成されます！

```dart:Todo.dart
class Todo extends Model {
  static const classType = const _TodoModelType();
  final String id;
  final String? _name;
  final String? _description;

  @override
  getInstanceType() => classType;
  
  @override
  String getId() {
    return id;
  }
  
  String get name {
    try {
      return _name!;
    } catch(e) {
      throw new DataStoreException(DataStoreExceptionMessages.codeGenRequiredFieldForceCastExceptionMessage, recoverySuggestion: DataStoreExceptionMessages.codeGenRequiredFieldForceCastRecoverySuggestion, underlyingException: e.toString());
    }
  }
  
  String? get description {
    return _description;
  }
  
  const Todo._internal({required this.id, required name, description}): _name = name, _description = description;
  
  factory Todo({String? id, required String name, String? description}) {
    return Todo._internal(
      id: id == null ? UUID.getUUID() : id,
      name: name,
      description: description);
  }

  ...
```
railsのルーティングのnamespace,module,scopeについて

railsでルーティングを記述する際にresources以外で何かないか調べてみたところ、見つけて実際に使ってみて場面によって記述を変えることで分かりやすくなったので復習がてらアウトプットしたいと思います。

#namespace
ファイル構成とURLどちらも指定のパスに指定したい時に使用します。

```config/routes.rb
Rails.application.routes.draw do
  namespace :user do
    resources :profiles
  end
end
```

#module
URLは変えたくないけどファイル構成だけ指定のパスにしたい時に使います。

```config/route.rb
Rails.application.routes.draw do
  scope module: :URL do
    resources :notice
  end
end
```

#scope
URLは指定のパスにしたいけどファイル構成は変えたくない時に使います。

```config/routes.rb
Rails.application.routes.drow do
 scope :users do
    resources :notices
  end
end
```

以上です。
Latex For Mac 箇条書き

## 箇条書き
### 番号なし箇条書き
```
\begin{itemize}
  \item 箇条書き
  \item 番号付き箇条書き
  \item 見出し付き箇条書き
\end{itemize}
```
![番号なし箇条書き](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758523/1779effd-2622-e94d-d5c6-f89180956d8d.png)

### 番号付き
```
番号付き箇条書き
\begin{enumerate}
  \item 第1レベル1
  \begin{enumerate}
    \item 第2レベル1
    \begin{enumerate}
      \item 第3レベル1
      \begin{enumerate}
        \item 第4レベル
      \end{enumerate}
      \item 第3レベル2
    \end{enumerate}
    \item 第2レベル2
  \end{enumerate}
  \item 第1レベル2
\end{enumerate}
```

![番号付き箇条書き](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758523/e369e894-0c48-ad56-568c-b982cf80251e.png)


### 見出し付き
```
\begin{description}
  \item [日付] 2021年1月1日
  \item [場所] 富士山山頂
  \item [時間] 4時35分
\end{description}
```

![見出し付き箇条書き](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758523/a648941a-ba45-3358-54c7-7dbee84efe78.png)

[目次](https://qiita.com/okirakuna_danna/items/5cc04d44ed12480fab31)
ブログアプリの作成

## はじめに
今回は自分用のブログアプリを作成しました。

##　完成イメージ
![スクリーンショット 2021-07-13 21.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288651/f0bedd9c-e80d-5061-1066-83342297f674.png)
![スクリーンショット 2021-07-13 21.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288651/7a65fb09-c8d4-6f1c-b883-d86ef679bed2.png)
![スクリーンショット 2021-07-13 21.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288651/1ac3d408-48be-817d-5a23-1a92f4727445.png)

## 使用した技術
- React
- Redux toolkit
- typescript
- json-server

## 作成目標
サーバーの理解がないため、json-serverを使用し、http通信してきちんとデータを保持できる
ようにする。
その記述をredux toolkit（createAsyncThunk）を用いて適切に行えるようにする。

## 実装した機能
- ブログの基本的な機能として、CLUDが行えるようにした。
- 管理者のみ記事の追加、編集、削除が行えないようにした。
- いいねのカウント機能（いくらでも押せる）

## 感想
createAsyncThunk、またextraReducerの記述に関するいい記事が見つからず
かなり苦戦したが、他の方に聞くことで気付きを得られた。

自分で調べることも大事ではあるが、どれだけ頑張っても解決しない問題はあるし、
そういったときは潔く人に聞くべきだなという学びが得られた。

また今回の挑戦を経てRedux toolkitの記述にはかなり慣れたように感じた。

今度からはあまり抵抗なく使えるだろうなと思えるようになったこともよかった。

反省としては、かなり一人で悩んでいたため、目標としていた期限を大幅に過ぎてしまったことだ。
次からは遅れそうだなと感じたらすぐに人を頼るようにしようと思います。

## 参考記事
[Redux Toolkit の AsyncThunk をさわってみる](https://www.cyokodog.net/blog/redux-toolkit-async-thunk/)
[Redux ToolkitのcreateAsyncThunkで非同期処理を実装する方法](https://nishinatoshiharu.com/redux-createasyncthunk-overview/)
[モックサーバーの起動とリソース処理](https://www.codegrid.net/articles/2017-json-server-1/#toc-5)
[Reactでマークダウンエディタ作成](https://qiita.com/t_okkan/items/0a3318f90ee6c4468f82)
[JSTQB AL TM]　2. テストマネジメント　を視覚的にまとめてみた（1/4）

# はじめに
2021年8月のJSTQB　Advanced Level Test Manager(TM)の試験を受験予定のMa5am1nです。
[シラバス](http://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J04.pdf)[^1]を読んでいるのですが、どうも文字が多くて頭に入りにくいので、図など視覚的に入ってきやすそうな形式でまとめてみます。

[^1]: 2012年度版 Advanced Level シラバス　日本語版　-テストマネージャ
**※あくまで私個人の解釈で作成したものです。内容が100%シラバスの通りであることは保証できませんので、ご了承ください。**
**※スライドの青文字、青線になっている箇所は、シラバスに記載されていない、私独自の解釈で記載した内容です。**

このページでは、2. テストマネジメントについて扱います。
内容が多いので4回に分けています。


# 2.テストマネジメント
## 2.1イントロダクション
![JSTQB AL TM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/f86826ba-11d3-9312-8024-d913ef0387c8.png)



## 2.2状況に応じたテストマネジメント
![JSTQB AL TM (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/0f9b2093-6f1e-7a95-68e8-6d0e2fa9cd1c.png)


### 2.2.1 テストステークホルダについて
![JSTQB AL TM (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/72803b52-4699-21a0-a4bc-375ee4a04e39.png)
![JSTQB AL TM (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/cd9c3276-407f-8390-4211-482023f2dfba.png)


### 2.2.2 その他のソフトウェア開発ライフサイクル活動と成果物
![JSTQB AL TM (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/0d92141b-ae22-e8a8-e221-121cea94cd62.png)
![JSTQB AL TM (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/e6c0fa5e-a839-9805-b172-a40df1324329.png)
![JSTQB AL TM (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/89c4f578-934e-e3cb-3a61-15b61c1b8476.png)


### 2.2.3 テスト活動とその他のライフサイクル活動の連携
![JSTQB AL TM (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/71974915-b36d-7a9c-2067-a54f4bf51437.png)
![JSTQB AL TM (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/0803d9e9-e442-f0a1-9a18-c08897a35ad4.png)
![JSTQB AL TM (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/651cf3e0-0028-f0b0-ac69-5b4931b244b4.png)
![JSTQB AL TM (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/c2f5d4d0-06b3-caaa-60bb-1cad20400f73.png)

### 2.2.4 非機能テストのマネジメント
![JSTQB AL TM (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/5fc3c89b-d1d7-a2c1-461b-1360c5207da0.png)

### 2.2.5 経験ベースのテストのマネジメント
![JSTQB AL TM (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/98f90b06-65a8-b8de-00de-0ce0d974bfc1.png)
![JSTQB AL TM (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/871baa56-9001-e978-8f97-80f5cbf535c7.png)
![JSTQB AL TM (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/e45ab8b5-4450-4b3c-f310-5498f0039e71.png)