OmniAICreator/Qiita-1.07M huggingface dataset:
The Erlang Runtime Systemの紹介と2023年の(希望的な)抱負

# はじめに
皆さん、ご無沙汰しております。
Elixir界隈の富樫ことGsannです。昨年・今年はほとんど沈黙しておりました。
活動を再開しようと、重い腰を上げていこうとしているところです。

# 本題
[The Erlang Runtime System](https://blog.stenmans.org/theBeamBook/) というのがあります。
Erik StenmanというErlangプログラマの方が書かれたものですが、Erlang(Elixir)のランタイムシステムについて詳細に網羅されています。

これは [zacky1972さん](https://qiita.com/zacky1972)からご紹介いただいて、以前は彼とともにこちらのペーパーをゼミ形式？対話形式？で内容を深めていました。（私が追いついていくのがやっとで、対話になっていたのかが怪しいですが）

いつの間にかその活動が中止？休止？してしまい、それと同時に本業の忙しさに負けてモチベーションが上がらなかった、というのが今思えば私が富樫化した経緯です。

さて、以降は全部で21章のうち最初の5章について、コメントをしていきます。

## 1. Introducing the Erlang Runtime System
専門書によくあるイントロ。
このペーパーで何を学ぶのか、おおよその概観と概要を記載している。
Erlang Runtime Systemのことを、以降「ERTS」と表記していたりする。
この章では特に、HWやVMの上にどのようなlayerでERTSが構成されているのかが記載されているので確認するとよいかもしれない。

## 2. The Compiler
コンパイラについて。
ErlangのコンパイラがどのようなプロセスでNativeCodeを生成しているのかを記載している。
特にFigure6にそのプロセスが記載されているので、確認するとよいかもしれない。
また、各プロセスでどのような操作を行っているかも記載されている。

## 3. Processes
ERTSで扱うプロセスについての話。
プロセスとは何か、という話から始まって、プロセスをErlang上で確認する方法の紹介や
プロセスがどのような要素を構成してメモリ上に現れるのかが記載されている。
また、プロセス間でメッセージのやり取りを行うことについても言及されている。

## 4. The Erlang Type System and Tags
型システムとタグについての話。
Erlangは強い動的な型付け言語であると言及している。
動的な型付けなので、コンパイル時には型チェックを行わず、実行時に型チェックを行う。
(Javaをやってきた私としては、コンパイルするんだったら静的に型付けしてくれよ…とは思う)

Erlangではデータ(term)に型のタグをつけることで、実行時に型をチェックする。


## 5. The Erlang Virtual Machine: BEAM
真骨頂である、BEAMについて。
BEAMの特性は、

- レジスタマシン
- ノンプリエンプティブ
- 直接スレッド化
- ガベージコレクション

で、それぞれの特性について説明されている。
通常、マシンはスタックを使用して演算を行うが、BEAMはレジスタを使って演算を行う。
例えば、レジスタに関数の戻り値や引数を格納する領域を確保したりしている。

また、通常はスレッドやプロセスがプリエンティブにスケジュールされているが、BEAMではノンプリエンティブスケジュールになっている。
例えば、Erlangのような動的メモリ管理とタグ付き値を持つ言語では、実行中のメモリにタグなし値がないときだけプロセスが終了するような実装にすることができる。

# 雑感
もともとは、私が「BEAMって何をしているんだろう、でもオリジナルのBEAMのソースコード見てもわからないな」という呟きをzackyさんが拾っていただいて、紹介いただいたものでした。
おかげでBEAMについてはある程度、雰囲気レベルではありますが理解は深められたと自覚しています。
ただ、事細かに紐解いて理解する、というレベルには至っていないというのが現状です。
紹介いただいたのにもったいないな、というお気持ちをこのような形で吐露するのにも時間がかかった、というのもある種罰当たりなところがあります。時間が過ぎてしまっただけだなぁと後悔しているところです。

# これまでではなく、これから、2023年について
来年、2023年はもう少しElixirコミュニティに関りを増やしていこうかと思っています。
また、zackyさんから紹介いただいた本ペーパーについて慎ましく静かに翻訳でもしていこうかな、と考えています。

ただ、「翻訳しても中身がわからない」という事態は往々にしてあると思います。その際は、どうか皆様の温かいご助力をいただけますと幸いです。
【Laravel Sail】migrateできないエラー：SQLSTATE[HY000] [2002] No such file or directory


現在、エンジニアを目指して学習中です。

Sail環境でマイグレーションを実行しようとしたところ、
エラーが発生したので、メモしておきます。

## 環境

・PHP 8.1.13
・Laravel 9.3.12
・MySQL 8.0.31
・Docker 20.10.2
・Laravel Sail

## エラー内容

Sail環境で、マイグレーションを実行しようとしたら、エラーが発生。
```bash
sail artisan migrate
```
```
   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = プロジェクト名 and table_name = migrations and table_type = 'BASE TABLE')
```

指定のファイル・ディレクトリが見つからず、SQLを実行できないというエラー。
つまり、データベースとの接続がうまくいっていない。

## 確認したけど効かなかったこと

### 1. `config/database.php`の`unix_socket`の設定
これは正しく設定されていた。

```config/database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'DBname'),
            'username' => env('DB_USERNAME', 'hoge'),
            'password' => env('DB_PASSWORD', 'hogehoge'),
            'unix_socket' => env('DB_SOCKET', '/var/lib/mysql/mysql.sock'),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : []
        ],
```

### 2. `.env`ファイル
この設定も問題なし。

```.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=DBname
DB_USERNAME=hoge
DB_PASSWORD=hogehoge
```

### 3. コマンドライン上で`sail mysql`の実行
MySQLには入れたので、接続も正しくできている。



## 原因

上述したunix_socketを設定してしまっていたことが、逆に今回の原因。
MAMP環境ではunix_socketを設定していたので、
そのまま設定していたが、コンテナ環境の場合には要らないらしい。

https://stackoverflow.com/questions/67659528/laravel-sail-sqlstatehy000-2002-no-such-file-or-directory

>Because you are trying to connect to DB container via socket from different container.
>There are two separate containers - Laravel and MySQL. Thinks of it like two separate servers.
>When you have both unix_socket and db_host in env, you are telling laravel to connect to db at specified host via unix_socket. That is why it didn't work.
>When you update the unix_socket env, laravel try to connect to DB via TCP and it work.

unix_socketとdb_hostの両方を設定すると、unix_socketが優先されるが、
unix_socketでは二つのコンテナ間をうまく通信できないらしい。
だから、コンテナ環境の場合はunix_socketの設定は不要。

```config/database.php
'mysql' => [
            //　必要な部分周辺以外略してます。
            'database' => env('DB_DATABASE', 'DBname'),
            'username' => env('DB_USERNAME', 'hoge'),
            'password' => env('DB_PASSWORD', 'hogehoge'),
            // unix_socketの第二引数を空に変更
            'unix_socket' => env('DB_SOCKET', ''),
        ],
```
これでマイグレーションが実行できるようになりました。


ソケットについては[こんな記事](https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748)が。
通信、ネットワーク系の勉強もしていかないとなあ。。


## 参考

https://qiita.com/I-201/items/bfb4c216da196247e369

https://zenn.dev/kota111/articles/da3b9ccff4dc56712f4a

https://stackoverflow.com/questions/67659528/laravel-sail-sqlstatehy000-2002-no-such-file-or-directory
クラウドログ開発チームに在籍して１年を振り返ってみる

[クラウドワークス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/crowdworks) の22日目の記事です。

はじめまして、「クラウドログ」でエンジニアをしています武田です。
久々の技術記事が書ける！！と意気込んでいたのですが、体調を崩してしまい・・・時間やボリュームを考えた結果、本来書きたかった記事は別の機会としました。
今回自身の振り返りも兼ねてこのような記事を書いてみようと思いました！

# はじめに
この記事は **魅力を感じて入った開発チームを1年経って振り返るとどうなのか？** という記事になります。
振り返って純粋に感じてることを書いていければと思っています。

# ぜひ読んで欲しい方
![対象者.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335934/fa978685-cf6d-6446-7bcd-ed7f1ea28148.png)
* クラウドワークス、クラウドログに興味を持っている方
* お客様先で開発を行っていて、私と同じことを感じたことのある方


# クラウドログって？
「クラウドログ」は「時間を記録し、未来を豊かに」をサービスビジョンとして、GoogleカレンダーやMicrosoft Ofiice365との連携機能などにより、日々どんな業務にどのぐらい時間を使っているのかを個人やチームごとで見える化し、個人やチームの働き方を変革するプロダクトです。

要は **工数管理を行うSaaS** です。
皆さんがSaaS, 自社開発ツールやExcelで日々入力されているであろう工数を扱っています。

https://www.crowdlog.jp/

# これまでの自身の経歴
前職でもエンジニアをしており、**お客様先で開発を行うスタイル**でした。
そのため、仕様・要件・採用している技術スタックや開発フローも様々でした。
* Androidアプリの開発を検討している。実際にプロトタイプを作って欲しい（サンプルコードなし、技術選定から）
* センサーデータを可視化するWebサービスの開発して欲しい
* Windowsアプリ上で3Dデータを加工したり、取り込んだりするアプリの改修をして欲しい

等、特にWebに特化しているわけでもなく、プラットフォーム・言語・その他機器が絡むかどうかすらもバラバラでした。
その分、様々な経験を積めたのが非常に良かったと思っています。


# なぜクラウドワークス（クラウドログ）へ転職したのか
まず、現状に対しての大きなネガティブ要素はありませんでした。
しかし、転職自体を考えたきっかけとしましては、シンプルに下記のようなものでした。

:::note info
サービスがどのように成長していくかの部分に関われない
:::

お客様先で開発を行う方であれば感じたことがあるのではないでしょうか？

そういう想いの中カジュアル面談や選考を進める上で、クラウドワークスのミッションである **個のためのインフラになる** に共感し、クラウドログのこのような部分に魅力を感じ、転職を決めました。
* **サービスの成長に積極的に関わっていける**
* **日本・フィリピンメンバーが１つのチームで開発を行っている**
* **「工数」という多くの人が関わるであろう非常に興味深いドメインを扱ったサービスである**

これが今年の初めの転職時に感じていたことですが、今振り替えてみるとどうなのか？というと。

# 約1年経って振り返ってみる
約１年経って、転職時に魅力を感じた部分を振り返ってみるとこのようになりました。

### サービスの成長に関わっていける
**ガッツリサービスの成長に関わっていけている**
前職と異なり、関わる領域が広まったことでガッツリとサービスの成長に関わっていける環境となりました。
小さな仕様の議論から、機能の存在意義についてもビジネス＆開発で検討することも少なくありません。
日々そのような会話をしながら開発に携われる楽しさを実感しています。

### 日本・フィリピンメンバーが１つのチームで開発を行っている

**思った以上に英語を使う機会が多く、それなりの大変さがありつつも楽しんでいます！**
基本的にフィリピンメンバーが参加しているイベントは全て英語でやりとりしています。
そのため、英語の学習促進のために学習者で集まって、学習についてを語り合う「English assmble」を開催したりもしています。

開発では仕様の背景や説明を英語で行う必要があり、できる限り情報の非対称性がないように努めています。
また、スクラムチーム内のコミュニケーションの一環として、デイリーミーティングに「Good news」を取り入れていますが
最近では下記のような会話もあり、異文化コミュニケーションを交えつつ楽しんでいます。
* 日本メンバー   : KFCのチキンの予約済ませたよ！
* フィリピンメンバー: 日本ではチキンをクリスマスで食べるのが一般的なの？
* 日本メンバー   : 食べる人多いよ、フィリピンは違うの？
* フィリピンメンバー: ハム食べてるよ

### 「工数」という多くの人が関わるであろう非常に興味深いドメインを扱ったサービスである
**思った以上に複雑かつドメインとして整理しがいがある**
クラウドログではこの「工数」という概念に対して、ドメイン駆動設計の導入を進めています。
この概念にワークフロー等の周辺ドメインが絡み合い、非常に整理しがいのドメインだなと感じています。
（モデルの整理やリファクタリングという点では、なかなかのボリュームがあります。）

# まとめ
１年経った今振り返ってみても良いギャップはあれど、楽しんで開発できている自分がいるなと感じました。
来年チャレンジしたいこと、絶対に実現したいこと、山ほどありますので体調を崩さぬよう楽しんでいきたいと思います。

クラウドワークスでは、一緒に働く仲間を募集しています。
少しでもご興味がある方は下記よりご連絡ください！
特に、この記事でクラウドワークスやクラウドログに興味を持っていただけましたら幸いです。

https://crowdworks.co.jp/careers/
競技ウェブデザインに挑戦しよう


## 職業訓練としてのウェブデザイン
技能競技大会にウェブデザイン部門があることをご存知でしょうか？
職業訓練生が出場できる技能競技大会はざっくり２つあります。


### ①若年者ものづくり競技大会
若年者ものづくり競技大会は、働く前の若者たちが技能を競う競技大会です。
対象：職業能力開発施設や工業高等学校等において技能を習得中の企業等に **就業していない20歳以下の若者**  

https://youtu.be/qJ9Iv6PZChw

### ②技能五輪
技能五輪は、青年技能者の技能レベルの日本一を競う技能競技大会です。
対象：各都道府県職業能力開発協会等を通じて選抜された者（原則23才以下）
全国大会で勝ち抜くと国際大会への出場もあります。
若年者ものづくり競技大会より少しレベルが高そうですね！


## ウェブデザイン職種はどんな競技？
「デザインができないとダメなの？デザインを競うの？」という疑問がありますが、
内容を見ていきましょう。
>ウェブデザインとは、「インターネット上でドキュメントを発行することを目的に、計画、設計およびデザイン、またウェブサイトの維持管理を行うこと」と定義する。

と書いてあります。
つまり、ウェブデザイン＋フロントエンド＋バックエンドを踏まえたウェブサイト構築（と、それにまつわる小課題）で競うようです。

https://youtu.be/E6K_Ur60FVE

# やってみる
 **若年者ものづくり競技大会**  のウェブデザイン職種のモジュール2の競技「サイト設計・構築」に挑戦してみました。
今回は事前課題を作成してみました。

本番の時間配分はこちらです。
・ウェブサイトの説明資料の作成（1時間）
・ウェブサイトの構築（4時間）

課題（どんなサイトを作るか）については当日に発表されます。
一応、事前資料としてこんな感じというものが発表されています。
（本番では10％以上の変更ありと書かれています）

https://www.javada.or.jp/jyakunen20/17/kadai/11.html

【テーマ】
新しく開業する「お好みタワー」という施設のウェブサイト

【制作要件】
※個人的な解釈も入っています。
ページ構成：
● トップページ
　　○ 「お好みタワー」施設の紹介
　　○ ランダムで3件の店舗のピックアップ表示
● 店舗検索
　　○ 店舗情報APIの情報を元にした店舗検索
● キャンペーン情報（ダミー）
● 「お好みタワー」へのアクセス（ダミー）

プレゼンテーション資料に
デザイン意図、デザイン意図やサイト制作背景に基づいて採用した仕様・機能、アピールポイント
が必要になります。

特筆すべきはこちらの点です。
> 競技用PCおよび検証用機材から、 **インターネット（競技用ネットワーク外）へアクセスすることはできない** 。また、選手が競技委員の指示なくネットワークの設定を変更することはできない。なお、競技用ネットワーク外へ故意にアクセスした場合は失格とする場合がある。

インターネットが使えない・・・
つまり、CSSをうろ覚えの状態でググればいいや！ではできないということですね。

しかし、4時間で企画デザインからコーディング、レスポンシブ対応までとは・・・難しい・・

設計（紙にざっくりWF）→（※オーサリングツールの指定があるので、本番ではしっかりデザインしないといけない様子）
HTMLコーディング
CSSコーディング

### きっつい・・:skull:
途中ちょっと挫けそうになりました。
ググれないことと、時間の制約がスーパーきついです・・
調べきれていませんが、本などの持ち込みや、お昼休みとかも見ちゃダメなんでしょうか。。

# 完成したもの
自分なりのお好み焼きタワーのトップページのみが完成しました。
かかった時間は4時間弱です。（時間、アウトですね:thinking:）

【PC】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/85fd8475-a2e1-9736-e4f9-efbb9290cde1.png)

【SP】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/92196214-950a-e71f-8b9a-0befb0f6ac2d.png)

