OmniAICreator/Qiita-1.07M huggingface dataset:
【Rust】actix-webのmiddleware実装でハマったところ

# はじめに
　現在個人利用するためのTRPGのサポートwebアプリを開発中。
 　その中で、試しにログイン機能を付けようと試みた。
  　github-Copilotのチャット機能を活用しながら進めていたが、actix-webのバージョン更新に伴い作り方が変わっていたので覚書として残しておく。

## 各種バージョン
rustc 1.78.0
cargo 1.38
actix-web 4.5.1

## 変更点
Transformのジェネリクス
 -> Requestをwhere節ではなくジェネリクスに入れる。

## 実際の実装

まず入口のTransform。
これがCopilotに提案された実装
```rust
use actix_web::{HttpRequest, Error, middleware, dev::ServiceRequest, dev::ServiceResponse, dev::Service};
use futures::future::{Ready, ok};
use futures::Future;
use std::pin::Pin;
use std::task::{Context, Poll};

pub struct JwtValidator;

impl<S, B> middleware::Transform<S> for JwtValidator
where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static,
    B: 'static,
{
    type Request = ServiceRequest;
    type Response = ServiceResponse<B>;
    type Error = Error;
    type InitError = ();
    type Transform = JwtValidatorMiddleware<S>;
    type Future = Ready<Result<Self::Transform, Self::InitError>>;

    fn new_transform(&self, service: S) -> Self::Future {
        ok(JwtValidatorMiddleware { service })
    }
}
```
過去のバージョンの記事などを参照するとこれで問題ない。
このまま実装するとTransformとtype Requestでコンパイルエラーが発生する。

[公式のドキュメント](https://actix.rs/docs/middleware/)を参照すると、少し記法が変わっている。
```rust
use crate::servicies::auth_service::verify_token;
use actix_web::{dev::Service, dev::ServiceRequest, dev::ServiceResponse, dev::Transform, Error};
use futures::future::{ok, Ready};
use std::pin::Pin;
use std::task::{Context, Poll};

pub struct JwtValidator;

impl<S, B> Transform<S, ServiceRequest> for JwtValidator
where
    S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static,
    B: 'static,
{
    type Response = ServiceResponse<B>;
    type Error = Error;
    type InitError = ();
    type Transform = JwtValidatorMiddleware<S>;
    type Future = Ready<Result<Self::Transform, Self::InitError>>;

    fn new_transform(&self, service: S) -> Self::Future {
        ok(JwtValidatorMiddleware { service })
    }
}
```
 これまでRequest = ServiceRequestとしていたところをServiceRequest直書きでよくなったらしい。

 これはServiceの方でも同様の変更がなされている。

 ## 終わりに
 github-Copilotのおかげでだいぶスムーズに個人開発で勉強を進められている。
 しかし、バージョン変更に対して弱いのでまだまだ自力で調べる能力は必要と感じた。
【VSCode】固定したタブを別の行に表示する方法

`workbench.editor.pinnedTabsOnSeparateRow` を有効にすると固定したタブが別の行に表示されます。

![pinned-tabs-on-separate-row.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/73a5c80d-e179-0e32-3386-882feb99618f.gif)

また `window.density.editorTabHeight` を `conpact` に設定することでタブの高さを低くできます。

![editor-tab-height-compact.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c7fbfbe4-39fc-bfa5-172a-eef361f9aea2.png)

さらに `workbench.editor.wrapTabs` を有効にするとタブが折り返されるようになります。

![tabs-wrap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2ea890fb-3b8b-8135-b74d-d68d85810105.gif)
【JavaEE】CDIのDI

## まえがき
研修でJavaEEを学んでいる中で、CDIのインジェクションに苦しみました。とりあえず、現時点で理解したところまでを備忘録として書き留めました。

## CDIとは
簡単に言うと、newを使わずにインスタンス化する仕組みのことです。
Context and Dependency Injectionの略で、訳は「コンテキストと依存性注入」。
今回はDIの部分である依存性注入についてまとめます。

### 結局何がいいのか

- クラス間の依存関係を弱くしてくれる（疎結合に）
    - テストしやすくなる
- インジェクトするクラスとされたクラスのスコープを互いに独立関係にできる

## 依存性注入

通常、とあるクラスで別のクラスのオブジェクトを使う場合、

```java:Game.java
public class Game {
    Tire dice = new Dice();
    public void CreateGame(){
        start(dice);
    }
    ...
}
```
というようにnewを使ってインスタンス化する。そしてCarクラスとTireクラスには依存関係が生じる。
CDIを使うと、

```java:Game.java
public class Game {
    @Inject Dice dice;    // CDIからインスタンス化
    public void CreateGame(){
        start(dice);
    }
    ...
}
```

@Injectで変数`car`に`Carオブジェクト`を代入することができる。
tireについてのコンストラクタが含まれていない分、依存関係が弱くなるらしいが、ここがいまいちわからない。

### 疎結合により得られるメリット

例えば、Daoによりデータベースにアクセスする記事Webアプリを作るときに、
本番用`ArticleDao`とテスト用`ArticleTestDao`を使うとする。
通常であれば、テスト用Daoを使うときと本番用Daoを使うときとで、Daoを呼び出す部分で以下コメント部分を書き換えないといけない。

```java:Article.java
public class Article {
    ArticleDao articleDao = new ArticleDao();    // ここをArticleTestDaoに
    return articleDao.findArticleById(id);
}
```

しかしCDIを使うと、テストと本番の切り替えは、呼び出したいDaoにスコープを付けるだけですむ。
呼び出し側のクラス名はそのままでよい。

```java:ArticleTestDao.java
package dao;

@RequestScoped    // 呼び出したいクラスにスコープを付ける
public class ArticleTestDao implements ArticleDao {
    @Override
    public void findArticleById() {
    ...
    }
    ...
}
```
【Windows 11 Home】Windows Update を 100年 停止する方法

## Windows Update は完全停止不可
Windows は OS の世代を進めるごとに Windows Update を勝手にするように変更しています。
設定面でも、一時停止機能しかなく完全停止はできません。
( Windows IoT Enterprise という高価格産業モデルなら可能 )

## 各方面に迷惑と手間が発生する
勝手に Windows Update が行われると、

PC が再起動したり、
前バージョンで動作していたアプリが動作しなくなったり、

こうなると、電話がかかってきてしまいます。

再起動だけならまだしも、もしアプリが動作しなければ、
更新内容をアンインストールして一時しのぎをしたり、
最悪緊急で対応バージョンの開発をしなければならないでしょう。

しかし、規模が大きくなるとそれも無理があります。

## 更新の一時停止は 最大 5週間 という壁
これが一番の問題点だと考えていますが、

セキュリティの観点で考えられているとしても
「 5週間経つ前に手動で更新してね。 」
は全くユーザーフレンドリーではありません。

サーバーとの通信中や仕事中に突如再起動されたら、セキュリティがどうのこうのの前に文句のひとつも言ってしまうのはしょうがないでしょう。

納品する側としても、
互換性を保証できない以上 Windows のバージョンは一定で納品するしかありません。

そのために、更新の一時停止を長期間にして実質無効化する方法があります。

## レジストリで停止期間を延長する
:::note warn
レジストリは PC の深部に関わる重要な設定なので、
注意して操作してください。
:::

1) タスクバーの検索窓に「regedit」と入れてレジストリエディタを開きます

2) 下記パスまでいきます
「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings」

3) Settingsフォルダを右クリックして 新規、DWORD(32ビット)を選択してファイルを生成します

4) 作成したファイルの名前を「FlightSettingsMaxPauseDays」にします

5) 作成したファイルを開き、10進数にチェックを入れて値のデータに 36500 と入れます

6) 設定アプリの Windows Update を開きます

7) 更新の一時停止の項目が週刻みで約 100年分になっているので好きな値を選択します

※ 5 の「36500」は更新の一時停止項目の日単位の最大値です

## 小話
Microsoft の掲示板などを見た感じ、
今回の話はあまりよく思われない話ではあると思いますが、
需要はあると思いましたので書きました。

バックアップや暗号化などのリスク管理はしっかりしようね。
dbtプロジェクトをGitHubにPushする

## 本投稿について

前回の投稿：
Windows PCにdbt-Coreをインストールしてサンプルを実行する（https://qiita.com/saba0622/items/2c01e6d60ed67a335a7e）
の続きで、作成したGitリポジトリをGitHubと連携させる方法を記載します。

## 準備1. GitHub上にGitリポジトリを作成する

GitHubに自身のアカウントでサインインし、dbt検証用のgitリポジトリを作成します。
公開設定はPublicでもPrivateでも大丈夫です。

## 準備2. gitの初期設定を行う(必要な場合)

ローカルPCでGitの初期設定が未実施の場合、以下のコマンドを実行します。

```
> git config --global user.name XXXXX
> git config --global user.email "XXXXXX"
```

## ローカルのdbtプロジェクトファイルをGitHub上に登録する

dbtプロジェクトのディレクトリ上で下記gitコマンドを実行することにより、dbtプロジェクトの各ファイルをGitHubに登録します。

