OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】実機で動作確認やテストが出来るように設定する

### **環境**
- Macbook Air M2
- Galaxy S22 SCG13

### **作業**
まずは、デベロッパー（開発者）モードになる必要があります。
「設定」→「端末情報」→「ソフトウェア情報」→「ビルド番号」（この項目を7回クリック）

:::note warn
機種によって操作が若干変わる為、詳しくは機種のマニュアルなどをご参照下さい。
:::

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/f78c4d92-6155-e2f2-1243-d3bb42266b0b.png)

デベロッパーモードが有効になったら、「開発者オプション」と言う項目が追加されます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/d14c41f7-e76b-168e-8342-6a76886242ea.png)

作業PCと実機をUSBケーブルで接続しデバッグの許可をします。
Mac にも接続の許可をしていいか確認のポップアップが表示されるので合わせて許可を押下。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/f000d583-8080-e960-7cf2-e1493633d537.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/b37c5b85-e472-2f2d-3fdd-4dca607e9806.png)

デバイスが選択できるようになっている事が確認できます。

```dart
% flutter devices
Found 3 connected devices:
  SCG13 (mobile)  • R5CW42EY13V • android-arm64  • Android 13 (API 33)
  macOS (desktop) • macos       • darwin-arm64   • macOS 14.0 23A344 darwin-arm64
  Chrome (web)    • chrome      • web-javascript • Google Chrome 120.0.6099.199

%
```

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/b9bb78c4-e233-ecf7-aead-95049a8f1804.png)

デバッグの実行をすると、スマートフォンに Flutter プロジェクトのアプリがインストールされ、自動的にアプリが立ち上がります。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/499f93b9-2802-1b42-8570-1f8f66c3f604.png)
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/792915e5-3e34-1213-e5b0-86dc85746513.jpeg)

【おまけ】インストールされた Flutter プロジェクトのアプリ
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/76d830b3-46f8-f603-792d-55e2bf956d85.jpeg)

以上。
Beam subjected to moment load 第6章 はりのたわみと不静定はり 基本例題6.04 P158「材料力学演習(20221021)」をsympyでやってみたい。

# latexで(勉強中)
・[基本事項１（はりのたわみ）p155 (pdf)]( http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=163)より
 ```math
\dfrac{d^{2}y}{dx^{2}}=\dfrac{M}{EI_{z}}
```
 # オリジナル
[基本例題6.04 P158 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=163)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　
# sympyで
・ver0.1
```python
# ver0.1
# 基本例題6.04 P158
from sympy import *

var('P,l,EIz,vA,vC,x,a,z,MC',real=True)
θA = Symbol('θA')
θC = Symbol('θC')
RA  = Symbol('RA')
repxz={x:z}
repxa={x:a}
repxl={x:l}
repvA={vA:0}
repRA={RA:MC/l}
zax  =(z,a,x)
# 
MAC=RA*x                                                            ;print("# MAC =",MAC)
MCB=RA*x-MC                                                         ;print("# MCB =",MCB)
# 
θAC=θA-integrate(MAC/EIz,x)                                       ;print("# θAC=",θAC)
vAC =vA+integrate(θAC   ,x)                                        ;print("# vAC=",vAC)   ;print()
# 
θCB= θC                                                      \
     -integrate((MCB       /EIz   ).subs(repxz),zax).factor()        ;print("# θCB =",θCB)
vCB=  vC                                                     \
     + +integrate( θCB.subs(repxz),zax).factor()                   ;print("# vCB =",vCB)  ;print()
θCa=θAC.subs(repxa)                                               ;print("# θC =",θCa)
vCa=vAC.subs(repxa)                                                 ;print("# vC  =",vCa)  ;print()
# 
vCB=vCB.subs({vC:vCa}).subs({θC:θCa})                             ;print("# vCB =",vCB)  ;print()
# 
sol=solve(vCB.subs(repxl),θA)[0].subs(repvA).subs(repRA).factor()  ;print("# θA =",sol)
# MAC = RA*x
# MCB = -MC + RA*x
# θAC= θA - RA*x**2/(2*EIz)
# vAC= vA + x*θA - RA*x**3/(6*EIz)

# θCB = θC - (-a + x)*(-2*MC + RA*a + RA*x)/(2*EIz)
# vCB = vC - (-a + x)*(-6*EIz*θC + 3*MC*a - 3*MC*x - 2*RA*a**2 + RA*a*x + RA*x**2)/(6*EIz)

# θC = θA - RA*a**2/(2*EIz)
# vC  = a*θA + vA - RA*a**3/(6*EIz)

# vCB = a*θA + vA - RA*a**3/(6*EIz) - (-a + x)*(-6*EIz*(θA - RA*a**2/(2*EIz)) + 3*MC*a - 3*MC*x - 2*RA*a**2 + RA*a*x + RA*x**2)/(6*EIz)

# θA = -MC*(3*a**2 - 6*a*l + 2*l**2)/(6*EIz*l)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)



# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
抽選ツール⑤

***抽選ツール***を改良し、最初から配列に抽選対象者とお題を定義して、配列をランダムに並び替え、抽選者のお題を発表するよう、抽選ツールを改良しました。

```python3
####################################################
###   お題抽選ツール
###
####################################################

#ランダムモジュールを呼び出す
import random
# エクセルへの書き込みモジュールを呼び出す
import openpyxl
# 関連付けられたアプリケーションでファイルを開くモジュールを呼び出す
import subprocess
# 非同期処理用モジュールを呼び出す
import asyncio
# タイムモジュールを呼び出す
import time
# システムモジュールを呼び出す
import sys

#配列を定義する
array1 = ["大園玲","小坂菜緒","正源司陽子","守屋麗奈","佐々木久美","山下瞳月","佐々木美玲","梅澤美波","筒井あやめ","遠藤さくら","中西アルノ","村井優","井上和","丹生明星","小林由依","山﨑天"]

array2 = ["好きな小説家","好きなお笑い芸人","好きなファッションブランド","好きなコスメブランド","好きな赤文字系ファッション雑誌","好きなロックバンド","住みたい街","好きなランニングシューズ","好きなおにぎりの具","納豆餅に使う納豆は小粒派、ひきわり派","PCはWindows派、mac派、Linux派?","一度は行きたい国","好きなゲーム","手軽にできる料理","初心者にお薦めのプログラミング言語","初詣でおみくじを引く?"]

#エクセルファイルのファイル名変数
out_file = "odai.xlsx"
wb = openpyxl.load_workbook(out_file)
#書き込むワークシートを定義する
ws = wb['select']
#行数の定義
start_row = 3
# 待ち時間変数
sleep_time = 10
#演出待ち時間変数
play_time = 2

# 非同期処理で1秒後に「抽選結果の発表です」を出力し、９秒待つ
async def start_msg():

  print("抽選結果の発表です")
  div1()
  await asyncio.sleep(sleep_time)

# 非同期処理で10秒間演出する
async def message_out():
    for k in range(0,5):
      await asyncio.sleep(play_time)
      print("ﾄﾞﾗ" * 20)
      div1()


async def main():

  task1 = asyncio.create_task(
        start_msg()
  )

  task2 = asyncio.create_task(
        message_out()
  )

  print(f"started at {time.strftime('%X')}")
  await task1
  await task2
  print(f"ended at {time.strftime('%X')}")

#配列の数の比較関数
def array_count(num1,num2):
    if num1 == num2:
      return "OK"
    else:
      return "NG"

def div1():
  print("=" * 40)


ans =  array_count(len(array1),len(array2))
if ans == "NG":
  print("人数とお題のタイトル数が違うので、array1とarray2の数を合わせてください")
  sys.exit()

N = len(array1)

#配列の要素をランダムに並べる
random_array1 = random.sample(list(set(array1)),N)
random_array2 = random.sample(list(set(array2)),N)


#ランダムに並べた名前を1行ずつエクセルファイルに出力する。
for k in range(0,N,1):
  man1 = random_array1[k]
  title1 = random_array2[k]
  try:
    with open(out_file,mode='a') as f:
      #エクセルファイルに追記モードで書き込む
      ws.cell(row=start_row,column=2).value = man1
      ws.cell(row=start_row,column=3).value = title1
      start_row += 1
  except:
    print("エクセルファイルが開いたままです。閉じてください")
    exit()

