OmniAICreator/Qiita-1.07M huggingface dataset:
ITインフラについてのお勉強

ITインフラ系のお仕事をする可能性が高いのでお勉強。
少しづつ更新していきます。
# ITインフラとは

そもそもITインフラとは。
ITインフラとは **「ITの基盤となる設備や施設のこと」** であり、サーバーやルータ、OSなどがITインフラにあたる。

# インフラエンジニアのお仕事

インフラエンジニアには主に「インフラ設計・構築・運用」のお仕事がある。

 **インフラ設計**
まずインフラを作る目的があるはずなのでお客様にヒアリングを行う。その際、その目的を達成する為に必要な機能や性能を要件としてまとめる。
その後、インフラの種類・費用・期間をまとめた企画書(設計書)を作り、インフラの構築に移る。

 **インフラ構築**
設計書を作成したら、以下のような作業を行う。
・機器の運搬
・機器の組み立てや取り付け、インストール
・サーバー、ストレージ設定
・ネットワーク機器の設定  など

 **インフラ運用** 
構築したITインフラは、24時間365日動いてないといけない。
そのため、シフト制で監視体制を作ることが多い(運用は外注に任せることもある)
故障対応やインフラの負荷チェック、インフラ起因でのシステム障害なのかを見極める必要がある。


# RASIS
R(Reliability)信頼性 
障害の起きにくさを表す。平均故障間隔

A(Availability)可用性
サービスの止まりにくさ。稼働率

S(Serviceability)保守性
障害復旧のしやすさ。平均修理時間

I(Integrity)完全性
データに漏れが無い、一貫性がある

S(Security)機密性
許可されたユーザーのみが閲覧可能
第三者にデータを漏洩しない

# 参考文献
佐野 裕. 「インフラエンジニアの教科書」. C&R研究所. 2013
Go言語向けNCMB SDKの使い方（InstallationのCRUD操作）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はInstallation（デバイストークン）のCRUD操作について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

## Installationの新規作成

`Installation` メソッドで新規データのインスタンスを作ります。 `deviceToken` と `deviceType` は必須です。

```go
installation := ncmb.Installation()
installation.Set("deviceToken", "testDeviceToken")
installation.Set("deviceType", "ios")
if bol, err := installation.Save(); err != nil {
	t.Errorf("Error: %s, %T", err, bol)
}
```

## Installationの更新

Installationの更新は新規作成と同じく `Save` メソッドで行います。

```go
installation := ncmb.Installation()
installation.Set("deviceToken", "testDeviceToken")
installation.Set("deviceType", "ios")
if bol, err := installation.Save(); err != nil {
	t.Errorf("Error: %s, %T", err, bol)
}
newToken := "testDeviceToken2"
installation.Set("deviceToken", newToken)
if bol, err := installation.Save(); err != nil {
	t.Errorf("Error: %s, %T", err, bol)
}
```

## Installationの削除

Installationの削除は `Delete` メソッドで行います。

```go
installation.Delete()
```

## Installationの検索

Installationを検索する際には `Query` メソッドを使います。引数は `installations` としてください。

```go
query := ncmb.Query("installations")
query.EqualTo("deviceType", "ios")
items, err := query.FetchAll()
if err != nil {
	t.Errorf("Error: %s", err)
}
```

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
Stable Diffusion XL1.0 Foocus 4770K+GT1030

# 2023/08/18 作業記録
Stable Diffusion Web UI AUTO1111(SD1111)
Stable Diffusion XL 1.0 (以降、SDXL1.0)
Fooocus(Fooocus_win64_1-1-10 以降、Foocus)

## Fooocus の利点
必要なプログラムをハードウェアを確認後、調整しているらしい

python コードサンプル
gpu_check.py
```
import torch

if torch.cuda.is_available():
  num_gpus = torch.cuda.device_count()
  for i in range(num_gpus):
    print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
else:
  print("GPU is not available")

```

