OmniAICreator/Qiita-1.07M huggingface dataset:
Intel系インスタンスからAMD系インスタンスに切り替えてみた話

# はじめに
現在私はピーク時で15,000RPS程度あるAPIサーバーを運用しています。
ただ、負荷が増えるにつれサーバーコストも増大してしまい、社内で問題になっていました。
そこで、GCPの東京リージョンや大阪リージョンでコスパが良いAMD系インスタンスが最近使えるようになったので切り替えてみました。

# コストの比較
まず、N2インスタンス(n2-standard-48)で1ヶ月使うと$1,834.05かかります。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133366/b3134a23-22fb-8f64-8497-34780ef68757.png">

次に、N2Dインスタンス(n2d-standard-48)で1ヶ月使うと$1,606.85かかります。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133366/96a17d90-70ce-a125-2b57-ceadf8ae6b30.png">

AMD系インスタンスに変えるだけで約12%コストダウンになります。これだけでも使う価値はありそうです。

# 性能の比較
ソースコードを全く変えない状態で、ピーク時に使用されているコア数がどれだけ変わったか比較してみました。
まず、N2インスタンスを利用した場合、ピーク時に267coreを利用していました。
![スクリーンショット 2023-03-08 10.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133366/952e8f77-9a02-2f9c-392c-d29bca68fff5.png)

次に、N2Dインスタンスを利用した場合、ピーク時に242coreを利用していました。
![スクリーンショット 2023-03-08 10.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133366/b7f3fd2d-4be5-1f6e-4dc9-39fce3963e47.png)

AMD系インスタンスに変えるだけで使用core数が約10%削減されました。

# まとめ
AMD系インスタンスに乗り換えるだけでコストや使用コア数が10%程度改善されます。
これだけでもAMD系インスタンスに切り替える価値はありそうです。(AMDの回し者ではありません。)
Firebase Hosting への Next.js デプロイでHTTP409エラー


# 現象

既存の Next.js アプリを Firebase Hosting に `firebase deploy` でデプロイしようとしたところ、下記の順で失敗しました。

1. 初回のデプロイでタイムアウト
1. もう一度デプロイしたところエラー（HTTP 409）となり失敗した

```
HTTP Error: 409, Could not create Cloud Run service ssr[PROJECT]. A Cloud Run service with this name already exists. 
Please redeploy the function with a different name.
```

訳：「`ssr[PROJECT]`という Cloud Run サービスを作成できませんでした。同名の Cloud Run サービスがすでに存在します。名前を変えて再度デプロイしてください。」

# 解決

## 1. Firebase Function を確認

Firebase コンソールで function を確認してみたところ、デプロイが完了したような表示でした。
↓
（ここで力尽きて一晩置く）
↓
翌朝見てみると関数が消えて空の状態に。

## 2. Cloud Console で Cloud Run を確認

メッセージに Cloud Run とあるので、素直に Cloud Run を確認します。
Cloud Run は firebase ではなく GCP のコンソールから確認します。
https://console.cloud.google.com/

左上の「≡」ボタンから Cloud Run を選択すると、登録済みの関数が一覧されます。
この中に、上記エラーメッセージと同名の関数があるので、**これを削除**しました。
この状態で再度`firebase deploy`を行うと、今度はデプロイに成功しました。

# 環境

* Windows 10 Pro
* node v18.14.2
* firebase CLI v11.24.0
* firebase (package.json) "^9.17.2"
Vantage Modules for Jupyterのナビゲーションと基本的な操作

# 初めに
Jupyterはオープンソースのアプリケーションで ドキュメントやクエリなどの命令を含むセルを持つノートブックの作成をサポートしています。Jupyter はもともと Python用に作られたものですが オープンなフレームワークであり これにTeradataのモジュールを追加してクエリの実行を可能にしています。

Jupyterノートブックは 次のステップで何が起こるかを説明するテキストと コードのブロックで構成されています。Shift + Enter "でブロックからブロックへ移動し、コードを実行しながら進めていきます。

# Jupyterノートブックのメニュー構成
左側は ツールメニュータブで エクスプローラーやVantageの接続設定などを開く事ができます。
右側は タブ形式で複数のノートブックを開く事が可能です。 

Jupyterノートブックを開くと、ランチャーノートブックが開いています。
こちらのイメージは ランチャーノートブックからPyhtonノートブックや Teradata SQLノートブックを開く事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/e123cbc5-9da6-b0ce-005c-5b0563bde34f.png)

# データベース接続ツール
ツールメニュータブでTeradataアイコンをクリックしてみましょう。
登録済みの接続一覧が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/89ce8f19-d268-a3b4-a9f2-6a5004beae45.png)

# データベース接続設定
接続一覧から接続名の編集アイコンをクリックすると データベース接続情報を編集可能です。
接続名、データベースホスト名(またはIP)、ログインユーザ名などを入力しSaveします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/598b5b1e-0b57-ecca-a0c7-a91b5ae4384e.png)

# SQLカーネルの起動
VantageのSQLノートブックを利用する準備が整いました。
ランチャーアイコンのTeradata SQLをクリックしてTeradata SQLノートブックを開きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/5e4e3d0e-f4f1-c852-5160-c4afbd969f1a.png)

# Vantage SQLノートブックが開きました。
右上に「Teradata SQL」と表示されていたらノートブックがSQLカーネルで動いている事が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/f79edb34-2ed9-e863-fbca-717fda959a69.png)


# Teradata SQLノートブックの使い方

## ヘルプコマンド
%help と入力するとコマンドの使用方法が表示されます。
通常よく使うのは「%connect」と「%disconnect」と「%chart」くらいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/79e39ac6-c1d2-d65d-e1aa-929f4da61d31.png)

## データベース接続
%connect <接続名>で データベースの接続を行います。
Passwordを要求されるので入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/ddd804ae-9208-7b0c-50d7-062543add0c8.png)

## SQLの実行
接続が完了すると SQLを入力する事で結果が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/8c2f9db6-e07e-0c79-4397-77ddc6c0fd8b.png)

## データベース切断
%disconnect <接続名>で データベースから切断します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778293/4fc0b205-b38b-03e6-b9bf-6a53f34b7865.png)

# おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::
## Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
📖「良いコード／悪いコードで学ぶ設計入門」（第４章 不変の活用）を読んだ感想

## 前回の話
https://qiita.com/tomonac/items/0a135c2875eccd31e5a2


## 感想　（第4章 不変の活用）

![image.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3144766/c91087c2-f2e9-3748-6872-0914a635f47d.png)


**[ 学んだこと ]**

- 可変、不変を用途に合わせて使い分けることが必要
  - 意図しない挙動にならないように、不変になるように Java で言えば final 修飾子にする
  - 変動してしまった時のように正常値しか処理が通らないようにバリデーションを実装する
  - インスタンス変数の使い回しには、使い回した処理にも影響がある為注意する
- 基本、不変であるべき（変数の意味が変化しなくなるので、混乱しない。処理の結果が予測しやすくなる）
  - 可変にする場合は、スコープが局所的である処理の場合、ローカル変数などである

## 次回

https://qiita.com/tomonac/items/22be5f4c2cdedbfe7d3f
GlueジョブがS3バケットをread/writeするときのポリシー

# Glueジョブのアクセス制御について

Glueジョブは定義時にIAMロールを指定するのでジョブ実行時はIAMロールのポリシーに従ってアクセス制御が行われます。
IAMではAWS管理の**AWSGlueServiceRole**というポリシーがあります。このポリシーはGlueジョブ実行に必要となる一連のアクションを許可しているため、基本的にはこのポリシーをGlueジョブで使用するIAMロールにアタッチすることが多いかと思います。
ただし、Glueジョブでよく行われる処理であるS3バケットのデータを読み込み、加工を行ってS3バケットに書き込みを行うというケースを考えた場合に**AWSGlueServiceRole**ポリシーだけでは不十分で、入出力データがあるS3バケットに対する権限が別途必要になってきます。
図示すると以下のような構成の時にGlueジョブのIAMロールに追加するポリシーを整理してみました。

![スクリーンショット 2023-03-08 9.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/fa2f313b-68a7-1162-bd13-9f654ecc5bc1.png)

# S3バケットにアクセスするときのポリシー

