OmniAICreator/Qiita-1.07M huggingface dataset:
Python初心者がTkinterを使って一日スケジュール円グラフを作る

## はじめに
PythonでGUIアプリケーションを開発しながら勉強したいと思ったとき、Tkinterは非常に便利なライブラリです。この記事では、Python初心者がTkinterを使用して、一日のスケジュールを円グラフで表示するアプリケーションの作成手順を紹介します。
※一部だけコードを公開しています

## Tkinterの特徴
- 標準ライブラリ: Pythonに標準で含まれているため、追加インストール不要。
- 簡単な使い方: シンプルなコードでGUIを作成できる。
- クロスプラットフォーム: Windows、Mac、Linuxで動作する。
- 拡張ウィジェット: ttkモジュールを使用することで、より洗練されたウィジェットを利用できる。


### 1. 必要なライブラリのインポート
まずは、必要なライブラリをインポートします。

``` python
import tkinter as tk
from tkinter import ttk
from datetime import datetime
```
2. スケジュールアプリの基本フレームの作成
スケジュールの入力や表示を行うための基本的なフレームを作成します。

``` python
class ScheduleApp:
    def __init__(self, root):
        self.root = root
        self.root.title("24時間円グラフスケジュール")
```
3. スケジュール入力フレームの作成
スケジュールを入力するためのフレームを作成します。このフレームには、日付、開始・終了時間、スケジュール名、メモの入力エリアが含まれます。

``` python
        # スケジュール入力フレーム
        self.input_frame = ttk.LabelFrame(root, text="スケジュール入力")
        self.input_frame.pack(padx=10, pady=10, fill=tk.X)
```
4. 各入力項目の作成
日付、開始・終了時間、スケジュール名、メモの各入力項目を作成し、フレームに追加します。

5. 時間入力の特別な機能
開始時間と終了時間の入力エリアをクリックすると、時間を選択するダイアログが表示されるようにします。

```
    def show_time_picker(self, event, time_type):
        dialog = TimePickerDialog(self.root)
        self.root.wait_window(dialog)
        selected_time = dialog.get_selected_time()
```
6. スケジュールの追加
「スケジュール追加」ボタンをクリックすると、入力されたスケジュールが追加される機能を実装します。

### まとめ
この記事では、Python初心者がTkinterを使って一日のスケジュールを円グラフで表示するアプリケーションの作成方法を一部紹介しました。Tkinterはシンプルで、初心者でも取り組みやすいGUIライブラリだと思います、是非挑戦してみてください。
統計検定ワークブック 24章 クラスター分析

# クラスター分析
## データ間の距離
- ミンコフスキー距離
  $d(x,y) = (\sum_{i=1}^p|x_i-y_i|^m)^\frac{1}{m}$
  m = 2のとき、ユークリッド距離
  m = 1のとき、マンハッタン距離という

- マハラノビス距離
　https://qiita.com/kotai2003/items/297930db4466b71f06b0

# 階層的手法
https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/scikit-learn%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E9%9A%8E%E5%B1%A4%E7%9A%84%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-hierarchical-clustering%E3%81%AE%E8%A7%A3%E8%AA%AC/

 # 非階層的手法
 ## kmeans法
 https://qiita.com/g-k/items/0d5d22a12a4507ecbf11

 ## 混合ガウス分布
https://qiita.com/kenmatsu4/items/59ea3e5dfa3d4c161efb
https://www.hello-statisticians.com/explain-terms-cat/gmm1.html

# 例題24.1
(1)
左が最近隣法、右が最遠隣法
最近隣法でクラスタリングを行う場合、距離が1.4,1.6,2.4,2.5,2.7のタイミングで結合している

|1  |2  |3  |4  |5  |6  |
|---|---|---|---|---|---|
|0.0|2.4|3.3|3.3|2.5|5.4
|2.4|0.0|5.5|5.6|4.4|7.5|
|3.3|5.5|0.0|<font color="#ff0000">1.4|1.6|4.0|
|3.3|5.6|1.4|0.0|2.3|2.7|
|2.5|4.4|1.6|2.3|0.0|4.6|
|5.4|7.5|4.0|2.7|4.6|0.0|

|1  |2  |3  |4  |5  |6  |
|---|---|---|---|---|---|
|0.0|2.4|3.3|3.3|2.5|5.4
|2.4|0.0|5.5|5.6|4.4|7.5|
|3.3|5.5|0.0|<font color="#ff0000">1.4|1.6|4.0|
|3.3|5.6|1.4|0.0|2.3|2.7|
|2.5|4.4|1.6|2.3|0.0|4.6|
|5.4|7.5|4.0|2.7|4.6|0.0|


<br>

|1  |2  |3,4  |5  |6  |
|---|---|---|---|---|
|0.0|2.4|3.3|2.5|5.4
|2.4|0.0|5.5|4.4|7.5|
|3.3|5.5|0.0|<font color="#ff0000">1.6|2.7|
|2.5|4.4|1.6|0.0|4.6|
|5.4|7.5|2.7|4.6|0.0|

|1  |2  |3,4  |5  |6  |
|---|---|---|---|---|
|0.0|2.4|3.3|2.5|5.4
|2.4|0.0|5.6|4.4|7.5|
|3.3|5.6|0.0|<font color="#ff0000">2.3|2.7|
|2.5|4.4|2.3|0.0|4.6|
|5.4|7.5|4.0|4.6|0.0|

<br>

|1  |2  |3,4,5  |6  |
|---|---|---|---|
|0.0|<font color="#ff0000">2.4|2.5|5.4
|2.4|0.0|4.4|7.5|
|2.5|4.4|0.0|2.7|
|5.4|7.5|2.7|0.0|

|1  |2  |3,4,5  |6  |
|---|---|---|---|
|0.0|<font color="#ff0000">2.4|3.3|5.4
|2.4|0.0|5.6|7.5|
|3.3|5.6|0.0|4.6|
|5.4|7.5|4.6|0.0|

<br>

|1,2  |3,4,5  |6  |
|---|---|---|
|0.0|<font color="#ff0000">2.5|5.4|
|2.5|0.0|2.7|
|5.4|2.7|0.0|

|1,2  |3,4,5  |6  |
|---|---|---|
|0.0|5.6|7.5|
|5.6|0.0|<font color="#ff0000">4.6|
|7.5|4.6|0.0|

<br>

|1,2,3,4,5  |6  |
|---|---|
|0.0|<font color="#ff0000">2.7|
|2.7|0.0|


|1,2,6 |3,4,5  |
|---|---|
|0.0|<font color="#ff0000">7.5|
|7.5|0.0|

(2)回答のとおり
AI-102試験対策のまとめ「Azure Cognitive Search②」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
## Azure Cognitive Search
Web、モバイル、エンタープライズアプリケーションにリッチな検索体験を組み込むためのクラウド検索サービス  
ユーザー所有のコンテンツやインターネットから分離されたコンテンツに対する検索に有用

### 検索サービスによって内部で処理されるデータの保護
* ディスクに保存されるすべてのサービスマネージドコンテンツ(下記)に対するデータ暗号化が組み込まれている
    - データディスクと一時ディスク上のコンテンツ
        - インデックス
        - シノニムマップ
    - 定義
        - インデクサー
        - データソース
        - スキルセットなど
* サービスマネージド暗号化は下記の両方に適用
    - 長期データストレージ
    - 一時データストレージ
* 必要に応じて保存データの二重暗号化が可能
    - インデックス付きコンテンツの補足暗号化用
    - カスタマーマネージドキー(CMK)の追加が必要

#### **転送中のデータ**
* 暗号化は接続時/転送時に開始
* パブリックインターネット上の検索サービス：Cognitive SearchによってHTTPSポート443がリッスン
* すべてのクライアントとサービス間の接続：TLS1.2暗号化を使用

#### **保存データ**
| モデル | キー | 必要条件 | 適用対象 |
| --- | --- | --- | --- |
| サーバー側暗号化 | サービスマネージドキー | なし(組み込み) | ・データディスクと一時ディスク上のコンテンツ <br> ・定義 |
| サーバー側の完全暗号化 | カスタマーマネージドキー(CMK) | Azure Key Vault | ・データディスクと一時ディスク上のコンテンツ |

#### **カスタマーマネージドキー(CMK)を有効にした場合**
* Azure Key Vaultが必須
* インデックスのサイズ増加
* クエリのパフォーマンス低下

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/search/search-security-overview#data-protection

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Anomaly Detector」**

https://qiita.com/fsd-jume/items/4be6748f57578dd51c97

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
Git作業のやり直しについて

# 記事の目的
+ 作業のやり直しについて記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ 行った変更を取り消すための基本的なツールについての説明
+ 注意点：ここで扱う内容の中には「やり直しのやり直し」ができないものもある。

## 1.やり直し"--amend"
#### やり直しを行う場面としてよくあるもの
+ コミットを早まりすぎて追加すべきファイルを忘れてしまった
+ コミットメッセージが変になってしまった

#### **--amend** について
+ このコマンドは、ステージングエリアの内容をコミットに使用します。
+ コミットの直後にこのコマンドを実行したような場合、スナップショットの内容はまったく同じでありコミットメッセージを変更することになります。
```
もう一度やり直したい場合には **--amend** オプションをつけてもう一度コミットする。
$ git commit --amend
```
+ いったんコミットした後、何かのファイルをステージするのを忘れていたのに気づいた場合
```
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
```
+ 最終的に出来上がるのは一つのコミットです。２番目のコミットが、最初のコミットの結果を上書きするから。


