OmniAICreator/Qiita-1.07M huggingface dataset:
OpenAIのShape-Eでテキストから3Dモデル生成すーる（Python、Colab）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)18日目の記事です。
今日は、Shape-Eを用いてテキストから3Dモデルを生成していきます。

https://youtu.be/P7VoKUw8Xcg?si=kqCC9WVPLoCsWEdt

# 開発環境
- Windows 11 PC
- Python 3.11

# 導入
1．Colabからコピー

https://colab.research.google.com/drive/1CIZlut6WRz_Znfy2xEUIna62UVj56w4e?usp=sharing

2．Googleドライブに接続

~~~py
from google.colab import drive
drive.mount('/content/drive')
~~~

3．GitHubからShape-Eをクローン

~~~py
!git clone https://github.com/openai/shap-e
~~~

4．ライブラリのインストール

~~~py
%cd /content/shap-e/
!pip install -e .
~~~

5．メインのプログラムを作成

~~~py
import torch

from shap_e.diffusion.sample import sample_latents
from shap_e.diffusion.gaussian_diffusion import diffusion_from_config
from shap_e.models.download import load_model, load_config
from shap_e.util.notebooks import create_pan_cameras, decode_latent_images, gif_widget

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

xm = load_model('transmitter', device=device)
model = load_model('text300M', device=device)
diffusion = diffusion_from_config(load_config('diffusion'))

batch_size = 4
guidance_scale = 15.0
prompt = "a pink shark" #@param {type:"string"}

latents = sample_latents(
    batch_size=batch_size,
    model=model,
    diffusion=diffusion,
    guidance_scale=guidance_scale,
    model_kwargs=dict(texts=[prompt] * batch_size),
    progress=True,
    clip_denoised=True,
    use_fp16=True,
    use_karras=True,
    karras_steps=64,
    sigma_min=1e-3,
    sigma_max=160,
    s_churn=0,
)

render_mode = 'nerf' # you can change this to 'stf'
#
size = 128 #@param {type:"number"}

cameras = create_pan_cameras(size, device)
for i, latent in enumerate(latents):
    images = decode_latent_images(xm, latent, cameras, rendering_mode=render_mode)
    display(gif_widget(images))

# Example of saving the latents as meshes.
from shap_e.util.notebooks import decode_latent_mesh

for i, latent in enumerate(latents):
    with open(f'example_mesh_{i}.ply', 'wb') as f:
        decode_latent_mesh(xm, latent).tri_mesh().write_ply(f)
~~~

# 実行結果

prompt: "a pink shark"
size: 128

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c8154323-bbba-8802-6592-fb169fae04e7.png)

生成した3Dモデル（PLY）をダウンロードし、MeshLabで表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5aa581e5-0d5e-3e06-0b81-e843f51210fb.png)

https://x.com/sotongshi/status/1656472021721841664?s=20

お疲れさまでした。
Java 8：2024年のオプションは？

![post-hero3-1024x525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/a586961b-fe5d-4421-0028-da1660e1d087.jpeg)

