OmniAICreator/Qiita-1.07M huggingface dataset:
1054 unknown column 'email in 'field list'はこれで解決した

#今やっていること
Laravel6を使って簡単な掲示板機能の作成中。
最初の新規登録でつまりました。

##表示されたエラー
```
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'email' in 'field list' 
```
このエラーの解決方法はいろんな記事で読みましたが、イマイチ解決できず。
新規登録の機能を実装しているRegisterControllerを見直してみました。

##解決方法
```php:RegisterController.php
public function register(Request $request){
          if($request->isMethod('post')){
              $data = $request->input();
              $validator = Validator::make($data,[
                'username' => 'required|max:30',
                'email' => 'required|max:100|email:rfc,dns|unique:users,mail',
                'password' => 'required|min:8|max:30|confirmed',
                'password_confirmation' => 'required|min:8|max:30',
              ]);

              if($validator->fails()){
                return redirect('/register')
                ->withErrors($validator)
                ->withInput();

              } else {
                $this->create($data);
                return redirect('added');
              }
            }
            return view('auth.register');
      }
```
新規登録後、「登録ありがとうございます」と表示されている画面へ移行するように書いています。
これは以前作っていたSNS開発のコードをそのままコピーして改変していたのですが、ここの部分

```php:RegisterController.php
'email' => 'required|max:100|email:rfc,dns|unique:users,mail',
```

MySQLのテーブルは、"email"という名前でしたので、uniqueのカラム名を変えていないことが原因でした。
本当にしょうもないミス😭

```php:RegisterController.php
'email' => 'required|max:100|email:rfc,dns|unique:users,email',
```

これで問題なくDBに登録ができました👌🏻

##まとめ
以前のコードをコピーするときはDB名を見直そう！(当たり前)
バリデーションの登録が原因であることはあまり書かれている記事を見かけなかったので記事にしてみました。すぐにエラーの原因が見つかってよかったです！
Docker で Next.js を起動する時にハマったこと

# Docker で Next.js を起動する

docker-compose.yml のみで Next.js を起動しようと試みたところ、どうやら npm のバージョンが対応していないようで起動するのが面倒だったので、`docker compose up -d`のみでサーバーを起動させるまでを行いたいと思います。

## 原因

Docker の npm のバージョンはデフォルトで 8.1.2 となっていました。

`npm run dev`をすると以下のようになります

    > dev
    > next dev

    sh: 1: next: not found

これを`npm upgrade`で 8.3.0 にすると起動しました。

# ディレクトリ構成

    app
     ├ Dockerfile
     |
     ├ docker-compose.yml
     |
     └ nextプロジェクト

# Dockerfile

```Dockerfile:Dockerfile
FROM node:17.3.1

WORKDIR /usr/src/app/next

COPY /react/package*.json ./

RUN npm install
```

# docker-compose.yml

```yaml:docker-compose.yml
version: "3"
services:
  next:
    build: .
    ports:
      - "3000:3000"
    container_name: "next"
    volumes:
      - ./react:/usr/src/app/next
    command: "npm run dev"
```

以上のようにして docker-compose.yml のあるディレクトリに移動し、`docker compose up -d`を行うと、localhost:3000 で作成した Next.js プロジェクトにアクセス可能になりました。
3次元座標系での様々な回転表現を相互変換したり、表示するツール

# 作ったもの
- 下記の3D回転表現に対応しています
    - 回転行列: Rotation Matrix
    - 回転ベクトル: Rotation Vector
    - Axis-angle
    - クオータニオン: Quaternion
    - オイラー角: Euler Angles (Intrinsic; Mobile)
    - 固定角: Euler Angles (Extrinsic; Fixed)
- 入力の回転に応じて、物体がどの方向を向くかを3D空間上で表示します
- 入力の回転を、他の全ての3D回転表現に変換します
- GitHub
    - https://github.com/iwatake2222/rotation_master
- ブラウザで試す
    - https://iwatake2222.github.io/rotation_master/rotation_master.html

<iframe width="560" height="315" src="https://www.youtube.com/embed/F3EJlFhLXnY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 実行ファイル
- 下記リリースからご使用のOSに合わせた実行ファイルをダウンロードしてください
    - https://github.com/iwatake2222/rotation_master/releases/latest
        - Windows 10/11 64-bit: rotation_master_windows-2019_x64.zip
        - Linux (Ubuntu 20.04): rotation_master_ubuntu-20.04_x64.tgz
        - ~~MacOS: rotation_master_macos-10.15.tgz~~
        - 注意
            - Windowsだと実行時にセキュリティに関する警告が出ます。信用いただけるならそのまま実行してください
            - Ubuntuの場合 `apt install -y libglu1-mesa-dev mesa-common-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev` が必要です
            - WSL2だとグラフィック系の問題で動作しませんでした。WSL2上のDocker(Ubuntu20.04)だと動作しました
            - MacOSだと実行時にエラーが発生するようです。自分でビルドするか、何か足りていないライブラリをインストールしたらいけるかも?
- セキュリティが気になる場合は、自分でビルドしてください
    - https://github.com/iwatake2222/rotation_master/wiki/How-to-Build

# 操作方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/e7b7961c-15b3-9b91-a7bd-b5ebebe64081.png)

## 変換
1. Inputエリアで、数値を変更します
    - マウスドラッグ、または、Ctrl+クリックで直接入力します
2. 値を変更した3D回転表現が入力として自動的に選ばれますが、変えたい場合はラジオボタンをクリックしてください
3. Converted valuesエリアに、結果が自動的に出力されます

## カメラ操作
### Revolutionモード
- カメラは原点の周回を移動します。カメラは常に原点の方向を向いています
- 右ドラッグ: カメラの位置回転
- スクロール: カメラの前後移動 (原点からの距離変更)

### Freeモード
- カメラを自由に移動することができます
- 右ドラッグ: カメラの回転
- 中央ドラッグ: カメラの移動
- スクロール: カメラの前後移動

## その他
- 画面の右側に、X, Y, Z軸それぞれから見た状態が表示されます
- 現在の変換結果(Converted Values)を入力値(Input)に設定したい場合は、"Overwrite input values by the converted values" ボタンをクリックします

# 技術的な話
## 変換の流れ
1. 入力値を回転行列に変換する
    - ConvertOOO2RotationMatrix
2. 変換した回転行列から、全ての3D回転表現に変換する
    - ConvertRotationMatrix2OOO

変換関数は下記で実装されています。依存は自前の小さいMatrixクラス(2ファイル)だけなので、マイコンなどへの移植も容易だと思います。
https://github.com/iwatake2222/rotation_master/blob/master/desktop/transformation_matrix/rotation_matrix.cpp

## 使用技術
- C++
- OpenGL + GLFW + GLEW
- Dear ImGui

# Help
- ~~これのWebアプリ版を作ってくれる方を募集中 !~~
- ~~各ライブラリのWeb版は一応存在するようです~~
    - ~~https://github.com/KhronosGroup/WebGL~~
    - ~~https://github.com/jnmaloney/WebGui~~
- 2022/01/18追記: @astomih さんがEmscriptenを使って作成してくれました。ありがとうございます！
    - https://astomih.github.io/rotation_master/
- 2022/01/26追記: 自分でもWEB上で動かせるようにしてみました
    - https://iwatake2222.github.io/rotation_master/rotation_master.html
conoha メールサーバー移行してgmailへ転送

conohaのメールサーバーを使っている。

マイグレーションしてくれと。
https://support.conoha.jp/v/mail-migration/

サーバー > メールサーバーを選択

# メールアドレスのパスワードを変更

![a1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d996b016-6e2a-88f5-20c4-2cd2f718c2c3.jpeg)

DNS情報

① パスワード変更
注意 : パスワードを9桁以上にする必要がある

② SPFレコードをメモ
③ default_domainkeyをメモ

# 転送設定

① MXレコード設定値をメモ
② メールの転送を設定

![a4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/ece61af8-ab53-3e1e-d7dd-1343c769580c.jpeg)


#DNS

それぞれ、先程メモったものに

① MXレコードを変更
② SPFレコードを変更
③ default._domainkeyを変更

![a6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/02be2c72-7cff-68c6-0449-68fd0caca8f8.jpeg)

とりあえず、こんな流れ。

