OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioでelixir その336

# 概要
paiza.ioでelixirやってみた。
Streamに、なじめないので、訓練してみた。

# サンプルコード

```
#Stream.unfold(カウンタ初期値, fn カウンタ変数 -> {リストに出力される各要素, カウンタの次の値} end)

Stream.unfold(5, fn
    0 -> 
        nil
    n -> 
        {n, n - 1}
end)
|> Enum.take(10)
|> IO.inspect

Stream.unfold(0, fn
    x -> 
        {x + 1, x + 1}
end)
|> Enum.take(10)
|> IO.inspect

Stream.unfold(0, fn
    x -> 
        {x, x + 2}
end)
|> Enum.take(10)
|> IO.inspect



 f = fn list, default_value ->
        Stream.unfold(list, fn
            [] -> 
                {default_value, []}
            [h | t] -> 
                {h, t}
        end)
    end
s = f.([1, 2], 0)
Enum.take(s, 10)
|> IO.inspect

s = f.([9, 8, 7, 6, 5, 4, 3, 2, 1], 0)
Enum.take(s, 10)
|> IO.inspect

Stream.unfold(5, fn
    0 -> 
        nil
    n -> 
        {n, n - 1}
end) 
|> Enum.to_list()
|> IO.inspect



Enum.map(1..10_000, &(&1 + 1)) 
|> Enum.take(5)
|> IO.inspect

Stream.map(1..10_000, &(&1 + 1)) 
|> Enum.take(5)
|> IO.inspect


Stream.map([1, 2, 3], fn x -> 
    x * 2 
end)
|> Enum.to_list()
|> IO.inspect

Stream.cycle([1, 2, 3])
|> Enum.take(5)
|> IO.inspect

Stream.iterate(0, &(&1 + 1)) 
|> Enum.take(10)
|> IO.inspect


fib = Stream.iterate({1, 1}, &({ elem(&1, 1), elem(&1, 0) + elem(&1, 1)})) 
    |> Stream.map(&(elem(&1, 0)))
fib 
|> Enum.take(10)
|> IO.inspect

Stream.filter([1, 2, 3], fn x -> 
    rem(x, 2) == 0 
end)
|> Enum.to_list()
|> IO.inspect

concat = Stream.concat(1..3, 4..6)
cycle = Stream.cycle([:a, :b, :c])
Stream.zip(concat, cycle) 
|> Enum.to_list()
|> IO.inspect

defmodule FizzBuzz do
  def print(n) do
    generate2
    |> Stream.take(n)
    |> Stream.each(&IO.puts/1)
    |> Stream.run
  end
  def generate do
    fizzes = Stream.cycle(["Fizz", "", ""])
    buzzes = Stream.cycle(["Buzz", "", "", "", ""])
    Stream.zip(fizzes, buzzes)
    |> Stream.map(&concat/1)
    |> Stream.with_index
    |> Stream.map(&translate/1)
    |> Stream.drop(1)
  end
  def generate2 do
    fizzes  = Stream.cycle(["", "", "Fizz"])
    buzzes  = Stream.cycle(["", "", "", "", "Buzz"])
    indexes = Stream.iterate(1, &(&1 + 1))
    Stream.zip(fizzes, buzzes)
    |> Stream.map(&concat/1)
    |> Stream.zip(indexes)
    |> Stream.map(&translate/1)
  end
  defp concat({f, b}), do: f <> b
  defp translate({"",   n}), do: to_string(n)
  defp translate({str, _n}), do: str
end


FizzBuzz.print(15)

```

# 実行結果

```
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[5, 4, 3, 2, 1]
[2, 3, 4, 5, 6]
[2, 3, 4, 5, 6]
[2, 4, 6]
[1, 2, 3, 1, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[2]
[{1, :a}, {2, :b}, {3, :c}, {4, :a}, {5, :b}, {6, :c}]
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

# 成果物

https://paiza.io/projects/6jWQlBGxIqvVSAgFwLEh0g

以上。
paiza.ioでelixir その335

# 概要
paiza.ioでelixirやってみた。
時間計測、どうすんだ。

# サンプルコード

```

DateTime.now!("Etc/UTC")
|> IO.inspect

DateTime.now("Asia/Tokyo")
|> IO.inspect

Date.utc_today()
|> IO.inspect

DateTime.utc_now()
|> IO.inspect


defmodule Fib do
  def get(0), do: 0
  def get(1), do: 1
  def get(x), do: get(x - 1) + get(x - 2)
end

defmodule TailFib do
  def get(x), do: get(x, 0, 1)
  defp get(0, x, _), do: x
  defp get(n, x, y), do: get(n - 1, y, x + y)  
end

start_time = DateTime.utc_now()
Fib.get(38)
DateTime.diff(DateTime.utc_now, start_time, :microsecond) / 1000000
|> IO.inspect

start_time = DateTime.utc_now()
TailFib.get(38)
DateTime.diff(DateTime.utc_now, start_time, :microsecond) / 1000000
|> IO.inspect




```

# 実行結果

```
~U[2025-01-18 21:30:06.648202Z]
{:error, :utc_only_time_zone_database}
~D[2025-01-18]
~U[2025-01-18 21:30:06.658435Z]
1.459992
7.0e-6
```

# 成果物

https://paiza.io/projects/yqJ-53aAFPMpI1HYxpkhwQ


以上。
IT エンジニアだけど語彙力を増やしたいので「大人の語彙力ノート」を読んだ

正しい日本語を使いたい願望がある。社会人としてはもとより、IT に携わるにしてもメリットを痛感する。そんな動機で「大人の語彙力ノート」という本を読んでみた感想文です。

![](https://m.media-amazon.com/images/I/515+K7o7V5L._SY445_SX342_.jpg)

[大人の語彙力ノート 誰からも「できる! 」と思われる | 齋藤 孝 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4797393440/)


## 前提として
Issue 発行や Readme.txt には不要と思う。Issue や Readme.txt には決められたフォーマットで誰にも伝わる語彙でぶれなく漏れなく簡潔に記載せねばならないことも多い。むしろ英語で書くでも良い。

[他の人が見ても分かるIssueを書くために意識していること #GitHub - Qiita](https://qiita.com/shunbaba/items/23c26d1800d879c33043)
[実践テクニカルライティング - 開発者が「外国語」を使うときの言語技術達3つ #テクニカルライティング - Qiita](https://qiita.com/e99h2121/items/aa87cddd0ff57ff98e5b)


## 対人コミュニケーションに生かしたい
一方で語彙が必要なのは 人対人 だと考える。以下のようなメリットを想定する。コスパや程度の問題はあるが、英語と同じで、一定の水準を達成することで仕事が円滑になるという仮説がある。

### 対人コミュニケーション目的の文書に際して 
- 覚えるだけで印象が良くなる。品が良くなる。
- 適切な言葉で表現できるため、コミュニケーションがスムーズになる。
- 結果コスパ良くよい人間関係を築ける。

### 自分自身に際して
- 理解力や読解力が向上する。
- 結果思考力が深まる (脳内でより解像度高く詳細を定義できるようになるわけなので)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/b79980b7-983e-8dbf-89fc-18a600aea38d.png)


## そこで「大人の語彙力ノート」を読んだ

評価が高かったので、選びました。この「大人の語彙力ノート」の良いところは以下であった。

- 書き言葉を主とする。
- プレゼンテーションや場の取りしきりに有効そうである。
- 外来語、カタカナ語も扱う。

## 例

端的に良い語彙をメモった。明日から使う。

### 日常会話 
- 差し支えありません
- お気持ちだけいただきます
- 同意します、支持します
- おっしゃる通りです
- ありていに言えば (ざっくり言えば、の代わりに)
- 勉強不足で申し訳ございません
- 異存はございません
- 失念しておりました
- ご放念ください (忘れてください、の代わりに)

### お願い
- お使い立てして申し訳ありません
- お手を煩わせて申し訳ございません
- 手をお貸しください
- お含みおきください
- お目通しのほどお願いいたします
- 伏してお願いいたします
- ご賢察くださいますようお願い申し上げます
- はばかりながら


### 言いづらいこと
- あいにく都合がつきません
- 私には荷が勝ちます
- しかねます
- 不手際です
- 平にご容赦ください
- しっくりこない
- しこりが残る
- 看過できない

### 嬉しい
- ひとかたならぬご尽力をいただき
- 月並みですが
- 冥利に尽きます

### 挨拶
- つつがなくお過ごしでしょうか
- ご自愛ください
- 復唱いたします

### 頑張ります
- 努力します
- 最善を尽くします
- 手を尽くします
- 精進します

### すごい
- 出色
- 抜群
- 手練れ

### ざっくり
- 概ね
- 大方
- 大筋

## まとめ

いずれも使えなくても困らないのですが、言葉が正しく丁寧な人と喧嘩ってできませんよね。良い齢こいて言葉遣いが雑なのはそろそろ許されない気がしています。

とここまで考えて、京ことば、語彙だけ丁寧にしても察し合いで心中喧嘩になることもあるから怖いなとも思う。とかくひねくれた界隈はむずかしいものです... 

そんな自虐、自分用メモ 兼 感想文でした。
以上です～
Vue3でコードみてもリアクティブ変数への変更が追えない場合に使うなにか

# 概要
- 通常だったらデバッガ使って追えると思う
- ただ、ターミナルでテストコード実行だとCLIなので、ブラウザ使えなくてdebuggerが動かなーいとかあると思う
- そのときのやつ


# これ

```typescript
  const hogeValue = ref<string>('初期値')
  Object.defineProperty(hogeValue, 'value', {
    get () {
      console.log('Getting value:', hogeValue._value)
      return hogeValue._value
    },
    set (newValue) {
      console.log('Setting value:', newValue)
      console.trace('Value set stack trace')
      hogeValue._value = newValue
    }
  })
