OmniAICreator/Qiita-1.07M huggingface dataset:
データベース基礎理論の関係演算

## はじめに

こんにちは！今日はデータベースの関係モデルで使われる基本的な演算についてお話しします。普段SQLを使っていると、複雑なJOINや条件検索を当たり前のように行いますが、その裏側には「関係代数」と呼ばれる理論的な基礎があります。
8つの基本演算（和、差、共通、直積、射影、選択、結合、商）を理解しておくと、なぜSQLがあのような構文になっているのかや、どうして特定の操作が可能なのかがクリアになります。これからの学習や実務に生かせると思うので、ぜひ最後まで読んでみてください！

## 本文

### 和両立（Union Compatibility）  
和、差、共通といった集合系の演算を行うには、和両立（Union Compatibility）の条件が必要です。すなわち、2つの関係RとSが同じ次数（列数）を持ち、対応する列が同じドメインを持っている必要があります。これを満たして初めてUNION、EXCEPT、INTERSECT が適用できます。

### 和（UNION）  
2つの和両立な関係RとSについて、`R∪S`は、RまたはSに含まれるタプルをすべて集めた関係です。 
 
R:
|ID|NAME |
|--|-----|
|1 |Alice|
|2 |Bob  |

S:
|ID|NAME  |
|--|------|
|2 |Bob   |
|3 |Carol |

```sql
-- R∪S
SELECT * FROM R
UNION
SELECT * FROM S;
```

結果
R∪S:
|ID|NAME  |
|--|------|
|1 |Alice |
|2 |Bob   |
|3 |Carol |

### 差（DIFFERENCE）  
`R−S`は、Rに含まれるがSに含まれないタプル集合です。  

```sql
-- R−S
SELECT * FROM R
EXCEPT
SELECT * FROM S;
```

結果 
`R-S`: ID=1,Aliceのみ残る。ID=3, Carolは無視される。
|ID|NAME  |
|--|------|
|1 |Alice |

### 共通（INTERSECTION）  
`R∩S`は、RとSの両方に含まれるタプル集合です。  
 
```sql
-- R∩S
SELECT * FROM R
INTERSECT
SELECT * FROM S;
```

結果
`R∩S`はID=2,Bobのみ
|ID|NAME  |
|--|------|
|2 |Bob   |

### 直積（CARTESIAN PRODUCT）  
`R×S`はRの各タプルとSの各タプルを全組み合わせで生成した関係です。  

```sql
-- R×S
SELECT * FROM R CROSS JOIN S;
```

結果 
R×SはRの行数×Sの行数のタプルが生成されます
|R.ID|R.NAME|S.ID|S.NAME |
|----|------|----|-------|
|1   |Alice |2   |Bob    |
|1   |Alice |3   |Carol  |
|2   |Bob   |2   |Bob    |
|2   |Bob   |3   |Carol  |


### 射影（PROJECTION）  
射影は関係から特定の列を取り出す操作です。  

```sql
-- R'(NAME)
SELECT NAME FROM R;
```

結果
R(ID,NAME)に対しNAME列のみ取得すると  
|NAME |
|-----|
|Alice|
|Bob  |

### 選択（SELECTION）  
選択は関係から条件を満たす行を抽出する操作です。  

R:

|ID|NAME |AGE |
|--|-----|----|
|1 |Alice|18  |
|2 |Bob  |25  |
|3 |Eve  |22  |
|4 |Tom  |20  |

```sql
-- R'(ID, NAME, AGE)
SELECT * FROM R WHERE AGE > 20;
```

結果  
RからAGE>20の行のみ抽出
|ID|NAME |AGE |
|--|-----|----|
|2 |Bob  |25  |
|3 |Eve  |22  |


### 結合（JOIN）  
結合は2つの関係を共通の属性で結びつける操作です。最も基本的な自然結合では、直積から対応する属性値が等しい行を抽出し、重複列を除去します。  

R:

|ID|NAME |
|--|-----|
|1 |Alice|
|2 |Bob  |
|4 |Dave |

S:

|ID|PRICE|
|--|-----|
|1 |100  |
|2 |200  |
|3 |150  |

```sql
SELECT R.ID, R.NAME, S.PRICE
FROM R INNER JOIN S ON R.ID = S.ID;
```

結果  
R(ID,NAME),S(ID,PRICE)でRとSをIDで結合すると、対応するIDの行がマージされます。
|ID|NAME |PRICE|
|--|-----|-----|
|1 |Alice|100  |
|2 |Bob  |200  |



### 商（DIVISION）  
商は、`R÷S`で「Sに含まれる値の組合せをすべて含むRの列集合」を抽出する操作です。SQLに直接対応する構文はなく、相互の包含関係を確認する副問合せなどで実装します。

R:

|A|B  |
|-|---|
|1|X  |
|1|Y  |
|1|Z  |
|2|X  |
|2|Y  |
|3|X  |

S:

|B  |
|---|
|X  |
|Y  |

```sql
-- R÷S
SELECT DISTINCT A
FROM R
WHERE NOT EXISTS (
  SELECT B FROM S
  WHERE B NOT IN (
    SELECT B FROM R WHERE R.A = A
  )
);
```

結果
R(A,B), S(B)の場合、R÷Sは「SにあるBすべてに対応するA」を求めます。
|A |
|--|
|1 |
|2 |


## まとめ

8つの基本演算は、データベースの考え方を形作る大切な要素です。これらを理解しておくと、SQLで複雑な問い合わせを書く際にも「なぜこう書くのか」「どうしてこの処理が可能なのか」といった理論的な背景がわかり、より納得しながらコーディングできるようになります。
もちろん、実際の現場では必ずしも理論どおりにいかないこともありますが、基礎理論に基づいて考えることで、より良い設計やクエリチューニングに役立ちます。明日は結合演算です！
【GitHub】Issue用ブランチを作成する方法

## ブラウザから作成する

右側のサイドバーの「Development」の「Create a branch」をクリックします。

![create-a-branch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/77a51cf7-9dad-61e1-8af2-3ebe044e7685.png)

ブランチ名などを入力し、「Create branch」をクリックします。

![スクリーンショット 2024-12-07 23.37.42のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/23c484b9-fe8c-7ca8-d17f-a0dadcec3f11.png)


https://docs.github.com/ja/issues/tracking-your-work-with-issues/using-issues/creating-a-branch-for-an-issue

## コマンドで作成する

次のコマンドでIssueに紐づけられたブランチを作成できます。

```terminal
gh issue develop Issue番号 -b ベースブランチ -n "ブランチ名" -c 
```

以下の場合には`main`ブランチから`#10`のIssueに紐づけられた`sample`ブランチが作成され、`sample`ブランチにチェックアウトします。

```terminal
gh issue develop 10 -b main -n "sample"  -c 
```

https://cli.github.com/manual/gh_issue_develop
もっと早く知りたかったVSCodeで便利な設定

# はじめに
VSCodeは設定を少し変えるだけでより見やすく、便利になりました！私が今年、追加した設定を紹介します。
以下の設定はVSCodeのsettings.jsonに書き込んで使用してください。

# ファイル開くときの文字コードを指定
csvファイルなどはExcelから書き込まれているとshift-jisになっていることが多いので、VSCodeから開くといちいち文字コードを指定しなくてはいけないのですが、この設定を書き込むと自動で指定文字コードでファイルを開いてくれます。
以下はcsvを開くときにshiftjisで開くような例です。
```json: settings.json
"[csv]":{
    "files.encoding": "shiftjis"
},
```

# アクティブタブの色を変える
目に負担をかけないよう、ダークテーマを使ってモニターの明るさを暗めにしていると、アクティブタブがどれか見づらかったので、アクティブタブだけ薄い白色に変えました。
```json: settings.json
"workbench.colorCustomizations": {
   "tab.activeBackground": "#5A5A5A",
},
```
VSCodeはworkbench.colorCustomizations関連で画面の背景色やバーの色など細かく設定できるので、合うテーマを探すだけではなく、設定ファイルからの設定方法を探すのもいいかもしれません。

私はスクロールバーの色をカーソルを持っていかなくて表示を強調するようにもしています。
```json: settings.json
"workbench.colorCustomizations": {
    "scrollbarSlider.activeBackground": "#6A6A6A",
    "scrollbarSlider.hoverBackground": "#6A6A6A",
    "scrollbarSlider.background": "#5B5B5B",
}
```


# 開いたファイルを省略せずに並べる
たくさんのファイルを開いてタブが一行に入らなくなると、タブが表示から消えていきますよね。
私は開いたファイルはちゃんとタブに折り返して表示してほしかったので、以下の設定を加えました。
```json: settings.jon
"workbench.editor.wrapTabs": true,
```

# インデントの色分けパターンを変えたい
インデントの色分けを拡張機能のindent-rainbowがしてくれるのはすごく見やすくて良かったのですが、インデントはカラフルじゃなくてシンプルがよいと長い間、思っていました。が、なんとなく調べずに諦める。
実はindent-rainboは6色パターンまで指定できて、指定した色パターンでインデントを色付けてくれるんです。
以下は、白と黒を繰り返すパターン例です。(拡張機能のindent-rainbowが入っている前提です)
```json: settings.json
"indentRainbow.colors": [
    "rgba(255,255,255,0.03)",
    "rgba(1,1,1,0.07)",
],
```

# おわりに
私は目に負担をかけないようにダークモードでVSCodeを使うことが多く、モニターも暗めに設定してあるのですが、VSCodeの設定を少し変えるだけで見やすくなってとても楽です。
VSCodeは調べると、結構自分好みにカスタマイズできるので、英語を使ってでも頑張って調べたほうが得ですね。
自分好みになると、どんどん愛着と効率が上がるのでおすすめです。