## 2.ステージしたファイルの取り消し "git reset \<file\>"
・ステージングエリアと作業ディレクトリの変更に関する作業を扱う
##### ふたつのファイルを変更し、それぞれを別のコミットとするつもりだったのに間違えて **git add \*** と打ち込んでしまった場合
問題点：「ファイルが両方ともステージされてしまった。」「ふたつのうちの一方だけのステージを解除するにはどうすればいいのか。」
```
$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

      renamed:    README.md -> README
      modified:   CONTRIBUTING.md
```
**git status** が教えてくれる。
**git reset HEAD \<file\>** と書かれている。
アドバイスに従って **CONTRIBUTING.md** ファイルのステージの解除をする。
```
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M   CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

      modified:   CONTRIBUTING.md
```
CONTRIBUTING.mdファイルは、変更されたもののステージされていない状態に戻りました。

## 3.ファイルへの変更の取り消し "git checkout --\<file\>"
・ファイルへの変更を取り消せる。
・直近のコミット時点の状態、あるいは最初にクローンしたり最初に作業ディレクトリに取得したときの状態に戻す。
・**git status** がやり方を教えてくれる
```
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

    modified:   CONTRIBUTING.md
```
やり方が書いてあるので従ってみると
```
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
```
:::note warn
"git checkout -- [file]"は危険なコマンドであることです。ファイルに加えた変更は全て消えてしまいます。そのファイルが不要であることが確実にわかっている時以外は、このコマンドを使わないようにしましょう。
:::
・やりたいことが「ファイルに加えた変更はとっておきつつ、一時的に横に追いやっておきたい」のであれば"stash"やブランチを調べてみましょう。一般的にこちらの方がおすすめです。


# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
Laravelインストール手順(Windows&Composer)

WindowsのXAMPP環境にComposerでLaravelをインストールして動かすところまでのメモです。
## composerでインストール
XAMPPとComposerは準備済みとして進みます。

```bash:コマンドプロンプト
C:\xampp\htdocs>composer create-project laravel/laravel laravel
```
バージョン指定なしで入れたらLaravel8が入りました。インストールする時期やPHPのバージョンによってLaravelのバージョンが前後します。

http://localhost/laravel/public/
ブラウザからアクセスしてLaravelのデフォルトトップ画面が表示されれば成功です。
![laravel-top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584757/075fb995-5948-578c-55d3-127cdbfa61b9.png)


## 設定ファイルの変更
最低限やっておきたい設定ファイルの初期操作です。後でも変更できますしお好みでどうぞ。

