OmniAICreator/Qiita-1.07M huggingface dataset:
Symbolのネットワーク時計は実時間とどのぐらいずれているのか

気になったので調べてみました。

# 結論

メインネットは実時間と比較して、現在約5秒先にずれています。

# ネットワーク時計とは

Symbolでは独自のネットワーク時計を持っていて、トランザクションのタイムスタンプなどに使用されます。

Symbol解体新書では16.時刻同期で解説されています。
https://symbol.openapostille.com/apostille/2617CDEDA05679A1FE9F14E826BFAE7D21216041B8BB52F6076EF13BF9792FBB


たとえば、イーサリアムは外部のNTPから実時間を取り入れています。それゆえ、外部の環境に依存してチェーンがクラッシュするというトラブルがテストネットで発生しました。

https://coinpost.jp/?p=175482

SymbolではP2P通信によって独自のネットワーク時間を採用しているため、この問題を回避することができますが、ネットワーク時刻が、実時間と同じであるという保証はありません。

Symbolが採用しているのはこの論文です。

A Theoretical Evaluation of Peer-to-Peer Internal Clock Synchronization
「ピア間の内部クロック同期の理論的評価」
https://eudl.eu/pdf/10.4108/ICST.AUTONOMICS2008.4477

アブストラクトを翻訳してみましょう

> 「同期されたクロックは、多くの分散アプリケーションにおいて前提条件とされることが一般的です。既存の解決策は主に、静的な環境でのみ機能し、明確に定義された特性と制約がある状況でこの問題に対処しています。周囲の環境についての仮定なしに動作する必要がある新興の大規模ピア・ツー・ピアアプリケーションのニーズが、最近この研究領域を再活性化させ、自己組織化能力と動的な設定に強い適応性を備えた新しい解決策の提案によって特徴づけられています。本論文では、大規模アプリケーション向けのクロック同期アルゴリズムの特性について報告します。このアルゴリズムは、ゴシップベースのパラダイムと連成発振子現象から得られた自然発想のアプローチを組み合わせた内部クロック同期メカニズムを実装しています。理論的なアプローチを用いて、論文はアルゴリズムの収束特性に焦点を当て、その同期速度（減衰因子）、最終同期ポイント、およびエラーについて特徴づけています。」


少し難しいですね。イントロダクションを一部翻訳してみます。

> この種の問題に取り組む有望なアプローチの一つは、完全に分散型のパラダイムを採用し、ピアが必要なすべての機能を実装する、いわゆるゴシップベースのアルゴリズムを実行する方法です。このアプローチでは、システムの大規模さと地理的な広がりにより、各ピアは直接やり取りできるシステムの一部を表す近隣情報を提供されます。各ピアで実行されるアルゴリズムは、この近隣情報から情報を収集してローカルな結果を計算します。これらの結果は定期的に計算され、システム全体で期待されるグローバルな結果を徐々に導きます。

ご近所さんからローカルな時間を計算して徐々に全体へと反映していく、そのようなアルゴリズムに見えます。
NTPというプロトコルが基本的に参照先の時間を無条件に従うといった傾向があるので、分散型ネットワークにおいてはあまり相性の良く無いプロトコルなのかもしれません。

さらにSymbolではインポータンスが高く、長期運用されているノードのネットワーク時計の時刻が比較的強めに反映されるようにフィルタリングの設定などが施されているようです。

### では、実時間とどのぐらい差異があるのか検証してみましょう。

- 比較対象とするNTPサーバ
    - jp.pool.ntp.org

計測対象となるノードはメインネットからランダム選択し100回時刻を取得しました。
全ての計測においてNTPサーバ、Symbolノードの順番で応答ありました。
なお、時刻の問い合わせが先方に届く時間差についての考慮が必要と思い、到着するまでの時間差を2で割った時間をSymbolノードが出力した時刻から減算しました。

結果、ほぼ全ての計測において、NTPサーバとSymbolノードの提示する時間の差が
5.004秒±250ミリ秒
に収まりました（上下5件程度は外れ値として除外、最小の誤差が2.04msでした）

# まとめ

Symbolのネットワーク時計は精巧に設計されていますが、実時間と比較すると（NTPとの比較）5秒の誤差が生まれています。ただし全てのノード間での差異はほとんどが０．２５秒以内に収まっていて、ネットワーク全体としては非常に精密に同期されていると考えることができます。
おそらく大きなインポータンスを持つノードに少し時刻が狂っているものがあるのかもしれません（テストネットでは0.2秒程度の誤差でした）。

分散型のコンピューティングはまだ生まれたばかりです。
Symbolが採用しているアルゴリズムも2009年に提案されたものです。
これからもさまざまな改善方法が提案されるかもしれませんね。
Salesforceのチャット/ボットの設定の細かい話

前提：Experience Cloudにチャットボタンを配置して、ボットが対応して、その中でエージェント転送している

ボタン名はエクスペリエンスビルダ内で指定するが最大長は(現実的に)無限(224000文字までは試した)
長文入れても途中までしか表示されないので表示できる程度の長さにとどめるべき(他も同様)

プレゼンス状況の状況名は最大80文字

Einsteinボット名は最大80文字

チャットボタンのカスタムエージェント名は最大255文字
変えてもすぐ反映されないので何きっかけで反映されるのか知りたい

エージェント転送時のタイムアウトはオムニチャネルのルーティング設定の転送タイムアウト(秒)で設定
これも変えてもすぐ反映されないので何きっかけで反映されるのか知りたい

チャットで顧客が最後に操作してからのタイムアウト時間とその前の警告までの時間は
[チャット] ボタンと招待の顧客のタイムアウト(秒)と顧客のタイムアウト警告(秒)で設定
【Qiita】ブラウザ検索で下書き本文が途中から引っかからない

どういう仕組みなのかよくわかりません。

Qiitaの下書き画面で、ある程度以上長い文章を書くと、ブラウザ検索で入力画面のテキストが引っかからなくなります。

Chrome119.0.6045
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/f5a6d5a2-220b-5e9e-aec0-204ea4e28723.png)

Firefox120.0.1
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/bda1a665-e703-5db8-31f1-01ffd271e5f1.png)

『あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよをん』を200行繰り返しただけの下書き画面です。
これを『さしすせそたちつてと』で検索すると、入力画面とプレビュー画面でそれぞれ200件、合わせて400件ひっかかるべきなのですが、そうなっていません。

スクリーンショット上ではChromeで245件、Firefoxでは259件となっていますね。
これ、プレビュー画面のほうは全て検索できているけど、入力画面のほうが中途半端にしか検索できていないみたいです。

しかも検索するたびに引っかかる件数が変動します。
なんでや。