2022年3月、[OracleはJava 8のPremier Supportを打ち切った](https://www.oracle.com/java/technologies/java-se-support-roadmap.html)。もしあなたが社内の意思決定者であるなら、自問すべきはこうだ：今がJava 8を手放すべき最適なタイミングなのか？と。

2018年、OracleはJavaのライセンス方法とリリーススケジュールを根本的に変更した。昨年までは、Java 8とJava 11のみがLong-Term Supportバージョン（LTS）であり、これは本番環境でバージョンを使用するかどうかの決定に大きな影響を及ぼしていた。最近になって、これはより迅速なリリース・スケジュールに置き換えられ、古いバージョンのJavaの廃止予定日についてのアナウンスがなされた。

Oracle Java SEを使用している多くの企業は、長年Java 8にこだわってきたが、Premierサポートの終了に伴い、今こそ乗り換える時なのだろうか。

2022年以降の選択肢を見てみよう。

# Java 8 (LTS) を使い続けて、Oracleに延長サポート料金を支払う
Java 8について、オラクルは2030年12月まで「Extended Support」を提供すると発表した。Extend Supportは、Premierの賞味期限を延長するOracleの方法である。

このサービスでは、Oracle Javaを使用する組織が追加料金を支払う。1年目は既存のサポート料金に10％上乗せ、2年目は20％上乗せ、3年目はさらに20％上乗せといった具合だ。

Oracle Java SEサブスクリプションを購入することで、Oracleは、[商用ユーザーに対して機能強化や重要なパッチを含むOracle Java SE 8のサポート](https://blogs.oracle.com/java/post/end-of-public-updates-is-a-process-not-an-event)と定期的なアップデートの恩恵を受け続けることができるとしている。

# より新しいJavaバージョンへのアップグレード
Java 17は、2021年9月に正式にリリースされたJava言語とランタイム・プラットフォームの現在の長期サポート（LTS）バージョンである。

Java 17へのアップグレードには労力と時間が必要であり、特にJVM内の新しい言語機能と機能を真に活用することが目的である場合はなおさらである。開発者やその他のチームメンバーは、ローカル環境を更新する必要がある。そして、本番環境などのビルド環境やランタイム環境もアップグレードが必要になる。

多くの場合、新しいバージョンではJDKからいくつかの機能が削除され、コードや dependencies（依存関係）、あるいはその両方が壊れる可能性がある。つまり、これらの問題を解決するために、コードを見直し、依存関係が最新であることを確認する必要があります。

このアプローチは、元々Java 8やもう1つ前のバージョン用に開発されたレガシーJavaアプリケーションには、あまり現実的ではありません。

# WebAssembly/Javascriptを使ってアプリケーションをHTML5に変換
CheerpJはLeaning Technologiesによって開発されたツールで、[既存のJavaクライアントアプリケーションをHTML5に変換・移行する](https://cheerpj.com/)唯一のソリューションです。クライアント上のJavaの必要性を取り除きます。ソースコードに変更を加えることなく、モダンブラウザで使用できるようにすることで、組織はJava 8アプリケーションの寿命を延ばすことができ、時間、コスト、リソースを節約することができます。

# なぜCheerpJなのか？
他のソリューションとは異なり、CheerpJは、アプリケーションのソースコードに変更を加える必要がなく、Java 8*と幅広い互換性を持ち、フレームワークではないため、意見に左右されません。

CheerpJを使えば、Java 8アプリケーションのHTML5への変換は、最小限の労力で、あるいは労力をかけずに行われ、ローカルにインストールすることなく、モダンブラウザからアクセスできるようになります。CheerpJを使えば、Chrome、Edge、Firefox、Safari、またはモバイルを含むその他のモダンブラウザからJavaアプリケーションにアクセスできます。

*Oracle Forms、EBS、Swing、AWT、多数のフレームワークやライブラリでテスト済みです。
https://leaningtech.com/legacy-modernisation-jp/

引用元：https://cheerpj.com/java-8-what-are-your-options-in-2024/
入社約1週間の中途入社が会社の魅力について書いてみた。（技術的な話はいっさいありません。）

**はじめに**
　本記事はゼットスケーラー株式会社としては初のAdvent Calendar 2023の一つとして投稿しています。以下の免責事項をご理解の上、記事を読んで頂けると幸いです。

**免責事項**
　本記事のコンテンツや情報において、可能な限り正確な情報を掲載するよう努めておりますが、 誤情報が入り込んだり、情報が古くなったりすることもあり、必ずしもその内容の正確性および完全性を保証するものではございません。そのため、本記事をエビデンスとしたゼットスケーラーへの問い合わせなどはご対応致しかねることをご理解頂けると幸いです。掲載内容はあくまで個人の意見であり、ゼットスケーラーの立場、戦略、意見を代表するものではありません。当該情報に基づいて被ったいかなる損害について、一切責任を負うものではございませんのであらかじめご了承ください。

**ご挨拶**
　皆様、はじめまして。パートナー営業統括本部にパートナービジネス・マネージャーとして12月4日に入社した隅谷肇（すみやはじめ）と申します。技術的なネタ中心の会社公式のアドベントカレンダーで入社間もない私が製品も技術の話も一切しないエントリーを書くことになりました。素の会社の魅力が伝われば幸いです。

**入社前の印象**
　前職がネットワークとセキュリティーの総合ベンダー。と言われる外資ベンダーに勤めていたにもかかわらず、「バズワードのゼロトラストセキュリティでとにかく勢いの良い会社」というセキュリティぼんやり層のような印象でした。

**入社後の印象**
　勢いが良すぎる！ダイナミック！スピード感！オープンコミュニケーション！。一緒に働くチームが若くて情熱に溢れた人たちばかりで「おー、若いって素敵」と初日には思っていましたが社内の人と話すうちに年齢問わず全員「ガンガンいこうぜ」モードでスピード感をもって動いています。外資系にありがちな「私のRoleはこれだからこの仕事は私のものではないです。」的な人はいません。一方、データドリブンで定量的な根拠を示してフレームワークに沿って社内の共通理解を深めるようなコミュニケーションが推奨されています。プレゼンに対してもガンガンツッコミが入って建設的で活発なやり取りがなされます。トレーニングについても質の高いトレーニングが充実しており専門のチーム（日本のチームで日本語提供です。助かる。。。）による社内の勉強会も盛んです。

**最後に**
　社会人歴20数年のおじさんとしては初日に勢いの良さにちょっとビビりましたが個性的で魅力的なキャラクターに溢れた会社でとても充実した日々を送っています。（人だけじゃなくソリューションも良いですよ。公式サイトや他のエントリーをみてください。）こんな会社で働いている人たちが販売しているソリューションってどんなのだろう？と興味を持ってもらったり、一緒に働いてみたい。という人が出てくると嬉しいです。個人の感想ではない、会社の魅力と募集中のポジションはこちらを御覧ください。https://www.zscaler.jp/careers
スコープが小さければ変数名は短くてよい【命名のコツ】

# スコープが小さければ短い命名でもよい
見える行数が少ない一時的な変数にいちいちリファクタで命名を考える必要は必ずしもない。
例えば以下のコードがあったとする。

```
tmp = 0

if (tmp) {
    tmp = tmp + 1
}

print(tmp)
```
ここでの`tmp`は、すべての情報（変数の型、初期値、処理方法）が見えているため、変数の名前は短くて良い。
# 命名を考える必要がある場合
しかし、`tmp`がメンバ変数やグローバル変数ならどうだろう。以下のようなコードのとき、
```
CountUp(&tmp)
print(tmp)
```
このコードは読みにくい。なぜか。`m`の型や処理がわからないからである。
スコープが大きければ、変数名に必要な情報を加え命名する必要がある。
wslでelixir その119

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Livebookで高位合成してverilogを生成せよ。

# 方針
- 組み合わせ回路の高位合成
- 論理式は使わない。
- コンパイラ方式
- kino.js使う。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f1feaff8-0784-7fcc-4056-b9ff1b22a8c2.png)

# 投入したソース

```
lut 4
lin 3
lout 1
code 0 0
code 1 0
code 2 0
code 3 1
code 4 0
code 5 0
code 6 1
code 7 0
```

# 生成したverilog

```
module lut(input wire [2:0] data, output reg [0:0] code);
	always @(data)
	begin
		case(data)
		4'h0:
			code = 8'h0;
		4'h1:
			code = 8'h0;
		4'h2:
			code = 8'h0;
		4'h3:
			code = 8'h1;
		4'h4:
			code = 8'h0;
		4'h5:
			code = 8'h0;
		4'h6:
			code = 8'h1;
		4'h7:
			code = 8'h0;
		endcase
	end
endmodule

module testbench;
	reg [2:0] data;
	wire [0:0] code;
	lut u(.data(data), .code(code));
	initial
	begin
		$display("data code");
		$monitor("%h  %b", data, code);
		data = 4'h0; #10;
		data = 4'h1; #10;
		data = 4'h2; #10;
		data = 4'h3; #10;
		data = 4'h4; #10;
		data = 4'h5; #10;
		data = 4'h6; #10;
		data = 4'h7; #10;
		$finish;
	end
endmodule
```

# サンプルコード

```
defmodule KinoOhi.Asm2 do
  use Kino.JS

  def new(html) do
    Kino.JS.new(__MODULE__, html)
  end

  asset "main.js" do
    """
    function run(str) {
    var in0 = "";
    var in1 = "";
    var out0 = "";
    var out1 = "";
    var m = "";
    var u = "";
    //var str = src.value;
    var codes = str.split("\\n");  
    var len = codes.length;
    var i, 
    j;
    for (i = 0; i < len; i++)
    {
    var code = codes[i].split(" ");
    switch (code[0])
    {
    case "":
    break;
    case "lut":
    break;
    case "lin":
      var a = parseInt(code[1]) - 1;
      in0 = "input wire [" + a + ":0] data,";
      in1 = "\\treg [" + a + ":0] data;\\n";
    break;
    case "lout":
      var a = parseInt(code[1]) - 1;
      out0 = " output reg [" + a + ":0] code";
      out1 = "\\twire [" + a + ":0] code;\\n";
    break;
    case "code":  
      var a = code[1];
      var b = code[2];
      u += "\\t\\t4'h" + a + ":\\n\\t\\t\\tcode = 8'h" + b + ";\\n";
      m += "\\t\\tdata = 4'h" + a + "; #10;\\n";
    break;
    default:
      alert(code[0]);
    break;
    }
    }
    var out = document.getElementById("out");
    out.value = "module lut(" + in0 + out0 + ");\\n" +
    "\\talways @(data)\\n" +
    "\\tbegin\\n" +
    "\\t\\tcase(data)\\n" +
    u +
    "\\t\\tendcase\\n" +
    "\\tend\\n" +
    "endmodule\\n\\n" +
    "module testbench;\\n" +
    in1 + 
    out1 +
    "\\tlut u(.data(data), .code(code));\\n" +
    "\\tinitial\\n" +
    "\\tbegin\\n" +
    '\\t\\t$display("data code");\\n' +
    '\\t\\t$monitor("%h  %b", data, code);\\n' +
    m +
    "\\t\\t$finish;\\n" +
    "\\tend\\n" +
    "endmodule";
    }
    export function init(ctx, html) {
      const out0 = document.createElement("textarea");
      out0.id = "out";
      out0.style.width = "90%";
      out0.style.height = "550px";
      ctx.root.appendChild(out0);
      run(html);
    }
    """
  end
end

KinoOhi.Asm2.new("""
lut 4
lin 3
lout 1
code 0 0
code 1 0
code 2 0
code 3 1
code 4 0
code 5 0
code 6 1
code 7 0
""")
```

以上。
第二世代　バッテリー回路の考察（トラップの部分）

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の17日目です。

ERS-210のバッテリーの保護回路は大きく三つに分けられるようでした。
- 保護の部分
- Gas gage ICによる監視部分
- トラップ部分

今回はトラップ部分の部分についてまとめました。トラップというのは仮に付けた名前です。

Loïc POLLIERさんのレポジトリbattmonを参考に、一から勉強したメモをまとめました。
https://github.com/lpollier/battmon/tree/master

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 回路図
Loïc POLLIERさんのレポジトリbattmonに詳しく述べられていました。

赤線で示した囲みは加筆しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2189539a-c2a9-41dd-4b70-35b24e2b30c8.png)


この部分にはフューズF1、MOSFET Q1`、Q8、トランジスタQ7があります。
SFD-047A
https://www.datasheet-pdf.com/PDF/SFD-047A-Datasheet-Dexerials-1264916

SI4425
https://www.vishay.com/docs/72000/si4425bd.pdf

S5M3K315T
https://toshiba.semicon-storage.com/info/SSM3K315T_datasheet_ja_20140301.pdf?did=12327&prodName=SSM3K315T

MUN5113T1G
https://www.mouser.jp/datasheet/2/308/1/DTA144E_D-2310693.pdf

battmonでも特に説明されているのはF1の機能です。IC21から過電流や過充電が検出されると、Q8が導通しF1フューズが切断されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/515538c7-3272-409a-6de0-90405eb52945.png)

今回のAdventCalenderを作成するときの作業中に、2個のバッテリーでF1フューズを切断してしましました（セルを接続してから数秒後に匂いがしてきました）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a9530b77-a461-2add-15b1-8e8cb8e44cb9.png)


探して買い直しました。
https://ja.aliexpress.com/item/32679227804.htm

いったんQ8が導通するとQ7も導通し、その結果Q8の導通が強化されるので後戻りできなくなると思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/774ceaf3-3045-8854-7d4b-052a7c51e1cd.png)

またQ1はaibo本体からゲートに低電位を受け取ると、BAT+を端子1に導通させるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d8a8c4bf-11a3-c9ca-ad62-61641a7e126e.png)

つまり電池がaibo本体と接続するまでは端子4にBAT+の電圧が出ているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/e876a894-b6fd-5d7c-79c8-731ffc7dc65d.png)

battmonがバッテリーセルの交換の時、F1を飛ばさないように一時的に短絡させる作業を説明しています。ただ、初心者にとっては説明を補ってほしいところがあったので、後日まとめる予定です。

#### 警告をもう一度
今回のAdvent Calenderでバッテリーセルの交換について考察しますが、非常に危険ですので知識と教養を深める目的で調べたことをまとめました。
十分な安全対策を講じなければ、実行することはお勧めできません。
重要なことなので、もう一度書きます。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

#### 備考
上記に示した図面はLoïc POLLIERさんが作成したものです。
Copyright (c) 2020-2022 Loïc POLLIER
Released under the MIT license
https://github.com/lpollier/battmon/blob/master/LICENSE
Openpyxlのインストール成功した方法 (M2)

はじめまして、ギリギリ大学生のなおぽんです。
Macbook(M2)にOpenpyxlをインストールできない！ってなった時にインストールできた方法を簡易的にまとめました！

## 私の環境
- Macbook Pro (M2)
- Python 3.9.1

## インストールできない！（発狂）ってなったら
[私がぶち当たったエラーと同じエラー](https://levelup.gitconnected.com/fix-attributeerror-module-numpy-has-no-attribute-float-d7d68c5a4971)
上記の記事によると、openpyxlの依存ライブラリにnumpyが関わっていて、そのnumpyのグレードアップに伴いfloatを削除されたそうです。
そんでもって、「numpyのバージョンでfloat型が存在するバージョンにグレードダウンしたら行けるんじゃね？」ということで実行したら行けました！

※`numpy`の`1.20.0`まで私は下げました。

（記事を突然変異で書こうってなったので私のターミナルに表示されていたエラーメッセージなどは保存してないです。ごめんなさい汗）

## 最後に
初めて唐突に書こうと決めた記事で至らぬ点が多いですが、少しでもこの記事で誰かのお役に立てたら大変嬉しいです！ また、ご指摘などいただけたら今後の参考にいたします🐹
書くことは好きなので、また何か起きたら記事を書こうと思います！
ここまでお読みになってくださった皆様に`Sexy Thank You!🌹`

## 参照
- [How to Fix AttributeError: module 'numpy' has no attribute 'float'](https://levelup.gitconnected.com/fix-attributeerror-module-numpy-has-no-attribute-float-d7d68c5a4971)
- [Python Openpyxlでエラーが発生(AttributeError: module 'numpy' has no attribute 'float'.)](https://teratail.com/questions/12kzlzbnbv3ben)
Azure の Storage 的な諸々

[試験 AZ-305: Microsoft Azure インフラストラクチャ ソリューションの設計 - Certifications | Microsoft Learn](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-305/) 辺りで出てくる Storage 的な諸々に関するまとめ。

## Storage 的な諸々

https://learn.microsoft.com/ja-jp/training/modules/design-data-storage-solution-for-non-relational-data/

### Storage

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-redundancy

https://learn.microsoft.com/ja-jp/azure/storage/blobs/access-tiers-overview?tabs=azure-portal

https://learn.microsoft.com/ja-jp/azure/storage/blobs/immutable-storage-overview


> 時間ベースのアイテム保持ポリシー
> 訴訟ホールドポリシー

#### ブロック BLOB、追加 BLOB、ページ BLOB

https://learn.microsoft.com/ja-jp/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs

https://learn.microsoft.com/ja-jp/azure/storage/blobs/lifecycle-management-overview

> 汎用 v2、Premium ブロック BLOB、Blob Storage のアカウントでは、ブロック BLOB と追加 BLOB でライフサイクル管理ポリシーがサポートされています。 

> Premium ブロック BLOB ストレージ アカウントでは、階層化はまだサポートされていません。 他のすべてのアカウントでは、階層化はブロック BLOB でのみ許可され、追加およびページ BLOB では許可されません。

https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-block-blob-premium

https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-feature-support-in-storage-accounts


https://learn.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-use-hdfs-data-lake-storage





### マネージドディスク

https://learn.microsoft.com/ja-jp/azure/virtual-machines/managed-disks-overview


### Data Explorer

https://learn.microsoft.com/ja-jp/azure/data-explorer/data-explorer-overview

>Azure Data Explorer は、大量のデータをほぼリアルタイムで簡単に分析できるようにする、フル マネージドかつハイ パフォーマンスなビッグ データ分析プラットフォームです。 

https://dataexplorer.azure.com/publicfreecluster




## 参考

[【AZ-900対策】Azureストレージサービスの違いをまとめた #AZ-900 - Qiita](https://qiita.com/y__saito/items/5c112725022df98619a5)
【ServiceNow】ユーザ毎にログイン時のIP制御を行う

本記事は、Qiita ServiceNow アドベントカレンダーの参加記事14日目です。
ServiceNowのカレンダー | Advent Calendar 2023 - Qiita

https://qiita.com/advent-calendar/2023/servicenow

# はじめに

ServiceNowでIPベースでのアクセス制御を行う場合、標準機能を利用する際にはインスタンス全体でのアクセス制御を行う機能が存在しますが、今回はユーザやロールベースでのアクセス制御を行う必要があり`GlideSession - getClientIP()`を利用しログインの際のアクセス元IPを取得したAccess Controlを行う方法を実装しました。

# IPとロールを管理するテーブルを作成
対象の情報を管理するためのテーブルを新規で作成します。

IP Address : IPアドレス
Target Group : 対象のグループ
Target Role : 対象のロール
Discription : 説明

![mosaic_20231214040429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375/97468e40-57a4-a5b2-09a4-fd8c68d86c90.png)
# SPEntryPageのScript Includeを編集

```	js
getFirstPageURL: function() {
		
		var roles;
		var checkTargetCount = 0;
		var ngCount = 0;
		var logOutFlg = false;
		roles = gs.getSession().getRoles().split(',');
		
		var gr = new GlideRecord("IPの管理テーブル");
		gr.query();

		while(gr.next()){

			var ipCheckFlg = false;
			var roleCheckListList =0;

			roleCheckListList = roles.filter(function(value) {
				return value == gr.u_target_role.name;
			});

			if(gr.u_target_group != "" && gr.u_target_role == ""){
			
				if(gs.getUser().isMemberOf(gr.u_target_group)){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}else if(gr.u_target_group == "" && gr.u_target_role != ""){

				if(roleCheckListList != 0){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}else if(gr.u_target_group != "" && gr.u_target_role != ""){

				if(gs.getUser().isMemberOf(gr.u_target_group) && roleCheckListList != 0){
					ipCheckFlg = true;
					checkTargetCount = checkTargetCount + 1;

				}
			}

			if(ipCheckFlg){

				if(gr.u_ip_address.toString() != gs.getSession().getClientIP().toString()){
					ngCount = ngCount + 1;
					logOutFlg = true;

				}
			}
		}

		if(logOutFlg && ngCount == checkTargetCount){
				var gr = new GlideRecord('v_user_session');
				gr.get('session_id',gs.getSession().sessionID);
				gr.locked = true;
				gr.update();
		}

```

# ログインに失敗するとセッションを切断
対象の場合強制的にセッションが切断されるため、以下のような画面表示になります。
![スクリーンショット 2023-12-14 3.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375/a61feba8-59e3-139c-adf5-e708d5421491.png)

# まとめ
今回はSPEntryPageのScriptを編集してIPアドレスによるアクセス制御の実装を行いました。一方でこちらの方法ではアクセス時のIPのみチェックを行うことが出来ますが、ログイン後のセッションのIP制御は行う事が出来ないため、次回は別の方法を試したいと思います。

# 参考
IP アドレスのアクセス制御

https://docs.servicenow.com/ja-JP/bundle/tokyo-platform-security/page/administer/login/task/t_AccessControl.html

特定の IP 範囲にアクセスを制限する (インスタンスセキュリティ強化)

https://docs.servicenow.com/ja-JP/bundle/tokyo-platform-security/page/administer/security/reference/restrict-access-to-specific-ip-ranges.html

GlideSession - スコープ対象

https://docs.servicenow.com/ja-JP/bundle/utah-api-reference/page/app-store/dev_portal/API_reference/GlideSessionScoped/concept/c_GlideSessionScopedAPI.html
イベント会場の３D表示／NT名古屋2023

この記事は、「[からあげ帝国 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/karaage)」の 14日目の記事です。

## はじめに
この記事は、下記のようなイベント会場をScaniverseとBlenderで３D表示したものについて書いたものです。


![Image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/c1891790-e88e-6792-3243-52fa4a38bdcf.jpeg)

## NT名古屋2023に遊びに行ってきた
11月ですが、西春で[NT名古屋2023](https://twitter.com/NTnagoya)が開催されました。いくつか紹介しますと、
![IMG_1635.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/44acb856-0f1e-d724-f381-faa500146611.jpeg)

基盤を使わずに空中配線で回路を組んだ時計や（LEDなのにスチームパンクっぽさもあってなんだかいい！）
![IMG_1644.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/a2aa93ec-9b80-a921-8f52-2ffdcaf474e8.jpeg)

ゲーミングタイプライターやUSBに接続するとキーボードと連動してソレノイドで物理的にタイプライター音を出すイカしたデバイスなんかが展示してありました。
![IMG_1623.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/1945828d-ad07-d56b-dc66-e943997e90fa.jpeg)

他にも色々ありましたので[NT名古屋2023](https://twitter.com/NTnagoya)から参照していただければと思います。


## 目的
からあげ先生の出店を見に行きました。
![IMG_1638.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/3c1df37f-311c-e0c7-df64-cfe7512bd7ed.jpeg)
AIマリオ。2分割画面でAIのマリオとどっちが先にゴールするか勝負。
（なおAIどころか最初のクリボーで死にました）

見に行ったのですが、ブースが受付のすぐ隣だったのに気が付かず、会場を3周くらいしてようやく気が付きました。
／(^o^)＼ﾅﾝﾃｺｯﾀｲ

## 会場の３Ｄ化
会場の西春駅は、家から数駅の場所にあるのですがこれまで使ったことがほぼ無い駅でしたので軽く迷いました。
上記の通り目的のブースも探してしまったので（面白そうなものがいっぱいあったのが悪い）目的地をできるだけわかりやすくできないか３Ｄで表示してみます。

### Scaniverseによる３Dモデルの出力
Scaniverseというソフトで会場を歩き回り、Liderモードで３Ｄモデルを作成します。作成後は下記の手順で、シェア→モデルのエクスポート→お好みのファイル形式　で、ファイルを作成しました。

![IMG_2312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/cb7a7310-14e6-5952-1d30-18ab58104d24.jpeg)

ついでに駅のホームから会場までも歩きながら別でスキャン、合成しています。

### BlenderによるGISデータのモデル化
BlenderのプラグインのBlender GISで、春日井駅と会場のヨシズヤを表示、glbファイルにエクスポートしました。
![Image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/f61a0f79-9f76-1510-e748-e2d31af93561.jpeg)


### Babylon.jsによる３Ｄモデルの表示
BabylonPlaygroundに上記のモデルを表示するコードを記載して表示します。
SceneLoader.ImportMeshAsyncの引数で、用意した３Ｄモデルを読み込み、座標や角度なんかを調整しています。

```javascript:Babylon.js
    BABYLON.SceneLoader.ImportMeshAsync("", "https://raw.githubusercontent.com/ykoba079/sample1/master/", "NT名古屋2023会場.glb").then((result) => {
        result.meshes[0].position.x = -38;
        result.meshes[0].position.y = 12.3;
        result.meshes[0].position.z = -31;
        result.meshes[0].rotation = new BABYLON.Vector3(0, Math.PI*0.98, 0);
    });
```

からあげブースの上に、球体と三角錐を配置して終了です。
![Image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/95544a32-9f71-8b16-cfa0-e0dc86155179.jpeg)

ホームからの道順。（地面のテクスチャが目立ってちょっと見にくいかもですね・・・）
![Image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/46b7d000-8598-56b8-badf-5faebf341313.jpeg)

出来上がったページは、下記のリンク先になります。
https://playground.babylonjs.com/#UY72D0#13
マウスの左ドラッグで角度変更、右ドラッグで平行移動、ホイールで前後に動きます。

## 最期に
スマホとBlenderで、簡単に会場の３Ｄモデルを作成してみました。
特にモデリングの作業もなく、出来てしまいますね。
開発者の方々には感謝しかないです。ありがたや！
個人的にPRレビューでよく指摘される事とその対策

# はじめに
本記事では、個人的にプルリクエストのレビューで指摘されがちなケースとその対策について記載します。
指摘が中々減らずに困っている、プルリクエストを見る際にどこを見ればいいかあまり分からないといった課題の解消のお役に立てれば幸いです。

## スペルミス
これはあるあるかと思います。
自分で書いている時にはなかなか気づかず、レビューで指摘されて気まずくなることが結構ありました。

### 対策
VSCodeでスペルチェックをしてくれるプラグイン（[Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)）を導入することで激減させることができました。

スペルを間違えると即座にエディタ側で指摘してくれるので、チームで導入しておくとレビュワーの負担軽減に繋がるのでとてもオススメです。

## 変数・関数・スタイルなどの命名
これも個人的にはよく指摘されます。
抽象的だったり、命名から役割が推測できないものはコードの可読性を下げるため良くありません。

```
/** 画面表示用 */
const objectA = { ...etc }         // x
const displayContent = { ...etc }  // ◯
```

### 対策
私のチームではよく使う単語や機能についてドキュメント化し、そこを参照して命名するようにしています。

チーム全体で認識を合わせることができれば実装中に迷うことが少なくなり、実装速度の向上にも繋がるのでこれもオススメです。

## コーディング規約違反
プロジェクト毎にコーディングルールや暗黙の了解があったり...ということはよくある事かも知れません。

身体に染み付いたものであれば特に問題はないですが、むしろ癖で書いてしまっている記述がルールに違反していたりすると何度も指摘されてしまいがちです。

### 対策
機械的に弾けるものはeslint系で弾いてしまいましょう。
レビュワーの負担を減らしつつ、コード品質を向上させることができるので治安がとても良くなります。

また、定期的にルールの追加・見直しを行うことが出来れば尚良いかと思います。

機械的に弾けないものに関しては、コーディング規約をドキュメント化して周知を行い、プルリクエスト毎にセルフレビューを徹底しています。(かなり見落としがちですが...)

コーディング規約について理解できないものがある場合、チーム内で連携をとりながら認識齟齬のないよう確認することで、自身のスキル向上にも繋がるためどんどん質問・確認をしていきましょう。

## コード品質系
## 1. Null安全
型定義の際にAPIから受け取る値や、データの持ち方などの都合でnullableにすることもあるかと思います。
ただし、値を扱う際にNull安全が保たれていないと実行エラーが発生したり、エラー表示はされないものの意図した動作にならない場合があります。

例えば
```
function variableString(target?: number | null) {
    return `number ${target}`
}
```
のような関数があった場合、nullやundefinedがそのまま文字列として表示されてしまうことになります。

### 対策
NullやUndefinedが許容されている場合、本処理の前にNull安全のための判定式を実装するようにしています。
判定後のハンドリングや、そもそものNullable型の使用ルールについては、チーム内で議論して最適な規約が作れるとよさそうです。

## 2. 不要な条件分岐・繰り返し処理

例として、特定の数字のみ別の処理を行いたい場合の処理として
```
const hoge: number = 1

function example(item: number) {
    if (hoge === 1) {
        console.log('one') 
    }　else if (hoge === 2 || hoge === 3) {
      console.log('alt')
    }
}

```
このような記述があるとします。
もちろんこのままでも動作するのですが、特定の数字のみ判定したいのに判定式が複数あってはパフォーマンスや可読性に問題が出てしまう可能性があります。

### 対策
ケースバイケースではありますが、条件分岐を極力減らすことを意識して早期リターンを行うようにしています。

```
const hoge: number = 1

function example(item: number) {
  if (item === 1) {
    console.log('one')
    return 
  }
  console.log('alt')
}
```
このような簡単な処理の場合は問題ありませんが、型判定や複数の条件が絡み合っている場合は見落としてしまいがちなため、個人的に気をつけています。

# まとめ
プロジェクトやメンバーのスキルセット等でコーディング規約や習慣は異なるものかと思います。
ここで挙げた例はあくまで一例でしかありませんので、レビュワー・レビュイーの双方が納得できるようなPRレビューを心がけたいですね。

ある程度分類ごとにまとめてみましたが、まだまだ細かい点では記述しきれていない(特に品質系)ため、機会があれば随時更新して来たいと思います！
（覚書）Android版Unity製ゲームアプリからのSpineデータ抽出

## 前提

1. Unity製のひねってないゲームアプリを想定
1. apk自体ではなく起動後にリソースを取得するタイプ
1. リソースが特に暗号化されていない

## 1. リソース取得

1. Android（エミュレータでも可）で対象のアプリをインストール＆起動
1. 数GBのリソースダウンロードがだいたいあるので待つ
1. アプリを終了
1. ファイルマネージャやUSB接続経由などで保存先フォルダを確認
    1. 以下のような感じ
    1. Android/data/com.example.sampleapp/files/UnityCache/Shared
    1. Android/data/com.example.sampleapp/files/AssetBundls
1. 該当フォルダの中身を作業用フォルダにコピー
1. 次へ

## 2. 抽出

1. [AssetStudio](https://github.com/Perfare/AssetStudio/releases)をインストール
1. インストールしたAssetStudioを開く
    1. AssetStudioGUI.exeを実行
1. 気になるファイルを開く
    1.  気になるファイル（容量でかい、それっぽい名前など）
    1. File > LoadFile
1. Asset List タブに抽出内容が表示される
1. 必要そうなものを抽出
    1. 必要そう（画像ファイル、.atlas、skeletelondataなど）
    1. Export > All assets
    1. オプションで余計なフォルダ構造や拡張子の変更をなくしておいたほうが良い
        1. Options > Export options
            1. Group exported assets by > do not group
            1. Restore TextAsset extension name > off
1. 次へ

## 3. 抽出ファイルの確認

1. Unity向けにどのように出力されているかファイルの構造を確認する
    1. [spine-unityランタイムドキュメント](https://ja.esotericsoftware.com/spine-unity#Unity%E7%94%A8%E3%81%ABSpine%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)
    1. 今回は仮定としてJSON形式で出力されているとする
1. 規定のファイル名前になるように修正する
    1. 今回の例
        1. 修正前
            1. skeleton-name.**txt**
            1. skeleton-name.atlas.txt
            1. skeleton-name.png
        1. 修正後
            1. skeleton-name.**json**
            1. skeleton-name.atlas.txt
            1. skeleton-name.png
1. とりあえず揃っていそうなら次へ

## 4. 閲覧

Unityで最初から取り込んでも良いがまずは閲覧できることを確認する

1. [Skeleton Viewer](https://ja.esotericsoftware.com/spine-skeleton-viewer)をインストール
1. 起動して抽出ファイルを読み込む
1. 上手く表示されれば次へ
    1. ダメそうなら抽出ファイルが足りない、バージョンが違うなど問題を解決する
    1. もうちょっと！

## 5. Unityで取り込み

1. spine-unityランタイムをプロジェクトに追加
    1. [spine-unityランタイムドキュメント](https://ja.esotericsoftware.com/spine-unity#Unity%E7%94%A8%E3%81%ABSpine%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)
1. プロジェクトのAssetsにドラッグアンドドロップで抽出ファイルを追加
1. ランタイム側で勝手にインポートしてくれる
    1. 閲覧できていれば大丈夫なはず！
1. アセットフォルダの「skeleton-name_SkeletonData.asset」ができているはず
1. 生成された_SkeletonData.assetをヒエラルキーに入れればOK
1. あとは好きなように楽しむ！
rubyで配列から空(諸々)を除外するメソッド

# はじめに
この記事は2023年度の振り返りです。

これは自分が知らなかったメソッドなので、備忘録としてのメモです

# いままで
過去にこの記事を見ていたこともあり、基本的にこれを利用していました

https://qiita.com/ta1kt0me@github/items/33c4d37a65b69b75ee40

```ruby
[1, 2, nil, 3, "", []].compact
=> [1, 2, 3, "", []]

[1, 2, nil, 3, "", []].compact.reject(&:blank?)
=> [1, 2, 3]
```

# こんな便利メソッドがあった！！
```ruby
[1, 2, nil, 3, "", []].compact_blank
=> [1, 2, 3]
```

https://qiita.com/SoarTec-lab/items/0c19a4eb5e17c417d165

# さいごに
rails6.1から追加されていたのに、今まで知りませんでした。
ここ最近rubocopとバトルしていて気付いたのですが、rubocop様様です。
今後も、知らないメソッドは上げていきたいと思います
アドベントカレンダー折り返し!!! 思考をアウトプットする習慣のメリット

## アドベントカレンダー折り返し!!

12月から始まったアドベントカレンダーもいよいよ折り返しになりました。私はQiitaは普段見る側で、たまに備忘録的に書く感じだったんですが、今回アドベントカレンダーに完走賞があると知り挑戦してみることにしました。

![スクリーンショット 2023-12-14 2.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/84c51550-6e78-31e5-3ed8-8cd8314d37bd.png)

↑これが欲しいです

今回アドベントカレンダーに参加して、実際に自分のプログラミングや思考がどのように変わったかを途中経過として記そうと思います。

## アウトプットの習慣

文章に書き起こすこと=アウトプットをすることで思考が整理できるようになりました。

例えば数学の問題が解けないとして、誰かに何がわからないのかを説明してる時に「あれ、ここ違くね」ってなって理解するような現象（ラバーダッグデバッギング？）と似たような効果が得られました。

自分が普段何か思ったモヤモヤをツイートするとすぐにスッキリするように、アウトプットは何か精神を何か納得させる効果があるのかもしれません。

アウトプットは自分が同じミスでハマらないためだけでなく、同時に誰かが同じミスでハマらないようにするのにも役立つので、アドベントカレンダーの期間が終わっても可能な限り続けていきたいと思いました。

## 有識者から教えてもらえる

自分よりも詳しい人から誤りを訂正してもらえたり、新たな知識を教えてもらえました。特にこの記事。

https://qiita.com/shirokuma89dev/items/1e3a01aa8071507850cd

これはTwitterで全然知らない誰かがこの記事をツイートしたのがきっかけで爆発的に広まったらしく、さまざまな議論をすることができました。非常に勉強になるものばかりでとても感謝しています。

もちろん私はソフトウェアのプロ（どちらかといえばハードの人間です）ではないので、誤った知識を携えていることが多くあります。その状態で書いたQiitaの記事は、全てが間違ってるとはいかなくとも一部間違っていると言うことは全然ありうる話です。

でも私はそれでもQiita等の媒体に書き起こす価値があると思います。もしこの記事を書いていなかったら、私はコンパイラのファイルのエンコーディング設定について誤った知識を持ち続けたままだったでしょう。これを訂正できたのは多くの人がアクセスできるQiitaに記事を書いたからです。

もちろんできるだけ誤りのない記事を書くように努めてはいますが、誤りを恐れて記事を書くのにビビる必要はないかなと今回のアドベントカレンダーで気づくことができました。

- できるだけ誤りがないように調べながら書くこと
- 誤りを指摘されたら快く受け入れて訂正すること
- 自分が他人の記事を読む時も誤りがある可能性を視野に入れること

正確な情報にアクセスしたいときはまず公式ドキュメントを読む、それを補完する形でQiitaを読むのが大切であると改めて認識することができました。

## 技術に触れる時間が長くなった

一ヶ月で25記事を書くってなかなか普通にできることじゃないです。ネタ？というか書く内容が十分にある必要があります。

そのために、普段からプログラミングや作業をしているときに「これもう少し詳しく調べてQiitaに書こうかな」とか「とりあえず何かやってみてネタを捻出しよう」と思うようになりました。今Qiitaを書いているこの時間は、11月以前ならおそらくようつべに溶かしていた時間です。かなりの成長だと思います。

## タイピング早くなった

急にしょうもない話になってしまいましたが、タイピングの誤字率がだいぶ減りました。

普段自分はMacBookを使っていて、あの薄いキーボードを使っている（好き）のですが、自宅ではMacBookをディスプレイに繋げてメカニカルキーボードで作業しています。普段ディスプレイを使ってやる作業はほとんどがCADかIllustrator等の作業なのでマウスとショートカットキーの操作が中心です。なので、今までこのメカニカルキーボードで長文を打つシチュエーションは意外とありませんでした。

今回毎日Qiitaに記事を書くようになって、毎日ある程度の長文をメカニカルキーボードで打つようになった結果、指がだんだん慣れてきてタイプミスがかなり減りました。そういえばこのタイピング早くなったの章の開始からここまではミスってないですね。

この前試しにこのタイピングやったら打鍵/秒が8.7出たので嬉しかったです。今までタイピングゲームをやるときはMacBookの薄いやつしかできなかったのですが、メカニカルでも十分楽しめる域まで来ることができました。

https://typing.twi1.me/game/31096

## 終わりに

この記事を読んでQiita仲間が増えればいいなって思います。自分のリア友でQiitaを投稿してる人はまだいないのでこの文化が広まればいいなぁ。

今この記事を読んでぬいぐるみ欲しいって思った人も、今から毎日2記事以上書けばクリスマスにまだ間に合います！！！ぜひ一緒に記事執筆頑張りませんか？
Three.jsの紹介

# はじめに
今回紹介する「Three.js」は、私が大学時代にJavaScriptにはまるきっかけとなったJavaScriptのライブラリです。
この記事少しでもJavaScritの可能性を感じていただけたら嬉しいです。

# Three.jsとは
ウェブブラウザ上で3DCGを描画するためのJavaScriptのライブラリです。
 WebGLをもとに開発されており、簡単なコードで3DCGを描画できるのが特徴です。
 
 以下のリポジトリからダウンロードすることが出来ます。
 https://github.com/mrdoob/three.js

 # 使い方
 Three.jsは任意のhtmlに読み込むだけで使用可能!
```
<script src="js/three.min.js"></script>
```

# デモ
今回は以下のような立方体を描画します。
![threejs.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635526/033b67fe-a701-95c0-97bc-71747cea452d.png)

使用するコードは以下です。
```
    init();
    animate();

    function init() {
        scene = new THREE.Scene();

        camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 );
        camera.position.z = 1000;

        geometry = new THREE.BoxGeometry( 200, 200, 200 );
        material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );

        mesh = new THREE.Mesh( geometry, material );
        scene.add( mesh );

        renderer = new THREE.WebGLRenderer();
        renderer.setSize( window.innerWidth, window.innerHeight );

        document.body.appendChild( renderer.domElement );
    }

    function animate() {
        requestAnimationFrame( animate );
        render();
    }

    function render() {
        mesh.rotation.x += 0.01;
        mesh.rotation.y += 0.02;

        renderer.render( scene, camera );
    }
```

以下の部分で、3Dモデルを描画する場所を定義しています。
```
scene = new THREE.Scene();
```

以下の部分で、3Dモデルを見る視点を定義しています。
```
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.z = 1000;
```

以下の部分で、描画する3Dモデルを定義しています。
```
geometry = new THREE.BoxGeometry( 200, 200, 200 );
material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );

mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
```

以下で、ブラウザのどこに描画するのかを定義しています。
```
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );

