OmniAICreator/Qiita-1.07M huggingface dataset:
Java_RPGのPlayerクラスを継承で記述２

paizaラーニングforTEAM Java入門編
レッスン8の#06

```Java:8-#06
// RPGのPlayerクラスを継承で記述　その2

public class Main {
    public static void main(String[] args) {
        System.out.println("=== パーティでスライムと戦う ===");

        Player hero = new Player("勇者");
        Player warrior = new Player("戦士");
        Wizard wizard = new Wizard("魔法使い");
        Player[] party = {hero, warrior, wizard};

        // PlayerオブジェクトとWizardオブジェクトは親クラスが共通なので
        // 魔法使いのオブジェクトも同じようにPlayerに分類できる
        // そのためPlayerオブジェクトとWizardオブジェクトもPlayer型として取り出せる
        for (Player member : party) {
            member.attack("スライム");
        }
        // hero.attack("スライム");
    }
}

class Player {
    public String myName;

    public Player(String name) {
        myName = name;
    }

    public void attack(String enemy) {
        System.out.println(myName + "は、" + enemy + "を攻撃した！");
    }
}

class Wizard extends Player {
    public Wizard(String name) {
        super(name);
    }

    public void attack(String enemy) {
        System.out.println("シャラララーン！");
        System.out.println(myName + "は、" + enemy + "に炎を放った！");
    }
}
```
Springboot：query did not return a unique result: 3ってでた

springbootで構築したアプリケーションを実行したら、
<b>query did not return a unique result: 3</b>
ってでた、、なんでや、、😢

調べてみたら、返ってきた結果が１つではなく３つだよって意味だった。

なので、可能性は２つ。一つ目は、Repositoryのエラー。Repositoryで結果を返すところの引数を一つの結果だけを格納する状態にしてたために起こるエラー。2つ目は、Contorollerのエラー。これは、@NamedQueryを使った際に、createNamedQueryの結果を格納する変数が単一結果格納用の変数だったり、getResultList()の格納先が単一結果格納用だったりする場合に起こるエラー。

今回私はNamedQueryではない簡単な検索を行っていたので、一つ目が該当するはず。。
そう思って見てみると、

```java:Lesson04_04UserRepository.java
package jp.co.sss.training.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.training.entity.Lesson04_04User;


import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.training.entity.Lesson04_04User;

public interface Lesson04_04UserRepository extends JpaRepository<Lesson04_04User, Integer> {
	Lesson04_04User findByDepartmentId(int departmentId);
}
```

これだと一行分のデータしか入らない、、
しかし、今回は私は格納すべきデータは３行分。
なので、

```java:Lesson04_04UserRepository.java
package jp.co.sss.training.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.training.entity.Lesson04_04User;

public interface Lesson04_04UserRepository extends JpaRepository<Lesson04_04User, Integer> {
	List<Lesson04_04User> findByDepartmentId(int departmentId);
}

```

このように書けば無事できました！！
複数行分のデータを格納する時は、List型にするのを忘れずに^^;
Concernのアンチパターン

普段何気なく使用しているConcernについて調査してみた。

## Concernとは？
Railsにはデフォルトで`app/controllers/concern`と`app/models/coecern`ディレクトリが用意されている。

Concernの用途としては、特定のロジックや機能などをConcernとして分離させ他のコントローラーやモデルでも再利用できるようにする。

### 使用例
基本は`ActiveSupport::Concern`をextendしてconcernを作成し、associationやscope,クラスメソッド等も切り離すことができる

```rb
module M
  extend ActiveSupport::Concern
  
  included do
    has_many :posts
    scope :disabled, -> { where(disabled: true) }
  end

  class_methods do
  end
end
```

`ActiveSupport::Concern`をextendしない場合は下記のように書く必要があり、少々わかりづらい。
```rb
module M
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      has_many :posts
      scope :disabled, -> { where(disabled: true) }
    end
  end

  module ClassMethods
  end
end
```

https://api.rubyonrails.org/v7.0.4.2/classes/ActiveSupport/Concern.html

自分が実務でconcernを使用したときは、複数のFormオブジェクトで共通したattributeやバリデーションを書く必要があったので、concernを利用した。
実装した後に思ったが、concernを用いずに継承を用いても今回の用件は実現できるのはできた、、
自分の中でどちらが良いのかいまだにハッキリとわかっていないのでわかり次第追記します、、

```rb
module SpecificService::User
  extend ActiveSupport::Concern

  include ActiveModel::Model
  include ActiveModel::Attributes

  included do
    attributes :email, :string

    validates :email, presence: true
  end
end
```

### 今回調査したアンチパターン

**ビジネスロジックをconcernで共通化するの**はアンチパターンに当たるらしい。

具体例
```rb
class UserController < ApplicationController
  include RecentUser

  def index
    @users = recent_user
  end
end

module RecentUser
  def recent_user
    User.order(id: :desc).limit(3)
  end
end
```
ビジネスロジックはモデルに寄せるのが基本なので、上記のような場合はUserモデルにビジネスロジックを追加したほうがいい。







## 参考記事
[我々はConcernsとどう向き合うか  株式会社ウィルネット https://blog\.willnet\.in › entry › 2019/12/02](https://blog.willnet.in/entry/2019/12/02/093000)
【intramart】BloomMaer+LogicDesingerで添付ファイルを同ウインドウ右半分に表示するイメージ



## 添付ファイル未表示時
![ファイル未表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609679/7d32732d-1b57-879b-5515-bbd6d6f03b17.png)

## 添付ファイル表示時
:::note warn
表示可能な拡張子
.PDF、.PNG、.JPEG、.TXT
:::
![ファイル表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609679/4794b1bb-7947-c877-e0bb-acc0e3fae2d2.png)
Java_RPGのPlayerクラスを継承で記述１

paizaラーニングforTEAM Java入門編
レッスン8の#05

```Java:8-#05
// RPGのPlayerクラスを継承で記述　その1

public class Main {
    public static void main(String[] args) {
        System.out.println("== パーティーでスライムと戦う ==");

        Player hero = new Player("勇者");
        Player warrior = new Player("戦士");
        Player[] party = {hero, warrior}; // party配列にPlayerオブジェクトを要素にする
        
        // Player型のmemberでparty配列から要素を取り出す
        for (Player member :party) {
            member.attack("スライム");
        }
        // hero.attack("スライム");
    }
}

class Player {
    public String myName;

    public Player(String name) {
        myName = name;
    }

    public void attack(String enemy) {
        System.out.println(myName + "は、" + enemy + "を攻撃した!");
    }
}
```
Amazon Elastic Beanstalkへのデプロイで502 Bad Gatewayにハマった

# はじめに
プログラミング初学者です。
アプリ開発会社で短期インターンをしながらエンジニア転職を目指して日々勉強しています。
間違いなどありましたらご指摘いただけますと幸いです🙏

初めて作成したアプリをAWSへデプロイしようとしましたが色々とハマってしまいました。。。
まずはデモ用のアプリをデプロイしてみたのでまとめてみました。
# 環境・前提
- Amazon Elastic Beanstalkでアプリケーション作成済み
- AWS CLIとEB CLIインストール済み
- Express
# やったこと
#### 1. デモ用のExpressアプリを準備
```
# ディレクトリ構成
├── index.js
├── package-lock.json
├── package.json
└── .gitignore
```
```index.js
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("demo用のアプリです。");
});

app.listen(3000, () => console.log("3000番ポートで起動中。"));
```
```package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    // 追記
    "start": "node index.js" 
  }
```
```
# ローカルで起動確認。
$ node index.js
```
#### 2. デプロイ実行
```
$ eb init
$ eb deploy
```
デプロイは成功したがアクセスできない。。。
![スクリーンショット 2023-03-18 17.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281994/ff92b511-fcfc-dd5b-bbec-a60219db4b86.png)
ヘルスを確認すると、、、
![スクリーンショット 2023-03-18 17.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281994/b6cd6b85-a30e-ac41-8d6b-19b66539698b.png)
ログを確認してみる。
```
----------------------------------------
/var/log/nginx/error.log
----------------------------------------
2023/03/18 08:35:58 [error] 4183#4183: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.24.8, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "172.31.45.211"
```
ポート番号が8080になっておらず接続に失敗しているっぽい。
`index.js`を以下のように修正して再度デプロイしてみる。
```index.js
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("demo用のアプリです。");
});
// 修正
app.listen(8080, () => console.log("8080番ポートで起動中。"));
```
無事にアクセスできるようになりました！
![スクリーンショット 2023-03-18 17.52.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281994/dad01522-7730-85f9-099c-20e6037348ae.png)
# 参考記事
https://tech-blog.tsukaby.com/archives/397
Thinreportsのlistを使っている時に、ページ毎で表示を切り替えたりしたい

# 問題

Listを使っている場合、`add_row`していってListの`details`部分を増やしていくが、この場合どのタイミングで改ページ（page break）が起きてるのかわからない

# 解決

`list.manager`というオブジェクトがどうやら`page_count`を持っているので、これを`on_page_finalize`でチェックしてデータを操作する。

```rb
list.on_page_finalize do
  # page_countは0が1ページ目
  unless list.manager.page_count == 0
    list.header.item(:something).hide # 1ページ目以外では隠すとか
    list.header.value({
      a: 123 # とか
    })
  end
end
```

https://github.com/thinreports/thinreports-generator#list
32x32のドット絵をSVGで包んで拡大する

フルオンチェーンNFTは画像をオンチェーンにする必要があります。画像のサイズがガス代に直結するので **できるだけ小さいサイズ** にしたいですが、 **32x32のドット絵という制約下ならなにか工夫できるかも？** ということでやってみました。

## サンプル画像

以下のサンプル画像をEthereum Goerliテストネットに **やっつけコントラクト** でデプロイして確認しました。
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30716/e7b95c85-dbdd-6290-ae6b-daa4334f45de.gif)