#エクセルファイルを保存する
wb.save(out_file)

# 非同期処理で
asyncio.run(main())


#エクセルファイルを開く
subprocess.Popen(['start',r'odai.xlsx'],shell=True)
```
VRChat初心者（プレイ半年）にオススメのゲームワールド



１，VR福笑い
みんなで福笑いができます
作ってる途中の福笑いも皆で別室で見れます
ペンあり
https://en.vrcw.net/world/detail/wrld_150c7788-d3d9-4d68-96c8-14dc097826a9



２，Justひよこ鑑別師
https://en.vrcw.net/world/detail/wrld_2dc33e87-39ca-4e93-95b4-3956070892c0

３，Magic Freeze Tag
https://vrchat.com/home/world/wrld_b2c574c6-9a6e-4bcc-b74e-1284070c324f
氷鬼のワールド、大人数向き
みんなでワイワイできます

４，DORO-K!
どろけい（けいどろ）のワールド
https://vrchat.com/home/world/wrld_5aa04247-47b3-4001-9049-2230e6fe421d
大人数でワイワイ
警察改変アバターで行っても面白いかも

５，Spy Check?ǃ
https://vrchat.com/home/world/wrld_e6f6d83c-416f-47bd-8f3a-149701d9790e
人狼系のワールド
スパイを見つけるワールド
スパイになっちゃった人はうまく隠し通そう
たくみにだませ・・！
少人数までのワールド
たしか４～６人までだったと思う

６，激論！朝までそれ正解Q
https://vrchat.com/home/world/wrld_44ba13c4-8c83-45be-ab62-471a980cc68a
「学校に欠かせない『ユ』からはじまるものは？」みたいな質問が出てきます
各々の答えが違っていて面白いです
みんなで答えのないお題に対してみんなの投票で答えを決めていくワールド
個人的にはすごく面白く感じました
２～８人むき


７，マーダー
https://vrchat.com/home/world/wrld_858dfdfc-1b48-4e1e-8a43-f0edc611e5fe
いわずとしれた大人気ワールド
VRChatter一回はやったことある説
人狼とアクションをくみあわせたようなゲームです
マーダー（殺人鬼）はマーダーってバレないように全員殺すのが役目
マーダー以外はマーダーを特定するのが役目
銃、血、罠、ナイフ等が出てくるのでVR感度がある人には注意を促してあげてください
大人数でワイワイ向け

８．BOMBERio（ボンバリオ）
爆弾による陣取りゲーム
https://www.vrcw.net/world/detail/wrld_98422193-2ddd-4af4-bd97-ab5609a46785
爆弾や炎がでてくるのでVR感度がある人には注意を促してあげてください
バトルロワイヤル式
優勝すると一人のアバターがデカデカとのります
せっかくなんで写真をとってSNSにのせましょ～
複数人でワイワイ向け

９，TonboBattlefield 2˸ The Two Bases
トンボバトルフィールド、通称トンバト
複数人でワイワイ向け
いろんな武器を使いながら相手をたおします
２つのチームに分かれて戦います
盾があったり回復があったり、パワーアップの武器があったりします

１０，プリズンエスケープ
プリズンブレイクみたいなワールドらしいです（フレンド談）
私はいったことがないので割愛
一時期めっちゃはやってた
https://www.vrcw.net/world/detail/wrld_14750dd6-26a1-4edb-ae67-cac5bcd9ed6a

１１，「tower of nowhere」
通称TON
ホラーワールドが苦手な人は行かない方がいいです
ホラーキャラにおっかけられて、時間内に逃げたら成功
時間内につかまったら負け
大人数でワイワイ向け
ジャンプスケアを無しにしたり、流血表現をなしにできたりします
ただ怖いのは怖いのでホラワ苦手な人はいかないほうがいいと思います
敵に勝っていくと、お金がたまっていき、お金がたまると、ショップで新しいコイルに替えることができます
スピードコイル（移動速度が速い）とかね
git statusコマンドには git status -uall をつけとくと何かと安全

日頃の習慣としてGitの操作でAddしてCommitする前には`git status`でどのファイルが変更されたことになっているか確認しておいたほうが良いものです。

```
$ git status
On branch aaa-bbb-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   docker-compose.yml
        modified:   frontend/src/bbb.tsx

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        node/
        frontend/src/aaa.tsx
```

`git status`コマンドに特にオプションをつけないと上記のような表示になります。この時、新規に作成したディレクトリの`node/`は展開されていません。実はこのディレクトリはNode.jsのサーバー一式で、Git管理下に置きたくない`node_modules/`ディレクトリが存在するのですが`.gitignore`に追加し忘れている状態です。こういったGit管理下に置きたくないものの存在を`git status`コマンドで確認するためには`-uall`をつけます。`-uall`をつけるとディレクトリが展開されて表示されます。

```
$ git status -uall
On branch aaa-bbb-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   docker-compose.yml
        modified:   frontend/src/bbb.tsx

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        node/.gitignore
        node/Dockerfile
        node/node_modules/.bin/mime
        node/node_modules/.package-lock.json
...略
```

このように`git status -uall`であればUntracked filesなディレクトリの中のファイルも表示されるのでうっかり不要なファイルのCommitや`.gitignore`の設定ミスに気が付けるでしょう。
pythonでゲームを作る

pythonでゲームを作っていきたいと思います。
今回使うのは”pygame”を使っていきたいと思います
# pygameの使い方
## 1.install
まずインストールしなければなりません。ダウンロードするには`pip install pygame`
を使います。
## 2.とりあいずウィンドウを作る
ウィンドウを作る方法を教えます
```python:system.py
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("game")
run = True
while run: 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
```
この.pyを起動するとこうなるはずです。![スクリーンショット 2024-01-11 163521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672911/e0570dc0-b8d5-c63a-5629-1e887ea55ee3.png)
では説明をしていきます
`import pygame`はpygameをインポートします。これをしないとだめです。
`pygame.init()`で初期化をしますこれもしないとエラーが出ます
`screen = pygame.display.set_mode((800,600))`はウィンドウをピクセル数((中))この中に入れた数字を作ります
`pygame.display.set_caption("game")`はウィンドウの名前です（"ここに書いて"）
``` python:while文.py
while run: 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
```
これで×マークを押したら消えるプログラムです。消えさせるだけでもたいへんですね
## 次は背景・文字を書いていきます
### 文字の書き方
文字の書き方はこうなります
```python:system.py
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
#フォントを設定する
font = pygame.font.Font(None, 36)
text = "Debug test"
color = (255, 255, 255)
antialias = True
#フォントを使いタイトルテキストを作る
tital = font.render(text, antialias, color)

run = True
while run: 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    #タイトルテキストを表示する
    screen.blit(tital, (100, 100))
    pygame.display.update()
```
となりますこれを起動すると
先ほどの画面に　debug test と出るはずです
### 背景
背景を変えるに`fill`を使います。ソースコード☟
```python:system.py
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
font = pygame.font.Font(None, 36)
text = "Debug test"
color = (255, 255, 255)
antialias = True
tital = font.render(text, antialias, color)
screen.fill((0,250,0))
run = True
while run: 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    screen.blit(tital, (100, 100))
    pygame.display.update()
