OmniAICreator/Qiita-1.07M huggingface dataset:
【自分用メモ】町字ポリゴンを探す～その1（e-Stat の 世界測地系経緯度座標、JGD2011、都道府県別データ）

# はじめに
全国の町字のポリゴンがあるかどうか知りたいので、調べてみています。

# 対象
今日は、e-Stat のページにあるデータを見てみます。

https://www.e-stat.go.jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/1a6c48e4-c4fd-97d9-bd3d-5a7068192b70.png)

# 作業
## データを探す
1. 統計地理情報システム https://www.e-stat.go.jp/gis から、
1. 境界データダウンロード https://www.e-stat.go.jp/gis/statmap-search?type=2 を選択。
1. そして 小地域 https://www.e-stat.go.jp/gis/statmap-search?page=1&type=2&aggregateUnitForBoundary=A を選択
1. 国勢調査 > 2020年 > 小地域（町丁・字等）（JGD2011）https://www.e-stat.go.jp/gis/statmap-search?page=1&type=2&aggregateUnitForBoundary=A&toukeiCode=00200521&toukeiYear=2020&serveyId=A002005212020&datum=2011 を選択 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/0747751a-2109-57c9-a7ac-8a2cb9f2d20a.png)
1. 世界測地系経度緯度・shapefileを選択
1. 次に都道府県の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/76b026fa-39f9-1ec5-1c1d-bf1b5fe47c2d.png)

1. 選択した都道府県の中でデータリストがでる。一番上にその都道府県全域があるようだ。クリックするとダウンロードされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/c5a6cee9-888b-d476-2346-cdac1e22304b.png)

群馬県全域のデータはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/d78db8cd-83ee-0fb4-43ad-e90a9a74101a.png)

## データURLを見てみる
同じように世界測地系経緯度座標、JGD2011のデータのURLは以下の感じです。
* 北海道全域： https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212020&code=01&coordSys=1&format=shape&downloadType=5&datum=2011
* 青森県全域： https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212020&code=02&coordSys=1&format=shape&downloadType=5&datum=2011
* 岩手県全域： https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212020&code=03&coordSys=1&format=shape&downloadType=5&datum=2011 
* ・・・・
* 群馬県　全域： https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212020&code=10&coordSys=1&format=shape&downloadType=5&datum=2011 
* ・・・・
* 沖縄県全域： https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212020&code=47&coordSys=1&format=shape&downloadType=5&datum=2011

ご推察の通り各都道府県のURLを並べてルールを見つけます。
都道府県の種類はURLのクエリ中のcodeというところで指定されているようです。01～47を指定すればURLから直接ダウンロードできるかもしれません。（curlでダウンロード、unzipで解凍、gdalでマージした後ベクトルタイル化という流れでどうだろう。）


## データライセンス等を確認する
https://www.e-stat.go.jp/help/data-definition-information/download

『本システムで利用できる町丁・字等境界データについては、統計関連業務等のために作成されたもので、一般的な地域境界や行政区域とは必ずしも一致していません。』という説明があったので少し難しいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b07fd6db-58dc-9361-9312-f407a08508e3.png)



# まとめ
統計用途の町字ポリゴンは一括ダウンロード出来そうですが、一般的な地域境界と必ずしも一致していないということもわかった。

メモ・終わり
【Laravel】マイグレーションの基本

# Laravelのマイグレーションとは
データベースの作成や編集、削除などを管理する方法として、PHPフレームワークのLaravelには「マイグレーション」というものが備わっています。
正しくコードを書くと、だれが、いつ、どういった目的でテーブルの作成・編集・削除を行ったのかがわかる優れものです。
本記事では、基本的なマイグレーションのやり方について書きます。

詳しく知りたい方は、下記の公式ページもご参照ください。

https://readouble.com/laravel/9.x/ja/migrations.html

# マイグレーションの手順
1. マイグレーションファイルの作成
2. マイグレーションファイルの編集
3. マイグレーションの実行

## 1. マイグレーションファイルの作成
```
$ php artisan make:migration create_{テーブル名}_table
```
コマンドプロンプト（ターミナル）で上記コマンドを実行します。
成功すれば、database/migrationsディレクトリ内にマイグレーションファイルが生成されます。

## 2. マイグレーションファイルの編集
下記のマイグレーションファイルは、例として{テーブル名}に「posts」を指定したときにできるものです。
```2023_06_06_132828_create_posts_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```
「up」内にはテーブル作成時の処理、「down」内にはテーブル削除時の処理を書きます。
    今回は例として、post（投稿）の文章text、画像保存先imageを追記します。
```2023_06_06_132828_create_posts_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('text');
            $table->string('image', 50);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```
テーブルカラム作成のデータ型については、下記の記事も参考にしてみてください。

https://qiita.com/Takahiro_Nago/items/51eb0e9f1c8bbc2c9852


## 3. マイグレーションの実行
```
$ php artisan migrate
```
初回マイグレーションではコマンドプロンプト（ターミナル）で上記コマンドを実行します。これでテーブルの生成完了です！

# その他のマイグレーションコマンド
```
$ php artisan migrate:rollback
```
直前のマイグレーションをロールバックします。
（基本的に直前マイグレーションの取り消しのように振る舞いますが、実際にはマイグレーションファイルのdown()を実行しています。）


```
$ php artisan migrate:reset
```
マイグレーションをすべてロールバックします。

```
$ php artisan migrate:refresh
```
マイグレーションをすべてロールバックし、全マイグレーションを実行します。

```
$ php artisan migrate:fresh
```
データテーブルをすべて削除し、全マイグレーションを実行します。

```
$ php artisan migrate:status
```
各マイグレーションファイルの状態を表示します。
DHCPrelay

Fortigate60DをDHCPサーバーにしてL3のCatalystでVLANルーティングを通してPC端末にサーバーからipアドレスを取得出来る構成を作ります。

## 環境
* Fortigate60D v6.0.7
* Cisco WS-C3560CG-8PC-S 12.2(55)EX3
* PC端末 windows11

## イメージ図
<img width="500" alt="fortigate@dhcp_relay3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/0c080a95-eef0-2090-48be-76abe0ce11ea.jpeg">

# DHCPサーバの設定
デフォルトで用意されているハードウェアスイッチから物理i/fを切り離し、VLANi/fを紐付ける。
VLANi/fを編集。
* ロールをLANに設定。
* アドレッシングモードをマニュアル。
* DHCPサーバにチェックを入れて、端末に割り当てるアドレス範囲を指定。
* セグメントを超えて指定する場合は、デフォルトゲートウェイを指定する。
<img width="700" alt="fortigate@dhcp_relay2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/b5e83fc3-1133-c290-3520-df32b06f1aea.png">

<img width="700" alt="fortigate@dhcp_relay1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/4129f195-40bd-a4e7-7578-3755b80da791.png">

FortiGateからPCとCatalystを含むセグメント間に向けて通信させるために、スタティックルートを設定。
* 宛先をサブネットに設定してIPアドレスを設定。
* インターフェース DHCPを指定。
* ゲートウェイアドレス指定。
<img width="700" alt="fortigate@dhcp_relay4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/d81a49d3-5cee-397f-39db-d232c73c1c4f.png">

# Catalyst設定
セグメントを超えた通信をするので、ip routingを有効化。
サーバーを繋ぐI/Fはtrunkモード、端末を繋ぐI/Fにはaccessモードで設定。
```php:Switch456#show running-config 
Building configuration...

Current configuration : 4500 bytes
!
version 12.2
!
ip routing
!
interface GigabitEthernet0/8
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 150
 switchport mode trunk
!
interface GigabitEthernet0/9
 switchport access vlan 200
 switchport mode access
!
interface Vlan150
 ip address 192.168.0.2 255.255.255.0
!
interface Vlan200
 ip address 198.51.100.1 255.255.255.0
 ip helper-address 192.168.0.1
```

DHCPクライアントが放つDHCP DISCOVERはブロードキャストでしか送信されないので、L3interfaceやinterfaceVLANに設定する
```
(config)# interface vlan 200
(config-if)#ip helper-address 192.168.0.1
```

セグメントを超えてIP取得をしたときのパケットキャプチャ。
<img width="700" alt="DHCPrelay.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/27602203-f20d-ca3b-0257-0a01aeaba1ad.png">
伊坂幸太郎の「モダンタイムズ」に出てくるコメントが実行結果に影響を与えるやつ