```
//ローカルにリポジトリ作成
> git init

// GitHub上に準備したリモートリポジトリに接続
> git remote add origin https://github.com/username/repositoryname.git

// リモートリポジトリの内容を1回pullしておく（これやらないと失敗した）
> git pull origin main

// ローカルのdbtプロジェクトファイルを全てインデックスに追加する
> git add .

//コミットする
> git commit -m "first commit with dbt"

//リポジトリにpushする
> git push origin main
```

## 以上です！

GitHub上のリポジトリにdbtプロジェクトのファイルが登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406801/888c4d5b-c4b0-77c5-777f-c9a0c981c8dd.png)
【AWS x Git】CloudformationのGit同期機能で気をつけるべき注意点2点

# 概要
AWS CloudformationのGit同期機能を実施しました。
差分確認や履歴保持にはとても良いですが、いくつか注意点もあるなと感じたので紹介します。

# 注意点
設定手順などは公式ドキュメントや他の方の記事をご参照ください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/git-sync.html


個人的に感じた注意点は以下の2点。

①手入力のパラメータを持つテンプレートが管理できない
②CloudformationのIAMロール権限が大きくなりがち

## ①手入力のパラメータを持つテンプレートが管理できない

例えば、以下のようなYAMLをGit同期してみます。

```sample-template.yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  RoleName:
    Type: String
    NoEcho: true

Resources:
  CloudWatchEventsRoleSample:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - 
            Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      RoleName: !Ref RoleName
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonEC2FullAccess
```

すると、同期時に以下のエラー。
`RoleName`に値がないといわれています。
これは、AWSマネジメントコンソールのCFスタック更新画面から更新する場合は、手入力でパラメータを設定できますが、Git同期機能ではできないため。

> Failed to create changeset. Couldn't call cloudformation for stack: sample-template and changeset: cloudformation-auto-sync-xxxxxx because of a validation error. The error was Parameters: [RoleName] must have values (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: xxxxxx; Proxy: null)

では、一度UIからアップロードして手動で値を手入力した後にgit同期機能に変更したらどうなるのか？

ひょっとして手動設定した際の機密ワードが裏で残ってて、git同期した時も引き継がれたりしないかな？という淡い期待を胸にいざ実行。以下はGit同期の際に必要となるスタックデプロイファイルというものです（Git同期時に自動で作成され、AWS botからPullRequestが飛んできます）。

```yaml
template-file-path: sample_app/sample-template.yaml
parameters:
  RoleName: '****'
tags: {}
```



エラーでした笑

> Resource handler returned message: "The specified value for roleName is invalid. It must contain only alphanumeric characters and/or the following: +=,.@_- (Service: Iam, Status Code: 400, Request ID: xxxxx)" (RequestToken: xxxxx, HandlerErrorCode: GeneralServiceException)

`'****'`という名前としてCfnに渡されてしまっています。
文字列として不適切なものが渡されているというエラーになってしまいました。それはそうか。

うーむ、とはいえ、DBの大事なパスワード情報とか、Githubに永遠に残すのはなんか嫌だなというのはありますよね...。
他のテンプレートは全てgitなのに一部だけgit連携しない、という状態になるとそれはそれで後々面倒になるなぁとも思います。

この点は、Git同期機能に完全移行！とはならない点だなと思いました。


## ②CloudformationのIAMロール権限が大きくなりがち

Git同期のIAMロールは公式ドキュメントにも記載あるので、そちら参考にすれば簡単です。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/git-sync-prereq.html

ただし、Cloudformation自体のIAMロールが少し面倒です。
というのも、今まで`AdministratorAccess`ロールをもつIAMユーザーでアップロードや編集できていたものが、今後はCloudformation自体が実行する必要があるためです。

そのため、`STS`だけではなく`iam:GetRole`などなど必要になったりで、権限が大きくなりがちだなと思いました。
基本的に権限周りは最小限にするのが鉄則。アクセスが自由なロールを不用意に使い回してしまうリスクは許容できたとしても、顧客によってはその説明・説得が必要となることもあるのでやや面倒かもです。社内システムなどでは問題なく使えるかもしれません。
AZ-700 Azure Network Engineer Associate 合格記

先日、AZ-700 Azure Network Engineer Associate　に合格したので
試験内容や試験対策について語ろうと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759764/43ea9533-fb38-60a9-f123-5e2dfc9bb8ef.png)


## AZ-700 Azure Network Engineer Associateとは
Azureの資格試験の一つで、ネットワークに関する知識を問われる試験です。
Azure上のネットワーク、負荷分散、DNS、オンプレ環境との接続(ExpressRoute/VPN)、負荷分散、プライベート接続などの知識を問われます

## 難易度
★2つなので中級扱いです
Azureのインフラをバリバリ触っていなくても、Azureの基礎を抑えたうえで
試験対策をしっかりやっていれば受かるレベルだと思います

## 試験対策
### 基礎学習
まずはMSLearnで試験範囲となるサービスの基礎を学びます。
https://learn.microsoft.com/ja-jp/training/paths/design-implement-microsoft-azure-networking-solutions-az-700/
これだけでは受かりませんが、基礎を抑えずに模擬問題を解いても歯が立たないので、避けられないステップだと思います

### 模擬試験
ざっと基礎を抑えたら、模擬試験サイトを使って
模擬試験を解く→出題されやすい箇所＆自分の苦手な箇所などの感触を掴む→その部分を重点復習→再度問題を解く、を繰り返します。
本番試験でも模擬試験でも、MSLearnでは触れられなかった箇所が当たり前に出てくるので
復習は個別にググったりChatGPTと壁打ちしたりして内容を確認していきます。

模擬試験サイトはいくつかありますが、私はExamTopicsを使いました。
https://www.examtopics.com/exams/microsoft/az-700/
実際の試験に近い内容が出題されたりします。

無課金でも50問程度は見ることが出来ます。
今回は幸いにも1発合格しましたが、もし不合格だったら課金したうえで数百問の問題集をやりこむつもりでした。
他の方の合格記ではUdemyやwhizlabsを使う方も多いようですが、ExamTopicsはアカウント作成不要で使えることと、以下のように解答の是非について利用者達が議論できるのでその会話を見ることで理解が捗るため、私はExamTopicsを重宝しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759764/61660904-fb9c-2aba-b065-a9b2bece5b9b.png)


## 試験受験＆結果
733点。ギリセーフ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759764/f505fbd6-f289-d173-d753-433b8ac418b7.png)

ExamTopicsではVPNやExpressRouteの内容が多く出題されており、実際試験でも出ましたが
それ以上にDNS関連の問題が多く出題され苦戦ました。
(15年ほどSEやってますが、実務でガッツリDNSを触る経験がなかったので苦手デス。。。 )

プライベートアクセスも、PrivateLink/サービスエンドポイントあたりはきちんと抑えてたはずなんだが・・・正解率やたら低いなぁ・・・

ま！受かったしいっか！！笑(^^♪



以上、これから受験する方のご参考になれば幸いです。

## 次の試験
これでAzure試験6冠達成。MS-900入れたらMicrosoft 試験7冠。
次は実務絡みでWindows Server Hybrid Administrator Associate(AZ-800＋AZ-801)を受けようかと思います。
(ただ試験2つ受かって資格1つって何か勿体ない気がする)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759764/8757acce-7d2c-4975-b3d0-927aa44f76e2.png)
【AtCoder】ABC301 D - Bitmask を二分探索問題と勘違いしていた(解けた)

# 【AtCoder】ABC301 D - Bitmask を二分探索問題と勘違いしていた

異端な解き方をしたようなのでメモ。

## 問題

https://atcoder.jp/contests/abc301/tasks/abc301_d

## 考えたこと

Sの長さは最大60。
?の個数も最大60。
→単調増加の世界にできたら二分探索ができそう。

### 二分探索できるか検討してみる

例えばN=184、S="10?1??0?"の場合を考えてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73072/1542cd14-2e36-0e41-9548-fe14917dca3e.png)

※図における「AC」と「WA」は公式解説動画の二分探索でよく使われている「正解ゾーン」と「不正解ゾーン」の意味。

?部分だけをbitとして持った64bit整数型で二分探索できそう。
ではどこから開始するか。
二分探索するためには絶対に正解であるACゾーンと、絶対に不正解であるWAゾーンを指定しなければならない。


### ACゾーンの決定

?が全て0だったら最小値なのでACとなり得るか？
→ NO。前述の例の場合、Nが143などであればACではない。しかし全ての?が0でN以下にできないならばこの時点で-1を出力して終了すれば良い。この前提を踏まえた上であれば、ACゾーンを0から開始して良い。

### WAゾーンの決定

これはシンプルに?を全て1にした場合の数+1と言える。前述の例で言えば190。この値は実現不可能なので正解になり得ない。

## 実装

```cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;

auto solve(string S, ll N) -> ll {
    vll indicies;
    for (ll i = S.size() - 1; i >= 0; --i) {
        if (S[i] == '?') {
            indicies.push_back(i);
        }
    }
    auto to_ll = [&](ll m) {
        string s(S);
        for (ll i = 0; i < indicies.size(); ++i) {
            s[indicies[i]] = (m >> i) & 1 ? '1' : '0';
        }
        ll n = 0;
        ll v = 1;
        for (ll i = s.size() - 1; i >= 0; --i) {
            n += v * (s[i] - '0');
            v *= 2;
        }
        return n;
    };
    if (N < to_ll(0)) {
        return -1;
    }
    ll ac = 0;
    ll wa = 1LL << indicies.size();
    while (wa - ac > 1) {
        ll wj = (wa + ac) / 2;
        if (N >= to_ll(wj))
            ac = wj;
        else
            wa = wj;
    }
    return to_ll(ac);
}
int main() {
    string S;
    cin >> S;
    ll N;
    cin >> N;
    cout << solve(S, N) << endl;
    return 0;
}

```
セキュリティ・チェック指南

情報セキュリティを日常チェックした方がよい指針や内容をまとめてみました。

### 必ずチェックしたいサイト
#### 米国（CISA）のサイバーセキュリティ・アラート＆アドバイザリ
https://www.cisa.gov/news-events/cybersecurity-advisories

以前はus-cert（United States Computer Emergency Readiness Team）として米国の緊急情報を発信していたが、現在はCISA（Cybersecurity and Infrastructure Security Agency）としてトータル的なセキュリティ情報を発信している。
※日本のサイトより半日ぐらい早い情報が確認できる。

#### JPCERT/CC
https://www.jpcert.or.jp

日本での中心的なセキュリティ・サイト。特に注意喚起情報はチェックがマスト。CISAよりワンクッションあるが、内容が精査されている。

セキュリティ情報を発信しているサイトはいっぱいあるが、企業あるいは組織の情報セキュリティ担当者としては、まず上記二つの公的サイトのチェックは必要であろう。自システムで該当している内容があれば、対応・対策を検討するように提言したい。

### 脆弱性識別子
#### JVN（Japan Vulnerability Notes）
https://jvn.jp/

日本におけるソフトウェアなどの脆弱性情報でJVN（Japan Vulnerability Notes）ナンバーが付されている。発見からベンダ確認経由して提示される情報なので遅延がある。利用している製品ごとの脆弱性情報を確認していた方が対応も早くできる。

脆弱性の指標とされる共通識別子として以下がある。

**CVE（Common Vulnerabilities and Exposures）共通識別子**・・脆弱性情報には種別に関わらず付される識別子。CVEを検索すれば対象の脆弱性情報を確認できる。年ごとにシリアルナンバーが付されている。
#### CVE識別番号管理サイト

https://cve.mitre.org/

**CVSS（Common Vulnerability Scoring System）共通脆弱性評価システム**・・脆弱性の深刻度を数段階で評価している。対応可否の目安となる。緊急あるいは重要評価項目は対応検討が必要である。

**CWE (Common Weakness Enumeration)共通脆弱性タイプ一覧**・・種類別にした一覧。参考にしたい。

### その他
#### オープンソース
Linuxなどオープンソースを利用してサーバーを構築している場合も多いと思います。
#### OSS脆弱性ブログ
https://security.sios.jp/category/vulnerability/

特にLinux kurnel情報は多く掲載されている。情報としてまとめられているサイト。実際はディストリビューションが異なるので、対象サイトで対応・対策を確認する必要がある。

#### フィッシング情報
#### フィッシング対策協議会
https://www.antiphishing.jp/

緊急情報となっているが、報告されたものを精査した情報である。警察庁などのサイトもあるが、フィッシング対策が主である。「不審なメールは開かない、アクセスしない」が基本で、セキュリティソフトでspam判定されたものは無条件で削除した方がいいだろう。
### 参考
某セキュリティソフトの担当者は **SNS（Xなど）** の情報が早いので毎日確認しているとのこと。ただし、　**SNSはフェイクやガセも多い**ので、自分で信頼できる発信情報を確保しておく必要がある。
雑誌系では、**日経クロステック**　がインシデントなどの詳細内容を掲載している。

各対策については、以下を参照してみてください。
#### サイバーセキュリティ経営ガイドラインと支援ツール
https://www.meti.go.jp/policy/netsecurity/mng_guide.html

#### 情報セキュリティ対策支援サイト
https://www.ipa.go.jp/security/sme/isec-portal.html

言うまでもないが、自組織・自社のアクセスログやアラート情報は常に確認し、必要なアップデートやパッチの適用は迅速に怠りなくおこなうようにしなければならない。
AWS ドキュメントを探す方法(API Reference)

# AWSドキュメントを探す方法
仕事をしていく上でドキュメントを読み込んで説明することはよくあることだと思います。
この記事はAWS各サービスのAPI Referenceドキュメントの探し方を解説します。

# AWS Documentation
以下のページのAll productsにサービス名を入力し検索しサービスのドキュメントページに遷移します。
https://docs.aws.amazon.com/en_us/
![screencapture-docs-aws-amazon-en-us-2024-06-04-23_10_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473825/c477ab55-592e-6e60-184c-d5fbd5126290.png)

今回はCloudTrailのページに飛びましたがCloudTrail API ReferenceをクリックすればReferenceにたどり着けます。
![screencapture-docs-aws-amazon-cloudtrail-2024-06-04-23_20_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473825/04ffcf94-fed9-d75d-5380-b82135c5c94b.png)
勾配ブースティング決定木の性能比較その2

昨日分類についての<a href="https://qiita.com/murasaki1994/items/851f7efb138b876d5ff3"勾配ブースティング決定木の性能比較</a>を書きました。

https://qiita.com/murasaki1994/items/851f7efb138b876d5ff3

今度は回帰について書いてみようと思います。
今回の手法は交差検証とR2でやってみます。
データはボストン住宅価格のデータセットです。

# 基本プログラムと時間
```Python3
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score
import pandas as pd
import matplotlib.pyplot as plt
import time

df = pd.read_csv("boston.csv")

y = df["PRICE"]
x = df.drop("PRICE", axis=1)

model = XGBRegressor()
start = time.time()
cvx = cross_val_score(model, x, y, cv=100)
end = time.time()
print("XGBoost :",end-start)

model = LGBMRegressor()
start = time.time()
cvl = cross_val_score(model, x, y, cv=100)
end = time.time()
print("LightGBM :",end-start)

model = GradientBoostingRegressor()
start = time.time()
cvs = cross_val_score(model, x, y, cv=100)
end = time.time()
print("Scikit-Learn :",end-start)
```
```
XGBoost : 22.83217167854309
LightGBM : 11.291792869567871
Scikit-Learn : 31.991723775863647
```
時間で見てみると分類と違って差は2倍と3倍みたいです。

# 精度の分布
## 要約統計量
```Python3
df_dcb = pd.DataFrame(cvx).describe()
df_dcb = pd.concat([df_dcb, pd.DataFrame(cvl).describe(), pd.DataFrame(cvs).describe()], axis=1)
df_dcb.columns = ["XGBoost", "LightGBM", "Scikit-Learn"]
df_dcb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/e801a267-8094-7de5-88f6-0b8962be8a77.png)

## ボックスプロット
```Python3
plt.boxplot([cvx, cvl, cvs], labels=df_dcb.columns, positions=[0, 1, 2])
plt.scatter([0, 1, 2], [sum(cvx)/100, sum(cvl)/100, sum(cvs)/100], marker="x", color="#000000")
plt.show()
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/4f4056ef-db52-f4ff-7d60-134369581080.png)

要約統計量を見る限り外れ値が大きすぎて平均値が低いみたいなので中央値で見てみると
Scikit-Learn>LightGBM>XGBoost
最大値で見ると
LightGBM>Sckit-Learn>XGBoost
となります。
精度の安定性で見ると
Scikit-Learn>XGBoost>LightGBM
みたいです。

# 結論
LightGBMがKaggleで使われるの納得ですわ。
精度と速さでは良いですね。ビッグデータになると速さは重要になりますので。
AWS Direct Connect

# はじめに
この記事はAWS SAA試験勉強のための、AWS Direct Connectに関する知識のまとめです。

# AWS Direct Connectとは
オンプレミスからAWSへの専用セットワーク接続を確立します。AWSと顧客のデータセンター、オフィス、またはコロケーション環境との間にプライベート接続を確立可能です。

専用線を設定するためには1か月程度の期間を要します。

## AWS Direct ConnectとVPN
オンプレミスのデータセンターからVPCに接続する方法としては、**Direct Connect**と**VPN**があります。

VPNはVPCにVGW(仮想プライベートゲートウェイ)をアタッチして、オンプレミスのルーター機器(CGW(カスタマーゲートウェイ))とIPsec暗号化通信で接続します。

:::note info
Direct ConnetはAWSとオンプレミス環境をつなぐもので、DynamoDBなどのAWSサービスとオンプレミス環境を繋ぐものではありません。
:::

:::note info
**VPNはインターネット回線を使って構築するので比較的容易に利用できるというメリットがありますが、その時その時のインターネット回線の利用状況に依存するため、通信状態が安定しないというデメリットがあります。**
:::
Direct Connectラインを二重化する方法も可能ですが、最もコストがかかる方式です。

複数のVPCを利用することで、2つのプロジェクト間でリソースとネットワーク構成を分離することができます。