```
これを実行すると背景が緑になるはずです。
次の記事は投稿2か月後までフォローが1でも増えたら出します
Xやっていますフォローお願いします
[X_kuma](https://twitter.com/20cKumapy41550)
NPS + WiFi + 802.1x 認証 (EAP-TLS) クライアント側の設定

# はじめに
802.1x認証 - EAP-TLS または PEAP (EAP-TLS) の WiFi アクセスポイントに接続する際に必要な Windows クライアント 側 の設定です。

サーバーや WiFi-AP 側 の設定については、以下の記事を参照してください。

https://qiita.com/carol0226/items/149503bf49810942da5a

:::note warn
1～3 章 の作業は、PC 毎に いちいちやっていられませんよね？
なので、PC 単体で 接続テスト が成功したら、2章 , 3 章 の設定は GPO を使って配布するのが ベストプラクティス です。
:::

# 1. NT Auth ストア に ルート証明書 を インポート する
NT Auth ストア に ルート証明書 の 拇印 が登録されていることが確認できれば OK です。
※PEAP (MS-CHAPv2) から構成変更する場合は、既に 本作業が完了している場合があります。

ドメインコントローラー にて、以下の記事に記載された対処を行ってください。
ドメイン に参加した PC にも反映されます。
WORKGROUP の PC の場合は、各マシンごとに対応が必要です。その場合の手順も、以下の記事に記載してあります。

https://qiita.com/carol0226/items/5dde4fe77220f4388945

# 2. クライアント の 信頼されたルート証明機関 へ ルート証明書 を インポート する
"接続テスト用" または "運用向け" いずれかの方法を実装し、各クライアントの 信頼されたルート証明機関 に ルート証明書 が存在する状態であれば、OK です。
※PEAP (MS-CHAPv2) から構成変更する場合は、既に 本作業が完了している場合があります。

### 2-1. ルート証明書 の 単体 PC 用手順（接続テスト用）
NPS 用 サーバー証明書 と ペア となった ルート証明書 が、クライアント の「信頼されたルート証明機関」にインポートされている必要があります。

以下の記事を参照し、クライアント の 信頼されたルート証明機関 へ ルート証明書 をインポートしてください。

https://qiita.com/carol0226/items/33042c5c639c79832aeb

:::note info
AD CS で、HTTP のファイアウォールが許可されて、クライアントPC がドメイン参加 されていれば、クライアント の ブラウザ で 直接　AD CS の IP に接続して クライアント証明書 を ダウンロードすることもできます。
:::

### 2-2. ルート証明書 の GPO 配布方法（運用向け）
（公開情報：グループポリシー を使用してクライアントコンピューターに証明書を配布する）

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-fs/deployment/distribute-certificates-to-client-computers-by-using-group-policy

## 3. WiFi プロファイルの設定
"接続テスト用" または "運用向け" いずれかの方法を実装し、WiFi プロファイルを作成します。
※ PEAP (MS-CHAPv2) から構成変更する場合は、旧 WiFiプロファイルを削除してから 新規構成 してください。

### 3-1. WiFi プロファイル の 単体 PC 用手順（接続テスト用）
以下の記事を参考に、EAP-TLS または PEAP (EAP-TLS) で接続するための WiFi プロファイルを作成します。

https://qiita.com/carol0226/items/7612910f3ddfafa96d6f

:::note warn
（重要）
WiFi プロファイルは、一度 WiFi-AP に接続されると そのまま PC 内に保存されて、以後 同じ SSID に接続する際に転用されます。
接続しなおす テスト等 を行う場合は、毎回 WiFi プロファイル を 削除してください。
- netsh wlan show profile で、プロファイル を一覧表示
- netsh wlan delete profile = [プロファイル名] で、プロファイル を削除

※ GUI でも 接続中の WiFi 名 を、右クリックして "削除" できます。

コマンドの実行例は、以下のリンク先で確認してください。
https://qiita.com/carol0226/items/0aa29d3a3004f5241012#コマンドでの確認方法
:::

### 3-2. WiFi プロファイル の GPO 配布方法（運用向け）
（公開情報：Windows で EAP プロファイルを構成する）
グループ ポリシー エディター (デスクトップとサーバー)
→　この章の手順で WiFi プロファイル を GPO で配布します。

https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/extensible-authentication-protocol/configure-eap-profiles?tabs=netsh-wifi%2Cpowershell-vpn%2Csettings-wifi%2Cgroup-policy-wifi#group-policy-editor-desktop-and-server

# 4. 証明書の失効確認の無効化（オプション）
802.1x 認証は、PC がネットワークに接続する前に行われる アクション です。
クライアント と NPS サーバー間 の通信では、サーバー証明書 が使われます。
クライアントは、NPS サーバー から受け取った サーバー証明書 の失効確認を行います（証明書認証の一般的なプロセスとして）
しかし、そのタイミングでは、 失効リスト (CRL) へアクセスする事が叶わず、失効確認エラー となることがあります（基本的には、CRL のキャッシュが使われて 問題が出ないハズが、100% そうもいかない場合があるらしい）
すると、802.1x 認証が成立せず、WiFi に接続できない事態に陥ります。

そのため、クライアントPC 側で、サーバー証明書 を 失効確認 することなく受け入れる構成を行っておくことで、接続を安定させられます。

各クライアントPC 上で、以下の公開情報に記載されているレジストリ（NoRevocationCheck）キーに、値 "1" を設定してください。

https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/nps/network-policy-server-certificate-revocation-list-check-registry-settings?tabs=registry-editor

→　この記事は、NPS サーバー側の処理について記載されていますが、作業をするのは、クライアントPC 上のレジストリです。
TiDB Docs Dash! TiDBのドキュメント改善に貢献しよう

だいぶ遅めのご挨拶ですが、明けましておめでとうございます。
長めのお休みを取っている間に、TiDBのドキュメント改善イベントの [TiDB Docs Dash](https://www.pingcap.com/event/tidb-docs-dash/)が始まってしまっていました。

あと残り一日しかありませんが、このイベントとイベントへの参加方法について紹介します。GitHubでのpull requestの送り方などは同じですので、イベント後もTiDB Docsの更新に役立てて頂ければと思います。

## TiDB Docs Dashとは？

TiDB Docs DashはTiDBのドキュメントに関する様々なIssueの解消を皆で競って実施しようというものです。このイベントのためにIssueリストが整理されており、このIssueを手伝ったり修正のPRを送ったりするとポイントがもらえ、優秀者には豪華賞品が出るようです。期間は 1/12の16:59 JSTまでとなっています。

### 参加方法

[こちら](https://github.com/orgs/pingcap/projects/51/views/3)にIssue Listがあります。今回対象のドキュメントは英語版と中国語版がありますので、得意な方のIssueを参照してください。

やってみたいと思ったIssueの詳細画面を開いて、コメント欄で `/assign` と書いたらそのIssueの担当者となれます。

Issueにはカテゴリがあり、
* Debug - ドキュメントに記載のチュートリアルや設定を試して、実際にその通り動くか検証する。問題あれば修正してPR.
* Translate - 中国語/英語の翻訳を手伝う
* Enrich - 該当ドキュメントに加筆する
* Resolve existing Document issues - 既存のドキュメントの問題を修正する。既に問題ありと分かっているのですが修正が追いついていないドキュメントを直します。
* Improve documentation CI/HTML/PDF - ドキュメントの生成パイプラインの修正。

もちろん、これ以外にも問題があればそちらを修正しても問題ありません。Typoなどもどんどん見つけましょう！

### 商品

* 参加した全ての人のGitHubプロファイルに記載できるデジタルバッジ
* その他商品はイベントサイトを確認してください。

## PRの送り方

さて、実際にdocsを修正した後にPRはどう送ったらいいのでしょうか。詳細なやり方は [Contributer Guide](https://github.com/pingcap/docs/blob/master/CONTRIBUTING.md) に記載がありますが、ここではかいつまんで説明します。

1. CLA [Contributer License Agreement](https://cla-assistant.io/pingcap/docs)に同意する
    ライセンス条項を読んで最後の方にある同意ボタンを押します。

2. [docsリポジトリ]((https://github.com/pingcap/docs)をForkする

3. ローカルにforkしたリポジトリをcloneする
    ```bash
    git clone git@github.com:$user/docs.git # "$user"を自分のgithub idで置き換え

    cd $working_dir/docs
    git remote add upstream git@github.com:pingcap/docs.git # Adds the upstream repo
    git remote -v # 確認
    ```

4. ブランチを作成
    上流の最新版においついていることを確認して、ブランチを作成します。
    ```bash
    cd $working_dir/docs
    git fetch upstream
    git checkout master
    git rebase upstream/master
    git checkout -b <新しいブランチ名>
    ```

5. 修正を加えてコミット
    コミットメッセージの[スタイルガイド](https://github.com/pingcap/community/blob/master/contributors/commit-message-pr-style.md#pull-request-title-style)もあります。
    ```bash
    git status # Checks the local status
    git add <file> ... 
    git commit -m "commit-message: update the xx"
    ```
    
6. ブランチが上流と同期していることを確認してpush
    ```bash
    git fetch upstream
    git rebase upstream/master
    git push -u origin <新しいブランチ名>
    ```
    pushした後にPull Requestへのリンクが表示されると思うので、pull requestを作成します。

7.  Pull Requestを送る
    Pull Requestを送る際にブランチを指定しますが、TiDBの特定のバージョンに関する記載出ない限りmasterを指定すればOKです。
    Pull Requestの依頼メッセージにはテンプレートが差し込まれているので、テンプレートに沿って記載してください。

是非チャレンジしてみてください！
glob関数が実装されないときの対処法（頻度極少）

pythonを使用してExcelの自動処理について勉強している中、
glob関数を使用するときに躓いた箇所があったため、備忘録として残しておく

# glob関数とは
ディレクトリに格納されたファイル名を抽出する関数
引数に抽出条件を指定することができる。

例
globフォルダ内のファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528652/308c922f-da38-f969-b8df-818f847b1b52.png)

この中からExcelファイル（拡張子".xlsx"）のみ抽出したいとすると、以下コードを実行することで実行結果の通り抽出することができる。
※抽出条件に記載されている"*"は、正規表現で「直前の1文字の0回以上の繰り返し」を表現している。

```python:glob_test.py
import glob
files=glob.glob("*.xlsx")
print(files)
```

```batch:実行結果
['age_year.xlsx', 'cellname.xlsx', 'data_type.xlsx', 'hello.xlsx']
```

# エラーの内容
上記glob_test.pyの内容と全く同じ内容のglob.pyを用意し、実行してみた。
すると、下記の通りエラーが発生する。

```batch:実行結果
Traceback (most recent call last):
  File "<フォルダパス>\glob.py", line 1, in <module>
    import glob
    ^^^^^^^^^^^
  File "<フォルダパス>\glob.py", line 2, in <module>
    files=glob.glob("*.xlsx")
          ^^^^^^^^^^^^^^^^^^^