|属性|値|
|---|---|
|フォーマット|GIF|
|画像サイズ|32x32ピクセル|
|カラー|インデックスカラー、128色|
|データサイズ|1,139バイト|

## SVGのパスに変換してみる

直感的にはパスに変換するとむしろ大きくなるんじゃないかな？というところですが、変換してくれる素晴らしいサイトがあったので、とりあえずやってみました。
[ドット絵用 svg コンバーター](https://riqrique.invitro.work/svg_converter/)

|属性|値|
|---|---|
|フォーマット|SVG|
|データサイズ|10,904バイト|

まあそうですよね。

## GIFのまま

サンプル画像のGIFをそのまま使ってみました。テストネットのOpenSeaで見るとこんな感じ。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30716/4a966f39-6131-6c44-541d-14040a0221ba.png"/>

32x32ですね😂
大きく表示して欲しいですが、そのためにデータサイズはあまり大きくしたくはありません。



## SVGで包んで拡大する

そこでタイトルです。
画像はそのまま32x32で使い、SVGのimageタグで拡大してみました。
widthとheight、 **image-renderingにpixelated** を指定すると、変に補正がかからずドット絵としてはいい感じに拡大してくれます。

~~~xml
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1280" height="1280">
  <image xlink:href="data:image/gif;base64, ＜Base64にした画像データ＞ width="1280" height="1280" image-rendering="pixelated"/>
</svg>
~~~

|属性|値|
|---|---|
|フォーマット|SVG|
|データサイズ|1,774バイト|

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30716/ff4b22b9-f864-3fe5-8c0a-2a6544052b71.png"/>

これなら大きく表示してくれました😁

## 参考サイト

* [【保存版】フルオンチェーンNFTの作り方_完全版（入門レベル）](https://note.com/standenglish/n/ne2f5f684faae)
Next.jsのapi routeでbase64化されてものをデータとしてresponseしたい

```ts
const data = // base64化されたデータ
res.setHeader("Content-Type", "application/pdf") // データの種類に合わせる
res.setHeader("Content-Disposition", "inline;") // どう表示したいかに合わせる
res.status(200).send(Buffer.from(data, "base64")) // bufferを直接送れる
```
# Data URL
`[<mediatype>][;base64],<data>`のように

- 最初にヘッダーのようなものがあり
- `,`
- base64データ

という構成の場合は、カンマ以降の部分だけを取り出す必要がある。

```ts
cosnt dataURL = "..."
const data = dataURL.split(",")[1]
```

# atob

巷によくあるサンプルコードだと`atob`を使っているが、nodeではdeprecatedになっているので、`Buffer.from`を使ってBufferに変換する。そうするとBufferは直接send出来る。

https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/Data_URLs

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition

https://nodejs.org/api/buffer.html#bufferatobdata
Java_メソッドのオーバーライド

paizaラーニングforTEAM Java入門編
レッスン8の#04

```Java:8-#04
// メソッドのオーバーライド

// 親クラスが持つメソッドを子クラスで再定義できる

public class Main {
    public static void main(String[] args) {
        Box box = new Box("鋼鉄の剣");
        box.open();
        
        System.out.println();
        
        MagicBox magicbox = new MagicBox("ものまねモンスター");
        magicbox.look();
        magicbox.open();
    }
}

class Box {
    public String myItem;

    public Box(String item) {
        myItem = item;
    }

    public void open() {
        System.out.println("宝箱を開いた。" + myItem + "を手にいれた。");
    }
}

class MagicBox extends Box {
    public MagicBox(String item) {
        super(item);
    }

    public void look() {
        System.out.println("宝箱は妖しく輝いている。");
    }
    
    // openメソッドをオーバーライド
    public void open() {
        System.out.println("宝箱を開いた。" + myItem + "が襲ってきた！");
    }
}
【メモ】ChatGPT利用の履歴

テレビでも取り上げられて広く範囲で評判がよさそうで、なんとなくChatGPTを使いたくなったので、
使い始めていく履歴を残してみる。
AIはデータを食って成長するから、自分の持ち物じゃないデータは食わせない方が安全なので、抽象的な調べ物が多くなる気がする。

## 検索
今まで「検索ワード」を知らないとそもそも検索できなかったので、あのアレなんだっけ、みたいな知らない名詞を探すのにつかってみると便利
【例】
Q.ウェブサイトの画面でカーソルをあわせると浮き上がる説明文の名前ってなんでしたっけ?
A.それは「ツールチップ（tooltip）」と呼ばれるUI要素です。ツールチップは、マウスカーソルがプロセッサーに置かれたときに、通常は短いテキスト説明を表示するために使用されます。機能を説明するために使用されることがあります。

## ロール（役割）を与えての相談
便利そうな使い方が紹介されていたので、ちょうど書いていた、2022年度の振り返りに、何か書けばいいのか教えてもらった。
[ChatGPTユーザーの悩みを解決するプロンプト](https://logmi.jp/business/articles/328359)
![ChatGPT質問.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121941/9217c77f-e8d0-c278-6b4a-36ee6a02a2a1.png)
Java_引数ありのコンストラクタ

paizaラーニングforTEAM Java入門編
レッスン8の#03

```Java:8-#03
// 引数ありのコンストラクタ

// コンストラクタはnewというキーワードを使い、オブジェクトを作るときに呼び出される
// コンストラクタはメソッドではない
// コンストラクタにはクラスと同じ名前をつける

public class Main {
    public static void main(String[] args) {
        Box box = new Box("鋼鉄の剣"); // Boxオブジェクトを作るときに宝箱の中身を指定
        box.open();

        System.out.println(); // 空の行を出力

        JewelryBox jewelryBox = new JewelryBox("魔法の指輪");
        jewelryBox.look();
        jewelryBox.open();
    }
}

class Box {
    public String myItem;
    
    // Boxオブジェクトを作るときに宝箱の中身を指定できるようにする
    // そのためにコンストラクタに引数を指定する
    public Box(String item) {
        myItem = item; // コンストラクタの引数をメンバー変数に代入_メンバー変数の初期化という
    }

    public void open() {
        System.out.println("宝箱を開いた。" + myItem + "を手にいれた。");
    }
}

class JewelryBox extends Box {
    // コンストラクタはメソッドと違って親クラスから引き継がれない
    // 子クラスで引数のあるコンストラクタを使う場合は子クラスでも引数のあるコンストラクタを記述する必要がある
    // 子クラスのコンストラクタで親クラスの、引数のあるコンストラクタを呼び出す必要がある
    public JewelryBox(String item) {
        super(item); // super(item)で親クラスのitemを引数にもつコンストラクタを呼び出す_super()はコンストラクタの1行目に書かなければいけない
    }
    
    public void look() {
        System.out.println("宝箱はキラキラと輝いている。");
    }
}
C#でWindowsFormのアプリ終了時の処理を記述してみる

# 1. はじめに
* WindowsFormアプリケーションを終了する時に処理する内容をまとめて記述したい
* アプリの終了のパターンによって動作する、しないを把握しておきたい

# 2. 開発環境
* C#
* .Net6
* Visual Studio 2022
* Window 11


# 3. サンプルプログラム
## 3.1. フォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/53a4dac2-6561-2e87-ac95-bd892e386672.png)

* CloseMainFormボタン
    * 単純にフォームを閉じる
* ApplicationExitボタン
    * Application.RunメソッドをExitする
* EnvironmentExitボタン
    * フォーム起動前にアプリを閉じる

## 3.2. プログラムソース
```csharp
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        //ApplicationExitイベントハンドラを追加
        Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    }

    private void CloseMainFormButton_Click(object sender, EventArgs e)
    {
        // フォームを閉じる
        this.Close();
    }

    public void Application_ApplicationExit(object sender, EventArgs e)
    {
        MessageBox.Show("アプリケーションが終了されました");

        //ApplicationExitイベントハンドラを削除
        Application.ApplicationExit -= new EventHandler(Application_ApplicationExit);
    }

    private void ApplicationExitButton_Click(object sender, EventArgs e)
    {
        //Application.RunメソッドをExitする
        Application.Exit();
    }

    private void EnvironmentExitButton_Click(object sender, EventArgs e)
    {
        //アプリケーションの強制終了
        Environment.Exit(0);
    }
}
```

* FormのコンストラクタでApplication.ApplicationExitイベントを使用することでアプリケーション終了を知ることができる

# 4. 動作確認
## 4.1. CloseMainFormボタン
* 〇 ```Application_ApplicationExit```メソッドが呼び出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e38de8a6-62f3-d979-47b4-3d0ff596e057.png)

## 4.2. ApplicationExitボタン
* 〇 ```Application_ApplicationExit```メソッドが呼び出される
* ただし、デバッグで設定したメッセージボックスは表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/42d0818c-72d4-4f83-b2a8-a46061d5879e.png)