・デザイン設計 40分
・HTMLコーディング 60分
・PCのCSSコーディング 120分
・SPのCSS対応 40分
画像やテキストは、受賞作品を参考にしました。

## 感想
時間内に作りきれるデザインで作成することが大事だと思いました。
事前にある程度レイアウトのパターンをコーディングできる練習が必要そうです。
今回私が行わなかったAPIの読み込みやサーバーへのアップロードまであるので、さらに大変な作業が待っています。
こちらに出場した人は時間内に自力で企画し作りきれる人（しかも若い！）ということで、民間企業にいた身としては絶対新卒で欲しい人材だろうな～と思いました。

# おわりに
様々な制約の中で自分の力だけでなにかを作り上げることは一度経験しておくとよいなと思います。
おまけに職業訓練校でないと出られなかったり、同世代の人たちと競い合うとても良い機会だと感じました。
当校でも、建築関連やメカトロニクス、フライス盤などに出場していますが、
ウェブデザイン職種にも出場してみませんか？
バウムクーヘンで考える自動化の必要性

## もくじ
1. ご挨拶とこの記事の経緯
2. 自動化ってなんだろう？
4. 効率よくバウムクーヘンを作る方法
4. テストを自動化するということ
5. 結びの挨拶

## 1. ご挨拶とこの記事の経緯
![large.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287131/43e303b4-0c08-f573-2ffd-81f1a6d9df76.png)
お久しぶりです。バウムちゃんです。

Qiitaでのアドベントカレンダーは今年で2回目の参加となります。
今回私は業務で行っている「自動化」についてお伝えしたいとおもいます。

## 2.自動化ってなんだろう？
自動化というのは言葉の通り「人間が行う動作を自動で行う」ものです。
主に繰り返し同じ作業を行う際に自動化を導入する事ができます。
ここでは一例としてバウムクーヘンを作る作業で自動化の流れを説明していきます。

バウムクーヘンの作り方に関しては去年の記事「バウムクーヘン型PDCAについて考えてみた。」で説明しておりますので
合わせてご確認いただけますと幸いです。
https://qiita.com/baumchan/items/ba55cfbb2340da7662e4

## 3.効率よくバウムクーヘンを作る方法
バウムクーヘン作る工程はフロー図に落とし込むと以下の工程となります。
![baumkuchen.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287131/d30cadd2-0688-8187-2193-edae3d374834.png)
バウムクーヘンを作るにあたって上記図のオレンジ色に塗っている部分は同じことの繰り返し作業となります。
自動化ではまず最初に「自動化ができそうな項目と自動化が不向きな項目」を明確にし、
「自動化ができそうな項目」を自動化していきます。
今回はこのオレンジ色の項目、
・バウムクーヘンが全体的に火が通るまで焼く
・指定の層の数になるまで新しい生地を塗り焼き続ける
上記2点が「同じことの繰り返し作業」となるので自動化向きと言えるでしょう。