これは同じ文を繰り返しているだけだからまだどうでもいいのですが、たとえば[【PHP8.3】PHP8.3がリリースされたので新機能全部やる](https://qiita.com/rana_kualu/items/f03efb9810c3ac5b2ab6)を`RecursiveDirectoryIterator`で検索すると、プレビュー画面の`RecursiveDirectoryIterator`は見つかるのに下書きの方の`RecursiveDirectoryIterator`はひっかかりません。
そのせいでプレビュー画面で間違いを見つけたので検索して修正しよう、が非常にやりづらくてたいへん困ります。

いったいなんなんだ。

あとCtrl+Fを奪い取るのは邪魔なのでやめてほしい。
【Go】「http.Get」で取得したhtmlについて文字コードを考慮する

## 概要
`http.Get`でhtmlを取得する際に[GoでGETを使ってHTMLを文字列で取得してみる](https://saitodev.co/article/Go%E3%81%A7GET%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6HTML%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)のような実装を行うと思います。大体のページはこれで大丈夫なのですが、ただこの実装だと文字コードutf-8以外だと文字化けしてしまいます。
というわけで、utf-8以外の文字コードが設定されたhtmlをどう取得するかのメモ書きを残しておきます。

## 対応方針
今回はstackoverflowの[golang HTML charset decoding](https://stackoverflow.com/a/40230300)の回答にある、`charset.DetermineEncoding`メソッドを使用する方法で試してみることとします。このstackoverflowの内容だと以下2点課題があったので、別途考慮しました。

一点目は`charset.DetermineEncoding`では、[Determining the character encoding](https://html.spec.whatwg.org/multipage/parsing.html#determining-the-character-encoding)のドキュメントに説明がある通り、複数要素で文字コードを推論しているようです。そして、shift-jisのページだと判定時の`certain`がfalseになってしまうことがあるようです（いくつかページを試してみたところ）。今回はcertainの結果は使用しない形にしました。

二点目は文字コード判定用で一度Readerでの読み込みが必要になるので、全部のhtmlを読み取る場合はこれを複製する必要があることです。対応は[【golang】io.Readerを使いまわしてContentType判定、S3アップロードしたらハマった話](https://debimate.jp/2023/09/10/%E3%80%90golang%E3%80%91io-reader%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%82%8F%E3%81%97%E3%81%A6contenttype%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%97%E3%81%9F%E3%82%89%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F/)の記事にいくつか紹介されていますが、今回は`io.TeeReader`を使うこととしました。

## 実装サンプル

```go
package main

import (
	"bufio"
	"bytes"
	"fmt"
	"io"
	"net/http"

	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding/htmlindex"
)

func detectContentCharset(body io.Reader) string {
	r := bufio.NewReader(body)
	if data, err := r.Peek(1024); err == nil {
		// certainがfalseの場合もそのまま使う
		_, name, _ := charset.DetermineEncoding(data, "")
		if name != "" {
			return name
		}
	}
	return "utf-8"
}

func main() {
	// htmlページの取得
	// webPage := ("https://mayukasports.blogspot.com/")     // UTF-8のサイト
	webPage := ("http://abehiroshi.la.coocan.jp/top.htm") // Shift_JISのサイト
	resp, err := http.Get(webPage)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer resp.Body.Close()

	// 文字コードチェック用のreadのためにbodyをコピーしておく
	body := new(bytes.Buffer)
	bodyForCheck := io.TeeReader(resp.Body, body)
	// 文字コードの判定
	charset := detectContentCharset(bodyForCheck)
	encode, err := htmlindex.Get(charset)
	if err != nil {
		fmt.Println(err)
		return
	}

	// htmlのRead
	var contentBytes []byte
	if name, _ := htmlindex.Name(encode); name != "utf-8" {
		encodeBody := encode.NewDecoder().Reader(body)
		contentBytes, err = io.ReadAll(encodeBody)
	} else {
		contentBytes, err = io.ReadAll(body)
	}

	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(contentBytes))
}
```
概念モデルとしての「Null」- 「まだない」の状態の理解とデータベースにおける応用

この記事は、nullについて私が思っていることをChatGPTに書かせたものです。
大体合ってるので、放流します。

# はじめに
この記事では、「null」という概念がどのようにデータベースシステム内で機能し、それがデータ理解にどのように影響を与えるかについて探ります。特に、nullを「まだない」という状態として捉えることに焦点を当てます。

# Nullの基本概念と「まだない」
「Null」とは、通常、値が存在しない、または未知であることを示します。しかし、私の持論として、nullは単なる「無」ではなく、「まだない」ことを意味する重要な状態です。これは、情報が未設定であるが、将来的には設定される可能性がある状態を指します。例えば、商品が出荷されるまでは、出荷IDがnullであるという場合がこれに該当します。

# データベースにおけるNullの意義と運用
データベースでは、nullは特定のフィールドに対する値が「不明」、「不適用」、または「未設定」であることを示します。ここで重要なのは、nullが将来的に設定されるべき情報の「一時的な不在」を示すという点です。例えば、商品と出荷の関係において、商品が実際に出荷されるまでは出荷IDフィールドがnullであり、これは出荷の準備が整うまでの一時的な状態を示します。

# Nullの扱い方
データベースにおけるnullの扱い方は、そのシステムの挙動やデータの完全性に大きな影響を与えます。nullを含むフィールドでの計算や検索は、この「まだない」状態を考慮する必要があります。特に、将来的に設定される値の扱いにおいては、nullを適切に理解し、扱うことが重要です。

# Nullを考慮したデータベース設計
データベースを設計する際には、nullが許容されるフィールドとそうでないフィールドを慎重に選択する必要があります。この選択は、「まだない」状態がそのフィールドに適用されるかどうかに基づいて行うべきです。nullを許容することは、柔軟性を提供する一方で、データの解釈を複雑にすることがあります。

# DBマイグレーションにおける考慮点
## 既存テーブルにカラムを追加する際のNullの使用とデフォルト値
既存のデータベーステーブルに新しいカラムを追加する際、そのカラムが「まだない」情報を表す場合、nullの使用が適切です。一方で、新しいカラムが既存の情報を反映する場合、適切なデフォルト値の設定が重要です。例えば、商品データベースに「在庫状況」カラムを追加する場合、既存の商品にはすでに在庫があるかないかの状態が定義されています。この場合、デフォルト値としてnullを設定するのではなく、実際の在庫状況を反映する値（例えば、「在庫あり」または「在庫なし」）を設定することが望ましいです。

# まとめ
Nullは、「何もない」以上の意味を持つ、深くて多面的な概念です。特に、「まだない」という状態を示すという観点から、データベース設計と管理において、その扱いは重要な考慮事項です。正しく理解し、適切に扱うことで、より正確で信頼性の高いデータベースシステムを構築できます。

所々で説明がおかしいなと思う部分はありますが、僕の理解と大体合ってるので放流しました。
ドキュメントを書く時に大切にしたいこと

## はじめに
未経験からエンジニアになってみて、コード以外に苦戦していることが多々あります。
詳しくはこちらをご覧ください。
[薬剤師からエンジニアに転職してプログラミング以外で苦戦したことと対策](https://qiita.com/odendayoko/items/66e30afccd779a20a544)

この中でも、特に頭を悩ませているのが[**ドキュメントが書けない**](https://qiita.com/odendayoko/items/66e30afccd779a20a544)ことです。
業務では、社員の方と要件について相談するときや、プロダクトの問題点を見つけて起票するときなどにドキュメントを書いているのですが…

これがなかなか難しいのです😭
何をどのような手順でまとめればいいのかがわからず、やたらと長くなったり、よくわからない文章になってしまいます。スピードが遅いのも課題です。

先輩からフォーマットをいただいたり、書き方を真似ているのですが、いまいちコツが掴めないでいます。
CEOに相談したところ、ドキュメントを書くときのポイントを教えていただいたので共有します🙋‍♀️
### 自己紹介
私は2023年9月1日にフロントエンドエンジニアとして自社開発のSaaS企業に入社しました。
未経験独学で、薬剤師からの転職です。
詳しくはこちらをご覧ください。
[未経験独学で自社開発企業へ〜薬剤師からのエンジニア転職記〜](https://qiita.com/odendayoko/items/f616b2f1952897a9af5d)

## ドキュメントを書くときのポイント
:::note warn
- **パターン**を作る
- 誰が見てもわかるように具体的に書く
- 最初に**背景**を記載する
- 見出し、箇条書きで**構造化**する
- 一番大切なのは**相手の目線に立つこと**
:::
### パターンを作る
自分の中で　「このときはこの書き方！」というパターンを作っておくと良いそうです。
例えば、相談するとき、設計するとき、起票するときなど。
それぞれ書き方のフォーマットを作っておくことで、それに沿ってまとめることができます。

自分なりの書き方を習得するのは難しそうなので、まずは先輩からそれぞれのパターンに応じたフォーマットを共有してもらおうと思います。

### 誰が見てもわかるように具体的に書く
将来無関係の人が読んだとしても、理解できるぐらい具体的に書くということです。
確かに先輩方が書いたドキュメントはとてもわかりやすい…

これはなかなかコツが必要そうです。
私は具体的に書こうとすると文が長くなってしまう傾向があるからです😞
先輩からは、書き下しすぎと指摘されたこともあります。

いい塩梅を見つけたいです。

### 最初に背景を記載する
このドキュメントは、何について書いたものなのか？なぜやるのか？
背景を最初に記載して、読み手の頭に地図を作ることが大切だそうです。

確かに、ほぼ全てのドキュメントで背景が最初に書かれていました。
また、会議の時も同様に議題を読み上げた後にまずは背景を伝えていました。

Qiitaを書く時にも使えそうなテクニックです。

### 見出し、箇条書きで構造化する
まず、**構造化**とはコンサルにはお馴染みの考え方だそうです。
- [コンサル思考法3 構造化とは何か？](http://strategyconsulting.blog.fc2.com/blog-entry-22.html)
- [構造化とは｜構造化の意味と【5つの構造化思考】を徹底解説](https://www.missiondrivenbrand.jp/entry/thinking__Structured)

ドキュメントに書くときは、見出しや箇条書きを使うとうまく構造化できるみたいです。
なんだかわかるようなわからないような考え方ですね。

これは慣れるのが1番の近道と言われました😂
結局慣れかよ！と思いましたが…
物事を構造化して考えるとわかりやすいということだけでも、頭に入れておくと良さそうです。

### 一番大切なのは相手の目線に立つこと
いくつかポイントを紹介してきましたが、**一番大事なのは相手の目線に立つこと**だそうです。

人は何かを伝えるとき、相手の目線になって話すことを忘れてしまいがちです。（※特にエンジニアは！）
話し手は前提も内容も全てわかっている状態ですが、聞き手は何もわからない状態で初めて聞きます。

話すときに聞き手の気持ちになることで、「この情報がないと意味わからないよな」「他の仕事もあるだろうし短時間で終えよう」などと想像して、お互いにとって気持ちのいいコミュニケーションができると思いました。

これは、前職の薬剤師時代のコミュニケーションで大事にしていたことと同じだと気づきました。
薬剤師として、薬局の窓口に滞在する限られた時間の中で、患者さんから必要な情報を聞き出し、それに基づいて薬の説明をしていました。患者さんの多くは医療や薬学の知識を持っていません。そのため、できる限り難しい専門用語は使わずに、他の言葉に置き換えて説明したり、全部を説明せずに必要な情報だけを伝えるなどの工夫をしていました。

**相手の目線に立つこと**は、エンジニアだけでなく、どの職種においてもコミュニケーションにおいて重要なことなのだと思いました。

## 終わりに
ドキュメントを書く技術は、どの職種でも役立つはずです。
コードを書くだけでなく、ドキュメントも書けるエンジニアになりたいと思いました！
**一番大切なのは相手の目線に立つこと**を忘れないようにしましょう。
[Go]パート1

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## import

```
import "fmt"

import (
    "fmt"
    "string"
)
```
単一で書いたり、グループ化もできます。

## main（Javaで言うMainクラス的な）

```
package main

func main() {

}
```
一番ベースとなる形。
Javaと比べると記述の量が少ないです。
## 出力

```
package main

import "fmt"

func main() {
	fmt.Println("Hello")
}
```
System.out.println()みたいなやつ。

## 変数
```
package main

import "fmt"

func main() {
	var hoge int = 123

	fmt.Println(hoge)
}

```
結果
```
123
```
Javaの場合は型が先頭でしたね。
Goは逆です。

```
package main

import "fmt"

func main() {
	var hoge = 123

	fmt.Println(hoge)
}

```
結果
```
123
```

型は省略も可能です。

```
package main

import "fmt"

func main() {
	hoge := 123

	fmt.Println(hoge)
}

```

結果
```
123
```

varすらも不要でOKです。


今回は以上です。

https://qiita.com/mojapico/items/2cc87cf8eca6a804866a

https://qiita.com/mojapico/items/45ef9206d5a0778062ec

https://qiita.com/mojapico/items/019204b2aa77b15659cd
Healthcheck用のnginxの指定

# 概要
bigipを使ってmonitorを作成した際、nginxのヘルスチェック用に応答ページを作成したいと思う事がある。その際には以下の手順で実施することが可能。

bigip側では、sendstringに送る内容を、receivestringには返答される内容を指定することができる。


例えば、以下のようなmonitorがある場合SendStringをcurlコマンドに直すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/04b06540-0594-cd6d-e57d-4c4758752801.png)

```
curl http://サーバのIPorドメイン/api/tool/checkdb.aspx
```
であり、
応答として
```
checkdb:OK
```
がきたらモニターを緑にするという内容になっている。


# nginx側の手順


対象のサーバで、httpd,nginxなどのwebサーバをインストールする。ここでは、nginxをインストールする。
```
sudo yum install -y nginx
```
その後nginxの`/etc/nginx/nginx.conf`を確認する。

その後、serverの欄の中のroot部分がどのようなパスになっているかを確認する。

ここでは`/usr/share/nginx/html`である。

```:編集内容
略
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
略
```

なので、単純に`curl ipアドレスorドメイン`
をしたら、`/usr/share/nginx/html`の内容がcurlに表示される。なので、その配下に対象のディレクトリを作成する。

```
sudo mkdir -p /usr/share/nginx/html/api/tool/
```
その後、モニターのsendで問い合わせるファイルを作成する。
```
sudo vi /usr/share/nginx/html/api/tool/checkdb.aspx
```
内容はreceive stringと一緒の内容にする。ここでは checkdb:OK
```:編集内容
checkdb:OK
```
その後、nginxを起動させる。
```
sudo systemctl start nginx
```
そして、適当なサーバから、`curl http://IPorドメイン/api/tool/checkdb.aspx`
をして、`checkdb:OK`が返ってくることを確認する。

こうなれば、先ほど設定していたBIGIP側のモニタを設定していたpoolがAvailableになる。
レポート作成の練習になりそうなオープンデータ

Power BI勉強中にぶち当たる壁は様々。DAXも難しいが、一番最初の壁は、どんなレポートができるのかイメージがわかなかったり、練習用のデータがなかったりかと。前者は[こちら](https://qiita.com/k_maki/private/ef98add7d17ab79096b9)で、後者はこの記事で解決できればうれしい。勉強以前につまづくのは残念ですよね。

結論を言うと、「オープンデータ」で検索しましょう（おしまい）。

その一言じゃつまらないので、いくつかを例示。これ以外にもたくさんあるので、いろいろ探してみると面白い。自分の興味があるデータなら、自然と可視化もメジャー作成もいろいろやりたくなるのではないかと。

:::note warn
データ利用にあたっては、各サイトのデータ利用規約等に従ってください。
:::

# e-GOVデータポータル
政府のデータ ポータル。

https://data.e-gov.go.jp/info/ja

欲しいデータを見つけたと思ったらe-Statへのリンクだったりする。

# e-Stat
政府のデータ ポータルその２。e-GOVデータポータルより前からある。違いは知らない。

https://www.e-stat.go.jp/

個人的興味から魚種別漁獲量の統計情報を作ったりしてみた。

![お魚DB_trimed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/c532a3af-92d9-c431-9a48-236e577058cd.png)


# 総務省統計局
政府のデータ ポータルその３。これも前からある気がする。

https://www.stat.go.jp/data/index.html

だいたいe-GOVやe-Statからも取得できると思う。

# 気象庁 過去の気象データ・ダウンロード

https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

今年の夏、東京であまりにも雨が降らなかった（→園芸が辛すぎた）ので、このサイトのデータで分析したら、過去50年間くらいで2番目に降らなかったということが分かった。

![東京降水量_trimed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/729a17c3-2567-66aa-1ee3-e0f660e7bf80.png)



# 警察庁　交通事故統計情報のオープンデータ
詳細な事故情報が30万件くらいある。緯度経度情報もあるので、地図と組み合わせると面白いかも。

https://www.npa.go.jp/publications/statistics/koutsuu/opendata/index_opendata.html


# 国立感染症研究所　感染症発生動向調査 週報（IDWR）
毎週の感染症報告数。

https://www.niid.go.jp/niid/ja/data.html

今年はインフルエンザがやたら多かった気がするので、ここのデータを使って調べたら面白いかも。

# 東京都オープンデータカタログサイト
デジタル庁に負けず劣らずデータに本気で取り組んでいる東京都のデータポータル。

https://portal.data.metro.tokyo.lg.jp/

データだけではなく、活用例も紹介されているので勉強になる。

# 東京都中央卸売市場日報
市場別の取引量、単価を収録。

https://www.shijou-nippo.metro.tokyo.lg.jp/

マグロとかの大物はセリだから自然と売買のデータが残るだろうが、真鯛とかは相対取引なのになぜデータが残っているのかが謎。

自動的にデータを取得して分析する仕組みを作れば、スーパーに行く前に価格がわかるので、買い物上手になれる（なりたい）。

# 参考
６年前も同じような記事がありましたね。

https://qiita.com/h_kobayashi1125/items/b8c13f7ce0c203c31f5a
いまさら！いまこそ！ニコニコカレンダー！

この記事はZOZOアドベントカレンダー2023 Series４の９日目の記事です。

# 30スプリントScrumを回してわかったこと
弊チームは１週間のスプリントでScrumを回しています。

30スプリント以上を回してスプリントが失敗することはなくなってきたものの、スプリント終盤、レビューに向けて不安になっていくことは今でもしばしばあったりします。

普段のデイリースクラムで、スプリントゴールに向けて会話はされているものの、終盤に向けての不安というはなかなか言語化することが難しい。終わるか、終わらないか微妙ーーーーーな状況だと終わる方に振ってしまうことが多いもの。

メンバーによっては「終わらない」ことを性格的に言いづらい場合もあるでしょう。

そこで２つほど対策を打つことを振り返りで決めました。

## 1. Scrumの価値基準「勇気」を持つ
    
単純でかつ精神論みたいな感じですが、「微妙！」と言う「勇気」を持つことです。言語化しずらいのであれば、そのまま言語化しずらい、曖昧なものでもいいので言ってもらうのが大事です。

## 2. ニコニコカレンダー
古のプラクティスかもですが、すごく効果的です。言語化しずらいのであれば、図示化するということです。
    

# ニコニコカレンダーのこつ

- 体調悪いときは休め。スプリントの調子を測る。
    - ニコニコカレンダーはあくまでもスプリントの状況を図示化するもの、自身の体調が悪いときは「勇気」を出して寝よう
- 良いが「普通」、普通は危険手前
    - ニコニコカレンダーは「良い」状態が「普通」の状態。「普通」の場合は危険一歩手前です。その時点で策を講じましょう。


デイリースクラム時に数秒で更新できて役に立つニコニコカレンダー。ぜひ今こそお試しあれ。
文章力の基本を読んで Part2

# 文章力の基本を読んで

## はじめに
- 昨日の文章力の基本では、長く書き続けないということを学んだ
- 今日は第2回！文章の結び付けについて学んでみましょう
- ※この記事は文章力に乏しいと自負している人が書いている
    - 間違っていたら指摘してほしい

## 第2章を読んで(ヒント5~11)
:::note info
1. 文の前半と後半を嚙合わせる
1. 述語に気を付けよう
:::

### 1. 文の前半と後半を嚙合わせる
- この文言には、とても共感を得た部分がある
- 如何せん、私の文章は前後がかみ合っていないことが多いからである
- 読みづらい、前後で話していることが違うといわれた方にはぜひ読んでほしいヒントである

<h4>以下の文章に違和感は感じるだろうか？</h4>

**Before**
> 部長の弁明は、新入社員が独断で行動したと言い訳をして、実際はチーム全体が関与していたことを隠そうとしていた。

文章として伝わらなくはないんだけど、ちょっと考えないといけない文章ですね

**After**
>部長は、新入社員が独断で行動したと弁明し、実はその行動にチーム全体が関わっていたことを隠そうとした。

こうしたらするするっと入ってきそうですね！

:::note info
言いたいこと、誰が何をしてどうしたいのかわかりやすく書くようにしよう
:::

<h4>次の文は読んでいて何を言っているかわからない文章だ</h4>

**Before**
> 友人に誘われて訪れた原宿は、カフェとファッションショップが賑わうが、青い空、狭い通りが人でごった返し、突然の雨が心地よい。

いや、雨の部分どっから出てきたよ… :thinking: 
書き換えてみましょう！

**After**
>友人に誘われて訪れた原宿は、カフェとショップで賑わい、狭い通りは人でごった返していた。青い空の下、突然の雨が降り始め、街の雰囲気に新たな魅力を加えた。

こうすればわかりそうですね。
なるほど、つながりがわかりましたね

:::note info
宙に浮いた言葉（前後につながっていない言葉）は気を付けましょう
本人の中では情報がつながっているかもしれませんが、相手に状況はわかりませんよ
:::

### 2. 述語に気を付けよう
<h4>述語が重なった文章は理解しにくくなります。<br>
また、前後関係もあいまいにさせます</h4>

**Before**
> 小さな気遣いの大切さを感じ始めたのは、アルバイトをしているうちに学んだことからだった。

つながりがわかりにくい文章ですね…
何を言いたいかは考えればわかりますが、読みたくありません:cry:

**After**
>アルバイトの経験を通じて、小さな気遣いも大切だということを感じるようになった。

あー、簡潔になりました
これなら容易に何が言いたいかわかります

:::note info
文を複雑にしたっていいことはありません。
Part1でまとめたように主語と述語の関係はシンプルにしましょう！
:::

## まとめ
複雑な文よりも、主語と述語の関係が明確でシンプルな文章を心掛けることが大切です
今回は、前後の文章や主語述語に気を付けることで一気に伝わりやすい文章になりそうですね！
【Minecraft】コマンドでQRコード生成

## 概要

Minecraft内でQRコードを作成できるdatapackを作りました．この記事は作成記です．

:::note warn
**この記事はQRコードの仕組み等を解説するものではありません．** QRコードの仕様については他サイトを参照してください．
:::

:::note info
QRコードは株式会社デンソーウェーブの登録商標です．
:::

## データパック

https://github.com/Kuma-TachiRen/qrcode-crafter

**細かいところの実装は不十分です** （エスケープ文字など）．気が向いたら詰めます

## できること

String型NBTからQRコードを作成できます．それだけです．

![chat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589061/25a50e44-3ddc-0214-7aac-aba1717049c5.gif)


## 作成にあたって

実装にあたっては[QR Code Tutorial - Thonky.com](https://www.thonky.com/qr-code-tutorial/)を全面的に参考にしました．

まずは普通のプログラミング言語で実装したものをコマンドでも実装しやすいような処理に書き換え，それを移植する方針でやりました．

コマンドで実装する上での一番の問題点はコマンド実行数上限です．そもそも QR コード自体が最大で $177\times 177=31329$ マスになるというどうしようもない制約があるので，ある程度は諦めて実装しやすさを優先し，なんとかなりそうなところはコマンド数削減を図りました．

## QR コード生成のステップ

QR コード生成に必要な処理は大まかには次のようになります．

- モード判定
- 大きさ判定
- データエンコード
- 誤り訂正符号生成
- QR コード生成
- マスク適用

### モード判定

QR コードは次のモードが主に用いられます．

- 数字モード：`0-9` のみ．
- 英数字モード：`0-9A-Z $%*+-./:` のみ．
- バイトモード：バイナリを扱える．今回は UTF-8 でエンコードした．
- 漢字モード：Shift-JIS で一定の範囲にある文字を扱える．

今回は実装が面倒で漢字モードを諦めました．

数字モード・英数字モードが使えるかの判定は一文字ずつ見ていけば比較的容易です（データエンコードと同様です）．

なおコマンド上では半角空白が2つ以上連続していると1つに縮約されることに注意が必要です．またバイトモードでは`\`や`"`や`'`は別に処理する必要があります．

### 大きさ判定

各サイズでの最大文字数などのパラメータは全部埋め込んでいるのでそれを確認します．

### データエンコード

文字列を 01 列に変換する必要があります．

- あらかじめ `{"A":[...],"B":[...],...}` といった形の辞書データを準備しておきます．
- 文字列が空でない間，次のことを繰り返します．
    - `data modify` の `set string <source> [<sourcePath>] 0 1` で先頭の1文字を切り出します．
    - マクロを用いてその文字に対応する辞書のデータを読み出します．
    - `data modify` の `set string <source> [<sourcePath>] 1` で先頭1文字を削除します．

数字モード・英数字モードでは変換する文字列を何文字かごとに区切り，そこをまとめて変換する必要があります．1文字ずつ見てもいいですが，面倒なのでありうる文字の組を全て埋め込みました．

バイトモードでは各文字の文字コードを取得しなければいけません．全て埋め込むことは現実的でないので，デフォルトで使用可能な文字をある程度限定した上で外部から対応文字を追加できるようにしました．

### 誤り訂正符号生成

誤り訂正符号の生成には，ガロア体 $GF(256)$ での多項式除算を行う必要があります．

$GF(256)$ の演算は埋め込みました．一応の工夫として $0,\dots,255$ ではなく $-128,\dots,127$ で値を持つことで byte 型で扱えるようにしました．List で負の index も使用できるの圧倒的感謝．

多項式除算については，誤り訂正符号生成においては割る方の多項式は入力データに依存しません．それらを埋め込んで筆算でもよいですが実装が若干面倒な気がしたので，あらかじめそれらで $x^0,x^1,x^2,\dots\in GF(256)[x]$ を割った結果を埋め込んでおき，その結果を線型結合することで実装しました．

### QR コード生成 / マスク適用

固定のパターンや生成したデータを順番通り並べるだけです．データを並べる時にはループをいい感じに回さないといけないので面倒といえば面倒ですが他のパートよりは圧倒的に楽です．

またマスクはデータの部分だけ適用しなければいけないので，今回はコード生成してからマスク適用するのではなく，マスクを適用しながらコードを生成することにしました．

### 最善マスク判定

やることは単純ですがコマンド数がすごいことになるので今回は実装しませんでした．

## 感想

実際に QR コードが表示できるまではデバッグはひたすら数列との睨めっこなので苦しかったです……ただ表示できて実際に読み込めるとかなり嬉しさがあってよかったです（こなみ）

コマンド数がすごいことになるので実用性は怪しいです．もしかしたらシェーダーでも出来る？
useState( (*) => * ) の注意点

# 結論

React の `useState` フックを使用する際、関数を状態として保持したいケースでは注意が必要です。

## どんなコードだとまずいか

直接関数を `useState` に渡すと、意図せぬ挙動になる場合があります。
具体的には、

- **useState で, 値ではなく関数を保持したいとき**

です. 以下のようなコードは避けるべきです。

```typescript
const [stateFunction, setStateFunction] = useState(myFunction);
```
このコードでは、myFunction は初期状態を計算するために一度だけ実行され、その戻り値が state の初期値となります。これは、myFunction を関数として state に保持したい場合には適していません。

## どのように実装すべきか
関数を state として保持する正しい方法は、その関数を返す別の関数にラップして useState に渡すことです。

```typescript
const [stateFunction, setStateFunction] = useState(() => myFunction);
```
この形式では、myFunction は state の値として保持され、実行されません。これにより、関数を状態として適切に管理できます。

# 理由
useState は、初期状態を計算するために関数を一度だけ実行します。そのため、関数を直接渡すと、その関数は初期状態を生成するために使用され、関数そのものが state に保持されるわけではありません。これは、関数を状態として使用したい場合には望ましくありません。

ラップされた関数を使用することで、React はそのラップされた関数を実行し、その戻り値（この場合は myFunction）を初期状態として使用します。これにより、関数そのものが状態として保持されます。

# より具体的に

## 誤った実装例

```tsx
import React, { useState } from 'react';

function MyComponent() {
  const myFunction = () => {
    console.log("Function called");
    return "Hello World";
  };

  // ❌: myFunction は関数としては渡されず, myFunction の実行結果が渡されることになる
  const [stateFunction, setStateFunction] = useState(myFunction);

  console.log(stateFunction);
  // Log: "Hello World"
  // functin の情報が表示されると思いきや, myFunctionの実行結果が表示される

  return (
    <div>
      {/* Rest of the component */}
    </div>
  );
}
```

## 正しい実装例

```tsx
import React, { useState } from 'react';

function MyComponent() {
  const myFunction = () => {
    console.log("Function called");
    return "Hello World";
  };

  // ⭕️: myFunction を 返す関数を渡す
  const [stateFunction, setStateFunction] = useState(() => myFunction);

  console.log(stateFunction);
  // log: myFunction の関数としての情報が出力される

  return (
    <div>
      {/* Rest of the component */}
    </div>
  );
}
```

# まとめ
React の useState フックを使用して関数を状態として扱う場合は、関数を直接渡すのではなく、それを返す別の関数にラップして渡す必要があります。この方法により、関数は状態として正しく保持され、意図したとおりに機能します。
おいしそうなIT用語を集めよう

## 
食べ物の名前が使われているおいしそうな用語を集めました。他にもありそうなので順次追加していきます。


### ハンバーガーメニュー
ウェブサイトに使用されるアイコンの一つで3本の横線で表現されているメニューアイコンです。

　ハンバーガーメニューの主な機能は、追加のナビゲーションオプションやメニューを隠し、必要に応じて表示することです。ユーザーがこのアイコンをタップまたはクリックすると、メニューが展開され、サイト内の他のページやセクションへのリンクが表示されます。
### ミートボールメニュー
3本の横棒をハンバーガーメニューと呼ぶのに対して、3つの点を縦に並べたメニューアイコンをミートボールメニューと呼びます。
### クッキー

　ウェブブラウザを通じてユーザーのコンピューターに保存される小さなデータファイルのことです。ウェブサイトはこれらのクッキーを使用して、ユーザーのブラウジングセッションや設定情報を記憶します。
### スパゲッティコード
　非構造化で読みにくく、理解しにくいプログラムコードのことを言います。スパゲッティのように長く絡まって乱雑になっている様子で名づけられました。



### ハニーポット
　コンピュータセキュリティ分野で、サイバー攻撃者がどのように行動し、何を狙っているのかをセキュリティ担当者が確認するために、攻撃者を引き寄せるように設計されたコンピュータシステムのことです。
【ガジェット】キーボードとイヤホンのレビュー

# はじめに
先輩からおすすめいただき購入したキーボードとイヤホンがあるので、使ってみた感想などをまとめていければと思います。

## 購入品
### キーボード
- 東プレ REALFORCE
https://www.amazon.co.jp/gp/product/B07B3X17VT/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&th=1
- ウッドリストレスト
https://www.amazon.co.jp/gp/product/B07ZJQG39S/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&th=1

### イヤホン
- AfterShokz OpenMove 骨伝導イヤホン
https://www.amazon.co.jp/gp/product/B08CKGR7NN/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1

## 感想
REALFORCEに関しては、シンプルに打鍵が心地よく楽しみながらタイピングできるなと感じました。REALFORCEと一緒に購入したウッドリストレストはタイピング時の疲れが軽減されています。
AfterShokz OpenMoveに関しては、蒸れによる痒みがない、長時間装着しても耳がいたくないことから、ストレスなく装着することができ非常に快適です。

# おわりに
キーボードとイヤホンを思い切って購入して大変良かったです。気になる方は購入いただき利用していただければと思います！

## 参考

https://www.amazon.co.jp/gp/product/B08CKGR7NN/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1

https://www.amazon.co.jp/gp/product/B07ZJQG39S/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&th=1

https://www.amazon.co.jp/gp/product/B08CKGR7NN/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1
AZ-900 合格体験記

## １．はじめに
Azureを触ったことがない私でも、約10日間で合格することができました。
この記事では、その勉強方法をまとめたいと思います。

2023/8/21
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628466/9179b99a-f73f-c982-3289-ee28d231718b.png)

これからAZ-900の取得を目指す方の参考になれば幸いです。

## ２．勉強方法
では、早速勉強方法を紹介します。
主にUdemyを利用し、不明点はMicrosoft Learnで確認しました。
また、書籍も利用しましたが、Udemyだけで足りると思います。

## ２-１．Udemy
[合格への近道！Azure Fundamentals AZ-900 試験対策講座](https://www.udemy.com/course/microsoft-azure-az900-video/)

https://www.udemy.com/course/microsoft-azure-az900-video/

おすすめ度：★★★★☆
主に基礎知識を学ぶために利用しました。Azure初心者の私でも理解しやすかったです。
2日～4日で全て視聴し、紹介する2つの問題集で分からない点があれば遡って確認しました。

[最短で合格！Azure Fundamentals AZ-900 試験対策問題集](https://www.udemy.com/course/microsoft-azure-az900-exam/)

https://www.udemy.com/course/microsoft-azure-az900-exam/

おすすめ度：★★★☆☆
前の試験対策講座がわかりやすく、同じ方が作成した問題集を利用しました。
問題の難易度は優しめで、出題のイメージを得るのには適していますが、次に紹介する教材だけでも良かったかもしれません。

[6万人が受講】AZ-900 Microsoft Azure Fundamentals模擬試験問題集（7回分490問）](https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/)

https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/

おすすめ度：★★★★★
前の問題集よりも難易度が高く、実際の試験に似た問題が多く出題されました。これだけあれば合格はできると思います。

## ２-２．書籍
[合格対策 Microsoft認定 AZ-900：Microsoft Azure Fundamentalsテキスト＆問題集 第2版](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-Microsoft%E8%AA%8D%E5%AE%9A-AZ-900%EF%BC%9AMicrosoft-Azure-Fundamentals%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86/dp/4865943463/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=WBOMM8B0KO0A&keywords=az-900&qid=1701967043&sprefix=az-900%2Caps%2C149&sr=8-1)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628466/2033e43c-4189-96f7-b252-b4fa5decf27e.png)](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-Microsoft%E8%AA%8D%E5%AE%9A-AZ-900%EF%BC%9AMicrosoft-Azure-Fundamentals%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86/dp/4865943463/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=WBOMM8B0KO0A&keywords=az-900&qid=1701967043&sprefix=az-900%2Caps%2C149&sr=8-1)

おすすめ度：★☆☆☆☆
Udemyの問題集を解きすぎて初見で解けるか不安だったので、最終確認として小テスト＆問題集を利用しました。
なくても良いと思います。

## ４．終わりに
上記の勉強方法でAZ-900に合格することができました。
次はAZ-104の合格を目指して頑張りたいと思います。ありがとうございました！

---
追記：無事AZ-104に合格できました。

https://qiita.com/nemu3/items/cf623b88454437561409
エンジニアがダンスコミュニティのリブランディングに携わってみた

## ご挨拶

初めましての方は初めまして、普段エンジニア/セールス/コミュニティマネージャーをしております、
Oz（オズ）と申します。

To DLGの皆様、
DLGにて長らくROM専させていただいておりました。これからコミュニティに（前よりは）積極的に関わらせていただきたと考えております。何卒宜しくお願い致します。

## はじめに
さて当初は、「AI時代×コミュニティのあり方」をテーマに執筆予定でしたが、
いかんせん、膨大な量になってしまったため、
今回は「ダンスコミュニティのリブランディングに携わってみた」と題しまして、
スコープを狭めて投稿させていただきます。

私、高校生の時からストリートダンスが趣味で、
心身の健康作り/生涯趣味と位置付けて、現在もダンスインストラクターやダンスコミュニティの運営に携わらせていただいております。

今回は、その内の一つのコミュニティのリブランディングに携わらせていただいた話を簡単に綴らせていただきます。

## 携わったダンスコミュニティについて

社会人ダンスサークル「indivityz」さん
https://www.instagram.com/indivityz_dance_circle/ （←リブランディングに伴い新設しました）

都内でワンコイン（500円）で参加できるゆるふわダンス練習会です。
※ダンススタジオとしてはコスパ最強、激安です。

### 取り組みの背景
都内で練習できる場所としては、随一くらいで低価格で会場のセッティングをしていただいており、
兼ねてから主催者の方にお世話になっていたため、
この度、リブランディング活動に携わらせていただく流れとなりました。

### 課題
コロナ禍だったことやこれまでのレギュラー参加者に結婚などのライフイベントがあったりと、
参加メンバーが減っており、赤字での運営が続いていた。

## やったこと

### コミュニティの集客の見直し
既存の集客方法は下記。
・口コミ
・LINEオープンチャット
・公式HP

口コミ以外だと、
自然検索＆LINEオープンチャットがメインの集客パイプラインとなっていた。

実施した施策
・口コミでの集客の強化
・Instagramアカウントの開設

### とにかく活性化

誰かがダンスしたいタイミングでは逃さず乗っかり、
発信が少なくなってきたタイミングでは自分から発信する、
ということを一定期間継続して続けた。

![ScreenShot 2023-12-11 13.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274878/2df2e74d-aac8-92a4-1532-790755a454e3.png)

#### 活性化のための新しい文化作り＆定着化
（後ほど追記）

### ワクワクするビジョンの共有
（後ほど追記）

### コミュニケーションのデザイン
・LINEオープンチャットと言う特性上、練習やイベントに参加したいメンバーと雑談したいメンバーで会話のし辛さが目立ってきたので、コミュニケーションの交通整備をした。

![ScreenShot 2023-12-11 13.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274878/5bb9b761-cbfc-c08a-e07d-ece0c5309f7b.png)

### オフラインイベントへの参加ハードルを下げる
動画を撮って練習風景をリアルに共有することで、新規参加者の心理的ハードルを下げた。

![ScreenShot 2023-12-11 13.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274878/d920a7a4-c216-ff7d-b46f-7e0a46a970fa.png)
※なんだかんだで累計120本ぐらいのアーカイブ数となりました。ちりつもですね。

その他にも下記のような役割を持たせています。
・ダンスの振り返り用
・思い出用
・コミュニケーションの促進用（話題の素材になったりする）
・追体験してもらう用（良いイベントだった時は、個々人が見返して追体験し、更に満足度が高まる）

## リブランディングに携わった結果
平均参加者は2.5倍になり、とりあえず赤字運営から脱することができた👏

## コミュニティのライフサイクル
ダンスコミュニティのリブランディング活動を経て、下記のようなコミュニティのライフサイクルが見えた。

　⓪ 立ち上げ
　① 集客・活性化
 　（新規メンバー：まだ内部を詳しく知らないので期待値が高い状態、既存メンバー：新しいメンバーが来て何か起こるかもと期待値が高まる。）
　② 文化（ヒト・コト）の定着
 　（新たなコアメンバーが生まれる。一方で陳腐化も進む。）
　③ 新規企画の立案・インフラ等の改善
 　（陳腐化の転換、新たな価値の創出。）
　④ ①~③を繰り返す

## 今後の展望
リブランディング活動を通じて、個性豊かなダンサー、動画撮影&編集者や元プロドラマーなど、多種多様な人にも興味を持って参画して貰えるようになった。
将来的には、さらに様々なクリエイターが在籍し、常にコクリエーションしまくっているような協創空間・環境を作りたい。

## さいごに
DLGでは、コミュニティ活性化企画として、サブコミュニティ企画を進めております。
興味のある方は、こちらもぜひ一度覗いてみてみてください。

参考文献：
[「コミュニティ」を考える(4)〜コミュニティのライフサイクル](https://jp.linkedin.com/pulse/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%82%92%E8%80%83%E3%81%88%E3%82%8B4%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB-kiyo-sasaki?trk=portfolio_article-card_title)
[100個入ってわかった!人が集まるオンラインコミュニティ運営術](https://note.com/rubys8arks/n/n2be4cdeea976)
迷路みたいなif文が秒で綺麗になる魔法 [C#, タプル, パターンマッチング]

複数の条件が絡み合い，ネストが深く読みにくくなってしまったif文のカタマリを一瞬で美しいコードに直す魔法についてです．タプルっていいます．

# 比較

## Before

```cs
if (condition0)
    if (condition1)
        if (condition2)
            DoSomethingA();
        else
            DoSomethingB();
    else
        if (condition2)
            DoSomethingC();
        else
            DoSomethingD();
else
    if (condition1)
        if (condition2)
            DoSomethingE();
        else
            DoSomethingF();
    else
        if (condition2)
            DoSomethingG();
        else
            DoSomethingH();
```

見るからに気持ち悪いです．`condition1`や`condition2`に対する評価が複数箇所に分けて書かれています．残念ながらたまにこういうの見かけます．

## After

```cs
switch (condition0, condition1, condition2)
{
    case (true, true, true): DoSomethingA(); break;
    case (true, true, false): DoSomethingB(); break;
    case (true, false, true): DoSomethingC(); break;
    case (true, false, false): DoSomethingD(); break;
    case (false, true, true): DoSomethingE(); break;
    case (false, true, false): DoSomethingF(); break;
    case (false, false, true): DoSomethingG(); break;
    case (false, false, false): DoSomethingH(); break;
}
```

誰がどう見ても圧倒的にスッキリしたのがわかると思います．ネストが浅いですし，1行目の時点で3つの条件の組み合わせで分岐しようとしていることがわかります．どの条件がどんな状態のときにどこに進むのかが容易に読み取れます．

# 解説

`switch (condition0, condition1, condition2)`は，`(condition0, condition1, condition2)`というタプルを作って，それについて`switch`文で分岐していくよ，という意味です．
要するに`switch ((condition0, condition1, condition2))`です．**中身にタプルを入れるときはカッコを1つ省略できます**．

`case (true, true, true):`は，パターンマッチングの**位置パターン**です．
位置パターンとは，タプルのように分解できる型について，直感的な書き方でマッチングを行える書き方です．見ての通り，1行目で渡したタプルの値が指定した状態になっているかどうかを検査します．
つまり，`if (condition0 && condition1 && condition2)`です．

位置パターンというくらいですから，変数の名前を指定しなくても，タプル内の位置をもとに調べることができます．例のように`bool`型の場合は書く量はそんなに変わりませんが，他の型だといちいち`is`などの演算子を書かなくて良いので嬉しかったりします．

複数の条件の組み合わせで分岐先を変える場合や，複数のパターンについて網羅的に検査する場合などはこの方法が適しています．

# まとめ

例では`switch`文を使いましたが，当然`switch`式や`is`演算子でも同じことができます．

このように，複雑な分岐ではパターンマッチングをうまく活用することで可読性を数段上げることができます．綺麗なコードを書いて気持ちよくなりましょう．

# 参考

https://ufcpp.net/study/csharp/datatype/patterns/?p=2
Docker構築で出たエラー群

Dockerを構築していて出会ったエラー達の備忘録です。


## Makefile:6: *** missing separator.  Stop.
Makeファイルを作っていたので、以下のようにmakeコマンドの内容の行にインデントをつけ忘れていました。

**修正前**
```makefile:Makefile
up:
docker compose up -d
```

**修正後**
```makefile:Makefike
up:
	docker compose up -d
```


## services.xxx.environment.0 must be a string

environmentの中では「-」が必要ない場合もあるので試してみてください。

**修正前**
```docker:docker-compose.yaml
environment:
  - xxx: xxx
```

**修正後**
```docker:docker-compose.yaml
environment:
  xxx: xxx
```


## services.xxx.build Additional property yyy is not allowed

xxx配下のyyyの記述部分を注意してもう一度確認してみてください。
タイポなどはありませんか？
COWで四則演算を実装したい

# はじめに
　はじめまして、一つ目の記事でCOWについて語るwatnow所属のえいじです。watnowアドベントカレンダーの7日目としてこの記事を書かせていただきました。
　今回の記事ではプログラミング言語のCOWを使って（割り算以外の）四則演算を実装していきます。
 ではやっていきましょう。
# COWの実行開発環境
　まず初めに、この言語で実行開発環境を用意するのは大変です。恐らくコンパイラやインタプリタを自作しなければ行けません。しかしそんなことはやってられないので、今回は[こちら](https://web.archive.org/web/20130116215713/http://www.frank-buss.de/cow.html)のCOWをJSに変換して出力してくれるサイトを使って実行等を行いました。
# 前提知識
　COWに関して情報自体が少なく、自身でも説明できるほど理解できていません。なので前提知識として一度[Wikipedia](https://ja.wikipedia.org/wiki/COW_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))を読んでいただけると幸いです。
# 足し算編
```
oom OOM moO
oom OOM
MOO
MOo mOo MoO moO
moo
mOo OOM
```
pythonで無理やり書くとこんな感じ。
ポインタの概念をリストで表現しています。
```python:sum.py
n = 0
arr =  [0, 0]
a = 2
arr[n] = a
print(arr[n])
b = 3
n += 1
arr[n] = b
print(arr[n])
while arr[n] != 0:
    arr[n] -= 1
    n -= 1
    arr[n] += 1
    n += 1
n-= 1
print(arr[n])
```
# 引き算編
```
oom OOM moO
oom OOM
MOO 
mOo MOo moO MOo
moo
mOo OOM
```
pythonで無理やり書くとこんな感じ。
足し算の時とほぼ変わりません。
```python:sub.py
n = 0
arr =  [0, 0]
a = 2
arr[n] = a
print(arr[n])
b = 3
n += 1
arr[n] = b
print(arr[n])
while arr[n] != 0:
    arr[n] -= 1
    n -= 1
    arr[n] -= 1
    n += 1
n-= 1
print(arr[n])
```
# 掛け算編
```
oom OOM moO
oom OOM moO
OOO moO
OOO mOo mOo mOo
MOO
 MOo moO
 MOO
  MOo moO MoO moO MoO mOo mOo
 moo
 moO
 MOO
  MOo mOo MoO moO
 moo
 mOo mOo
moo
moO moO moO
OOM
```
pythonで(以下略)
二重ループを使って都度足し算を行っています。
```python:mult.py
n = 0
arr =  [0, 0, 0 ,0]
a = 2
arr[n] = a
print(arr[n])
b = 3
n += 1
arr[n] = b
print(arr[n])
n -= 1
while arr[n] != 0:
    arr[n] -= 1
    n += 1
    while arr[n] != 0:
        arr[n] -= 1
        n += 1
        arr[n] += 1
        n += 1
        arr[n] += 1
        n -= 1
        n -= 1
    n += 1
    while arr[n] != 0:
        arr[n] -= 1
        n -= 1
        arr[n] += 1
        n += 1
    n -= 1
    n -= 1
n += 1
n += 1
n += 1
print(arr[n])

```
# お詫び
　さて、ここまでさもCOWでの(割り算以外の)四則演算が実装出来たように話してきましたが、感の良いエンジニアならこれらのコードが不完全な事に気が付いたでしょう。そう、これらのコードだと負の数を代入すると、場合によっては無限ループを起こします。この短期間では正負を判定するアルゴリズムが思いつきませんでした。未来の誰かに託します。
# おわりに
　今回COWを触って、改めて他の言語の命令の多さにありがたみを感じました。皆さんも一度触ってみてはいかがでしょうか。実装出来なかった割り算や正負の判定に関して、なにかアイデアあある方がいらっしゃればコメント等頂けると有難いです。
　それではまたどこかでお会いしましょう。
Amazon Auroraでクローンを使用して検証環境を作ってみた

# 検証環境作成の検討

とあるシステムでAmazon Auroraにカラムを追加したいという要望が出てきました

MySQLとAWSのドキュメントを読んだ感じでは、制限があるもののオンラインで追加する事が可能である記載がありました（本記事では検証環境を作成することを目的としているのでこのあたりの詳細に関しては割愛します）

実際に本番の大きいテーブルでコマンドを実行しても問題が起きないかを試した後にカラム追加を実行したいと思い、本番環境でテストを行うにはどのような方法が良いかを検討しました

調べた結果、スナップショットやバックアップからクラスタをもう一台作成する方法とクローンを使ってデータベースを複製する方法がありました

スナップショットから複製する方法に関しては実際に、もう一つクラスターを作成するので検証で問題が起き時間がかかってしまうとコストが多くかかってしまうことが懸念されました

そこで、今回はauroraのクローン機能を使用して本番のAmazon Auroraに対してオンラインでカラムを追加することで問題が起こらないかを確認することにしました

本記事ではクローンを作成する方法やクローンの仕組みを調べたのでまとめようと思います

## 作成方法

対象サービスではterraformを用いてAmazon Auroraを管理していましたが、一時的に使用するリソースのためterraformを介さずWEB UIを使用して作成することにしました

## 手順

1. AWSコンソールにログイン
2. RDSのページに行く
3. 対象クラスタにチェックを入れる（現状特定インスタンスだけのクローンはできない）
4. 右上にあるアクションボタンから「クローンの作成」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618701/057e584d-c34b-f7ca-7c0d-e025d09c0295.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618701/16853577-114b-608a-0cf3-2c78efa7ed8a.png)
このような画面が表示されるので必要な設定を確認しつつ入力

作成すると以下のようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618701/436f24b1-63a5-375e-53f0-5e60398a9470.png)

実際にログインしてDatabaseやテーブル、レコードなどを確認しましたが問題なく作成されてそうでした

## 削除

クラスターを削除するときはクラスターに属しているインスタンスを全部消してからじゃないとエラーとなり削除できなかったです

## クーロンの仕組みについて

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Clone.html

上の記事に詳細が書いてあります

auroraはクーロンを作成すると、新しくクーロンのクラスタはできるがストレージ層はオリジナルと同じところを参照します（ストレージコピーがないので、スナップショットのリストアに比べて爆速で立ち上げることができます）

変更がある処理に関してはコピーオンライトで別の領域にコピーを作成し、そちらを参照するようにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618701/4670da05-8e86-1eed-47e6-aaead3b57e06.png)

上の図でAがオリジナル、Bがクーロンのクラスタとした場合AがPage1のデータを更新すると1[A]を作成してそちらを参照するようにします

クーロン側のクラスタBがPage4のデータを更新するとした場合4[B]が作成されそちらを参照するようにします

このようにしてクーロンクラスタを立ち上げてもオリジナルのデータに影響が無いようになっているようでした

## クローンのユースケースについて

ドキュメントでは以下のことがユースケースとして考えられるとの記載がありました

- schema変更やパラメータグループの変更等がどんなインパクトを与えるかの確認をおこなえる
- データのエクスポートや分析クエリの実行など、大量のワークロードを扱うオペレーションをクローン上で実行する
- 開発、テスト、またはその他の目的のために、本番 DB クラスターのコピーを作成する

との事でした

## 今回の検証を行ってみて

クローンを使用することによって爆速で同様の環境を用意することができ、更にストレージのコピーも発生しないので低コストで検証環境を作成することができました

気になったのはクローンの仕組みについては書いてあったのですが、内部の細かい処理までは終えていなかったので、コピーオンライトでコピーをする際にリードが入ったりすると思うので、本番データに少なからず接触はあり影響が絶対に出ないと断言できなかったところです

簡単ではありましたが、以上になります
Webサイトにありがち、画像にマウス重ねたら、白くなる仕様

# はじめに

よくWebページとかにある画像にマウスを重ねると、背景が白っぽくなり押せる、ような印象をユーザに与えてくれる仕様を自身のプロダクトに取り入れてみたかった。

しかし、やり方がわからない。

backgroundあたりを設定してもだめ。

```html
<div class="user_article_image">
    <a href="***********">
        <img class="article_img" src="#">
    </a>
</div>
```
![](https://storage.googleapis.com/zenn-user-upload/f789ccd5e7f9-20231208.png)


# 結論

hover時にopacity のプロパティ設定すれば解決

```html
.user_article_image {
    transition: all 0.3s;
}

.user_article_image:hover {
    opacity: 0.8;
}
```

# 終わりに
おまけ

マウスホバーで拡大


```html
.user_article_image {
    transition: all 0.3s;
}

.user_article_image:hover {
    transform: scale(1.05);
    opacity: 0.8;
}
```

なんかそれっぽくなった。感激。
動画を載せられたら、イメージがつきやすいのだが、載せれないみたい。
Google複数アカウントログイン時のSpreadSheet指定方法（GAS）

# 記事概要
複数のアカウントでGoogleにログインしているとき、Aアカウントで開きたいSpreadSheetを、Bアカウントで意図なく開いてしまうことがある。権限がないと言われたり。それの対応方法。  
> ※ Aアカウント：Google Workspace  
> ※ Bアカウント：無料

# 対応方法
## 方法➀
Bアカウントからログアウト。  
これが一番簡単。

## 方法➁
URLを少しいじる。
```
https://drive.google.com/〇〇〇〇〇

⇓【/a/Aアカウントdomain】をURLに追加

https://drive.google.com/a/Aアカウントdomain/〇〇〇〇〇
```
こうすることによって、Aアカウントで開くことができる。

[](https://www.alfredforum.com/topic/12241-google-drive-url-account-specific-paths/)

# 参考
<a href="https://stackoverflow.com/questions/41616072/403-error-from-google-drive-direct-link-due-to-multiple-accounts-logged-in" target="_blank">https://stackoverflow.com/questions/41616072/403-error-from-google-drive-direct-link-due-to-multiple-accounts-logged-in</a>
CNNをFPGAでやってみた

この記事は、[EEIC Advent Calendar 2023](https://qiita.com/advent-calendar/2023/eeic) の記事として書かれています

# はじめまして
　東京大学工学部電子情報・電気電子工学科（通称、EEIC）のものです。先日から始まったEEICアドベントカレンダーなるものが２枚目に突入したのですが、記事がスッカスカで寂しいうえに、学科のSlackでも「書け」という圧があったので、書きました。

　こういう記事とか今まで書いてこなかったので、文章下手かもですが、許してください。

# 畳み込みニューラルネットワークをFPGAに実装する
　EEICの「FPGAを用いたアルゴリズム実装」という学生実験でやったことについて書いていきます。私は、畳み込みニューラルネットワークで画像認識してみる、というのに挑戦しました。
 
 　畳み込みニューラルネットワークの推論で行われる畳み込み演算や行列演算は、並列性が高いためハードウェア化との相性が良かろう、ということでやってみました。~~（あと、内部で多少バグっててもそれっぽい出力をしてくれればバレないので）~~

　モデルの学習はPytorchで行い、Verilogで推論のコードを書きました。高位合成とか知らないです。

 　ソースコードは[Github](https://github.com/KT220u/BinaryCNNonFPGA)にあります。物好きな人はどうぞ。

# リソース足りない問題
　ニューラルネットをハードウェア実装しようと思った時に懸念したのが、リソース足りない問題です。仮に、パラメータが 32bit float で、数が 1,000,000 とすると、4MBのメモリが必要になってくるわけです。これLUT足りなくないか、ってなりました。[^1]

　そんなわけで、
 
　　　　　　1. モデルを**超**シンプルにする
　　　　　　2. 重み、活性値の２値化（バイナリニューラルネットワークというやつ）
 
　というのをやってみました。もはや「精度なんぞどうでもよろしい」という感じです。実際、出来上がったものの精度は MNISTの分類で 90% 程度という...。

# バイナリニューラルネットについて簡単に
　バイナリニューラルネットワークはあまり馴染みのない話かもしれないので、簡単に説明させてください。[BinaryNet](https://arxiv.org/pdf/1602.02830v1.pdf)という論文を参考にしました。

　超ざっくりいうと、重みと活性値を１と−１の２値にしようということです。これをするとメモリ量が大幅に削減できるのはもちろんのこと、１/ −１ 同士の乗算結果もまた１/ −１なので、乗算器が単なる NXOR ゲートで済むというわけです。　
 
|a|b|a × b|
|-|-|-|
|1|1|1|
|1|-1|-1|
|-1|1|-1|
|-1|-1|1|

　なんともハードウェア化に優しいですね。
 <br>

　では、どうやってパラメータを学習させていくのかという話ですが、実はパラメータは32bit float としてもっており、順伝播・逆伝播の際はそのパラメータを０を閾値として２値化したものを用いて計算し、パラメータの更新時のみ float の値をいじるというやり方になっています。

 　それと、各層の活性値も２値化するため、活性化関数は符号関数を用います。

```math
Sign(x) = \left\{
\begin{array}{}
1 & (x \geq 0) \\\
-1 & (x \lt 0)
\end{array}
\right.
```
　ただ、このままだと勾配が計算できないので、逆伝播時は、tanh 関数として勾配を計算してみました。[^2]
 　ついでに、入力値であるMNISTのグレースケール画像も２値化しました。
<br>

　Q. こんなことやって精度は落ちないの？
 
　A. 落ちます。
<br>

 　誤解のないよう補足しておくと、上の論文で紹介されていたやり方ならあまり落ちないけども、私が実装したものはいろいろはしょりすぎて良くなかったみたいです。
  　また後で、ちゃんとやります、後でね。

# 畳み込み演算の並列度はすごい
　モデルの学習が済んだら、今度はVerilogと格闘する時間です。意外とVerilog書くの面白いんですけどね、やっぱり大変です。

　畳み込み演算は、畳み込みフィルターの１つの値に対して、入力画像の各ピクセルとの乗算＆出力への加算を並列的に行います。なんと、24×24=576並列 !　 畳み込み演算が25クロックで終わります。

![bcnn01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638296/1229f33f-311a-e430-d255-8e5f1a0d637a.png)

<br>
　行列演算も同じような感じで並列化しますが、パラメータが圧倒的に多いので、時間はまあまあかかります。

# 実装結果
　結局作ったモデルはこんな感じ
 |Layer|output size|parameter|
 |-|-|-|
 |入力層|28×28|-|
 |畳み込み層|24×24|25|
 |全結合層|128|73,856|
 |出力層|10|1290|
 
 　Vivadoでの合成結果
  |周波数|LUT|FF|
  |-|-|-|
  |100MHz|6400|4400|

  画像１枚あたり 15us くらいで推論できます。悪くないんじゃなかろうか...? 気が向いたら改良します。

# そんなことより
　ブルアカのアニメが待ち遠しいです


[^1]: 当時は、分散RAMとブロックRAMの違いを全然知らず、全部LUTでやるもんだと思ってた。今思えば、余裕だった。
[^2]: BinaryNetの論文では、ハードtanhというものが使われてます。
TomcatとJBossの違い

# 1. はじめに
これまでJavaベースのオープンアプリケーションサーバーとしてTomcatを利用してきましたが、JBossサーバー構築に携わる機会がありました。そこで、この記事ではTomcatとJBossの違いについてまとめます。

# 2. TomcatとJBossの違い

TomcatとJBossは、アプリケーションのデプロイと実行をサポートします。ただし、いくつかの点で異なります。

## 2.1 機能
### Tomcat:
Tomcatは、軽量で単純なサーブレットコンテナおよびJSP（JavaServer Pages）コンテナです。サーブレットとJSPの実行に焦点を当てており、他の機能は提供していません。
### JBoss
JBossは、完全なJavaEEアプリケーションサーバーです。Tomcatよりも機能が豊富で、EJB（Enterprise JavaBeans）、JMS（Java Message Service）、JTA（Java Transaction API）などのJavaEEの標準機能を提供します。

## 2.2 利用用途
###  Tomcat:
EJBを活用しない軽量でシンプルなサービス
### JBoss:
EJBを含むJavaEEの標準機能を利用したい場合


# 3 おわりに
TomcatとJBossの違いについて理解を深められました。個人用途のサーバーではtomcatで十分だという認識です。
軽深演習 #8 組み合わせ

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 8日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　組み合わせ

圏は、射つまり矢印が重要です。私達は、普段よく矢印をつかっています。そんな矢印にほんの少し、圏論的な雰囲気の使い方を付加するだけで面白いことがわかってきます。
かつての日本のガラケーが、写メをしたのがそれですね。携帯の使い方を大きくかえました。

```mermaid
flowchart LR
A[携帯]-->C[世界初　写メ]
B[カメラ]-->C
```

組み合わせが異なった印象を与えることはいくらであります。中国との貿易は、日本が大幅に輸入超過で赤字になってるとされていますが香港を加えるとどうでしょうか？

```mermaid
flowchart LR
A[中国の輸出入は日本の赤字]-->C[中国 + 香港の輸出入]
B[香港の輸出入は日本の黒字]-->C
```
中国のグラフ
![105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/17f8a1e0-653e-1ed8-017c-0b3f3cefee4e.png)
中国 + 香港のグラフ
![105_108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/7c6b3152-88aa-cfb5-655f-fb8c87bd5b7a.png)

香港を加えた中国との貿易は結構均衡してるような気がします。

組み合わせが圏として射として厳密かというと勿論全然違います。圏として組み合わせを厳密に考えるのは桁違いに難しいです。でも軽深（かるしん　なんちゃって圏論）なので、数学的厳密さは、無視します。矢印をつかって考えるとわかりやすいという意味で、演習　**組み合わせ**　を提示します。

### 演習　利用するサービスを組み合わせると簡単に日本で一番最初になれます。kaggle グラフ作成 で、instagram に画像アップがその例です。組み合わせを活用して、あなたが日本、もしくは世界ではじめての試みをするとしたらどんなことを思いつきますか？

```mermaid
flowchart LR
A[kaggle]-->C[世界初]
B[instagram]-->C[世界初]
```

kaggle を使うと自動的にinstagram 用の画像を簡単につくれます。
![newplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/a929449a-34ec-d33b-ca33-fab753d34552.png)
Disable Automatic Https in Edge/Chrome


Chrome：`chrome://net-internals/#hsts`
Edge：`edge://net-internals/#hsts`


![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/5d31bade-0eb0-7d10-b6e5-f29cf01c6d05.jpeg)


Chrome：`chrome://flags/#edge-automatic-https`
Edge：`edge://flags/#edge-automatic-https`

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/0ae96d40-6a07-5b7c-3b2a-798673051ba6.jpeg)

Final, restart the browser

---

Ref:

https://wiki-power.com/%E9%81%BF%E5%85%8DChrome%EF%BC%88Edge%EF%BC%89%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2HTTPS/
【Forms × Power BI で始めるアンケート分析】アンケート作成編

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [クラウド AI by ナレコム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/knowcom-cloudai) の8日目にあたる記事になります！

今回は、社内向けの週次アンケートを Microsoft Forms で作成し、Power BI で結果を可視化するまでの流れを、前編（今回）と [後編（次回）](https://qiita.com/omiyu1188/items/1ba03d18423cd30494b5)に分けて説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/f538183e-c4cd-7b6a-94eb-f11f548764e1.png)

# 全体の流れ
1. アンケートの作成
2. 回答の確認
3. 回答データのインポート（次回）
4. データモデル作成（次回）
5. レポート作成（次回）

# 1. アンケートの作成

回答データの格納先とする SharePoint サイトのドキュメントに移動し、「新規」→「Excel 用 Forms」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/a419db5a-7fed-7abe-dc4a-18be7721390e.png)

Form 名を入力して「作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/687f71eb-3101-cff1-e6e3-54072c6379be.png)

Form が立ち上がるので、「新規追加」から質問項目を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/24f96cf6-45fb-a442-f7c5-f2eac2b2bffe.png)

今回は4つの質問を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b106d118-4a23-0cbb-3dcb-0ee939672d31.png)

「回答を収集」から Form の URL を取得して回答対象者に共有します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/883d57e5-a0d7-005b-a034-d7fece0cb9a1.png)

# 2. 回答の確認
自分で回答してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/0b05de4b-fe8f-775a-13d4-97bb11066894.png)

回答が送信されると先程作成した SharePoint 上の Excel にレコードが追加されるので確認してみます。
SharePoint に戻って「F23_週次アンケート.xlsx」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/07cd015f-7a0b-6e24-cf21-cab2994ef865.png)

回答内容が保存されていることが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/d25f001c-34b3-bb8d-db5a-24b8621edef5.png)

# おわりに
[後編](https://qiita.com/omiyu1188/items/1ba03d18423cd30494b5) ではレポートを作成する手順を記載していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/95529d21-27ba-7fcb-79d1-d6a09c001bc5.png)

またナレッジコミュニケーションでは「[Musubite](https://musubite-job.com/)」というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
今日思いついて今日作ったアプリ

# 区切り文字
プログラマの友達と話していてC++で、👇こう書けることを今日知った。
```cpp
int m = 836'245'105 
```

# 区切り文字は読みやすいか？
数字を区切りたいケースというのは確かにある。836245105 と書くよりも836,245,105 と書いた方が読みやすい。…本当に？本当に読みやすい？836,245,105て結局数えない？って話になった。確かにこれを見た瞬間に800万なのか8000万なのか8億なのかをパッと分かる人は少ないと思う。我々日本人にとって一番有難い表記は8億3624万5105と書いてくれることではないかと思った。

# なければ作る
でそんな関数あったかなと思って調べたが見つからなかった。なければ作る。というわけで作った。836,245,105を貼ると8億3624万5105にしてくれるWebサイト。
https://japannumberconvert.azurewebsites.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100916/3ebc52a9-2b56-f650-d508-92c0facf1119.png)
git-openを使って氣軽にリモートリポジトリをブラウザで開く


皆さんは Github 等のリモートリポジトリをブラウザで開く時はどうされているでしょうか？

僕はここ最近、ターミナルから[git open][git-open]コマンドを打つやり方が氣に入ってます。

[![](https://user-images.githubusercontent.com/39191/33507513-f60041ae-d6a9-11e7-985c-ab296d6a5b0f.gif)][git-open]

(写真は[git open][git-open]コマンドのREADMEから拝借)

## git-open の使い方

1. ターミナルを開き、プロジェクトのディレクトリに入っているのが前提
1. （ブラウザでリポジトリを開きたい時に）`git open`と入力

```shell:terminal
cd path/to/my-app

git open
```

## git-open のインストール方法

いくつかやり方があります。

- [コマンドの実行可能ファイル](https://raw.githubusercontent.com/paulirish/git-open/master/git-open)をダウンロードしてご自身のマシンのコマンド置き場に置く（`/usr/local/bin`、`$HOME/bin`、`/$HOME/.local/bin`等）
  - [git-open]作者推奨
- NPM
  - `npm install --global git-open`
- その他
  - [zsh プラグイン](https://github.com/paulirish/git-open#zsh)
  - [archlinux user repository](https://aur.archlinux.org/packages/git-open)

一回きりの作業なので[git-open]作者が推奨しているように手動でコマンドファイルを作るのが一番良い氣がします。コマンドの置き場所は人それぞれ好みによります。パスが通っていることさえ確認したらどこでも構わないと思います。

Ubuntu の`.profile`にパスを通すのに便利ないいサンプルコードがあります。

```shell:.profile
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
```

## git-open は要らないかも

https://qiita.com/ucan-lab/items/56502f28ed30981d449a

[git-open]: https://github.com/paulirish/git-open

## さいごに

本記事は [闘魂Elixir #59](https://autoracex.connpass.com/event/300542/) の成果です。ありがとうございます。

https://autoracex.connpass.com/

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

![toukon-qiita-macbook_20230912_091808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/fd5c55ec-4fe0-8af6-59bc-bab1ef3d182b.jpeg)