OmniAICreator/Qiita-1.07M huggingface dataset:
【HTML/CSS】Chromeで二本指スワイプした際に起こる「戻る」「進む」を無効化する


# 横スクロールしたいだけなのに戻ろうとすな

横に長い、例えばスプレッドシートみたいなページを作っていて、ノートPCのChromeで見ていた際に**トラックパッドを使ってスクロールしながら閲覧する**と思います。
その際にちょっと操作を誤ると、いわゆるブラウザの**「戻る」「進む」**が**頻繫に実行されたりして**とても**鶏冠に来る**。

![chrome_swp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/8a8cc3c0-41d2-6c25-7d39-186e9f94d98b.gif)

↑これ

調べてみるとCSSで無効にできるらしい

# ソースコード
```css
html {
  overscroll-behavior-x: none;
}
```

これを対象のページに書くだけで簡単に無効化できた。すごい

# Chromeの設定で無効にする

`chrome://flags/#overscroll-history-navigation`

ブラウザ自体でこの機能を無効にする場合は↑のURLを張り付けて、「**Overscroll history navigation**」という項目を無効（`disabled`）に変更しChromeを再起動するといいみたいです。

![コメント 2020-08-21 005023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/a5c48e1c-d268-9b65-ea46-54bb8b2a8176.jpeg)


# 参考URL

- [javascript - Stop chrome back/forward two finger swipe - Stack Overflow](https://stackoverflow.com/questions/15829172/stop-chrome-back-forward-two-finger-swipe)
- [overscroll-behavior-x - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/overscroll-behavior-x)
python format関数で数値の書式指定メモ

pythonのformat関数のよく使う書式メモ。

```python
>>> # 引数の数だけ{}を書く
>>> print("{}{}".format(12, 34))
1234

>>> # 引数のインデックスを指定
>>> print("{1}:{0}".format(12, 34))
34:12

>>> # 桁数指定(空白で埋まる)
>>> print("{1:4}:{0:3}".format(12, 34))
  34: 12

>>> # 千の位にカンマ
>>> print("{:,}".format(123456789))
123,456,789

>>> # 桁数指定して右寄せ
>>> print("→{:>8}←".format(12))
→      12←

>>> # 桁数指定して左寄せ
>>> print("→{:<8}←".format(12))
→12      ←

>>> # 小数点桁数指定
>>> print("{:>.4f}".format(12.456))
12.4560

>>> # 全体の桁数と小数点以下の桁数指定
>>> print("→{:>8.4f}←".format(12.456))
→ 12.4560←

>>> # 桁数の埋める文字指定
>>> print("→{:!>8}←".format(12))
→!!!!!!12←
```
不要なログを削除

## IE キャッシュのクリア

* http://pcmemorin.blog.fc2.com/blog-entry-426.html?sp

```go
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255

「255」という数字はすべて削除
「（インターネット一時）ファイルの削除」（8）、
「Cookieの削除」（2）、
「履歴の削除」（1）、
「フォームの削除」（16）、
「パスワードの削除」（32）

個別に実行することも可能です。
```

* https://blog.goo.ne.jp/lunatic-sol/e/8a2df2a08234c9835c8d5362978c704e

```go
// タブを指定して開く場合 (一番左が0)
control.exe Inetcpl.cpl,,4
```

## イベントログ

```dosbatch
rem イベントログ停止
sc config eventlog start= disabled
shutdown /r

rem ログを削除
C:\Windows\System32\winevt\Logs\

rem イベントログ自動起動
sc config eventlog start= auto
```


## RDP

```vb:clean.bat
del /AH "%USERPROFILE%\Documents\Default.rdp"

del /AH "%OneDrive%\ドキュメント\Default.rdp"

reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /f

rem ついでにプログラムの実行履歴の削除したい場合は以下
rem reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" /f
```

* レジストリ : 下の青部分
* Default.rdp : 下の赤部分
* OneDriveインストール時はドキュメントに保存されるのでそれも削除対象。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/9c87e790-1bdc-5a61-bc66-3575452bbf6d.png)
ShareExtensionで画像データを取得する

ShareExtensionで画像を取得する方法です。

# 環境

macOS Catalina 10.15.6
Xcode 11.6

# 準備

## Target追加

XcodeのTargetsにShareExtensionを追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/2b6d7a86-0b8b-40e1-e1c3-d49e2399141e.png">  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/c65b3da3-d30c-14cf-8647-831eb9298d77.png">

## plist設定 

ShareExtensionのplistの以下を設定します。

NSExtension -> NSExtensionAttributes -> NSExtensionActivationRule -> NSExtensionActivationSupportsImageWithMaxCount

NSExtensionActivationSupportsImageWithMaxCountには共有できる画像の最大枚数を指定してください。

例) 最大20枚まで共有する場合

![スクリーンショット 2020-08-21 10.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/225fd114-dc62-3a8a-8f42-725f688d536a.png)

# 画像データ取得

共有するアイテムがPostされるとShareViewControllerの didSelectPost() が呼び出されるので、以下のようにして画像データを取得します。

``` ShareViewController.Swift
import MobileCoreServices // for kUTTypeImage

// 略

override func didSelectPost() {
    let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
    var count = 0

    // extensionItem.attachmentsにPostしたデータが入ってる
    for itemProvider in extensionItem.attachments! {
        // イメージでバリデーション
        if itemProvider.hasItemConformingToTypeIdentifier(String(kUTTypeImage)) {
            // アイテム読み込み
            itemProvider.loadItem(forTypeIdentifier: String(kUTTypeImage), options: nil) { (item, error) in
                if let url = item as? URL {
                    do {
                        // データ取る
                        let data = try Data(contentsOf: url)
                        
                        // メタデータが欲しい場合
                        let source = CGImageSourceCreateWithData((data as CFData), nil)
                        let metadata = CGImageSourceCopyProperties(source!, nil)
                        
                        // UIImagegが欲しい場合
                        let image = UIImage(data: data)
                        
                        // この後image使ってやりたい処理をする
                    } catch {
                        print(error)
                    }
                }

                count += 1
                if count == extensionItem.attachments?.count {
                    // 全ての処理が完了したら呼び出す
                    self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
                }
            }
        }
    }
}
```


# 参考

