OmniAICreator/Qiita-1.07M huggingface dataset:
バックエンドエンジニアが見習いEMやってみた

これは[Hubble Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hubble)の3日目[^1]の記事です。

# はじめに
こんにちは！[株式会社Hubble](https://hubble-docs.com/)でバックエンドエンジニアをしている@okakeeです。

昨年のHubbleのアドカレは、[Rubyのバージョンアップの話](https://qiita.com/oaktome/items/cff36ba7a6e4ca46f4df)や[GitHub Actionsの話](https://qiita.com/oaktome/items/2100bff62087ced89cfc)を書きました。
今年は何を書こうかと考えていましたが、僕がここ半年くらいチーム内でEM（エンジニアリングマネージャー）的な働き方をしてみたので、EM Lv1見習いの僕が、どういうことをやったのかについて書こうかなと思います。

僕と似たような境遇だったり、現在エンジニアでEMへの転換に興味があるような方に、少しでも参考になればいいな〜と思っています！

# 僕について
まず簡単に僕の経歴を書いておきます。
僕は新卒でエンジニアとして働き始めて今年で11年目くらいになります。
主に業務用やto B向けのWebアプリケーションのバックエンド・フロントエンドや、AWSやさくらインターネットといったクラウドインフラの構築、業務用アプリケーションを作る現場では各種設計書の作成を行ったり、別の現場ではPhotoshopでWebサイトに使う写真素材の加工みたいなことをしたこともあります。

バックエンドは主にRuby、PHPをメインに書いています。HubbleではメインのアプリケーションがRubyなのでここ数年はずっとRubyを触ってバックエンドエンジニアとして働いています。最近は生産性効率やDX（Developer Experience）の向上に興味があり、メンバーと協力しながらエンジニアが作業しやすい環境を作ることを目標にしています。

# なぜEMを？
そんなバックエンドエンジニアとしてキャリアを積んでいた僕がなぜEMをやることになったのかというと、理由はいくつかありますが、大きな理由として僕自身がエンジニアとしてプロフェッショナルを目指していくというよりは、もっと色々な引き出しを増やしていきたいという思いがありました。
DevOps、SRE、EM、など目指していく目標の選択肢はいくつかありましたが、会社として現状エンジニアのマネージメント層が不足していることもあり、僕の所属するチーム内かつバックエンド側のエンジニアのEMとしてチャレンジしていくかたちになりました。

# 実際にやってみて
実際にEMをやってみると言っても、人によって、会社によって色々と定義があると思います。
僕が実際に行ったのはこの表で言うところのプロジェクトマネジメントと一部テクノロジー、ピープルのマネジメント部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396830/1d255404-9e2d-82a6-bdd6-fa28e5f3bd04.png)

※画像はこちらの記事からお借りしました。

https://qiita.com/hirokidaichi/items/95678bb1cef32629c317

具体的にはプロジェクト単位で実装に先駆けて設計を考えたり、実装者と一緒に実際の実装方針などを相談したり、エンジニアのスケジュールマネージメントをおこなったり…ということを行いました。

実際にEMとして働いてみて一番強く感じたのは、**各メンバーの適正や働くスタイルを考えてうまくいくようにサポートしていくことの重要性**でした。

円滑にプロジェクトを進めるためのスタートからゴール、バックエンドエンジニアであればDBやAPIの設計をおこないフロントエンドエンジニアにバトンタッチするまで、をどういう筋立てで行くか考えなければなりません。

メンバーによって、1人でガツガツ自走できるけど少しコミュニケーションが苦手なタイプの方や、シンプルに自分自身でスケジュールを管理するのが苦手な方、最初はパフォーマンスを発揮するけど後半は失速気味になってしまう方など様々なタイプの方がいます。

そこに更に、その人が持っているサービスのドメイン知識であったり、技術力などを考慮した上でどういう風に進めていくかを考えて、適切な接し方で一緒に頑張る、マネージメントをする、というのが重要でありかつ難しい点だなと感じました。
実際まだまだ上手くできませんが、まずはメンバーのことを知りお互いに信頼関係を築くことが重要だと理解できました。

またPdM、他部署、経営陣とメンバー間の橋渡し的な役割もやりがいがあった部分ではあります。
お互いのああしたい、こうしたい、や意見、相談などを取りまとめて相手に伝わるように話したり、交渉することが必要でした。個人的にここはある程度うまくできていたのかなと思います。

最近特に痛感しているのは、つい実装担当のメンバー視点のみで考えがちになってしまい、プロジェクト全体のスケジュールだったり、細かな仕様を見落としていたりすることがあることです。
より広い視野で、先のことまで考えた上で計画、発言することが課題だと感じています。

# これからについて
約半年間ほどEM的なことをやってみて、自分の中で新しい視点や発見・うまく回している手応えもありましたが、まだまだ課題が多いな、というのが正直な感想です。
これからのキャリアパスとして、まずはこのままEMとして頑張っていき、他チームにもいい意味で影響が出るくらいになりたいな、思っています。
それからもう少しピープルマネジメントに特化するのか、元々興味があったDXなどテクノロジー部分にも手を伸ばしていくのか決めていこうと思っています。

# 最後に
つらつらと僕の経験した感想を書いてきましたが、冒頭でも書いた通り同じように目指しているような方へ、少しでも参考になればと思います。
Hubbleは興味があればまずやってみようでチャレンジできるし、もし失敗してもドンマイ、次は頑張ろう！と言ってくれる会社なので、普段あまり積極的に表に出ない僕でも、試してみたいことをやらせてもらえる環境があって経験値を貯めることができていると感じています！

明日はHubbleが誇るフロントエンドチームのリーダー、@KOHETsさんの投稿です。
お楽しみに！

[^1]: 平日のみの投稿なので、投稿日は4日ですが3日目の記事としています。
Advent of code 2015 Day 19 Part 1 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 19 の Part 1 を解きます

:::note info
Part 1 と Part 2 の解き方が全く違ったので分けています
:::

問題文はこちら

https://adventofcode.com/2015/day/19

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day19_part1.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 19 の入力を取得します

![スクリーンショット 2024-12-02 23.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4539f101-de2b-ef2d-d1ba-df0ad20edac7.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

まず入力を読み込み、最初の分子配列と置換配列を取得します

```elixir
rows = String.split(puzzle_input, "\n")
```

```elixir
[molecules | replacements] = Enum.reverse(rows)

replacements =
  replacements
  |> Enum.filter(&(&1 != ""))
  |> Enum.map(fn row ->
    [src, dst] = String.split(row, " => ")
    {src, dst}
  end)

{molecules, replacements}
```

全ての置換について、1回だけ置換した場合の文字列を生成し、重複を排除して数えます

```elixir
replacements
|> Enum.map(fn {src, dst} ->
  0..(String.length(molecules) - 1)
  |> Enum.map(fn index ->
    replaced =
      molecules
      |> String.slice(index, String.length(molecules) - index)
      |> String.replace(src, dst, global: false)
    
    String.slice(molecules, 0, index) <> replaced
  end)
  |> Enum.filter(&(&1 != molecules))
  |> Enum.uniq()
end)
|> Enum.concat()
|> Enum.uniq()
|> length()
```

</details>

## まとめ

Part 1 は単純でしたが、、、

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/acfa5fd3248f8f74b2cf
Win2Dについて　その5　線描画

# 線描画について
今回はいよいよペイントソフトらしくドラッグで線を書いてみます。
前回作成したレイヤー機能の上に構築します。

# 線を保持するクラス
前回と同様に線を保持するクラスを作成します。
```csharp
public class LineShape : IShape
{
    public ShapeMode Mode { get; set; } = ShapeMode.Line;
    public List<Vector2> LinePoints { get; set; }
    public Color Color { get; set; }
    public float Stroke {  get; set; }

    public LineShape(Vector2 linePoint, Color color, float stroke) 
    {
        LinePoints = new List<Vector2>() {linePoint};
        Color = color;
        Stroke = stroke;
    }
}
```
Win2Dで線を引くとき、始点と終点の2つの点が必要になります。
今回はリストの中にそれぞれの点の情報を追加していく形となるので`Vector2`のリストを保持しています。

# 描画処理
線データを詰める処理は以下のようになります。
```csharp
// 線情報を初期化する。
public void AddLine(Vector2 point, Color color, float stroke)
{
    lines =new LineShape(point, color, stroke);
    // ここでshapesにlinesを追加すれば、線を引いている最中でもどのような線を引いているか確認できる。
    shapes.Add(lines);
}
// 点を追加していく。
public void AddPoint(Vector2 point)
{
    lines.LinePoints.Add(point);
}
```
最初のクリックで線情報を初期化し、`shapes`に詰めています。
初期化の際、色と太さを指定しておけば、クリックして離すまではそれが適応されるような形となります。

`Layer`の`Draw`関数に以下の分岐を追加します。
```diff_c_sharp
 public void Draw(CanvasDrawingSession ds, float alpha = 1)
 {
     foreach(var shape in shapes)
     {
         if(shape.Mode == ShapeMode.Rectangle)
         {
             var rectangle = (RectangleShape) shape;
             ds.DrawRectangle(rectangle.Rect, rectangle.Color, rectangle.Storoke);
         }
         // Line描画
+        if(shape.Mode == ShapeMode.Line)
+        {
+            var lines = (LineShape) shape;
+            for(int i = 0; i < lines.LinePoints.Count -1; i++)
+            {
+                ds.DrawLine(lines.LinePoints[i], lines.LinePoints[i+1], lines.Color, lines.Stroke);
+            }
+        }
     }
 }
```
前回同様に`shapes`に詰められた描画アイテムから`LineShape`の点の情報を引き出して始点と終点を作り線を作成しています。
線は連続した点の集まりとなるので上記のように処理するわけです。

# クリック処理
`MainWindow.xaml.cs`では以下のように作成し、各レイヤーの描画処理を呼び出します。
```csharp
// クリック開始
private void Canvas_PointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
{    
    pointerDrag = new PointerDrag(e.GetCurrentPoint(canvas).Position);
    mouseDown = true;
    // 初期化処理を呼び出す。
    layers[CurrentIndex].AddLine(new Vector2((float) pointerDrag.CurrentLocation.X, (float) pointerDrag.CurrentLocation.Y), PickUpColor, 5);
    canvas.Invalidate();
}

// マウスを動かすとき
private void Canvas_PointerMoved(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
{
    if (mouseDown == false)
        return;
    pointerDrag.CurrentLocation = e.GetCurrentPoint(canvas).Position;

    // 現在のポイントを線の点リストに追加(Vector2で与えている)
    layers[CurrentIndex].AddPoint(new Vector2((float) pointerDrag.CurrentLocation.X, (float) pointerDrag.CurrentLocation.Y));

    canvas.Invalidate();
}

// マウスを離したとき
private void Canvas_PointerReleased(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
{
    if (mouseDown == false)
        return; 
    // 離したときは何もしなくてよい。(MouseDownをfalseにすること)
    mouseDown = false;
    canvas.Invalidate();
}
```
マウスを動かしている間常に現在の点が線リストに追加していき、その追加した点を元に２点を求め、線を引く形となっている。
Nucleo-F303K8を使ってみよう

# はじめに
NucleoボードはSTM32マイコンがのっている評価ボードです。
Nucleo32、Nucleo64、Nucleo144の3つのサイズのバリエーションがあります。
[前回の記事](https://qiita.com/shuji4649/items/f62686b81231221fe21c)ではNucleo64のNucleo-F446REの使い方について解説したので、今回はNucleo32としてNucleo-F303K8を紹介します。

# 性能
Nucleo-F303K8の主な性能です。

| 項目 | 性能|
|---|---|
| 動作周波数 | 72MHz|
| 動作電圧 | 3.3V|
| フラッシュメモリ|64KB|
|SRAM|12KB|
|UART(USART)|2|
|I2C|1|
|SPI|1|
|12bit ADC|2系統9チャンネル|
|GPIO|25（外部割り込み付き）|

F446REよりも性能は劣りますがとてもコンパクトになったので場所を選ばず使えるかもしれません。

# ピン配置
ピン配置は[こちら](https://os.mbed.com/platforms/ST-Nucleo-F303K8/)から見ることができます。
ピン配置はArduino Nanoと互換性があるので、今までArduino NanoやArduino Nano Everyを使っていたところにそのまま使用できます。

# プログラムの書き込み

プログラムの作成・書き込みは前回と同じく[こちら](https://qiita.com/shuji4649/items/deaafcbbcd064dc9000a)の記事で紹介している方法でできます。
ただし、``platform.ini``に以下のように``upload_protocol = mbed``を付け加えてください。これをしないと正常に書き込めないことがあります。
``` platform.ini
[env:nucleo_f303k8]
platform = ststm32
board = nucleo_f303k8
framework = arduino
upload_protocol = mbed
```
なお、Nucleo64ボードは上下で分かれていましたが、Nucleo32ボードは見て分かるようにST-Link部分を取り外すことはできません。

# USBではなく外部電源で動かしたい
電源については[こちら](https://www.st.com/resource/en/user_manual/um1956-stm32-nucleo32-boards-mb1180-stmicroelectronics.pdf)の資料のp.16の``6.4 Power supply and power selection``というところに載っています。
VINピンに7V~12V、5Vピンに5V、3.3Vピンに3.3Vのどれかを選べます。
外部電源で動かしながらPCとUSBでつなぐ際には先に外部電源で供給してからUSBケーブルを接続する必要があります。詳しくは上の資料に``power sequence procedure``として記載されているのでそちらをご覧ください。

また、Nucleo32では外部電源を使用してプログラムを実行する際は以下のようにNRSTと3V3をジャンパーしなければなりません（理由はわからない）。プログラムを書き込む時は逆にジャンパーしているとダメなので、スライドスイッチか何かをつけるのがいいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/3898b7cd-a17d-4a09-5122-e1ba3990aacf.png)


# 最後に
前回と今回でNucleoボードの紹介をしてみました。この記事を読んでSTM32マイコンを使ってみたいと思っていただけたら嬉しいです。
ご質問・ご指摘等ございましたら是非コメントお願いします！
# 参考リンク
何か分からないことがあったらここにあるドキュメントをじっくり見てみると欲しい情報が見つかるかもしれません

https://os.mbed.com/platforms/ST-Nucleo-F303K8/

https://www.st.com/en/evaluation-tools/nucleo-f303K8.html
HULFTとインターネットを接続する製品開発に Rust を利用した

この記事は  [セゾンテクノロジー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/saison-techAdvent) 3日目の記事です。

シリーズ2は [HULFT10](https://www.hulft.com/software/hulft-10) のエンジニアによる投稿をお届けします。

# はじめに

既存製品に、HULFT を使ってインターネット経由でファイル転送を行うインターネットファイル転送サービス [SaaS形式の WebConnect](https://www.hulft.com/software/hulft-webconnect)がありますが、今回、外部サービスを利用することなく、オンプレ環境に導入してファイル転送の中継を行う、SmartProxyを開発しました。

開発にあたって管理サーバー側は、golang で作成し、ファイル転送の中継部分は、rustを使って開発を行いました。

今回はWebSocketを使い中継する製品を作成するにあたり、言語選定で気を付けたこと、選択したライブラリ（クレート）などを記載します

# 言語選定の要素

経緯は、上記に書いた通り。技術要素は、WebSocket Secure(TLS経路暗号) を用いる事でした。

HULFTは、OSネイティブなC/C++言語、機種によってはアセンブラで開発しているからこそ、効率もさることながら、メモリーやソケット、ディスク等のOSから得られるリソースの情報を制御、取得することで、障害発生時の回復やエラー報告などに定評を得ている製品です。

言語（ライブラリ）から得られる品質や脆弱性などの要素も、選定の一つでした

## websocket を実現する際の選定要素

- 言語
- 対応OS
- ライセンス
- 脆弱性がないか
- リソース利用の効率性

## 言語

- システムプログラミング言語である事
	- 候補 : C, Rust
	- デーモン化が出来る
	- raw socket を扱うことができる

- C
	- 対応プラットフォームが多い
	- 全てはCで出来ていると考えても良い
	- 開発者が確保しやすい

- Rust
	- 対応プラットフォームが少ない
		- Rust 自身は Linux / Windows では動作するが）
	- 開発者は確保しにくい

## 対応OS

- ターゲット Linux, Windows で動作する物
    - HUFTと同一プラットフォーム上で動作する必要はなく、通信プロトコルだけ中継できればよい

## ライセンス

- 商用利用するため、コードの公開の必要がないもの

## 脆弱性がないか

- rust : rustls rust 製のTLSライブラリ も存在するが、rust製のもの
- C : openssl-nativeだと脆弱性報告が多い(CVE結果)

## リソース利用の効率性

- GC を利用する物は除外
- メモリー使用量の多い物は除外
- C10K 問題を回避している事

# 利用クレート

すでに社内で利用実績のあった以下のクレートを利用しました

- tokio 
- tokio-rustls
- tokio-tungstenite
- tracing
- tracing-appender
- tracing-subscriber

# まとめ

製品開発に Rust を利用して感じた事を以下につらつらと記載してみます。

- rustup update でツールを新しくしておく事
- 公開されているコードサンプルが利用したいクレートと組み合わせてコンパイルできないということが多々発生した
    - クレートは、Cargo.toml に直接記述せず、cargo add で追加する
    - `~/.cargo/registry/src/` 配下に、cargo add でdownloadしたソースとともに testコード存在している事がわかり、新しいバージョンでの記述の参考になった
- borrow checker とはまだ仲良くなれない
- rust-analyzer は必須

# 終わりに

もともと、[C10K問題](https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C)は解決したいと思っていたのですが、rust tokio, channel など非同期やリソース共有の機能がこんなに簡単に得られるとは思っていなかったので、Rust を選択してよかったと感じています。
Rustのごくごく一部しか理解していないので、学習を続けていきたいと思います


# 参考情報

- 2022/09/20 - 「Linux」、バージョン6.1でRustを導入へ--トーバルズ氏が明言
    - https://japan.zdnet.com/article/35193491/
- 2022/09/23 - MS、AWS、Googleも本格採用へ--プログラミング言語「Rust」の最新動向を振り返る
    - https://japan.zdnet.com/article/35193608/
- 2022/11/15 - 米国家安全保障局、CやC＋＋からメモリ安全なプログラミング言語への移行を推奨する文書を公開
    - https://codezine.jp/article/detail/16854
- 2022/12/06 - google、Rust採用で「Android」のメモリーに関わる脆弱性が激減
    - https://japan.zdnet.com/article/35196972/
- 2023/01/30 - 疑われる「C++」の安全性、今後の動きはどうなる
    - https://japan.zdnet.com/article/35199018/
MakerFaireKyoto2024出展記録

# Maker Faire Kyoto 2024に出展してみた  

## 自己紹介  
- **名前**: @kiwsdiv 
- **職場**: 自動車関連部品メーカー勤務  
- **役職**: R&Dエンジニア  
- **仕事内容**:  
  - デジタル信号処理  
  - モデルベース開発  
  - センサ開発  
- **趣味**:  
  - 技術チャレンジ部の一員  
  - VRで遊ぶ  
  - 自動運転に挑戦  
  - ダイビング  

---

## Maker Faire Kyoto 2024に行ってきました  
- イベント情報: [Maker Faire Kyoto 2024](https://makezine.jp/event/mfk2024/)  
- **Maker Faireとは？**  
  - テクノロジー系DIY工作をする人たち「Maker」によるお祭り  
  - 自作したものを見せ合い、学んだことをシェアする場  

---

## 出展したもの  
1. **自動運転シミュレータ**  
2. **押した感スタンプ**  
3. **BRICK Quest（ブリクエ）**  
   - レトロゲーム風キャラクター生成ゲーム  
4. **BRI-Chan ~KIDSスペース見守りロボット~**  
5. **技術チャレンジ部ののぼり**  
6. **色々ご紹介**
    - からあげ帝国
    - つくろか 
    - KadoMakers

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/1f6e8e80-4a8d-3f06-1454-428c63430d72.png)

---

## 詳細紹介  
### BRI-Chan ~KIDSスペース見守りロボット~  
- 子どもたちが安全に遊べるよう見守るロボット  

<iframe width="560" height="315" src="https://www.youtube.com/embed/-WAq3qzAun0?si=ruT6A0pJ3OA2DRfI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### BRICK Quest（ブリクエ）  
- レトロゲーム風のキャラクター生成ゲーム  
- 子どもたちに好評  
<iframe width="560" height="315" src="https://www.youtube.com/embed/SMmdoMhLRWo?si=FJAcRr9XVeddr74-" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

---

## 来場者からのフィードバック  
- **BRICK Quest（ブリクエ）**: 子どもたちが多く遊び、予想以上の人気  
- **BRI-Chan**:  
  - 操作したい子が多かった  
  - 電池消耗や部品の破損が発生  
- **自動運転シミュレータ**:  
  - 子どもたちが画面に釘付け  
  - 操作できないことを説明するのが心苦しかった  
- **その他感想**: 「現地で動くだけでもすごい！」  

---

## 現地でのトラブル  
1. **輸送における破損**  
   - 3Dプリンタ部品やアクリル板が壊れやすい  
   - 精密機械にして発送しても破損が発生  
2. **子どもたちによる破損**  
   - 使用に耐えられず少しずつ壊れる  
   - 結束バンドで応急処置  
3. **その他の問題**  
   - **ぬいぐるみ**: 縫い付けたカツラが簡単に外される  
   - **ネットワーク不調**:  
     - Google Driveへのアップロードができず、アプリが強制終了  
     - 現地でコードを改修  

---

## チャレンジしてみたい点  
1. **インタラクティブな体験を提供**
   - 自動運転AIシミュレータと競争可能にする 
   - 見て、聞いて、触って、五感で楽しめる展示  
2. **思い出を持ち帰れる展示**  
3. **ネット環境に頼らない設計**  
   - ローカルLLMの導入を検討  
4. **自分が楽しむことを重視**  

---
## 学んだこと
1. **ユーザーを具体的にイメージしてモノづくりをする大切さ**
今回、施設のお困りごとを聴いて、段ボールと模造紙でMVPを作ることからスタートするアプローチをとったが、実際にユーザー（子供たち）にお披露目できたのは2回だけだった。予想できない子供たちの反応を受けて、ユーザーを具体的にイメージできてなかったことと、何度もリリースして反応を伺う大切さを学んだ。
本業ではなかなかお客様と直接の接点を持つことはできないが、ユーザーを具体的にイメージすること、お客様の反応を早い段階で伺うことにチャレンジしていきたい。

1. **形にして発表することの苦労と尊敬**
すごいメイカーさんがたくさんいる中で、私たちが現地で動かしているのを見て「現地で動くだけでもすごい！」と言ってくださったことが印象深い。当たり前にモノづくりして持ってきているし、業務でも当たり前のように製品を作っている方々を改めて尊敬した。
小さな一歩かもしれないが、予期せぬバグ、故障、当日までのデリバリーの不備があった中で、何とか動かしたことは自信になった。

1. **ROS技術**
自分が組んだロボットが動いて感動。楽しい！

---

## さいごに 
- **Makerへの敬意**: 全てのMakerを尊敬します！みんなすごい！  
- **感謝**: 展示に協力してくれた方々への感謝  
---
法人番号とチェックディジット


## はじめに

法人番号と付番の仕組みとチェックディジットについて調べており計算方法等まとめました。

## 法人番号とは

法人番号は国税庁が指定する13桁の数字を指します。
基本的に法人と呼ばれる団体には法人番号が割り振られています。

法人番号は国税庁の法人番号公表サイトから確認することができます。

https://www.houjin-bangou.nta.go.jp

法人番号は全部で13桁ですが、12桁の "基礎番号" と1桁の "検査用数字" により構成されています。
また、12桁の "基礎番号" は法人等の区分によって番号の構成が定められています。

例えば、"地方公共団体" であれば以下のような構成となっています。

- 1桁~6桁までが 一連番号
- 7桁、9桁~12桁が `0`
- 8桁が `3`

ちなみに、株式会社FoundingBaseの法人番号は、`4011001098993` です。

## 法人番号のチェックディジット

法人番号のチェックディジット（13桁目）は以下の数式で算出することが可能です。

$$
9 - \left( \sum_{n=1}^{12} P_n \times Q_n \mod 9 \right)
$$

- $P_n$ 基礎番号の最下位の桁を1桁目としたときの`n`桁目の数字
- $Q_n$ `n` が奇数のとき`1`、`n`が偶数のとき`2`

### JavaScript で計算する場合

```js
var corporateNumber = '法人番号';

var checkDigit = Number(corporateNumber.substring(0, 1));
var basicNumberArr = corporateNumber.substring(1).split('').map(Number);

var evenBasicNumber = basicNumberArr
  .filter((_, i) => i % 2 === 0)
  .reduce((acc, cur) => acc + cur, 0);
var oddBasicNumber = basicNumberArr
  .filter((_, i) => i % 2 === 1)
  .reduce((acc, cur) => acc + cur, 0);

var calculatedCheckDigit = 9 - ((evenBasicNumber * 2 + oddBasicNumber) % 9);
```

#### 検算

実際に 株式会社FoundingBaseの法人番号 `4011001098993` で計算したチェックディジットが正しいか確認してみます。

```js
var corporateNumber = '4011001098993';
// '4011001098993'
var basicNumberArr = corporateNumber.substring(1).split('').map(Number);
// [ 0, 1, 1, 0, 0, 1, 0, 9, 8, 9, 9, 3 ]

var evenBasicNumber = basicNumberArr
  .filter((_, i) => i % 2 === 0)
  .reduce((acc, cur) => acc + cur, 0);
// 18
var oddBasicNumber = basicNumberArr
  .filter((_, i) => i % 2 === 1)
  .reduce((acc, cur) => acc + cur, 0);
// 23

var calculatedCheckDigit = 9 - ((evenBasicNumber * 2 + oddBasicNumber) % 9);
// 4
```

検算の結果13桁目の数字と同一であることが確認できました。

## Ref

https://www.houjin-bangou.nta.go.jp/documents/checkdigit.pdf

https://www.houjin-bangou.nta.go.jp/sp/setsumei/pamphlet/images/houjinbangou_gaiyou.pdf
「ライトショップ」で看護師を演じるパク・ボヨンのポートレート


韓国ドラマ「ライトショップ」で看護師を演じるパク・ボヨンのポートレート

パク・ボヨンはディズニー+ドラマ「ライトショップ」でICU看護師を演じています。このシリーズは、ユニークなランプショップに訪れる謎の客の物語です。

https://github.com/Sidelined-The-QB-and-Me-en-francais
https://github.com/VAIANA-2-en-francais
https://www.just-watch.me/
https://mydramalist.com/list/1epQ0rx4
https://mydramalist.com/list/19BgvA9L
https://www.gameworld.gr/community/80429-devan-ger/profile?actid=826265
https://www.gameworld.gr/community/80429-devan-ger/profile?actid=826266
https://pastelink.net/yasq5v7p
https://snippet.host/fhswfk
https://foro.ribbon.es/topic/32948/dvdhzdvfddfhf
X(Twitter)連携サービスを運営していたら警察から事情聴取された

## 始まり
ある日、岐阜県にある警察署の生活安全課から電話がかかってきた。
曰く、インターネット上のとある事件の捜査のためX(Twitter)に開示請求を行ったところ、当方が運営するWebサービス「ぷらいべったー」のIPアドレスが出てきたため話を聞きたいとのこと。
何故当方の運営するサイトのIPアドレスが出てきたかの推測（後述）を慌てながら説明したところ大体納得してもらえた感じではあるが、調書を作らなければならないため一度うちに来て直接話を聞きたいということになってしまった。
そのときにやったことの備忘録を残しておく。

情報を整理するため、電話の段階での会話内容そのまんままとめていたら無駄に長くなってしまったので[別記事](https://privatter.me/page/6747247e28b35)にまとめた。

## 事前準備
警察の人が家に訪ねてくるまでに数日の猶予があったので、以下の準備をした。
1. 詐欺ではないか確認
会話の内容からほぼ確実に警察であることは間違いないと確信していたが、なにせこのご時世なので警察を騙った悪人が家に上がり込んで強盗や詐欺を働こうとしている可能性もある。念のため相手の名乗った警察署の名前で検索して当該自治体のホームページを確認してそこに載っている警察署の番号とかかってきた電話番号が同一であることを確認した。なお[警察からの電話番号は末尾が0110でも詐欺のことがある](https://www.yomiuri.co.jp/national/20240520-OYT1T50026/)らしいので注意。
また最近は電話番号を偽装して電話してくる詐欺グループもいるため電話番号が一致していたからといって安心せず、かけ直して相手の所属と名前を伝えて確認する方がいい。
2. 説明資料の作成
電話で上手く説明出来なかった自信があるため、自分のサービスがどういうものかの説明と、何故ぷらいべったーのIPアドレスが情報開示請求で出てきたのかの推測（後述参照）をA4二枚ぐらいのPagesにまとめて印刷しておいた。
3. 友達に同席を頼んだ
一人暮らしの部屋に警察官が来るため、第三者の同席があった方がいいと思ってその日に来られる友人一人と家族一人に同席を頼んだ。
4. 部屋を片付けた
散らかり放題の部屋を片付けて人が座れるようにソファの配置換えをした。あと実家から来客用のスリッパを借りてきたりスーパーでペットボトルのお茶を買って用意したりした。

## 当日編
部屋の片付けおよび資料作りをなんとか終えて準備万端で挑んだため、大体予想通りに終わる。
ひとつだけ予想と違ったのは詐欺とかで警察に訴えた被害者が居て捜査しているのかと思ったら猥褻画像をX(Twitter)に投稿した被疑者がいて確保済みだったということ。
被疑者のX(Twitter)アカウントから当サービスに記録されていたIPアドレスをターミナルからmysql叩いて探して提出したり（うちにはレーザープリンタがあるので印刷して渡した）、自分が契約者であることを照明するためにさくらインターネットの管理画面を開いた状態で警察官の持ってきたデジカメで画面の写真を撮ったりした。画面の写真を撮るときに「画面指さして貰えたら」という指示を勘違いしてカメラに向かってピースサインして立会人の友人と家族が必死で笑いをこらえているシーンもあった。
調書は警察官の一人がテーブルの上にノートPCとモバイルプリンターを広げて内容を入力したところを印刷してもらったのを読み上げて確認。その内容も説明資料をあらかじめ作っていたためわりとスムーズに進んだ方だと思うがそれでも二時間ぐらいかかった。結構喋りっぱなしで物凄い疲労困憊した。口頭で喋るのが致命的に苦手だから個人開発やってるのに。

## 何故ぷらいべったーのIPアドレスが開示されたのか
X(Twitter)のようなログイン型SNSだと基本的にログイン時のIPアドレスしか取得しないことが多いので開示請求を行った場合、ログインした時のIPとログイン時間を開示してくる場合が多い
しかしこのログイン時のIPというのが曲者である。X(Twitter)の場合は普通にログインする以外にも外部サービスへのアプリケーションの連携を行ってログインする場合もあるからである。

アプリケーションの連携とは何か。よくログイン画面で「Twitterでログイン」とか「Googleでログイン」とか書いてあるあのボタンである。あれを押すと「（外部アプリ）へのアカウント情報のアクセスを許可しますか？」という確認画面が出てくるわけだが、そこで「連携アプリを認証」ボタンを押すことで外部サイトに対してTwitterのIDやユーザー名、アイコンやプロフィールといったアカウント情報が外部サイトに送信される。そしてTwitterに対してはその外部サイトのIPアドレスが送信される。

これが開示請求がされた時に外部サイトのサーバーのIPアドレスが開示される理由である。X(Twitter)は通常のログインとアプリケーションのログインの区別をせずに開示しているらしく、そのせいでX(Twitter)アプリケーション連携サービスのIPアドレスが開示されるという状況がまれによくある。
今回の件も警察がX(Twitter)に開示請求した複数のIPのうちのひとつがうちのアプリケーションの連携のログインだったらしい。

以前もさくらインターネットのabuse対策チームから「お客様のIPアドレスに対して発信者情報開示請求が来たんですけど」みたいな要返信メールが来たことがあり、そのときも第三者に対して誹謗中傷を行ったユーザーがTwitterアプリケーションの連携でログインしていた時のIPが開示されていたのが原因だったということがあるのですぐに分かった。
またQiitaでも[似たようなケースで家宅捜索された人の記事](https://qiita.com/204504bySE/items/1ffc94d1866d96da4793)があった。

つまりX(Twitter)が開示請求に対してアプリケーションの連携時のIPアドレスを開示するのが悪い。X(Twitter)は開示請求があったら普通のログイン時のIPアドレスだけ出してアプリケーションの連携は除外しろ。

今回、警察の人は全く失礼な感じではなかったし手続き上必要でやってるんだなというのは分かったけど、平日に二時間も警察の事情聴取に付き合うのだいぶ大変だったので本当にX(Twitter)にはなんとかしてほしい（以前弁護士からさくらインターネットを介して開示請求があった場合はメールのやりとりで済んでたし）

## 追記
アプリケーションの連携時のIPアドレスも一緒に開示される理由について、悪意のあるアプリケーションによる投稿だった場合を想定している可能性もあるという説も見かけました。
うちのアプリは読み取り権限しかないのでアプリを介して投稿するのは不可能ではあるんですが、せめて開示するときにこのIPはアプリケーションの連携ログインですみたいな注釈入れといてほしい気はする。

---
この記事は[みすてむず いず みすきーしすてむず](https://misskey.systems) [Advent Calendar 2024](https://adventar.org/calendars/10269) 3日目に投稿した記事です
Sequence Makerで制御するIR5050(高電圧絶縁抵抗計)メモリーダウンロードツール

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは様々なシーケンスを自由に組むことができますが、シーケンスの組み方を工夫すると、PCアプリに近いものを作ることができます。ここでは実際にSequence Makerを使って作られたメモリーダウンロードツールを紹介したいと思います。ファイル自体はExcelで作られているので、シーケンスを組むときの参考にもなるかも！？なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## IR5050シリーズ メモリーダウンロードツール
### 何ができるか？
> このメモリーダウンロードツールを使用することによりIR5050(高電圧絶縁抵抗計)シリーズ本体のメモリーデータをパソコンへ転送、パソコンから本体の設定を行うことができます。

（https://www.hioki.co.jp/jp/support/versionup/detail/?downloadid=1627 より引用）

:::note 
※本体とパソコンを接続するためには、DT4900-01通信パッケージ（USB）の専用通信アダプタが必要となります。
:::

::: note warn
※Office365のExcelのみ動作します
:::

### ダウンロード
ツールは以下からダウンロードできます。

https://www.hioki.co.jp/jp/support/softwaredownload/?mName=IR5050

### 最初の準備
ZIPファイルを解凍したら、Excelファイルを開いてみましょう。最初のシートに説明書きがあります。以下の準備が必要です。

- DT4900-01(通信モジュール)のドライバーインストール

::: note
DT4900-01(通信モジュール)を使用する際には、**IR5050のBluetooth機能をOFF**にしておく必要があります。**MODEキーとMEMキーを同時に1秒以上押す**とBluetooth機能のON/OFFが切り替えられます。**OFFの時は**![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/a548d601-e1a7-5ec5-49d6-20d14d947501.png)**マークが消灯**します。
:::

- Sequence Makerのインストール

:::note
Sequence Makerは**Version 1.5以上**が必要です。
:::

### 使ってみる
詳しい使い方もExcelシートに書かれています。私はIR5050の実機を持っていないので、実際に通信を試すことはできませんが、基本的にはそちらを読めばわかるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/f99f09c5-1058-2ff1-5586-b8811f295b99.png)


## まとめ
今回はIR5050シリーズ　メモリーダウンロードツールの紹介をしました。Excelファイルを見ると、コマンドでの制御の仕方や、受信した測定値の処理方法など、いろいろと参考になるところがありそうです。
Azure Document Intelligence の GA 版を利用したいなら、Form Recognizer をimportしないとダメだった

# 背景

Document Intelligence でプレビュー機能は困るって話だったので、GA版の最新を使う方法を調べてみた記録

モデルのバージョンについては以下に

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/model-overview?view=doc-intel-4.0.0

::: note warn
2024/11/30 に Document Intelligence 1.0 が GA されたので、そのまま使って OK となっています。
めでたい！ :beers: 
:::


# 結論

- Document Intelligence は、現状 Preview 版しかない

:exclamation: ンなバカなって話ですが・・

Document Intelligence へと rebrand してから、まだ GA 版が出ていない様子。
んじゃ、GA版は？ってなると・・

- Form Recognizer で利用可能。具体的には  2023-07-31(GA)

## 解説

これじゃ後から見ても分からないだろうなぁ・・ということで、追記

- Form Recognizer ⇒ Document Intelligence へと Rebrand された

この際、SDK も名称変更

- 変更後の Document Intelligence では、まだ GA 版がリリースされてない

本来であれば、以下で api_version を指定してやれば切り替えられるはずだが、上記の為、
> DocumentIntelligenceClient(api_version={api_version}) 

- 2023-07-31 以前は、Form Recognizer を使う
- 2023-10-31-preview 以降は、Document Intelligence を使う

## 具体的な置換の話

2024/12/2 現在

preview 版となる Document Intelligence でこんな感じだった場合、
> from azure.ai.documentintelligence import DocumentIntelligenceClient
> from azure.ai.documentintelligence.models import DocumentTable

GA 版となる Form Recognizer を利用するとする場合は、以下な感じで使う
> from azure.ai.formrecognizer import DocumentAnalysisClient as DocumentIntelligenceClient
> from azure.ai.formrecognizer import DocumentTable



# 詳細

## Document Intellignce の GA 最新バージョンは 2023-07-31(GA) となっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ad2c3929-925b-75e2-9bd4-951b99bd52d8.png)

ドキュメント上は、b2 までの記載だが、最新は b4

> 1.0.0b3
> 1.0.0b4

https://github.com/Azure/azure-sdk-for-python/tree/0d3d678f0f04203a6a0545069acc3168e8e2dadc/sdk/documentintelligence/azure-ai-documentintelligence#getting-started

## Form Recognizer の最新バージョンは、2023-07-31(GA) となっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/59f1d1ac-8c9f-3527-dbad-7b9f93f5ba77.png)


https://github.com/Azure/azure-sdk-for-python/tree/0d3d678f0f04203a6a0545069acc3168e8e2dadc/sdk/formrecognizer/azure-ai-formrecognizer#getting-started

# あとがき

api_version を変えて、Resource Not Found ってなった当初はさっぱりだったが、
わかってしまえば、なるほどね、って話でした。

とはいえ、名称変えても、最新GA版ぐらい使えるようにしてほしいものだ・・ :sweat:
アドベントカレンダー2日目

# 1つ目　忘れ物確認システム
　1つ目は、忘れ物確認システムです。
 
## きっかけ
　私は大学時代に限らず、教室に忘れ物をする機会が多い方でした。移動教室の際に机の下に置いたものをそのまま忘れたり、大学では学生証や傘、その日配布された資料などを入れっぱなしのまま移動してしまったりしたことが何度かありました。
  自身の不注意が招いている結果でしたが、次の移動を急いだりしてしまうとどうしても立ち去る際の確認がどうしても疎かになってしまっていました。大学4年に上がり、研究室で作業するようになってからは少なくなっていていましたが、これを解消出来たらいいと考えました。
　私が所属している研究室は、obnizで出入りの際の鍵の開け閉めと電灯の点灯消灯の2つを同時に行うようにしています。これだけでも便利ですが、私はここに新たな機能を足して、私が個人で使う用のシステムを作ることにしました。

###### 実際に使用しているプログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/f75b39f4-0287-88f6-a438-6f1e286de955.png)

###### 研究室のドア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/55d7f652-3e75-0401-84df-8cebb53e6393.png)
(研究室のドア サーボモータが取り付けられている)

###### 研究室の電気スイッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/01c75a95-d0fb-15b1-fa0b-f069b49e3460.png)
(研究室の電気スイッチ サーボモータはグルーガンと結束バンドで固定している)

###### 起動するとこんな感じ
　鍵の開閉をするシンプルなシステムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/a441499e-e505-617c-cfb4-c8bcc723ab56.png)

## 実際に作ってみる
　研究室で使っているプログラムに、以下のような部分を追加した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/5c69fb5a-0f91-4661-d0eb-ad103d30a7d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/7ea66aee-6890-803d-555b-811fd7844de1.png)

　元のプログラムに、忘れ物はないかもう一度見返して忘れずに持って帰ろう、とAIに喋るように設定し、聴覚で情報を受け取ることができるようにしました。ですが、学校内ではスマホは消音サイレントにしている確率が高く、気付かないケースの方が多いのではないかと思ったため、改良をしました。
　obnizの起動画面を立ち上げ、開け閉めのボタンが出現する際に忘れ物が無いかをテキストデータで表示し、促すように改良しました。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/3e6eacd9-4d67-3552-5687-60c679c39489.png)
　ここではいを選んで押すと、鍵が閉まるようになっており、いいえを選ぶと鍵が開くようになっている。

 本来は、スマートロックのボタンを押した後に忘れ物が無いかを表示したかったのですが、ブロックプログラムでは上手くいかず断念しました。

## 感想
　これを個人的に利用することで、忘れ物が無いかテーブルの下を確認するようになり、多少の効果は見られたと感じています。
普遍代数・Lawvere理論の用語調べ（その１）

## はじめに
Plotkin-Powerの代数的効果（algebraic effects）を理解したい。ただし、それには普遍代数・Lawvere理論の理解が必要になるようだ。おどろおどろしいネーミングだが、エミリー・リールの[スライド](https://math.jhu.edu/~eriehl/lambda.pdf)を眺める限り、そこまで難しくないと踏んでいる。圏論の専門家エミリー・リールによるプログラミングのモナドが必要な理由も普通に考えてショボいものであった。
* [エミリー・リール（Emily Riehl）による計算効果（モナド）の説明](https://qiita.com/iHdkz/items/9e349c0ef46a663b4dd9)
要約（プログラミングのモナドが必要になる理由は、A → T B 型プログラム（T-プログラム）が合成できる（圏になる）ようにするため）

以上のこともあり、現実的な労力で代数的効果のアイディアに到達できると思っている。

ただ、概観を眺められそうな文献を訳してみたが、専門的なところでさっぱり意味がわからなかった。
* [【翻訳】普遍代数の圏論的理解：Lawvere理論とモナド](https://qiita.com/iHdkz/items/46d87597365e782b0a77)

千里の道も一歩からということで、まず用語調べから始める。でも、普遍代数の情報ってほとんどないので難航しそう。と思っていたら、
* [圏論 Advent Calendar 2024](https://adventar.org/calendars/10265)

1日目、２日目とすごくタイムリー（当然じっくり読んで理解しないとわからないが、少なくとも定義が書いてある）。

## 用語
### クローン（clone）
Aを空ではない集合、$\mathcal{O}(A)$をA上のすべての有限的演算（finitary operations）の集合とする。
すなわち、$\mathcal{O}(A)$ は、分離和（disjoint sum）を用いた次の形式を持つ
$\mathcal{O}(A) = \coprod \mathcal{O}_n(A)$
ここで、$\mathcal{O}_n(A)$ は、A上の全てのn項演算（n-ary operations）の集合である。

任意の m 項 $\alpha_1,\cdots \alpha_m \in \mathcal(O)_n$ と $\beta \in \mathcal{O}_m$ が与えられたとき、（なお、ここで合成順序は普通とは逆とする）
(1)　全ての $c \in A^n$ に対して、$c \gamma = (c\alpha_1)\cdots (c\alpha_m)\beta$
で定義される n 項演算 $\gamma$ がただ一つ存在する。
演算 $\gamma$ は $\alpha_1 \cdots \alpha_m \beta$ で表すものとし、$\alpha_1, \cdots \alpha_m$ と $\beta$ の **合成（composition）** と呼び、
(2)　$c(\alpha_1 \cdots \alpha_m \beta) = (c \alpha_1)\cdots (c \alpha_m) \beta$
と書くことができる。

各 n > 0 に対して、次で定義される n 項演算 $\delta_n^{(i)} \in \mathcal{O}_n$ が存在する。
(3)　$c \delta_n^{(i)} = c_i$ ここで、 $c = (c_1,\cdots,c_n) \in A^n$ とする。
$\delta_n^{(i)}$ は、i番目の座標の要素を選び出すものであり、$\delta_n^{(i)}$ は、**単位演算子（unit operator）** と呼ぶ。

A上の演算の任意の集合で、(1)と(3)の演算を許すもの、すなわち合成の下で閉じており単位演算を含んでいるものを、A上の演算で閉じた集合（closed set of operations on A）、もしくはより簡単にA上の**クローン（clone on A）**[^Hall]と呼ぶ。

### 参考
* Paul M.Cohn, "Universal Algebra" 1981版（数少ない普遍代数の教科書だがLawvere理論については詳しくない）
[^Hall]:P.Hallという人による用語らしい。

## シグネチャ（signature）
S を集合とする。S-シグネチャ（signature）とは、
* 集合 $\Omega$
* 写像 $ar : \Omega \rightarrow S^{<\omega}$ [^Omega]
* 写像 $t : \Omega \rightarrow S$

から成る組 $(\Omega,ar,t)$ を言う。
S の元はソート（sort）と言う。
$\Omega$ の元は関数記号（function symbol）と言う。
各関数記号 $\omega \in \Omega$ について、ソートの語 $ar(\omega)=(s_1,...,s_n)$を、そのアリティ(arity)と言う。
ソート $t(\omega)=s$ を型（type）と言う。

### 参考
* [圏論的普遍代数学入門](https://ykawase5048.github.io/yutokawase/notes/IntroCatUnivalg.pdf)

[^Omega]: $S^{<\omega}$：集合Sの元からなる有限長さの語全体の集合

## まとめ
情報も少なく、調べながらになるので、気長にやっていきたい。
KPIビジュアルの小ネタ

この記事は、**Microsoft Power BI Advent Calendar 2024** シリーズ2の12月13日担当分の記事です。

https://qiita.com/advent-calendar/2024/powerbi

# 1. はじめに
2024年11月に **Power BI Lightning Talk 会 6** で登壇させていただいた「KPIビジュアルの小ネタ」の内容です。

https://powerbi.connpass.com/event/336027/

**Docswell**にスライドを初投稿してみましたが、未来の自分が「スライドだけ見てもよくわからんのでは？」と思い、この記事で説明文を入れることにしました。

https://www.docswell.com/s/mameshiba_toro/K7R4GJ-2024-11-30-094440

# 2. KPIビジュアルの概要

## 2-1 Microsoft Learn 1次情報
> 進行状況や目標までの距離を測定するため。「どれくらい進んでいるのか、それとも遅れているのか」という質問に答える

https://learn.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-kpi?tabs=powerbi-desktop

ビルドペインから **△▽** マークのアイコンを選択し、**値**、**トレンド軸**、**ターゲット** を設定することで下のような**KPIビジュアル**が表示されます。

![KPIビジュアルの概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/8bb47760-944c-4e46-b4ed-f63e30ad6da5.png)

## 2-2. こんな経験ありませんか？
KPIビジュアルは、正しく理解しないとよくわからない挙動に出会うかもしれません。こんな経験はありませんか？

![こんな経験ありませんか？.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/569b48d6-ad2d-f5b6-118a-96c259e88773.png)

左の **「トレンド軸が正しくない」** については、Learnに解決策が記載されています。KPIにはトレンド軸の並び替え機能がありません。いったん別のビジュアルに置き換えて並び替えましょう。この記事は、真ん中の **「値が（空白）になる」** と右の **「中間色を使いたい」** についての調査結果を小ネタにしています。

# 3. Tips: なぜ値が（空白）になるのか？
## 3-1. 調査結果
::: note warn
**値**が（空白）になるのは、**トレンド軸**の最新の**ターゲット**の存在が起因している
:::

KPIビジュアルは**トレンド軸**の最新の**値**と**ターゲット**を表示します。対策前（左図）では、最新の**ターゲット**は存在していますが、最新の**値**は存在していません。よって（空白）を表示します。正常な動きです。対策後（右図）では、最新の**ターゲット**と共に最新の**値**も存在しています。

![なぜ値が(空白)になるのか？1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/44e214eb-5990-f248-9a98-cf8aea60a891.png)

![なぜ値が(空白)になるのか？2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/8f3c8a3c-ba41-0158-50ef-66a86427168e.png)

## 3-2. 対策
::: note
**値**が（空白）のときは、**ターゲット**も（空白）にする
:::

```:対策前のターゲット
Sales LY =
CALCULATE (
    [Total Sales],
    SAMEPERIODLASTYEAR ( 'DimCalendar'[Date] )
)
```
```:対策後のターゲット
Target Sales =
IF (
    ISBLANK ( [Total Sales] ),
    BLANK(),
    [Sales LY]
)
```

# 4. Tips: 中間色を表示させるには？
## 4-1. 調査結果
::: note warn
* ターゲットが**1つ**の場合、`正しい色`と`正しくない色`の**２色**になる
* ターゲットが**2つ**の場合、`正しい色`と`中間色`と`正しくない色`の**3色**になる
* ２つのターゲットの上限と下限の範囲内が`中間色`となる
:::

![中間色を表示させるには？1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/f55d7b47-93be-bde1-b60a-f569a781b30f.png)

## 4-2. 対策
::: note
`中間色`を表示させるには、ターゲットを**2つ**設定する
:::
**ターゲット**を定数にすると、**トレンド軸**の最新が**常に**存在している状態になります。**値**が（空白）にならないようにしたい場合はDAXメジャーに前述のTipsを使います。必要なければ定数のみでOKです。

```:中間色の上限（ターゲット1つ目）
KPI Upper =
IF (
    ISBLANK ( [Total Sales] ),
    BLANK(),
    0.10 //中間色の上限を+10%とする場合
)
```
```:中間色の下限（ターゲット2つ目）
KPI Lower =
IF (
    ISBLANK ( [Total Sales] ),
    BLANK(),
    -0.10 //中間色の下限を-10%とする場合
)
```

# 5. まとめ
::: note
* **値**が（空白）のときは、**ターゲット**も（空白）にする
* `中間色`を表示させるには、ターゲットを**2つ**設定する
:::
以上、小ネタでした🙇

# 参考
https://powerbi.connpass.com
登録必須のPC効率化設定まとめ

## はじめに

新しいPCを購入したり、配布されたときにいつも同じようなPC設定をしているので一覧でまとめておこうと思う。

本記事は僕が登録している作業を効率化する設定を一覧にした記事である。

PCで作業を行う人にとっては参考になる設定を一覧にしたつもりなので、参考してもらえると幸いだ。

僕はWindowsユーザーなので、本記事ではWindowsでの設定を紹介している。Macでの設定についてはご自身で調べていただきたい。

## Google日本語入力

文字入力ソフトは「Google日本語入力」をオススメする。

https://www.google.co.jp/ime/

「きょう」と入力すると「2024/11/29」と今日の日付形式に変換できたり、「zl」と入力すると「→」に入力できる。「101ー0021」と郵便番号を入力すると「東京都千代田区外神田」と住所に変換できる。矢印や日付は頻繁に使う文字なので、入力を覚えておくと良いだろう。

変換機能の優秀さに加えて、数値やスペースをデフォルトで半角入力に設定することができる。数値やスペース、アンダーバーなどは半角以外はほぼ使わないので、デフォルト半角設定にすることをオススメする。

### 便利な変換まとめ

Google日本語入力で変換できる便利な変換まとめ

| 入力値 | 変換値 |
| --- | --- |
| zh | ← |
| zj | ↓ |
| zk | ↑ |
| zl | → |
| きょう | 2024/11/29 |
| きのう | 2024/11/28 |
| あした | 2024/11/30 |
| ことし | 令和6年 |
| 101－0021 | 東京都千代田区外神田 |

### オススメ設定

Google日本語入力のプロパティから以下の設定は変更しておくことをオススメする。

- 「数字」の変換前文字列：半角
- 「#%&@$^_|\」の変換前文字列：半角

## カーソル速度

マウスカーソルの速度は最大に設定しよう。カーソル速度が遅いと画面を移動するのに時間がかかって効率が悪い。僕の考えとしては、カーソルの速度は速ければ速いほど良いと思っている。

Windowsの場合は「設定」→「Bluetoothとデバイス」→「マウス」から「マウスポインターの速度」を設定できる。これを最大値に設定することをオススメする。

僕はロジクールの「M575」というトラックボールを利用していて次のような設定環境になっている。Windowsのマウスポインター設定を最大に設定、加えてロジクール専用の設定アプリ「Logicool Options」でポインタ速度を75%に設定している。この設定環境では、デュアルディスプレイの端から端まで一瞬で移動することができる。

カーソル速度を速くすると最初は慣れないと思うが、速いほうが効率は上がるので、ぜひ最大速度に設定することをオススメする。

## コピー履歴の有効化

「Windowsキー」+「V」でコピーの履歴を保存することができる。2個前のコピーを貼り付けたいときなどに便利な機能だ。

設定したことが無い人は「Windowsキー」+「V」を押すと有効にできる。すぐに有効にできる設定なので、まだ有効にしてない人はすぐに設定しよう。

## 辞書登録

よく使う文字列は辞書登録しておこう。

最低限、定型文、人名、個人情報あたりは登録しておくことをオススメする。

### 定型文

定型文は、「お世話になっております。」「よろしくお願いします。」などのメールやチャットでよく使う文言のこと。

僕は、

「おせ」で「お世話になっております。」

「よろ」で「よろしくお願いします。」

が変換できるように設定している。

### 人名

取引先の人名や、社内のメンバーの人名は登録することをオススメする。

人名については、入力の効率化の観点と間違い防止の観点がある。

特に、渡辺さんや斉藤さんなどの、複雑で多様な人名は最初に正しい名称を登録しておくことで間違いを防止できる。

### 個人情報

自分のメールアドレスや自分の会社名に関しても、入力する機会が多いので辞書登録をおすすめする。

## まとめ

本記事では僕が実施している様々な効率化設定を紹介した。今回紹介した内容以外で効率化できる情報を持っている人はぜひ共有していただきたい。
UiPathFes2024LTの登壇者が説明する資料の簡単な作り方と発表までの下準備~ここまでやれば大丈夫と思える！~

渡辺さんから冗談ですか？と思われるくらい軽いノリでLTのお誘いを1ヶ月以上前に受ける

たいどんさんに、渡辺さんのお誘いは本気だと思いますか？と質問する

たいどんさんから熱く背中を押してもらう

渡辺さんにLTやります、と宣言する

イルシルという生成AIのパワポのようなツールを見つける

オートパイロットの作成過程で生成AIにドッキリをしかけるというアイデアを思いつきパワポ作成

渡辺さんにパワポを提出し、別のツールのプレゼンみたいですね、と優しくダメ出しを受ける

パープレキシティーとクロード3.5を使ったアイデアを思いつく

2時間ほどで骨格となるプレゼン資料が出来上がる

既存のアイデアでないかをアズワン株式会社の福田様にプレゼンしながらご確認頂く

問題なさそうなので、内容修正し、翌日顧問先の会社様に生成AIの共有も兼ねてプレゼンする

翌日修正点をまた直す

他の顧問先様にも生成AIの共有を兼ねてプレゼンする

また修正点を直す

プレゼン数日前に、やっとパワポのノート(カンペ部分)にカンペを書く

ただ読むだけで6分超えとなる

要らないスライドを消して、話し言葉を減らすためにスライドに文字を書き込む

それを何度も繰り返す

5分を切ったところで、カンペを何度も読んで話しやすい言葉にカンペを変える

どうしても噛んでしまう言葉をひたすら繰り返す、パープレキシティー、パープレキシティー、パープレキシティー、、、

これ以上修正なさそうとなったら録音して、移動中などひたすらリピート再生で聞く

一つ一つのフレーズが塊になり、その時だけカンペから目を離し、会場を見る余裕を持てるようにする

あとは表情を豊かにを意識して当日、ギリギリまで何度も練習する

以上です。
DB設計について①

## システムとデータベース
### DBをマスターしたい
今回はソフト開発に欠かせないDBについて学習したことをまとめました
内容は以下の書籍を自分なりに噛み砕いて要約したものとなっています
同じ悩みのある方や、自分の振り返り用としても活用できればと思います

#### 参考文献
[達人に学ぶDB設計徹底指南書](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798124702)

---
### 目次
1. データベースの概要
1. システム開発の設計工程
1. 設計工程とデータベース
1. スキーマ
---
### 1.データベースの概要
#### データベースとDBMS
データベースは利用可能な状態にしているデータの集まり
DBMSはデータベースを管理するための言葉
「データベース」と「DBMS」では上記のような違いがある
ちなみにここでいう「データ」とは
ある形式（フォーマット）に揃えられた事実のこと

#### データベースの種類
* リレーショナルデータベース（RDB)
　現在最も広く利用されているデータベース
　二次元表の形式で管理 <br><br>
* オブジェクト指向データベース（OODB)
  データと操作をまとめて「オブジェクト」という単位で管理
  オブジェクトをデータベースに保存するため作られた<br><br>
* 階層型データベース
  データを階層構造で表現するデータベース

### 2.システム開発の工程と設計
####システム開発の設計
1. 要件定義
　必要な機能やサービスの水準、すなわち要件を決める工程
  外部の顧客や社内で定義する<br><br>
1. 設計
  定義された要件を満たすために必要なシステムを作るための設計を行う工程<br><br>
1. 開発
  設計書に従ってシステムを実際に作る工程
  IT業界では「実装する(implement)」という
  コーディングやサーバーの構築なども指す<br><br>
1. テスト
  実装したシステムが実用にたえる品質であるか試験する工程

#### 設計工程と開発モデル
1. ウォーターフォールモデル
要件定義→設計→実装→テストを1つずつ工程を踏んで段階的にシステムを作る
手戻りが難しく、改修が高コストになりがち<br><br>
1. プロトタイピングモデル
サイクルを繰り返す循環的な開発手段
小さな試作品（Prototype)を作ってフィードバックをもらう
要件定義の取りこぼしや意思疎通の齟齬を防げるのがメリット
変更を繰り返すうちに発散して収拾がつかなくなるリスクあり

### 3.設計工程とデータベース
#### データ設計の重要性
データ設計は設計工程の中でも重要である。
理由は以下の2点
1. システムにおいて大半のデータはデータベース内に保持されるため。
1. システムの品質を最も大きく左右する。ソフトウェアは「データの流通機構」
であって、プログラムはデータをどのように設計するかに左右される

#### DOAとPOA
* POA(Process Oriented Approach)
プロセス中心アプローチ
業務処理は短期間で変化することも多いため非効率
複数のプロセスで同じデータを別個に持つという冗長性が生じる

* DOA(Data Oriented Approach)
 データ中心アプローチ
 データはあまり変化しないことを利用
 複数のプログラムで共用することも容易で、業務要件の仕様変更にも柔軟に対応可

### 4.スキーマ
#### スキーマとは？
 　データベースのデータ構造やフォーマットという意味
#### ３層スキーマ
1. 外部スキーマ
外部モデル＝ビューの世界
システムの利用者であるユーザーから見て、DBがどのような機能と
インターフェースを持っているか定義するスキーマ
いわゆる、「ユーザーから見たデータベース」の姿 <br><br>

1. 概念スキーマ
DBに保持するデータの要素および、データ同士の関係を記述するスキーマ
いわゆる、「開発者から見たデータベース」の姿
この概念スキーマの設計を「論理設計」と呼ぶ<br><br>
1. 内部スキーマ 
概念スキーマで定義された論理データモデルを、どのようにDBMS内部
に格納するかを定義するスキーマ
テーブルやインデックスの物理的定義を含む
内部スキーマの設計を「物理設計」と呼ぶ

#### 概念スキーマとデータ独立性
* 概念スキーマは何のためにあるのか？
外部スキーマはシステムの機能や使い勝手にダイレクトに関係するので必須
内部スキーマはデータを実際にDBMS内部に格納するための形式なので必須
概念スキーマは、、、？

* もし、概念スキーマがなかったら？
もし、２層だと変更に対する柔軟性がなくなる
外部スキーマを変更する際に、内部スキーマも変更する必要が出てくる（逆も然り）
＝変更に弱いシステムになってしまう
つまり、概念スキーマは外部スキーマと内部スキーマの間の緩衝材の役割

* データ独立性
スキーマの独立性のことを、データ独立性と呼ぶ
外部スキーマからの独立性を論理的データ独立性、
内部スキーマからの独立性を物理的データ独立性と呼ぶ
モンテカルロシミュレーション

## モンテカルロシミュレーションとは
きちんとした定義は色々な文献で散見されるので、ここでは自分なりの理解を述べます。

モンテカルロ法とは、**①論理的に数値を直接導きにくい場合に**、**②確率的な問題に置き換え**、**③大量の試行回数を用いて近似的な数値を求める**手法です。

以下、この定義をもとに例を考えてみます。

## ①論理的に数値を直接導きにくい場合
例えば、円周率$π$の値がわからないとします。
数学者ではないので、論理的に$π$の値を導くのは厳しいとしましょう。

そこで、確率的に求める方法を考えます。

## ②確率的な問題に置き換える

面積の関係を利用して、確率の問題に置き換えてみます。
2x2の正方形の中に半径1の正円があるとして、この正方形内にランダムな点を打ち、それが円の中にある確率を$p$とします。
ここで以下のように面積の関係を利用すると：

- 正方形の面積：$4(=2×2)$
- 円の面積：$𝜋⋅𝑟^2=𝜋⋅1^2=π$
- 点が円の中に入る確率：$p=\frac{円の面積}{正方形の面積}=\frac{𝜋}{4}$

$p$についての式を導けます。

この確率$p$を大量の試行によって近似的に求めることで、円周率$π$を計算できます。

|2x2の正方形と半径1の正円|
|:--:|
|![スクリーンショット 2024-12-02 22.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933005/4cfaa8dd-0440-6e39-ab2d-99eddec1ece4.png)|

## ③大量の試行回数を用いて近似的な数値を求める
最後にコンピューターによるシミュレーションで$p$の値を求めます。
人の手ではできないので、シュミレーションであることが重要です。

さて、当然プログラムを書くわけですが、書きやすいように条件を次のように読み替えます：
<br>
```math
\text{正方形内のランダムな点}\Leftrightarrow 範囲が[-1,1]のランダムな二つの値

```
```math
円の内側\Leftrightarrow　(原点からの距離) \leq 1
```

<br>
コードは以下のようになります↓<br>
（※プログラムは$p$を求めてから、πを求めるところまで書いてます。）

```python
import numpy as np
num_samples = 1000000  # 試行回数
radius = 1            # 円の半径

# ランダムに点を生成 [-1, 1) の範囲
x = np.random.uniform(-1, 1, num_samples)
y = np.random.uniform(-1, 1, num_samples)

# 丸め込み誤差で1.0を含むようにする
x_fl32 = np.float32(x)
y_fl32 = np.float32(y)

# 円の内側にある点を判定
inside_circle = (x_fl32**2 + y_fl32**2) <= radius**2

# 円周率を近似
probability = np.sum(inside_circle) / num_samples  # 円内の点の割合
approx_pi = probability * 4  # 正方形の面積比からπを計算
print(approx_pi)
```
$\text{approx_pi}\approx3.14...$に近似ができました。

終わり
Python の SymPy と Julia の SymPy

Python の  SymPy と Julia の SymPy の違う点

Python の SymPy と Julia の SymPy にはいくつか注意すべき違いがある。Julia の SymPy は Python の SymPy をラップしたパッケージであり，多くの機能が共通しているが，言語の違いやラッパーとしての実装の影響で異なる点がある。

## 1. 主な違い

### 1.1. シンボリック変数の定義

- Python

symbols 関数を使い文字列でシンボル名を指定する。


```python:python
from sympy import symbols
x, y = symbols('x y')
```

var も使える。こちらのほうが便利。

```python:python
from sympy import var
var('a, b, c')
```

- Julia

@syms マクロを使い，変数を直接定義する。

```julia:julia
using SymPy
@syms x y
```


### 1.2. 変数の再代入

- Python
シンボリック変数 x に値を再代入すると，x は完全に新しい値（数値や式）になる。元の x は保持されない。。

```python:python
x = symbols('x')
print(x)  # x
x = 5
print(x)  # 5
```

- Julia

同様に，シンボリック変数 x に数値を再代入すると，元の x は数値として扱われる。

```julia:julia
@syms x
println(x)  # x
x = 5
println(x)  # 5
```


### 1.3. 型システム

- Python
Python は動的型付け言語のため，すべてのオブジェクトの型が実行時に決定される。SymPy のシンボリック変数も特に型を意識する必要はない。
- Julia
Julia は静的型付け言語であるが，SymPy では SymPy.Sym 型が使われる。型の違いを意識しながら操作する必要がある。

```julia:julia
@syms x
println(typeof(x))  # SymPy.Sym
```


### 1.4. 演算の結果

- Python
演算結果は SymPy の式オブジェクト (sympy.Basic 派生クラス) である。

```python:python
from sympy import symbols
x = symbols('x')
expr = x + 2
print(expr)  # x + 2
print(type(expr))  # <class 'sympy.core.add.Add'>
```

- Julia
Julia の SymPy も基本的には同様の挙動であるが，型名が異なる。

```julia:julia
@syms x
expr = x + 2
println(expr)  # x + 2
println(typeof(expr))  # SymPy.Sym
```


### 1.5. 関数の使い方

- Python
すべての関数は明示的にインポートする必要がある。

```python:python
from sympy import sin, cos
x = symbols('x')
print(sin(x) + cos(x))
```

- Julia
Julia の SymPy では，シンボリック関数は基本的に Python の SymPy をラップしており，SymPy.sin のように明示的に指定することもできる。

```julia:julia
using SymPy
@syms x
println(sin(x) + cos(x))  # sin(x) + cos(x)
```


### 1.6. 数値計算 (数値評価)

- Python

evalf を使用する。

```python:python
from sympy import symbols
x = symbols('x')
expr = x + 2
print(expr.evalf(subs={x: 3}))  # 5.0
```

- Julia

subs 関数を使い，さらに値を浮動小数点数に変換する必要がある。

```julia:julia
@syms x
expr = x + 2
println(subs(expr, x => 3.0))  # 5.0
```


### 1.7. パフォーマンス

- Python の SymPy は Python ネイティブで実行されるが，Julia の SymPy は Python 呼び出しを介して実行されるため，速度やパフォーマンスの面でオーバーヘッドがある。
- 数値計算が多い場合は，Julia の他のネイティブライブラリ（例：Symbolics.jl）を検討すると良い。

### 1.8. 互換性

- Python の SymPy は常に最新バージョンの機能を利用できる。
- Julia の SymPy は Python の SymPy に依存しているため，インストールされている Python の SymPy バージョンに依存する。

## 2. まとめ

- Python の SymPy はオリジナルで，ほぼ制限なく使える。
- Julia の SymPy は Python の SymPy をそのまま利用できる利便性があるものの，パフォーマンスや型の扱いに注意が必要である。
- Julia で純粋にシンボリック計算をしたい場合は，Symbolics.jl も検討すると良い。
ライブ参戦服の参考にしたくて、推し活コーデのアプリ作ってみた件

初めまして。りんころと申します。
プログラミングスクールRUNTEQに入学し、エンジニア転職目指してRubyonRailsを中心としたプログラミングを学習しております。
今回、スクールのポートフォリオで推し活の際のコーデを投稿するサービス『Style-LOVE』を開発しました。
初めてのアプエリ開発だったので開発中に思ったことや、アプリについてを今回、記事にまとめてみました。
# Style-LOVE
https://style-love.net/

# サービス概要

- オタクの方が活動する際の、推し活&オタ活コーデを共有するアプリです。
- ユーザーが公開したアイテムの購入元のリンクを表示できる機能も追加します。

**このサービスへの思い・作りたい理由**
コーディネートの共有アプリは複数存在するが、推し活に特化したコーディネートの共有サービスはあまり見かけないので この機会で作ってみたいと思いました。

# ユーザー層について
推し活する若年層の女性をターゲットに開発予定です。

# サービスの利用イメージ

- ユーザーが推し活の際に、参考コーデを手軽に探せて、アイテムの購入を容易に行えるようにできます。
- 自分のコーディネートの参考にもできます。

# ユーザーの獲得について
- SNS（『X』等）および、 RUNTEQ内のコミュニティを活用して、アプリの存在を広める予定です。

# サービスの差別化ポイント
- コーデの紹介をできる機能で自分の子でについて説明できます。
- 推しカラーや、作品名、キャラの（アイドル名前）などによる検索機能も実装しています。（コーデのタイトルおよび本文兼用の検索フォーム実装）
- コーデに使用したアイテムを任意で紹介でき、かつ閲覧ユーザーがアイテム購入元にも移行できるようにしています。

# 実装機能

ユーザー認証機能（ログイン機能）

ユーザー作成機能

推し活コーデ投稿機能 

コーデアイテム投稿機能 

投稿に関するコメント機能 

投稿のお気に入り機能 

投稿検索機能：タイトル、ユーザー、カラー、推しのカテゴリー等で検索できます。 

プロフィール機能

# 使用技術

開発環境：Docker

バックエンド：Ruby 3.2.2 / Rails 7.1.3

フロントエンド：Turbo, TailwindCss, daisyUi

データベース：PostgreSQLインフラfly.io, AWS(s3)認証Sorcery ・ lineOAuth

# ER図

https://camo.githubusercontent.com/77c5941a8e65976bcbd8f7b5cb1891432be6056a2f568d69594f22a139334741/68747470733a2f2f692e6779617a6f2e636f6d2f34373837393435303962343531376264646439333638353438623337306135632e706e67

# アプリ開発を通して…

まずは、今回のアプリ開発の際に、お力添え頂いた全ての方々に心よりお礼申し上げます。
今回初めて一から、アプリを開発という貴重な経験をさせていただきました。
この経験からまず思ったことは、**自分はまだまだだなーっと**改めて思いました。
今回アプリのデザイン周りをtailwindCSSで実装しましたが、コード分量が長なるため、次の開発の際には、一からCSSで分割してコードをスッキリさせたいなと思いましたし、次はLaravel等のフレームワークで開発もして、自分のスキルを磨いていきたいと思いました！
最後まで閲覧してくださりありがとうございました！！
ABC157 Dの解法メモ【Ruby】

入水目指して過去挑戦して解けてないAtCoder Problems上でDifficultyが水色の問題を解いていく。

# [ABC157 D: Friend Suggestions](https://atcoder.jp/contests/abc157/tasks/abc157_d)概要

同じ"人"の頂点に対して"友達"による辺と"ブロック"による辺の2つの単純無向グラフがある。
それぞれの頂点に対して"友達"になれる頂点(※)の数を求める問題。
※"友達"になれる頂点: "友達"の辺からなるグラフの連結成分であり、"友達"の辺も"ブロック"の辺も持たない頂点。

# 解法イメージ
問題文の通りに解くと、各頂点に対して"友達"の辺を辿っていき、それぞれの頂点に対して友達かブロックになっているかどうかをチェックしていくことになるが$ \mathcal{O}(N^2) $程度かかってしまうので間に合わない。

連結なグラフがある時、友達になれる可能性のある頂点は連結なグラフにある頂点の数から自身をのぞいた数になる。そのうち、すでに友達になっている頂点とブロックしている頂点を除外した数が実際に友達になれる頂点の数になる。
よって、入力制限から友達の辺やブロックの辺は重複することがないので、Union-Find木を利用して連結な頂点数を求めて各頂点から伸びている友達の辺とブロックの辺の数を引いた数を計算すると答えが出てくる。
ただし、ブロックは連結ではない頂点との辺になっていることがあるので除外すること。

# 実装例

```ruby
# Disjoint Set Union
class DSU
  # https://github.com/universato/ac-library-rb/blob/main/lib/dsu.rbのコピペ
end

n, m, k = gets.split.map(&:to_i)
tree = DSU.new(n + 1)
marr = Array.new(n + 1, 0) # すでに友達になっている頂点の数
karr = Array.new(n + 1, 0) # すでにブロックしている頂点の数

m.times do
  a, b = gets.split.map(&:to_i)
  marr[a] += 1
  marr[b] += 1
  tree.merge(a, b)
end
k.times do
  a, b = gets.split.map(&:to_i)
  # 連結ではない頂点のブロックは除外する
  next if !tree.same?(a, b)

  karr[a] += 1
  karr[b] += 1
end

puts (1..n).map { |i| tree.size(i) - marr[i] - karr[i] - 1 }.join(" ")
```
chrome-extensionをSPAプロダクトに適用する

ミニマムコードサンプル

https://github.com/tonakai-it/extension-on-spa-sample

## content_scriptをSPAプロダクトに対して使う際の困難
SPAプロダクトの場合、`DOMContentLoaded`やmanifest.jsonの`"run_at": "document_end"`ではDOM取得ができない。  
マウントのタイミングにもよったり、`useEffect`で遅延する場合もある。

## MutationObserverを使う
```javascript:injection.js
/** MutationObserverを使う */
function AttachClass(mutationList) {
  for (const mutation of mutationList) {
    if (mutation.type === 'childList') {
      /** 対象のタグがあるか確かめる */
      const nodeList2 = document.querySelectorAll('tbody tr td');
      if (nodeList2.length) {
        console.log(nodeList2);
        for (const element of nodeList2) {
          /** 数回呼ばれるので、1回だけ実行されるようにする */
          if (element.textContent === 'santa' && !element.classList.contains('bgc-yellow')) {
            element.classList.add('bgc-yellow');
            console.log('Call Once');
          }
        }
      }
    }
  } 
};

const observer = new MutationObserver(AttachClass);
observer.observe(document.body, {
  childList: true,
  subtree: true,
});
```

https://developer.mozilla.org/ja/docs/Web/API/MutationObserver
Box for Microsoft Officeで共同編集をしよう！

## Box for Microsoft Officeとは
昨年リリースされたBox for Microsoft Officeですが、ユーザーの方の待望の機能にも関わらずまだまだ利用されていない方がたくさんいらっしゃいます！
なので、昨年度も投稿しましたがもっともっと利用してほしいという気持ちを込めて再度投稿させて頂きました。
Box for Microsoft OfficeはBoxからOffice製品（Word,Excel,PowerPoint)利用時にデスクトップアプリで共同編集ができる機能です！なんとBox Driveからファイルを開いたときも共同編集が可能になる、素晴らしい機能です。


### Box for Microsoft Officeの概要
Box for Microsoft Officeの共同編集機能により、Boxに保存されているOfficeファイルでのリアルタイムコラボレーションが可能になり、すべての編集内容がBoxに自動保存されます。ユーザーは、デスクトップ、ウェブ、モバイルのいずれで作業している場合でも、Box内のMicrosoft Word、Excel、PowerPointドキュメントを開いたり、作成、編集、コラボレーションする柔軟性があります。
[Box for Microsoft Office（Box Supportページ）](https://support.box.com/hc/ja/sections/21356627124627-Box-for-Microsoft-Office)

### どうやって使うの？？
チームメンバーと共同編集する場合は、以下の手順で実施します。
1. Boxウェブアプリまたはデスクトップファイルフォルダから [ファイル] に移動します。
2. 目的のOfficeファイル (.docx、.xlsx、.pptx) を開きます。
ウェブアプリの場合は、右上にある [開く] から「Despktopアプリ」をクリックします。
![Open Office file Preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626297/f9fc2ac4-cd5a-1501-5e01-0d9a80968ea2.png)
3. 編集を開始します。同時に作業しているメンバーがわかります。
![Multiple user session.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626297/1c18abac-5563-d807-d95f-21827eb11ea1.png)

4. 編集が完了したら、ファイルを閉じます。ファイルは、正常に保存されるまで開いたままになります。

:::note info
なんと、BoxDriveでファイルを開いても共同編集で開くことが可能です！！

:::

### どうやったら使えるようになるの？？
**利用するためには、管理コンソールでの設定利用ユーザーでの設定が必要です。**

#### 管理コンソールでの設定方法
1. 管理コンソールの左側のサイドバーで、[アプリ] をクリックします。
2. [Box for Microsoft Office] まで下にスクロールします。
![mceclip0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626297/5b8af6cb-1e5b-5120-389f-e9bfcc4bfb3e.png)
3. [構成の編集] をクリックします。
4. 以下より利用するユーザー範囲を選択します。
    - [すべての管理対象ユーザーに対して有効にする] 
    - [選択したユーザーに対して有効にする] 
5. [保存] をクリックします。

詳細は[こちらのSupportサイト](https://support.box.com/hc/ja/articles/17956056014995-Box-for-Microsoft-Office共同編集機能の有効化に関する管理者向けガイド)をご確認ください。

#### 利用ユーザー毎での設定方法
共同編集を開始するには、Microsoft Officeデスクトップアプリでオンラインの保存場所としてBoxを追加します。ご利用のオペレーティングシステムに応じて以下の手順を実行します。

1. Microsoft Word/Excel/PowerPointで、[ファイル] メニューオプションをクリックします。
2. 左側のナビゲーションペインで、[開く] をクリックします。
3. [場所の追加] をクリックします。
4. [Box] を選択します。
![Windows Gif - CoAuth Enablement-103 (dragged).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626297/54802c06-6628-878c-fe14-d9cc33459663.png)

5. Boxの資格情報を使用してサインインします。 
![Windows Gif - CoAuth Enablement-122 (dragged).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626297/07b1e7d0-23e8-009c-0a06-a80f77e0e14b.png)

詳細は[こちらのSupportサイト](https://support.box.com/hc/ja/articles/5954058378899-Box-for-Microsoft-Office共同編集機能の有効化ガイド)をご確認ください。


### 注意事項
以下の既知の制限事項がありますのでご注意ください。
- Microsoftライセンスの互換性: Officeの永続ライセンス (例: Office 2016、2019) は、Boxファイルの共同編集をサポートしていません。
- Boxで、フォルダのコラボレータを非表示にするオプションのチェックボックスがオンになっている場合は、そのフォルダ内のファイルを共同編集できません。
- Excel内の外部リンクは、Boxに保存されているファイルを共同編集する場合、完全にはサポートされていません。 


## まとめ
Box for Microsoft Officeのことお分かりいただけたでしょうか？
Share Point OnlineやTeamsで利用されている共同編集機能がBoxでも活用できる非常にすばらしい機能です。ぜひBox for Microsoft Officeを利用してより効率的な業務を実現してください。
まだこの機能を利用していない方は、是非活用してみましょう！！