## ホスト接続

AWS Direct Connectのホスト接続（Hosted Connection）は、AWS Direct Connectの機能の一つであり、AWSクラウドとオンプレミス環境を専用回線で接続するためのサービスです。ホスト接続は特に、データセンターやオフィスからAWSのサービスに高速で安定した接続を確立したい場合に利用されます。

ホスト接続は、AWS Direct Connectパートナープロバイダーを通じて提供されます。これにより、AWSが直接管理するよりも柔軟で迅速に接続を確立することができます。

## 転送コスト

すでにDirect Connectを契約している場合はインターネットよりDirect Connectを利用した方が転送コストを削減できます。
Javaプログラミング入門：ステップ8 デプロイとテスト

# Javaプログラミング入門：ステップ8 デプロイとテスト

ステップ8では、開発が完了したプロジェクトをテストし、本番環境にデプロイする方法について解説します。テストは品質を保証し、デプロイはユーザーに提供するために重要なプロセスです。

1. テストの実施
    - 単体テストの作成
    - 結合テストの実施
    - ユーザビリティテスト
2. デプロイ
    - 本番環境へのデプロイ
    - デプロイ後の確認とフィードバック

## 1. テストの実施

### 単体テストの作成

単体テストは、プログラムの各部分（メソッドやクラス）が正しく動作することを確認するためのテストです。JUnitを使用して単体テストを作成します。

#### JUnitの設定

Mavenプロジェクトの場合、`pom.xml`に以下の依存関係を追加します。

```xml
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
```
### 単体テストの例
``` java
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class EmployeeTest {
    
    @Test
    public void testEmployeeName() {
        Employee employee = new Employee();
        employee.setName("John Doe");
        assertEquals("John Doe", employee.getName());
    }
    
    @Test
    public void testEmployeeAge() {
        Employee employee = new Employee();
        employee.setAge(30);
        assertEquals(30, employee.getAge());
    }
}
```
#### 結合テストの実施
結合テストは、システムの異なる部分が正しく連携して動作することを確認するためのテストです。異なるモジュールやコンポーネント間のインターフェースをテストします。

### 結合テストの例
```java
import org.junit.Test;
import static org.junit.Assert.assertNotNull;

public class EmployeeServiceTest {
    
    @Test
    public void testEmployeeService() {
        EmployeeService employeeService = new EmployeeService();
        Employee employee = employeeService.getEmployeeById(1);
        assertNotNull(employee);
    }
}
```
### ユーザビリティテスト
ユーザビリティテストは、実際のユーザーがシステムをどのように使用するかを評価するテストです。ユーザーのフィードバックを収集し、システムの使いやすさを向上させます。

### ユーザビリティテストの方法
テストシナリオを作成する
テストユーザーを選定する
ユーザーにシステムを操作してもらい、フィードバックを収集する
フィードバックに基づいて改善を行う
## 2. デプロイ
### 本番環境へのデプロイ
本番環境へのデプロイは、開発環境で動作するアプリケーションを実際のユーザーが利用する環境に移行するプロセスです。以下の手順でデプロイを行います。

### デプロイ手順
ビルド: アプリケーションをビルドし、WARファイルやJARファイルを作成します。
サーバー設定: 本番サーバーにTomcatや他のアプリケーションサーバーを設定します。
アップロード: ビルドしたファイルを本番サーバーにアップロードします。
デプロイ: アップロードしたファイルをサーバーにデプロイします。
デプロイ後の確認とフィードバック
デプロイが完了したら、システムが正しく動作することを確認し、フィードバックを収集します。

### デプロイ後の確認
基本機能の確認: 主要な機能が正しく動作するかを確認します。
パフォーマンスの確認: システムのパフォーマンスをチェックし、必要に応じて調整を行います。
セキュリティの確認: システムのセキュリティ設定が適切であることを確認します。
### フィードバックの収集
ユーザーやステークホルダーからフィードバックを収集し、必要に応じて改善を行います。
ユーザーフィードバック: 実際のユーザーから使用感や改善点を収集します。
エラーログの確認: エラーログを確認し、問題が発生していないかをチェックします。
定期的なメンテナンス: システムの安定性を保つために定期的なメンテナンスを実施します。

以上が、テストの実施と本番環境へのデプロイに関する解説です。これらのステップを実行することで、システムの品質を保証し、ユーザーに提供できる状態にすることができます。次回は、さらに高度な運用管理やスケーリングについて学びましょう。
ブランチのバックアップを取る方法

# やり方
1.バックアップを取りたいブランチに移動
```
$ git branch バックアップを取りたいブランチ名
```
2.バックアップ用のブランチを作成
```
$ git branch バックアップ用のブランチ名
```
3.作成したバックアップ用のブランチをpush
```
$ gir push origin バックアップ用のブランチ名
```
# 例
Test1というブランチのバックアップをとりたい！
Test1のブランチ(Test1branch：仮名)に移動
```
git branch Test1branch
```
バックアップ用のブランチを作成(Test1branch-backup:仮名)
```
git branch Test1branch-backup
```
作成したブランチをpush
```
git push origin Test1branch-backup
```
GitHubを確認すると、新しくTest1branch-backupブランチが作成されており、それにはバックアップの元のTest1branchの中身が複製されています！

https://qiita.com/y_tt_y/items/f0678d51dd7436da992f
Javaプログラミング入門：ステップ5 開発環境の構築

# Javaプログラミング入門：ステップ5 開発環境の構築

Webアプリケーション開発の効率を高めるためには、適切な開発環境の構築が重要です。本記事では、Eclipseを使用したJava開発環境の構築方法と、XAMPPとTomcatを使用したWebアプリケーションのデプロイと実行方法について解説します。

1. Eclipseの基本操作
2. プロジェクトの作成と管理
3. デバッギングツールの使用
4. XAMPPとTomcatの使用

## 1. Eclipseの基本操作

Eclipseは、Java開発において広く使われている統合開発環境（IDE）です。Eclipseの基本操作を理解することで、効率的に開発を進めることができます。

### Eclipseのインストール