# やりたいこと
伊坂幸太郎の小説「モダンタイムズ」の中で、あるプログラムのコメント中に暗号が仕込んであり、そのコメント文が独自のプログラムの実行コードに変換されるという話がありました。
こんなことできるのかな〜と思って、調べてみるとJavaで似たようなことができるっぽい！
ということで実際に作ってみました。

# 実際に作ってみた。
↓はJavaのソースです。
（コメントがすごい怪しいですが、気づかないふりをしてください。。）
```java
import java.util.Scanner;

public class ModernTimes {
    public static void main(String[] args) {
        System.out.print("何か入力してください:");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        // \u000a\u0069\u0066\u0020\u0028\u0069\u006E\u0070\u0075\u0074\u002E\u0065\u0071\u0075\u0061\u006C\u0073\u0028\u0022\u5B89\u85E4\u5546\u4F1A\u0022\u0029\u0029\u0020\u007B
        // \u000a\u0069\u006E\u0070\u0075\u0074\u0020\u003D\u0020\u0022\u3042\u306A\u305F\u306F\u76E3\u8996\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u0022\u003B
        // \u000a\u007D\u000A
        System.out.println("出力結果:" + input);
    }
}
```
このソースを見ると、標準入力から文字列を受け取って、そのまま出力されるはずです。
なので、実際に実行して確認します。
```terminal
$ java ModernTimes.java
何か入力してください:Hello
出力結果:Hello
```
予想通り、入力した値がそのまま出力されています。
しかし、`安藤商会`と入力してみると、、
>安藤商会は実際にモダンタイムズの中で出てきます。
```terminal
$ java ModernTimes.java
何か入力してください:安藤商会
出力結果:あなたは監視されています。
```
なんと、、！なぜか、「あなたは監視されています。」と出力されました。。

# 種明かし
実は、JavaにはUnicodeエスケープという仕組みがあって、コンパイル前に\uXXXという形式をUnicode→テキストに変換しています。
例）\u000aは改行を表します。
この仕組みを利用して、コメント文に文字列をチェックするソースコードを忍ばせておきました。

もうお気づきの方もいると思いますが、実はコメント文をよく見ると
`// \u000aXXXXXXX`となっていて、実際には`//`のすぐ後で改行がされています。
つまり、コメント文はもう終わっていて、そのあとのUnicodeが実行コードになっていたんです。
エスケープ後のソースコードを見ると↓になっています。
```java
import java.util.Scanner;

public class ModernTimes {
    public static void main(String[] args) {
        System.out.print("何か入力してください:");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        //
        if (input.equals("安藤商会")) {
        //
        input = "あなたは監視されています。";
        //
        }
        System.out.println("出力結果:" + input);
    }
}
```
しっかり、文字列チェックが入っていることがわかります。


# 感想
実際に小説に出てくるのは、日本語のコメント文がコンパイルによって実行コードになっているので、今回書いたソースは似て非なるものですが、コメント`//`以降は無視されるという先入観があったので、とても勉強になったし感動しました！

# 参考

http://blogs.wankuma.com/nagise/archive/2008/04/02/131242.aspx

https://qiita.com/cha84rakanal/items/06477529d48c52f26e2d
[Java]ある文字列が文字列のリストに含まれているか判定する


# NGワードのリストを作ってそこに含まれてるか調査する

こんな感じで判定できる。
前方一致ならcontainsをstartWithにする。

単純だけどこれが基本なんじゃないかな。forをforEach(拡張For)にするとngexitフラグがラムダの外になってビルドできない。

```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String mes = "ngaaa";

        var nglist = List.of("ng", "word", "list");

        boolean res = nglist.stream().anyMatch(ng -> mes.contains(ng));

        System.out.println(res);
    }
}
```

C#だとこんな感じ。

```C#
using System.Collections.Generic;

public class Hello{
    public static void Main(){
        string mes = "ngaaa";
        
        var nglist = new List<string>(){"ng","word","list"};
        
        var res = nglist.Exists(ng => mes.Contains(ng));
        
        System.Console.WriteLine(res);
    }
}
```
【Salesforce】【Apex】オブジェクト・項目の取得

自分用の備忘録(\*'ω'*)

# オブジェクトのAPI名でSObjectTypeを取得
```apex
Schema.SObjectType sObjectType = Schema.getGlobalDescribe().get('hogehoge');
```

# SObjectTypeのインスタンスでSObjectFieldを取得
```apex
Map<String, Schema.SObjectField> sObjectFieldMap = sObjectType.getDescribe().fields.getMap();
```

# 任意のオブジェクトの任意のデータ型の項目API名を取得
取引先の電話型項目を取得する例
```Apex
// オブジェクトの取得
Schema.SObjectType sObjectType = Schema.getGlobalDescribe().get('Account');
        
// 項目の取得
Map<String, Schema.SObjectField> sObjectFieldMap = sObjectType.getDescribe().fields.getMap();

// 電話型の項目の取得
List<String> phoneFieldList = new List<String>();
for (Schema.SObjectField field : sObjectFieldMap.values()) {
    if(field.getDescribe().getType() == Schema.DisplayType.Phone){
        phoneFieldList.add(field.getDescribe().getName());
    }
}
```

※[DisplayType 列挙](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_enum_Schema_DisplayType.htm)でデータ型を指定します

# 参考
SObjectType

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Schema_SObjectType.htm

SObjectField

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Schema_SObjectField.htm
Paiza Cランク獲得問題（Dランク相当）ループメニュー1 ①

paizaのCランク獲得問題の解答がなかったので、備忘録として残します。
明らかに簡単な問題の場合は省略しますが、個人的に少しでも考えたコードを残していきたいと思います。
初心者ですので醜いコードを書きますが、温かい目で見守っていただけると嬉しいです。
また、より良い記述方法などありましたら、コメント等で教えていただけると嬉しいです。


# 目次
- ある数をある回数表示 2
- a ~ z までを表示
- 数列の和
- 数列の A 番目から B 番目までの和
- 数列の値を全部 * 2 して出力
- 数列同士の引き算







## ある数をある回数表示 2
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__rep_num_step2/edit?language_uid=c-sharp)
```C#
using System;
class Program
{
    static void Main()
    {
        string [] num=Console.ReadLine().Split(' ');
        int count = int.Parse(num[1]);
        for (int i=0;i<count;i++){
            Console.WriteLine(num[0]);
        }
        
    }
}
```
## a ~ z までを表示
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__print_alpha/edit?language_uid=c-sharp)
```C#
using System;
class Program
{
    static void Main()
    {
        Char moji;
        for(moji = 'a'; moji <='z';moji++)
        {
            Console.WriteLine(moji);
        }
    }
}
```
## 数列の和
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_sum/edit?language_uid=c-sharp)
```C#
using System;
using System.Linq;
class Program
{
    static void Main()
    {
        int count = int.Parse(Console.ReadLine());
        int [] num= Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int sum= 0;
        for (int i = 0; i < count; i++) {
            sum += num[i];
        }
        Console.WriteLine(sum);
    }
}
```

## 数列の A 番目から B 番目までの和
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_partsum/edit?language_uid=c-sharp)
```C#
using System;
using System.Linq;
class Program
{
    static void Main()
    {
        int[] NAB = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int[] num = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int sum = 0;
        for (int i = NAB[1]; i <= NAB[2]; i++)
        {
            sum += num[i - 1];
        }
        Console.WriteLine(sum);
    }
}
```

## 数列の値を全部 * 2 して出力
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_multi/edit?language_uid=c-sharp)
```C#
using System;
using System.Linq;
class Program
{
    static void Main()
    {
        int N =int.Parse(Console.ReadLine());
        int[] num =Console.ReadLine().Split().Select(int.Parse).ToArray();
        for(int i=0;i<num.Length; i++)
        {
            Console.WriteLine(num[i]*2);
        }
    }
}
```

## 数列同士の引き算
[問題文](https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_sub/edit?language_uid=c-sharp)
```C#
using System;
using System.Linq;
class Program
{
    static void Main()
    {
        int N =int.Parse(Console.ReadLine());
        int[] a =Console.ReadLine().Split().Select(int.Parse).ToArray();
        int[] b =Console.ReadLine().Split().Select(int.Parse).ToArray();
        for (int i=0;i<N; i++)
        {
            Console.WriteLine(a[i] - b[i]);
        }
    }
}
```
【Rails】コメント機能の導入

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/ba116efb-61eb-dc57-1a2f-df63c1ee8dba.png)
1:Railsで作成したアプリにコメント機能を導入する。