[Share Extensionでデータを共有する](https://qiita.com/KosukeQiita/items/994693da551a7101cc9c)
C#とKotlinとRustとJuliaとTypeScriptで作ったメール送信ツール

クオリティアの中の一人[大野さん](https://github.com/ykon)がいろんなプログラム言語で作ったメール送信ツールを紹介します。

EML形式のファイルをSMTPで送るプログラムで(DateとMessage-IDはオプションで更新できます) ポータブルにWindowsやLinux、Mac環境で動作します。EMLの中にUTF8違反文字が含まれている場合にも問題なく動作します。

このようなツールはどんなプログラム言語でも作れますが、最近流行りのRustやTypeScript、Juliaなどに気軽く触れられるので、好奇心のある方におすすめです。

## C#版

##### 実行環境 
- .NET Core 3.1 以上

##### ダウンロード
https://github.com/ykon/sendeml-cs

##### 実行方法
- Windows

```console
SendEML <setting_file>
```

- Others

```console 
dotnet SendEML.dll <setting_file>
```

## Kotlin版

##### 実行環境
- Java 8以上

##### ダウンロード
https://github.com/ykon/sendeml-kt

##### 実行方法

```console
java -jar SendEML.jar <setting_file>
```


## Rust版

##### 実行環境
- Rust 1.45.2以上

##### ダウンロード
https://github.com/ykon/sendeml-rs

##### 実行方法

```console
sendeml-rs <setting_file>
```

## Julia版
##### 実行環境
- Julia 1.5以上


##### ダウンロード
https://github.com/ykon/sendeml-jl


##### 実行方法
- Windows

```console 
julia --project .\src\SendEML.jl <setting_file>
```

- Others

```
julia --project ./src/SendEML.jl <setting_file>
```


## TypeScript版
##### 実行環境
- Deno 専用。Deno 1.3.0 以上


##### ダウンロード
https://github.com/ykon/sendeml-ts


##### 実行方法

```console 
deno run --allow-read --allow-net sendeml.ts <setting_file>
```


## 作者からのコメント : 各言語の特徴を一行で書いてみました

- C#: IDEが素晴らしいです。Pascal Caseがどうにも気に入りませんが、LINQは最高です。
- Kotlin: こちらもIDEが素晴らしいです。拡張ライブラリがなかなか使い勝手のいい言語です。
- Rust: 最高です。これ以上はないという完成された言語です。
- Julia: Indexが「1」からだったりと、なかなかクセのある言語です。
- TypeScript: 普通にシンプルで書きやすい言語です。


他の言語でも作って公開する予定ですので、その時またご紹介します。

以上。
[Unity初心者メモ] 別ファイルから呼び出した`\n`文字は自前で改行コードに置換が必要


Unity C#で
byteファイルから呼び出した改行コードは自前で改行コードに置換し直し必要

```c#
// ex. hoge："hoge\nfuga"
if (hoge.Contains("\\n"))
{
    hoge = hoge.text.Replace(@"\n", Environment.NewLine);
}
```

参考 https://teratail.com/questions/134632

スクリプトファイル上にかいた

```c#
string hoge = "hoge\nfuga";
```
は、コンパイル時に自動で改行コードとしてあつかってくれるが、
別から呼び出した `\n` は、 `\` と `n` という文字列として扱われるので

※小さいつまづきメモですが、
Unity C#初心者の自分には参考記事だけだとすぐには解決できなかったので明確なコードメモとしてあげてみました。
Amazon ECS Workshop #1 ~Introduction~ 

# はじめに
インフラ系エンジニア5年目です。
携わった開発の中でECS on Fargateの構成でバッチ系の処理を動かしたことがありますが、新たにオンライン処理をECS on Fargateで動かしてみようと考えており、改めてAWSのWorkshopを参考に理解を深めようと下記のシリーズ建てでまとめていこうと思います。（あくまで参考です！）

### ◆投稿予定（適宜変更します）◆
 - #1 Introduction　　★本投稿
 - #2 [コンテナのデプロイ](https://qiita.com/itoumke/items/1755e6bcef0d76dff65b)
 - #3 [コンテナのモニタリング](https://qiita.com/itoumke/items/2ed9b6a4faf1440712ca)
 - #4 コンテナのスケーリング
 - #5 コンテナのB/Gリリース

参考ページリンク：https://ecsworkshop.com/

# Introduction
本投稿はまずIntroductionを整理します。
コンテナって何？何がいいの？というビギナーレベルの方向けの情報になっているため、不要な人は読み飛ばし、#2 コンテナのデプロイ編をご覧ください。
中身は下記公式ページの意訳＋個人の所感になっています。
https://ecsworkshop.com/introduction/

## コンテナとは？
コンテナイメージはアプリケーションのコード、Configなどをパッケージ化されたイメージとなります。
上記のイメージをOS上でリソースが分離されたプロセスとして、実行させることが可能なため、実行環境に依存せず、迅速で信頼性/一貫性の高い、デプロイが可能となる点がコンテナの強みです。

## Dockerとは？
コンテナ技術に触れる上でDockerは避けては通れません。
Dockerは前述したイメージのパッケージ化やそのイメージをデプロイするなど、コンテナ技術に関するプラットフォームになっています。
Dockerエンジンがインストールされていれば、Linux/Windows/macOSなどOSに依存することなく、イメージにパッケージされたアプリケーションの動作が保証されます。

# ECS概要
コンテナが一般的に利用されるにつれて、コンテナのバージョニング管理やコンテナスケーリングのスケジュールといった新たな課題が発生してきました。
これらを解決するツールがコンテナオーケストレーションサービスと呼ばれる分野でKubernatesなどが代表的なサービスです。
ECSはAWSが提供するスケーラビリティが高いコンテナオーケストレーションサービスです。
以下にECSを構成するコンポーネントに関する概要を説明します。

## Cluster
Clusterはタスクまたはサービスと呼ばれるコンテナで実行されるAP群の論理グループとなります。

タスクまたはサービスを実行する際に、EC2起動タイプを選択した場合、クラスターはコンテナ実行するEC2のインスタンスのグループと同義になります。
Capacity providers起動タイプを選択するCapacitiy providers（=EC2のAutoScalingGroupと紐づけ可能）の論理グループ名になります。

Clusterはアカウント内に複数作成することでAP機能群ごとにリソースを分離することが可能です。（分離することでリソース使用の最適化は困難となるためコストとのトレードオフです。）

## Task Definitions
タスク定義（=Task Definitions）はJSON形式のコンテナ起動に関する定義です。
下記のようなパラメータについて定義します。

 - 起動するコンテナイメージ（1つ以上最大10個まで定義可能）
 - 起動タイプ（EC2/Fargateなど）
 - 利用するポート
 - コンテナが使用するボリューム
 
詳細は下記を参照してください。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html

## Tasks and Scheduling
タスクとはタスク定義のインスタンス化したものです。
タスク定義と同義である認識で問題ないと思います。
実際にはタスク実行時には、どのタスク定義を何個起動する（サブネットやSecurityGroupの指定も可能）のかなどを指定します。

起動するコンテナの数はECSタスクスケジューラで高度に管理できます。
維持するタスク数や新たにコンテナ起動する際の間隔などを定義しておくことで、スケールアウト時の挙動をコントロールできます。
AutoScalingGroupのスケジュール定義を触ったことある方は理解しやすいと思います。

## Services
Servicesを利用することでタスクの同時起動や起動数の維持を定義することが可能です。
何かしらの理由でタスク起動に失敗、もしくは停止してしまった場合、スケジューラ定義に応じて、Servicesで定義されたタスクの必要数を維持します。

Serviceのスケジュール戦略として2種類が準備されている。

 - レプリカタイプ  
クラスターに必要な数のタスクを配置、維持します。通常の業務機能はこちらのタイプを選択すればよいかと思います
 - デーモンタイプ  
コンテナがデプロイされるEC2インスタンス1つにつき、1タスクが起動されます。ロギング、モニタリング、またはアプリケーションコードを実行するタスクのバックアップのような共通サポート機能を付与するために利用される。Fargateでは利用できないことに注意してください。

## Fargate
Fargateはコンテナ実行環境のフルマネージドサービスです。
利用することでEC2やクラスターの管理から解放されます。

## Service Discovery
コンテナはイミュータブルなものであり、機能追加/改修時には新しいバージョンのコンテナで置き換えることが基本となります。
そのため、古いバージョンで起動しているコンテナの検出する技術が必要となります。
AWSではCloud MapというサービスがECSに統合されて提供されています。
NoMethodError undefined method `name' for nil:NilClass

#NoMethodError undefined method `name' for nil:NilClass

なぜかNoMethodErrorが出た。
データもあって、modelのリレーションも書いてrails cでは、問題なく稼働していたのに、、、

```users_controller.rb
class UsersController < ApplicationController
  def index
    @user = User.all
    @group = Group.all
  end
end
```

```index.html.erb
<h1>Users#index</h1>
<p>Find me in app/views/users/index.html.erb</p
<div>
  <% @user.each do |user| %>
    <p>
      <p>name: <%= user.name %></p>
      <p>email: <%= user.email %></p>
      <p>group: <%= user.groups.name %></p>
      <p><%= user.account.name %></p>
    </p>
  <% end %>
```

index.htmlの<%= user.account.name %>の部分で、エラーが出てました。

自分の場合は、User.allで全てのユーザーを取っていて、accountを持っていないユーザーがいたため、エラーが出てました。

そのため、index.htmlの<%= user.account.name %>の部分を
<p><%= user.account.name if user.account %></p>
と、したところ、問題なく稼働しました。


参照
https://stackoverflow.com/questions/21101466/nomethoderror-undefined-method-name-for-nilnilclass
[メモ] React で amCharts を使用するフック

# [メモ] amCharts を使用するフック

amCharts を React で使用するフックです。

[Using React - amCharts 4 Documentation](https://www.amcharts.com/docs/v4/getting-started/integrations/using-react/)

```ts:useAmChart
import { SerialChart } from '@amcharts/amcharts4/.internal/charts/types/SerialChart';
import * as am4core from '@amcharts/amcharts4/core';
import am4themes_animated from '@amcharts/amcharts4/themes/animated';
import { RefObject, useEffect, useState } from 'react';

am4core.useTheme(am4themes_animated);

/**
 * amCharts を指定した `elementRef` に適用するフック
 * @param elementRef チャートを紐づける要素の `ref` (とりあえず `div`)
 * @param classType `@amcharts/amcharts4/charts` に定義されているチャートのタイプ
 */
const useAmChart = <T extends SerialChart>(
  elementRef: RefObject<HTMLDivElement> | null,
  classType: new () => T
): T | null => {
  // am4core.create の戻り値を格納する変数
  const [chart, setChart] = useState<T | null>(null);
  useEffect(() => {
    // componentWillUnmount と同様に実行させる dispose
    return () => {
      chart && chart.dispose();
    };
  }, []);
  // elementRef の値に基づいて am4core.create の実行と chart への格納
  useEffect(() => {
    const element = elementRef?.current;
    if (element) {
      setChart(am4core.create(element, classType));
    }
  }, [elementRef]);
  return chart;
};

export default useAmChart;
```

[CodeSandbox での実例](https://codesandbox.io/s/react-amcharts-hook-806v0)

```ts
import React, { useRef, useEffect } from "react";
import useAmChart from "./hooks/useAmChart";

export default function App() {
  // 表示対象向けの ref
  const chartRef = useRef<HTMLDivElement>(null);
  // useAmChart を適用
  const chart = useAmChart(chartRef, am4charts.XYChart);

  // チャートへのデータ反映など
  useEffect(() => {
    if (chart) {
      chart.paddingRight = 20;

      const data = [];
    ・・・
  })

  return (
    ・・・
      // 表示対象の要素の ref に chartRef を指定
      <div ref={chartRef} style={{ width: "100%", height: "500px" }}></div>
    ・・・
  );
}
```
Android Q/API 29以上でViewのキャプチャを保存する



```kotlin
val contentValues = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "view.png")
    put(MediaStore.Images.Media.MIME_TYPE, "image/png")
    put(MediaStore.Images.Media.IS_PENDING, "1")
}

val contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI

contentResolver.run {
    insert(contentUri, contentValues)?.let{ uri ->
       openOutputStream(uri)?.let{ stream ->
           val view = findViewById<View>(R.id.some_view)
           view.drawToBitmap().compress(Bitmap.CompressFormat.PNG, 100, stream )
           stream.close()

           contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0)
           update( uri, contentValues, null, null)
       }
   }
}
```

View のビットマップを取得するには [Android KTX](https://developer.android.com/kotlin/ktx?hl=ja) coreの `drawToBitmap()` メソッドを使う。
API 28から `getDrawingCache()` は非推奨となっている

`MediaStore` クラスで外部ストレージのURIを取得する。
`MediaStore` クラスを利用すると権限の認証は不要。
外部ストレージURIとファイルのMimeTypeを指定し `contentResolver` でインサートする。
`contentResolver`オブジェクトはコンテンツプロバイダとの仲介を行ってくれる。Androidのコンテンツプロバイダ APIはファイル情報などをDBで保持している（おそらくSQLite3）
保存するファイル情報のインサートが成功すれば、保存先URIが返ってくる。
URIは `content://media/external/images/media/1` のような形式。

ストレージへのファイルの書込はURIに対し `openOutPutStream` オブジェクトが行う。
書込後にファイル情報DBをアップデートすることで、Photoアプリなど他のアプリで即座に画像を表示できる。

ファイル名が被ったら末尾に連番が入る。
上記の書き方だと、成功・失敗のメッセージもなくPictureフォルダにPNGファイルが保存されるのみ。
ただし、Android Q 未満は `MediaStore` を使えないので、Android P以下にも対応するには参考としたStack Overflowの回答のようにバージョン毎に処理を変える必要がある。

## 参考サイト
[【Android】Viewのスクリーンショットを撮影してギャラリーアプリで見れるようにする - Qiita](https://qiita.com/umechanhika/items/9a01e29bfb5be0b15eb7)
最終的にこの記事のコードとちょっと違うだけになりました。
[\[Android\] view.getDrawingCache()がDeprecatedになったのでPixelCopyでスクリーンキャプチャを撮る | Android開発知識ゼロ人間の生活](https://friegen.xyz/getdrawingcache-deprecated/)
[java - How to save an image in Android Q using MediaStore? - Stack Overflow](https://stackoverflow.com/questions/56904485/how-to-save-an-image-in-android-q-using-mediastore/)
[アンドロイド - MediaStoreにメディアファイルを保存する方法](https://codechacha.com/ja/android-mediastore-insert-media-files/)

## 公式リファレンス
[View.getDrawingCache() | Android Developers](https://developer.android.com/reference/android/view/View.html#getDrawingCache())
[コンテンツ プロバイダの基本 | Android Developers](https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ja)

## 参考にしたが使わなかった情報
Canvasを利用して、Viewのビットマップを取得するコードが掲載されている。
[「Android」Viewの内容をBitmapの保存方法 | | 最新IT技術情報_arkgame.com](http://arkgame.com/?p=37064)
コードレビュー観点

***※どんどん書き足す予定***

# コーディング規約をよく確認し守ること

まず最低限これ！

* これが守られていないと、他の開発者はもちろん自分でも処理の流れを把握しづらくなる

### 命名ルール(一例だけ)

|対象|ルール|備考|
|---|---|---|
|変数名|先頭小文字で|初学者はよく大文字にしたりするので気を付けること|
|定数名|全部大文字、単語は"_"区切り|初学者はよく変数名と同じ命名をするので注意|

# 命名（変数とメソッド）

* 変数は"名詞"の名前をつけること
* メソッドは"動詞"の名前をつけること

### 変数名やは用途がわかりやすいように命名すること

* 一文字だけの変数名は極力使わない
  * ループ処理のiなど定番のものはOK
* 略称は使ってもいいけど、ぱっと見わからないものは非推奨

### 定数はカテゴリや項目や区分がわかるようにする

```python
# これだとどの項目で使えるのかわからない
JAPAN = 'JA'
KOREA = 'KR'

TODO = '1'
DOING = '2'
DONE = '3'

# 冗長にはなるが前に項目名やカテゴリ名をつけることで利用用途が明確になる
COUNTRY_CODE_JAPAN = 'JA'
COUNTRY_CODE_KOREA = 'KR'

TASK_STATUS_TODO = '1'
TASK_STATUS_DOING = '2'
TASK_STATUS_DONE = '3'

# enumを使うのもあり
class Country(Enum):
    JAPAN = 'JA'
    KOREA = 'KR'
    USA = 'US'
class TaskStatus(Enum):
    TODO = '1'
    DOING = '2'
    DONE = '3'
```

# ネストが深くなりすぎないようにする

### 3階層まではOK 4階層以上はNG

* 人が瞬間的に記憶できる数は4±1(電話番号も4桁区切り)
* 4階層以上になるとぱっと見複雑と感じてしまう
* その場合もループは2階層までとする。ループが3階層だと複雑

```python:これぐらいならOK
for ...
  for ...
    if ...
```

# DRY(Don’t Repeat Your Self)原則

* 同じコードはなるべく避ける
* ただし、コードの再利用のために複雑になってはいけない
  * いろんなところで使えるようにif文だらけにならないように注意
matplotlib のまとめ　軸幅　軸間隔　斜めラベル　

[matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)の「よく考えたら自分が普段使うようなメソッドなんて限られているじゃないか。もう自分でまとめるわ。自分のために。」に共感しました。そこで、私のmatplotlibのまとめです。

#ソース
```python
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

#テスト用のデータの定義
dt={
       "y": [1 , 2 , 3 ,4 ,5 ,6 ,7 ,8 ,15 , 25 ]  ,
      "x1": [10,20,30,40,50,60,70,80,90,80 ] , 
      "x2": [105,205,305,405,505,pd.np.NAN, 705,805,905,905 ] 
      }
df=pd.DataFrame(dt)

print(df)

#大きさ(figsize)が(10,5)の画用紙に上下に3つのグラフを書く
#sharex="col" x軸を共有する。
fig ,ax = plt.subplots(3 , 1, sharex="col", figsize=(10,5) )


#３つのグラフを書く
ax[0].plot(df["y"] , df["x1"], "*-" ,label="x1")
ax[1].plot(df["y"] , df["x2"], "*-" ,label="x2")
ax[2].plot(df["y"] , df["x2"], "*-" ,label="x2")


#y軸の描画範囲の調整
ax[2].set_ylim([500,800])

#y軸目盛間隔を調整
start, end = ax[2].get_ylim()
stepsize=25
ax[2].yaxis.set_ticks(pd.np.arange(start, end, stepsize))


#タイトルを書く
ax[2].set_title("set_title")

#x軸のラベルを書く
ax[2].set_xlabel("set_xlabel")

#凡例の位置
ax[2].legend(loc='upper right' )

#グリッドの表示
ax[2].grid(True)

#x軸のラベル文字の角度をつける
plt.setp(ax[2].get_xticklabels(), rotation=60, ha="right")



#画面表示
plt.show()

#ファイルへ書込み
plt.savefig("out.png")


```
#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468328/12eedab0-485c-a410-f76d-0488cc898d8c.png)

#参考
[matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)
VoiceMeeterを使用中にdiscordでマイクの音が割れる問題の解決法

# VoiceMeeterとは
[VoiceMeeter](https://www.vb-audio.com/Voicemeeter/)とは，windowsにつながった音声デバイスをルーティングしてくれるミキサーソフトである．
使用しているPCのスペックによって，
VoiceMeeter, VoiceMeeter Banana, VoiceMeeter Potatoという3段階があり，後ろの方が高級で処理が重いソフトウェアである．


# discordとは
[discord](https://discord.com/)とは，ゲームのためのチャットツールを起源とする主に音声ベースのチャットツールである．


# discordの設定でVoiceMeeter Outputを選択すると音が割れる問題
2つのマイクを使いたいなどの理由で，マイクをVoiceMeeterのB1というラインのVirtual Outputに流している状況において，discordが音割れする問題がある
## 音割れ問題を起こすには
![スクリーンショット 2020-08-21 130556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446002/a929f883-90b3-bd2e-3128-d94b7f0d86dd.jpeg)

VoiceMeeterの設定でマイクの音をB1に流すようにしたうえでdiscordの音声設定を画像のように設定すると，音が割れてしまう．

## 音割れの原因，直し方
いろいろ試した感覚だが，マイクはモノラルなのに出力がステレオになっていることが主な問題のようである．
### 直し方1
VoiceMeeterの画面上で，すべてのモノラルマイク入力のmonoをクリックする．
ステレオマイク入力はそのままでよい．
![スクリーンショット 2020-08-21 131827.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446002/d20a01f9-7641-4964-fd7e-8529f41af53b.jpeg)



### 直し方2 (直し方1をした場合，この設定は行う必要はない)
windowsのサウンド->録音タブ->VoiceMeeter Outputを右クリック->プロパティ->詳細->既定の形式
を，2チャネル->1チャネルにする．
![スクリーンショット 2020-08-21 131019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446002/574bae62-7960-8799-a52f-6b83433a04ac.jpeg)
【無料SSL化】EC2でLet's EncryptのSSLサーバ証明書を取得する。再取得の自動化も

### やる事
Apacheで運用しているWebサイトに無料のLet's EncryptのSSLサーバ証明書を導入してWebサイトをSSL化（https://~）する。

### 環境
・AWS ec2(Amazon Linux2)
・Apache2.4

### 参考

・[Let’s Encrypt](https://letsencrypt.org/ja/)
・[Let’s EncryptにSSL証明書の取得の申請し、ウェブサイトをSSL化する【無料で初めてのhttps】](https://it-jog.com/khow/serv/sslbyletsencrypt)

### すでにやってある事と想定
・ec2にウェブサーバApacheはインストール済み、独自ドメインは取得済み、DNSのAレコードは設定済みで、「http\://(独自ドメイン)」にアクセスできる状態。
・epelインストール済み
・ELBやACMは使わない。1つのec2での運用を想定。


### Let's EncryptのSSL証明書を初めて取得する

Apacheの拡張モジュールmod_sslをインストールする。自分の環境ではopensslは最初から入っていたけど、opensslがないならインストールも必要だと思います。

```
$ sudo yum -y install mod_ssl
```

続いて、Let's EncryptのSSL証明書を取得するためにcertbotをインストールする。

```
$ sudo yum -y install certbot
```

そして、Let's EncryptのSSL証明書等を取得します。
ここでは、(独自ドメイン)と`(www.独自ドメイン)`をSSL化して、https://(独自ドメイン)と`https://(www.独自ドメイン)`でアクセスできるようにします。
あと、下のコマンドはApacheは起動したままだとエラーが出たので、停止してから実行しました。

```
$ sudo certbot certonly --standalone -d (独自ドメイン) -d (www.独自ドメイン) -m (EMAIL)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Waiting for verification...
Cleaning up challenges
〜
```

これで問題なくできていれば、SSLサーバ証明書（中間証明書込み）と秘密鍵が以下のパスに生成される（下のパスはシンボリックリンク）。

```
#SSLサーバ証明書（中間証明書込み）、
/etc/letsencrypt/live/(独自ドメイン)/fullchain.pem
#秘密鍵
/etc/letsencrypt/live/(独自ドメイン)/privkey.pem
```

続いて、取得したSSLサーバ証明書と秘密鍵をApacheに導入するためにssl.confファイルを編集します。編集箇所は２箇所です。
`SSLCertificateFile /etc/pki/tls/certs/localhost.crt`と`SSLCertificateKeyFile /etc/pki/tls/private/localhost.key`の2行をコメントアウトし、取得したSSLサーバ証明書と秘密鍵のパスを新しく指定します。

```/etc/httpd/conf.d/ssl.conf
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/letsencrypt/live/(独自ドメイン)/fullchain.pem

#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/letsencrypt/live/(独自ドメイン)/privkey.pem
```

以上で終了ですので、Apacheを起動します。
アクセスするとブラウザのURLの左に鍵アイコンができていて、証明書を見るとLet's Encryptとなっていました。

### Let's EncryptのSSL証明書の更新（再取得）をcronで自動化（２回目以降）

#### 参考

・[Let’s EncryptのSSL証明書を更新する(手動とcronによる自動更新)](https://it-jog.com/khow/serv/renewletsencrypt)


Let's EncryptのSSL証明書の有効期限は３ヶ月なので、有効期限が切れる前にSSL証明書を取得し直す必要があります。

ただSSL証明書の再取得を手作業でするのは面倒、SSL証明書の更新処理は自動化したいので、cronで設定する。

```
$ crontab -l
5 5 2,17 * * sudo certbot renew --pre-hook "systemctl stop httpd" --post-hook "systemctl start httpd"
```

月２回（２日と１７日）、５時５分に実行するようにしています。
月２回実行しているのは、更新処理を失敗したときなどを考えて余裕を持つためです。
Let's EncryptのSSL証明書の再取得は、証明書の有効期限が１ヶ月を切らないとできません。1ヶ月以上ある時に取得処理を申請しても証明書の取得処理がスルーされるだけ。

あと、上のコマンドでは、--pre-hookでApacheを停止してからcertbot renewコマンドを実行して、--post-hookでApahceを起動しなおしています。

これで設定は完了です。あとは実際にcronが実行してくれて、SSL証明書を再取得してくれることを祈るのみです。
【Rails】Herokuでmaster.keyを設定する

credentialsファイルからシークレットキーなどを読み込むような設定にしている場合、サーバー側にmaster.keyの情報を渡しておく必要があります。

Herokuでは以下のコマンドだけで設定できます。

```:ターミナル
$ heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

デプロイするときにcredentials関係でエラーになった場合はマスターキーの確認をしてみてください。
react,nextjs練習ページ一覧

ここでは環境構築と実装まで練習したことを載せていきます。
練習記事一覧ページとして使用します。

#使用エディタ
Phpstorm

#記事一覧

**Next.js練習環境構築{Phpstorm}**
[Next.js練習環境構築{Phpstorm}](https://qiita.com/asa012/items/d887f6dbf9625195580d)


**ローカルリポジトリをリモートへ【github】**
[ローカルリポジトリをリモートへ【github】](https://qiita.com/asa012/items/d9a102a52dfe972f4727)

**next.jsでのページ遷移**
[next.jsでのページ遷移](https://qiita.com/asa012/items/1822699aa4ef7bd4c9bd)

**ページ遷移とmap関数の応用【next.js】**
[ページ遷移とmap関数の応用【next.js】](https://qiita.com/asa012/items/16e67acee3a5d2e3e79a)
OCI Foundations 2020 Associate(1Z0-1085-20) に合格したので受講手順と勉強方法をメモしておく。(Oracle Cloud Infrastructure)

Oracle Cloud Infrastructure(OCI) Foundations 2020 Associate(1Z0-1085-20) に合格したで！彡(^)(^)
合格した勢いで受講手順と勉強方法をメモしときます。

# 1. Oracle Cloud Infrastructure の Learning Subscription を申込 (※Learning は無料)

まず下記リンクから Learning Subscription を申し込みます。Learning Subscription は無料です。

> Oracle Cloud Infrastructure Learning Subscription
> https://learn.oracle.com/ols/home/35644

Larning Path がいっぱい出て来ますが、下記の Understand OCI Foundations を選択します。

> Understand OCI Foundations
> https://learn.oracle.com/ols/learning-path/understand-oci-foundations/35644/75258
![01_LearningPath.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/e8920f6e-a6d5-4b1a-2604-3217cf2d6f93.jpeg)

申込には Oracle.comプロファイル が必要なので、持っていない方は作成しておいて下さい。

> Oracle.comプロファイル(MyProfile)の作成方法を教えてください。
> https://faq.oracle.co.jp/app/answers/detail/a_id/2811/~/oracle.com%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%28myprofile%29%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82

# 2. Understand OCI Foundations の コンテンツを受講

Understand OCI Foundations のコンテンツ(動画、模擬問題、PDFファイルなど)を受講(視聴)していきます。
![02_Contents_OCI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/a03d9444-5ebd-ebf7-565d-1c5092c21418.jpeg)

ワイ氏は以下の順番で受講。模擬問題で試験の感覚を掴んでから、動画に臨みました。彡(ﾟ)(ﾟ)

> 1. Practice Exam For: OCI Foundations 2020 Associate Certification
> 2. Practice Exam For: OCI Foundations 2020 Associate Certification ※復習
> 3. Oracle Cloud Infrastructure Foundations の動画(3h 55m の方) をメモ＆シャドーイングしなから
> 4. Practice Exam For: OCI Foundations 2020 Associate Certification ※復習
> 5. Prepare for OCI Foundations 2020 Associate Certification の動画(1h 58m の方) を、先の動画と重複してるとこはすっ飛ばしつつ、メモしながら
> 6. 試験前日寝る前に Practice Exam
> 7. 試験当日起きた後に Practice Exam

# 3. 試験申し込み(ピアソン)

コンテンツの受講率が一定を超えると Understand OCI Foundations の Certificationリンク から 該当試験(1Z0-1085-20)を申込できます。ピアソンのサイトに飛ばされて、そこから該当試験を申込(購入)します。

オンラインと会場受験を選べますが、オンライン受験はクリアデスクやクリアルームの確認が有ると聞いたので、どちらも自信が無いワイ氏は会場受験を選択彡(ﾟ)(ﾟ)

人間は〆切りが有った方が進捗が捗るらしいので、受験申込してから勉強するのもアリ。
ワイはコンテンツ類を早送りで100%にして、受験申込を先にやりました。

# 4. 会場で受験

会場を訪問して受験します。注意事項としては身分証明書が「2つ」必要だということです。
免許証、パスポート、保険証などを複数準備しておきましょう。詳しくはピアソン様から送られてくるメールを参照


# 5. 結果
![03_Result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/e240a06f-0e44-aa03-36a9-65b5a17f9b17.jpeg)

合格や！彡(^)(^) 以下に所感を書いておきます。

> ・ひねった問題は少なかった。
> ・動画からだいたい満遍なく出題された。可用性廻り(Region, AD, FD)の設問が多かったかも。
> ・時間は余裕だった。55問105分だけど45分で2周できた。
> ・焦ってやるより、問題文や選択肢をじっくり読む方が良いと思う。

# 6. まとめ

Oracle Cloud(OCI)試験の入り口とあって、難易度は易しめだとは思います。
OCI の基礎知識の習得のために、ご活用くださいね。彡(^)(^)
JavaでCSV読み込み (Super CSV Annotation)

Super CSV Annotationを使う
https://mygreen.github.io/super-csv-annotation/project-info.html

EclipseでMavenプロジェクトを新規作成、Javaのバージョンは1.8

```pom.xml
	<dependencies>
		<dependency>
			<groupId>com.github.mygreen</groupId>
			<artifactId>super-csv-annotation</artifactId>
			<version>2.3</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.26</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>2.0.6</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>2.0.6</version>
		</dependency>
	</dependencies>
```

```XXXCsvBean.java
import com.github.mygreen.supercsv.annotation.CsvBean;
import com.github.mygreen.supercsv.annotation.CsvColumn;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@CsvBean
@NoArgsConstructor
@AllArgsConstructor
@Data
public class XXXCsvBean {
    @CsvColumn(number = 1)
    private String user;

    @CsvColumn(number = 2)
    private String email;
}
```

```XXX.java
                try (CsvAnnotationBeanReader<XXXCsvBean> csvReader = getCsvReader(inputStream /* 標準入力ならSystem.in */)) {
                    csvReader.getHeader(true); // ヘッダ行スキップ
                    XXXCsvBean readRecord;
                    while ((readRecord = csvReader.read()) != null) { // Windowsの標準入力ならCTRL+ZでEOFを入力するまで
                        String user = readRecord.getUser();
                        // do something
                    }
                }

--

    private CsvAnnotationBeanReader<XXXCsvBean> getCsvReader(InputStream inputStream) {
        return new CsvAnnotationBeanReader<>(XXXCsvBean.class,
                new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)), // Windowsの標準入力ならキャラセット指定なし
                CsvPreference.STANDARD_PREFERENCE); // TSVならTAB_PREFERENCE
    }
```
[Python] ファイルの文字コードを取得する

３．ファイルを読み込むときの文字コードを取得するモヂュール

・ファイル読込時に毎回文字コードを調べて設定するのは面倒なので、自動で取得するためのモヂュールを作成しました。
・特にエクセルで作成された日本語を含むcsvファイルを取り込む際に重宝しています。
・ネット上のファイルの取り込みにも対応しています。
・戻り値をopen時にencodingに設定することで、今のところ問題なく動いています。

    def check_encoding(file_path):
        '''ファイルの文字コードを取得する'''
        from chardet.universaldetector import UniversalDetector
        import requests
    
        detector = UniversalDetector()

        if file_path[:4] == 'http':
            r = requests.get(file_path)
            for binary in r:
                detector.feed(binary)
                if detector.done:
                    break
            detector.close()

        else:
            with open(file_path, mode='rb') as f:
                for binary in f:
                    detector.feed(binary)
                    if detector.done:
                        break
            detector.close()

        print("  ", detector.result, end=' => ')
        print(detector.result['encoding'], end='\n')

        return detector.result['encoding']

・日本語を含むcsvはShift_JISが多いようで、次のモヂュールでさらに汎用的なcp932に変換すると良いようです。
・最初のモヂュールで得られた戻り値を引数に入れることで、最適な文字コード名が戻り値として得られます。

    def change_encoding(encoding):
        '''encodingのsjis関係をcp932に変換する'''
        if encoding in ['Shift_JIS', 'SHIFT_JIS', 'shift_jis', 'sjis', 's_jis']:
            encoding = 'cp932'

        return encoding

監修、よろしくお願いします。
Rubyのメタクラスってなんだ？

# はじめに
Rubyのメタクラスについて本質的な解説をしている人がいなかったので自分なりに解説してみました。

※前提として特異メソッド/特異クラスを多少知っている人向けです

# Classクラスについて
Rubyにおいて”クラス”はClassクラスのインスタンスであるというのは、ある程度Rubyをかじったことがある人ならば聞いたことがあると思われる。
その通り、RubyにはClassクラスがあり、それをインスタンス化してクラスを定義することが可能である。
以下の２つは同義である。

```ruby

class Hoge; end
Hoge = Class.new
```

# メタクラスとは
一方で、Classクラスの特異メソッドnewについて[リファレンス](https://docs.ruby-lang.org/ja/latest/class/Class.html#S_NEW)を読んでみると以下のような記述がある。

>新しく名前の付いていない superclass のサブクラスを生成します。
>名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。

**「名前の付いていない superclass のサブクラスを生成します」**
そう、Class.newによって生成されるオブジェクト自体は無名のクラスなのである。

```ruby

a = Class.new
p a.name #=> nil
```
実はこれがメタクラスに該当する。
メタクラスは名前を持たないため、クラスでありながら定数ではなく変数に保持される。
また、メタクラスは定数に代入すると、定数名をクラス名としてメタクラスを参照することが可能である。

```ruby

a = Class.new
Hoge = a
p a.name #=> "Hoge"
p Hoge.name #=> "Hoge"
```
つまりHogeクラスはClassクラスから直接生成されるオブジェクトではなく、あくまでメタクラスを参照しているだけである。

# メタクラスとクラスメソッド
メタクラスに特異メソッドを定義すると、Hogeクラスの静的メソッドのように振る舞わせることができる。

```ruby

a = Class.new
Hoge = a

def a.hello
   puts "hello"
end

a.hello #=> "hello"
Hoge.hello #=> "hello"
hoge = Hoge.new
hoge.hello #=> NoMethodError
```

ちなみにこれがRubyのクラスメソッドと呼ばれる物の正体である。
クラスメソッドの定義方法として使われる特異クラスを開く方法は、つまるところメタクラスにメソッドを追加しているわけである。

```ruby

class Hoge
   class << self #Hogeクラス自身の特異クラスを開く
      def hello
         puts "hello"
      end
   end
end

Hoge.hello #=> "hello"
```

# 最後に
メタクラスはユーザーに意識させたくないクラスらしく、ぶっちゃけリファレンスによるとたいして重要なことでもないみたいです。
ただ、メタクラスがよくわからずモヤモヤしている人や本質的な部分の理解を深めたい人の一助となっていただければ幸いです。
AWS CLIコマンド備忘録

よく使うAWS CLIコマンドの備忘録です

# S3

### 指定したキーワードのファイルをS3バケットから削除
```
$ aws s3 ls s3://<BUCKET NAME> --recursive | grep -v '/$' | awk '{print $4}' | grep <SEARCH_KEYWORD> | awk {'print "aws s3 rm s3://<BUCKET NAME>/" $1'}| bash
```
Mysqlにデータを突っ込もうとするとエラーになる

#自分用メモ
DBに今あるTableを削除してMysqlWorkbenchからデータを突っ込もうとするとエラーになった。

##エラー内容
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL

##解決方法
```
SET SQL_SAFE_UPDATES = 0;
ALTER TABLE `tablename` auto_increment = 1;
```
一時的にSAFE_UPDATEを無効にして、オートインクリメントを初期化する。
開発TIPSメモ

## READMEにテストの実行方法が書いていないとき
CIの設定ファイルを確認する

## たまに落ちるCIの再現
該当のテストをローカルで100回ループしてみる


## ランダム文字列を生成したい
どの言語でもデファクトスタンダードとなっているUUIDライブラリが存在するはずなので自作しないようにする

## 思いついたら追記していく
【Ruby】なんでnewする時とかのハッシュには{}がないの？

###概要

[【よくわかる】Rubyにおけるハッシュと配列の違い](【よくわかる】Rubyにおけるハッシュと配列の違い)
こちらの記事で僕はハッシュには`{}`が使われていると書いていますが
ない時あるやん、、、って思ったので軽く書きます

例) 

```rb
user = User.new(first_name: yusuke,last_name: onishi)
```

###何故？

Rubyは引数リストの最後がHashリテラルの場合は`{}`を省略できるそうです！

つまり、、、

```rb
user = User.new(first_name: yusuke,last_name: onishi)
#↑↓は等価のコードです！
user = User.new({first_name: yusuke,last_name: onishi})
```

という事みたいです！それでは〜
【GCP】シンプルにBeyondCorp Remote Accessだけを実現したいなら、IAPしかいらなかった件

いろいろ調べたり、聞いたりした結果、BCRAはタイトルのとおりでした。
なので、IAPの実装の仕方をここにまとめました。

#【想定しているケース】
以下の機能を実現したいお客様を想定しています。
1.BeyondCorp Remote Access を介して、GCE上のwebアプリにアクセスする。
2.同じドメインのアカウントのみアクセスする。

#【実現するために必要な機能】
・IAP

#【BeyondCorp Remote Accessに関するGoogleドキュメント】
https://cloud.google.com/solutions/beyondcorp-remote-access

#【BeyondCorp Remote Access構築の際に参考にしたサイトのURL】
https://blog.cloudnative.co.jp/2293/

#【実装手順】
1.任意のプロジェクトを作成します。
2.作成したプロジェクトにGCEでテスト用webアプリを作成します。	
※GCP管理コンソールの右上にある？からチュートリアルを開くことで、GCEのテスト環境を構築する手順が表示可能です。
3.IAPを設定します。
ハンバーガーメニュー＞セキュリティ＞Identity-Aware Proxyをクリック
Identity-Aware ProxyのAPIを有効にします。（すでに有効になっていたら不要です）
OAuthの設定が必要になるため、「同意画面を構成」をクリック。（すでに有効になっていたら不要です）
user typeで内部を選択。（こうすることで同じドメイン内のユーザーがアクセスできるようになります。gmail.comアカウントですと、外部しか選べません。）
表示された画面の「アプリケーション名」に作成したアプリケーションの名称を入力し、保存をクリックします。（アプリケーション名は任意のもので問題ないはずです。）
IAPの画面に遷移されます。
ステータスがエラーとなっていますが、IAP列にあるスイッチをONにすることで、エラーも消えます。
GCEアプリケーションと記載されている行のチェックボックスにチェックをいれます。
画面右側にメンバーの追加画面が表示されます。
メンバーを追加をクリックし、追加したいアカウントを入力。
権限を「「Cloud IAP - IAP-secured Web App User」として保存をクリック。（保存後、少し時間がかかることがあります。）
4.IAPの動作を確認します。
作成したGCEのIPアドレスにアクセス。
Googleの認証画面が表示されるので、メンバーに追加したアカウントでログインします。
GCEに構築したテストアプリの画面が表示されれば、完了しています。
他のアカウントでログインしたり、IAPのユーザーを変更して、GCEに構築したテストアプリに接続した際、エラーになります。
5.GCEの削除
料金が発生してしまいますので、テストが完了したら作成したGCEは削除してください。
FineGAN: Unsupervised Hierarchical Disentanglement for Fine-Grained Object Generation and Discovery のメモ

- Krishna Kumar Singh∗ Utkarsh Ojha∗ Yong Jae Lee
- https://arxiv.org/pdf/1811.11155.pdf

- FineGAN を提案。背景、オブジェクトの形状、オブジェクトの見た目をdisentangle し、画像を生成する
- 情報理論を使って、個々のファクタのlatent codeへの寄与を決める？- InfoGANと同じ。
- unsupervised fine-grained object clustering (or “discovery”)という新しい問題を解こうとしていると主張

- 背景とparentとchildを分離して表現学習して、生成する。
背景に関しては正規分布、parent, childに関してはカテゴリ分布

- 背景の学習の際には別のモデルで物体と背景を分離している。これをunsupervisedというのはありなのか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/3f48a38f-ade1-8f72-ed0d-6d31d865d80d.png)
【10分でできる】Djangoでサクッとローカルwebサイトを作る

#プロローグ
Djangoでサクッとローカルwebサイトを作ってみます。
記事の環境
　Window　10
　Django==3.1
　Python 3.7.6

#手順
pythonは導入されている前提です。
とりあえず、pip installでDjangoを導入します。

```
pip install django
```

<br>
Djangoが導入できたら、構築していきます。

プロジェクトを作成するフォルダでコマンド実行します。
HelloWorldはプロジェクト名です。

```
django-admin startproject HelloWorld
```

<br>
こんな感じの構成が出来上がりました。

```
└─HelloWorld
    │  manage.py
    │
    └─HelloWorld
            asgi.py
            settings.py
            urls.py
            wsgi.py
            __init__.py
```

<br>
続いてアプリを作成します。
Goodbyeがアプリ名です。

```
python manage.py startapp  Goodbye
```

<br>
こんな感じの構成が出来上がりました。

```
│  manage.py
│
├─Goodbye
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  └─migrations
│          __init__.py
│
└─HelloWorld
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py
    │
    └─__pycache__
            settings.cpython-37.pyc
            __init__.cpython-37.pyc
```

<br>
アプリをプロジェクトに認識させます。
プロジェクトを管理しているsettings.pyを更新します。
アプリ名を「INSTALLED_APPS」配下に追記しました。

```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Goodbye',
]
```

<br>
サイトアクセス用のURLを設定しておきます。
プロジェクトフォルダにあるurls.pyを更新しました。
pathの第一引数にurlを指定しています。
第二引数はアプリ側のurls.pyを参照できるようにincludeを使っています。

```
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('goodbye/', include('Goodbye.urls')),
]
```

<br>
アプリ側のurls.pyも更新しておきます。
pathの第一引数はプロジェクト側のurls.pyで指定済みなので、空にします。
第二引数はurlへアクセスされたときに呼び出されるviewを指定。
第三引数は任意の名前です。

```
from django.urls import path
from . import views

urlpatterns = [
    path('', views.get_data, name='get_data'),
]
```

<br>
これでアクセスする準備はできました。
続いてアクセス画面に表示する内容を簡単に作ります。
renderを使ってリクエストを別出しするhtmlへ渡します。

```
from django.shortcuts import render

# Create your views here.

def get_data(request):
    if "data" in request.GET:
        param = {'test':request.GET.get("data")}
    return render(request, 'Goodbye/index.html', param)
```

<br>
データを渡すhtmlを作成します。
アプリのフォルダにtemplatesフォルダと、その配下にアプリ名のフォルダを作成し、その配下にhtmlを作成しました。
{{変数}}でデータを受け取って表示させます。

```
<html>
<body>
  <p>{{test}}</p>
</body>
</html>
```

<br>
あとはDjangoに標準搭載されている開発用サーバを起動してアクセスするだけです。
渡した変数をパラメータで指定しています。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/b5191946-0a13-6c05-cf6d-a54175fa9ecd.png)

#エピローグ
記事を書くのに時間がかかりましたが、表示するだけなら10分程度で完了できました。
お手軽ですね。
IBM Cloud Schematics を使って IBM Cloud Kubernetes Service (IKS) を VPC Gen2 に作成する


# 概要

IBM Cloud Schematics という無料で使える Terraform as a Service があります。
それを使って、IBM Cloud Kubernetes Service (IKS) を VPC Gen2 にプロビジョニングしてみます。

> - VPC Gen2 Release Note https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes
>  - 16 July 2020
>   - New region: The Tokyo region is now available. For more information, see Creating a VPC in a different region.
  
> - IKS Release Note https://cloud.ibm.com/docs/containers?topic=containers-iks-release&locale=en
>  - 17 August 2020
>   - Locations: You can create clusters on VPC generation 2 compute infrastructure in the Tokyo multizone region.

![Kobito.bXxh3D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e8a1e8af-b251-74d4-93dd-6a58ced401c8.png "Kobito.bXxh3D.png")

# IBM Cloud Shell 起動

https://cloud.ibm.com/shell から IBM Cloud Shell (Tokyo) を立ち上げて、GitHub からコードをダウンロードします。

>https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-release-notes-image
24 June 2020
Added support for the Tokyo (jp-tok) region.

```shell:

git clone https://github.com/khayama/schematics-iks-vpc.git
cd schematics-iks-vpc
```
>[khayama/schematics-iks-vpc](https://github.com/khayama/schematics-iks-vpc)

# Schematics Workspace 作成
以下のコマンドを実行します。

```
ibmcloud schematics workspace new --file workspace.json
```

以下の画面で適宜パラメータをカスタマイズしてください。

>https://cloud.ibm.com/schematics/workspaces/
![Kobito.fDTg9L.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/39fca3d9-2756-c287-a671-3a29c16574fb.png "Kobito.fDTg9L.png")


# Apply Plan 実施
画面右上の「Apply Plan」から IKS をプロビジョニングできます。

![Kobito.MPy9b6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/18397e9a-13ee-e4ab-a7a6-52d97f1ff2da.png "Kobito.MPy9b6.png")

リソースとしては、以下のものが作成されます。

- vpc
- vpc_address_prefix
- vpc_subnet
- vpc_security_group_rule
- vpc_public_gateway
- iks_cluster

# IKS on VPC Gen2 確認

## IKS

`192.168.250.0/24` のサブネットに作成されるように設定してあります。

>https://cloud.ibm.com/kubernetes/clusters/
![Kobito.OLPqnu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9ef8f1bb-1ea9-3f31-8ae6-fb5a7bc988ac.png "Kobito.OLPqnu.png")

## VPC
IKS ワーカーノードは、VPC インスタンスとして画面に表示されなくなりましたので、ご注意ください。

>https://cloud.ibm.com/vpc-ext/network/vpc/
![貼り付けた画像_2020_08_21_11_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/d9246961-050e-65ee-4f51-d0d5b2ebfa05.png "貼り付けた画像_2020_08_21_11_27.png")

# 参考

- [IKS with IBM Cloud Schematics](https://ibm.github.io/cloud-enterprise-examples/iac-resources/container#iks-with-ibm-cloud-schematics)
アジャイルな開発とは_メモ_20200821

#アジャイルな開発


**１．アジャイルな開発とは**

　　主流である**ウォーターフォール型**の開発方法は、
　　要件定義、設計、実装、テストの流れを一回だけ行うのに対して、
　　**アジャイル開発**は、一度で全部を作ろうとはせず当初は最低限プログラムが動く程度の
　　機能を持ったものの完成を目指して各工程のチームが迅速に動きます。

　　とりあえず動くくらいのプログラムをもとに開発チーム同士やあるいは顧客と要件を
　　練りながら何度も各工程を反復する形になる。

　　＜**アジャイル開発が向いている状況**＞

　　アジャイル開発は例えるならプラモデルの骨組みだけ作っておいて、後でどのパーツを付けて
　　組み立てようかなという感じです。

　　ですので要望の変化することの多いインターネット関連の分野のプロジェクトや
　　要件が定まりにくいプログラムの開発には向いています。
　　
　　例：モバイルアプリなど常に変化が激しいもの

　　＜**アジャイル開発が向いていない状況**＞

　　開発している途中だが、要件が固まっていて変わることのないプロジェクトや
　　大人数や大規模なプロジェクトには適していないとされています。


**２．アジャイル開発のメリットデメリット**

　　＜**アジャイル開発のメリット**＞

　　アジャイル開発のメリットはずばり不具合が発生した際の手戻りが少なく済むという点です。

　　従来のウォーターフォール型の開発方法は設計に忠実に開発を進めていき、設計がぶれることがないので
　　不具合が発生した場合の手戻りはとても多きいものでした。
　　トラブルの発生した箇所によっては戻る工数も多く、時間やコストも多大にかかります。

　　しかし、アジャイル開発の場合は細かく計画や設計、実装、テストを繰り返しているため
　　イテレーションを一つ戻るだけですみます。
　　→手戻りのダメージが少ない

　　また、計画時点で仕様をこれ！と決めないのでユーザーの意見から修正したり確認をしながら
　　開発を進めることができるのでうまくアジャイル開発を使うことができれば
　　ユーザーの満足度が高いプログラムを作ることができます。

　　＜**アジャイル開発のデメリット**＞

　　計画時点で厳密な仕様を決めていないので、開発の方向性がぶれやすいのがデメリットの一つです。
　　さらに良くしようとテストやユーザーのフィードバックから当初予定していた計画からずれてしまいます。

　　あらかじめウォーターフォール型のようにタスクの開発スケジュールを決めていないので各チームの
　　進捗具合の把握が難しく遅れが出ることが多々あります。


**３．アジャイル開発とウォーターフォール型開発**

　　アジャイル開発とウォーターフォール型開発について、メリットなどは２で述べた通りなのですが
　　結局どっちがええねん、となる方もいるでしょう。

　　筆者の経験を踏まえて両方の開発方法でよかったことや悪いことをまとめて比較したいと思います。

　　＜アジャイル開発＞

　　アジャイル開発は筆者はテスターとして参画経験がありました。
　　良い点としては自分たちのチームの工程に集中して仕事ができる点と、割と新規で参画した人でも
　　要件を見ることができるようなところです。

　　悪い点は、やはりアジャイル開発は変更が多発する開発方法なので想定外の仕事を割り振りなどが
　　発生することですね。

　　アジャイル開発で長年働かれているエンジニアさんからしたらそんなの当たり前だろうと
　　いわれるかもしれませんが、自分のタスクが終わって定時が来て帰ろうものなら容赦なくタスクが
　　その日期限で渡されました。

　　変更が多い、という特徴だけで定時に帰れている人は少ないわ、有給休暇がめちゃくちゃたまっている人
　　が多いわといった環境でしたので、筆者個人的にはあまり好きな開発方法ではありませんでしたね・・・

　　＜ウォーターフォール型開発＞

　　ウォーターフォール型開発は筆者はテスト、基本設計、処理設計、製造などの参画経験があります。
　　良い点としては、一つ一つの工程をしっかりして進む感じなのでバグがあまりでなく快適に感じます。
　　(実力者ぞろいなのも少しあるとは思いますが)

　　やはり悪い点は変更があった際の全チームが大ダメージを受けてしまうことですね。
　　設計や計画はがちがちに決まってしまっているからプログラム内部をリファクタリングしたりして
　　変更して対応したりしなければいけないのでてんぱってしまいますよね。

　　両者を比較すると筆者個人的にはウォーターフォール型開発のほうが良いなと感じます。

　　本当に筆者個人の感想ですが、アジャイル開発は絶対に終わらないリセマラ、リセットマラソンを
　　やらされているイメージでした。
　　私自身同じ工程だけを一生したい年ごろでもないのも原因の一つだとは思いますが・・・

　　全然アジャイル開発方法の良い現場も無数に存在するとは思います！
　　自分に運がなかっただけのようですね。
【Threee.js】OrbitControls Error オービットコントロール　エラー

#エラー
私の場合↓
 Cannot read property 'addEventListener' of undefined

![スクリーンショット 2020-08-21 11.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/7fd49849-af94-c12b-7f91-e7f1cf4761f9.png)

####原因
いろいろ調べてみたらアップデートで書き方が変わったみたいです。
昔の文献をそのままやろうとするとこのようなエラーが起こります。

#書いた目的
自分用のメモ

#解決策

エラーのない記述に変更してrendererの下に記述する（constはあっても大丈夫です）

誤った記述をアップデートしてください
<誤った記述>
![スクリーンショット 2020-08-21 11.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/5dbcae24-9144-fbd9-fd4d-cc2a20c2ef1e.png)

<エラーのない記述>
![スクリーンショット 2020-08-21 11.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/a41379f2-810e-b5af-839e-c9a91aef285c.png)

たったこれだけです。

#コード
// controls
    const controls = new THREE.OrbitControls(camera,renderer,domElement);
EC2インスタンスの容量がいっぱいになってしまった原因とストレージ拡張方法

事後報告なので思い出しながら書いていきます。

# なんかおかしい
EC2インスタンス上で、docker上でPython製APIを動かしてたんですが、
頻繁にssh接続が切れたりとおかしな状態が発生してました。
まあ開発環境やしええかと思ってたら、docker立ち上がらなくなってた。
おかしいなと思って、ファイルサイズ確認するとこれ

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.0G   60K  2.0G   1% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
/dev/xvda1      7.XG  7.XG  7.XG  96% /
```

やばいね。
```/var/lib/docker```のファイルサイズが出かかったので、
どうもdockerのイメージとかコンテナが圧迫してたみたいですね。
いらないものは消しましょう。

```
# コンテナ全消し
docker rm $(docker ps -a -q)

# イメージ全消し
docker rmi $(docker images -q)

# dockerサービス止めて
service docker stop

# overlay2ってとこにキャッシュみたいなのが溜まってるぽい
sudo rm -rf /var/lib/docker/overlay2

# 立ち上げ
service docker start
```

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.0G   60K  2.0G   1% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
/dev/xvda1      7.XG  2.XG  7.XG  36% /
```

めっちゃ減りました。
でも心もとないストレージなので拡張することに。

# ボリューム拡張
ここを参考にやったと思います。
https://qiita.com/yktshg/items/9f08791f8f0820c659dc
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html

以上事後報告でした～
GitHubのセキュリティアラート「serialize-javascript」


##GitHubでアラートが表示されていたので、その解決方法を投稿
[環境]
Rails：6.0.3.2

![スクリーンショット 2020-08-17 18.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653956/b2b8a1df-d643-fed4-3c96-188d76afe57b.png)


セキュリティレベルが「high severity」、つまり重大度が高い危険。
ということで、パパっとやってやろう。


##やったこと
GitHub大先生が**「Upgrade serialize-javascript to version 3.1.0 or later」**と言ってくれている。つまり3.1.0にするかそれ以降のバージョンにアップグレードをしろとのこと。



##serialize-javascriptってなんや？
yarnでインストールされたパッケージで、Webpackのcompression-webpack-pluginをインストールするときに一緒にインストールされたモノ。（compression-webpack-pluginは何もの。。。？）
WebpackはRails6から標準導入されているから、Rails6で作られたアプリはすべてserialize-javascriptを使用しているということで、Rails6で開発してる方はアップデートした方がいいのかな？


##yarnでアップグレード

3.1.0以降（最新）にアップデート

```ruby:qiita.rb
% yarn upgrade serialize-javascript@latest 
yarn upgrade v1.22.4

なんやかんや、、、

success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ serialize-javascript@4.0.0
info All dependencies
└─ serialize-javascript@4.0.0
✨  Done in 20.60s.

```

これでserialize-javascriptのアップデートが完了！！
Google Colab Tips整理

#1. 初めに
Google Colabratoryの利用に有用なTipsを纏めます。

#2. Google Drive マウント
Google Colabでは、仮想環境の/content/にファイルが生成・保存されます。
例えば、自前の写真データセットを使いたい時を考えましょう。　/content/にデータセットを直接にアップロードする代わりに、そのデータセットを事前にGoogle Driveのどこかに入れてから、Google Driveをマウントします。そして、Google Driveの写真データセットのフォルダーを指定したほうが使いやすいです。

下記にサンプルコードを掲載します。

```Python
from google.colab import drive
drive.mount('/content/drive')

#Datasets Dir (例)
base_dir = '/content/drive/My Drive/datasets/Autoencoder_Sample/train'
```

#3.学習モデルの保存

ニューラルネットワークの学習結果として、学習モデルが生成された時、そのファイルを自分のPCに保存する方法は二種類あります。

(1) Google ColabからローカルPCにダウンロードする方法
(2) Google Driveに転送する方法

```Python

from google.colab import files

#Model Save (Keras)
model.save('autoencoder-trained.h5')

#1. モデルファイルのダウンロード
files.download('autoencoder-trained.h5')

#2. モデルファイルを直接にGoogle Driveにコピー
!cp autoencoder-trained.h5 "drive/My Drive/autoencoder-trained.h5"

```

学習モデルのサイズが数百MB以上になった場合は、ダウンロードには時間がかかるため、個人的にはcp命令でコピーする方法をお勧めします。コピー先のフォルダ名＋ファイル名には""で囲むことをお勧めします。そうではないと、エラーがでることもあります。


#4.Google Colabとの接続を維持する方法
Google Colabは、ユーザの反応が無い場合、30分後に自動的に接続が切れるようになっています。もちろん、計算内容も同時に失われます。:cold_sweat:

これを防ぐ方法がネットで紹介されたので、ご紹介します。
[How to prevent Google Colab from disconnecting ?](https://medium.com/@shivamrawat_756/how-to-prevent-google-colab-from-disconnecting-717b88a128c0)

Google Chromeを使う前提で、**Ctrl + Shift + i**を押し、BrowserのInspector Viewにします。そして、**goto console**に行き、下記のコードを入力します。これでGoogle Colabの30分で接続が切れる問題は解決されます。

```c

function ClickConnect(){
console.log("Working"); 
document.querySelector("colab-toolbar-button#connect").click() 
}setInterval(ClickConnect,60000)

```
実際の操作方法は、下記に動画を参考にしてください。
https://www.youtube.com/watch?v=N2NEyr9Bf48&feature=youtu.be&t=257

#5　謝辞
Google Colabの使用に関して、アビームコンサルティングの木村さんのアドバイスを多く頂きました。この場を借りてお礼を申し上げます。
Processingにおけるオブジェクトがジャンプする挙動の再現

Processingにおけるオブジェクトがジャンプする挙動の再現
---
学校の授業でprocessingについて扱ったのですが、そこで私はマリオを再現しました。そのツイートを宣伝として貼っておきます。
https://twitter.com/syunki____/status/1269528018076102657?s=20
===
さて、今回はその中で考えたジャンプの挙動について紹介しようと思います。
まず、マリオの高さをどうやって描いているかですが、基本的には高校物理の力学公式である
```
y=1/2gt^2+vt+y0
```

を応用しています。ｙは高さの座標、ｔは時間、ｖは初速、y0は初期位相を表しています。マリオの高さはこの式だけで表現しています。ですがこれだけではうまくいかなかったため、マリオが地面の高さにいるとき、この式の中のgを0にしていました。それ以外の高さにいるときにgを適切な定数（この値によって挙動が現実に近くなるかそれとも宇宙のようにゆっくり動くかを決めることができます）に設定することで重力を再現できます。こうしておくことで例えば段から落ちることなど何らかの原因でマリオが空中に放り出されたとしてもきれいに落下してくれます。

---
次にジャンプの仕組みですが。何らかの形（私はマウスの右クリック）でジャンプの入力がなされたとき、その高さをy0に保存します。そして初速vに値を与えます。言い忘れていましたがマリオがジャンプするときだけこのvには値を入れるようにします。ですから再び地面に戻ってきたらvは0に戻します。また、ジャンプが入力された瞬間にｔもカウントし始めます。これも地面に戻れば0に戻します。これだけで基本的にはジャンプの機構が完成します。

---
次にｙをint型にするかfloat型にするかという問題ですが、私はできるだけスムーズな描写を求めてしまったためfloat型にしました。ですがその弊害として着地するときに地面を突き破るバグが多発しました。その時はy座標が地面より大きくなったら地面の高さに強制的に戻すという式を組み込んでいれば解決できます。ですがこの方式はもっと複雑な地形になったりした場合応用を利かせにくい、バグが起きやすいと考えているのでもっといい方法があればぜひお聞かせください。
Vue.js-TypeScriptでのProperty '' does not exist on type

初めての記事になります。
初学者の学習メモとして
Vue.jsをTypeScriptで書いていた時、動作自体に問題はないけど
プロパティの型がありませんよって怒られた
(Property 'test1' does not exist on type '{ sample(): void; }')
ときの事

#問題のコード
```javascript

methods: {
   sample() {
      this.test(100, 200));
    },
  },
```
こういう感じでメソッド内から他のメソッドを呼んだ時に上の様なエラーが出ました。
この時にthis.test()部分にカーソルを当てて型推論をみると「any」になっています

#解決策
```javascript

methods: {
   sample(this: {test: Function}) {
      this.test(100, 200));
    },
  },
```
ただエラーを消すだけなら第一引数に「this」をとってそれが何なのかを教えてあげると消えます。
「this」は必ず第一引数にとります。
今回だと「Function」とすることで消えました
でもこれだとエラーは消えるけど、型推論を見ると「any」のままです。
TypeScriptの意味ないですよね。

そこで「Type」で型を指定してそれをtestに当てます

```javascript

export type Test = (num1: number, num2: number) => void
```
一応interfaceでもできます

```javascript

export interface Test {
  (num1: number, num2: number): void
}
```
interfaceはオブジェクトに対して使う物なので基本は「Type」

#最終的に

```javascript

import { Test } from '../type'
...
methods: {
   sample(this: {test: Test}) { //これで型推論されるようになる
      this.test(100, 200));
    },
  },
```
これでちゃんとカーソルを当てると型が表示されるようになりエラーも消えました。

以上です！

間違っていたらご指摘いただけると嬉しいです。