### データベースの接続先
データベースの接続先を設定します。
```:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

次のコマンドを実行してエラーが出なければ接続は大丈夫そうです。
```bash:コマンドプロンプト
C:\xampp\htdocs\laravel>php artisan migrate
```
```bash:結果
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (300.06ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (143.97ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (177.76ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (274.73ms)
```

### Configファイルの設定
タイムゾーンと言語の設定をします。
```:config/app.php
...
'timezone' => 'Asia/Tokyo',
...
'locale' => 'ja',
```

言語ファイルも取ってきます。
```bash:コマンドプロンプト
C:\xampp\htdocs\laravel>php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
C:\xampp\htdocs\laravel>php -f install-ja-lang.php
C:\xampp\htdocs\laravel>php -r "unlink('install-ja-lang.php');"
```
resources/lang/jaに言語ファイルが追加されていれば成功です。

## ログイン機能
Laravelにはログインに必要なソースコードが用意されているので利用できます。
カスタマイズしようとすると骨が折れますが、デフォルトのまま特にこだわりが無ければ利用したいところです。
```bash:コマンドプロンプト
C:\xampp\htdocs\laravel>composer require laravel/ui
C:\xampp\htdocs\laravel>php artisan ui bootstrap --auth
C:\xampp\htdocs\laravel>npm install && npm run dev
```
npmとかの環境も準備済ということで進めています。

http://localhost/laravel/public/login
ブラウザからアクセスしてログイン画面が表示されれば成功です。
![login-top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584757/3d6947db-e7c2-0c2e-7d65-66560e7ee839.png)

## 最後に
以上でインストール手順は終了です。個人のメモなのであまり参考にならないかもしれませんが。
Pythonで「文字列リテラルを記述する」の動作を確認してみた

# 概要

Pythonで「文字列リテラルを記述する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index1.html

# 実装

以下のファイルを作成しました。
```sample.py
print("Tom's toy")
print('彼は"こんにちは"と言いました')
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Tom's toy
彼は"こんにちは"と言いました
```

# まとめ

何かの役に立てばと。
ファイルの移動 "git mv"

# 記事の目的
+ **git mv** コマンドについて記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
・他のVCSとは異なり、Gitはファイルの移動を明示的に追跡することはありません。
・Gitの中でファイル名を変更しても、「ファイル名を変更した」というメタデータはGitには保存されない。
#### Gitの中でファイル名を変更したい場合に行うコマンド
```
$ git mv file_from file_to
```
コマンドを実行してからステータスを確認してみると、
```
$ git mv README.md README
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
```
Gitはそれをファイル名が変更されたと解釈していることが分かる。

+ 同義のコマンド
```
$ mv README.md README
$ git rm README.md
$ git add README
```
・一つのコマンドで済むか３つのコマンドで済ませるかの違い
・ファイル名の変更はなんでもお好みのツールでできること後でコミットする前にadd/rmを指示しとけば大丈夫。


# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
ファイルの削除 "git rm"

# 記事の目的
+ **git rm** コマンドについて記載
+ Gitからファイルを削除したい時に使う
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ ファイルをGitから削除するには、追跡対象からはずし、そしてコミットします。
**git rm** はこの作業を行い、そして作業ディレクトリからファイルを削除します。
つまり、追跡されていないファイルとして残り続けることはない。

### 単純に作業ディレクトリからファイルを削除しただけの場合
```
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

      deleted:    PROJECTS.md

no changes added to commit (use "git add" and/or "git commit -a")
```
**git status** では、ステージされていないと表示される。

### **git rm** を実行した場合
```
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    PROJECTS.md
```
次にコミットするときにファイルが削除され、追跡対象外となります。

### 変更したファイルをすでにステージしている場合
**-f** オプションで強制的に削除しなければならない。
オプションがある理由は、まだスナップショットに記録されていないファイルを誤って削除してしまうとGitで復旧することができなくなるのを防ぐためにある。

+ 他にも、ハードディスク上にはファイルを残しておきたいけれど、もうGitでは追跡させたくない場合のやり方もある。 "--cached"オプション

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
Add Reports and Dashboards to a Travel Approval App > Load Data Using the Data Import Wizard


# Add Reports and Dashboards to a Travel Approval App > Load Data Using the Data Import Wizard

https://trailhead.salesforce.com/content/learn/projects/add-reports-and-dashboards-to-a-travel-approval-app/load-data-using-the-data-import-wizard?trail_id=build-a-travel-approval-app&trailmix_creator_id=yeomo1&trailmix_slug=trailmix-project

### 'We couldn't upload [You must specify a blobValue with a positive length for your CreateAndWriteBlobRequest [keyPrefix=005]]'

+ [【未解決】Load Data Using the Data Import Wizard in Build a Travel Approval App Project](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8zM8SAJ)

### I keep receiving an error message "couldn't upload null" when attempting to upload the Departments.csv. Can anyone shed some light on this?

+ [Hi community! I'm unable to upload a data file for the "Build a Travel Approval App."](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Fut4wSAB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1368e024-34b8-821c-9da2-eb92ac6ab384.png)

:::note
Please open the file in notepad or in any editor and try to "Save As" as CSV files. Then try again
:::
ステージングエリアの省略 "git commit -a"　オプション"-a"について

# 記事の目的
+ **git commit -a** コマンドについて記載
+ 便利でちょっと危ないオプション"-a"について扱う
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ **git commit** に **-a**オプションを指定すると、追跡対象となっているファイルを自動的にステージしてからコミットを行える。つまり **git add** を省略できる。
+ 注意点：変更したファイルを全てコミットできるので便利だけど意図しない変更をコミットすることもある。
```
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

  modified:   CONTRIBUTING.md

no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
 1 file changed, 5 insertions(+), 0 deletions(-)
```
オプション **-a** が無いのならば、 **git add**してからコミットしなければならないけどそれを省略できる。

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
変更のコミット "git commit"

# 記事の目的
+ **git commit** コマンドについて記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
### ステージングエリアの準備ができたら、変更内容をコミットすることができる。
### コミットの対象となるのはステージされたものだけ
追加したり変更したりしただけでまだ **git add** を実行していないファイルはコミットされない。
そんなファイルは、変更されたままの状態でディスク上に残ります。
### 例
+ この例では、最後に **git status** を実行した時に全てがステージされていることを確認したこととする。つまり、変更をコミットする準備ができた状態。
```
コミットするために打ち込む
$ git commit

これを実行すると指定したエディタが立ち上がる。
```
+ エディタには次のようなテキストが表示されます。（Vimの画面の例とする）
```
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# new file:
#   modified:
#
~
README
CONTRIBUTING.md
~
~
".git/COMMIT_EDITMSG" 9L, 283C
```
+ 分かること・できること
・デフォルトのコミットメッセージとして、直近の **git status** コマンドの結果がコメントアウトして表示され、先頭に空行があることが分かる。
・デフォルトのコメントを消して自分でコミットメッセージを書き入れていくこともできますし、何をコミットしようとしているのかの確認のためにそのまま残しておいても構わない。（何を変更したのかをより明確に知りたい場合は、 **gut commit** に **-v** オプションを指定します。）
・エディタを終了させると、Gitはそのメッセージ付きのコミットを作成します。

+ 別例：コミットメッセージをインラインで記述することもできる。
(筆者はいつもこちらを使う)
```
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
```

+ 今回のコミットで分かること
・表示：「どのブランチにコミットしたのか（master）」「そのコミットのSHA-1チェックサム（463dc4f）」「変更されたファイルの数」「そのコミットで追加されたり削除されたりした行数」が分かる。
・コミットが記録するのは、ステージングエリアのスナップショットであること。

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
ファイルの無視 "cat .gitignore"

# 記事の目的
+ **.gitignore** について記載
+ ファイルの無視について記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど編集しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ Gitで自動的に追加して欲しくないしそもそも「追跡されていない」と表示されるのが気になるのを解決させる。
+ 例えば、ログファイルやビルドシステムが生成するファイルなどの自動生成されるファイルがそれにあたる。
+ 実際に作業を始める前に.gitignoreファイルを作成するのを勧める。
+ .gitignoreファイルに記述するパターンの規則
• 空行あるいは # で始まる行は無視される
• 標準の glob パターンを使用可能
• 再帰を避けるためには、パターンの最初にスラッシュ (/) をつける
• ディレクトリを指定するには、パターンの最後にスラッシュ (/) をつける 
• パターンを逆転させるには、最初に感嘆符 (!) をつける
+ globパターンとは
シェルで用いる簡易正規表現のようなものです。
| 文字 | 説明 |
|:-:|:-:|
| * | 0個以上の文字にマッチします。  |
| [abc]  | 角括弧内の任意の文字（この場合はa,b,c）にマッチします。  |
| ? | 一文字にマッチします。  |
| [0-9] | ふたつの文字の間の任意の文字（この場合は0から9までの間のもじ）にマッチします。 |
| ** | ネストされたディレクトリにマッチさせることもできます。 |
a/**/z　と書けば、a/z, a/b/z, 'a/b/c/z'などにマッチします。


:::note warn
この欄については後ほど深掘りする。（よくわからない）
:::

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
状態表示の簡略化 "git status -s"

# 記事の目的
+ **git status -s** コマンドについて記載
+ 簡略化された状態表示について記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ 記号の意味
??: まだ追跡されていないファイル
A: ステージングエリアに追加されたファイル
M: 変更されたファイル
一文字目: ステージされたファイルの状態
二文字目: ファイルが変更されたかどうか

+ 'git status -s' | 'git status --short'コマンド
```
$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt
```
+ 状態の説明
・READMEファイル: 作業ディレクトリ上にあって変更されているけれどステージされていない。
・lib/simplegit.rbファイル: 変更済みでステージもされている。
・Rakefileファイル: 変更されステージされた後、また変更された。変更の内容にステージされたものとそうでないものがあることになります。

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
Raspberry Pi 4で個人用Misskeyサーバを立てた際の覚え書き

# 概要
この記事はタイトルの通り、Raspberry Pi 4でMisskeyサーバを立てるに当たって手戻りが発生するなどした点、ドキュメントに記載がなかった細かい点をつらつらと書き連ねたものである。
基本的にはMisskey Hubのドキュメント通りに作業すればMisskeyサーバの作成自体はできる(はず)。
また、サーバ立ち上げから2週間ほど経ってからこの記事を作成しているので記憶がない部分については割愛した。

# 構築環境
- ハードウェア
Raspberry Pi 4B / 4GB
外付けHDD

- ソフトウェア
OS : Ubuntu Server 22.04.3 LTS (64-bit)
Misskey : 2023.10.1

- 備考
あくまで個人ユースなので仮想化等は導入しなかった。

# ベースとしたドキュメント
- Misskey Hub
[Ubuntu版Misskeyインストール方法詳説](https://misskey-hub.net/docs/install/ubuntu-manual.html) [^1]

# ネットワーク関係
サーバの設置場所は自宅とした。
ただし、自宅のLAN環境に混在させるのは問題があった為、ONUに複数のルータ(※余ってた)をぶら下げてマルチセッションとし、LANとしては分離した。[^2]
問題になったのは元来のLAN環境はIPoEによりIPv6でインターネット空間に接続しているため、固定IPアドレスを持てない点。
IPv4で固定IPアドレスを持てるISPを別途契約した。

# OS関係
### インストール
OSのインストールに関してはRaspberry Pi Imagerを利用した。
**何故かMBRで書き込まれた。**
今回利用したHDDは余っていたWD REDの4TBモデルだったため、MBRのままではすべての領域を使う事ができない。
Raspberry Piで起動する前にWindowsでGPTに変換し、初回起動時のパーティション拡張ですべての領域に拡張された。

# Cloudflare
SSL/TLS暗号化モードは `フル(厳密)` を選択する事。

# ファイルアップロード上限
約85MBのmp4ファイルをドライブにアップロードしようとすると弾かれる問題があったのだが、misskey側の設定をいじっても解決せず。
この記事を執筆するに当たってnginxの設定を見返したところ以下の項目があり、これが原因であった。
```/etc/nginx/conf.d/misskey.conf
    # Change to your upload limit
    client_max_body_size 80m;
```
なお、Cloudflareを無料プランで利用している場合は100MBの制限があるようだが試してはいない。

# 運用開始後の使用感
立ち上げ直後の数日間はDNSの名前解決に問題があったようで、DNS関係のエラーがでて閲覧できない事が度々あった。
ハードウェアパフォーマンスについてはフォロー100程度では問題は感じない。千の単位でフォローを扱うようになった場合は問題になるかもしれない。とはいえRaspberry Pi 5 / 8GBにリプレースすれば対応可能なのではないか。(物欲的には今すぐ欲しい)

# 未解決の問題
### Ubuntu / netplan
`optional: true` を設定しても効いてないようで起動時のネットワーク回りの待機に2分程要している。
とりあえず起動はするので放置しているがいずれ対処したい。
そもそもmisskeyの起動が分単位でかかるのでそれぞれの再起動を含むメンテナンスはダウン時間が長く、フォローが増えてきた際に問題になる可能性が高い。

[^1]: 筆者はシェルスクリプトでのインストールは行わず、コマンドを全て手動で実行した。
[^2]: メンテナンス上の便宜のため厳密には分離していない。Raspberry PiのWiFiでクライアント側LANにも接続している。
ABC125、D問題の初心者解説

## 0. はじめに

数年前の問題ですが、一昨日解いて解説記事を調べると「負の符号の数」を使った解説記事が多く、動的計画法（DP）で解いたという記事が少ないので、需要はともかく書いておきます。

有名所の**はまやん**さんと**けんちょん**さんの記事では「負の符号の数」を考慮して解を得ています。

* はまやん記事：[Flipping Signs [AtCoder Beginner Contest 125 D]](https://blog.hamayanhamayan.com/entry/2019/04/28/091246)

* けんちょん記事：[AtCoder ABC 125 D - Flipping Signs (緑色, 400 点)](https://drken1215.hatenablog.com/entry/2019/04/27/224100)

PythonとDPによる解説記事としては**56**さんの記事があります。

* 56記事：[AtCoder Beginner Contest 125 D - Flipping Signs](https://kent056-n.hatenablog.com/entry/2019/11/08/015051)

同じ内容では意味がないので、詳細を丁寧に書こうと思います。

要素のインデックスは0始まりです。

## 1. 問題とACコード

https://atcoder.jp/contests/abc125/tasks/abc125_d

```python:abc125_d.py
n = int(input())
a = list( map(int, input().split()) )

inf = float("inf")
dp = [[-inf, -inf] for _ in range(n+1)]
dp[0] = [0, -inf]
for i in range(n-1):
# A_{i-1}に-1が乗算されていないとき
  dp[i+1][0] = max(dp[i+1][0], dp[i][0] + a[i])
  dp[i+1][1] = max(dp[i+1][1], dp[i][0] - a[i])

# A_{i-1}に-1が乗算されているとき
  dp[i+1][0] = max(dp[i+1][0], dp[i][1] - a[i])
  dp[i+1][1] = max(dp[i+1][1], dp[i][1] + a[i])
  
i=n-1
dp[i+1][0] = max(dp[i+1][0], dp[i][0] + a[i])
dp[i+1][0] = max(dp[i+1][0], dp[i][1] - a[i])

#for i in range(n+1):
#  print(dp[i])
print(max(dp[-1]))
```

## 2. 考察

### 2.1 状態数の見積もり

問題の肝は、「『$A_i$と$A_{i+1}$に$−1$を乗算する』操作を任意で行い、変換後の数列の和の最大値を求めよ」です。なので、操作をするかしないかの状態変化を全て調べれば、最大の和を取る状態が一つ見つけられます。

しかし数列の長さが最大で$10^5$なので、数列の一要素ごとに操作の実行・不実行を選択して状態数を2倍にすると、最終的な状態数は$2^{100000}\sim10^{30000}$となります（$2^{10}=1024\sim10^3$）。もちろんこの状態数は時間内で計算できません。

そこで問題文の中に「和の最大値を求めよ」とあるので、要素ごとに操作の実行・不実行で状態を分けてそれまでの和の最大値をメモ化すれば、DPで解けるだろうと推測（期待）できます。

### 2.2 状態遷移

状態遷移についてです。

* 考慮する状態は、「$A_i$に$-1$を乗算したとき、しなかったときの和」
    * $dp[i+1][0]$、 $A_i$に$-1$を乗算しなかったときの和。
    * $dp[i+1][1]$、 $A_i$に$-1$を乗算したときの和。
* 前の要素$A_{i-1}$に$-1$が乗算されていないとき（つまり$dp[i][0]$に新たな要素を加えるとき）は、以下のように実装します。
    * $dp[i+1][0] = \max(dp[i+1][0], dp[i][0]+A_i)$
    * $dp[i+1][1] = \max(dp[i+1][1], dp[i][0]-A_i)$

上の遷移式が$-1$を乗算しない時の和、下の遷移式が$-1$を乗算した時の和です。下の遷移式では$-1$を乗算して和を求めているので、値は$dp[i+1][1]$に格納されます。

* 前の要素$A_{i-1}$に$-1$が乗算されているときは（つまり$dp[i][1]$に新たな要素を加えるとき）、以下のように実装します。
    * $dp[i+1][0] = \max(dp[i+1][0], dp[i][1]-A_i)$
    * $dp[i+1][1] = \max(dp[i+1][1], dp[i][1]+A_i)$

ここでのポイントは、$A_i$の符号です。

$dp[i][1]$を考えるときは、「$A_{i-1}$に$-1$が乗算されて」いる前提であり、この時点で$A_i$にも$-1$が乗算されています。従って$A_i$に改めて$-1$を乗算しなければ、$dp[i][1]$に$-A_i$を加えた和が$dp[i+1][0]$に格納されます。一方、$A_i$に改めて$-1$を乗算すると、$dp[i][1]$に$+A_i$を加えた和が$dp[i+1][1]$に格納されます。

この状態遷移を理解していると、最後の、$-1$を乗算するかしないかを選択できない$A_{n-1}$についての遷移式もシンプルに書けます。

### 2.3 DPの初期値

さらに、DPの初期値にも注意が必要です。初期値を$dp[0]=[0, 0]$とすると失敗します。正解は、$dp[0]=[0, -\inf]$です。

なぜなら、$A_0$による和を考えるときは、$A_{-1}$と$A_0$に$-1$が乗算されているとは考えないからです。正しい計算のためには、事前に$-1$が乗算されていない$A_0$に$-1$を乗算するかどうかの選択をしなければなりません。このために、初期値は$dp[0]=[0, -\inf]$である必要があります。

# 3. おわりに

私のコードよりも、先に紹介した**56**さんのコードのほうがシンプルです。そちらも参考にどうぞ。

（正直、最初から理解していたかのように書いていますが、実装した時は理解が曖昧で正解が出ませんでした。）
LLaVAのローカルPCでの動作報告-GPU16GB-実行時のメモリ消費が想定外に大きかったので4bitでload

　LLaVAが簡単に使えるという事で試してみました。
実行時にGPUメモリの消費が増える所が問題でしたので
メモとして残しておきます。
　テキスト生成では、実行時のGPUメモリ追加消費で
問題となったことがありませんでしたので想定外でした。

https://github.com/haotian-liu/LLaVA

## 環境
　GPU:RTX 4060 Ti 16G 
　CPU:AMD Ryzen 5 5500
　MEM:96 GB
　WSL2-Ubuntu 22.04.2 LTS

## 実施手順と結果
Gitの手順通りに実施
8bitでのモデルのロード自体は成功（15.2GB/16GB）
ただし、実際に画像を認識させる際に
「NETWORK ERROR DUE TO HIGH TRAFFIC. 
　PLEASE REGENERATE OR REFRESH THIS PAGE.」
 とエラーが表示
 
## エラー原因
　画像の認識の際に、追加で2GB程のメモリを消費
　なお、4bitでのモデルロード後で8GB
  画像認識時は11GB、尚この状態でチャットは可能

## 環境構築時のメモ
　パスが通っていないとGradioで画像のSned時にエラー

## パスの設定
```　vim ~/.bashrc　で追加
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
```
``` 設定の有効化
 source ~/.bashrc
```

## 試してみました
![IMG_6758.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142889/ad339fdc-4102-ae5f-febf-9ab9d699c475.jpeg)

![IMG_6760.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142889/e2ec2f78-cdd5-2ff3-767c-eb59a8404c61.jpeg)

以上
Dynamics 365 SCM/FIN 環境立ち上げ後、最初にするべき2つのこと

# はじめに
Dynamics365 SCM/FINの環境作成後、実施している項目を纏めました。
環境作成後、最新のUpdateは適用済みとします。
    #1. レガシーナビゲーションバーの有効化
    #2. 機能管理有効化有無の確認
    
# 今回確認した環境のVersion
バージョン: 10.0.35 (10.0.1627.92)

# 1.レガシーナビゲーションバーの有効化
レガシーナビゲーションバーは、Dynamics 365 SCM/FINの現在開いているメニューの階層構造が一目でわかるナビゲーションバーです。
このナビゲーションバーを有効にすることで、従来のナビゲーションバーと同様の機能を利用できます。
有効化手順は以下の通りです。
[システム管理] > [設定] > [クライアントパフォーマンスオプション] を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/c1526884-11a3-a230-0cc2-f1c695f75d85.png)

レガシーナビゲーションバーの有効化 [はい]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/256949d1-a9b8-c81b-fde0-06a42f4b6ca2.png)

ページをリフレッシュ(F5)

Finance and Operationsの横にナビゲーションバーが表示。
現在のメニューの階層が一目でわかる様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/10e1975b-f634-3912-a955-10c2c8b2e6bb.png)

# 2.機能管理有効化有無の確認
機能管理は、Dynamics 365 SCM/FINで使用される機能を管理するためのツールです。
環境立ち上げ後、各機能が有効になっている確認することが重要です。
確認方法は以下の通りです。

[システム管理] > [ワークスペース] > [機能管理] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/d676b51c-2a8d-a96f-cfac-06b02af1f6a9.png)

[機能管理]を開くと新規の機能、無効化されている機能、機能の有効化のスケジュールなどが確認できます。
デフォルトでは[新しい機能は自動的に有効にしない]に設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/a4000466-76f4-d62e-bad9-3340c7eff3b2.png)

機能名を選択すると、各機能の説明、詳細からLearnへのリンクが貼られています。
プレビュー機能の有効化も可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/5ba167e6-4c8c-0e08-24ed-74e1b7a23b59.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/b16dda2e-3f38-300e-6e61-32e2d2fae153.png)

# まとめ
1.レガシーナビケーションバーは必須
2.機能管理から必要な機能をON、OFFに設定

# 参考資料
https://learn.microsoft.com/ja-jp/dynamics365/fin-ops-core/fin-ops/get-started/feature-management/feature-management-overview
Windows　Permission denied (publickey,keyboard-interactive).

# OpenSSHのログを表示して原因を探る
OpenSSHのサービスを動かしている場合は停止する
```
net stop sshd
```
次にOpenSSHをデバッグモードで実行する
```
C:\Windows\System32\OpenSSH\sshd -d
```
これでログが表示されるので、原因を探る。

# 自分の場合の原因
自分の場合以下のような怪しいエラーがでていた。
```
Could not open authorized keys '__PROGRAMDATA__/ssh/administrators_authorized_keys': No such file or directory
```
~/.ssh/authorized_keysを読み取ってほしいのに、なんで管理者の方を読み取ろうとしてるんだ？っていう話になりまして、
そこでいろいろ調べて、sshd_configの一番下の2行をコメントアウトしたら解決できました。
```
# Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
Hibiya.tech 1回 好きな AWS サービスへの愛を語る に参加しました!

## 序論
実際、いくつかの発表会にずっと参加してきましたが、参加してからの感想を書くのは今回が初めてです。個人的に資料収集をしたり、整理をする程度はしたことがありますが、発表してくださる方々がとても良い内容をよくまとめてくださるので、どの部分を私が整理すべきか曖昧だったのが大きかったです。

今回も発表内容についてまとめるのはあまり意味がないと思うので、アンケートに書いた感想を中心に書いてみようと思います。

今回の発表会はクラスメソッド日比谷オフィスで行われたhibiya.techの第1回目でしたが、同じ日にre:inventの事前勉強会が同じ時間帯に行われたため、比較的少人数で行われました。 人数とは別に充実した内容で大満足でしたが、次回はもう少し多くの方に聞いてもらいたいです。

## 本論

### 1.
最初の発表は、emiさんの発表で、FSx for NetApp ONTAPのエンドポイントに関する内容でした。実は発表してくださったemiさんが冒頭でおっしゃっていたように、ONTAPはちょっとストレージ系の高級品みたいな感じ、つまりコストの問題でEFSやFSx for windowsの方が使いやすいという印象でした。 しかし、場合によってはONTAPの方が費用対効果が高いとおっしゃっていたので、実際のコストはどのように計算されるのかもう少し知りたいと感じました。

https://aws.amazon.com/jp/fsx/when-to-choose-fsx/

実際にawsでファイルシステム選択アシスタントというページがあり、大まかな選択基準は分かるのですが、詳細な要件までチェックするのは難しい感じです。

それ以外は、ONTAPの基本的な説明からエンドポイントまでしっかり説明してくれて、こんなサービスなんだなという感覚をしっかりつかむことができました。 詳細はemiさんのブログにも詳しく書いてあって、ブログの内容と大きく変わらない部分も確認したので、興味がある方はリンクを確認してください。

https://dev.classmethod.jp/articles/i-drew-diagrams-to-understand-fsx-for-netapp-ontap-architecture-and-endpoints/

### 2.

続いてのんピさんの発表で、同じくONTAPに関する内容でした。確かに今回のテーマにふさわしく、ONTAPに関するポストを40個くらい書いているそうです(@ﾟωﾟ)

発表の前にONTAPの布教活動をしているとおっしゃっていましたが、確かに布教されるだけの魅力がありました。

最初にFSxでS3が使えるということに衝撃を受け、ONTAPでS3を使うメリット、実活用例まで教えていただき、時間を割いてハンズオンしてみたいという欲求まで湧き上がりました。

実は、以前Storage-JAWSの第1回でLTをしていただいた時にも、ONTAPに関する内容を教えていただき、印象に残っていたのですが、今回も面白い内容で発表していただき、記憶が蘇りました。下のリンクは、当時Storage-JAWSに登壇された時の内容を投稿していただいたものです。

https://dev.classmethod.jp/articles/storage-jaws-netapp-bluexp/

### 3.

3番目はおつまみさんがSESについて発表してくれました。 
私の場合、もともとSESサービスに対する認識はありましたが、あえてSESを使う必要性があるのかという疑問がありました。私が会社で適用しているソリューションでもSMTPとJavaのライブラリを活用してメールを送信しており、大きな問題はなかったからです。

https://dev.classmethod.jp/articles/check-bounce-emails-with-amazon-ses-vdm/

しかし、発表内容のようにメールがバウンドする場合や迷惑メール扱いされる場合があるはずで、その対応までは考えていませんでした。 当然、メールが届かない場合があるかもしれませんが、原因を分析して対処する上で、メール送信をする部分がサービスに含まれているのであれば考慮すべき点だと感じました。

### 4.

4番目はといちちさんの発表でした。AWS Healthの通知に関する内容でしたが、実はこの部分はAWSサービスを運用する上で基本的かつ重要な要素の一つだと思います。 おそらく誰もが何らかの形で行っていると思います。
その中でもといちちさんの発表の核となるのは、このマルチアカウントでの通知に関する集約処理についてです。
方法論についても3つもあり、10.5の最新アップデートでEventBridgeで簡単に解決できる最新情報が印象的でした。

AWSの公式ホームページでもAWS Healthに関する部分があるので、参考にしていただければと思います。

https://docs.aws.amazon.com/ja_jp/health/latest/ug/cloudwatch-events-health.html

### 5.

最後に芦沢さんの発表でしたが、今年5月からGAになり始めたAmazon Security Lakeについての内容で、出て間もないため私にとっては馴染みのないサービスでしたが、データログを取り込む部分もサービスを運用する上で重要な部分であることは知っていました。

発表の内容はやはりAmazon Security Lakeの概要的な部分とサブスクライバーに関する内容でしたが、重要なのはAWSサービスのソースだけでなく、サードパーティのセキュリティデータまで取り込めるという点です。ブログにサブスクライバの設定に関する記事が複数あるので、詳細はそちらをご覧ください。

https://dev.classmethod.jp/author/ashizawa-hiroaki/

## 結論

第1回が終わり、確実に感じたのは、好きな AWS サービスへの愛を語るというテーマにとてもマッチした内容だったということです。

発表を聞いて、会話をして、交流する中で、基本的に皆さんが技術が好きだと感じました。 個人的にも得るものが多かったと思いますし、次のテーマへの期待もあります。

特に、発表を聞いて詳細が気になったことについては、書いていただいたブログの内容を確認したり、検索したりして、理解を深めることができたのが良かったです。

オフラインイベントは今回で3回目ですが、もっと積極的にオフラインイベントを行っていくのも良い経験になると思います。
カルロス・ラストレス: グローバルな視点を持つ、結果重視のシニアプロダクトデザイナー

![Carlos New Purple169.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/f24c7ca7-33a9-ff1e-055a-4f6296514136.jpeg)

（東京，2023 年 10 月 26 日）—— 時代にあわせ進化し続けるデザイン業界の中で、より際立った存在となるためは、創造性、経験、グローバルな視点を組み合わせたスキルと感性が重要です。

現在東京を拠点とするシニアプロダクトデザイナーであるカルロス・ラストレスは、成長戦略と収益化戦略に対する革新的なアプローチで知られています。ラテン系のバックグラウンドを持つ彼は他に類を見ない感性とスキルで実績を残し、業界で傑出した人物となっています。

カルロスのデザインにおける歩みは驚くべきものにほかなりません。 MBAの学位を持つデザイナーであり、戦略的思考者でもあります。自身の洞察や専門知識を積極的に共有したいという彼の情熱により、TEDxイベントで講演するほか、プロダクトアナリティクスの認定資格を取得し、常にデザイン界のトレンドの最前線に立ち続けることへの取り組みを示しています。

カルロスの経歴で最も興味深い点の 1 つは、ソフトウェアエンジニアリングにおける強力な基盤です。多様な知識、経験とスキルを活かしてデザインとテクノロジー間のギャップを埋めることができ、その結果、見た目が美しいだけでなく、機能的であることを約束するプロダクトを生むことに長けています。

また、自身にとっての快適な環境から離れ、中国と日本における駐在員としての生活をスタートしました。この経験によりデザイン、マーケティング、創造性のスキルを革新的に融合させることに成功し、デザインにおいてアクセシビリティ、使いやすさ、包括性を約束する製品を手がけることに専念し、ユーザー第一としたデザインを作成しています。

彼の広範な業界経験がデザインにおける成功の鍵であり、作品へ並外れた深みと品質を与えています。

14年以上のキャリアを持つカルロスは、世界中の多様なチームと仕事する機会に恵まれ、これまで南米、アジア、オーストラリア、ヨーロッパ、北米にその功績を残しています。なお彼の貢献は、CCTV4、「In Zhejiang」、FM89 などの著名な中国メディアから高く評価されており、2019年には中国の杭州でTEDxトークを開催し、聴衆へ自身の洞察とビジョンを共有しました。

カルロスのデザインに対する情熱は、卓越したデザインを推進し、革新的な製品ソリューションを通じてビジネス目標を達成することに熱心に取り組んでいることからも明らかです。彼の功績はそれ自体を物語っており、常に新しい挑戦や機会に意欲的に取り組んでいます。

プロジェクトにグローバルな視点をもたらすシニアプロダクトデザイナーに興味をお持ちでしたら、カルロス・ラストレスが最適です。コラボレーションを歓迎し、あなたのデザインとビジネス目標の達成を支援します。

彼の専門知識が次の製品設計プロジェクトにどのように貢献できるかを調べるには、[https://www.lastrescarlos.com/](https://www.lastrescarlos.com/) または [https://www.linkedin.com/in/carloslastres/](https://www.linkedin.com/in/carloslastres/)からご連絡いただけます。

経験と創造性の世界をもたらす、熟練された結果重視のシニアプロダクトデザイナーとの機会をご検討ください。
Azure OpenAI Whisperによる文字起こし


# Whisperとは
WhisperはOpenAIが公開している音声認識モデルであり、文字起こしに利用できる。これまで公開モデルを自前でデプロイする必要があったが、2023/9月にAzure OpenAI上においてはプレビュー公開され、APIとして利用することができるようになっている。文字起こしをした文章をChatGPT等のLLMと連携することで、音声による応答を行うこともできる。なお、Azure AIにはSpeech to Textという音声テキスト変換のモデルがあるが、Whisperの方が精度が高いと言われている。（AWSではAmazon Transcribe、GCPではGoogle Cloud Speech-to-Textが該当する）


# Whisperモデルのデプロイ
Azure OpenAI Studioにてデプロイする。
なお、Whisperはプレビューにつき、2023/10時点では、米国中北部(North Central US)または西ヨーロッパ(West Europe)リージョンのみ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/03316c22-e450-3fca-ca69-e246d98520b9.png)

またAzure Portal上でキーとエンドポイントを控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/2594b510-f3a9-1877-33ac-5c0b0193de3c.png)


# 利用
## 音声ファイルの用意
音声ファイルはWindows標準のボイスレコーダー等で録音したもの（.m4a）を使用した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/cdd8a609-59b8-41ef-df23-2c3e41eae589.png)

なお、こちらからAzure公式のサンプル音声ファイルを入手することもできる。
https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/master/sampledata/audiofiles

## curl による利用
Azure公式のREST APIどおりであるが、以下のとおり。

```bash
curl 【エンドポイント】/openai/deployments/whisper/audio/transcriptions?api-version=2023-09-01-preview  -H "api-key: 【キー】"  -H "Content-Type: multipart/form-data"  -F file="@./【ファイル名】"
```
実行結果
```
{'text': 'こんにちは。今日は10月28日。天気は晴れです。'}
```

## python による利用
curlをそのままpythonのrequestsで実装しただけだが、requestsでは、"Content-Type": "multipart/form-data"は必要ない。requestsモジュールは、ファイルをfilesパラメーターとして提供すると自動的にContent-Typeを適切に設定する。（もしヘッダに設定してしまうと、レスポンスとしてエラー{'error': {'message': '', 'type': 'server_error', 'param': None, 'code': None}}が返ってくる。）



```python
AZURE_OPENAI_KEY=""
AZURE_OPENAI_ENDPOINT="https://[].openai.azure.com"
FILE=""

import requests

url = AZURE_OPENAI_ENDPOINT + "/openai/deployments/whisper/audio/transcriptions?api-version=2023-09-01-preview"

headers = {
    "api-key": AZURE_OPENAI_KEY,
}

# マルチパートエンコーディングとしてファイルを読み込み
with open(FILE, 'rb') as f:
    file = {'file': (FILE, f)}
    response = requests.post(url, headers=headers, files=file)

# レスポンスの表示
print(response.json())
```

実行結果
```
{'text': 'こんにちは。今日は10月28日。天気は晴れです。'}
```


# 注意
WhisperのAPI操作をするにあたって、Azure AIのSDK(Speech SDK)と間違えやすい。これはspeech to textのものであり、現時点ではWhisperの操作には使用できない。（マニュアルページがわかりづらい）
Azure OpenAI WhisperはREST APIしか正式に公開されていない。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/whisper-quickstart
Windows10 ssh ポート22以外にしたときにConnection timed outが発生する

# デフォルトポートは使わない
sshはコンピュータを自由に操作できることから、セキュリティの関係上デフォルトのポートである22番はあまり使わない方が良いとされている。そこで、ポートを変更したいわけだが、ポートを変更したら、sshで接続しようとしたときにConnection timed outが発生するようになった。
ちなみに、pingしてみたけど、pingもつながらない。調べるとwindowsはpingに対して反応しないようにデフォルトで設定されていることが分かった。と、疎通確認をしようとしたわけだったが、設定をいじるのにVNCを使っていた。そのため、ネットワーク自体は絶対につながっている確信があった。よって、pingの設定はいじらなかった。そんなこんなで、解決に少しだけ時間がかかったので、備忘録として残しておく。

# 解決策
ゲストPC(sshサーバが動いている方のPC)のWindowsのファイヤーウォールの受信規則を設定したら、直った。
1. Windowsキー+sで検索バーを開く
1. 「Windows Defender ファイアウォール」と検索
1. 受信の規則をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121536/371ef20c-4907-c0d7-9c5f-3b12177f942d.png)
1. 新しい規則をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121536/56f517ba-ed9b-c267-7525-77fa11012fa7.png)
1. ポートをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121536/7d80912b-b10c-ed24-a499-9370fe7b1d10.png)
1. sshしたいポート番号を入力(例は1000の場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121536/ef87d179-6acf-7568-244f-96f215f763a0.png)
1. 以降の項目はお好みでよいと思います。
Pythonで作るメモ帳