TypeError: 'module' object is not callable
```
"TypeError"の意味としては、モジュールが呼び出されていないとのこと。
つまりこのコードを「glob.py」という名前で保存してしまうと、インポートをする際に、標準ライブラリのglobではなく、このファイルを呼び出してしまうことになるのだ。
その為、glob関数を使用する際は、ファイル名を「glob.py」以外にすることで正常に実行することができる。
Excel VBAのパフォーマンス改善

## コピー＆ペーストは思っている以上に処理時間が掛かる
以下のサイトがとても参考になる
https://officedic.com/excel-vba-copy-paste-highspeed/
コピー元セルが数式を含んだものであったりするとより違いが出る

```VB:変更前
Cells(1, 1).Copy
Cells(2, 1).PasteSpecial
Cells(3, 1).PasteSpecial
Cells(4, 1).PasteSpecial
Cells(5, 1).PasteSpecial
```

```VB:変更後
Cells(1, 1).Copy
Range(Cells(2, 1), Cells(5, 1)).PasteSpecial
```
swift closure の weak self について、参考にしたい記事

こちらの記事とてもお気に入り。

たまに他の人にも紹介したいのだけど、検索して引っかからなかったりすることがあるので
ここに残しておく
https://medium.com/@almalehdev/you-dont-always-need-weak-self-a778bec505ef
【Rails】fly.ioでコンソールを使ってDBに初期データを保存する方法


### 概要
開発環境ごとにデータベースが作られているため、デプロイ後、ローカル環境で作成していた初期データを本番環境にて作成する必要がありました。
 そのときに「fly.io上でコンソールを使ってデータを作成する方法」を実施したので、その方法を記載します。
 
 今回は、以下の２つのパターン挙げます。
　　　　
　　　　①Rakeタスクの実行（csvファイル読み込みのため）
　　　　②seedファイルの読み込み



※ 事前にfly.ioへのデプロイを完了し、データのもととなるcsvファイル及びseedファイル、読み込みのためのRakeタスクについては作成済みとします。

#### 環境
Rails 7.08
Ruby 3.1.4
Fly.io
Docker利用なし


### fly.ioでコンソールの立ち上げ (共通)

```
$ flyctl console 
```
（事前にflyctlのインストールを実施しておく。https://fly.io/docs/hands-on/）


### ①Rakeタスクの実行（csvファイル読み込みのため）


fly.ioで起動したコンソール上でRakeタスクを実行します。


```
irb(main):001:0> Rails.application.load_tasks
=> #<アプリケーション名::Application>

irb(main):002:0> Rake::Task['namescope名:タスク名'].execute
path: /rails/db/csv/ファイル名.csv
start to create xxxx data
completed!!
```


### ②seedファイルの読み込み

fly.ioで起動したコンソール上で、seedファイルをloadで読み込みます。
```
irb(main):003:0> load 'db/seed.rb'
（略）
=> true
```

### 終わりに
デプロイ先が異なっても基本的な考え方は変わらないため、今回の方法は、応用が可能かと思いました。
なお、記載内容に不十分な点などがございましたら、ご指摘いただけますと幸いです。



### 参考記事
[RailsでのCSVデータ投入](https://qiita.com/yoshito410kam/items/40b675760bd8a1f8e728)
[RailsでRakeタスクをconsoleから呼び出す方法](https://qiita.com/tamano/items/385350ef664e07fe7655)

### 参考サイト
- データベースが開発環境ごとに別れている話について　
https://pikawaka.com/curriculums/web-service-development/rails-database-setting#環境単位の設定

- Ruby3.3リファレンスマニュアル　instance method Rake::Task#execute
https://docs.ruby-lang.org/ja/latest/method/Rake=3a=3aTask/i/execute.html
Next.js + ECS で発生する "Error: getaddrinfo ENOTFOUND" の対応

# はじめに

Next.js v14 App routerへの移行をしてECSにデプロイした時に、タイトルのエラーが発生しました。
ローカルでDockerビルドして起動した場合は発生しなかったが、ECS上では発生して解決に時間がかかったのでまとめます

# 問題

### エラー内容

```tex
⨯ Failed to start server
Error: getaddrinfo ENOTFOUND xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) {
  errno: -3008,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx'
}
```

### Dockerファイル

```docker
# https://blog.tericcabrel.com/create-docker-image-nextjs-application/
# https://pnpm.io/cli/fetch

FROM node:20.10-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app

RUN npm install -g pnpm@8
COPY pnpm-lock.yaml ./
ADD . ./
RUN pnpm install --frozen-lockfile

FROM node:20.10-alpine AS builder
RUN npm install -g pnpm@8

WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN pnpm build

FROM node:20.10-alpine AS runner
WORKDIR /app
ENV NODE_ENV production

RUN apk add curl \
    && addgroup --system --gid 1001 hogegroup \
    && adduser --system --uid 1001 hogeuser

COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=hogeuser:hogegroup /app/.next/standalone ./
COPY --from=builder --chown=hogeuser:hogegroup /app/.next/static ./.next/static

USER hogeuser
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
```

### 使用ツールバージョン

- node: 20.10
- pnpm: 8.12.1
- Next.js: 14.0.4
- React: 18.2.0

# 解決方法

Node.jsのENOTFOUND例外は、DNSエラーのためにドメインへの接続を確立できないときに発生します。一般的には、ホスト値が正しくないか、localhostを127.0.0.1に不適切にマッピングしているか、ドメイン名にタイプミスがある場合に発生します。

今回はhostnameにECSのタスクIDが入ってしまうバグのようです。

https://github.com/vercel/next.js/issues/58657

以下のように修正したところ起動するようになりました。

```dockerfile
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
- CMD ["node", "server.js"]
+ CMD HOSTNAME="0.0.0.0" node server.js
```

# おわりに

まだ、Next.js App Routerちらほらバグがありそうで辛さありますね。

# 参考

- https://github.com/vercel/next.js/issues/58657
SPAなページのWKWebViewでピンチイン・ピンチアウトなどのズーム処理が効かない件の対応

## 背景
WKWebviewでSPAなページだとピンチイン・ピンチアウトによる拡大・縮小処理が動作しないことがあった。
デフォルト設定では拡大縮小が有効なはずで、ためしに`https://www.google.co.jp/`を読み込ませると問題なく拡大・縮小できていた。

## 対応
[ignoresViewportScaleLimits](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/2274633-ignoresviewportscalelimits)を設定する。

```
let config = WKWebViewConfiguration()
config.ignoresViewportScaleLimits = true

webView = WKWebView(frame: .zero, configuration: config)
```