document.body.appendChild( renderer.domElement );
```

以下で、描画処理を実行しています。
ここでは、立方体を回転させる設定も行っています。
```
        mesh.rotation.x += 0.01;
        mesh.rotation.y += 0.02;

        renderer.render( scene, camera );
```

イメージとしては、以下のようなものとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635526/74bcec65-ba5f-7389-2de3-4c1c65add200.png)


# 最後に
　今回紹介したものは、立方体を描画するコードだったが、この他にもいろいろできることが多くある。
例えば、描画した図形にテクスチャを貼ることや、図形を見る視点を動的に変更することから、MMDモデルの描画まで可能です。ブラウザを2分割して、左右に同じ3Dモデルを表示することで簡易的なVRも実現することができる。
やり方次第でいろいろと可能性が出てくる面白いライブラリという印象です。

詳しくは、オライリー本を読んでみよう！
https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEThree-js-%E7%AC%AC2%E7%89%88-%E2%80%95WebGL%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEJavaScript-3D%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-Dirksen/dp/4873117704/ref=sr_1_1?crid=SAYFHPE4EA0F&keywords=three.js&qid=1702487441&sprefix=three.js%2Caps%2C419&sr=8-1
超初心者向けLinuxメモ (1)

# ・ Linuxメモ
私がよく使うLinuxメモです. 後ろの方に便利コマンドもあります.
他によく使うコマンドを思い出したらどんどん追記していく予定です. 🐌

(1)はコマンドについて.
ssh接続のconfigファイルの作成, vim, tmuxなどは(2)へ (作成予定)

  　　　
目次
・　[超基本コマンド](#section1)
・　[よく使う便利コマンド](#section2)


# ・ 超基本コマンド

## ls
ディレクトリ内のファイルやディレクトリの一覧を表示
```bash
$ ls sample_dir   # sample_dirの中身を表示
```

## cd
ディレクトリを移動
```bash
$ cd /home/sample_dir   # /home/sample_dirへ移動
$ cd ..   # 1個上のディレクトリへ戻る
```

## cat
ファイルの中身を確認
```bash
$ cat sample_file   # sample_fileの中身を表示
```

## mv
ファイルやディレクトリを移動させる.
またファイルやディレクトリの名前の変更にも使える.
```bash
$ mv /home/sample_dir ./   # sample_dirをカレントディレクトリへ移動
$ mv old_name.txt new_name.txt   # ファイル名の変更
```

## cp
ファイルやディレクトリのコピー
`-r`　はディレクトリごとコピーするとき用
```bash
$ cp -r tragte_dir /home/sample_dir   # target_dirのコピーを/home/sample_dirに作成
```

## rm 
ファイルやディレクトリを削除
`-i`で削除する前に確認が求められるようになる
```bash
$ rm -ri sample_dir   # sample_dirを確認しながら削除
```
## mkdir
ディレクトリの作成
```bash
$ mkdir sample_dir   # sample_dirの作成
```

## touch
ファイルの作成
```bash
$ touch sample.py   # sample.pyの作成
```

## pwd 
カレントディレクトリを確認
```bash:/home/sample_dir
$ pwd   # /home/sample_dirが表示される
```

## top
実行中のプロセスのプロセスIDやCPU, メモリの使用状況をリアルタイムで表示
`q`で終了
```bash
$ top
```

## ps 
実行中のプロセスを表示
いつも`ux`のオプションもつけて使ってる
`grep`でキーワードによる絞り込みも可能
```bash
$ ps ux
$ ps ux |grep code   # 実行中のプロセスの中でもcodeに絞り込んで表示
```

## kill
実行中のプロセスを削除. 上のtopやpsコマンドを使ってPID(プロセスID)を取得, PIDを指定して削除
`killall` を使っても良いが全て一括で消されてしまうので注意が必要
```bash
$ kill PID
$ kilall code   #実行中のcodeコマンドによるプロセスを全て削除
```
## nvidia-smi
NVIDIA GPUを搭載したシステムにおいてGPUの状態や使用状況を表示
```bash
$ nvidia-smi
```

# ・ よく使う便利コマンド
## scp
sshで接続しているリモートとローカル間でファイルやディレクトリを転送
```bash
$ scp -r ユーザー名@ホスト名:remote_home/sample ./   # ssh接続先のremote_home/sampleをローカルのカレントディレクトリに転送
```
## nohup
コマンドをデタッチしてバックグラウンドで実行.
ユーザーがログアウトしたりシェルセッションが終了してもプロセスが続行.
途中でssh接続が切れちゃっても大丈夫なので便利.

ここでは bash /home/sample/script.sh を実行して
`2>&1`によって標準エラー出力も標準出力と一緒にoutput.logに出力.
```bash
$ nohup bash /home/sample/script.sh > /home/sample/output.log 2>&1 &
```
## watch -n 1 nvidia-smi
nvidia-smiを1秒ごとに表示.  GPUの使用状況がリアルタイムでわかる.
ジョブを投げた際にGPUが正しく動いているか確認できるので便利
```bash
$ watch -n 1 nvidia-smi
```

## ls -1 | wc -l
ディレクトリ内に含まれるファイルやディレクトリの数をカウント. 
実験結果の管理に役立つ.
```bash
$ ls -1 | wc -l
```
閉域通信でAWS VPCで名前解決をする場合のチェックリスト

AWS VPCのDNSでオンプレミス環境への通信を名前解決する場合に、
オンプレミス環境側の担当者と聞き取りや調整をする際のポイントは以下の内容が必要であると、
４２歳は学びました。。


ネットワークのことは学生時代の情報処理試験で少しかじった程度であったので、
大汗をかきました。(ToT;

### 1. ネットワーク構成とアーキテクチャ

- オンプレミス環境のネットワークトポロジと構成
- ファイアウォールとセキュリティ設定
- オンプレミス環境で使用されているIPアドレス範囲
- オンプレミスとAWS VPC間の通信方法（VPN、Direct Connectなど）

### 2. DNS設定とドメイン

- オンプレミス側のDNSサーバの情報
- 必要なドメイン名とその設定
- サブドメインや特定のホスト名の扱い

### 3. セキュリティとアクセス制御

- セキュリティポリシーとアクセス制御リスト
- オンプレミス側でのアクセス制限や許可設定
- SSL/TLS証明書や暗号化の要件

### 4. 名前解決のテストとバリデーション

- 名前解決のテスト計画
- どのようにして名前解決の成功や失敗を確認するか
- エラーが発生した場合のトラブルシューティング手順

### 5. 運用とメンテナンス

- DNSのメンテナンスとアップデートのスケジュール
- 障害発生時のエスカレーションプロセス
- ログの管理と監視

### サンプル質問リスト

1. オンプレミス側のDNSサーバはどこにありますか？
2. 使用しているドメイン名は何ですか？
3. オンプレミス側のIPアドレス範囲とアドレス割り当てポリシーは何ですか？
4. オンプレミスとAWS間の通信はどのように設定されていますか？
5. オンプレミス側で必要なファイアウォールの設定やセキュリティポリシーはありますか？
6. 名前解決のテストはどのように行う予定ですか？
7. DNSのメンテナンスやアップデートはどのように行いますか？
8. 障害発生時の連絡先とエスカレーションプロセスは何ですか？
9. SSL/TLS証明書や暗号化の要件はありますか？
10. ログの管理と監視はどのように行いますか？
PostgreSQLのRAISEステートメントのLEVELの挙動

お仕事でPostgreSQLを使用することになりました。

## 利用しているPostgreSQL

- PostgreSQL 14.1

## 所感

PostgreSQL-FunctionのデバックでRAISEステートメントを利用していたところ、
設定するLevelによって挙動が違うことを学んだ４２歳です。

## RAISEステートメントのLEVELの挙動まとめ

PostgreSQLの`RAISE`ステートメントで設定できるLEVELには様々なものがあり、それぞれに特定の用途がありました。
また、これらのレベルに応じて関数内の処理が停止するかどうかも異なります。

以下に表形式でこれらの情報をまとめました。

| Level     | 用途                                                         | 処理の停止 |
|-----------|--------------------------------------------------------------|------------|
| DEBUG     | デバッグ情報の出力。開発者向けの詳細な情報提供に使用。       | いいえ     |
| LOG       | 一般的なログ情報の出力。システムの動作記録に使用。           | いいえ     |
| INFO      | 情報メッセージの出力。重要でない情報提供に使用。             | いいえ     |
| NOTICE    | 注目すべき情報の出力。ユーザーに通知すべき情報に使用。       | いいえ     |
| WARNING   | 警告メッセージの出力。問題が発生しうる状況に警告するため使用。 | いいえ     |
| EXCEPTION | エラーメッセージの出力。実行中の関数を停止させる。           | はい       |

- `DEBUG`, `LOG`, `INFO`, `NOTICE`, `WARNING` は主に情報提供や警告のために使用され、関数の実行を停止しないようです。
- これらのメッセージはログに記録されることがありますが、関数自体の実行は続行されます。
- `EXCEPTION` はエラー状況を示し、これが発生すると関数の実行は直ちに停止し、エラーメッセージが発生元に伝播されます。

これらのレベルを適切に使用することで、関数の挙動をより細かく制御し、エラーハンドリングやデバッグを効果的に行うことができることを４２歳は学びました。
また、これらのレベルの使用は、ログの管理やシステムの監視にも影響を与えることに注意が必要であることも４２歳は学びました。
Lambda+DynamoDB+vue.jsで"覚えたい知識を忘れさせない"LINEアプリ作ってみた

## 作ったもの
ユーザーは覚えたい知識があった時、LINEアプリ内にパッとメモします。(写真もいけます)
内部ではそのメモをデータベースに蓄積していきます。
アウトプットしたいときは"教えて"と送信するなどするとメモのうちのランダムな一つが返ってきます。"忘れて"と送信するとデータベースから削除されます。また、一覧で見れるようにLiffアプリを付け、ユーザーのデータをデータベースから取得し一覧で表示する機能もつけています。
## 個人的アピールポイント
LINEアプリにメモするので、メモのハードルが低く、アウトプットもしやすい点だと思います。
## 実際の様子
![IMG_5022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/3b0a6ecf-5d18-5c9b-30e7-eb9e63403d27.jpeg)
「教えて」「忘れて」「一覧を見る」の3つのボタンがあり、
「教えて」を押すと今まで送った内容のうちの一つがランダムで送られてきます。
「忘れて」と押すとデータベースから削除されもう送信されてきません。
「一覧を見る」と押すとLiffと呼ばれるVue.jsで実装したWebページに繋がります。
下の写真は僕が昔メモしたものが出てきています。
![IMG_5023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/0d8bb2e3-da20-99da-a746-675ac20f9509.jpeg)
一覧表示すると以下のようになります。
![IMG_5027.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/7e94a155-bb04-1ce0-4100-c717e1d6456b.jpeg)

## 実装について
実装自体はデータベースへの挿入・取り出しだけなので至ってシンプルです。
以下の図のような感じになります。
Lambdaの機能は左から
・「教えて」「忘れて」などの文言を受け取りそれに基づいた処理を行う
・一覧表示の際にデータベースからそのユーザーのデータを取得
・ユーザーの指定したメモを削除
するものとなっています。
また、一覧を表示する際のWebページはVue.jsで実装しLambdaを呼び出すことでデータを受け取る形になっています。ちなみにAWS Amplifyにデプロイしました。
![忘却防止アプリ構成 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/be6b0ab3-41c1-c5ac-03fe-4320d02af795.png)
## 今後について
今はほぼほぼ個人的に使っているだけですが、LambdaにAWSのEventBridge付けたりすることで例えば毎朝9時にLINEアプリから通知がきて、今まで入れたメモのうちのランダム一つが送られてくる、といった処理は簡単にできます。これがあると一定の需要はあると勝手に思っているのですが、どうなのでしょうか。
Windows7 で AMD ドライバが原因で Intel Graphics が不調

Fujitsu PRIMERGY MX130 S2 サーバ(AMD Athlon Ⅱ X2プロセッサー)で動いていた Windows7 のストレージを TX1310 M3 (インテル Celeron プロセッサー G3930 ) に移植してみた。
ドライバを以下のようにしてインストールしたが・・・

「Fujitsu TX1310 M3 に Windows7 を入れて遊ぶ」
https://qiita.com/nanbuwks/items/1f95abb8f4fef017219a

Intel グラフィックスのドライバがエラーが出る。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/086ea95e-2b09-83ad-907e-cd5db0113ff9.png)

AMD 系 ➯ Intel 系 あるいは逆に Intel 系 ➯ AMD 系 に MS-Windows インストール済みシステムを移行するときはドライバーが悪さして何かと問題が起こる。

よくあるノウハウだったのだけれども、もう MS-Windows7 の対処方法など忘れかけだったので、ロストテクノロジーになる前に残しておきます。

# 犯人は AMD PCI Express(3GIO) Filter Driver

ドライバの詳細を見ると、`AtiPcie.sys` とあります。


![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2bd8d6a5-f116-4043-dc0c-76e4e13666ba.png)

これをプロパティの「ドライバー」タブの「削除」で削除、再起動します。

# 再起動

再起動すると、PCI のドライバが `pci.sys` となります。USB 接続のキーボードやマウスなども Plug & Play でドライバがインストールし直しになるので、処理が一通り終わるまで待ちます。

# グラフィックドライバの再インストール

先に紹介した記事のように、Windows7 用にパッチを当てたグラフィックドライバーを再インストールします。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7291c508-f1bd-1255-ee0b-2d33b2572da9.png)


再起動すると、正常な動作になりました。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/001c6802-21fa-a600-2383-5c1619db085d.png)
AWS CloudShellでlambaのLayer定義を一括でs3にエクスポートする方法

[AWS CloudShellでlambaの定義と関数を一括でs3にエクスポートする方法](https://qiita.com/zeropfac/items/a84513c5e4059d6ed797) の続きでして、、、

Lambda関数で利用しているLayerのコードをAWS管理コンソールでペチペチクリックの繰り返しが４２歳にはキツイ(´Д｀;)

自分の端末にAWS Cliをインストールするのが困難な環境のため、
CloudShellでS3に一括エクスポートを行います。

## 利用手順
0. export_lambda_layer_to_s3.shの保存先バケット名をテキストエディタで編集する
	- Windowsでファイル編集した後は、忘れずにUTF-8 + 改行コードはLFにして保存してください。
1. AWSマネージドコンソールにログインする
2. 保存用のS3バケットを作成する(マネージドコンソールで操作）
3. export_lambda_layer_to_s3.shをS3バケットにアップロードする(マネージドコンソールで操作）
4. CloudShellを起動する(マネージドコンソールで操作）
5. 以下のコマンドでS3からexport_lambda_layer_to_s3.shを取得する(CloudShellで操作）
	- ```aws s3 cp s3://[Your-S3-Bucket-Name]/export_lambda_layer_to_s3.sh .```