```

変更されたらsetが動作するので、それでスタックトレースが表示されて変更箇所を追えるようになる


~~そして意図しない変更とデータ構造がミスっていたことに気づきターンエンド！~~
【Splunk】UnbutuにSplunkをインストールする

Ubuntu上でSplunkをインストールし、簡単な初期設定までを行う手順をまとめます。Splunkはログ収集や分析、可視化に非常に便利なツールであり、システムの監視やトラブルシューティング、セキュリティ分析など幅広い用途で利用できます。
※本記事で示す手順は、筆者が定めた最低限の可動要件を満たす設定と動作確認のみを目的として、自身の備忘用のレベルで記しています。運用性やセキュリティ上の細かな考慮等は省いている場合があります。もし各手順を試される場合には自己責任でお願いいたします。

# 前提条件
- OS: Ubuntu 22.04（執筆時に筆者の手元にあったもの）
- Splunkのバージョン: Splunk Enterprise Ver9.4.0（執筆時点での最新版を想定）

# 事前準備

Splunk のサイトから、最新のインストールパッケージをダウンロードする。（要Splunkアカウント）
ここでは、debパッケージを利用し、wgetのURLを取得して進めるものとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/1917980c-9b82-17a3-7c57-5ab9601d525e.png)

一応、OSをできる範囲で最新状態にしておく。
```
$ sudo apt update
$ sudo apt upgrade
```
Splunkのパッケージをダウンロードする。
```
$ wget -O splunk-9.4.0-6b4ebe426ca6-linux-amd64.deb "https://download.splunk.com/products/splunk/releases/9.4.0/linux/splunk-9.4.0-6b4ebe426ca6-linux-amd64.deb"
$ ls -lh *.deb
-rw-rw-r-- 1 user user 878M Dec 13 19:52 splunk-9.4.0-6b4ebe426ca6-linux-amd64.deb
```

# Splunk のインストール
インストールする。
```
$ sudo apt install ./splunk-9.4.0-6b4ebe426ca6-linux-amd64.deb
```

# 初期設定
Splunk を起動します。初回起動時に、最初はユーザ登録を行います。（フリーライセンス版に移行する前は、Enterpriseトライアルライセンス が有効となっているため、最初はユーザーが必要）
```
$ sudo /opt/splunk/bin/splunk start --accept-license
・・中略・・
Please enter an administrator username: admin
Password must contain at least:
   * 8 total printable ASCII character(s).
Please enter a new password:
Please confirm new password:
・・中略・・
```

ブラウザから、"http\://＜SplnkサーバのIPアドレス＞:8000" にアクセスする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/f6e04bdf-c68c-f374-3147-055737730559.png)

無事にログインできたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/7130c42a-559d-2964-4e01-4f5c6fad0026.png)

ライセンスをフリーライセンス版に変更しておく。[設定]から[ライセンス]を選択する。（デフォルトでは、Enterpriseトライアルライセンス が有効になっているが、一定期間経過後に利用できなくなるので、初めからフリーライセンス版に変更しておく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/29ab3ef3-394c-3980-2864-a9be0af1dbe1.png)

[ライセンスグループの変更]を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/0861d121-ea59-a6a9-096d-f19868531351.png)

[フリーライセンス]を選択して、[保存]を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/5edde481-e8d3-289d-115a-f5a578f8d70d.png)

[今すぐ再起動]を押下して、ライセンスを反映させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/e7358d17-41b4-60bf-2ebb-e11c6eaaa3b5.png)

[Splunkの再起動]を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/0d70cd05-77ff-b1ca-614e-389cc5a233df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/fb402823-2317-1e30-bfbe-c714c38209ed.png)

もう一度、ブラウザから "http\://＜SplnkサーバのIPアドレス＞:8000" にアクセスして、ダッシュボードに接続できていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/65337750-5b1a-2aa7-6729-567787b94355.png)

# 参考
- [Splunk Enterprise Installation Manual](https://docs.splunk.com/Documentation/Splunk/9.4.0/Installation/Whatsinthismanual)
完全独習 統計学入門

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/7fad9d7c-2c1f-39d7-436d-2f1c5085e6be.png">


読書記録

## 読者プロフィール
組込み系エンジニア。
統計学は大学の授業で受けたような受けなかったような。忘れてしまった。

仕事ではセンサの性能評価でデータをとったり平均や標準偏差を求めることはあった。ただセンサの性能測定だとスペック表に答えが書かれているので統計って感じではない。統計・・・エンジニアを名乗るなら知っておいたほうが良いんだろうなぁ。でも全然知らないなぁ。

## 雑感
表紙の「使うのは中学数学だけ！」に偽りはない。数学記号としては不等式とルートくらいしか登場しない。データ数を常に有限（5個くらい）として例示してくれるのでΣも出てこない。

確率について、どうやら著者は確率の専門家のようだが本書では確率については「コインの裏が出る確率は1/2」「サイコロの各目は1/6」くらいしか出てこない。筆者曰く統計学で推測を使うには確率理論が必要らしいのですが、本書ではばっさり切っているとのこと。細かいことは素人には分からないが、統計学を道具として使う上での理解・イメージを得たい私としてはとても助かる。

ほとんど数学を使わず最終的に **「[未知のデータ（母集団）]の集まりから、いくつかデータを取り出して、そのデータを分析することで［未知のデータ］の特徴を推測する」** について納得感を得られるように説明されている。統計学の他の本は読んだことがないが、恐らくかなり分かり易くイメージを掴める良書なのだと思う。


# あらすじ
かなり丁寧に（ゆっくりと少しずつ）説明してくれているため21章という多めな章立てになっているが、その実は以下の２つで、これらをとにかく丁寧に噛み砕き積み上げている構成となっている。
①標準偏差と推定
②測定可能なサンプル（標本集団）から、無限である母集団の母平均と母標準偏差を推定する（本書のゴール）

私自身の記録のために「丁寧な記載」はカットしてキーワードや要点のみ記載するが、実際はものすごく丁寧に書かれているので誤解なきよう。

# 95%予言的中区間
この言葉は本書では頻繁に出てくるが、著者オリジナルの造語。本書は無限の母集団について特徴量を推定していくのだが、ざっくりいうと95%予言(推定)が当たる区間。可能な母数の入るべき区間とのこと。区間推定と呼ぶ。

# 標準偏差
正規分布するデータにおけるばらつきの度合いを示す値を標準偏差と呼ぶ。
標本数n、各データXn、標本平均X-(エックスバー)において
標準偏差は以下となる。
```math
標準偏差=\sqrt{\frac{Σ(x_n-\bar{x})^2}{n}}
```
※簡単のためにΣを記載しているが本書では出てこない。

# 標準正規分布
分布表で各値は求まるもの。
平均値は0となり、標準偏差は1となる。以下のような分布のこと。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/55e154cd-7783-9d60-1e90-1b21b3ee7534.png">


# 一般正規分布
世の中にみられる様々な正規分布のかたち。標準正規分布を以下のように計算したもの

一般正規分布データ＝σ×標準正規分布データ＋μ

平均値をμ、
標準偏差をσとしたとき、95%予言的中区間は以下のようになる
```math
-1.96 ≦ \frac{x-μ}{σ} ≦ 1.96
```



# 母集団からサンプリングした標本集団の特徴
母平均をμ
母標準偏差をσにおいて

標本数nの標本平均X-(エックスバー)は正規分布であり
X-の平均値はμ
X-の標準偏差は以下のように縮む
```math
\frac{σ}{\sqrt{n}}
```

X-の95%予言的中区間

```math
-1.96 ≦ \frac{x-μ}{\frac{σ}{\sqrt{n}}} ≦ 1.96
```
# 母平均と母標準偏差の推定
本書のゴールはこの２つの推定。それぞれ推定にあたりカイ二乗分布とt分布について知る必要がある。これらの概要は本書に記載されている。いずれの分布も分布表があり数値を決定できるため、統計量がカイ二乗分布かt分布か分かれば数値で推定できる。

# カイ二乗分布を用いた母分散の推定
標本数をn、標本分散をs2(2乗)する。これらは何れもデータから算出できる。
求めたい母分散σ2(2乗)とする。これは現時点ではわからない。
統計量Wを以下とする。このWはカイ二乗分布する。
```math
W=\frac{s^2n}{σ^2} 
```
カイ二乗分布の各自由度(n)の分布表は値が決まっているため、95%予言的中区間の定数をピックアップすることでWの範囲は数値で示すことができ、結果的に母分散s2の区間を推定できる。

カイ二乗分布の自由度1~5は以下のようになる。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/83041598-f49e-6fb9-2132-c829c971dd6b.png">


# t分布を用いた母平均の推定
標本数をn、標本平均X-(エックスバー)、標本標準偏差sとする。これらは何れもデータから算出できる。
求めたい母平均をμとする。これは現時点ではわからない。
統計量Tを以下とする。このTはt分布する。
```math
T=\frac{(\bar{x}-μ)\sqrt{n-1}}{s} 
```
カイ二乗分布同様にt分布の各自由度(n)の分布表は値が決まっているため、95%予言的中区間の定数をピックアップすることでTの範囲は数値で示すことができ、結果的に母平均μの区間を推定できる。

ｔ分布の自由度1~5は以下のようになる。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/9f04f86a-719e-c440-761b-0c22c34526c5.png">
独自ドメインのBlueskyのアカウントを消さないで！！！

:::note alert
この記事を読む前に独自ドメインのBlueskyのアカウントを消さないで！！！
:::

# Blueskyの予約ハンドル
## そもそもBlueskyの予約ハンドルとは

> Update as of December 12, 2024: If you change your default Bluesky username (with the .bsky.social suffix) to a website URL, your old .bsky.social username will be reserved for you. You no longer need to create a second account to reserve your most recent .bsky.social username. For every account, only your most recent .bsky.social username is reserved for you, and this reservation does not expire.

https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial

Blueskyでは、ユーザーがデフォルトのハンドル（.bsky.socialのサフィックスを持つ）を独自のウェブサイトURLに変更する際に、旧ハンドルが自動的に予約される仕組みが導入されている。各アカウントに対して、予約されるのは最新の.bsky.socialハンドルのみで、この予約は期限なく保持される。この機能は、サイバー・スクワッティングやなりすましの問題に対処するために設計されている。

## なぜBlueskyの予約ハンドルが必要なのか

ユーザーがデフォルトのハンドルから独自ドメインに変更した場合、旧ハンドルが他のユーザーに取得されてしまうことを防ぐため。予約ハンドルが存在することで、ユーザーは安心してアカウント名を変更し、再び元のハンドルに戻ることができる。

# この記事の内容

このBlueskyの予約ハンドルの仕組みを理解して、あらかじめ対策を取っておかないとあなたの大切な `〇〇.bsky.social` は二度と使えなくなってしまうかもしれない。

# 例
## 例1: `aaaa.bsky.social` → `bbbb.com`に変更

1. **`aaaa.bsky.social` を作成**: 初めに、`aaaa.bsky.social` というアカウントを作成した。
2. **`bbbb.com` に変更**: 次に、アカウント名を `bbbb.bsky.social` に変更した。
3. **`aaaa.bsky.social` は予約**: アカウント名を変更した後、`aaaa.bsky.social` は予約され、他の人が利用できない状態になった。
4. **アカウントを削除**: アカウントを削除した。
5. **`bbbb.com` は開放**: アカウント名を変更した後、`bbbb.com` が開放され、誰でも取得できる状態になった。
6. **`aaaa.bsky.social` は予約されたまま**: アカウントを削除した場合、`aaaa.bsky.social` は予約されたままで、他の人が利用できない状態になった。

```mermaid
graph TD
  subgraph 例1
    A[1: aaaa.bsky.social を作成] --> B[2: bbbb.com に変更]
    B --> C[3: aaaa.bsky.social は予約]
    B --> D[4: アカウントを削除]
    D --> E[5: bbbb.com は開放]
    C --> F[6: aaaa.bsky.social は予約されたまま]