## 4.3. EnvironmentExitボタン
* × ```Application_ApplicationExit```メソッドが呼び出されない

## 4.4. ヘッダーの閉じるボタン
* 〇 ```Application_ApplicationExit```メソッドが呼び出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e38de8a6-62f3-d979-47b4-3d0ff596e057.png)

# 5. 結論
* Application.ApplicationExitイベントでアプリケーション終了を通知する場合、アプリケーションの強制終了(```Environment.Exit(0)```)は通知されないため注意する
* Application.RunメソッドをExitする場合、メッセージボックスの表示がわからない現象が発生するため注意する

# 6. 参考文献

https://yuyu-code.com/programming-languages/c-sharp/application-exit/
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/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# オーガニックメディアと有料ソーシャルメディア

ソーシャルメディア上でマーケティングキャンペーンを成功させるためには、オーガニックメディアと有料ソーシャルメディアの両方を組み合わせて使用する必要がある場合があります。

| 種類 | 内容  | 
| :--- | :--- | 
| オーガニック・メディア |有料のプロモーションを必要としません。| 
| 有料メディア | ソーシャルメディア上でお金を払って行うマーケティング | 


有料ソーシャルメディアは、特定のオーディエンスをターゲットにした有料広告やスポンサーのマーケティング・メッセージをソーシャルメディア・プラットフォームに表示することを含みます。

- ソーシャルメディア・プラットフォームに広告費を支払うことで、特定のオーディエンスにコンテンツを共有することができます。
- 関連性の高い広告を展開したり、オーガニック・コンテンツをブーストするための費用を支払うことで、新規顧客とリピーターの両方に、より効果的にリーチすることができます。

# 有料ソーシャルメディアの種類

| 種類 | 内容  | 
| :--- | :--- | 
| ペイパークリック広告 |誰かが広告をクリックするたびに支払う広告の一種  | 
| ブランド・コンテンツ | 第三者の製品、ブランド、またはスポンサーによって作成されたすべての投稿 | 
| インフルエンサー・生成コンテンツ |ブランドの製品やサービスを促進するインフルエンサーによって作成されたすべての投稿  | 

ソーシャルメディア広告は、投稿の近くにある「sponsored」または「promoted」タグで見分けることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/78fd0e2d-4142-0c9f-57a4-2a49abe891d7.png" width="400">

# 有料ソーシャルメディアのメリット

### <font color="MediumBlue">ブランドの認知度を高める</font>

オーディエンスのフィードの目立つ位置に広告を配置することができます。これは、たとえオーディエンスがあなたのことを検索していなかったり、あなたのブランドに関連するものをフォローしていなかったとしても、オーディエンスの注意を引くのに役立ちます。

### <font color="MediumBlue">オーディエンスに素早くリーチできる</font>

- オーガニックの投稿は、プラットフォームのアルゴリズムにより、オーディエンスが目にするまでに数日かかることがあり、この時間は、特に短期間のキャンペーンを実行している場合、リードを失う可能性があります。
- 有料ソーシャルメディアでは、ユーザーのフィードにおける投稿のランクを上げることができるため、人々が投稿を目にするまでの時間を短縮することができます。

### <font color="MediumBlue">最も関連性の高い顧客をターゲットにすることができる</font>

- 特定の年齢層や地域の人々にのみ広告を配信するようなキャンペーンを設定することができます。
- フォロワーや以前の顧客、Webサイトから離脱した人をターゲットにしたキャンペーンを作成することもできます。

プラットフォームには、ユーザーが設定できる広告プリファレンスがあり、ユーザーが興味を持っている内容に基づいて広告を見ることができます。広告ターゲティングのパラメータを設定することで、広告をクリックする可能性が最も高い人々に広告を表示させることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5b31dffc-6152-0087-511d-9aa544d92a29.png" width="500">

### <font color="MediumBlue">リマーケティングの機能を高める</font>

リマーケティングとは、Webサイト、アプリ、またはソーシャルメディアのプロフィールを訪問したことのある顧客に対して、有料広告を表示することです。

ソーシャルメディア・ユーザーがWebサイトにアクセスすると、リマーケティング広告をソーシャルメディア上で複数回、異なるフォーマットで送信することができます。ユーザーがリマーケティング広告を見た場合、競合製品よりも貴社の製品を購入する可能性が高くなります。

- 例えば、ユーザーがあなたのWebサイトで既に見ていたシャツのリマーケティング広告を、彼らのソーシャルメディアプロファイルで見た場合、そのシャツは、彼らが購入しようとするときに、彼らの頭の中にある可能性が高くなります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/12c0a665-e39d-5871-1d56-0fc3eec46204.png" width="500">


:::note info
有料のソーシャルメディアは、マーケティングキャンペーンの成功率を高めることができます。
:::
Java_クラスを継承する

paizaラーニングforTEAM Java入門編
レッスン8の#02

```Java:8-#02
// クラスを継承する

public class Main {
    public static void main(String[] args) {
        Box box = new Box();
        box.open();
        
        System.out.println();
        
        JewelryBox jewelrybox = new JewelryBox(); // JewelryBoxのコンストラクタを呼び出してJewelryBoxオブジェクトを作成
        jewelrybox.look(); // lookメソッドを実行
        jewelrybox.open(); // openメソッドを実行
    }
}

// 親クラスを作る
class Box {
    public String myItem; // メンバー変数を用意
    
    // コンストラクタで宝箱の中身を表す変数myItemに"新しいアイテム"をセット
    public Box() {
        myItem = "新しいアイテム";
    }
    
    // メソッドを定義
    public void open() {
        System.out.println("宝箱を開いた。" + myItem + "を手に入れた。");
    }
}

// 親クラスを継承して子クラスを作る
class JewelryBox extends Box {
    // メソッドを追加
    public void look() {
        System.out.println("宝箱はキラキラと輝いている。");
    }
}

// クラス間の差分に着目してコードを記述すればよい

```
django3 議事録1

