OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ElasticIPで日本のIPを確保するためのスクリプト

![r.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/653b6212-b653-0614-5353-8cebacc677cd.gif)
![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/94bf653d-d3e5-3f49-0324-5276b6fcf1f7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/8c1889c6-d053-1f6a-a2d6-32ff60df5a7d.png)

## 経緯
某日本の企業が運営するファイルサーバにEC2からアクセスを試みるも、国外からのアクセスがブロックされているらしく。

で「Elastic IP アドレスを割り当てる」を100回ほど手で繰り返しても、日本のIPアドレスを取得できず。
（ガチャ運なし😂）

といったことがあり、日本のIPを取得するスクリプトを書いた。



## スクリプト

- スクリプトに必要なツール
  - AWS CLI: `$ sudo apt install awscli`
  - jq: `$ sudo apt install jq`

```run.sh
#!/bin/bash

set -e

function ip2Country() {
  local ip=$1
  local reversed_ip=`echo $ip | awk -F'.' -v OFS='.' '{print $4,$3,$2,$1}'`
  # `text = "US"` -> `US`
  local country=`nslookup -type=TXT $reversed_ip.cc.wariate.jp | grep -oP 'text\s*=\s*"\K\w+'`
  echo $country
}

MAX_TRIES=720 # 最大試行回数
INTERVAL_SECS=120 # 短いと同じIPが連続するので2分くらいにする

tries=0
while [ $tries -lt $MAX_TRIES ]; do

  eip_output=`aws ec2 allocate-address --domain vpc`

  public_ip=`echo $eip_output | jq -r .PublicIp`
  country=`ip2Country $public_ip`
  if [ "$country" = "JP" ]; then
    echo "IP address [$public_ip] is in Japan (COUNTRY: $country)"
    exit 0
  else
    echo "IP address [$public_ip] (COUNTRY: $country)"
    aws ec2 release-address --allocation-id `echo $eip_output | jq -r .AllocationId`
  fi

  tries=$((tries + 1))
  sleep $INTERVAL_SECS
done

echo "Reached max tries without finding a JP IP. Exiting..."
```

## 学び: "日本のIP" とは？IPアドレスの国情報について。 <br> ①ドメインの登録者の所在国 ≠ ②サーバーの物理的な場所

① `whois` コマンドの国コードフィールドで知ることができる。
② `cc.wariate.jp` 等[^1]のサービスの使って知ることができる。IPアドレスの実際の地理的位置、つまりIPアドレスが使用されている地域や国。

ドメインの登録者の所在国が "JP" であっても、サーバにアクセスできなかったので...。なるほど①と②は別なのね。

## 補足

- 参考サイト
  - [AWSで日本アドレスがほしいとき](https://qiita.com/tashua314/items/8224cebe64d8e4a45faa)
  - http://cc.wariate.jp/


[^1]: `cc.wariate.jp` サービスの他にも、`GeoIPデータベース`を使う方法などあるらしい。
AWS Lightsailはデフォルパッケージ     (Select a blueprint)でなくOSのみがよかったよ...

アプリを安く楽に構築したいという全人類の夢?をもち
AWSを今日も今日とて徘徊して見つけたおもちゃ
「AWS Lightsail」
Ec2と比べ 余裕のweb構築だ、馬力が違いますよ(値段比)
快適でしょう？んああ仰らないで。詳細対応が貧弱、でも詳細対応なんて見かけだけ?で夏は熱いし手間はかかる

一番気に入ってるのは…

何です？

値段だ(1GB/5ドル Ec2は/10ドル強 )

ああ、何を！ああっ待って！デフォルパッケージ(Django)で動かしちゃ駄目ですよ！待って！止まれ！うぁあああ…

デフォルパッケージ(Django等)　postgreのバージョンが最新版に対応していない等とバージョンが各ライブラリばらけており、結局自分でOSのみを選択してInstallする方が良かったよ
禿げる
JavaのForで使えるいろいろな型

## きっかけ

いつも使っているfor文の初期値などに、int以外の型も使えるということを知り
面白くなっていろいろ試してみようと思いました。

## 試した型

・char型
ソース

```
for(char c = 'A';c <= 'Z';c++) {
			
			System.out.println(c);
		}
```
結果：大文字のAからZまでがアルファベット順に表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/c122c76b-8aaa-d5eb-faeb-d16f334bec26.png)

・double(1)
ソース
```
for(double d = 1.125;d <= 3.363;d++) {
			
			System.out.println(d);
		}
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/f58b37e5-efdb-4a1f-b333-87569e80bf31.png)

・double(2)
ソース
```
		for(double d = 1.5;d <= 3.5;d+=0.3) {
			
			System.out.println(d);
		}
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/320d44d2-d0a3-3a53-7420-9c04423691e5.png)
→なぜ途中から少数桁がびよよんと増えるのかが謎なので今後の課題です。

型はまだまだいろいろあるので、どんな面白い挙動になるかこれからも遊んでみたいです。
【PostgreSQL】更新日時記録用のトリガーをマイグレーション毎に自動設定する【Flyway】

## 背景
`PostgreSQL`では、更新日時を記録したい場合トリガーを設定する必要があります。
これをテーブル追加毎に設定するのは手間で、漏れる可能性も有ります。

そこで、このトリガーをマイグレーション毎に自動設定します。

### 前提
マイグレーションに関しては`Flyway`で管理します。
また、更新日時のカラム定義は`UPDATED_AT TIMESTAMP WITH TIME ZONE DEFAULT current_timestamp`で統一されているものとします。

詳細なバージョンは以下の通りです。

- `flyway-gradle-plugin`(`org.flywaydb.flyway`): `8.5.10`
- `postgres`: `13`

## やり方
以下の`plsql`を`afterMigrate__${識別用の名前}.sql`というようなファイル名で配置することで、毎回のマイグレーション成功後にトリガー設定を実行することができます。

```plsql:afterMigrate.sql
-- UPDATED_ATの更新用トリガー
CREATE OR REPLACE FUNCTION trigger_set_timestamp()
  RETURNS TRIGGER AS $$ BEGIN NEW.UPDATED_AT = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql;

DO
$$
DECLARE
  -- UPDATED_ATカラムを持つ更新トリガー未設定テーブルを抽出
  has_updated_at_tables CURSOR FOR
    SELECT c.table_name
    FROM information_schema.columns c
      LEFT JOIN information_schema.triggers t ON t.event_object_table = c.table_name
        AND t.event_object_schema = c.table_schema -- 同名別スキーマ対策でスキーマも指定
        AND t.trigger_name = 'set_timestamp' -- JOIN対象はset_timestampトリガーのみ
    WHERE c.table_schema = 'public'
      AND c.column_name ILIKE 'UPDATED_AT' -- 取得対象はUPDATED_ATのあるテーブル（定義は大文字だが、POSTGRES上は小文字扱いなため、ILIKEで検索している）
      AND t.trigger_name IS NULL; -- JOINできなかった = set_timestamp未設定のみ対象
  table_name VARCHAR;
BEGIN
  OPEN has_updated_at_tables;
  LOOP
    -- テーブル名を取得、取得できなくなればループ終了
    FETCH has_updated_at_tables INTO table_name;
    EXIT WHEN NOT FOUND;
    EXECUTE format(
      'CREATE TRIGGER set_timestamp
       BEFORE UPDATE ON %s
       FOR EACH ROW
       EXECUTE PROCEDURE trigger_set_timestamp()',
      'public.' || table_name
    );
  END LOOP;
END
$$ LANGUAGE PLPGSQL;
```

以下、やっていることを解説します。

### ファイル名について
ファイル名を`afterMigrate`から始めているのは、毎回のマイグレーション成功後に実行するためです。
これには`Flyway`の`Callback`機能を利用しています。

https://documentation.red-gate.com/fd/callback-concept-184127466.html

### トリガーの自動設定について
自動設定の肝である`DO $$...`以降の部分は、以下のような構成になっています。

1. `UPDATED_AT`カラムを持ち、`trigger_set_timestamp`が定義されていないテーブル一覧を抽出
2. 1で取得されたテーブルに対して`CREATE TRIGGER`をそれぞれ実行

1の抽出クエリに関しては別記事に解説をまとめています。

https://qiita.com/wrongwrong/items/63dccc0f86018279a7cb
全単射を喩える

最近はNLPを勉強しています。

# 記事の目的
統計学の論文を読んでいて出会した「全単射/bijective」という概念を上手く理解する、そして、次回定義を忘れた際に、（個人的に）秒で再理解できるような、ピンとくる喩えを思いついたので、メモします。

# 全単射の定義
Wikipediaからの引用
（左：全射でも単射でもない、右：単射であり全射でない）
![全射でも単射でもない](https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Total_function.svg/200px-Total_function.svg.png)![単射であり全射でない](https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Injection.svg/200px-Injection.svg.png)
（左：全射であり単射でない、右：全単射）
![全射であり単射でない](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Surjection.svg/200px-Surjection.svg.png)![全単射](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Bijection.svg/200px-Bijection.svg.png)

>写像 f: A → B に対し、2つの条件
>
>全射性: f(A) = B
単射性: 任意の A の元 a1, a2 について、f(a1) = f(a2) ならば a1 = a2
がともに成り立つとき、写像 f は全単射 (bijective) であるという。
$\forall b \in B, \exists ! a \in A s.t. b = f(a)$