end
```

## 例2: `cccc.bsky.social` → `dddd.bsky.social`に変更

1. **`cccc.bsky.social` を作成**: 初めに、`cccc.bsky.social` というアカウントを作成した。
2. **`dddd.bsky.social` に変更**: 次に、アカウント名を `dddd.bsky.social` に変更した。
3. **`cccc.bsky.social` は開放**: アカウント名を変更した後、`cccc.bsky.social` が開放され、誰でも取得できる状態になった。
4. **アカウントを削除**: アカウントを削除した。
5. **`dddd.bsky.social` は開放**: アカウントを削除した場合、`dddd.bsky.social` が開放され、誰でも取得できる状態になった。

```mermaid
graph TD
  subgraph 例2
    A[1: cccc.bsky.social を作成] --> B[2: dddd.bsky.social に変更]
    B --> C[3: cccc.bsky.social は開放]
    B --> D[4: アカウントを削除]
    D --> E[5: dddd.bsky.social は開放]
end
```

# 要約
この2つの例から、Blueskyの予約ハンドルの挙動に一貫性がないことがわかる。特に、アカウントを削除した後の予約ハンドルの扱いについて、不一致が見られる。

- **例1**では、`aaaa.bsky.social` が予約されたままになっている。
- **例2**では、`cccc.bsky.social` が開放されている。

# 私の意見

アカウントを削除した場合、予約ハンドルも開放されるべきだと考える。現在の仕様は、ユーザーにとって混乱を招く可能性があります。Bluesky側で、アカウント削除時の予約ハンドルの扱いを一貫性のあるものに改善する必要がある。
また、アカウントが削除された後は、そのハンドルが再利用されるべきであり、予約されたままにする理由がない。

今後、Blueskyにこの問題についてフィードバックを送信し、改善を促したいと思う。
進展があったらここに書く。
Google Drive API を使ってファイルをアップロードする

GoogleDrive API v3 です。

# 参考

https://developers.google.com/drive/api/guides/manage-uploads?hl=ja#php_1

# 準備

1. [GoogleDrive APIを有効化](https://console.developers.google.com/start/api?id=drive)
2. APIキーを作成、有効化
3. サービスアカウントを作成して鍵を json で作成、json をDL（認証用json）
4. サービスアカウントの「メール」を GoogleDrive の任意のフォルダに「共有」設定

# composer で google api client をインストール

設置する PHP ファイルの場所でインストールしてください。

```shell
$ sudo dnf install composer
$ composer require google/apiclient:^2.18
```

https://developers.google.com/drive/api/guides/downloads?hl=ja

# コードを書く

```php
<?php
require_once 'vendor/autoload.php';

$client = new Client();
$client->setAuthConfig('./認証用jsonのパス.json');
$client->addScope(Drive::DRIVE);
$driveService = new Drive($client);

$fileMetadata = new Drive\DriveFile(array(
    'name' => 'hogehoge.mp4',
    'parents' => array('共有フォルダのID')
));
$content = file_get_contents('./hogehoge.mp4');
$file = $driveService->files->create($fileMetadata, array(
    'data' => $content,
    'mimeType' => 'video/mp4',
    'uploadType' => 'multipart',
    "supportsTeamDrives" => true,
    'fields' => 'id'
));

?>
```

指定したフォルダID以下に対象ファイルがアップロードされています。
今更CentOSのRepositoryを更新する

## 経緯
VirtualBoxでCentOSを動かしていた時に，`gparted`パッケージがインストールできなかったのでリポジトリを更新しました．

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer RepositoryのURLにアクセスできていない様子...
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978367/b015ff5b-2ad7-5cd4-b231-d8fd75572eb0.png>
@enduml
```

## 手順
1.`/etc/yum.repos.d/CendOS-Base.repo`のbaseurlの内容をvault.centos.orgに書き換え
2.おまじない`yum clean all`
3.`epel-release`をインストール`yum install epel-install`
4.`gparted`をインストール`yum install gparted`

## 補足
### `/etc/yum.repos.d/CendOS-Base.repo`修正
2024年7月から標準&ミラーリポジトリからのパッケージインストール等が終了しているようです．下記サイトを参考にさせていただきました．

