OmniAICreator/Qiita-1.07M huggingface dataset:
WSLイメージが肥大化してきたので小さいイメージからやり直す手順

WSL の環境にいろいろインストールしてごちゃごちゃしたので、最初から作り直したい。
でも、今の環境は残したいので、別の 環境を作りたい、という場合の手順です。

### 方針

`C:\WSL-Disk` ディレクトリを作成して そこに WSL イメージを格納する。
名前は `Ubuntu-22.10-test1` とする

#### データ格納先の準備

	cd C:\
	mkdir WSL-Disk
	mkdir WSL-Disk\initial-image

#### Ubuntu から WSL 用の イメージをダウンロード

[Ubuntu WSL Images](https://cloud-images.ubuntu.com/wsl/)

から kinetic をクリックして その中にある current の中から `ubuntu-kinetic-wsl-amd64-wsl.rootfs.tar.gz` を選んで ダウンロードします。

ダウンロードしたイメージは `C:¥WSL-Disk\initial-image` ディレクトリに保存します。

#### WSL インポートと最低限の設定

コマンドプロンプトから 下記のコマンドを実行して WSLイメージをインポートします。

	cd C:\WSL-Disk
	mkdir Ubuntu-22.10-test1
	wsl --import Ubuntu-22.10-test1 Ubuntu-22.10-test1 C:\WSL-Disk\initial-image\ubuntu-kinetic-wsl-amd64-wsl.rootfs.tar.gz

![Pasted image 20230429102954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/0bf0881d-e6f6-1db1-22fc-0b8fbd3eaca1.png)

インポートが 正常に終了した後で、 `Windows Terminal` を開くと Ubuntu-22.10-test1 が 選択できるようになっています。 

![Pasted image 20230429103304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/0f4b03fa-9078-7099-2bcf-5199a15fc149.png)

メニューから `Ubuntu-22.10-test1` を選択すると `root` ユーザでログインできます。

![Pasted image 20230429103446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/73c941f3-c643-1930-aa51-100f288d58ef.png)

普段使いのために 一般ユーザを作成しておきます。

	adduser user

パスワードを聞かれるので入力します。
ユーザ名も聞かれるので適当に入れます。

sudo できるユーザとして登録するため 下記のコマンドを実行します。

	usermod -G sudo user

WSL から ログオフします。

	exit

上記で作成した 一般ユーザで ログインするための設定を行います。

PowerShell を起動して

	Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value ((wsl -d $distro -u $user -e id -u) | Out-String); };

	WSL-SetDefaultUser Ubuntu-22.10-test1 user

もう一度 WindowsTerminal から Ubuntu-22.10-test1 に ログインすると 一般ユーザでログインできます。

![Pasted image 20230429104317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/79c6fe55-740f-20be-f308-5e71785d1c14.png)

管理者タスクを行うため sudo する時に ユーザの パスワードを聞かれるので、ユーザを作成した時に入力したパスワードを入力します。

![Pasted image 20230429104528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134762/73510e07-b2b0-b506-7bb2-a882ed019b4a.png)


### 管理

`C:\WSL-Disk\Ubuntu-22.10-test1` ディレクトリの中には WSL の ディスクイメージが作成されています。

WSL の 仮想マシンを削除するには 

	wsl --unregister Ubuntu-22.10-test1

で削除できます。 WSL の ディスクイメージも 一緒に削除されます。

もういちど wsl --import からの手順を繰り返す事で何度でも環境を作りなおすことができます。

#### ユーザのパスワードを忘れたので管理者でログインしたい場合

コマンドプロンプトから

    wsl -d Ubuntu-22.10-test1 -u root

と WSL の ディストリビューション名 と ユーザ名を指定してログインできます。

    passwd user

で パスワード変更したいユーザの新しいパスワードを設定します。

### まとめ

目的に合わせて 専用の WSL イメージを作成、
うまくいかなかったら最初からやり直すのが簡単にできるようになりました。
Ruby：「インスタンスメソッド」「クラスメソッド」「インスタンス変数」「クラス変数」について

# 実装
例として、Carクラスを考えます。Carクラスには、インスタンスごとに異なる状態（例：速度）があり、またクラス全体に関連する情報（例：生成された車の総数）があります。

```ruby
class Car
  # 初期化
  @@total_cars = 0

  # 初期化
  def initialize
    @speed = 0 # 速度
    @@total_cars += 1 # 車の総数
  end

  # クラスメソッド
  def self.total_cars
    @@total_cars
  end

  # インスタンスメソッド（ゲッター）
  def speed
    @speed
  end

  # インスタンスメソッド
  def accelerate(amount)
    @speed += amount
  end
end

# 各Carインスタンス
car1 = Car.new
car2 = Car.new

puts Car.total_cars # 2 (car1+car2=2：クラスメソッドを呼び出す)

car1.accelerate(20)
puts car1.speed # 20 (cat1インスタンスメソッドを呼び出す)

car2.accelerate(50)
puts car2.speed # 50 (car2インスタンスメソッドを呼び出す)

```

# 「インスタンスメソッド」「クラスメソッド」の違い

- インスタンスメソッド：speedとaccelerate(amount)は、インスタンスの状態（速度）に関連する操作を行うため、インスタンスメソッドとして定義されています。

- クラスメソッド：self.total_carsは、生成されたCarインスタンスの総数を返すクラスメソッドです。このメソッドはインスタンスに依存しないため、クラスメソッドとして定義されています。

# 「@(インスタンス変数)」「@@(クラス変数)」の違い

- @(インスタンス変数)：`@speed`はインスタンス変数であり、各Carインスタンスが固有の速度を保持。

- @@(クラス変数)：`@@total_cars`はクラス変数であり、生成されたCarインスタンスの総数を追跡。すべてのCarインスタンスは、同じ`@@total_cars`変数を参照します。

# まとめ
- インスタンスごとの状態や振る舞いに関連する情報や操作はインスタンスメソッドで定義し、インスタンスに依存しない情報や操作はクラスメソッドで定義します。
- インスタンス変数は、そのクラスのインスタンスに固有のデータを保持し、クラス変数は、そのクラスのすべてのインスタンスに共通のデータを保持します。
Spring devtoolsメモ

Spring　Bootの開発効率化のために使用
### dependenciesの追加
developmentOnly 'org.springframework.boot:spring-boot-devtools'

# 利用した機能
### Automatic Restart
* Javaのソースコードが変更された際に、自動でSpringが再起動される。
* 必要な設定
設定→ビルド・実行・デプロイメニュー→コンパイラ
１，「自動的にプロジェクトをビルドする」にチェックが入れる
２，詳細設定のコンパイラ→「開発対象のアプリケーションが実行中でも自動Makeの開始を可能とする」にチェックを入れる。

### Hot Swapping
* template変更の自動反映
application.propertiesにspring.thymeleaf.prefixを追加し、templateのパスを指定
【PWA】ブラウザからwebアプリをダウンロードする。

## はじめに
PWA（Progressive Web Apps）を利用し、スマホにwebアプリをインストールできるようにしました。
クロスプラットフォーム言語を学習する時間がないもしくは、iOSとAndroidの開発環境を構築するのが面倒な方はPWAがおすすめかもです。Webviewにしても、ネイティブの部分はコードが異なりますが、PWAは１つのコードであたかもネイティブアプリのようなwebアプリを開発することができます。

### 準備するもの
◆index.html
◆manifest.json
◆pngファイル（アイコン）
◆sw.js（ServiceWorker）

### src

アプリの内容はどうでも良いため、pタグだけにしてます。
sw.jsを読み込んでいるところがポイントです。
manifest.jsonもリンクしておいてください。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <link rel="manifest" href="manifest.json"/>
  </head>
  <body>

    <p>タスク管理アプリ</p>
    <script>
        if ('serviceWorker' in navigator) {
        window.addEventListener('load', function() {
          navigator.serviceWorker.register('./sw.js').then(function(registration) {
          }, function(err) {
            console.log('読み込み失敗');
          });
        });
      }
    </script>
  </body>