# 参考
- [Visual Studio MArket: indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)
Clojure テストを書く

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 10*](https://qiita.com/advent-calendar/2024/clojure)

## テストの書き方

今日は`Clojure`での`clojure.test`ライブラリを使ったテストの実行方法を書こうと思います

### 1. ライブラリのインポート

```clojure
(ns todo.core-test
  (:require [clojure.test :as t]
            [todo.core :as sut]))
```

`clojure.test`をインポートし、`t`という名前を付けてテスト関連の関数をインポートします。
`todo.core`は、テスト対象の名前空間を`sut`という名前でインポートしています。

### 2. テストを書く

```clojure
(t/deftest addition-test
  (t/testing "加算関数のテスト")
  (t/is (= 4 (sut/add 1 3))))
```

`clojure.test`から、`deftest`と`testing`、`is`の3つの関数を使っています.

#### deftest

- テストケースを定義するためのマクロ
- 名前付きのテストを作成することができます

```clojure
(deftest addition-test
  (is (= 4 (+ 2 2))))
```

#### testing

- テストの説明を記述することができます

```clojure
(deftest addition-test
  (testing "加算関数のテスト"
    (is (= 4 (+ 2 2)))
    (is (= 0 (+ -1 1)))))
```

複数の関連テストがある場合に、各テストの意図を明確にできます

#### is

- 条件が正しいかどうかを確認するアサート

```clojure
(is (= 4 (+ 2 2)))  ;; 成功
(is (= 5 (+ 2 2)))  ;; 失敗
```

### 3. テストの実行

#### REPLで実行

```clojure
(require '[clojure.test :refer :all])
(run-tests 'todo.core-test)
; 
; Testing todo.core-test
; 
; Ran 1 tests containing 1 assertions.
; 0 failures, 0 errors.
```

#### CLIで実行

```bash
$ lein test

lein test todo.core-test

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
```
勉強用：PrismaAccess

# ■【公式】 SCSK x Palo Alto Networks
https://www.youtube.com/@scskxpaloaltonetworks329

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
## ◇Prisma Access
https://www.youtube.com/playlist?list=PLipy3_FBmEaycGSTpKWJNcjssAWA0E3aX

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
1 5:03 Palo Alto Networksのセキュリティプラットフォーム（製品ラインナップのご紹介）
https://www.youtube.com/watch?v=oH0yaNasDO0

5:27 今さら聞けない、CASBってなに？ セキュリティコラム/用語解説
https://www.youtube.com/watch?v=2YRF-bMchJQ

3 10:05 先進のクラウドネイティブSASEプラットフォーム Prisma Access
https://www.youtube.com/watch?v=m-OyRkezDnY

4 16:15 UTD（Ultimate Test Drive)のご紹介
https://www.youtube.com/watch?v=We5uOUpzE5Q

5 4:36 いまさら聞けない SASEってなに？ セキュリティコラム 用語解説
https://www.youtube.com/watch?v=3uKYbC-A2Bo

6 17:03 セキュリティプラットフォーム戦略の成功事例及びパートナー様支援体制​
https://www.youtube.com/watch?v=eCEFzZJEWDs

7 21:33 あらゆる脅威への対応に向けた最新セキュリティプラットフォーム戦略
https://www.youtube.com/watch?v=1aG5P7UNQBU

8 6:29 Prisma Access ライセンス体系
https://www.youtube.com/watch?v=LQpusqTDAFc

9 16:19 SCSKが提供するPrismaAccessの提案＆構築支援内容
https://www.youtube.com/watch?v=63G3T5gzwm0

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－



# ■Palo Alto Networks Japan
https://www.youtube.com/@PaloAltoNetworksJP

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
クラウドネットワークSASE活用法〜Prisma Accessのご紹介〜
https://www.youtube.com/watch?v=2wBownuXPHY

デジタルトランスフォーメーションを加速するネットワークセキュリティとは− Prisma Access −
https://www.youtube.com/watch?v=Mv1Vac697yM

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

以上
Sequence Makerで書式を維持する「#KF」コマンドについて

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは様々なシーケンスを自由に組むことができますが、Sequence Maker専用コマンドを組み合わせるとより複雑な処理を行うことができます。この記事では書式を維持する時に使用する「#KF」コマンドについて解説していきます。なお、Sequence Makerについての詳細は以下の記事を参照ください。

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

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

## 「#KF」コマンド
| 専用コマンド | 機能 |
|:-|:-|
| #KF(ON)	 | セルの出力時に書式を維持するようにします。<br>#KF(OFF)を実行するかシーケンスが終了すると通常の動作に戻ります。|

（https://sequencemaker.hioki.com/manual/ja/#command　より引用）

「#KF」コマンドは、マニュアルにあるように、セルの書式を維持するために使用します。実はSequence Makerでは、受信データの種類に応じて、自動的にセルの表示形式が変更されます。実際に試してみた結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/4ad198be-fccf-283a-85eb-6aa09ed89e20.png)

これを見ると、基本的には「標準」に変更されますが、指数形式（E+00）の時はユーザー定義の「###.0#########E+00」に変更されてしまいます。多くの場合はこれで特に問題は無いのですが、例えば小数点以下の桁数を固定したいとか、測定器の応答は指数形式だがExcel上では小数で表示したいとか、そういったときには少々お節介な機能になります。
そんな時に使用するのが「#KF」コマンドです。

## 使い方
セルの書式を変更したくない場所で「#KF(ON)」を書けば大丈夫です。こんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d6f96d5e-d4db-d2c9-da48-d1950b9885da.png)

この例では、:MEAS?の応答は「1.2345E+03」と返すので、通常はユーザー定義の「###.0#########E+00」に変更されてしまいますが、「#KF(ON)」を指定した後の受信ではあらかじめ設定してあった「小数点以下の桁数3桁」が維持されていることがわかります。「#KF(OFF)」を指定すると、通常の動作に戻ります。

:::note warn
***注意***
#や括弧()はすべて半角記号です。ついつい全角で記入してしまうと機能しないので注意してください。
:::

## まとめ
今回は書式を維持する「#KF」コマンドについて解説しました。Sequence Makerが勝手にセルの書式設定を変えてしまうのがウザいような時に使ってみてください。
DDJ-FLX4のPadで手ドラムマシンを作ろう

# 目標
- Elixirで作る
- PioneerDjのDDJ-FLX4を使う
- MIDI（ソフトシンセ）を使う

# 前提知識

MIDI（ソフトシンセ）

https://qiita.com/t-yamanashi/items/cd00bd86fa2cfacd6954

DDJ-FLX4のPad入力

https://qiita.com/t-yamanashi/items/c75022fd68132c47030b

# 仕様
- Pad1を押した時 バスドラム
- Pad2を押した時 スネア
- Pad3を押した時 ハイハット
- PLAY/PAUSEを押した時 終了
- 上記以外は無視

# ソース

```elixir:lib/synth.ex
defmodule Synth do
  @moduledoc """
  Documentation for `Synth`.
  """
  @hi 42
  @bass_drum 36
  @snare 38

  def start() do
    {_, input} = PortMidi.open(:input, "DDJ-FLX4 MIDI 1")
    {:ok, synth} = MIDISynth.start_link([])
    PortMidi.listen(input, self())
    midi_in(input, synth)

    PortMidi.close(:output, input)
  end

  def midi_in(input, synth) do
    receive do
      {^input, [{{144, 11, 0}, _}]} ->
        IO.inspect("end")

      {^input, [{{_, no, 127}, _}]} ->
        drum(synth, no)
        IO.inspect(no)

        midi_in(input, synth)

      _ ->
        midi_in(input, synth)
    end
  end

  def drum(synth, 0), do: play(synth, @bass_drum)
  def drum(synth, 1), do: play(synth, @snare)
  def drum(synth, 2), do: play(synth, @hi)
  def drum(_, _), do: nil

  def play(synth, note), do: MIDISynth.Keyboard.play(synth, note, 200, 127, 9)
end
```

# 動作動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/n-ULz6yE_RA?si=9WZZZdGFlK3Jx8n2" 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>

# 問題点
- ソフトシンセを使っている為レスポンスが悪い
- 上記で遅延があるため、実際の手ドラムすると感覚つかめなくてむずい
- ハード音源あれば解決するかも（SC-88VLあるけどつなぐ手段は今ない為検証できない）
Perplexity AIが広告モデルを導入：AIサーチの新時代へ


## 🔍 概要

Perplexity AIが画期的な広告モデルの実験を開始しました。この動きは、AI検索エンジンの世界に新しいビジネスモデルをもたらす可能性があります。

## 💡 重要なポイント

### 広告導入の特徴
- 検索結果の客観性は維持
- スポンサード質問という新しい広告形式
- 広告は明確に「sponsored」と表示
- 米国市場で先行実験

### パートナーシップ
- Indeed
- Whole Foods Market
- Universal McCann
- PMG
など、世界的な企業との協力体制を構築

### ビジネスモデルの革新
- 従来のSEO依存から脱却
- パブリッシャーとの収益共有モデル
- サブスクリプションと広告の併用戦略

## 🎯 市場への影響

1. **AI検索エンジンの収益化**
   - 持続可能なビジネスモデルの確立
   - 品質維持と収益性の両立

2. **広告業界への影響**
   - 従来のSEO戦略の見直し
   - AIネイティブな広告形式の登場

3. **ユーザー体験**
   - 検索品質の維持
   - プライバシーの保護
   - 透明性の確保

## 📊 今後の展望

- AI検索エンジンの新しいスタンダードとなる可能性
- 広告とAIの共存モデルの確立
- より多くのパブリッシャーとの協力拡大

## 🤔 考察

この動きは、AI検索エンジンの収益化という課題に対する革新的な解決策となる可能性があります。特に注目すべきは、ユーザー体験を損なわずに広告を組み込む手法です。

## まとめ

Perplexity AIの広告モデル導入は、AI技術と広告の新しい関係性を示唆しています。この実験の成功は、今後のAI検索エンジンの発展に大きな影響を与えるでしょう。
2024_12_07　事業アイデアを記録してみた


はじめまして。G's ACADEMY28期水日クラスのふみやです。