https://www.miraclelinux.com/support/linux-extended-support/linux-extended-support/linux-extended-support-switch-repository-centos7
### `epel-release`をインストール
`gparted`をインストールしようとしたら↓のようなエラーでインストールできませんでした．

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer gpartedインストール時の挙動
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978367/45928bb4-7ac9-702c-1d74-ff0860f41924.png>
@enduml
```
どうやらEPELリポジトリ経由でインストールできるようです．

https://ja.unixlinux.online/xt/1007015426.html

`yum install epel-release`で使えるようになります．
自分のツイログまとめツールを自作した話

Twitter(X)にとりとめもなく上げた感想やSSをまとめたいこと、ありますよね。
私はありました。
タグをつけているので検索はできるのですが、無料APIはなくなってしまったし、リプライに続くそこそこの長さのものだとクリックしないと続きが見られないしで、バックアップのためにコピペするのが面倒で面倒で。

そこで思い当たったのが、Twitterのアーカイブ機能でした。
自分のかこの投稿情報が全部取得できるということは、そこからツリー構造を追ってデータを取れるのでは？

結果：できました!
[twitter_export.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397401/9ecb8fa4-c525-213f-a738-44110d1ad896.gif)



## やったこと
1. アーカイブのダウンロードまではできている前提で、そこにhtmlファイルを一つ置く
1. data/tweets.jsにツイート情報が詰まっていそうだったので、データを取得…しようとして、そのままだと `window.YTD.tweets.part0` がうまく読み込めなかったので微調整
1. あとは配列として読み込んで、子要素を再帰的に取得して、出力用に色々調整
    1. 日付情報を表示
    1. タグを消去（開始ツイートに専用タグをつけている想定のため）

## コード
ここに置きました
https://github.com/honnnomushika/getTweetsFromTwitterArchive
D1をHonoで使ってみる

[D1 Get started](https://developers.cloudflare.com/d1/get-started/)
[Query D1 from Hono](https://developers.cloudflare.com/d1/examples/d1-and-hono/)

```bash
$ npx wrangler d1 create prod-d1-tutorial
 ⛅️ wrangler 3.103.2
--------------------

✅ Successfully created DB 'prod-d1-tutorial' in region WNAM
Created your new D1 database.

[[d1_databases]]
binding = "DB"
database_name = "prod-d1-tutorial"
database_id = "<uuid>"

$ vi wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "prod-d1-tutorial"
database_id = "<uuid>"

$ vi schema.sql
DROP TABLE IF EXISTS Customers;
CREATE TABLE IF NOT EXISTS Customers (CustomerId INTEGER PRIMARY KEY, CompanyName TEXT, ContactName TEXT);
INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (1, 'Alfreds Futterkiste', 'Maria Anders'), (4, 'Around the Horn', 'Thomas Hardy'), (11, 'Bs Beverages', 'Victoria Ashworth'), (13, 'Bs Beverages', 'Random Name');

$ npx wrangler d1 execute prod-d1-tutorial --local --file=./schema.sql
$ npx wrangler d1 execute prod-d1-tutorial --local --command="SELECT * FROM Customers"
┌────────────┬─────────────────────┬───────────────────┐
│ CustomerId │ CompanyName         │ ContactName       │
├────────────┼─────────────────────┼───────────────────┤
│ 1          │ Alfreds Futterkiste │ Maria Anders      │
├────────────┼─────────────────────┼───────────────────┤
│ 4          │ Around the Horn     │ Thomas Hardy      │
├────────────┼─────────────────────┼───────────────────┤
│ 11         │ Bs Beverages        │ Victoria Ashworth │
├────────────┼─────────────────────┼───────────────────┤
│ 13         │ Bs Beverages        │ Random Name       │
└────────────┴─────────────────────┴───────────────────┘

$ vi src/index.tsx
import { Hono } from 'hono'
import { renderer } from './renderer'
type Bindings = {
  DB: D1Database;
};

const app = new Hono<{ Bindings: Bindings }>();

app.use(renderer)

app.get('/', async (c) => {
  //return c.render(<h1>Hello!</h1>)
  const { results } = await c.env.DB.prepare(
        "SELECT * FROM Customers WHERE CompanyName = ?",
  )
    .bind("Bs Beverages")
    .all();
  return c.json(results);
})

export default app

$ npm run dev
```

```
$ curl -s http://localhost:5173/ | jq .
[
  {
    "CustomerId": 11,
    "CompanyName": "Bs Beverages",
    "ContactName": "Victoria Ashworth"
  },
  {
    "CustomerId": 13,
    "CompanyName": "Bs Beverages",
    "ContactName": "Random Name"
  }
]
```

- wrangler.tomlを.gitignoreに追加
- githubにmainブランチでアップロード
- 以下のビルド設定でCloudflare Pagesへデブロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/4eca1bac-f809-e0f6-b02e-9ad2d12f2c59.png)

- Workers & Pages / レポジトリ名 ＞　設定　＞　バインディング追加　＞ D1データベース
- 変数名DB、D1データベースをprod-d1-tutorialで指定して保存、再度デブロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/3c6145a6-49d4-e11f-ec50-45abf5d205c6.png)
タスクスケジューラのタスクを一定期間停止

# 背景
タスクスケジューラで無期限に定期実行(5分おきetc.)しているタスクがある。
その中に、外部サービスにアクセスするタスクがあるのだが、外部サービスが不定期にメンテナンスによりアクセスできなくなる時間帯がある。
アクセスに失敗した場合、アクセス元のバッチファイルが、エラー通知を送信する仕様にしていたため、メンテナンス時間帯にエラー通知が継続的に発報されてしまう。
定期メンテのアナウンスを受けたら、メンテナンスの計画時間中はタスクスケジューラの所定のタスクを停止することで、エラー通知が発報されることを回避したいと考えた。

# 環境
以下の環境で試行した。
- Windows 11 Pro
- Windows Server 2019

# アプローチ1（結果：失敗）
操作内容が同じ2つのタスクを用意して、1つはメンテナンス予定日時の前に有効期限を指定することでタスクを停止して、
もう1つは、メンテナンスの開始予定日時の後に開始時間を指定する方法を考えた。

このアプローチは、以下の事象により実現できなかった。

トリガーの設定にて、有効期限を指定したが、有効期限の時間を過ぎてもタスクは継続して実行されてしまった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/c08a1d99-ed1f-1bbd-b202-cab784a474c5.png)

同様の事象で詰まっていた記事を見つけた[^1]。

# アプローチ2（結果：成功）
PowerShellのコマンドにより、タスクスケジューラのタスクを操作できると知った[^2]ので、タスクを停止/再開するコマンドをタスクスケジューラで実行することにした。

### タスクスケジューラの有効化/無効化を操作するコマンド
- タスクスケジューラのタスクを無効化するコマンド
```Disable-ScheduledTask -TaskName "タスク名"```
- タスクスケジューラのタスクを有効化するコマンド
```Enable-ScheduledTask -TaskName "タスク名"```

### 計画停止/再開タスクの作成
以下のような構成でメインのタスクと別に2つのタスクを作成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/dbd49661-a72a-ba07-bc3e-e37455058816.png)

#### 計画停止のタスクの設定
トリガー
- メインのタスクを停止したい日時を「開始」 に指定する
- 今回は停止処理を繰り返さないので、繰り返しの設定はなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/fbdd6c4a-3491-e5f1-e38f-7858cbd35ae8.png)

操作
- 操作：プログラムの開始
- 設定
    - プログラム/スクリプト
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    - 引数の追加
    -Command Disable-ScheduledTask -TaskName "メインのタスク"

#### 計画開始のタスクの設定
トリガー
- メインのタスクを再開したい日時を「開始」 に指定する
- 今回は開始処理を繰り返さないので、繰り返しの設定はなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/3f90e13a-ef04-d53c-2532-ac1d90a26626.png)

操作
- 操作：プログラムの開始
- 設定
    - プログラム/スクリプト
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    - 引数の追加
    -Command Enable-ScheduledTask -TaskName "メインのタスク"

# まとめ
アプローチ2の方法で、目的を達成できました。
上記記載例だと、2025/1/19の2:00にタスクが停止して、3:00にタスクが再開することになります。


[^1]: [windowsのタスクスケジューラで指定時間を超過してもタスクが実行される話。](https://qiita.com/maki_s/items/daa9310335023637409a)

[^2]: [ScheduledTasks]https://learn.microsoft.com/ja-jp/powershell/module/scheduledtasks/?view=windowsserver2022-ps
MLA-C01: AWS Certified Machine Learning Engineer - Associateに合格しました

先日、[AWS Certified Machine Learning Engineer &ndash; Associate](https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/) を受験して合格しました。これにより [2025 Japan AWS All Certifications Engineers クライテリア](https://aws.amazon.com/jp/blogs/psa/2025-japan-aws-all-certifications-engineers-criteria/) を満たすことができ、何とか称号を維持できそうでほっとしています。

廃止されたAWS認定試験のうち、筆者にとっての有効期限がもっとも早いのはAWS Certified Database &ndash; Specialty（DBS）の2025年2月13日ですので、それまでのごくわずかな期間のみ15冠ホルダーを名乗ることができます。:v:

## 勉強方法

そもそもの話として、合格だけを目的にするのではなく、ドキュメント読むとか実際に触ることで、実践力を養う学習をすべきなのは言うまでもないことでしょうが、高得点を目指さず最小コストかつ最小努力で合格を目指すうえではAWS Skill Builderの無償マテリアルだけでも何とかなるだろうと考え、今回はそれだけを使って勉強しました[^1]。MLSには合格済みだということも手抜きを自己正当化した理由の一つです。

[^1]: 所属企業ではUdemy Businessを契約しており、社員は個人負担なく利用できるのですが、全員が無条件に利用できるわけではなく、希望者が毎年申請する仕組みになっています。筆者は直近で更新をお願いしなかったので受験時点で利用資格を持っていませんでした（会社の懐よりも自分の学習機会を優先するべきですね）。

具体的には、（無償版の）試験対策コース:point_down: を受講しました。半日ほどあれば終えられる長さだと思います。
- [Exam Prep Standard Course: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)](https://explore.skillbuilder.aws/learn/course/external/view/elearning/21620/exam-prep-standard-course-aws-certified-machine-learning-engineer-associate-mla-c01-japanese)

もちろん、公式模擬問題集:point_down: も活用しました。
- [Exam Prep Official Practice Question Set: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)](https://explore.skillbuilder.aws/learn/course/external/view/elearning/19689/exam-prep-official-practice-question-set-aws-certified-machine-learning-engineer-associate-mla-c01-japanese)

## 試験結果

余裕と言えるスコアではありませんが、SageMakerの理解度や勉強の手抜き加減に鑑みて、ほぼ予想どおりの結果でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957214/3a953f15-4a31-3c29-4d7b-81f1b62f02bf.png)

試験内容について詳細を述べることは控えますが、AI/MLの一般論もかなり問われるMLSに比べると、SageMakerを中心としたAWSサービスの使い方にフォーカスされている印象です。その分、ちゃんと触ったことがないと取りこぼしが起こりやすい傾向にはあるのかもしれません。
クリップボードにコピーしたファイルパスやURLをショートカットキーで開く



```VB:openFolderURL.vbs
Dim path, rawPath
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")