GlueジョブはApache Sparkが内部的には動作しており、S3へのアクセスは[S3A](https://cwiki.apache.org/confluence/display/HADOOP2/AmazonS3)が使用されます。
Apache Hadoopの[ドキュメント](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/assumed_roles.html#Restricting_S3A_operations_through_AWS_Policies)にS3AでRead/Writeするときに必要なアクションが記載されているので、これらのアクションを許可すれば良いことがわかります。
以下にGlueジョブのIAMロールに追加するポリシー例を記載します。

```
{    
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:Get*",
                "s3:Delete*",
                "s3:Put*",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::input-000011112222-bucket",
                "arn:aws:s3:::input-000011112222-bucket/*",
                "arn:aws:s3:::output-000011112222-bucket",
                "arn:aws:s3:::output-000011112222-bucket/*",
                "arn:aws:s3:::aws-glue-assets-000011112222-us-west-2",
                "arn:aws:s3:::aws-glue-assets-000011112222-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}

```
ポリシー内容の補足をすると
- Apache Hadoopのドキュメントに記載のread/writeアクションをそのまま記載
- S3がKMS暗号化を行なっている場合はKMSのアクションも別途必要になってくると思います
- Resourceに関しては入出力対象のバケットとGlueのアセットを管理するバケットを記載
- Lake Formationを使用している環境に合わせてLake Formationのアクションを記載

お使いの環境に合わせて上記ポリシーを変更して利用いただけると良いかと思います。
プログラミングの勉強

# あいさつ
久しぶりの投稿になってしまいました。
勉強自体は、結構前から始めています。
# 勉強の内容
PHP:techpitでPHPとSQLを使ったアプリの作り方（ブログ）を勉強
JavaScript:ドットインストールで基礎から複雑な文法まで勉強
ホームページ（http://moneylands-baystars.jp）にも記載。

オリジナルアプリ作成は止まっています。

以上になります。
ChatGPTで聞いたメモ

## 質問
```
php artisan make:model -mrc　の意味を教えてください
```


## 回答

`php artisan make:model`は**Laravelで新しいモデルを作成するためのコマンド**です。
オプションを付けることで、一度にモデルに関連する他のファイルを作成することもできます。

**-m オプション**は、モデルとともに**マイグレーションファイルを生成**するために使用されます。マイグレーションファイルは、データベーステーブルのスキーマを定義するために使用されます。

**-r オプション**は、**リソースコントローラーを生成**するために使用されます。リソースコントローラーは、CRUD操作を実行するためのコントローラーです。

**-c オプション**は、生成されるコントローラーの**名前を指定**します。つまり、-cオプションを使用すると、指定した名前のコントローラーが生成されます。

例えば、以下のコマンドは、Postモデルとともに、postsテーブル用のマイグレーションファイル、PostsControllerリソースコントローラー、Postモデルのファイルを生成します。

```
php artisan make:model Post -mrc
```
このコマンドにより、以下のファイルが作成されます。

```
app/Models/Post.php (Postモデルのファイル)
database/migrations/{timestamp}_create_posts_table.php (マイグレーションファイル)
app/Http/Controllers/PostsController.php (リソースコントローラー)
```


## まとめ

情報は古い？けど、調べるより楽。
2021年以降の内容に関しては、Googleもしくは、Bingのチャットを試してみるか・・・
Lambda と Hugging Face のコラボイベントが開催中のようです！

Lambda と Hugging Face のコラボイベントが開催中のようです。
Stable Diffusion や DreamBooth に興味がある方は参加してみると良いかも。

イベントに参加すると、A10 24GB GPU への無料アクセスが提供されるようです！
詳しくは、[Keras Dreambooth event! 🤗](https://github.com/huggingface/community-events/blob/main/keras-dreambooth-sprint/README.md) をご参照ください。

このクレジットは、クラウドダッシュボードには表示されないそうですが、次の請求サイクルで表示されるとのこと。20USDを超えないように使う必要がある点に注意してください。

請求時に20USDが減額されていることを確認しました！
```
MAR 8, 2023
Cloud Credits
Qty 1
-$20.00	
```

また、よろしければ、以下も参考にしてください。
- [Lambda Cloud (GPU Cloud) の使い方](https://qiita.com/ganessa/items/1b477675c43bd29e3917)
- [Lambda Cloud (GPU Cloud) API の使い方](https://qiita.com/ganessa/items/c792edfd9ce6de04a88a)
DBに登録されている値をプルダウン方式で表示する方法

こちらの実装に少し時間をかけてしまったため、備忘とアウトプットして記録します。

初心者のため、他にも方法があるかと思いますので、相違箇所があればご指摘下さい。


今回下記に記述する内容は、
userモデルの(faciliti_user)あるカラムに登録されている値をビューでプルダウンで表示し、noteモデルへ登録する方法となります。
（DBにに登録されている値をプルダウン方式で表示し別モデルに値を登録する。）

■前提　
　・note,userモデルはアソシエーション済みとする。
　・登録する型は値ではなく、string型の文字列とする。




# コントロール設定
Userモデルのfacility_userカラムの値を取得し、インスタンス変数＠userへ代入する。
```ruby:NotesController
class NotesController < ApplicationController


  def new
    @note = Note.new
    @user = User.select(:facility_user)
  end

end
```

# view
プルダウン方式でのコード

始めは下記の様な記述をしてしまい、idの値が保存されてしまっていました。原因としては、userレコードのid属性を選択した値としまっていたことでした。
```ruby:new.erb
<%= f.collection_select(:facility_user, User.all, :id, :facility_user, {}, {class:"select-box", id:"item-shipping-fee-status"}) %> 

```

上記をこちらに修正。

```ruby:new.erb
<%= f.collection_select(:facility_user, User.all, :facility_user, :name, {}, {class: "select-box", id: "item-shipping-fee-status"}) %>
```

id_1以外を表示したい場合は、User.where.not(id: 1)とし、１を以外を指定する。
```ruby:new.erb
<%= f.collection_select(:facility_user, User.where.not(id: 1), :facility_user, :name, {}, {class: "select-box", id: "item-shipping-fee-status"}) %>

```
[解説]
まず、f.collection_selectメソッドとは、モデルの関連するオブジェクトから選択ボックスを生成するメソッドです。
例えば、投稿に紐づくユーザーからコメントの投稿者を選択できるようにすることができます。
今回についても、登録されたカラムの値を別のモデルに紐付けするために使用しました。

・facility_userはカラム名で、選択された値が送信されるパラメーターの名前を表します。（別途create時に、ストロングパラメーターの記述を忘れずに）

・:facility_userと:nameは、それぞれ選択ボックスの値と表示するテキストを指定します。
User レコードの facility_user 属性を選択された値とし、User レコードの name 属性を選択肢のテキストとして使用します。

・{}は、デフォルトの選択肢を指定するためのオプションのハッシュです。

・最後の引数{class: "select-box", id: "item-shipping-fee-status"}は、HTMLの属性として、選択ボックスにCSSクラスとIDを追加することで、CSSやJSへの反映が可能です。



以上
まだ全てを理解できたわけではないですが、色々調べて何とか自力で乗り越えられました。使用しながら理解を深めていきたいと思います。
Javaを基本からまとめてみた【static・カプセル化】

## static
- 全部のインスタンスから共通して使う変数やメソッドを作りたいとき
- クラスの関連する便利なメソッドをまとめたいとき


```
class Student{
 int counter = 0;
 Student(){
  counter++;
 }
}

stu1[] => couter 0 → 1
stu1[] => couter 0 → 1
```
インスタンス内の変数では無理！
全インスタンスが共通して使える変数が必要！

## Static変数　Staticメソッド

- 全インスタンス変数が使えるメンバ変数やメソッドを定義するには、staticを指定する
- オブジェクトを生成しなくても利用できる<br/>⇨ クラス名.変数[メソッド]名と記述する

```Sample.java
class Student {
 static int counter = 0;
   counter++;
static void display(){
System.out.println(counter + "人です")；
 }
}
```

```design(設計クラス).java
class Student4{
  String name:
  int counter = 0;

  Student4(String n){
   name = n;
   counter++;
   System.out.println(name + "さんをインスタンス化しました")；
}
 void display(){
 System.out.println(counter + "人です")；
 }
}

//上記のコードに　static を使う　※インスタンス化しなくても呼び出せる

class Student4{
  String name:
  static int counter = 0;

  Student4(String n){
   name = n;
   counter++;
   System.out.println(name + "さんをインスタンス化しました")；
}
 static void display(){
 System.out.println(counter + "人です")；
 }
}
```

```execution(実行用).java
class StuSample {
	public static void main(String[] args) {
		Student4 stu1 = new Student4("Michael");
        stu1.display ();

        Student4 stu2 = new Student4("Kenny");
        stu2.display ();
	}
}

//上記のコードに　static を使う　※インスタンス化しなくても呼び出せる

class StuSample {
	public static void main(String[] args) {
		Student4 stu1 = new Student4("Michael");
        Student4.display ();

        Student4 stu2 = new Student4("Kenny");
        Student4.display ();
	}
}

```
## カプセル化

- アクセス修飾子でクラス・メンバ変数・メソッドの公開範囲を指定できる

|  修飾子 | 同クラス | 同パッケージ | サブクラス | 他 |
| :---:  | :---:  | :---:  | :---:  | :---:  | 
| public |  ○  |  ○  |  ○  | 　○　 |
|  protected  |   ○  |   ○  |  ○  |   |
|  なし  |  ○  |   ○  |    |   |
|  private  |   ○  |    |  |   |

```Sample.java
class Student {
  private int score;
  public void setScore(int s){
  score = s;
 }
}

　　　⬇︎

⭕️ stu.setScore(80);
❌ stu.setScore = 80;

```

- メンバ変数は隠蔽（private）して、クラスとメソッドは公開（public）する設計
をカプセル化と呼ぶ 　⇨　代入処理　修正範囲 

```design(設計クラス).java
public class Student5{
  private String name:
  int counter;

//コンストラクタ
 public Student(String n){
   name = n;

 public void setScore(int $){
 if(0 <= $ && $ <= 100) {
   score = $;
}else{
   System.out.println(name + "さんの点数が範囲外です")；
score = 0;
}
 void display(){
 System.out.println(name + "さん"　+ score + "点")；
 }
}
```
```execution(実行用).java
class StuSample5 {
	public static void main(String[] args) {
		Student5 stu1 = new Student4("Michael");
        stu1.setScore (80);
        stu1.display ();

        Student5 stu2 = new Student4("Kenny");
        stu2.setSocre (-50);
        stu2.display ();

	}
}
```

## 参考サイト
[static変数、staticメソッドの使いどころやメモリ内の動き【Java入門講座】3-7 static](https://www.youtube.com/watch?v=P9CVQ6IuquM)
[アクセス修飾子の使い方とカプセル化のメリット【Java入門講座】3-8 カプセル化](https://www.youtube.com/watch?v=AAHWf_yqEyY)
【Python】PythonでCSVファイルを操作する（合計値を取得）

1.初めに
---
こんにちは。YoutubeやTwitchで配信しておりますアニメ、漫画、ゲーム、Vtuber大好きオタクのVtuber
久遠楽 (https://twitter.com/kuonraku0210) です。
前回視聴者上位のデータをcsv出力しました。
ただ、このままでは視聴者数の合計値を取得するのにかなり手間になるので自動で合計値を出すようにしたいと思います。

前回
[【Python】TwitchAPIを使用して任意ゲームの視聴者数が多い上位5人のデータをCSV出力する](https://qiita.com/kuonraku0210/items/60b9adcb1b13b2e61522)

2.実装
---
`前提条件`
今回は視聴者数の合計値を出します。そのため読み込むCSVファイルの中身は下記の通りです。
```:testData.csv
1000
2000
3000
4000
```
それでは実際に作成していきたいと思います。
***コード***
```python:countSum.py
# CSVファイルからデータの合計値を取得する
import csv
sum = 0
#合計値が欲しいCSVファイルを入力
f = open('testData.csv', 'r')
dataReader = csv.reader(f)
for row in dataReader:
    sum +=int(row[0]) 
print('合計値は', sum, 'です。')
f.close()
```
***結果***
```:countSum.py
合計値は10000です。
```
3.最後に
---
今回はCSVファイルへのアクセスを行いました。結構簡単にできてライブラリーって偉大だと思いました。
ファイルでの管理でもいいのですがWebアプリケーションとして作成することでこちらの手間を少なくできないかを考えています。
また次回の記事を楽しみにしてください。

【宣伝】
APEXやヴァロラントなどのFPSをメインに毎日20時頃から配信をしているのでよければチャンネル登録していただければ嬉しいです。
AzureADのロールとRBACのロールの違い

# AzureADのロールとRBACのロールの違い
AZ-104の勉強をしていてAzureADのロールとRBACのロールって何が違うの？とわからなくなってしまった。
## AzureADのロール
AzureADで実行する作業における権限を指定できるロール。
グローバル管理者（AzureADに関わるすべての権限）、ユーザー管理者（ユーザーとグループに関わる権限）、パスワード管理者（全ユーザーのパスワード変更やリセットの権限）などがある。
ポータル上では「ロールと管理者」メニューからロールにユーザーを紐づけるか、「割り当てられたロール」メニューからユーザーにロールを紐づけることができる。
※どちらでも行われる操作の結果は変わらない。
AzureADテナントを作成したユーザーはデフォルトでグローバル管理者のロールが割り当てられる。

## RBACのロール
Azureのリソースやデータに対して作業を行う際の権限を指定できるロール。
所有者（該当リソースやグループのフルコントロール）、共同作成者（アクセス権付与以外のすべての権限）、閲覧者（読み取り専用）などがある。
ポータルでは「ロールの割り当て」メニューからユーザーへのロール割り当てができる。
また、サービスプリンシパル（特定のアプリケーションが別のリソースにアクセスするときなど）に対してロールを割り当てることも可能。
複数ロールが割り当てられている場合は各権限の和集合が最終的なロールとなる。
既存のロールでは求める権限が与えられない場合、JSONで権限情報を記述することでカスタムロールを使用可能
※カスタムロール使用にエディションの制限なし。

## 何が違うの？
いくつか異なる点があるが主に使用用途が異なる。
AzureADのロールはユーザー管理やグループ管理のためのロール割り当てが主な目的だが、RBACのロールはAzureのリソースの使用や作成・閲覧に関する権限を指定する。
|  |RBACのロール|AzureADのロール|
|-----|-----|-----|
|目的|リソースの管理|ユーザーやグループなどAzureADのリソース管理|
|スコープ|管理グループ、サブスクリプション、リソースグループ、リソース、サービスプリンシパル|テナント、管理単位、オブジェクト|
|カスタムロール|エディションの制限なし|AzureADPremiumのみ|
Railsで「uninitialized constant 〇〇 (NameError)」が出たときの対処法

Railsでモデルを作成後、テスト用のデータを入れようとしたところ
```
uninitialized constant 〇〇 (NameError)
```
というエラーが発生しました。

### 結論
:::note info
モデル名にスペルミスなどがなく原因が見当たらない場合は
```
reload!
```
を試す。
:::

### 状況
以下のコマンドでモデルを作成しました。
```
$ rails g model Job catch_copy:string work_location:string
      invoke  active_record
      create    db/migrate/20230307234229_create_jobs.rb
      create    app/models/job.rb
      invoke    test_unit
      create      test/models/job_test.rb
      create      test/fixtures/jobs.yml
$ rails db:migrate
== 20230307234229 CreateJobs: migrating =======================================
-- create_table(:jobs)
   -> 0.0500s
== 20230307234229 CreateJobs: migrated (0.0501s) ==============================
```

その後、rails console で以下のようにテストデータを入れようとしたところ、エラーが発生しました。
```
irb(main):017:0> job = Job.new(catch_copy: "キャベツの収穫", work_location: "群馬県")
(irb):17:in `<main>': uninitialized constant Job (NameError)
```

「uninitialized constant」で検索したところ、モデル作成時にスペルを間違えていることなどが主な原因と書いてある記事がいくつかありました。
ですが、モデル名は単数形でいいはずですし、スペルも間違えていないので原因がわかりませんでした。

### 対処
もう少し調べると、[こちらのteratailの質問](https://teratail.com/questions/273946)で同じエラーにハマった方がいました。
回答に
> rails consoleにてreload!を実行すると改善するかもしれません。

とあり試してみました。
```
irb(main):018:0> reload!
Reloading...
=> true                                           
irb(main):019:0> job = Job.new(catch_copy: "キャベツの収穫", work_location: "群馬県")
=> 
#<Job:0x000000010805b640                          
...                                               
irb(main):020:0> job.save
  TRANSACTION (0.3ms)  BEGIN
  Job Create (4.2ms)  INSERT INTO `jobs` (`catch_copy`, `work_location`, `created_at`, `updated_at`) VALUES ('キャベツの収穫', '群馬県', '2023-03-08 00:15:26.462469', '2023-03-08 00:15:26.462469')                                              
  TRANSACTION (4.4ms)  COMMIT                       
=> true 
```

trueとなり、MySQLでデータを確認してみました。

```
mysql> select * from jobs;
+----+-----------------------+---------------+----------------------------+----------------------------+
| id | catch_copy            | work_location | created_at                 | updated_at                 |
+----+-----------------------+---------------+----------------------------+----------------------------+
|  1 | キャベツの収穫        | 群馬県        | 2023-03-08 00:15:26.462469 | 2023-03-08 00:15:26.462469 |
+----+-----------------------+---------------+----------------------------+----------------------------+
1 row in set (0.01 sec)
```

無事データがきちんと入りました。

モデル名にスペルミスなどが明らかにない場合は
```
reload!
```
を試してみましょう。

#### 参考
* [Rails consoleでreload!する場合の注意点 - Qiita](https://qiita.com/jnchito/items/57a160c087f17c2457bb)
tarで解凍先ディレクトリを指定する【tar xf hoge.tar.gz --one-top-level=mydir --strip-components=1】

# 新しいtarの場合
```bash
tar xf hoge.tar.gz --one-top-level=mydir --strip-components=1
```

# 古いたぁの場合

```bash
mkdir mydir
tar xf hoge.tar.gz --directory=mydir --strip-components=1
```

# たぁの中身

```bash
tar tf hoge.tar.gz
hoge/
hoge/fuga.html
hoge/foo.css
hoge/bar.js
```
Create an Account Using SOAP API and SoapUI


+ [Create an Account Using SOAP API and SoapUI](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A9BGcSAN)

質問

+ [While creating an account in SOAP API unable to process the last step. Please help.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000E977j)

説明では削除になっているが、実際はAPIバージョンの数字の置き換え


:::note
The description in this trail is still confusing in 2023 ("...remove the package version ...").

The correct create() URL goes like:
https://yourDomainName.trailblaze.my.salesforce.com/services/Soap/c/XX.X

with XX.X being the current SOAP Version you installed or are using along with the SOAP UI App so it's not removing, but replacing.
:::


+ [【未解決】I am doing Platform API Basics module Challenge "Use SOAP API" but getting invalid login when logging in in Soap api app again and again　：　500 error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ak28M)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/56b13641-d5dc-db6e-ac8d-d812a022031c.png)
Googleデジタルマーケティング＆Eコマース：アトリビューション・モデル

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

# どのタッチポイントが顧客の意思決定に最も影響を及ぼしているか？

成功の意味は、マーケティングやビジネスの特定の目標によって異なります。しかし、デジタルマーケティング担当者は皆、どのタッチポイントが顧客に行動を起こさせたかを知りたいと考えています。

- 例えば、画材を販売する企業でキャンペーンを実施するとします。新しい絵の具の広告を多くの人がクリックしても、最終的に購入に至ったのは数人だったとしたら、その広告はあまり効果的ではなかったかもしれません。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/e6483445-9974-9fc5-77ab-9ee15d76e6f8.png" width="600">

戦略を最適化するためには、どのタッチポイントが顧客の意思決定に最も影響を及ぼしているかを知る必要があります。もちろん、お客様が何を考えているかを正確に把握することはできません。しかし、こうした顧客の行動から、自社の取り組みがどこで成功し、どこで失敗しているのか、多くのことを知ることができます。

# アトリビューション

***<font color="MediumVioletRed">『どのコンテンツやチャネルがリード、コンバージョン、サインアップを生み出したかを判断するプロセスのこと』</font>***

これは、あなた自身が判断する必要はありません。ほとんどの分析ツールには、データを使って、顧客が行動を起こす前にどのタッチポイントやキーワードに接触したかを調べる機能があります。

成功の原因を特定のマーケティングおよびセールス活動に正確に帰することで、企業は時間、予算、リソースをどこに投資すべきか、十分な情報を得た上で意思決定することができます。

さて、最後のタッチポイントがすべての評価を受けるべきだと考える人がいますが、それは理にかなっていますよね？購入直前のタッチポイントは、顧客に行動を起こすように説得するものだと思われがちです。しかし、必ずしもそうとは限りません。平均的なお客様は、購入までの間に6つのタッチポイントを経験し、その道筋は必ずしも一直線ではないことをご存じでしょう。
- 例えば、新しいコンピュータを買おうとしている人が、2つ目のタッチポイントでどのモデルを買うか決めたものの、実際に購入するのは先延ばしになってしまったとします。それは、休暇を待っていたり、コンピュータの発売を待っていたりします。あるいは、ただ気が散ってしまったのかもしれません。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/cdaf37aa-4778-40b5-9912-4f7d956d8378.png" width="600">

- そのため、すでに購入する予定だった商品を思い出させるために、別のタッチポイントが必要になるかもしれません。これらのタッチポイントはいずれも評価に値し、アトリビューションはその評価を得るための方法です。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6ef75c98-9fc2-69f7-c323-e1131e84c09b.png" width="600">

# アトリビューション・モデル

アトリビューション・モデルに関して、企業はいくつかの選択肢を持っています。

### データ駆動型アトリビューション
これは、チャネルを超えたマーケティング・コンテンツとの顧客エンゲージメントを測定し、行動を起こす動機付けを理解します。

どの広告やキーワードが最も頻繁にコンバージョンにつながるかなどの統計に基づいて、各タッチポイントにクレジットを割り当てる。データ駆動型アトリビューションは、顧客の実際の行動を基にクレジットを割り当てる。

しかし、このモデルに十分な意味のあるデータがない場合、他の選択肢もあります。以下に、いくつかの例を挙げます。

### ファーストクリック型アトリビューション

これは、最終的にコンバージョンにつながる最初のタッチポイントにすべてのクレジットを割り当てるものです。

- 画材屋さんに話を戻しましょう。顧客とブランドの最初のインタラクションが油絵具のソーシャルメディア広告であった場合、顧客が何かを購入するまでにさらにいくつかのタッチポイントが必要であったとしても、購入のすべてのクレジットはその広告に付与されます。

### ラストクリック型アトリビューション

これは、コンバージョン前の最後のタッチポイントにすべてのクレジットを割り当てるものです。

- 例えば、画材屋さんの顧客が4、5番目のタッチポイント（プロモーションメールなど）の後に購入した場合、ラストクリックのアトリビューションはそのメールに全てのクレジットを与えることになります。

### リニア型アトリビューション

これは、カスタマージャーニーに沿った各タッチポイントに等しくクレジットを割り当てます。

- 私たちの画材屋さんのカスタマージャーニーでは、ソーシャル広告、プロモーションメール、そしてその間にあるすべてのタッチポイントが、最終的なコンバージョンを獲得するためのクレジットを共有することになります。


:::note info
アトリビューションは正確な科学ではありませんが、顧客がコンテンツとどのように関わり、何が行動を起こすきっかけになっているかをよりよく知ることができます。
:::
eccube-4.2.1 を Docker Compose でインストール (sqlite3)

こちらを参考にしました。
[Docker Composeを使用してインストールする](https://doc4.ec-cube.net/quickstart/docker_compose_install)

Arch Linux を使いました。
データベースは、sqlite3 です。

## インストール

docker が動いていることを確認

```text
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; preset: >
     Active: active (running) since Wed 2023-03-08 08:29:40 JST; 8min ago
```

ソースのダウンロード

```bash
wget https://downloads.ec-cube.net/src/eccube-4.2.1.tar.gz
```

ソースの解凍

```bash
tar xvfz eccube-4.2.1.tar.gz
```

インストール

```bash
cd ec-cube/
docker-compose up -d
docker-compose exec -u www-data ec-cube bin/console eccube:install -n
```

インストールが成功すると次のような画面が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/26584ea5-be05-d496-96eb-ccc30b0c7307.png)

## コンテナの起動

```bash
docker-compose up -d
```

コンテナの停止

```bash
docker-compose down
```

## フロント画面
http://localhost:8080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3eb2ed1e-4060-1e1c-a5c8-2958da22560c.png)

## 管理画面
http://localhost:8080/admin/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3e11ce18-77d7-6fd2-7b6c-9c751c7060ea.png)

ユーザー　admin
パスワード　password
でログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/06acb920-2e75-a60a-e682-974c2dc1cec9.png)

## 状況の確認

```text
$ docker-compose ps
NAME                    IMAGE                                    COMMAND                  SERVICE             CREATED             STATUS                    PORTS
ec-cube-ec-cube-1       ghcr.io/ec-cube/ec-cube-php:8.1-apache   "docker-php-entrypoi…"   ec-cube             32 minutes ago      Up 32 minutes (healthy)   0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:4430->443/tcp, :::4430->443/tcp
ec-cube-mailcatcher-1   schickling/mailcatcher                   "sh -c 'mailcatcher …"   mailcatcher         32 minutes ago      Up 32 minutes             0.0.0.0:1025->1025/tcp, :::1025->1025/tcp, 0.0.0.0:1080->1080/tcp, :::1080->1080/tcp
```

ログイン

```text
$ docker exec -it  ec-cube-ec-cube-1 bash
root@f079b00b4bfc:/var/www/html#
```

PHP

```text
root@f079b00b4bfc:/var/www/html# php --version
PHP 7.4.33 (cli) (built: Nov 15 2022 06:03:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies
```

データベース

```text
root@f079b00b4bfc:/var/www/html# file var/eccube.db 
var/eccube.db: SQLite 3.x database, last written using SQLite version 3034001
```

Web サーバー

```text
root@f079b00b4bfc:/var/www/html# apache2 -v
Server version: Apache/2.4.54 (Debian)
Server built:   2022-06-09T04:26:43
```
Glueジョブの監視方法

# Glueジョブの監視

AWS Glueはジョブを実行することで大規模なデータ加工を行うことができます。
オンデマンドでAWSマネジメントコンソールなどからGlueジョブを実行するケースもよくありますが、本番環境等では日次でGlueジョブをスケジュール実行するなどがよく見られる状況かと思います。
その場合にGlueジョブが失敗した場合の検知や失敗する前の状況の把握をする必要が出てくるのでGlueジョブの監視方法をまとめてみました。
今回はGlueのバッチジョブを対象としておりストリーミングジョブは対象としていません。（ただし、ストリーミングジョブでも監視方法はそこまで大きく変わらないと思います）

# Glueジョブの出力情報

Glueジョブではログ、メトリクスなどいくつかの情報を出力しますが、そのうち監視に使用するもの使用しなくても良いものを整理してみました。

|出力情報|出力箇所|用途|監視対象|
|:---|:---|:--|:--|
|イベント|EventBridge|ジョブの失敗等のステータス確認|YES|
|メトリクス|CloudWatch Metrics|ジョブの失敗数、実行時間等の確認|YES|
|ログ|CloudWatch Logs|ジョブが出力するログメッセージ|NO|
|Spark History Server Logs|S3|ジョブが出力するSparkの詳細内容に関するログ|NO|

ログとSpark History Server Logsは監視では使用せず、他の情報でジョブの失敗等を検知した後にそのジョブの失敗原因を調査する目的で使用することが多いかと思います。
イベント情報に関してはジョブの失敗を検知できるので、この情報が主要な監視項目となります。
メトリクスに関してはジョブの実行時間等が確認できるのでダッシュボードを作成して長期的な傾向、例えば徐々にジョブの実行時間が長くなっているなど問題が起きそうな予兆を確認するなどの目的で使用します。

# Glueジョブの監視項目

Glueジョブの以下の項目を監視しています（他の出力情報も場合によっては監視した方が有用かもしれません）。

|出力情報|項目|説明|監視対応|
|:---|:---|:--|:--|
|イベント|Glue Job State Change|State =SUCCEEDED、FAILED、TIMEOUT で発生|失敗とタイムアウトを検知して通知|
|メトリクス|glue.driver.aggregate.elapsedTime|ETL の経過時間 (ミリ秒単位) |ダッシュボードでモニタリング|
|メトリクス|glue.driver.aggregate.numFailedTasks|失敗したタスクの数 |ダッシュボードでモニタリング|

参考
- [Glueジョブイベント情報](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types)
- [Glueジョブメトリクス情報](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)
EXPO > EAS > Nib file 'LaunchScreen~iphone.nib' was not found.




Nib file 'LaunchScreen~iphone.nib' was not found.




## 症状


App Storeにデリバリーしようとした際に以下のエラーが表示された


```
Asset validation failed (90030)
Nib file 'LaunchScreen~iphone.nib' was not found. Please ensure the specified file is included in the bundle with any required device modifiers appended to the filename.

Asset validation failed (90030)
Nib file 'LaunchScreen~ipad.nib' was not found. Please ensure the specified file is included in the bundle with any required device modifiers appended to the filename.
```


## 原因
以下が設定されれいたことによる

```
ios: {
  infoPlist: {
    NSMainNibFile: 'LaunchScreen',
  },
},
```

昔のバージョンでこの指定をしていたものと思われる。
Googleデジタルマーケティング＆Eコマース：データ倫理

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

パフォーマンス・マーケティングには多くのデータが必要です。データには、顧客の興味や行動、さらには個々の顧客の購買に関する情報が含まれます。今回、データ倫理について、ご紹介します。顧客データを責任を持って合法的に扱う方法を知っておくことは、組織、役割、プロジェクトの完全性にとって非常に重要です。

# データ倫理

***<font color="MediumVioletRed">『データの収集と分析に関連する道徳的な課題を研究・評価すること』</font>***

データに関して、企業は倫理的な慣行を適用することで、次のことが可能になります。

- 法規制を遵守する。
- 顧客データを保護する。
- 偏りのない公正なデータを利用する。


## 法規制を遵守する

多くの国で、個人を特定できるデータの生成、記録、保管、処理、共有、および使用に関する法律が制定されています。

***<font color="MediumBlue">『個人を特定できるデータ（PII）とは、個人を直接特定したり、連絡したり、場所を特定したりするために使用できる情報のこと』</font>***

- 組織のデータセキュリティとプライバシーのプロトコルを確認してください。データプライバシーとは、データの適切な取り扱いを意味します。
- データの収集、処理、分析、共有、保存、削除の方法は、お客様が居住する国のデータプライバシー法に準拠する必要があります。


## 顧客データを保護する

顧客データを保護するための重要な方法のひとつが、データの匿名化です。

***<font color="MediumBlue">『データの匿名化とは、データから個人情報をマスクまたは削除して、人々のアイデンティティを保護するための手法のこと』</font>***

- 匿名化されるデータは、多くの場合、複数のソースから取得したデータに対して行われます。
- 匿名化されたデータは、組織内でより広く、自由に共有することができるようになります。
- 匿名化されるデータの種類は、名前、電話番号、電子メールアドレス、写真、口座番号、購買取引などが多いです。

## 偏りのない公正なデータを利用する

公正で合理的なデータの使用とは、データを偏った方法で使用しないことも意味します。

***<font color="MediumBlue">『データの偏りとは、結果を特定の方向に偏らせるヒューマンエラーの一種のこと』</font>***

- データの偏りは、ターゲット層からデータを選択することとは違うことに注意してください。
    - 例えば、21歳から45歳のお客様から得た過去のデータを確認したいとします。これはデータバイアスではありません。
- データに偏りがあると考えられるのは、商品を返品したお客様をブランドへの忠誠心がないと考え、そのお客様のデータを除外した場合です。しかし、利用可能なすべてのデータを含めても、常にバイアスがないとは限りません。これは、過去のデータが、すべての潜在顧客を代表するものではない顧客からのものであった場合に起こり得ます。過去の顧客行動に基づいて将来の広告キャンペーンを作成すると、知らず知らずのうちにバイアスを永続させることになりかねません。
秋月の有機ＥＬディスプレイ　１２８×３２　白色で遊ぶ(組み立て編)P-14686

目的
ブレッドボード用OLED(128x32)を組み立てて遊ぶ
部品を買う





組み立て例


![o_cop408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e65bb67b-5c74-edaa-10f5-c9de3f02f311.jpeg)



リセットの回路

![o_cop407.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/08dace04-b5b7-e812-a4e2-cf58d912da63.jpeg)



有機ＥＬディスプレイ　１２８×３２　白色
[AL12832AWWB-H-U02]
通販コード　P-14686
発売日　2020/03/07



![o_cop401.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8583fd9c-7af0-2ccc-e404-2f6e6b2e1eb4.jpeg)



ミニブレッドボード　ＢＢ－６０１（白）
[BB-601(White)]
通販コード　P-05155
発売日　2011/09/19


![o_cop402.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0dc1d8c-2fc3-8d30-ada0-231dd713eeac.jpeg)



細ピンヘッダ　１×４０　（黒）
[PHA-1x40SG]
通販コード　C-06631
発売日　2013/04/25


![o_cop403.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c51c1d9c-1dd6-4098-d03c-6279664ab3f3.jpeg)




カーボン抵抗（炭素皮膜抵抗）　１／６Ｗ１０ｋΩ　（１００本入）
[RD16S 10K]
通販コード　R-16103
発売日　2002/06/11


![o_cop404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/593a2012-f182-d4f1-22be-5d98923f10aa.jpeg)



高速スイッチング・ダイオード　１ＳＳ１７８（１００本入）
[1SS178]
通販コード　I-07783
発売日　2014/05/20


![o_cop405.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb537158-316c-ed9f-2c1b-b9fbe6c0281d.jpeg)




ブレッドボード・ジャンパーワイヤ（オス－オス）セット　各種　合計６０本以上
[BBJ-65]
通販コード　C-05159
発売日　2011/09/19
(不良が多い)


![o_cop406.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb207f1a-7b94-ec60-dcc7-fce0a830bafd.jpeg)
paiza.ioでnadesiko その16

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

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

# サンプルコード

```

sp = 0
stack = [0]

●add
    stack[sp - 1] = stack[sp - 1] + stack[sp]
    sp = sp - 1
ここまで
●sub
    stack[sp - 1] = stack[sp - 1] - stack[sp]
    sp = sp - 1
ここまで
●mul
    stack[sp - 1] = stack[sp - 1] * stack[sp]
    sp = sp - 1
ここまで
●div
    stack[sp - 1] = stack[sp - 1] / stack[sp]
    sp = sp - 1
ここまで
●dup
    sp = sp + 1
    stack[sp] = stack[sp - 1]
ここまで
●drop
    sp = sp - 1
ここまで
●print
    stack[sp]を表示
ここまで
●(aを)push
    sp = sp + 1
    stack[sp] = a
ここまで

●（Sを）実行
    Sを「 」で区切るしてAに代入。
    Ａを反復
        もし、それが「+」ならば
            add
        違えばもし、それが「-」ならば
            sub
        違えばもし、それが「*」ならば
            mul
        違えばもし、それが「/」ならば
            div
        違えばもし、それが「dup」ならば
            dup
        違えばもし、それが「drop」ならば
            drop
        違えばもし、それが「.」ならば
            print
        違えば
            それをpush
        ここまで
    ここまで
ここまで

「9 9 - 9 9 / .」を実行
「9 9 / 9 9 / + .」を実行
「9 9 + 9 + 9 / .」を実行
「9 9 9 + 9 / dup + .」を実行
「9 9 9 + 9 / dup + - .」を実行
「9 dup 9 + 9 + 9 / - .」を実行
「9 9 9 + 9 / - .」を実行
「9 9 9 drop 9 / - .」を実行
「9 9 - 9 * 9 + .」を実行
「9 9 / 9 dup 9 / + .」を実行
「9 9 9 + 9 / + .」を実行
「9 dup 9 9 + + 9 / + .」を実行
「9 9 9 + 9 / dup + + .」を実行
「9 dup 9 9 + 9 / dup + - + .」を実行
「9 dup dup 9 + 9 + 9 / - + .」を実行




```

# 実行結果

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```

# 成果物

https://paiza.io/projects/RTZUGg5yBKPZYxw2uxCbGg

以上。
paiza.ioでnadesiko その15

# 概要
paiza.ioでnadesikoやってみた。
変数、使ってみた。

# サンプルコード

```

A=30
ローカルテスト処理。
Aを表示。
＃値は変更なし
グローバルテスト処理。
Aを表示。
＃値が変更される

●ローカルテスト処理
  変数 A=50
ここまで

●グローバルテスト処理
  A=50
ここまで

//変数の宣言
//変数Ｓとは
//変数Ａとは整数。
//　変数の型には、文字列、整数、数値、配列、ハッシュの種類があります。
#1つめの方法（=を使った代入式）
変数ｑ = []
変数v = {}
変数p = ""
//関数の外で宣言された変数は、グローバル変数になります。関数の中で宣言された変数は、ローカル変数になります。



#2つめの方法（はを使った代入式）
変数ｑは3

#3つめの方法（「代入」命令を使う）
4を変数ｑに代入。

S＝「111-222#333-444」
Sを「-」で文字列分割してAに代入。
Ａ[0]を表示。# 111
Ａ[1]を「#」で文字列分割してBに代入。
B[0]を表示。# 222
B[1]を「-」で文字列分割してCに代入。
C[0]を表示。# 333
C[1]を表示。# 444

助詞一覧取得して反復
　　対象を表示。
ここまで。
「こんにちは」と表示。

予約語一覧取得して反復
　　対象を表示。
ここまで。

```

# 実行結果

```
30
50
111
222
333
444
でなければ
について
なければ
くらい
なのか
までを
までの
による
ならば
である
します
でした
とは
から
まで
だけ
より
ほど
など
いて
えて
きて
けて
して
って
にて
みて
めて
ねて
では
には
は~
んで
ずつ
なら
たら
れば
こと
です
は
を
に
へ
で
と
が
の
こんにちは
回
回繰返
間
間繰返
繰返
増繰返
減繰返
後判定
反復
抜
続
戻
先
次
代入
実行速度優先
パフォーマンスモニタ適用
定
逐次実行
条件分岐
増
減
変数
定数
エラー監視
エラー
それ
そう
関数
インデント構文
非同期モード
DNCLモード
モード設定
取込


```

# 成果物

https://paiza.io/projects/JJbDo8Nud_2-iUuKk0fVoA


以上。
MIPSのSIMD其の六

FreeBSD/mipsでDSP命令をサポートするためのkernel仕様を考えて見ます。

DSPではレジスタが拡張されているので、コンテキストスイッチでレジスタの退避復旧を行う必要があります。

レジスタの拡張はDSPで行われてDSP2Pではそのままです。

FreeBSDのコンテキストスイッチの処理はcpu_switchというアセンブラコードであります。

オリジナルのkernelはDSPを実行すると落ちます。まずは落ちないようにします。

まずDSP命令が必要なのはごく限られた用途であり、影響ないようにサポートありと無しのkernelが作れるようにMakeオプションにするのが良さそうです。

gccの4.2.1はDSPサポート有りでDSP2Pは無しです。DSR2Pは4.3.xでサポートされたので、4.2.1にその差分を反映します。

binutilsはそのままで大丈夫そうです。

オリジナルのコンパイルは間違ったオプションが設定されていてdsp命令を有効にできないので、デフォルトのオプションをmips32r2にします。

DSP命令が実行された時にはトラップが発生するのでフラグを設定します。またPCBからレジスタを復旧させます。

DSP命令が実行されたプロセスがswitchするときにはPCBの退避エリアに64ビットのac1,2,3レジスタとコントロールレジスタを退避します。

当初、コンテキストスイッチで退避復旧を行うと思っていたのですが、そうではなくて、コンテキストスイッチでは退避だけ行って、復旧はDSP命令のトラップで行うのがFreeBSDの流儀のようです。

DSPがサポートされていないCPUでDSP命令が実行されたらイリーガルインストラクション。

DSPしかサポートがないCPUでDSP2Pが実行されたらイリーガルインストラクション。

DSPサポート無しカーネルでDSP,DSP2Pが実行されたらイリーガルインストラクション。

DSPサポート無しのSOCでDSPサポートありのカーネルはコンフィグレーションのミスなので考えなくてよいと思う。

おそらくmips64でのエミュレーションではサポートしなくてもよい。

mipsのFPの実装はおそらく未テストでけっこう怪しいです。おそらくimpさんがJuniperからぱちってきて、適当につっこんだような気がします。

armのVFPの実装を参考にするのが良さそうです。
初めてのエンジニア：要件定義とは

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は要件定義について更に詳しく調べてみましょう！

![インスタスライド_202302232.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/24cb18a0-8155-8776-f50c-91f5cde4ff31.gif)


# 要件定義とは
要件定義としては、

１．ユーザ要求ヒアリング

２．情報整理

３．要件事項の評価

４．システム要件書作成

のステップとなる。

# 要件定義ポイント
最も重要なものは、最終成果物となるシステム要件書である。
・システム開発の目的
・システムの機能
・システム構成
・費用効果
・開発マクロスケジュール
等。
ユーザ要求をいかに整理し、システム化の最終目標を整理化し、ユーザにも分かり易い文書とする事が必要となる。

このため、様々な分析手法がある。

# 分析手法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ff315952-c11d-1e57-8a14-bab8d05800e0.png)

## 機能階層図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/b70178a9-4ca6-b9bb-0b22-7ac0b1dae59a.png)
## DFD
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/d5d1544c-e41d-d06f-56c9-abf9f2747793.png)
## ER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/825b8920-ff24-6673-87c9-332e5087ec1e.png)

# まとめ
ー要件定義で最も大事なのはシステム要件書

ー分析手法に機能階層図、DFD、ER図等がある


# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
paiza.ioでnadesiko その14

# 概要
paiza.ioでnadesikoやってみた。
字句解析について調査

# なでしこでは基本的に「助詞区切りの規則」を基準としてプログラムを解析します。
# 字句解析の処理では、語句を読んでいって「を」「から」「の」「へ」「に」などの助詞を見つけると、そこで語句を区切ります。
# どんな助詞がある？
でなければ
について
なければ
くらい
なのか
までを
までの
による
ならば
である
します
でした
とは
から
まで
だけ
より
ほど
など
いて
えて
きて
けて
して
って
にて
みて
めて
ねて
では
には
は~
んで
ずつ
なら
たら
れば
こと
です
は
を
に
へ
で
と
が
の

# どんな予約語がある？ 
回
回繰返
間
間繰返
繰返
増繰返
減繰返
後判定
反復
抜
続
戻
先
次
代入
実行速度優先
パフォーマンスモニタ適用
定
逐次実行
条件分岐
増
減
変数
定数
エラー監視
エラー
それ
そう
関数
インデント構文
非同期モード
DNCLモード
モード設定
取込

# 変則ルール 
とは言え、それだけだと使いづらいので変則的なルールを設定しています。
# 「回」「間」の例外 
語句の末尾に『回』や『間』があれば、そこで語句を区切ります。
これにより、繰り返し処理を自然に記述できます。
# 「以上」「以下」「超」「未満」の例外 
語句の末尾に『以上』『以下』『超』『未満』があれば字句解析で分割します。
# 「かつ」「または」の例外(v3.4.1以降) 
演算子の「かつ」「または」にて単語を強制的に分割します。


以上。
2023/3/8主にITとかセキュリティの記事

減少傾向続いたフィッシング攻撃、5カ月ぶりに増加
https://www.security-next.com/144266

「curl」に複数の脆弱性、アップデートにて解消
https://www.security-next.com/144257

ドレスレンタルサイトでクレカ情報流出 - 不正利用の可能性
https://www.security-next.com/144196

サイト不正アクセス被害でカード8,604件流出か、PARTY DRESS STYE(3/6)
https://cybersecurity-jp.com/news/79632

「まんが王国」でシステム障害 - メアド流出の可能性
https://www.security-next.com/144275

沖縄県や４１市町村に一斉サイバー攻撃か　HP一時閲覧できず(3/6)
https://news.yahoo.co.jp/articles/a261736677ebe3346ec025f6a99c1e383edeebf8?source=rss

490円→49万円 勝手にゼロが増える振り込め詐欺、新手の手口か(3/6)
https://gunosy.com/articles/eqqoR

転勤・異動時はだまされやすい　サイバー攻撃を知る10選(3/6)
https://www.nikkei.com/article/DGXZQOUC03AE90T00C23A3000000/

Fastly 調査：有効化されているセキュリティツールは約 6 割に留まり企業はリスクにさらされていることが明らかに
全世界の企業の 6 割がすでに十分な支出をしていると主張する一方、7 割を超える企業がサイバーセキュリティへの投資を拡大(3/6)
https://prtimes.jp/main/html/rd/p/000000040.000037639.html

ベンダーとともにユーザーを守るWindows 11のセキュリティ(3/6)
https://news.yahoo.co.jp/articles/45ff49610b1510757bcd86c8873e0e5d8a7ed993?source=rss

企業の7割がサイバーセキュリティへの予算増額もIT責任者による投資は不十分(3/6)
https://news.mynavi.jp/techplus/article/20230306-2609333/

全世界の7割の企業がサイバーセキュリティへの投資を拡大と回答──Fastly調査(3/6)
https://enterprisezine.jp/news/detail/17457

KnowBe4 がセキュリティトレーニングの視点からのサイバーセキュリティ実態調査を日本で実施
サイバーセキュリティの人的防御対策において日本が立ち遅れているか？(3/6)
https://prtimes.jp/main/html/rd/p/000000145.000053624.html

身近に忍び寄るSNSアカウントの乗っ取り(3/6)
https://news.yahoo.co.jp/articles/ed11b8da950ea315110c629cf9b20e2b755a864f?source=rss

【特捜Ｑ】カード不正利用 過去最悪「身に覚えのない請求」どう防ぐ？(3/6)
https://news.yahoo.co.jp/articles/872c1bac990dad26ba1e7f217616c805e45cf8f1?source=rss

ゴールは信頼の醸成--セールスフォースの「最高信頼責任者」の活動とは(3/6)
https://japan.zdnet.com/article/35200768/

無料の高機能パケット解析ツール「Wireshark 4.0.4」が公開(3/6)
https://news.yahoo.co.jp/articles/6d446c2db4f1e3b7d152677af1d9d12237ef21c8?source=rss

PyPIリポジトリに悪意あるパッケージ、豊富な機能のマルウェアを隠す(3/6)
https://news.mynavi.jp/techplus/article/20230306-2606446/

「Microsoft Excel」Web版でピボットテーブルの行・列をドラッグで並べ替え可能に
マイクロソフトが2月のアップデートまとめを公開(3/6)
https://forest.watch.impress.co.jp/docs/news/1482956.html

サイバーセキュリティ対策専門官の募集について
https://www.mhlw.go.jp/general/saiyo/ninki-cybersecuritysenmonkan.html

セキュリティ・ミニキャンプ in 東京 2023　専門講座　開催
専門講座の参加者を募集いたします。
https://prtimes.jp/main/html/rd/p/000000009.000096005.html
Unityのレイヤー、マテリアル、テクスチャ、シェーダーについて解説します。

皆さんこんにちは、
今回はUnityで僕の分からなかった用語を解説したいと思います。
分からなかった用語は下記になります。

・マテリアル
・テクスチャ
・シェーダー
・レイヤー

それでは、それぞれ解説していきます。

#### マテリアルとテクスチャの違いは？
マテリアルとテクスチャの違いは、ずばり
###### 「質感か画像か」

の違いです。

テクスチャはあるオブジェクトに対して貼り付ける画像になります。
例えば、都市モデルを参考にしてみましょう。
東京タワーの灰色の3Dオブジェクトがあるとしますね。
その3Dオブジェクトに対して赤色っぽい画像を貼り付けると、東京タワーのような物ができます。

しかし、都市モデルはただの画像を貼り付けただけですので、
質感や反射、メタル感、サビなどが表現できていません。
そこで必要になるのが、
##### マテリアル
です。

マテリアルは、ザラつきや、つや消し、メタル感などの
#####  物体の質感を指定するデータ
のことです。


ここまでで、テクスチャとマテリアルについては理解できたかと思います。
しかし、ここで疑問が出ると思います。

#### マテリアルってどうやって処理してるのか？
マテリアルを作成するためのプログラム処理のことを
##### シェーダ
と呼びます。

ここでもまた疑問が生まれます。

#### マテリアルとシェーダーの違いは？
マテリアル＝シェーダー×パラメーター
と考えるとわかりやすいかも知れません。
シェーダーは日本語で陰影処理とも呼びますが、ただ影を描画しているだけではありません。
他にも
・色の合成
・奥行きの表現
・ライティング
などの処理を行っています。
色の合成具合や奥行きの表現の仕方はパラメータに依存します。

そのため、マテリアルはシェーダー×パラメーターとなるということです。


#### 今回のまとめ

テクスチャはオブジェクトに貼り付ける画像データのこと
マテリアルは質感を表すデータのこと
シェーダーはマテリアルを表現するためのプログラムのこと

これですっきりわかったかと思います。
JavaBeansについて

# 用途
プログラムを部品化する。
プログラム間でデータの受け渡しに使う。

# 3つの規則
* privateなフィールドへのgetterおよびsetterメソッドを持つ
* publicで引数なしのコンストラクタを持つ（※）
* java.io.Serializableを実装している

※コンストラクトを定義しなかった場合、コンパイラが引数なしのコンストラクタを自動的に生成する

# Sample
```UserInfo.java
package bean;

public class UserInfo implements java.io.Serializable {

    private String name;
    private int age;
    private String nationality;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getNationality() {
        return nationality;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setNationality(String nationality) {
        this.nationality = nationality;
    }

}
```

上記Beanを使用する。
```Main.java
package test;

import bean.UserInfo;

puublic class Main {
    public static void main(String[] args) {

        UserInfo userInfo = new UserInfo();

        userInfo.setName("John Smith");
        userInfo.setAge(30);
        userInfo.setNationality("United States");

        System.out.println("name :" + userInfo.getName());
        System.out.println("age :" + userInfo.getAge());
        System.out.println("nationality :" + userInfo.getNationality());
    }
}

```
社内サイト構築勉強⑦(さくらのレンタルサーバ+Laravel)：DataTablesを利用してマスタデータを表示してみる

# 前提・概要
プロジェクトは前回記事にて作成したものを想定。

# 本日の完成形
前回作成した都道府県マスタをDataTablesで表示させるようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/e0357ea1-c916-f1fa-5d97-aa6c0a4100a8.png)


## 1.実装手順
正直、以下のサイトの内容をそのまま行っただけで、紹介とさせてもらう。
本当にありがとうございました。

https://bonoponz.hatenablog.com/entry/2020/09/01/%E3%80%90Laravel%E3%80%91DataTables%E3%82%92%E4%BD%BF%E3%81%86%EF%BC%88jQuery%EF%BC%89

1点詰まったところが、スクリプトの読み込みが標準のものをそのままにしておくと
DataTablesを利用できなくなったため、コメントアウトした。
```php:welcome.blade.php
<!-- <script src="vendor/jquery/jquery.min.js"></script> --> // そのままだと利用できなかった
```

### 2.その他細かい変更点
（皆さんには関係ない。間違い探し。）

- メニュー左上のアイコン削除
- メイン部分のトップ部分をサンプルから拝借
- 埋込コンテンツに新規登録・CSVダウンロード・CSVアップロードのボタンのみ配置
- メニューを全体的に整理
【 Java 】Enumクラスについて

## ■Enumとは？
Enumとは列挙型と言われていて、複数の定数を効率的に管理できるクラスである。

:::note warn
Enumのメリット、デメリットの理解はまた今度。。。
:::
## ■構文
```java:Enum構文 
アクセス修飾子 enum 列挙型名 { 列挙子1, 列挙子2, 列挙子3 ... }
```
## ■使い方
```java:サンプルコード
/**
 * 口座種類を列挙型で定義
 */
public enum Kouza {
    	HUTU, // 普通口座
		TOZA, // 当座口座
		TEKI, // 定期口座
	}

/**
 * 口座種類に応じて処理を変えるメソッド
 * @param kouza 口座
 */
public static void setAccountType(Kouza kouza) {
		switch(kouza) {
		case HUTU:
			System.out.println("普通口座");
			break;
		
		case TOZA:
			System.out.println("当座口座");
			break;
		
		case TEKI:
			System.out.println("定期口座");
			break;
	}
}

public static void main(String[] args) {
		// ①口座種類全て出力
		for (Kouza kouza : Kouza.values()) {
			System.out.println(kouza.ordinal() + ":" + kouza);
		}

        // ②特定の口座種類を出力
		setAccountType(Kouza.HUTU);
}
```
上記ソースの場合、コンソールには以下内容が出力される。
```java:実行結果
// ①の出力結果
    0:HUTU
    1:TOZA
    2:TEKI

// ②
    普通口座
```
ChatGPTと○×ゲームで遊んだ（完敗）

# ChatGPTがすごい

最近とても流行っていますね。私自身何度もChatGPTとお話ししていますが、あまりにも自然な返答に毎回感動させられます。豊富な学習データに基づく知識は非常に豊富でさまざまな言語（プログラミング言語も含む）にも対応できるので、そんじょそこらの人間では勝ち目がありません。TypeScriptの割と複雑な型レベルプログラミングにもある程度対応できてしまいます（今度記事書きます）。

では、さっそくChatGPTに話しかけてみましょう。

> matoruru「こんにちは。遊びましょ」
ChatGPT「 こんにちは！何か遊びたいですか？私たちはいくつかの遊びを紹介することができます。何が好きですか？」

# 早速○×ゲームで遊んでみる

> 「何が好きですか？」

と聞かれているので、○×ゲームに誘ってみます。

> matoruru「○×ゲームが好きです。一緒に遊んでくれますか？」
ChatGPT「もちろんです！では、どちらが先攻になりますか？また、紙とペンが必要ですか、それともコンピューターでプレイしますか？」
> matoruru「紙とペンで遊びたいです」
ChatGPT「了解です！では、以下のようにマス目を描いて、ゲームを始めましょう。」

```
   1  2  3
A  ・ ・ ・
B  ・ ・ ・
C  ・ ・ ・
```

> ChatGPT「私は先攻になります。私が"×"で、あなたが"○"になります。最初に私がマス目に"×"を1つ置きます。」

```
   1  2  3
A  ・ ・ ・
B  ・ ・ ・
C  ・ ・ ×
```

> ChatGPT「次はあなたの番です。どこかに"○"を置いてください。マス目の場所は、例えば「A2」のように列と行の番号を組み合わせて指定してください。」

出力も指示も丁寧すぎて怖くなってきます。次は私の番なので○を置いてみます。

# ○を置いてみる

> matoruru「私はB2に"○"を置きます。」
> ChatGPT「了解です。では、マス目に"○"を置いてみましょう。」

```
   1  2  3
A  ・ ・ ・
B  ・ ○ ・
C  ・ ・ ×
```

> ChatGPT「次は私の番です。私は"×"をA1に置きます。」

```
   1  2  3
A  × ・ ・
B  ・ ○ ・
C  ・ ・ ×
```

> ChatGPT「あなたの番です。どこに"○"を置きますか？」
> matoruru「A2にします。」
> ChatGPT「了解です。では、A2に"○"を置きます。」

```
   1  2  3
A  ×  ○  ・
B  ・  ○ ・
C  ・ ・  ×
```

> ChatGPT「次は私の番です。私は"×"をC1に置きます。」

```
   1  2  3
A  ×  ○ ・
B  ・ ○ ・
C  × ・ ×
```

> ChatGPT「あなたの番です。どこに"○"を置きますか？」

あれ。詰んだ？悔しい・・・。これ以上は不毛なので、理不尽な振る舞いで対処します。

（追記：詰んでなかった）

![chabudai_kaeshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304979/117c26df-678a-f271-0b0a-cb94f5fcbc1e.png)

> matoruru「私は盤をひっくり返します。あなたの"×"も私の"○"もどこかへ飛んでいってしまいました。」
> ChatGPT「あら、それはちょっと予期しない展開ですね！でも、全然構いません。別の遊びをしましょうか？何か好きな遊びはありますか？」

大人な対応をされてしまい、ゲームでも人間性でも負ける結果となりました。

# まとめ

実は2ヶ月ほど前にも○×ゲームをChatGPTと遊んだことがあるのですが、そのときは普通に「○×ゲームをしましょう」と尋ねると「言語モデルなのでゲームはできません」と返答される状態でした。その頃も指示を具体的にすると遊んでくれましたが、盤面の状態などを記憶できないなど致命的な問題を抱えていました。

しかし今回はChatGPTの方からいきなり盤面を用意して私に指示を出してきましたし、プレイの実力も人間と遜色ない（むしろこちらがミスした）レベルでした。

どんどん便利になっていきますね・・・。

# おまけ： ひっくり返した後の盤の状態はどうなっている？

私が途中で盤面をひっくり返してしまったので、ChatGPTは気を遣って話を変えてくれました。その続きから現在の盤がどうなっているかを尋ねて、可能であれば石を置き直してもらいます。

> matoruru「やっぱりもう一度○×ゲームをしたいです。さっきの盤は今どうなっていますか？」
ChatGPT「残念ながら、私たちが使っていた紙とペンは仮想的なものでしたので、盤面はもう存在しません。ですが、もう一度遊びたいということでしたら、新しい盤面を作って、もう一度挑戦しましょう！」

お茶を濁されてしまった感じがします。聞き方がうまくなかったのでしょうか。

酷いことしてごめんねChatGPT・・・。

# 最後に

記事を読んでくださってありがとうございます！

Twitterフォローしていただけると記事を書き続けるモチベーションになります！
新着記事の通知も届くのでぜひ🐈
https://twitter.com/_matoruru

次回は実際にコーディングでChatGPTのサポートを得る内容の記事を書いてみる予定です。
Jestの使い方メモ

Jestのインストール方法
```shell
npm install --save-dev jest
```

まずは、テストするための処理を関数として記述する。
```javascript
// sum.js
function sum(a, b) {
  return a + b;
}

module.exports = sum;
```

テストケースを用意する。
```javascript
// sum.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
})
test('adds 23 + 45 to equal 68', () => {
  expect(sum(23, 45)).toBe(68);
})
```

package.jsonに以下を追加する。
```json
"scripts": {
  "test": "jest",
}
```

テストを実行する。
```shell
npm test
```

テストに成功すると以下のように出力される。
```
PASS  src/sum.test.js
  ✓ adds 1 + 2 to equal 3 (2 ms)
  ✓ adds 23 + 45 to equal 68

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.502 s
```
転職が一段落したので、振り返りながら

## 簡単に自己紹介
※拙い文章で読みにくい場合は申し訳ありませんm(__)m

**<スキルと年収>**
・Fラン卒 4月からエンジニア5年目
・PHP(Laravel),Java(Spring),MQL4,Python,js,jQuery,Vue
・1社目 年収300万 (3年)
・2社目 年収380万 (1年)
・3社目 年俸制 550万~ 

**<資格>**
・JavaGold、PHP初級
・将棋2段、暗算3段

**<詳細>**
1社目が何でもやる会社(受託、SES、etc..)だったのと3年でやりたいことを見つけて転職ということを軸に仕事に励む。
「SES」が性に合っていることが理解できたため、2社目(SES)に転職。

2社目は
・SES特化
・稼働安定
がとても評価できた。

2社目に転職してから半年後に「フリーランスあるいはエンジニア裁量が大きい会社のほうが自分にあっているのでは」と思い始めて転職活動開始(9月)。
2月頭~4月頭のいずれかを入社目標とした。

転職軸は大きく分けて3つ
・年収
・時間確保
・エンジニア裁量
仮に転職できなかったら、個人事業主でもいいやとかかなり楽観的姿勢だった。

## 使用したエージェント
- [type](https://type.jp/)
・UIが優れていて操作がしやすいと感じた
・一番使用したエージェント
→求める条件に応じて相当数の企業がヒットした
・9月は毎日のように面談を入れ、自分の市場価値を調査
・能動的に活用

- [転職ドラフト](https://job-draft.jp/)
・typeと並行して、指名の待機
・受動的

- [AMBI](https://en-ambi.com/)
・たまに使った
・名のある会社からオファーやヘッドハンターがくることもあるので、来た場合は面談を受ける
・どちらかといえば受動的に活用

- Twitter
・自分の志向にマッチした会社をフォローし、カジュアル面談を実施

## 結果
以下、選考状況など。

・志望会社数
→約30社

・内定
→8社

## 選考を通じて、得た知見
- 私自身の今回の転職活動において、Webコーディングのような試験は1度しかなかったが落ちた(泣)
- JavaGoldを取得したのは何かと大きかった
・単に上位資格というのもあるが、その言語に対する「ある程度の知見」と勉学に励む姿勢が評価された
- 9月段階において内定獲得は**5社**であり、提示額は410万~470万であった。また、その面談の渦中において提示額が上がる兆しも見えたのでいくつかご紹介。
① **職務経歴書の書き方**
・より分かりやすく、なにができてなにができないのかを記述
・作業効率をあげるツールやマクロ(VBAなど)をどのような背景のもとで制作したのかを記述
② **①に追随して、話し方や表現方法を改変**
・明るくハキハキと話す
・PHPの案件は××番、○○番~、Javaは××番、○○番~のように事前に**ほぼ確で質問される要項**をまとめる
・私自身は「面接」という硬い枠に縛られたくなかったため、自身の趣味やラーメンの話などを最初に話して、柔和な雰囲気のまま「面接」に挑んだ
- 諸事情で2月頭の入社が厳しくなったため、1月中は上記を生かして再度転職活動
・最終的に3社まで絞り、提示額は470万~570万であった
- わからないことや間違ったことに関しては、正直に答えたほうがいい。

## 最後に
今回の記事は、自身の転職活動を記しました。
誰かのお役に立てれば幸いです。
最後まで読んでいただき、本当にありがとうございます。
Expo > EAS > Local Buildでfingerprintのエラー



```
Error: Distribution certificate with fingerprint XXXXXXXXXXXXXXX hasn’t been imported successfully
```





以下(“Apple Worldwide Developer Relations Certification Authority”)をダウンロードしてkeychainへ登録する

https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer

ダウンロードしたファイルはダブルクリックでkeychainに登録される




## 参考
https://myjam.com/engineering/blog/notes-from-working-with-expo-eas