2:comment機能の実装手順
①commentモデルの作成
②アソシエーションの設定
③バリデーションの設定
④ルーティングの設定
⑤commentsコントローラーの作成・編集
⑥postsコントローラーの編集
⑦ビューファイルの編集
svnのcleanupが失敗になった場合

# 事象
svnのcleanupを実行実行する場合、よくエラーが発生してうまく実行できないです。
```
cleanup failed to process the following path
previous operation has not finished；run clean up if it was interrupted ;
please excute the cleanup command
```

# 解決方法:
強制的にクリーンアップする。
```
上記の手順でも問題が解決しない場合、TortoiseSVN の "強制的なクリーンアップ" 機能を試すことができます。
作業コピーのルートディレクトリを右クリックし、
"TortoiseSVN" を選択し、Shift キーを押しながら "CleanUp..." を選択します。
これにより強制的なクリーンアップのダイアログボックスが開きます。
```

:::note warn
警告
強制的なクリーンアップは未コミットの変更を失う可能性があります。強制的なクリーンアップを実行する前に、作業コピーのバックアップを取ることをお勧めします。
:::
CDNについて気になったので調べてみました

## きっかけ
ライブラリなどを使用する際、使用方法の選択肢一つにCDNの項目がよくあるかと思いますが、恥ずかしながらあまりよく理解していなかったため、今回調べてみようと思いました。

### CDNとは
CDN・・・「コンテンツデリバリーネットワーク」
インターネットコンテンツの配信を効率化し、高速化するためのネットワークシステムのこと。CDNは、ウェブサイトのテキスト、画像、動画などのデータを、利用者がアクセスした際に最も近いサーバーから迅速提供する仕組みを指します。


### どういったメリットがあるか
1. キャッシング： CDNはウェブサイトのコンテンツをキャッシュし、ユーザーのリクエストに応じてそのキャッシュを提供します。これにより、データの伝送時間が大幅に短縮され、ウェブサイトの表示速度が向上します。

1. 耐障害性の向上: CDNを使うと、同じコンテンツが全世界のサーバーに分散されるため、一部のサーバーに問題が発生しても他のサーバーからコンテンツを配信することができます。これにより、ウェブサイトのダウンタイムを防ぐことができます。

1. 節約： 静的なファイルを自分のサーバーから配信すると、その分だけサーバーのリソースを消費しますが、これらをCDNに任せることで、サーバーリソースを節約し、より重要な動的コンテンツの配信に専念することができます。


### 最後に
まだまだ知らないシステムや用語など多々あるので、都度調べつつ知識を身に着けていればと思いました！
[Delphi?][ネタ]透明に見えるパターンを描く

# 透明に見えるパターン

一部の人達には透明に見えるこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/be756f8b-32bf-4f32-464e-b1a2c5a2274c.png)

画像ビュワーでこれ出したいなあと思ってコードを書いてみました。
png 画像の透明部分にわざわざこのパターンを描いて透明なのか透明じゃ無いのかっていう状態にできます！

```delphi:透明部分に透明を描く！
// uses に System.UITypes, FMX.Types, FMX.Graphics を追加

procedure DrawTransPattern(const ABmp: TBitmap);
type
  TAlphaColorArray = array [0.. 0] of TAlphaColor;
  PAlphaColorArray = ^TAlphaColorArray;
const
  TRANS_COLORS: array [0.. 1] of TAlphaColor = ($ff_ff_ff_ff, $ff_cc_cc_cc);
begin
  if ABmp.PixelFormat <> TPixelFormat.BGRA then
    Exit;

  var Data: TBitmapData;
  ABmp.Map(TMapAccess.Write, Data);
  try
    for var Y := 0 to Data.Height - 1 do
    begin
      var Line := PAlphaColorArray(Data.GetScanline(Y));

      {$R-} // 範囲チェックするとエラーになるので範囲チェックさせない
      for var X := 0 to Data.Width - 1 do
        if Line[X] and $ff_00_00_00 = 0 then
          Line[X] := TRANS_COLORS[((X xor Y) and %0000_1000) shr 3];
    end;
  finally
    ABmp.Unmap(Data);
  end;
end;
```

# 使い方

こんな風に Bitmap を渡すだけ！

```delphi:使い方
procedure TForm1.Button1Click(Sender: TObject);
begin
  DrawTransPattern(Image1.Bitmap);
end;
```

すると、↓これが
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/23dee33e-1ec3-a6db-c417-4d511ac5de86.png" width=400>

こう！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/b2491380-d735-f5e7-eb19-4b84e7148096.png" width=400>

# おわりに
みんなでいろんな物を透明にしよう！

ちなみにこのキャラクターはシリアルゲームズの公式キャラ「シリアちゃん」です！
シリアちゃん公式サイト：https://seria.serialgames.co.jp/

この市松模様を書くコード、コードゴルフの題材になりませんかね…？
Chainlitを試してみる

Twitterで流れてきたのを見かけました。普段はstreamlit使っているので、どんな感じなのかワクワクしながら試しました。そして、すごかった。

https://github.com/Chainlit/chainlit

# インストール

```
pip install chainlit
```

# Hello chainlit

```
chainlit hello
```

おおー、チャットのUIだ。

![Screenshot 2023-06-06 at 20.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4707e1b9-eade-8368-cde3-870c767e0c8d.png)
![Screenshot 2023-06-06 at 20.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e998194d-9452-084f-8509-5664405c4a93.png)

でも、これはまだガラだけなので、Get startedをやってみます。

# Pure Python

streamlitと同じように、pyファイルにロジック記述します。

```py:app.py
import chainlit as cl


@cl.on_message
def main(message: str):
    # Your custom logic goes here...

    # Send a response back to the user
    cl.Message(
        content=f"受信: {message}",
    ).send()
```

`-w`は、オートリロードのスイッチ。

```
chainlit run app.py -w
```

カスタマイズできましたが、これもまだモックの状態。

![Screenshot 2023-06-06 at 20.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/90db4a7d-2153-8ac8-d0cf-003bc81f7914.png)

# LangChain連携

今回の山場。

https://docs.chainlit.io/langchain

LangChainが入っていない場合には、`pip install langchain`でインストールします。あと、OpenAI APIのAPIキーも取得しておきます。

```py:langchain.py
import os
from langchain import PromptTemplate, OpenAI, LLMChain
import chainlit as cl

os.environ["OPENAI_API_KEY"] = "<OpenAI APIキー>"

template = """質問: {question}

回答: ステップバイステップで考えてみましょう。"""

@cl.langchain_factory
def factory():
    prompt = PromptTemplate(template=template, input_variables=["question"])
    llm_chain = LLMChain(prompt=prompt, llm=OpenAI(temperature=0), verbose=True)

    return llm_chain
```

LangChainのプロンプトテンプレートを使うということですね。

```
chainlit run langchain.py -w
```

メッセージを送信すると、LLMChain経由でOpenAI APIを呼び出します。

![Screenshot 2023-06-06 at 20.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1447f90b-ab83-b563-dc13-166346c7b86a.png)

動きました！
![Screenshot 2023-06-06 at 20.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c2b7816e-0a6a-8182-56a4-c17b60d0b63a.png)

なお、ターミナルではプロンプトを確認できます。
![Screenshot 2023-06-06 at 20.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a98525c7-7dd4-13ed-3847-8d3640b8a7ab.png)

いやー、フロントエンドはもうこれでいい感じです。
![Screenshot 2023-06-06 at 20.27.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8d36a55e-841a-f782-777d-da5cc91bf5dd.png)
新卒がLaravelのトランザクション実装について学んだこと

# はじめに
Laravelを触って２ヶ月の新卒エンジニアがトランザクションについて調べたことをまとめました。本記事は、トランザクションについて全く知識がない人・Laravel初心者を対象としてます。

# トランザクションとは？

データベーストランザクションは、複数のデータベース操作が一連の流れとして扱われ、全てが成功するか、全てが失敗する（ロールバックされる）かのどちらかとなる仕組みです。これは一部だけが成功すると、データの整合性が失われる可能性があるため重要です。

下記は処理を図解したものです。