' クリップボードからパスを取得する
On Error Resume Next
rawPath = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
On Error GoTo 0

If IsEmpty(rawPath) Or IsNull(rawPath) Then
    MsgBox "クリップボードの内容が文字列ではありません。"
Else
    ' クリップボードの内容がダブルクォーテーションで囲まれているか確認
    If Left(rawPath, 1) = """" And Right(rawPath, 1) = """" Then
        path = rawPath
        rawPath = Mid(rawPath, 2, Len(rawPath) - 2) ' ダブルクォーテーションを取り除く
    Else
        path = """" & rawPath & """"
    End If

    ' URLの場合はEdgeで開く
    If InStr(LCase(rawPath), "http://") > 0 Or InStr(LCase(rawPath), "https://") > 0 Then
        shell.Run "microsoft-edge:" & rawPath
        'shell.Run "chrome.exe " & rawPath  'chromeで開く場合
    Else
        ' ファイルパスとして有効かどうかをチェック
        If fso.FolderExists(rawPath) Or fso.FileExists(rawPath) Or Left(rawPath, 2) = "\\" Then
            ' 有効な場合はエクスプローラで開く
            shell.Run "explorer " & path
        Else
            MsgBox "無効なファイルパスです: " & rawPath
        End If
    End If
End If
```
（26行あたりURLを開くブラウザを変更）
Edge（デフォルト）
>shell.Run "microsoft-edge:" & rawPath
Chrome
>shell.Run "chrome.exe " & rawPath

ショートカットをデスクトップに作成してショートカットキーを割り当て
PowerAutomateで週末の作業をリマインドする（休日考慮）

<h1>はじめに</h1>

お疲れ様です。
業務において、週次報告書の提出など毎週金曜に実施する作業はよくあるかと思います。
私はこの作業をちょくちょく忘れてしまうことがあります、、、

そこで、リマインダーを設定することにしました。
Slackなどを使えば毎週金曜にリマインドを飛ばせますが、
社内・部署内で活用していないこともあるかと思います。

その場合、Microsoftの[Power Automate](https://microsoft.com/ja-jp/power-platform/products/power-automate)を活用したリマインドをオススメします。

Slackなどでの毎週のリマインドより優れている点として、
**Outlook上での休日を考慮したリマインドを送信できる**
点が挙げられます。

例えば、金曜が休日の場合には木曜に、木曜も休日の場合には水曜にリマインドを送りたいですよね。
その辺りを考慮してリマインドを送信できるのが、ここで紹介する内容の利点です。
ただ、最後に記載した通り、Outlook上で「日本の休日」とされている日のみ休日として認識できます。
その辺りはご注意ください。

詳細は以下の通りです。

<h1>フローの全体図</h1>

今回使用する全てのブロックです。
見にくくて申し訳ないですが、一旦下図のブロックを作成してもらえれば、
あとは空欄を埋めていくだけです。

ブロック名を変更していないため、「新しいステップ」を押して各ブロックに含まれる文字列を検索していただければ、該当ブロックがサジェストされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/aa9b89d4-c91a-7f75-ed21-a79f5aef142c.png)

<h1>処理内容の説明</h1>

具体的にどのような処理をしているかについては、下図を参照してください。
上図の名前を変更し、各ブロックの処理を分かりやすくしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/324bf48b-b536-2a88-4f06-cb032525e1aa.png)

<h1>1. フローの作成</h1>

まず、[Power Automate](https://microsoft.com/ja-jp/power-platform/products/power-automate)を起動し、フローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/f08b15e0-9d5e-d4b3-8d33-cd4865047e4f.png)

設定曜日を月曜日〜金曜日にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/01d97e8f-b52d-a763-3776-6feaf2e75183.png)

続いて、各ブロックの設定事項を上から順に説明します。

<h1>2. 初期設定部の設定</h1>

設定時刻は好みに応じて変更して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/6e893362-0548-ce5f-4edb-f878943b701d.png)

次に、今回使う2つの変数を初期化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/cf03a37d-b069-1388-0a60-3c9eb7085d3c.png)

<h1>3. 平日カウント部の設定</h1>

少し長めですが、ループ部分です。

「算出時間」という動的コンテンツは、「「現在の時刻」を1日増やす」の出力結果です。
「現在の時刻」の日付自体に変更は無いため、
ここで開始時刻&終了時刻として設定すると上手くいきません。
人によってはここで沼にハマるため、ご注意ください。

条件文の「empty(...)」には、
```
empty(outputs('イベントのカレンダー_ビューの取得_(V3)')?['body/value'])
```
と記載してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/2be0faf1-e6c6-7cdb-c537-3521112fc397.png)

<h1>4. リマインド処理部の設定</h1>

フロー実行日から土曜日までの間に含まれる平日が1日である場合、
Outlook上でリマインドを送信します。

条件文の「remainW...」には
```
valiables('remainWeekdays')
```
と記載してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/9223bbab-4649-e697-4b0c-544f81ebcd7e.png)


以上で完成です。

<h1>フローのテスト実行</h1>

実行結果をすぐに確認したい方は、
下図の赤枠で囲まれたボタンを押してテストをしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/1c4070cf-157e-58ed-ab28-58d279e8b141.png)

木曜日にテストを行った結果、下図のとおりにメールを受信しました。
（remainWeekdaysの値が2の場合にもリマインドを送るよう変更したため、
メールが飛んできています。）

残りの平日は2日となっていますが、翌日（金曜日）がoutlook上で祝日とされている場合は、残り1日と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325458/e67a78b3-e5cb-f80c-ffc8-b73533c590ea.png)

<h1>懸念事項</h1>
このフローでは、Outlook上で「日本の休日」とされている日を休日と判定します。
そのため、以下のパターンではリマインドをうまく活用できません。
1. Outlook上では平日だが、自分にとっては休日（年末年始、お盆、有休...）
2. Outlook上では休日だが、自分にとっては平日
seleniumを使った自動入力　参考

事前準備

	
pip install selenium
pip install chromedriver-binary==バージョン　#chromeのバージョンを確認する
pip install pandas

コードを書く上で参考にしたサイト

https://qiita.com/tomomi-kawashita/items/1a1e03d5ee590823b92e

https://qiita.com/suipy/items/18af39c5199df6430c84

https://qiita.com/haru1977/items/53c582eb9e264ccf8574

https://qiita.com/papi_tokei/items/c0bd335c9c30065c7604

https://qiita.com/___fff_/items/3410b4f98127bb23cb4d
【Blender to Unity】FBXファイルエクスポート時のコレクション構造について

BlenderからUnityにエクスポートする際、注意すべき点です。
**【使用ツール】**
Blender 3.6
Unity 2022.3.22

# 【問題点】

Blenderで作成したオブジェクトをFBX形式でエクスポート・Unityにインポートした際、Blenderのコレクション構造が引き継がれません。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/49d91147-1f4b-46ac-f505-6776ca24540e.png)
(Blenderで作成したコレクション構造では、「Collection」内にCube1・2、「Collection2」内にCube3が格納されています)

**↓**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/d870eeac-4d42-419b-0dbf-73af4dbf0c27.png)
(Blenderで「test.fbx」としてエクスポート・Unityにインポートした際、「test」配下にCube1・2・3が格納されています)


# 【回答】
Blenderでコレクションごとにエクスポートする必要があります。


前提として、Blenderで作成したオブジェクトをFBX形式でエクスポートし、Unityにインポートするとファイル1つにつき1つのモデルとして扱われます。そのため、コレクション構造は引き継がれません。
(※なお、1つのモデルとして扱われるというのは、1つのEmpty内にBlenderのオブジェクトが格納されることを意味します。上記例でいうと、「test」と命名されたEmptyの中に、Cube1・2・3が格納されています。)

# 【準備】
**エクスポートするオブジェクトごとにコレクションを作成します。**

別のコレクションに格納するオブジェクトを選択し、画面上部のObject > Collection > Move to Collectionの順にクリックします(ショートカットする場合は、オブジェクトを選択した状態でMキーを押下)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/de12031f-1815-3db0-d688-467f78d5ecf0.png)

+New Collectionを押して、新しいコレクションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/54831621-3091-becd-74b8-fa1de861c4f6.png)

すると、新しいコレクションが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/b645db54-6596-2e1e-d440-8adb65af3edf.png)

# 【手順】
### ①エクスポートするコレクションに格納されたオブジェクトをすべて選択しまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/3e2a8dcb-e066-8674-4da5-211c29abfa29.png)


### ②File > Export > FBX(.fbx)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/be1b7a36-71a7-6ce2-68a0-cedc5fdc4e88.png)

### ③「Limit to」で「Selected Object」のチェックボックスを選択し、それ以外のチェックボックスを外します。その後、Export FBXを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/1af8ce54-b269-54dc-2f20-efb3d0bf444b.png)
※それ以外の設定については、自由に変更して問題ありません。

### ④Unityにモデルをインポートすると、選択したコレクションのオブジェクトのみがインポートされていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984019/e59586eb-2340-4ccd-213b-0de5937a9040.png)
LinearLayoutで子要素の幅を比率で指定する

LinearLayoutで子要素の幅を比率指定する方法をメモ。
`layout_width`を0dpで指定する。`wrap_content`や固定値にした場合は幅が意図しない挙動になる。縦方向で使う場合は`orientation`を`vertical`に指定し、`layout_height`の値を0dpにする。`ConstraintLayout`の中では動作せず。LinearLayoutの機能になっている。他に`LinearLayout`を継承している`ChipGroup`や`RadioGroup`でも使用できる
下記コードは1：2：2の幅比率になっている。

```xml
<LinearLayout
    android:id="@+id/linearLayout01"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent">

    <TextView
        android:id="@+id/textView01"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@color/colorBlue"
        android:text="左側" />

    <TextView
        android:id="@+id/textView02"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:background="@color/colorGreen"
        android:text="真ん中" />

    <TextView
        android:id="@+id/textView03"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:background="@color/colorRed"
        android:text="右側" />