出張帰りの新幹線で、なんとか何かを記してみたいと思います。G's ACADEMYに入学した理由、キャリアの振り返り、最近見たコンテンツ、飼い犬の成長ストーリー......。とか考えを巡らしつつ、せっかくなので思考の記録用に事業アイデアの記録をメモしておこうと思います。

この記録が半年後、1年後、あるいは5〜10年後に振り返ったとき、初心に帰れるようなメモとなっていたら、ということで✍️（2024/12/07時点）

https://adventar.org/calendars/10358

※本投稿は「G's ACADEMY 脳内アウトプットしてみた編 Advent Calendar 2024」の7日目記事となります。

# ①サービス方向性
クリエイターの「自己表現」と「稼ぎ」の両立

# ②個人的背景（Why ME）
「良い学校に行ったほうがいい」「公務員になれ」「部活より勉強を優先したほうがいい」ーー。私はそう言われるような環境で育ってきましたが、しかし、当時からそうした価値観に違和感があり、思えばそこに反発するように生きてきた人生でした。

たとえばサッカーに打ち込みたい自分の想いが理解されないことへの疑問。当時はそこまで意識していませんでしたが、プロ選手になって見返そうという気持ちもあったと思います。

ただ大学2年で実力不足を悟りプロの道を諦めました。この経験は私に大きな影響を与えました。自分の好きなことでしっかり負けたからこそ、社会ではその鬱憤を晴らしたい（自分の価値を示したい）という強い想いが生まれたと思います。

現在は編集者として、周囲から理解されにくい個人の「才能」や「想い」を支援する仕事に携わっています。この経験を活かし、まだ理解されていない才能が輝ける舞台を創りたいと考えています。

# ③ターゲットと課題（Who & What）

Who：
才能ある若手クリエイター（絵師、作家、音楽家、料理人、漫画家、執筆業、映像制作など）※まだ広義なイメージにとどまっているので絞りたい。ここが一番曖昧なので今後の最大の課題な気がします
→「自己表現」と「稼ぎ」の両立に悩むクリエイター　

What：
・自分の才能を世に放つ「舞台」がない。
・舞台を見つけられても「稼ぎ」につながらない。
・一瞬の稼ぎを生み出せても「継続」しない。

# ④解決策（How）

### A：クリエイター向けのライブ配信サービス
→「ライブ配信（舞台／プロセスの共有／ファン化）」「EC（稼ぎ）」「ファンコミュニティ（継続）」の3本柱を通じたクリエイター支援プラットフォーム
→クリエイターは自己表現の舞台と稼ぎを両立し、自分を応援してくれる人とともに表現活動に挑戦し続けることができる。
→視聴者は「推しの才能」と出会うことができる。「頑張る人」を「応援する」ことで、自身も満たされたり、何らかの活動へのモチベーションや学びを得たりできる。
→たとえば講談社の編集者がこのプラットフォームを通じて新しい漫画家の才能と出会える。エイベックスのスカウトがライブ配信を見て、ここからアーティストの卵を発見し、そのままメジャーデビューまでするようなストーリーが生まれる場所を目指したい
→そんなクリエイターの表現を世に発信することで、自身の「個人的な価値観」を大切にするカルチャーを育てたい。またライブコマースを通じて日本では認められない才能も、ある国では熱狂的なファンができるかもしれない。世界の才能とつながることができる
→表向きの正しさに対する反発、みんな信じているけど自分だけは信じていないことを表現できる
### B：クリエイターのためのポートフォリオサービス
### C：クリエイターと企業をつなげるマッチングサービス
→いまはフリーで仕事を受ける時の「受発注に関する金額交渉」を解決するようなサービスも模索中
### D：クリエイターのためのぼやきサービス
→クリエイターの日々のぼやきが集まり、それに対して自由にコメントし合える場所

# ⑤達成された時の状態（Why me）
・編集者として才能を発掘・解放することに向き合うことができている
・その拡張として異能にスポットライトが当たる場所をつくることできている
・自身の異質なモノや未知との出会いが好きという欲を満たすことができる

これらの構想は、自分の経験や想いから生まれた一つの可能性ではあるものの、
ただ実際の卒業制作は全く予想してなかった方向性に着地している気がします。

「才能の発掘と育成」「異能の才能が輝ける舞台」「未知なる才能との出会い」「制作プロセス含めたストーリーで楽しむコンテンツづくり」「思い出ドリブンなコンテンづくり」「メディア＜個人の時代が今後加速するなかで、個人をエンパワーメントする」などなどを方向性として探索しつつ、これからもブラッシュアップしていきたいと思います！
MapLibre GL JS v5(pre)で月を球体表示する

![mug-jp_logo_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/8d017f83-8e52-aee7-f6b2-8c75ccd7df34.png)

## はじめに

### MapLibreとは

MapLibre Official WebSite
https://maplibre.org

- Web地図に関するプロダクトをOSSとして開発・メンテナンスしているOrganizationです
- ブラウザ・モバイル向けの地図ライブラリおよび地図配信に関するツール群があります


### MapLibre User Group Japan (MUG-JP) とは

MUG-JP Official Web Site
https://mug-jp.org/

- MapLibreプロダクトの開発者によるユーザーコミュニティです
- ナレッジの共有やイベントの開催による普及活動を行なっています

## 月が綺麗ですね

https://kanahiro.github.io/moon-viewer/

![Screenshot 2024-12-07 at 11.05.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/f0438fed-cb66-1c2f-d9e4-6ca94cc35172.png)

## MapLibre GL JS v5のGlobe Projection

MapLibre GL JSがv5でついにGlobe Projection（地球儀ビュー）をサポートします。
現状はpre releaseでインタラクションに若干不具合がありますが、レンダリングは問題なさそうです。

### 以前はMapbox GL JSで実装していた

Mapbox GL JSはもっと早い段階でGlobe Projectionをサポートしていて、以前はこちらを利用していました。

Mapbox GL JSでもGlobe Projectionで同等のレンダリングが出来るわけですが、自前で変換したりしている月面データは（地球とは色々事情が違うため）けっこう特殊な作りをしているからか、Mapbox GL JSだと一部のレンダリングで不具合が出て、ズームレベルが高い時はmercator projectionに切り替えるようなワークアラウンドをしていました。

一方、MapLibre GL JSはそういったことがなく快適にレンダリング出来ています。素晴らしい！

データの諸元などは以下をご覧ください。

https://zenn.dev/mierune/articles/ef0f485534d26f

## コード

https://github.com/Kanahiro/moon-viewer

```javascript
// styleに直接かけそうなものだが、pre.7で試したときはそうではなかった
map.on('load', () => map.setProjection({ type: 'globe' }));
```

## 余談：タイルサーバー

月面の画像とDEMは自前のタイルサーバーから配信しています（外部利用不可）。PMTiles + Cloudflare R2 + Workersで運用しており、多少のストレージ代だけで運用出来ています。

以下の記事に沿うと簡単にPMTilesバックエンドなタイルサーバーを構築できます。

https://docs.protomaps.com/deploy/cloudflare
ゲージの作成

## 初めに

今回はDXライブラリに標準されている DrawBox関数を使って作っていきます
今回は自分で関数を作ります
今回のプログラムは自作なので見栄えしないし効率がいいものではないかもしれません

## DrawBox関数

DrawBox関数とはDXライブラリ内の四角を描画する関数です
DrawBox関数は
int DrawBox( int x1 , int y1 , int x2 , int y2 ,unsigned int Color , int FillFlag ) ;

1 , y1　:　描画する四角形の左上の頂点座標
x2 , y2　:　描画する四角形の右下＋１の頂点座標
Color　　:　描画する四角形の色
FillFlag :　四角の中身を塗りつぶすか、のフラグ。TRUEで塗りつぶし、FALSEで塗りつぶさない

## ゲージとは

増減するパーセンテージを可視化するもの
今回は左から右に増える関数です

## ゲージの作成
static void DrawPercentBox(int sx ,int sy, int ex, int ey,float per, int bColor, int pColor);
という関数を定義します

引数は
sx,sy 枠部分の左上の座標
ex,ey 枠部分の右下の座標
per   パーセンテージ
bColor 枠部分の色
pColor パーセンテージ部分の色

    void DrawPercentBox(int sx, int sy, int ex, int ey, float per, int bColor, int pColor)
    {
    	int diff = ex - sx;
        if(per > 1.0f)
        {
            per = 1.0f;
        }
        if(per < 0.0f)
        {
            per = 0.0f;
        }
    	DrawBox(sx, sy, ex, ey, bColor, true);
    	DrawBox(sx, sy, sx + (diff * per), ey, pColor, true);
    }

これで完成です。

1行目で枠の幅を求めています
2～5行目はパーセンテージが100%(1.0)より大きい場合100%(1.0)に固定する処理です
6～9行目はパーセンテージが0%(0.0)より小さい場合0%(0.0)に固定する処理です
10行目は枠部分の描画処理です
11行目はパーセンテージ部分の描画処理です

## 最後に

今回は左から右に増えるゲージの作り方でした
最初にもお話した通り今回の処理はDXライブラリを使用し自分でしたものです
効率が良くない可能性があります
【基本情報】独学マラソン リバースアルゴリズム Day 31

:::note worn
この記事は自分用の備忘録です。
:::

# リバースアルゴリズムって何？
配列の要素を逆順に並び替える処理のこと

配列の最初の要素と最後の要素を交換し
中央に向かって順番に入れ替えることで
配列の要素を逆順に並び替える

## サンプルデータ

```typescript
const array: number[] = [1, 2, 3, 4, 5]; 
// この配列を [5, 4, 3, 2, 1] に反転する
```

## やってみる