1. [Eclipseの公式サイト](https://www.eclipse.org/downloads/)からEclipse IDE for Java Developersをダウンロードします。
2. ダウンロードしたファイルを解凍し、インストーラを実行します。
3. インストールが完了したら、Eclipseを起動します。

### 基本的なインターフェース

Eclipseのインターフェースは、以下の主要なエリアで構成されています。

- **パッケージエクスプローラー**: プロジェクトとファイルの管理を行います。
- **エディターエリア**: コードを編集します。
- **コンソール**: プログラムの出力やエラーメッセージを表示します。
- **アウトライン**: 現在編集中のファイルの構造を表示します。

## 2. プロジェクトの作成と管理

Eclipseでは、新しいプロジェクトを作成して管理することが簡単に行えます。

### 新しいプロジェクトの作成

1. `File`メニューから`New`を選択し、`Java Project`をクリックします。
2. プロジェクト名を入力し、`Finish`をクリックします。

### ソースファイルの作成

1. パッケージエクスプローラーで作成したプロジェクトを右クリックし、`New` -> `Class`を選択します。
2. クラス名を入力し、`Finish`をクリックします。

### プロジェクトの管理

- プロジェクトをビルドするには、`Project`メニューから`Build Project`を選択します。
- プロジェクトの設定を変更するには、プロジェクトを右クリックし、`Properties`を選択します。

## 3. デバッギングツールの使用

Eclipseのデバッギングツールを使用することで、コードの実行中に変数の値を確認したり、ブレークポイントを設定してコードの流れを制御することができます。

### ブレークポイントの設定

1. コードエディタの左側の余白をクリックしてブレークポイントを設定します。
2. プログラムをデバッグモードで実行するには、ツールバーのバグのアイコンをクリックします。

### 変数の監視

デバッグ中に変数の値を監視するためには、`Variables`ビューを使用します。このビューには、現在のスコープで利用可能なすべての変数が表示されます。

## 4. XAMPPとTomcatの使用

XAMPPは、Apache、MySQL、PHP、およびPerlを含むクロスプラットフォームのWebサーバーソリューションです。Tomcatは、Java ServletとJavaServer Pages（JSP）を実行するためのWebサーバーです。

### XAMPPのインストールと設定

1. [XAMPPの公式サイト](https://www.apachefriends.org/index.html)からXAMPPをダウンロードします。
2. ダウンロードしたインストーラを実行し、指示に従ってインストールします。
3. インストールが完了したら、XAMPPコントロールパネルを起動し、ApacheとMySQLをスタートします。

### Tomcatのインストールと設定

1. [Tomcatの公式サイト](https://tomcat.apache.org/)からTomcatをダウンロードします。
2. ダウンロードしたファイルを解凍し、Tomcatのディレクトリに移動します。
3. `bin`フォルダ内の`startup.bat`（Windowsの場合）または`startup.sh`（Mac/Linuxの場合）を実行してTomcatを起動します。

### Webアプリケーションのデプロイと実行

1. 作成したWebアプリケーションのWARファイルをTomcatの`webapps`フォルダにコピーします。
2. Tomcatを再起動すると、WARファイルが自動的にデプロイされます。
3. ブラウザで`http://localhost:8080/yourapp`にアクセスして、Webアプリケーションを実行します。

以上が、Eclipseの基本操作、プロジェクトの作成と管理、デバッギングツールの使用、そしてXAMPPとTomcatを使用したWebアプリケーションのデプロイと実行についての解説です。これらの手順を理解し、実際に実行することで、効率的な開発環境を構築しましょう。
React（リアクト）は何ですか


**1.React（リアクト）は**、Facebookが開発したJavaScriptライブラリで、ユーザーインターフェースを構築するためのものです。2013年にオープンソースとしてリリースされました。Reactでは、宣言的なアプローチを使用して再利用可能なUIコンポーネントを作成し、UIを構築することができます。

**2.Reactの主要な特徴の1つは**、仮想DOMを使用していることです。仮想DOMは、実際のDOMの軽量な表現です。Reactは効率的に仮想DOMを更新し、必要な場所だけ実際のDOMを更新するため、パフォーマンスが向上します。

**3.Reactは**、コンポーネントベースのアーキテクチャに従っており、UIは再利用可能なコンポーネントを組み合わせて構築されます。各コンポーネントは独自の状態を管理し、より予測可能な動作とデバッグが容易になります。

**4.Reactは**、そのシンプルさ、パフォーマンス、強力なエコシステムのために、Web開発コミュニティで広く採用されています。単一ページアプリケーションのルーティングにはReact Routerなど、他のライブラリやフレームワークと一緒に使用されることが一般的です。

**5.JavaScriptライブラリReact**,日本でもReactの人気が高まってきています,
SPA（Single Page Application）が作りやすい.
流行のUIのフロントエンドは下記：
     Material-UI
     React-toolbox
     Rebass

**6.Reactをベースに開発されたJavaScriptのフレームワークNext.js**が流行っていることが判明した。Next.jsはReactと異なり、アプリケーションフレームワークとしてWebアプリの土台として利用が可能です。
代表利用例として：

Netflix（ネットフリックス）：Netflixは、世界有数の動画配信プラットフォームであり、一部のウェブサイトやアプリケーションでNext.jsを採用しています。

Twitch（ツイッチ）：Twitchは、オンラインライブストリーミングプラットフォームであり、一部のプロジェクトでNext.jsを採用しています。

Hulu（フールー）：Huluは、ストリーミングサービスを提供する企業であり、一部のプロジェクトでNext.jsを使用しています。

GitHub（ギットハブ）：GitHubは、コードホスティングやバージョン管理プラットフォームであり、一部のページでNext.jsを使用しています。

Vercel（ベルセル）：Next.jsの共同創設者であるVercelは、デプロイとホスティングサービスを提供しており、自社のウェブサイトや内部ツール、プロジェクトでNext.jsを使用しています。

Uber（ウーバー）：Uberは、グローバルな移動サービス企業であり、一部の内部プロジェクトでNext.jsを採用していると言われています。
AWS KMS

# 0.はじめに
この記事はAWS SAA試験勉強のための、AWS KMSに関する知識のまとめです。

# 1.AWS KMS(Key Management Service)とは
AWS KMSとは、データの暗号化に使用される暗号化キーの作成と管理を容易にするとともに、証跡を残して可視化するマネージド型サービス。監査対応が可能。

AWS KMSにおいて、KMSキーには「AWSマネージド型」「カスタマーマネージド型」があります。
通常、AWSによって作成・管理されるものは「AWSマネージド型」であり、ユーザーは削除できません。AWSマネージド型の鍵は、連携したAmazon EBSやAmazon Redshiftなどのサービスで暗号化を利用したタイミングでAWSが作成します。
一方、カスタマーマネージド型のKMSキーはユーザーが作成・削除、および管理を行います。ただし作成した鍵を長期間利用するのはセキュリティ上危険なため、KMSでは鍵の自動<font color="red">**キーローテーション**</font>をサポートしています。


# 2.共有の方法
KMSキーを共有する際は、キーのポリシーを編集し、特定のユーザやIAMグループに対して必要なアクセス権限（例えば、kms:Encrypt, kms:Decrypt, kms:GenerateDataKeyなど）を付与します。

### 2.1.IAMポリシーの作成または更新

新しいユーザが属するIAMグループに対して、KMSキーへのアクセス権限を含むIAMポリシーをアタッチします。

```json:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "arn:aws:kms:region:account-id:key/key-id"
    }
  ]
}
```

### 2.2.KMSキーのポリシー更新

対象となるKMSキーのポリシーを編集し、新しいユーザやそのIAMグループを追加します。

```json:
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/user-name"
      },
      "Action": "kms:*",
      "Resource": "*"
    }
  ]
}
```

# 3.AWS KMSの復号
具体的な復号の操作方法は、使用するプログラミング言語やAWS SDKによって異なりますが、基本的にはKMSのAPIを呼び出して復号を行います。

### 3.1.データの暗号化と復号

KMSを使用してデータを暗号化する場合、そのデータを利用する際には復号が必要です。KMSは暗号化キーを管理し、指定されたキーでデータを暗号化・復号します。

### 3.2.サーバーサイド暗号化

S3バケットやRDSインスタンスなどでサーバーサイド暗号化を使用する場合、AWSサービスが自動的にデータの暗号化と復号を行います。この場合、ユーザーは復号の操作を意識する必要はありませんが、内部的にはKMSが復号を行っています。

### 3.3.クライアントサイド暗号化

アプリケーションがクライアントサイドでデータを暗号化してS3などに保存する場合、そのデータを利用する際には復号が必要です。この場合、アプリケーションがKMSを使用して暗号化キーを取得し、データを復号します。

# 4.クロスアカウント

あるAWSアカウントで暗号化されたリソースを別のAWSアカウントで復号したい場合、KMSの暗号化鍵を複数のAWSアカウントで使用できます。暗号化されたAMIやデータベースのスナップショットなどを他のAWSアカウントと共有する際に利用します。
SSHポートフォワーディングを用いてのサーバ中継方法

# 投稿背景
 Webアプリの稼働環境（Cloud）から、データセンターのサーバ（DBやSOAP通信先）を
 覗きに行きたいが、Webアプリ環境→データセンターの直接の通信が
 禁じられている環境制約の案件に遭遇した
 
 ＋
 
 大真面目に中継サーバにRESTAPIを用意してそこから中継…というようなことを
 議論していたので、投稿を決意。

# SSHポートフォワーディングとは
端的に言うと、
中継用サーバを介し、接続元ホストが特定のポートに接続すると、
そのポートの目的地として設定されたリモートホスト（の特定ポート）に接続を中継する機能である。
中継用サーバから見える範囲であれば、接続元ホストからそのリモートホストに直接通信できなくても問題ない。

背景で述べたように、
Webアプリの環境から特定NW、サーバ間の通信が業務要件などにより出来ない場合がある。
そういった場合、中継サーバを立てて通信を中継する必要がある。
SSHポートフォワーディングはその中継を実現する方法の一つである。

 # サーバの用意
 クラウドで適当なサーバを2つ用意します。
- test 踏み台サーバ
- test2 接続したいサーバ、今回のテスト用にApache-Webサーバをインストール済み

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/d584c0a9-e8cd-0171-cf7a-60c154f6fe31.png)

# セキュリティ設定
接続したいサーバのポート80を踏み台サーバからのみ接続できるようにネットワーク設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/0e95b66e-a54a-5fee-3b7a-d6eb8e117636.png)

# 接続確認
接続したいサーバ＝ 51.103.218.23:80にcurlコマンド実行。
~~~cmd
C:\Users\ryode>curl 51.103.218.23:80
curl: (28) Failed to connect to 51.103.218.23 port 80 after 21032 ms: Couldn't connect to server
~~~

# SSHポートフォワード
TeraTermを使い、まずSSHで踏み台サーバに接続する。

設定→SSH転送を選択し、ポートフォワードの設定を行う。
以下設定だと、ローカルホストのポート30に接続すれば、踏み台サーバから見える接続したいサーバのポート80に通信が中継される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/414705f4-f09f-6140-16b6-58e081d8dd21.png)

その後、ローカルホストのポート30に対してcurlコマンドを実行すると、反応が返ってくる。
（当然ローカルホストの30でWebサーバなど動かしていない。）
~~~cmd
C:\Users\ryode>curl localhost:30

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
省略
</html>
~~~

# SSHポートフォワード　コマンド
sshコマンドを使うならこんな感じ。
（ローカルのポート9876にアクセスすると、51.103.218.23:80に接続が中継される。）
~~~cmd
PS C:\Users\ryode> ssh -L 9876:51.103.218.23:80 azureuser@51.103.209.170 -i "C:\Users\ryode\.ssh\azure-test.pem"
~~~
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/338c8961-d152-04bc-6bb8-e9fb851fdcbb.png)

# まとめ
直接接続できないサーバとの通信を目論む際は、
プロキシーだったりSSHポートフォワードなりを使いましょう。
（主要な解決策は上記だと思いますが、何か意見などあればコメント求む）
MySQLの結合について

## 1. 結合の基本概念