## お悩み
- SPAのように画面要素が動的に入れ替わるものはユーザーによるズーム制御を抑制している場合があるのか？
- SPAで拡大縮小を繰り返しているとWebプロセス側がクラッシュすることがある。※対象ページは動画や画像が多め
```
0x11f001fa0 - [PID=26962] WebProcessProxy::didClose: (web process 0 crash)
0x11f001fa0 - [PID=26962] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=Crash
0x10e01c420 - ProcessAssertion: Failed to acquire RBS Background assertion 'XPCConnectionTerminationWatchdog' for process because PID 0 is invalid
0x10e01c420 - ProcessAssertion::acquireSync Failed to acquire RBS assertion 'XPCConnectionTerminationWatchdog' for process with PID=0, error: (null)
0x1060c8018 - [pageProxyID=14, webPageID=15, PID=26962] WebPageProxy::processDidTerminate: (pid 26962), reason=Crash
0x1060c8018 - [pageProxyID=14, webPageID=15, PID=26962] WebPageProxy::dispatchProcessDidTerminate: reason=Crash
Could not signal service com.apple.WebKit.GPU: 1: Operation not permitted
0x11f000e40 - GPUProcessProxy::gpuProcessExited: reason=IdleExit
0x11f002650 - [PID=0] WebProcessProxy::gpuProcessExited: reason=IdleExit
```

```
0x11f001470 - [PID=32027] WebProcessProxy::didClose: (web process 32027 crash)
0x11f001470 - [PID=32027] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=Crash
0x10e01c2a0 - ProcessAssertion: Failed to acquire RBS Background assertion 'XPCConnectionTerminationWatchdog' for process because PID 0 is invalid
0x10e01c2a0 - ProcessAssertion::acquireSync Failed to acquire RBS assertion 'XPCConnectionTerminationWatchdog' for process with PID=0, error: (null)
0x1058ae018 - [pageProxyID=14, webPageID=15, PID=32027] WebPageProxy::processDidTerminate: (pid 32027), reason=Crash
0x1058ae018 - [pageProxyID=14, webPageID=15, PID=32027] WebPageProxy::dispatchProcessDidTerminate: reason=Crash
0x1058ae018 - [pageProxyID=14, webPageID=15, PID=32027] WebPageProxy::tryReloadAfterProcessTermination: process crashed and the client did not handle it, not reloading the page because we reached the maximum number of attempts
```