```reverse.ts
function reverseArray(array: number[]): number[] {
  const n = array.length; // 配列の要素数

  for (let left = 1; left <= Math.floor(n / 2); left++) {
    // rightを計算（配列の右端の要素を指す位置）
    const right = n - left;

    // 一時変数 tmp に右の要素を保存
    const tmp = array[right];

    // 右の要素に左の要素を代入
    array[right] = array[left - 1];

    // 左の要素に tmp（右の元の値）を代入
    array[left - 1] = tmp;
  }

  return array;
}

// 実行
const array: number[] = [1, 2, 3, 4, 5];
console.log(reverseArray(array)); // [5, 4, 3, 2, 1]
```

実行したらちゃんとできていた

![スクリーンショット 2024-12-07 23.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/f8f720bd-d0ea-742c-837c-99587af3ee7a.png)


## **感想**
基本情報技術者試験の擬似言語の問題だと配列のindexが1から始まる設定だった
引っかからないように気をつけよう

# **参考**

https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf
Pythonに関連する題材を対象とした日本国内での口頭発表の機会

## 概要

「Pythonに関連する題材を対象とした日本国内での口頭発表の機会」を紹介します。ここでは以下のようなものを指します。

- Pythonに関連する題材での口頭発表が可能なもの
- 日本国内で開催されるもの（日本語による発表が可能なもの）
- 何らかの形で発表者の募集がなされているもの
- 継続して開催されている（または継続して開催されるそうな）もの

:::note info
現在は2024年末頃の情報を参考にしています。他に掲載したほうが良さそうな機会をご存知の方は、編集リクエストを送っていただくか、コメントを投稿していただけますと幸いです。
:::

## 機会

### PyCon JP

https://pycon.jp

### Start Python Club

https://startpython.connpass.com

### PyCon mini 東海

https://pycon-mini-tokai.connpass.com

### 飛騨高山Pythonの会

https://hida-python.connpass.com

### PyCon mini Shizuoka

https://pycon-shizu.connpass.com/

### Python Kansai

https://kansai-python.connpass.com

### PyCon Kyushu

https://kyushu.pycon.jp

### PyData.Fukuoka

https://pydatafukuoka.connpass.com

### DjangoCongress JP

https://djangocongress.jp

### Polars-ja

https://polars-ja.connpass.com

### scipydata2025

https://scipydata.connpass.com/event/337318/

## 情報収集の方法

他にも良い機会があるかもしれません。さらに発表内容をPython以外の視点から検討することで、新たな発表の場を探ることができます。以下に紹介する方法を活用すれば、適切な機会の情報を効果的に収集することが可能です。

### connpass

https://connpass.com/

### Fortee

https://fortee.jp/

### Google アラート

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

### IT系主要イベントまとめ

https://x.com/ariaki4dev/status/1729783171586076920

### TECH PLAY

https://techplay.jp/

### Findy Conference

https://conference.findy-code.io/
パーキングサーチ革命！iPhoneのショートカット機能でワンタップ検索

プログラミング不要です！！


## 💙 背景
ドライブデートや出張帰り、目的地の駐車場がまさかの満車——
運転者はちょっと焦りつつも「次の駐車場はどこだ？」と探し始める……
けれど、道は続くし、ハンドルからは目が離せない。
ここで頼りになるのが助手席の出番です！


地図アプリをサッと開き、
近くの空いている駐車場を見つけて、
運転手が行きやすいルートを選んで指示し、
スムーズに曲がるタイミングや目印を伝えられたら……
そんなスマート助手席、夢じゃないかも！？

## 💜 その機能を実現する「ショートカット術」





🌐 操作の流れ
具体的には、こんな感じで使えます：

![az8fz-yvdtp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d6c2d015-be2e-c48a-b2d2-004cf1eef7e3.gif)



## 🧡 ショートカットの設定方法

ショートカットアプリを開き、ギャラリーから「カフェ」と検索


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/98199a19-831d-8310-3952-50b85c94ba36.png" width=50%>



「カフェまで歩く」を選んで、ショートカットを作成


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/972677e8-41d6-c0fd-1262-96d458411cbc.png" width=50%>

以下の場所を変更：
（入力文字を変更）「コーヒー」　→　「パーキング」　
（選択で変更）「徒歩」　→　「車」


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/f947800c-7608-d0d1-26ef-0d0061084185.png" width=50%>



■ 完成画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d443c6fb-f365-2c2b-a00e-1c0ff63113fa.png" width=50%>



## 💟 最後に：助手席のエースを目指そう！
助手席に乗ると「運転していない分、楽そう」と思われがち。でも実際には、駐車場の空き状況を調べたり、ルートを探して伝えたりと、結構忙しいもの。iPhoneのこのショートカット機能で、ぜひサポートをスマートに！

これを使いこなして運転手を支えれば、「助手席はこの人じゃないと！」と思わせられるかもしれません。
2024/10/30にWindows 11のupdateを適用したらOSが起動しなくなった話

# はじめに
2024/10/30 23:00頃、Windows 11にてWindows Udateを適用し「更新してシャットダウン」を実行したところ、画面にdynabookの文字が出たまま処理が進まない問題が発生しました。

# 復旧手順
セーフモードで起動し、以下のアプリケーションのアンインストールを行いました。その後、OSを再起動すると無事にOSが起動しました！なんで！？

