OmniAICreator/Qiita-1.07M huggingface dataset:
No9_ググったこと投稿(5分)_Laravel_ORM（Object Relation Mapping）ってなんだっけ

## ORMとは
オブジェクト指向プログラミング言語において、データベースのテーブルとオブジェクトを関連付けるためのフレームワークやライブラリのこと。
つまり、データベースのテーブルをオブジェクト指向的なデータ構造に変換し、プログラム上で扱いやすくするための仕組み。


なんとなく言ってることはわかるけど・・・って感じですよね！
なので下記にわかりやすい例を

例えば、データベースのテーブルがあったとします。
```
SQL)
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```

このテーブルをオブジェクトマッピングを利用することで、下記のようにPHPのクラスにマッピングできる。

```
class User {
    public $id;
    public $name;
    public $email;
    public $created_at;
    public $updated_at;
}
```

オブジェクトマッピングを利用することで、データベースのテーブルとオブジェクトを自動的にマッピングすることができます。
このように、ORMを利用することで、データベースとオブジェクトのマッピング作業を効率化できる！！！
Fortran でバケツソートを書いてみる

Fortran には言語標準のソート機能がありません。

たとえば特定コンパイラのサービスサブルーチンをあてにできる、といった状況ではないと、作るしかないんですね。
それも、あらゆる型のオブジェクトを指せるポインタ（Cでいう`void *`）なんかないので、一々書かねばならないのですよね。

まあそうはいってもやらねばならないことがあるわけです。簡素で頑健なアルゴリズムを選びたいわけです。そんなとき、ソートキーが小さな範囲の整数であれば、バケツソートが簡素・頑健・高速で超嬉しいです。高速も高速、なんと O(N) の爆速アルゴリズムです。ただしメモリを食います。

実用したものではなく簡明な例をあげておこうと思います。たとえば次のようなファイルをソートしたいとします。

```
47662 0 35 41 30N139 45 04E    24.2    25.2        TOKYO                           
47663 0 34 04 11N136 11 36E    17.1    15.3        OWASE                           
47666 0 34 36 13N138 50 34E    53.2    52.2        IROZAKI                         
47668 0 35 02 47N139 05 31E    67.9   66.94        AJIRO                           
47670 0 35 26 23N139 39 09E   42.74    39.1        YOKOHAMA                        
47671 0 35 33 12N139 46 52E    9.41    6.41        TOKYO INTERNATIONAL AIRPORT     
47672 0 34 59 13N139 51 55E     7.1     5.8        TATEYAMA                        
47674 0 35 09 03N140 18 44E    13.5    11.9        KATSUURA                        
47675 0 34 44 58N139 21 47E    75.5   74.00        OSHIMA                          
47677 0 34 07 26N139 31 17E    39.6    37.7        MIYAKEJIMA                      
47678 0 33 07 18N139 46 45E   152.6  151.21        HACHIJOJIMA
```

（気象庁の国際地点番号表を列も減らしタブ区切りを固定長にして抜粋したものです）

先頭５桁数字が 00001〜99999 であることが保証されているとして、これをソートするのはこんなふうに書けます。
とりあえず write していますが、オンメモリで処理したい場合には type(stndict) 型の配列に書いていくわけですね。

```Fortran:sortdic.f90
program sortdic
implicit none
type stndict
  integer:: idx
  integer:: subidx
  character(9):: lat
  character(10):: lon
  character(8):: hp
  character(8):: hha
  character(8):: zfl
  character(32):: stnname
end type
type(stndict):: r
type(stndict):: ibuf(20000)
integer, allocatable:: bucket(:)
integer:: ios  ! 入出力ステータス
integer:: ir  ! レコード番号
integer:: nr  ! レコード数
integer:: idx  ! ソートキー
! ファイルのレコード構造
4000 format(i5.5,x,i1,x,a9,a10,3a8,a32)
! エラーメッセージの書式 
490 format(a,i6.5)
do, ir = 1, size(ibuf)
  read(*, 4000, iostat=ios) r
  if (ios /= 0) exit
  ibuf(ir) = r
enddo
nr = ir - 1
allocate(bucket(99999))
bucket(:) = 0
do, ir = 1, nr
  idx = ibuf(ir)%idx
  if (idx <= 0) then
    print 490, '# too small idx', idx
  else if (idx > size(bucket)) then
    print 490, '# too large idx', idx
  else if (bucket(idx) /= 0) then
    print 490, '# dup idx', idx
  else
    bucket(idx) = ir
  endif
enddo
do, idx = 1, size(bucket)
  ir = bucket(idx)
  if (ir == 0) cycle
  r = ibuf(ir)
  write(*, 4000) r
enddo
end program
```
【お手軽】DockerでFuelPHPを使いたい方へ

# TL;DR
- composerを使います(composer無しの時のverだと若干辛いので)
- お手軽にFuelPHPを弄りたい方向け

# 前置き
- FuelPHPで実装されたソースコードをローカルで動かす機会があった
- DockerでFuelPHPの環境構築をした時の内容をまとめてみた

# ディレクトリ構成

`fuel-app` : アプリケーション
`docker/fuel-app` : buildや起動時に使うファイル
`compose.yaml` : アプリケーションサービスの設定ファイル

```shell
.
├── docker/
│   └── fuel-app/
│       ├── Dockerfile
│       └── php.ini
├── fuel-app/
└── compose.yaml
```

## Dockerfile

composerをマルチステージビルドを利用して使えるようにする

```dockerfile:docker/fuel-app/Dockerfile
FROM php:5.6-alpine

COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer
```

## php.ini

最低限タイムゾーンのみ設定します

```ini:docker/fuel-app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
```

## compose.yaml

```yaml:compose.yaml
version: "3"

services:
  fuel-app:
    build:
      context: .
      dockerfile: ./docker/fuel-app/Dockerfile
    volumes:
      - ./docker/fuel-app/php.ini:/usr/local/etc/php/php.ini
      - ./fuel-app:/var/www
    working_dir: /var/www
    ports:
      - "8080:8080"
    command: "php -S 0.0.0.0:8080 -t public"
```

# やってみよう

:::note warn
注意
コマンドは`compose.yaml`がある階層で実行する
:::

### 1. build

```terminal
$ docker compose build
```

### 2. composer create-project

```terminal
$ docker compose run -u "$(id -u):$(id -g)" --rm fuel-app composer create-project fuel/fuel --prefer-dist .
```

実行後は以下のようになる

![スクリーンショット 2023-04-04 22.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/2649ebe4-14ae-d8e6-8283-bfa8d7329c30.png)

### 3. run

```terminal
$ docker compose up -d
```

`localhost:8080` でサーバーが立ち上がっているのでブラウザで確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697698/377e6796-41ab-f963-028f-e1360074feed.png)