#重要
DNSレコード情報を確認致しましたところ、DKIMの名称の
一部に「.」の記述がないことからご申告の事象が発生し
ている可能性がございます。

つきましては、以下のような名称にご修正の上、改めて
ご確認いただけますと幸いでございます。

[DNSレコード］
　名称　：default._domainkey



# 確認

MXレコードが新しいサーバーに向いているかチェック
https://mxtoolbox.com/


![mxcheck.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/ff252231-4593-1c7f-e65b-a8ba73d0c41f.jpeg)


gmailに届いたら、メールのヘッダを見て、
新しいサーバーに届いているかチェック

![gmail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/342df9e7-789f-8e3e-2105-76f43252050e.jpeg)

Received のサーバー名が先程設定した MX レコードと同じなら
サーバーが切り替わっている証拠

# メモ

・転送先メールアドレスを複数にするとなぜか届かない

# gmail 送信設定

ポート 587
smtp mail77.conoha.ne.jp
ユーザー名 your@your.com
パスワード youryour
TLS を使用したセキュリティ

で、送信設定することが可能
[Ubuntu 20.04] apt-get upgrade時にConnection failedエラーが発生した件

# 概要
apt-get upgrade時にConnection failedエラーが発生した。そのエラー解消時の手順を記載

# 環境
Ubuntu20.04 (on WSL20.04 Win10Pro 21H1)

# エラー発生時の状況
## 以下コマンドを実施

```sh
$ sudo apt-get upgrade --fix-missing
```

## 発生したエラーメッセージ

```sh
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libgl1-mesa-dri libglapi-mesa libglx-mesa0 libllvm12
4 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 29.3 MB/29.5 MB of archives.
After this operation, 45.1 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Err:1 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libgl1-mesa-dri amd64 21.0.3-0ubuntu0.3~20.04.5
  Connection failed [IP: 91.189.88.152 80]
Err:2 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libllvm12 amd64 1:12.0.0-3ubuntu1~20.04.4
  Connection failed [IP: 91.189.88.152 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/m/mesa/libgl1-mesa-dri_21.0.3-0ubuntu0.3~20.04.5_amd64.deb  Connection failed [IP: 91.189.88.152 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/l/llvm-toolchain-12/libllvm12_12.0.0-3ubuntu1~20.04.4_amd64.deb  Connection failed [IP: 91.189.88.152 80]
```

## 解決した際の手順
- リポジトリを日本のミラーサーバーへ変更
- 以下、富山大学のミラーサーバーを採用しているが、任意に近くの[ミラーサーバー](https://launchpad.net/ubuntu/+archivemirrors)を変更する

-- 富山大学の例
```sh
sudo sed -i.org -e 's|archive.ubuntu.com|ubuntutym.u-toyama.ac.jp|g' /etc/apt/sources.list
``` 

- キャッシュを削除

```sh
sudo apt-get clean
```

## 再実施

```sh
sudo apt update && sudo apt upgrade -y
```

正常に `apt-get upgrade` を行えました。

# 参考にさせて頂いたサイト
https://pg-fan.com/blog/ubuntu-20-04-apt
データセット用の顔画像をすぐに用意したい　iPhoneの写真から、顔だけを数秒で100枚切り出す

#iPhoneのフォトライブラリから、顔だけを切り出す方法です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ad5c9c1a-cd48-68cf-0eb2-789f3bdbc3f5.png width=300>

#データセットを用意するのは大変

たとえば機械学習などで、データセットとして顔写真や人体の写真が数千枚必要なケースがあります。
しかし、手動で顔写真を切り出すのは大変です。

#手元のiPhoneの写真が使えたら便利
たいていの人のiPhoneには、人の写っている写真が数百〜数千枚はあるでしょう。
それらの写真の顔だけを抽出できれば、迅速なデータセット作成に活かせそうです。

#[SemanticImage](https://github.com/john-rocky/SemanticImage)でiPhoneの写真を高速処理できる
[**SemanticImage**](https://github.com/john-rocky/SemanticImage)というライブラリを使えば、高速で写真から顔だけを切り抜けます。

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


#手順

SwiftPackageManagerで[SemanticImage](https://github.com/john-rocky/SemanticImage)をインストール。

```swift
let semanticImage = SemanticImage()
```

PhPickerでiPhoneのフォトライブラリから、複数写真を選択します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c06b025d-ad35-93d4-4057-c7460f232e61.png width=400>
Personで検索すると、人の画像だけ切り抜きにかけられて便利です。

```swift
var configuration = PHPickerConfiguration()
configuration.selectionLimit = 0 // 選択する写真の数を無制限にする
configuration.filter = .images
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true)
```

取得した写真をSemanticImageの顔切り抜き機能にかけます。

```swift
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true)

    for result in results { // フォトライブラリから取得した写真を順次処理
        if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
            result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error  in
                if let image = image as? UIImage,  let safeSelf = self {
                    DispatchQueue.main.async {
                        if let faceImage = safeSelf.sematicImage.faceRectangle(uiImage: image) { // 顔を切り抜く
                            UIImageWriteToSavedPhotosAlbum(maskImage, nil, nil, nil) // フォトライブラリに保存
                        }
                    }
                }
            }
        }
    }
}
```

これで、切り抜かれた顔の画像がフォトライブラリに保存されます。
100枚程度だと、14秒で処理でき、メモリとCPU使用量も安全です（iPhone11）。
（数千枚一気に処理すると、画像データを保持しきれず、メモリがオーバーするので、数百枚ずつ処理するのが良さそうです）
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ad5c9c1a-cd48-68cf-0eb2-789f3bdbc3f5.png width=300>
添付画像は全部マスクしてデータとしては意味ない感じですが、著者は照れ屋なので、すみません。

#全身データや、犬、猫のデータにも
SemanticImageは、全身やペットを検出して切り抜く機能もあるので、さまざまなデータ作成に活かせます。

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

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
ぼーっと眺める自動スクロール用Bookmarkletを作った

## ０．初めに

私は、非エンジニアなのでこの記事は初心者向けです。

Qiitaや掲示板を閲覧するときに、自動スクロールして、ぼーっと眺めたかったのでそういうブックマークレットを探してみました。

## １．見つけたもの

以下のページにひな形になる情報がありました。

速度調整できる自動スクロールのブックマークレット | MIII.me
https://miii.me/4326.html

個人的には、以下の点が、不便だったので変更してみました。

* ブックマークバーから起動/停止はちょっと使いづらい
* スクロール速度が変更できない

## ２．作った物

以下の画像の通りです。

![Clipboard02bml.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/c55517bb-1467-789b-0fa0-b9b1e412a0da.jpeg)

処理の流れは以下。

1. ブックマークバーで「スクロ」クリック
1. スクロールボタンが常に画面左上部に表示される
1. スクロールボタンを押すとスクロール速度を入力するプロンプトが表示
1. プロンプトでOKを押すとスクロール開始
1. もう1回スクロールボタンを押すと停止

## ３．ソース

```javascript:ソース
var newBtn = document.createElement("button");
var m;
newBtn.innerHTML = "スクロール";
newBtn.onclick = () => {
  console.log(`ボタン${newBtn.innerHTML}が押されました！`);
  if(!m){var n=prompt("スピード（数値が大きいと遅い）",60);m=setInterval(function(s){scrollBy(0,s||2)},n)}else{clearInterval(m);m=0}
};
document.body.parentNode.insertBefore(newBtn,document.body.parentNode.firstElementChild);
newBtn.style.position = "fixed";
newBtn.style.top = "2px";
newBtn.style.left = "2px";
newBtn.style.padding = "8px";
newBtn.style.zIndex = "9999";
```

ボタンを生成して、onclickでスクロール/スクロール停止する関数付けて、bodyの先頭ノードにボタンを追加、styleで表示位置を指定しています。

ボタンの生成は以下のサイトを参考にしました。

JavaScriptでcreateElementメソッドを使いHTMLを動的生成する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
https://techacademy.jp/magazine/36505

ボタンのノード追加は以下のサイトを参考にしました。

脱jQuery .after() .before() .insertAfter() .appendTo() .prepend() .prependTo() | q-Az
https://q-az.net/none-jquery-after-before-appendto-prepend/


bookmarkletへの変換は、以下のサイトを利用しています。

Bookmarklet スクリプト変換
https://ytyng.github.io/bookmarklet-script-compress/

生成したBookmarkletは以下です。

```javascript:Bookmarklet
javascript:var%20newBtn%3Ddocument.createElement(%22button%22)%3Bvar%20m%3BnewBtn.innerHTML%3D%22%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%22%3BnewBtn.onclick%3D()%3D%3E%7Bconsole.log(%60%E3%83%9C%E3%82%BF%E3%83%B3%24%7BnewBtn.innerHTML%7D%E3%81%8C%E6%8A%BC%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81%60)%3Bif(!m)%7Bvar%20n%3Dprompt(%22%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%EF%BC%88%E6%95%B0%E5%80%A4%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%A8%E9%81%85%E3%81%84%EF%BC%89%22%2C60)%3Bm%3DsetInterval(function(s)%7BscrollBy(0%2Cs%7C%7C2)%7D%2Cn)%7Delse%7BclearInterval(m)%3Bm%3D0%7D%7D%3Bdocument.body.parentNode.insertBefore(newBtn%2Cdocument.body.parentNode.firstElementChild)%3BnewBtn.style.position%3D%22fixed%22%3BnewBtn.style.top%3D%222px%22%3BnewBtn.style.left%3D%222px%22%3BnewBtn.style.padding%3D%228px%22%3BnewBtn.style.zIndex%3D%229999%22%3Bvoid(0);
```

## ４．終わりに

ブックマークレットは、とても便利だし、ブラウザさえあれば試せるので、初心者向けだと思います。

Braveみたいな広告抑止機能があるブラウザーで使うと某巨大掲示板閲覧がはかどると思います。

以　上
Day002 : Botterまでの道のり（使っているライブラリのメモ）


# シリーズ前後5つ

+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [Day001 : Botterまでの道のり（LSTMについてぼんやり理解する）](https://qiita.com/InvestorX/items/36f352c1cf3683ae4deb)
+ Day002 : Botterまでの道のり（使っているライブラリのメモ） <- 今ここ
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)
+ [まだ](https://google.co.jp/)

# 動機
モデルをどうやって作ろうかなと思ったときに，まずなんとなくでも理解する必要があると思って・・・。
シリーズ全体が200記事くらい書ければB級Botterにはなれるはず・・・。

#　ライブラリ一覧

## 機械学習系

### 機械学習ライブラリ PyTorch

https://pytorch.org/

``` shell
pip3 install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio===0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
```
### 機械学習ライブラリ scikit-learn

多分最初から入っているはず。

https://scikit-learn.org/stable/

``` shell
conda install scikit-learn
```
### 最適化ライブラリ　Optuna

https://optuna.org/

``` shell
conda install -c conda-forge optuna
```
## 計算ライブラリ
### 経済指標計算ライブラリ TA-Lib

https://ta-lib.org/

``` shell
conda install -c conda-forge ta-lib
```

### 配列計算ライブラリ　CuPy

https://cupy.dev/

``` shell
pip install cupy-cuda113 #CUDAのバージョンに合わせて！
```

## お絵描き
### データ可視化ライブラリ Bokeh

https://bokeh.org/

``` shell
conda install bokeh
```

### データ可視化ライブラリ mplfinance

古い記事だとmatplotlibでCandlestickチャートを描いてますが、mplfinanceへ移行したようです。

https://github.com/matplotlib/mplfinance


# Botterの定義
https://twitter.com/blog_uki/status/1167813723123146752


Have a good Botter Life!!!
GitHub CLIでトークンを表示して、REST APIに渡しちゃおう

# 概要
なんでそんな事するの？ 素直にGitHub CLI使えば良いんじゃないの？ってのはおいといて

https://cli.github.com/

```
gh auth status -t
```
みたいに [gh auth status](https://cli.github.com/manual/gh_auth_status) に -tオプションつけたらトークン表示される

あとは、

```ShellSession
$ export GH_TOKEN=gho_********************************
$ curl -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $GH_TOKEN" https://api.github.com/user
```

な感じで実行できる
【Laravel】oldがinputのvalue情報やtextareaの情報を保持してくれないとき

# はじめに

laravelで、formなどでinputのvalue値などを送信するときに、old関数を設定して「入力エラーでも入力内容を保持」してくれるように設定したがしてくれないときの自分用メモ。

# 解決

バックエンド側で

```php
return redirect()->back()->withInput()->withErrors('Errors');
```

のように「->withInput()」を配置するとうまくいく。

# 参考

https://stackoverflow.com/questions/41659717/laravel-old-not-working
[py2rb] itertools.product

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# product (Python)
```python
import itertools

A = [('a', 'b', 'c'), ('d', 'e'), ('f', 'g')]

print(list(itertools.product(*A)))

# [('a', 'd', 'f'), ('a', 'd', 'g'), ('a', 'e', 'f'), ('a', 'e', 'g'), ('b', 'd', 'f'), ('b', 'd', 'g'), ('b', 'e', 'f'), ('b', 'e', 'g'), ('c', 'd', 'f'), ('c', 'd', 'g'), ('c', 'e', 'f'), ('c', 'e', 'g')]
```
https://docs.python.org/ja/3.7/library/itertools.html#itertools.product

> ジェネレータ式の入れ子になった for ループとおよそ等価です。たとえば product(A, B) は ((x,y) for x in A for y in B) と同じものを返します。

ふむふむ。
# product 失敗 (Ruby)
```ruby
A = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g']]

print(A.inject(:product))

# [[["a", "d"], "f"], [["a", "d"], "g"], [["a", "e"], "f"], [["a", "e"], "g"], [["b", "d"], "f"], [["b", "d"], "g"], [["b", "e"], "f"], [["b", "e"], "g"], [["c", "d"], "f"], [["c", "d"], "g"], [["c", "e"], "f"], [["c", "e"], "g"]] 
```
単に、`inject`すると、平坦化されていない状態で出力されます。
# product + flatten 成功 (Ruby)
```ruby
A = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g']]

print(A.inject(:product).map(&:flatten))

# [["a", "d", "f"], ["a", "d", "g"], ["a", "e", "f"], ["a", "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]]
```
`tuple`ではないのですが、同様の処理ができました。
# product 応用問題 (Python)
```python
import itertools

A = [(('H-', 'a'), 'b', 'c'), ('d', 'e'), ('f', 'g')]

print(list(itertools.product(*A)))

# [(('H-', 'a'), 'd', 'f'), (('H-', 'a'), 'd', 'g'), (('H-', 'a'), 'e', 'f'), (('H-', 'a'), 'e', 'g'), ('b', 'd', 'f'), 
('b', 'd', 'g'), ('b', 'e', 'f'), ('b', 'e', 'g'), ('c', 'd', 'f'), ('c', 'd', 'g'), ('c', 'e', 'f'), ('c', 'e', 'g')]
```
前回は、要素が一つずつでしたが、今回は要素数が異なります。
# product 応用問題 (Ruby)
```ruby
A = [[['H-', 'a'], 'b', 'c'], ['d', 'e'], ['f', 'g']]

print(A.inject(:product).map(&:flatten))

# [["H-", "a", "d", "f"], ["H-", "a", "d", "g"], ["H-", "a", "e", "f"], ["H-", "a", "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]]

print(A.inject(:product).map{ _1.flatten(1) }) # 1
print(A[0].product(*A[1..-1]))                 # 2

# [[["H-", "a"], "d", "f"], [["H-", "a"], "d", "g"], [["H-", "a"], "e", "f"], [["H-", "a"], "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]]
```
単なる`flatten`ですと平坦化しすぎですので、深さを指定します。

https://docs.ruby-lang.org/ja/latest/method/Array/i/flatten.html

2番目の書き方は、こちらを参照しました。

https://qiita.com/sumtrue/items/2315cd131d6c86078546#comment-eae5b024b5b374f87b7d
# メモ
+ Python の itertools.product を学習した
+ 百里を行く者は九十里を半ばとす
覚えたことシリーズ１

First argument in form cannot nil or be emptyのエラーが出た時
該当箇所にデータが入っていないことが原因
→定義する必要がある
①とりあえずRoute.rbを見る
②エラーが出ているページのURLを確認する
ex　/はrootのこと

route.rbはユーザーがアクセスしてきたURLをコントローラーに振り分けている
→Railsの場合は　static_pades_controllerに処理を頼んでいる
開いて該当箇所に定義する
[Swift] Proof of CoW

Swift has two kinds of type, `Value` types and `Reference` types. Value types will copy the data when assign to another variable. But for array it does not copy every time, it use Copy-on-Write. 

```swift
import Foundation

var a = [1,2,3,4,5,6]
var b = a

func address(_ p: UnsafeRawPointer) {
    print(p)
}

address(a)
address(b)

a.append(6)

address(a)
address(b)
```

```
0x0000000110412210
0x0000000110412210
0x0000000110412980
0x0000000110412210
```

See the above example, `a` and `b` will point to same memory address, `var b = a` dose not have copy occurred. When you change the content of `a`, it will copy the data and assign the new data address to `a`.
vagrant upできない時の対処方法

　Vagrantを使いubuntuの仮想マシンを起動しようとしたところ、vagrant upのコマンドからエラーで進めなくなってしまった。
　ちなみにOSはWindows10 Home、Vagrantのバージョンは2.2.19、VirtualBoxのバージョンは6.1.30、Windows PowerShellを用いて操作。
　解消まで何日もかかったため、解消策のひとつとして書き留めておきたいと思う。

##エラーコード
```
PS C:\Users\owner\vagrant> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/bionic64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/bionic64'
    default: URL: https://vagrantcloud.com/ubuntu/bionic64
==> default: Adding box 'ubuntu/bionic64' (v20220104.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/ubuntu/boxes/bionic64/versions/20220104.0.0/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
Download redirected to host: cloud-images.ubuntu.com
    default:
==> default: Successfully added box 'ubuntu/bionic64' (v20220104.0.0) for 'virtualbox'!
==> default: Importing base box 'ubuntu/bionic64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/bionic64' version '20220104.0.0' is up to date...
==> default: Setting the name of the VM: vagrant_default_1641474145738_8798
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 (guest) => 8080 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```

##試してみたこと
以下のサイトを参考に次の3つを行った。
　・タイムアウト設定変更
　・ネットワークアダプタの設定変更
　・SSH接続用鍵ファイルの初期化
　（参照URL）
　https://mimirswell.ggnet.co.jp/blog-261

しかし、改善されず。
　・vagrant upに--provisionオプションを付ける
　・PCからVagrantをアンインストールし、再インストール

これでも改善されず。

##解決方法
hyper-vの設定をオフにし 'vagrant reload' を行ったところ解消することができた。
（参照URL)
　https://qiita.com/kumokumo/items/78865c0aaed100e79feb
　https://qiita.com/masoo/items/b73dadb0e99f9be528fe
高校3年間情報系の科目の勉強＋情報専門学校約7カ月在学してみて

#投稿目的
総合学科高校生活で情報系の科目をとっていた状況と２０２１年に専門学校に入学した私自身の
個人的に思ったことをここに記そうと思ったから。
#まず総合学科とは
簡単に私の言葉で言えば、普通科目（少し）と自分で自分の目指したい目的に対しての科目を選択して学習する学科だと思っています。
ただ、目的がない状態で総合学科に入ると最終的に大学に入ろうとしても選択科目で受験科目を選択していなかったということもありえるので、
進学する場合はだいたいの将来こうしたいなど考えておくといいと思いました。
ちなみに私の場合は入学当初商業・情報のどちらかで迷っていて、先生と面談した結果情報系列の科目を選択し、
今現状情報系の専門学校へ通っています。


↓この記事が総合学科について分かりやすいと思います。
https://www.nagano-c.ed.jp/marukohs/page1B.html
#高校から情報科目を学び続けて思ったこと
高校は結構表面的なことを学ぶことが多かったと思います。つまり最低限の知識を学んだということです。
資格を取得するための知識は学ぶことはできますが、実際職場で働くとなるとあまり役に立たない傾向があるのではないかと思います。
ちなみに私の同級生で就職した子も情報の知識を生かせる職場についた子は一人もいませんでした。
専門学校に入ってからは最初は高校で学んだことを復習している感じでしたが、
だんだん復習＋新しい知識という感じになっていき、同じ学習でも授業内容の濃さは専門学校のほうが濃かったです。
元々高校で先に学んでいたからこそ新しい知識のつながりが分かる、そんな気もします。
また専門学校のほうが高校よりもやっぱり情報科目の勉強が深くできることから、
就職するのではなく、専門学校に進学してよかったと思えました。
#最後に
あの時、総合学科で情報系列の科目を選択したからこそ今がある、
そう思うとなんだか考え深くなってしまいました。
今思うと情報科目を高校で勉強している学生は嫌いというわけでないなら、情報系の大学・専門学校で
もっと幅広く知識を増やしていってほしいと思います。何上から目線でいっているんだと
思われるかもしれませんが、実際私は入学して損はなかったし、他の情報専門学校に入学した同級生たちも
苦手なものはあれど、最初はほぼ復習だったので、頭にすんなり入りやすいという点から授業に
ちゃんとついていけていました。もしくはついていける以上に周りの生徒の方に勉強を教えたり、
先生にたくさん質問したり、自分の個人的にやりたいことをやっている人もいました。
特に個人的にやりたいことが情報的なことであれば、その分知識はつくし、先生方も協力してくれると思います。
私も今まで以上に勉学に励んでいきたいと思います。

初投稿だったので、至らない点も多数あったと思いますが、ここまで見ていただいてありがとうございました。
psycopg2.extensionsが見つからない時の対処法

## 概説
djangoでPostgreSQLを使ったWebアプリを作るとき、macOS(intel)の仮想環境上で`showmigration`や`makemigration`を実行しようとしたら`ModuleNotFoundError: No module named 'psycopg2.extensions'`が出てしまったとき、wheelとsetuptoolsをアップデートした上でpsycopg2-binaryを強制的に再インストールすることで解決した。

## 環境

環境は以下の通りです。

| 名称 | バージョン |
|:-:|:-:|
| macOS | Monterey(12.1) |
|django|4.0.1|
|  Python | 3.8.9 |
|  brew | 3.3.10 |
|  pip |  21.3.1 |
|  psycopg2-binary | 2.9.3  |
|PostgreSQL|14.1|

## 対処法

仮想環境上で以下のコマンドを実行してください。

```:shell
pip install --upgrade wheel
pip install --upgrade setuptools
pip3.9 install psycopg2-binary --force-reinstall --no-cache-dir
```

## 補足

psycopg2のキャッシュが残っていたりするとマズイらしい。
`pg_config`を使えるか確認したり、psycopg2を再インストールしたつもりだけど上手くいかないという人は試してみてください。

```:shell
python3 manage.py makemigrations [yourAppName]
```
[yourAppName]は自身のアプリに置き換えてください。
単に

```:shell
python3 manage.py makemigrations
```
としてしまうと`No changes detected`となってしまう場合があります。

また、仮想環境上で実行しないと`ConnectionRefusedError: [Errno 61] Connection refused`で弾かれるので注意が必要です。(python2系で実行した場合もSyntax Errorとなるので注意。)
クラウドスキルチャレンジ コレクション追加 Gitによるソースコード管理とGitHubを用いたチーム開発と自動化

## GitHub コレクションの追加

皆様こんにちは！前回、「[クラウドスキルチャレンジを企画しませんか？](https://qiita.com/kazumihirose/items/0a980f7ef3943450fb69 "クラウドスキルチャレンジを企画しませんか？")」って事で、会社、コミュニティ、学校などで自分たちで学習イベントを開催できますよってのをご紹介しました。

このクラウドスキルチャレンジに新しく「 GitHub のコレクション」が追加されました。

普段から使い慣れている方は、当然のように使いこなしている Gi tや GitHub だと思いますが、会社全体やチームでは、まだまだ Git を使ったことが無い方、知っているけど自身のプロジェクトでは使ったことが無いって方もいらっしゃるかもしれません、 GitHub は使っているけど、 Actions を使ってパイプラインの自動化、Pages を使ったドキュメント整備など、使った事が無い機能もあるかもしません。

是非、この機会に体系的に GitHub を学んでいただき、チームや組織全体の開発スキル向上に役立ててくださいませ。

[Git によるソースコード管理と GitHub を用いたチーム開発と自動化](https://docs.microsoft.com/ja-jp/users/kazumihirose/collections/pen0tejrgo1q1w "Git によるソースコード管理と GitHub を用いたチーム開発と自動化")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24782/dda60c07-37cc-f6ec-d9c4-852dca28251c.png)

## 組織全体のスキルを向上させよう

Microsoft Learn を用いた学習をイベントって形で行う開催形態です。
既に日本では延べ数万人近くのエンジニアがクラウドスキルチャレンジを使って学習、資格取得を行っており、一部方は学びの結果をブログなどでも掲載してくださっています。

**NTTデータ さんのクラウドスキルチャレンジの例**

https://zine.qiita.com/interview/202009-microsoft/

**フューチャーアーキテクト さんの例**

https://future-architect.github.io/articles/20211008b/

---

ご興味がある方は、[クラウドスキルチャレンジを企画しませんか？](https://qiita.com/kazumihirose/items/0a980f7ef3943450fb69 "クラウドスキルチャレンジを企画しませんか？")も一読いただき **クラウドスキルチャレンジ事務局** msjpcsc@microsoft.com に、ご連絡ください。
AWS 認定準備ワークショップ 「クラウドプラクティショナー」受講してみた

#はじめに

- 最新情報は、[公式サイト](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)で確認して下さい。
- ワークショップの詳細が知りたい方は、まとめの配布資料を見てね。　※見れなかったらゴメンなさい...。

##受講日時

- 2022年01月12日(水) 10:00 ～ 10:55

##講師

- **生出 拓馬 (おいで たくま) 様**

#アジェンダ

##AWS 認定について

- **基礎(1)**、アソシエイト(3)、プロフェッショナル(2)、専門(5)の11種類
- 認定の**有効期限は3年**で、認定更新（再認定）が必要。
- 次回の受験時に、特典の **"50% 割引バウチャー"** を利用できる。

##AWS Certified Cloud Practitioner 試験について

- **700**/1000（70%）で合格。
- 試験時間は、90分。
- テストセンターか自宅で受験可能。

####試験の出題分野

- 4つの分野から出題され、AWSの全般的な理解が問われます。

| 分野 | 試験に占める割合 |
|:-:|-:|
| 分野１ | クラウドのコンセプト 26 % |
| 分野２ | セキュリティとコンプライアンス 25 % |
| 分野３ | テクノロジー 33 % |
| 分野４ | 請求と料金設定 16 % |
| 合計 | 100 % |

##試験準備

####[ステップ1：試験概要の把握](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)

####[ステップ2：本番試験の申し込み](https://explore.skillbuilder.aws/learn)

####[ステップ3：無料デジタルトレーニングの受講](https://explore.skillbuilder.aws/learn/public/catalog/view/5?dt=sec&sec=lp)

※ワークショップで配布された資料は、旧コースのようでした。最新は、[AWS スキルビルダー](https://explore.skillbuilder.aws/learn/public/catalog/view/5?dt=sec&sec=lp)にあります。

- コース名：AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)
- [初心者向け資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-level-100/)
 - Cloud Practitioner Essentials for Entry 

####ステップ4：技術資料で知識を補強

- [AWS サービス別資料 ★オススメ](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
- [AWS よくある質問](https://aws.amazon.com/jp/faqs/)
- [AWS ホワイトペーパーとガイド](https://aws.amazon.com/jp/whitepapers/)
- [AWS ドキュメント](https://aws.amazon.com/jp/documentation/)

####ステップ5：模擬試験の受験

- AWS Skill Builder から「[AWS Certification Official Practice Question Sets](https://explore.skillbuilder.aws/learn/course/external/view/elearning/9159/aws-certification-official-practice-question-sets-japanese)」に登録

##試験対策のポイント

####分野１
- [AWS のクラウドが選ばれる 10 の理由](https://aws.amazon.com/jp/aws-ten-reasons/)
- [AWS Well-Architected フレームワーク](https://aws.amazon.com/jp/architecture/well-architected/)

####分野２
- [AWS 責任共有モデル](https://aws.amazon.com/jp/compliance/shared-responsibility-model/)
- [IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html)

####分野３
- [AWS グローバルインフラストラクチャ](https://aws.amazon.com/jp/about-aws/global-infrastructure/)
- [AWS サービス一覧](https://aws.amazon.com/jp/products/)
- [AWS サポートのプラン比較](https://aws.amazon.com/jp/premiumsupport/plans/)

####分野４
- [AWS 料金](https://aws.amazon.com/jp/pricing/)

##サンプル問題にチャレンジ

- 各分野3問の出題＆解答

##まとめ

- [配布資料はコチラ](https://handouts-live.s3.amazonaws.com/273feb80d91348a2b36c4c0899be35e6?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20220112T003440Z&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=AKIAJICNIQWVMWBRIUMQ%2F20220112%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=932d36856849c3e35d6fb4d387242960506b2bb1103d9623970c8b75bd22b50a)　※ワークショップ中に受講者以外に配布可能か確認済。

#おわりに
- 次回の受験時に特典の50%OFF使えるの良心的だと感じた。
- 3年更新はCiscoなどと同じか...個人で更新し続けるのは、正直しんどいなぁ（金銭面で(笑)）。
- 試験に合格したら、「 **#AWS認定** 」のハッシュタグを付けて、SNSに投稿しよう。
話題になるかもしれないDart言語について

#はじめに 

この記事はIT系の専門学校に約一年通ってる自分が、IT業界に現役で務めている知り合いに話題の言語について聞いた際に出てきたDart言語について自分なりにまとめた記事です。

#目次
1.Dart言語の今まで
2.Dart言語の特徴
3.Dart言語の例
4.まとめ

#Dart言語の今まで
2011年にGoogleによって開発・公開されたWebアプリケーション開発のためのプラグラム言語です。
当時、Dart言語はJavaScriptの置き換えを狙って開発されたものでした。
しかし、普及はせずに一時期は最も学ぶ価値のないプログラム言語の一位にも選ばれてしまいました。

#Dart言語の特徴
前述でひどい言われようですが、ここでは現在のDart言語の特徴について解説していきたいと思います。

・高パフォーマンス
パフォーマンスが高く、大規模開発にも適しています。
Javaに基本的な文法、仕様は近いので学習コストが低いです。

・オブジェクト指向言語
CやJavaと同じくクラスベースのオブジェクト指向言語です。
すべての型の元がオブジェクトであるという特徴を持ちます。

・静的型付けにも対応
任意で対応させられます。
すべての型を対応させたい場合dynamicキーワードを率いることもできます。
＊静的型付け…実行時の処理が速い、型の整合エラーをチェックできる。
＊動的型付け…直観的にコードを書くことができる。

・Flutter
Flutterはオープンキャンパス、クロスプラットフォームのアプリ開発フレームワークです。
Android/iOSのスマートフォン向けアプリを開発できます。
Googleが開発し、言語にDartを利用します。複数のプラットフォームで高速なアプリケーションを開発できるということでDartの人気を押し上げました。

#Dart言語の例
[DartPad](https://dartpad.dev/?)でDart言語を試すことができます。

簡単な出力プラグラムになります。
Dart言語のプラグラムは必ずmain関数から始まります。

```
main() {
  print('Hello, World!');
}
```

出力結果は以下になります。

```
Hello, World!
```

#まとめ
ここでは細かい言語使用などについては書きませんが、上記の通り基本的な書き方に特に問題ははないので、ある程度プラグラム言語について知識があれば簡単に勉強できると思います。
自分はプログラムはあまり得意ではありませんが、気になったことや共有したいことがあれば投稿していきますので今後ともよろしくお願いします。
ABC82メモ

# ABC82 メモ
## [A - Round Up the Mean](https://atcoder.jp/contests/abc082/tasks/abc082_a)

$a$と$b$を足して2で割った計算結果を切り上げる。<br>
これは$a+b+1$を2で割って切り捨てたものと等しい。<br>

```python:82A.py
a, b = map(int, input().split())

ans = (a+b+1)//2
print(ans)
```

## [B - Two Anagrams](https://atcoder.jp/contests/abc082/tasks/abc082_b)

$s$と$t$を一度リストにして、$s$を昇順、$t$を降順にそれぞれ並び替え、文字列に戻す。<br>
文字列同士の比較演算は、辞書順で比較されるため、問題文通りそのまま比較。<br>

```python:82B.py
s = input()
t = input()

s = list(s)
t = list(t)

s.sort()
t.sort(reverse=True)

s = ''.join(s)
t = ''.join(t)

ans = 'No'

if s < t:
    ans = 'Yes'

print(ans)
```

## [C - Good Sequence](https://atcoder.jp/contests/abc082/tasks/arc087_a)

$x$が$x$個含まれない場合、全て取り除く必要があり、$x$個以上含まれている場合、その差分だけ取り除けば良い。そのためには$x$が何個含まれているかを数える必要がある。<br>
ここで、$1\leq x \leq 10^9$より、リストで管理すると大きくなり過ぎてしまうので、辞書で管理する。<br>

```python:82C.py
N = int(input())
alst = list(map(int, input().split()))

d = dict()
for i in range(N):
    a = alst[i]
    if a in d:
        d[a] += 1
    else:
        d[a] = 1

ans = 0

for i in d.keys():
    if d[i] >= i:
        ans += (d[i]-i)
    else:
        ans += d[i]

print(ans)
```


## [D - FT Robot](https://atcoder.jp/contests/abc082/tasks/arc087_b)

まず、与えられた文字列を、移動と方向転換に分割する。つまり、Fの連続する数だけ進む移動を、Tで区切る、と考える。<br>
例えば、"FFTFFFTFTTFFF"であれば、[2, 3, 1, 0, 3]と移動する。<br>
移動を観察すると、偶数回目の移動においては$y$軸方向にしか移動できず、奇数回目の移動は$x$軸方向にしか移動できないことがわかる。また、$x$軸方向の移動は$y$軸方向の移動に制約を与えないので、$x$軸方向に$x$に到達できるか、$y$軸方向に$y$に到達できるかを独立に考えて、両方が可能である場合、指定された座標に到達可能である。<br>
また、$x$軸方向への移動について、1回目の移動は$x$軸方向正の向きしか行えないが、2回目以降は、正の向き、負の向きをそれぞれ自由に選択できることがわかる。$x$軸方向に移動できる歩数のリストについて、合計を$S$とする。正の向きに移動するとしたものをリストからいくつか選択し、その時の合計を$A$とする。このとき、$A$だけ正の向きに移動し、$S-A$だけ負の向きに移動することがわかる。このとき、最終的な座標は$A-(S-A)=2A-S$より、$2A-S$であるとわかる。これが指定された$x$と一致するようなAが存在すれば良い。<br>
つまり、「各軸方向の移動の数列について、うまく部分和をとることで、与えられた座標に到達できるか」と言い換えることができる。<br>
部分和の計算はDPを用いて計算量が$O(|s|^2)$であり、今回の制約では間に合う。<br>
(計算量の見積もりはあっているのかわからないです。)

```python:82D.py
def calc(lst, s):
    S = sum(lst)
    dp = []

    for i in range(len(lst)+1):
        tmp = [0]*(S+1)
        dp.append(tmp)

    dp[0][0] = 1
    for i in range(len(lst)):
        n = lst[i]
        for j in range(S+1):
            if dp[i][j]:
                dp[i+1][j] = 1
                if j+n < S+1:
                    dp[i+1][j+n] = 1


    if (S+s)%2 or S < s or -S > s:
        return False
    else:
        return dp[-1][(S+s)//2]

s = input()
x, y = map(int, input().split())

lst = list(s.split('T'))
x -= len(lst[0])

Xlst = []
Ylst = []

for i in range(1, len(lst)):
    if i%2:
        Ylst.append(len(lst[i]))
    else:
        Xlst.append(len(lst[i]))

ans = 'No'

if calc(Xlst, x) and calc(Ylst, y):
    ans = 'Yes'

print(ans)
```
gmail から semdgrid を使い smtp 送信

gmailからsendgrid を使いたい。

参考
https://sendgrid.kke.co.jp/blog/?p=9320

APIキーは
settings > API keys > Create API Key
で作成



```
SMTPサーバー：smtp.sendgrid.net（固定）
ポート587（固定）
ユーザー名：apikey（apikeyという文字列で固定）
パスワード：SG　から始まるAPIキー
```

まぁ、これでいいが、

gmail側はけっこういろんなIPを使っているみたいで
IPブロック設定をしていると、弾かれてしまう。

ということで、sendgridで

```

209.11.167.*

```

みたいに ワイルドカードを使ってIPを設定しよう。

# SPF、DKIM のチェック

以下、成功

```
このメールの認証情報
SPF

PASS (IP: 12.34.63.22)

DKIM

PASS (ドメイン: your.com)
```
【簡単】Linuxサーバ（Ubuntu）に管理ツールのCockpitを導入する

ただのエンジニアのメモ書きです。参考程度にしてくださいませ。

# 環境
- GCE（Google Cloud Pratform の Compute Engine）
- Ubuntu 16.04.7 LTS


# 手順
### ① [公式サイト](https://cockpit-project.org/running.html#ubuntu)の方法でインストールする
※ちなみにaptでのインストールもできるみたいです。

```shell
. /etc/os-release
sudo apt install -t ${VERSION_CODENAME}-backports cockpit
```

### ② Cockpitの自動起動設定をする

```shell
sudo systemctl start cockpit
sudo systemctl enable --now cockpit
sudo systemctl enable --now cockpit.socket

# 確認
sudo systemctl status cockpit
sudo systemctl status cockpit.socket
```

### ③ Network Managerがenableだと、Cockpitでネットワーク操作ができないのでオフにする
参考:https://github.com/cockpit-project/cockpit/issues/8477#issuecomment-622253139

```shell
systemctl stop NetworkManager
systemctl disable NetworkManager
```

### ④ GCPのファイアウォール設定で、TCP:9090 を許可する設定をする

VPCネットワーク > ファイアーウォール を開き、以下のように入力する
なお、ここでは**ネットワークタグ**は`cockpit`としています。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855410/b8070c27-862a-656a-70b6-6da2d72f9ac7.png">
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855410/6b36dbee-f036-a3d9-b7fa-200839fed485.png">
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855410/31256729-2a76-9c08-a1b2-e9cc69aa1e84.png">


### ⑤ GCEでファイアーウォール設定を適応する

Compute Engine > サーバ名 > 編集 の下部に、一個上で入力した**ネットワークタグ**を入力する
<img width="916" alt="image.png (44.9 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855410/4d4a6618-d94e-f7b3-9c0c-e99fc6c31a3f.png">


### ⑥ 完成
`https://#{グローバルIP}:9090`にアクセスしてください。
証明書エラーとかでますがそのまま突き進んでください。
以下の画面が出たら成功です。Linuxにログインする**IDとPWで**入れます。

<img width="2938" alt="image.png (221.9 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855410/d3e7b18b-a11c-53c9-3a0e-bafcf52c2c39.png">

# あとがき
Ubuntu 18.04.6 LTSは`NetworkManager`をオフにしなくても大丈夫でした。
もしかしたらUbuntu16系固有のバグなのかも？
Obsidianの小技その7｜ノートに画像を貼る

## はじめに

つねに開きっぱなにしているMarkdownメモツール[Obsidian](https://obsidian.md)。1年ぐらい使ってみたので、脳に余白をつくり、ストレスフリーになれる、いいかんじの小技をご紹介してみたいとおもいます。

## ノートに画像を貼る

こんなかんじで、ノートに画像を貼っておくと便利です。文を書くと長くなることでも、写真やスクショがあれば一発でわかるようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/65153a83-c568-d0ec-65a4-5f0ceb959a17.png" width=50%>

やり方は`外部リンク`と`ファイルリンク`の両方がつかえます。

### 外部リンク

画像のURLがわかれば、外部リンクに`!`をつければ、ノートに画像が表示されます。

```markdown
![なんでもいい](https://xxxxx.xx.xx)
```

たとえば、

```markdown
![img](https://cdn.vox-cdn.com/thumbor/Jq2U5Fpx0gbUy07-aWk1Tg_iVtg=/0x0:1100x619/1200x800/filters:focal(462x222:638x398)/cdn.vox-cdn.com/uploads/chorus_image/image/57691131/17335_3_1100.0.jpg)
```
↓
<img src="https://cdn.vox-cdn.com/thumbor/Jq2U5Fpx0gbUy07-aWk1Tg_iVtg=/0x0:1100x619/1200x800/filters:focal(462x222:638x398)/cdn.vox-cdn.com/uploads/chorus_image/image/57691131/17335_3_1100.0.jpg" width=50%>

ですね。

### 内部リンク

PCローカルのファイルに対しては、ファイルリンクに`!`をつければ、ノートに画像が表示されます。

```markdown
![なんでもいい](file://フルパス)
```

ファイルリンクのやりかたはこちら↓
[Obsidianの小技その6｜PC上のファイル・フォルダへのリンクを貼る - Qiita](https://qiita.com/hann-solo/items/992e93a417ef4e2ba536)


## おわりに

わたしはObsidianのたくさんある機能のなかでも、「画像を貼る」はもっとも役立つんじゃないかとおもっています。

ただ、いくつかの小技が連携して「おおべんりだ」となるのですよね……。もう少し具体的にかくと、

- タスクログを書く
- ローカルの画像データをクラウドにおく
- タスクログに、クラウドの画像データを貼る
- 画像をアップロードして貼る作業を簡素化する

とすごく便利で、脳に余白をつくる効果が絶大だとおもうのです。

これらの小技たちは、別記事でご紹介したいとおもいます。

### ご参考

[Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)
django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known

# DockerのPostgreSQLが立ち上がらなくなった

昨日まで普通に立ち上がっていたのに。。

## 出たエラー

```
django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known
```

## 対処

docekrでのゴミを削除する

```
docker-compose down
docker system prune
```

めちゃくちゃ削除された。

![ 2022-01-12 11.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/1b7e16fa-21c9-c24f-e553-f268dd1afab7.png)


## 正常に立ち上げるようになりました。
Safariにアドブロッカーが入っていたら画像ファイル名が advertisement だと全く読み込まない

Safariにアドブロッカーが入っていたら
画像ファイル名に advertisement というワードがはいってると
imgタグでも背景画像でも全く読み込まない。

画像名を変えるしかない。

というメモ。
Ruby on Railsの環境構築【初心者用】

# 動機

シンプルに手順を示した記事が無かったため作成。
できる限りシンプルにまとめました！
とりあえず手元のPCでRailsを動かせるようになることを目的としていますので細かい説明は省略しています。
環境構築が終わってから、コマンドで具体的に何を行っているのか、一つずつ調べていきましょう。

# 環境

macOS Monterey 12.1


# ひたすらインストールしていく

ターミナルを開いてコマンドを入力していってください。
### Command Line Tools

コマンドラインツール
    
```
xcode-select --install
```
    
### Homebrew

macのパッケージ管理ツール
    
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
    
### rbenv

Rubyのバージョン管理ツール

```
brew update
brew install rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
```
    
### Ruby


プログラミング言語のRuby
3.0.3はバージョンを示しています。
3.0.3がインストールできない場合は`rbenv install -l`で表示されるバージョンを指定してください。
    
```
rbenv install -l
rbenv install 3.0.3
rbenv global 3.0.3
```



### bundler
    
Gem(ライブラリ)のバージョン管理ツール

```
gem install bundler
```
    
### yarn
    
Rails内におけるJavaScriptのバージョン管理ツール
    
```
brew install yarn
```


### Ruby on Rails
Webアプリケーションフレームワーク
    
```
gem install rails --no-document
```
    

# 動作確認して完了！

以下のコマンドを実行します(数分程かかります)

```
rails new sample_app
cd sample_app
rails server # Ctrl+Cで停止
```

ブラウザ(chromeでもsafariでもOK)のURL欄に `http://localhost:3000` と入力して、以下のような画面が表示されれば環境構築成功です！お疲れさまでした！
![Screenshot 2022-01-12 11.05.05.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499119/2c431581-6885-0d89-8fb7-7252464165b6.jpeg)



最後のコマンドはサーバーを起動するコマンドです。
Ctrl + C で停止しておきましょう。

動作確認用アプリの削除は以下のコマンド。

```
cd ..
rm -rf sample
```
sendgrid php で smtp 送信 ライブラリ無しでもOK

今回は cakeemail を使用。
メールサーバーってマジで不安定だから大変。
しかも最近はAPI送信とかになっているからsmtpの送信方法が無くて困る。

以下の方法ならアカウントを設定するだけだから
ライブラリとか必要無しで送信できるので便利。


ということで早速方法。

sendgridを利用

https://sendgrid.kke.co.jp/docs/API_Reference/SMTP_API/integrating_with_the_smtp_api.html



まずはメールの設定です

```

public $default = array(
    'host' => 'smtp.sendgrid.net',//固定
    'port' => 587,//固定
    'transport' => 'Smtp',//固定
    'username' => 'apikey', //固定
    'password' => 'SG.Uxxxxxxxxxxx229',//要変更 パスワード
    'from' => 'you@localhost',//任意
);


```

こんな感じで固定って書いてあるのは sendgrid の規則に従って書いてください。

たったこれだけで送信できるようになる。

また、接続元のIPアドレスを sendgrid側で制限をしている場合は、
一度メールを送信して、エラーになるとIPが sendgrid に表示されるので、それを allow して送信許可して再度送信してみる。

すると送信できるようなる。
2台のPCを有線LANでファイル共有するTips（Windows 10）

便利だったので自分用に備忘録。

-----------------------

1. 2台のPCを有線LANで接続する。

2. 送信したいファイルをフォルダにまとめる。
　 例)\Desktop\ファイル共有

3. フォルダを右クリックし、「アクセスを許可する」＞「特定のユーザー」

4.「ネットワーク アクセス」のポップアップが出てくるので、プルダウンメニューから「Everyone」を選択。「追加」ボタンを押す

5. 共有相手の一覧に「Everyone」が追加されたことを確認したら、「共有」ボタンを押して画面を閉じる。

6. フォルダのURLが表示されるので、受け取る側のPCのエクスプローラでそのURLを打ち込むと、2で作成したフォルダが表示される。
   例)　\ \TestComputer\Users\test\Downloads\ファイル共有
vue-cropperjsのオプションメモ

## はじめに
vue-cropperjsでは呼び出し時にv-bindで各オプションを設定します。
template内での記載は以下のようになります。

``` html
<vue-cropper
  ref="cropper"
  :view-mode="2"
  :auto-crop-area="1"
  :aspect-ratio="16 / 10"
  :min-container-width="640"
  :min-container-height="360"
  :img-style="{ 'width': '500px', 'height': '500px' }"
  drag-mode="none"
/>
```

## 画像切り抜き時のアスペクト比を固定する
画像切り抜き時のアスペクト比を固定したい場合、
`:aspect-ratio="width / height"`
と設定すると比率が固定されたまま切り抜きを実行できます。
16:9の画像を設定する場合、
`:aspect-ratio="16 / 9"`
となります。

## 画像選択後のCropAreaを画像幅全体にする
画像を切り抜きしたい時に、画像サイズが適正でも、画像いっぱいに切り抜きウインドウが表示されていないとドラッグ&ドロップでウインドウを拡大してから確定しなくてはいけない手間がありました。
オプションで
`:auto-crop-area="1"`
を設定すると画像幅全体に切り抜きウインドウが表示されます。

- 設定前
![スクリーンショット 2022-01-12 10.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268314/819e758f-9bba-09d6-cd65-b99454eb4b0d.png)

- 設定後
![スクリーンショット 2022-01-12 10.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268314/c0ff17a0-c972-dda8-e5da-df3b87356b7d.png)
Gmailで古いどうでも良いメールを定期的に削除する

# 用途

あまり重要でないメールを定期的に掃除します

# 仕様

- 手動で実行，または定期的に自動で実行します
- 100日以上経ったメールのうち「プロモーション」に分類され，重要フラグまたはスターフラグが付いていないものを削除します
- 削除を分割して繰り返すのはGoogleのマニュアルにそうするように書いてあったため

# 使い方

1. https://script.google.com にてスクリプトを新規作成
1. 左メニューの「スクリプトの設定」で「appscript.jsonマニフェストをエディタで表示」にチェック
1. エディタに戻ってコード.gsとappscript.jsonを入力，保存
1. purgeMails()を実行してみるとGmailへのアクセス許可を求められるので許可する
1. activate()を一度実行すると定期的に実行するトリガーが設定されます

```javascript:コード.gs
// トリガーの設定
function activate() {
  ScriptApp.newTrigger("purgeMails")
           .timeBased().everyDays(1).create();
}

// トリガーの取り消し
function deactivate() {
  ScriptApp.getScriptTriggers()
            .forEach(tirgger => ScriptApp.deleteTrigger(trigger));
}

// メールの削除
function purgeMails() {
  const daysToKeep = 100; // 保存期間

  // 日付文字列の生成
  let day = new Date();
  day.setDate(day.getDate() - daysToKeep);
  const dateString = day.getFullYear() + "/" + (day.getMonth() + 1) + "/" + day.getDate();

  // 削除条件
  let criteria = [
    "before:" + dateString,
    "category:promotions",
    "-label:important",
    "-is:starred"
  ];
  criteria = "(" + criteria.join(" ") + ")";
  let threads = [0];

  // 残り0になるまでメール削除
  while(threads.length > 0) {
    threads = GmailApp.search(criteria, 0, 500);
    Logger.log("purgeMails: " + criteria + " => " + threads.length + "threads");
    threads.forEach(thread => thread.moveToTrash());
  }
}
```
```json:appscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "oauthScopes": [
      "https://mail.google.com/",
      "https://www.googleapis.com/auth/script.scriptapp"
    ],
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

### 参考

- https://gist.github.com/balupton/9800939
- https://developers.google.com/apps-script/reference/gmail/gmail-app#search(String)
インタープリタを作る その35

#概要

インタープリタを作ってみた。
jsforthを使ってみた。
サウンド拡張する。
ドレミ、やってみた。

#サンプルコード

```
play" ドドソソララソソファファミミレレドドソソファファミミレレソソファファミミレレドドソソララソソファファミミレレド"

```

#成果物

https://embed.plnkr.co/plunk/OGxI4fZKkX7jZE7f

以上。
Rubocopを使って、Rubyのマジックコメントを coding: utf-8 から frozen_string_literal: true に修正する(一括置換)

Rubyのマジックコメントを、`# -*- coding: utf-8 -*-` から　`# frozen_string_literal: true` に一気に書き換えたい場合、以下の2つのコマンドを流せば、そのディレクトリ以下にあるRubyのすべてのファイルで、マジックコメントが encoding: utf-8 から　frozen_string_literal: true に書き換えられる

```shell
rubocop --only Style/Encoding -a
rubocop --only Style/FrozenStringLiteralComment -a 
```
`-a ` オプションを削除して実行すると、ファイルは変更されずに変更箇所のリストアップだけされるので、最初はそれで試してみるのが良いかも

## 参考

- [Class: RuboCop::Cop::Style::Encoding — Documentation for rubocop (1.24.1)](https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/Encoding)
- [Class: RuboCop::Cop::Style::FrozenStringLiteralComment — Documentation for rubocop (1.24.1)](https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/FrozenStringLiteralComment)
SPSS Modeler ノードリファレンス 1-1 可変長ファイル（テキストファイル）


# 1-1 可変長ファイルノード[入力タブ]
<img width="200" alt="スクリーンショット 2022-01-12 10.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0bf82b33-80aa-3b1d-7433-bccf9cd68b0f.png">

## 1.ノードの目的
CSVやタブ区切りなどのテキストファイル形式のデータを読み込みます。

## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/pp5MPiLancg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3.クイックスタート

①ファイルタブの[ファイル：]の[...]ボタンから読み込むファイルパスを指定します。
（またはエクスプローラからCSVファイルをストリーム領域にドロップ）
＊サンプルのCSVデータは[5.参考情報]からダウンロードできます。

② [OK]ボタンで完了です。画面上のプレビューでデータが表示されます。
![スクリーンショット 2022-01-12 10.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/53f94c79-0908-68b7-b027-132974bf2e10.png)


![スクリーンショット 2022-01-12 10.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0e6a2888-eb27-7549-1168-0ac1550d38b8.png)

### うまく読めない場合のヒント
Mac版ではデータの文字コードがUTF-8である必要があります。Shift-JISでは文字化けします。予めテキストエディタで変換しておいてください。

![スクリーンショット 2022-01-12 10.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d17741e7-7060-d99e-4a96-d68d8a4b3900.png)

先頭レコード(先頭行)がフィールド名でない場合には以下のチェックを外します。
![スクリーンショット 2022-01-12 10.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e94d2aa6-272f-a8d1-59bf-be1d9192a904.png)

桁ずれしている場合には区切り文字や引用符を確認して適宜設定します。
![スクリーンショット 2022-01-12 10.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e7d3c8ad-6963-487f-a70f-81be5bddb5d1.png)
＊金額に含まれるカンマは桁ずれの原因になりますので、予め処理するかタブ区切りなどを使います。

[商品名]などの文字列の前後に空白が入っていて、後続処理（結合）などでトラブルになることを防ぐため以下の設定が重宝します。業務的な特殊（不正）文字の処理も役に立ちます。
![前後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c9596765-3466-4ac4-7e5a-a63730bf6169.png)


## 4.Tips

#### 文字列や日付などのデータタイプの確定
例えば顧客番号や商品番号を文字列で扱うか整数で扱うかを曖昧にすると後続のテーブル結合で思いがけない不一致が起きます。[データタブ]で読み込み時点で強制的に文字列に上書きすることをお勧めします。その際前後の空白文字の有無にも注意してください。

![スクリーンショット 2022-01-12 10.33.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aebc27d2-c8c7-3c3f-6338-cbcf1970b925.png)
#### 商品コードや電話番号は文字列に
[03********]のようなゼロから始まるコードや番号は整数で読み込むと先頭のゼロが欠落するために[文字列]として扱います。

#### 不要なフィールドの除外

不要なフィールドは[フィルタ-タブ]で除外することが可能です。
![スクリーンショット 2022-01-12 10.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/52228980-6402-a652-7485-cb7487ea8581.png)

#### 値の読み込み

[データ型タブ]で[値の読み込み]ボタンを押して値を確定をしておくと、後続の[再構成]や[行列変換]、[データの分類]の直前に[データ型ノード]を配置する必要がなくなります。
![スクリーンショット 2022-01-12 10.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6037fb0e-a647-7af1-cc6f-f1a1a3929fce.png)



## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/attitude.csv

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=node-setting-options-variable-file

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

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

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

https://qiita.com/416nishimaki/private/503037195081d3323eee
TypeScript: <T>の書く位置チートシート

この投稿はTypeScriptのジェネリクスの型変数(type parameter)をどこに書くのかのチートシートです。

## `<T>`の書く位置まとめ

- 関数宣言
- 関数式
- アロー関数
- メソッド宣言
- 関数型
- コンストラクタ型
- 関数シグネチャ
- コンストラクタシグネチャ:
    - 引数リスト`()`の直前
- クラス宣言
- インターフェース宣言
- 型エイリアス:
    - 識別子の直後

## `<T>`の書く位置チートシート

### 関数宣言

```ts
function name<T>() {}
```

### 関数式

```ts
const name = function <T>() {};
const name = function* <T>() {}; // ジェネレーター
const name = function name<T>() {}; // 名前付き関数式
```

### アロー関数

```ts
const name = <T>() => {};
const name = <T,>() => {}; // コンパイラオプションのjsxがnone以外のときは、JSXと解釈されないように「,」を書く
const name = async <T>() => {}; // 非同期関数
const a = {
  method: <T>() => {},
};
```

### クラス宣言

```ts
class Name<T> {}
```

### メソッド宣言

```ts
// クラス宣言
class Name {
  method<T>() {}
}

// オブジェクトリテラル
const a = {
  method<T>() {},
};
```

### インターフェース

```ts
interface Name<T> {}
```

### メソッドシグネチャ

```ts
// インターフェース宣言
interface Name {
  method<T>();
}

// 型エイリアス
type A = {
  method<T>();
};
```

### 関数シグネチャ

```ts
type A = { <T>(): any };
```

### コンストラクタシグネチャ

```ts
type A = { new <T>(): any };
```

### 関数型

```ts
type A = <T>() => any;
```

### コンストラクタ型

```ts
type A = new <T>() => any;
```

### 型エイリアス

```ts
type A<T> = any;
```