## Dell Optiplex 3020 A20
CPU:intel Core i7 4770K
MEM:16GB PC3-12800
VGA:nVidia GT 1030 DDR4 2GiB
※ディスクアクセスが頻繁なため、1GiB ほどの
ディスクキャッシュを別途設定しています。
[IODATA アイ・オー・データ マッハドライブ](https://www.iodata.jp/product/soft/speed/mach_drive/)

## 生成時間
- SD1111 512 x 512 8分弱
- SDXL 1.0 途中でキャンセル N/A
- Foocus 1時間15分

## Fooocus での画像生成
画像は相も変わらず。
プロンプトの中に薔薇の名前「royal highness」(ロイヤルハイネス)を入れての生成です。

出力ログ
```
2023-08-17_22-33-19_2373.png

Prompt: 1girl, Caucasian.upright immovable,full body,like the royal highness,(smile:1.2)thin shoulder white strap and white camisole.(realistic, real life:1.2),(masterpiece:1.2),20-years-old,standing,(shaped face:1.1),brun eyes,simple silver piassings,(simple necklace:0.7),RAW, stunning portrait of an intelligent young beautiful woman. The final product should be a masterpiece that captures the essence and beauty of a woman. sharp focus, sharp focus, 8k UHD, DSLR, high quality,white background

Negative Prompt: nsfw, naked, wet skin,illustration,manga,anime,Charatoon,black woman,hispanic woman

Style: sai-3d-model, Performance: Quality

Resolution: (1024, 1024), Sharpness: 2

Base Model: sd_xl_base_1.0_0.9vae.safetensors, Refiner Model: sd_xl_refiner_1.0_0.9vae.safetensors

Seed: 587929771, LoRA [sd_xl_offset_example-lora_1.0.safetensors] weight: 0.5
```
__生成された画像(CPUモードではないため、GT1030でないと同じ画像になりません)__
![2023-08-17_22-33-19_2373.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486298/16dd6301-36b2-8a7f-8175-d5cd2dd23548.png)


## 追記
当該環境では SDAUTO1111 も実行可能ですが、
リフューザーの導入、SDXL Styles の導入まで行うと
かなりハードな重さになります。

相当強引な環境のため、のっぴきならない状況でないかぎり
お勧めできない環境なのであくまでネタとして個人記録を残します。


###### tags: `20230818` `SDXL` `GT1030`
xfeatがインストールできない

特徴量エンジニアリング用に`xfeat`をインストールしようとしたができなかった．

# 解決策
setuptoolsをダウングレード
```shell
pip install -U setuptools==57.0.0
```

(元々のバージョン)
```
setuptools                    68.1.0
```

## 参考
https://blog.amedama.jp/entry/xfeat

https://qiita.com/ijufumi/items/d1149f3d4c0034235799
ROS-TCP-Connector 使用方法

# Installation
(Unity側)
ROS-TCP-ConnectorのREADME.mdに沿ってパッケージをインストール

https://github.com/Unity-Technologies/ROS-TCP-Connector

(ROS側)

ワークスペース内に`ROS-TCP-Endpoint`をインストール
```
git clone git@github.com:Unity-Technologies/ROS-TCP-Endpoint.git
```


# 実行

(Unity側)

引用元: 

https://qiita.com/ousagi_sama/items/7ded4d8e9c701c0a24ae
1. Unity上部メニューからROS Setingsというウィンドウを開きネットワークを設定

2. スクリプトを作製（※ファイル名とクラス名は同じにすること）

![Screenshot from 2023-08-18 17-28-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/6a5ddae3-1198-af95-16c5-f6eb4de26da5.png)


2.1 Subscriber

```c#:Sub_test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using StringMsg = RosMessageTypes.Std.StringMsg;

public class Sub_test : MonoBehaviour{

    void Start(){
        ROSConnection.instance.Subscribe<StringMsg>("test1", Callback);
    }

    void Callback(StringMsg msg){
        Debug.Log(msg.data);
    }

}
```
テスト用コマンド
```
rostopic pub /test1 std_msgs/String test!!
```

2.2 Publisher


```c#:Pub_test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using Int32Msg = RosMessageTypes.Std.Int32Msg;

public class Pub_test : MonoBehaviour{

    ROSConnection ros;
    // Start is called before the first frame update
    void Start(){
        ros = ROSConnection.instance;
        ros.RegisterPublisher<Int32Msg>("test2");
    }

    // Update is called once per frame
    void Update(){
        Int32Msg msg_data = new Int32Msg(12345);
        ros.Send("test2", msg_data);
    }

}
```
テスト用コマンド
```
rostopic echo /test2
```


(ROS側)


```
rosrun ros_tcp_endpoint default_server_endpoint.py
```

# トラブルシューティング

## ROSコネクションが表示されない

![Screenshot from 2023-08-18 17-23-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/a1bdcfe8-a1c8-6a36-e443-b1325946e341.png)

原因
- ROS Clicentがunity上に存在しない

チェック項目
- world内にROS clientを生成するためのScriptが配置されているか
- scriptに間違えがないか

# 参考


- 
https://zenn.dev/karaage0703/articles/2de654a413049e

- unity ros 通信に必要なパッケージ
ROS-TCP-Endpoint

https://github.com/Unity-Technologies/ROS-TCP-Endpoint

- Qiita: ROS-TCP-ConnectorでPubSub通信 

https://qiita.com/ousagi_sama/items/7ded4d8e9c701c0a24ae

- ROS入門 (18) - ROS-Unity間のサービスによる通信

https://note.com/npaka/n/nca49d9bd9d68
2D関数の視覚化: ヒートマップと連続最適化

# はじめに
2D関数は、入力が2D空間内の点で、出力が1Dの値である関数のことをここでは言います。このような関数を視覚的に理解するためにヒートマップを使用することができます。OpenSiv3Dを活用すれば、最適化のプロセスを含む多岐にわたる用途で利用可能です。

```cpp
#include <Siv3D.hpp>

struct FunctionImage {
	const double resolution;
	const Vec2 rangeStart;
	const Vec2 rangeEnd;
	const Image image;
	const Texture texture;

	FunctionImage(std::function<double(const Vec2&)> func, double res, Vec2 start, Vec2 end, double minValue = 0.0, double maxValue = 1.0, ColormapType colormapType = ColormapType::Gray)
		: resolution(res), rangeStart(start), rangeEnd(end), image(createImage(func, res, start, end, minValue, maxValue, colormapType)), texture(image) {}

	void draw() const {
		texture.scaled(resolution).drawAt((rangeStart + rangeEnd) / 2);
	}

private:

	Image createImage(std::function<double(const Vec2&)> func, double res, Vec2 start, Vec2 end, double minValue, double maxValue, ColormapType colormapType) const {
		const int width = static_cast<int>((end.x - start.x) / res);
		const int height = static_cast<int>((end.y - start.y) / res);
		Image img(width, height);

		for (int y = 0; y < height; ++y) {
			for (int x = 0; x < width; ++x) {
				double value = func(Vec2(x * res + start.x, y * res + start.y));
				const double mappedValue = mapValue(value, minValue, maxValue, 0.0, 1.0);
				img[y][x] = Colormap01(mappedValue, colormapType);
			}
		}

		return img;
	}

	double mapValue(double x, double in_min, double in_max, double out_min, double out_max) const {
		return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
	}
};

void Main() {
	constexpr double resolution = 0.1;
	constexpr Vec2 rangeStart(-10, -10);
	constexpr Vec2 rangeEnd(10.0, 10.0);
	const std::function<double(const Vec2&)> func = [](const Vec2& pos) {
		return (std::sin(pos.x) + std::cos(pos.y)) / 2.0 + 0.5;
	};

	const FunctionImage funcImage(func, resolution, rangeStart, rangeEnd, -1.0, 2.0);
	Camera2D camera((rangeStart + rangeEnd) / 2, 100.0);

	while (System::Update()) {
		camera.update();
		{
			const auto t = camera.createTransformer();
			funcImage.draw();
		}
	}
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/48bdc391-9ade-f2d0-735a-7273eb33b10a.png)

# 2D関数とヒートマップ

2D関数の定義

- **2D関数**: 入力が2次元の座標、出力が1次元の値。
- **例**: \( z = f(x, y) \)

ヒートマップの利用

- **ヒートマップ**: 2D関数の値を色で表現。
- **色の対応**: 出力値と色の間のマッピング（例: 高い値→赤、低い値→青）。

# 面白い使用方法

1. **教育的ツール**: 関数の地形を視覚化して理解を深める。
1. **リアルタイム最適化**: ヒートマップ上で最適化プロセスのリアルタイム追跡。

# 結論

2D関数とヒートマップの組み合わせは、関数の挙動を直感的に理解し、最適化などのプロセスを視覚化する強力な手法です。OpenSiv3Dを使用すると、このプロセスを容易に実装し、多岐にわたるアプリケーションで使用することができます。
Go言語向けNCMB SDKの使い方（ロールのCRUD操作）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はロール（グループ）のCRUD操作について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

## ロールの新規作成

Role メソッドで新規データのインスタンスを作ります。引数はロール名です。

```go
role := ncmb.Role("Admin")
bol, err := role.Save()
if err != nil {
	t.Errorf("Error: %s", err)
}
if bol == false {
	t.Errorf("Error: %s", err)
}
```

### ロールに子ロールを追加する

ロールは階層構造にできます。 `AddRole` でロールを追加できます。

```go
role1 := ncmb.Role("TestRole1")
if _, err := role1.Save(); err != nil {
	t.Errorf("Error: %s", err)
}
role2 := ncmb.Role("TestRole2")
if _, err := role2.Save(); err != nil {
	t.Errorf("Error: %s", err)
}
role3 := ncmb.Role("TestRole3")
if _, err := role3.Save(); err != nil {
	t.Errorf("Error: %s", err)
}
role1.AddRole(role2)
role1.AddRole(role3)
bol, err := role1.Save()
```

### 子ロールから削除する

逆に削除する場合には `RemoveRole` を使います。なお、追加と削除を同時にはできません。

```go
role1.RemoveRole(role2)
bol, err := role1.Save()
```

### ロールにユーザーを所属させる

ユーザーを特定のロールに紐付ける場合には `AddUser` を使います。

```go
role1 := ncmb.Role("TestRole1")
if _, err := role1.Save(); err != nil {
	t.Errorf("Error: %s", err)
}
userName, password := "roleGo", "roleGo"
user, err := ncmb.SignUpByAccount(userName, password)
role1.AddUser(*user)
if bol, err := role1.Save(); err != nil {
	t.Errorf("Error: %s, %T", err, bol)
	role1.Delete()
	user.Delete()
}
```

### 子ロールを取得する

ロールに紐付く子ロールを取得する際には `FetchRole` を使います。

```go
roles, err := role1.FetchRole()
if err != nil {
	t.Errorf("Error: %s", err)
}
```

### ロールに所属するユーザー一覧を取得する

ロールに所属するユーザー一覧は `FetchUser` で取得できます。

```go
users, err := role1.FetchUser()
if err != nil {
	t.Errorf("Error: %s", err)
}
```

## ロールの更新

ロールの更新は新規作成と同じく `Save` メソッドで行います。

```go
role := ncmb.Role("TestRole1")
role.Save()
roleName := "TestRole2"
role.Set("roleName", roleName)
bol, err := role.Save()
if err != nil {
	t.Errorf("Error: %s", err)
}
```

## ロールの削除

ロールの削除は `Delete` メソッドで行います。

```go
role.Delete()
```

## ロールの検索

ロールを検索する際には `Query` メソッドを使います。引数は `roles` としてください。

```go
query := ncmb.Query("roles")
query.EqualTo("roleName", "Admin")
ary, err := query.FetchAll()
if err != nil {
	t.Error(err)
}
```

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
Kali Linuxのダウンロードしようとしたら文字化けページが出たから経過と対処と

1．はじまり
　セキュリティの勉強したいなと思い、「コンピューターハイジャッキング」(オーム社)を買ったところ、仮想環境でKali Linuxを用いて進めていく形だったので、Kali Linuxの公式でインストールしようとした。

2．経過
　ダウンロードしようとするもなぜかダウンロードするところをクリックしたら、文字化けしたページが表示されてしまいダウンロードが一向に始まらない。試していたのが、VMwearのものだったので、他のならいけるかなと試してもどれも文字化けのページが表示されて止まる。

3．解決
　ネットで同じ現象の人いないかなと調べたらすぐにその解決法が載っていた。(こちらのサイトhttps://akademeia.info/?p=25997) まず、原因はファイルが7zipで圧縮されているため、ブラウザが無理やりどうにか表示しようとして文字化けページになるらしい。で、その解決法として2通り示されていた。
　　
①文字化けページのURLの一番下の部分を消して、上のディレクトリにアクセスして、そのページで自分が欲しいファイルのページを右クリックして保存。
②文字化けページが表示されないブラウザを使う。

以上の解決方法でどちらも試したところ、どちらでも問題解決。ちなみに、②の解決法の場合、ChromeとEdgeでうまくいかずFirefoxでうまくいった。

4．まとめ
　結局、解決方法は通れない道を迂回する形のものだったが、圧縮されたファイルを表示しないようにするといった道を通れるようにする解決方法はなかったのだろうかと疑問に感じたので今後調べて、もし覚えていたら、この記事に追記しよう。
　あまりなじみがない分野で起きる問題は対処方法が全く思いつかないが、例えば、①の解決方法に関しては以前もダウンロードページに移行しないからどうにかこうにか自分で同じ方法で解決したなと記事を書いていて思い出したので、経験の蓄積と知識の蓄積で解決方法を推論、発想できるようにしていきたい。今後も記事を書くことで蓄積を進めていこうと思う。
ES2022の新しい配列メソッド`.at()`を徹底解説！


こんにちは！最近JavaScriptで新しい配列メソッドが話題になっていますね。その名も`.at()`。この記事では`.at()`メソッドの基本的な使い方から応用までをわかりやすく解説します。さっそく見てみましょう！

## 目次
1. `.at()`メソッドとは？
2. 基本的な使い方
3. 負のインデックスでのアクセス
4. `.at()`と通常の配列インデックスの違い
5. まとめ

## 1. `.at()`メソッドとは？
JavaScriptの配列に新しく追加された`.at()`メソッドは、正のインデックスだけでなく負のインデックスも受け付ける特性があります。これにより、配列の最後からのアクセスがとても簡単になりました。

## 2. 基本的な使い方
最初は基本的な使い方から。

```javascript
const fruits = ["apple", "banana", "cherry", "date", "fig"];

// 最初の要素を取得
console.log(fruits.at(0)); // "apple"

// 3番目の要素を取得
console.log(fruits.at(2)); // "cherry"
```

## 3. 負のインデックスでのアクセス
`.at()`の真骨頂は、負のインデックスを使って配列の最後から要素にアクセスする機能です。

```javascript
// 最後の要素を取得
console.log(fruits.at(-1)); // "fig"

// 最後から2番目の要素を取得
console.log(fruits.at(-2)); // "date"
```

## 4. `.at()`と通常の配列インデックスの違い
通常の配列インデックスと`.at()`メソッドの主な違いを確認しましょう。

```javascript
// 通常の配列インデックスで範囲外にアクセス
console.log(fruits[100]); // undefined

// .at()メソッドで範囲外にアクセス
console.log(fruits.at(100)); // undefined
```

範囲外へのアクセスも安全に`undefined`を返します。

## 5. まとめ
`.at()`メソッドは、配列の要素へのアクセスをより柔軟に、簡単にするための新しいツールです。特に配列の最後の要素へのアクセスが非常にシンプルになったので、是非活用してみてください！

---

このような新しいJavaScriptの機能を知って、開発の効率や可読性を向上させることができますね。もし気に入ったら、いいね👍やシェアをお願いします！

---

以上、`.at()`メソッドの解説でした。次回も新しい技術の解説をお楽しみに！
C# 非同期処理を引数で渡す方法

`Task<>`,`async`,`await`をどこに付ければ良いのか、、慣れないと書き方に戸惑うので備忘…

## 非同期処理を引数とするメソッドを作成する

ある処理を外部から引数で渡したい場合、下記のように`Action`や`Func<T>`を使用するが、

### <font color="Blue">同期</font>処理を引数とするメソッドの定義

```C#
TResult Sample<TResult>(Func<int, TResult> func)
{
  //todo 前処理
  var result = func(100);
  //todo 後処理
  return result;
}
```

この引数`func`を非同期にしたい場合は下記のようにする。

### <font color="Red">非同期</font>処理を引数とするメソッドの定義

```C#
async Task<TResult> SampleAsync<TResult>(Func<int, Task<TResult>> func)
{
  //todo 前処理
  var result = await func(100);
  //todo 後処理
  return result;
}
```

## 非同期処理を引数とするメソッドを呼び出す

```C#
async Task<int> CallAsync()
{
  return await SampleAsync(async num =>
  {
    return await Task.FromResult(num * 2); //todo 非同期処理
  });
}
```
【Unity】JsonUtilityで複数のファイルに、簡易的な暗号化をしたデータを保存する

# ■はじめに
個人でゲームをリリースしようと考えているので、ファイルの保存方法について真面目に考えることにしました。
従来ではそのままJsonUtilityで中身丸見えの状態で保存してましたが、不正されてしまうので暗号化することにしました。

(が、**タイトルにある通り、簡易的な暗号なのでセキュリティは結構弱めっぽいので、後々記事を更新したいです。**)

## ●当記事のコードのUnityPackageのダウンロード↓
ここから該当コードをダウンロードできます。

https://github.com/kiku09020/Unity_SaveAndLoad/releases/tag/0.1


# ■実行結果
こんな感じです。(某クリッカーゲームのオマージュです)
![SaveData.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/426735b1-d6fe-2602-3c20-212c2c841d74.gif)


暗号化もできてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/3785eb09-0491-e0e5-d300-6a49fad83a9a.png)




# ■解説
こちらの動画を元に作成しました。分かりやすいです。↓

https://youtu.be/aUi9aijvpgs?si=41SWqjIHmefpd95O

## ●設計
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/f10f7a58-4c24-4db1-8f5b-e902a82890b2.png)

**`GameDataBase`と、`DataManager`からそれぞれ派生させることで、設定データの保存、ゲーム内容の保存…などと細分化できます。**


## ●暗号化
参考の動画の通り、**XOR暗号**というのを利用しています。
**手軽に実装できますが、強度はあまり**だそうです。

今回は、Jsonで保存されるデータの文字列とパスワード的な文字列のXORで暗号にしていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/ef0262e5-97e6-b923-a727-7f53bac02a2d.png)
(抜粋：上記リンクの動画 24:00~)

XORの性質として、`(A ^ B) ^ B = A`というのがあるそうです。

`A: 0011`, `B: 0101` とすると、`A ^ B = 0110` になります。
そこにBをXORさせると、 `0110 ^ 0101 = 0011`と、Aになります。

これで、**`B`の部分に当たるパスワードさえあれば、`A ^ B`から`A`にしたり、`A`から`A ^ B`を作成することができます。**
これのおかげで、実際にプログラムに落とし込んでも、**メソッド1つで暗号化・復号化ができる**ってのがありがたいですね。

ですが、これをめちゃくちゃ高速で一つ一つ入力されたら、そのうちバレます。
なので、他の暗号使った方がよさそうです。(良いのが見つかり次第、当記事も更新します。)

# ■コード
リポジトリです↓
(newっていうフォルダのやつが該当のコードとか入ってるやつです)

https://github.com/kiku09020/Unity_SaveAndLoad

また、基本的に上記の参考動画の方が分かりやすいと思うので、コードの詳細解説はしません。

ですが、個人的に一部改良しています。

- `DataManager`の細分化：複数のファイルに保存した方が管理しやすいため。
- `FileDataHandler`を`static`にしてる：わざわざインスタンス化しなくてもいいかなって思ったため
- `DataManager`のシングルトンなくしてる：シングルトンにして、アクセスしやすくなって危険だと思ったため。
- クライアントインターフェースを検索して`List`に格納するのをなくして、クライアント側からイベントを登録するようにしてる：`Find`メソッドが重く、あまり好ましくないため。

こんな感じです。


# ■さいごに
暗号化について色々調べてみましたが、他のどの暗号使えばいいか分からないです🙄
AESってのが一番良さそう？
余裕とやる気ができたら、記事を更新します。

## ●参考

https://youtu.be/aUi9aijvpgs?si=41SWqjIHmefpd95O

https://ja.wikipedia.org/wiki/%E6%8E%92%E4%BB%96%E7%9A%84%E8%AB%96%E7%90%86%E5%92%8C
2023年、私が買ってよかったガジェット

2023年、8月までで、私が買ってよかったガジェットについて書いておきます。

## Xperia 1 V

まずは、ソニーのXperia 1 Vです。

![IMG_7562.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534640/749f2a51-c1e3-697d-d6f5-1c13df33746a.jpeg)


広角カメラが改善されて、比較的明るく撮れるようになりました。

また、背面の質感がマットな質感で、凸凹していて、持ちやすくなりました。手の脂などもつきにくいですね。
側面もスリットのようなものが入っていて、持ちやすいです。

ディスプレイも、4Kディスプレイで綺麗で、明るく見やすいです。

### Xperia 1 Vレビュー感想

Xperia 1 Vレビュー感想など

https://www.sumahodata.com/xperia-1-v-review/

https://www.sumahodata.com/xperia-1-v-case-osusume/

## Galaxy S23 Ultra

そして、Galaxy S23 Ultraです。

![IMG_6605.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534640/371a6952-e48f-5687-b6ad-97803dbe72bb.jpeg)

カメラが2億画素カメラになっていて、高画素の写真を撮影することができます。

また、光学10倍のカメラで、100倍ズームまで可能なので、遠くのものを撮影したいときにも利用できます。

そして、Sペンもメモを取るなどに便利です。スタイラスペンが使えるスマホはなかなかないので、重宝しています。

### Galaxy S23 Ultraのレビューなど

Galaxy S23 Ultraのレビュー、感想など

https://www.sumahodata.com/galaxy-s23-ultra-1shuukan/

https://www.sumahodata.com/galaxy-s23-ultra-case/

## エレコムのクリーニングクロス

また、ガジェットというか、「エレコム クリーナー 超強力クロス」が、スマホやタブレットなどのディスプレイについた指紋や手の脂などを拭き取るのに便利です。

サッと拭き取れます。

また、水洗いして、何度も使うことができるというのも、エコなので良いですね。

## そのほか

そのほかのスマホやガジェットなどの情報は、以下のブログかYouTubeで更新しています。

https://www.sumahodata.com/

https://www.youtube.com/channel/UCwyrqEymC61F0Xq_ywAUYKg
php artisan tinker 実行時に使用するディレクトリを作る権限がない時の対策

## php artisan tinker するとエラーが出る。

```shell-session
$ php artisan tinker

   Psy\Exception\RuntimeException

  Unable to create PsySH runtime directory. Make sure PHP is able to write to /run/user/0 in order to continue.

  at vendor/psy/psysh/src/Configuration.php:628
    624▕         $runtimeDir = $this->configPaths->runtimeDir();
    625▕
    626▕         if (!\is_dir($runtimeDir)) {
    627▕             if (!@\mkdir($runtimeDir, 0700, true)) {
  ➜ 628▕                 throw new RuntimeException(\sprintf('Unable to create PsySH runtime directory. Make sure PHP is able to write to %s in order to continue.', \dirname($runtimeDir)));
    629▕             }
    630▕         }
    631▕
    632▕         return $runtimeDir;

      +19 vendor frames
  20  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

`/run/user/0` のランタイムディレクトリを作る権限がない。

## PsySHのコードを見る

https://github.com/bobthecow/psysh/blob/main/src/ConfigPaths.php#L256-L271

```php:src/ConfigPaths.php
    /**
     * Get a runtime directory.
     *
     * Defaults to `/psysh` inside the system's temp dir.
     */
    public function runtimeDir(): string
    {
        if ($this->runtimeDir !== null) {
            return $this->runtimeDir;
        }

        // Fallback to a boring old folder in the system temp dir.
        $runtimeDir = $this->getEnv('XDG_RUNTIME_DIR') ?: \sys_get_temp_dir();

        return \strtr($runtimeDir, '\\', '/').'/psysh';
    }
```

`$this->runtimeDir` は設定していないので、
`XDG_RUNTIME_DIR` 環境変数があるとこっちを優先するみたいです。

```shell-session
$ echo $XDG_RUNTIME_DIR
/run/user/0
```

`/run/user/0` を作るみたいです。

```shell-session
$ ls -al /run/user
合計 0
drwxr-xr-x.  3 root     root      80  1月 1 15:55 .
drwxr-xr-x. 30 root     root     840  1月 1 13:56 ..
drwx------.  3 root     root      80  1月 1 15:39 0
```

`root` 権限でファイルが作られていたので、エラーになってました。
これのファイル権限を変更するわけにはいかないので、`~/.config/psysh/config.php` で実行時ディレクトリを作る場所を変更します。

## 対策

```shell-session
$ mkdir -p ~/.config/psysh
$ cat << EOS > ~/.config/psysh/config.php 
<?php

return [
    'runtimeDir' => '~/tmp',
];
EOS
```

```shell-session
$ php artisan tinker
```

`/tmp/psysh` のディレクトリが作成されます。
【Unity】ビルド完了後にビープ音を鳴らす


# はじめに
ビルド時間が長いアプリの開発を行っているとビルド中に他の作業をしていることが多いので、ビルド完了時に音を出力する方法を調べてみました。

ちなみに鳴動音はビルド失敗した時と同じなので導入直後はドキドキすると思います。。。

# ソース

`PostProcessBuild`のアトリビュートを付与するとビルド後にメソッドが実行されます。
引数は`PostProcessBuild`間の実行順なので他の場所でも`PostProcessBuild`を使っている方は適宜変更してください。

```c#
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

public class BuildFinish
{
    [PostProcessBuild(1)]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
    {
        Debug.Log("Build completed!");
        EditorApplication.Beep();
    }
}
```

https://docs.unity3d.com/ja/2019.4/ScriptReference/Callbacks.PostProcessBuildAttribute.html

# 関連
ソースコード修正後等のコンパイルが終わった際にも音を鳴らしたい方はこちらを参照のこと

https://qiita.com/toRisouP/items/8539a5814e31f76ac626
VSCodeのターミナルでMSYS2を開く

https://www.msys2.org/docs/ides-editors/

#### 環境

- Wingows Server 2022
- VSCode 1.81.1
- MSYS2 msys2-x86_64-20230718


#### 設定 
以下の設定をsetting.jsonに追加する。


```json:setting.json
{
    "terminal.integrated.profiles.windows": {
        "MSYS2 UCRT": {
            "path": "cmd.exe",
            "args": [
                "/c",
                "C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
            ]
        }
    }
    // デフォルトに設定する場合は以下追加。
    "terminal.integrated.defaultProfile.windows": "MSYS2 UCRT",
}
```


デフォルトにしておくとコンテキストメニューの`Open in integrated terminal`でも想定通りのディレクトリで開いてくれて嬉しい。

上記だと`UCRT64`の環境が開く。

`clang64`環境にしたい場合はargsの`-ucrt64`を`-clang64`とすれば良いみたい。

```shell-session
$ ./msys2_shell.cmd -help
Usage:
    msys2_shell.cmd [options] [login shell parameters]

Options:
    -mingw32 | -mingw64 | -ucrt64 | -clang64 | -msys[2]   Set shell type
    -defterm | -mintty | -conemu                            Set terminal type
    -here                            Use current directory as working
                                     directory
    -where DIRECTORY                 Use specified DIRECTORY as working
                                     directory
    -[use-]full-path                 Use full current PATH variable
                                     instead of trimming to minimal
    -no-start                        Do not use "start" command and
                                     return login shell resulting
                                     errorcode as this batch file
                                     resulting errorcode
    -shell SHELL                     Set login shell
    -help | --help | -? | /?         Display this help and exit

Any parameter that cannot be treated as valid option and all
following parameters are passed as login shell command parameters.

```


`msys2_shell.cmd`を見ると`-clang32`など他にも使えるものがあるのがわかる。

https://github.com/msys2/MSYS2-packages/blob/master/filesystem/msys2_shell.cmd#L37-L45
【2023年版】Laravel + Lighthouse チュートリアル環境構築 ( macOS + DockerCompose )

## 実行環境

| OS | macOS Monterey 13.5 |
| --- | --- |
| shell | zsh 5.8.1 (x86_64-apple-darwin21.0) |
| middleware | Docker(24.0.2, build cb74dfc) |
|  | Docker compose(v2.18.1) |

## 本記事で得られる結果

- Laravel Project
    - Lighthouse導入済み

## 参考資料

https://laravel.com/docs/10.x/installation

https://lighthouse-php.com/tutorial/#agenda

## 事前準備

1. PHPがインストール済みであること

https://qiita.com/naoto24kawa/items/38040e6a053d43bf3974

2. Docker Desktopがインストール済みであること

https://www.docker.com/get-started/

## 手順

1. Laravelのベースプロジェクトの作成

    ```shell
    curl -s "https://laravel.build/example-app" | bash
    ```

    > “example-app”は任意のプロジェクト名に変更可能
 
1. Docker上で起動する

    ```shell
    cd example-app
    ./vendor/bin/sail up
    ```

1. 起動したコンテナへアクセス

    ```shell
    docker compose exec laravel.test bash
    ```

1. マイグレーションの実行

    ```shell
    php artisan migrate
    ```

1. テストデータの作成

    ```shell
    php artisan tinker
    \App\Models\User::factory(10)->create()
    ```

    > 作業後は`exit`で終了する


1. Lighthouseのインストール

    ```shell
    composer require nuwave/lighthouse
    ```

1. デフォルトスキーマの作成

    ```shell
    php artisan vendor:publish --tag=lighthouse-schema
    ```

1. プラグインのインストール

    ```shell
    composer require mll-lab/laravel-graphiql
    ```

1. http://localhost/graphiql へアクセスし、データが取得できるか確認する

    ```graphql
    {
      user(id: 1) {
        id
        name
        email
      }
    }
    ```
AWS ECS Codepileline の CodeBuild (デプロイステージ) でのエラー Exception while trying to read the task definition artifact file from: Build

# エラー例

<img width="506" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/3af44f6c-5c22-450d-9e25-d1a8cc244d4c">

# 解決

ビルドステージをDeployステージの入力とした場合、
ファイルを利用するには buildspec.yml で artifacts のファイル指定が必要なようだ 

```yml
artifacts:
  files:
    - taskdef.json
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
リモートワークと相性抜群！モブプロツール

# 目次

[1.モブプロとは](#1-モブプロとは)
[2.モブプロツールの紹介](#2-モブプロツールの紹介)
[3.使い方](#3-使い方)
[5.おわりに](#5-おわりに)

# 1. モブプロとは
## 登場人物
モブプロを理解するためには、登場人物を把握する必要があります。
1.モブ⇆2.タイピストと集まった人数で順番にタイピストを回していきます。　
### 1. モブ
アイデア出しやタイピストへ指示を行います。
### 2. タイピスト
実際にコーディングをし、手を動かします。

# 2. モブプロツールの紹介
### mob
mobとはモブプロをリモートで実施する上で便利に使えるツールです。
以下の３つの機能を有しています
 - タイマー機能
 - Github経由で次の人にコードを渡せる
 - モブプロ用のブランチが自動で作られ、そこで作業をできる
### インストール方法
以下のコマンドをターミナル、またはコマンドプロンプトで打ってください。
~~~
curl -sL install.mob.sh | sh
~~~

# 3. 使い方
使うのは、超シンプル３つのコマンドのみ
※前提条件は皆が同じブランチにいること
- タイピストが回ってきた時
15の部分には分単位のタイマーを設定したい時間を記載します。
~~~
mob start 15
~~~
- タイピストを次の人に渡す時
~~~
mob next
~~~
- モブプロした内容を本ブランチへコミットしたい時
~~~
mob done
~~~
# 5. おわりに
たったこれだけでリモートでのモブプロが可能になります。
私のチームではmobを使用し、slackで画面共有をしながらモブプロを行なっております。
皆さんも是非試してみてください😀
Javaで「ファイルの最終更新日時の取得と設定(Files.getLastModifiedTime)」の動作を確認してみた

# 概要
Javaで「ファイルの最終更新日時の取得と設定(Files.getLastModifiedTime)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/file/index10.html

# 実装
以下のファイルを作成しました。
```JSample10_1.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.attribute.FileTime;
import java.time.Instant;
import java.time.ZoneId;
import java.time.LocalDateTime;

class JSample10_1{
  public static void main(String[] args){
    Path p = Paths.get("/code/java/file/doc/memo.txt");

    try{
      FileTime fileTime = Files.getLastModifiedTime(p);
      Instant instant = fileTime.toInstant();
      LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

      System.out.println(localDateTime);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample10_1.java 
$ java JSample10_1 
2023-08-18T14:21:49.218605521
```
以下のファイルを作成しました。
```JSample10_2.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.attribute.FileTime;
import java.time.Instant;

class JSample10_2{
  public static void main(String[] args){
    Path p = Paths.get("/code/java/file/doc/memo.txt");

    try{
      FileTime fileTime = FileTime.from(Instant.now());
      Files.setLastModifiedTime(p, fileTime);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample10_2.java 
$ java JSample10_2 
$ java JSample10_1 
2023-08-18T14:23:42.066048965
```

# まとめ
何かの役に立てばと。
iOSアプリ開発 電波強度が弱い状態の実機検証環境を作りたい

## ゴール
- 不具合報告があり電波強度が弱い状態を再現して検証したい
    - 通信4G
    - アンテナ３未満

## 環境
- iPhone13mini
- iOS 16.6
- 5G対象エリア内
- キャリアahamo 
- HITACHI MRO-W1X

## 結論
- 通信設定を変更
- 電子レンジへin

### 端末の通信4G通信にする
- Wi-Fiを切断する
- 設定>モバイル通信>通信のオプション>音声通話とデータ>4Gを選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/11d5c8c2-d190-20ef-4538-d6d3b9534672.png" width="320"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/5fd28a39-96cf-d9ad-d3fd-4c9af5464cc0.png" width="320"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/ebe0aadd-7d9d-0757-4a44-7f3aba8e2d22.png" width="320">


### アンテナ３未満
- 端末を電子レンジ内に入れる
    - →アンテナ2~3の状態を安定して再現できた


|　before　|　after　|
|:-:|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/9c4b0f5f-f43c-6ed3-54f9-d21da239997c.png" width="320">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/832f49c3-df3f-9c0e-e897-5dcef2011a7b.png" width="320">|

奥に配置すると安定してアンテナ2~3を維持できた
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/b776c152-89ac-9057-a22f-bfd5d593af63.jpeg" width="320">


## 試したこと
- 窓際から離れてみる
    - →時々アンテナ３になるが再現性が低い
- アルミホイルで端末を包み込む
    - →時々アンテナ３になるが再現性が低い

## 考察
- 電子レンジの構造自体が部分的にファラデーケージとしての効果を持っていること。
- 電子レンジ内部の金属が電磁波を反射させる効果がある。
- 扉が開いている場合でも、反射によってスマホのアンテナの位置や向きによっては基地局との間の通信が妨げられる可能性がある。

電子レンジの扉が閉じられていない場合でも、レンジの形状や材料によっては部分的な電磁波の遮蔽・反射効果が発生し、スマホの電波強度が低下することが考えられる。

## 参考
https://micronix-jp.com/note/application/smart-phone-app_j.html

https://www.docomo.ne.jp/area/feature/

https://www.rd.ntt/se/media/article/0019.html

## まとめ
電波状況を良くする情報はあっても悪くする情報がなかったので記事化しました。
自宅で簡単にアンテナ2の状態を再現することができ嬉しいです。
電波状況は様々な外的要因が関わるので検証がむずかしそう。
間違っても端末をチンしないようにお気をつけください。

## 最後に運動通信社について
運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！
PMやアプリエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください！
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう！

https://sportsbull.jp/about/#recruit
【2023年版】asdf で PHP8.0系 のインストール手順 ( zsh + homebrew )

## 実行環境

| OS | macOS Ventura 13.5 |
| --- | --- |
| shell | zsh 5.8.1 (x86_64-apple-darwin21.0) |
| middleware | homebrew(4.1.5) |
|  | asdf(v0.11.3) |

## 本記事で得られる結果

- PHP8.0系の実行環境

## 参考資料

[GitHub - asdf-community/asdf-php: PHP plugin for the asdf version manager](https://github.com/asdf-community/asdf-php)

## 事前準備

- [Homebrew](https://brew.sh/index_ja)がインストール済みであること

https://qiita.com/naoto24kawa/items/59cdae4377f84d248a48

- [asdf](https://www.notion.so/asdf-zsh-homebrew-015f995ddc754a0dae1d06b90a979279?pvs=21)がインストール済みであること

https://qiita.com/naoto24kawa/items/f3f23a6a6cddf9194855

## 手順

1. PHPのインストールにはasdfのプラグインが必要
    1. 今回はasdf-phpをインストールする必要がある
    2. asdf-phpが依存しているツール群は[こちら](https://github.com/asdf-community/asdf-php/blob/master/.github/workflows/workflow.yml)から確認する
        1. OS毎に内容が異なるので注意してください

2. asdf-phpが依存しているツール群のインストール(1)

    ```shell
    brew install autoconf automake bison freetype gd gettext icu4c krb5 libedit libiconv libjpeg libpng libxml2 libzip openssl@1.1 pkg-config re2c zlib
    ```

    > Note: 適宜PATHを通す必要があるものは実施してください。

1. asdf-phpが依存しているツール群のインストール(2)

    ```shell
    # バージョン違いが必要なようで手順が分かれている
    $ brew install openssl@3
    ```

1. asdf-phpのインストール

    ```shell
    asdf plugin add php https://github.com/asdf-community/asdf-php.git
    ```

1. PHPビルド時に必要なツール群のインストール

    ```shell
    # 手順2.の時に一緒にインストールしても問題無いはず
    $ brew install gmp libsodium imagemagick
    ```

1. インストール可能なPHPバージョンの確認

    ```shell
    asdf list all php
    ```

1. PHPのインストール

    ```shell
    asdf install php 8.0.28
    ```

1. PHPの適用

    ```shell
    asdf global php 8.0.28
    ```

1. PHPのバージョン確認

    ```shell
    php -v
    PHP 8.0.28 (cli) (built: Jun  6 2023 15:31:13) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v4.0.28, Copyright (c) Zend Technologies
    ```
Greppoで地図上のデータのダッシュボードを作成する

![esri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/1b844e32-04b2-6e93-85e8-d4205e922505.png)
(https://www.esrij.com/products/arcgis-dashboards/ より引用)

esri社のArcGIS Dashboardのような地図上のデータのダッシュボードを作成できないか調べていた時に
GreppoというGISのWebアプリを作成する向けのオープンソースなPythonのフレームワークがありました。

Greppoはフロントエンドとバックエンドの効果的に組み合わせてアプリを作成することができます。フロントエンドとバックエンドを連携するためのAPIを提供しており、フロントエンドの対話型コンポーネントやバックエンドで使う変数を結びつける機能があります。
Greppoを使用するとフロントエンドとバックエンドと簡単に開発し、地図アプリを簡単に構築できます。

・Greppo公式サイト
https://greppo.io/

・Greppo クイックスタート
https://docs.greppo.io/quickstart.html

・Greppo GitHub

https://github.com/greppo-io/greppo


今回はGreppoでダッシュボードのアプリを作成してみます

# 開発環境
Python    3.11.4
pip       23.2.1
greppo    0.0.33

# アプリ作成
OpenStreetMapを使用してアプリ上の地図の枠を作成します
```python:app.py
from greppo import app

app.base_layer(
    name="Open Street Map",
    visible=True,
    url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
    subdomains=None,
    attribution='(C) OpenStreetMap contributors',
)

app.base_layer(provider="CartoDB Positron")
```

サーバを起動します

```
greppo serve app.py
```
このような地図が表示されます

![127.0.0.1_8080_ .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/4f5d469d-c617-b096-9d9a-008109f2cf75.png)

道路情報や建物の情報などのgeojsonファイルをgeopandasで読み込んだものを作成したGreppoの地図データに組み込むと以下の画像のようなダッシュボードが出来上がります

![fqb22u9w902z1mmuy5po.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/e5a62975-2f66-42a4-d227-d20e21a0fd08.jpeg)
(https://dev.to/stangirala/greppo-all-you-need-is-4-minutes-to-build-an-interactive-geospatial-webapp-4jok より引用)


# 備考
ArcGIS Dashboard(esri社）
https://www.esrij.com/products/arcgis-dashboards/
※有料ですが21日のトライアルがあります
指定フォルダ以下のファイルのファイル名中の特定文字列を削除

```
import java.io.File;

public class Main {
	public static void main(String[] args) {
		String[] dirPaths = { "C:\\", "D:\\" };
		for (String dirPath : dirPaths)
			func(new File(dirPath));
	}

	private static void func(File parentDir) {
		File[] fileOrSubDirsInParentDir = parentDir.listFiles();
		if (fileOrSubDirsInParentDir != null) {
			for (File fileOrSubDirInParentDir : fileOrSubDirsInParentDir) {
				if (fileOrSubDirInParentDir.isDirectory()) {
					func(fileOrSubDirInParentDir);
				}
				String[] substitutes = { "XXX", "YYY" };
				for (String substitute : substitutes) {
					if (fileOrSubDirInParentDir.getName().contains(substitute)) {
						File a = new File(parentDir,
								fileOrSubDirInParentDir.getName().replace(substitute, ""));
						System.out.println(fileOrSubDirInParentDir.getAbsolutePath());
						System.out.println(a.getAbsolutePath());
						fileOrSubDirInParentDir.renameTo(a);
					}
				}
			}
		}
	}
}
```
アルファベットを二進数にしてSVGを作る遊び

![2023-08-15_20_23-asciiGlyphs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519514/9d77e7bc-67fb-a966-504e-211d397f081d.png)

### 概要
各アルファベットをバイナリーにして、2x8の行列に変換し暗号のようなシェイプを作るといった遊びです。<br />※上記の画像は以下のプロセスを応用して作成しています。
## プロセス
### 1.文字列からアスキーコードを取得する
```javascript
const x = "YES"
const ascii = x.split("").map((char) => char.charCodeAt(0))
//ascii = [89, 69, 83]
```
### 2. アスキーコードを８桁の二進数に変換する
```javascript
const binary8 = ascii.map((n) => n.toString(2).padStart(8, "0"))
//binary8 = ["01011001", "01000101", "01010011"]
```
### 3.二進数のアスキーコードを以下画像のような行列に変換する<br />　また、値が"1"の場合のみvector=[x, y]として変数vectorsに入れる
※8つの[0か1]を4×2の行列にして並べています
![Screenshot 2023-08-17 at 15.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519514/154d64c6-73f1-54ac-521e-76ac34b85efa.png)
#### 参考コード
```javascript
const clms = 2
const rows = 4
const charStep = 10
const vectors = []

binary8.forEach((binary, i) => {
    for(let row=0; row<rows; row++){
      for(let clm=0; clm<clms; clm++){
        const x = (clm * charStep / 2) + charStep * i
        const y = charStep / 2 * row
        const fill = binary[clm+row*clms] === "0" ? "null" : "pink"
        svg.circle(charStep/4).move(x, y).fill(fill).stroke("pink")


        ////////////////////////////////
        //値が"1"の場合のみvector=[x, y]として変数vectorsに入れる
        if(binary[clm+row*clms] === "0"){
            vectors.push([x, y])
        }
        ////////////////////////////////

      }
    }
  })
}
```
### 4.vectors内のベクターを、距離が近い順に並べ替える
```javascript
//Heuristic approach
function sortVectorsByDistance(vectors){
  const sortedVectors = [vectors.pop()]
  while(vectors.length){
    const from = sortedVectors[sortedVectors.length - 1]
    let shortestDist = Infinity
    let shortestIndex = 0
    for(let i=0; i<vectors.length; i++){
      const dist = calcVectorDistance(from, vectors[i])
      if(dist < shortestDist){
        shortestIndex = i
        shortestDist = dist
      }
    }
    sortedVectors.push(...vectors.splice(shortestIndex, 1))
  }
  return sortedVectors
}
```
### 5.並べ替えたvectorsを結んでシェイプを形成する
```javascript
const sortedVectors = sortVectorsByDistance(vectors)
for(let i=0; i<sortedVectors.length; i++){
    const nextIndex = (i+1) % sortedVectors.length
    const from = sortedVectors[i]
    const to = sortedVectors[nextIndex]
    svg.line(...from, ...to).stroke("pink")
    svg.circle(charStep / 10).center(...from).fill("pink")
}
```

# 結果 (Hello)
<p class="codepen" data-height="500" data-theme-id="dark" data-default-tab="result" data-slug-hash="yLGBQJN" data-user="jikkensya" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/jikkensya/pen/yLGBQJN">
  Ascii, Binary and SVG</a> by FrontendKanazawa (<a href="https://codepen.io/jikkensya">@jikkensya</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
AccessのVBAでクエリからSQLを取得

# やり方

```vb:Accessのテーブルに対するクエリの動作確認サンプル
Dim sql_ As String: sql_ = "SELECT * FROM t_1 "

'クエリのSQL差し替え。
CurrentDb.QueryDefs("q_1").SQL = sql_

'クエリからSQL取得。
sql_ = CurrentDb.QueryDefs("q_1").SQL

'取得したSQLの中身確認。
Debug.Print sql_
```

上記の結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/40212c74-ffc7-c9a1-7fa6-66c8047481c7.png)

# クエリのSQLはAccessによる整形が入ることがある

前述のサンプル動作結果を見ると、改行と末尾の『;』が追加されています。

Accessのテーブルに対するクエリはこういった整形が入ります。
パススルークエリの場合は整形は入りません。

# 参考サイトさん

https://www.moug.net/tech/acvba/0040002.html

# バージョン

Microsoft Windows [Version 10.0.19045.3324]
Microsoft Access for Microsoft 365 MSO (バージョン 2307 ビルド 16.0.16626.20170) 32 ビット
【2023年版】asdf でnodejs12系のインストール手順 ( zsh + homebrew )

## 実行環境

| OS | macOS Ventura 13.5 |
| --- | --- |
| shell | zsh 5.8.1 (x86_64-apple-darwin21.0) |
| middleware | homebrew(4.1.5) |
|  | asdf(v0.11.3) |

## 本記事で得られる結果

- nodejs12系の実行環境

## 参考資料

[GitHub - asdf-vm/asdf-nodejs: Node.js plugin for asdf version manager](https://github.com/asdf-vm/asdf-nodejs/)

## 事前準備

- [Homebrew](https://brew.sh/index_ja)がインストール済みであること

https://qiita.com/naoto24kawa/items/59cdae4377f84d248a48

- [asdf](https://www.notion.so/asdf-zsh-homebrew-015f995ddc754a0dae1d06b90a979279?pvs=21)がインストール済みであること

https://qiita.com/naoto24kawa/items/f3f23a6a6cddf9194855

## 手順

1. nodejsのインストールにはasdfのプラグインが必要

    1-1. 今回はasdf-nodejsをインストールする必要がある

2. asdf-nodejsが依存しているツール群のインストール

    ```shell
    brew install gpg gawk
    ```

    > Note: 適宜PATHを通す必要があるものは実施してください。

3. asdf-nodejsのインストール

    ```shell
    asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
    ```

1. インストール可能なnodejsバージョンの確認

    ```shell
    asdf list all nodejs
    ```

1. nodejsのインストール

    ```shell
    asdf install nodejs 12.22.12
    ```

1. nodejsの適用

    ```shell
    asdf global nodejs 12.22.12
    ```

1. nodejsのバージョン確認

    ```shell
    node -v
    v12.22.12
    ```

### おまけ

1. npmバージョン確認

    ```shell
    npm -v
    6.14.16
    ```

2. yarnのインストール

    ```shell
    $ npm install --global yarn
    ```
C言語のdebugerをmacでとりあえず動かす方法

 `.vscode/lauhch.json`ファイルを作成する。ファイルの中身は以下の通り

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "launch_cpp",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/a.out", 
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
        }
    ]
}
```

`"${workspaceFolder}/a.out"`のところは、実行したい実行ファイルのパスに修正する。
東京大学松尾研究室のweblab-10b-instruction-sftをDatabricksで動かしてみる

大規模言語モデルがリリースされたらとりあえず試す男、それが私です。

https://weblab.t.u-tokyo.ac.jp/100%E5%84%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%BA%E3%83%BB%E6%97%A5%E8%8B%B12%E3%83%B6%E5%9B%BD%E8%AA%9E%E5%AF%BE%E5%BF%9C%E3%81%AE%E5%A4%A7%E8%A6%8F%E6%A8%A1/

https://huggingface.co/matsuo-lab/weblab-10b-instruction-sft

ライセンスは[cc\-by\-nc\-4\.0](https://creativecommons.org/licenses/by-nc/4.0/)。

そして、いつもこちらの方が早いです…。コードも参考にさせていただいています。

https://note.com/npaka/n/nd05b0334cb75

いつものようにGPUクラスターで以下を実行します。128GBメモリではOOMになったので256GBの`g5.16xlarge`にしています。

```py
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("matsuo-lab/weblab-10b-instruction-sft")
model = AutoModelForCausalLM.from_pretrained("matsuo-lab/weblab-10b-instruction-sft", 
                                             torch_dtype=torch.float16,
                                             device_map="auto")
```

```py
text = "大規模言語モデルについて説明してください。"
text = f'以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n### 指示:\n{text}\n\n### 応答:'
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=100,
        do_sample=True,
        temperature=0.5,
        top_p=0.9
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)
```

```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
大規模言語モデルについて説明してください。

### 応答:大規模言語モデルは、大量のデータから学習し、大量のデータに適用できる機械学習アルゴリズムを使用して、言語を理解するために使用されます。大規模言語モデルは、多くの場合、言語の認識、分類、
```

恒例の質問。

```py
text = "Databricksについて説明してください。"
text = f'以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n### 指示:\n{text}\n\n### 応答:'
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=100,
        do_sample=True,
        temperature=0.5,
        top_p=0.9
    )

output = tokenizer.decode(output_ids.tolist()[0])
print(output)
```

```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
Databricksについて説明してください。

### 応答:Databricksは、データ分析と機械学習のためのオープンソースプラットフォームであり、Apache Sparkのベースとなるもので、データをリアルタイムで処理し、大規模なデータセットを迅速に分析できるようにします。Databricksは
```

いい感じですね。


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
子要素に指定したmarginが親要素を無視する。

# 問題

#### 親要素A

#### 親要素B
- 子要素C

のような状態の時に
親要素Aにmargin-bottom:15px;
子要素Cにmargin-top :15px;
にした時

自分のイメージでは
AB間15px,BC間15px
よってAC間は30px
でしたが全然そうはならず、頭がこんがらがったので各要素にborder:solid 2pxを指定して一個ずつの関係を視覚的に確認してみましたところ、逆に自分のイメージ通りになってしまいました。

## 結論
どゆこと？？と思ったのですが、結論から言うと __borderやpaddingの有無で場合によって親要素を無視__ するようになってるみたいです。



親要素Bの条件によって変わる
Bにpaddingまたはborderが付与されている場合
AC間30px

付与されていない場合
AC間15px

理由
marginは〇〇px距離を取るという意味ではなく、　__二つの要素の最低距離__ の指定なため、
margin-bottom：２０pxを指定した要素の下にある要素にmargin-top:30pxがあった場合
足し算ではなく、margin-bottom:20px＝最低でも20pxは離れてね。
margin-top:30px=最低でも30pxは離れてね。
という意味になり、両方を満たす２つの間のmarginは30pxになる

先ほどの話に戻ると以上の内容を知っても
BC間は30pxじゃないの？と思ったのですが、もっと細かく分解すると
BにpaddingがないということはBは子要素Cとの間にB側からの距離の指定はないということになります。
Cからのmargin-top:15pxがBを対象にすると思うのですが、その理由はborderとpaddingです
borderは物理的な壁になるためborderがあればそことの距離になります。
paddingはいまいちしっくり来てないのですがborderと同じように扱われるみたいです。
logicool SIGNATURE K855 リセット方法

インターネット上に記載が残っていなそうだったので、自分用の備忘録も兼ねて記載を残しておきます。

# リセット方法

以下の順に入力するとリセットできます。

1. `Esc` + `O`
1. `Esc` + `O`
1. `Esc` + `B`

リセットが成功すると、`F1` ～ `F3` キーが点滅します。
その後キーボードの電源を再起動すると、`F1`が点滅・ペアリングモードに入ります。

:::note
2023/8/1にlogicool サポートへ問い合わせ、回答頂いた内容になります。
手元のキーボードでリセットできたところまで確認済です。
:::

# その他使用方法など

**商品ページ**
記載が無いですが、手元のK855で試したところ**6キーロールオーバー**に対応しています。

https://www.logicool.co.jp/ja-jp/products/keyboards/k855-signature-wireless-mechanical-tkl.920-011224.html

**logicool サポート スタートガイド**
初期設定やWindows⇔Macの切り替え方法などが記載されています。

https://support.logi.com/hc/ja/articles/4673818723607-Getting-Started-Signature-K855

**ファンクションロック**
`fn` + `Esc`でON/OFFできます。
ただし、ファンクションロックは**接続先ごとに保存**されるので注意。<br>ONにして運用する場合、ペアリング後にONに切り替えるのを忘れずに。

|ファンクションロック|`F1` ～ `F12`押下時|`fn` + `F1` ～ `F12`押下時|
|-|-|-|
|**OFF**|メディア操作など|`F1` ～ `F12`キーとして認識|
|**ON**|`F1` ～ `F12`キーとして認識|メディア操作など|


**キーキャップの差し替え**
logicool G715/G713キーボード用のキーキャップが挿せます。
PBT素材かつ印字の文字部分がLEDを透過するので、Easy Switch時などのキーの点灯が視認できます。おすすめ。
logicool 公式オンラインストアでしか買えない点だけ注意。
    
https://gaming.logicool.co.jp/ja-jp/products/accessories/key-caps-g715-g713.943-000862.html

他のCherry互換のキーボードもおそらく挿せるとは思いますが、
`Space`キーはスタビライザー幅がlogicool独自？なせいか挿せない可能性が高いです。
(CORSAIR PBT DOUBLE-SHOTはそうだった)
CocoaPodsで管理しているライブラリを差し替える

CocoaPodsで管理しているライブラリを差し替える必要があったため、
Podfileを編集し、差し替えたライブラリをプロジェクトへ反映させる方法をまとめます。

# Podfileの編集
XcodeまたはターミナルでPodfileを開き、差し替えたいライブラリ名を`target 'SampleProject' do`の中に記述する。
```python:Podfile
target 'SampleProject' do
  # Pods for SampleProject
  pod '差し替えたいライブラリ名'

end
```

# ライブラリのインストール
ターミナルでPodfileが置いてあるディレクトリに移動し、以下コマンドを実行する。
```
pod install
```

`SmapleProject.xcworkspace`を開き、ビルドしてエラーが発生しなければプロジェクトへの反映が成功。

### エラー発生時の対応
ビルド時に以下エラーが発生した場合は、
```
File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
```
Podfileに以下のコードを追記することで解決する。
```python:Podfile
post_install do |installer|
    installer.generated_projects.each do |project|
          project.targets.each do |target|
              target.build_configurations.each do |config|
                  config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
               end
          end
   end
end
```

# 終わりに
作業内容自体は単純なものの、いざ作業しようとするとやり方がわからず苦労したため
今後同様の作業を行う際すぐに思い出せるよう備忘録としてまとめました。
誰かの参考になれば幸いです。

# 参考リンク
[Missing file libarclite_iphoneos.a (Xcode 14.3)](https://stackoverflow.com/questions/75574268/missing-file-libarclite-iphoneos-a-xcode-14-3)
【ChatGPT無】が変な出力をしはじめた、という報告です

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、昨日一昨日と
　　　（以前にも？）
　　ChatGPTさんが
　　　変な出力をしはじめたことを
　　　　報告します。

　こんな出力を
　　出力されていませんか？

　「～がシェakespeareに」
　「自分を rewaードする」
　「アイデアのブレストorming」

　まだ、この3件だけ
　　なのですけどね。

　上段は、
　　「～がShakespeareに」
　　　（シェークスピア）

　中段が、
　　「自分を rewardする」
　　　（自分を報いる）

　下段は、
　　「アイデアのブレインストーミング」

　が正しいものです。

　別に、英語で
　　利用していないんですよ。

　いつものように、
　　質問したら、
　　　こんなんなりましたぁ、
　　　　って感じで、出してきて。

　読んでたら、ん？　何？　って
　　読めない言葉が
　　　出ていました。
***
　これまで、
　　日本語入力して、
　　　英語で返されたことは
　　　　あります。

　でも、
　　こんな中途半端な言葉を
　　　吐かれたのは、初めてです。

　これはどういうことなのか？

　勝手な推測ですが、
　　ユーザーの入力を
　　　学習してしまった結果
　　　　なのではないか。

　つまり、
　　中途半端な入力を
　　　しているユーザーさんがいて
　　　　ChatGPTさんは、
　　　　　それを理解できますから
　　　　　　そのまま受け入れる。

　その受け入れた文章の中の
　　単語も受け入れてしまった。

　それで、
　　ChatGPTさんの頭に
　　　書き込まれてしまった。

　それが
　　出力されてしまった。

　違うでしょうか？
***
　未来のことになりますが、
　　これがChatGPTさんの
　　　頭の中に、増えていくと、
　　　　日本語として、
　　　　　成り立たなくなります。

　そうなると
　　ChatGPTさんを
　　　利用するメリットが
　　　　なくなり、
　　　　　逆に、デメリットが
　　　　　　多くなる。

　ChatGPTを
　　組み込んでいたサービスが
　　　顧客に対して、
　　　　不利益を与えはじめる。

　顧客から訴えられる
　　→サービス停止
　　　→企業運営に支障
　　　　→ポシャる。

　そうなれば
　　当然ながら、
　　　ChatGPTさんを
　　　　利用していた方々が
　　　　　どんどん離れていく。
***
　ううむ、
　　これは困る。

　勝手に想像して、
　　勝手に困るヤツw