# djangoとは
Pythonで実装されたwebアプリフレームワーク

# ざっくりな流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/cbf9f53d-a013-ff39-1ae4-289a8127eee8.png)


# アプリの構成（ベストプラクティス？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/5bd04890-df8d-594a-e0f4-49b898f0ac51.png)

# APIを持つ場合は、こう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/fafa8403-81ae-fee6-1c92-5b7910d23102.png)

# setting.py
```
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'], ←ここを修正
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
```
BASE_DIRはmanage.pyがある場所を指す。この場合manage.pyのある階層のtemplatesを指す

```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todo.apps.TodoConfig',　←追加
]
```
新しいアプリケーションを使う際に記載が必要
今回だと、以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/6d270668-022d-1c41-8a6d-a02014c3bf7a.png)

# models.py
データを効率的の扱えるようにする仕組み（DB）
```
from django.db import models

# Create your models here.

class TodoModel(models.Model):
    title = models.CharField(max_length=100)
    memo = models.TextField()

    def __str__(self):
        return self.title
```
○○fieldは種類が結構あるので他で参照

# mikemigrationsとmigrate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/3320419c-0d62-e0df-decb-c0b938f9c010.png)

mikemigrations
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/577d9938-3f67-10d9-758d-7ab87c534f34.png)

migrate
urlのadminで入れる
ユーザー作成は以下
python3 manage.py createsuperuser
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/77396104-4829-b0ee-aacd-9d94cd2f7f9d.png)

html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/95d39d83-fe40-7743-f8d7-e726e452af70.png)

# どういうwebアプリに何に向いているか（触った感触）
- 管理機能系（付属DBでいいなら小さい機能なら直良）
- ヘルパー関数でユーザー単位に権限がつけれる、またログインチェックなど用意されており容易に実装可能
```
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login


def loginfunc(request):
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return render(request, 'login.html', {'context': 'logged in'})
        else:
            return render(request, 'login.html', {'context': 'not logged in'})
    return render(request, 'login.html', {'context': 'get method'})
    
```

djangoでCRUDwebアプリ作りたいんだ！って人向けな気がする。またはモノレポ向け
【RTA in 無職】OSCP合格 any% glitchless 半年

# TRY HARDERは嘘

always try smarter before harder.
#### この記事需要あるか？

OSCPに無事合格したのでその過程を説明する記事。
こんな事が重要なんだフーンくらいに斜め読みしてほしい。

## TL;DR.

ぶっちゃけどれくらいやるの？と言われると、私は100台近く攻略した、絶対落ちないように念には念を入れて準備をした。
人によっては10台攻略しただけでコツ掴んで合格したという報告もあるので時の運もあると思う。

正直OSCP LABの価値は複数ネットワーク環境であって、proxychainsを通した反応を見れることにあると思う、それとAD環境が２つあること。

この記事に限らず合格体験記を読み漁ろう。
THM Linux/Windows　Privescを完璧にする。
ぶっちゃけテキストはざっと１週目を通して２週目にしっかり読むのがよさそう。私は最終的に３週した。

３か月で受かるの正直キツイので先にProving Grounds Playの問題をVulnhubからDLしたり、Practiceを契約しよう、ぶっちゃけPracticeのHard Machinesがスラスラ解けるならOSCPなんて余裕。



情報はOnenoteに纏める


# 6月
何の準備も無しにOSCPを購入、正直今になって思うと大馬鹿も大馬鹿な決断だったと思う。

３日掛かって解けません！みたいな状況でLearning Path Machinesの攻略もおぼつかない。Forumsを濫用して踏み倒していくスタイルだった、正直学習法としては非常に効率が悪かったと思う。

# 7月
１日１台レベルには解けるようになっていた記憶、それでもフォーラム便りで正直無理だよねこれじゃって感じだった
多分20台くらいが攻略数

# 8月
EXAMが近づいていたのでone noteの整理と既に解いたマシンの復習に時間を掛けることに、正直この判断は間違っていなかったが単純に実力が足りておらず・・・
ここまで多分25台くらい

### EXAM
不合格おめでとう
多分50点くらいは取れてたんじゃないだろうか？という感じ
この辺から、この資格難しくね？と本気で集中しだすようになる。
正直OSCPを舐めていた。

# 9月
TryHackMeで時間を潰す
Windows/Linux PrivEscのroomを行い、Offensive Pentestingを完全制覇。
だがAD部分は完全にOSCPを越えているのでやらなくてよいと感じた。

# 10月
HTB、VulnhubやProving Groundsで時間を潰す

Proving Groundsのplayはvulnhubから拾ってきて無料で解くことができる。
proving groundsの一月契約がなんやかんやでいいかもしれない、OSCPをはるかに超える難易度の物もあるが、いわゆるCTF nonsenseな問題がない。

# 11月
１月契約でOSCPラボを55マシン攻略
踏み台無しのマシンはスラスラ解ける、踏み台ありのマシンは正直コマンドに時間かかりすぎてウンザリぎみで解いていた。


### EXAM
5時間で合格、満点。OneNoteを徹底して「これ見たことあるわ！スラスラ」とできたのと、Enumeration Checklistに限らずとにかく全てを疑って１行１行細かく見るようになったのが大きな違いだったと思う。


# 総括

hacktricks、GTFObinsは常に見る。
ippsecは神、見ておく。

これから受ける人にお勧めする方法は

1.まずはProving grounds playにあるマシンをvulnhubから拾って攻略する。
2.tryhackmeのWindows/Linux Privescルームは必ずやる。
3.Proving Grounds Practiceを契約する、mediumあたりは大体解けますよくらいまでは練習したい。
4.OSCPを契約する、この時点である程度慣れていて、踏み台無しで転がっているマシンはなぎ倒せるくらいの実力がついているとヨシ。
【Ubuntu20】複数のJavaを同一マシンにインストール＆使い分ける方法、まとめ

Linux環境で複数のJDKを使い分けております。（OpenJDK,OracleJDK、RedhatJDk等）
下記の４つの記事がどれもよく纏まっていると思いますので、紹介しておきます。
尚、個人的には①が一番、わかりやすかった。

alternativesと言うツールで環境の切り替えをしました。 
これは、同時にインストールされた、同機能を提供するソフトや、 バージョンの異なるソフトを管理するためのユーティリティー。　alternativesに登録しておくことで簡単にバージョンを切り替える事が可能。


①Ubuntu Linux 20.04 LTSにOpenJDK 17をインストールする
https://kazuhira-r.hatenablog.com/entry/2021/11/13/161119

②LinuxにOpen JDK(17)をインストール & alternativesでバージョン切り替え
https://developers-trash.com/archives/664

③Ubuntuで、複数のJavaをインストールして切替を行う
https://qiita.com/yochapan/items/af86a320035f8db7daf4

④　CentOSのalternativesでJavaのバージョン管理
https://www.task-notes.com/entry/20150530/1432954800

********************************
以下の様に、update-alternatives に登録しましましょう！　（Oracle JDK８の場合）
登録には、--installのコマンドを使用。
オプションは[作成するリンクパス] [管理名] [実体のパス] [優先度]の順番。

```
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_351/bin/java 1
```

JDKの切り替えは下記。
```
sudo update-alternatives --config java

 Selection    Path                                         Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      manual mode
* 2            /usr/lib/jvm/jdk-19/bin/java                  4         manual mode
  3            /usr/lib/jvm/jdk1.8.0_351/bin/java            1         manual mode
  4            /usr/lib/jvm/jdk1.8.0_361/bin/java            1         manual mode
```

登録解除はこちら。
```
sudo update-alternatives --remove java /usr/lib/jvm/jdk1.8.0_351/bin/java
```
VMware Cloud Disaster Recoveryを使ってみる。（その４）

# その４：Recovery SDDCの構築を行う
## はじめに
:::note warn
このBlogはエンジニアさん向けのナレッジ提供を目的としています。
内容は極力精査して書いておりますが、保証されるものではありません。
ご了承ください。
:::
## おさらいと今回の流れについて ##
前回は、VMware Cloud Disaster Recoveryで保護した仮想マシンをメインサイトに戻せるかを
説明しました。今回はRecovery SDDC（災対復旧先）を作成します。