## 参考
- [ignoresViewportScaleLimits](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/2274633-ignoresviewportscalelimits)
- [WKWebViewでPinchZoomを有効にする方法](https://qiita.com/horitaku46/items/90bc496299bcd2141672)
- [Prevents the zoom of the viewport by successive tap of the button in iOS 10 Safari.](https://qiita.com/uupaa/items/8e1cfe239974ac58b51e)
- [SPAのWebデザイン](https://bm.s5-style.com/category/technic/spa)
Unity 無料で使える便利なAsset "Hierarchyビュー色分け"　

# 概要
みなさん、***Hierarchyビュー*** の項目が増えて見にくくなってませんか？
そのなあなたに今回紹介するアセットがこちらです。
https://assetstore.unity.com/packages/tools/utilities/colourful-hierarchy-category-gameobject-205934?locale=ja-JP
※Unity のすべてのバージョンで動作します。
![7338f806-1171-4c41-adde-970db69e4a00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673357/b2c19aeb-9950-401e-d460-5fc955a75dcf.png)

# 使い方

①まずは上のURLからアセットをUnityに**インポート**してください。


②すると、**M Studio** というフォルダができるので、
その中の **Colourful Hierarchy Category GameObject** の中の 
**Color Palette**をクリックして下さい。

![testQ1 - SampleScene - Windows, Mac, Linux - Unity 2022.3.13f1 _DX11_ 2024_01_11 14_23_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673357/18a8c75f-46ed-e946-2c5e-941f3ca98b73.png)

③すると右側のInspector ウィンドウの **Color Designs** で色などが設定できます。

![testQ1 - SampleScene - Windows, Mac, Linux - Unity 2022.3.13f1 _DX11_ 2024_01_11 14_38_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673357/012aa3fa-33bf-48df-1e60-fc5a179bfa6e.png)

Key Char| 自分が分かりやすいやつに変更してもOK|
:-|:--|
Text Color|文字の色
Background Color|背景色
Text Alignment|文字の位置
Font Style|書体

④試しに**Main Camera**の先頭に　//　を付けてみます。

![testQ1 - SampleScene - Windows, Mac, Linux - Unity 2022.3.13f1_ _DX11_ 2024_01_11 15_13_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673357/1259547a-a532-6bbc-d7b8-fad8bb254a8f.png)

⑤すると、設定した色に変更されました！
※もし変わらない場合は、エディタを実行してみると変わります。

![testQ1 - SampleScene - Windows, Mac, Linux - Unity 2022.3.13f1_ _DX11_ 2024_01_11 15_12_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673357/2c5970b5-a075-3804-b677-afc97d51ee12.png)

# おわりに

とても簡単に Hierarchy の色設定ができました。先頭に記号をつけるだけなので、
ぜひみなさんも使ってみましょう！
LIS3DH 加速度センサをESP32で使う方法 

秋月電子の[3軸加速度センサモジュール LIS3DH](https://akizukidenshi.com/catalog/g/gK-06791/)をSPI通信を用いてESP32で使用してみる.

[LIS3DHのデータシート](https://ifdl.jp/micon-bu/?plugin=attach&pcmd=open&file=AE-LIS3DH.pdf&refer=%BC%AB%BC%E7%B2%DD%C2%EA13)

# 前提
MicroPythonを使用する.

### センサー
LIS3DHを使用する場合, 裏面のジャンパーを使用方法に応じて半田を行う必要がある.

![handa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562116/3451b58c-9fb3-9593-17f4-0e3a8a1c42c7.png)
> [LIS3DHのデータシート](https://ifdl.jp/micon-bu/?plugin=attach&pcmd=open&file=AE-LIS3DH.pdf&refer=%BC%AB%BC%E7%B2%DD%C2%EA13)から引用
>
今回はI2Cを用いるのと, ESP32のSCL, SDAを使用するためBジャンパを半田する
<img width="300" alt="[handa_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562116/db5a08af-6875-bf76-6b0d-a31ecc6475fe.png">
> [LIS3DHのデータシート](https://ifdl.jp/micon-bu/?plugin=attach&pcmd=open&file=AE-LIS3DH.pdf&refer=%BC%AB%BC%E7%B2%DD%C2%EA13)から引用
>

↓Bジャンパに半田をした状態
<img width="300" alt="IMG_2471.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562116/b918e367-ec2f-b8bc-af73-ea1ba79b7815.jpeg">

# 配線

<img width="500" alt="Lis.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562116/2f985894-8f61-f3c1-abc6-abed004866ee.png">

この図のようにします.
VCCを3.3Vに, GNDをGNDに, SCLとSDAをESP32のそれぞれの同名のピンの所につなげます. 
以下が実機の配線になります. 
<img width="500" alt="IMG_2472.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562116/e7b88fc1-fedb-c891-d7f3-fe1c2f6907dd.jpeg">

# プログラム
コードは[初心者のためのセンサと測定入門](https://s-design-tokyo.com/use_lis3dh_i2c/)のI2C通信プログラムのRaspberry Pi用のコードをESP32で使えるようにしたコードになります.



```php:LIS3DH.py
import time
import utime
import math
import machine
from machine import Pin, I2C



#I2C設定
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000) 
address = 0x18
#address = 0x1A

#LIS3DH設定
i2c.writeto_mem(address, 0x20, bytes([0x57]))
#i2c.writeto_mem(address, 0x23, bytes([0x08]))

while True:
    
    #データ読み込み
    xl = i2c.readfrom_mem(address, 0x28, 1)[0]
    xh = i2c.readfrom_mem(address, 0x29, 1)[0]
    yl = i2c.readfrom_mem(address, 0x2A, 1)[0]
    yh = i2c.readfrom_mem(address, 0x2B, 1)[0]
    zl = i2c.readfrom_mem(address, 0x2C, 1)[0]
    zh = i2c.readfrom_mem(address, 0x2D, 1)[0]

    #データ変換
    out_x = (xh << 8 | xl) >> 4
    out_y = (yh << 8 | yl) >> 4
    out_z = (zh << 8 | zl) >> 4
    
    #極性判断
    if out_x >= 2048:
        out_x -= 4096
    
    if out_y >= 2048:
        out_y -= 4096
    
    if out_z >= 2048:
        out_z -= 4096

    
    #物理量（加速度）に変換
    out_x = out_x / 1024
    out_y = out_y / 1024
    out_z = out_z / 1024
    
    #表示
    print('X: ' + str(out_x))
    print('Y: ' + str(out_y))
    print('Z: ' + str(out_z))

    #一時停止
    time.sleep(1)

```
# 参考と引用
[LIS3DHのデータシート](https://ifdl.jp/micon-bu/?plugin=attach&pcmd=open&file=AE-LIS3DH.pdf&refer=%BC%AB%BC%E7%B2%DD%C2%EA13)
[初心者のためのセンサと測定入門](https://s-design-tokyo.com/use_lis3dh_i2c/)
[ESP32のピン配置](https://tamanegi.digick.jp/computer-embedded/mcuboa/nodemcuesp32/)
Diesel の check_for_backend に Sqlite を指定する場合

公式のGuideを見てもすぐに分からなかったため、備忘しておく



```rust
// Sqlite
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]

// Postgres
#[diesel(check_for_backend(diesel::pg::Pg))]

// MySQL
#[diesel(check_for_backend(diesel::mysql::Mysql))]
```

参考：https://github.com/diesel-rs/diesel/tree/master/examples
[Diesel] schema.rs のカラムに対応するModelsのカラムの型

Modelに何の型を設定すればいいのか悩んだため、探し方を備忘しておく

[Module diesel::sql_types](https://docs.diesel.rs/master/diesel/sql_types/index.html#structs) の `structs` にある型のリンクを開いた先にある、`The timestamp SQL type.`の型を設定する

例：
```rust
diesel::table! {
    items (id) {
        id -> Text,
        title -> Text,
        created_at -> Timestamp,
        updated_at -> Timestamp,
    }
}
```

の場合、
feature = "chrono"を追加した上で、
[diesel::sql_types::Timestamp](https://docs.diesel.rs/master/diesel/sql_types/struct.Timestamp.html)の `chrono::NaiveDateTime`を設定する

```rust
use chrono::NaiveDateTime;
use diesel::prelude::*;

#[derive(Queryable, Selectable)]
#[diesel(table_name = crate::schema::items)]
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
pub struct Item {
    pub id: String,
    pub title: String,
    pub created_at: NaiveDateTime,
    pub updated_at: NaiveDateTime,
}
```
vbaコードフォマード

javacode
```
import com.google.googlejavaformat.java.Formatter;
import com.google.googlejavaformat.java.FormatterException;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class VbaCodeFormatter {

    public static void main(String[] args) {
        // 指定VBA代码文件路径
        String vbaCodeFilePath = "path/to/your/vba/code/file.vba";

        try {
            // 读取VBA代码文件内容
            String vbaCode = new String(Files.readAllBytes(Paths.get(vbaCodeFilePath)), StandardCharsets.UTF_8);

            // 使用Google Java代码格式化器格式化代码
            String formattedCode = formatVbaCode(vbaCode);

            // 将格式化后的代码写回文件
            writeFormattedCodeToFile(formattedCode, vbaCodeFilePath);

        } catch (IOException | FormatterException e) {
            e.printStackTrace();
        }
    }

    private static String formatVbaCode(String vbaCode) throws FormatterException {
        // 使用Google Java代码格式化器格式化代码
        return new Formatter().formatSource(vbaCode);
    }

    private static void writeFormattedCodeToFile(String formattedCode, String filePath) throws IOException {
        // 将格式化后的代码写回文件
        Path outputPath = Paths.get(filePath.replace(".vba", "_formatted.vba"));
        Files.write(outputPath, formattedCode.getBytes(StandardCharsets.UTF_8));
    }
}
```

pom.xml
```
<dependencies>
    <dependency>
        <groupId>com.google.googlejavaformat</groupId>
        <artifactId>google-java-format</artifactId>
        <version>1.11.0</version> <!-- 使用最新版本 -->
    </dependency>
</dependencies>
```
基本情報試験　略語　テクノロジ系

### FDD 
Feature Driven Development(ユーザー機能駆動開発)
ソフトウェアやシステムの開発プロセスにおいて、ユーザーのニーズや要求を中心において設計・開発を行うアプローチ

### DFD
Data Flow Diagram データフロー図
データの流れに着目し、業務のデータの流れと処理の関係を表記する方法

### UML
Unified Modeling Language 統一モデリング言語
オブジェクト指向を用いたソフトウェア開発で使用されるモデリング言語

### POA
Process Oriented Approach プロセス中心設計
業務システムの設計手法の一つで、処理（プロセス）を中心にシステムを設計する手法

　### DOA
 Data Oriented Approach データ中心設計
 業務システムの設計手法の一つで、データ構造からシステムを設計する手法

 ### TPC
 Trabsaction Procession Performance トランザクション処理性能評議会
 オンラインんトランザクション処理の性能評価用のベンチマークテストを策定する非営利団体。

 ### API
 Application Programming Interface
アプリケーションから、 OSが用意する各種機能を利用するための仕組み

### JCL
Job Control Language ジョブ制御言語
メインフレームコンピュータシステムで使用される制御言語の一種で、ジョブと呼ばれる一連簿タスクや処理を制御するために使用される

### SQL
Structured Query Language
関係データベースの操作を行うための言語

### XML
eXtensible Markup Language
利用者独自のタグを使って、文書を属性情報や論理構造を定義することができるマークアップ言語

### DDL
Data Defintion Language データ定義言語
データベース管理システム（DBMS）において、データベースのスキーマやオブジェクトの作成、変更、削除などの操作を実行するための言語
CREATE: 新しいデータベースオブジェクト（テーブル、ビュー、インデックス）の作成
DROP: データベースオブジェクトの削除

###　DML
Data Manipulation Languageデータ操作言語
データベース管理システム（DBMS）において、データの挿入、更新、削除、検索などの操作を実行するための言語
paizaラーニング解答: 効率的なソートアルゴリズムメニュー[Ruby]

# 効率的なソートアルゴリズムメニュー
https://paiza.jp/works/mondai/sort_efficient/problem_index?language_uid=ruby

問題に挑戦する前に今回登場するソートアルゴリズムについて解説されている下記の講座に取り組むのがおすすめです。

https://paiza.jp/works/algorithm-java/new-primer/algorithm-java-new-primer-5
## FINAL問題 シェルソート
```ruby
def insertion_sort(a, n, h)
    num_of_move = 0
    for i in h..n - 1
        x = a[i]
        j = i - h
        while j >= 0 && a[j] > x
            a[j + h] = a[j]
            j -= h
            num_of_move += 1
        end
        a[j + h] = x
    end
    puts num_of_move
end

def shell_sort(a, n, h)
    h.each do |i| 
        insertion_sort(a, n, i)
    end
end
        
n = gets.to_i
a = gets.split.map(&:to_i)
k = gets.to_i
h = gets.split.map(&:to_i)
shell_sort(a, n, h)
```

## FINAL問題 マージソート
```ruby
$count = 0

def merge(a, left, mid, right)
    nl = mid - left
    nr = right - mid
    
    l = []
    r = []
    for i in 0..nl - 1
        l[i] = a[left + i]
    end
    for i in 0..nr - 1
        r[i] = a[mid + i]
    end
    
    l << Float::INFINITY
    r << Float::INFINITY
    
    lindex = 0
    rindex = 0

    (left...right).each do |i|
        if l[lindex] < r[rindex]
            a[i] = l[lindex]
            lindex += 1
        else
            a[i] = r[rindex]
            rindex += 1
            $count += 1
        end
    end
end

def merge_sort(a, left, right)
    if left + 1 < right
    mid = (left + right) / 2
    merge_sort(a, left, mid)
    merge_sort(a, mid, right)
    merge(a, left, mid, right)
  end
end

n = gets.to_i
a = gets.split.map(&:to_i)
merge_sort(a, 0, n)
puts a.join(' ')
puts $count
```
メソッドの外はスコープ外なのでcountは$を先頭に付けてグローバル変数にする必要があります。
番兵はFloat::INFINITYで無限大にします。
## FINAL問題 クイックソート
```ruby
$count = 0

def quick_sort(a, left, right)
    if left + 1 >= right
        return
    end

    pivot = a[right - 1]
    cur_index = left

    for i in left..right - 2
        if a[i] < pivot
            a[cur_index], a[i] = a[i], a[cur_index]
            cur_index += 1
            $count += 1
        end
    end

    a[cur_index], a[right - 1] = a[right - 1], a[cur_index]
    quick_sort(a, left, cur_index)
    quick_sort(a, cur_index + 1, right)
end

n = gets.to_i
a = gets.split.map(&:to_i)
quick_sort(a, 0, n)
puts a.join(' ')
puts $count
```
【小ネタ】XigmaNASで10GbE

自分用お年玉として家のNAS間との接続を10GbEにアップグレードしたのでメモ

# 構成
こんな感じです
![Screenshot from 2024-01-11 14-51-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/4fa4a8e9-fd87-ea32-e72c-fe2cbf66549f.png)

お金ないので10GbE スイッチには手が出なかった。

## XigmaNAS側

1点注意事項としては、embeddedバージョンを使ってる場合は `pkg install` の結果が再起動すると消えてしまうので、永続化したい場合はフルバージョンのXigmaNASを使わないといけないということ。どうにかする方法もありそうだけど今回はそこまでやらなかった。まあ再起動するたびに打ち直してもそんなに手間じゃない。

`pkg install aquantia-atlantic-kmod-0.0.5_2` でドライバをいれて `kldload` すればデバイスが見える

```shell
# pkg search aquantia
aquantia-atlantic-kmod-0.0.5_2 Aquantia AQtion (Atlantic) Network Driver (Development Preview)
# pkg install aquantia-atlantic-kmod-0.0.5_2
# kldload /boot/modules/if_atlantic.ko
# ifconfig
(中略)
aq0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=48103bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,VLAN_HWFILTER,NOMAP>
	ether 18:ec:e7:a5:2f:be
	media: Ethernet autoselect <full-duplex,rxpause,txpause> (none)
	status: no carrier
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

で、ifconfigすれば使えるようになる

```shell
# ifconfig aq0 10.0.20.4 netmask 0xffffff00
```

ケーブルをつなげてLINKUP LEDが点灯すればリンクアップできている

```shell
# ifconfig
aq0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=48103bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,VLAN_HWFILTER,NOMAP>
	ether 18:ec:e7:a5:2f:be
	inet 10.0.20.4 netmask 0xffffff00 broadcast 10.0.20.255
	media: Ethernet autoselect <full-duplex,rxpause,txpause> (10Gbase-T <full-duplex,rxpause,txpause>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

## Ubuntu側

普通にGNOMEの設定画面で設定すればいい

# 速度計測

よく10GbEまともに使うにはCat7必須と書かれてたけど、まずは手元に余ってたCat5eケーブルでつないでみた。

NetPerfで計測

```shell
$ netperf -f G -l 20 -H 10.0.20.2
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.0.20.2 () port 0 AF_INET : histogram : interval : dirty data : demo
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    GBytes/sec  

131072 131072 131072    20.05       1.10
```

なんだわりときっちり出てるじゃないか。[数年前は大変だった](https://narolll.hateblo.jp/entry/20200322/1584843029)ようだけど、今だと楽勝ですね。

# 終わり

とりあえずは買ったものの性能がスペック通りに出てるので満足です。実は今の所NFSで性能出てないので、いろいろしないといけないけど。この道は〜♪いつか来た道〜♪
[Lambda] アカウント内の versioned artifact と layer の総量は75GB以下に保とう

アカウント内の Lambda の artifact version と layer の総量は75GB以下に保つ必要がある。

## 理由

> The Lambda service stores your function code in an internal S3 bucket that’s private to your account. Each AWS account is allocated 75 GB of storage in each Region. Code storage includes the total storage used by both Lambda functions and layers. 
> **If you reach the quota, you receive a CodeStorageExceededException when you attempt to deploy new functions.**

しかしながら、これはソフトリミット。上限を上げることは可能。😅

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/929dde74-2071-64da-4619-f2804b67d6d1.png)


## 現在の総量の確認方法


AWS Console の Lambda のダッシュボードで確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/37da35b4-ef59-9c41-d9a3-6d057466aaae.png)


## Ref.

https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/code-storage

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html
【統計検定向け】ベータ分布＆ガンマ分布からみた確率分布の整理📈📉

統計を学習すると様々な確率分布が出てきて挫折することがあるかと思います。本記事では主に統計検定準１級を学習している人向けに、<font color=green>ベータ分布とガンマ分布</font>から見ることで、それぞれの確率分布の関連を覚えやすくしたメモです（期待値や分散の式も理解しやすくなると思います）。

統計検定を受験する際の参考になればと思います。 

©2024 [NPO法人AI開発推進協会](https://sites.google.com/deepaelurus.com/aboutus/)

<font color=gray>補足事項
専門領域でないため誤りや誤解があるかと思います。また、とにかく覚えることに主眼を置いているので、統計学の専門の方からすると色々指摘があると思います。誤りや修正すべきことろがありましたらご指摘ください。継続してブラッシュアップしていきます。</font>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/4e475116-9511-22de-e441-4cb8ed0dcc0e.png)


統計検定準１級チートシートも記載しています。ご活用ください。

https://qiita.com/DeepTama/items/9a07129626f82e9add5e
積の最小化

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__complex_boss

前回の問題を教訓に
どちらかが0の場合は問答無用に0が最小になるので
こんな感じで書いてみました。
つまり、最初の数値を基準に、小さくなったらそれを採用するみたいな感じですね。
で、A~Bの間をループさせると。負の数が含まれていても結局あんまり関係ないなということで
こうなりました。

```py
A,B = map(int,input().split())
result = 0
for i in range(A,B+1):
    for j in range(A,B+1):
      if A == 0 or B == 0:
          break
      if result == 0:
          result = i * j
      elif result > i * j:
          result = i * j

print(result)
```
でも解答の場合は、もうちょっとロジック的に書かれていて
たとえばAが-5、Bが２だとすると

AxB=-10
-4x1-4
-3x-1=3
0x1=0
とやってみると結果的にAxBが一番最小でした。
で、どちらも正なら、A<Bが決まっているのでAxAが最小ですね。
（九九を思い浮かべればわかる）
どちらも負なら多ければ多いほど小さくなるので、BxBが最小になると。
ロジカルですね。。。ただしかなりシンプルになります。

```py
A,B = map(int,input().split())
if A <= 0 <= B:
    print(A * B)
elif A > 0:
    print(A * A)
else:
    print(B * B)
```

PHPで最初のコードを書いてみます
```php
<?php
    list($A,$B) = explode(" ",fgets(STDIN));
    $result = 0;
    for ($i=$A;$i<=$B;$i++){
        for ($j=$A;$j<=$B;$j++){
          if ($A == 0 or $B == 0){
              break;
          } else if($result == 0){
              $result = $i * $j;
          } else if($result > $i * $j){
              $result = $i * $j;
          }
        }   
    }     
    print($result);
?>

```

つぎにロジカルなかつシンプルなバージョン

```php
<?php
    list($A,$B) = explode(" ",fgets(STDIN));
    $result = 0;
    if($A <= 0 && $B >= 0){
        print($A * $B);
    } else if($A >= 0 && $B >=0){
        print($A * $A);
    } else if ($A < 0 && $B < 0){
        print($B * $B);
    }
?>

```
Python 辞書の None 判定

Pythonにおいて、辞書（dictionary）は非常に便利なデータ構造の一つです。しかし、時折、特定のキーが存在しない場合や値がNoneであるかどうかを確認する必要があります。この記事では、Pythonにおける辞書のNone判定に焦点を当て、その方法について探究してみましょう。

### 辞書とは

まず初めに、Pythonの辞書がどのようなものかを確認しましょう。辞書はキーと値のペアで構成され、キーを使用して値にアクセスできるデータ構造です。以下は、簡単な辞書の例です。

```python
my_dict = {'name': 'John', 'age': 25, 'city': 'Tokyo'}
```

### None判定の重要性

プログラムを書いていると、辞書から値を取得する際に特定のキーが存在しない場合があります。また、キーが存在する場合でも、その値がNoneである可能性も考えられます。これらの状況に対処するためには、適切なNone判定が必要です。

### None判定の方法

#### 1. キーの存在を確認する

辞書から値を取得する前に、まずキーが存在するかどうかを確認します。

```python
if 'name' in my_dict:
    value = my_dict['name']
    print(f"Name: {value}")
else:
    print("Key 'name' does not exist in the dictionary.")
```

#### 2. get()メソッドを使用する

`get()`メソッドを使用すると、指定したキーが存在しない場合にデフォルト値を返すことができます。これを利用してNone判定を行います。

```python
value = my_dict.get('age')
if value is not None:
    print(f"Age: {value}")
else:
    print("Age is not specified in the dictionary.")
```

#### 3. Noneと比較する

直接辞書から値を取得し、その値とNoneを比較する方法もあります。

```python
value = my_dict.get('city')
if value is not None:
    print(f"City: {value}")
else:
    print("City is not specified in the dictionary.")
```

これらの方法を組み合わせて、プログラムが期待通りに動作するようにNone判定を行いましょう。適切なNone判定を行うことで、プログラムの安定性と信頼性が向上します。
タイルの敷き詰め

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__complex_step8

```py
H,W = map(int,input().split())
if H > 0 and W > 0:
    if H % 2 == 0 and W % 2 == 0:
        print('YES')
    else:
        print('NO')
else:
    print('NO')

```

最初は最初のif文なかったんだけど、
テストケースでHやWが０だったときにこれだめなんですよね。
で最初のif文を付け加えたら正解になりました。

ちなみに、上のは入れ子になってますが、最初のif文を逆にしたらelseがいらなくなります。
（ということに今気づいた）
ただし、この場合、<b>andだとだめでorにしないとどちらかが０の場合にNoにならない</b>です。

```py
H,W = map(int,input().split())
if H == 0 or W == 0:
    print('NO')
elif H % 2 == 0 and W % 2 == 0:
    print('YES')
else:
    print('NO')
```
PHPでも書いておきます。

```php
<?php
   list($H,$W) = explode(" ",fgets(STDIN));
   if ($H == 0 or $W == 0){
       print('NO');
   } elseif ($H % 2 == 0 and $W % 2 == 0){
       print('YES');
   } else {
       print('NO');
   }
?>

```
Raspberry pi4にUbuntuでk3sをインストールする際の注意点

#### はじめに
久しぶりにRaspberry Pi4 Bモデルにk3sをインストールしたらうまく動作しませんでした。調べると既知の問題らしく、解消できたので備忘録として残しておきます。

通常のインストールは[こちら](https://qiita.com/takushi-35/items/6e1cbe7ddf2593631978)で以前記事にしています。


#### 今回の環境と発生した問題
```
Raspberry Pi4 model B
OS: Ubuntu 22.04.3LTS(64bit)
k3s: v1.28.5+k3s1
```

上記の環境においてk3sをインストールしたところ、一度サーバーを落とした後、k3sが立ち上がらなくなりました。`kubectl`で操作しようとしてもNotReadyで表示されるか、以下の様なエラーが出ていました。
``
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes)``
``The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?
``

複数回叩いて少し違うエラーが出たり、NotReadyで表示されたりと安定しませんでした。
一度アンインストールを行い、再インストールしましたが、ログを見ると以下の様なエラーが出ていました。
``
FATA[0027] flannel exited: failed to register flannel network: operation not supported 
``
さらにk3sのログを確認するとk3sに必要なコンポーネントが足りていないとのことでした。(ログを取り忘れたので詳細はGithubのissueを確認してください。)
基本的にk3sはパッケージ化されており簡単にインストールできるはずが、どういうことだろうと思いつつ調べていたら同じ様な問題をGithubの[issue](https://github.com/k3s-io/k3s/issues/3852)で見つけ、解決策がわかりました。


#### 解決策
解決策は以下のコマンドを実行し、リブートするだけで完了します。
```
sudo apt install linux-modules-extra-raspi && reboot
```
詳細は[こちら](https://github.com/k3s-io/k3s/issues/4234#issuecomment-947954002)をご確認ください。

ですので、結局のところ、k3sをUbuntuをインストールしたRaspberry Pi4にインストールするには以下の手順が必要になります。
1. Ubuntuインストール
1. cgroupsの設定変更
1. カーネルモジュールの変更
1. リブート
1. k3sのインストールという手順です。

1のubuntuをインストール後、cgroupsの設定を変えるために``/boot/firmware/cmdline.txt``の末尾に``cgroup_memory=1 cgroup_enable=memory``を追加します。編集後はファイルの状態は以下の様になっています。
```
cat /boot/firmware/cmdline.txt 
elevator=deadline net.ifnames=0 console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cgroup_memory=1 cgroup_enable=memory
```

3のカーネルモジュールのアップデートをする際、リポジトリをアップデート後の対応となります。ですので、手順としては以下の様になります。
```
sudo apt-get update
sudo sudo apt install linux-modules-extra-raspi && reboot
```

これが完了後リブートしてあげて、k3sをインストールすれば通常通り使える様になります。
```
curl -sfL https://get.k3s.io | sh - 
```

2-5の手順は順番はあまり関係ないです。最終的にこれらがそれっていればk3sは動作します。

同じ様に困っている方がいれば参考にしてください。
【obniz】オタクの妄想を具現化！『推しらせたすかる（アクリルスタンド×からくり時計）』製作中！

# クラウドファンディングやります（唐突）

前回記事から少々空いてしまいましたが、水面下でモノづくりを続けておりました。
**そしてなんと、クラウドファンディングをやることになりました…！**

https://camp-fire.jp/projects/view/731102?list=channel_sparks

# 『推しらせたすかる』とは？

詳細は上記ページをみていただきたいのですが、要はこういうことです。

:::note info
**『推しらせたすかる』は…**

・推しの分身であるアクリルスタンド（アクスタ）、もっと活用したくない？
・部屋で動いての声が聞こえたら、めっちゃたすかるよね…。
・もうそれは「推しと暮らしてる」と言っても過言ではないのでは？

**⇒アクスタが『しゃべる！』『光る！』『動く！』
　アクリルスタンド×からくり時計プロダクトです！！！！！**
:::

イメージとしては、こういうのに近い感じ。

https://www.city.okayama.jp/museum/momotaro-walk/marchen.html

百聞は一見に如かず。試作品の動く様子はこちら！

https://twitter.com/xe_ay51938/status/1745270838709075991


# どういう仕組み？
Qiitaをご覧のモノづくり界隈の方であれば、実装技術に見当がつくのではと思いつつ。
ざっくりとはこんな感じです。
![サブ画像_03_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/3fb0c6d5-754f-f16d-0212-f9f9acff13ba.png)

詳細の解説については、クラウドファンディングで支援していただけるとリターンとしてお返しすることになっています。ご興味があれば…。

でも正直、支援は置いておいて、
**「楽しくモノづくりしたい」「共有したい」気持ちが強いですので、開発の経過などはQiitaやProtoPediaで記録していこうと思っています。**

https://protopedia.net/prototype/5024

モノづくりを学び始めて４ヶ月、初心者なりに頑張ってきました。見守っていただけると嬉しいです！

**SNSでの拡散、『いいね』を押していただけること、大変励みになります！
『推しらせたすかる』『#推しらせたすかる』、応援よろしくお願いします！**
E2EテストフレームワークのPlaywrightでlong touch（長押し）を行うには？

# 結論

```ts
await page.locator("#example").click({ delay: 5000 });
```

これで5秒間押し続けたあとに離してくれます。
Reactの```use-long-press```を使用した場合のテストを書いているときに使います。

他にも```modifiers```を指定すればShift＋クリックなどもシミュレートできます。
clickのoptionsは読んでおくと良いことがあるかも。

参考

https://playwright.dev/docs/api/class-locator#locator-click-option-delay

> delay number (optional)#
> Time to wait between mousedown and mouseup in milliseconds. Defaults to 0.
(マウスを押してから離すまでの時間。ミリ秒で指定）