```mermaid

graph TD
    A[トランザクション開始]
    B{データベースへ書き込み}
    C[失敗した場合]
    D[トランザクション成功]
    E[全てのクエリに問題なく成功した場合]
    F[トランザクション失敗]
    A --> B
    B --> C
    C -->|Rollback| D
    B --> E
    E -->|Commit| F
    style A fill:#f9f,stroke:#333,stroke-width:4px
    style B fill:#dcdcdc,stroke:#333,stroke-width:4px
    style C fill:#ccf,stroke:#333,stroke-width:4px
    style D fill:#ccf,stroke:#333,stroke-width:4px
    style E fill:#cfc,stroke:#333,stroke-width:4px
    style F fill:#cfc,stroke:#333,stroke-width:4px
    classDef class1 font-size:20px;
    class A,D,F,C,E class1



```
# 具体例
## 1. 手動でトランザクションを管理する方法
手動でトランザクションを管理する場合、
1.開始 (beginTransaction())、
2.コミット (commit())
3.ロールバック (rollBack()) 
を自分で制御します。

```php
try {
    DB::beginTransaction();
    // データベース操作
    // ...

    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();

    // 例外処理
    // ...
}
```
ここでは、try ブロック内で何らかのエラーが発生すると、catch ブロックが実行され、すぐに rollBack() メソッドが呼び出されます。これにより、beginTransaction() から rollBack() までの全てのデータベース操作が無効化されます。

## 2. クロージャを使用する方法

Laravel の DBファサードのtransactionメソッド（DB::transaction()）を使用すると、クロージャ（無名関数）を引数として渡すことができます。この方法を使用すると、トランザクションの開始と終了（成功時のコミットと失敗時のロールバック）を自動的に処理します。

```php 
DB::transaction(function () {
    // データベース操作 
    // ...
});
```
この例では、クロージャ内で例外が発生すると自動的にロールバックされ、例外が発生しなければ自動的にコミットされます。これにより、手動でトランザクション管理をする場合よりも、より簡潔で安全なコードが書けます。

# デッドロックの対策
## デッドロックとは
デッドロックはトランザクション内で互いに排他的なロックを待つ二つ以上のプロセスが発生すると、データベースのロック状態となります。これは、互いに他のプロセスがロックを解除するのを待つ状態で、永遠に解決しない待機状態が発生します。

### 手動でトランザクションを管理する方法の場合

トランザクション中に何らかのエラー（デッドロックを含む）が発生した場合、catch ブロックが実行され、DB::rollBack() によりトランザクションがロールバックされます。

### クロージャを使用する方法
クロージャを使用してトランザクションを管理する場合、Laravelはトランザクション内で発生する例外を自動的にキャッチしてロールバックします。さらに、再試行回数を指定することで、デッドロックが発生した場合の再試行を容易に行うことができます。このデッドロックを発生させないため›の対策としてタイムアウトやリトライ回数の設定

```php
$retryTimes = 3;
DB::transaction(function () {
    // データベース操作
}, $retryTimes);

```
上記のコードでは、トランザクション内で例外が発生した場合（デッドロックを含む）、Laravelはトランザクションを指定した回数（この場合は3回）再試行します。再試行回数を指定することで、短期的なデッドロック問題を解決することができます。

# どちらの書き方がいいか？

細かい制御が必要な場合や、途中でコミットしたい場合は、手動管理が適しています。しかし、より簡潔で安全なクロージャを使用した方法が[推奨されます。](https://laravel.com/docs/9.x/database#database-transactions)

# まとめ
Laravelのトランザクション処理は要件や使う場所によって、手動管理とクロージャによる自動管理を分けることが良いと思いました。今後もトランザクションの理解を深めていきます！

# 参考記事
https://readouble.com/laravel/9.x/ja/database.html
タイムゾーンを変更したときは cron を再起動すべし

Webサーバーのログは正しい時刻で記録されるものの、どうも cron の起動時刻がおかしい。
なんか 9時間後に起動されてる… 9時間後? そうかタイムゾーンか。

そういえば Ansible Playbook でサーバー構築後、一回も再起動していない。

………

**そうなんです。 タイムゾーンを変更したときは cron の再起動も必要なのでした。**

Ansible Playbook を以下のように記述して、タイムゾーンを変更したら cron が再起動されるようにしておきましょう。

## タスク
```yaml:roles/foobar/tasks/main.yml (一部)
- name: set timezone
  timezone: name="Asia/Tokyo"
  tags:
    - timezone
  notify:
    - cron restart
```

## ハンドラー
```yaml:roles/foobar/handlers/main.yml
- name: cron restart
  service: name=cron state=restarted
```

以下の記事に救われました。


https://zenn.dev/noraworld/articles/cron-timezone
[nvim]coc.nvimを追加する(vim-plug)

# coc.nvimをnvimに追加する手順

neovim & vim-plug初心者(私)がcoc.nvimを導入するまでのメモ

## 事前準備
node.jsをインストールをしておく

## 1. init.vimにPlugをコピペする

``` init.vim
call plug#begin()
"ここにPlugInを追加する"
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()
```

その後:PlugInstallする

```
:PlugInstall
```


やり方はcoc.nvim(github)のQuick Start For vim-plug users:に書いてあります。
https://github.com/neoclide/coc.nvim

## 2. vimでextensionsをインストールする

extensionsはたくさんあるので、使いたいものをインストールする。
下にリンクを貼っているので、そこから各言語のコマンドを見ることができます。

例:coc-htmlの場合

```
:CocInstall coc-html
```

extensions一覧↓
https://github.com/neoclide/coc-html
![スクリーンショット 2023-06-06 20.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c09ef2a5-313d-6a2f-5084-4414bb882d23.png)

## 3. vim index.html

こんな感じでレコメンドしてくれます。
Ctrl + yで補完してくれます！

![スクリーンショット 2023-06-06 20.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/7899297f-c552-ea97-0144-4e035588a2d9.png)


以上。
【個人開発】キリ番を判定するGoライブラリを作りました。

# キリ番とは

キリ番は節目や目標達成を象徴し、人々に喜びや達成感を与えます。ウェブサイトやオンラインプラットフォームでのアクセス数やフォロワー数の特定の節目は、成果や進捗の目安として重要視されます。また、キリ番は象徴的な意味を持ち、幸運や繁栄を象徴するとされています。これらの数字は完全性や調和、ポジティブなエネルギーを表し、人々に特別な意味を与えます。キリ番の達成は人々の関与や認知を促し、コミュニティやオンラインプラットフォームの活性化につながることがあります。そのため、キリ番は目標達成や節目の祝福だけでなく、人々のモチベーションや関与を高め、ポジティブな雰囲気を醸し出す重要な要素と言えます。

……とchatGPTが言ってました。

# どういうライブラリ？

キリ番かどうかを判定したり、次のキリ番を返したりするGoのライブラリです。
リポジトリは以下です。

https://github.com/kumackey/kiriban

# 使い方

ほぼREADMEに書いてある内容通りですが、こちらにも載せます。

## インストール

```bash
$ go get github.com/kumackey/kiriban
```

## サンプルコード

```go:main.go
package main

import (
	"fmt"
	"github.com/kumackey/kiriban/pkg/kiriban"
)

func main() {
	c, _ := kiriban.NewChecker()

	v1 := c.IsKiriban(10000)
	fmt.Printf("10000 is kiriban? -> %t\n", v1)

	v2 := c.IsKiriban(10001)
	fmt.Printf("10001 is kiriban? -> %t\n", v2)

	v3 := c.JudgeKinds(100000)
	fmt.Printf("100000 is %s\n", v3[0])

	v4 := c.Next(100000)
	fmt.Printf("next kiriban of 100000 is %d\n", v4)
}
```

## 実行結果

```bash
$ go run main.go
10000 is kiriban? -> true
10001 is kiriban? -> false
100000 is Trailing zeros
next kiriban of 100000 is 111111
```

# 工夫した点

- キリ番の判定はぶっちゃけ正規表現を使うと楽だが、流石に重くなったので使わない方法で頑張って、パフォーマンスを改善した。
- 将来的に様々なキリ番判定方法に対応できるように、[functional options pattern](https://golang.cafe/blog/golang-functional-options-pattern.html)を使った。
- ~~おまけ程度の~~テストとCIを書いた。

# 最後に

みなさんも幸福や繁栄の象徴であるキリ番を判定する機会がよくあると思われますので(?)、いっぱい使ってください。
元の画面位置にスクロールさせる実装について

## はじめに
前回画面スクロールの処理について書いてみましたが、ページ遷移前の画面のスクロール場所を保持し、
元のページに戻った際に先ほどの画面位置にスクロールする実装を行ったので備忘録として残しておきます。
(コメントで教えていただいたソースコードを使用させていただき、若干修正しております。
ありがとうございます！)
<br>

| 環境| | 
|:--:|:--:|
| OS       | Windows10 22H2 |
| エディター | Visual Studio Code|

## やりたいこと
編集ボタンを押下し、修正が完了した後、
一覧画面で先ほど押下した時点での画面位置にスクロールさせたい。

①編集ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/ca5e1b9a-71d6-8a83-54b5-8d00580d5616.png)

②編集画面にページ遷移するので、修正して修正ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/a8c770a1-eecf-f860-b165-ec9aa3265059.png)

