OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter (初級) is に関して

オブジェクトが指定された型を持っている場合、`true`を返してくれる。どういうことか？

オブジェクトの型が不明だったり、確定していなかったら`==`ではなく`is`で判定して下さいというものらしい。

通常文字列の場合下記のように判定されます。
```dart
// 自動車メーカーであるトヨタとプリウスで例えてみます
void main() {
  final prius = "Toyota";
  print(prius == "Toyota"); // true
  print(prius == "Honda"); // false
}
```

[replit(Dart専用オンラインエディタ)](https://replit.com/languages/dart)で自動車のオブジェクトを作ってプリウスにトヨタのクラスを入れて`==`で検証してみました。
![スクリーンショット 2022-12-19 10.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/56d3e15c-0944-ef3c-95b8-3065140c51b2.png)
間違った比較の仕方をしているため`false`が返ってきているのがわかります。そこで、オブジェクトの比較には`is`を利用します。

```dart
class Car {}
class Toyota extends Car{}
class Honda extends Car{}

void main() {
  final prius = Toyota();
  print(prius is Toyota);  // true
  print(prius is Honda);  // false
}
```
![スクリーンショット 2022-12-19 10.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/e7000335-337c-02fb-7e5b-3161784a8b8b.png)
ちゃんと、`true`が返ってきます。 また、`否定形`
は以下のように`is!`で書きます。
```dart
class Car {}
class Toyota extends Car{}
class Honda extends Car{}

void main() {
  final prius = Toyota();
  print(prius is! Toyota);  // false
  print(prius is! Honda);  // ture
}
```
![スクリーンショット 2022-12-19 11.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/e6bc3a9f-3df3-7dcd-f9d4-c65075a56a34.png)
ちゃんと判定されていますね。という事で、`Dart`でオブジェクトを判定する際は`is`を使用しましょう。
Agora　WebSDK　デモページの紹介　Basic編

## はじめに

Agora SDKにはWebSDKのデモページの提供をしております。
今回はどんな種類のデモがあるのか皆様にご紹介いたします。
今回はBasic編ということで、Agora WebSDKに初めて触れる方向けの内容となっております。
その他検証などにお役立ちする場合もあるかと思いますので有用にご活用いただけますと幸いです。
下記リンクよりすべてのWebDemoにアクセス可能です。

https://webdemo.agora.io/


## WebDemo紹介

### Basic Call

まず手始めに最も基本的な3種類（Voice／Video／Live）のデモを紹介します。
Voiceはその名の通り音声のみの通信を行うデモになっております。
VideoデモはCommunicationモードの映像音声の送受信が行えるデモとなっております。
簡単な画質の変更などもできるので、検証にも役立つ最もオーソドックスなデモです。
Agora WebSDKご利用開始されたばかりの方は、公式ページのサンプルとこちらの挙動をご確認いただくのが最もおすすめです。
LiveデモはLiveモードの映像音声の配信が行えるデモとなっております。
ホストとオーディエンスのどちらかでチャンネルに参加することが可能です。
CommunicationモードとLiveモードに関する説明は下記ご参照いただけますと幸いです。

##### Communicationモード：双方向・少人数
チームミーティングやオンラインチャットなど、チャンネル内のすべてのユーザが互いに通信する必要があり、ユーザの総数がそれほど多くない場合に適用されます。
ホストのみで17人まで通話可能です。

##### Liveモード：一方向・多人数
チャンネルにホストと多数のオーディエンスが存在する場合に適用されます。
SDKではホストとオーディエンスの2つのRoleを定義しています。
ホストは音声と動画の送受信が可能で、オーディエンスは受信のみ可能です。
チャンネル内でホストとオーディエンスを入れ替えることができます。
ホストは17人まで双方向通話可能です。オーディエンスは100万人まで視聴可能です。

https://webdemo.agora.io/basicVoiceCall/index.html

https://webdemo.agora.io/basicVideoCall/index.html

https://webdemo.agora.io/basicLive/index.html


### CloudProxy
Cloud Proxy は、企業などで制限されたインターネット環境下からAgoraのサービスを利用するにあたり、ファイアウォールなどのセキュリティ機器を超えて通信を実現するためのプロキシ機能です。
Cloud Proxy を利用することで、エンドユーザーのネットワークにおけるセキュリティポリシーにフィットすればAgoraのサービスをご利用いただける可能性が高まります。
Cloud Proxyを利用することで、教育、医療、エンタープライズや政府系サービスなど、制限されたネットワーク環境下からエンドユーザーが参加する可能性のあるイベントにおいて、接続の成功確率を上げることが可能です。
こちらのデモは疎通確認の検証用にご利用いただければ幸いです。
[**Cloud Proxy機能をご利用したい方はこちらからご確認ください**](https://vcube-support.zendesk.com/hc/ja/articles/5376218104729)

https://webdemo.agora.io/cloudProxy/index.html


### SelfCapturing
SelfCapturingはローカルユーザー側の画像をキャプチャして映像配信ができるサンプルとなっております。
アイコンなどを表示する機能の実装にお役立ちできるかと思います。

https://webdemo.agora.io/selfCapturing/index.html

### SelfRendering
SelfRenderingはローカルユーザー側の映像を複製して映像配信ができるサンプルとなっております。
Zoomのような参加者全員を上部に表示しつつ、発話者を大きく映すような実装の際にお役立ちできるかと思います。

https://webdemo.agora.io/selfRendering/index.html

### Screenshot
Screenshotはその名の通りスクリーンショットを取ることができるデモになっております。
ホストとして入ったクライアントでスクリーンショットが撮れる実装となっております。

https://webdemo.agora.io/screenshot/index.html

### ShareTheScreen
ShareTheScreenはその名の通り画面共有を行うデモになっております。
こちらは画面共有機能のみのサンプルとなっております。
ビデオも一緒に送信する際にはクライアントを2つ作成する必要がございます。
[**画面共有機能をVideo Callと一緒に実装したい方はこちらからDocumentをご確認ください。**](https://docs.agora.io/en/video-calling/develop/product-workflow?platform=web#implement-a-client-for-)

https://webdemo.agora.io/shareTheScreen/index.html



## 最後に
ここまで記事を読んでいただき、ありがとうございます。
上記デモが皆様の開発の助けになれば幸いです。

[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=f712953155ddadcf0177)
[<img width="912" alt="Agoraの詳細はこちら" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5865441c-9d31-c702-3698-3aeb84927f28.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=f712953155ddadcf0177)
UnityWebGLビルド開発時の日本語テキストの表示周りについて

# はじめに
WebGLビルド時は日本語のテキストを表示する際に注意事項を本記事にまとめます。

# 日本語が表示できない
Textコンポーネントを利用時Unityの標準のフォント `Arial` には日本語が含まれていないため、日本語が含まれるフォントを利用する必要があります。
※同様にTextMeshPro標準フォントの `LiberationSans` も日本語が含まれていません。

https://a1026302.hatenablog.com/entry/2020/09/04/182559

特にこだわりがなければ、こちらのオープンフォントがおすすめ

https://googlefonts.github.io/japanese/


# 日本語フォントを利用してもテキストが表示されない
日本語を含むフォントを利用していても `Text` コンポーネントの文字が表示されない場合があります。
その場合、ブラウザのアスペクト(縦横)比を変えてみると表示されるようになったり、再度消えたりする現象が発生することが多い印象です。
そのような場合は `Text` コンポーネントではなく `TextMeshPro` コンポーネントを使用することがテキストが表示されるようになります。
※WebGLビルドで開発時にTextコンポーネントを利用しても問題のないケースもある様です、情報をお持ちの方がいらっしゃいましたらコメントを頂けますと幸いです。

 https://teratail.com/questions/342022

# TextMeshProコンポーネントで日本語フォントを利用していてもテキストが表示されない。
上記の項目での対応を行うと大半のケースで問題が解消されるのですが、稀にそれでも文字が表示されなくなるケースがある様です。
この場合も同様にブラウザのアスペクト比によって文字が消えたり表示されたりします。
そのような場合は、フォントの種類を変更するとで解消される可能性があります。
筆者の経験上 `NotoSansJP-Regular` ではテキストが消えるが `NotoSansJP-Medium` だと問題なく表示されるなどの現象を確認しています。
この問題に対し、TextMeshProのMaterialにアタッチされているShaderを `DistanceFieldOverlay` に変更することで強制的に常時表示させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/a0fb196b-aec8-c137-673c-0f7957f2c43e.png)
ちなみにMobile用途のShaderも用意されていますので、制約の厳しいWebGL用途だとこちらの方がおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f1297cfa-bbd9-59f9-ec2e-ce332801628e.png)

https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.2/manual/Shaders.html

https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.2/manual/ShadersDistanceField.html
Pythonで簡単なMVCモデルのコードを書いてみた

# はじめに
MVCモデルは、Webアプリケーションを作成する際によく使われるアーキテクチャパターンです。MVCはModel-View-Controllerの略で、それぞれ以下のような役割を果たします。

# 各MVCの要素について
Model
 データを管理する部分。データベースやAPIからデータを取得したり、更新したりする処理を担当する。

View
 ユーザーに表示される部分。HTMLやCSS、JavaScriptなどを使って、Webページを作成する。

Controller
 ModelとViewをつなぐ部分。HTTPリクエストを受け取り、適切なModelからデータを取得し、Viewに渡す処理を担当する。

MVCモデルを使用すると、アプリケーションをわかりやすく構造化できるため、開発をスムーズに進めることができます。

# コード
以下に、MVCモデルを使用したPythonでのWebアプリケーションの例を示します。

```Python
from flask import Flask, render_template, request

# Model
class Task:
    def __init__(self, description, status):
        self.description = description
        self.status = status

# View
app = Flask(__name__)

@app.route('/')
def index():
    tasks = [
        Task('Finish homework', 'in progress'),
        Task('Buy groceries', 'done')
    ]
    return render_template('index.html', tasks=tasks)

# Controller
if __name__ == '__main__':
    app.run()
```
※FWにFlaskを使用しています

TaskクラスがModelで、index関数がControllerで、index.htmlがViewです。index関数は、Taskクラスのインスタンスを作成し、render_template関数を使用してHTMLページを生成します。HTMLページには、Taskクラスのdescriptionとstatusを表示するようになっています。
AWSクラスルームトレーニング体験談


最近AWSのクラスルームトレーニングというものを受けました。
AWSに数多あるサービスから習得したいものを選んで、
講師からレクチャーを受け、時にはハンズオンを行いつつ学ぶという研修です。
どういった内容なのか、ユーザー視点からの情報が少なかったので記事にしようと思いました。

## クラスルームの検索

[まず、受講したいクラスルームを探します。](https://www.aws.training/LearningLibrary?query=&filters=Language%3A2%20DeliveryFormat%3A0&from=0&size=15&sort=_score)
定期的に開催されるクラスルームでも例えば2〜3ヶ月間隔に開催されるということもあるので、機会を逃さないように気をつけて下さい。
事前知識が無いとついていけない内容もあるので前提条件をよく確認して下さい。SkillBuilderで予習しておくのもいいかもしれません。

## 支払い

受講クラスの受講日を決めたら支払いを行います。
消費税計算のために住所を入力するのですが、ここで少しハマりました。
エラーを報告したのでもう直っているかもしれませんが、詳細を書いておきます。
郵便番号7桁を入力すると謎のエラーが発生します。
画面を見てもどこがエラー原因か解らなかったので、特定に時間がかかりました。
郵便番号に適当な数字を入力すれば判定を通過できます。

## 事前準備

事前準備として必要なことはWebexをインストールしておくことくらいでした。
チャットで質疑応答するケースに備えてチャットの表示名を声に出して読めるものに設定しておいた方がいいです。
AWSのアカウントは持っていなくても大丈夫です。

## 研修当日

Trainingのページでサインインするとマイページにアクセスできます。
[Traningページ](https://www.aws.training/LearningLibrary?query=&filters=Language%3A1%20DeliveryFormat%3A0&from=0&size=15&sort=_score)
トレーニングデータというページに、受講クラスの一覧が表示され、当日の15分前からWebexを起動することが出来ました。
他のクラスではどうか解りませんが、マイクとカメラは常時オフで、講師の画面共有でテキストを見ながらレクチャーを受けるというスタイルでした。
質問がある場合はテキストチャットを使います。テキストやハンズオン環境などのリンクも当日チャットを介して共有されます。
ハンズオンにはLabと呼ばれる専用の環境を使いました。当日共有されるポータルページにハンズオンの一覧があり、単元ごとに起動リンクが設置されています。リンクをクリックするとAWSアカウントが発行されAWSコンソールが立ち上がります。個々のハンズオン環境では事前に必要な設定が済んでいて、いくつかの課題を文章で出されるので順番にこなしていきます。

## 振り返り

解説や質問への回答が親切で解りやすく、ハンズオンもエラーで詰まるといったことが少なく快適でした。録音は出来ませんでしたがテキストやソースを持ち帰れたので、頭に入り切らなかった部分を後で確認できますし、実務で使える資産が残りました。

## 修了書

無事研修を終えると、修了証が貰えます！
どんなものか御覧になりたいですよね。
でも是非自分の目で確かめてください。
paiza.ioでelixir その152

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
csvをパースして、tableで表示せよ。

# サンプルコード

```
defmodule Main do
    def print(nil) do
        IO.puts "ok"
    end
    def print(l) do
		#IO.puts l
		s = String.split(l, ",")
		#IO.puts Enum.at(s, 0)
        IO.puts "<tr><td>#{Enum.at(s, 0)}</td><td>#{Enum.at(s, 1)}</td><td>#{Enum.at(s, 2)}</td></tr>\n"
    end
    def main() do
        csv = """
name, lat, lon
オートショップユニット, 140.151111, 37.929687
（株）エイジュウプロ, 140.109344, 37.929220
（株）ホンダウイングロードショウ, 140.093108, 37.923453
（有）カーセンター葵商会, 140.112004, 37.911333
塚本サイクル, 140.108036, 37.907591
サイクルショップ川口, 140.114247, 37.928429
サイクルショップ中村, 140.099879, 37.916279
菅原商会, 140.101416, 37.917854
サイクルセンター卯月, 140.108688, 37.912485
ホンダ野村モータース, 140.105914, 37.912049
モーターハウスＫ, 140.103534, 37.869915
ライダースサロン・ヤマカ, 140.109289, 37.918955
中央ホンダ, 140.108313, 37.915746
香澄ホンダ, 140.107225, 37.905011
佐藤オート商会, 140.123328, 37.912663
香坂輪店, 140.121636, 37.910789
斎藤モータース, 140.125682, 37.958525
ニューホンダ石山, 140.117820, 37.956678
二輪屋たかはし, 140.131694, 37.903901
夢工場, 140.104554, 37.886019
あべ輪店, 140.103239, 37.874814
レッドバロン米沢, 140.137379, 37.905055
"""
        IO.puts """
<!doctype html>
<html>
<head>
</head>
<body>
    <table  border="1">
        <thead>
        </thead>
        <tbody>
"""
        Enum.map(String.split(csv, "\n"), fn l ->
			print(l)
		end)
		IO.puts """
</tbody>
</table>
</body>
</html>
"""
	end
end

Main.main


```

# 成果物


https://paiza.io/projects/UKj8eDGTESY5pXwc1YmOtQ?language=elixir


以上。
gensimのpoincare embeddingを使って感情データをモデル化する

アドベントカレンダー20日目です。

最近、Wordnetなどの階層構造データを扱うことがあるので、poincare embeddingにちょっと興味が湧いて試してみました。

poincare embeddingは、双曲空間を凸方向に射影したものなので、木構造データの表現に適したembeddingというのが私の中の雑な理解です。

詳細は他サイトに譲ります。


### 環境
ubuntu 20.04.5 LTS
python 3.9.6

### 使用データ
https://www.jnlp.org/GengoHouse/snow/d18

サイトなかほどのXLSXファイルをダウンロードし、作業者１シートをtsv形式にしたものを用いました。


### 前準備
gensim、ploylyともに古いバージョンでないと可視化のところでうまくいきません。

gensimインストール
```
pip install gensim==3.7.3
```
可視化用ライブラリインストール
```
pip install plotly==2.7.0
```

### モデル作成
さっくりできます。
```
from gensim.models.poincare import PoincareModel, PoincareRelations
from gensim.test.utils import datapath
relations = PoincareRelations(file_path=datapath('/emotion1.tsv'))
model = PoincareModel(train_data=relations, size=2)
model.train(epochs=50)
```

### 可視化
ある意味ここが一番のはまりポイント。google colabとかだと、他にも呪文がいるとか。
```
import gensim.viz.poincare
import ployly.offline

plotly.offline.init_notebook_mode(connected=False)
prefecutre_map = gensim.viz.poincare.poincare_2d_visualization(model=model,
                                                               tree=relations,
                                                               figure_title="可視化",
                                                               num_nodes=10,
                                                               show_node_labels=model.kv.vocab.keys())
plotly.offline.iplot(prefecutre_map)
```

### 結果

丸いですね。期待通り。ごちゃっとしていますが、実際の画面ではカーソルおいたところの文字が紫枠で浮かんでくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/404478e3-c17f-6ec9-a709-05e5705569ba.png)


いくつか機能を紹介します。

類似度の高い言葉を引っ張ってくることができます。
"嬉しい"と近いもの２個を引っ張ってきます。

```python
model.kv.most_similar("嬉しい",topn=2)
```
出力：[('良かった', 0.010566568678917252), ('歓心', 0.011028224138605661)]


"悲しい"と近いもの２個を引っ張ってきます。
```python
model.kv.most_similar("悲しい",topn=2)
```
出力：[('悲哀', 0.023677410109664343), ('悲嘆', 0.02400493515592728)]


階層を反映させた形で、近いものを引っ張てくることもできます。
"嬉しい"の下位階層の最も近いもの
```
model.kv.closest_child("嬉しい")
```
出力：'嬉しがる'

"嬉しい"の上位階層の最も近いもの
```
model.kv.closest_parent("嬉しい")
```
出力：'良かった'


結果の妥当性としては、ちょっとよくわからないですね。使ったデータにもよる気がします。表記ゆれ対応とかにも使えるかもしれません。

gensimでの実装自体は結構古いですが、最近はDeepLearningでこのpoincare embeddingを実装した話が新しくでてきているようなので、またブームが来るのかもしれません。

### 参考
https://qiita.com/wwacky/items/3c33fa0add05c601f555
https://radimrehurek.com/gensim/models/poincare.html
pyinstaller実行時のエラー

pyinstallerの実行時のエラー

これまで何事もなく使えていたが、下記エラーが発生
```test.py
use pyinstaller --clean to fix it
・
・
・
File "<string>", line 323
SyntaxError: unexpected character after line continuation character
```


hello.py（print("hello")のみのファイル）でも同様のエラー
エラー内容としては、
空白"\n"が認識できていないようだった

調べてみても原因不明

【解決策】
```test.py
pyinstaller hello.py --onefile
↓
pyinstaller --clean hello.py
```

--cleanでキャッシュを削除すると他のファイルに関してもすべてexe化することができた。
「NO RULES(ノー・ルールズ) 世界一「自由」な会社、NETFLIX」が教えてくれる大事なこと

# NETFLIX が教えてくれるフィードバックで気をつけること
「NO RULES(ノー・ルールズ) 世界一「自由」な会社、NETFLIX」( https://amzn.to/3mabhfI ) を読んだのですが、非常に印象に残った教訓があったので共有します。

# 【フィードバックのガイドライン「4A」】
フィードバックを与える人、受ける人でそれぞれ意識するべきことを書いていました。


## フィードバックを与える人
1.　相手を助けようという気持ちで (AIM TO ASSIST)
  - フィードバックは前向きな意図を持って行う。
  - 相手自身などにどのように役立つのか，明確に説明しよう。

2.　行動変化を促す (ACTIONABLE)
  - フィードバックはそれを受けた相手が行動をどう変えるべきかにフォーカスすべき。
 
## フィードバックを受ける人
3.　感謝する (APPRECIATE)
  - 批判されると、誰だって自己弁護や言い訳をしたくなる。反射的に自尊心や自分の評価を守ろうとする。
  - フィードバックをもらったら、この自然な反応に争い、自問しよう。
  - 「このフィードバックに感謝を示し、真摯に耳を傾け、囚われない心で相手のメッセージを検討し、自己弁護をしたり腹を立てたりしないためにはどう振る舞ったらいいのか」と。
 
4.　取捨選択 (ACCEPT OR DISCORD)
  - たくさんの人からフィードバックを受けたら、その全てに耳を傾け、検討しなければならない。
  - しかし常にそれに従う必要はない。
  - 心から「ありがとう」と言ったら、受け入れるかどうかは本人次第。これはフィードバックを与える人、受ける人の双方が理解しておかなければならない。

「NO RULES(ノー・ルールズ) 世界一「自由」な会社、NETFLIX」( https://amzn.to/3mabhfI ) から引用。


僕は特に**フィードバックを受けるときに感謝する**という点ですごく響きました。
大勢の前で言われるほど強がってしまいますよね。これから意識していきたいと思います！
レシートの要素を整理する

今日は電子レシートを生成するうえで必要なレシートの要素をまとめてみます。

レシートはモノを購入する人の権利であるため、一般的にはなにかを購入すると必ずレシートを印字するという文化が日本にはあります。請求することができるということなので、店舗側は請求されなければ出す必要はないのですが、あとから交付を求められても厄介なのでその場で必ず発行するのが無難とされます。なので、「レシートはいりますか？」と言われ、「いらない」と回答してもレジからはレシートが印字されるケースが一般的です。

下記が該当の民法になります。

>（受取証書の交付請求等）
第四百八十六条　弁済をする者は、弁済と引換えに、弁済を受領する者に対して受取証書の交付を請求することができる。
２　弁済をする者は、前項の受取証書の交付に代えて、その内容を記録した電磁的記録の提供を請求することができる。ただし、弁済を受領する者に不相当な負担を課するものであるときは、この限りでない。

https://elaws.e-gov.go.jp/document?lawid=129AC0000000089

ということで、
一般的なレシートは下記の要素をまとめています。

1. ヘッダー
1. 購入商品一覧
1. 合計金額（合計金額の詳細）
1. 支払い情報

# ヘッダー

ヘッダー分部には下記の要素を記載します。

- 表題
- 店舗名
- 店舗の住所、所在地
- 店舗への連絡先
- 日付・時刻
- レシート番号
- 担当者

## 表題

表題は一般的に「領収書」や「ご利用明細」と表記されるケースが多いです。

## 店舗名

店舗名が印字される場合もあれば、ロゴの場合もあります。チェーン店などは店舗名はロゴで表記され、その下に支店名が印字されているケースが一般的です。

## 店舗の住所

こちらはリアル店舗で購入した場合を想定していますが、店舗の住所が記載されます。

## 店舗への連絡先

電話番号、メールアドレス、ウェブが記載されます。購入したユーザーがあとで連絡とれるものであれば問題ありません。

## 日付・時刻

レシート（購入証明）が発行された時刻が印字されます。

## レシート番号

レシート番号は連番で印字されているところが多いようです。その日（またはレジ締め前）の連番で、参照が必要になったときにユニークであることを担保しています。

## 担当者、店舗番号

レシートは印字スペースが限られていることもあり、担当者番号だけ記載されているケースが一般的です。これは後程お店側で誰が担当したのか識別するためにあります。担当者が印字されている近くに店舗番号も印字されているケースがあります。


# 購入商品一覧

購入商品一覧部分には下記の要素が表記されます。

- 商品名
- 商品ID、コード
- 軽減税率対象かどうか
- 個数
- 単価
- 合計金額
- 値引き、または値引き前価格
- 内税・外税対象

## 商品名

商品名が印字されます。

## 商品ID、コード

商品名がわかりずらい、またはほぼ同じパターンがあるため
商品IDまたは商品コードを印字してわかりやすいようにしています。

## 軽減税率対象かどうか

「軽」や「#」などをつけて、その商品が軽減税率対象なのかどうか印字しています。

## 個数

購入点数を印字しています。

## 単価

商品の定価ではなく、実際の売価を印字します。

## 合計金額

個数 X 単価の金額を印字しています。

## 値引き、または値引き前価格

その商品が値引きされている場合、単価に対して値引き金額または、値引き前の金額を印字し、値引きされていることがわかりやすくしています。

## 内税・外税

その商品が内税価格なのか、外税価格のか印字しています。

# 合計金額（合計金額の詳細）

合計金額の詳細には下記の要素が含まれます。

- 小計
- その他手数料
- 税金対象金額
- 税金額（内税、外税）
- 値引き金額
- 合計

## 小計

購入商品一覧に記載された金額の合計になります。外税の場合は税金前の合計金額になります。


## その他手数料

送料やその他手数料などがある場合はここに印字されます。それらが内税、外税かは次の税金対象金額を見て判断します。

## 税金対象金額

税金対象金額とその利率を表記します。何円分が軽減税率対象なのか、通常税率なのかを印字します。

## 税金額

内税、または外税であることを明記し、税金額を印字します。

## 値引き金額

全体に対して（小計に対して）値引きがある場合は、ここに印字されます。全体で20%オフなどされる場合はここに金額表示されます、内税の場合は税金対象金額から差し引かれるのが一般的です。外税の場合は小計、または小計＋その他手数料から差し引かれるのが一般的です。

## 合計

最終的に支払わなくてはいけない合計金額を印字します。


# 支払い情報

支払い情報には下記の要素が含まれます。

- 支払い方法
- 支払い金額
- おつり

## 支払い方法

支払い方法には、現金、クレジットカード、そのほか電子モバイル決済手法などが印字されます。クレジットカードのばあいはブランド名や、カード番号の下4桁が印字されるのが一般的です。モバイル決済などの場合は、区分、承認番号など決済会社側で必要な情報が印字されます。

## 支払い金額

カードやモバイル決済の場合は合計金額そのものが印字されているケースがほとんどです。現金の場合はおつり前の支払い金額が印字されます。

## おつり

おつりが印字されます。

# 次

これらの要素を含みAPIを開発していきます。

# 採用中です。

テクノロジーで社会問題を解決。
紙レシート削減を一緒に進めてくれるエンジニアを募集しています。
詳しくはこちら。

https://receiptroller.com/ja/jobs
go testのチュートリアルを作ってみた

# はじめに
この記事は[ディップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev)の21日目の投稿です。
早いもので今年のアドカレも残すところあと5日となりました。

弊社ではGoを用いたプロダクトが拡大中＋内製化のため鋭意増員中です。
いずれのプロダクトでも単体テストを書く文化が根付いているため、
新規参画メンバーが早く馴染めるように`go test`のチュートリアルを作ってみました。

https://github.com/dip-dev/go-test-tutorial

# どんなもの？
あらかじめ実装されているコードに対し、単体テストを作成するチュートリアルです。

テストケースの作り方と[gomock](https://github.com/golang/mock)の使い方が学べる内容になっており、
Goに初めて触れる、単体テストを書いた経験が少ないひとをターゲットとしています。

課題はchapter5まであり、徐々に難易度が上がっていきます。
また、後半のchapterは実践向けな構成になっています。

## ちょっと紹介
chapter1を紹介します。

#### 課題内容
2つの数値を加算する関数がテスト対象です。
ただカバレッジを100%にするだけではNGで、以下の観点がテストケースに盛り込まれていることがポイントになります。

- チェック順は仕様通りか確認できているか
- 境界値チェックは実施できているか

![スクリーンショット 2022-12-12 16.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/e3b0e06d-a4da-e6ed-25a6-b044f1ef08a0.png)

#### 実装コード
```golang:chapter1.go
package chapter1

import "fmt"

func addtion(numA int, numB int) (int, error) {
	if numA < 0 {
		return 0, fmt.Errorf("numAは0以上の数値を指定してください。")
	}
	if numA > 100 {
		return 0, fmt.Errorf("numAは100以下の数値を指定してください。")
	}
	if numB < 10 {
		return 0, fmt.Errorf("numBは10以上の数値を指定してください。")
	}
	if numB > 200 {
		return 0, fmt.Errorf("numBは200以下の数値を指定してください。")
	}

	return numA + numB, nil
}
```

#### テストコード
```golang:chapter1_test.go
package chapter1

import (
	"testing"
)

func TestAddition(t *testing.T) {
	// 正常系のテストパターン
	success := map[string]struct {
		numA int
		numB int
		want int
	}{
		// FIXME: テストケースを追加
	}
	// エラー系のテストパターン
	fail := map[string]struct {
		numA       int
		numB       int
		wantErrStr string
	}{
		// FIXME: テストケースを追加
	}

	for tt, tc := range success {
		t.Run(tt, func(t *testing.T) {
			got, err := addtion(tc.numA, tc.numB)
			if err != nil {
				t.Errorf("err is not nil: %s", err)
			}
			if tc.want != got {
				t.Errorf("unexpected return. want:%d actual:%d", tc.want, got)
			}
		})
	}
	for tt, tc := range fail {
		t.Run(tt, func(t *testing.T) {
			got, err := addtion(tc.numA, tc.numB)
			if got != 0 {
				t.Errorf("unexpected return. want:0 actual:%d", got)
			}
			if tc.wantErrStr != err.Error() {
				t.Errorf("unexpected err. want:%s actual:%s", tc.wantErrStr, err)
			}
		})
	}
}
```

# 運用の話
弊社では新規に参画したメンバーにはまず当チュートリアルに取り組んでもらい、その後に業務へ合流していただいています。
チュートリアルは以下レギュレーションで実施しています。
- chapterごとにプルリクエストを作成
- slackでレビュー依頼を通知
- 先輩エンジニアが適宜レビュー
- 1名以上のapproveで次のchapterへ

ここで、個人的に重要だと感じているのが`先輩エンジニアが適宜レビュー`の箇所です。
レビュー依頼が来たらできるだけ素早くリアクションし、レビューを実施しましょう。
チュートリアルを実施しているのは参画したばかりの人です。不安も多いかと思います。
先輩たちが率先して盛り上げていきましょう。

また、レビュー依頼は業務のコメントで流れてしまいがちなのでチュートリアル用チャンネルを作ると良いです。

# さいごに
当チュートリアルをきっかけに少しでもGoに興味を持って頂ければ幸いです。
改善点、要望等ありましたらプルリクエストお待ちしています。
Linux .sshディレクトリーがない

ホームディレクトリーの下に、.sshディレクトリーがない:<br>
![スクリーンショット 2022-12-19 103650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/5d8de2e0-1495-af49-ddaf-48e2e35e1e9a.png)

解決：<br>
localhostをログインする
<br>
```
ssh localhost
```

![スクリーンショット 2022-12-19 104123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/96d65de2-9a33-7228-3b78-6259d5a9d138.png)
自社サービスの機能を改善提案するための工夫とその気づき

# はじめに

新卒エンジニアとして新規の自社サービスを開発している際、関連する既存の自社サービスが**大幅に高速化できること**に気づき、改善を提案して採用されるまで至りました。

その過程で自分が工夫したところ、またその経験を通して得た自分の気づきについてご紹介できればと思います。

# 準備 ~サービス視点~

## 1. サービスの全体像の理解

まず、アサインされた時点では開発するサービスへの理解が浅かったので、**開発する機能に関連する過去の資料を全て**読んで理解を深めました。それぞれの機能を作った背景や意図について理解を進め、わからない場合は上長に聞くようにしました。

また、**サービスに関連する任意の更新された資料**に目を通すことにも取り組んでいます。サービスは日々変化するため、**今のサービスの全体像**を正しく把握するために取り組んでいます。これにより、エンジニア側だけでなく、ビジネス側の状況も含めた包括的な提案をすることができます。

自分の会社では、資料の管理にGoogleドライブを使用しているため、サービス名で検索して資料を更新日時の降順で並べることを定期的に行い、更新された資料に目を通しています。

## 2. 様々な方法でのコミュニケーション

サービスへの理解があっても周りとの関係性が構築されていなければ、建設的な提案をすることが難しいです。ただ、自分の会社では基本的にはフルリモートのため、**コミュニケーションを取るのが難しい**という問題もあります。そこで、2つのコミュニケーションの手法を実行しています。

1つ目は、**上長と積極的に交流すること**です。一般的に、上長の方がより多くの情報にアクセスすることができ、より広範な視野でサービスを捉えられます。したがって、サービスをより解像度高く理解するには、上長との関係性を構築することが重要です。そのため、DMや1 on 1の機会をできるだけ確保し、サービスについて考えていることを共有するようにしています。

2つ目は、**サービスに関わる人の行動を注視すること**です。前節では、「サービスに関連する任意の更新された資料に目を通す」と書きましたが、資料には意思決定の結果しか残らず過程が表現されていない場合が多いです。自分の会社では、予定の管理にGoogleカレンダー、コミュニケーションツールとしてSlackを用いているため、いずれものサービスで該当者を検索することで、この意思決定の過程を把握できるように工夫をしています。

# 計画 ~ビジネス視点~

## 1. 提案のロジックのビジネス側への説明

上記のような準備で「サービスへの理解」を進めている際、関連する既存の自社サービスを改善できることに気づきました。そこで、改善提案のための**ロジックに過不足がないか**を確認する必要があります。今回は、上長に相談して確認作業を進めました。

また、今回の改善は、サービスに実質的には必要のないデータを保存しているテーブルや特定のデータを削除することでSQLの処理を高速化するというものです。ただ、エンジニア的には十分に合理性があるものの、特定のテーブルやデータを消すことが今回は**機能を削ること**を意味します。

そのため、その機能がなぜ必要がないのか、変更によりどの程度高速化されるのか、影響範囲と工数がどの程度なのかを踏まえて**ビジネス側へロジックを説明する**必要がありました。

## 2. 適切なタイミングでの改善提案

「改善提案のロジックがエンジニア側とビジネス側の双方にとって合理的である必要性」について前節では書きましたが、合理的であってもプロジェクトの進捗によってはタイミングが悪く良い提案でも採用できない場合があります。

ただ、自分の場合、サービスに関わる人の行動を注視していたため、ちょうどそのタイミングでそのサービスの**該当箇所の改修が求められていること**を知っていました。さらに、その時点では新しいアルゴリズムやDBなどを採用して解決するような提案しかなく、**時間的なコストが懸念点**となっていたため、自分の機能を削る改善提案の方が格段に工数が少ないことも踏まえて提案し、採用されるに至りました。


# 発見 ~より深淵へ~

## 1. トップダウン的な解決方法の学習

今回の改善提案は採用されたものの、場当たり的に問題を解決していたため、任意の場合へ適用するのが難しいです。したがって、事業戦略や組織論などのビジネス知識のインプットを行い、**トップダウン的な解決方法**も学んでいく必要があります。

まずはイベント等へ参加したりブログや本を読んだりといった一般的なインプットをし、それに並行して開発しているサービスのプロダクトオーナーを含むビジネス側と関わりを持って自分の会社に固有のインプットを進める必要があると自分は考えます。

## 2. 組織内での地位の上昇

一般的には、事業戦略や組織形態からトップダウン的にサービスの方向性が決まります。つまり、本質的な改善提案をするためには、サービスの方向性を決められる程度まで**組織内での地位を上昇させる**必要があります[^2]。

また、サービスにおける問題解決の前にエンジニアドリブンな組織に変えていくなどの組織的な課題を解決を要する場合が多々あるので、この部分も踏まえると、**組織内での地位の上昇**がより重要であると考えられます。

# 最後に

本記事では、自分が改善提案をするという経験により得た6つの教訓について紹介しました。

自分と同様にサービスの改善提案をしたい方の参考となれば幸いです。

[^2]: 自分の会社は一般的な階層構造を組織構造として採用しているため。
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「AzureへのARMテンプレートのデプロイ」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「AzureへのARMテンプレートのデプロイ」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure Resource Manager テンプレート構造を探索する](https://learn.microsoft.com/ja-jp/training/modules/create-azure-resource-manager-template-vs-code/2-explore-template-structure?tabs=azure-cli)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「Azure CLIによるAzureリソースの作成」](https://qiita.com/fsd-jume/items/52615a782a30548eedd3)

## AzureへのARMテンプレートのデプロイ
### ARMテンプレートのデプロイ方法
・ローカルテンプレートをデプロイ → 手動でテンプレートを実行
・リンクされたテンプレートをデプロイ → あるテンプレートと連動して実行
・CI/CDパイプラインによるデプロイ → 自動的にテンプレートを実行
　※一般的なパイプラインの2つの例：Azure Pipelines、GitHub Actions

### ローカルテンプレートをデプロイするコード例
・デプロイの名前(デプロイの管理用)：「testdeployment1」
・テンプレートファイル：「testdeploy.json」
　⇒デプロイのたびにパスを指定する必要がなくなるため、変数で定義しておくことを推奨
・デプロイするリソースグループ：「$RSGroup」(すでに変数で定義済みと仮定)
```powershell:PowerShell
$templateFile = "testdeploy.json"
New-AzResourceGroupDeployment `
  -Name "testdeployment1" `
  -ResourceGroupName $RSGroup `
  -TemplateFile $templateFile
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/5c1be7f1-7d61-cb7f-1a78-cb0554832a26.png)
**※コマンドの意味**
**・New-AzResourceGroupDeployment**
リソースグループにリソースを作成
**・「`」**
入力中に改行させるためのコマンド(省略する場合はすべて一行で記述)
**・Name**
デプロイを管理するための名前を指定
**・ResourceGroupName**
テンプレートをデプロイするリソースグループを指定
**・TemplateFile**
使用するARMテンプレートを指定

## 次の学習内容
**◆ARMテンプレートのパラメーターコード例**

https://qiita.com/fsd-jume/items/f6591a117e9d84b47b87

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
IoT技術者は、eDRX＆UDPサーバ で省電力化とレイテンシー向上の夢を見るか？

IoTデバイスからのアップリンク主体の通信モデルであれば、PSMで待機して必要最低限の送受信をするイメージで必要十分な省電力化が望める。

しかし、とある案件ではクラウド側でユーザーが操作した内容をできるだけ短時間にIoTデバイスに反映させる必要があった。

さらにバッテリー駆動＆長期連続運用など、省電力要件が厳しい要件だったので、
アップリンクのモデルよりもクラウドからのダウンリンク主体のモデルに切り替え、
IoTデバイスをUDPサーバーにしてeDRXをつかってひたすら受信待機する方法を思いついた。

PSMにしないのは eDRX に比べて１周期あたりの通信での消費電力が大きいため(mfr1.3.2時点。mfw1.3.3＆RAIでどうなるかは未検証)。

# 現実

結果から言うと、ダメだった。

理由は簡単。
低レイヤーで基地局と定期的に通信する必要があるからだ（30s〜40s間隔）。
移動体通信の宿命のようなものだ。
（PSMなら長時間スリープできるが、接続を再開するときの消費電力がバカにならない.とくにiDRXサイクル）

消費電力はキャリヤによってかなり変わる（KDDI＞＞＞＞DOCOMO>SOFTBANK）。
レイヤーは無関係に１回でも通信が行われると、単位時間あたりのアベレージ電流が跳ね上がる。

IoTデバイスをUDPサーバーにしたときのレイテンシーと省電力性能はとても優秀だが、
基地局との定期通信によって台無しになる。

キャリア次第だが、基地局との通信は３０秒〜４０秒間隔で行われるようだ。

気になった点は、Docomoで、40秒周期が同時に２つ観測された。
別の場所では40秒周期が１つだけ観測された。
近接する基地局の数によって変わるのかもしれない。
通信する基地局が１つ増えるだけで消費電力は格段に増えてしまう。


基板全体のアベレージ電流が200uA〜300uA程度まで許容できるなら上記の方法でも問題ないかもしれないが、
今回は 100uA でどこまでレイテンシーを向上できるかだった。

だが、KDDIですら、通信状態が良くても150uA程度が限界だった。
通信状態に大きく依存する（他キャリは通信状態が良くても200uAを軽く超える）。

結局、別のアプローチを試すことになった。

結論はまだでていないが、覚書として残しておく。

2022.12.19
アラフォー2児の母がAzure認定中級に挑む！AZ-104 ～ネットワーク編～

みなさんこんにちは。子育てしながらクラウド資格取得！ということで，アラフォー2児の母がAZ-104：Microsoft Azure Administratorに挑みましたので，ざっくりポイントをご紹介していきます。
モフママのAZ-104奮闘記第3弾。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/84ef4e53-ab92-89b2-69e8-293295a1fb7e.png)

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/9b0f6cd0-e3a2-55ab-4620-5c91f344301b.png)

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/19871a93-a0f9-140f-1cfb-97b39a1d93e0.png)

https://learn.microsoft.com/ja-jp/certifications/exams/az-104

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/09758da0-b87c-de92-5ace-132898040a5a.png)

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/162f4021-ddc8-cece-56c6-26e0245d337e.png)

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/d1cfb83b-6676-3835-75c3-8044c605ef3a.png)

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/fe59edc8-9946-ab35-032c-8bf124e6a5fd.png)

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/34ed58b5-913b-4d12-1f9c-cb2526534e45.png)

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/b1e0e6c5-af18-6d25-d8aa-da9a68e16dad.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/acc2ed32-d60e-5969-8136-809dd6bfb885.png)

https://learn.microsoft.com/ja-jp/azure/virtual-network/network-security-groups-overview

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/fd9d1e5e-7a4f-d462-87dc-fbf7a55d59e3.png)

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/9accd277-ed9c-b7bb-5701-9b16c52202ec.png)

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/e489e466-fcd0-e2d2-5e51-007d65233e67.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/27bc232c-2c1c-fb01-c038-79e9742034f8.png)

https://qiita.com/mofu_mother/items/02a0eb410fc3c761ad68

https://qiita.com/mofu_mother/items/3329e914b324216c8f38


---
- Microsoft Azure は，Microsoft Corporation の商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
Dockerイメージを使って JuliaでHello,worldする

Juliaを手っ取り早くdockerで動かす方法をまとめました。


# 対象読者
- Juliaに興味があるけど，文法とかよくわかってない人
- Dockerの操作がなんとなくわかる
- vscodeでDockerを操作することに慣れている

# 動作環境
- M1 MacBook Air


# JuliaのDockerイメージの用意
[julia - Official Image | Docker Hub](https://hub.docker.com/_/julia)
```sh
$ docker pull julia
```
# コンテナの作成と起動
```
$ docker run -it -d --rm --name=jl_container -v $PWD:/usr/myapp julia /bin/bash
```

# vscodeでコンテナを開く
VSCodeのDockerのプラグインの機能からGUIで`Attatch Visual Studio Code`を選択します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/91b8c440-85d3-8a7c-ee99-37d5445cf922.png)

新しいWindowが起動します。右下に以下のような表示が出ていれば，コンテナを開けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/9442b87f-c4ba-49cb-cb9c-34d0b1e63681.png)


# Hello Worldしてみる
3種類のHello worldを試してみましょう。


## JuliaのREPLモードでHello World
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/fdc67dcb-8337-7c4f-5126-1a9a194f1fd4.png)


## `.jl`ファイルでHello World
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/2de2b57b-5364-f451-257e-9bdb78b99d91.png)


## `.ipynb`ファイルを作ってJuliaでHello World




- コマンドパレット(`cmd`+`shift`+`P`)を起動して「Jupyter」と入力
- 選択してJupyter Notebookを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/1db9a780-0d0a-1759-79a9-c6059b7b73df.png)

- セルにコードを入力してHello worldします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/6ecc40a6-bb7d-130e-323c-6cad02022f13.png)


- **追記:vscodeのJuliaの拡張機能をインストールする必要があります。** これがなければnotebookの`Select Kernel`にJuliaが表示されません。
  - [Julia - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=julialang.language-julia)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950855/fe54550a-728c-529b-e54d-80cc20a6b381.png)


Hello Worldできました。これにてJulia+Docker+Jupyterの環境の作成は完了です！


# 終わりに
dockerfileを書けば，もっと良い環境がサクッと作れると思いますが，手っ取り早く環境を作りたかったのでこの方法に辿り着きました。あとはたくさんJuliaで遊びましょう！


# 参考

- [Julia + Jupyter + VSCode ](https://scrapbox.io/mix-juice-public/Julia_+_Jupyter_+_VSCode)
アラフォー2児の母がAzure認定中級に挑む！AZ-104 ～ RBACやらリソースあれこれ編 ～

みなさんこんにちは。子育てしながらクラウド資格取得！ということで，アラフォー2児の母がAZ-104：Microsoft Azure Administratorに挑みましたので，ざっくりポイントをご紹介していきます。
モフママのAZ-104奮闘記第2弾。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/3eaa78d9-07ae-13d4-c564-9259fbbb8e05.png)

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/aeeeec18-d736-c05b-1c5d-663211790e84.png)

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/435ca4cd-8c53-4950-1872-d92e626a59f1.png)

https://learn.microsoft.com/ja-jp/certifications/exams/az-104

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/4bf452d7-b7fc-8481-ec79-0625b1480ead.png)

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/723b67c4-930e-7e16-566b-94ef86be798b.png)

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/ddb4717c-a29d-0afa-268b-e5b7d0ce3082.png)

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/3fa95093-e097-9f3a-98a7-ec6932a2ce1d.png)

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/d1075f04-b735-1845-1f0e-cc445f4ca6b4.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/d46287ec-db53-d5bb-e170-61979fb55052.png)

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/0983a93f-98b4-883e-ff18-00cf713a1dc0.png)

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/12569fc4-d3e1-5661-161b-7d1de227474b.png)

https://qiita.com/mofu_mother/items/3329e914b324216c8f38

---
- Microsoft Azure は，Microsoft Corporation の商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
AWS Protonを触ってみる

# AWS Protonを触ってみる

社内で複数の開発環境を管理しテンプレートベースでアプリ開発者が柔軟に環境を落としあげできる検討が必要がだったのでaws protonを試してみました。

# ハマリポイント
テンプレートの名前とディレクトリの名前を一致させる必要がある

## ディレクトリの指定

- 環境テンプレートを新規作成する際、”環境 テンプレートバンドルディレクトリ”と”環境テンプレートの名前”はリポジトリのディレクトリと一致させる必要があります。
![Screen Shot 2022-12-08 at 11.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606196/548e3ed8-0262-3781-46c6-9ce9e83e0f0f.png)
この指定が誤っていると設定自体はできますが、作成後に表示されるテンプレートのバージョンが表示されないため、環境構築ができない状態となります。
![Screen Shot 2022-12-08 at 11.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606196/99bb8ae5-6a66-1bd7-0323-cdb9a6d3624a.png)
なおサービステンプレートを構築する際も同じ階層で一致させる必要があります。

- codebuildが失敗する
ハンズオンとしてはvpc-envとapprunnerを使ってました。
サービスを展開する際に指定するアプリケーションパスは当然ですが、アプリケーションソースコードがあるディレクトリを指定する必要があります。
![Screen Shot 2022-12-08 at 11.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606196/011f863b-df95-149d-3d16-5670a95e5dc8.png)

- apprunnnerのbuidに失敗する
apprunnerは日本のリージョンで非対応のため、protonの実行リージョンをus-east1に変更すること。
変更の際、テンプレートはゼロから作り直すことになります。。。
何を用いてNode.jsをインストールしたか確認する

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の19日目の記事です
:::

# 概要

- 自信が何のNode.jsのバッケージ管理ツールを用いてNode.jsをインストールしたのか確認する方法をまとめる。

# 情報

- 筆者はMacOSの端末を使用しており、MacのローカルのNode.jsのバージョン管理を何にでしたか確認する。

# 方法

- 下記コマンドを実行する。

    ```bash
    which node
    ```

- 下記の様に出力された。

    ```
    /Users/ユーザー名/.nodebrew/current/bin//node
    ```

- パスの中にnodebrewとあるのでnodebrewでインストールしたことが分かる。ここがnvmならnvmでインストールしていることになる。
若手エンジニア向け：会社説明会で気をつけたこと

みなさんこんにちは、「[CYBIRD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cybird)」22日目を担当する[@cy_ssss](https://qiita.com/cy_ssss)です。
21日目は[@kappysan](https://qiita.com/kappysan)さんの「[AR空間にプレゼントを贈ってみた](https://qiita.com/kappysan/private/91e5ab8e02f7f869cfb4)」でした。
難しそうな印象のあるARも、パッケージを活用すれば比較的簡単に実装できるんですね！

# はじめに
簡単に自己紹介をさせていただくと、私は新卒2年目のマルチエンジニアです。
サーバー・クライアント・アプリの作業を反復横跳びする日々ですが、今回は技術的なものではない少し変わり種の記事でお送りさせてください。

さて、皆さんに質問です。

**資料を書いたり人前で話すことは得意ですか？**

「エンジニアには関係ないだろ！」と言いたくなる方もいるかもしれませんが、実際エンジニアであってもこれらのことを求められる場面というのは存在します。
いくつか存在するそんな場面の一つが、 **学生向けの会社説明会。** 
会社によっては人事のみが担当するということもあるでしょうが、サイバードでは若手エンジニアも自身の母校での説明会に参加するなどの機会があります。
そういった縁がなくとも、現場の話をするために参加することになるエンジニアもいるのではないでしょうか。

そんな時どんな資料がいいのか？どんな話をしたらいいのか？
幸いにも学生時代オープンキャンパスのスタッフとして参加者への応対を多く経験し、また母校での会社説明会にも参加させていただいた身として、気をつけていたことを書かせていただければと思います。

# 資料の作り方編
近年の説明会は開催の形態も様々です。
オンラインかオフラインか、単独の会社説明会か合同企業説明会への参加か、環境によって最適解は異なります。

#### オンラインの時
多くの場合、画面共有で資料を投影しながら話す形になるかと思われます。
その場合、資料を作りながら実際の見え方が確認できるのは利点と言えますね。
ですがスマホからの参加者がいる可能性も0ではないので、あまり細かい文字やびっしりとした文章ではない方がいいかもしれません。

また対面と違い反応を見ながら進行しにくいですから、手元に原稿を用意する場合はあえて空白改行などを入れておくと、話すときに間を置く意識を持ちやすいと思っています。

#### オフラインの時
問題はこちらです。
部屋の前方に投影するのか？その時のサイズは？部屋の広さは？
細かい文字やびっしりとした文章が好ましくないのは、オンラインでの説明会と変わりません。
その上でぜひ、投影した内容を印刷した配布資料を用意することを推奨します。（配布が可能かは事前の確認を！）
用紙を縦、配布資料（2 スライド/ページ）で印刷するくらいが、小さくなりすぎずメモも残しやすいかと思います。
![スクリーンショット 2022-12-06 11.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294439/5609bf87-041a-821f-0bd5-4b817802c018.png)

#### 共通して言えること
上で例に載せた資料に色々書きましたが、この手のは「スライド　デザイン」などで大量に出てくるので調べた方が早いです。
あとは実際に話す内容の内「主題」と「キーワード」を話の流れに合わせて載せれば、凝らなくてもシンプルで見やすい資料になる！……気がします。

# 説明会で話す内容編
ここからが本題です。

話す内容≒資料に載せる内容とも言えますね。
会社の説明は自社HPにある程度載っているでしょうし、採用担当者も話すはず。
では、どんな内容がいいでしょうか？

例えば「就活の心得や自分の就活時の実例」
人それぞれに経験は違いますし、一例を知れるというのは悪くないでしょう。
ですが、色々なところで聞ける話でもあります。

では、ここでしか得られない情報はなんでしょう？
多くの学生は社会人経験がありません。
経験がないことというのには不安がつきまとう物です。
事実私も、入社するまでは社会人として生活している自分のイメージがつきませんでした。

そこで私が話す内容として勧めたいのは **「実際に内定から入社、現在の業務にあたるまでの流れ」** です。
もちろん年毎に変化することもあるでしょうが、この部分は変わるかも・変わらないことが多いなど伝えられれば不安を解消する

説明会の形態次第では自分の職種以外を志望する学生と話す可能性もあるかもしれません。
そんな時のために別職種の例についても、同期やチームの人などから情報を聞いておけると臨機応変に対応できると思います。
最初に簡単に志望職種のアンケートを取ると、アイスブレイクにもなるのではないでしょうか。

#### おまけ
以下は母校の就活年次生に直接聞いた、「こんなことが知れたら嬉しい！」話です。
`・平均的な残業時間`
`・リモートワークの可否や状況（週に何日は出社など）`
`・副業の可否`
`・あったほうがいい資格（IT系など）`
`・選考の方法(作品or課題、面接が何回かなど)`
`・研修内容や流れ`
`・入社1~3年での仕事の変化`
`・面接で見てること`
`・福利厚生`

学生からは質問しにくいことも多いので、こんな話ができると喜ばれるかもしれませんね。
どこまで話していいか関係者への事前確認はもちろん必要ですが！
※話しすぎて怒られた場合の責任は取りかねます

# おわりに
長々書きましたが、一番は「相手の知りたいことが何かを考える」に尽きるのかなと思います。
当時の自分を思い返したり身の回りの人に聞いてみたり、方法は様々なので志望者が増えるように工夫してみませんか？
母数が増えればそれだけ魅力的な人が来る可能性も上がる……はずです。

明日23日目は[@R_arai](https://qiita.com/R_arai)さんの「VS Codeに PlantUMLを入れて設計書を作った シーケンス図編」です。
VSCodeユーザーの方はお見逃しなく！
SaaSを利用して感じたこと

[Ateam Finergy Inc.× Ateam CommerceTech Inc.× Ateam Wellness Inc. Advent Calendar 2022](https://qiita.com/advent-calendar/2022/finergy-commerce-tech-wellness)の17日目は株式会社エイチームウェルネス　@msm_2が担当いたします。

# はじめに

私が所属するエイチームウェルネスではD2C事業を多くのSaaSを使用しながら運営しています。
利用しているSaaSとしては出荷発送やカートなど多岐にわたります。
利用する中で考えたことを記載していきます。

# SaaSを利用する利点

SaaSを利用することで、世の中にすでにあるものを有効活用できるようになります。
例えば、配送システム1つとっても、倉庫からお客様へお届けするまでの間に様々なシステムやサービスが関わっていきます。
これまで参入したことがない事業の場合は、業務ロジックの洗い出しができず1から構築する場合に莫大な時間とコストがかかってきます。
SaaSを利用することで1から作るよりも早くサービスを開始できます。また、業務ロジックも一般的なものに沿うことができ１から構築するよりも早く構築でき効率化にも繋がります。

# SaaSを利用する欠点

SaaSを利用する利点にもなりますが、SaaSサービス提供者側の定めた使い方をする必要があります。
定められた使い方をすることにより、世の中の広く一般的な定義に従った業務ロジックを利用できる反面。逸脱した施策を実施出来ない、運用野複雑化につながる場合があります。
また、自社でコントロールできることが減るため、機能追加や変更などをサービス提供者側のスピードに依存するためスピード感が落ちてしまう場合もあります。

# 私が選定するときに意識していること

私が選定するときに意識していることとしては2点あります。
* 使用するシステムが必要十分な機能を備えてるか
* セキュリティのリスクがないかになります。

## 必要十分な機能を備えているか
機能が多すぎず少なすぎないことを意識しています。
機能が少ない場合はやりたいことが実現できず、逆に多すぎる場合は機能を使い切れず払っているコストに対して見合ってない事が考えられます。あれもできる、これもできるは大切ですが、自分たちの組織の身の丈にあったシステムかは考えるようにしています。そのため導入前には目的とその背景、その機能がどう使われるのかをヒアリングするようにしています。

## セキュリティのリスクが無いか
セキュリティ上の問題がありデータ流出などが起きてしまった場合は、自分たちから見た場合はSaaS提供者の問題ではあるが、お客様から見た場合はサービス提供者側の問題となります。自分たちが提供するサービスをお客様が安心して使ってもらえるように、リスクがないかどうかは見ています。
その上でどのようにシステムが連携しているか、IDやパスワードの管理がどうなっているか、権限の範囲はどこまで見ることが出来、誰が管理するのかを定め運用しています。

# 私が使うときに意識していること

SaaSが定めている使い方を逸脱しないように意識しています。
仕組みを使いうまく設定すればできることを極力行わないようにしています。
設定すればできることもありますが、業務ロジックが複雑になってしまい今後数年かけて運用上の負債に繋がります。
その中で、どうしても事業上必要になり実施するものがあります。
実施する場合は最小でかつ撤退しやすい大きさで利用するようにしています。
手戻り出来ないようなすごい運用を避け早く実施し早くFBを得られる大きさを意識しています。

# まとめ
SaaSの発達によってサービスの構築が高速化されているように感じます。また、一定の業務ロジックの標準化にも繋がりとてもいいと感じています。
利点欠点を意識して今後も使っていきたいと感じています。
【CONEXIOBlackBearでこんなことをやってみた】Webカメラの画像を取り込んで処理してみた！

# Webカメラの画像を取り込んで処理してみた！
昨今AIが進化するなかで、画像解析技術が注目を集めています。ビジネスシーンにおける導入事例も増加しており、今後の発展にも大きな期待が寄せられている分野です。「画像解析に興味はあるけど、実際にどうやってやるのかがわからない」そんな方も多いのではないでしょうか。

今回は[**CONEXIOBlackBear**](https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita)とWEBカメラを使って、
簡単な画像解析を行ってみましたのでご紹介します！
# 画像解析の流れ
今回は[**CONEXIOBlackBear**](https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita)に接続したWebカメラから取り込んだ画像を、**画像認識ライブラリー「OpenCV」を用いて解析**します。

OpenCVは、正式名称「Open Source Computer Vision Library」と言います。その名が表すとおり**画像処理、画像解析および、機械学習などの機能を持つオープンソースのライブラリ**です。各種プログラミング言語(Pythonをはじめ、C/C++、Javaなど)用に、インターフェースが公開されています。

今回の具体的な画像解析の流れですが、以下の機能を持つWebアプリを作成し、画像解析の一つ<strong>「テンプレートマッチング」</strong>を行います。プログラムの詳細な掲載、解説は行っていないのであらかじめご了承ください。

　・ストリーミング機能 (Webカメラで映した映像をWebアプリ上で表示)
　・テンプレート画像撮影機能
　・テンプレートマッチング画像撮影機能
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/54e7b987-fbb5-eb67-bfae-f30242cac927.png)
# 画像解析の準備標準装備
1. **OpenCV、Pythonのセットアップ**
[**CONEXIOBlackBear**](https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita)では、OpenCV、Pythonがプリインストールされており、すぐに使用できます。※OSのバージョンによって、これらのライブラリのバージョンは異なる場合が有ります。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/7a432de3-7752-b244-3432-81def37abea1.png)

# 画像解析(テンプレートマッチング)の実施
「テンプレートマッチング」とは、**画像の中から”テンプレート画像”と類似した部分を探し出す画像処理**のことです。今回は、作成したWebアプリの機能を使って、このテンプレートマッチングを行った画像表示を行います。OpenCVでは、これらの機能を**少なく簡単なコードで実装**することができます。
1. **テンプレート画像、マッチング画像撮影**
**Webカメラで映した映像をWebアプリ上で表示**します。(ストリーミング機能)
カメラを調整し、**「テンプレート画像撮影」ボタンをクリックして撮影**します。(必要に応じて、トリミングなどを行って解析しやすい画像を作成します)
再度、カメラを調整し、**「テンプレートマッチング」ボタンをクリックして撮影**します。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/b57c0123-01bb-7008-633d-50ffdee456d4.png)
2. **テンプレートマッチング結果確認**
Webアプリ上で**テンプレートマッチング結果を画像で確認**します。
テンプレート画像に**類似した部分を抽出して赤枠を描画**することができています。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/c4cdfb1e-e5f7-58b0-5298-d182beed17fd.png)
今回、掲載ページの都合上、載せることはできませんでしたが、**実装したプログラムは全体で100ステップ程度と少ないコードで実装**することができます。例えば、画像マッチング処理を行うプログラムは、たったこれだけで実装できます。簡単ですよね！
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/8d3bc7dd-e3c3-72fa-d0f7-a962eb97c2f5.png)
OpenCVを使った画像解析の例をご紹介しました。今回はテンプレートマッチングだけのご紹介となりましたが、**製造ラインでも製品の外観検査などに応用**されている、とても役に立つ技術です。OpenCVも他のライブラリと組み合わせて、**人の顔の検出など多くのことができる**ようになっています。応用的な画像解析やWEBアプリ実装などについても、またの機会にご紹介できればと思います！
Gatherにアイスタイルオフィスを再現してみた

## はじめに
[アイスタイル Advent Calendar 2022](https://qiita.com/advent-calendar/2022/istyle) 20日目の記事です。

こんにちは。最近コーヒーにハマりすぎてとうとう先日家で焙煎をしてしまったshinohararです☕

新卒２年目でアットコスメ(WEB)の担当をしています。

突然ですが最近出社してますか？
僕は月に１回くらいですかね。

コロナ禍以降在宅で働く方が多くなったと思います。
気分だけでも出社して働けたらいいなと思い...
#### **\ Gather.Townにアイスタイルのオフィスを再現してみました🎉 /**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/ef9c183d-2577-9954-c7c3-6d0052a87108.png)

あまり出社していなくて記憶が曖昧なので、実際のレイアウトと少し違くても許してください笑
Gather.Town（以降Gather）には実際に業務でも使えそうな便利機能がたくさんあったのでマップと併せて紹介します！

▼ アイスタイルのオフィスの雰囲気を知りたい方はこちら
https://blog.istyle.co.jp/post/1137

▼ Gatherについて詳しく知りたい方はこちら
https://www.gather.town/

## 使い方
### 🎧 会議室
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/daf6deef-fbef-0a04-4a27-a6525829fbe0.png)
Gatherでは基本的には他のユーザーと近づくことで会話ができるのですが、プライベートエリアを設定するとその範囲内にいるユーザー全員と距離に関係なく会話ができるようになります。
逆に距離が近くてもお互いが同じプライベートエリア内にいなければ会話することができません。
この機能を使って会議室のような空間を作ることができます。

さらに会議室に鍵をかければ承認されたユーザー以外は入ることができなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/bb23cd10-de03-2ac3-40fe-70f59df32206.png)

### 💻 個人作業スペース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/81649e6b-188e-c755-cec7-2fdb942196cf.png)
集中して作業したい時はひとり用プライベートエリアがオススメです。
一緒に仕事してる感を味わいながら作業することができます！

Gatherではウィンドウのフォーカスが外れるとマイクとカメラが自動でオフになるので、作業中の顔がずっと映っていたという最悪な事故を防ぐことができるのも嬉しい機能ですね！

### 📢 スポットライト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/ad5e0a73-5bf6-c642-cd80-9f95e494e676.png)
同じ空間にいる全ユーザーに対して音声を届けることができます。
僕のグループではGatherで飲み会をすることが多いので、集合をかけるときに便利だなと思いました！

### 🎮 プレイルーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/9580984e-f89a-da51-d1e3-f85f14dae19b.png)
アイスタイルにはプレイルームという部屋があります。
実際にはゲームをする部屋ではありませんが、仮想空間くらい会社でゲームしたいですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/1e31aa6a-8fd5-7349-8e58-6b8f2a689df3.png)
操作が難しい...w
Gather内でゲームができるので昼休みや息抜きによさそうです！

### 🤩 エモート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/edb441f4-2218-eb71-07de-c8b1e385bb14.png)
画面左下からエモートを行うことができます。
音声をオンにしなくても軽いコミュニケーションが取れていいですね！

### 💡 隠しコマンド
- [z]キー：ダンスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/63ff9143-476f-53b6-0c45-0200510180e3.png)

- [f]キー：クラッカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/2837c4e9-8da7-6747-e07b-533bc3cf32cd.png)

他にも面白いコマンドが隠されてそうですよね。
見つけた方はぜひ教えてください！

## まとめ
今回はGatherにアイスタイルのオフィスを再現した話を紹介させていただきました。
仮想オフィスを使って在宅ワークが快適になればいいなと思います。

もうすぐクリスマスなのでツリーを飾ってみました🎄
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102273/0aee7a97-1e47-978a-138a-5d543b942c53.png)
取引先責任者のスクリーンフローで姓名の項目が表示されない

+ [元の質問](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfbCw)
+ [組織内の一致する取引先責任者の確認](https://trailhead.salesforce.com/content/learn/projects/build-a-simple-flow/check-for-a-matching-contact-in-your-org?trailmix_creator_id=smartbridgesupport&trailmix_slug=developer)

質問者さんの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/483ac2d6-13c8-cfc1-88ea-8698e7879785.png)

私の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a1b7c596-37f8-11f7-c99a-e2380a663ce7.png)

別のプレイグランドではできたらしい。何で？

:::note
It's showing the first and last name after i changed the playground.
:::
もくもく会開催（参加）駆動学習の習慣化

# もくもく会開催（参加）駆動学習とは？
connpassに毎日もくもく会を登録し、  
強制的に学習習慣を継続させる学習方法  
又は、  
自分に合う定期的なもくもく会や勉強会に参加することにより、
定期的な学習習慣を身につける学習方法

# もくもく会や勉強会に参加する事によるメリット
- 強制的な勉強時間の確保・習慣化
- 勉強仲間を増やせる
- 各々が好きな勉強に時間を費やせる
- 毎日の生活リズムの固定化
- 一度習慣化させると、毎日の歯磨きの如く、やらないと気持ち悪くなる
- 毎日の勉強時間の積み重ね
- 教え合える
- 勉強を続けてきたという自信の積み重ね
- 毎日のリズムが最適化される
- 初心者から上級者まで皆が参加できる
- 成長スピードの増加
- モチベーションの維持

# もくもく会や勉強会を開催する事によるデメリット
- 主催時のメンバ集めの難しさ
- 時間帯を私は夜に設定したため、眠い。。
- 最近始めたばかりなので、現在は一人でモクモク

# 既存のもくもく会や勉強会に参加する事によるデメリット
- テーマや時間帯を自分で指定できない
- 自分にとって最適な会を探すことは意外に難しい

# もくもく会や勉強会に参加してアウトプットを行っていく事の重要性
- アウトプットを意識することで、体系的にインプットできる
- フィードバックを貰うことで、よりアウトプットを洗練させて行くことができる
- アクティブラーニングの重要性、教えあうことによる学びの深さ

![0ea29d8f881f6a909ceccb47961eaeae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073942/bae134e8-dd8a-9499-9b39-e959e366ebc0.png)

# 今後の展望
- 将来的には集まったメンバで、共通の勉強課題を進めていきたい
- 派生した会を作り、もくもく会の他にも輪読会など、勉強の輪を広げていきたい
- まずは３６５日の開催を目指したい

# 私が主催している毎日のもくもく会に参加いただける方はこちらへ！
https://yorukatsu.connpass.com/

# 主催者側に自分も回ってみたいという方は、こちらから新規イベントを開催ください。
https://connpass.com/dashboard/

# まとめ
- エンジニアにとって、もくもく会や勉強会に参加することは日常的な勉強法です。
- そのため、会に参加して知識を得ること以外にも、定期的な勉強会に参加することにより、勉強の習慣化も実現できます。
- また、自分に合う勉強会が無ければ、自分好みの勉強会を開催することも自由です。

是非とも、皆さんがもくもく会や勉強会を通して、定期的な学習習慣の形成や自身の成長に繋げていって頂けますと幸いです。

# その他
毎日草を生やし続けますと、転職時に企業様にモテモテ生活を送れますよ♥
※女性エンジニアにもモッテモテ！？

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313230313331352f34356262623538362d626437662d303663352d323432312d3836326262326261653430302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073942/0db88a87-4222-c567-137c-85557e4e9186.png)
ユーザーのログインがログイン履歴と監査証跡に記録されない (または消去される) 可能性はありますか

よく理解できない現象

+ [ログイン履歴への参照 その２](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JfbDBSAZ)

代理管理者に登録することで上位ロールユーザが下位ロールユーザのログイン履歴を見えるようになりましたが、それでも上位ロールユーザが見れない、下位ロールユーザのログイン履歴が発生することはありますでしょうか

例：
LoginHistoryオブジェクトに下位ロールユーザP1のログイン履歴が十件あります。
システム管理者で登録すると設定のユーザ画面からログイン履歴10件、全部確認できます。
P1の上位ロールユーザでかつ代理管理者に登録しているP2で登録すると10件中７件は確認できますが、３件は表示されないです。

# 似たような質問

+ [Logins not recorded in login history or audit trail??](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7ezvSAB)
+ [How to allow non-administrator to see users login history?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A86GwSAJ)
+ [Missing account history](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8bbNSAR)
【Python+Flask】しりとりAPIを作ろう #3 ~しりとりAPI完成

# はじめに

この記事は第3回目です。
前回は[【Python+Flask】しりとりAPIを作ろう #2 ~しりとりプログラム作成](https://qiita.com/Bana7/items/192d8eee7a73938d477b)を参照してください

前回はしりとりプログラムを作成しました
今回はそのしりとりプログラムをFlaskを用いてしりとりAPIにします

# 環境

Dockerを使います
Docker DesktopもしくはDocker composeを使えるようにしておいてください

# 実際にやってみよう

最後にGithubリポジトリのURLを貼っているので良かったら参考にどうぞ

## フォルダ構成

```terminal
.
├── app
│   ├── output.txt
│   ├── server.py
│   └── siritori.py
├── docker
│   ├── Dockerfile
│   └── requirements.txt
└── docker-compose.yml
```

## dockerフォルダ内

Dockerfileは安定のマルチステージビルド

```dockerfile:docker/Dockerfile
FROM python:3.9-buster as builder
ENV PYTHONUNBUFFERED=1
COPY /docker/requirements.txt /
RUN /usr/local/bin/python -m pip install --upgrade pip \
  && pip install -r requirements.txt --no-cache-dir

FROM python:3.9-slim-buster
ENV PYTHONUNBUFFERED=1
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages/
RUN adduser myuser && chown -R myuser home/myuser
USER myuser
WORKDIR /home/myuser/app
CMD ["python", "server.py"]
```

他のライブラリを追加する場合は`requirements.txt`に追加します

:::note warn
`docker compose build` を忘れない
:::

```text:docker/requirements.txt
flask
```

## docker-compose.yml

```yaml:docker-compose.yml
version: "3"

services:
  app:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    volumes:
      - ./app:/home/myuser/app
    tty: true
    restart: always
    ports:
      - 5000:5000
```

## appフォルダ内

output.txtとsiritori.pyは前回作成しました

:::note warn
レスポンスはユースケースに合わせる
:::

```python:app/server.py
from flask import Flask, Response, request
from siritori import Siritori, FlagType

app = Flask(__name__)
siritori = Siritori("output.txt")

@app.route("/siritori", methods=['POST'])
def index():
  global siritori
  data = request.get_json()
  text = data["noun"]
  next_noun, type = siritori.return_nextnoun(text)
  if type is FlagType.USER_WIN.value:
    next_noun + "\nあなたの勝ちです"
  elif type is FlagType.USER_LOSE.value:
      next_noun + "\nあなたの負けです"
  return Response(response=next_noun, status=200)

@app.route("/init", methods=["GET"])
def init():
  global siritori
  siritori = Siritori("output.txt")
  return Response(response="しりとり" ,status=200)

if __name__ == "__main__":
  app.debug = True
  app.run(host="0.0.0.0", port=5000)
```

| エンドポイント | 概要 |
|:-:|:-:|
|  /init | 初期化|
| /siritori |しりとりする|

## 実際に遊んでみよう！

まずはコンテナを立ち上げます

```terminal
$ docker compose build
$ docker compose up -d
```

次に`curl`で試します

流れとしては以下の通りです
1. /initを叩く
1. ゲーム終了まで/siritoriを叩く

```terminal
$ curl localhost:5000/init
しりとり
$ curl -X POST -H "Content-Type: application/json" -d '{"noun": "りんご"}' http://localhost:5000/siritori
ごんげん
「ん」がついたのであなたの勝ち
```



# 最後に

全3回に分けてしりとりAPIを作成しました
APIなのでさまざまなユースケースに対応しているので実装してはいかがでしょうか

入力が`ひらがな`のみ対応している
漢字やカタカナを入力したい場合はgooさんが提供している`ひらがな化API`を用いた方が良いだろう

https://github.com/Aruminium/siritori

## 1回目
https://qiita.com/Bana7/items/4f7009e33f0ffbb9f275
## 2回目
https://qiita.com/Bana7/items/192d8eee7a73938d477b