# 全単射を喩えるとこんな感じ
全ての戸籍がデータベースに登録された日本を想定する。
始域Xを日本在住の父親の全体集合とし、その元を個々の父親、終域Yを日本在住の子供の全体集合とし、その元を個々の子供、fを特定の集合からそれぞれの子供を見つけ出す過程と喩えよう。

すると

全射性(surjective)とは、全ての日本在住の子供に対して、（少なくとも一人の）日本在住の父親がいる状態であり、

単射性(injective)とは、全ての日本在住の子供に対して、fで探し出せられるような日本在住の父親は一人しか存在しない状態である

と言える。

今回は日本在住という条件に絞ったので、全射性でないことに関しては、まあ海外にお父さんがいるのかなあと考えられるが、
単射性でないということになると、複雑な気持ちである。

# この記事を作った背景
[glove](https://nlp.stanford.edu/projects/glove/)の論文を読んでいますが、
[準同型/homomorphism](https://en.wikipedia.org/wiki/Homomorphism)という概念を理解するのに詰まっており、
それを理解するために見ていた[こちらの動画(英語)](https://youtu.be/tCRE0rhwPtI?feature=shared)にて出てきた全単射/bijectiveという概念。

なんとか理解はできたのですが、しばらくするとド忘れしてしまうので、覚えやすいように分かりやすい喩えを考えてみましたという次第でした。
【PostgreSQL】あるトリガーが設定されていないテーブルを取得する

## やり方
以下は「`public`スキーマ内で、`UPDATED_AT`カラムを持ち、`set_timestamp`トリガーが設定されていないテーブルの一覧を取得する」クエリです。
細かい部分はコメントに記載しています。

```sql
SELECT c.table_name
FROM information_schema.columns c
  LEFT JOIN information_schema.triggers t ON t.event_object_table = c.table_name
    AND t.event_object_schema = c.table_schema -- 同名別スキーマ対策でスキーマも指定
    AND t.trigger_name = 'set_timestamp' -- JOIN対象はset_timestampトリガーのみ
WHERE c.table_schema = 'public'
  AND c.column_name ILIKE 'UPDATED_AT' -- 取得対象はUPDATED_ATのあるテーブル（定義は大文字だが、POSTGRES上は小文字扱いなため、ILIKEで検索している）
  AND t.trigger_name IS NULL; -- JOINできなかった = set_timestamp未設定のみ対象
```
mayaでテクスチャから色を拾いたい

テクスチャの特定の位置から色を引き出したいなと。

色々調べててなんとかヒットしたページを参考にやってみました。

http://mukaimame.blog111.fc2.com/blog-entry-1220.html


考え方
-
参考にさせて頂いた内容を見て・・・

-テクスチャを読み込む
-テクスチャをbyteArrayに変換する
-特定の位置の数値を取得する

テクスチャをbyteArrayにした場合には

r,g,b,a,r,g,b,a,r,g,b,a,r,g,b,a,r,g,b,a,.......

という順で並んでいくので、4つのデータで1ピクセルの色情報になってる

という感じ？


4ピクセルで試す
-
写経しつつ、挙動を確認する為にこんな画像でテストしてみる。
スタートが左上か左下かもわからないので、結果で判断しやすくしてみる。

![colorTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/ce33fb6d-dae8-f576-a982-8f3b3da0789c.png)

拡大するとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/55bbe952-da83-dc3a-1e05-20a0170b41ba.png)


```python
import maya.OpenMaya
import os
def getColor(filePath):        
    img = maya.OpenMaya.MImage()
    img.readFromFile(filePath)
    
    w = maya.OpenMaya.uIntPtr()
    h = maya.OpenMaya.uIntPtr()
    img.getSize(w, h)
        
    charPixelPtr = img.pixels()
    util = maya.OpenMaya.MScriptUtil()
    
    for i in range(0,4):
        byteIndex = i *4        
        r = util.getUcharArrayItem(charPixelPtr, byteIndex)
        g = util.getUcharArrayItem(charPixelPtr, byteIndex+1)
        b = util.getUcharArrayItem(charPixelPtr, byteIndex+2)
        a = util.getUcharArrayItem(charPixelPtr, byteIndex+3)
        print([r/255.0, g/255.0, b/255.0, a/255.0])
    
filePath = "D:/colorTest.png"
getColor(filePath)
```
結果はこんな感じ
```
[0.0, 0.0, 1.0, 1.0]
[1.0, 1.0, 1.0, 1.0]
[1.0, 0.0, 0.0, 1.0]
[0.0, 1.0, 0.0, 1.0]
```
左下 -> 右下 -> 左上 -> 右上

の順番ですね

座標指定
-

座標を指定したらそれを
左下スタートのピクセルの順番に変換して
4倍にすればどうじゃろか

```python
import maya.OpenMaya
import os

def getColor(filePath,posX,posY):        
    img = maya.OpenMaya.MImage()
    img.readFromFile(filePath)
    
    w = maya.OpenMaya.uIntPtr()
    h = maya.OpenMaya.uIntPtr()
    img.getSize(w, h)

    byteIndex = posX + (posY * w.value())
    byteIndex = byteIndex *4
        
    charPixelPtr = img.pixels()
    util = maya.OpenMaya.MScriptUtil()
    r = util.getUcharArrayItem(charPixelPtr, byteIndex)
    g = util.getUcharArrayItem(charPixelPtr, byteIndex+1)
    b = util.getUcharArrayItem(charPixelPtr, byteIndex+2)
    a = util.getUcharArrayItem(charPixelPtr, byteIndex+3)

    return [r/255.0, g/255.0, b/255.0, a/255.0]
    
filePath = "D:/colorTest.png"
getColor(filePath,0,1)

# Result: [1.0, 0.0, 0.0, 1.0] # 

```
赤とれましたね。
UV座標から取れるようになったらもっと便利だろうなぁと思いつつ、
一旦おしまい。



参考
-

http://mukaimame.blog111.fc2.com/blog-entry-1220.html
【積読】複雑な問題はメモを取りながら作業をしようという話

:::note info
私は複雑な課題に取り組んでいるときに、芋づる式に新しい問題が現れて、気づいたら多くの時間を消費してしまうことが多いです。このような状態の時に、意識すると良いポイントが本に書かれていたのでまとめてみました。
:::

今回参考にさせていただいた本がこちらです。
*プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則*

https://amzn.asia/d/izg1Oi4

---
### ヤクの毛刈り
**ヤク**というのは牛の一種で、その体を覆う毛が極端に多いのが特徴です。夏になるタイミングで毛を刈るのですが、本体に到達するまでに相当たくさんの毛を刈る必要があるそうです。

同じように問題に取り組んでいる時に、まるでヤクの毛刈りのように、ある問題を解こうと思ったら別の問題が出てきて、なかなか本体に辿り着かない。問題を解こうと思ったら、さらに別の問題が出てきて、、、という状態が延々と続く。

もはや何を解決しようとしていたか、元の問題を見失ってしまうことが私もよくありました。

### 対応方法１ 早々に切り上げる
ヤクの毛を刈っている状態に陥っている状態だと感じたら、立ち止まり、そもそも何が目的だったか思い出すようにする。「目的からすれている」「時間やコストと見合わない」と認識した場合は、すぐに作業を止め、**別の道がないか探してみる**。

また他の人が同じような状態に陥らないように、**作業が立ち止まった顛末をメンバーに共有する**。チームメンバーの時間ロスを未然に防ぐことに繋がります。


### 対応方法2　立ち向かう
基本的に「ヤクの毛刈り」は避けるべきですが、価値ある目的や緊急トラブルなど、「ヤクの毛刈り」を乗り越えて、問題を解決しなければならないときもあります。
（確かに自分自身も、時間をかけて解決したものが、結果的に一番身についていると感じることも多いです。）

その際に注意するべきことが、**問題が脳内でオーバーフロー**してしまうことです。「ヤクの毛刈り」は1つの問題が解決しないうちに、次の問題が発生してしまいます。問題だけが芋づる式で発生して、脳内スタックがオーバーフローすることがしばしばあります。

この時の意識すると良いポイントが、**問題解決を頭の中だけでやらない**ことです。（←よくやってしまっていました💦）
**問題を書きながら、丁寧に、順に、ひたすら問題を解決していく。**






:::note info
プログラミング中でも「ヤクの毛刈り」のような状況は発生します。この時に、複雑なコードを読み込む時こそ、メモを取りながら作業を進めることが重要。
コードの場合、作業より思考の部分が多くなるので、メモを取らずに「思考のループ」に陥ることを防ぎましょう。
:::
Git tigの使い方

# Git tig 

Gitのコマンドラインツールで、テキストベースのTUI（テキストユーザーインターフェース）を提供している
**→Gitリポジトリを可視化して操作するためのツール**

# tigの使い方

## インストール

-tig を使う前に、システムに tig をインストールする必要がある
インストール方法は、使用しているOSに依存

#### Linuxディストリビューション : パッケージマネージャを使用してインストール

例）Debian/Ubuntu

```arduino
sudo apt-get install tig
```
#### Mac : Homebrewを使用してインストール

```
brew install tig
```

#### Windows : CygwinやWSLを使用してインストール

## tigの起動

tig コマンドをターミナルで実行すると、Gitリポジトリの情報が表示されるTUIが起動する

```
tig
```

tigは、Gitリポジトリのトピックブランチ、コミットログ、ファイルの変更履歴などを表示し、さまざまな操作を行うためのキーバインディングを提供する

## tigの基本操作

### tig のデフォルトビューはコミットログ

#### 上下の矢印キー
コミットログやファイルリストをスクロール
#### Enterキー
選択したコミット、ファイルの変更を表示
#### q キー
tigを終了

#### b キー
ブランチビューに切り替え

#### / キー
コミットログ内でのテキスト検索
【SQL】テーブルの作成・変更・削除


## CREATE

CREATEはデータベースに空のテーブルを作成します。  

```sql
CREATE TABLE テーブル名 ( 
  カラム名1 データ型 制約,
  カラム名2 データ型 制約,
            ：
  テーブルの制約1, 
  テーブルの制約2, 
            ：
);
```

- データ型  

| データ型 | 説明                                                                 |
| :------: | :------------------------------------------------------------------- |
| INTEGER  | 整数（小数は不可）                                                   |
|   CHAR   | 固定長文字列。続けて`(数字)`を記述することで最大文字数を指定できる。 |
| VARCHAR  | 可変超文字列。続けて`(数字)`を記述することで最大文字数を指定できる。 |
|   DATE   | 日時                                                                 |

- 制約

|    制約     | 説明                                                   |
| :---------: | :----------------------------------------------------- |
|  NOT NULL   | NULL 値が列に入力されないようにする                    |
| PRIMARY KEY | 主キーを設定する。必ずNOT NULL制約をつける必要がある。 |
| FOREIGN KEY | 外部キーを設定する                                     |

### 例

```sql
CREATE TABLE Users (
  user_id            INTEGER      NOT NULL,
  user_name          VARCHAR(15)  NOT NULL,
  user_address       VARCHAR(100) NOT NULL,
  user_phone_number  CHAR(13),
  PRIMARY KEY (user_id)
);

CREATE TABLE Orders (
  order_id   INTEGER NOT NULL,
  order_date DATE    NOT NULL,
  user_id    INTEGER NOT NULL,
  PRIMARY KEY (order_id),
  FOREIGN KEY (user_id) REFERENCES Users (user_id)
);

```

![スクリーンショット 2023-01-02 23.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/42005c94-1892-722f-18ab-d0f77f63c35d.png)

## DROP

`DROP`はテーブルを削除します。  

```sql
DROP TABLE テーブル名;
```

## ALTER

`ALTER`は定義済みテーブルを変更する。  

- カラムを削除する

```sql
ALTER TABLE テーブル名 DROP COLUMN カラム名;
```

- カラムを追加する

```sql
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型 制約;
```

- テーブル名を変更する

```sql
ALTER TABLE 旧テーブル名 RENAME TO 新テーブル名;
```
devcontainer.json

# devcontainer.json

:::note
VS Codeを使用して開発を行う際に、開発環境の設定を定義するためのファイル

このファイルは、VS Code内でRemote Containers(拡張機能)を使用してコンテナ内の開発環境を構築するために使用される
:::

## devcontainer.json ファイルに含まれる情報

### コンテナの設定
- 開発に使用するコンテナのイメージやビルド方法、ポートの転送、マウントするボリュームなどの設定が含まれる
→開発者は共通の開発環境を簡単にセットアップできる

### 拡張機能のインストール
- 開発環境内にVS Code拡張機能をインストールするための指示が含まれる
→開発環境内で特定の拡張機能を利用できる

### シェルの設定
- 開発環境内で使用するシェル（Bash、PowerShellなど）の設定が含まれる
→コンテナ内でのシェルの動作をカスタマイズできる

### プロジェクト固有の設定
- 特定のプロジェクトに固有の設定を含めることができる
例）プロジェクト固有の環境変数や設定ファイルの配置場所などの指定ができる


*** 

開発者はローカル環境と異なる環境 例）Dockerコンテナ内 での開発が簡単にできるに行うことができる
異なるプロジェクト間で共通の開発環境を確保し、環境のバージョン管理がしやすい

:::note
**devcontainer.json ファイルは、VS CodeのRemote Containersを有効にしたプロジェクト内に配置される
↓
VS Codeがそれを認識してコンテナ内の開発環境を自動的に構築する
↓
開発者は、VS Codeの「リモートエクスプローラー」からコンテナ内のファイルにアクセスし、開発を行うことができる**
:::
Qiitaの2023年８月のアップデート

https://qiita.com/Qiita/items/563a6ea111709a03fbea
このうち
記事の投稿・更新中にローディングアニメーションを表示するようにしました
っていうのははやりなのかな？
https://www.mlit.go.jp/plateau/
ここなんかまさにそれ。

# ローマは一日にしてならない
フロントエンドへアニメーションのイメージを伝えるための4つの方法 | 株式会社LIG(リグ)｜DX支援・システム開発・Web制作　 すーちゃん　2016.10.11
https://liginc.co.jp/306049

このうち、ナビゲーションの開閉が現在の流行に近いと思われる。


CSSとJavaScriptでWebページにローディングアニメーションを表示させる方法 | Webクリエイターボックス
https://www.webcreatorbox.com/tech/loading-animation

【コピペでOK】イメージ別！サイトをリッチに見せるためのCSSアニメーションまとめ【デモ・サンプルコード付き】 – 東京のホームページ制作 / WEB制作会社 BRISK
https://b-risk.jp/blog/2021/01/anim-reference/
>そこで本記事では、そういった言葉にしにくい部分にフォーカスを当てて、シンプル・綺麗、ポップ、スタイリッシュ、柔らかい印象などのイメージ別にCSSアニメーションをご紹介します。
デモ・サンプルコード付きですので、ぜひイメージ通りのアニメーションを探してご活用ください。

>今回紹介するアニメーションのほとんどは、CSSのanimationプロパティを利用して設定されていますので、animationプロパティについても簡単に解説していきます。
（中にはtransitionプロパティでアニメーションを設定したものもあります。）

# やはりアンチも現れる
アニメーションを望まないユーザーを考えたWeb制作をしよう｜prefers-reduced-motion | JAJAAAN
https://jajaaan.co.jp/web-production/frontend/prefers-reduced-motion/

>アニメーションを 望まないユーザーに 対応したWeb制作
Webサイト制作の方法は年々代わり、表現方法も多彩になっていきます。
特にアニメーションなどの表現を盛り込んでいるWebサイトも多いでしょう。
弊社のサイトもアニメーションが多いです。
<b>Webサイトにアニメーションは必須ではない</b>
「動かしたほうが目立ってインパクトがあるから」という単純な理由でWebサイトにアニメーションを実装していないでょうか？
アニメーションは効果的に使うことで伝えたい情報をユーザーに的確に与えることができます。
しかしその反面、最近はアニメーションが不要だというケースが多いように感じてきました。
ネットを利用する年配の方が増えてきたという背景もあります。
クライアントによってはアニメーションをご要望される場合も多いですが、「本当にそのアニメーションは必要なのか？」ということを考える必要があります。

2023年現在の記事

# だがちょっと待ってほしい。
HTML | marqueeタグは非推奨、代替で使えるCSSを紹介 | ONE NOTES
初出2021-12-28更新2022-01-29
https://1-notes.com/html-marquee-alternative-css/

かつてMaruqueeタグでやってきたことをCSSでど派手にやっているという感じ
それに、「Webサイトにアニメーションは必須ではない」というのは当然なような気もする。

# 認知プロファイリング
これらの記事を見ると、アニメーションをくっつけるのはクライアントのためであって、実際にWebを見る人のためではないって感じになっている。

## ローディングアニメーションで検索
## 2013
ページを読み込んだ時に一度だけ動かすCSSのanimation | パソコン倶楽部りんご
jQueryで簡単なloading画面を作る
https://sterfield.co.jp/blog/2824/
## 2014
【JQuery】処理待ち中にアニメーション表示する – ysklog
ドット絵のアニメーションする砂時計のローダーデザイン 『Hourglass Loader』 | 9ineBB
【10分ぐらいでできる！】Illustratorで作るSVGローディングアニメーション | 尼崎市でWEB制作してます［s-oyama.me］ 2024/08
https://s-oyama.me/blog/web-creation/272/


submitとローディング 2014年11月12日
https://qiita.com/tomtoma/items/920f6e74358593612b08
## 2015
刀でズバッと斬るようなアニメーションをHTML・CSS・JS（jQuery）で実装する方法 2015/02/28
https://liginc.co.jp/web/html-css/143360
Canvasで実装するシンプルなローディング画面3パターン 2015/05/26
https://qiita.com/nekoneko-wanwan/items/be099f0af4155f8a32b4
【JQuery】処理待ち中にアニメーション表示する – ysklog
https://sterfield.co.jp/blog/2824/

CSS によるローディングアニメーションを簡単に生成できる「CSS Load.net」｜CSS｜WEBデザインの小ネタとTIPSのまとめサイト「ウェブアンテナ」
https://www.webantena.net/css/css3-loading-created-by-css-looadnet/
CSSだけで作るloadingシリーズをまとめて「loadingアイコンメーカー」として提供を開始しました [無料ホームページ作成クラウドサービス　まめわざ]　2015/9/3
https://mamewaza.com/support/blog/howto-use-loading-tools.html

## わかったこと
### ローディングアニメーションという単語の確立
ローディングアニメーションという単語が固まったのは2014年ごろで、それ以前はローディングなんとかとか言っていた。
### ローディングアニメーションの起源は砂時計
明確に処理待ちに使うというのは砂時計からのようだ。今のアニメは砂時計が最初だった。
### 処理待ちから開くときに必ず表示へ変化
次に処理待ち中にウェブを訪問した人が逃げていかないようにアニメを付けたのが最初ということになる。
とはいうものの、2016年に入るまではちょっとした技のように扱われていたようだ。
しかし、2016年に入ると、「開くときに必ず見せる」という立ち位置に変化している。
### ローディングの意味が違うんですけど・・・
ローディング 読み込むまでの待機中の時間に表示
ローディング ページを開くときに表示
もともとはローディング アイコンだったりしますね。
Azure Storage周りについてまとめる

<h1>AzureStorageサービス種類</h1>
<ul>
    <li>Azure Blob Storageコンテナー…大量の非構造化データor非リレーショナルデータを格納可能。画像、ドキュメント、ストリーミング配信、バックアップデータ、オンプレの分析データを格納可能。HTTPまたは、HTTPS経由アクセス可能。</li>
    <li>Azure Files…ネットワークファイル共有サービス。高可用性。1.サーバーメッセージプロトコル、2.サーバーメッセージブロック(SMB)、3.ネットワークファイルシステム(NFS)、4.Azure Files REST APIを使ってアクセス可能。</li>
    <li>Azure Queue Storage…メッセージの格納と取得に使用。最大64Kで、数百万件のメッセージ格納が可能。</li>
    <li>Azure Table Storage(Azure Cosmos DB)…最新のアプリ開発に対応するフルマネージド型のNoSQLデータベースサービス。構造化された、非リレーショナルデータを格納する場合に最適。</li>
</ul>

<h1>BLOBストレージのアクセス層</h1>
<ul>
    <li>ホット…頻繁にアクセスされるデータの格納に最適。コストは一番高い</li>
    <li>クール…アクセスの頻度は低いものの、30日以上保管されるデータの格納に適している。</li>
    <li>アーカイブ…ほとんどアクセスされず、少なくとも180日以上の保管される。</li>
</ul>
ようつべ体験記6

[前回](https://qiita.com/matsukatsu/items/84f93b084544ee4bbef2)

チャンネル登録に導けるコンテンツ作りを考えてみます。

YouTube を利用している方にどんなコンテンツが受けているのか、受けそうか。
あるいは、競合チャンネルではどんなコンテンツが受けているのか。
チャンネルを閲覧してくれている方にどんなコンテンツが受けそうか。

そういった事も調査すべきだと思いますが、それらを調べたところでできる事が限られています。
色々調査した挙句、自分自身が持っていない素材が必要だとなった場合に、金や時間がかかることになります。

今のところ、自分が持っている素材にちょっとだけ手を加えて公開する程度しか考えていません。
調査の時間が無駄になる可能性や、調査している間、方針無しでコンテンツ作りをする事は避けたいです。

まずは自分自身の前月のコンテンツを振り返って、ちょっとでも良かったもの、あまり良くなかったもののうち、ちょっとでも良かったものに寄せたコンテンツ作りを進める事にします。
今月の方針を決めた上で、方針に沿ったコンテンツ作りの傍ら、市場、競合、顧客調査的な事も手がけてみたいと思います。

これが現時点のコンテンツ一覧で、視聴回数で降順に並んでいます。
赤字は公開日から今日までの1日あたりの視聴回数を算出した値です。
旅行に関するチャンネルなので、動画が対象にしている地域を書き込んでいます。
![チャンネルアナリティクス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/37796ce9-6cf4-8540-77c0-144a27508c04.png)

1、2、3 は同じ国の動画です。
1 が伸びてきたので、2、3 を公開したら、それらも視聴回数が伸びました。
できたらこの国の事だけ公開していたいところですが、素材がネタ切れです。
金か時間で素材を集める、もしくは素材がいらないアイデアが必要ですが、何も無いので考えから外します。

4 は公開後、しばらくして伸びてきました。
視聴回数を牽引してくれた事情があり偶然伸びたのですが、他はその偶然すらないので、受けそうなコンテンツの最有力候補です。

5 は公開後、特に目立った事はありませんでした。
コツコツ視聴回数を増やして、気づいたら 5 番目に視聴されていました。
これはこれで、このチャンネルの中では良い見られ方と言えそうです。

6 も公開後、特に目立った事はありませんでした。
5 と似ていますが、若干、コツコツ具合で 5 が上回っていました。
5 か 6 のどちらを選ぶかと言えば 5 になります。

7 も特に目立つ動きはなく、コツコツ具合も少ないです。
1日あたりの視聴回数もこのチャンネル最低です。
でも、この地域が一番思い入れがあるコンテンツでした。

7 より下は公開して日が浅いので、1日あたりの視聴回数がどんどん下がる可能性があります。
今回は考慮から外します。


視聴者の行動が、視聴（離脱）、高評価、リピート、チャンネル登録という順をたどる事を考えると、視聴数だけを見た状態は、ただ上っ面を舐めただけではありますが、ひとまずこれで方針は決めます。
より深く見ていく中で考えが変わったら、方針も変えます。

重要だと思った事は、僕にとって思い入れが強い中東は、おそらく現時点では視聴者に受けないので、今月は外します。
東南アジアは偶然受けましたが、偶然がない可能性もありそうです。現にもう一つの東南アジアは、あまり受けていません。たまたまホームランを打てただけと考えると、東南アジアだけに頼るのは心もとない感じがします。
西ヨーロッパは強く牽引してくれる偶然が無かったにも関わらず、これだけ視聴回数を重ねられました。偶然に頼らないアベレージヒッターのように見えます。

今月は東南アジアと西ヨーロッパを交互に公開して、まずは視聴回数を増加させる方針にします。
それがどれだけ今月の目標とするチャンネル登録者数10人に寄与しそうかは、また明日以降考えます。

[次回](https://qiita.com/matsukatsu/items/05a53d2e3352bbeb9ad1)
Rails_Adminの$fa-font-path: "."; @import "rails_admin/src/rails_admin/styles/base";に対するエラーについて

# 問題
rails_adminのgemを入れると以下のようなエラーが出る

```ruby
SassC::SyntaxError in RailsAdmin::Main#dashboard

Error: File to import not found or unreadable: rails_admin/src/rails_admin/styles/base.
        on line 2:1 of app/assets/stylesheets/rails_admin.scss
>> @import "rails_admin/src/rails_admin/styles/base";
```

# 環境
- Ruby3.2.2
- Ruby on Rails 7.0.2
- dockerなし

# 予想
予想としては以下の問題があると考えた

1. 7系統からnodeが確か不要になった気がしたため、それが原因か？
→ログを見るとnode,yarnがないよと言われた。
2. コンパイルできていない
→このためだけにコンパイルに関するエラーが出るのか？
3. @importがうまくできていない
→該当部分を削除するとレイアウトなしで表示できる


# 取り組み

1. node、yarnをhomebrewからインストール
2. compileを再度行う
3. package.jsonを編集

# 結果

恐らく３番が原因だった。

package.jsonを以下のように書き換え

```Ruby:変更前
{
  "scripts": {
    "build:css": "sass ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules"
  }
}
```

```Ruby:変更後
{
  "scripts": {
    "build:css": "sass ./app/assets/stylesheets/application.sass.scss:./app/assets/builds/application.css ./app/assets/stylesheets/rails_admin.scss:./app/assets/builds/rails_admin.css --no-source-map --load-path=node_modules"
  },
  "dependencies": {
    "rails_admin": "3.1.2",
    "sass": "^1.66.1"
  }
}
```

以上の変更を加えた結果、正常に動作を確認した。

# 補足

公式ドキュメントではGemfileに記載する際に
gitのコードのリンクを貼ったらうまくいったという報告があったが
自分は特に変化なし。

そもそもrails_adminがお作法多すぎる気がする。
[vb.net] テンキーがなくても...画面上操作

#はじめに
テンキーがなくても画面上で操作出来る物を作ってみました。
![スクリーンショット 2023-07-22 191519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/6429f32f-c896-467b-55b0-2ac188991275.png)


#目次
1. ソースコード
2. "&="の意味について
3. 動作動画

 


# 1.ソースコード

```vb:VB.net
Public Class Form1

   '「Label」と「Button」に表示する文字の指示を行う。
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Label1.Text = ""
        Button1.Text = "0"
        Button2.Text = "1"
        Button3.Text = "2"
        Button4.Text = "3"
        Button5.Text = "4"
        Button6.Text = "5"
        Button7.Text = "6"
        Button8.Text = "7"
        Button9.Text = "8"
        Button10.Text = "9"
        Button11.Text = "クリア"

    End Sub

   'Label1に「０」と表示する
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label1.Text &= "0"
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Label1.Text &= "1"
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Label1.Text &= "2"
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Label1.Text &= "3"
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Label1.Text &= "4"
    End Sub

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        Label1.Text &= "5"
    End Sub

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Label1.Text &= "6"
    End Sub

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
        Label1.Text &= "7"
    End Sub

    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
        Label1.Text &= "8"
    End Sub

    Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        Label1.Text &= "9"
    End Sub

   'クリアボタンを押された時に「Label1」の文字列を空白にする。
    Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
        Label1.Text = ""
    End Sub

End Class

```

# 2.「 &= の意味について」
VB.NETの"&="演算子は、文字列の連結と代入を同時に行います。
```vb:VB.net
Label1.Text &= "0"
```
このように書き換えることができます
```vb:VB.net
Label1.Text = Label1.Text & "0"
```
"&"演算子は二つの文字列を連結します。そして、"="演算子は左辺の変数に右辺の値を代入します。
したがって、"&="演算子は、右側の値を現在の値に追加（連結）し、結果を左側の変数に代入するという操作を行います。


・分かりやすいように、イメージ図が以下のようになっています。
※「Label1.Text = Label1.Text & "0"」と書いてありますが、「Label1.Text &= "0"」と同じになります。
![テンキー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/57b96b72-ff47-546b-bf2d-abd44b1ed71a.jpeg)

結論として、
"&="がないとLabel1に一文字しか入力されない。



# 3.動作動画

[![テンキーー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/735dc663-40ee-0f4b-559f-c28e732528ea.jpeg)
](https://youtube.com/shorts/Sil1638vQzM)
コンピュータの歴史

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

今回は、コンピュータの歴史を以下の3つに分けて解説します。
1.メインフレーム時代
2.クライアント/サーバー時代
3.クラウド時代

# 1.メインフレーム時代
コンピューターが登場した初期は、メインフレームコンピュータが主流で、大規模な組織や研究機関で使用されてきました。
`中央集権型のモデルで、ユーザーは端末を介して中央のメインフレームにアクセス`しました。
多数の利用者や業務で共有し、大量の重要なデータや処理を扱うため、現在においても極めて高い信頼性や性能が必要なシステムで使用されています。

# 2.クライアント/サーバー時代
パーソナルコンピュータの普及とネットワーキング技術の発展が特徴で、クライアント/サーバーアーキテクチャが台頭しました。
`サービスをリクエストするデスクトップコンピュータ（クライアント）と、実際の処理をするサーバーコンピュータの連携により、分散処理が実現`されました。
インターネットの普及もこの時代に進展し、ウェブアプリケーションが登場しました。

# 3.クラウド時代
近年では、クラウド・コンピューティングが主要なテクノロジーとして確立しました
クラウドとは、`ユーザーがインフラやソフトウェアを持たなくても、インターネットを通じて、サービスを必要なときに必要な分だけ利用する`という考え方です。
クラウドは、導入コストが安い・使用場所を問わない・自社で設備管理が不要等の理由から、多くの企業や組織がクラウドに移行しています。



# 終わりに
この記事では、コンピュータの歴史を「メインフレーム時代」「クライアントサーバー時代」「クラウド時代」の3つに分けて解説しました。これらの時代変化に合わせてビジネスモデルも、__メインフレームの販売->ハードウェアの販売やソフトウェアライセンス、アプリケーション開発->サブスクリプションモデル__ というように移行してきました。今後もIT技術の発展に伴ってビジネスモデルも変化していくでしょう。


最後までお付き合いくださりありがとうございました。
スクラムの基礎知識を確認するテストをつくってみた

## はじめに

以下の図はスクラムの基礎知識を確認するためのテストです。
空欄に当てはまる用語を回答して下さい。

　A1～3：スクラム理論の三本柱
　B1～5：スクラムの価値基準
　C1～3：役割（ロール名）
　D1～5：スクラムイベント
　E1～3：スクラムの成果物
　F1～3：各作成物に対する確約（コミットメント）


## 設問編

![scrum_quiz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/bb8a37f8-e541-bf8a-159c-43a0b40313d0.jpeg)


| 3本柱 | 説明 |
|:-:|:-|
| A1 | 作業状況や作成物の状態を見える化する（隠さない）  |
| A2 | 定期的に確認を行い、問題をいち早く検知する（見逃さない）  |
| A3 | 問題に対して改善策を実行する（放置しない）  |

| 価値基準 | 説明 |
|:-:|:-|
| B1  | ゴールの達成に全力を尽くし、お互いにサポートすることを( B1 )する  |
| B2  | 全員がスプリントでの作業やゴールに( B2 )する  |
| B3  | 全ての作業や課題を( B3 )することに合意する  |
| B4  | お互いを能力ある独立した個人として( B4 )する  |
| B5  | 正しいことをする( B5 )を持ち、困難な問題に取り組む  |

| ロール | 責任 |
|:-:|:-|
| C1  | 成果物として実用可能なプロダクトを提供する  |
| C2  | プロダクトの価値を最大化する  |
| C3  | スクラムを機能させ、チームのパフォーマンスを最大化する |

| イベント | 実施事項 |
|:-:|:-|
| D1  | 他のイベント全てを含む一定期間の繰り返しのサイクル |
| D2  | 今回のスプリントで何を実現するかを決定し、必要なタスクを洗い出す |
| D3  | 日々の進捗状況を共有し、課題に対処する  |
| D4  | スプリントの成果物をプレゼンし、フィードバックを収集する  |
| D5  | 今回のスプリントをふりかえり、改善アクションを検討する  |

| 作成物 | 説明 | 確約（コミットメント） |
|:-:|:-:|:-:|
| E1  | プロダクトに対する要求一覧  | F1  |
| E2  | 要求を実現するためのタスク一覧 | F2  |
| E3  | 実用可能な成果物（追加分）  | F3  |

回答は以下
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓



## 回答編

![scrum.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/14a9da4d-3bb2-51e6-c940-bf0a8a48f497.jpeg)



| 3本柱 | 説明 |
|:-:|:-|
| 透明性  | 作業状況や作成物の状態を見える化する（隠さない）  |
| 検査  | 定期的に確認を行い、問題をいち早く検知する（見逃さない）  |
| 適応  | 問題に対して改善策を実行する（放置しない）  |

| 価値基準 | 説明 |
|:-:|:-|
| 確約  | ゴールの達成に全力を尽くし、お互いにサポートすることを確約する  |
| 集中  | 全員がスプリントでの作業やゴールに集中する  |
| 公開  | 全ての作業や課題を公開することに合意する  |
| 尊敬  | お互いを能力ある独立した個人として尊敬する  |
| 勇気  | 正しいことをする勇気を持ち、困難な問題に取り組む  |

| ロール | 責任 |
|:-:|:-|
| 開発者（DEV）  | 成果物として実用可能なプロダクトを提供する  |
| プロダクトオーナー(PO)  | プロダクトの価値を最大化する  |
| スクラムマスター(SM)  | スクラムを機能させ、チームのパフォーマンスを最大化する |

| イベント | 実施事項 |
|:-:|:-|
| スプリント  | 他のイベント全てを含む一定期間の繰り返しのサイクル  |
| スプリントプランニング  | 今回のスプリントで何を実現するかを決定し、必要なタスクを洗い出す |
| デイリースクラム  | 日々の進捗状況を共有し、課題に対処する  |
| スプリントレビュー  | スプリントの成果物をプレゼンし、フィードバックを収集する  |
| レトロスペクティブ  | 今回のスプリントをふりかえり、改善アクションを検討する  |

| 作成物 | 説明 | 確約（コミットメント） |
|:-:|:-:|:-:|
| プロダクトバックログ（PBL）  | プロダクトに対する要求一覧  | プロダクトゴール  |
| スプリントバックログ（SBL）  | 要求を実現するためのタスク一覧  | スプリントゴール  |
| インクリメント（プロダクト）  | 実用可能な成果物（追加分）  | 完成の定義（DoD） |



## 参考情報
[公式スクラムガイド(2020年日本語版)](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)

## こぼれ話（私的コメント）
Qiita記事らしくない（というかだいぶ特殊な使い方）という自覚はあります。
誰でも使えて再利用可能なコンテンツということで大目にみていただければ幸いです。

世間一般に広く知られているスクラムのフレームワークを今更解説する理由は以下です。
SMとして初心者にスクラムの流れを説明する場面がよくあるのですが、ひと通り説明した後で、きちんと理解できたか確認する際に、こんなコンテンツがあったら便利なんだけどな、と思っていたものを作りました。
また昨今、スクラムもかなり知られるようになったため「だいたい知っている」という人も多いのですが、この「だいたい」がクセモノで、実はちゃんと理解していなかった部分が後々、問題の火種となることも。そういったケースを予防するためにも、どこらへんが分かっていないかを洗い出すのにも使えそうです。

SM向けには、用語ではなく説明書きの方を空欄にして、記入するテストに変えてみると、難易度が上がってちょうどいいかもしれません。
「バインド要素 'xxx' には暗黙的に 'any' 型が含まれます。」のエラーを黙らせる方法

## VSCode上でよく見る？エラー

`バインド要素 'xxx' には暗黙的に 'any' 型が含まれます。`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/83df1780-8a4a-c119-88f8-de60468b0d8e.png)

TypeScriptでアプリケーションを実装していると度々発生するこのエラー。
最適解ではないにせよ、実は簡単な方法で黙らせることができます。

## 暫定の解決策

tsconfig.jsonに `"noImplicitAny": false` を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/23b36be8-0a12-761f-b06a-6d072727c653.png)

追加するとあら不思議。エラーが出なくなりました。スッキリ。

## そもそもエラーの原因は何？

`xxx` に型が指定されていないため、発生しています。
（まぁエラーメッセージを見れば一目瞭然ではありますが。。）

TypeScriptは動的型付けであるJavaScriptのデメリットを解決するための言語であり、型を活かすことで本来の力を発揮できます。
しかし、実装上では型が定義されておらず、何でも代入できるany型の変数の扱いとなっているためVSCodeはエラーを出力しています。

## 恒久の解決策

typeを使って型を定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/c3f6b3e7-0978-7982-d96c-ade1769122f8.png)

```typescript
type ContentsData = {
  contents: {
    id: string,
    title: string
  },
  totalCount: number
}
```

これでany型ではなくなるため、エラーはでなくなります。

### まとめ

TypeScriptで実装するなら型を定義せよ。
anyにさせたら負け。
Git 運用フロー

## Gitとは
ソースコードの管理ツールです。
例え話で説明すると、管理物の状態を教えてくれるエクスプローラーみたいなものです。エクスプローラーからファイルサーバーにアクセスし、ファイルサーバー上にメンバが管理するソースコードがあります。変更や修正を行いたい際にはファイルサーバーからローカル環境に落とし、修正後にファイルサーバー上に戻します。戻す際に、ローカル環境に落とした時から状態が変更した場合、エクスプローラーから変更連絡が教えてくれます。

## 新規ブランチ作成
開発現場で新規ブランチを切る場合、プルした最新のリポジトリから始めます。この時、ctrl + Aで全選択することができるので、１回であらゆるリポジトリを最新状態にすることができます。切った後に、ブランチ名を記述します。この時、後々マージするものか、検証用のものかわかるようなブランチ名にします。

## コミットおよびプッシュを行う
修正または、コードを追加した場合、Gitステージングにアクセスします。++を選択し、コミットメッセージを添えて、コミットおよびプッシュボタンをクリックします。

### コミットとプッシュの違い
コミットは、上記に挙げたローカル環境のエクスプローラーに管理物を保存するイメージです。
プッシュは、ローカル環境で保存した管理物をファイルサーバー上で保存するイメージです。

## コミットおよびプッシュ後
コミットおよびプッシュ後は、修正のためにきったブランチは不必要なため、削除します。

（参考)
https://nvie.com/posts/a-successful-git-branching-model/
TCP/IPモデルは一つじゃない

TCP/IPモデルは一つではない

ネットワークの勉強をすると TCP/IPモデルとOSI(解放システム相互接続)参照モデルが説明される。

しばしその違いを示すために以下のような表が登場する。

<table>
	<thead>
		<tr>
			<td>OSI参照モデル</td>
			<td>TCP/IPモデル</td>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>アプリケーション層</td>
			<td rowspan="3">アプリケーション層</td>
		</tr>
		<tr>
			<td>プレゼンテーション層</td>
		</tr>
		<tr>
			<td>セッション層</td>
		</tr>
		<tr>
			<td>トランスポート層</td>
			<td>トランスポート層</td>
		</tr>
		<tr>
			<td>ネットワーク層</td>
			<td>インターネット層</td>
		</tr>
		<tr>
			<td>データリンク層</td>
			<td rowspan="2">ネットワークインターフェース層</td>
		</tr>
		<tr>
			<td>物理層</td>
		</tr>
	</tbody>
</table>

しかしこれは、少し細かい話をするとおかしいものになる。

TCP/IPモデル は一般的に広く使われる事実上の標準すなわち **デファクトスタンダード** のもので上記の表のような完全な対応をしているわけではない。

TCP/IPモデルは日本では上のように説明されるのが通常だが、誰かが決めたものではないため下のようなモデルも正しい。インターネットの規格群を決めている、RFC にも登場している。

ネットワークのトラフィックのカプセル化の詳細を定めた RFC1122 には無かったデータリンク層(Data Link Layer)がRFC 7133 には トラフィックに関する記述があります。

日本でよく説明されるTCP/IPモデルは 一つ古い世代のもので現在のTCP/IPモデルは ネットワークインターフェース層が二つに分かれている。

また、Wikiには 文献によって異なる説明がされることが取り上げられている。

[インターネットプロトコルスイート英語版Wikipedia](https://en.wikipedia.org/wiki/Internet_protocol_suite#Layering_evolution_and_representations_in_the_literature)

この一部を切り抜くと

|Arpanet Reference Model  <br>(RFC 871)|Internet Standard  <br>(RFC 1122)|Internet model  <br>(Cisco Academy)|TCP/IP 5-layer reference model  <br>(Kozierok,Comer)|TCP/IP 5-layer reference model  <br>(Tanenbaum)|TCP/IP protocol suite or Five-layer Internet model  <br>(Forouzan,Kurose)|TCP/IP model  <br>(Stallings)|OSI model  <br>(ISO/IEC 7498-1:1994)|
|---|---|---|---|---|---|---|---|
|_Three layers_|_Four layers_|_Four layers_|_Four+one layers_|_Five layers_|_Five layers_|_Five layers_|_Seven layers_|
|Application/ Process|Application|Application|Application|Application|Application|Application|Application|
|Presentation|
|Session|
|Host-to-host|Transport|Transport|Transport|Transport|Transport|Host-to-host or transport|Transport|
|Internet|Internetwork|Internet|Internet|Network|Internet|Network|
|Network interface|Link|Network interface|Data link (Network interface)|Data link|Data link|Network access|Data link|
|—|—|—|(Hardware)|Physical|Physical|Physical|Physical|

これを知っている人が少ないと感じた。ネットワークを教わった先生もこの事実を知らなかったし、その経緯を取り上げているYoutube の投稿者は 一人しかいなかった。

だから何が言いたいかというと表を使ってOSIモデルとTCP/IPモデルのそれぞれのレイヤーが対応しているかのような表現は正しくないといいたい。

OSI参照モデルL4トランスポート層とTCP/IPトランスポート層は厳密に等しくないから表のようにあてめることはできない。**仮にOSIで言えばどの層に相当すると思われる。** この言葉を抜いて説明すると、 TCP/IPモデルのトランスポート層の役割はセッション層の機能を一部持っている。

そもそも プロトコルができた後に TCP/IPはモデル化されたし OSIは実際には実装の観点から簡略化して実装されたりする 表現するなら、グラデーションを使っていないとおかしい。

これが私が表現する真の意味で正しいと思うTCP/IPモデルとOSI参照モデルの関係だ。

![Pasted image 20230905222454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802707/4b97fc12-f273-4516-3901-3b24c4a2d475.png)

まあ、もちろんこれが100％正確なモデルの関係というつもりはないが誤解がないように書いたらこうなるという話だ。実際レイヤーの境界線なんてわからないからTCP/IPではグラデーションでいいと思う。

また、OSI参照モデルは理論的・教科書的なものだから厳密な感じだと思いきっちり区切っている。
【Rails】find、find_by、whereの違い

## はじめに
細かい違いを説明出来なかったので知識定着の為にアウトプットします。
## RubyとRailsのバージョン
- Ruby 2.7.7
- Rails 6.0.6.1
## findとは
idを指定してレコードを取得するメソッドです。
id以外の条件では検索出来ません。
複数のidを指定すると複数のレコードを取得出来ます。
### 構文
```
model.find(id)
```
### 具体例
```index.rb
User.find(1) #Userモデルのid=1のレコードを取得

User.find(1,2) #Userモデルのid=1,2の2つのレコードを取得
```
## find_byとは
条件を指定して最初の１件を取得するメソッドです。
id以外の条件でも検索する事が出来ます。
条件が被るレコードが複数あっても最初の１件のみ取得します。

### 構文
```
model.find_by(条件)
```
### 具体例
```index.rb
User.find_by(name:tanaka) #Userモデルのnama=tanakaのレコードを取得

User.find_by(name:tanaka,sex:male) #Userモデルのnama=tanaka,sex=maleのレコードを取得

User.find_by(id: [1,2]) #Userモデルのid=1,2の2つのレコードを検索するがid=1のレコードのみを取得
```
## whereとは
条件に当てはまるレコードを全て取得するメソッドです。
find_byと同じく、id以外の条件でも検索する事が出来ます。
条件が被るレコードが複数あれば該当するレコードを全て取得します。
### 構文
```
model.where(条件)
```
### 具体例
```index.rb
User.where(name:tanaka) #Userモデルのnama=tanakaのレコードを取得

User.where(name:tanaka,sex:male) #Userモデルのnama=tanaka,sex=maleのレコードを取得

User.where(id: [1,2]) #Userモデルのid=1,2の2つのレコードを取得
```
## 最後に
いかがだったでしょうか。
Rails初学者の方に役に立てば嬉しいです。

## 参考文献
https://railsdoc.com/

https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3
【DB再起動】Oracle、PostgreSQL再起動手順メモ

# DB再起動方法について
仕事でOracleとPostgreSQLのデータベースを再起動する機会があったのでメモ。
コマンドに適宜sudo権限など付与する必要があります。
なお、実際に実務で使用しています。
## Oracle再起動手順
実行コマンドが多く、~~面倒くさかった~~安心感がありました。
#### DB事前準備
```
「Oracle」ユーザーでログイン
# su - oracle

プロセスの結果取得（Oracleのプロセスの状況を確認）
# ps -ef

リスナーの状態を取得
# lsnrctl status

DBにsysユーザーで接続。
# sqlplus /nolog
SQL > conn sys/<pass> as sysdba;
SQL > select * from v$instance;　--インスタンス名と状態を問い合わせるSQL文
```
※ もしも# sqlplus /nolog  でDBにsysユーザーで接続中に、うっかり何か変な文字を入力したら大変なことになりますw
　その場合は「ctrl + backespace」を押下するか、「Enter」を押下してリセットしましょう。
#### DB停止
```
リスナーを停止
# lsnrctl stop

DBにsysユーザーで接続。
# sqlplus /nolog
SQL > conn sys/<pass> as sysdba;
SQL > shutdown immediate;

SQL > exit
```
※ shutdown immediate;　はSQLをロールバックしてからシャットダウンするため、強制的にDBを止める。
※ SQL > shutdown;　はshutdown normal;　と同じだが、すべてのクエリが終わらないとシャットダウンされないので、immediateをつけたほうが良いことは多い。
#### DB開始
```
リスナーを開始
# lsnrctl stop

DBにsysユーザーで接続。
# sqlplus /nolog
SQL > conn sys/<pass> as sysdba;
SQL > startup;

SQL > exit

・ログインできるか確認
# sqlplus <id>/<pass>;
```
## PostgreSQL再起動手順
PostgreSQLはとても簡単。
``` 
pg_ctl restart;
```
## 参考リンク
- 『Oracleインスタンスのシャットダウン』
https://qiita.com/mako24/items/c59c8056239cbca5895a
- 『PostgreSQL サーバの起動と停止方法まとめ』
https://qiita.com/domodomodomo/items/12fe7555513de6b078db#%E3%80%87-postgres-%E3%82%84-pg_ctl-%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88

ご指摘ご質問ありましたらコメントでご連絡ください。
トランザクション(Django)の設定方法

# トランザクション(Django)の設定方法

RDBMSにはトランザクション機能があります。Djangoを通じてこれを設定できます。Djangoでは、デフォルトで各クエリー実行後にコミットされるようになっています。

https://docs.djangoproject.com/en/4.2/topics/db/transactions/

>Django’s default behavior is to run in autocommit mode. Each query is immediately committed to the database, unless a transaction is active. See below for details.


もっと大きな粒度で(リクエスト処理単位など)でトランザクションを設定したいのではないでしょうか?

説明のためにモデルを用意します。

```python
from django.db import models

class Disk(models.Model):
    name = models.CharField(max_length=30)

class Server(models.Model):
    name = models.CharField(max_length=30)
    disk = models.ForeignKey(Disk, on_delete=models.PROTECT)

```

`Disk`と`Server`を1対多の関係で定義しました。

あるAPIが`Server`の作成と共に`Disk`の作成も行うとします。下記のような実装になるかと思います。※rest-frameworkを使っています。

```python
class ~(APIView):
    def post(self, request, ~):
       ~
       disk = Disk.objects.create(name="disk0")
       server = Server.objects.create(name="server0", disk=disk)
       ~
   
```

上記コードの場合、デフォルトのトランザクション挙動は各レコード単位でDBに反映されることになります。

しかし、postリクエスト処理中に何か問題が起きたならば、すべてのレコード作成をなかったことにしたいはずです。例えば、`Disk`の作成成功後、`Server`の作成に失敗したならば、`Disk`の作成はなかったことにしたいはずです。このようなケースでは、Djangoのトランザクション設定を書き換える必要があります。

2つ方法を示します。

## リクエストを一つのトランザクションで囲む
`settings.py`の`DATABASES`の設定を書き換えます:

```
DATABASES = {
    "default": {
        ~
        "ATOMIC_REQUESTS": True,
        ~
    }
}
```

これにより、各リクエスト処理がトランザクションで囲まれます。ただしこれはグローバルな設定であることに注意してください。

## グローバルではなく、細かく設定したい

```python 
from django.db import transaction


@transaction.atomic
def view(request):
   ~
```

上記方法は個別に設定するため、他のviewには影響を与えません。

## 参考
https://docs.djangoproject.com/en/4.2/topics/db/transactions/#module-django.db.transaction
検索エンジン最適化とウェブサイト高速化：効果的なテクニック

![seo-search-engine-optimization-modish-ecommerce-online-retail-business.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552683/aadf7de9-8b09-d7c3-eae5-c9ca4d12177d.jpeg)

序論

ウェブサイトの成功には数多くの要素が関わりますが、その中でも「検索エンジン最適化（SEO）」とページの読み込み速度は極めて重要です。特に、モダンな「検索エンジン最適化」は、多様なデバイスで最良のパフォーマンスを提供することを要求されます。本記事では、SEOを高めながら、ウェブサイトを高速かつレスポンシブに保つための戦略について説明します。

画像圧縮とフォーマット変更
美しいビジュアルはウェブサイトにとって魅力的な要素ですが、読み込み時間に影響を与える場合があります。画像のフォーマットを適切に選び、圧縮技術を活用することで、ページ速度を改善できます。

キャッシュ設定の適用
二度目以降の訪問者に対しても快適な閲覧環境を提供するために、静的リソースに対してキャッシュ設定を行います。これは特に、検索エンジン最適化において多くの要素を取り入れる場合に重要です。

遅延ローディングの採用
遅延ローディング（Lazy Loading）は、非表示のコンテンツ（特に画像や動画）の読み込みを遅らせる手法です。これによって、最初のページ表示速度を高め、ユーザーエクスペリエンスを向上させることが可能です。

CSSとJavaScriptのクリーニング
過剰なコードはページ速度に悪影響を与える可能性があります。必要なスクリプトとスタイルシートだけを残し、それ以外は削除することで、読み込み速度を高速化できます。

サーバー速度の最適化
高度な検索エンジン最適化を活かすためには、サーバーの性能が不可欠です。CDN（コンテンツデリバリーネットワーク）を利用したり、高品質なホスティングサービスを選ぶことで、サーバーのレスポンスタイムを改善できます。

モバイル優先設計
多くのユーザーがモバイルデバイスを使用している現代において、モバイル優先の設計方針はSEOにも寄与します。スマートフォンでの読み込み速度と表示性能を最優先にし、それをベースにデスクトップ版を設計する方法です。

まとめ
検索エンジン最適化とウェブサイトの高速化は、相互に影響を与える要素です。画像の適切な管理、キャッシュの設定、遅延ローディングの活用など、多面的なアプローチでこれらの要素を最適化することが、成功するウェブサイトには欠かせません。本記事で紹介したテクニックを用いて、より効果的なウェブサイト運営を目指しましょう。
【メモ】タグが付与されていないAWSのリソースを特定したい

コストをAWSのサービス別に分析できるようにしたい。
そのために、個々のリソースにタグを付与したい。
そのため、タグが付与されていない個々のリソースを特定するためのコマンドをメモ。

## Amazon S3
```sh:s3.sh
#!/bin/bash

aws s3api list-buckets --query "Buckets[?Tags==null]"
```

## ECS Cluster
```sh
#!/bin/bash

# ECSクラスターのARN一覧を取得
CLUSTERS=$(aws ecs list-clusters --query 'clusterArns[*]' --output text)

# 各クラスターに対して
for CLUSTER in $CLUSTERS; do
  # タグ情報を取得
  TAGS=$(aws ecs list-tags-for-resource --resource-arn $CLUSTER --query 'tags[*]' --output text)
  # タグが設定されていない場合
  if [ -z "$TAGS" ]; then
    # クラスター名を表示
    echo $CLUSTER | awk -F/ '{print $NF}'
  fi
done
```
アクセス制御手順（データリンク層）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/d5f32d98-4ec4-fca5-c747-a3574f3f8613.png)
　アクセス制御手順は、フレームを通信回線上に送出するタイミングを管理する手順です。イーサネット（有線LAN）ではCSMA/CD,無線LANではCSMA/CAを利用しています。CSMAは、回線が空いていれば、いつでも自由にフレームを送信できるという方式です。CDは衝突を検知して再送する方式、CAは衝突を起こさないように制御する方式を表しています。
【AWS】CodeDeployでエラー「The ELB could not be updated due to the following error...」が出た場合

# 概要
AWS CloudFormationで構築したAWS環境にて、Blue/Green DeploymentのCodeDeployを走らせたら以下のエラーに遭遇しました。

```
The ELB could not be updated due to the following error: Primary taskset target group is not behind any rule for listener arn:aws:elasticloadbalancing:ap-northeast-1:0123456789:listener/app/XXX/XXXX/XXXXXX.
```

こちらのエラーの原因と解決方法を記載します。

# 結論
デプロイメントグループの設定に問題がありました。
ELBのリスナー設定では`443`と`8080`だったのに対して、デプロイメントグループでは、`80`と`8080`にしていました（凡ミス）。。。これをELBの設定と同じにしたらエラーがなくなりました。

つまり、ポート番号の不一致が発生して正しくリクエストがルーティングされなかった、ということです。ポート番号とプロトコルの設定は、ELBのリスナーとデプロイメントグループの設定で一致している必要があります。

## 他に考えられる原因
このエラーの他に考えられる原因としては、以下を確認するといいでしょう。

- ターゲットグループが正しくELBのリスナーに関連付けられているか？
- ELBのリスナー設定で、リスナーが適切なポートとプロトコルで設定されているか？
- ターゲットグループが正しいポートとプロトコルを使用しているか？
symfony/cliでEC-CUBE4系の開発環境構築をしてみた

## はじめに
今回はEC-CUBEの開発環境を構築した時のメモとなります。

こちらの記事を参考としました。
■ 【2020年度版】EC-CUBE の開発環境の作り方
https://qiita.com/nanasess/items/de9f5450717cc8ede51a

## 環境
■ MacOS
13.5.1
■ チップ
Apple M2

## 前提条件
・Homebrewがインストールされていること
・EC-CUBE4.2.2がローカルにCloneされていること

■ Homebrew
https://brew.sh

■ EC-CUBE４系リポジトリ
https://github.com/EC-CUBE/ec-cube

## 1.phpをインストール
※既にphpが入ってい場合は対応不要です！

brewを用いて、phpをインストールします。
phpバージョンを指定することもできます。
``brew search php``を利用して、インストールできるphpバージョンを検索してみましょう！
私は、8.0をインストールしました！

```terminal:Terminal
$ arch -arm64 brew install php@8.0
```

php8.0のインストールパスを確認します。

```terminal:Terminal
$ brew --prefix php@8.0
# 出力
/opt/homebrew/opt/php@8.0
```

上で確認したパス（php8.0のパス）を設定します。

```terminal:Terminal
$ echo 'export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```

インストールされたバージョンをみると、8.0になっていることを確認しました。

```terminal:Terminal
$ php -v
# 出力
PHP 8.0.30 (cli) (built: Aug  5 2023 06:13:26) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies
```

## 2.Composerをインストール
※既にcomposerが入ってい場合は対応不要です！

brewを用いて、composerをインストールします。
```terminal:Terminal
$ brew install composer
```

インストールされたことを確認します。
```terminal:Terminal
$ composer -V
# 出力
Composer version 2.6.1 2023-09-01 13:53:08
```

## 3.symfony-cliをインストール
brewを用いて、symfony-cliをインストールします。

```terminal:Terminal
$ brew install symfony-cli/tap/symfony-cli
```

symfonyのインストールを確認します。
```terminal:Terminal
$ symfony -V
#出力
Symfony CLI version 5.5.8 (c) 2021-2023 Fabien Potencier #StandWithUkraine Support Ukraine (2023-08-03T11:39:47Z - stable)

```

ec-cubeのディレクトリに移動し、EC-CUBE4.2.2をインストールします。
```terminal:Terminal
$ symfony composer install
$ symfony console eccube:install -n
```

Symfony開発サーバーを起動します。
```terminal:Terminal
$ symfony server:start
```

``http://127.0.0.1:8000``で開発サーバーを起動し、ローカルで実行およびテストすることができます。

サーバーを終了したい場合は、``control + c``で終了させます。

## 最後に
今回は、symfony/cliを利用したのですが、EC-CUBEの開発環境構築については別の方法もあるので、
機会があれば、そちらについてもメモを残していきたいと思います！
iOSDC 2023いってきた

### いった
https://iosdc.jp/2023/

過去のインターン、meet upで会った仲間との思いがけない再会もあった

エンジニアの世界ぜんぜん知らん後輩連れてって、後ろでちょこんと2人でみてた

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/7df3b27d-86a5-c1ba-3430-fa7f25ddcc57.jpeg">



### この記事見る人へ

自分用殴り書きなのであんま面白くないかもです

ためになることを1つ言うとすれば __「iOSDCは事前にがっつり発表資料読んで、手元でビルドとかしてからやった方が楽しい」__ ですねそんだけです


# 印象に残ってる発表

### 海外登壇のやつ

一番印象に残ってる。

海外登壇めちゃめちゃ触発された。たぶんおれはこれになりたい

あとミドルネームがかっこいい。これの2日後くらいにミドルネーム決めて市役所行きました

https://fortee.jp/iosdc-japan-2023/proposal/8f0ab273-6457-4d82-a805-7ac7d8742a09



### 唯一知ってた登壇者さん

ログつらそう

https://fortee.jp/iosdc-japan-2023/proposal/0ea36011-b566-478a-b067-d9785c957fe5

### ガチャのアニメーション実装

「画像生成AI」＋「swift tutorialの4つのやり方」
でだいぶ表現の幅広がった。

https://fortee.jp/iosdc-japan-2023/proposal/12d52625-af7a-41f7-b2ff-404c62bb33f0

### パフォーマンス比較

勢いがおもろい

filterとかisContainのJtDしてreturnしてるかどうか、みたいな。使い分けはだいぶ参考になる

https://fortee.jp/iosdc-japan-2023/proposal/4b6f4748-7232-474a-800d-fbb09dbeba78

### 非接触mac操作

お菓子食べてる時とかいいじゃん

https://fortee.jp/iosdc-japan-2023/proposal/5e79909d-3456-40cb-aba9-10a918f88270

### 親子アプリ

かわいい

https://fortee.jp/iosdc-japan-2023/proposal/23ba29b1-7efd-42cd-b6e9-da30f1f054ad


### いちばん聞きたかったけど寝坊したやつ

あとでアーカイブ見る

ちょうどSONYのインターンで使おうとしてたのに、、


https://fortee.jp/iosdc-japan-2023/proposal/b630fa79-2c28-41ec-a6b2-6954b62f1858

### WWDC Labこわくないよ

いっぱい準備していっぱい話して英語脳にする。
英語は結局努力量

https://fortee.jp/iosdc-japan-2023/proposal/047bb745-f782-4da1-8454-ec26be536bfa


# 来年に向けて
- 面白かったけど行動変わらないとあんま意味がない
- 留学の話使ってLT会に登壇したい。
- たぶん事前にがっつりタイムテーブル見て、手元でビルドとかしてからやった方が楽しい
表示されない不思議な画像

以下の画像がブラウザ（Chrome）で表示されない。

![murcat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/149d2a4c-006c-b7e6-3fa5-8bd58d651a16.png)

しかし、画像をダウンロードしてMicrosoft フォトなどで開くと画像が見れる。

![スクリーンショット 2023-09-05 223853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/728ca179-a160-29c1-dd3d-3df75e127cb2.png)

不思議だ。

## 追記

と思ったが、普通に透明な背景に白色で画像が描かれているだけか。
なんかのインスパイアになれば幸いです。
【VSCode】ターミナルからVSCodeを起動する

# はじめに
普段Xcodeで開発しているのですが、コンフリクトを治すときなどはVSCodeのほうが便利だったりします。
そんな時に簡単にターミナルからVSCodeを起動できたらいいのにと思ったらありました
記事にしておきます

# やりかた
VScodeを開きます

`command` + `shift` + `P`
![スクリーンショット 2023-09-04 23.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1996a6cb-34f1-26a5-8b3a-6e8b1befa92f.png)


以下の文章を入力します
```
shell Command: Install 'code' command inPath
```
![スクリーンショット 2023-09-04 23.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/01759c19-d886-3c0a-0452-43cd1af2884e.png)

「シェル コマンド: PATH内に'code'コマンドをインストールします」を選択します

「OK」を押します。

![スクリーンショット 2023-09-04 23.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/92b7c732-5b32-48d3-d529-1d1e208ad52f.png)

許可します
![スクリーンショット 2023-09-05 0.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c9837f3d-6551-d846-8800-0a03eb2e10aa.png)

成功
![スクリーンショット 2023-09-05 0.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3f9398e9-e002-56dd-89f5-38a1ad7a14e1.png)


# 使ってみる
ディレクトリを移動して、`code .`
![スクリーンショット 2023-09-05 0.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/47b091cb-80da-012e-6463-1ed53cc6c559.png)

開いた
![スクリーンショット 2023-09-05 0.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f3977bcb-dddb-0477-8587-f3b0dbdf9b81.png)

# おわり
今までアプリのアイコンを押して起動してたのでめっちゃ便利になりました
独自ドメインをCloudIdentityへ登録し、GCPの組織と紐づけてみた

# 目的
GCPの検証用に個人的に組織を作成したく、CloudIdentityへ登録し、Google workspaceを作成する


# やること
- ドメインの取得（[お名前ドットコム](https://www.onamae.com/)）
- ネームサーバの設定（awsのroute53サービスを利用）
- Cloud Identityの登録
　ドメインの保護 （txtレコードの登録）
- google workspace作成


# 手順


### ドメインの取得

なるべくお金をかけたくないため、一年は0円のドメインを取得した。XXXXX.xyz
こういうのたまに契約解除忘れて更新料支払っていることがあるけど、なにか対策あるものかな。。

### ネームサーバの設定

AWSのDNSサービスであるRoute53を利用
1. ホストゾーンの作成を実施

![route53_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/bd839604-4ce9-eb19-ec46-d98bef51d8e4.png)

2. 作成したホストゾーンからNSレコードを確認する。
![route53_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/8f031ba4-c3bb-9aa2-0d88-c1e89e59141c.png)

3.NSサーバのホスト名をコピーし、ドメインを取得したプロバイダーでネームサーバの設定変更を実施。

![route53_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/c27d1645-cb01-13b5-410f-333f61c2d0c2.png)


### Cloud Identityの登録

1. [GCPコンソール](https://console.cloud.google.com/cloud-setup/organization?hl=ja)で「IAMと管理」→「IDと組織」→チェックリストに移動を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/4bdc8393-edfe-803b-5729-ff92b0b7d120.png)
2. CloudIdentityに申し込むを選択し、従業員数やユーザネーム、連絡先など回答すると、ドメイン所有権の証明を実施する旨のページが表示される。そこで照明に必要なTXTレコードが与えられるので、その値をコピーし、Route53で作成したホストゾーンでコピーした値をペーストしたtxtレコードを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/7bcd267f-cc51-7128-fc98-b508930c8978.png)
![route53_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/8c9e9a4a-43fd-b0b5-b886-228c213fc521.png)
3. 10分くらい待つとドメインの保護が完了する

4. CloudIdentityへの登録を実施
　　IDと組織のメニューで組織なしで表示されているプルダウンバーをクリックし、組織として登録したいドメインを選択すると登録が完了する。
![route53_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550845/1c4c72ed-ff19-137c-f7f2-c952f617d1dd.png)


- GoogleWorkspaceも作成されており、管理コンソールは[こちら](https://admin.google.com/)からログインできます
- 組織のプロジェクト作成後、サービスアカウントを作成できるようになります