その前に、補足ですがRecovery SDDCの作り方は２種類あります。
1. パイロットライト（既に稼働為ているSDDC）にVCDRから復元する方法
1. 新規デプロイ（VCDR専用にSDDCを構築する方法）

今回は新規でデプロイを行う2番を説明します。

### 準備するもの
以下は事前に準備されているものとしています。
- Recovery先のSDDCとリンクするVPCおよびENI用のサブネット
- SDDCマネージメント用のアドレス設計
- VCDR Proxyをセットアップするためのサブネット

## 今回のゴール
今回のゴールは以下を設定します。
- 災害復旧用のSDDCを作成完了すること

## Recovery SDDCのDeploy
- VCDRのコンソールからRecovery SDDCにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/aec12f1e-61b6-23ed-7f77-e98036e2ff52.png)
- ADD RECOVERY SDDCを押下し、新規で作成するSDDCのパラメータを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/c39a8079-8a88-8664-7696-1f6407e02ece.png)
それぞれパラメータを入れていきます。すべて入力が終わったらNextを押下します。
・Management Subnetは/23が最小となります。（vCenterとかESXとかNSXなどが動くサブネットです）
・Compute Subnetはワークロード（ユーザのVM）が動くサブネットです。
・Proxy SubnetはVCDRのサービスVM（Proxy VM）が動くサブネットです。こちらは最小/26が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/708d905d-2540-0e39-6ca4-1b7e3c18b04f.png)
・最後にENI（Native VPCと接続するためのSubnet）を選択します。
・DEPLOY SDDCと入力して、DEPLOYを押すとRecovery SDDCのDeployがスタートします。

:::note info
ENIのSubnetなどは予め作成しておくことをお勧めします。
:::

- DEPLOY中のCloud Service Console（VMC側の画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/a495f8ea-3dcb-0032-3c2c-d71b301bc26b.png)

- DEPLOY中のVCDRの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/78116911-5f06-4319-4cd5-459cab0012bd.png)

- 約２時間後に完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/357cd17f-8c08-bd7c-604d-413d2fae1d2b.png)

## Recovery SDDC 初期設定
- 作成されたSDDCは、設定が何も入っていません。
必要に応じて以下の設定を実施します。
・vCenterにアクセスするためのMGWのGateway Firewallの設定
・オンプレミス環境からのVPN接続の設定
・L2延伸などを利用する場合は、HCXのセットアップ
・ENIやVPNで通信する場合のCGWのGateway Firewallの設定
・コンテンツライブラリの登録（必要なければ不要）
::: note info 
特にHCXのセットアップは１時間程度はかかるため、一番最初に実施することをお勧めします。
::: 
- L2延伸のセグメントをDRの対象としている場合は、HCXセットアップ後に以下を行っておきます。
・オンプレミス（災対接続環境）からサイトペアリングの設定
・サービスメッシュの構成
・L2延伸対象のVLANのL2延伸処理（SDDC側にセグメントを作っておく意図です。）
また、災対時にHCXを利用する想定の拠点には、予めHCX COnnectorとNetwork Profileをインストールしておきましょう。

- DeployされたRecovery SDDCには、見慣れないデータストアがマウントされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/010d565a-55de-a103-b687-0d3b4b75df0c.png)

## まとめ
- 必要な時間
Recovery SDDCの作成は、パラメータ入力後に2時間程度
HCXのセットアップが、SDDC ConsoleからDeployを押してから1時間程度

- 実施する内容
デプロイ前
・Native VPC側のENI Subnetの作成
・アドレス設計
・HCX Connectorのセットアップ（オンプレミス側）
デプロイ後
・CGWのGateway Firewal設定
・MGWのGateway Firewall設定
・HCXの接続
・VPN接続
・（必要に応じ）L2延伸の作成

## 次回は・・・
いよいよ、VCDRから仮想マシンのリカバリプランの作成となります。
最後までご覧いただき、ありがとうございました。
古いMacBookAirにUbuntu22.04を入れようとしてキーボード配置が日本語にならず困った話

こんにちは。@Esperna です。