6. 以下のコマンドでexport_lambda_layer_to_s3.shに対するファイル実行権限設定を行う(CloudShellで操作）
	- ```chmod 777 export_lambda_layer_to_s3.sh```
	- 実行権限はお使いの状況に合わせて適宜変更してください。
7. 以下のコマンドでexport_lambda_layer_to_s3.shを実行する。(CloudShellで操作）
	- ```./export_lambda_layer_to_s3.sh```

## S3バケット構成例

バケット名
　 > lambda-layer

## スクリプトコード例

- ファイル名：export_lambda_layer_to_s3.sh

```
#!/bin/bash

# S3バケット名とフォルダ名を設定
S3_BUCKET="保存したいS3バケット名を指定してください"
S3_FOLDER="保存したいS3バケットのフォルダ名を指定してください" # ここにフォルダ名を指定

# 指定されたリージョン内のすべてのLambda Layerのリストを取得
lambda_layers=$(aws lambda list-layers --query 'Layers[].LayerName' --output text)

# 各Lambda LayerをエクスポートしてS3にアップロード
for LAMBDA_LAYER_NAME in $lambda_layers; do
    # 最新のLayerバージョンを取得
    latest_version=$(aws lambda list-layer-versions --layer-name $LAMBDA_LAYER_NAME --query 'LayerVersions[0].Version' --output text)

    # Lambda LayerのコードのURLを取得
    aws lambda get-layer-version --layer-name $LAMBDA_LAYER_NAME --version-number $latest_version --query 'Content.Location' --output text > layer_code_url.txt

    # Lambda Layerコードのダウンロード
    wget -O layer_code.zip -i layer_code_url.txt

    # S3バケット内の指定されたフォルダにLambda LayerのZIPファイルをアップロード
    aws s3 cp layer_code.zip s3://$S3_BUCKET/$S3_FOLDER/$LAMBDA_LAYER_NAME/$LAMBDA_LAYER_NAME.zip

    # 一時ファイルの削除
    rm layer_code_url.txt layer_code.zip
done
```
p5.js の p5.Color で toString() の出力形式を指定する【完走賞ゲット-15】

:::note info
※ [Qiita の完走賞をゲットするための条件は「単一／複数のカレンダーに投稿した記事が合計25」です](https://twitter.com/Qiita/status/1593441648796524545)
:::

この記事は、「[完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/youtoy)」の 15日目の記事です。

## 今回の内容
今回の内容は、p5.js の p5.Color で toString() の出力形式を指定するというものです。

### p5.Color の toString() の仕様
p5.js公式の p5.Color に関するリファレンスは、以下のとおりです。

●reference | p5.Color
　https://p5js.org/reference/#/p5.Color

![p5.Color](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b1965d0a-14eb-c539-d659-e050787dbed9.png)

この中の toString() に関するリファレンスを、さらに見ていきます。

●reference | toString()
　https://p5js.org/reference/#/p5.Color/toString

![toString()](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e87aff9c-74e3-05b4-ecb8-967374570162.png)

説明の中の「format」というパラメータの説明を見てみます。
そうすると、デフォルトのフォーマットが「rgba(r, g, b, a)」となっているのを、以下のフォーマット指定をすることで出力形式を変えられるようです。

- 最後に「%」がつくもの
   - rgb%
   - hsb%
   - hsl%
   - rgba%
   - hsba%
   - hsla%
- 最初に「#」がつくもの
   - #rgb
   - #rgba
   - #rrggbb
   - #rrggbbaa
- 「%」や「#」がつかないもの
   - rgb
   - hsb
   - hsl
   - rgba
   - hsba
   - hsla


### p5.Color の toString() でフォーマット指定を試してみる
それでは、上記のフォーマット指定を使った場合の出力の違いを確認してみます。

以下に、プログラムとその出力をそれぞれ掲載してみます。

#### プログラム

```javascript
function setup() {
  createCanvas(400, 400);

  c = color(130, 150, 200);

  console.log(
    c.toString(),
    c.toString("rgb%"),
    c.toString("hsb%"),
    c.toString("hsl%"),
    c.toString("rgba%"),
    c.toString("hsba%"),
    c.toString("hsla%")
  );

  console.log(
    c.toString("#rgb"),
    c.toString("#rgba"),
    c.toString("#rrggbb"),
    c.toString("#rrggbbaa")
  );

  console.log(
    c.toString("rgb"),
    c.toString("hsb"),
    c.toString("hsl"),
    c.toString("rgba"),
    c.toString("hsba"),
    c.toString("hsla")
  );
}

```

#### 出力
上記のプログラムを実行すると、以下の出力が得られました。

![出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9a0c68ad-ab2b-3ce8-479c-57cd1eaedb1e.png)


## おわりに
p5.js の p5.Color で toString() の出力形式を指定した場合の出力がどうなるかを確かめてみました。

以前、以下の記事を書いた際に toString() を使ってはいたのですが、今回のフォーマット指定ができるというのは認識できていませんでした。今回の内容で、様々な出力形式を扱えるので、これは活用していけそうです。

●p5.js で p5.Color の toString()・levels・分割代入を使ったり RGB・HSB を扱ったりする #JavaScript - Qiita
　https://qiita.com/youtoy/items/10df2850603909216841
AWS CloudShellでlambaの定義と関数を一括でs3にエクスポートする方法

AWS Lambdaに作成した関数の整理をしたいと思いました。

Lambda関数が10個を超えたら、AWS管理コンソールでペチペチクリックの繰り返しが４２歳にはキツイ(´Д｀;)

自分の端末にAWS Cliをインストールするのが困難な環境のため、
CloudShellでS3に一括エクスポートを行います。

## 利用手順

0. export_lambda_to_s3.shの保存先バケット名をテキストエディタで編集する
	- Windowsでファイル編集した後は、忘れずにUTF-8 + 改行コードはLFにして保存してください。
1. AWSマネージドコンソールにログインする
2. 保存用のS3バケットを作成する(マネージドコンソールで操作）
3. export_lambda_to_s3.shをS3バケットにアップロードする(マネージドコンソールで操作）
4. CloudShellを起動する(マネージドコンソールで操作）
5. 以下のコマンドでS3からexport_lambda_to_s3.shを取得する(CloudShellで操作）
	- ```aws s3 cp s3://[利用手順No.3で作成したバケット名を指定]/export_lambda_to_s3.sh .```
6. 以下のコマンドでexport_lambda_to_s3.shに対するファイル実行権限設定を行う(CloudShellで操作）
	- ```chmod 777 export_lambda_to_s3.sh```
	- 実行権限はお使いの状況に合わせて適宜変更してください。
7. 以下のコマンドでexport_lambda_to_s3.shを実行する。(CloudShellで操作）
	- ```./export_lambda_to_s3.sh```

## S3バケット構成例

バケット名
　 > lambda

## スクリプトコード例

- ファイル名：export_lambda_to_s3.sh

```
#!/bin/bash

# S3バケット名とフォルダ名を設定
S3_BUCKET="保存したいS3バケット名を指定してください"
S3_FOLDER="保存したいS3バケットのフォルダ名を指定してください"

# 指定されたリージョン内のすべてのLambda関数のリストを取得
lambda_functions=$(aws lambda list-functions --query 'Functions[].FunctionName' --output text)

# 各Lambda関数をエクスポートしてS3にアップロード
for LAMBDA_FUNCTION_NAME in $lambda_functions; do
    # Lambda関数のコードのURLを取得
    aws lambda get-function --function-name $LAMBDA_FUNCTION_NAME --query 'Code.Location' --output text > lambda_function_url.txt

    # Lambda関数の定義をYAML形式でダウンロード
    aws lambda get-function --function-name $LAMBDA_FUNCTION_NAME --output yaml > $LAMBDA_FUNCTION_NAME.yaml

    # Lambda関数コードのダウンロード
    wget -O lambda_function.zip -i lambda_function_url.txt

    # S3バケット内の指定されたフォルダにLambda関数のZIPファイルとYAMLファイルをアップロード
    aws s3 cp lambda_function.zip s3://$S3_BUCKET/$S3_FOLDER/$LAMBDA_FUNCTION_NAME/$LAMBDA_FUNCTION_NAME.zip
    aws s3 cp $LAMBDA_FUNCTION_NAME.yaml s3://$S3_BUCKET/$S3_FOLDER/$LAMBDA_FUNCTION_NAME/$LAMBDA_FUNCTION_NAME.yaml

    # 一時ファイルの削除
    rm lambda_function_url.txt lambda_function.zip $LAMBDA_FUNCTION_NAME.yaml
done
```
チームのgit-flowを定義したので紹介する話

# はじめに
git-flow定義をした話を紹介します。

元々会社の開発部では、git-flowが策定されていませんでした。
正確にいうと、開発部全体の方針が決まっておらず、サービスごとに
「こんなかんじだな」という方針がありますが、みんなバラバラでした。

会社にそろそろ決めてほしいなあ・・と思い、打診してもらっていたのですが、はや一年・・・。

`いつになったら決まるんだ！！！`ということで、うちのチームはうちのチームで策定することにしました。
（ここで流派が生まれてしまう）

元々、チームではgit-flowすらもなくて、master直PUSHも結構ありました。
それでいいのかい？！っていうツッコミどころは多々あります。
後に、マージリクエストルールも私が定義することになるわけですが・・。

# どんな〜やつにしたか

https://www.atlassian.com/ja/git/tutorials/comparing-workflows/gitflow-workflow

大体これと一緒ですね。
自分のチームにデザイナさんはいないので、デザイナさん向けのブランチなどは特に用意せず。
master, develop, featureという単位にし、masterの直接PUSHは禁止。
場合によってはhotfixを作るぐらいで。
git-flowがそもそもなかったので、慣らしから始めました。

ただ、gitのコミット、MR、どのブランチから派生して、みたいなのも大事なんですが、そもそも
コミットや、ブランチ名、MRのお作法などがカオスだったので、そこの運用をもっと重要視しました。

## ブランチ名のルールも定義することにしました
元々は、
```
20231201_fix_hogehoge_for_win
```
みたいなテキトーなネーミングでした。時系列で見やすいっちゃ見やすいですけど、ざっくばらんにブランチが乱立、どんな規則名なのかもわからないし、酷いときには個人名が入ってることもあります。
面倒なので、JIRAのチケットの名前一律にすることにしました。
これによるメリット・デメリットは以下です。

### メリット
- チケットに紐づいているため、なんのタスクであるか明快
- ブランチの名前のセンスを求められない（脳筋命名）

### デメリット
- 同じような名前なので、チケットIDを意識しないと間違える
- 名前を見ただけだとなんのブランチかは判断付かない

## commit prefixを定義
commit時において、どんな修正をしたのか、明確になるようにprefixを付けてもらうことにしました。

|prefix|説明|
|--|--|
|ci|ビルド関連|
|docs|ドキュメント修正|
|feat|機能追加|
|fix|バグ修正など|
|perf|パフォーマンス対応|
|refactor|リファクタ|
|style|誤記修正、スペルミス修正等（ソースコードの挙動に影響がないもの）|

コミットをするときも、今までいた会社でよくないなあ・・・って思ったコミットコメントが
```
update
```
っていう、こういうコミットですね。
**なんの対応したのか全然わからん**っていう。
もっと文章で書きなさいよ、っていうツッコミまちのコミットありますよね。
ああいうコミット文章だけは避けてもらうことにしました。

## MR時のコメントのprefix
これを入れることで、どんな意図でツッコミをしてくれているのか、明確にします。

|prefix|説明|
|--|--|
|imo|私の意見では。in my opinion|
|must|必須でやってもらえると|
|want|やってもらえたら嬉しい|
|nits|nitpick 細かい指摘だが|
|q|質問|
|typo|スペルミス|
|tbd|to be determined 後で決める|

## MR時のテンプレート
これも一応用意しました。
あったほうが楽かな〜って部分があったので。
ただし、あったほうがいいなというのは、どちらかというと自動的なレビュワー指定ですね。

テンプレート作成の方法自体は、gitlabかgithubによってお作法は少し違いますが、
テンプレートの中で、
@ほげほげ のように記述すれば、メンションされてレビュワー指定が自動的にできるようになるので便利です。
ただし、チームが流動的に変わってしまう場合だと少し難儀かな。

# 運用してみて
そこそこルール化したので、masterへのpushしちゃう文化に少し染まってたけど、大丈夫かな？ってのはありましたが、masterへの直pushを設定で禁止することで、`MRを否が応でも出さないといけないもの`にしました。

これの場合なるはやで対応するのが難しくなる部分は、まああります。
ただ、コードの品質の担保をしたり、チームでのMR、それに対してのツッコミ、を活発化する上ではなくてはならないものかな〜と。
そもそも、誰も見てくれてないのに、masterにpushって、怖いでしょ？っていう布教が必要というか。

導入はしてよかったなと思います。
次は、コーディング規約に対して、自動的に設定できるツール選定や、仕組みをやりたいところですね。
で、MR出す前に、そこがciで自動チェック入るような感じにしたいかなあ。
UE5 Plugin Runtime DataTable 設定メモ

Runtime DataTable

https://www.unrealengine.com/marketplace/ja/product/runtime-datatable


https://console.cloud.google.com/apis/dashboard
Projectの作成

ライブラリでGoogle Sheets APIを追加

認証情報
サービスアカウントを作成
　サービスアカウントのキー
　　鍵を追加　Jsonで作成

xxxxxxxx.jsonをSavedフォルダに配置