# 参考
[FuelPHP Documentation](https://fuelphp.com/docs/installation/instructions.html)

# リポジトリ
https://github.com/Aruminium/fuelphp-docker-composer
「プログラマー脳」のchapter2「コードを速読する」

# 目次
[1.初めに](#1-初めに)
[2.コードを読むことが重要な理由](#2-コードを読むことが重要な理由)
[3.コードを速読する中で以下を意識する](#3-コードを速読する中で以下を意識する)
[4.【プログラマー脳】Chapter](#4-プログラマー脳chapter)


# 1. 初めに
「プログラマー脳」という本を読んでいます。
その中で印象に残ったことや大事だなと思う部分をまとめています。
自分の理解の必要に応じて自分が慣れているJavaScriptで処理を書いています。

# 2. コードを読むことが重要な理由

プログラマーの時間の60%はコードを書くよりも理解することに時間を費やす。

→ **コードを素早く正確に読むことがプログラミングの向上につながる**

### コードを読む目的
  - 機能を追加
  - バグを探すため
  - 巨大なシステムを理解するため

目的の共通点はコード中に存在する特定の情報を見つける必要があるということ

つまり、**関連する情報を素早く見つけられるようになることが重要**

では、素早く見つけるにはどうすればいいのか

# 3. コードを速読する中で以下を意識する

- 文字やキーワードのような細かい情報で覚えない
- 何を覚えたのかではなくてどのように覚えたのかを意識する
- 新しい情報は認識可能な塊(抽象的な概念)として分割する


### 文字やキーワードのような細かい情報で覚えない

下記の2つの文を5秒以内に覚えてください
```
tse cvake aeos
```

```
cat loves cake
```

1つ目の行よりも2つ目の行の方が覚えられたと思います

1つ目の行は12文字を全て覚えなければいけないのに対して、
2つ目の行は意味のある3つのワードを覚えればいいだけです。
すなわち、短期記憶で覚えるには限界があるため細かい情報よりも塊として覚えた方が良いです




### 何を覚えたのかではなくてどのように覚えたのかを意識する

記憶できた内容そのものだけでなく、どのようにコードを記憶したのかという順序も理解のために使える

下記の文字を全て記憶してみてください
```
CASE THEN IF SWITCH DEFAULT ELSE IF AND FALSE OR IS TRUE
```

以下のようにグルーピングができます
- IF TRUE FALSE THEN ...
- CASE SWITCH ...

プログラミング(今回はJavaScript)を理解している上級者であるとJavaScriptの文法をもとにグルーピングを行い、多くの文章を記憶しておくことができます

- 塊にしやすいコードを書く方法
  - デザインパターンを利用する
  - コメントを書く
  - ビーコンを残すこと


(ビーコンとは、コードをながめたときに「ああ、なるほど」と思わせるようなコードの行のこと)

### 新しい情報は認識可能な塊(抽象的な概念)として分割する
長期記憶に十分な関連情報があれば、文字やキーワードの単純な情報ではなく、「JavaScriptにおけるfor文」や「sort関数によるlogの出力」のような抽象的な概念として記憶できるため、必要な短期記憶の容量が少なくて済む

下記のコードはどのように覚えるのかを考えながら書いてみました

```typescript
const sortArray = (array) => {
  for (let i = 0; i < array.length; i++) {
    for (let j = i + 1; j < array.length; j++) {
      if (array[j] < array[i]) {
        // iとjを交換する
        let temp = array[i];
        arr[i] = array[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}

// ソートした配列を出力
console.log(sortArray([14,3,4,6,22,15,2])) // [2,3,4,6,14,15,22]
```

- 「for (let i = 0; i < array.length; i++) 」や「console.log()」はJavaScriptの知識のため、それらが長期記憶に含まれていれば、無理に覚える必要も考える必要もありません。
- ソートの処理が長期記憶に入っていれば、配列の要素を比べて要素の順番を入れ替える処理が必要であることを知っています(JavaScriptのsort関数は今回は使わない想定です)
- 「iとjを交換する」や「ソートした配列を出力」のようにコメントを先に書いて、後で実装するというやり方も記憶を呼び起こすためには有効です。


# 4. 【プログラマー脳】Chapter

[「プログラマー脳」のchapter1「コーディング中の混乱を紐解く」](https://qiita.com/kosuke-17/items/b64f9450ebbd99b274d5)
Now →[「プログラマー脳」のchapter2「コードを速読する」](https://qiita.com/kosuke-17/items/645babd7445203f4734a)
[「プログラマー脳」のchapter3「プログラミング言語の文法を素早く習得する方法」](https://qiita.com/kosuke-17/items/67220ced21104ddda933)
[「プログラマー脳」のchapter4「複雑なコードの読み方」](https://qiita.com/kosuke-17/items/4b1348afe3ba74d6d4de)
[「プログラマー脳」のchapter5「コードの深い理解に到達する」](https://qiita.com/kosuke-17/items/77794aa78c9b8d51a1aa)
【TODO】「プログラマー脳」のchapter6「プログラミングに関する問題をよりうまく解決するには」
【TODO】「プログラマー脳」のchapter7「思考に潜むバグ」
【TODO】「プログラマー脳」のchapter8「より良い命名を行う方法」
[「プログラマー脳」のchapter9「汚いコードとそれによる認知的負荷を避けるための2つのフレームワーク」](https://qiita.com/kosuke-17/items/e5750ba01fc742a3b142)
【TODO】「プログラマー脳」のchapter10「複雑な問題をより上手に解決するために」
【TODO】「プログラマー脳」のchapter11「コードを書くという行為」
【TODO】「プログラマー脳」のchapter12「より大きなシステムの設計と改善」
【TODO】「プログラマー脳」のchapter13「新しい開発者のオンボーディング」
InvalidOperationException: Prefab PlayerController (Fusion.NetworkObject) has not been added to the ObjectTable.の解決方法

# はじめに

Photon Fusionを使用している際にResourceフォルダからPlayerControllerをスポーンしようとしたらこのようなエラーが出たので、解決方法をメモしておきます。

### 手順
Fusion>Rebuild Prefab Table を実行する

![スクリーンショット 2023-04-04 22.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289319/84187845-0851-ab4f-79c9-b0ffec30f0be.png)


# 参考文献
https://doc.photonengine.com/ja-jp/fusion/current/manual/prefabs
海しるAPIが新しくなったらしい

海上保安庁で運用されているシステムである「海しる」の公開APIである「海しるAPI」の新しいバージョン（v2）が出ていたことに気づいたので、使用方法や使用感、感想等について忘れないうちにメモする

# 1\. 海しるとは？
>「海しる（海洋状況表示システム）」は、さまざまな海洋情報を集約し、地図上で重ね合わせて表示できる情報サービスです。

[海しる](https://www.msil.go.jp/)

その中でも「海しるAPI」は公開されている情報を、JSON、GeoJSONまたはPNGで取得できる。

https://portal.msil.go.jp/



# 2\. 実際に使ってみた
アクセスするためにはキーが必要なため、公開されているサブスクリプションキーを使用することにした。

項目一覧から公開されているAPIを探すとまだわかりやすい。
~~正直に言うと、どのバージョンが最新なのかわかりにくいのでどうにかしてほしい...~~

今回はゴジラで若干話題になった「海底地形名」のAPIを叩いてみる。
<img width="750px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2264935/303c9949-6e9d-9f9e-d81f-866375baa50c.png">

同じページにリクエストするためのパラメータの説明が記載されていた。海しるはArcGISを使用しているため、~~当たり前といえばそうだが~~ ArcGISのrestと同じようなアクセスができそうに見える。


右上の「TryIt」のボタンからAPIを叩くことができるみたい。
<img width="750px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2264935/3c881f72-c832-96db-f7e2-e14cfcbf09d8.png">

:::note info
LayerSelectionのパラメータはジオメトリに応じて数字を入力する
:::

必要最低限のパラメータを入力して一番下にある「Send」ボタンをクリックすると出力できる。
例えば、`https://api.msil.go.jp/undersea-features/v2/MapServer/1/query?f=json&geometryType=esriGeometryEnvelope&spatialRel=esriSpatialRelIntersects&units=esriSRUnit_Meter&returnGeometry=true HTTP/1.1`の状態で「Send」ボタンをクリックすると下のようにリクエストのとおりJSONを出力できる。

```出力結果
省略
...
 "features": [{
        "attributes": {
            "海底地形名": "東崎堆",
            "かな": "あがりざきたい",
            "Undersea_Feature_Name": "Agarizaki Bank",
            "属名": "堆",
            "水深": 66,
            "呼称の由来": "近傍地名に由来（与那国島東崎）",
            "由来_En": "Named from the nearby feature/s.",
            "会議名": "第12回海洋地名打合せ会 (1981)",
            "JCUFN_approved": 1981,
            "SCUFN_approved": null
        },
        "geometry": {
            "x": 123.10833333300002,
            "y": 24.470000000000027
        }
    }, {
        "attributes": {
            "海底地形名": "粟国海盆",
            "かな": "あぐにかいぼん",
            "Undersea_Feature_Name": "Aguni Basin",
            "属名": "海盆",
            "水深": null,
            "呼称の由来": "近傍地名に由来（粟国島）",
            "由来_En": "Named from the nearby feature/s.",
            "会議名": "第9回海洋地名打合せ会 (1977)",
            "JCUFN_approved": 1977,
            "SCUFN_approved": null
        },
        "geometry": {
            "x": 127.0166666670001,
            "y": 26.53333333300003
        }
    }, {
...
省略
```

:::note info
今回は、海しるAPIのページに用意されていた「TryIt」を使用したが、
pythonのurllib.requestや、curl等のアクセス用のサンプルリクエストも用意されているみたい
:::

# 3\. おわりに
海しるAPIのv1と、v2の違いとしては、
「海しる」に掲載されている属性情報がAPIで取得できるようになったことも大きいが、
最大のメリットは、リクエスト方法がArcGISっぽくなったことだと思う。


海しるAPIで、何ができて何ができないかもう少し調べてみたい。
【MySQL】非相関サブクエリと相関サブクエリについて

## はじめに
非相関サブクエリと相関サブクエリについて学んだので、メモ代わりに書いていきます。
こちらの書籍で学習しました。
https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AESQL-Alan-Beaulieu/dp/4873112818

## サブクエリとは
サブクエリとは、別のSQL文に含まれるSQLで、細かい条件を決める時などに使います。サブクエリは、常に（）で囲まれており、含む側のSQLより先に実行されます。

## サブクエリの種類
サブクエリには、大きく分けて2つの種類があります。

### ○非相関サブクエリ
これは自己包含型のサブクエリで、update文とdelete文を除くと、サブクエリを使用するときはこちらを使用することがほとんどです。
このサブクエリは単体で実行されて、含む側の分の何かを参照しません。つまり、WHERE句の中で条件を指定する時に、()内でサブクエリを書いて条件指定しますが、()内のクエリ文単体で条件を指定することができます。
例文を書いていきます。
```
SELECT account_id, product_cd, cust_id, avail_balance
FROM account
WHERE open_emp_id <> (SELECT e.emp_id
FROM employee e INNER JOIN branch b
ON eassigned_branch_id = b.branch_id
WHERE e.title = 'Head Teller' AND b.city = 'Woburn');
```
### ◾️複数行/単一列のサブクエリ
複数行/単一列のサブクエリには以下のような種類があります。
|演算子の種類|
|:-:|
|in演算子|
|all演算子|
|any演算子|

一つ一つの説明はまた追記したいと思います。

### ◾️複数列のサブクエリ
続いて、複数列のサブクエリです。今までのサブクエリは、列が１つだけでしたが、複数列のサブクエリを使用できる状況もあります。

このクエリ文は、条件にクエリ文で出力されたe.emp_idとopen_emp_idが同じデータの出力をするクエリ文です。このように、非相関サブクエリは、()内のサブクエリを単体で行い、条件の指定に使用することができます。

### ○相関サブクエリ
このサブクエリは、含む側の文に依存します。つまり、含む側のクエリの列を1つ以上参照するとう点において、含む側の文に依存します。
例文を書いていきます。
```
SELECT c.cust_id, c.cust_type_cd, c.city
FROM custmer c
WHERE 2 = (SELECT COUNT(*)
FROM account a
WHERE a.cust_id = c.cust_id);
```
一番下のc.cust_idに注目です。こちらは含む側の文から参照されている値で、非相関サブクエリには無い書き方でした。
このサブクエリの条件は、accounテーブル内のa.cust_idとc.cust_idが同じデータの合計が2の値が返された場合、フィルタ条件を満たされるので、その行が結果セットとして追加されることになります。
相関サブクエリには以下のような演算子があります。
|演算子の種類|
|:-:|
|exists演算子|

この2つのサブクエリを使用する状況としては、先ほども少し説明しましたが、SELECT文を使用して、データを取得してくる時は非相関サブクエリを使用して、UPDATE文やDELETE文を使用する時は相関サブクエリを使用していきます。
KiCadのfreeroutingプラグインのGUIの言語設定（暫定手段）

# この記事の前提とする版数情報
- KiCad  7.0
- freerouting 1.7.1

# 問題背景

KiCad で GUIの言語設定を変えるには Preferences の Set Language でできるわけだが、この変更した情報は kicad_common.json ファイルの "system" の "language"に保存されている。

KiCad の プラグインに freerouting というものがあるが、上記のKiCad で GUIの言語設定での設定変更が反映されない。

これはプラグインを呼び出すときにkicad_common.json ファイルの内容を一切参照していないためである。

# 解析

freerouting は javaで記載されているが、GUIの言語設定はコマンドラインまたは環境変数あるいはjavaの環境デフォルト値で変更することができるようになっている。

https://github.com/freerouting/freerouting/blob/master/src/main/java/app/freerouting/gui/StartupOptions.java
java.util.Locale.getDefaultのgetLanguageあるいは起動引数の-lオプションで外部から指定することができるようになっている。

freeroutingのKiCadプラグインの現在の実装では
https://github.com/freerouting/freerouting/blob/master/integrations/KiCad/kicad-freerouting/plugins/plugin.py
```ruby:
        # Run freerouting with logging disabled (-dl) and input (-de) and output (-do) file definition
        self.module_command = [self.java_path, "-jar", self.module_path, "-dl", "-de", self.module_input, "-do", self.module_output]
```
このようにjavaを起動しているため、kicad_common.json ファイルの内容を反映していない。

# freeroutingのプラグインでGUIの言語設定を指定する手段(やっつけ)
KiCadプラグイン＆コンテンツ マネージャーを起動してパッケージ ディレクトリを開くを選択し(Python script locations : https://docs.kicad.org/master/ja/pcbnew/pcbnew.html#scripting  )、3rdparty の plugins の app_freerouting_kicad-plugin フォルダにある plugin.py ファイルを下記のように書き換える。
```ruby:
       # Run freerouting with logging disabled (-dl) and input (-de) and output (-do) file definition
#        self.module_command = [self.java_path, "-jar", self.module_path,"-dl", "-de", self.module_input, "-do", self.module_output]
        self.module_command = [self.java_path, "-Duser.language=ja -Duser.country=JP","-jar", self.module_path,"-dl", "-de", self.module_input, "-do", self.module_output]
```
"-Duser.language" 環境変数の代入値"ja" を適宜変更することで言語設定ができる。

 または
 
```ruby:
        # Run freerouting with logging disabled (-dl) and input (-de) and output (-do) file definition
#        self.module_command = [self.java_path, "-jar", self.module_path,"-dl", "-de", self.module_input, "-do", self.module_output]
        self.module_command = [self.java_path, "-jar", self.module_path,"-l","ja","-dl", "-de", self.module_input, "-do", self.module_output]
 
```
起動引数の指定において"-l" 引数の次の"ja" を適宜変更することで言語設定ができる。

# 補足
freerouting で現在指定できるGUIの言語設定種は次のものがある
```ruby:
  String[] supported_languages = {"en", "de", "zh", "hi", "es", "fr", "ar", "bn", "ru", "pt", "ja", "ko"};
```
# 本来の修正すべき内容(案)
KiCadのGUIの言語設定をISO 639で記載した上で、プラグイン側でその値を参照できる様に共通のAPIを定義して、プラグイン側の固有の引数値を生成するようにすべきかなぁ。。。

https://gitlab.com/kicad/code/kicad/-/issues/10573

これかなぁ...
Firebase Admin SDKを使用してFirebase Authenticationの匿名ユーザーを一括削除する方法

# 概要
Firebase Authentication の匿名認証を使っていると際限なく匿名ユーザーが増えていってしまう。
匿名ユーザーの上限は1億個なので通常は放置しても問題無いと思われるが、もしもの時を考えて一括で削除する方法を調べてみた。

# 環境
* ローカル環境
* Windows 10
* Node.js (v18.14.2)

# 事前準備
[firebase]>[プロジェクトの設定]>[サービスアカウント]>[Firebase Admin SDK] から新しい秘密鍵を生成。
分かりやすい名前に変更して(今回は`keyFile.json`とする)`my-app`フォルダに置く。
以降の作業は`my-app`フォルダ内で行うこととする。

# 作業
## 必要なものをインストール
```
npm install firebase-admin --save
```
```
npm install readline-sync
```
readline-syncは省略可。
削除の最終確認をしたいので追加している。

## コードを書く
```JavaScript:index.js
const admin = require("firebase-admin");
const { getAuth } = require('firebase-admin/auth');
const readlineSync = require('readline-sync');
const serviceAccount = require("./keyFile.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
const list_anonymous = [];

listAllUsers();

function listAllUsers(nextPageToken){
  getAuth()
    .listUsers(1000, nextPageToken)
    .then((listUsersResult) => {
      listUsersResult.users.forEach((userRecord) => {
        if(userRecord.providerData.length===0){
          list_anonymous.push(userRecord.uid);
        }
      });
      if (listUsersResult.pageToken) {
        listAllUsers(listUsersResult.pageToken);
      }else{
        if(list_anonymous.length===0){
          console.log('現在の匿名ユーザーは0人です。');
          return;
        }
        console.log('匿名ユーザーの一覧');
        list_anonymous.forEach(id=>{
          console.log('id: '+id);
        });
        if(readlineSync.keyInYN('delete this users?')){
          deleteUsers();
        }else{
          console.log('終了');
        }
      }
    })
    .catch((error) => {
      console.log('Error listing users:', error);
    });
};

function deleteUsers(){
  getAuth()
    .deleteUsers(list_anonymous)
    .then(()=>{
      console.log('ooo 削除完了 ooo');
    })
    .catch(error=>{
      console.log(error);
      console.log('xxx 削除失敗 xxx');
    });
}
```
匿名ユーザーは`providerData`の長さが0となるのでそれを利用して抽出を行っている。

## 実行
コマンドプロンプト等で`node index.js`。
最終確認されるので`y`で実行。

# 参考URL

https://firebase.google.com/docs/admin/setup?hl=ja

https://firebase.google.com/docs/auth/admin/manage-users?hl=ja#list_all_users
セルの範囲を画像として保存するVBA

セルの範囲を画像として保存するVBA

savePicture(セル範囲,ファイル名)で
選択したセル範囲の表を画像として保存するマクロを作成。

このマクロを実行すると、カレントフォルダに"pic"フォルダが生成され
"pic"フォルダ内に画像が出力されるようになっている。

また、下記のサンプルコードではfor文を用いて
一定間隔で繰り返しの画像保存をしている。

``` SaveRangeAsPic.bas
Sub SaveRangeAsPic()

Dim FileName As String
Dim num As Integer
Dim i As Integer: Dim j As Integer
Dim row As Integer: Dim col As Integer

Const width As Integer = 3
Const height As Integer = 6

For j = 0 To 10
    For i = 0 To 2
        FileName = j & "_" & i
        row = 1 + 2 * j: col = 2 + 3 * i
        Call savePicture(Range(Cells(row, col), Cells(row + width, col + height)), FileName)
    Next
Next

End Sub

function savePicture(rng As Range, picName As String)
    Dim FileSize As Long
    Dim pic As ChartObject
    Dim picFolder As String: picFolder = "pic"
    picName = picName & ".png"

    If Dir(picFolder, vbDirectory) = "" Then
        MkDir picFolder
    End If
    
    '■セル範囲を画像データでコピーする。
    rng.CopyPicture
       
    '■指定したセル範囲と同じサイズのpicを新規作成し、保存する。
    Set pic = ActiveSheet.ChartObjects.Add(0, 0, rng.width, rng.height)
    pic.Chart.Export ThisWorkbook.Path & "\" & picFolder & "\" & picName
    FileSize = FileLen(ThisWorkbook.Path & "\" & picFolder & "\" & picName)
     
    '■picのFileSizeを超えるまでループする(画像データが出来上がったら終了する)
    Do Until FileLen(ThisWorkbook.Path & "\" & picFolder & "\" & picName) > FileSize
        pic.Chart.Paste
        pic.Chart.Export ThisWorkbook.Path & "\" & picFolder & "\" & picName
        DoEvents
    Loop
    '■作成完了後、pic削除。
    pic.Delete
    Set pic = Nothing
 
End function
```
MAUI Tips - WinUIのImage付きボタンの挙動

# 概要
これまでXamarin.Formsで作っていたアプリを、一念発起してMAUIで作り直す中で
調べたことの備忘録。

# 環境
Visual Studio 2022
MAUI
.NET 7

# 問題となった現象
Visual Studio for MACでiOS / Android向けに開発してきたスマホアプリを
Windows上でも動作させられないかと相談があり、
WindowsのVisual Studio 2022でコンパイルして実行してみたんですが、
ボタンに設定した画像の表示がおかしい・・・。

こちらがiPhone SE で表示したときの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/9f16933f-4d3e-9a6b-b0ce-1d1b32e3ded4.png)

こちらがWindows上で動作させて時の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/355b9324-cc6f-58ec-fd8c-3268c7d80c11.png)

# 解析結果
画像の表示がうまくいっているボタンもあり、
コード上の違いを追ってみたところ、
どうやらWindowsで動かした場合のButtonの画像は、
そのボタン内で表示できる最大サイズに拡大（または縮小）されている模様・・・。
※ここではPaddingが0に設定しているため、ボタンの枠ぎりぎりまで画像が表示されている

わざと横幅を広げてみるとこんな感じ。若干左寄り？
ContentLayoutを指定しないと中心にも表示されないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/7486397c-c56a-4532-a74b-644c2196b54e.png)

⇒ContentLayoutでRight,0を指定すると、こうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/76554597-fa50-7851-4ff3-4d0622b306b0.png)

⇒ContentLayoutでTop,0を指定すると、変になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/97aa40a7-c72e-301f-d331-96572dd3da35.png)

# 対処方法
・ContentLayoutでValueにRight,0を指定
・WinUIの時のみ、Paddingで画像サイズを調整

``` XML
    <Style x:Key="IconButtonStyle" TargetType="Button">
        <Setter Property="WidthRequest" Value="60" />
        <Setter Property="HeightRequest" Value="60" />
        <Setter Property="CornerRadius" Value="10" />
        <Setter Property="Padding" Value="{OnPlatform 0, WinUI=15}" />
        <Setter Property="ContentLayout" Value="Right,0" />

        <Setter Property="BorderColor" Value="Transparent" />
        <Setter Property="BackgroundColor"
                Value="{AppThemeBinding Light={StaticResource LightPrimaryColor}, Dark={StaticResource DarkPrimaryColor}}" />
        <Setter Property="TextColor"
                Value="{AppThemeBinding Light={StaticResource LightOnPrimaryColor}, Dark={StaticResource DarkOnPrimaryColor}}" />
    </Style>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a0d285a8-b59d-54d8-061a-6c64e1ce1713.png)

これでAndroidもiOSもWindowsも1コードでいける・・・はず・・・。
session・LocalStorage・Cookie etc.違い

# はじめに
session・LocalStorage・Cookie etc…　違いをまとめた表は、多くのサイトで公開されているので、そちらをチェックした方が早いです。

https://wellknowledge.org/cache-session-cookie-webstorage/

https://qiita.com/pipiox/items/95554673ba3b078ac112

# 理解したこと
・Cookieはユーザー情報。
キャッシュは、ページの情報。

・サーバーキャッシュは、過去に作成したファイルが、Webサイトがアップロードされているサーバーに、一時的に保存される仕組みを指す。

・sessionがどのクライアントの情報かは、Cookieに登録したsessionIDで確認できる。

・LocalStorageは、JSで操作できてしまう。
Cookieは、HttpOnly属性を記述すれば、JSから操作できない。
そのため、ローカルストレージでは、「秘密情報を一切含まないこと」「一般に入手可能な情報であること」「stringのみの情報であること」などの条件下で使うといい。

・settionStorageは、タブを閉じることで、情報が消える。（リロードや画面遷移は残る。）

・Cookie、キャッシュ、settionStorage、LocalStorageは、ブラウザ側で保管している。


# 考えたこと
違いが曖昧だった時は、同じように見えていたものが全然違った。
特にCookieとLocalStorageの違いは明白であった。
ruby モジュール

* # 対象者

* Ruby初心者.  

# この記事を読んでわかること
モジュールとは何か、モジュールの使い方。

# 目次

1. モジュールとは. 

1. クラスとモジュールの違い.  

1. モジュールの使用用途.  

1. 名前空間の提供

1. インスタンスメソッドとして取り込む（Mix-in）

1. モジュールをオブジェクトに取り込む



# モジュールとは.  
→メソッドを集めたもの.  
それとってクラスじゃないの？と思ったのは私だけでしょうか？
モジュール↓
```
module Salary 
 def calculate_salary
 
 end 

 def kihon
  
 end 

 def teate 

 end 
```
クラスとほとんど同じやん‥.   
```
class クラス名　
```
で定義するところが
```
module モジュール名

```
に変わっただけやん‥だがしかし


# 1. クラスとモジュールの違い. 


![スクリーンショット 2023-04-04 22.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/3c125b3c-f095-01d9-a671-89c6b4eb9b3c.png)


簡単に比較してみるとクラスの劣化版のような印象を受けました。この時点でモジュールを使う理由がないと感じたのは私だけでしょうか？　しかし

# 1. モジュールの使用用途 

* 名前空間の提供

* インスタンスメソッドとして取り込む（Mix-in）

* クラスメソッドとして取り込む

* モジュールをオブジェクトに取り込む

# 1. 名前空間の提供
名前空間の提供とは？
⇨同じ名前のメソッドやクラス名を使えるようにする機能. 
```

module Person
  class Student
    def self.say
      puts "I'm Ken."
    end
  end
end
 
class Student
  def self.say
    puts "私はケンです"
  end
end
 
Person::Student.say
#=> "I’m Ken."
 
Student.say
#=> 私はケンです
```
module モジュール名でクラスを入れ子構造にすることで下のStudentクラスとは別のメソッドだと表現している。

#1. インスタンスメソッドとして取り込む（Mix-in）
→モジュール内で定義したメソッドをクラスの中にインスタンスメソッドとして取り入れることができる＝Studentクラスでgreetメソッドが使用できる
![スクリーンショット 2023-04-04 21.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/7bd5fe31-db34-239e-3da7-c413fa2044e4.png)


クラス内で
```
include モジュール名
```
と定義すれば使えるようになる.  
↓こんな風にインスタンスメソッドとして使用できる。
```
student = Student.new

student.greet
→puts　”こんにちは”と出力される
```


# モジュールをオブジェクトに取り込む
特異メソッドとして取り込むこともできます。
```

class Greet
  def say
    puts "Hello"
  end
end 
obj = Greet.new
obj2 = Greet.new

#↓特異メソッドという。オブジェクト.メソッド名で定義する
def obj.hi  
  puts "よろしく"
end 
 

puts obj.hi ⇨よろしく
puts obj2.hi⇨エラー
```
楽々ERDレッスン第１・２回の復習をする

# 概要
下記リンクの楽々ERDレッスンを一通り読んだので、第３章のレッスンの演習問題に改めて取り組んでみる。
自分の復習用で誤りもあると思うので、この本を一読した初心者がどのように取り組むかを見物する程度の心構えで読んで欲しい。

https://www.amazon.co.jp/%E6%A5%BD%E3%80%85ERD%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3-CodeZine-BOOKS-%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF-%E7%BE%BD%E7%94%9F/dp/4798110663

なお、Web記事にもなっていて、[こちら](https://codezine.jp/article/detail/154)から読める

# 第１回
## はじめに
題材はこちらの注文用紙。これの裏側のデータベースを想像して設計していく。
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/ce89ff6f-59fb-aeb2-f483-aba5a540936d.png
引用:[楽々ERDレッスン 第1回：「お持ち帰りご注文用紙」編](https://codezine.jp/article/detail/154)

## まずはイベントを見出す
データベース設計はイベントエンティティとリソースエンティティの2つを考えることになるが、イベントエンティティからスタートするのが定石らしい。リソースエンティティの方がややこしかったり、数も多いので最初に取り組むには適していない。

ということで、まず最初にイベントエンティティを洗い出す。
こ注文用紙とあるので、『注文』のイベントエンティティは必須。あとは、支払いや商品引き渡しなどのイベントも考えることがあるかもしれないが、『注文』だけにフォーカスする。

## イベントからリソースを見出す
『注文』からリソースを想像していく。リソースエンティティはWho, Whom, What, Whereを考えると良い。

who:顧客
what:商品
where:店舗
(注文は自動詞なのでwhomは不要　だと考えた)

## 属性を埋めていく
埋めようとすると、注文用紙と商品の対応に難儀する。そこで注文商品というエンティティを新たに用意した。
「お持ち帰り弁当」などの商品のカテゴリと、「Newマーク」の商品ステータスを考えて属性を埋めてリレーションシップまで考えてみた。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/4657911c-8350-9459-9efd-e206a7c5696b.png)


# 第２回
続いて第二回に挑戦していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/577e4c81-1ea3-cc44-0cca-169b4162c185.png)
引用: [楽々ERDレッスン 第2回：「図書館の予約申込書」編](Ehttps://codezine.jp/article/detail/175)

## イベントエンティティを見出す
先ほどと同様にイベントエンティティを見出していく。「予約（リクエスト）申込書」とあるので、『予約』イベントが中心となる。他にも『連絡』や『受取』や『認知』（この本を何で知りましたか　の部分から）のテーブルが考えられそう。

『連絡』と『受取』については、フォーカスから大きく外れるのでやめておく。
『認知』についても日時まで収集するなら情報として使えるが、そこまでの記述はないならイベントエンティティとして考えるより『認知手段』とリソースエンティティで考える方が良さそう。

というわけで、ここでは『予約』エンティティのみをイベントエンティティとして残す。

## リソースエンティティを見出す
リソースエンティティは、who, whom, what, whereを考えれば良かった。
『予約』のイベントエンティティについてそれらを考えると、

who:利用者
what:本
where:受取場所
(予約は自動詞なのでwhomは不要　だと考えた)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/9f58bc05-52ce-daf4-09b0-dacf96e21a03.png)

## 属性を埋めていく
今回はややこしそうなのでステップを踏んでいくと思うが、とりあえず埋められるところを埋めていく。

属性を埋めていったのがこちら。利用者の連絡先はリソースエンティティとして抜き出した。
また本の情報である『著者』と『出版社』も別で抜き出した。(※認知手段を忘れています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/2eb0ec0e-c435-f2cc-d415-827ce24f5ba5.png)

## リレーションシップを設定する
下図のようにリレーションシップを設定した。(※認知手段を忘れています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/86af6d9c-444f-4e17-5f31-6aed55e92e39.png)

## 『認知手段』をすっかり忘れていたの加えて修正
答え合わせをしていたら、上で言及していた『認知手段』を忘れてるのに気付いたので、加えて修正する。
新着図書や新聞にナンバーがあったので、別のリソースエンティティに切り出した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345800/0b871b15-b42e-190b-35fc-2d011e07d130.png)

## 本を読みながら振り返り
イベントの抜き出しは難なくできていた。属性の書面伝達可否や連絡先方法名エンティティなど、細かいところを見落としていた（仕事終わりで疲れてるので許して欲しい）

あと見返して思ったのが、〇〇フラグという表現より家族確認可否とかの方が良かった。
JavaScriptの基礎的な文法とメソッド一覧

javascriptの基礎的な文法とよく見かけるメソッドを記載しました。 ~~自分用メモです~~

## 文法

#### 条件分岐
```javascript
const number = 10;

if (number > 0) {
  console.log("+の値");
} else if (number < 0) {
  console.log("-の値");
} else {
  console.log("0");
}
```


#### 三項演算子を用いた条件分岐
```javascript
let a = 15;
let message = a > 10 ? "aは10以上" : "aは10以下";
console.log(message);
```
※三項演算子は、条件式が true の場合は`?`の左側の式を、false の場合は`:`の右側の式を評価。

#### switch文で条件分岐
```javascript
const dayOfWeek = new Date().getDay();

switch(dayOfWeek) {
  case 0:
    console.log("今日は日曜日です。");
    break;
  case 1:
    console.log("今日は月曜日です。");
    break;
  case 2:
    console.log("今日は火曜日です。");
    break;
  case 3:
    console.log("今日は水曜日です。");
    break;
  case 4:
    console.log("今日は木曜日です。");
    break;
  case 5:
    console.log("今日は金曜日です。");
    break;
  case 6:
    console.log("今日は土曜日です。");
    break;
  default:
    console.log("日付を取得できませんでした。");
    break;
}
```

#### forを使ったループ処理
```javascript
const array = [1, 2, 3, 4, 5];

for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
}

// breakの例
for (let i = 0; i < 10; i++) {
  if (i === 5) {
    break; // iが5になったらループ終了
  }
  console.log(i);
}
```

#### whileを使ったループ処理
```javascript
let i = 0;

while (i < 5) {
  console.log(i);
  i++;
}
```

## よく見るメソッド

#### filter()
```javascript
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(evenNumbers); // [2, 4, 6]
```
**配列の要素をフィルタリング**するメソッドで、指定された条件に合致する要素を新しい配列として返します。

#### find()
```javascript
const numbers = [1, 2, 3, 4, 5];
const found = numbers.find(element => element > 3);
console.log(found); // 4
```
配列内の**最初の要素を返します**。指定した要素が見つからない場合は`undefined`を返します。

#### forEach()
```javascript
const array = [1, 2, 3, 4, 5];

array.forEach(function(item) {
  console.log(item);
});
```
配列の各要素に対して、**指定された関数を一度ずつ実行**します。

#### includes()
```javascript
const numbers = [1, 2, 3, 4, 5];
console.log(numbers.includes(3)); // true
console.log(numbers.includes(6)); // false
```
**与えられた値が配列に含まれているかどうか**を調べます。`true` `false`で返します。

#### reduce()
```javascript
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue);
console.log(sum); // 15
```
配列内の各要素を**指定された関数に基づいて単一の値にまとめる**ことができます。2つの引数があり、前者は**初期値または前の関数呼び出しの戻り値**。後者は**現在の配列要素**。関数は各要素に対して1回ずつ呼び出されます。

#### map()
```javascript
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map((num) => num * 2);
console.log(doubledNumbers); // [2, 4, 6, 8, 10]
```
与えられた関数を配列の要素それぞれに適用し、その結果を**新しい配列**として返します。データを加工したり、取り出したりする場面でよく使われます。

#### flatMap()
```javascript
const arr = [1, 2, 3, 4, 5];
const result = arr.flatMap(x => [x * 2, x * 2]);
console.log(result); // [2, 2, 4, 4, 6, 6, 8, 8, 10, 10]
```
最初にマッピング関数を使用してそれぞれの要素をマップしたあと、**全ての結果を1つのフラットな配列にマージ**します。`map()`と`flat()`の組み合わせです。配列の要素を増やすこともできます。
【Swift】URLにパラメータを付与する

# はじめに
現在、ウィジェットを使用するアプリを作成しています。
URLSchemeにパラメータを付与して、ウィジェットからアプリにデータを渡すという仕組みにしました。
それに伴い、URLにパラメータを付与する実装を行なったので、記録しておきます。

# 実装
```swift
import Foundation

let baseURL = URL(string: "https://sample.com/")!

var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)

components?.queryItems = [
    URLQueryItem(name: "userName", value: "SNQ-2001"),
    URLQueryItem(name: "postCount", value: "364")
]

if let url = components?.url {
    print(url)
}

// https://sample.com/?userName=SNQ-2001&postCount=364
```

# おわり
パラメータを付与することができました。
これをURL拡張にしておくと再利用するときに便利です。
JAVA X2 type02　Season1 Chapter0 ：一度Javaを嫌いになりました。

みなさんこんにちは。
毎度お騒がせしております、お調子者のおつうです。
ふざけたタイトルでいままでの恨みつらみに重ね、泥臭い独学について淡々と語ります。

#### この先の展開は、私の興味の赴くままに、自由に進めます。
そのため記事の未来とゴールは不明です。


今回は、「なぜ、Java?」となったかを書きなぐりたいと思います。大して役に立たないとお感じでしたら記事は読まないで大丈夫です。（心が弱いのでディスり不要です）

# Chapter0 一度Javaを嫌いになりました。

ソフトウェア開発はろくに知らぬまま迎えた40歳。
基本能天気なので、副業でホームページで月10万！を（かなり本気で）信じていました。
![webcm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/ecffa721-b6e6-17ee-4788-f35786ee6c60.png)↑これ。こういうやつ。

さてここでみなさんご存じ、駆け出しぶっ潰し隊の登場です。
![スクリーンショット 2023-04-04 225024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/deb4507f-8ece-9663-e7c6-18349e7ad813.png)
その正体はいじめではなく商材屋から駆け出しを守り隊だったんですけどね。
かっこいいですねー。あの時はみなさんありがとうございました。

甘い考えを持ったままコンテナわかったぞとか騒いでいたある日。
![スクリーンショット 2023-04-04 230648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/bceae311-c320-ac83-e620-bd4f5bd0187a.png)
エンカウントしたベテランにに出合い頭に殴られ、ぐうの音も出ない状況で全力土下座。教えを乞うことになりました。（のちの師匠）
![スクリーンショット 2023-04-04 225141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/fd2e30a3-2910-6eea-f9c3-05cb57490583.png)

フルボッコにされ、そこで考えなおしました。
私はなぜIT学ぶのか。そこで出た答えが以下の通り。

- とにかく飯が食っていける技術が欲しい
- 中年でコーディングだけできる・・・ではすぐ干されるのが怖い
- 新しい言語にも対応できるよう「考え方の軸」としての「得意な言語」がほしい

ここまで考えを改めたとはいえ、どこから始めたものか。はて。
答えのないことを悶々とするのが苦手な行動派な私は、すぐに師に教えを乞うことに。

ところがこの師匠。得意な言語はJAVAと仰る。
そしてJAVAをある程度理解すれば他の言語の習得も早いと。。
![スクリーンショット 2023-04-04 231335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/e5ed4444-3cf1-e9f4-cb3f-905dbbb55ebd.png)
師匠登場！！

ここから私とJAVAの歴史が動き出します。

まずは・・いわれた通り環境構築し、言われた通り書いてみる。
。。。。わからん

MAVENわからないと言ったら「メモ帳でかいてプロンプトでコンパイラとランジャバしてみ？」とお題が出てだいぶ泣いたのですが。
さらにとどめに「オブジェクト指向はモノだから」とか、「人が読みやすいようにかかれた言語だから」とか

### なんでオブジェクト指向プログラミングする人って抽象的表現でもっとわからない説明するの？？？

ここでほんっっととおおおおおに大嫌いになりました。

>現在勉強再開はしましたが、この抽象的表現聞くと今もかなりイライラするのでご注意ください（笑）

この先すぐにデータベースの勉強をしなければならなくなり（仕事で）一度離れたに至ります。といいつつ途中からアーキテクチャとネットワーク方面の学びが面白くなって浮気しただけなんですけどね。

ここまでがJAVA開始から挫折までの自己紹介含めた振り返りとなります。
前置きはこの辺で。。。

＞＞次回、[Chapter1「オブジェクト指向が苦手です」](https://qiita.com/comchiki66/items/d739faa8a189fe7d9aaa)をお送りします。
ChatGPTとの上手な付き合い方

ITエンジニアがChatGPTを用いる際に少しでも正しい回答を得る為の備忘録です。
そもそもChatGPTってどうやって使うの？という方はこちらの2つの記事を参考にしていただくのが良いかと思います。

https://qiita.com/sakasegawa/items/82069c97a1ee011c2d1e

https://qiita.com/zyake/items/b19f0498e353a270bc24


# 前提条件をきちんとインプットする
ChatGPTを上手に使いこなす上で最も大事なことはお互いの認識をきちんと擦り合わせることです。
具体的に言うと次のようなことが該当します。

・**ツールのバージョン**
・**言語**
・**最終的な目的**
・**現状**
・**問題点**


もし、あなたが特定の状況下でChatGPTを使用するのであれば、以下のように最初にインプットしてしまうことをおすすめします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140459/48308c06-eeb4-d40b-50f0-fb74d00c9931.png)

そうすることで、以下の質問にもある程度的確に回答してくれるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140459/ce1d4b8b-e162-680f-c4da-50e396a8ac1a.png)

また、前提さえあればある程度雑なプロントに対しても回答してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140459/70806a7a-2545-98ab-517c-3b122adb05b9.png)


また、Shared Preferencesといったツールや言語に依存した環境についても回答に含めてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140459/cd5dffe5-aac5-1110-b2a1-02735af97661.png)


# 最後に
とはいえ、ChatGPTは万能の神ではありません。
正しいツール選定や言語選択、コードリーディングといった技術を持ち合わせて初めて有効活用できるようになります。
まずは、ChatGPTなしで自分が欲しい回答を検索できるかどうかを試してみると上手に扱えるかどうかの判断基準になると思います。
Go言語の「Print、Printf、Println」の使い分け

## はじめに
標準出力の3つの関数についてのまとめ記事です。

## fmt.Print
`fmt.Print`関数は、与えられた引数をスペースで区切って標準出力に出力します。最後に改行は追加されません。

```go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 30
    fmt.Print("Name:", name, " Age:", age) // 出力: Name:Alice Age:30
}
```

## fmt.Printf
`fmt.Printf`関数は、書式付きの文字列と一緒に与えられた引数を標準出力に出力します。最後に改行は追加されません。

```go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 30
    fmt.Printf("Name: %s Age: %d", name, age) // 出力: Name: Alice Age: 30
}
```

## fmt.Println
`fmt.Println`関数は、与えられた引数をスペースで区切って標準出力に出力し、最後に改行を追加します。

```go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 30
    fmt.Println("Name:", name, " Age:", age) // 出力: Name: Alice Age: 30
}
```
これらの関数は、出力の形式に応じて使い分けることができます。例えば、改行を追加する必要がある場合は、fmt.Printlnを使用します。また、書式付きの文字列を使いたい場合は、fmt.Printfを使用します。出力には書式付きの文字列を使用しない場合は、fmt.Printを使用することができます。

https://www.flyenginer.com/low/go/go%e8%a8%80%e8%aa%9e%e3%81%aeprint%e3%83%bbprintln%e3%83%bbprintf%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6.html

https://golang.keicode.com/basics/go-print-basics.php
【JS】Phaser 3.60 の新機能がアツい【ゲーム開発】


JS最強のゲームライブラリ「[Phaser3](https://github.com/photonstorm/phaser)」に、大きなアップデートが来るようです。

`Version 3.60.0 - Miku` （ミクさん！？）

リリースは、Phaser10周年の4/12とのこと。

Phaser3は息が長く、大分完成されていた感はありますが、ここに来て大きな機能追加が行われるようで、期待大です。

抜粋して簡単に紹介します。

:::note info
Phaser3関連の他の記事もよければ！
『[Web屋がJavaScriptでゲームを作ってSteamで配信するまでの道のり](https://qiita.com/laineus/items/0bb62f58910ccdfa1d34)』
『[ゲームエンジンにVueを合体させたらゲーム開発が捗った](https://qiita.com/laineus/items/7a8980d0d8af69161cf3)』
:::

# ビルトインFX

目玉機能ですかね。

Glowで発光させたり、ドロップシャドウをつけたりといったグラフィックへの特殊効果は、
これまではGLSLを書いてシェーダーを自作しなければいけませんでした。

3.60では、定番の効果が標準で搭載され、以下のようにGameObjectへ簡単に適用できるようになりました。

```js
const player = this.add.sprite(x, y, texture)
player.preFX.addGlow(0xff0000, 32)
```

搭載予定のエフェクトは以下。

|エフェクト名|説明|
|---|---|
|Barrel|ピンチ/バルジの歪みエフェクトを追加します。|
|Bloom|カスタムオフセット、ぼかしの強さ、ステップ、およびカラーを使用して、任意のGame ObjectにBloomを追加します。|
|Blur|3つの異なるレベルのガウシアンぼかし（低、中、高）とカスタム距離とカラーを追加します。|
|Bokeh / TiltShift|インテンシティ、コントラスト、および距離設定を備えた、ボケとチルトシフトエフェクトを追加します。|
|Circle|カスタムカラー、幅、および背景色を使用して、任意のGame Objectに円形のリングを追加します。マスキング/アバターフレームに便利です。|
|ColorMatrix|sepia、greyscale、lsdなどのすべてのメソッドにアクセスできるColorMatrixを任意のGame Objectに追加します。|
|Displacement|ノイズテクスチャなどの変位テクスチャを使用して、Game Objectの外観を劇的に（または微妙に）変更します。|
|Glow|カスタム距離、強度、およびカラーでスムーズな内側または外側のグローを追加します。|距離、強度、カラー|
|Gradient|2つの色の間にグラデーションを描画し、オプションの「chunky」モードを使用して、クラシックなレトロスタイルのゲームに適用します。|
|Pixelate|任意のGame Objectをピクセル化して、さまざまな程度で表示します。|
|Shadow|カスタムの深度と色で、Game Objectの背後にドロップシャドウを追加します。|
|Shine|Game Objectを横切る「shine」エフェクトを実行し、加算的にまたはリビールの一部として追加します。|
|Vignette|カスタムオフセット位置、半径、およびカラーでGame Objectの周囲にビネットを適用します。|
|Wipe|カスタムライン幅、方向、およびエフェクトの軸を設定して、Game Objectを「wipe」または「reveal」に設定します。|

（訳: ChatGPT）

# Timelineクラス

個人的に2番目の目玉機能

未来に起こるイベントをスケジュールすることができます。

シーンが一時停止すると、タイムラインも一時停止し、Sceneが破棄されると、Timelineも自動的に破壊されます。

```js
const timeline = this.add.timeline([
  {
    at: 1000,
    run: () => {
      // 後で行いたい処理
    }
  }
])
```

色々な用途で活躍しそうです。

# Nine Slice Game Object

ImageやSpriteのように、画像を描画するGameObjectですが、サイズを変更したときに、画像が9分割し、四隅はループなし、上下は水平にのみ、左右は垂直にのみ拡縮させる形でリサイズが行われます。

装飾のついたメッセージウィンドウなどを、可変サイズで利用したいときに利用します。

![Screenshot from 2023-04-04 21-22-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/38ca6884-f988-0c7b-36bf-ff343b073d4d.png)

（右がImageで拡大、左がNine Sliceで拡大）

# ESModuleのサポート

されるようです。

```js
import 'phaser'
```
↓
```js
import { Scene, Game } from 'phaser'
```

# Plane Game Object

以下のように平面を3D的にグリグリ動かせるGameObjectのようです。

![Screenshot from 2023-04-04 21-26-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/eb8b5414-2f6e-75cf-1937-69cbba0a9254.png)

# 立体音響

詳しくありませんが、面白い演出に使えそうですね。

# Spine 4

Spine 4対応だそうです。

# さらに詳しく

Richard Davey氏の投稿は以下から。
https://www.patreon.com/photonstorm

3.60の新機能について詳しく紹介されています。

ちなみに、3.60リリース後は、氏はPhaser4の開発に戻るそうです。
個人用ログイン画面

![QQ截图20230404215129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321765/167c8170-6ba4-0135-53ba-47e111cb48aa.png)

controller
package com.example.demo1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo1.domain.User;

@Controller
public class LoginController {

    @PostMapping("/loginfunction")
    public String processLogin(@ModelAttribute("user") User user) {
        // 在这里处理登录逻辑
        return "home";
    }
    
    @GetMapping("/tologinpage")
    public String toprocessLogin(@ModelAttribute("user") User user) {
        // 在这里处理登录逻辑
        return "login";
    }

}

user

package com.example.demo1.domain;

import lombok.Data;

@Data
public class User {
	
	private String name; 
	private String password; 

}


kidou

package com.example.demo1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo1Application {

	public static void main(String[] args) {
		SpringApplication.run(Demo1Application.class, args);
	}

}


home,html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<DIV>
aaa
</DIV>

</body>
</html>

login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form th:action="@{/loginfunction}" th:object="${user}" method="post">
        <label for="name">Username:</label>
        <input type="text" id="name" th:field="*{name}" />
        <br />
        <label for="password">Password:</label>
        <input type="password" id="password" th:field="*{password}" />
        <br />
        <input type="submit" value="Login" />
    </form>
</body>
</html>
【Flutter】Stackで大きさを固定しつつ、位置を絶対位置にする方法

# はじめに

![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/29472563-cc34-9027-7acd-a4173bdccf3f.gif)

こんな感じの挙動をFlutterで実装中です。

画像の表示はStackを使って、GesutureDetectorでDrag位置を取得して、その位置に画像を表示するということをしたかったのですが、Stackを使って大きさを固定しつつ、絶対位置に表示する方法に苦戦したので備忘録として残しておきたいと思います。


https://qiita.com/y_oshike_n/items/9f3c892c8bd361620927

https://dev.classmethod.jp/articles/flutter_stack1/

https://zenn.dev/pressedkonbu/articles/stack-and-align

# ソースの全文

下記のソースをコピペでgifの動きができるようになります。

![qiita2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/bbbe092c-fe04-4a79-b9f2-292d6c19b949.gif)


```dart
class ImageDetail extends StatefulWidget {
  const ImageDetail({
    super.key,
  });

  @override
  State<ImageDetail> createState() => _ImageDetailState();
}

class _ImageDetailState extends State<ImageDetail> {
  Offset offset = const Offset(0, 0);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Stack(
            clipBehavior: Clip.none,
            children: [
              Transform.translate(
                offset: offset,
                child: GestureDetector(
                  onPanUpdate: (details) {
                    setState(() {
                      offset += details.delta;
                    });
                  },
                  child: Container(
                    width: MediaQuery.of(context).size.width * (0.4),
                    height: MediaQuery.of(context).size.width * (0.4),
                    color: Colors.grey,
                    child: const Center(
                      child: Text("サンプル"),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}  
``
paiza.ioでpython その4

# 概要
paiza.ioでpythonやってみた。
練習問題やってみた。

# 練習問題
forthインタープリターを実装せよ。
forthで数9を4個つかって1から15までの数を表す式を実行せよ。

# サンプルコード

```
# coding: utf-8

stack = []
def add():
    global stack
    top1 = stack.pop()
    top2 = stack.pop()
    v = top2 + top1
    stack.append(v)
def sub():
    global stack
    top1 = stack.pop()
    top2 = stack.pop()
    v = top2 - top1
    stack.append(v)
def mul():
    global stack
    top1 = stack.pop()
    top2 = stack.pop()
    v = top2 * top1
    stack.append(v)
def div():
    global stack
    top1 = stack.pop()
    top2 = stack.pop()
    v = top2 / top1
    stack.append(v)
def dup():
    global stack
    top1 = stack.pop()
    stack.append(top1)
    stack.append(top1)
def drop():
    global stack
    top1 = stack.pop()
def get():
    global stack
    top1 = stack.pop()
    print(top1)
def push(v):
    global stack
    stack.append(int(v))
def run(str):
    s = str.split(' ')
    for i in s: 
        if i == "+":
            add()
        elif i == "-":
            sub()
        elif i == "*":
            mul()
        elif i == "/":
            div()
        elif i == "dup":
            dup()
        elif i == "drop":
            drop()
        elif i == ".":
            get()
        else:
            push(i)
	    
	    

run("9 9 - 9 9 / .")# 1
run("9 9 / 9 9 / + .")# 2
run("9 9 + 9 + 9 / .")# 3
run("9 9 9 + 9 / dup + .")# 4
run("9 9 9 + 9 / dup + - .")# 5
run("9 dup 9 + 9 + 9 / - .")# 6
run("9 9 9 + 9 / - .")# 7  
run("9 9 9 drop 9 / - .")# 8  
run("9 9 - 9 * 9 + .")# 9  
run("9 9 / 9 dup 9 / + .")# 10  
run("9 9 9 + 9 / + .")# 11  
run("9 dup 9 9 + + 9 / + .")# 12  
run("9 9 9 + 9 / dup + + .")# 13  
run("9 dup 9 9 + 9 / dup + - + .")# 14  
run("9 dup dup 9 + 9 + 9 / - + .")# 15  




```

# 実行結果

```
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9
10.0
11.0
12.0
13.0
14.0
15.0
```

# 成果物

https://paiza.io/projects/Tj4mU3dSRh9W9e8JO8I8Hw


以上。
RubyでContentfulのEntryを取得する様々な方法

# はじめに
Contentfulの利用方法については、基本的に公式ドキュメントに全て載っています。
しかし、英語のドキュメントであることから、読み解くのに時間がかかってしまうため、
私が実務で利用したケースと合わせて、基本的なEntryの取得方法のみをまとめました。

# 前提
[`gem contentful`](https://github.com/contentful/contentful.rb)を利用しています。

# 初期化
インスタンス化には`space　ID`と`access　token`が必須です。
また、インスタンス化の際に[利用できるオプションはREADMEに全て記載](https://github.com/contentful/contentful.rb#configuration)されています。

```ruby
require 'contentful'

client = Contentful::Client.new(
  space: '<SPACE>',
  access_token: '<ACCESS_TOKEN>'
)
```

# エントリー

## spaceのすべてのエントリを取得する
space内の全てのエントリを取得できるため、コンテントタイプの壁を超えます。
実務では利用してません。

```ruby
entries = client.entries
```

## 単一のエントリを取得する
エントリIDを指定する方法です。ActiveRecordでいう`find`です。

```ruby
entry = client.entry('<entry_id>')
```

# 検索パラメータ

## 特定のコンテントタイプを指定してエントリを取得する
これを基本的に使用してデータを取得します。
```ruby
entries_by_content_type = client.entries(content_type: '<content_type_id>')
```

## 取得するフィールドを選択する
これは不要な`fields`を含めたくない場合に利用しました。
例えば、作成日時の「年」の情報のみを取得したい場合です。

また、パラメータは複数組み合わせて利用可能です。
```ruby
entries = client.entries(content_type: '<content_type_id>', select: 'fields.productName')
```

## 完全一致
ハッシュのキーは`fields.name`などもでき、完全一致を検索します。
```ruby
entries = client.entries('sys.id' => '<value>')
```

## 完全不一致
ハッシュのキーの末尾に`[ne]`を付与します。
```ruby
entries = client.entries('sys.id[ne]' => '<value>')
```

## 範囲
記事のデータを年毎で分け、取得する場合に使用しました。

- `[lt]`： 未満。
- `[lte]`: 以下。
- `[gt]`：より大きい。
- `[gte]`： 以上。

```ruby
# Less than:
entries = client.entries('sys.createdAt[lt]' => '2013-08-28')

# Less than or equals:
entries = client.entries('sys.createdAt[le]' => '2013-08-28')

# Greater than:
entries = client.entries('sys.createdAt[gt]' => '2013-08-28')

# Greater than or equals:
entries = client.entries('sys.createdAt[ge]' => '2013-08-28')
```

# 並び替え

デフォルトでは、
公開タイムスタンプの降順 (`sys.updatedAt`) と 
ID の昇順 (`sys.id`)に並べられます。

これは、
最近公開されたアイテムが一番上に近く表示され、
同じ公開タイムスタンプを持つアイテムの順序が、アイテムのID(`sys.id`)に基づくことを意味します。

## 作成日順：昇順

```ruby
entries = client.entries(order: 'sys.createdAt')
```

## 作成日順：降順
フィールドの前に`-`記号を付けることで、並べ替え順序を逆にすることができます。
```ruby
entries = client.entries(order: '-sys.createdAt')
```

## 複数指定
```ruby
entries = client.entries(order: ['sys.createdAt', 'sys.id'])
```

# まとめ
初めは「スペース」「コンテントタイプ」「エントリ」といった言葉が何を指すのかを明確にすると理解が進むと思います。
他にも様々なことができますので、公式ドキュメントをGoogle翻訳などを利用して、読んでみることをおすすめします。

# 参考文献
https://www.contentful.com/developers/docs/references/content-delivery-api/
AWS CLIのアクセスキーはどこに設定するのか

## はじめに
業務やプライベートでAWS CDKを触っており、CDKデプロイする時に「これって`cdk deploy`を叩いたらどこに向けてデプロイされるんだっけ・・・。」と思ったのでここにまとめてみます。間違えて業務用AWS環境にデプロイしてしまってはいけないですからね・・・。

## cdk deployにはアクセスキーが必要
まず`cdk deploy`や`cdk bootstrap`などをCDK CLIの操作をする際には、デプロイ先のIAMユーザーのアクセスキーが必要です。
これは一体どうやって設定・管理するのか。

## aws configureとconfig、credentials
アクセスキーの設定は`aws configure`というコマンドをターミナルで叩きます。
アクセスキー、シークレットアクセスキー、デフォルトリージョン、アウトプット形式を設定できます。
以下設定例です。
```
$ aws configure
AWS Access Key ID [None]: AKI.........
AWS Secret Access Key [None]: s1U..............
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

入力した情報は`~/.aws`配下の`config` `credentials`に保存されています。
[default]という名前でそれぞれのファイルに入力した情報が保存されていると思います。
**ただ、1つのPCで複数AWSアカウントを使う場合、[default]を使わない方がいいかもしれません。**
うっかり別のアカウントにリソースを作ってしまう可能性があるからですね。
その場合は`aws congifure --profile profileName`（profileNameは好きな名前にしてください）を使います。
[default]ではなく[profileName]で`config` `credentials`に保存されます。
このアクセスキーを使って各CLIのコマンドを使いたい場合は、`cdk bootstrap --profile profileName`のようにします。
これで安心してユーザーを指定してデプロイ等ができます。
NestJSとは

## はじめに
NestJSについての備忘録です。
参考程度にお願いいたします。
これからも追記していく予定です。

## NestJSとは
- Node.js上で動作するオープンソースのバックエンド開発フレームワーク
- TypeScriptで作られている
- Expressをコアにして作られている
- Angularにインスパイアされている

## NestJSを使うメリット
- 型の恩恵を得ることができる
- Expressの機能やライブラリを使うことができる
- Nest CLIを使ってプロジェクトやファイルのテンプレートを生成できる
- テストフレームワークが標準で用意されている
- 拡張性が高い

## NestJSを使うデメリット
- Rails、Laravel、Djangoなどと比較すると利用ユーザーが少なく、情報が少ない
- 公式ドキュメントが日本語に非対応

## Nest CLI
- Nestコマンドラインインターフェース
- プロジェクトの雛形を用意することができる

新規プロジェクト作成のコマンド
```
nest new プロジェクト名
```

新規コントローラの作成
```
nest g controller コントローラ名
```

## NestJSのアーキテクチャ
NestJSにおける最もコアとなる要素
- Controller
- Service
- Module

## Moduleとは
- 関連するControllerやServiceなどをまとめ、アプリケーションとして利用できるようにNestJSに登録する役割
- NestJSアプリケーションには必ず1つ以上のルートモジュールと、0個以上のFeatureモジュールが必要となる

## Moduleの定義
1.classに@Module()デコレーターをつける
2.@Module()デコレーターのプロパティを記述する

## Controllerとは
- クライアントからのリクエストを受け付け、クライアントにレスポンスを返す
- Controllerがルーティングの機能を担う
- 特定のパスとControllerが紐付けられる（例：/usersとUsersController）
- HTPPメソッドとパスを指定したメソッド（ハンドラー）を定義する

## Serviceとは
- ビジネスロジックを定義する
- Controllerから呼び出すことで、ユースケースを実現する

## Dependency Injection(DI)
- 日本語にすると「依存性の注入」
- 依存関係のあるオブジェクトを外部から渡す

## JWTとは
- JSON Web Tokenの略称で、JSONの形をした認証情報
- 電子署名により、改ざんの検知が可能
- 認証用のトークンとして使用される

### JWTの構成
- 3つの要素から構成される
- ヘッダ：ハッシュアルゴリズムの情報などのメタデータ
- ペイロード：認証対象の情報で、ユーザー名やIDなど任意の情報
- 署名：ヘッダとペイロードのエンコードしたものに秘密鍵を加えてハッシュ化したもの
- 要素ごとにBase64エンコードされている
- 3つの要素が.(ドット)で結合されている

## JWTのメリット
- 署名が含まれているため、改ざんチェックできる
- 有効期限をつけるなど、セキュアなToken発行を行える
- セッションと異なり、状態をサーバーで管理する必要がない
- 任意のデータをTokenに含めることができる