</html>
```
↓アイコンに設定するpngファイルは置き換えてください。
```json:manifest.json
{
  "name": "タスク管理アプリ",
  "icons": [
    {
      "src": "./img/fly_192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "./img/fly_512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "start_url": "./index.html",
  "display": "fullscreen",
  "background_color": "#FFFFFF",
  "theme_color": "#4e342e"
}

```
↓インストールの処理を記述しています。
```javascript:sw.js
// PWA対応：Service Worker

var CACHE_NAME = 'task-management';
var urlsToCache = [
];

self.addEventListener('install', function(event) {
    event.waitUntil(
        caches
            .open(CACHE_NAME)
            .then(function(cache) {
                return cache.addAll(urlsToCache);
            })
    );
});

self.addEventListener('fetch', function(event) {
    event.respondWith(
        caches
            .match(event.request)
            .then(function(response) {
                return response || fetch(event.request);
            })
    );
});

```

### インストール方法

Chromeでwebアプリのページを開いてください。
アドレスバーの右側にインストールマークが表示されるので押下します。
するとローカルPCにインストールされます。
Android、WindowsはChromeで、iOSはSafariでインストールできることを確認しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689436/f12d4481-8393-774c-9d08-f86e6230589d.png)

## おわりに
PWAではPush通知にも対応できるそうなので、次回試してみようと思います。
気軽にスマホアプリを作れるのが魅力だと思います。
是非、興味がある方はやってみてはどうでしょうか。
Vueで簡単なメモアプリを作ってみた話

## はじめに
sunupppiと申します。プログラミング歴がもうすぐで１年となる大学生です。これが初めての投稿ですので、温かい目で見守ってくださると嬉しいです！

## 作ったものの紹介と経緯
以下の画像のような、メモアプリを作りました。今回はフロントエンドのみの実装なので、標準のWeb apiであるローカルストレージをデータベース代わりに用い、メモのデータを保持しました。
作った経緯としては、インターン先の研修で少しVueに触り、せっかくだから自分でも何か作ってみようと思ったからです。
![Simple Memo (2)](https://user-images.githubusercontent.com/107479598/235274238-8b61a54f-b828-496e-b6a1-7fa267ccc7a2.png)

## 主な技術スタック
- Vue3 Composition API
- TypeScript
- Pinia
- Tailwind CSS

## 工夫できたと思うこと
### Piniaを用いることで、状態の一元管理が可能に
状態やメソッドをPiniaで管理してしまうことで、どこからでもアクセスできるのは強力だなと感じました。そのおかげで、UIとロジックの分離がある程度は実現でき、コードの見通しが良くなったと思います。

### 機能は最低限に
昨今のタスク管理アプリやノートアプリは多機能で、非常に優秀であると思います。ただ、多機能でわけわからんなぁと思ってしまったりもします。そこで、私は必要最低限何があったら嬉しいかという観点での実装を心がけました。

### UIも流行りに乗って
Tailwind CSSはやはり、モバイルファーストにしやすいなと感じました。また、ダークモードも実装することで、ユーザー体験の質も向上させることができたと思います。
<img width="731" alt="2023-04-29 (1)" src="https://user-images.githubusercontent.com/107479598/235278624-e111bd7e-3212-40fb-8d10-a3f7c2d8613e.png">


## これからしっかりやっていきたいこと
- バックエンドの実装
- デザインパターンの検討

短いですが、今回はここらへんまでとさせて頂きます。読んでくださった方は、ありがとうございました！
cscの作法 その310

# 概要
cscの作法、調べてみた。
練習問題やってみた。

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



# サンプルコード

```

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class Forth {
	private static Stack<int> stack = new Stack<int>();
	private static void add() {
		int top1 = stack.Pop();
		int top2 = stack.Pop();
		int v = top2 + top1;
		stack.Push(v);
	}
	private static void sub() {
		int top1 = stack.Pop();
		int top2 = stack.Pop();
		int v = top2 - top1;
		stack.Push(v);
	}
	private static void mul() {
		int top1 = stack.Pop();
		int top2 = stack.Pop();
		int v = top2 * top1;
		stack.Push(v);
	}
	private static void div() {
		int top1 = stack.Pop();
		int top2 = stack.Pop();
		int v = top2 / top1;
		stack.Push(v);
	}
	private static void dup() {
		int top1 = stack.Pop();
		stack.Push(top1);
		stack.Push(top1);
	}
	private static void drop() {
		int top1 = stack.Pop();
	}
	private static void get() {
		int top1 = stack.Pop();
		Console.WriteLine(top1);
	}
	private static void push(string s) {
		int v = Convert.ToInt32(s);
		stack.Push(v);
	}
	public static void Main() {
		string str = "";
		string src;
		Console.Write(">");
		src = Console.ReadLine();
		string[] lines = src.Split(new string[] {
			" "
		}, StringSplitOptions.None);
		foreach (string s in lines)
		{
			switch (s)
			{
			case "+":
				add();
			break;
			case "-":
				sub();
			break;
			case "*":
				mul();
			break;
			case "/":
				div();
			break;
			case "dup":
				dup();
			break;
			case "drop":
				drop();
			break;
			case ".":
				get();
			break;
			default:
				push(s);
			break;
			}
		}
		Console.WriteLine(str);
	}
}




/*
("9 9 - 9 9 / .")# 1
("9 9 / 9 9 / + .")# 2
("9 9 + 9 + 9 / .")# 3
("9 9 9 + 9 / dup + .")# 4
("9 9 9 + 9 / dup + - .")# 5
("9 dup 9 + 9 + 9 / - .")# 6
("9 9 9 + 9 / - .")# 7
("9 9 9 drop 9 / - .")# 8
("9 9 - 9 * 9 + .")# 9
("9 9 / 9 dup 9 / + .")# 10
("9 9 9 + 9 / + .")# 11
("9 dup 9 9 + + 9 / + .")# 12
("9 9 9 + 9 / dup + + .")# 13
("9 dup 9 9 + 9 / dup + - + .")# 14
("9 dup dup 9 + 9 + 9 / - + .")# 15
*/




```

以上。
【Git】.gitignoreの中身を調べてみる。


https://ios-docs.dev/xcode-gitignore/

https://naruhodoweb.com/how-to-gitignore/#:~:text=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF-,.,%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82

こちらの記事を参考に.gitignoreファイルの中身を調べることにした。

```.gitignore
# Xcode
## Mac OS X
.DS_Store
## Xcode build files
build/
DerivedData/
## Xcode settings
*.pbxuser
*.mode1v3
*.mode2v3
*.perspectivev3
!default.pbxuser
!default.mode1v3
!default.mode2v3
!default.perspectivev3*.xcodeproj/*
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Xcode Patch
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcworkspace/contents.xcworkspacedata
## library
Pods/*
Carthage/Build/
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
*.xcuserstate
*.swp
xcuserdata/
*.moved-aside
!.gitkeep
```
暗号。。。。
-
全然わからない。
一つひとつ噛み砕いて見ていく必要がある。

記号がわからない。。。
--
まず前提として、
`#`、`*`、 `/`、`!`　
はどのような特性があるかをしらべる必要がある。
#### ・`#`　は、コメントアウトである。
例
```
# Xcode
## Mac OS X
```

#### ・`/`は、ファイルの階層を考慮して、無視するかを決める
例
```
xcuserdata/
```
`xcuserdata`フォルダを無視

```
xcuserdata
```
`xcuserdata`フォルダと、同じ名前のファイルを無視する

#### ・`*`は、無視するという意味
```
*.pbxuser
```
`.pbxuser`という拡張子ファイルを全て無視する。

#### ・`!`　は　、無視しないという意味。 
例
```
!*.xcodeproj/project.pbxproj
```
`.xcodeproj`のディレクトリ内の全てのファイル・ディレクトリを除外するも、`project.pbxproj`ファイルを無視しない

（少し余談）
エクスクラメーションマーク `!`は、否定の意味で使用するイメージがあり、最初見たときに違和感を感じた。
だが、このファイルの名前は、`.gitignore`であり、`Gitを無視する拡張子`であるため、`!　`を使用すると、否定の否定になり、無視しない　という意味になる。と筆者は解釈しました。


## ファイル名に関して
ファイル名に関して深堀りすると切りがないため、ChatGPTに、ファイル名を入力して、概要だけ理解することにした。

出力結果は以下の通りである。
-----

`.DS_Store`：これはMac OS Xオペレーティングシステムによって作成された、フォルダーのカスタム属性を保存するファイルです。アイコンの位置や背景画像などが含まれます。

`build/`と`DerivedData/`：これらは、Xcodeによって中間ビルドファイルと一時的なデータを保存するために作成されたディレクトリです。

`*.pbxuser`、`*.mode1v3`、`*.mode2v3`、`*.perspectivev3`：これらはXcode設定ファイルで、個人の設定やウィンドウレイアウトを保存します。

`*.ipa`、`*.dSYM.zip`、`*.dSYM`：これらは、アプリのパッケージングやデバッグに使用されるファイルです。

`*.xcodeproj/*`：このパターンは、Xcodeプロジェクトディレクトリ内のすべてのファイルとディレクトリを除外しますが、`project.pbxproj`と`xcshareddata/`は除外されません。 `project.pbxproj`は、プロジェクトの構造、ビルド設定、ターゲットの依存関係に関する情報を含むメインプロジェクトファイルです。 `xcshareddata/`は、複数のXcodeプロジェクト間で共有されるデータを含むディレクトリです。

`Pods/*`と`Carthage/Build/`：これらは、Xcodeプロジェクトで外部の依存関係を管理するために使用されるディレクトリです。

`*.moved-aside`、`*.xccheckout`、`*.xcscmblueprint`、`*.xcuserstate`、`*.swp`、`xcuserdata/`：これらは、Xcodeまたはその他のツールによって作成された一時ファイルやディレクトリです。

`!.gitkeep`：これは前の除外規則を否定する特別なパターンで、空の.gitkeepファイルを各空のディレクトリに含めます。Gitはディレクトリ自体を追跡しないため、空のディレクトリがGitで追跡されるようにするために役立ちます。

----------------

以上です。

他にも良い方法があれば、コメントいただけると大変うれしいです。
良かったと思ったら、いいねやTwitterのフォローよろしくお願いいたします！

https://sites.google.com/view/muranakar
個人でアプリを作成しているので、良かったら覗いてみてください！
cscの作法 その308

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
じゃんけんを実装せよ。

# サンプルコード

```

using System;
using System.IO.Ports;
using System.Threading;
using System.Globalization;

public class Janken {
	public static void Main() {
		bool flg = true;
		while (flg)
		{
			string a;
			string b = "2";
			string name = "012";
			Random random = new Random();
			StringInfo nameInfo = new StringInfo(name);
			int newNameIndex = random.Next(nameInfo.LengthInTextElements);
			b = nameInfo.SubstringByTextElements(newNameIndex, 1);
			string str = "";
			Console.WriteLine("じゃんけん　　0, グー 1, チョキ  2, パー 3, やめる");
			a = Console.ReadLine();
			switch (a)
			{
			case "0":
				switch (b)
				{
				case "0":
					str = "グーとグーで、あいこ";
				break;
				case "1":
					str = "グーとチョキで、あなたの勝ち";
				break;
				case "2":
					str = "グーとパーで、あなたの負け";
				break;
				default:
				break;
				}
			break;
			case "1":
				switch (b)
				{
				case "0":
					str = "チョキとグーで、あなたの負け";
				break;
				case "1":
					str = "チョキとチョキで、あいこ";
				break;
				case "2":
					str = "チョキとパーで、あなたの勝ち";
				break;
				default:
				break;
				}
			break;
			case "2":
				switch (b)
				{
				case "0":
					str = "パーとグーで、あなたの勝ち";
				break;
				case "1":
					str = "パーとチョキで、あなたの負け";
				break;
				case "2":
					str = "パーとパーで、あいこ";
				break;
				default:
				break;
				}
			break;
			default:
				flg = false;
			break;
			}
			Console.WriteLine(str);
		}
	}
}





```

以上。
【chakraui】滝(masonry)のようなレイアウトの作り方

# はじめに
メモです。いつも忘れる。
react-masonry-cssというライブラリーがあるのですが、レイアウトだけに一個依頼を増やすのはね。。。っていう気持ちです。

# 書き方
Wrapperのほう
```tsx
    <Box
    mx={4}
    gap={4}
    sx={{
      columnCount: {
        lg: 1,
        xl: 2,
        '2xl': _dummyInfoCards.length > 6 ? 3 : 2,
      },
      columnGap: 4,
    }}
    >
    {CardsNode()}
    </Box>
```
中身
```tsx
const CardsNode = () => {
return _dummyInfoCards.map((card, idx) => (
  <Card
    key={idx}
    display='inline-block'
    mb={4}
    w='full'
  >
    <CardBody>{card.body}</CardBody>
  </Card>
));
};
```

割とシンプルです。以上！
thymeleafメモ

Javaのコード上にHTMLを直接記載できるが、表示ページの見た目を変更したい際に、Javaソースコードを編集する必要がある。（UIとロジックの境界があいまい）
↓
テンプレートエンジンを使用。
テンプレートとデータから動的に文字を生成するもの。

# thymeleafの使用法
Springと親和性が高いテンプレートエンジン。(JSPではなくThymeleafが推奨されている)
* ビルドツール（maven、gradle）に依存関係を追加する。
Spring Initializrにて、Dependencies内の「thymeleaf」を検索
→「EXPLOLE」にて、gradleに追加すべきソースを確認し、ビルドツールに追加し再ロードする。

https://start.spring.io/
* Java側のレスポンスとしては、templates配下のファイルを指定する。(例："index"と記載し拡張しは省略可能（Spring MVCの機能）)

* 記法の参考サイト
https://qiita.com/NagaokaKenichi/items/c6d1b76090ef5ef39482
https://qiita.com/yakumo3390/items/6b3fcc9e00f7a682660c
https://qiita.com/rubytomato@github/items/387d46ea34eb92071065
【備忘録】国勢調査小地域の境界データからPMTilesを生成する方法

# はじめに

本記事では、[政府統計の総合窓口（e-Stat）](https://www.e-stat.go.jp/)にて公開されている、2020年国勢調査小地域（町丁・字等及び基本単位区）の境界データから、[PMTiles形式](https://github.com/protomaps/PMTiles)のデータを生成する方法について説明します。

## PMTilesの特徴
- 単一ファイル形式のタイルデータ
- 地球規模のタイルマップの保存
- S3 のようなストレージとHTTP Range Requestsのみを使用

https://protomaps.com/blog/pmtiles-v3-hilbert-tile-ids

# PC環境
OS：Windows 10 Pro
CPU：Intel(R) Core(TM) i7-9700
メモリ：32GB

# 前提条件
- 以下のPythonのツールより2020年国勢調査小地域（町丁・字等及び基本単位区）の境界データ（JGD2011、シェープファイル（以下、SHP））をダウンロードし、解凍済みであること。
- SHPを一括ダウンロードするツール

https://github.com/shi-works/2020Kokusei_shpdltool

- WSL（Ubuntu-20.04）がインストール済みであること。
- [tippecanoe](https://github.com/felt/tippecanoe)がインストール済みであること。
- Windows 10へのtippecanoeのインストール方法は以下のとおりです。

https://gist.github.com/ryanbaumann/e5c7d76f6eeb8598e66c5785b677726e

※ただし、`git clone https://github.com/mapbox/tippecanoe.git`の箇所を`git clone https://github.com/felt/tippecanoe.git`への変更が必要です。
- tippecanoeのバージョンはv2.23.0です。

# SHPからGeoJSONを生成
- SHPからGeoJSONの生成には[QGIS](https://qgis.org/ja/site/)を使用します。
- 町丁・字等は都道府県単位、基本単位区は市区町村単位のSHPです。
- 上部のメニューよりベクタ＞データ管理ツール＞ベクタレイヤのマージで、町丁・字等及び基本単位区の境界データ（JGD2011、SHP）をマージします。
- なお、マージ後にベクタ＞ジオメトリツール＞重心で境界データの重心データも作成します。

# GeoJSONからPMTilesを生成
- GeoJSONからPMTilesの生成には[feltのtippecanoe](https://github.com/felt/tippecanoe)を使用します。
- WSLを起動して、以下のコマンドを実行します。
- GeoJSONは以下のとおりです。
r2ka01-47_JGD2011.geojson：町丁・字等・境界データ（ポリゴン）
r2ka01-47_point_JGD2011.geojson：町丁・字等・重心データ（ポイント）
r2kb01-47_JGD2011.geojson：基本単位区・境界データ（ポリゴン）
r2kb01-47_point_JGD2011.geojson：基本単位区・重心データ（ポイント）
```
tippecanoe -o r2ka01-47_JGD2011.pmtiles r2ka01-47_JGD2011.geojson -Z10 -pf -pk -P
tippecanoe -o r2ka01-47_point_JGD2011.pmtiles r2ka01-47_point_JGD2011.geojson -Z10 -pf -pk -P
tippecanoe -o r2kb01-47_JGD2011.pmtiles r2kb01-47_JGD2011.geojson -Z12 -pf -pk -P
tippecanoe -o r2kb01-47_point_JGD2011.pmtiles r2kb01-47_point_JGD2011.geojson -Z12 -pf -pk -P
```
- tippecanoeのオプション
-Z10：ズームレベル10以上のみを生成
-Z12：ズームレベル12以上のみを生成
-pf：地物数制限を無視する（1タイルあたり200,000フィーチャに制限しない）
-pk：ファイルサイズ制限を無視する（1タイルあたり500Kバイトに制限しない）
-P：並列読み込み
ただし、下記の記事によると、-Pオプションが有効なのは、GeoJSONSeqのみのようです。

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

# 生成したPMTilesの確認
- 生成したPMTilesの確認には、[PMTiles Viewer](https://protomaps.github.io/PMTiles/)が便利です。
- PMTilesをドラッグ&ドロップすると、フィーチャが地図上に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/7cde89fd-e705-cdb5-a56e-15f51fd843be.png)

# PMTilesの配布
- 上記の方法で作成した、PMTiles形式の境界データ（町丁・字等及び基本単位区）は、以下のGitHubにて配布しています。
## 2020Kokusei-PMTiles
https://github.com/shi-works/2020Kokusei_PMTiles

## デモサイト
- また、PMTiles形式の境界データ（町丁・字等及び基本単位区）は、MapLibre GL JSで作成した、デモサイトにて閲覧ができます。

https://shi-works.github.io/2020Kokusei_PMTiles/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/f3f9720c-f17d-2736-2afd-f01ef86be546.png)

# 参考情報

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

https://github.com/protomaps/PMTiles

https://github.com/felt/tippecanoe
git grepのチートシート

vim向けのタグファイルの更新作業がウザいので、gitで手軽に検索する。
とりあえず基本パターン：
## `git grep -n ':errno:' -- '*[ch]'`
ワークディレクトリとそのサブディレクトリで追跡されているすべての「*c」または「*h」ファイルで':errno:'を検索し、ファイル名と行番号を表示する。
```C:出力例
c_src/key.c:42:         sprintf(strbuf, "%s:errno:%d\n", __func__, errno);
c_src/key.c:62:         sprintf(strbuf, "%s:errno:%d\n", __func__, errno);
```
# 追加オプション
| オプション | 意味 |
|:-:|:-:|
| -w | パターンは単語の境界でのみ一致 |
| -i | パターンとファイルの大文字と小文字の違いは無視 |
| --full-name | プロジェクトの最上位ディレクトリからのパスを含むファイル名を表示 |
| -v | 一致しないラインを選択 |
| --no-color| カラー出力のハイライトをオフにする |
WindowsにおけるNTPサーバ/クライアント設定方法のまとめ

# 概要
　Windows PC(クライアント)の時刻が同期されない事象(時刻が遅れている)が，現場から報告されてきたので，WindowsにおけるNTPサーバ/クライアントの設定方法を調査した。調査して分かったことや対策内容などを備忘録として記載する。間違っていたら，ご教授・ご指摘お願いします。

# 実機環境(前提条件)

![deviceStructure2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/3afc17f6-eebf-0a8b-2fb7-eb5b6a223c2f.png)


# 対策方法
## NTPサーバで設定・確認すべきと思われる項目
1. NTPサーバを**権限がある**NTPサーバとして公開する
![Config_AnnounceFlags.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/077a715e-77d0-056d-619a-d2e6baf4c51c.png)
　レジストリエディタにより，サブキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\services\W32Time\Config」の「AnnounceFlags」を次のように変更する。データ値を「10」から「5」に変更することで，NTPサーバを「**権限がある**NTPサーバ」として設定する。
・値名：AnnounceFlags
・型：REG_DWORD
・データ：0x0000000a(10)(デフォルト)　→　0x00000005(5)

1. NTPサーバの**有効**設定
![NtpServer_Enabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/c86f1041-d9f2-0e74-8128-4cecfe02f1d7.png)
　レジストリエディタにより，サブキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\services\W32Time\TimeProviders\NtpServer」の「Enabled」を次のように変更する。データ値を「0」から「1」に変更することで，NTPサーバを**有効**にする。
・値名：Enabled
・型：REG_DWORD
・データ：0x00000000(0)(デフォルト)　→　0x00000001(1)

## NTPクライアントで設定・確認すべきと思われる項目
1. インターネット**時刻サーバの同期**設定
　Windows10におけるインターネット時刻サーバの時刻同期設定方法を記載する。Windows10以外は，各自で調査してほしい。
　タスクバー上の時刻を右クリック→「日付と時刻の調整」→右のコンテキストメニューの「別のタイムゾーンの時計を追加する」→「日付と時刻」設定画面で「インターネット時刻」タブを選択する→「設定の変更(C)…」→「インターネット時刻設定」画面(下記参照)で以下を設定・確認する。
・「インターネット時刻サーバーと同期する」にチェックを入れる。
・サーバーに「時刻サーバーのドメインやIPアドレス」を入力する。
　Windows10の場合，デフォルトの時刻サーバーは，「time.windows.com」と「time.nist.gov」がある。「time.windows.com」は，Microsoftのタイムサーバーである。「time.nist.gov」は，米国の国立標準技術研究所のタイムサーバーである。
![internetSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/9aa46596-b2dd-89fd-ef2f-9cd9c16a6327.png)


1. NTPサーバとの**時刻同期間隔**設定
![NtpClient_SpecialPollInterval.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/e231a97f-b028-7bcc-d3b2-12fb1e478582.png)
　レジストリエディタにより，サブキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\services\W32Time\TimeProviders\NtpClient」の「SpecialPollInterval」を環境に合った値に変更する。
・値名：SpecialPollInterval
・型：REG_DWORD
・データ(Win10)：0x00008000(32,768)(デフォルト：9時間6分8秒)
・データ(Win7)：0x00093A80(604,800)(デフォルト：7日)

1. NTPクライアントの**有効**設定
![NtpClient_Enabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991226/fa94c8e9-63ec-b33e-5fd5-cded210694a8.png)
　レジストリエディタにより，サブキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\services\W32Time\TimeProviders\NtpClient」の「Enabled」が「1」になっていることを確認する。
・値名：Enabled
・型：REG_DWORD
・データ：0x00000001(1)(デフォルト)


# 参考サイト
[Windows NTPサーバー設定手順](https://nw-engineer.work/windows-ntp/)　(2023/4/29時点閲覧可能)

# 所感
　今回の調査により，NTPの仕組みがなんとなく分かったので，別記事でNTPの仕組みや状態遷移ついても記載・調査する。また，Microsoftのコマンドラインツール「W32tm.exe」があることも知ることができた。今度試してみようと思う。
Python 開発環境のセットアップ 備忘録

# Python 開発環境のセットアップ 備忘録

#### Python バージョン切り替え

```shell
py -3.11 script.py
```

- py options

```shell
$ py --help
usage:
py [launcher-args] [python-args] [script [script-args]]

Launcher arguments:
-2     : Launch the latest Python 2.x version
-3     : Launch the latest Python 3.x version
-X.Y   : Launch the specified Python version
```

#### Python 仮想環境作成

```shell
cd project_dir
py -m venv .venv
```

- python options

```shell
python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
-c cmd : program passed in as string (terminates option list)
-m mod : run library module as a script (terminates option list)
```

- venv options

```shell
python -m venv /path/to/new/virtual/environment
```

#### Python 仮想環境 Activate

- Windows

```bat
.\.venv\Scripts\activate
```

次のバッチファイルを作成しておくと、コマンドプロンプト起動時に仮想環境をアクティベートできます。

```bat:activate.bat
start .\.venv\Scripts\activate
```

次のバッチファイルは仮想環境をアクティベートして、Python スクリプトを実行する方法です。

```bat:main.bat
call .\.venv\Scripts\activate
py main.py
```

- Linux
```shell
. ./.venv/Scripts/activate
```

#### Python 仮想環境 Deactivate

```shell
deactivate
```

#### Python パッケージ管理

`pip freeze`を実行して、インストールされたパッケージのリストを、`requirements.txt`として保存します。

```shell
(.venv) pip freeze > requirements.txt
```

`pip install`コマンドの`-r`オプションで、`requirements.txt`に定義されたパッケージを順番にインストールします。

```shell
(.venv) pip install -r requirements.txt
```

#### 変更履歴
+ 202409/07 VSCodeで読み込むデフォルトの仮想環境のフォルダ変更（venv → .venvに変更）

## Python 開発環境 for Visual Studio Code

Visual Studio Code で Python 開発環境を構築する手順は、[こちらの記事](https://qiita.com/naoyoshinori/items/6af390dede8d2e605fad)を参照してください。
Ruby on Rails 復習③

## はじめに
Railsアプリケーション開発において、データベースを扱う基本的なCRUD（Create, Read, Update, Destroy）処理の実装方法について解説します。また、リンクの作成方法やバリデーションの設定、ビューの表示方法の違い、対話型プログラミング環境の選択についても触れます。

## link_toメソッド
link_toメソッドは、簡単にリンクを作成するためのRailsヘルパーです。以下のように使用します。
```ruby:practice.html.erb
<%= link_to 表示させるテキスト, リンク先URL [,オプション] %>
```

## 詳細画面の実装方法
投稿の詳細画面では、特定のデータ1つをデータベースから取得し、それを表示します。データの取得は、「モデル名.find(params[:id])」を使用し、取得したデータをインスタンス変数に格納します。その後、データを格納したインスタンス変数をviewファイルで利用して詳細画面を表示します。リンクにはlink_toメソッドを利用します。

## CRUD処理
CRUD処理はデータベースに対して行う基本的な処理で、以下の4つが含まれます。

create（作成）: list.save
read（読み取り）: List.all, List.find(params[:id])
update（更新）: list.update(list_params)
destroy（削除）: list.destroy

##  バリデーション
バリデーションは、モデルに記述し、その後コントローラにも記述します。例えば、以下のように記述します。


```ruby:practice.rb
validates :title, presence: true
validates :body, presence: true
validates :image, presence: true
```
また文字数の制限を設定することもできます。

文字数制限を追加するには、lengthオプションを使用してvalidatesに制限を追記します。以下の例では、titleの文字数を1〜50文字、bodyの文字数を1〜500文字の範囲に制限しています。

```ruby:practice.rb
validates :title, presence: true, length: { in: 1..50 }
validates :body, presence: true, length: { in: 1..500 }
validates :image, presence: true
```

lengthオプションには、他にもminimumやmaximumなどの指定が可能です。例えば、titleの最小文字数を10文字、最大文字数を100文字に制限する場合は以下のようになります。
```ruby:practice.rb
validates :title, presence: true, length: { minimum: 10, maximum: 100 }
```

## redirect_toとrenderの違い
redirect_toは、新しいHTTPリクエストを発行し、別のURLにリダイレクトします。このリダイレクトによって、ブラウザが新しいアドレスに移動し、新しいページが表示されます。この際、現在のアクションのコンテキストは失われ、新しいアクションが実行されます。

一方、renderは、現在のアクションのコンテキストを維持しながら、別のビューを表示します。これにより、現在のアクションで設定されたインスタンス変数やローカル変数などのデータがそのままビューに渡され、利用できます。このため、「render」は主に、エラーメッセージを表示する場合や、フォームのバリデーションに失敗したときなどに使用されます。ブラウザのアドレスバーには、現在のURLが表示されたままになります。

要するに、「redirect_to」は新しいHTTPリクエストを発行して別のURLにリダイレクトし、現在のアクションのコンテキストが失われます。一方、「render」は現在のアクションのコンテキストを維持しながら別のビューを表示し、データを引き継ぐことができます。

@ここでの「コンテキスト」とは、現在のアクションに関連するデータや状態を指します。具体的には、コントローラ内のインスタンス変数やローカル変数などが含まれます。

## irbとpryの違い
irbとpryは、どちらもRubyプログラムを対話的に実行できるREPLツールですが、違いがあります。irbはRubyにデフォルトで含まれるシンプルなツールで、pryはより強力で拡張性のあるREPLツールです。

## 代表的なデータ型
Railsでは、さまざまなデータ型が使用できます。以下に代表的なデータ型を示します。

integer: 数値（整数）
decimal: 数値（精度の高い小数）
float: 数値（浮動小数）
string: 文字（短い文字列）
text: 文字（長い文字列）
date: 日付
datetime: 日時
time: 時刻
timestamp: タイムスタンプ
binary: バイナリ
boolean: 真偽
AbstractMethodErrorの対処方法

## AbstractMethodError
<h2>対処方法：エラーメッセージ内で記述されている抽象メソッドがあるクラスを選択する/追加する</h2>
<p>下記の記事がとても参考になりました。</p>
https://docs.oracle.com/javase/jp/7/api/java/lang/AbstractMethodError.html

<p>例えですが、人参を買いに八百屋に行ったものの、その八百屋に人参がなくて、エラーが発生している感じです。ですので、この問題は人参がある八百屋を見つけるか、その八百屋に人参を追加すれば問題が解決されます。</p>
同じようにこのエラーが発生した場合、クラスにメソッドを追加するか、そのメソッドがあるクラスに変更しましょう。
Mac 環境から Node.js を アンインストールする話

## はじめに

[Node.js](https://nodejs.org/ja/download) からパッケージ版でインストールした Node.js をアンインストールする個人的メモになります。

> 公式ページ

[Node.js HP](https://nodejs.org/)

## 環境

macOS Ventura 13.1

## アンインストール方法

### バージョンの確認

```
% node --version
v18.16.0

% which node
/usr/local/bin/node
```

### アンインストール

以下のコマンドを実行します。
パスワードを求められたらマシンのパスワードを入力します。

```
% sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}

# アンインストールされたことの確認
% node --version
zsh: command not found: node
```
SAP BADi(ビジネスアドイン)の探し方

# BAdiの探し方

## 手順
1. トランザクションコード:SE24でクラス：CL_EXITHANDLERを照会
2. メソッド：GET_INSTANCEを選択しプログラムソースを表示
3. 下記にブレイクポイント指定
   * 4行目当たりの”CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE”
4. 確認したいトランザクションを別セッションで実行
5. 上記メソッドの戻り値：EXIT_NAMEに返される値が使用されているBADIの定義名にあたる。
:::note warn
共通的なBADIも実行されるので、関係のなさそうな名称であればスルーしてください。
:::

## 補足
またBADIの定義はトランザクションコード:SE18で確認する事ができ、BADIの実装を行いたい場合は
トランザクションコード:SE19にてBADIの定義を継承して拡張登録する事ができる。
また、実装後の変更でクラス名が判っていればトランザクションコード:SE24から直接変更する事も可能だ。

## 関連トランザクションコードまとめ
SE24： クラス/インタフェース
SE18： ビジネスアドイン（定義）
SE19： ビジネスアドイン（実装）
タワーデフェンスゲーム　Unity　タレット機能1/10　23.タレットの半径を設定できるように実装

# 概要
目次

https://qiita.com/RYA234/items/c9925ce07d6afe64be7e


敵を撃退するタレット機能を実装します。今回はタレットの半径を設定できるよう実装します。
下gif画像はタレットの攻撃範囲を変更している様子です。

![TurretRange.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/296f032f-474e-cad5-d2e1-24361ea46907.gif)


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
オブジェクトにTurretとCircleColliderをアタッチします。
Colliderは敵オブジェクトとの当たり判定を行うためにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8ba3246a-160c-a9f5-b79f-90c2d0a429bd.png)


# 実装のポイント
Turretsクラスを新規作成します。
メソッドにOnDrawGizmosを追加します。
OnDrawGizmosはUnity側のイベント関数で非再生時に実行される関数です。
OnDrawGizmos関数内ではTurretクラスで定義した半径(radius)をCircleCollider.radiusに渡しています。


# コード部分
## Turrets
```diff_c_sharp:Turrets.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Turrets : MonoBehaviour
{
    [SerializeField] private float attackRange = 3f;

    private bool _gameStarted;

    private void Start()
    {
        _gameStarted = true;
    }
    private void OnDrawGizmos()
    {
        if (!_gameStarted)
        {
            GetComponent<CircleCollider2D>().radius = attackRange;
        }

        Gizmos.DrawWireSphere(transform.position, attackRange);
    }
}
```


# 参考

Section5 23

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23021706#overview


github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/d5bb9412d3f64b2a64997c11c42cd47a35ecd0a7


Unity Gizmoについて

https://docs.unity3d.com/ja/2020.3/Manual/GizmosMenu.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/49f17bf7-8dfa-5e75-19cb-8158262800c9.png)


OnDrawGizmos()

https://docs.unity3d.com/ja/2021.1/ScriptReference/MonoBehaviour.OnDrawGizmos.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c4ec5ad2-358c-e2dc-e374-39a0aadab0a3.png)


CircleCollider2D.radius

https://docs.unity3d.com/ScriptReference/CircleCollider2D-radius.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/261f46c1-2d20-d0bd-f3ab-8b3d5aad0bcd.png)


Gizmos.DrawWireSphere

https://docs.unity3d.com/ja/2019.4/ScriptReference/Gizmos.DrawWireSphere.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3be37323-7747-d313-d6bc-6065531eebf7.png)
MUI Boxで式は、複雑すぎて表現できない共用体型を生成します。ts(2590)　が出たときの対処法

## 原因？
```package.json
{
  "dependencies": {
    "@mui/material": "5.12.2",
    "@react-three/drei": "^9.66.1",
    "@react-three/fiber": "^8.13.0",
    "three": "^0.152.1",
  },
}
```

おソース [Typescript Box conflicts with Material UI #1752](https://github.com/pmndrs/react-three-fiber/discussions/1752)

## 対処法
```tsx
import {
  Box,
} from "@mui/material";
<Box component="div">
<Box>
```
Boxにcomponent="div"追加する
WSLでUSBカメラを認識させる

備忘録・・・

USBIPD-WINのインストール
https://github.com/dorssel/usbipd-win/releases

WSL上で、
```bash
sudo apt-get install linux-tools-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
```
linux-toolsのあとのバージョンは適宜変更

windows powershellを管理者で立ち上げて
```bash
usbipd wsl list
```
とし、該当するUSBカメラのBUSIDを確認。
自分の環境だと
```
BUSID  VID:PID    DEVICE                                                        STATE
1-6    046d:0825  Logi C270 HD WebCam                                           Not attached
1-7    04bb:0159  USB 大容量記憶装置                                            Not attached
1-14   8087:0026  インテル(R) ワイヤレス Bluetooth(R)                           Not attached
1-24   0bda:0329  Realtek USB 3.0 Card Reader                                   Not attached
4-3    056e:1092  USB 入力デバイス                                              Not attached
4-4    248a:8367  USB 入力デバイス                                              Not attached
```
となったので、1-6がUSBカメラ。

```
usbipd wsl attach --busid 1-6
```
としてWSLにUSBカメラをアタッチする。

WSL上で、
```
lsusb
```
としたとき、USBカメラが出ていればOK。
```
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

ちなみにWSLからUSBカメラをデタッチするには、
```bash
usbipd wsl detach --busid 1-6
```
とする。


どうもこれだけだと、WSL上でUSBカメラは使えないっぽい。
引き続き調査します。
2023/4/29主にITとかセキュリティの記事

「SLP」に反射攻撃のおそれ、早急にアクセス制限を - 最大2200倍に増幅
https://www.security-next.com/145722

コンテナ管理プラットフォーム「Rancher」にセキュリティアップデート
https://www.security-next.com/145726

1Qの脆弱性DB「JVN iPedia」登録数、2期連続で減少
https://www.security-next.com/145557

問い合わせ内容が流出、改修時のミスで - 北海道観光振興機構
https://www.security-next.com/145701

医療相談員の個人情報を約半年にわたり誤掲載 - 茨城県
https://www.security-next.com/145748

【無料公開】「日本の病院はカモ」世界のハッカーが狙う弱点とは？第2の半田病院が続出しそうな理由(4/27)
https://diamond.jp/articles/-/322109

「旅行写真をSNS投稿」リスク高いと言えるワケ　知らずに自分が「犯罪加害者」になる危険も(4/27)
https://news.yahoo.co.jp/articles/96afbde9253bf370745d90e3708521ae8dd112a7?source=rss

パソコン画面に突然ニセの警告が…「サポート詐欺」に注意　福岡県警が手口と対処法を実演(4/27)
https://news.yahoo.co.jp/articles/ce7404769ccff4e87359f1fbce807fab5aa93142?source=rss

5000億円を騙し取る北朝鮮・ロシアの「仮想通貨犯罪集団」その荒稼ぎのヤバすぎる手法(4/27)
https://news.yahoo.co.jp/articles/f7991ccf4fc639a674d84c3a5ee76c628b5fa61d

玉川徹氏、釜石市の個人情報漏えい問題で提言…「財産権のように個人情報も個人の財産の権利だって変わっていくべき」(4/27)
https://news.yahoo.co.jp/articles/6585d273b5fff25befa4252ddeb0e1ba38af50f7?source=rss

Datadog、アプリケーションセキュリティ機能を拡張し、本番環境のコードの脆弱性を自動的に発見(4/27)
https://prtimes.jp/main/html/rd/p/000000034.000077474.html

数千台規模のサーバー運用をどうリモートで効率化する？フロア単位での“電気代見える化”なども実現へ(4/27)
https://enterprisezine.jp/article/detail/17581

2万円分の「マイナポイント」に釣られて「マイナ保険証」を作った人が抱えている「恐ろしいリスク」(4/27)
https://news.yahoo.co.jp/articles/e4421f187abb352cdcf28c244c5619d7692a0405

米国土安全保障省、AIタスクフォース設立へ、中国の脅威評価も開始(4/27)
https://www.jetro.go.jp/biznews/2023/04/e12c24140e70ac96.html

「官民一体でテロ、サイバー攻撃の未然防止を！」鹿児島県の連絡協議会　４年ぶり開催(4/27)
https://news.yahoo.co.jp/articles/ab92ae770fae3c175252025e1275cbf7ff87acdb

チャットGPT、世界に急速普及して期待と懸念が交錯 G7で国際ルールの策定目指し議論(4/27)
https://scienceportal.jst.go.jp/explore/review/20230427_e01/index.html

AI政策で司令塔、適正利用へ規制も議論　政府 5月にも戦略会議(4/26)
https://www.nikkei.com/article/DGXZQOUA260VO0W3A420C2000000/

PDFビューアになりすましMac狙うサイバー攻撃に注意、北朝鮮が関与(4/27)
https://news.mynavi.jp/techplus/article/20230427-2666003/

APT攻撃グループ「Tomiris」と「Turla」に協力関係か──カスペルスキー調査(4/27)
https://enterprisezine.jp/news/detail/17698

AIで作った「AI音楽」が流行、Discord上には2万人超が集まる人気サーバーも(4/27)
https://gigazine.net/news/20230427-discord-rogue-ai-music/

【簡単解決】パスワードなしでiPadのApple IDを変更する方法(4/27)
https://japan.cnet.com/release/30853835/?ref=rss

Twitterは2022年上半期に85カ国以上から1万6000件に上るユーザーデータの開示請求を受けていた、上位5カ国はインド・アメリカ・フランス・日本・ドイツ(4/27)
https://gigazine.net/news/20230427-twitter-16000-government-information-requests/

自動車税の督促状や納付のSMSに注意、国交省を装ったフィッシング詐欺サイトを確認(4/27)
https://www.netdenjd.com/articles/-/283988

「時刻合わせ」の仕組み(4/28)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900162/041900001/

ChatGPT流行でAIリスクに懸念、EUに続き日本でも法整備の議論進む(4/28)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/042600115/

ChatGPTなどLLMがセキュリティー対策の味方に、ウイルス対策ソフトをしのぐ実力(4/28)
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042600105/

「安い」と「妥協を許さない」でDX投資にメリハリ、競争領域の見極め急務に(4/28)
https://xtech.nikkei.com/atcl/nxt/column/18/02426/042100003/

仮想マシンとコンテナーを両方使える！Proxmox VEで一元管理(4/28)
https://xtech.nikkei.com/atcl/nxt/column/18/02393/032700007/

NEWS pickup＆digest（2023/3/8～4/7）
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800011/041900066/
SwiftUIでHotReload（InjectionIII）

結論から書くとやることは3つだけです。


    1 Hot ReloadingとInjectを追加
    2 Other Linker Flagsに-Xlinker -interposableを追加
    3 コードにおまじないを追加

※前提条件
InjectionIIIをダウンロードしてること

## Hot ReloadingとInjectを追加

SPM(Swift Package Manager)のやり方です
![スクリーンショット 2023-04-29 4.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/7aade1da-0dbe-747a-0ce6-51ddcb18d2b2.png)

HotReloadingの追加方法はこちらのReadMe見てください

https://github.com/johnno1962/HotReloading

Injectはそのまま追加すればいけると思います

## Other Linker Flagsに-Xlinker -interposableを追加

![スクリーンショット 2023-04-29 4.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/efa0093d-1162-b060-a13e-1a8f1b6d53d7.png)

ReleaseもDebugもやっちゃってますけど、使うのはDebugだけだと思うんで、DebugだけでOKです

#### ちなみにPROJECTとTARGETS両方に設定した場合動かなかったり、nozerocode発生して原因がわからなくなることあるので注意してください。

## コードにおまじないを追加
2つあります
### 一個目
    @ObservedObject private var iO = Inject.observer

### 二個目

        VStack {

        }
        .enableInjection() //←これ

## 画面の部分(コピペOK)

    import SwiftUI
    import Inject
        
    struct ContentView: View {
        @ObservedObject private var iO = Inject.observer
    
        var body: some View {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundColor(.accentColor)
                Text("Hello hello")
    
            }
            .padding()
            .enableInjection()
    
        }
    }
    

## まとめ

SwiftUI HotReloadみたいな感じで調べて色んな記事を参考にやってみたけど、全然うまく行かなくて、
『できないやんけ!!!!!!!!!!!!!!!クソがぁぁぁぁぁ!!!!!!!!!!!!!!!!!!』

って思いながら、HotReloadなしで進めようか悩んだんですけど、FlutterではHotReloadが標準だったんでやっぱ毎回ビルドすんの無理！！！やだ！！！！！って思って頑張ってやったらできました

下記を参考にしながらやるのが一番いいかもです。

https://levelup.gitconnected.com/hot-reloading-a-swiftui-app-77ba6ade1df7

追記

もしかしたらHot Reloadingはいらないかもっす

その時は消してくださいまし

ここ最近で一番苦戦したかもです
AWSで開発環境構築 #3（NATゲートウェイの作成）

# 目的

https://qiita.com/kanerin1004/items/c91721c52a779df84d72

これの続き！
今日はNATゲートウェイを付けます。

# 今回やること

今回の目標は以下の4つ。
* NATゲートウェイの作成
* ルートテーブルの作成
* ルートテーブルの設定
* ルートテーブルの関連付け

# 環境
* windows 10

# いざ出陣

## NATゲートウェイについて
NAT（Network Address Translation）ゲートウェイは、プライベートネットワーク内のデバイスが、インターネット上のグローバルなIPアドレスを持つデバイスと通信するために使用されるネットワークデバイスです。
そもそも知らなかったのですが一般的な言葉（AWSのものじゃない）で、普通、ルーターに内蔵されているようです。使用することで、プライベートネットワーク内のデバイスがインターネットにアクセスできるようになり、ネットワークのセキュリティを向上させることができます。AWSのNATゲートウェイは、AWSのマネージド型ネットワークサービスの1つであり、プライベートサブネット内のインスタンスやリソースがインターネットと通信するためのゲートウェイとして使用されます。

イメージはこう！

![NAT_gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/08927b56-9955-1d20-e0b0-9513b7102bea.png)



## NATゲートウェイの作成

1. VPCダッシュボードの左のメニューから、「NAT ゲートウェイ」を選択する。
1. 「NAT ゲートウェイを作成」をクリックする。
1. 以下の項目を設定する。

<dl>
  <dt>名前 - オプション</dt>
  <dd>test_natgateway</dd>
  <dt>サブネット</dt>
  <dd>test-subnet01</dd>
  <dt>接続タイプ</dt>
  <dd>パブリック</dd>
  <dt>Elastic IP 割り当て ID</dt>
  <dd>Elastic IP を割り当て</dd>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/cf17a2ff-d331-5f82-0591-87a8e90c3576.png)


## ルートテーブルの作成

1. VPCダッシュボードの左のメニューから、「ルートテーブル」を選択する。
1. 「ルートテーブルを作成」をクリックし、以下の項目を設定してルートを作成する。

<dl>
  <dt>名前 - オプション</dt>
  <dd>test-route-table02</dd>
  <dt>VPC</dt>
  <dd>test-vpc-01</dd>
</dl>

変更を保存すると、ルートテーブルに追加される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/e735eaf9-258f-859f-a663-fb4f0f5028fc.png)


## ルートテーブルの設定

1. 上で作成した「test-route-table02」を選択する。
1. 「ルート」から「ルートを編集」を開く。
1. 「ルートを追加」をクリックし、以下の項目を設定する。

<dl>
  <dt>送信先</dt>
  <dd>0.0.0.0/0</dd>
  <dt>ターゲット</dt>
  <dd>「nat-」と入力して上で作成した「test_natgateway」をプルダウンから選択</dd>
</dl>

## ルートテーブルの関連付け

1. VPCダッシュボードの左のメニューから、「サブネット」を選択する。
1. 「test-subnet-pub01」を選択し、「アクション」から「ルートテーブルの関連付け」をクリックして開く。
1. 「ルートテーブル ID」のプルダウンで「test-route-table02」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/f613b9cc-21ee-0127-6b5e-06e7f941ecd2.png)


VPCから「Resource map」を開き、以下のように「test-subnet-pub01」が「test-route-table02」につながっていたら完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/838f18b4-7d21-e7c5-ad3b-176d53db6e1a.png)


# 余談
これでひとまず、いい感じだと思う。

後はこれ、そのまま置いてたら課金されていくらしいから削除の方法と、
開発資源をデプロイしてリリースする方法を知りたいな。

今日は以上。

#### 続き
追記（2023/04/30）

https://qiita.com/kanerin1004/items/69c0c082e4b09774a553
Az Predictorでコマンド入力を助けてもらう

### はじめに

以前、[Az findコマンドを活用しよう](https://qiita.com/k-kimino/items/a84eaf4a74583d87ac81)というブログをポストしましたが、似たようなコマンドでもう一つ便利なものがあるということで調べてみました。Az Predictorです。

### Az Predictorとは

Microsoftのアナウンスを見ると以下のように書かれています。Predictorの名の通り、セッションのコンテキストを理解し、必要なコマンドやパラメータを予測（提案）してくれます。

> Az Predictor helps our Azure developers find the cmdlet they are looking for efficiently, identify the required parameters quickly, and experience fewer errors.
We worked closely with the PowerShell team to have Az be the first module that leverages this new interface and bring suggestions to the developer’s fingertips. Az Predictor takes the context of the current session into account in its suggestions. With Az Predictor’s context-aware suggestions users will be guided through the discovery of cmdlets and will not need to go to the online help as often.

### Az Predictorをインストールする


1. PowerShell 7.2をインストールする
2. Install PSReadline 2.2をインストールする
```
Install-Module PSReadline -Force
```
3. Az.Tools.Predictorをインストールする
```
Install-Module -Name Az.Tools.Predictor
```
4. AzPredictorを有効化する
```
Enable-AzPredictor -AllSession
```
5. リストビューを有効化する (必要な場合)
```
Set-PSReadLineOption -PredictionViewStyle ListView
```
![Installazpredictor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/454c9a62-a505-010f-4af4-e5b7d7db8b2d.png)

### Az Predictorを使ってみる

#### インラインモード
コマンド入力の途中で続きやパラメータを推測して提案してくれます。
![inlinemode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/2fef3562-6e7d-b9a2-d5ff-f87348f99b78.png)

#### リストビューモード
コマンド入力中にF2を入力すると、複数の候補を提案してくれます。
![listview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/e29e1a13-82b2-f649-94ef-dd276641754a.png)

### まとめ
前回のAz findと違い、ドキュメントベースの使い方を例示してくれるわけではなく、コマンドの続きを自動で予測して提案してくれます。やりたい作業があるけどどんなコマンドを使えばいいかわからない時はAz find、普段のコマンド入力のサポートはAz Predictorとそれぞれを活かして効率的に開発を進められるといいですね。

### 参考

[Az Predictor Module – Azure PowerShell Predictions](https://www.thomasmaurer.ch/2021/02/az-predictor-module-azure-powershell-predictions/)
[Announcing Az Predictor](https://techcommunity.microsoft.com/t5/azure-tools-blog/announcing-az-predictor/ba-p/1873104?WT.mc_id=modinfra-16468-thmaure)
プログラミング言語リポジトリのコミット数の可視化

Rubyリポジトリのコミット数を可視化してみました。集計対象期間は2022年1月1日から12月31日までです。

調べていくうちに、他のリポジトリも集計してみることにしました。

様々なソフトウェアを開発してくださっている皆さんありがとうございます…！

過去の記事：[RubyとPythonの開発者コミュニティを比較してみた](https://qiita.com/ts-3156/items/74c2f864302eba06c586)

### 注意点

- 各リポジトリには下記の違いがあります。そのため、コミット数の比較だけでは分からないことがたくさんあります
    - 各リポジトリの開発を開始した時期や公開を開始した時期が異なる
    - 各リポジトリのコミット粒度が異なる
    - 付属するライブラリが別のリポジトリになっていることがある
    - リポジトリによってはbotによるコミットも含まれている
- コミットの集計はGitHubのリポジトリのデフォルトブランチを元にしています
- リポジトリをGithubに移行する前のコミットは正しく集計できていません
- Author名が無い場合は集計から除外しています
- コミットの集計は客観的な数字の計測でしかなく、コミュニティやコミッターの価値を測る意図はありません



### Rubyリポジトリ

集計したリポジトリは https://github.com/ruby/ruby です。Nobuyoshi Nakadaさんという方がコミット数で終始他の方を圧倒している様子が分かります。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>77571</td><td>740</td></tr>
  <tr><td>2022年</td><td>4912</td><td>253</td></tr>
  <tr><td>上位30人</td><td>4241</td><td>30</td></tr>
</table>

![ruby.gif](https://ts-3156.github.io/chasingchart/src/images/ruby.gif)




### Pythonリポジトリ

Rubyと比較されることの多いPythonリポジトリについても調べてみました。集計したリポジトリは https://github.com/python/cpython です。こちらではVictor Stinnerさんという方のコミット数が圧倒的でした。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>116588</td><td>2354</td></tr>
  <tr><td>2022年</td><td>3824</td><td>616</td></tr>
  <tr><td>上位30人</td><td>2440</td><td>30</td></tr>
</table>

![python.gif](https://ts-3156.github.io/chasingchart/src/images/python.gif)




### PHPリポジトリ

他の言語についても気になったので調べてみました。ここではPHPです。集計したリポジトリは https://github.com/php/php-src です。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>128188</td><td>1310</td></tr>
  <tr><td>2022年</td><td>3256</td><td>137</td></tr>
  <tr><td>上位30人</td><td>3050</td><td>30</td></tr>
</table>

![php.gif](https://ts-3156.github.io/chasingchart/src/images/php.gif)




### Javaリポジトリ

Javaには意味合いの異なるリポジトリがいくつかあるようなのですが、ここでは https://github.com/openjdk/jdk を調べてみました。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>73477</td><td>1257</td></tr>
  <tr><td>2022年</td><td>4555</td><td>346</td></tr>
  <tr><td>上位30人</td><td>2160</td><td>30</td></tr>
</table>


![java.gif](https://ts-3156.github.io/chasingchart/src/images/java.gif)


### Perlリポジトリ

Perlのリポジトリは https://github.com/Perl/perl5 のようです。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>78154</td><td>1433</td></tr>
  <tr><td>2022年</td><td>2344</td><td>95</td></tr>
  <tr><td>上位30人</td><td>2222</td><td>30</td></tr>
</table>


![perl.gif](https://ts-3156.github.io/chasingchart/src/images/perl.gif)



### Rustリポジトリ

Rustのリポジトリは https://github.com/rust-lang/rust のようです。ちなみにborsさんはマージコミット用のbotでした。

<table>
  <tr><td>対象期間</td><td>コミット数</td><td>ユーザー数</td></tr>
  <tr><td>全期間</td><td>222493</td><td>5776</td></tr>
  <tr><td>2022年</td><td>29164</td><td>1197</td></tr>
  <tr><td>上位30人</td><td>19198</td><td>30</td></tr>
</table>


![rust.gif](https://ts-3156.github.io/chasingchart/src/images/rust.gif)
Shell芸人によるCTFでのコマンドバイパス術

# 概要

CTFではコマンドが使えなくされていたりすることが多い。
特にMiscやBash系の問題では日常茶飯事である。
そんな時のためのチートシートがある。誰でも簡単にコピペすればいい感じにできる。

割と圧倒的に使えるコマンドを探さなくてよくなるから便利と思います。

## ls

これでカレントディレクトリのファイルをたくさん見れる。

```bash
printf "%s\n" ./.* ; printf "%s\n" ./*
```

ファイルタイプまで表示しているバージョン。

```bash
for file in ./* ./.* ; do file "$file"; done
```

### 利用例

```
ayato@ayato-app-dev:~$ printf "%s\n" ./.* ; printf "%s\n" ./*
./.
./..
./README.md
./main.py
```
```
ayato@ayato-app-dev:~$ for file in ./* ./.* ; do file "$file"; done
./README.md: Unicode text, UTF-8 text
./main.py: Python script, ASCII text executable
./.: directory
./..: directory
```
## cat

```bash
while read -r line || [[ -n $line ]]; do echo "$line"; done < ファイル名
```

### 利用例

```
ayato@ayato-app-dev:~$ while read -r line || [[ -n $line ]]; do echo "$line"; done < ./README.md
hello
```

# まとめ

CTFで使ったり、役に立ったらいいねお願いいたします。

# 参考

https://qiita.com/LabPixel/items/5126fdb0a812691f8bdb

https://qiita.com/LabPixel/items/b6f035dc9547e470266b

https://qiita.com/LabPixel/items/7ef610301e82ae1964fe
SMTP認証

●SMTP認証（SMTP-AUTH）
SMTPには元々認証の仕組みがない。MTA（Message Transfer Agent）に接続できれば誰でもメールを送信することができます。
しかし、誰でもMTAを使ってメールを送信できるとなると、メールサーバがスパムメールの送信元として使われるなど悪用される可能性があります。そのため、MTAに接続する際に正当な利用者かどうかを認証する仕組みが追加されました。それが「SMTP認証（SMTP-AUTH）」。

●SMTP認証の設定
Postfixの設定ファイル「/etc/postfix/main.cf」でSMTP認証を設定する項目

書式
設定項目＝値[,値]

設定項目
・smtpd_sasl_auth_enable　SASL認証の有効化(yes)/無効化(no)を指定
・smtpd_sasl_type　認証に使うSASLプラグインの種類を指定
・smtpd_sasl_path　PostfixとSASLプラグインが認証情報を受け渡す
・smtpd_sasl_local_domain　SASL認証のドメイン(レルム)を指定

●SMTPサーバからの応答の行頭に表示された数字はSMTPの応答コード。2XX系のコードは成功を示します。

220：サービス準備が完了した
250：要求された処理が完了した
235：認証が成功した
221：送信チャネルを閉じる
LD_PRELOADを使ってpgbenchの初期データロードの挙動を変更してみる

[pgbench](https://pgsql-jp.github.io/current/html/pgbench.html)は、ベンチマーク対象のPostgreSQLのバージョンが14以降の場合、デフォルトでは[COPY FREEZE](https://pgsql-jp.github.io/current/html/sql-copy.html)コマンドを使用して、pgbench_accountsテーブルの初期データをロードします。しかし、LD_PRELOADを使用することで、pgbenchの挙動を変更し、(FREEZEオプションが指定されていない)COPYコマンドを使用して、pgbench_accountsテーブルの初期データをロードすることができます。

具体的には、pgbenchは[PQserverVersion()](https://pgsql-jp.github.io/current/html/libpq-status.html)関数を使用して、PostgreSQLのバージョンを取得し、バージョンが14以上であればCOPY FREEZEコマンドを使用します。そのため、PQserverVersion()関数をフックして、常にバージョン13を返すようにすることで、pgbenchはCOPYコマンドを使用することができます。

まず、以下のようにPQserverVersion()と同じ関数定義で、常にバージョン13を返す関数を作成します。このプログラムのファイル名はmyPQserverVersion.cとします。

```c
#include "libpq-fe.h"

int PQserverVersion(const PGconn *conn) {
    return 130000;
}
```

次に、この関数を共有ライブラリとしてコンパイルします。

```shell
$ gcc -shared -fPIC myPQserverVersion.c -o myPQserverVersion.so -I/path/to/pgsql/include
```

最後に、LD_PRELOAD環境変数を使用して、先程作成した共有ライブラリを指定してpgbenchを実行します。

```shell
LD_PRELOAD=./myPQserverVersion.so pgbench -i
```

これで、pgbenchはPostgreSQL14以降であっても、COPYコマンドを使用してpgbench_accountsテーブルの初期データをロードするようになります。確認のために、[log_statement](https://pgsql-jp.github.io/current/html/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHAT)をallに設定して、FREEZEが指定されていたかどうかを確認することができます。