## はじめに
記事をあまり書いたことがないのでご容赦を、、

:::note warn
警告
私はコーヒーを飲むのと犬をなでたり見まくるのが趣味の変態なのでなにかしらが
プログラム、プロジェクトに影響する可能性があります。
:::

### 作った意図
自分が大学の授業中に先生が軽く言った重要なこと
（書き取り妨害術？いにしえの技?）
をメモするためにメモ帳を使っていたのですが。。。
### ノートパソコンだと使いづらい!!
CAD使ったり、zoom開きながらだとサイズの調整とかで戸惑っている間に積む、、、
消すのめんどくさい、、、
画面半分より小さいサイズがデフォルトで
すぐに書いた言葉を消せるホワイトボードみたいな
## メモ帳があればな、、、
pythonのtkinterを使って作れないかな、トホホ
（使ってなんか作りたかったんだよ、、、）
```magic_word.py
import tkinter #魔法の言葉
```
## 書いたコード
```whb.py
import tkinter as tk

# グローバル変数
text_content = ""

def convert_text(): 
    global text_content
    tex.delete(1.0, tk.END)  

def convert_text2():
    global text_content
    text_content = tex.get(1.0, tk.END)
    tex.delete(1.0, tk.END) 

def convert_text3():
    global text_content 
    tex.insert(1.0,text_content)

test = tk.Tk()
test.title('記憶型ホワイトボードver3.09.11')
test.geometry('300x400')

tex = tk.Text(background='white')
tex.place(x=10, y=10, width=230, height=300)

bt = tk.Button(text=u'消す', background='white', command=convert_text)
bt.place(x=60, y=325, height=40)

bt2= tk.Button(text=u'メモリ', background='white', command=convert_text2)
bt2.place(x=110, y=325, height=40)

bt3= tk.Button(text=u'呼ぶ', background='white', command=convert_text3)
bt3.place(x=170, y=325, height=40)

test.mainloop()
```
##
### exe化する
cmdでpyinstallerをダウンロードします。
```1.cmd
pip install pyinstaller
```
そしてwhb.pyをexe化します。
```2.cmd
pyinstaller --onefile --icon=dog.ico --noconsole whb.py
```
勝手にdog.icoになるようにしてますがご用意がない方はなしで大丈夫です。