③一覧画面に戻るときに、先ほどの画面位置までスクロールさせたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/ca5e1b9a-71d6-8a83-54b5-8d00580d5616.png)

## 実装方法
編集ボタンのidを ``"modify_btn"`` としています。
クリックされた要素のidがmodify_btnのとき、
スクロール位置をsessionStorageに保存しています。

```javaScript:index.ejs
<form action="/modify" method="GET">
    <input type="hidden" name="default_taskid" value="<%= result.id %>" />
    <input type="hidden" name="default_task" value="<%= result.content %>" />
    <input type="hidden" name="default_date" value="<%= result.date %>" />
    <input type="hidden" name="default_time" value="<%= result.time %>" />
    <input class="btn btn-primary" type="submit" value="編集" id="modify_btn" />
</form>

<script>
window.addEventListener('load', loadFinished);
function loadFinished() {
    var OffsetTop = sessionStorage.getItem("OffsetTop");
    window.scroll({
        top: OffsetTop,
        behavior: 'smooth',

    // sessionStorage削除
    sessionStorage.removeItem("OffsetTop");
}

document.addEventListener('click', event => {
    if (event.target.id === 'modify_btn') {
        //スクロール位置取得
        var location = window.pageYOffset;
        // sessionStorageに保存する
        sessionStorage.setItem('OffsetTop', location);
    }
});
</script>
```

## 最後に
この実装方法だと、JavaScriptだけで完結するので、実装しやすかったです。

## 参考文献
この記事は以下の情報を参考にさせていただきました。