</LinearLayout>
```
`layout_weight`を実装しようとした時に、まだ何となくで仕様を把握していなかったので改めてまとめた。

参考

https://qiita.com/yamadacsa/items/e6992b01b672438d3b8e
Jspreadsheet CEのタッチ操作を改善する

# 概要
Jspreadsheet CEはタッチ操作にいくつか課題がある。
* 行全体、列全体を除いて、複数のセルを自由に選択できない
* Mobile Safariでコンテキストメニューが表示されず行追加、行削除、コピー、ペーストなどの操作ができない
* 行高さ、列幅を変更できない

この記事ではJspreadsheet CEを拡張してこの問題を解決する。

# 動作環境
Windows 11 Pro 23H2
Jspreadsheet CE v.5.0.0 / v.4.3.0
Google Chrome バージョン: 135.0.7049.115（Official Build） （64 ビット）
Microsoft Edge 136.0.3240.50 (64 ビット）
Firefox 128.9.0esr（64 ビット）
Mobile Safari 18.2.1

# 実装
* モバイル版Excelのようにセルの左上、右下にハンドルを表示し、それによってセル範囲を自由に変更可能とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/dd188460-d6ea-1a66-c8d1-1f928615b05c.png)
* セル範囲を選択後にコンテキストメニューを表示する。表示する方法は以下から選択できる。
  * セル選択時に直ちにコンテキストメニューを表示する
  * セル選択時に小さいボタンを表示し、それを押下することでコンテキストメニューを表示する
  * コンテキストメニューではなくアイコンパネルを表示する
* 行ヘッダ、列ヘッダを選択した際にリサイズアイコンを表示し、それをスライドさせることで行高さ、列幅を変更できるようにする

ソースは以下から取得してください。

https://github.com/tm000/JspreadsheetCE-touch-extension

# 動作イメージ
セル選択＆コンテキストメニュー表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/cee9bb7b-933a-497a-bd1b-2c2c41ff1d84.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/d542dcd6-42d3-428a-82a0-63a5d1e0f7df.png)
＜直ちにコンテキストメニューを表示する場合＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/92067790-1ec9-4db2-bc0f-d497a22e3e9b.png)
＜小さいボタンを表示し、押下することでコンテキストメニューを表示する場合＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/8bae50e8-c46a-40b0-94b6-07a325fa1a8b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/63b1f8dd-f3f2-4a30-8da5-cda216dc35e3.png)
＜アイコンパネルを表示する場合＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/328acabf-9d64-4ea7-86fd-7f8bcd74e96a.png)

列幅変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/e802a304-965b-4f52-afb8-53f2087be2f9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/d7083fb2-e9a6-4284-9fdf-68502e525076.png)

行高さ変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/3bd42881-a0b7-4a9d-ad25-1be2f0df7a1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132879/1c4dbd7c-59cf-404d-aa69-02e4d9616414.png)



# 終わりに
バグは随時修正していきます。

(2025/1/25)
* 列幅、行幅を変更できるように機能追加

(2025/1/30)
* [Jspreadsheet CEの日本語入力を改善する](https://qiita.com/tm777/items/1ce39b3dffe67d5bc497)と一緒に使用できるようにコードを見直し

(2025/5/6)
* v5リリース

(2025/5/11)
* v4にもオプション設定機能を追加

(2025/5/31)
* v5について、同一ページ内に複数のJspreadsheetを配置すると正常に動作しなかったバグを修正

(2025/6/23)
* v4について、同一ページ内に複数のJspreadsheetを配置すると正常に動作しなかったバグを修正
yyyy-mm-dd hh:nn:ssのようなタイムスタンプ文字列を作りたい

VBAでyyyy-mm-dd hh:nn:ssのようなタイムスタンプ文字列を作るにはFormat関数を利用します。

```vb
Sub Main()
    Dim timestamp As String
    timestamp = Format(Now(), "yyyy-mm-dd hh:nn:ss")
    Debug.Print timestamp
    '=> 2024-04-05 16:28:31
End Sub
```

よく利用する処理ですが、必要なタイミングのたびに忘れるので、自分用のメモとして残しておきます (´・ω・`)
Evil number と Odious number

皆さんは，正の整数を2つのグループに分ける場合，どのように分けますか？
多くの人は，偶数 (Even number) と奇数（Odd number) に分ける筈です．
一方で，正の整数は Evil number と Odious number に分けることもできます．

この記事では，以下のページで紹介されている2つの数字を日本語で紹介します．

https://en.wikipedia.org/wiki/Evil_number

https://en.wikipedia.org/wiki/Odious_number

この数字ですが，科学ライター兼Vtuberの彩恵りりさんが昨年末に言及されています．

https://x.com/Science_Release/status/1873581028646007192