※「自動化可能」とは技術的に可能かどうかではなく、「自動化した場合、手動で行った時より効率が上がる見込みがある」かどうかで判断します。仮に自動化が技術的に可能でも手動の方が効率が良い場合自動化向きとは言えなくなります。


## 4.テストを自動化するということ
コンテンツは完成して終了！というわけでなくリリースする前に問題ないか品質のテストをする必要があります。
テストに関しても自動化を導入することができます。
テスト自動化では主に画像認識を使用して対象が規定に沿っているかを確認します。
![test01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287131/ba4ee38f-1053-2453-6c31-9fa1bfc619a1.png)
![test02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287131/9a3829dc-27f7-5bef-77c6-5830137ca76f.png)
このように正である画像とテスト対象を比較することで作成したコンテンツを自動でテストする事が可能となります。



## 5. 結びの挨拶
今回は分かりやすくする為バウムクーヘンで説明しましたが、実際にはこちらは様々な分野で応用できます。
弊社ではこの技術をゲームQAで活用し、「制作物が正しい挙動を行っているか」や「正しい画像が表示された場合次の操作を行う」等テストをしながら操作を進めることが可能です。

この記事を読んでくださった方の中に少しでも自動化を取り入れる選択肢が増えましたら幸いです。
kubernetesの監視ツールについてちょっと調べてみた

# はじめに
初めまして。3-shake Sreake事業部 Tsuchidaです。
アドベントカレンダー23日目担当します。
こちらの記事では導入の方法や細かいカスタム設定等につきましては記載しないのであらかじめご了承ください。

# 経緯
日々業務でわからないことや色々調べて社内のナレッジには書いていますがあまり公開しようと思っていなかったので、これを期に投稿しようと思いました。
今回は直近調べていたkubernetesの監視について少しまとめます。

# 監視
監視を導入するのにpull型とpush型2種類あります。
例に出しているツール以外にもあると思いますが最近見かけたものを書いてます。
- pull型
    - Prometheus
    - Sysdig

- push型
    - Datadog
    - Mackerel
    - Sysdig

今回はPrometheusを選択したので監視を導入するのに使用したkube-prometheus-stackについて話していきます。

### kube-prometheus-stackとは
https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

prometheusでの監視設定とgrafanaのダッシュボードを一緒に導入できるコミュニティ管理されたhelm chart

### kube-prometheus-stackのコンポーネントについて

prometheusはpull型監視なのでターゲットから定期的にメトリクスを収集します。pull型のメリットは監視対象がダウンした際にすぐにわかることです。
下記でそれぞれのコンポーネントがどんな役割なのか記載するので構築するのと同時に意識してもらえると今後細かいカスタマイズをする時やエラーが出た時にlogを確認したりが捗るのではと思ってます。