- [HD Writer LE 2.1](https://av.jpn.support.panasonic.com/support/video/connect/env/hc_v230_330_550m.html)
  - [HC-V550M](https://panasonic.jp/dvc/c-db/products/HC-V550M.html)に撮影した動画や写真をPCにコピーするためのアプリケーションです。

もしかすると、[以前の事象](https://qiita.com/fukunagt/items/c7e04cdae6a009b58b3d)も、[HD Writer LE 2.1](https://av.jpn.support.panasonic.com/support/video/connect/env/hc_v230_330_550m.html)が原因だったのかも…

# さいごに
OS再起動後、未適用のWindows updateを適用しました。

```powershell
PS C:\Users\roots> Get-HotFix|Select-Object Description,HotFixID,InstalledOn

Description     HotFixID  InstalledOn
-----------     --------  -----------
Update          KB5039895 2024/11/02 0:00:00
Update          KB5027397 2024/06/15 0:00:00
Update          KB5031274 2024/06/15 0:00:00
Update          KB5036212 2024/06/15 0:00:00
Update          KB5044380 2024/11/02 0:00:00
Security Update KB5046247 2024/11/02 0:00:00
Update          KB5044620 2024/11/02 0:00:00
```

古いPCであれば、原因追及のためにいろいろと試したいところではあるのですが、現在使用しているPCなので復旧だけでとどめておきました。

改めて[HD Writer LE 2.1](https://av.jpn.support.panasonic.com/support/video/connect/env/hc_v230_330_550m.html)のページを見ると、対応OSはWindows 8.1までとなっていました。

Windows 10では問題なかったのですが、Windows 11だと何かが競合しているのかもしれません。

もし、同じ症状で困っている方がいらっしゃれば、セーフモードで起動後、[HD Writer LE 2.1](https://av.jpn.support.panasonic.com/support/video/connect/env/hc_v230_330_550m.html)をアンインストールしてみてはいかがでしょうか？
ABC383をPythonで(A~D)

大和証券プログラミングコンテスト2024（AtCoder Beginner Contest 383）の解答等の速報的まとめ

https://atcoder.jp/contests/abc383



# A問題
https://atcoder.jp/contests/abc383/tasks/abc383_a

水を入れる時刻のたびに水がいくら減ったか計算する。
制約からするに、１単位時間ごとに計算しても問題ない
```python:A
n = int(input())
water = 0
last = 0
for _ in range(n):
    t, v = map(int, input().split())
    water = max(0, water - (t - last))
    water += v
    last = t

print(water)
```
# B問題
https://atcoder.jp/contests/abc383/tasks/abc383_b

加湿器を置く場所を全通り試す
```python:B
def calc(a, b, x, y):
    res = 0
    for i, s_i in enumerate(s):
        for j, s_ij in enumerate(s_i):
            if s_ij == "." and (abs(a - i) + abs(b - j) <= d or abs(x - i) + abs(y - j) <= d):
                res += 1
    return res


h, w, d = map(int, input().split())
s = [input() for _ in range(h)]

ans = 0
for x1 in range(h):
    for y1 in range(w):
        if s[x1][y1] == "#":
            continue
        for x2 in range(h):
            for y2 in range(w):
                if (x1, y1) == (x2, y2) or s[x2][y2] == "#":
                    continue
                ans = max(ans, calc(x1, y1, x2, y2))

print(ans)
```
# C問題
https://atcoder.jp/contests/abc383/tasks/abc383_c

dfsで計算する
```python:C
def calc(a, b, x, y):
    res = 0
    for i, s_i in enumerate(s):
        for j, s_ij in enumerate(s_i):
            if s_ij == "." and (abs(a - i) + abs(b - j) <= d or abs(x - i) + abs(y - j) <= d):
                res += 1
    return res


h, w, d = map(int, input().split())
s = [input() for _ in range(h)]

ans = 0
for x1 in range(h):
    for y1 in range(w):
        if s[x1][y1] == "#":
            continue
        for x2 in range(h):
            for y2 in range(w):
                if (x1, y1) == (x2, y2) or s[x2][y2] == "#":
                    continue
                ans = max(ans, calc(x1, y1, x2, y2))

print(ans)
```
# D問題
https://atcoder.jp/contests/abc383/tasks/abc383_d

約数が奇数個のとき必ず平方数になっている。
約数が９個になるのは
- 素数1種類の8乗
- 素数2種類の積の2乗

のパターンのみなので、それがいくつあるか計算する。
```python:D
import bisect

prime = [True] * (10 ** 6 + 1)
prime[0] = prime[1] = False

for i in range(2, 10 ** 3 + 10):
    if prime[i]:
        for j in range(i * i, 10 ** 6 + 1, i):
            prime[j] = False

n = int(input())
lst = []
ans = 0
for i in range(2, 10 ** 6 + 1):
    if prime[i]:
        if lst:
            ans += bisect.bisect(lst, n // (i ** 2))
        lst.append(i ** 2)
        if i ** 8 <= n:
            ans += 1

print(ans)
```
【連載】pydantic-ai徹底解説 (1) はじめての pydantic-ai

# 【連載】pydantic-ai徹底解説 (1) はじめての pydantic-ai

今回は Python で LLM(大規模言語モデル)を活用するための強力なフレームワーク「pydantic-ai」を紹介します。  
pydantic-ai は、Pydantic を活用した構造化レスポンスや型安全性、エージェント(Agent)・ツール(関数)呼び出し、依存性注入などを組み合わせ、LLM ベースのアプリケーション開発を容易にします。

本連載の第一回では、「pydantic-ai」の基本概念を理解し、最もシンプルな例を通して、どのようにエージェントを作り、モデルに問い合わせるかを実演します。

## pydantic-ai とは

**pydantic-ai** は、LLMエージェントフレームワークです。  
特徴は次の通りです。

- **Pydanticによる型安全な構造化レスポンス**： LLMの出力は生のテキストですが、pydantic-aiでは最終結果をPydanticモデルで定義可能。モデルはLLMにJSONで応答を促し、構造化データとして受け取ります。これにより、バリデーション失敗時はLLMに再試行させることもできます。
- **モデル非依存のアーキテクチャ**：OpenAI、Gemini(Google VertexAI経由)、Groqなど複数のモデルをプラグイン的に利用可能。
- **ツール(関数)呼び出し**： LLMに対して関数一覧を渡し、LLMが必要な情報を取得するために関数を呼び出すといった高度なRAGやエージェント的挙動を簡潔に実装できます。
- **依存性注入(DI)**：システムプロンプトやツール関数は外部リソース(DB接続、APIクライアントなど)をDIで受け取り、テスト性や拡張性に優れます。
- **ストリーミング対応**：LLMの結果をストリームしながら処理することもサポート。
- **テスト/エバリュエーション支援**：`TestModel`や`FunctionModel`により、本物のLLMを呼ばずにユニットテストが可能です。

## 基本的な使い方

まずは、最小の「Hello World」的な例を見てみます。  
ここでは以下を前提とします。

- `gemini-1.5-flash` (Google Geminiモデル)を使用する例 (環境変数でAPIキー設定済み)
- 単純な1回の問い合わせでの応答を取得

```python
from pydantic_ai import Agent

# エージェントを作成
agent = Agent(
    'gemini-1.5-flash',
    system_prompt='Be concise, reply with one sentence.'  # システムプロンプト例
)

# run_sync で同期的な問い合わせを行う
result = agent.run_sync('Where does "hello world" come from?')

# 最終的なテキストレスポンスを表示
print(result.data)
# 例）"The first known use of "hello, world" was in a 1974 textbook about the C programming language."
```

ここで注目すべき点は、`Agent` インスタンス生成時にモデル名やシステムプロンプトを指定できることです。また、`run_sync`実行後に得られる`result`は`RunResult`オブジェクトで、`.data`で出力テキストを取得します。

この時点ではまだ pydantic-ai の真価である構造化レスポンスやツール呼び出しは使っていませんが、これが基本的な流れです。  
すなわち、

1. `Agent`インスタンス生成
2. `agent.run()`または`agent.run_sync()`でLLMへ問い合わせ
3. `result.data`で応答取得

といったシンプルなステップでLLMが利用できます。

## まとめ

本記事では pydantic-ai の概要と、最も基本的な「エージェントを使ってLLMに問い合わせ、結果を取得する」流れを紹介しました。ここまでですでに、エージェントを介してモデルへ問い合わせる基本形が理解できたと思います。

次回はもう少し踏み込んで、pydanticモデルによる構造化レスポンスや、ツール呼び出し、依存性注入など、pydantic-ai の特徴的な機能を解説していきます。

## 📒ノートブック

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

## 参考サイト

https://github.com/pydantic/pydantic-ai

https://github.com/pydantic/pydantic-ai/issues/144
テスト自動化でありがちなこと

テストを自動化するにあたっては、さまざまな問題が存在する。それらを簡単にまとめてみる。

# そもそもテストを書けない

テストを自動化するには、テストを書かなければ始まらない。例えば、Aという操作をBに適用したらCの結果になるべきである、ということを記述する必要がある。

だが、さまざまな理由により、テストを書けない場合がある。

* テストを書く時間がないからテストを書けない
* テストを書こうとするが、そもそもテストケースがわからない
* テストを再現性をもって書く方法が思い浮かばない

このような場合、テストを書くことができず、当然ながらテスト自動化に至ることができない。

# テストをコードに起こせない

どうにかテストを書いたとしても、次の問題としては、テストをプログラムコードに落とし込まなければ、やはりテストの自動化は不可能である。

つまり、人間の目視でOK/NGを判定するような仕組みのままでは、テストの自動化はできないのだ。

チェックリストベースのテストだと、これが起きやすい。また、ブラウザの挙動をベースにテストをする場合においては、どのようにそれをコードに起こすかが非常に難しく、自動テストには大きな壁が立ちはだかることとなる。

# テスト自動化の設定ができない

先ほどまでの手順で、テストの実行はできるようになったので、手作業でテストを実行することを指示すれば、テストを実行することはできる。だが、テストを自動化するには、自動テストのためのCI設定が必要になる。

その際ネックになるのは、CI環境におけるテストの指示のやり方やカバレッジの収集方法の記述などである。また、テスト稼働環境にかかるコストというのも、この段階でネックになる。このあたりの万難を排さなければ、やはりテストの自動化はかなわないことになる。

# テストケースのメンテナンスができない

どうにかテストを書いたはいいものの、仕様変更や機能追加などにより、テストの追加・変更が必要になってくる。こういった際に、テストケースのメンテナンスができないと、テストケースに漏れや誤りが出てくることになり、コードの品質が低下してしまう。

であれば、もう自動化なんて無駄、という結論になりかねないので、テストケースのメンテナンスも踏まえた設計を心掛けなければならない。
「視座」とは何かを言語化する

## この記事は何
エンジニアとしてキャリアを始め、開発はある程度できるようになった頃、
マネージャーから「視座を上げてほしい」と言われるようになった。
そんな経験をした方も多いのではないでしょうか？
視座の意味がわからず苦戦している方へ、少しでも「視座とは何か」伝わればいいなと思い書いた記事です。

## 視座の意味は調べてもよくわからない
フィードバックされた瞬間に「なにそれ？」となる言葉第一位が「視座を上げる」だと思っています。
そもそも普段聞き馴染みのない言葉ですし、調べても意味がいまいちピンときません。

例えば「視座とは」などで意味を調べてみると

> 物事を見る姿勢や立場。「人道主義的な—で発言する」

[視座（しざ）とは？ 意味・読み方・使い方をわかりやすく解説 - goo国語辞書](https://dictionary.goo.ne.jp/word/%E8%A6%96%E5%BA%A7/) より引用

のような当たり障りのないことしか出て来ず、結局そもそも自分のなにが問題なのかさえわからない、という状態になりやすいです。

## 視座とは
僕の「視座」の解釈を書いていきます。
少なくとも僕がメンバーにフィードバックする際はここに書いたようなことを意図して「視座」という言葉を使っています。

視座とは、一言で言ってしまえば「得たインプットからどの広さまで思考がめぐる目をもてているか」ということだと思っています。

例えば勉強会に参加して何かの発表を聞いた時に

1. 「発表の内容面白かったなぁ」
1. 「発表の内容使って社内の課題解決できるかもしれないから明日会社で提案しよう」

のような感想を持った人たちがいたら、
1の人より2の人の方が色々考えてそうなことは一目瞭然ではないでしょうか？
これが「視座」というものによって生まれる違いだと思います。

## 視座をどう高めるのか
視座が「得たインプットからどの広さまで思考がめぐる目をもてているか」だとして、
その目はどのように培われるのでしょうか？
僕は視座を高めるためには「問い」を立てることから練習することが大事だと思います。
そもそも何故前項の例ではインプットから会社の課題解決や組織の採用の課題にまで目がいったのでしょうか？
それは「そういう思考」をしていたからなはずです。
つまり、発表を聞いたタイミングで思考が突然生まれたのではなく

社内の課題を解決するためにはどうすれば良いか

という思考を続けている中でインプットをしたことで、ひらめきが生まれたという状態だと思います。
つまり視座の高い人はインプットをする前からそもそもの問いを自分の中に持っているということになります。

この問いは自分で作る人もいればミッションとして与えられることもあります。
しかし、少なくともなにかしらの方法でその「問い」を脳内で常に常駐させておく、という状態になっていればいわゆる視座の高い振る舞いは自然とできていくと思っています。

## 自分の視座を認識することはできない
自分はそもそも視座が高いのか低いのかわからない、という悩みを抱えている方もよくいる気がします。
これに対しての答えは「僕も分かりません」です。

前項にも書いた通り、視座の高さは「問い」を自分の中にもてているかどうかでしかありません。
何かしらのスタンスだったり、徳の高さみたいなそういうモラル的なもので上がるわけではないです。

周りから見たら「色々考えているなぁ」と思われるかもしれませんが、当の本人はただ設定した/された問いにただ向き合っているだけのような状態のはずです。
それをなかなか客観的に「今視座高くなっているかも」のように考えるのはいささか難しそうです。

自分が「視座が高いかどうか」を考えるよりも、「今自分はなにかしらの問いに向き合えているかどうか」を考える方が良いかもしれません。きっとそのような営みの中で視座は勝手に上がっていくのではないでしょうか。

## 結局エンジニアは視座を上げる必要はあるのか？
ここまで視座について色々書いてきましたが、「結局エンジニアに視座の高さは必要あるのか」という疑問も出てきそうです。

僕の考えでは明確に「YES」です。
というかエンジニアとして食べていこうと本気で思っているのであれば、必然的に視座は上がっていくものだと思っています。

理由は簡単で、視座が上がっていくという中での「問いへの向き合い」こそが、エンジニアとしての価値発揮に直結しているからです。

誰でも同じことをし続けていることで同じ対価を得ることができるなら嬉しいですが、
人間は歳をとりますし、技術も日々進歩していきます。
近い将来、義務教育としてプログラミングを学んでいた世代が社会人になります。

そうやってどう足掻いても何かが進歩、アップデートされていく中でエンジニアとして食べていくためには、新たな価値発揮が必要になるはずです。

価値発揮の仕方は千差万別だと思います。開発スキルを極めるような道もあれば、開発以外のスキルを身につけていくような道もあると思います。

しかし、どのような道を進むにしても「どのように今まで以上の価値発揮をするのか」
という問いに向き合わざるをえません。

例えば開発スキルを極めるのであれば「より価値のある開発スキルを身につけるためにはどうすれば良いか」と思いながら日々のインプットをしていくことになるはずです。
「どういう技術を身につければ会社で価値を評価してもらえるか」という問いに向き合いながら色々インプットしていると、気がついたら「今学んだこの技術は社内の何かの課題にマッチしそうか」と日々考えるようにもなったりするでしょう。

それは俗にいう「視座が高い」状態になっているのではないでしょうか。

## 終わりに
偉そうに色々書きましたが、僕自身も視座が高いかどうかはよくわかっておりません（記事に書いた通りです）
今回書いたこの記事も僕の解釈でしかないので、ぜひ「こういう考え方もあるんじゃない？」などアドバイスあればいただけると嬉しいです。
【FileMaker】在庫引当をしよう

FileMakerを使うきっかけとして、小売業などでの在庫管理でした、という人もいるんじゃないでしょうか？
また、初めて小売業界のAppを作ることになり、「引当」「引落」などの言葉が分からなくてどう作ればいいのか立ち止まっている人、いませんか？
売れた商品情報をFileMakerに登録し、在庫が今どのくらいあるか、を見える化する流れをサンプルで解説です。

# この記事を読むといいことが起こる人
「引当」「引落」をFileMakerでどう表現すればいいか悩んでいる人
販売した商品を在庫から引いて、現在どのくらい在庫があるかを知りたい人
FileMakerで在庫管理をどうやればいいか、ヒントが欲しい人

# この記事を読んでも得られない知識
利益計算や棚卸しのことは書いていません。
レイアウトの実装の仕方

# サンプルを作った環境
Claris FileMaker Pro ver.21.1
Mac Book Pro (Sonoma 14.6.1)

# テーブル設計
今回用意したテーブルは、次のような単純な構造です。
![スクリーンショット 2024-12-07 22.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f99469fc-66e3-a110-9c8f-f048b88cfcb0.png)


## マスタ
・顧客情報
・商品情報

## トランザクション
・注文情報
・注文情報_明細

## ログや履歴
・在庫履歴情報

# リレーションシップグラフ
表示についての解説は省きますが、以下のような感じです。
基本的には、注文情報が明細と管理できて在庫履歴情報とリレーションシップが取れていれば、あらかたOKです。
その他のリレーションシップについては、レイアウトで見える化する時の表示のため、と思ってください。
たくさんリレーションシップが見えていますが、在庫引当のスクリプトでは、ほとんど使ってないです。

## 注文管理
![スクリーンショット 2024-12-07 22.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f49df1bc-a5f6-ca9f-a5ff-bf3f7829ea65.png)

## 在庫管理
![スクリーンショット 2024-12-07 22.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/c7915a83-179a-24b1-ead7-8f355874a084.png)

:::note info
マスタ、トランザクションなど、カテゴリに分けてTOを色付けすると、リレーションシップグラフで見やすいですよ！
:::

# 用意するレイアウト

## 注文管理
今回は、ポータルを使って１つの注文を明細とともに１レイアウトに納めました。
在庫の引当を「引当」ボタンで実行したら、引当済数量が表示され、「済」と表示されます。
![スクリーンショット 2024-12-07 20.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9b416f83-4f90-eb1a-3942-c267117f4d40.png)

## 在庫管理
在庫管理も、単純に１つのレイアウトにまとめていますが、日々、引当をしていくうちにながーくなって見づらくなるので、運用を考えたら、一覧と履歴詳細、というような２レイアウトくらいにした方がいいんじゃないかなと思います。
ま、サンプルなので。
サンプルでは、入荷(入庫)、出荷(出庫)で色分けし、出荷に関してはどの注文から引当てたのかがわかるように、注文番号と注文日も表示しています。
![スクリーンショット 2024-12-07 22.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/fce9bc37-2ef4-6e62-f937-771fab3b5c56.png)

# スクリプト
販売した商品を、棚から取り出して在庫が減っていく、というのを想像してください。
大体そういう作業のことを、「引当（ひきあて）」「引落(ひきおとし)」と呼んでいるところが多いですね。
その、在庫引当をするスクリプトです。

## 1.在庫情報存在チェック
まず、これから引き当てる商品の在庫が管理されているか、確認します。
![スクリーンショット 2024-12-07 22.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a461c5de-9924-4c0c-7709-fb2c483ad2f4.png)

## 2.在庫の引当
在庫が管理されていたら、在庫の引当を行います。
この時、在庫数が足りない場合は、「足りないよ」とカスタムダイアログを出し、引当を行いません。
運用によっては、ロットの違う代替品を当てることもあるかと思いますが、そこまで複雑にするとサンプルとして特殊になってしまうので、今回は単純に、ない袖は振れないことにします。
在庫を引き当てる時は、在庫履歴情報に引き当てた情報を記録します。
また、注文情報の明細にも、引当済であることを記録します。
![スクリーンショット 2024-12-07 22.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/22978c2b-9df7-3743-8cdb-43e593ca2980.png)

## 3.終わりの宣言
最後は、「終わったよ」と言って、立ち去ります。
![スクリーンショット 2024-12-07 22.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/bd0bb377-2b6f-0dfc-3b9b-7df861ce6639.png)

# たった50行くらいで引当完了！
スクリプト、50行くらいでしたね。
このスクリプトを、注文明細行の「引当」ボタンに貼り付けたら、もう在庫引当ができちゃいますよ！

そうそう。
一つの注文で全ての明細を引き当てたら、大きく「済」と大きく出るようにもしてみました。
こちらは、単純に注文の総数量と総引当済数量を比較して、表示・非表示設定をしているのみなので、お気軽に見える化が実現できます。
![スクリーンショット 2024-12-07 22.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a976891e-75c2-2fee-f312-932047708617.png)

「引当」「引落」と聞くと、
「えー、どうやってスクリプトを組むの？」
と右往左往しがちですが、「引当」って要は実作業で何をするかを想像すると、スクリプトに起こしやすいと思います。

では！
iphoneのバックアップをwin11のローカルマシン上に保存する際の バックアップファイルの保存先の指定方法について

iphoneのバックアップをwin11のローカルマシン上に保存する際の
バックアップファイルの保存先の指定方法について

ポイントは以下2点でした。
appleデバイス(旧itunes）のアプリの設定ではできません。

1.mklinkを使ってコマンドプロンプトでシンボリックリンクを作成すること。
2.mklinkコマンドを打ち込むコマンドプロンプトを、管理者権限で実行すること。

下記サイトにまとめられています。

https://officeqa.net/windows1-iphone-backup/

シンボリックリンクについては
下記のページがわかりやすいかもしれません。

https://itojisan.xyz/trouble/33942/#AppData-5

にしても普通にGUIの設定から変えれるようにしてほしいなあ。
以上です。
CodeSandBoxからGitHubのリポジトリを作成する方法

教育者向け

CodeSandBoxとGithubの連携は
あっさりできるけれど見つけるまで迷いやすいと思ったので
記事にしておきます。

## 手順

前提
- GitHubにログイン済み
- codesandboxにGitHubアカウントでログイン済み

1、ダッシュボード右上の自分のアイコンからUser settingsを選び、IntegrationsでGitHubの連携を許可しておく

![スクリーンショット 2024-12-07 22.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/9e19db13-8c3c-8a23-e1b1-6b9172658ca5.png)

![スクリーンショット 2024-12-07 22.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/916ef26f-650b-b5c4-ffc9-4f63d95111ce.png)

2、エディター左のGitHubの猫マークから、Create repositoryでリポジトリを作成

![スクリーンショット 2024-12-07 22.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/1b3a247a-afed-9a23-0d3e-ec904c878fc5.png)

※ sandboxで作成している場合、devboxに変更させられるので注意

3、GitHubでリポジトリが作成されているか確認する
![スクリーンショット 2024-12-07 22.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/eaa892c6-b4df-64a8-4d5a-0c0b78764da6.png)

これで後はホスティングサービスとつなげば、気軽にインターネットにWEBページを公開できます。

初学者への最初の一歩としておすすめです。

# 参考

https://zenn.dev/kou029w/books/codesandbox-guidebook/viewer/github
土と石と木で動かせるようになる回数を変える

「VキャスのVCIで◯ine◯raftっぽいもの作る Advent Calendar 2024」7日目

Vキャス内で、穴を掘って、石を砕き、木を切って、組み合わせて武器を作って、何なら出てくる敵を倒して・・・
そんなことをやりたいなぁっていう試みを12月でできるところまで行こうというカレンダーの7日目です！

昨日は、5回叩いたらブロックを動かせる状態にしました。
ただ、石でも木でもみんな同様になっているので、今日はブロックの種類で動かせる回数を変えていきます。

# 土と石と木で動かせるようになる回数を変える

判断は、あたったブロックの名前に一致する文字列があるかどうかで判断するようにします。
そこで今日の作業は以下の通り。

① 文字列の部分一致で場合分けをする
② VR内で動きを確認する

それではやっていきます。

# 手順
## ① 文字列の部分一致で場合分けをする
土、石、木、葉で動かせるようになる数字を変えるために、まずブロックごとに何回で動かせるかをLuaのTable形式で定義をします。
```lua
local blocks = {Stone=20,Soil=5,Tree=10,leaf=1}
```
ブロック名の共通部分の文字列をkeyとして、valueには動かせるまでの回数を書きます。
石は20回、土は5回、木は10回、葉は1回といった形です。

次に、動かせるものも今のままだと小さくしてふっとばしてしまうので、それは除外する記述を入れます。
```lua
if string.find(subItemName,"move") == nil then
```
subItemNameは当たったVCISubItemの名前が入ってくる変数なので、この文字列の中に動かせるブロックは内包する文字列である「move」が含まれるかを判定し（string.findがその関数）、nilの場合は含まれないので、動かすブロックではないから、その下の処理をするという意味になります。

そして、ブロックの種類によって回数判定を変える処理を書きます。
```lua
for key, value in pairs(blocks) do
    if string.find(subItemName,key) ~= nil then
        if flg.count > value then
            local item = vci.assets.GetTransform(flg.item)
            item.SetLocalScale(Vector3.__new(0.001, 0.001, 0.001))
            item.SetLocalPosition(Vector3.__new(100, 100, 100))
        end
    end
end
```
これは、最初にブロックごとの回数を書いた変数をfor文で回し、そのブロック種の回数以上連続で触って入れば、触れるブロックが表示される状態になる。
という処理です。

## ③ VR内で動きを確認する
VirtualCastを起動して、再度ルームに行き、VCIを触ってみます。
![20241207223726_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/90c8e2c3-0f63-8c92-4e1c-8b1eefc8e119.jpeg)

最初のブロックは持てず、葉っぱは1回触れると持ち運べるというようになりました。
![20241207223818_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/f3058d08-42c2-8849-c388-ab70776bff1e.jpeg)


# おわりに
今日は、ブロック種類ごとに違う回数で動かせる状態にできるようになりました。
現状態では、動かせるようになったあとのブロックを何処かに設置することはできないままです。

明日は、動かしたブロックを配置して、また動かせない状態にしたいと思います。
【個人開発】「MBTI適職診断」をリリースしました🎉

## はじめに
この度、「MBTI適職診断」をリリースいたします🎉

[アプリを開く⤴︎](https://tekishoku-sinndann.vercel.app/)

![トップページ画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836510/100ab5a5-f18a-eb08-2708-885ca3b0ec6b.jpeg)


学習がてら開発し完成したので、皆さんに使ってもらいたく記事にしました！
もっとこうしたほうが良い！など何でもいいので、フィードバックもらえると嬉しいです！
<br>


## アプリの概要
「MBTI適職診断」は、あなたの 「MBTI」×「スキル・志向性」 に基づき、AIが適職を診断してくれます。
また、診断結果として、下記の情報を表示してくれます。


1. マッチした職業
2. これら職業の共通特徴
3. 能力スコア


![診断結果の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836510/443ac9f7-24f5-9aa5-1231-8dea4f2b1642.jpeg)

もっと詳しくみたい方は、GitHubリポジトリをご覧ください。
[GitHubリポジトリはこちら](https://github.com/mkw-tom/tekishoku-sinndann)

<br>
<br>

## なぜ開発した？
　就活を始める学生の中には、自分がどんな仕事に就きたいか、あるいは向いてるかが分からない人が結構いると感じました。私の周りの友人にも多いです🥲
 
そこで、AIを用いた適職診断アプリを作り、就活の後押しがしたいと考え、開発に至りました！
また、MBTIの要素を加えたり、質問項目の具体性を上げることによって、よりパーソナライズされた適職診断を実現しようと考えました。
<br>
<br>

## 技術スタック
##### フロント・バック
- TypeScript
- Next.js
- Redux
- MongoDB
- OPEN AI API
##### インフラ
- Vercel
- Doceker
##### 認証
- Auth.js（NextAuth）
- jwt
- bycript
##### 開発管理ツール・テスト
- GitHub
- git
- ThunderClient
<br>
<br>

## 最後に
最後まで記事を読んでいただき、ありがとうございます。
ご興味があれば、ぜひ一度使ってみてください！
バグ出たらすいません。。
聞くだけで成長できる！エンジニア向けポッドキャスト7選

この記事は、どすこい塾の7日目の投稿です。

# はじめに
みんな！ポッドキャストはいいぞ！！(唐突)

ポッドキャストとは、音声コンテンツをインターネット上で配信し、リスナーが自由なタイミングで楽しむことができるメディア形式です。ラジオに似ていますが、オンデマンドであるため、通勤・通学中や家事をしながら、好きなときに好きなエピソードを聞けるのが特徴です。

私も最近、ポッドキャストをよく聴いています。特に、通勤中は朝にニュース系のポッドキャストを、帰りは技術系のポッドキャストを楽しむのが習慣になっています。
技術系ポッドキャストは近年、番組の種類がますます増えてきており、選択肢が広がっているのがとても嬉しいです。

この記事では、そんな充実してきた技術系ポッドキャストの中から、いくつか個人的におすすめの番組をご紹介します。気になるものがあれば、ぜひチェックしてみてください。
また、ここで紹介する番組は、主にSpotifyやVoicyで聴けるものを中心に選んでいます。

# Qiita FM - エンジニアのキャリアを深掘り-
最初に紹介するのは、この記事を投稿をしている媒体「Qiita」が運営する Qiita FM です。
毎週火曜日に更新されており、月3回はゲストを招いたインタビュー、最終週はQiitaに関連する最新ニュースや話題を取り上げています。
主なトピックは、ゲストのキャリアや技術に対する情熱について。エンジニアとしての視点を深掘りできる内容が多いのが魅力です。

### 最新話

https://open.spotify.com/episode/16JZexxxLb0rn99cslzrkE?si=201d148fbf2841fe

### 個人的オヌヌメ

https://open.spotify.com/episode/3m9xJQDNKdOFYIWxoYNC11?si=bDJf77LTSuWLVspJg0_YvQ

https://open.spotify.com/episode/4cCEbcGO29ywI3xJrGU84R?si=NGd8FjCBSFGHyjSntCKd_w

https://open.spotify.com/episode/7GZn0lHl5H9ZKS9HMaiHrS?si=r0iwoNwPQJCkzkbtTB22og

# エンジニアの楽園 vim-jp ラジオ
vim-jp ラジオ は、2024年の夏にスタートした、エンジニアのエンジニアによるエンジニアのためのポッドキャストです。
Vimコミュニティ「[vim-jp](https://vim-jp.org/docs/chat.html)」のメンバーが送るこの番組は、Vim好きの方はもちろん、非エンジニアにも楽しめる内容です。
パーソナリティは [tomoyaさん](https://x.com/tomoyaton) と [Λlisueさん](https://x.com/lambdalisue)。ワイワイした雰囲気でVimや技術トークが繰り広げられます。

私は毎週2〜3周ほど必ず聞いています。

### 最新話

https://open.spotify.com/episode/4fqFApT29QhfJt4VVKZZ8X?si=ftkftFuPTKqtq5C5B-_zAA

### 初回第1話

https://open.spotify.com/episode/3lLyGgjDTALxsTIwV9kZId?si=pQAYepdwQ5GI8BvmnhgAzQ

# zenncast - 技術トレンドを耳で聞く
エンジニア向けの情報共有コミュニティ「Zenn」が運営するポッドキャスト zenncast。
Zennで話題の記事を取り上げ、最新技術やトレンドを毎日配信しています。今回紹介するポッドキャストの中では最も技術に特化した内容が特徴ですだと思います。

https://open.spotify.com/episode/2OqzCLzEX0g6fEOaHiyFC9?si=wu0ZGUg1RTWzaMBEXcxvPw

# 聴くエンジニア type
技術者のためのキャリア・転職情報を発信するウェブマガジン「[エンジニアtype](https://type.jp/et/feature/)」が送るオリジナルポッドキャストです。
各領域で活躍するエンジニアやCTOへのインタビューを通じて、エンジニアとして成長するヒントやキャリアの築き方を学べます。
パーソナリティは[ばんくしさん](https://x.com/vaaaaanquish)がお送りしています。

### 最新話

https://open.spotify.com/episode/7em5VrLmYFM6bHYy5kuTN1?si=xzFxrj5MTna7afZvzU9vng

### 初回第1話

https://open.spotify.com/episode/2tJQ1eBmCJuOaBQVeWU2x4?si=pTP4hAg-Q6CO8knJns_a5Q

# エンジニアと人生
技術の小難しい話よりも「生き様」に焦点をあてていろんなエンジニアにお話を伺う、というコンセプトの雑談ポッドキャストです。
パーソナリティは、iOSエンジニアの[堤修一さん](https://x.com/shu223)がお送りしています。

### 最新話

https://open.spotify.com/episode/35GaBPWHqZTInfUYMzXP12?si=uQDoTs17SlODjtN4RfU_JQ

### 初回第1話

https://open.spotify.com/episode/0bozqsUoIX6KMOLYlxtT1q?si=EU_IgSSkRxyTo5RQfzUQ2Q

# 論より動くもの.fm
「STORES」の各サービスを運営する [STORES 株式会社](https://www.st.inc)のCTO 藤村さんがホストとなって、技術や技術にまつわらないことについてざっくばらんに話すPodcastです。

### 最新話

https://open.spotify.com/episode/4GaDR9bEy4cpe8ZxGkojeN?si=6eww07OfR7SaxjKXjtsgfg

### 初回第1話

https://open.spotify.com/episode/3KeQLzAZQIR7ZUlRbn47Zo?si=EPVxaa4TSVO-UfmOm3-Gow

# Voicy IT ビジネスニュース
ここからはVoicyでのポッドキャストを紹介します。
まずは、Voicy ITビジネスニュース。
ITやスタートアップ、最新のビジネストレントのニュースを毎朝10分でお送りしています。
私も朝のニュース感覚で毎日通勤時に聞いています。

https://voicy.jp/channel/480

# voi-chord
Voicy のエンジニアメンバーが送るポッドキャスト voi-chord。
リリース情報やプロダクトチームの活動、エンジニアならではの視点での雑談が中心です。

https://voicy.jp/channel/1305


# さいごに
今回紹介したのは個人的にオススメするポッドキャストです。
気になる番組があれば、ぜひ一度聴いてみてください！
画像の色コードを出力ツールを作ってみる

# はじめに

画像ファイルをUploadして

画像に含まれる色コードを文字で出力するツールを作ってみる

# プロジェクトの作成

画像をRGB形式に変換し、画像の幅と高さを取得。

画像の各ピクセルを走査し、color-thiefクレートのget_palette関数を使って、

pixel_dataから主要な色を抽出。

（color-thiefクレートのget_palette関数：画像の代表的なカラーパレットを返します。）

https://docs.rs/color-thief/0.2.2/color_thief/fn.get_palette.html


```rust:lib.rs
#[wasm_bindgen]
pub fn color_ratio(image_data: &[u8]) -> String {
    let img = match ImageReader::new(Cursor::new(image_data))
        .with_guessed_format()
        .unwrap()
        .decode()
    {
        Ok(img) => img,
        Err(_) => return "Error decoding image".to_string(),
    };

    let rgb_img = img.to_rgb8();
    let width = rgb_img.width();
    let height = rgb_img.height();

    let mut pixel_data: Vec<u8> = Vec::with_capacity((width * height * 3) as usize);

    for y in 0..height {
        for x in 0..width {
            let pixel = rgb_img.get_pixel(x, y);
            pixel_data.extend_from_slice(&pixel.0);
        }
    }
    match get_palette(&pixel_data, ColorFormat::Rgb, 10,255) {
        Ok(palette) => {
            let mut result = String::new();
            for color in palette {
                result.push_str(&format!("#{:02X}{:02X}{:02X}", color.r, color.g, color.b));
                result.push('\n');
            }
            result
        }
        Err(_) => "Error getting color palette".to_string(),
    }
}
```

完成！

# 今回の成果物

デモURL

https://shisojuice.github.io/Rust_ColorRatio/


デモ画像

![画像の色コードを出力ツールを作ってみる.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/266c6c68-8e4d-98fd-4de7-00f979470ecd.jpeg)

例：

#B6AE80 => くすんだ黄緑色 (Dusty Green)

#A4ACA0 => 灰色がかった緑 (Grayish Green)

#949C94 => 灰色 (Gray)

#7A6939 => 暗い黄土色 (Dark Ochre)

#E4DEB5 => 薄いベージュ (Pale Beige)

#06080A => ほぼ黒 (Near Black)

#97937D => くすんだ緑灰色 (Dull Green Gray)

#72490B => 暗い茶色 (Dark Brown)

ソース

https://github.com/shisojuice/Rust_ColorRatio/tree/main


# まとめ

画像の色コードをRustとWasmを使って、出力してみた。

今回はcolor-thiefクレートを使って代表的な色コードを出力する処理を行ったが

時間があれば、自力で処理を書いても勉強になりそう。
ゼロから作るDeepLearning #2 -活性化関数-

※以下の企画です

https://qiita.com/tatataichi/private/56936a028e625e62af8e

前回に続いてゼロつくやっていきます。
今回は3章-ニューラルネットワーク-です。
基本は図を使わないという横着をしていきますので、誰かのなにかのための記事になる気はしないので期待しないでください。
ひたすらに自分のためのアウトプットになります。

おねがいします！

# 3章 ニューラルネットワーク
## ニューラルネットワークとは
前回まで学んでいたパーセプトロンだと、重み$w_{n}$を自分の手でいい感じに設定する必要があった。
ニューラルネットワークというものを用いると、複数階層のパーセプトロン達をつなげて、しかも適切な重みを計算によって導きだせるような仕組みを構築できる。というかそういう仕組みのことをニューラルネットワークと言う。

上記の"複数階層"とは、**入力層**、**中間層**、**出力層**という層に分けることができて、中間層を増やしまくって何階層にもしたものを**ディープニューラルネットワーク(DNN)** という。

## 活性化関数
入力信号の総和を出力信号に変換するための関数。
それってただのSUM関数じゃね？って感じだが、「出力信号に**変換**」という部分がミソになっている。

今後の説明簡略化のために、入力信号の総和を求める式を以下のようにしておく。

```math
y = h(b+w_{1}x_{1}+w_{2}x_{2}...+w_{n}x_{n}) \\
```
```math
y = \left\{
\begin{array}{ll}
0 & (x \leqq 0) \\
1 & (x > 0)
\end{array}
\right.
```
```math
h(x) = \left\{
\begin{array}{ll}
0 & (x \leqq 0) \\
1 & (x > 0)
\end{array}
\right.
```

$h(x)$は、入力値$x$の総和を、0を閾値にして1と0に変換する関数。
日本語むずかしい。


### シグモイド関数
入力信号を以下の式に従って変換する関数。
```math
h(x) = \frac{1}{1+exp(-x)}
```
$exp$はネイピア数というやつで、いわゆる$e$だ（なんの説明にもなっていない）。
こいつがいることによって、シグモイド関数は指数関数的な数値変動が想定される。
ということで、実際にプロットまでしてみて動作確認をする。

```python:シグモイド関数
from os.path import normpath
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)
```
```terminal:出力結果
array([0.26894142, 0.73105858, 0.88079708])
```
上記がシグモイド関数の実装と出力テストの結果。
入力に対して極めて連続的な出力値になっている。

```python:シグモイド関数の可視化
import matplotlib.pylab as plt

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)

plt.plot(x,y)
plt.ylim(-0.1, 1.1) #yの描画範囲
plt.show()
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/275ba9b3-4b08-816f-a0d1-46b241c7fb9e.png)

とりあえず描画してみたところ、S次カーブを描く曲線になった。
入力に対して緩やかに応答している感じ。
一定の閾値を超えたらバシッと1か0かに変換するパーセプトロンのときの関数（ステップ関数という）とは異なっていることがわかる。

ニューラルネットワークだと、こういう滑らかな活性化関数を用いないといけないらしい。
1か0かにしかならない場合だと、何層にも重ねる意味がなくなるかららしい。まぁ、たしかに。

### ReLu関数
シグモイド関数と同じくらい有名で代表的な活性化関数が**ReLu(Rectified Linear Unit)関数**というやつ。
これは以下の通りめちゃくちゃ簡単な仕組み。

```math
h(x) = \left\{
\begin{array}{ll}
0 & (x \leqq 0) \\
x & (x > 0)
\end{array}
\right.
```

0を超えたら入力値がそのまま現れるという関数。

```python:ReLu関数
def relu(x):
  return np.maximum(0,x)
```

コードも非常にシンプルで、0と入力値を比較して大きい方を取るだけ。
※これは書籍の方から写経したのだが、もし自分がヒント無しにゼロからコーディングするとしたら、`if文`とか使って無駄なコードだらけになりそう。悲しい

# まとめ
一旦今回は活性化関数まで進めた。
次回は三層のNNを実装してみるところから始めるが、`no.dot`とかそういう文法的な内容は端折っていく上に図を極力使わない（工数エグくてアウトプットが続かなくなるので…）方向で行く( ◠‿◠ )
Power BI Tips - Google Analyticsのデータを取り込んでみる

# 概要
最近お仕事で、マーケティングや採用の話をすることも多々あって、
でそういった関係の分析をしていくことも必要だなーと思い、
Power BI Desktopでデータベースじゃなくてサービスに接続して分析って
どんな感じなのかと試してみた話。

一番使いそうなGoogle AnalyticsのデータをPower BI Desktopに
取り込んでグラフ化してみるまでやってみる。

# 準備
・Power BI Desktopのインストール
・Googleアカウント
・自社のWebサイトやLPにGoogle Analyticsを設定しておく

# 手順
1. Power BI Desktopで、空のレポートを作成
1. ホームタブで、データの取得をクリック
1. 左側のツリーから「オンラインサービス」を選び、「Google アナリティクス」を選択して「接続」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/76025532-034c-8b8f-805b-b7fe3f3ec428.png)

1. 以下のような警告がでるけど、「続行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/9e8c4fa9-7375-2c12-e9c8-b0464dee9c37.png)

1. 実装の選択が表示されるので、「2.0（ベータ）」を選択して、「OK」をクリック
※1.0を選んだ場合、GA4のデータが表示されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/cce4990d-a0f5-a3df-66df-aecc8b6c0c9d.png)

1. Googleのアカウントにログイン
1. 以下のようにナビゲーターが表示されるので、取り込む項目を選ぶ
ただ・・・大量にあって、非常に選びづらい・・・
ここでは、screenPageViewsとdateを選んでみる
プレビューを見てると、グラフのアイコンがついているものが列データ、
3本矢印のアイコンがついてるものが行項目になる模様・・・たぶん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e5d1d1c7-0159-dd5b-2afe-48682b1a588e.png)

1. 取り込みが完了したら、さっそく棒グラフを作ってみる。
X軸がdate、Y軸がscreenPageViews
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/bf334ba0-493f-aabd-4e8e-5549d5014673.png)

screenPageViewsは、多分ページビューですよね。
全然見られていないことがよくわかる（笑）。

# 所感
ものの10分かからずグラフ化まではできました。
が、ナビゲーターで表示される項目がたくさんあって、
欲しいデータを探すのが大変そうという感じ。

あと、たくさん取り込もうとすると（項目を増やすと）、めちゃめちゃ時間かかってました。
⇒2個の場合はすぐ取り込めましたが、8個くらい選んだ時に、
　10分くらいたっても取り込みが完了しなかったです。
  選んだ項目にもよるのかもですが・・・。

今回はとりあえずデータを見える化するところまで。

項目にcity（アクセス元の都市）とかBrowser（ブラウザの種類）なんてのもあったので、
次回はいろいろな項目の組み合わせでデータを取り込んでみたいと思います。