また，共立出版の数学ゲーム必勝法 全４巻でも言及されているようです．
（私はこの書籍を所持しておらず，[翻訳ノート](https://kyoritsu-pub.sakura.ne.jp/app/file/goods_contents/2678.pdf)しか見ていないので，詳細はわかりません）

https://www.kyoritsu-pub.co.jp/book/b10003797.html

Web上では，上記2件以外の日本語情報が見つかりませんでした．
この記事では，Evil number とOdious numberをどう日本語訳すべきかも併せて議論します．

# Evil number と Odious number の定義
二進数への変換時に**1**を偶数個持つ非負の整数を「Evil number」という．
二進数への変換時に**1**を奇数個持つ非負の整数を「Odious number」という．

以上がEvil number と Odious numberの定義です．また，以下の関係性を持ちます．
「Evil number」ではない非負の整数を「Odious number」という．
「Odious number」ではない非負の整数を「Evil number」という．

ここで，非負の整数とは，0と正の整数，0含めた自然数のことです．

Evil numberは，以下のように続きます．
0, 3, 5, 6, 9, 10, 12, 15, 17, 18, 20, 23, 24, 27, 29, 30, 33, 34, 36, 39 ...
Odious numberは，以下のように続きます．
1, 2, 4, 7, 8, 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38 ...

# Evil number と Odious number の判定
非負の整数$x$が Evil number と Odious number のどちらであるか判定する方法は，簡単です．
定義通りに$x$を二進数に変換し，**1**の数を数え，偶数か奇数か判定するだけです．
MATLABなら以下のように書けます．

```MATLAB:evilOrOdious.m
function evilOrOdious(x)
    if mod(nnz(dec2bin(x) == '1'), 2)
        fprintf('%dはOdious numberです', x);
    else
        fprintf('%dはEvil numberです', x);
    end
end
```

1, 2, 4, 7, 8, 11, 13は，二進数に変換すると0001, 0010, 0100, 0111, 1000, 1011, 1101になるので，いずれもOdious numberになります．

# Evil number と Odious number の日本語訳
Evilには，悪，邪悪，不正，不道徳，よこしまな，不吉，凶などの意味があります．
Odiousには，いやらしい、醜悪な、憎むべき，不快，不愉快などの意味があります．

そのため，Evil numberを直訳すると，「邪悪（な）数」になります．
対応するOdious numberは「醜悪（な）数」あるいは「嫌悪数」とすべきでしょう．

一方で，Evil numberは明らかに偶数 (Even number)を意識した命名であり，Odious numberは奇数（Odd number) を意識した命名です．
これを日本語に当てはめると，Evil numberは「愚数（ぐすう）」と読み，Odious numberは「鬼数（きすう）」と読むのが良いでしょう．
愚数と鬼数は，書籍「数学ゲーム必勝法」に登場する意訳となります．

wikipediaでは，Evil numberとOdious numberに関する中国語のページがあります．
そこでは，邪恶数と可恶数，あるいは邪惡數と可惡數のように書かれています．
可悪数の「可悪」は一般的な中国語のようですが日本語に存在しないので，その点をどう評価するかが判断の分かれ目になりそうです．

以上の単語を表にまとめてみます．

|英語||Even number|Odd number|
|:-:|:-:|:-:|:-:|
|日本語||偶数|奇数|
|**英語**||**Evil number**|**Odious number**|
|〇悪な数||邪悪な数|醜悪な数|
|〇悪数||邪悪数|醜悪数<br>嫌悪数|
|意訳||愚数（ぐすう）|鬼数（きすう）|
|中国語||邪悪数|可悪数|

いずれにしても，「悪魔の数字」や「忌数」などと混同されない日本語に訳することが重要だと考えられます．

# 終わりに
Evil number と Odious number を紹介し，その日本語訳についても議論しました．
個人的には，絶妙な翻訳である愚数（ぐすう）と鬼数（きすう）が好きです．
皆さんも適切な日本語訳を考えてみてください．
開発者の生産性を低下させる最大の要因：コンテキストスイッチングの影響と対策

# 開発者の生産性を低下させる最大の要因：コンテキストスイッチングの影響と対策

プログラミングにおいて、深い集中力を必要とする作業中に中断を強いられることは、開発者の生産性に大きな影響を与えます。カリフォルニア大学アーバイン校のGloria Mark教授の研究によると、作業が中断された場合、元の作業に完全に戻るまでに平均23分15秒かかることが明らかになっています。この記事では、開発現場で頻繁に発生するコンテキストスイッチングの問題について、その影響と具体的な対策を解説します。

## コンテキストスイッチングとは

コンテキストスイッチングとは、ある作業から別の作業に切り替えることを指します。このオペレーティングシステムから借用された用語は、重要な違いを示しています：コンピュータはコンテキストスイッチを効率的に処理できますが、人間の脳はそうではありません。

プログラミングの文脈では、以下のような状況が該当します：
- 進行中のコーディングを中断して緊急の会議に参加する
- 複数のプロジェクトを同時に進行させる
- チャットやメールでの頻繁な割り込み
- オープンオフィスでの予期せぬ会話や視覚的な妨害

## 開発者の生産性への影響

### 1. 作業効率の低下

Gloria Mark教授の研究チームの発見によると、作業の中断後に完全な集中を取り戻すまでに平均23分15秒かかります。これは単なる時間の損失以上の問題をもたらします：

- **集中力の分断**: 複雑な問題解決に必要な思考の流れが途切れる
- **文脈の喪失**: 作業中の問題やアプローチの理解を再構築する必要がある
- **エラーの増加**: 中断により、コードの品質が低下し、バグが混入するリスクが高まる

### 2. フロー状態の重要性

フロー状態（ゾーンとも呼ばれる）は、心理学者Mihaly Csikszentmihalyiによって研究された心理状態です。彼の1990年の著書「Flow: The Psychology of Optimal Experience」で詳しく説明されているように、フロー状態には以下の特徴があります：

- 作業が自然に進む
- 時間の感覚が失われる
- 複雑な問題に対する洞察が自然に浮かぶ

最近の研究では、このフロー状態に入るには一定の中断のない時間が必要で、一度中断されると状態の回復に相当な時間を要することが示されています。特に、オンスクリーンでの割り込み（Slackのメッセージやメール通知など）は、コードの理解や問題解決タスクに大きな影響を与えることが分かっています。

### 3. コード品質への影響

継続的な中断は、以下のような問題を引き起こす可能性があります：

- バグの増加：開発者が認知的文脈を失うことによる
- 技術的負債の蓄積：コードの再理解に時間を要する
- コードの保守性低下：レビューサイクルと修正の増加

## 効果的な対策

### 1. 個人レベルでの対策

#### パーキングロット・テクニック

作業中に浮かんだアイデアや関連タスクを即座に処理せず、テキストファイルに記録しておく方法です：

```text
作業中のパーキングロット例：
- ログ出力の形式を標準化する必要あり
- ユーザー入力のバリデーション強化検討
- パフォーマンス改善のためにキャッシュ導入を検討
```

#### 中断可能なワークフロー作り

コードにコメントを残し、なぜその決定を行ったのかの文脈を記録します：

```python
def optimize_query():
    # パフォーマンス改善のためにインデックスを追加
    # TODO: 大規模データセットでのテストが必要
    # 現在の実装は小規模データ向けに最適化
    result = perform_query()
    return result
```

### 2. チームレベルでの対策

#### フォーカスタイムの設定

チーム全体で「集中タイム」を設定し、その時間帯は緊急事態以外の中断を禁止します：

- 午前中の2-3時間を「ディープワーク」時間として確保
- 水曜日を「ミーティングフリーデー」に設定
- チーム間の同期は非同期コミュニケーションを優先

#### 緊急度の定義明確化

チーム内で「緊急」の定義を明確にし、不必要な中断を減らします：

- セキュリティインシデント
- 本番環境での重大な障害
- データ損失のリスク

これらの状況以外は、通常のタスクとして扱い、集中時間を保護します。

### 3. 組織レベルでの対策

#### コミュニケーション・プロトコルの確立

効果的なコミュニケーションを実現するため、以下のような施策を導入します：

- 非同期コミュニケーションを基本とする
- Slackの定時送信機能の活用
- 「すぐの返信は不要です」という文化の醸成

#### 柔軟な働き方の支援

個人の生産性を最大化するため、以下のような選択肢を提供します：

- リモートワークオプションの提供
- フレックスタイム制の導入
- 個人の最適な作業時間帯の尊重

## 効果測定

コンテキストスイッチング対策の効果を測定するために、以下の指標を追跡することをお勧めします：

1. **予期せぬ中断の回数**: 日々の記録を取る
2. **中断のない作業セッションの長さ**: 時間の推移を観察
3. **コード品質メトリクス**: バグ率とコードレビューのフィードバック
4. **チーム満足度スコア**: 定期的なサーベイの実施
5. **スプリントベロシティの推移**: 中断削減後の変化を観察