結合（JOIN）は、複数のテーブルから関連するデータを一つの結果セットとして取得するためのSQL操作です。結合の基本構文は次のとおりです：

```sql
SELECT columns
FROM table1
JOIN table2
ON table1.common_column = table2.common_column;
```

## 2. 主な結合の種類

MySQLにはいくつかの結合の種類がありますが、主に以下の4つがよく使用されます：

1. **内部結合（INNER JOIN）**
2. **左外部結合（LEFT JOIN）**
3. **右外部結合（RIGHT JOIN）**
4. **完全外部結合（FULL JOIN）** - MySQLでは直接サポートされていませんが、 UNIONを使用して実現可能です。

---

## 3. 内部結合（INNER JOIN）

内部結合は、結合条件に一致するレコードのみを返します。どちらのテーブルにも一致するデータがある場合にのみ結果セットに含まれます。

### 内部結合の構文

```sql
SELECT columns
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;
```

### 内部結合の例

```sql
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
```

このクエリは、`employees`テーブルと`departments`テーブルを`department_id`で結合し、各従業員の名前と所属部署を取得します。

---

## 4. 左外部結合（LEFT JOIN）

左外部結合は、左側のテーブルのすべてのレコードと、結合条件に一致する右側のテーブルのレコードを返します。一致しない場合、右側のテーブルの値はNULLになります。

### 左外部結合の構文

```sql
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;
```

### 左外部結合の例

```sql
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
```

このクエリは、`employees`テーブルのすべての従業員と、`departments`テーブルの一致する部署を取得します。部署がない従業員については、`department_name`がNULLになります。

---

## 5. 右外部結合（RIGHT JOIN）

右外部結合は、右側のテーブルのすべてのレコードと、結合条件に一致する左側のテーブルのレコードを返します。一致しない場合、左側のテーブルの値はNULLになります。

### 右外部結合の構文

```sql
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;
```

### 右外部結合の例

```sql
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
```

このクエリは、`departments`テーブルのすべての部署と、`employees`テーブルの一致する従業員を取得します。従業員がいない部署については、`name`がNULLになります。

---

## 6. 完全外部結合（FULL JOIN）

完全外部結合は、左側および右側の両方のテーブルのすべてのレコードを返します。MySQLでは直接サポートされていないため、UNIONを使用して実現します。

### 完全外部結合の構文

```sql
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column

UNION

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;
```

### 完全外部結合の例

```sql
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id

UNION

SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
```

このクエリは、`employees`テーブルと`departments`テーブルの両方のすべてのレコードを取得し、一致しない場合はNULL値を含めます。

---

## 7. クロス結合（CROSS JOIN）

クロス結合は、2つのテーブルのすべての組み合わせを返します。結合条件がなく、2つのテーブルの各行が組み合わせられます。

### クロス結合の構文

```sql
SELECT columns
FROM table1
CROSS JOIN table2;
```

### クロス結合の例

```sql
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
```

このクエリは、`employees`テーブルと`departments`テーブルのすべての組み合わせを取得します。結果セットの行数は、`employees`テーブルの行数と`departments`テーブルの行数の積になります。
Dockerのログを時間指定してテキストファイルに出力

# はじめに
docker-composeを使ってコンテナを複数作成するとき、特定のコンテナのログを時間指定してみたい時があります。特に、linuxでdockerを動かしていると、ログの解析が難しいので（自分の技術力の問題かも。）、テキストファイルに出力して、VScodeなどでログ解析する方法を紹介します。

# 実装方法
以下コマンドで実現できます。
```
docker logs <container name> --since xxxx-xx-xxTxx:xx:xx --until yyyy-yy-yyTyy:yy:yy > docker_log.txt
```

# 参考文献

* https://docs.docker.jp/engine/reference/commandline/logs.html
八百屋システムを考える（DX内製化の手順１）

# 八百屋さんの管理システムを考えてみよう！
八百屋さんは、野菜や果物を扱う小売店である。  
なので特徴としては

１．小売店　・・・・・・・　仕入れと販売を行う店舗
２．販売物の特徴　・・・・　生物なので販売までの期限が短い
３．販売物の単価　・・・・　気候変動に左右されやすい

# これを管理するためには

４．販売物に関する仕入情報　・・・　仕入日、仕入値、仕入数
５．販売物に関する販売情報　・・・　販売日、販売値、販売数

# これをExcelの表で管理してみましょう！！

・品名毎に以下のようなデータをためたとし在庫３日を超えたものは廃棄すると仮定すると
|日付|仕入数|仕入値|販売数|販売値|
|--|--|--|--|--|
|4/1|100個|2000円|30個|1200円|
|4/2|0個|0円|40個|1600円|
|4/3|100個|2000円|40個|1600円|

このようなExcel表を作る(データを貯める)と4/3時点で

・４/1に仕入た個数をすでに超えているので
　　廃棄の在庫は無い

・４/3時点の販売数合計

・４/3時点の在庫数
　（３日分の仕入数ー３日分の販売数）

・４/3時点の粗利
　（３日分販売値の合計ー３日分平均仕入単価×３日分販売数の合計）

というシステムができることがわかる。

なので１ヶ月間このようなデータを貯めると
A.廃棄数
B.販売合計
C.仕入合計
D.４月末の在庫
E.４月末の粗利

が管理できることになる。

要するにExcel表を解析するとその商売のアウトラインが見えてくる。

この記事に関するお問い合わせは、こちらまで m_kawase@embed-ai.com まで！
Power Platorm のリソース棚卸

Power Platform の管理者向けの話になりますが、市民開発活動が盛んになってくると Power Apps アプリ や Power Automate フロー がたくさん作られるようになってきます。

一見うれしいことではあるんですが、管理者のみなさまは以下のような悩みが出てくるはずです。

「アプリやフローが増えて Dataverse の容量が増えてきてしまったから減らしたい」
「全然使われてないから削除したい」
「似たようなアプリがいっぱいあるから集約したい」
「引継ぎ忘れで、所有者がいない宙ぶらりんなアプリが出来てしまった」

このような状況に関しては、管理者にとってのリソース最適化という観点だけでなく、利用ユーザーにとっても利用したいアプリ・フローの発見のしやすさにつながる話なので、定期的に **"棚卸"** したいところです。

以下は Power Apps アプリ に関しての棚卸になりますが、Power Automate フロー や Copilot Studio コパイロット などについても同様の考え方になります。

## アプリの棚卸に関してのルールや流れを整備
利用者へのガイドラインの中にもアプリ所有者設定のやり方や棚卸の頻度・プロセスなどをわかりやすく明記することが大事です。また、ルールの定着のためには研修・テストなどを盛り込むと良いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/502852c1-079c-aa84-f103-fb1f21c8f4f7.png)

## 棚卸にあたっての具体的なツールを構築