# 背景
[柴田芳樹さん](https://youtrust.jp/users/yoshiki_shibata)という人が翻訳した[LINUXシステムの仕組み](https://book.impress.co.jp/books/1121101019)という本があります。
2022年3月に発売された本でMacとdockerの環境で叩ける範囲でコマンドを叩きながら
一回通しで読みました。が、最近、[技術読書会](https://technical-book-reading-2.connpass.com/)が開かれており参加してます。
せっかくなので、自宅の古いMacの仮想環境にUbuntu入れて、
Macやdockerでは動かせなかったコマンドを叩いてみようと思ってLinux環境構築を始めてみたら色々ハマったので備忘録としてメモを残します。

# 環境
### MacBook Airの環境

```
プロセッサ:Intel Core i5
OS: Ventura 13.1
Virtual Box: 7.0.6
Install image: ubuntu-ja-22.04-desktop-amd64.iso
キーボード:日本語
```

# terminalが開かない

* 仮想環境でUbuntu をinstallすると、まずterminalが開かない

## 原因 

localeの言語関連の設定でLANGUAGEがen_USとなっており、
UTF-8になっていなかったのがまずかったようです。

## 対処
terminalが開かずエディタが使えないので、
/etc/default/locale をgeditで開いて、下記の通りLANGUAGEをja_JP.UTF-8にし、再起動しました。

![locale_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/39463699-40ba-cef9-e45f-b59b02280d8b.png)

# sudoが実行できない

## 原因
Ubuntuユーザにsudoの実行権限がなかったです。

## 対処
suでログインして、下記コマンドでユーザをsudo groupに追加し、再起動しました。

```
gpasswd -a username sudo
```
ちなみに上記コマンドによりsudoグループにuserが追加されるようです。

```
username@UbuntuJa2204:~$ cat /etc/group | grep username
sudo:x:27:username
username:x:1000:
```

# キーボードが日本語配置にならない

## 原因

Ubuntu22.04ではデフォルトのX Window SystemがWaylandになっているが、
Mozcで「英数、かなキー」を使って日本語入力を切り替える際に不具合があるようです。

## 対処

[【Linux】Ubuntu22.04LTSのキーボードをMac同様に英数、かなキーを使って日本語入力する
](https://namileriblog.com/linux/ubuntu22-04_keyboard_setting/#i-2)に従って**Ubuntuログイン前にUbuntuではなくUbuntu on Xorg**を選択して、

```
sudo dpkg-reconfigure keyboard-configuration
```
を実行し、Ubuntuを再起動してみたら、キーボードが日本語配置になりました！
(ただし、キーボードのレイアウトはUSしか表示されないです。が、実用上困らないので気にしないことにしました。)
これで、'lspci'とか'udevadm'とMacやdockerで動かせなかったdevice関連のコマンドが動かせます。やったー！

# 参考

* [terminal not opening on ubuntu22.04 on virtual box](https://askubuntu.com/questions/1435918/terminal-not-opening-on-ubuntu-22-04-on-virtual-box-7-0-0)
* [【Linux】Ubuntu22.04LTSのキーボードをMac同様に英数、かなキーを使って日本語入力する
](https://namileriblog.com/linux/ubuntu22-04_keyboard_setting/#i-2)
[AWS Q&A 365][Serverless]AWSのよくある問題の毎日5選 #8

# 1. サーバーレス開発者ガイドの目的は何ですか？
答え：サーバーレス開発者ガイドの目的は、サーバーレスソリューションを構築するために必要なコアサービスの学習パスを提供し、開発者がサーバーを管理せずに顧客に役立つコードを書くことに焦点を当てるように役立つことです。

# 2. サーバーレスのユースケースは3つのタイプがありますか？
答え：サーバーレスのユースケースの3つのタイプは、インタラクティブ（同期）、ストリーミング、バックグラウンドデータ処理（非同期）です。

# 3. ガイドが焦点を当てているコアサーバーレスサービスは何ですか？
答え：ガイドでは、サービスセキュリティのためのAWS Identity and Access Management、コンピューティング機能のためのAWS Lambda、HTTP/Sリクエストを他のサービスと統合してリクエストを処理するAmazon API Gateway、データの格納と取得のためのAmazon DynamoDBなど、いくつかの基本的なサーバーレスサービスに焦点を当てています。

# 4. ガイドのサービススターターの目的は何ですか？
答え：ガイドのサービススターターの目的は、各サービスの価値と技術的な基本事項を素早く説明し、必要に応じて詳しく調べることができる機能を紹介することで、開発者が基本事項から始められるようにすることです。

# 5. サーバーレス開発者ガイドは生きている文書ですか？
答え：はい、サーバーレス開発者ガイドは、サーバーレスの旅で新しい開発者が必要とする主要なトピックで拡張される生きた文書であり、他の人が成功したサーバーレスソリューションを構築するのを助けるための提案が歓迎されます。
chatgpt api gpt-3.5-turbo を php で使う

https://qiita.com/ma7ma7pipipi/items/c08bf5adbec86fc2c761

の準備を済ませてから、

以下を読み込ませる

```
use Illuminate\Support\Facades\Http;
```


```hoge.php
$messages = [
    [
        'role' => 'system',
        'content' => "あなたはしりとりのプロです。入力に応じて、しりとりをしましょう"
    ],
    [
        'role' => 'user',
        'content' => "りんご"
    ],
    [
        "role"=>"assistant",
        "content"=>"ごりら、ごんぎつね、ごしょがわらの3つの中から選択して"
    ]
];

//string(99) "ごんぎつねでしょうか。それでは、「ねこ」でしりとりを続けましょう。"


//use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
    'Content-Type' => 'application/json',
    'Authorization' => 'Bearer ' . config('app.open_ai_secret')
])->post('https://api.openai.com/v1/chat/completions', [
    'model' => 'gpt-3.5-turbo',
    'messages' => $messages,
    'max_tokens' => 500,
]);

if ($response->failed()) {
    echo 'Error: ' . $response->status();
} else {
    $result = $response->json();
    var_dump($result['choices'][0]['message']['content']);
}
```

たったこれだけで使えます。


# レスポンス

```hoge.php
$messages = [
    [
        'role' => 'system',
        'content' => "あなたはジャニオタ"
    ],
    [
        'role' => 'user',
        'content' => "2000年代の日本のアイドルといえば誰ですか？"
    ],
];
```

`2000年代には様々な日本のアイドルが活躍していました。その中でも代表的なアイドルグループとしては、Morning Musume、AKB48、モーニング娘。やハロー！プロジェクト、倖田來未、浜崎あゆみ、嵐、NEWSなどが挙げられます。`


# 会話をくっつける

```hoge.php
$messages = [
    [
        'role' => 'system',
        'content' => "あなたはジャニオタ"
    ],
    [
        'role' => 'user',
        'content' => "2000年代の日本のアイドルといえば誰ですか？"
    ],
    [
        "role"=>"assistant",
        "content"=>"2000年代には様々な日本のアイドルが活躍していました。その中でも代表的なアイドルグループとしては、Morning Musume、AKB48、モーニング娘。やハロー！プロジェクト、倖田來未、浜崎あゆみ、嵐、NEWSなどが挙げられます。"
    ],
    [
        "role"=>"user",
        "content"=>"上記の中で女性だけのアイドルグループは？"
    ]
];

```

`女性だけのアイドルグループはMorning Musume、モーニング娘。、AKB48、ハロー！プロジェクトの一部のグループ（Berryz工房、℃-uteなど）です。`



# 女の子人格を与える

```
$messages = [
    [
        'role' => 'system',
        'content' => "命令:あなたは、20代の女性です。女の子っぽく答えてください。"
    ],
    [
        'role' => 'user',
        'content' => "2000年代の日本のアイドルといえば誰ですか？"
    ],

];

```

`かわいい服装やダンスで人気を博したモーニング娘。やAKB48が代表的な2000年代の日本のアイドルですね♪`
って感じで返答きた。

以上
[AWS Q&A 365][Serverless]Daily Five Common Questions #8

# 1. What is the goal of the serverless developer guide? 

Answer: The goal of the serverless developer guide is to provide directed learning paths for the core services needed to build serverless solutions and to help developers shift their mindset to focus on writing code that serves customers without managing servers. 

# 2. What are the three types of serverless use cases? 
Answer: The three types of serverless use cases are interactive (synchronous), streaming, and background data processing (asynchronous). 

# 3. What are the core serverless services that the guide focuses on? 
Answer: The guide focuses on a few essential serverless services to get started, which are AWS Identity and Access Management for service security, AWS Lambda for compute functions, Amazon API Gateway for integrating HTTP/S requests with other services that handle the requests, and Amazon DynamoDB for data storage and retrieval. 

# 4. What is the purpose of the service starters in the guide? 
Answer: The purpose of the service starters in the guide is to quickly explain the value and technical fundamentals of each service and to mention advanced topics so that developers can start with the essentials and be aware of capabilities to dive into when needed. 

# 5. Is the serverless developer guide a living document? 
Answer: Yes, the serverless developer guide is a living document that will expand with key topics new developers need on their serverless journey, and suggestions are welcome to help others start building successful serverless solutions.
JAVA学習の記録⑥　【コンストラクター】


前回までの学び[JAVA学習の記録⑤　【オーバーロード】](https://qiita.com/rion0726ittoti/items/890eb2fb32e9f50ec1a1) 

# 目次
 1.コンストラクター
 2.this
 3.デフォルトコンストラクター


# コンストラクター
コンストラクターとは、インスタンスが生成されるタイミングで呼び出される特殊なメソッド。***インスタンスを生成する際に必須の初期処理がある***場合に使う。コンストラクターを使うと、インスタンス生成時に引数として初期値を渡すことができる。
これまでの処理
```java:UseDog.java
public class UseDog {
  public static void main(String[] args) {
    Dog pochi = new Dog(); //Dogのpochiインスタンスを生成
    pochi.setName("ポチ"); //フィールドに名前を設定
    pochi.setAge(5);       //フィールドに年齢を設定
```
コンストラクターを使った場合
```java:UseDog.java
public class UseDog {
  public static void main(String[] args) {
    Dog pochi = new Dog("ポチ",5);
```
## コンストラクターの定義
コントラクターの定義は、通常のメソッドの定義と似ているが、違いは***メソッド名は必ずクラス名と同じにすること、戻り値の型の指定を書かないこと。***
```java
public Dog(String n, int a) {
  //処理
}
```
```java
アクセス修飾子 クラス名(引数の型 引数名) {
  //処理
}
```
引数のないコンストラクターを呼び出す場合
```java:Dog.java
public class Dog {
  String name = "引数なしの場合";
  public Dog() {
    System.out.println(name);
  }
```
```java:DogConstructor.java
public class DogConstructor {
  public static void main(String[] args) {
    Dog pochi = new Dog();
  }
} 
```
出力結果
```
引数なしの場合
```

引数のあるコンストラクターを呼び出す場合
```java:Dog.java
public class Dog {
  String name = "引数ありの場合";
  public Dog(String name) {
    System.out.println(name);
  }
```

```java:DogConstructor.java
public class DogConstructor {
  public static void main(String[] args) {
    Dog pochi = new Dog("引数ありの場合に表示");
  }
} 
```
出力結果
```
引数ありの場に表示
```

## このインスタンスを表すthisキーワード
コンストラクターでフィールドを初期化する時に、引数の変数名がフィールドの変数名と同じにできる。つまり、フィールド名と同じ名前のローカル変数が定義できる。***しかし、フィールド名と同じ名前のローカル変数がある場合、ローカル変数へのアクセスとなる。***フィールド名と同じ名前のローカル変数がある場合に、フィールドにアクセスしたいときは、明示的に「this.フィールド名」と記述する。
```java:Dog.java
public class Dog {
  private String name; //nameフィールド定義
  private int age;     //ageフィールド定義
  public Dog(String name, int age) {
    System.out.println(name); //nameは、引数で渡されたローカル変数nameを示す
    System.out.println(this.name); //this.nameは、nameフィールドを示す
    this.name = name; //引数で受けたローカル変数nameをnameフィールドに代入
    this.age = age;  //引数のローカル変数ageをageフィールドに代入
  }
```

# デフォルトコンストラクター
クラスに１つもコンストラクターが定義されていない時に、デフォルトコンストラクターというコンストラクターが暗黙的に追加される。デフォルトコンストラクターは、引数もなく、中の処理もないコンストラクターであるが、ないと引数なしでインスタンスを生成することはできない。引数のあるコンストラクターを追加した場合は、デフォルトコンストラクターは追加されない。

参考文献
「いちばんやさしいJAVAの教本」著者　石井真
Movable Type個人無償版をインストールしてみた！

今回とても久しぶりにMovable Typeをインストールしてみました。
本来Movable Typeには、おまかせインストールと言う機能がありますので、いくつかの準備をするだけで、インストールできるはずなのですが、色々つまずいて苦労しました。

１・Zip解凍後のファイルが多すぎたり、大きすぎたりするためFTPソフトでアップロードしても時間がかかるだけでなく、途中で何度も停止したり、アップできないファイルが出たりで、アップロードが終わるまで目を離すことができません。

２・サーバー側の仕様が変わっていたりで、Movable Typeが設置できなかった。

などなど

ファイルサイズについては、zipファイルのままサーバーにアップロードし、解凍用のPHPで展開する方法で、なんとかクリアできました。

https://www.osslicense.jp/mt_personal-2023install/
Excelを使ってデータベースを呼び出す

Excelを使ってデータベースを呼び出す実験をやったことがあったのでまとめてみようと思います。


<h1>まずはMySQLを利用できるようにする</h1>
参考にしたのはこちらの記事

https://blog.proglus.jp/1595/

まずはXAMPPをインストール
https://www.apachefriends.org/jp/index.html

基本的に記事通りに実施していけば環境構築できます。

続いて
Microsoft .NET Framework
https://www.microsoft.com/en-us/download/details.aspx?id=30653

Microsoft Visual C++ Redistributable for Visual Studio
https://visualstudio.microsoft.com/ja/downloads/#microsoft-visual-c-redistributable-for-visual-studio-2022

MySQLWorkbench
https://www.mysql.com/jp/products/workbench/

立て続けにインストール。

MySql Workbenchが利用できるようになったら、上部タブのserverからData Exportを選択してsqlを出力してください。

参考記事
https://macoblog.com/mysql-workbench-export/


<h1>Excelの設定をする</h1>
参考にした記事はこちら

https://a1-style.net/how-to-connect-to-mysql-from-microsoft-excel-odbc/


Excelとデータベースを繋ぐにはドライバをインストールする必要があるので、以下サイトから「ODBC Driver for MySQL (Connector/ODBC)」をインストールしてください。
https://www.mysql.com/jp/products/connector/
![スクリーンショット (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290841/17c6af88-3283-bd9a-86dd-fc7cb1515193.png)


そうしたらExcelを開いて外部データの取り込み>データの取り込みと進みます。
![スクリーンショット (58).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290841/a0086019-8356-1911-aeb8-a5b4b7b3b8f0.png)

新しいソース
![スクリーンショット (59).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290841/f95c21df-a3a0-d325-6e37-53fcdbd6a17d.png)
ODBC DSNと進んで次へを押すとMySQLと書かれているかと思います。
![スクリーンショット (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290841/e5c55f5c-e3c4-2e4e-5428-7b588f368527.png)

そうしたら前項で出力したデータベースを選択して読み込むことができます。


本当はMysqlとExcelを常に同期させたかったんですが当時の僕(2020年）はそこまで出来なかったのでそのうちチャレンジしたいです。
TCP/IPについて調べてみた

### はじめに

TCP/IPの知識を整理したかったのでこちらの記事を書きました。内容としては初心者向けの内容になります。


### TCP/IPとは？
インターネットにおいて広く標準的に利用されている通信プロトコル。

### プロトコルとは？

ネットワークで通信するときに、コンピュータやネットワーク機器が守らなければならない仕組みのこと


### IPとは？

Internet Protocolの略称。
インターネットのプロトコルということで通信を行う際の規約という意味。
IPによって構成されるネットワークでは、コンピュータやネットワーク機器などを識別するために、IPアドレスを割り当てて管理している。

IPはネットワークにおける経路機能を担当している

### TCPとは？

Transmission Control Protocolの略称。
IPの上位層であるトランスポート層のプロトコルの一つ。
通信相手とのコネクションを確立してから、データを送受信する(コネクション型通信)。
パケットの順序や送信エラー時の再送などを制御して、送受信するデータの到達性を保証する。
信頼性は高いが利用速度は低速となる。

主な用途
メールの送受信、ファイル転送など

### UDPとは?
User Datagram Protocolの略称。
TCPと同様にトランスポート層のプロトコルの一つ。
事前に送信相手と接続確認を取ったりせず、一方的にデータを送信する(コネクションレス型通信)。
データの到達性の保証を行わないため、利用速度は高速だが信頼性が低い。

主な用途
音声通話、動画ストリーミングなど

### TCP/IPでデータはどのように送られているのか？

TCP/IPはパケット交換方式でデータを転送している。
パケットとはネットワークではヘッダ(送信先、送信元などの情報)とデータ(テキストデータや制御の命令、応答など)から構成される。
TCP/IPネットワークで配送されるパケットのことを、IPパケットまたはIPデータグラムと呼ぶ。
TCP/IPネットワークでは、IPデータグラム単位でデータの配送、エラー処理が行われる。

## TCP/IPの階層モデル

TCP/IPにおける階層モデルは4階層から構成される。

![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884906/a4005100-6ef5-b086-ba85-4ed231bc6801.png)


これら4つの機能をそれぞれモジュールとし、それらを直列に並べたように構成することで、TCP/IPの通信が実現される。

### アプリケーション層

ユーザーがコンピュータ上で動作させるアプリのこと。
電子メールのメールソフトやWebなどがそれにあたる。
アプリケーションプログラムを実行するための環境は、トランスポート以下のモジュールによって提供される。

### トランスポート層

アプリ間で通信できるようにする役割。
通信を行う際のポート番号の管理とデータエラーのチェックなどを行う。
先程記載したTCP,UDPなどがここに該当する。
ポート番号を管理を行うことによって、送受信されるデータがどのアプリにより送信されたものか、また、どのアプリが受信するべきデータなのかを管理することができる。
データエラーのチェックは、ネットワーク中を転送されたデータが、ノイズや機器の故障などで破壊されていないかなどをチェックしてくれる。

### インターネット層

通信目的のコンピュータまでバケットを届ける役割。
IPがここに該当する。
ブラックボックス化されたネットワークの内部では、IPで通信制御が行われ、最終目的地までデータが届けられる。
ただしIPは、データの到達性に関する信頼性を持っていないため、信頼性が必要になる場合には、トランスポートモジュールの技術であるTCP上でIPを利用することになる。
TCPが信頼性のないIPをコントロールしている。

### ネットワークインターフェイス層

ネットワークを構成するハードウェアと、インターネットモジュールを結ぶ役割。







#### 参考
[基礎からわかるTCP/IP　ネットワークコンピューティング入門　第3版](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8BTCP-IP-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E6%9D%91%E5%B1%B1/dp/4274050734)
Swiftで学ぶClean Architecture

# Swiftで学ぶClean Architecture
Clean Architecture（クリーンアーキテクチャ）は、Robert C. Martin（通称 Uncle Bob）が提唱した、ソフトウェアアーキテクチャの一つです。Clean Architectureは、ソフトウェアシステムをレイヤーで分割し、各レイヤーがどのような役割を持ち、どのようにコードを構造化するかを明確にすることで、システムの保守性、テスト可能性、柔軟性を高めることを目的としています。

本記事では、Swiftを用いてClean Architectureを実践するための手順を説明します。具体的には、以下の3つのレイヤーを用意し、それぞれの責務を明確にします。

1. Domain Layer（ドメイン層）
2. Data Layer（データ層）
3. Presentation Layer（プレゼンテーション層）

## Domain Layer
Domain Layerは、アプリケーションのビジネスロジックを表現するレイヤーです。このレイヤーには、以下の要素が含まれます。

Entities（エンティティ）
Use Cases（ユースケース）
Repositories（リポジトリ）

エンティティは、ビジネスロジックにおける重要なオブジェクトを表現するためのクラスや構造体です。ユースケースは、アプリケーションのビジネスルールを表現するためのクラスや構造体です。リポジトリは、データ層とのインターフェースを提供するためのプロトコルです。

以下は、エンティティの例です。

```
// MARK: - Entity
struct User {
    let id: Int
    let name: String
    let email: String
    let age: Int?
}
```

## Data Layer
Data Layerは、データの永続化やネットワーク通信など、外部のリソースとのやりとりを担当するレイヤーです。このレイヤーには、以下の要素が含まれます。

Repositories（リポジトリ）
Data Sources（データソース）
リポジトリは、Domain Layerとのインターフェースを提供するためのプロトコルです。データソースは、リポジトリが実際にデータを取得するための実装です。

以下は、リポジトリの例です。

```
// MARK: - Repository
protocol UserRepository {
    func fetchAllUsers() -> [User]
}
class UserRepositoryImpl: UserRepository {
    
    func fetchAllUsers() -> [User] {
        // データベースやAPIからユーザー情報を取得する処理
        let user1 = User(id: 1, name: "John", email: "hoge@o.vom", age: 23)
        let user2 = User(id: 2, name: "Jane", email: "hage@o.vom", age: 22)
        return [user1, user2]
    }
}
```

## Presentation Layer
Presentation Layerは、ユーザーインターフェースを担当するレイヤーです。このレイヤーには、以下の要素が含まれます。

View Models（ビューモデル）
Views（ビュー）
ビューモデルは、ビジネスロジックを表現するためのクラスや構造体です。ビューは、ユーザーインターフェースを表現するためのクラスや構造体です。

以下は、ビューモデルの例です。

```
// MARK: - View Model
class UserListViewModel {
    
    private let userRepository: UserRepository
    
    init(userRepository: UserRepository) {
        self.userRepository = userRepository
    }
    
    func fetchAllUsers() -> [User] {
        return userRepository.fetchAllUsers()
    }
}
```

ビューモデルは、ユースケースに応じてデータを取得し、ビューに表示するためのインターフェースを提供します。

最後に、ビューの例を示します。

```
// MARK: - View
class UserListViewController: UIViewController {
    
    private var viewModel: UserListViewModel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let userRepository = UserRepositoryImpl()
        viewModel = UserListViewModel(userRepository: userRepository)
        
        let users = viewModel.fetchAllUsers()
        print("ユーザ情報: \(users)") 
        // ユーザ情報: [CleanArchitectureSample.User(id: 1, name: "John", email: "hoge@o.vom", age: Optional(23)), CleanArchitectureSample.User(id: 2, name: "Jane", email: "hage@o.vom", age: Optional(22))]

    }
}
```
ビューは、ビューモデルを介してデータを取得し、処理を行います。

以上が、Swiftを用いたClean Architectureの実践手順です。各レイヤーの役割を明確にし、それぞれの責務を分離することで、システムの保守性、テスト可能性、柔軟性を高めることができます。
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/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# ソーシャルメディア・レポートの効果的なプレゼンテーション

デジタルマーケティング担当者は、プレゼンテーションが仕事の一部です。たとえ明確で説得力のあるソーシャルメディア・レポートを作成したとしても、データ、その分析、そしてその分析に基づいて下した決断をオーディエンスに理解してもらうためには、それをうまくプレゼンテーションする必要があるのです。

### <font color="MediumBlue">重要なポイント</font>

- レポートを提出する際には、共有するデータについて重要なポイントをオーディエンスに理解してもらう必要があります。

### <font color="MediumBlue">感情的なつながり</font>

- しかし、それだけではなく、聴衆と感情的なつながりを持ちたいものです。オーディエンスの感情に訴えかけることで、聴衆の関心を引き、興味を持続させることができます。
    - 例えば、前四半期にLinkedInのソーシャルメディア利用者が30%増加したのであれば、その喜びを伝えましょう。
    - また、驚くような統計データや面白い逸話、ソーシャルメディア上で特に好評だったカスタマーレビューをプレゼンテーションに盛り込むのもよいでしょう

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bdd8dd82-2579-2f2d-c57d-f4e29cd6f9a9.png" width="600">

### <font color="MediumBlue">自分のペースで</font>

- オーディエンスがついていけるように、自分のペースでゆっくり話し、文章を短くし、意図的にポーズをとるようにしましょう。"building on this point" や "as I mentioned before" などのフレーズを使い、セクション間の移行を行うことで、聴衆がデータについて気づいたことをプレゼンテーションを通して誘導することができます。


### <font color="MediumBlue">質問時間</font>

- プレゼン中も定期的にオーディエンスに質問をしているかどうかを確認しましょう。オーディエンスがソーシャルメディアの用語や指標に馴染みがない場合は、その定義を説明する必要があるかもしれません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/67ab6fa5-6e2a-8905-53da-df7c50296bac.png" width="600">

### <font color="MediumBlue">柔軟に対応</font>

- 例えば、誰かが突然プレゼンテーションを抜けなければならなくなったり、他の参加者が遅れて到着したり、質問に答えるのに予定より時間がかかったりする可能性があります。もし、プレゼンテーションを短縮しなければならなくなった場合、どのようなアプローチを取るか考えてみましょう。最も重要なポイントを把握し、万が一の場合はそのポイントのみを伝えるようにしましょう。
- オーディエンスにとって何が最も重要かによって、議論の軸を変える準備も必要です。
    - 例えば、聴衆の中に財務アナリストや上層部がいる場合は、コンバージョンに関連するデータの議論に時間を割きたいと思うかもしれません。

### <font color="MediumBlue">十分な準備</font>

- 十分な練習をすることで、ぎこちない言い回しなどの問題点を発見することができます。
- プレゼンの前に少し緊張しがちな人も、しっかり準備することで緊張を鎮め、自信を持つことができます。
- 事前に準備をすることで、オーディエンスから寄せられるであろう質問の種類を特定し、それに対する答えを考えることができますし、オーディエンスの誰かが戦略的な決定について懸念している場合、それを正当化するための準備をする時間もできます。
    - 例えば、ソーシャルメディア・マーケティングの取り組みを新しいプラットフォームに拡大したいが、それを効果的に行うためのリソースがあるかどうか心配するマネージャーがいるとします。このような反応を事前に想定しておくことで、新しいプラットフォームへの拡張が適切な戦略であると考える理由と、それを可能にするためのリソースの再配分をどのように計画しているかを明確に説明することができるのです。
- 事前に準備をするために、チームのメンバーにプレゼンテーションの練習をし、フィードバックや質問、懸念事項を共有してもらうとよいでしょう。
printfを使えるようになるnpmパッケージを公開しました(TypeScript)

# リンク
- https://www.npmjs.com/package/printf-for-ts
- https://github.com/YumaHozumi/printf-for-typescript


# まえがき
「C言語のprintf関数がTypeScriptでも使えたら便利だな」という発想から、printfを使えるパッケージを作成しました。ゼロパディングを使おうとしたときに、めちゃくちゃ面倒な実装が必要だったので、もういっそのことprintf使えるようにしちゃえということで。

# printfとは
テキストを出力するために非常に便利な関数です。printf関数は、指定された文字列を画面に表示することができます。一応例も書いときます。
```C
int number = 42;
printf("The answer is %d", number);
// The answer is 42　と出力
```

# ライブラリの使用方法
```
npm install printf-for-ts
```

# 実際に使ってみる
こんな感じで使えます。基本的にprintfでよく使うものには対応できてるはずです！構文もC言語のprintfと同じです。
```typescript
import { Format } from 'printf-for-ts';

console.log(Format.printf("整数: %03d, 浮動小数点数: %.3f, 文字列: %s, 16進数: %x", 42, 3, "Hello, world!", 10));

// 整数: 042, 浮動小数点数: 3.000, 文字列: Hello, world!, 16進数: a
```

よかったら使ってね👋