## まとめ

コンテキストスイッチングは、単なる不便さ以上の問題です。Gloria Mark教授の研究が示すように、1回の中断で平均23分15秒もの生産性が失われます。完全に中断をなくすことは現実的ではありませんが、その影響を理解し、適切な対策を講じることで、個人とチームの生産性を大きく向上させることができます。

最も重要なのは、これらの対策を組織の文化として定着させることです。短期的には多少の不便さを感じるかもしれませんが、長期的には開発者の生産性と仕事の質の向上につながります。

## 参考文献

1. Mark, G., Gudith, D., & Klocke, U. (2008). "The Cost of Interrupted Work: More Speed and Stress." CHI 2008 Proceedings
2. Csikszentmihalyi, M. (1990). "Flow: The Psychology of Optimal Experience." Harper & Row.
3. Gloria Mark (2023). "Attention Span: A Groundbreaking Way to Restore Balance, Happiness and Productivity."
【Chrome】React Scanの拡張機能をインストールする方法

1. https://github.com/aidenybai/react-scan/tree/main/packages/extension/build からChrome用のファイルをダウンロードします
![スクリーンショット 2025-02-08 0.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2bcf7ccb-18a2-edda-540c-08dc66715988.png)

2. ファイルを解凍します

3. Chrome を開き、`chrome://extensions/` を開きます
4. 「デベロッパーモード」がまだ有効になっていない場合は有効にします
![スクリーンショット 2025-02-08 0.00.39のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b27960e7-dea3-6a55-a8b1-8c7efc644d91.png)

5. 「パッケージ化されていない拡張機能を読み込む」をクリックし、解凍したフォルダを選択します
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1d9719ec-ae99-e27d-f9f4-1c6eeb8c58e2.png)



## 参考

https://github.com/aidenybai/react-scan/blob/main/BROWSER_EXTENSION_GUIDE.md
Webフレームワーク Honoとは？

# Honoとは？  
**超高速・軽量なマルチランタイムWebフレームワークの魅力**

近年話題の**Hono**は、Cloudflare Workersをはじめとするエッジ環境やNode.js、Deno、Bunといった主要JavaScriptランタイムで動作する、超高速かつ軽量なWebフレームワークです。以下、その主要な特徴と実用性を簡潔にご紹介いたします。

## 主な特徴

- **高速なルーティング:**  
  Honoは独自の正規表現ベースのルータ（RegExpRouter）を採用し、Cloudflare Workersなどのエッジ環境においてトップクラスのリクエスト処理性能を実現しています。

- **軽量な実装:**  
  依存パッケージを一切必要としない設計により、バンドルサイズが非常に小さく、起動時間の短縮やリソース消費の削減に寄与します。

- **マルチランタイム対応:**  
  「Write once, run anywhere」を実現するため、Cloudflare Workers、Node.js、Deno、Bunなど、様々な環境で同一コードを動作させることが可能です。

- **型安全な開発環境:**  
  TypeScriptで実装され、豊富な型定義が提供されるため、エディタの補完機能や型検証が効き、開発効率および保守性が向上します。

- **充実したミドルウェア:**  
  認証、CORS、ログ記録、JSONパースなど、実務に必要な機能が組み込み済みで、追加ライブラリの導入を最小限に抑えられます。

## 技術スタックとパフォーマンス

HonoはTypeScriptで書かれ、Web標準API（Fetch APIなど）を活用しているため、各環境間でコードの互換性が保たれます。実際、Node.js環境ではExpressを大きく上回るパフォーマンスを示しており、Cloudflare WorkersやDeno、Bun上でも高速なレスポンスを実現しています。

## ユースケースと導入方法

Honoは以下のようなシーンで特に効果を発揮します。

- **RESTful API／マイクロサービス:**  
  軽量かつ高速な処理が求められるAPIサーバの構築に最適です。

- **エッジコンピューティング:**  
  地理的に分散したエッジサーバ上での動的処理により、低レイテンシなサービス提供が可能です。

- **リバースプロキシ／フルスタックアプリ:**  
  認証やキャッシュなどの共通処理をフロントに配置し、複数のマイクロサービスを統括する用途にも適しています。

導入は非常に簡単で、以下のコマンドでプロジェクト雛形を生成できます。

```bash
npm create hono@latest
```

生成されたテンプレートをもとに、Cloudflare Workers、Node.js、Deno、Bunなど各環境で即座に開発を始められる点も魅力です。

## 他フレームワークとの比較

- **Express:**  
  豊富なエコシステムがある一方、パフォーマンスや軽量性の面ではHonoが圧倒的です。

- **Fastify:**  
  高速な処理性能を有するFastifyに対し、Honoはさらにマルチランタイム対応やシンプルな設計で差別化されています。

## 最新のアップデートとコミュニティ

近年のバージョンアップ（v4系）では、TypeScriptの型定義強化、RPC機能、JSXレンダリングおよび静的サイト生成（SSG）サポートなどが追加され、機能面が大きく向上しております。また、急速に拡大するコミュニティと豊富なエコシステムにより、今後も企業やプロジェクトでの採用が進むことが期待されます。

## 結論

Honoはその**高速性**、**軽量性**、そして**マルチランタイム対応**という特徴から、エッジコンピューティングやサーバレス環境を活用する最新のWeb開発において非常に有力な選択肢となります。これまでの従来型フレームワークと比較しても、シンプルでありながら実務に直結する機能が充実しており、次世代のWebアプリケーション構築の一翼を担うことが期待されます。
ChatGPT-o3-miniでGoogleマップランキング上位のサウナマップを作成

ChatGPT-o3-miniでGoogleマップランキング上位のサウナマップを作成してみました。
Google MPA APIからランキングとレビュー数を取得し、位置にピンを打つように指示をしました。
結構出来はよく作成されております。さてサウナ行こう。

https://storage.googleapis.com/my-sauna-map-site/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186776/b4d32b79-9ccf-fa73-93ca-6d601d5ed978.png)
松戸ロボティクスの紹介（Qiita初投稿）

千葉県松戸市でロボット製作をしている市民団体、松戸ロボティクスです！  
今回は、Qiita初投稿ということで松戸ロボティクスについて紹介する記事を書きました。

松戸ロボティクスについて
松戸ロボティクス（松戸ロボット研究会）は、「今よりロボットをもっと身近に」をテーマに、ロボットや機械の研究・開発を行っている団体です。ロボットに関する技術、機械要素、電子回路、ソフトウェアに興味のあるメンバーが集まってロボットを製作し、展示会や大会などへも参加しています。

活動内容
私たちは、ロボット開発を中心に、設計、材料加工、組み立て、電子工作、プログラミング、システム開発などを行っています。またロボットのコンテストや大会、展示会に参加したりもしています。

最近の取り組み
直近では、荷物の自動輸送に着目し、輸送ロボットやピッキングロボットなどを製作しています。

今後の展望
今後もロボット製作を通じて、ロボット技術の可能性を探っていきたいと考えています。また、新しい技術に興味がある方との交流も大歓迎です！  

ロボットに関する様々な記事を発信していく予定です。
よろしくお願いいたします。
![IMG_2601.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810648/ec60c93d-ce50-eeb2-745f-0478e45ce62c.jpeg)

![IMG_3232.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810648/73478eea-e7e8-1a55-8bdb-2ced235e007c.jpeg)


松戸ロボティクスHP
https://matsudorobohome.wordpress.com
GitHub
https://github.com/matsudo-robotics
KiCADフットプリントをPythonで格子状に並べる

# やること

KiCAD pcbnew で32列×28行（896個）LEDのフットプリントをPythonを使用して一瞬で並べる方法を紹介します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/2b2c1743-fdcf-9020-c790-0d648d83f39b.png)

# ソースコード
```py
import pcbnew
bd = pcbnew.GetBoard()
OrgX=50800000      #原点座標X 50.8mm
OrgY=25400000      #原点座標Y 25.4mm
OffsetX=10160000   #横方向のオフセット距離 10.16mm(2.54mmの4個分)
OffsetY=7620000    #縦方向のオフセット距離 6.62mm(2.54mmの3個分)
pX=OrgX            #X座標変数、初期値は原点を入れておきます
pY=OrgY            #X座標変数、初期値は原点を入れておきます
REF=1              #部品番号の数値部分、初期値は1
for X in range(32):
    pY = OrgY
    for Y in range(28):
        LED = bd.FindFootprintByReference("D" + str(REF))
        LED.SetPosition(pcbnew.wxPoint(pX,pY))
        pY=pY + OffsetY
        REF = REF +1
    pX=pX+OffsetX
```