### 不要なアプリの自動削除ツール
[CoEスターターキットを利用した例](https://learn.microsoft.com/ja-jp/power-platform/guidance/coe/governance-components#inactivity-processes)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/01f3f4df-a2b0-2bd5-dc18-4d3b7990e9d5.png)

### 自動削除だけでなく、目視でも不要なアプリがないかを確認
[CoE スターターキット - Power BI ダッシュボード - App Deep Dive](https://learn.microsoft.com/ja-jp/power-platform/guidance/coe/power-bi-govern#app-and-flow-archive) には、アーカイブスコアというアプリが不要そうな要素を多角的にスコアリングしてくれます。
こちらを使って、不要なアプリを徹底的に洗い出しましょう。

加点要素
・アプリ名に、テスト、デモ、または サンプル などの非運用語がある
・アプリの最終変更日が昔である
・テンプレートが使用されている
・同じ名前のアプリが存在している
・アプリが中断(Suspend)している
・アプリが孤立(Orphaned)している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/39798105-62d9-200b-c8d3-5ea0dd1ddb51.png)



### 所有者の設定ツール
益森さんの [記事](https://qiita.com/Takashi_Masumori/items/18c24e7bde040fb47d2c) にある CoEスターターキット - Set App Permission を使っても良いですし、CoEスターターキット導入にハードルがあるようでしたらコネクタを使ってアプリを作っても各環境管理者に対して配布しても良いかと思います。

コネクタ
・[Power Platform for Admins](https://learn.microsoft.com/ja-jp/connectors/powerplatformforadmins/)（自分がアクセスできる環境の一覧を取得）
・[Power Apps for Admins](https://learn.microsoft.com/ja-jp/connectors/powerappsforadmins/)（環境内のアプリの一覧を取得、アプリ所有者の設定）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/aee39563-73be-9130-08a9-c614de96f305.png)
Gitlabのリダイレクト設定

# はじめに
Gitlabの移行に伴い、古いサーバのリポジトリにアクセスした場合に新しいサーバのリポジトリにリダイレクトする設定が必要になったので備忘録がてら記述します。

# 実装
/etc/gitlab/gitlab.rbを編集します。旧サーバのリダイレクトりしたいリポジトリを開き、ドメイン以降のパスを<旧サーバリポジトリ>に記述する。

```
nginx['custom_gitlab_server_config'] = " location ^~ /<旧サーバリポジトリ> {
    return 301 https://<新サーバドメイン>/リポジトリ;
  }
  "
```

次に以下コマンドで設定を読み込みなおします。
```
gitlab-ctl reconfigure
```

# 参考文献
* https://gitlab-docs.creationline.com/omnibus/settings/nginx.html
* [Nginxのリダイレクト設定のメモ- Qiita](https://qiita.com/kt_higa/items/f26ba1453164c82d6ad5)
* [Nginx　returnディレクティブ - Qiita](https://qiita.com/keitean/items/a973b70fe2896926c836)
Salesforceでフローを作成しよう～選択リスト項目の値が更新された場合別の選択リスト項目の値が更新される方法

本橋孝昭です

今回はSalesforceのフローを作成し、選択リスト項目の値が更新された場合別の選択リスト項目の値が更新される方法をご紹介します
　
なお、今回は例として
・商談のフェーズが更新されれば商談のカスタム項目test01項目も更新する

例；フェーズ Prospecting ならtest01はA　など


なお、test01項目はこのようになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6b0b7911-1cd9-e55c-2a8c-aa70a0f6283d.png)

という設定を行います


## フロー全体像

まずはフロー全体像です。
今回はレコード更新（ピンク）部分は３個しかないですが、実際はフェーズの選択リストの値の数だけ更新（ピンク）を作成してください


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fdbbb5f2-52c0-cac4-28ac-32f59fff0bfe.png)


開始条件はこのようになっています
レコードが作成または更新されていること設定がポイントです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d24c459c-815d-5bf5-60d4-437121998a3c.png)

レコードの更新ではフェーズの値ごとにtest01項目の更新したい値を決め打ちで設定します

ここでは
フェーズ Prospecting ならtest01はA
が設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/038dbfee-fd1d-c914-5d55-9c7c23a7cea8.png)
誰でも分かる HTTP の基本と確認方法

## はじめに

最近、情シスの方から問い合わせを受けることが多いのですが、必要な情報が不足していることが多いため、この記事を作成しました。

HTTP（Hypertext Transfer Protocol）は、ウェブ上でデータをやり取りするためのプロトコルです。エンジニアが情シスからの問い合わせに対応する際、以下の情報が重要です。

## 欲しい情報

### URL

URL（Uniform Resource Locator）は、リクエストを送る先のアドレスです。例えば、https://example.com/api/resource のような形式です。

### メソッド

HTTP メソッドは、リクエストがどのようなアクションを行うかを指定します。一般的なメソッドには以下があります：

- **GET**: データの取得
- **POST**: 新しいデータの作成
- **PUT**: 既存データの更新
- **DELETE**: データの削除

### リクエストボディ

リクエストボディは、POST や PUT メソッドの際にサーバーに送信するデータです。通常、JSON 形式や XML 形式で送信されます。例：

```json
{
  "name": "John Doe",
  "email": "john@example.com"
}
```

### レスポンスコード

レスポンスコードは、サーバーからのレスポンスのステータスを示します。よく使われるコードは以下の通りです：

- 200 OK: リクエストが成功した
- 201 Created: 新しいリソースが作成された
- 400 Bad Request: リクエストが不正である
- 401 Unauthorized: 認証が必要である
- 404 Not Found: リクエストしたリソースが見つからない
- 500 Internal Server Error: サーバー側のエラー

### レスポンスボディ

レスポンスボディは、サーバーから返されるデータです。これも通常は JSON や XML 形式です。例：

```json
{
  "id": 123,
  "name": "John Doe",
  "email": "john@example.com"
}
```

## 確認する方法

1. ブラウザの開発者ツールを使用する

- Chrome や Firefox などのブラウザには開発者ツールが内蔵されています。これを使用して、ネットワークタブから HTTP リクエストとレスポンスを確認できます。
- 開発者ツールを開くには、F12 キーを押すか、右クリックして「検証」を選びます。

2. cURL を使用する

- cURL はコマンドラインから HTTP リクエストを送信するためのツールです。以下のように使用します：

```sh
curl -X GET https://example.com/api/resource
curl -X POST https://example.com/api/resource -d '{"name":"John Doe"}' -H "Content-Type: application/json"

```

3. Postman を使用する

- Postman(https://www.postman.com/) は GUI ベースの HTTP クライアントで、複雑なリクエストを簡単に作成し、レスポンスを確認できます。

これらの情報と方法を使用すれば、エンジニアは HTTP リクエストとレスポンスの詳細を迅速かつ正確に確認できます。

## 報告のフォーマット例

以下の内容でメールをくれるとありがたいです。

- 操作方法
- URL
- メソッド
- リクエストボディ
- レスポンスボディ
- レスポンスコード

## まとめ

以上の内容を意識してエンジニアに情報を提供していただければ、エンジニアはスムーズに対応することができます。適切な情報を提供することで、迅速かつ正確な問題解決が可能となりますので、どうぞご協力をよろしくお願いいたします。
Kotlinを書くための基礎知識

## はじめに
この記事では、Kotlin学びたての筆者が、Kotlinの基礎知識をまとめています。
Kotlinを書けるようになることは、Androidアプリの開発において第一歩となるはずです。
将来のAndroidエンジニアを見据えて、共に頑張りましょう！

環境構築をせずにkotlinを試すには、[Kotlinのプレイグラウンド](https://developer.android.com/training/kotlinplayground?hl=ja)がおすすめです。
文中にあるコードをコピペするだけで、手軽に動作確認が行えます。

## 対象読者
* Androidエンジニアを目指している方
* Kotlinの基礎知識をサクッと学びたい方
* 変数や関数など、ある程度の用語は理解している方

それでは、一緒に始めていきましょう。

## 変数
Kotlinの変数宣言は、定数が`val`, 変数が`var`から宣言します。
```kotlin:variable.kt
val COUNT_NUMBER: Int = 2
var countNumber: Int = 2
```
定数名はすべて大文字で宣言し、単語と単語の間はアンダースコアで繋ぎます。
また、値を更新しようとすると`Val cannot be reassigned`が発生します。
一方、変数名はキャメルケースで宣言し、1文字目は小文字から始めます。

### 型推論
変数は型を指定しなくても、Kotlinが初期値によって推測してくれます。
以下の場合、変数宣言に型を書いていませんが、それぞれ`Int`, `String`の型だと推測してくれます。
これを型推論と言います。
```kotlin:variable.kt
var countNumber = 2
var greeting = "おはよう"
```
型を明示しないことによる賛否はあるかと思います。
あくまでもKotlinには型推論が備わっていると捉えておき、チームの方針に沿うのが良いのだと考えます。
ちなみに、繰り返しになりますが、Kotlinは初期値から型推論を行うため、初期化しない場合には型の指定が必須となります。
```kotlin:variable.kt
/* 初期化せずに型推論させようとするとエラーになる */
var countNumber
// This variable must either have a type annotation or be initialized.
```

## 関数
関数は`fun`と書き始めることで宣言できます。
関数の返り値がある場合は、中かっこの前に返り値の型を指定します。
また、関数内に`return`を必ず書いて、返り値の型と同様の型で宣言した変数で受け取ります。
```kotlin:function.kt
fun main() {
    var name = "Kotlin"
    var greeting: String
    greeting = letsGreeting(name)
    println(greeting)
}

fun letsGreeting(name:String): String {
    return "Hello, $name"
}
```

### Unit型を返す関数
返り値の型指定をしなかった場合、`Unit`型が返ります。
```kotlin:noreturn.kt
fun noReturn(): Unit {
    plintln("何も返却しない")
}
```
`Unit`型は結果として何も返らないため、Javaの`void`と同様の関数宣言になります。
また、`Unit`を省略して書くことができます。
```kotlin:noreturn.kt
// 前述のコードと同義です
fun noReturn() {
    plintln("何も返却しない")
}
```
### 名前付き引数
名前付き引数を使うと、どのパラメータに引数を渡すのかを明確にできます。
例えば以下の関数を`profile(19, 4, 2)`と呼び出した場合、パラメータが何であるか不明瞭です。
```kotlin:multiArguments.kt
fun profile(age: Int, numberOfFamilies: Int, favoriteNumber: Int) {
    println("年齢: $age\n家族の人数: $numberOfFamilies\n好きな数字: $favoriteNumber")
}
```
これを、`profile(age = 19, numberOfFamilies = 4, favoriteNumber = 2)`のように呼び出すことができます。
また、名前付き引数は順不同で書くこともできます。
`profile(favoriteNumber = 2, age = 19, numberOfFamilies = 4 )`

### デフォルト引数
関数宣言する際に、引数のデフォルト値を設定できます。
この場合、呼び出し元から引数が渡ってこなければ、それが使用されます。
```kotlin:defaultArguments.kt
fun main() {
    profile()   // デフォルト引数が使われる
    profile(21) // ageのみ引数が渡り、残りはデフォルト引数が使われる
    profile(numberOfFamilies = 2)  // numberOfFamiliesのみ引数が渡り、残りはデフォルト引数が使われる
}
fun profile(age: Int = 20, numberOfFamilies: Int = 5, favoriteNumber: Int = 3) {
    println("年齢: $age\n家族の人数: $numberOfFamilies\n好きな数字: $favoriteNumber")
}
```

## 次回予定
この記事に対して以下を追記予定です。
* 条件分岐
* nullについて
* クラスとオブジェクト
【備忘録】Composerでautoload-devで定義したクラスが参照できない

# 初めに
composerを使ってアプリケーションを作成していた際、`composer.json`の`autoload-dev`で定義したクラスが読み込めませんでした。
解決したので備忘録を残します。

# TL;DR
* **`autoload-dev`は、ルートの`composer.json`上でしか定義できない**
    * ルートとは、composerコマンドを実行する場所にある`composer.json`のこと

# 問題
PHPフレームワークFlowにて、単体テストを実装しようとしていました。
Flowには、PHPUnitのクラスを継承した単体テスト用のBaseクラスがあり、そのクラスを継承してテストケースを作成しようとしました。

実際にテストケースを作成し、実行してみたのですが、、、

```sh
$ .\bin\phpunit .\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php

PHP Fatal error:  Uncaught Error: Class "Neos\Flow\Tests\BaseTestCase" not found in C:\Path\to\Project\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php:6
```

phpunitの実行が通らず、、、

原因は、継承したFlowの`BaseTestCase`クラスが見つからないという内容のようです。composerのautoloadの設定がうまくいってないことで起きているように見えました。

そこで、Flowの`composer.json`を確認したのですが、Testsディレクトリはすでに`autoload-dev`で定義されていそうです。

```json
    "autoload": {
        "psr-4": {
            "Neos\\Flow\\": "Classes",
            "Neos\\Flow\\Core\\Migrations\\": "Scripts/Migrations"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Neos\\Flow\\Tests\\": "Tests"
        }
    },
```

困った:disappointed_relieved:

ちなみにディレクトリ構成はこんな感じでした。

```
Project
  ├ Packages
  |   ├ Application
  |   |    └ Neos.Welcome
  |   |         └ Tests
  |   |             └ Unit/Domain/Model/UsersTest.php  ←　作成したテストケース
  |   └ Framework
  |        └ Neos.Flow
  |             ├ Tests
  |             |   └ BaseTestCase.php　←　単体テスト用のBaseクラス
  |             |
  |             └ composer.json　←　Flowのcomposer.json
  |
  └ composer.json　←　プロジェクト自体のcomposer,json
```

# 原因
**`autoload-dev`はルートの`composer.json`上でしか定義できない**らしいです。
公式ドキュメントを見ると、しっかりと『**root-only**』と書いてありました。

https://getcomposer.org/doc/04-schema.md#autoload-dev

# 解決策
ということで、composerコマンドを実行するディレクトリにある`composer.json`に`autoload-dev`を追加することで解決できました。

```json
    "autoload-dev": {
        "psr-4": {
            "Neos\\Flow\\Tests\\": "./Packages/Framework/Neos.Flow/Tests"
        }
    }
```

実行もちゃんと通りました。
```sh
> .\bin\phpunit .\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php
PHPUnit 9.6.19 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 00:00.005, Memory: 4.00 MB

OK (2 tests, 2 assertions)
```

# 補足
ルートの`composer.json`でしか定義できないものが他にもあるみたいです。
詳しくはこちらをご覧ください。

https://getcomposer.org/doc/04-schema.md#autoload-dev

# 終わりに
ライブラリの`autoload-dev`をインストールできたらdevの意味ないので、よく考えると当たり前ですよね。恥ずかしながら、やってみるまで気が付きませんでした。

ここまでご覧いただきありがとうございました！
kawaiiロゴの作り方(2)

# kawaiiロゴの作り方(2)

## kawaiiロゴ作成にあたり、今回決めたこと
今回は以下のものを使ってkawaiiロゴを作ることにしました。
ロゴにする文字：ネコチャン中毒
使う要素：ハートをアイコンか文字で使う
メインとなる色：ピンク系

使うフォント：KFひま字キッズ、851マカポップ

※使うフォントは、太くて丸いものを使うことをお勧めいたします。フォントが太くないとロゴ表現したときに全体的にやせ細って見えてしまうため、可愛く表現することが難しくなるからです。

前回、説明が漏れていましたが、フォントによって文字の印象が変わってくるため、フォントにもこだわりが必要です。今回は、KFひま字キッズを使うことにしました。しかし、KFひま字キッズは漢字がないため、漢字部分は851マカポップを使うことにしました。なお、試しにインストール後に入力してみて、雰囲気が合うか確認しました。

## kawaiiロゴ作成手順
(1) まずはGIMPを起動して、[ファイル(F)] -> [新しい画像]を選択して、表示されたダイアログで[OK]ボタンを押します。このとき、キャンパスサイズは後で変えられるのでデフォルト(画像では幅1,920、高さ1,080)のままで大丈夫です。
![](https://storage.googleapis.com/zenn-user-upload/7c0b7d4d30a5-20240604.png)

(2) レイヤーを右クリックして、新しいレイヤーを透明で追加します。このとき、既存のレイヤーがすでに透明であった場合、塗りつぶしで黒か白にしましょう。
透明レイヤーと黒または白のレイヤーの2つを作る理由については、都度、デザインを確認するときに便利だからです。背景とロゴデザインの色が似ていると、確認しづらいときもあるので、可視/不可視をレイヤー横にある目玉アイコンで切り替えて確認します。
![](https://storage.googleapis.com/zenn-user-upload/4eaffe3aa6a9-20240604.gif)
(3) ロゴにする文字を適当な位置に入力します。このとき、使うフォント、フォントカラーや(おおまかに)フォントサイズを指定します。
この時点では設置場所はあんまりこだわらなくて大丈夫です。全体のバランスを調整する過程で位置も調整します。

例では、以下のように設定しています。
- ネコチャン
　フォント：KFひま字キッズ
　カラー：#ffb1bc
　サイズ：140px
- 中毒
　フォント：851マカポップ
　カラー：#ffb1bc
　サイズ：140px
　装飾：ボールド

(4) おおまかなロゴのイメージを作り、それに基づいて適当に文字やアイコンを配置する
設計図はあったほうがいいでしょう。しかし、本格的なものはプロに任せるべきです!!

なので手書きとか、別のロゴを参考にするなどでおおまかな完成イメージを作ります。どうせちょいちょい直しが入ります。思い切りが肝心です。

しかし、イメージがないと作ることに時間がかかりすぎてしまいます。そのため、大まかなイメージを作るわけです。

イメージ作りについては[tldraw](https://www.tldraw.com/)を使うことにしました。共有リンクを使うことで、PCでもスマホでも書き込むことができるだけではなく、アカウント不要でお手軽に使えて、SVG形式でもダウンロードできます。
![](https://storage.googleapis.com/zenn-user-upload/b43c528fd059-20240604.png)
今回、ハートを何で表現するか考えた結果、[あんずいろapricot×color](http://www8.plala.or.jp/p_dolce/)の「あんずもじ湛」を使わせてもらうことにしました。

文字は一文字ずつレイヤーを分けたほうがいいです。文字間を詰めるときのためでもありますが、もっとも重要なのは角度や位置調整をするためには一文字ずつ分けたほうがいいからです。
![](https://storage.googleapis.com/zenn-user-upload/2789d05ac9f1-20240604.png)
(5) ロゴイメージに合わせて各リソースの配置や大きさを合わせる
まずは配置や大きさを大まかに調整して、縁取りや角度などはこのあとに行います。

(6) 文字などの角度を調整する
失敗が不安な場合は、この作業の前に保存を行い、別のファイル名に変えてからやりましょう。

(7) 縁取りを行います
手順は、以下の通りです。このとき、最初にあったレイヤーは、目玉アイコンで不可視にすると結果がわかりやすいです。
　別レイヤーを追加する
　↓
　縁取りを行いたい文字のレイヤーを選択して、右クリックメニューの「不透明部分を選択範囲に」を選択する
　↓
　追加したレイヤーを選択する
　↓
　選択(S) -> 選択範囲の拡大を行う（例では15pxにしてます）
　↓
　編集(E) -> 描画色/背景色で塗りつぶします（例では白で塗りつぶしています）

※各リソースごとに別レイヤーを追加したほうが、あとで微調整しやすいです。縁取りを一つにまとめたいときは、このあとさらにレイヤーを追加して、各リソース別に作ったレイヤーを不可視にしたほうが、デザインを作り直したいときに便利です。

(8) 縁取りに対してロングシャドウのフィルターをかける
このとき、ロングシャドウの色調整はHSVを選択して、彩度(S)などを変更すると色を調整しやすいです。

![](https://storage.googleapis.com/zenn-user-upload/24671fd78011-20240604.png)
(9)さいごに全体のバランスを調整したら完成です。
少しスカスカな感じがしたので背景を入れてみました。
Illustratorではなく、GIMPを使ったわりには頑張れたかなと個人的には思っています。
背景は[Color Base](https://colorbase.app/ja)を使って捕色を調べて、その捕色を使っています。
![](https://storage.googleapis.com/zenn-user-upload/ebd030210f4c-20240604.png)

次回は、こういうことしたいときどうしたらいいの？というGIMPに関するTipsをご紹介いたします。