![prometheus_architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985749/ecc4a15e-17b7-e3e4-3de9-69e854db5c4e.png)

    
  - The [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator)
     - kubernetesカスタムリソースを使用してPrometheus, Alertmanagerや関連コンポーネントのデプロイと管理をやってくれる
     - バージョン、永続性、リテーションポリシー、レプリカなのど設定をネイティブk8sリソースから行える
     - k8sラベルクエリに基づいて監視対象の設定を自動生成してくれる
  
  - Highly available [Prometheus](https://prometheus.io/)
    - 2つ以上の別々のマシンで同一のprometheusサーバーを実行している
    
  - Highly available [Alertmanager](https://github.com/prometheus/alertmanager)
     - Prometheusサーバーなどのクライアント・アプリケーションから送信されたアラート処理をしていて適切なレシーバーのためにアラートの重複排除、グループ化、ルーティングを実行している。またアラートの消音や抑制もやってくれる。
    
  - [Prometheus node-exporter](https://github.com/prometheus/node_exporter)
    - マシン自体のモニタリングをしてくれる
    
  - [Prometheus Adapter for Kubernetes Metrics APIs](https://github.com/kubernetes-sigs/prometheus-adapter)
     - k8sのリソースメトリクス、カスタムメトリクス、外部メトリクスAPIが入ってる
    
   - [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics)
     - deployment, node, podなどの状態をメトリクスで取得できる
    
   - [Grafana](https://grafana.com/)
     - prometheusよりUI UXが優秀なダッシュボード


# おわりに

kubernetesの監視を導入することが初めてでしたしprometheusも初だったので分からないことだらけで大変でしたが、helmを流すだけで監視ツールが導入できるkube-prometheus-stackは便利だなと感じました。
今後も違うツールを使う機会があればまたまとめたいと思います。

今回の話とは関係ありませんがDatadogの社内ブログもたまに書いてるのでみていただけると嬉しいです。

https://sreake.com/blog/?tag=datadog

# 参考
https://prometheus.io/docs/introduction/overview/
Next.jsの運用手順

# 前提条件
前提条件はNginxをインストール済のUbuntu環境です。詳しくは「[Nginx、PHP、MariaDBの構築手順](https://qiita.com/ganwt/items/3fcab7538846ac9c23ef)」を参照してくださいませ。


# 環境
- OS Ubuntu 22.04 LTS
- **Nginx**　`80`、`443`の管理
- **Node.js**　ブログ環境
- **Next.js**+**React**　ブログサイト

# 作業


## 1. 必要環境と構築
### 1.1 Nginxのインストール状況
`$ nginx -v`コマンドで確認
```sh
#　下記の様にバージョン番が出てくる　→  Nginxインストール済確定
nginx version: nginx/1.18.0 (Ubuntu)
```

### 1.2 Node.jsのインストール
`$ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -`

`$ sudo apt install nodejs`

`$ node -v`コマンドで確認
```sh
#　下記の様にバージョン番が出てくる　→  Node.jsインストール済確定
#  Node.js バージョン14.6.0以降が必要
v18.12.1
```

### 1.3 npmのインストール状況

`$ npm -v`コマンドで確認
```sh
#　下記の様にバージョン番が出てくる　→  npmインストール済確定
8.19.2
```

## 2. Next.jsよりblogページの運用
### 2.1 Next.jsアプリ作成
- `/var/www/`に移動する
  
  `$ cd /var/www`

- 次のコマンドを実行して、Next.js アプリを作成する
  
  `$ sudo npx create-next-app@latest nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"`

- `nextjs-blog`という名前の新しいディレクトリが作成された。それに入りましょう

    `$ cd nextjs-blog`

- 次に、次のコマンドを実行する
  
  `$ sudo npm run build`


### 2.2 Nginxの設定
  
  1. nextjs-blog.conf を作成し設定を追加する
  
      `$ sudo vim /etc/nginx/sites-available/nextjs-blog.conf`
      ```sh
      server {
          listen 80;
          listen [::]:80;
          server_name blog.sample.com www.blog.sample.com;

          location / {
              proxy_pass http://localhost:3000;
              proxy_redirect off;
          }
      }
      ```
  2. シンボリックファイルを貼る
  
      `$ sudo ln -s /etc/nginx/sites-available/nextjs-blog.conf /etc/nginx/sites-enabled/`

  3. Nginxを再起動する
  
      `$ sudo systemctl restart nginx`

### 2.3 PM2を使ってNodeサーバを永続化する
- pm2 を環境にインストール
  
  `$ sudo npm install -g pm2`

- pm2でnext jsを永続化
  
  `$ sudo pm2 start npm --name "next" -- start`

- ドメインを入力しブラウザで確認する

<br>
Next.jsの運用の手順は以上です。

お疲れ様でした。
NetBSD/star

ryoさんが昔作業していたstarを復活させて見ました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=6858

元のコードはこれです。

https://web.archive.org/web/20221125164411/http://www.nerv.org/~ryo/files/netbsd/star/

こちらがいじったのはここにあります。

https://github.com/yamori813/netbsd-src

直したところは割り込み回りとか、細かいKPIの変更に対応などです。

~~割り込みはよく分からなかったのでプライオリティー無視で多重割り込み禁止で実装しました。~~ 直しました。

STR9102で確認しているのでSTR81xxは直ってないところがあります。

確認はINSTALLのramdisk.fsでおこないました。

arm共通で使えるようにしたcfiサポートも入ってます。

~~star_dma.cを他のSOCのコードと同じようにマクロにしたいのですが、エラーになります。どこかに設定があるのだと思われますが、わかりません。~~ 直りました。NetBSDは黒魔術がいろいろありあます。

FreeBSDでもこのSOCのサポートコード書いた人いたのですが、私が試した時には壊れていてまともにうごきませんでした。

~~umassはあまり調子よくないです。7種類のUSBメモリ/SDリーダーを試して一つしかまともに動きませんでした。~~ いろいろいじっていたら安定したような気がします。

ターゲットはSwitchにVSC7385を使っていて、ST9100はMACが二つありますが、Switchが1つしか接続ポートがないので、インターフェースは一つしか使えません。

VSC7385はSPIで制御できるようなのですが、制御用の線はつながってなくてEPROMで初期化しているようです。設定はLANの4ポートはそのままで、WANポートがVLANになっているようです。

ryoさんが作られたのは6の前くらいで、まだu-bootのイメージを作る仕組みとか入ってなかったのではないでしょうか。今はbuild.shでu-bootイメージが作れるので、ずいぶん楽にトライ＆エラーがができます。

遅いですがarmアーキテクチャはv4で確立したと思うので、貴重だと思います。

flashにkernelを焼くARM-Bootのオペレーション

```
STR9100>tftpboot 0x00800000 netbsd.ub
STR9100>cp.b 0x00800000 0x10040000 0x00300000
```

rootfsはsd0(umass)で作ります。

INSTALLのkernelでsd0にインストールしてsd0がrootfsなkernelをflashに焼けば出来上がりです。

これをbootしたところネットワークが使えません。ARMBootがネットワーク初期化をしないとネットワークが使えないようです。

原因はレジスタの初期化と思われ、0x70000000からの0x100のレジスタをARMBootでネットワークアクセスした後にダンプしてその値をソースに突っ込んで設定するようにしました。
JsonをCSVに変換する Mac版

「jsonファイルをcsvに変換したいな！」ってことがあったので、備忘録です。

## 環境
`Homebrew`が必要。
Mac　OSは12.6で事前に`Homebrew`がインストールされていることを想定しています。

## pythonを最新にする

pythonのバージョンを調べる

```
% brew search python
```

バージョンを指定せずにインストールすると、最新のフォーミュラ版がインストールされる

```
% brew install python
```
## Homebrewでcsvkitをinstall
pipでインストールしようとしたら`ERROR:root:code for hash md5 was not found.`と怒られたので困ってググったらHomebrewにcsvkitがいた！

- [Homebrewのcsvkit](https://formulae.brew.sh/formula/csvkit)

```
% brew install csvkit
```
- [csvkitのチュートリアル](https://csvkit.readthedocs.io/en/latest/)
- [csvkitの本家](https://pypi.org/project/csvkit/)

## JsonファイルをCSVに変換

ベースのコマンドラインは以下。

```
% in2csv data.json > data.csv
```

## option
よく使うであろうオプションは以下かなと思います。

`-f` - ファイルのフォーマットを指定する
`-k` -　keyを指定する。ネストが深い場所のkeyを指定すると怒られるので、その場合はJSONファイルの整形が必要である。
`--no-inference` - 数値の`0`が`false`で出力されるのを防ぐ。
- [in2csvのDescription](https://csvkit.readthedocs.io/en/latest/scripts/in2csv.html)

### e.g)
 ```
 in2csv data.json -k keyName -f json --no-inference > data.csv
 ```

 ## 参考サイト
 - [csvjoin transforms a numeric value 0 to boolean FALSE](https://github.com/wireservice/csvkit/issues/905)
 - [Macでjsonをcsvにする方法](https://qiita.com/yutoman027/items/7c2f6f71582dfb141225)
 - [Arguments common to all tools](https://csvkit.readthedocs.io/en/latest/common_arguments.html)
Scratch でジングルベルを演奏してみた

## これは何

先日、弊社で行った出張授業(中学校)で題材として**Scratch**を使用しました。今回はScratchの理解を深めるための一環として、ジングルベルを演奏してみました。
※プログラム経験のある方を前提として書いているので、ある程度の動きの解説は省いています。プロミング経験がない方でもなんとなくやっていることが理解できるかもしれません。

:::note info
記事の最後に、実際のプロジェクトを公開しているので、まずはじめに演奏を聴きたい方は、最後までスクロールしてください！
:::


## Scratchとは？
> Scratchは、世界最大の子ども向けコーディングコミュニティーで、若者がデジタルな物語、ゲーム、アニメーションを作るために使っている、シンプルなビジュアルインターフェースを持ったコーディング言語です。Scratchは非営利団体Scratch財団によって設計、開発、維持されています。
引用：[Scratchについて](https://scratch.mit.edu/about)

上記にありますが、ビジュアルインターフェースでプログラムが書けるので、プログラムの勉強の第一歩に向いています。


## Scratch の準備

特に準備は必要なく、ブラウザ上で簡単に作成を始めることができます。
https://scratch.mit.edu/


## 音楽ライブラリの追加

まずはじめに演奏系の処理は、拡張機能となるため、プロジェクト画面の左下のボタンを押し、拡張機能の中から`音楽`を選択します。その後、プロジェクト画面の左のツールバーに`音楽`が追加されます。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/27ea2d63-42e1-5b4a-03a3-c3678ab8ca1e.png">
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/fe23a852-ed31-c3b4-2a93-8a4ca4fe2ff5.png">
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/df05b963-4e6e-2a82-0f8e-80a3eba1b1b1.png">



## 主旋律を作る

ここはプログラミングというよりは、音楽の知識と気合が必要です。
ジングルベルは最小でも八分音符単位の刻みでなんとかなりそうだったので、拍数に関しては、0.25の倍数をもとにひたすらに主旋律を入れていきます。

※音符の番号に関しては、タップするとキーボードが表示されます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/05d2420e-503a-9dd2-988b-10e2f061cf3c.png">

**追加したものがこちら↓**
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/e7f3f195-872b-c503-6381-49d30d56f1f8.png">
スクショの都合上、分割しないと表示しきれなかったため、ブロック定義(処理を一まとめにできる)というものを使って、`オルガン前半`と`オルガン後半`を分けています。
その他の部分に関してはなんとなく見ていただければ処理の流れが理解できるかと思います。


## ドラムを作る

オルガンだけでは少し寂しい気がしたので、ドラムも追加していきます。
ここも気合が必要ですが、繰り返しが使えたので、主旋律よりは楽でした。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/ff0260ab-3a7a-3426-bc9d-cd8e393f87c2.png">


## 同時に鳴らすために

ここで問題となってくるのが、音を同時に鳴らすためにはどうしたらいいかです。
調べてみたところ、メッセージという機能を使うことで、同時に処理を始めることができそうなので、改修します。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/60dc17b9-3510-139f-a88b-86d0133a0ac3.png">

**改修したものがこちら↓**
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/5fa3a91b-d6ba-7325-17c1-aab98ef83f86.png">

やや複雑になってきましたが、`演奏開始`というメッセージを受けて、それぞれのブロック定義関数が同時に演奏されていきます。
※バスドラムやスネアドラムの音が大きかったので、調整をしています。


## 同期をとる

同時に音が鳴らせるようなりましたが、実行時のマシン負荷によって徐々に音がずれていく問題が発生。なので１小節ごとに同期をとるように修正します。
幸いにも `〇〇まで待つ` という処理があったので、各楽器ごとに変数を持って１小節ごとにインクリメントします。もしズレが発生しているようであれば、一番遅れている楽器が次の小節始めまで、他の楽器を待つという感じにします。

**変数を追加したものがこちら↓**
![スクリーンショット 2022-11-22 18.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/a5322cbc-460e-6e6c-b715-99b6463c779c.png)

**同期処理を追加したものがこちら↓**
![スクリーンショット 2022-11-22 19.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/46651435-43aa-b7f9-a209-a96a44009467.png)


## 最後に
一つ一つの処理についてはプログラムをやったことがある人にとっては、少し簡単かもしれません。ですが、同期処理などを考え出すと意外と難しく、難解なパズルをやっているようで楽しかったです。
今回の同期処理はなんちゃって感があるので、時間があれば、もう少し美しい実装ができるように頑張ってみたいと思います。

実際のプロジェクトも公開しているので、ぜひ下記からジングルベルを聞いてみてください！
https://scratch.mit.edu/projects/765521817

メリークリスマス♪
compose公式のswipeRefreshを使う

# 初めに
今回は、`jetpack compose`の公式からでた`1.4.0-alpha01`から使える`swipeRefresh`を実装していこうと思います
### 本文
実装自体はすごく単純で`awipeRefresh`をつけたい`Box`などに下記の設定を追加するだけです
```kotlin
val pullRefreshState =
        rememberPullRefreshState(refreshing = isRefreshing, onRefresh = { onRefreshed() })
Box(
    modifier = Modifier
        .pullRefresh(pullRefreshState)
        .fillMaxSize()
    ) {

   }

PullRefreshIndicator(
            refreshing = isRefreshing,
            state = pullRefreshState,
            modifier = Modifier.align(Alignment.TopCenter),
            scale = true
        )
```
`pullRefreshState`には専用の型を代入します。`remember`とついてるように`refreshing`に渡された`Boolean`の状態が変更されるのを監視してくれてその状態によって挙動を制御することができます。
`onRefresh`にはswipeされた時に実行して欲しい処理を代入します。
また、`PullRefreshIndiacator`はswipeされた時に表示されるインジケータで`refreshing`には`pullRefreshState`同様`Boolean`を入れることでその値を参照して表示、非表示をきりかえてくれます。
`state`には対象の`Box`と同じ`rememberPullRefreshState`型の変数を代入すれば大丈夫です。
一番重要なのは`scale`でこれを`true`にしないとデフォルトの`false`の状態だと、対象のViewの上に隠れてる状態なのでタブなどがある時に被って表示されてしまいます。
### 最後に
今回は、ComposeでのswipeRefreshを紹介しました
だんだんと公式から必要なパーツが実装されてきたので今後誰かのお役に立てれば光栄です
MB-910 Microsoft Dynamics 365 Fundamentals (CRM)に合格した話

本エントリーはAdvent Calendar 2022「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の4日目のエントリーです！

# はじめに

こんにちは。[ノル](https://twitter.com/noll6451)です

今回は「NKC-UG」主催のアドベントカレンダー「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の4日目にエントリーしました
## きっかけ
Microsoftの資格を一通りとったので、備忘録代わりです。(いま調べたらMS900受験できるようになっているので、近いうちに取りに行く)
この試験めちゃくちゃ情報少ない
自分の合格したMicrosoftの資格一覧は[こちら](https://www.linkedin.com/in/rei-suzuki-22b443211/)で見れます。
~~NKC-UGの代表だから仕方なくではない~~

#この記事の対象者

- Microsoftの認定試験を受験予定の人
- CRMを勉強したい初心者の方
- 学生向け

## この資格の説明
[公式](https://learn.microsoft.com/ja-jp/certifications/exams/mb-910)では
>Dynamic 365 顧客エンゲージメント アプリ全体のコア機能を理解する
Dynamics 365 のスキルを検証する
事業運営と顧客エンゲージメントを理解していることを強調する
Dynamics 365 の顧客エンゲージメント機能についての能力を示し、次のレベルに移行する

となっております。

MicrosoftのCRMであるDynamic 365というツールをどういうサービスがあり、どう扱うかを問う試験です。
ちなみに
この試験も、社会人、学生関係なく**無料**のバウチャーがもらえる方法があります。


## 試験予約編
社会人も学生も無料になる方法があります(社会人の方はこちらの方法ですが、学生の方は2通りあります)
まずは、下から有無言わさず予約してください。この時のメールアドレスはしっかりと保管してください(個人のメールアドレスが推奨です。)

https://www.microsoft.com/ja-jp/events/top/training-days/dynamics365?activetab=a1%3aprimaryr3

前から録画してある動画を流すウェビナーなので、ぶっちゃけどんな状況でも受けれます。ただしっかりと出席だけはしてください。(バウチャーがもらえないので)

## 勉強方法
この試験ですが、前の記事と違い、ほとんど情報少ないです。
上記のウェビナーですが、合格したいなら、真剣に聞くことをお勧めします！(ほんとに！ここでしか言わない情報が多すぎる)


https://learn.microsoft.com/ja-jp/certifications/exams/mb-910

まずは**ヒント**というところをしっかりとみてください(重要です)
実際の試験の操作も体験できます。
その次に下にスクロールすると、勉強できるようにラーニングパスがあるので
それに沿って勉強すれば十分です。(もちろん無料です)

公式の問題集

https://learn.microsoft.com/ja-jp/certifications/resources/mb-910-sample-questions?azure-portal=true

もし実際にDynamic365が触れるのであれば、触ったほうがいいです。
そういった環境にない場合は
youtubeで雰囲気をつかんでください

https://www.youtube.com/results?search_query=dynamics+365

# 試験を受けるときの注意点

- 日本語がおかしい場合がある(英語に直す、察する)
- 採点されない問題が出てくる
- 出題範囲にない問題が出てくる(たぶん採点されてない？)
- 人によって問題数が違う
- 意外と時間がないので、サクサク進める(後から回答し直せる)
- 分からなくてもとりあえず何かしら選ぶ(1000点中合格スコア700だけど、7割ではないらしい)


Microsoft試験基礎シリーズの2記事めです。
ぜひこれを機にとってみてはいかがですか？？(実は、基礎資格は有効期限はないです)
ちなみ学生ですが、実は単位認定される可能性があります。

https://learn.microsoft.com/ja-jp/certifications/college-credit


皆さんの合格をお祈りしてます。

Microsoft試験基礎シリーズ
1記事め

https://qiita.com/Rei1729/items/89d693c73e0156764beb
e1000eのNICでDetected Hardware Unit Hang


### 事象
NICに負荷がかかったタイミング？でsyslogに`Detected Hardware Unit Hang`というメッセージが表示され、ひどいとハードリブートが必要になる。軽いとNICがリセットされて復活している？
誤検知という情報もあるが、古いハードウェアでは問題なかったが、性能が上がった最近のマシンではCPUがNICを圧倒してこの問題が起きているという可能性もありそう。

### 対応
TSO(TCP Segmentation Offload)を無効にすると良いらしい。
それだけではうまく行かなかった場合に、プラスアルファで～という情報もあり。
```bash
$ sudo ethtool -K eth0 tso off
$ sudo ethtool -K eth0 rx off tx off tso off gso off
```

永続的に無効にするにはこの辺が参考になりそうかな（まだ試してない）
[Ubuntu – How to permanently disable TSO & GSO in Ubuntu 18.04](https://itectec.com/ubuntu/ubuntu-how-to-permanently-disable-tso-gso-in-ubuntu-18-04/)

### 参考

[e1000e eno1: Detected Hardware Unit Hang:](https://forum.proxmox.com/threads/e1000e-eno1-detected-hardware-unit-hang.59928/)
[Detected hardware unit hang](https://access.redhat.com/discussions/5928261)
OpenStackのVolumeをオンラインリサイズする

インスタンスのVolume(HDD)サイズを拡張したいときの手順
実際に試した際にはインスタンスを停止して実施しましたが、動かしたままでもいけるかも

- volumeリストで対象のIDを確認する
```
openstack volume list
```

- ステータスをavailableに設定
```
openstack volume set --state available [volume id]
```

- ボリュームのサイズを変更する
```
openstack volume set --size 40 [volume id]
```

- サイズとステータスを再確認（ステータスはin-useに戻る）
```
openstack volume show [volume id]
```

- その後、OS上で`parted`や`resize2fs`コマンドなどを使ってファイルシステムを拡張する
LVMの場合は`pvresize`なども必要
東京の天気情報を取得するAPIをPythonで書いてみた

# はじめに
Pythonで東京の天気を取得するAPIを作成してみました。
APIにはOpenWeatherという基本的に無料で使えるAPIを使用しました。

https://openweathermap.org/

# コード
必要なライブラリをインポートします
```python
from flask import Flask, jsonify
import requests
```

Flaskアプリケーションを作成します
```python
app = Flask(__name__)
```

APIエンドポイントを作成します。
ここでは、/weatherというパスをAPIエンドポイントとして定義しています。
```python
@app.route('/weather')
def weather():
    # 天気を取得する処理をここに書く
```

次に、前項の「# 天気を取得する処理をここに書く」の箇所に天気を取得する処理を記述します。
ここでは、OpenWeatherMapのAPIを使用して、東京の天気を取得しています。
```python
@app.route('/weather')
def weather():
    # OpenWeatherMapのAPIを使用して、東京の天気を取得する
    api_key = 'YOUR_API_KEY'
    city_id = '1863967'  # 東京のcity_id
    api_url = f'https://api.openweathermap.org/data/2.5/weather?id={city_id}&appid={api_key}'
    response = requests.get(api_url)
    data = response.json()

    # 取得した天気データを整形する
    weather_data = {
        'city': data['name'],
        'temperature': data['main']['temp'],
        'description': data['weather'][0]['description']
    }

    # 整形した天気データをJSON形式で返す
    return jsonify(weather_data)
```

Flaskアプリケーションを起動します。
```python
if __name__ == '__main__':
    app.run()
```


# コード
```python
from flask import Flask, jsonify
import requests

@app.route('/weather')
def weather():
    # OpenWeatherMapのAPIを使用して、東京の天気を取得する
    api_key = 'YOUR_API_KEY'
    city_id = '1863967'  # 東京のcity_id
    api_url = f'https://api.openweathermap.org/data/2.5/weather?id={city_id}&appid={api_key}'
    response = requests.get(api_url)
    data = response.json()

    # 取得した天気データを整形する
    weather_data = {
        'city': data['name'],
        'temperature': data['main']['temp'],
        'description': data['weather'][0]['description']
    }

    # 整形した天気データをJSON形式で返す
    return jsonify(weather_data)

if __name__ == '__main__':
    app.run()
```
CakePHPのコマンド

一部composerもあり。コマンド忘れがちなのでメモ。

### アプリケーションを実行
```php
bin/cake server
```

### マイグレーションファイルを作成する
```php
bin/cake bake migration <table_name>
```

### マイグレーションを実行
```php
bin/cake migrations migrate
```

### seedファイルを作成する
```php
bin/cake bake seed <talbe_name>
```

### seedファイルの中身をDBに入れる
```php
bin/cake migrations seed
```

### モデルファイルを作成
```php
bin/cake bake model <model_name>
```

### マイグレーションの履歴を一つ戻す
```php
bin/cake migrations rollback
```

### コントローラーを作成
```php
bin/cake bake controller <controller_name> --prefix <directory_name>
```

### ビューを作成
```php
bin/cake bake template <view_name> --prefix <directory_name>
```

### プラグイン取得
```php
php composer.phar require cakephp/authentication:^2.0
```


下記ブログを参考にしました。Cakeを忘れてくるとここをチェックしています。

https://www.webopixel.net/cakephp/1612.html
ruby 練習問題４０　（アウトプット用）

以下の要件を満たすxyz_thereメソッドを実装する問題。
・任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド（.）がない場合はTrueを出力する
・任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド（.）がある場合はFalseを出力する
・上記2つの条件に当てはまらない場合はFalseを出力する
```
def xyz_there(str)
  #処理を記述
end
```
出力例
xyz_there('abcxyz') → True
xyz_there('abc.xyz') → False
xyz_there('xyz.abc') → True
xyz_there('azbycx') → False
xyz_there('a.zbycx') → False

以下、模範解答
```
def xyz_there(str)
  if str.include?(".xyz")
    puts "False"
  elsif str.include?("xyz")
    puts "True"
  else
    puts "False"
  end
end
```
以下、解説
まず、指定した要素が配列や文字列に含まれているかを判別するinclude?メソッドの理解
配列の場合
```
a = ["A", "B", "C"]
a.include?("B")  #=> true
a.include?("Z")  #=> false
```
文字列の場合
```
"Hello".include? "lo" #>= true
"Hello".include? "ol" #>= false
```

上記の要領でinclude?を用いて、対象となる含まれているかどうかを、各条件式で判別する。
ポイントとしては、str.include?(".xyz")の条件式をstr.include?("xyz")より前に設置すること。
例えば"abc.xyz"という文字列の場合は、str.include?("xyz")においてもtrueとなってしまうため、先に".xyz"を含むかどうかを判別する必要がある。
RichTextBoxで、特定のキー入力があったときに本日日付(YYYY/MM/DD)をカーソルがあっている場所に挿入する

# はじめに
Excelで```Ctrl + ;```を押すことで本日の日付がYYYY/MM/DD形式で挿入されるやつ、便利ですよね。
今回はその機能を、お手製で作ってるタスク管理ツールに導入するのにちょっと苦戦したのでメモ。

# 実装
```c#
private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{
    RichTextBox rtb = (RichTextBox)sender;

    // Ctrl + ;にしたかったんだけど、Ctrl押しながらだとそもそもKeyDownイベントが発火しない？Altで代用
    if (Keyboard.GetKeyStates(Key.LeftAlt).HasFlag(KeyStates.Down)
        & Keyboard.GetKeyStates(Key.OemPlus).HasFlag(KeyStates.Down))
    {
        TextSelection selection = rtb.Selection;  // 現在のカーソル位置取得
        String today = DateTime.Today.ToString().Substring(0, 10);  // 本日日付(YYYY/MM/DD)取得
        selection.Text = today;  // 文字列を追記

        // 追記した文字列全体を選択した状態になるので、一番うしろにキャレットを動かす
        selection.Select(selection.End, selection.End);  
    }
}
```

こんな感じです。
Blocksを取得してなんやかんやできないか、とか色々調べたけど思った以上にシンプルな形で出来ました。

処理の動きについて厳密に書くと、多分こんな感じ。  
1. 現在の選択範囲(複数文字の範囲選択はしていないため、カーソル位置 ~ カーソル位置の選択範囲)を取得
   上にも書いた通り、文字を選択していないため```selection.Text = ""```の状態
2. ```selection.Text = today```とすることで、何も選択していない状態から```YYYY/MM/DD```の文字列を選択している状態になる
3. 選択範囲を一番うしろに動かして終了。

画面の見え方としては文字が追記されただけに見えますが、実際の動きはちょっと違っててプログラムの面白さを感じました。

# おわりに
RichTextBox周りの実装方法があんまりネット上で拾えない・・。
このあたりにあんまり詳しくないんですが、```Windows.Forms.RichTextBox```と```Windows.Controls.RichTextBox```が存在してるらしく
うちの環境だと```Windows.Controls.RichTextBox```なのですがこいつが輪をかけて少ない・・。
まあでもなんとかできて良かったです(･ω･ )
Djangoのif文（条件分岐）を書く際に注意するべきこと。

## Djangoのif文を書く際に注意するべきこと
簡潔に一言

イコールの前後は半角スペースを設けよう！

```html:bad.html
<div>
      {% if aaa=="作詞家" %} <!--エラー発生！-->
      <a href="{% url 'xxx' %}" class="tag_box">{{ field.label }}追加</a>
      {% elif aaa=="作曲家" %} <!--エラー発生！-->
      <a href="{% url 'yyy' %}" class="tag_box">{{ field.label }}追加 </a>
      {% else %}
      <a href="{% url 'zzz' %}" class="tag_box">{{ field.label }}追加</a>
      {% endif %}
    </div>
```

```html:good.html
<div>
      {% if aaa == "作詞家" %}
      <a href="{% url 'xxx' %}" class="tag_box">{{ field.label }}追加</a>
      {% elif aaa == "作曲家" %}
      <a href="{% url 'yyy' %}" class="tag_box">{{ field.label }}追加 </a>
      {% else %}
      <a href="{% url 'zzz' %}" class="tag_box">{{ field.label }}追加</a>
      {% endif %}
    </div>
```


## 参考URL
https://arakan-pgm-ai.hatenablog.com/entry/2020/01/22/000000
SpringBoot 各レイヤの役割

とても重要な概念なので、まとめてみたいと思います。

<h3>全体ロジック</h3>
    <strong>controller --> service --> serviceImpl --> dao --> daoImpl --> database</strong>
<hr>

では各レイヤの役割についてまとめます。

<h3> Dao（Data Access Object)</h3>
　　　　<p>&emsp;どんなフレームワークを使っても、データベースとやりとりすることは多いです。直接SQLを書くと、ソースコードが読みづらくなることは多いです。そこで、データベースをラップして、データベースとのやりとりを一つの対象、Objectとやりとりすることにすればソースコードの可読性や保守性が大幅向上できます。このObjectはDaoと呼ばれています。Dao層は自動的にSQLを生成し、データベースにアクセスします。PGはDao層のみを制御すればOKです。<br>&emsp;制御する方法としては、通常Dao層の中にInterfaceを作成します。Interface内にデータを取得するなどのメソッドを定義します。実際データを取得するのSQL分は通常mapperファイルの中に記載します。またxmlファイルの中にSQL文が書かれている場合が多いです。
また、DaoはMapper、Respositoryと呼ばれることもあります。</p>

<h3>Service</h3>
　　　　<p>&emsp;業務ロジックを実現する層です。Service層もDao層と同じように、まずはInterfaceを設計します。そこからImplクラスを定義します。これでPGはService層のInterfaceをcallすれば、業務ロジックを実現することはできます。service層の業務ロジックを実現するために、Dao層で定義したInterfaceを使ってデータベースとやりとります。<br>&emsp;service層をラップ化することによって、業務ロジックが利用性が上がります。</p>
　　　　　
<h3>Controller</h3>
  <p>&emsp;service層に指示を出して、業務ロジックをコントロールする役割です。また処理した結果をビューに指示します。ここで覚えてほしいこととしては、Controller層はただ指示を出す側であって、実際に業務ロジックそのものを実現する機能は持っていません.</p>

<h3>Model</h3>
　<p>&emsp;Model層は通常View層と一緒に話します。view層は直接Userとやりとります。私たちは画面が見えるのはView層のおかげです。画面に表示されたデータはModel層です。View層は直接Controller層からの指示を受けます。</p>

<h3>最後</h3>

  ![スクリーンショット 2022-12-22 10.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/80ae0cde-7acd-9744-13fb-630acc9956ac.png)
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADの利点と機能」

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 ADの利点と機能」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory の利点と機能について説明する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-active-directory/2-describe-benefits-features)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「ARMテンプレートの出力」](https://qiita.com/fsd-jume/items/dea0e3ba45306df94e08)

## Azure ADの利点と機能
### Azure Active Directory(Azure AD)
・クラウドベースのディレクトリ/ID管理サービス
・ユーザによる下記のようなリソースやアプリへのアクセスに役立つ
　-企業ネットワーク上にある内部リソースとアプリ
　-Microsoft365、Azure Portal、SaaSアプリなどの外部リソース
　-組織向けに開発されたクラウドアプリ

### Azure ADの代表的な機能と利点
**◆シングルサインオン(SSO)アクセス**
・1つのユーザアカウントで1回サインインするだけで、すべてのリソースとアプリにアクセス可能
・クラウド上/オンプレミスのアプリへのセキュリティで保護されたアクセスを提供

**◆ユビキタスデバイスのサポート**
・あらゆるユビキタスデバイス(例：iOS、macOS、Android、Windowsデバイス)で動作可能
※ユビキタスデバイス：コンピュータが組み込まれ相互に通信を取り合うことが可能なデバイス
・既存の職場の資格情報を使って、様々な方法でアプリを起動可能

**◆セキュリティで保護されたリモートアクセス**
・オンプレミスのWebアプリにどこからでも安全にリモートアクセス可能
・MFA、条件付きアクセスポリシー、グループベースのアクセス管理でリモートアクセスのセキュリティを保護

**◆クラウドへの拡張性**
・他のクラウド環境やオンプレミス環境に接続可能
⇒一貫したユーザやパスワード、デバイスの管理が可能　　

**◆機密データの保護**
・機密データやアプリをセキュリティで保護する固有のID保護機能
・IT管理者は不審なサインイン動作や潜在的な脆弱性を監視可能

**◆セルフサービスのサポート**
・特定の管理権限が必要な作業においてすべての管理権限を付与せずとも委任可能
⇒作業に必要な管理権限のみ付与できる管理者ロールが既定で用意
・ユーザ自身にパスワードの変更やリセットさせることが可能
⇒ヘルプデスクや管理者の負担減

## 次の学習内容
**◆Azure ADの概念**

https://qiita.com/fsd-jume/items/49c85b3e38544a2de18d

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
MacOSの「開発元が未確認のため開けません」とおさらばする

Macでダウンロードしたプログラムやアプリケーションを実行する時に出るアレ

[公式](https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac)はctrlキーを押しながら開く方法，設定->セキュリティとプライバシーから「このまま開く」を推奨していますが結構面倒なので．

以下のコマンドを実行しておくと今後出なくなります
```terminal
sudo spctl --master-disable  
```

戻したい時は
```
sudo spctl --master-enable
```



https://www.manpagez.com/man/8/spctl/
大学生が0からはじめたC言語vol.3

##    条件判断
if文
```
if (条件式) 文 ;
```

###    等値演算子
＝＝演算子は2つの値が等しい場合に真
ちなみに「＝」は左の変数に代入

##    論理演算子
＆＆：かつ（AND) 右と左の条件が両方とも真→真
｜｜：または（OR）右と左のどちらか片方が真→真
！：否（NOT)　条件が偽→真

## else
条件が一致しなかったときに行う処理をかく
```
if(条件式)真の場合の処理；else　偽の場合の処理；
```
##    switch文
複数の番号との一致を判断する場合に限り簡単な書き方を用意
```
switch (条件式) {
case 数値:
    実行文;
    break;
case 数値:
    実行文;
    break;
}
```
case 数値のところをdefaultにかえると該当しない数字の際に動く処理を書ける

##    繰り返し文
for文を使う
```
int i;
for(i = 1; i <=繰り返し回数; i++){
    繰り返す処理；
}
```
###    for文を止めたいとき
break文でループを終了させることができる
```
int main(void)
{
    int i;

    for (i = 1; i <= 10; i++) {
        printf("%d\n", i);
        if (i == 9) {
        printf("ラスト１残して強制脱出");
        break; /* ループを終了する */
        }
    }

    return 0;
}
```
##    繰り返し回数がわからない繰り返し
ねずみ算の計算がある。こういったときにはWhile文を用いる。
```
while(条件式)｛
    繰り返す文；
｝
```
for文は初期値と交信が使えるので定数回ループが使える
ねずみ算をやってみる
「今月は1円、来月は2円、再来月は4円と、先月の倍額のおこずかいをちょうだい」さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか？
```
int main(void){
double money = 1;
int month = 1;
while(money > 1000000){
printf("%02d 月目　: %7.0f 円\n", month, money);
month++;
money*= 2;
}
printf("%02d月目に　%7.0f円に到達し、100万円を超える\n",month,money);

return 0;
}
```
moneyをdoubleにする理由はint型では100万円を記憶できないためである。（本来intでよい）
###    do while 文
```
do{
    繰り返し文；
}while(条件式)；
```
基本的にwhile文と同じ。唯一違うことは必ず処理が一度走ること。
値がそもそもまちがっていたときwhileだと分からないがdo whileだとprintf関数でチェックできるという利点がある。
Salesforce Platformでの開発生産性向上の価値

この記事は[開発生産性 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/developer-productivity)の23日目、ゆかちゃんの誕生日コーナーです。

ああ、今年も来てしまったこの誕生日。誕生日を素直に祝えばいいものの、こうやってたくさんのAdvent Calendarを各羽目になって、自分で自分の首を絞める、そんな自分が悪い日がやってきました。

----

さて、開発生産性についてです。

以前、Qiitaさんにスポンサードして公演した内容を紹介します。手抜きではありません。これが「生産性」です(違う)。

イベントレポートはこちらです。こちらのセッション②がわたしの担当セッションです。Salesforce Platformを活用することによる、開発生産性の向上(ここではエンジニア駆動のDXとしめされています)について語っています。

[「Qiita Meetup エンジニア駆動で進めるDXとは？」イベントレポート](https://zine.qiita.com/event/202205-salesforce/)

![image43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/efc384de-ab84-0c40-3260-8190061a86b0.png)

時代背景的に「Work from Anywhere」的なところに落ち着いていますが、Salesforce Platformによる開発生産性として伝えたいポイントは、次の3点です。

1. ローコード・ノーコードによる迅速性
1. プロトタイピングの容易さ
1. ツールと言語の多様性

# ローコード・ノーコードによる迅速性

流行りに任せていっているわけじゃないんです。プログラムを書いて、実行結果を得るまでは面倒です。素人なら特にそうです。

開発用のランタイムやコンパイラ、インタプリタの準備や、環境の準備などを行う事前作業だけで無理です。

ローコードプラットフォームの良さは、全てが準備されていて、画面でポチポチできるということ。直ぐに結果も見られるということ。この速さが魅力です。

# プロトタイピングの容易さ

すぐに実現できることで、プロトタイプの準備も容易です。

データを保管するためのオブジェクト(いわゆるデータベースのテーブルのようなもの)を準備すると、それを表示するための画面とAPIが自動的に提供されます。あとは配置をどうにかするだけで、画面イメージどころか動作まで試せてしまいます。迅速かつ容易に準備ができるということが、こういったローコードプラットフォームの価値です。

# ツールと言語の多様性

イベントレポートにもあるように、アプリケーション開発ライフサイクルを網羅するように、必要なツールを提供しています。また、[フロー](https://help.salesforce.com/s/articleView?id=sf.flow.htm&type=5)などのローコードツールだけではなく、[Apex](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_intro_what_is_apex.htm)と呼ばれるJavaによく似たプログラミング言語での開発も可能です。

最近、[DevOps CenterもGA](https://help.salesforce.com/s/articleView?id=release-notes.rn_devops_center.htm&type=5&release=242)されまして、ノーコード・ローコードとしての開発と、ソースコード開発とを両方セットで取り込んで変更・リリース管理できるツールも提供されました。

[Salesforceの「DevOps Center」が正式版に、カスタムアプリケーションの変更やリリース管理の負担を軽減](https://project.nikkeibp.co.jp/idg/atcl/19/00002/00419/)

このように、AdminもDeveloperも様々な開発スタイルで、開発・リリースが行えるようになっています。

開発生産性を上げるということは、様々な方法や方式がありますが、こういったすでに準備されたプラットフォームを利用して、開発するものを削減していくというやり方は、今後は進んでいくことと考えています。とはいえ、今までのようなプログラミング開発が廃れてなくなるわけでもなく、どうやって両方のメリットを享受しながら開発生産性を高めていくのかが、ビジネスの世界では必要になっていくことでしょう。

ということで、少しでもSalesforce Platformの価値が伝われば良いかなと考えています。
【Wireshark】Luaによる独自プロトコル作成におけるTree表示の違い

# はじめに
WiresharkにおいてLuaによるプロトコルを作成する場合、treeにaddすることでパケットデータの中身を表示することができます。

その時の書き方が3段階あるため、それぞれ松竹梅として書き方と表示内容の違いをまとめます。

# 執筆時点の環境
- Wireshark v 3.4系統
- Lua 5.2

# 説明
本記事では、dataとして渡されたパケットデータの0～1バイト目を整数として表示させる場合を例とします。

## 梅（データの中身だけ見たい場合）
```lua: 梅（データの中身だけ見たい場合）
tree:add(data[0:2]:uint())
```
- Tree画面にデータ内容は表示される
- 上記Tree画面の該当項目を選択しても、Data画面では該当するバイト列が選択されない
- 表示フィルタによるフィルタリング不可

## 竹（梅 + バイト列を選択表示）
```lua: 竹（梅 + バイト列を選択表示）
tree:add(data[0:2],data[0:2]:uint())
```
第1引数：Data画面の選択範囲
第2引数：表示内容

- Tree画面にデータ内容は表示される
- Tree画面の該当項目を選択すると、Data画面で選択される
- 表示フィルタによるフィルタリング不可

## 松（竹 + 表示フィルタに対応）
```lua: 松（竹 + 表示フィルタに対応）
local f_data = ProtoField.Uint("Data","data")
-- 中略
tree:add(f_data,data[0:2])
```
第1引数：自作ProtoField
第2引数：Data型

Tree画面にデータ内容は表示される
Tree画面の該当項目を選択すると、Data画面で選択される
表示フィルタによるフィルタリング可


まとめ

|書き方| データの表示 | データの選択 | フィルタリング |
|:-----:|:-----------:|:-----------:|:-------------:|
|梅|○            |☓           |             ☓|
|竹| ○           | ○           | ☓            |
|松| ○           |  ○          |  ○            |
大学生が0からはじめたC言語vol.2

## 変数の宣言
```
型名　変数名；
```
上記のように定義する
変数の宣言は基本的に関数の先頭でしか行うことはできない
変数宣言を先頭に持ってこないとエラーをはく
（コンパイラの機能によって変数宣言をよみとろうとしてしまう）
1度宣言した変数はその範囲内では使用できる

##    代入
変数に数値を記憶させることを指す
```
変数名 = 数値;
```
＝は右側の数値を左側の変数に記憶させるという意味（←みたいな感じ）
```
int main(void)
{
    int year;  /* 変数宣言の部分 */
    year = 2022; /* 代入の部分 */
    return 0;
}
```
すでに変数が覚えている値に直接計算することも可能
```
int main(void)
{
    int value;
    year = 2022;
    year += 1;
    printf("%d¥n", value);
    return 0;
}
```
year++
year--
でプラス１、マイナス１を表す

##    データ型
「データ型」とは変数や関数の形を決めるためのもの。データ型によって情報のサイズ、種類を決めている。
int型：整数を記憶
double型：実数を記憶（小数点以下も表示する）
整数と実数の計算が行われた場合は結果は実数に変換される
これは結果をしえ数にしてしまうと実数部分がなくなってしまうため。
⇔実数を整数に変換したい場合（ex:税率計算）
キャスト変換（強制的に型を変換する）を行う
```
(変換する型名)数値や変数名
```
###    void型
void型:型がないことを示す型
####    関数の引数と戻り値に使われるvoid型
(ⅰ)引数:あり　戻り値:あり
(ⅱ)引数:あり　戻り値:なし
(ⅲ)引数:なし　戻り値:あり
(ⅳ)引数:なし　戻り値:なし
この四つに場合分けされる。
(ⅰ)引数:あり　戻り値:あり
```
int sumnumber(int num1 , int num2){
     return num1+num2;
}
```
引数にも戻り値にもvoidは出てこない。

(ⅱ)引数:あり　戻り値:なし
```
void print(int num){
    printf("%d/n", num);
}
```
戻り値がないため関数をvoid型として宣言する

(ⅲ)引数:なし　戻り値:あり
```
int getnum(void){
   return 22;
}
```
引数にvoidを代入する。

(ⅳ)引数:なし　戻り値:なし
```
void start(void){
  printf("hello,world/n");
}
```
引数、関数の型ともにvoidになる

##    scanf関数
キーボードから入力するための関数
```
scanf("入力変換指定子",&変数名);
```
入力変換指定子：入力された数字をどのような数値に変換するか表す文字
scanf関数を使用するには、#include <stdio.h> が必要
scanf関数で実数の入力を行いたい場合
→%lf指定子を使用する

```
 scanf("%lf", &data); /* 入力部分 */
```
複数入力したい場合
指定子を複数つかうことで複数の入力を可能にする
```
int main(void)
{
    int year, nextyear; /*同じ型の場合複数定義できる
    scanf("%d%d", &year, &nextyear); /* 入力部分 */
    printf("%d , %d\n", year, nextyear);
    return 0;
}
```
実行結果
2022 2023
2022 , 2023
CREチームの2022年を振り返る

[2022年ランサーズアドベントカレンダー](https://qiita.com/advent-calendar/2022/lancers)の22日目の記事です

https://qiita.com/advent-calendar/2022/lancers

昨日の担当は[種井くん](https://zenn.dev/tanei/articles/8d9d529a89abe5)でした。

https://zenn.dev/tanei/articles/8d9d529a89abe5


## はじめに

ランサーズのCRE（顧客信頼性エンジニアリング）チームでリーダーをしている@sayakobです。
今回は、4月からランサーズのCREチームでやってきた取り組みを振り返ろうと思います。


ランサーズにはローンチ当初よりお客さまからのお問い合わせ等のうち、カスタマーサポートだけでは解決できないものを担当するシステムエスカレーションエンジニアがいて、お客さまの顧客体験を改善する業務を行ってきました。
その後、2018年にCREチームが発足し、少しずつ形を変えながらお客さまに向き合っています。

▼ CREチーム発足当時の記事

https://engineer.blog.lancers.jp/devops/startcreteam/


## CREチームの取り組み

CREチームには大きくわけて2つの役割があります。
1つめは、システムエスカレーションとしてお客さまからのお問い合わせ対応を行うもので内容としては下記です。
- 不具合やシステムエラーの調査・対応
- 仕様の確認

もうひとつは本来的なCREで、顧客が抱く自社サービスへの技術的な不安や不満を解消してカスタマーサクセスを実現し、自社への信頼を保つことです。マイナスの顧客体験を解消するだけではなく、「顧客の信頼性向上」にフォーカスした活動となります。
- カスタマーサポート・カスタマーサクセスの問題をテクノロジーで解決
- 「顧客体験向上」「効率化」「最適化」が主な内容

![スクリーンショット 2022-12-21 23.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/e5d362ab-5882-13c1-7b26-9702d1690c84.png)

実はここ数年は組織としてCREよりもシステムエスカレーション寄りの対応となっていました。
今年の4月から私がシステムエスカレーション業務にアサインされたタイミングで、より一層お客さまに信頼されるべくCREとしてもチャレンジすることになりました。


## やったこと

### システムエスカレーションのリードタイム短縮
システムエスカレーションされてから事実回答までのリードタイム短縮を目的とし、○時間以内の事実回答率○○%を目標にしました。
制限時間を設ける前と比べて、対応者の意識も大きく変わった実感があります。
また、対応に時間がかかっているお問い合わせの可視化により、オペレーション見直しをはかり改善につなげることができています。
調査系の時間短縮は後述するdatadog活用なども一因になっていると思います。

### お問い合わせを発生させない
お問い合わせをするだけでも信頼性を下げうることがあると考えると、お問い合わせが必要な状況を作らないことも重要です。
そもそもお問い合わせを発生させない状況をつくるべく、機能改善をおこないました。

### カスタマーサポートの生産性向上
カスタマーサポートに協力してもらい、生産性向上をはかりました。
カスタマーサポートの業務において効率化がのぞめるものをいくつか、何分改善できるかも算出しissue化してもらい、優先順位をつけて対応しました。主にプロダクトや管理画面の改善を行い、月間17時間ほどの生産性向上をすることができました。

### datadogを活用したモニタリング

APM(Application Peformance Monitoring)とログ、そしてアプリケーションアラートを利用しています。
SREチームや今年発足した[Productivityチーム](https://engineer.blog.lancers.jp/devops/announcing-the-launch-of-the-productivity-team/)のおかげで原因把握までのリードタイムを短縮することができるようになりました。感謝:pray_tone1:

https://engineer.blog.lancers.jp/devops/announcing-the-launch-of-the-productivity-team/


### 不具合のモニタリング開始

不具合発生から復旧までの時間や、障害対応にかけた時間などの計測を開始しました。
どのような原因で不具合が発生しやすいかの傾向も少しずつ見えてきています。
また、再発防止しないようナレッジシェアも実施しています。

## 現状の課題

### お客さまの解像度をあげる
CREとしてやりたいことが出来たかというとくやしいけど全然ダメだな…というのがいまの正直な気持ちです。
解像度をあげて、何に困っていらっしゃるのか、それに対してどうあるべきかをもっと考えられるようにしていかなければ。

ストックしている顧客の声やお問い合わせ、N1インタビューのレポートをしっかり時間をとって整理してみようと思っています。
ほかに良い方法があったら教えてほしいです！

### 重要issueリストを常に可視化・整理して対応

恥ずかしながらストックしてあるissueが増えすぎて管理しきれておらず、日々調査が発生するなかで、正しい優先順位がつけられていない状態です。
常に重要なissueがすぐわかる状態まで棚卸しが必要です。

### アラートやログの最適化
datadogの活用により以前よりモニタリングしやすくなりましたが、まだまだ不要なアラートやログが多く、重要なアラートに気づけない・遅れてしまうことがあります。不要なものはなくす、適切なエラーレベルにするなど改善をしてアラートを健全化していきたいです。

## さいごに


まだまだこれから改善余地も多く、やりたいこともたくさんありますがいかんせん仲間が足りません！
そこで、ランサーズではCREのメンバーを絶賛大募集中です！
お客さまに向き合うことにやりがいを感じる方、興味を持っていただけたら気軽にご連絡いただけると嬉しいです。

https://jobs.qiita.com/employers/456/postings/2286


明日のアドベントカレンダーは @kosuke284 さん担当です！おたのしみに！！
railsチュートリアルの復習について

こんにちは。
今日はrailsチュートリアルの効率的な復習方法でいいアイデアを思いついたので
メモとして残そうと思います。
二つあります。


１．各章のファイルをgithubからダウンロードしておく
　cloud9を使っている初学者は各章のファイルをダウンロードしておくと解説している部分のコードを簡単に調べられて便利です。

２．常に手を動かす
　ノートに鉛筆で書いたり、分からなくてもコードを打ってたりすると、無理やり頭を動かせて極小でもインプットされるので大事かなと。

progateを初めて３週間少し経ちました。
まだまだ分からないことだらけですが初学者を卒業できるように頑張ります。ポートフォリオを来年の２月までには完成させたい！
ReactをGitHub Pagesにデプロイしようとしたら詰まった話

# 詰まったポイント
React + typescript でアプリを作成し、GitHub Pagesにデプロイしても真っ白になる問題に遭遇しました。
開発者ツールで確認したところ``404: Error``でした。(<= そもそもサイトの読み込めていない)

# 解決方法
GitHub PagesではサブディレクトリがベースURLとなり公開されているので、リソースの読み込みが絶対パスなのを修正するだけでした。(私はこの解決方法を知るのに1時間かかりました)

``index.html``のリソース読み込みは以下のように変更してください。
```html
<!-- 「/static/js/...」を「static/js/...」等に変更-->
<script defer="defer" src="static/js/main.f290cddc.js"></script>
<link href="static/css/main.073c9b0a.css" rel="stylesheet">
```

ちなみに下記のように書いてもできるらしいです(未検証)。
```html
<script defer="defer" src="/IF/static/js/main.f290cddc.js"></script>
<link href="/IF/static/css/main.073c9b0a.css" rel="stylesheet">
```

# おまけ
ここで解説記事の少ない、**windows OS**におけるReactプロジェクトのGitHub Pageへのデプロイ方法を残しておきます。

1. ``npm run build``でbuildする
2. ``\build``の名称を``\docs``に変更する

あとはいつも通り（Git＆GitHubでの管理ワークフロー)で大丈夫です。
**GitHubのリポジトリにてPagesの設定も忘れずに！**

build内容を更新したい場合(再Buildする場合)は上書き、もしくは``git rm -r docs``で削除、そしてコミット。
その後、再度1～2のワークフローで再デプロイをオススメします。


Unix系(Macを含む)の解説は下記リンクが参考になると思います。(Reactでのデプロイ方法のメイン解説はこちら)
https://qiita.com/tat_mae084/items/745761eee6cd1d42949d
ロードテスト、ストレステスト、拡張性テストを人に例えてみる。

性能テストの種類の違いがよくわからなくなってしまうので、システムを人に例えてみました。



**ロードテスト**：（おらおら、こんくらいできるだろ〜って）負荷かけた状態でも、ちゃんと仕事をこなしているかを確認する。

**ストレステスト**：キャパオーバーになった時に、（突然消息不明になるとか）やばい落ち方、壊れ方をしないで、助けてー、やばいよーって言ってくれるか確認する。

**拡張性テスト**：体力テスト。どこまでのデータ量に耐えられるか。


きちんとした説明はこちらのサイトをご覧ください。

https://any-inc.jp/%E9%A1%A7%E5%AE%A2%E6%BA%80%E8%B6%B3%E5%BA%A6%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B%E3%83%86%E3%82%B9%E3%83%88%E5%AE%9F%E6%96%BD%E6%96%B9%E6%B3%955%E3%81%A4%E3%82%92%E7%B4%B9%E4%BB%8B%EF%BC%81/
Laravelのmigrationで使用するunsignedTinyInteger()とは何ぞやと調べてみた話

# 追記

なし

# はじめに

unsignedTinyInteger()とはなんやとなりましたので、調べました。
すごい簡単でしたが、まとめときます。

今回は、unsignedTinyIntegerですが、その他のunsigned～も同じような感じでした。（書くのがめんどくさいわけじゃないです、すいません）

# 調査

### unsignedTinyInteger()とは
unsignedTinyIntegerメソッドはUNSIGNED　TINYINTカラムを作成します。

```php
$table->unsignedTinyInteger('sample');
```

### UNSIGNED　TINYINTカラムとは
MySQLのフィールド定義に「UNSIGNED」を定義すると、
今回の場合（TINYINT）なら、TINYINT型では通常扱える範囲は**ｰ128～127**ですが、UNSIGNEDを定義することで**0～255**になります。
負数が使えなくなる代わりにその分扱える正の値が増えることになります。

# まとめ

これからはUNSIGNEDが出てきても大丈夫そうです。

# 参考リンク

- https://readouble.com/laravel/8.x/ja/migrations.html#column-method-unsignedTinyInteger
- http://dbinfo.sakura.ne.jp/?contents_id=34