- [JavaScript | スクロールの位置を取得する](https://1-notes.com/javascript-get-the-scroll-position/)
- [Node.jsによるWebアプリケーション作成入門](https://zenn.dev/wkb/books/node-tutorial)
- [クリックした要素の場所まで画面スクロールさせる実装について](https://qiita.com/mitsuyossy/items/a9411e76dccf40fa12d5)
KiCadで面付けする時の覚書

# KiCadで同一基板を面付けするときのやり方メモ

1. 面付けしたい回路を開き、別名をつけて保存する
    1. xxx_panelize.kicad_pcb
1. 回路全体を選択し、右クリック → 配列を作成
1. 配置した回路の外形線(Edge.Cuts)を削除する
1. 実際に作る外形図を作る
    1. 10mmぐらい前後左右に捨て基板を作る
1. 実際の基板の外形に当たる線を裏シルク(B.SilkS)で記載する
1. B.SilkSで記載した線の隣に `V-Cut→`を記載する
    1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133206/7605e7d8-b16f-cdd0-32d4-3cf7a8fd9aba.png)
1. 捨て基板の4隅に基板位置決め用の穴を配置する
1. ステンシルに穴を開けてほしい旨をB.SilkSで記載する
    1. `Open this hole on the stencil→`みたいな感じで
    1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133206/4b52e94c-3d78-7c6b-93b3-6e928c1d895b.png)
1. 3Dで確認して、正しく表示できてれば多分大丈夫




### "配列を作成" の設定メモ
4枚面付けしたい場合は以下

| 項目 | 設定値 |
|:-:|:-:|
| 横方向の数 | 2 |
| 縦方向の数 | 2 |
| 横方向の間隔 | 0 |
| 縦方向の間隔 | 0 |
| 横方向のオフセット | 基板の横方向のサイズ |
| 縦方向の間隔 | 基板の縦方向のサイズ |
GCPの監査ログの出力設定をTerraformでおこなう【GCP/Audit Logs/Terraform】

# やりたいこと
GCPの監査ログの出力設定をTerraformでおこなう

[GCPの4種の監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#types)のうち、自分であれこれ設定できる「[データアクセス監査ログ](https://cloud.google.com/logging/docs/audit/configure-data-access?hl=ja)」について、Terraformで有効化したい。


# やりかた
- [google_project_iam_audit_config](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam#google_project_iam_audit_config)を使用する。
    - `audit_log_config`には、有効化したいデータアクセス監査ログの種別を設定する。

### 全部のサービスをいっきに有効化したい場合
```terraform
resource "google_project_iam_audit_config" "sample" {
  project = "sample_project"

  service = "allServices"

  # 有効化したい監査ログの種別を列挙する
  audit_log_config {
    log_type = "ADMIN_READ"
  }
  audit_log_config {
    log_type = "DATA_READ"
  }
  audit_log_config {
    log_type = "DATA_WRITE"
  }
}
```

### 特定のサービスだけ有効化したい場合は以下。
- サービス名は、[こちら](https://cloud.google.com/logging/docs/api/v2/resource-list)を参照。

```terraform
resource "google_project_iam_audit_config" "sample" {
  project = "sample_project"

  # 有効化したいサービスを列挙する
  for_each = toset([
    "run.googleapis.com",
    "storage.googleapis.com",
  ])

  service = each.value

  # 有効化したい監査ログの種別を列挙する
  audit_log_config {
    log_type = "ADMIN_READ"
  }
  audit_log_config {
    log_type = "DATA_READ"
  }
  audit_log_config {
    log_type = "DATA_WRITE"
  }
}
```

# つまづいたことメモ
サービス名を指定するところで、いつものサービス名（API名）（ここでは`sqladmin.googleapis.com`）を指定したところ、
「そんなサービスはないか、サービス単位の監査ログの対象じゃない」とエラーになり焦っていた。
いつものサービス名と、Loggingの文脈でのサービス名は、違うっぽい・・？
```
Error 400: 
Service sqladmin.googleapis.com does not exist or does not support service level configuration of Google Cloud audit logging., 
badRequest
```

# 参考URL
[Terraform公式ドキュメント - google_project_iam_audit_config](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam#google_project_iam_audit_config)

[CloudLogging公式ドキュメント - Mapping services to Logging resource types](https://cloud.google.com/logging/docs/api/v2/resource-list)
初動対応の5C：最適な初動対応を考える

:::note warn
執筆者により予告なく編集される場合があります。
:::

インシデント対応の"前捌き"という表現をよくされることがありますが、この文書では、その"前捌き"（初動対応）において重要な要素を整理してみました。
ここでは、**インシデントの現場に駆けつける必要のある方々向けの初動対応**として記載しています。
初動対応の見直しを検討している組織の方や、これから初動対応をされる方の一助になれば幸いです。

# 初動対応とは
インシデントが発生した際、初動対応は迅速かつ正確に行われることが重要です。
初動対応の質は、**インシデントの被害の最小化や復旧のスピード**に直結します。

この文書では、被害の最小化と復旧に焦点を当てた初動対応のメソッドをまとめています。

## 初動対応で実施しなくてはいけないこと
初動対応において、**優先順位の設定**が重要です。
インシデントの種類や影響度に応じて、対応の緊急度を適切に評価します。
被害の大きさや事業への影響度などを考慮し、対応の優先順位を明確化することで、リソースの効果的な配分や効率的な対応が可能となります。

この文書では、読者の方がインシデントの現場で、最初に行わなくてはいけないことを定義しました。

# "初動対応の5C"
![2023-10-10 0.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492180/0fd43b7a-370a-747d-5579-4981375f15ae.png)


様々な組織で、インシデント対応を行うために、インシデント対応フローを策定したり見直しを実施しています。その中で、専門的な対応はセキュリティユニット（CSIRT/SOC、外部ベンダー）が実施するとしても、セキュリティユニットに連携するために初動対応を行う必要性があります。

ここで、初動対応で行うべき対応を5C（Conrim, Clear, Cordon, Contact, Control）として定義し、一つずつ見ていきたいと思います。

## 1. Confirm：現状確認
インシデントが発生し、駆けつけた場合に「現状の確認」を行います。
事故なのか、攻撃なのか、発生の原因にアテをつけながら、現場でのヒアリングを通して、当事者に状況を確認していきます。

ヒアリングは、5W1H[^5W1H]で行われ可能であれば記録されることが望まれます。
[^5W1H]:5W1Hとは、「When：いつ」「Where：どこで」「Who：だれが」「What：何を」「Why：なぜ」「How：どのように」といった英単語の頭文字を取った思考整理のフレームワークのことを指します。

**ここで、被害を抑止できる、または被害を多少受容してでも、原因追究のために、証拠保全を優先した方がよいと判断した場合は、証拠の保全を考えます。**


## 2. Clear：安全確保
安全確保には、には以下の方法があります。
  (1)脅威から遠ざかる
  (2)脅威を遠ざける
  (3)守るべき対象と脅威との間にバリア（境界線・壁）を作る

いずれかの手法をもって、安全を確保し、被害拡大を防ぎます。
具体的には、抜線対応によって脅威から遠ざけたり、アンチウイルスソフト（EPP)などによって脅威を遠ざけます。また、脅威が明確な場合には物理・論理的な制御によって脅威を隔離します。

**前項目で、証拠保全を優先している場合、可能な限り変更点を記録・記憶します。**

## 3. Cordon：遮断
遮断には、「境界線を張る」、「壁を作る」という意味が含まれており、**「脅威」と「守る対象」とを明確に区別します**。守るべき対象に対して「脅威」（危険）が及ばないように**対策を行います**。

具体的には、発生している脅威を遮断・隔離して封じ込めるようにし、二次被害が発生しないようにします。Clear：安全確保に近いものがありますが、主たる制御目的として、前者は守るべき対象の保護を優先し、こちらは二次被害を抑止する目的の差があります。
ただし、あくまでも記載として順番だけのため地続きで作業が行われたり、判断として一緒に考えることが常となります。

**前項目で、証拠保全を優先している場合、可能な限り変更点を記録・記憶します。**

## 4. Contact：応援要請
現状確認を行い、一次的に脅威を遠ざけ、リスクを軽減した後に、必要な応援要請や、状況の報告を行います。一旦、脅威から遠ざけても、事態が適正に収拾されない限り、また新たな脅威が及び、被害が拡大する可能性があります。
必要に応じて法執行機関を含む関係各所に連絡を取ります。

## 5. Control：状況管理
要請した応援などが到着するまでの間、現地での状況管理をします。
具体的には次ようなことを指します。
- 被害状況の有無
- 影響の出ているシステムの確認
- 他の危険の有無
- 対処を必要とする他の事象がないかの見極め
- パニック状態に陥っている人のケア
- 応援が到着した際の誘導、状況報告


# まとめ
インシデント初動対応は、迅速かつ"正確な判断"と"行動"が求められる重要なフェーズです。
これらの要点を押さえ、効果的な手法を実践することで、インシデントへの早期対応と迅速な復旧を実現できます。


**◼️ 初動対応の5C**
 1. Confirm：現状確認
 2. Clear：安全確保
 3. Cordon：危険遮断
 4. Contact：応援要請
 5. Control：状況管理

ここまで、インシデントの初動対応において実施すべき内容を整理しました。
インシデントが発生し、現場に急行した際に、迅速にこれらの対応を行い、必要な機能を有する仲間や同僚、専門家との適切な連携が不可欠です。

また、今回の文書に、直接的なインシデント対応や、記者会見に関する内容については、含まれておりません。

インシデント対応に入る際には、更に適切なチーム編成とコミュニケーションが重要となります。
初動対応で入った場合、リーダーシップと的確な指示能力を持ったリーダーの資質も求められます。
必要に応じて、そうした資質を伸ばす訓練をしていきましょう。


# 参考文書

- 証拠保全ガイドライン 第9版
https://digitalforensic.jp/wp-content/uploads/2023/02/shokohoznGL9.pdf
[Hyper-V]Ubuntuにログイン後、フリーズする場合の対処・回避策

## 背景
Windows11のHyper-VにUbuntu22.04をisoファイルからインストールして作業していたが、急にマウスもキーボードも反応せずフリーズしてしまった。
再起動後ログイン画面まではマウス、キーボードは反応するが、ログイン後は同じくフリーズしてしまう。
新しいisoファイルをDLして再インストールしてみたが、同じくログイン後にフリーズしてしまった。

## 解決策①
ctrl+alt+f3　⇒　ctrl+alt+f1で再ログインするとフリーズが解け、動くようになる。
しかし、私の場合しばらくするとまたフリーズしてしまった。そのため、下記解決策②を実施したところ事象は解決した。

## 解決策②
Hyper-Vで用意されているクイック作成からUbuntuのイメージをDLしてインストールを行う。
特にオプションをいじる必要はなく、デフォルトの状態でインストールを進めたところ問題なく動くようになった。

:::note warn
事象は解決したが、Ubuntu側で「システムに問題が発生しました。」というエラー（表示されるだけで特に不具合はない）が時折出てくるため、そもそもスペックが足りないのかもしれない。
:::
【Laravel】デバッグのdd()にファイル名と行数を表示する方法

## はじめに
- Laravelのデバッグで`dd()`はたくさんお世話になるかと思うのですが、たまに多用しているとどこの`dd()`が動いているのかわからなくなってしまうことがありました(特にvendor内の挙動とかを確認してるときに変更履歴が残らないため)ので、今回その対処法を公開。

:::note warn
- Laravel 9.32以後では、行数やファイルなども表示されるようになっているので、9.32以前使用者向けです
- Laravel6以降`ddd()`で見れるかと思いますが、個人的にいらない情報もあるので、シンプルにデータだけ見たい`dd()`でデバッグする人向けです。
:::

## 実現したいこと
- `dd()`でデバッグしたときに、どのファイルのどこで使われているのか(止まっているのか)表示する。

## 前提(準備)
- Laravel 9.32以前の環境

## 使い方
- 第一引数に、確認したい変数などを入れて、第2引数にPHPのビルトインマジック定数を使用してファイル名と行数を出力する。
    - 自分はよく使うので、スニペットとして登録してます

```PHP
dd($data, __FILE__ . ':' . __LINE__);
```


- なお、上記の方法で表示されるファイル名は絶対パスとなるため、
プロジェクトのルートディレクトリからの相対パスを表示したい場合は、以下のように`str_replace()`関数を用いることで相対パスで表示できます

```PHP
dd($data, str_replace(base_path() . '/', '', __FILE__) . ':' . __LINE__);
```


## デモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/d7322b42-2d77-f83d-82dd-08b3fda6935d.png)

## 終わりに
こんな感じのプチ便利なVSCode拡張とか暇があれば今後作ろうかと思います！
RubyでAtCoder ABC304(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC304のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - First Player
https://atcoder.jp/contests/abc304/tasks/abc304_a
```ruby:a-304.rb
n = gets.to_i

name_group, age_group = [], [] 
n.times do
  s, a = gets.split
  name_group << s
  age_group  << a.to_i
end

start_point = age_group.index(age_group.min)
start_point.times{ name_group << name_group.shift }
puts name_group
```
## 解説
最少年齢の人のインデックスを求め、その回数分`name_group`の先頭にある名前を末尾に移動させることで解くことができます。

# B - Subscribers
https://atcoder.jp/contests/abc304/tasks/abc304_b
```ruby:b-304.rb
str = gets.chomp
n = str.size
puts n <= 3 ? str : str[0..2] + ("0" * (n - 3))
```

# C - Virus
https://atcoder.jp/contests/abc304/tasks/abc304_c
```ruby:c-304.rb
n, d = gets.split.map(&:to_i)
points = Array.new(n){ gets.split.map(&:to_i) }

array = Array.new(n, false)
array[0] = true
stack = [0]
while node = stack.pop
  x, y = points[node]
  points.each_with_index do |(nx, ny), i|
    next if array[i] || (x - nx) ** 2 + (y - ny) ** 2 > d ** 2
    stack << i
    array[i] = true
  end
end
puts array.map{ |infected| infected ? "Yes" : "No" }
```
## 解説
DFSにより、それぞれの人に対して感染しているかどうかを探索することができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
WWDC23のメモ

# 個人的かつ超適当なメモ
個人的なメモを下にまとめてみました。
間違っているところがあればコメントで教えていただけると幸いです。
それにしてもやっと発表か、ARデバイス。

## 01: \[Machine\] Macbook Air 15 inch
* M2 搭載
* 15.3 inch のディスプレイ
* インカメは1080p
* $1,299~ (学生価格:$1199~)

## 02: \[Machine\] Mac Studio
* M2 Max / M2 Ultra 搭載
* ProDisplayXDRを6台接続可能。
* Wi-Fi 6E対応
* $1,999~

## 03: \[Machine\] Mac Pro
* M2 Ultra 搭載
* Thunderbolt 8つ (2/背面6)
* PCI拡張カード(gen4)スロットが6基（＊GPU不可）
* $6,999~

## 04: \[OS\] iOS 17
* __Contact Poster__ =>日本語や中国語やと縦書き可能。フォントや色など色々変更可能。CallKitを用いてVoIPアプリにも適用可能。
* __Live Voicemail__ =>電話に出ず相手が喋ってる内容を書き起こしてくれる？
* メッセージでのインライン返信がより簡単に
* 音声メッセージにおいて音声の内容を読み上げてくれる
* __Check In__ =>目的地にきちんと向かってるかなどを共有してくれる
* __Stickers__ =>ステッカーをメッセージに貼り付けることができる、大きさなども調整可能。
* __NameDrop__ =>iPhone/Apple Watch 間で連絡先の共有が簡単になる
* AirDropの範囲を超えてもネット経由で品質を落とさず共有することができる
* キーボードの学習が賢くなる
* __Journal__ =>iPhoneに新しく来るアプリ　日記を簡単に始めることができるアプリ　候補はSuggestions API経由で提案される
* __Standby__ => iPhoneを充電して横に置いておくと時計など限られた情報のみが表示される（Apple Watchの充電中のやつみたいな）＊対応機種不明（多分MagSafe対応デバイスのみかなと）
* MapアプリにてオフラインMapを利用可能に
* ペットもアルバムに追加可能

## 05:\[OS\] iPadOS 17
* ウィジェットとロック画面のカスタマイズが可能に。（iPhoneのようになる）
* iPadにヘルスケアのアプリがやってくる（iOSのデータがiCloud経由で同期される）
* PDFの編集がさらに容易に（Live Collaborationが可能になる）
* 万年筆と水性ペンがマークアップに追加
* 外部カメラが利用可能なる？？？
* その他iOS 17の機能の一部が利用可能に

## 06:\[OS\] macOS Sonoma
* スクリーンセーバー
* ウィジェットをホーム画面に追加可能、MacになくてもiPhoneにあれば追加可能に！！
* ゲームのプレイがより快適になる (Game Porting Toolkit)
* __Presenter Overlay__ =>画面の中に自分を追加可能になる
* ジェスチャーでエフェクトが自動で表示される
* パスワードやパスキーを安全に共有可能になる
* __Profiles__ =>Safariでプロファイルごとに分けることが可能に
* Webアプリを追加可能に！（PWAのサポートってこと？？）

## 07:\[OS\] Other (Audio関係)
* AirPodsがよりシームレスに、また自分だけの世界を作ることができるようになる
* AirPlay in hotels QRコードをスキャンしてWiFiに自動接続、コンテンツのAirPlayが可能になる
* CarPlayでSharePlayを導入、同乗者がそれぞれのiPhoneから音楽を調整可能に。
* Apple TVのコントロールパネルが刷新される
* iPhoneを使用してSiri Remoteを探索可能
* FaceTimeにApple TVから参加可能

## 08:\[OS\] Watch OS 10
* スマートスタックのウィジェットを簡単に確認可能に
* ケイデンスセンサー、スピードセンサーやパワーメーターなどがBluetooth経由で接続可能に
* iPhoneのライブアクティビティで詳細をワークアウト中に確認可能に！
* 詳細な地形図が導入
* スイングの角度などより詳細なデータにアクセス可能
* メンタルヘルスケアも容易に

## 09:\[OS\] Apple Vision Pro
* ARカメラ搭載
* バックに背景を設定してスペースを設定可能
* iCloud経由でさまざまなアプリが同期される
* Macの画面を投影うることも可能
* M2チップ/R2チップを搭載
* どうやらvisionOSはiOSベースらしい
* UnityべースのアプリがvisionOSで利用可能になる
* $3,499~
MacにHomebrewを導入する

# はじめに
macを購入したら最初に行う`Homebrew`の導入について、その手順を確認します。
本記事の内容を説明した動画も末尾に掲載しています。

# 動作環境
本記事は以下の環境で動作確認しています。
```
macOS: 13.4
CPU: M1
```

# Homebrewのインストール
ブラウザで、`homebrew install github`などで検索すると、以下のGithubの[サイト](https://github.com/Homebrew/install)がヒットします。

https://github.com/Homebrew/install

こちらのREADMEにはHomebrewを導入するためのコマンド、および削除するためのコマンドが共に掲載されています。（インストールについては、[公式サイト](https://brew.sh/index_ja)でも良いと思います。）

インストールコマンドをコピーして、ターミナル上で実行します。
```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

# PATHを通す
インストールに成功したら、PATHを通します。
ターミナル上にはそのためのコマンドが２つ表示されているかと思いますので、そのままコピペで実行します。
```shell
# 1つめ
(eho; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/user/.zprofile
# 2つめ
eval "$(/opt/homebrew/bin/brew shellenv)"
```

# バージョン確認
ここまでの作業が問題なければ以下のコマンドを実行してバージョン確認しておきます。
```shell
brew -v
```
正常にインストールが完了し、正しくPATHが通っていればバージョン情報が表示されます。

# 参考
- [Github](https://github.com/Homebrew/install)
- [Homebrew](https://brew.sh/index_ja)

# 動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/EYRle3yQSdA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
input type="text"とtextareaの使い分け

## 概要
HTMLには、ユーザからテキスト入力を受け取る為の要素が存在します。この記事では、その中でも、特に`<input type="text">`と`<textarea>`の2つの要素の違いと使い分けについて記述致します。

## `<input type="text">`の特徴
`<input type>`に”text”を設定すると「一行のテキスト入力フィールド」を作ります。この要素は主に以下のような場面で使用されます。

- ユーザ名
- パスワード
- 検索ボックス
- Eメールアドレスなど

```html
<label for="username">ユーザー名:</label>
<input type="text" id="username" name="username">
```

この例では、ユーザーは一行のテキストフィールドに名前を入力します。

## `<textarea>`の特徴

`<textarea>`要素は、ユーザーが複数行のテキストを入力でき、フィールドを提供します。通常、詳細な情報を必要とする場面で使用されます。

- ユーザーがフィードバックを提供するためのフィールド
- ブログポストや記事を書くフィールド
- コメントを書くフィールドなど

```html
<label for="message">メッセージ:</label>
<textarea id="message" name="message" rows="4" cols="50"></textarea>
```

この例では、ユーザーはフィードバックやメッセージを書くための複数行テキストフィールドを作ります。

## いつどちらを使うべきか

`<input type="text">`と`<textarea>`の使い分けは、基本的には入力するテキストの長さと内容によります。

:::note
- **一行のテキスト入力が必要な場合、または比較的短いテキスト入力が必要な場合には`<input type="text">`を使用します。**
- **複数行にわたるテキスト入力や、長いテキスト入力が必要な場合には`<textarea>`を使用します。**
:::

## 参考
[HTMLのinputタグとtextareaタグを使ってテキスト入力欄を表示する方法【初心者向け】](https://magazine.techacademy.jp/magazine/5864)
【Paiza問題集】ループメニュー1/数列同士の引き算

# Paiza問題集
Pythonで回答

## ループメニュー1/数列同士の引き算

### Step01 数列の和
```Python
"""
数列の和
https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_sum

問題
数列の和を計算し、出力してください
出力の末尾には改行を入れてください
"""

N = int(input())
A = map(int, (input().split()))

sum = 0
for i in A:
    sum += i

print(sum)
```

### Step02 数列のA番目からB番目までの和
```Python
"""
数列のA番目からB番目までの和
https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_partsum

問題
数列のA番目からB番目までの和を計算し、出力してください
出力の末尾には改行を入れてください
"""

N, A, B = map(int, (input().split()))
a = list(map(int, (input().split())))

sum = 0
for i in range(A-1, B, +1):
    sum += a[i]

print(sum)
```

### Step03 数列の値を全部*2して出力
```Python
"""
数列の値を全部*2して出力
https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_multi

問題
数列の全ての要素を2倍し、改行区切りで出力してください
出力の末尾には改行を入れてください
"""

N = int(input())
a = list(map(int, (input().split())))

[print(a[i]*2) for i in range(N)]
```

### Final問題 数列同士の引き算
```Python
"""
数列同士の引き算
https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_sub

問題
1行目に整数Nが与えられます
2行目に長さNの数列aが与えられます
3行目に長さNの数列bが与えられます
aの各要素からbの各要素を引いた結果を、改行区切りで出力してください
出力の末尾には改行を入れてください
"""

N = int(input())
a = list(map(int, (input().split())))
b = list(map(int, (input().split())))

[print(a[i]-b[i]) for i in range(N)]
```
【Delphi】文字列とファイルと複数行文字列 [小ネタ]

# はじめに
文字列とファイルと複数行文字列についての小ネタです。

# 文字列とファイルと複数行文字列
複雑な処理を伴わない時に、変数の内容をファイルに書き出したり、その逆をやりたい場合の Tips です。

## ■ 文字列型変数の内容をファイルにしてセーブする
**String** 型変数の中身をファイルに保存するには `TFile.WriteAllText()` を使うのが簡単です。次の例は `Hello.txt` に `Hello, world.` を UTF-8 で保存します。

```pascal
uses
  .., System.IOUtils;

  ...
  var s := 'Hello, world.';
  TFile.WriteAllText('Hello.txt', s, TEncoding.UTF8);
```

:::note
2 番目のパラメータは値パラメータなので、文字列リテラルでも構いません。
:::

## ■ ファイルの内容を文字列型変数にロードする
逆にファイルの内容を **String** 型変数に読み込むには `TFile.ReadAllText()` を使います。

```pascal
uses
  .., System.IOUtils;

  ...
  var s := TFile.ReadAllText('Hello.txt', TEncoding.UTF8);
```

## ■ バイナリファイルは？

`WriteAllBytes()` / `ReadAllBytes()`  を使います。Buf は TBytes 型です。

```pascal
uses
  .., System.IOUtils;

  ...
  var Buf := TEncoding.UTF8.GetBytes('Hello, world.');
  TFile.WriteAllBytes('Hello.bin', Buf);
```

```pascal
uses
  .., System.IOUtils;

  ...
  var Buf := TFile.ReadAllBytes('Hello.bin');
```

## ■ 複数行文字列

複数行文字列を構成するのに最もシンプルなのは、文字列リテラルで記述する方法です。

```pascal

  var s := 'Hello,' + sLineBreak +
           ' world.';
  ShowMessage(s);
```

TStringList と無名メソッドを使った複数行文字列です。ファイルの読み書きを伴うなら TStringList だけでいいかも。

```pascal
  var s := (function: string
            begin
              with TStringList.Create do
                begin
                  Add('Hello,');
                  Add(' world.');
                  result := Text;
                  Free;
                end;
            end)();
  ShowMessage(s);
```

TStringBuilder を使った複数行文字列です。メソッドチェーンで複数行文字列を構築できます。

```pascal
  var sb := TStringBuilder.Create.
              AppendLine('Hello,').
              AppendLine(' world.');
  ShowMessage(sb.ToString);
  sb.Free;
```

TStringHelper と動的配列を使った複数行文字列です。

```pascal
  var s := string.Join(sLineBreak,
                      ['Hello,',
                       ' world.']);
  ShowMessage(s);
```

:::note
複数行文字列はファイル出力用だけでなく、TLabel にセットする複数行ラベルを生成するのにも使えます。
:::

## ■ 真の複数行文字列

Delphi 12 以降だと 3 重引用符を使った複数行文字列が使えます。

```pascal
uses
  .., System.IOUtils;

  ...
  var s := '''
  Hello, 
  world.
  ''';
  TFile.WriteAllText('Hello.txt', s, TEncoding.UTF8);
```

インデント開始位置 (基本インデント) は終了 3 重引用符の位置となります。SQL 文を書くのが簡単になりますね。

**See also:**

 - [長い複数行の文字列リテラル (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E9.95.B7.E3.81.84.E8.A4.87.E6.95.B0.E8.A1.8C.E3.81.AE.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB)

# おわりに

ちょっとしたファイルの読み書きが必要な事があるんですよね。

 - 無名メソッドは Delphi 2009 以降で使えます
 - `TStringBuilder` は Delphi 2009 以降で使えます
 - `System.IOUtils` は Delphi 2010 以降で使えます
 - `TStringHelper` は Delphi XE3 以降で使えます
 - 配列定数式 は Delphi XE7 以降で使えます
 - インライン変数宣言と型推論 は Delphi 10.3 Rio 以降で使えます
 - 複数行文字列は Delphi 12 以降で使えます
Space Evaders


※こちらは2018年に弊社ブログで掲載していた内容と同様の内容の記事になります。

月島ファクトリープログラマーのLeeです。

以前Facebook Instant Gameを開発したので、簡単にまとめます。

### 「Space Evaders」紹介
今回は開発した「Space Evaders」を紹介いたします。

![スペースインベーダーバナー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445512/14248509-3c1f-682a-ba5f-27a3d079a820.jpeg)

左右にタップして落ちてくる隕石をよけてハイスコアを目指すゲームです。
隕石の数が増えればよけるのが難しい時がありますが、そういう時はバリアを活用して乗り切ることができるようになっています。

ゲーム自体はよくある避けゲーなのですが、難易度調整をシビアにしてあるのと、隕石どうしのあたり判定をつけることで予測しづらく、緊張感があって他と差別化できたんじゃないかと思っています。

50点で出現する巨大隕石が現れてからは、バリアをうまく活用しないと厳しくなりますので、だいたい70点あたりを目安に遊んでみてください。

# フレームワークについて
Facebook Instant GameはHtml5での開発になるため、必然的にjsのフレームワークから選ぶ必要がありました。

Facebookでは対応しているフレームワーク一覧を掲載しているので、この中から気に入ったものを選ぶだけで特に問題ありませんでした。

今回は、「Phaser」という、２Dゲーム特化のフレームワークを選定しました。
理由としては、コミュニティーが調べた中では最も活発で（英語のみですが）今後もサポートが長続きしそうと判断したためです。
また、公式のサンプルも相当な数用意されていたびで開発が容易にできると考えました。

実際、開発においてフレームワークの問題でつまったところはほとんどありませんでした。

・シーン管理

    game.state.add("scenename", scene.scenename);


    scene.scenename = function () {};


    scene.scenename.prototype = {


         preload: function() {


         },


         create: function () {


         },


         update: function() {


         },


    }


    game.start("scenename");

上記のテンプレートを追記していくだけでシーン管理を行うことができます。
基本関数として、下記３つを利用することができ、新規関数もここに追記していくだけで実装できます。

preload - 素材の読み込み
create - シーンのはじめに一度実行
update - 毎フレーム実行

・画面表示

デバイスの大きさに合わせてゲーム画面を表示したい場合、ゲーム初期化時に下記を実行することにより勝手に合わせてくれます。


    game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;

 
     game.scale.pageAlignHorizontally = true;


    game.scale.pageAlignVertically = true;


     game.stage.disableVisibilityChange = true;


ゲーム画面内でオブジェクトを適切に配置したい場合は、
game.world.centerX
game.world.centerY
ワールドの中央値を取得できるので、そこからどのあたりに表示するか設定することで異なる大きさの画面でも適切に配置することが可能となります。

#  苦労した点について
最も苦労したのはレベルデザインでした。

避けゲーは一歩間違うと退屈になるので、個人的には難易度高い方が面白いとおもうのですが、絶対に不可能な箇所ができてはまずいためその間をとる調整が大変でした。

隕石同士のあたり判定を実装したところ、予測不能な点は面白かったのですが、真横からのスマッシュがたまに発生して無理ゲーになることもあり...

結局、隕石同士のあたり判定は実装し、バリアでしのぐことのできる機能でバランスを取りました。

# まとめ
実装に関して、やりたかったことがほとんど公式のサンプルの組み合わせと、少しのコミュニティの調査で済んだためコストもかからずうまくいったと感じています。
Phaserはコミュニティがほとんど英語なのが玉に瑕ですが、チュートリアルがしっかりしているため初めてのHTML５ゲーム開発にとても向いていると感じました。
一度使ってみて基本的な部分は慣れたので、次に開発する際はより早くうまく開発できそうです。