## 実行画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584275/8584985a-07ab-4c39-3e08-3f67da941211.png)

:::note info
動かしてみるとこんな感じになると思います。
左上の羽アイコンも変えれるのでぼちぼち変更します。
:::
サーバーエンジニアだけどFigmaの使い方をUdemyで学んだ話


この記事は[Udemyおすすめ講座をシェアしよう！ by Udemy Advent Calendar 2023](https://qiita.com/advent-calendar/2023/udemy)の2日目の記事です。

本記事ではUdemyの講座を紹介ということなので筆者が過去受講したFigmaの初心者講座について紹介いたします。

## 対象読者

- デザインに苦手意識のあるサーバーエンジニア
- Figmaを0から学びたいと思ってる方
- Udemy大好きな方

## おすすめする講座

おすすめする講座は[初心者から始めるアプリデザイン＜UI/UXデザインをFigmaで学ぼう！＞Webデザインにも応用可能](https://www.udemy.com/course/figma-app-design/)です。

Figmaとはウェブやモバイルのデザインを作成するのに使われるデザインツールです。Figmaで作成するデザインはデザインのパーツをコンポーネントとして登録したり、多くのプラグインをインストールして使用できたりなどかなり高機能でプロダクト開発で広く使用されているツールです。

Figmaはクラウドベースのツールとしてブラウザやデスクトップアプリから使用することができ、変更履歴やコメントをつけたりなどチーム開発にも適しています。

上述した講座はAppleのApp StoreのUIを0からFigmaで作成することでFigmaの基本的な操作、デザインの流れを学ぶことができます。

Udemyの中でFigmaを扱った日本語の講座は他にもいくつかありますが、コースの総時間は13時間近くあり、他の講座と比べてもかなりボリュームがあるほうです。レビューの数もかなり多く、デザインのコースのベストセラーになっている講座です。

## なぜ受講しようと思ったのか

筆者はサーバーサイドのエンジニアのため業務でデザインをすることは基本ありません。webフロントエンドの業務は仕事でもすることがあったり、個人的にも書くことは多いですが、デザインを作成するようなことは業務でも個人的にもありません。

本業がサーバーサイドなのでそれでいいのかもしれないんですが、自分一人ではDBの設計をしてAPIの構築はできても、ユーザーを惹きつけるようなUIを作成することやUXを考えることはできないので**プロダクトを一人で作成することはできない**なと不意に思うことがありました。(というより、何かアプリケーションを作ろうと思ったときにフロントの作業で手が止まるのとか頑張って作ってみたUIがすごい微妙だったりするのが嫌だったというのがあります。)

プロダクトはチームで作り上げていくものかもしれないですがいざ一人で**0からアプリケーションを作る**となったときにデザインの知識は必要だと感じたのが受講のきっかけです。

## 受講してみた感想

非常に体系的にFigmaの基本を学ぶことができました。Figmaのインストールから解説してくれているので基本詰まるようなところはなかったです。加えて、講師の方の説明も非常にわかりやすく、なぜの部分を経験をもとに説明してくれるので納得感もかなりありました。

また、非デザイナーもコース受講者の対象としているのでデザインのことが何一つわからない筆者でも問題なく受講することができました。

前述したようにこのコースではAppleのApp StoreをFigmaで作成していくのですが、お手本のデザインも用意されており、作っていく過程でいろいろなテクニックやFigmaの機能を学ぶことができます。

1番感動したのはお手本通りにデザインを作成していく作業で、デザインしている画面の背景にレイアウト用の格子レイヤーを被せて1px単位で調整する作業でデザインの現場ではこういった妥協のないプロとしての作業が行われているんだなと感じれたことです。

## おわりに

このコースを受講したおかげでFigmaの使い方、デザインやプロトタイプ作成の流れを知ることができたため**0からアプリケーションを作る**となったときに自分一人でもなんとかなりそうな自信がつきました。

また、ちょっとした表紙やOGP画像みたいなものが欲しいときにFigmaを使って作成することができるようになりました。

サーバーエンジニアをやっているとデザイン的な話に極端に拒否反応が出てしまいがちですが、実際にFigmaを使ってデザインをしてみることで**自分にもできそう**と思えれば、デザインに対しての苦手意識が少しはなくなるかもしれません。苦手意識はいろいろな可能性を狭めてしまう恐れがあるため、もし苦手意識をもっているエンジニアの方がいればこちらのUdemyのコースを受講してみることをおすすめします！

やったことない分野のインプットをサクッとやりたいときにUdemyは非常に便利だなと感じます。

今回は以上です🐼
基本情報　情報セキュリティ編　その１

情報セキュリティは非常に覚える用語も多くて大変です

ですが、計算などはないのでほぼ覚えゲーになっているので脳筋で頑張りましょう

## 2.覚えておくべき

まずは情報セキュリティはISOの国際規格で定められています。
ISO／IEC270000シリーズがそれになります。

### 機密性・安全性・可用性
機密性とは、定めた人のみが該当のサービスにアクセスできるというような意味
安全性は、Webサービスなどが改ざんされないように正確で・安全である特性
可用性とは、サービスが継続して利用できるようなことを指す

### リスクマネジメント編
社内の価値あるデータを情報資産といいます。
これらを漏洩しないための管理をリスクマネジメントといいます。

リスクマネジメントでは
リスク探索
リスク分析
リスク評価
この順番でまずはリスクアセスメントを行い、どのくらいのレベルでリスクがあり、どれくらい担保するかを決める
段取りとなっています。

リスク評価をしたのち、
どのリスクがどれくらいのレベルで優先順位はどれくらいかをリスク評価で決めたのち、
対応を取ります。

リスクには最小限抑えるための　リスクコントロール
コストをかけてリスクをなくすのが　リスクファイナンシング

といいます。

### 情報セキュリティポリシー
情報セキュリティポリシーとは、組織内の情報セキュリティを確保するための方針や体制、対策等を包括的に定めた文書になります。

この会社は情報せきゅてぃポリシーを公に公開しているな　安心できる
というような感じですかね。

基本方針：情報セキュリティに関する基本的な方針を定めたもの
対策基準：項目ごとにそんじゅすべき行為や判断を記述したもの
実施手順：どのように対処するかを記述したもの

この３つで成り立っております。

CSIRT
CSIRTとは、企業や観光庁などに設けるセキュリティ機関のことを指します。
情報セキュリティ部　みたいなところがこれに当たりますね。

企業でしっかりやってます！と公言しても評価しない人がいないと信憑性がないですよね。

勉強３時間やってます！私は頭がいいです！
といっても言ってるだけで数値には出てないので、信憑性がないのと一緒です

そのためには第三者が介入して評価する必要があるって訳です

それがISMS適合認定制度というものです。

### セキュリティバイデザイン

これは開発でもとても大事な要件であり、
開発の設計段階からセキュリティをしっかり担保しようねというのがセキュリティバイデザインとなるわけです。

プライバシーバイデザインという似たような言葉もありますが、文字通りそのプライバシー保護Verです。


### 脅威とマルウェア

情報システム部からこんなことは言われたことはないでしょうか。
社内標準のソフトウェアしか入れちゃだめよ！
ソフトウェアをインストールするならインストール先のURLとか貼り付けて申請してね！

これはクライアントパソコンへのマルウェアを防ぐためのものであることは容易に想像がつくかと思います。

また、脅威というのは基本情報の中では、社内の情報資産を脅かすものと定義されいます。

脅威には
物理的脅威
人為的脅威
技術的脅威
の３つが存在します。

物理的脅威は、社内のサーバーが発火したりなどの物理的な要因によるものです
人為的脅威は、誤ってＤＢを消してしまったや、パソコンをロックにしないままトイレに行ったりとかを指します。
技術的脅威は、ＨＴＴＰ通信を傍受したり、改ざん、なりすましなどＩＴを使った脅威のことを指します。

#### マルウェアとは
マルウェアとは、悪意をもって作成された不正なプログラムの総称を指します

マルウェアには様々な種類があるので、よかったら調べてみてください

#### BYOD(Bring your own Device)
これは英語の通りに、自分の端末を持ち込む
つまり業務のデータを自分の端末で使うことです。

日々わたくしたちが使っているパソコンはログが管理されているなど、情報システム部に目がいくようになっています

ただし、個別のパソコンにおいてはそのような目が届かないため、セキュリティの対策がほぼ不可能なのです。

### ウイルス対策ソフトはなんのためにあるのか

ソフトウェアのマルウェアを検知そて、コンピューターを脅威から守って、安全を高めるソフトのことを指します。

更新がないソフトウェアがある場合、そこにマルウェアがあったとしても、パッチ適用外になったりするので
ＯＳＳなどを使う場合は、Ｇｉｔなどのソースコードをみて、更新されているか確認してみたりしてください。

マルウェアの検知には２種類ほどあり、
・パターンマッチング：すでに検知したウイルスのシグネスチャーコードと比較して、ウイルスを検知するもの
・ビヘイビア方式：実際に検査対象を実行して、その挙動を監視することにより、ウイルスを検知するものです。
未知のウイルスには対応できるが、誤った結果を返すことがあるらしい。

### PCのハイキョ方法

記憶装置には様々なデータがあったとして、初期化を行っただけではデータが復元される可能性があります。

ディスクにビット単位でデータが保管されているため、ディスク自体になにかしらアクションをとる必要があります。

全領域にビット列を上書きしたり、外的要因で物理的に破壊するなど、元のデータにアクセスしないようにする必要があります。
【Zod】スペースのみのバリデーション

## はじめに
Zodでバリデーションを行う際に以下のように`nonempty`を使用してもスペースのみ入力された際にエラーになりません。

```js
const sampleSchema = z.object({
  name: z
    .string()
    .nonempty('名前を入力してください')
})
```

スペースのみ入力された際にエラーにする方法について記載します。

## `trim`を使用する

`trim`を以下のように使用することで、文字列の前後のスペースが削除されるため、スペースのみ入力された際にエラーとなります。

```js
const sampleSchema = z.object({
  name: z
    .string()
    .trim()
    .nonempty('名前を入力してください')
})
```

## `refine`を使用する

文字列前後のスペースを削除したくない場合には`refine`を使用して以下のようにします。

```js
const sampleSchema = z.object({
  name: z
    .string()
    .refine((value) => {
      return Boolean(value.trim().length)
    }, '名前を入力してください'),
})
```
【Google Cloud Next Tokyo ’23レポート】 最新 Google Cloud CI/CD を利用したソフトウェア デリバリー

# 概要
Google Cloud では、開発者の作業を自動化するサービスや CI/CD など、DevOps 製品群を進化させ、ソフトウェア デリバリーのモダナイズを促進しています。
このセッションでは、DevOps 製品群（Cloud Build、Artifact Registry、Artifact Analysis、Cloud Deploy など）の最新機能について紹介します。

Google Cloud 頼兼 孝幸
カスタマー エンジニアリングアプリケーション モダナイゼーション スペシャリスト

# 内容メモ
## CI/CD
- 継続的インテグレーション
    - コードのビルド
- 継続的デリバリー
    - 自動でテスト環境などにデプロイ
- ＋継続的デプロイ
    - テストなどに合格した際に本番環境へデプロイ

デリバリー、デプロイの後にスモークテスト

## なぜモダナイズ？
- 安定性
- スピード
移動か＋繰り返し可能なビルド
Iac

デリバリーパフォーマンスの予測が立つと、
サービスパフォーマンスの予測ができる

デリバリーパフォーマンスがいい＝エンジニアのストレスが少ない

DORA.devに詳しい情報あり

## 従来のCI/CDが抱える課題
- 弾力性
    - コンピューティングの使用量が決まっている
    - ピーク時はパフォーマンスが悪く、アイドル時は無駄なコスト
- ポータビリティ
    - 特定のツール、プラグインに依存
- メンテナンス性
    - セキュリティパッチ
    - アップグレード
    - 修正

## 最新はどうやって対応している？
- ポータビリティを考慮した設計
    - コンテナ
-  弾力性
    -  使った分だけ課金
- マネージド型
    - セキュア

## セキュアなソフトウェアサプライチェーン
### セキュリティ
- ソース
- ビルド
- パッケージ
- デプロイ
- 実行
サプライチェーンそれぞれが依存する箇所で様々な攻撃ベクトルが存在する

### サプライチェーン保護の課題
- OSSの急増
    - コードがオープンなので、未知のコードの混入の可能性
- CI/CDの自動化
    - デプロイ頻度がぞうか
    - セキュリティへの自動化が不足
- 多数の攻撃ベクトル
    - 複数のプラグイン、パッケージが動くため、把握が困難
- 標準/ツール
    - 新標準の数とペース

## コンセプト
- S3C(セキュアソフトウェアサプライチェーン)

### 来歴
SLSAフレームワーク
- OSSセキュリティフレームワーク
- googleの内部フレームワークを外部化
# 関連記事
- [【Google Cloud Next Tokyo ’23レポート】 by yukiMiyoshi_fcafe](https://qiita.com/yukiMiyoshi_fcafe/items/18ad65426e1a71311419)
- [【Google Cloud Next Tokyo ’23レポート】 by sho_fcafe](https://qiita.com/sho_fcafe/items/a97ee90d6a05f68e1c01)
【Google Cloud Next Tokyo ’23レポート】グローバル No 1 サービスを目指す meviy に、なぜカルチャー推進が重要なのか？〜社員の自己肯定感を高める #IAmRemarkable

# 概要
機械部品調達の AI プラットフォーム meviy は昨年グローバル展開を本格始動。事業成長に伴い、イノベーションを起こすチーム カルチャー醸成が求められていました。このセッションでは、その活動の一環として実施した Google の自己肯定感を高めるワークショップ #IAmRemarkable とその後の組織の変化を説明します。日本企業におけるカルチャー推進に関心をお持ちの方は是非ご参加ください。

株式会社ミスミ 大川 英恵 氏
ID企業体IDマーケティング推進室 ジェネラルマネジャー

Google Cloud 小澤 真由子
パートナー事業本部 Partner Development Manager, Data Analytics
# 所感
IAmRemarkable、という言葉を初めてしりましたが、すごくいいお話でした。

話の中で、こういった活動は業務外から始まっていて、
活動の正当性や、事業に対する生産性が見えづらく、どう活動していくべきか、という悩みもあったとありました。
これはきっとどこも同じことが言えると思うのですが、
活動を続ける中で業務の中で変化が見られた・実感した、という話が印象的でした。

IAmRemarkable、私は素晴らしい！
どんな小さなことでもいいから、自己肯定を行えることで、日々頑張れる。
仕事もそうですが、それ以上の大切なことを教えてもらった気がしました。

会場に、IAmRemarkableのブースがあって、いろんな人が「私は素晴らしい」と思うことを付箋に書いてはっていて、それを見るだけでも、心にくるものがありました。

![PXL_20231115_063803828.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/c4344e81-c183-e1c6-5fb0-4348a706fd6b.jpeg)


# 内容
 ## イノベーションを起こすカルチャーとは
 社員の自己肯定感を高める、IAmRemarkable
 
 ## イノベーションとは
 - 自社にとって新しいものを導入する事
 ### そのために必要な要素
 - 多様性の尊重
 - ビジョン共有
 - 自主性
 - 内発的動機づけ
 	- 外からの報酬に影響されない動機
 	- 持続的なイノベーションの原動力
 	- #IAmRemarkable
 	- Remarkble = 素晴らしい
 - リスクテイク
 - つながりとコラボレーション

## #IAmRemarkable
全ての人々、偏見に晒され過小評価されている人などなど、
自分の功績を率直に語れるように後押しする。

- 多様性のある環境の推進
- 多様性とマイノリティグループ支援への後押し
- モチベーションと自己肯定感の改善
- チームの結束が強化
これまでに、50万人以上の参加者数がいて、82％以上が以前よりも自信がついたと回答
![PXL_20231115_062148849.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/cd839068-3499-9f42-8b86-fe111d59cf18.jpeg)![PXL_20231115_062107734.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/72ff8f4b-68ed-d2e8-dd05-1967584cc121.jpeg)

## meviyになぜ必要か？
### meviy
- 機械部品の販売おいて、ほとんどがEC化できている
- 一方で、特注品の機械部品のデジタル化が進んでいない
    - 紙の設計図の作成など
- meviyに３Dの設計データをブラウザでアップすると、AIが自動で見積もり
- そのまま発注もできて、製造プログラムを生成してくれる。
- これまでの発注プロセスから考えると革命的
- 利用ユーザー数の拡大、アップロードデータの拡大

### 社内プロジェクト「project connect」
- 誰かが誰かに頼れる、支えられる、繋がれる

事業成長に伴い、メンバーが増獲ていく中で、グローバル基準のカルチャーを作る必要があった

googleに協力してもらいながら、セッションを実施
→管理職層にまずは実施。
- 管理職層にまず理解してもらう必要があった

## 対談
### カルチャーセッション後の変化は？
現場のポジティブの反応を感じた。
殺風景な進捗報告会に、今週の素晴らしかった出来事などが加わった。
- 参加者の積極的な姿勢が印象的
- 参加してはじめて、心理的安全性がなかったんだと気づいた。
### 今回のプロジェクトを進める際に課題になった事
ボランティアでの活動で、それが評価される仕組みはない。負担にならないか進め方に悩んだ。
google側からの、年間プランや進め方の提示などアドバイスが参考になった

### googleとの取り組みに期待する事
参加メンバーは、googleのオフィスに行くだけでも刺激があった。
セッションをやる度にポジティブな声がでてくる。
海外チームのメンバーがこの活動を広めてくれていて、googleのグローバルカルチャーの作り方を参考にし、真似しながら展開したい。
# 関連記事
- [【Google Cloud Next Tokyo ’23レポート】 by yukiMiyoshi_fcafe](https://qiita.com/yukiMiyoshi_fcafe/items/18ad65426e1a71311419)
- [【Google Cloud Next Tokyo ’23レポート】 by sho_fcafe](https://qiita.com/sho_fcafe/items/a97ee90d6a05f68e1c01)
【Unity】Swift の NativePlugin を作成するための参考資料

## 本記事について

この記事は [CoreBluetoothForUnity Advent Calendar 2023](https://qiita.com/advent-calendar/2023/core-bluetooth-for-unity) の11日目の記事です。

CoreBluetoothForUnity を開発する上でこの情報を先に知っておけば...!という参考資料がいくつかありました。それについてまとめます。

## 公式ドキュメント

サンプルはほぼありませんが、設定周りは見る必要があります。

https://docs.unity3d.com/2022.3/Documentation/Manual/NativePlugins.html

https://docs.unity3d.com/2022.3/Documentation/Manual/PluginInspector.html

## Apple ARKit XR Plugin

これが一番早く知りたかった情報です。実質公式サンプル

![pm_arkit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/1e57b670-d7d8-1833-8ac3-dd9f2256252a.png)

1. Package Manager で Unity Registry を選択
2. Apple でフィルターをかける
3. ARKit ARKit XR Plugin が表示される

これをインストール後

Packages > Apple ARKit XR Plugin > Runtime > Frameworks に NativePlugin と連携する部分のコードがあります。

![framworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ff2e752c-eaa8-d914-80d5-ec823a1ca275.png)

また、Runtime > iOS 以下に NativePlugin が配置されています。
Objective-C で書かれています。

![スクリーンショット 2023-11-16 22.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/fbee2822-fc0f-5222-53fb-3a314c8bfa29.png)

拡張子 `.m` のファイルは中身も読めます。

中身を読んでもわからない部分は多々あります。

- どこで Dispose しているのか
- どういう経緯・理由で現在の設計になっているのか
- なぜこれ単体でライブラリを切り出していないのか

しかし、どのクラス、struct がどのような関数、役割を持つのか等わかる部分だけでも非常に参考になります。

GitHub にコードが落ちてますが、これは LICENSE 的に大丈夫か怪しいためリンクは貼らないでおきます。

## Xamarin の API ドキュメント

こちらも関数名や、実装とても参考になりました。これも宝の山です。

[CoreBluetooth](https://learn.microsoft.com/ja-jp/dotnet/api/corebluetooth?view=xamarin-ios-sdk-12)
[Foundation](https://learn.microsoft.com/ja-jp/dotnet/api/foundation?view=xamarin-ios-sdk-12)

ソースコードも見れます。

https://github.com/xamarin/xamarin-macios/tree/xamarin-ios-16.4.0.23/src/Foundation

こちらも Objective-C で書かれています。

## ble-plugin-unity

https://github.com/toio/ble-plugin-unity/tree/main

toio の BLE Plugin です。
toio ではどうやってるんだろう？っていうのが確認できました。

## Microsoft の関連のドキュメント

公式大事。

[Blittable 型と非 Blittable 型](https://learn.microsoft.com/ja-jp/dotnet/framework/interop/blittable-and-non-blittable-types)

[ネイティブ相互運用性のベスト プラクティス](https://learn.microsoft.com/ja-jp/dotnet/standard/native-interop/best-practices)

[SafeHandle](https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.safehandle?view=net-7.0)

## Keijiro さんの MEMO

https://github.com/keijiro/Memo/blob/main/Pages/CSharpInterop.md#safehandle

## Swift のポインタ周り

このあたりはいまだにわからない部分も多いです。(OpaquePointer と UnsafePointer どちらを使うべきかとか)

https://qiita.com/omochimetaru/items/c95e0d36ae7f1b1a9052

ただ、資料は多いし Swift のポインタ周りの実装はとても扱いやすく感じました。

## neuecc さんの csbindgen の記事

https://neue.cc/2023/03/09-csbindgen.html

コールバックのやり方とか書いてあります。
csbindgen 自体は使い方と、使ってどのくらい良くなるのかがよくわからなかったため使用していません。(NativeMethods のコード自動生成したいため、使いたい気持ちはあります。)

## おわりに

本記事では CoreBluetoothForUnity の開発にあたって参考になった資料を紹介しました。ここに載せた資料意外にも Unity の NativePlugin 周りの知見が書かれた多くの Qiita 記事等を参考にしました。これらの資料のおかげで CoreBluetoothForUnity は開発できております。ありがとうございます！