OmniAICreator/Qiita-1.07M huggingface dataset:
eager_load!で失敗した反省文

この記事は「READYFOR Advent Calendar 2022」の3日目の記事です。

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

前日2日目は「Google アナリティクス 4（GA4）パラメータをJSON配列形式にして飛ばす方法」でした。

https://tech.readyfor.jp/entry/2022/12/02/090000

# ようするに

Railsアプリケーションでは以下の設定がおすすめ。

```rb
# config/environments/test.rb
config.eager_load = ENV["CI"].present?
```

# `Rails.config.eager_load`とは

アプリケーションは、コードが大きくなればなるほど読み込みに時間がかかってしまいます。

例えば「ちょっと動作確認のためにconsoleを開きたいんだけどな」と考えコンソールを開いたとき、毎回この読み込みが発生すれば開発効率が低下するのは火を見るより明らかです。

そこでRailsではコードの読み込みを最小限にするための遅延読み込みをサポートしています。Ruby定数名からファイルを探し出して読み込む仕組みで、開発用途なら非常に便利な機能ですね。

一方production用途ではリクエストを高速に返したいので、遅延読み込みではなく、Rails起動時にまとめて読み込んでいます。この切り替えを`Rails.config.eager_load`によって行っています。

ここまではなんとなく知っていました。

# productionにdeployできない事件

あるとき私は新機能を実装していました。手元の開発環境で動作確認し、CIのテストもパスしています。ところがdeployしようとしたとき、何のメッセージもなく突然Railsプロセスが終了してしまう問題に遭遇しました。
社内のRailsに詳しい方に調査して頂いたところ、私の書いたスクリプトが原因だと指摘されました。

そのスクリプトは開発用途に実装した小さなCLIツールで、引数から小さな機能を提供するものでした。このCLIツールは引数が足りなければ`exit 1`を実行するようになっていました。

```rb
if ARGV.empty?
  exit 1
end
```

「開発時でもCIでも問題なかったのになぜ？」
私は困惑しました。

# eager_loadは「とにかく全部require」

運用しているアプリケーションではRails env毎の`Rails.config.eager_load`設定は以下のようになっていました。

- development: `false`
- test: `false`
- production: `true`

また、当時運用していたRails v6.0ではまだZeitwerkに移行していなかったので以下のRails内コードが走っていたことになります。

https://github.com/rails/rails/blob/5a7fa9a3b2cc25bb660e8074195216df6cd4226a/railties/lib/rails/engine.rb#L472-L484

```rb
# railties/lib/rails/engine.rb
def eager_load!
  # Already done by Zeitwerk::Loader.eager_load_all. We need this guard to
  # easily provide a compatible API for both zeitwerk and classic modes.
  return if Rails.autoloaders.zeitwerk_enabled?

  config.eager_load_paths.each do |load_path|
    # Starts after load_path plus a slash, ends before ".rb".
    relname_range = (load_path.to_s.length + 1)...-3
    Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
      require_dependency file[relname_range]
    end
  end
end
```

ようするに指定dir以下は全部`require`するシンプルなコードのようです。Zeitwerkでもできるだけ互換性を保つようなので似たような仕組みだと思われます(未検証)

このコードによって先程の小さなCLIツールも`require`され、`exit 1`が発動し、何のメッセージもなく終了していたということでした……。Rails 10年やってて知らない私が無知でした……。

この小さなCLIツールは役目を終えていたので、このファイルを消してdeployはできるようになりました。

# 再発防止策

この問題はproductionでのみ再現します。なんとかもう少し早く気づくことができないのでしょうか？

rails guidesではこの問題について次の解決策を提示しています。

```rb
# config/environments/test.rb
config.eager_load = ENV["CI"].present?
```
https://edgeguides.rubyonrails.org/testing.html#testing-eager-loading

この方法なら手元でのテスト実行はでは開発効率のためeager_loadをoffにしつつ、CI上ではeager_loadするので今回の問題に気づくことができそうです。

上記コードを導入し、はれて問題解決となりました。

# 4日目

次の4日目は「DevHRがカンバンを導入した話」です。

https://zenn.dev/readyfor_blog/articles/50360250f06c2a
半自動オフサイドテクノロジー

# はじめに
　今回、Qiitaでなにか記事を書くということで、何を書こうか迷っていたんですけど、ちょうどよくワールドカップが開催されていますね。<br><br>今回のワールドカップから、「**半自動オフサイドテクノロジー**」と呼ばれる技術が採用されました。この技術について書いてみようと思います。
## どんなテクノロジー？
　スタジアムに設置された12台のカメラが毎秒50フレームで各選手の体29か所の位置を記録、<br><br>ボールに内蔵されたセンサーがボールが動いた瞬間と選手の正確な位置を割り出し、収集したデータを人工知能が分析。<br><br>オフサイドラインを含む映像を3Dで再現し、ビデオアシスタントレフェリーに補助するという技術です！
![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982401/f709f4ab-95b9-0199-7e3f-4bd3f33910c4.jpeg)

## え？
　サッカーやったことあるよー！とか、サッカー見るの好きだよー！っていう人以外、**なにいってんだ**って感じですよね分かります。<br><br>そもそもオフサイドってなにっていう話なんですけど、「**攻撃側チームの競技者が得点をするために守備側チームのフィールド内で待ち伏せすることを防ぐために定められたルール**」ですね。<br><br>簡単に書いてるんですけど、こんな簡単なルールじゃないです本当は。言葉だけで、理解できるようなものではないので、YouTubeで説明してる動画があるので見てみてください。<br><br>「オフサイド　わかりやすく」と調べると、簡単”**そう**”な解説動画があります。<br><br>![off_side.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982401/f0262981-b448-8b74-765b-a958615fb002.jpeg)
↑こんな簡単そうに描けるものではないですよ...

## スーパーゴールが幻のゴールに
　今大会で、この技術により、幻となったゴールがたくさんあります。ワールドカップ開幕戦のカタール代表対エクアドル代表の試合での、前半3分、エクアドル代表が決めたスーパーゴールも、この技術によりノーゴールに。ぜひ見てみてください。<br>
　日本代表も、ドイツ戦で、2－0に引き離されたかと思われた場面で、この技術に助けられたということもありました。<br>
　人間の目（副審の目）では、オフサイドと判断できないような、腕1本分のはみだしなどもAIが判定してくれる素晴らしい技術であり、日本側が決めた時には、ぜひシステムエラーを起こしてほしい技術ですよね＾＾![jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982401/061a9e83-8002-4baf-d6cb-ddcd9a2c2415.jpeg)
↑対ドイツ戦、日本が半自動オフサイドテクノロジーに助けられた場面

# 最後に
　今回は新技術の「半自動オフサイドテクノロジー」について書いてみました。今回はサッカーにおいてのAIとの結びつきを見てみましたが、ほかのスポーツでもAIとスポーツの結びつきは強くなってきています。いろんな着眼点をもって見るスポーツも面白いものですよ。<br>
　すごく短い記事になってしまいましたが、僕が**一番伝えたいこと**は、**12月2日（金）朝4:00から、日本がグループステージを突破できるか否かに関わる大事なスペイン戦があります！！みんなで応援しましょう！！**<br><br> ということです。<br><br>4年に1度のワールドカップですよ？見ないっていう選択肢ないですよね。ちょっとだけ早起きすればいいんです。**「早起きは三文の徳」**　ということわざもあるくらいです。<br><br>たまには良いと思いますよ！！![japan_getty_(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982401/47a0c772-d821-911a-3d7b-2492b1a036a2.jpeg)

※追記
スペイン戦勝ちましたね！！碧最高。堂安スーパー。
12月5日（月）24：00から、クロアチア戦あります！！
みんなで応援しましょう！！！

※さらに追記
クロアチア戦悔しいです。スペインもPKで負けました。
PK嫌いです。

※さらにさらに追記
画像の引用元載せてませんでした。すみません。
https://gigazine.net/news/20220707-semi-automated-offside-technology-fifa-world-cup-2022/

https://www.jleague.jp/a-to-z/offside/

https://article.auone.jp/detail/1/6/11/93_11_r_20221126_1669466332931348

https://sp.m.jiji.com/article/show/2854169
Slack 次世代プラットフォーム機能を使ったコードの探し方

こんにちは、Slack の[公式 SDK 開発](https://github.com/slackapi)と日本の Developer Relations を担当している瀬良 (@seratch) と申します :wave:

昨日、Slack の次世代プラットフォーム機能について、その概要等をご紹介する記事を投稿しました。まだ、読まれていない方は、ぜひ読んでみてください。

https://qiita.com/seratch/items/ecc16b845483c9d6f9e1

今回の記事では、この新しいプラットフォームを使った開発方法を学ぶときにどのようにサンプルコードを探せばよいか？を解説していきたいと思います。

### 公式のチュートリアル

次世代プラットフォーム機能のウェブサイトには、[いくつかのチュートリアルが用意されています](https://api.slack.com/future/intro#overview__ready__then-try-our-tutorials)。

* [シンプルな Hello World のコード例](https://api.slack.com/tutorials/tracks/hello-world)
* [インタラクティビティを使った承認フローのコード例](https://api.slack.com/tutorials/tracks/building-approval-workflows)
* [GitHub API と連携するコード例](https://api.slack.com/tutorials/tracks/create-github-issues-in-workflows)
* [誰かがチャンネルに参加したときにウェルカムメッセージを送るコード例](https://api.slack.com/tutorials/tracks/create-bot-to-welcome-users)
* [Giphy のアニメーション GIF を使って感謝を伝えるアプリのコード例](https://api.slack.com/tutorials/tracks/sail-with-kudo)

現在は日本語化されていませんが、正式リリースのタイミングに向けていくつかは日本語化を進められれば、と考えています。

なお、チュートリアル上にあるコードは import 部分も含めた完全なものではないことも多いです。チュートリアルから [GitHub リポジトリ](https://github.com/slack-samples)へのリンクがない場合は、お手数ですが、[こちら](https://github.com/slack-samples?q=deno-&type=public&language=typescript&sort=)から探してみてください。

### Slack の公式 Organization

GitHub にも多くの情報があります。私も所属する Slack の Platform チームが運用する GitHub Organization は以下の通りです。

* https://github.com/slackapi - 主に SDK のソースコードを管理する Organization
* https://github.com/slack-samples - 主にサンプルコードを管理する Organization
* https://github.com/Slack-Partner-Engineering - Partner Engineering チームが主にパートナー向けに提供するサンプルコードを管理する Organization

ちなみに Slack のオープンソースを公開する https://github.com/slackhq という組織もありますが、こちらは Slack プラットフォーム向けのものではなく、Slack のプロダクト開発の中で開発された、公開可能なライブラリなどを管理する Organization ですので、今回の話題とは少し異なります。

### deno- から始まるサンプルリポジトリを探す

サンプルコードの話に戻ると、slack-samples の方で、次世代プラットフォーム機能を使ったサンプルがいくつか公開されています。それらは全て **deno-** というプレフィックスがついていますので、以下のような検索をすることで簡単に一覧を見ることができます。

https://github.com/slack-samples?q=deno-&type=public&language=typescript&sort=

### deno-slack-sdk を含むコードを検索する

また Slack が公開しているものに限らず、コミュニティの中で公開されている全てのコード例を探したい場合は以下のような検索をするとよいでしょう。次世代プラットフォームを利用するためには必ずこのモジュールを import する必要があるので、漏れなく探すことができるでしょう。

https://github.com/search?q=%22deno-slack-sdk%22+language%3ATypeScript&type=code&l=TypeScript

「ソースファイルの検索だと件数が多すぎるなぁ・・プロジェクトの一覧だけ見たいのだけど・・」という方は、以下のような検索をしてみてはいかがでしょうか？ `manifest.ts` を探すことで deno-slack-sdk を使ったプロジェクトからそれぞれ一ファイルだけ検索することができると思います。

https://github.com/search?q=%22export+default+Manifest%28%22+language%3ATypeScript&type=code&l=TypeScript

また、GitHub に公開されたコード以外では、ブログ記事でコード例を共有されている方もいらっしゃるので、そちらもチェックしてみてください。以下の記事にブログ記事のリストがあります（私が見つけた範囲のみですが）。

https://qiita.com/seratch/items/ecc16b845483c9d6f9e1#%E3%81%99%E3%81%A7%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%A3%E3%81%9F%E6%96%B9%E3%80%85%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E8%A8%98%E4%BA%8B%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B

### 終わりに

いかがだったでしょうか？

この新しい基盤は 2022 年 9 月にオープンベータが始まったばかりです。コミュニティでコードを公開する方がこれから増えていくことが今から楽しみです。

便利なファンクションやワークフローができたら、ぜひコードをコミュニティで公開してみてください！
日々の勉強方法

ITエンジニアは日々勉強し続けることが大事だとよく言われます。
ただ、みんながどうやって勉強しているか分からないので私がやっている日々のやり方を残します。
※勉強というか情報収集の方法です。
※業務時間外でパソコンの前にいる時間が少ないので、スマホが前提です。

## Twitter
RSSリーダーのような使い方をしています。
IT系記事やプロダクトのアップデート通知をフォローするだけで最新情報を得ることができます。
フロントエンド/クラウドは特に更新頻度が高いので、TL上でサクサク見られるのは便利です。
あまり注目されませんが、GitHubにも更新通知用のアカウントがあります（https://twitter.com/ghchangelog）

クライアントは Matecha を使っています。
公式クライアントよりも見やすくて広告も無く、ちゃんと投稿順に表示されるのでずっと愛用しています。
## Google Discover
Googleの利用履歴（検索/Youtube等）を元に記事をおすすめしてくれます。
スマホの場合はGoogleアプリから、PCの場合はGoogleニュースのおすすめタブから閲覧することができます。

Zennで注目されている記事をTwitterで追うのは大変ですが、Discover ならおすすめに挙げてくれます。
Twitterフォロー外の記事をキャッチアップできる点が便利です。

デフォルトでいい感じにおすすめしてくれるわけではないので調整が必要です。
興味のない記事が表示された場合は「○○に興味がない」というオプションで類似の記事を減らすことが出来ます。
最初は芸能情報（スキャンダルとか）をたくさんおすすめされて困りましたが、何度か指定したらおすすめされなくなりました。
芸能情報は全然調べてないんだけどなー...😥

## 結び
勉強のやり方はパターン化されているため、自分に合った学び方を探すとき参考になります。(https://twitter.com/lpattern)
紹介した方法は「学びの竜巻」に相当します。(https://twitter.com/LPattern/status/1592867580553101313)

元々Twitterは最新ゲーム情報を得ることにしか使ってませんでしたが、そこにIT系記事を混ぜ込むだけで手軽に情報収集できるようになりました。
ちなみに、IT/ゲームの比率は 4：6 ですw
どんなところでキャッシュできるのか？


WEBサービスには、様々な箇所でキャッシュ(Cache)が用いられています。
どこでどのようなキャッシュが可能なのか、何をキャッシュさせるべきなのかについて、勉強することで、ハイパフォーマンスなWEBサービスを構築することができます。
参考にしてください。

# どこでキャッシュできるの？

## 1. クライアントでキャッシュする
ブラウザにURLを入力するとHTTPリクエストがスタートします。
ブラウザではJavaScriptやCSSファイルは基本的にキャッシュされます。
他にも、Cookieやローカルストレージ/セションストレージをキャッシュとして用いるケースもあります。
モバイルの場合でしたら、モバイルのDBにキャッシュしておくなどもあります。
できるだけクライアントに近いところでキャッシュしたほうが、パフォーマンスは良くなります。その一番の場所がクライアントでのキャッシュになります。一方でクライアント側は、サービス側からは一番コントロールしずらい場所になりますので、キャッシュの破棄や更新方法については、しっかりと検討・実装しておく必要があります。

## 2. CDNキャッシュ
CDNで静的ファイルを配信します。CloudFrare, Akamai, CloudFrontなどが有名ですね。こちらは各エッジサーバーで配信コンテンツをキャシュして返すことにより、Originへのリクエストを減らして、パフォーマンスを上げています。
エッジサーバーでキャッシュされているので、CDNサービスはキャッシュを破棄するための仕組みを提供していますので、Originのコンテンツを変更した場合には、キャッシュの破棄に気を付けましょう。


## 3. API Gateway
最近はRestAPIを受け付けるときにGatewayを置いてリバースプロキシとして用いることが増えてきました。このAPI Gatewayでもキャッシュをすることができます。

## 4. WEBサーバー
API Gatewayを利用しなくても、WEBサーバーをAPサーバーの前段に置くことが多いですね。Nginxが有名です。APサーバーの前段に追いて、リバースプロキシサーバーとして使うことが最近は多いのではないかと思いますが、Webサーバーの段階でもキャッシュすることが可能です。

## 5. APサーバーのメモリやHDD
アプリ層です。メモリにキャッシュしたり、ファイルにキャッシュしたりしてDBへのアクセスを減らすために用いられることが多いですね。あとはセッションキャッシュにも用いられます。
キャッシュというと、これしか知らない人も多いかもしれないです。アプリ開発しているとまず検討することになります。

## 6. キャッシュ用DB（Redis, Memcache）
DBへのアクセスを減らすために、キャッシュ専用にDBを構築することも多いですね。APサーバーがスケールアウトする前提の場合には、APサーバーでのキャッシュを使わずに、キャッシュ用DBを使うことも多いです。

## 7. DBサーバー
最後にDBです。一番システムのボトルネックになりやすい箇所です。パフォーマンス改善のためにまず検討するのは、DBアクセス部分です。
ここでエンジニアが何かを実装することはないでしょうが、DB自体もQueryの処理を高速化するために、クエリキャッシュの機能があります。この特性を理解してキャッシュされやすいようにQueryを工夫するというのも大事なことです。


# キャッシュについて気をつけること
- キャッシュの期間
どの程度の期間キャッシュが保持されるのか。TTLやExpiredなどの設定です。

- キャッシュの更新
キャッシュをどのように更新するかということです。自分で実装することが多いですね。

- キャッシュの破棄
キャッシュの保持期間を過ぎたら自動的に破棄されるケースもありますが、自前で破棄する方法を備えておくと、いざというときに約立ちます。

# 最後に
キャッシュはなくても動くようにしましょう！！！あくまでキャッシュです。
永続層として用いるのは危険です（そもそもメモリ上などの揮発しやすい場所に保存することも多いので）。

以上
【Git】.gitignoreでファイルを管理外にする メモ

## .gitignoreファイルとは？？
Gitの管理外に置きたいファイルやフォルダを指定するための設定を行うファイルである

### .gitignoreファイルの書き方
こちらの方の表が見やすかったのでお借りします
→https://blog1.mammb.com/entry/2020/01/30/090000
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/cd19924c-fb0d-4a38-e884-18b1eba4ed93.png)
* 先頭を / で始めると .gitignore のあるディレクトリからの相対パス
* 末尾が / の場合はディレクトリとして解釈される
* コメント行は # で始める
* ディレクトリ階層毎に複数配置可能で、階層の深いものが後から解釈される
* git add した後で .gitignore に追加しても自動で消えはしない(git rm --cached <FILE> で消す)`

### 実際にやってみる
1\. ローカルリポジトリに適当なファイルを作る
```
touch example.txt
```

2\. git statusで確認
```
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        example.txt

nothing added to commit but untracked files present (use "git add" to track)
```
この段階では「example.txt」が新しく追加され、未追跡であることが表示されています。

3\. .gitignoreファイルを作成し、中身を記述
フォルダの中に新しく`.gitignore`ファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/2b44406f-da37-11fa-480f-22ab61f3f1c4.png)

作成できたら、以下の様に`example.txt`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/a9e28e4f-2053-2598-c9e6-ebd50ff72f93.png)

4\. git statusで再度確認
```
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore

nothing added to commit but untracked files present (use "git add" to track)
```
`example.txt`をadd,commitをしていないですが、表示されなくなりました。
代わりに` .gitignore`が表示されるようになりました。

このようにして、バージョン管理から外したいファイル（パスワードが記載されたもの）などを設定することができました。
SNDPTFORD実行には構成が必要になりました

IBM Power Systems Virtual Server/IBM iで2022年1Hに検証時は、IBM iのSNDPTFORDコマンド実行により、特に事前の構成無しで普通にPTFをダウンロードできていました。
しかし、2022年2HにPTFを適用するためにSNDPTFORDコマンドを実行したところ、以下のエラーがでました。。
![SNDPTFORD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/788f67e2-5438-9b0f-748a-643ecff99950.png)

'CPF8C88 No record found'です。
少なくともブートイメージ 'IBMi_COR-74-06-1'、'IBMi-75-00-2984-1'では未構成でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/47fb2543-dbc1-efeb-67bf-0312608a25fe.png)

そこで、[マニュアル](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-downloading-fixes-updates&locale=ja)を確認しました。
```
SNDPTFORD コマンド
SNDPTFORD コマンドを使用して、IBM i 環境および IBM 提供アプリケーションのための IBM 提供フィックス (または PTF) を注文して受け取ることができます。 このコマンドは、ユニバーサル・コネクションを介した TCP/IP 接続を使用するエレクトロニック支援構成で使用できます。
```
「 TCP/IP 接続を使用するエレクトロニック支援構成」と書いてあるので、[こちら](https://www.ibm.com/docs/ja/i/7.4?topic=connection-configuring-direct-internet)を参照しましたが、 IBM® Navigator for iが前提と書いてます。
IBM CloudでNavigator for iに接続するのは一手間、二手間かかり面倒です。
さて、困りました。。

いろいろ、サポートサイトを確認して、CRTSRVCFGコマンドで最小限の構成をすればいいことがわかりました。
以下のコマンドで構成を実行します。
CRTSRVCFG ROLE(*PRIMARY) CNNTYPE(*DIRECT) CNTRYID(JP) 
CPCAC50 Service configuration *ECS created.  
CPCAC50 Service configuration *SRVAGT created

構成後、SNDPTFORD PTFID((*DB2GRP)) DLVRYFMT(*IMAGE)を実行すると、以下のメッセージで成功です！
CPC8C10　Optical image is being created for download.             
CPC8C04　PTF order complete. The PTF order ID number is H47054058.

数十分後、無事にIFSに拡張子BINのDVDイメージが取り込まれました。
![PTFIFS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/d738f593-4635-3b8f-d2fd-420b3c09e103.png)
セキュリティ関連とその他の法規

# 問題１
### サイバーセキュリティ基本法の説明はどれか？
#### サイバーセキュリティ基本法とは？
増加する```サイバー攻撃による脅威と深刻化```に対応した法律で、セキュリティに関する施作を総合的かつ効果的に推進することを目的としている。
国としてサイバーセキュリティ戦略を策定し、```内閣サイバーセキュリティセンター(NISC)```を設置。
サイバー攻撃に関する```情報収集・分析や、公的期間の通信の監視とセキュリティ対策の監査```などを行なっている。また、国や地方公共団体、```重要社会基盤事業者```（電力会社や通信事業者など)に対しては、セキュリティ確保に努める責務を課している。
　
# 問題２
### コンピュータウイルスを作成する行為を処罰する法律はどれか？
#### 上記の法律とは？
##### ウイルス作成罪
刑法によって罰せられる罪で、正式名称は「不正指令電磁的記録に関する罪」。正当な理由がないのにも関わらず、```他人のコンピュータで実施する目的でコンピュータウイルスの作成、提供及び共用、取得、保管行為```をしたものに対する処罰。

# 問題３
### 個人情報に該当しないものはどれか？
#### 個人情報保護法
個人を識別することが可能な情報(```個人情報```)の取り扱いに関する法律。
```氏名や生年月日などの文字情報だけでなく、顔写真や声なども別情報との組み合わせで個人が特定できれば個人情報```。また指紋やDNAなどの身体の特徴をデータ化した情報や、免許証番号やマイナンバーなどの公的な番号も個人情報(```個人識別符号```)。
* 個人情報を取得する際は```利用目的を特定し、公表```しなければならない。
* 目的外の利用や第三者への提供は```本人の許諾が必要```。
* 本人からのデータの開示、誤りの訂正、利用停止の申立てがあったり、```苦情を受けた場合は、速やかに対応```しなければならない。
* ```個人を特定できないように情報に加工```をすれば（```匿名加工情報```)、本人の許可なく目的外利用を行ったり、第三者に提供することも可能。

# 問題４
### 消費者を守るためのクーリングオフなどのルールを定めている法律はどれか？
#### 特定商取引法
店舗での対面販売とは異なる、訪問販売や通信販売などを対象に、「①事業者名や勧誘目的を事前に消費者に告げる、②広告には重要事項を表示する、③契約締結時などに重要事項を記載した書面の交付を義務付ける」などのルールを定めている。また、消費者による一定期間内の契約の解除（```クーリングオフ```)が定めれている。

# 問題５
### 製造物責任法の対象となるものはどれか？
#### 製造物責任法とは？
PL法とも言われる。
製品の```欠陥により消費者がけがをしたり損害を被った```場合、その製品の製造業者などには```損害賠償請求```があると定めれている。ソフトウェアは対象外だが、組み込みソフトを含む```機器（ハードウェア)を製品として出荷した場合は対象```となることがある。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Amazon EFS Elastic Throughput モードがリリースされたので調査・検証してみた。(2022年アップデート) pt.2

本記事は、[前回投稿した記事](https://qiita.com/Naoki_Ishihara/items/4d57f6adab388ad226ff)の続きです。

## 比較検証
前回の記事では、新しく利用可能となった機能の紹介のみでした。
今回の記事では、他のモードと比較することで、Elastic Throughputモードが実際にどう機能しているのかを確認します。

### それぞれの機能についてのおさらい
**バーストスループットモード**
・ファイルシステムサイズに応じてベースのスループットが高くなる。(1TiBあたり50MiB/s、最低1MiB/s)
・ベースより高いスループットが必要な場合、読み取りで100MiB/s、書き込み300MiB/sまで自動でバーストしてくれる。
・バーストするとバーストクレジットが消費される。クレジットがなくなるとベーススループットに戻る。
・月額料金 = ストレージ料金 (1GBあたり0.36＄)

**Elastic throughput モード**
・ワークロードに合わせて自動でスループット性能を調整してくれる。
・スループットの最大値は読み取りで3GiB/s、書き込みで1GiB/s 
・月額料金 = ストレージ料金 + スループット料金 (転送1GBあたり読み取り0.04＄、書き込み0.07＄)

**プロヴィジョニングスループットモード**
・必要なスループットの数値を設定することで、一貫したスループットを提供してくれる。
・月額料金 = ストレージ料金 + プロヴィジョニングしたスループット料金 (1MiB/sあたり7.2＄)

より詳細な情報については以下の公式ドキュメントを参考にしてください。
[Amazon EFSのパフォーマンス](https://docs.aws.amazon.com/efs/latest/ug/performance.html#throughput-modes)

## 条件
datasyncを用いて、EFSへ18.8GB(5万ファイル、1ファイル400KB)のデータ転送を行いました。

## バーストスループットモード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/0367783a-ef9a-b174-db1e-e3e0fdc56de5.png)
転送にかかった時間は**3分7秒**でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/372eb20b-a0d0-7c71-24e7-11aeda9f9cc9.png)
最初は一定値で、その後バースト状態に遷移し、その後また一定であることが確認できます。
計算したところ、スループット速度は最大**192MiB/s**でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/e37e65ef-430e-5bb7-b849-b2c5eb67ce51.png)
また、今回の検証により、バーストクレジットが約9GB消費されました。


## Elastic throughputモード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/d4f4a1d6-cf28-797c-cfe1-a0b22d38ff7a.png)
転送にかかった時間は**2分49秒**でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988434/49cbaa64-6350-4419-80d7-92be040ec008.png)
スループットが柔軟に変化していることが確認できます。
計算したところ、最大速度は**419MiB/s**でした。

## まとめ
今回は、Amazon EFSにおける**Elastic Throughputモード**が機能していることを確認しました。
さらに、他のモード比べ、最大スループットが速く、転送時間も短い結果となりました。

また、EFSは途中でモード変更できるため、コスト考慮した使い方も可能です。
よって、これから様々なワークロードにて**Elastic Throughputモード**の適用が促進されると考えられます。

## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [New – Announcing Amazon EFS Elastic Throughput](https://aws.amazon.com/jp/blogs/aws/new-announcing-amazon-efs-elastic-throughput/)
- [Amazon EFS pricing](https://aws.amazon.com/efs/pricing/?nc1=h_ls)
- [Amazon EFS で Metric Math を使用する](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/monitoring-metric-math.html#metric-math-throughput-utilization)
- [Amazon EFSのパフォーマンス](https://docs.aws.amazon.com/efs/latest/ug/performance.html#throughput-modes)
幸せとメタ認知の相関関係

### メタ認知とは
新年になると、人々はこれからの１年の目標を立てるかと思う。
英語勉強、ダイエット、読書...
その目標は去年と変わらないのではなかろうか。
やると決めていたのに結局できない目標や計画は、メタ認知が足りないからである。
では、メタ認知とは何か。

メタ認知の概念を定義した人はジョン・H・フラベルらしいが、このテーマには合わないし、面白くないのでここではパスする。
興味のある方は個人的に調べてください。

メタ認知の「メタ」は「高次の」という意味がある。
イメージ的には第三者の立場に立って認知することであり、自分が知っていること、考えることを第三者的な立場で（高次の=メタ）認知することである。
つまり、自分が今何を知っていて、何がわからないのかを知ること、自分の行動がどのような結果をもたらすかを知る能力である。
しかし、これが幸せとどのような関係なのだろうか。


### 幸せとメタ認知の関係
その質問に答えるためにはまず、「自分はいつ幸せを感じるか」を知る必要がある。
ところが、大体の人々は自分がいつ幸せを感じるかわからない場合が多い。
なぜなら、たとえ幸せな場面に出会っても自分がなぜ幸せなのか「考えない」からである。
「なぜ」幸せを感じるかを知ることは、上で述べたメタ認知とも関連する。
メタ認知が高い人は、自分が幸せになる方法をわかっているからである。
さらに、自分が何をすれば幸せを感じるか、なぜ幸せを感じるかがわかっているので、その方程式に合わせて自分の考え方や行動を決める。


### フロー理論
いきなりフロー理論と言われても、何だろう？と思う人もいるだろう。
それほど難しい言葉ではない。簡単にいうと「夢中になる理屈」のことである。
幸せの話をして今度はなんとか理論の話をすると困難する人もいると思うが、しっかりついてくるように...
この理論を提案した心理学者チクセントミハイは「人間はいつ幸せか」をテーマに一つの実験をする。チクセントミハイは、日常生活をしている実験対象の人々に不規則的にアラートを鳴らし、実験対象の人々はアラートが鳴ると、事前に用意したアンケートにその場で答える実験である。アンケートは「今何をしているか」「今は幸せを感じているのか」などの質問である。突然アラートが鳴ると答える実験であるため、信頼度は高い。
この実験により、人間は何かに夢中になる時が幸せを感じる時であることがわかった。
時間がどのぐらい経ったかもわからず夢中になる状態を、チクセントミハイは「フロー状態」と命名した。

### フローの条件
ただし、このフローの状態に入るためには、十分解決できる課題に挑戦し、努力しなければならないという条件が必要だった。ここで「十分解決できる」レベルとは、その課題を解く当人が思わなければならない。Aさんなら十分解決できる課題であっても、Aさん本人がその課題に恐れを感じるとフローの状態に入れない。ここでまた必要になるのがメタ認知である。
自分のレベルと目の前の課題の難易度を正しく認識すると、フロー状態に入ることができ、幸せを感じることができる。

### 暗記実験
メタ認知に関して、韓国で面白い実験を行った。
成績が上位0.1%の高校生たちは、普通の高校生たちと何が違うかを調べる実験である。
実験方法はシンプルで、関連性のない英単語25個を3秒間聞いて暗記すること。
結果は上位0.1％の高校生たちも、普通の高校生たちも、大きな違いがない結果になった。
しかし、実験前に行ったアンケートでは興味深いデータがあった。
上位0.1％の高校生たちは、自分がどのぐらい暗記できるか、一人を除いて全員正確に当てたのに対して、普通の高校生たちはできなかった。これが意味していることは、上位0.1％の高校生たちはどれぐらい暗記ができるかがわかっていることである。
では、どうすればメタ認知をあげて幸せになることができるか。


### フィードバック
一番簡単なことはフィードバックを経験することである。ここでのフィードバックとは、他人の判断を受け入れることではない。自分が思ったことが正しいのかを試すことである。例えば、私は勉強をする時には、静かな音楽を流すとより集中できると思っている。ではこれが正しいかどうか実際に試してみることである。ジャンルも変えながら試してみて、静かな音楽を流す時が一番勉強に集中できれば、「勉強をする時には、静かな音楽を流すとより集中できる」と言う考え方は正しいと言える。これを繰り返すことで、自分について知っていくことがメタ認知を上げる方法である。


### 人間の認知過程を知る
そのほかメタ認知を上げる方法は、人間が物事をいかに認知するか、そのプロセスを知ることだ。メタ認知は自分の認知過程を認知する能力である。したがって、我々がこの世の中をいかに認知するかを知ると、メタ認知は上がるだろう。


### 読書
メタ認知を上げたいが、本を読まなければいつまでも叶わない夢にすぎない。
本を読もうとすると眠くなる人もいるだろう。
それは自然的な現象である。実際に本を読むために、脳にはかなりのエネルギーを必要とする。
そのため、脳はエネルギーを抑えるために睡眠モードに入ろうとする。
脳の働きについては言いたいことがたくさんあるが、この脳の抵抗に勝って本を読み続けると、自分の知らなかった知識が増え、価値観に変化が起きる。本を継続的に読み続けると、この変化を体で経験するため、メタ認知が自然的に上がる。
世界的な富豪microsoftのビル・ゲイツは年間50冊、ソフトバンクの孫社長は３年半で3,000冊の本を読んだと言われている。
あなたは成功と幸せの両方を手に入れたいと本気で思っているのか。
ならば、今すぐスマホの電源を切って本を読むべきだ。

### 結論
幸せになるためにはフロー状態に入る必要があり、フロー状態に入るためにはメタ認知の向上が必要であることがわかった。記事が長くなるためここでは述べていないが、何に対してフロー状態なるのかを考えることも必要で、これも結局メタ認知の領域になる。
おそらく「自分はいつ幸せを感じるか」の質問に、この記事はみんなが予想する答えではなかったと思う。多分みんなが考えることは「好きなことをする時」または「思う通りになる時」ぐらいのレベルの答えかと思う。しかし、この記事ではより根本的なことを扱いたかった。自分は何が好きで、何を思っているのかを知るためには、スマホのない誰もいない部屋で自分と向き合う必要があるだろう。長い記事だったが、この記事を最後まで読んだあなたには、ぜひ幸せと成功の両方を手に入れて欲しい。そして、この記事が有益であれば、ぜひ他の人々にも共有して欲しい。人間は社会的な存在であるため、あなたの共有がポジティブな影響として返ってくる。最後に本記事を読んで気になる点があればご連絡ください。最後までありがとうございます。good luck!

```referance:referance
フローの体験 喜びの現象学（チクセントミハイ）
完璧な勉強法（ゴ・ヨンソン、シン・ヨンジュン）
EBS<学校とは>：0.1%の秘密
```
【I】IFTTTでTwitter→Discordをwebhookでやろうとしたら400 Errorがでた人へ

JSONを送るときingredientはエスケープしよう、改行とかでjson解析エラーがでるぞ

## 解決策

**`{{〇〇}}`を全部`<<<` `>>>`で囲む**

`<<<{{〇〇}}>>>`こういうことです。
これでJSON解析を超えられるようになるっぽいです。なんで？？

## 備考

公式ドキュメント、よく見たらあった

https://help.ifttt.com/hc/en-us/articles/1260803042229-Troubleshooting-outbound-webhooks

> If you are using ingredients in the Body field of the webhook action, surround them with <<< >>>
> 訳:WebhookアクションのBodyフィールドにingredient(要素？)を使用する場合は、<<< >>>で囲んでください。
プリザンターが少しだけ便利になる小技

本記事は、[OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pleasanter) の1日目の記事です。

## はじめに

プリザンターは、オープンソースで公開されている"ビジネスアプリケーションプラットフォーム"です。
簡単に言うと業務アプリが素早く簡単に作れるノーコード・ローコード開発ツールです。Webデータベース、と言ったほうがご理解頂ける方もいらっしゃるかもしれません。
今年は新聞などでもノーコード開発、ローコード開発、という言葉を目にする機会が増えてきました。昨年の今頃は、まだまだ業界用語的な単語だったように思いますが、市民権を得た、とまでは行かないまでも、聞いたことはある、くらいの認知には達したように思います。本日は流行語大賞の発表日となりますが、来年はノーコード、ローコードという言葉がノミネートされていたりしないかしら、と夢見がち乙女モードになったりもします。

そんなわけでプリザンターのアドベントカレンダー、今年も始まりました。
このアドベントカレンダーを通じて、プリザンターの便利さ、プリザンターの可能性、プリザンターの楽しさ、なんかを少しでも皆さんに知って頂ければと思います。
読んでくれる皆さん、書いてくれる皆さん、25日間、どうぞよろしくお願いいたします。

# 小技語り
私は小技が好きです。誰がなんと言おうと小技を愛しています。
大げさに語るほどでもないけど、なんか便利だよね、というやつです。人はそれを小技と呼びます。

## 集計
プリザンターの一覧画面には集計欄が存在します。
↓こんなやつです。
![集計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537390/2ab753d1-763a-0e6d-225f-f3622c07ef46.png)
非表示にしていたりする人が意外と多くて驚きなのですが、私は集計が好きです。
長い文字列の項目で集計する場合は確かに結構邪魔だったりするケースもありますが、その辺はうまいことやりましょう。
件数、合計、平均がパッと見てわかるというのはもちろんなのですが、地味に好きなのが、各項目(ラベル)をクリックするとフィルタが掛かるところ。
例えば上の図で言うと担当者の「鈴木 洋一」という項目をクリックすると鈴木洋一さんが担当者になっているレコードだけ表示されるようになります。担当者項目で「鈴木 洋一」を選択してフィルタした状態になるわけです。その状態でもう一度「鈴木 洋一」というラベルをクリックすると、フィルタが解除されます。
通常、フィルタをかける場合は、フィルタ欄の担当者のドロップダウンから鈴木洋一を選択するわけですが、集計機能を使えばワンクリックでフィルタをかけられるわけです。
地味に便利です。人はそれを小技と呼びます。

## カレンダー
プリザンターのカレンダーは、土曜日が水色、日曜日が桃色で表示されており画期的にわかりやすいのですが、祝日には対応していません。そのため、カレンダー表示を使ってタスク管理をしていると、祝日を見落としてしまい予定が狂ってしまうというようなこともまれにあります。だからといって祝日のレコードを作るわけにもいかず…。そんなお悩みを抱えた皆さんに小技を伝授します。小技が皆さんを救います。
![スクリーンショット 2022-12-01 14.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537390/b02f487c-144f-1410-7cce-ca8cd28454af.png)
12月30日から1月3日まではお休みです。
地味ですが、わかります。これだけでも大違いだと思いませんか？
しかも簡単です。スタイルを使います。
![スクリーンショット 2022-12-01 15.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537390/cb1ef1d8-2085-149a-e49b-3336584d2c65.png)
1日ずつ手書きという衝撃。
いいんです。日付を直すくらい簡単です。365日祝日なわけではないのですから。

```[data-id="2022/12/30"]{background-color:#ffc0cb !important;}```

逆にわかりやすいですよね。もうちょっと視認性を高めたいという方は↓のようにでもするのが良いと思います。
![スクリーンショット 2022-12-01 14.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537390/50594306-3a0a-7083-aa5b-7e9c7ea2f50b.png)
1日ずつ手書きだからこそできる技。人はそれを小技と呼びます。
カレンダーまわりはいろいろと要望も多そうですが、スクリプトやスタイルを使えばいろいろとカスタマイズが可能です。

# おわりに

ちょっとだけ便利になる、そんな小技が私は大好きです。
皆さんがひっそりと持っている小技があれば是非教えて下さい。
それでは、25日間、よろしくお願いいたします。
Leetcode 1704. Determine if String Halves Are Alike

# 1704. Determine if String Halves Are Alike

https://leetcode.com/problems/determine-if-string-halves-are-alike/

## 難易度
### Easy

## アプローチ
### Hashmap

```java
class Solution {
    public boolean halvesAreAlike(String s) {
        String s1 = s.substring(0, s.length() / 2);
        String s2 = s.substring(s.length() / 2);

        HashMap<Character, Integer> h1 = new HashMap<>();
        HashMap<Character, Integer> h2 = new HashMap<>();

        h1.put('a', 0);
        h1.put('e', 0);
        h1.put('i', 0);
        h1.put('o', 0);
        h1.put('u', 0);
        h1.put('A', 0);
        h1.put('E', 0);
        h1.put('I', 0);
        h1.put('O', 0);
        h1.put('U', 0);

        for (char c1 : s1.toCharArray()) {
            if (h1.containsKey(c1)) {
                h1.put(c1, h1.get(c1) + 1);
            }
        }

        h2.put('a', 0);
        h2.put('e', 0);
        h2.put('i', 0);
        h2.put('o', 0);
        h2.put('u', 0);
        h2.put('A', 0);
        h2.put('E', 0);
        h2.put('I', 0);
        h2.put('O', 0);
        h2.put('U', 0);

        for (char c2 : s2.toCharArray()) {
            if (h2.containsKey(c2)) {
                h2.put(c2, h2.get(c2) + 1);
            }
        }

        int sum1 = h1.values().stream().mapToInt(integer -> integer).sum();
        int sum2 = h2.values().stream().mapToInt(integer -> integer).sum();


        return sum1 == sum2;
    }
}
```
非エンジニアの自分がEC2のSSH接続を実施する時に参照した記事

公開鍵のパーミッション
https://ticklecode.com/step7-entry-ssh-key/#%EF%BC%91AWS%E3%81%B8%E3%80%8Cec2-user%E3%80%8D%E3%81%A7SSH%E6%8E%A5%E7%B6%9A

SSH公開鍵の設定
https://qiita.com/kazokmr/items/754169cfa996b24fcbf5

Configファイルの影響
https://blog-and-destroy.com/20409

Vimエディタの利用方法
https://howpon.com/17897
MFC から SVG クラスの画像パターン塗り呼び出しサンプルコード

## MFC から SVG クラスの画像パターン塗り呼び出しサンプルコード
ブラシはグラフ座標に合わせて上下反転する必要があります。
今回は 180 度回転で上下反転に対応させます。

MFC(GDI+) の場合以下のようになります。
```cpp
	Gdiplus::Bitmap* pBitmap = 
        ::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");
	Gdiplus::TextureBrush* pBrush = NULL;
    pBrush = ::new Gdiplus::TextureBrush(pBitmap);
    pBrush->RotateTransform(180.0f, Gdiplus::MatrixOrderPrepend);
    Gdiplus::RectF rect(0, 0, 500, 500);
	pGraphics->FillRectangle(pBrush, rect);
    ::delete pBrush;
```

SvgImage への書き出しは「[MFC から SVG クラスの画像呼び出しコードサンプル](https://qiita.com/frashell/private/1093812872c4d3057939)」と同様に画像を読み込みストリーミング変換するためコードが長くなります。
画像の書き出しも同様の処理ですのでストリーミングへの変換関数などを用意しておけば MFC(GDI+) と同程度のコード量になります。

SvgImage に書き出すと以下のようになります。
```cpp
	Gdiplus::Bitmap* pBitmap =
             ::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");

	mdStream* pStream;
	CreateStreamOnHGlobal(NULL, FALSE, &pStream);
	// PNG形式/32ビットカラー/LZW圧縮で保存する
	CLSID	clsid;
	GetEncoderClsid(_T("image/png"), &clsid);
	Gdiplus::EncoderParameters* pEP = (Gdiplus::EncoderParameters*)malloc(sizeof(
            Gdiplus::EncoderParameters) + 1 * sizeof(Gdiplus::EncoderParameter));
	pEP->Count = 2;
	pEP->Parameter[0].Guid = Gdiplus::EncoderColorDepth;
	pEP->Parameter[0].NumberOfValues = 1;
	pEP->Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
	ULONG colordepth = 32;
	pEP->Parameter[0].Value = &colordepth;
	pEP->Parameter[1].Guid = Gdiplus::EncoderCompression;
	pEP->Parameter[1].NumberOfValues = 1;
	pEP->Parameter[1].Type = Gdiplus::EncoderParameterValueTypeLong;
	ULONG compression = Gdiplus::EncoderValueCompressionLZW;
	pEP->Parameter[1].Value = &compression;

	pBitmap->Save(pStream, &clsid, pEP);
	free(pEP);
	HGLOBAL hGlobal;
	GetHGlobalFromStream(pStream, &hGlobal);
	DWORD dwSize = (DWORD)GlobalSize(hGlobal);
	LPBYTE pGlobal = (LPBYTE)GlobalLock(hGlobal);
	CString strName = pSvgImage->AddImagePattern(pGlobal, dwSize, 
                pBitmap->GetWidth(), pBitmap->GetHeight,
                 1.0f, 1.0f, CPoint(0, 0) , 180);

	// ストリームの後処理
	pStream->Release();
	GlobalUnlock(hGlobal);
	GlobalFree(hGlobal);
    ::delete pBitmap;

	CString strPatternUrl;
	strPatternUrl.Format(L"url(#%s)", (LPCTSTR)strPatternName);

	pSvgImage->AddPolygon(lpPoints, nCount);
	pSvgImage->AddAttrFillUrl(strNamel);
```
【H】HTTPレスポンスステータスコードを口語訳したい

よく見るやつの意味がわからなくなったときに見る記事になるといいな〜

## 正確な意味はこれを見ろ

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

## 400番台

400「そのリクエスト、構文エラーかなんか知らないけどよくわからない」
403「お前にここを見る権利はないで」
404「そんなファイルはない」

## 500番台

500「このリクエストどう処理すればいいんですか……はゎゎ……」
503「すまん、サーバー重すぎて受け付けれない」
【まとめ記事】Dynatraceによる監視の始め方

本記事は[Dynatrace Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dynatrace)の1日目です。

過去に投稿したDynatraceによる監視の始め方についてまとめていこうと思います。

まずは[フリートライアル](https://www.dynatrace.com/ja/trial/)を申し込みましょう。15日間無料で使うことができます。

# OneAgentの導入

フリートライアルを申し込んでDynatraceのUIにアクセスできるようになったらまずは監視対象のサーバーに[OneAgent](https://www.dynatrace.com/support/help/shortlink/oneagent-hub)をインストールしましょう。

[Dynatraceによる監視の始め方（Linux編） \- Qiita](https://qiita.com/sukatsu1222/items/b4b5a17bdf0a5983faf9)
[Dynatraceによる監視の始め方（Windows編） \- Qiita](https://qiita.com/sukatsu1222/items/dcfb4e441a0c687f8c6b)

# ActiveGateの導入

クラウド連携やエージェントをインストールできないネットワーク機器の監視、もしくはOneAgentの通信を集約し、帯域の逼迫を防ぐために[ActiveGate](https://www.dynatrace.com/support/help/shortlink/activegate-hub)を導入します。

[Dynatraceをさらに利用するために～ActiveGateの導入～ \- Qiita](https://qiita.com/sukatsu1222/items/7f07122544453253eb4c)

# Kubernetesの監視

Dynatraceは[Operator](https://www.dynatrace.com/support/help/shortlink/full-stack-dto-k8)経由で簡単に監視を始めることが可能です。

[とっても簡単！DynatraceによるKubernetesの監視の仕方（2021年版） \- Qiita](https://qiita.com/sukatsu1222/items/43651f84e70e664763fb)

# AWS監視

[AWSの監視](https://www.dynatrace.com/support/help/shortlink/aws-hub)はCloudWatch API経由でメトリクスやログを取得することが可能です。

[ActiveGateを利用したDynatraceによるAWSの監視 \- Qiita](https://qiita.com/sukatsu1222/items/304c556016596e8bf805)
[DynatraceのLog Monitoring v2を使ってAWSのログを監視してみる \- Qiita](https://qiita.com/sukatsu1222/items/a39c5634d54913b2e825)

# モバイルアプリ

Dynatraceはバックエンドのシステムだけでなくフロントエンドの監視も可能ですが、モバイルのネイティブアプリにも対応しております。

[DynatraceによるモバイルアプリのReal User Monitoring \- Qiita](https://qiita.com/sukatsu1222/items/67d8a089e1cae1f231e8)

# まとめ

Dynatraceの特徴の1つとしてインストールを終えると必要なメトリックの取得から閾値の設定といった初期設定はデフォルトでされた状態で監視が始まります。分散トレースもすぐに確認することができます。
少しでも興味を持たれたらぜひ試してみてください。
OracleVMにOracleLinux８構築


1.以下URLからOracleLinux8の最新のisoファイルをダウンロードする。
      http://public-yum.oracle.com/oracle-linux-isos.html

2.VirtualBoxを起動し,「新規」を選択

3.「名前とオペレーティングシステム」を以下のように選択し、「次へ」を選択する。
>Name：任意
>Machine Folder：変更しない
>タイプ：Linux
>バージョン：Oracle (64-bit)

4.メモリーサイズは任意で「次へ」

5.「仮想ハードドライブを作成する」を選択し、「作成」

6.「仮想ハードドライブの作成」にて、以下のように選択し、「次へ」

>ハードドライブのファイルタイプ：VDI (VirtualBox Disk Image)
>物理ハードドライブにあるストレージ：固定サイズ
>ファイルの場所とサイズ：40.00GB

7.作成された仮想マシンを選択した状態で「設定」を選択し、次のように設定。

>「ネットワーク」の「アダプター 1」の「割り当て」が「NAT」に設定


8．仮想マシン起動

9.ダウンロードしておいたOracleLinux8のisoイメージを選択して「起動」を選択する。
>- 言語選択
>- インストール先は何もせずに完了
>- 「時刻と日付」を選択し、併せたい国に変更
>- 「ネットワークとホスト名」で、右上にあるスイッチを
>Ethernet(enp0s3)、Ethernet(enp0s8)両方ともオンにして完了
>- rootパスワードを設定。

### インストールソースにこれを打ち込む
***
- BaseOS最新
http://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64

- Appstream 最新
https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64

- アドオン
http://yum.oracle.com/repo/OracleLinux/OL8/addons/x86_64

- UEKリリース
http://yum.oracle.com/repo/OracleLinux/OL8/UEKR7/x86_64

- RDMA
http://yum.oracle.com/repo/OracleLinux/OL8/UEKR6/RDMA/x86_64
***

10.これをすべてインストールすると、ソフトウェアの中に「GUI使用」が出てくるので、それを選び「インストール」

11.再起動

## これで、仮想環境構築　完了!!!
VisualStudioで.NET Frameworkのバージョン変更時の『一部の NuGet パッケージが…』エラーor警告対応

# 現象

プロジェクトの.NET Frameworkのバージョンを上げる or 下げるした後に下記。

>一部の NuGet パッケージが現在のターゲット フレームワークとは異なるターゲット フレームワークを使用してインストールされていて、再インストールが必要になる可能性があります。詳細については、https://docs.nuget.org/docs/workflows/reinstalling-packages を参照してください。影響を受けるパッケージ:…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5c61791e-80c8-fec1-ae83-4b5078bed6f8.png)

エラーではなく警告の場合もある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/78b3d8a2-4487-683b-997a-10b861577f21.png)


# 対応

パッケージが **変更前の.NET Frameworkのバージョン** 向きになったままので、コマンドで再インストール。 

ツール ⇒ NuGetパッケージマネージャー ⇒ パッケージマネージャーコンソール 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6cd7a2d6-2dc4-629c-dc51-6a33601fc338.png)

下記コマンド。

```powershell
Update-Package -Reinstall
```

互換性の問題で再インストール失敗することもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/64ff63c8-94af-4a3e-3209-3ca83ca3a485.png)

再インストール失敗 = 下手すると作り直しレベルにまで発展…。
なので、 **『どのバージョンの.NET Frameworkで作るか』** は最初にしっかり調べておこう！
（本番PCや本番サーバーの.NET Frameworkのバージョンをまず確認）


# 蛇足

下記のように選択してる状態で、Ctrl + C押すと、コピーできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c1b1f2c8-c545-b6b5-d29c-e7991df0b4c2.png)

貼り付けすると ↓ こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c7bf652a-3789-e00e-1872-c39c37aba7b6.png)

ググる時にいちいちエラー内容の文字列を手入力しなくてよし。

# 参考サイトさん

https://qiita.com/kawaidainf/items/7801d59bb5fe29d3d2c1

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.4.2
Cesium for Unity で みんな大好き PLATEAU 3D都市モデル を表示してみるよ

Unity にめっちゃ簡単に新宿のリアルな3Dモデルなビル群をならべられるよ。
現地時間の 2022年11月30日 （日本時間の 2022年12月1日深夜かな） にリリースされたオープンソースな仕組みだよ。

5分でできるよ ！！　※　Unity のインストールやアップデートの時間は考慮しないよ

（追記：似て違うもので [PLATEAU SDK for Unity](https://github.com/Synesthesias/PLATEAU-SDK-for-Unity) ってのも2022年12月になってからプロトタイプ版が公開されているよ。こっちはこっちで使いやすいよ。日本人が開発してるはずだし日本語だよ）

### それでは、スタート

まず、このページをざっとみてテンションを上げる

これが公式リリース

https://cesium.com/blog/2022/11/30/announcing-cesium-for-unity/

こっちが公式ページ

https://cesium.com/platform/cesium-for-unity/

![cesium4unity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/4528deee-e3b6-9554-f615-611704e8b8f9.png)

画面中央付近の [Get Started] ってボタンを押すと github にとぶ。

https://github.com/CesiumGS/cesium-unity-samples/releases/tag/v0.1.1


CesiumForUnitySamples-v0.1.1.zip をダウンロードする!

![スクリーンショット 2022-12-01 14.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/5aff55e4-f8c3-9bcd-d915-0bb767f3b944.png)

適当なフォルダに解凍して

![Unity Hub](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/29a0e256-8e65-df3b-d241-bdd3d8914c88.png)

念のために 2021.3.XXf1 系の Unity　でそれを開く　
（わたしは M2 Macbook Air 2021.3.14f1　で試した）

![scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/867f0de1-1f6b-51fc-ffd0-a618b07a27e9.png)

Assets > Scenes で 01_CesiumWorld.unity を選ぶ


![CesiumWorldTerrain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/32ffd46b-1eb2-4474-444d-80f27b92e607.png)

左の Hierarchy 窓で Cesium World Terrain (地形のデコボコのこと） を選んで、右の Inspector 窓で Ion Asset ID と Ion Access Token をセットする。

この辺のトークンやあれこれは、国土交通省さまさまが公開してくれるこれで試してみるのだ！

https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/terrain/plateau-terrain-streaming.md

![CesiumOSMBuildings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/a58f77d3-6535-086c-337c-7640e321d2ce.png)

左の Hierarchy 窓で Cesium OSM Buildings (3D都市(建物)モデルですね) を選んで、右の Inspector の URL をセットする。

この辺のURLは、国土交通省さまさまが公開してくれるこれで試してみるのだ！

https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md

わたしは新宿区（低解像度テクスチャ）ってのにしてみたよ。

`https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13104_shinjuku-ku/low_resolution/tileset.json`

![Cesium.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/93014034-a1d7-e713-9254-bc1b6cee0088.png)

最後に、左の Hierarchy 窓で Cesium を選んで、右の Inspector の Latitude (緯度) / Longitude (経度) をセットする。
わたしは都庁あたりにしたよ。 Lat 35.689571891974474, Long 139.69176952852044。 Height (高さ） はとりあえずざっくり適当。

そして画面上の 「再生」 ボタンを押すと！！

### 新宿がぐりぐり動く！！

https://twitter.com/anotherbrain/status/1597999376542339072?s=20&t=rMyxn8L4a8Lyu-ZyexuDgA

こうなるのであった〜！


追記：あとは PLATEAU なオルソ画像（いわゆる衛星写真）を表示できたら東京都内とかの地面クオリティーがもっとあがるのだけど、ちょっと調査とか時間がかかりそうな気配がするので、後回しにするのであった。（意訳：誰か俺に教えてやってくれ）


---

### 本日 2022/12/01 よりこんなアワードも開催してます。作品募集中なので、ご興味ある方はぜひ！

https://prtimes.jp/main/html/rd/p/000000002.000077007.html

https://2022.minc.app/
【G】Google Driveのファイルも直接参照したい

Dropboxの場合を書いたのでせっかくだからGoogle Driveも。

## 正解

- 共有リンクを得る
- `https://drive.google.com/file/d/XXXXXXXXXX/view?usp=sharing`みたいなURLがとれる
- `/view?usp=sharing`を消す
- `file/d/`を`uc?id=`に置き換える

```html
<img src="https://drive.google.com/uc?id=XXXXXXXXXX">
```

## 補足

`id=XXXXXXXXXX`のあとに`&export=download`をつけると自動ダウンロードリンクになる。これはこれで使えそう。
音声付きのソリティアPGM

<h3>音声付きのソリティアPGM</h3>
音声付きでソリティアができるPGMをPowershellで作りました

githubURL:https://github.com/NanjoMiyako/OnseiSoritire

スクリーンショットURL:https://github.com/NanjoMiyako/OnseiSoritire/blob/main/scn4.png

<hr>
図1URL: https://github.com/NanjoMiyako/OnseiSoritire/blob/main/scn5.png


使い方：プロンプトから以下の種類のコマンドを図1の番号に沿って入力して操作します。

1. A-B：A番目のカードをB番目に移動
2. *A：A番の先頭と末尾カードを出力
3. **A：A番の先頭から末尾までの表カード一覧を出力
4. +： デッキから一枚引く
5. ++ :ゲーム終了

<hr>
IaCの話をする前にインフラの歴史の話をしよう

## これ何
今はやりの Infrastructure as Code について述べたいので、まずはインフラの歴史を振り返ります。

なお、私がインフラに相対したのは、高専時代の 1996年、大島商船高専の電子計算機室に入った時が最初だったと思います。
この頃インターネットが一般家庭にリリースされ始め、それ以前のことは話でしか知らないです。
エヴァンゲリオンがブームだったように思えます。

### 第０世代 オンプレ / データセンターの時代
インターネット黎明期 1996~2000年くらいまで。

システムを立ち上げる時の選択肢が下記
* ホスティングされたWebサーバをアカウントとして借り受ける
* データセンターのサーバ買い切りあるいはレンタル
* 自社（たまに個人もいましたが）でデータセンターのラックもしくは一角を借り受けてサーバを敷設する
* 自社あるいは社内にデータセンターもどきや計算機室を作る

この時期、ちょっとした商用のサービスを立ち上げる時は、データセンターのラックの手配、インフラ屋さんやサーバの手配が必要で、それらを一括でやってくれるSIerのようなものに頼るか、自社の情報システム部の人たちがぎっくり腰と戦いながらサーバ

私が体験したお仕事で、５０台のサーバラックにぶち込んで配線してこいとか聖帝十字陵ごっこ以外のなんだというのか。

はなしがそれました。
この時代のインフラは、ハードウェアであったため、配線図、配置図は物理でした。
Infrastructure as Excel.

### 第１世代 
インターネット成長期 2000~2009年くらいまで。
わかるひとには「にちゃんねるからリーマンショックまで」といえば、想像つくだろうか。

引き続き第１世代をひきずりながらも、VMWareがサーバ仮想化の選択肢として浮上してきた時代。
まだ上記の物理インフラ屋さんや、SIerのハードウェア屋さん、自社の情シス運用部隊は健在です。

物理サーバの運用コストも徐々に下がっていきましたが、インフラコストは以前高止まり、24356のサービス維持、管理も面倒な時代で、繁忙期にないサーバのロードバランスが低くて、フレキシブルな運用のため多忙ではない時間はサーバをshutdownしたりする運用も開発されていました。

一方、VMWareなどの製品では一つのサーバに複数の仮想マシンを走らせることもできており、実際にフロントなどキャッシュが効くノードから徐々にその役割を担うようになってきたように思えます。

この頃の仮想サーバは絶望的にディスクのI/Oが遅く、データベースやバッチサーバなどはいぜんとして物理サーバという風潮が強かったです。

この頃のインフラは、ハードウェアが主役で、仮想化するにしてもインフラを定義するものはあくまでもスナップショットでしかなかったように思えます。

Infrastructure as Template/Snapshot.

## 第1.5世代あるいはプレ第２世代 PaaSとしてのクラウドまでの試行錯誤の時代

2009~2013年くらいまで。

サーバの仮想化技術が進化し、データセンターの中のデータセンターとしてプライベートクラウドがそれなりの選択肢として上がってくるようになった頃。
この頃私はソフトウェアエンジニアの傾向が強かったので、あまりインフラを意識していませんでしたが、依然としてハードウェアの制約は強く仮想化された環境も徐々にマシになっていった印象があります。

そして、リーマンショックから立ち直った東日本大震災の直前、2011年3月2日、ついに日本にAWSの東京リージョンが誕生します。

震災の後くらいから、震災や電力需要などの理由から、物理ロケーションを超えた可用性が重視されるようになり、データセンターの需要が一時的に関西に集中したのを覚えています。
このあたりあまり見ていなかったのですが、PaaSクラウドの採用事例が徐々に専門誌を賑わすようになってきたようになってきたような気がします。

Ansibleが2012年の2月、OpenStackは2010年。

## 第２世代　パブリックPaaSクラウドの時代

2014年~
そして人類は気づいてしまったのです、物理サーバが要らないことに。
リースも管理も所有もなく、ただ、機能を果たす仕組みと安○性にお金を出せばいいということに。

仮想化の覇権を争う時代、それを象徴するような事件がこちら。
https://www.nikkei.com/article/DGXNASFK2600L_W2A620C1000000/

○ァー○トサーバ、この時代に生きたインフラ屋さんなら聞いたことがあるでしょう？

そして日本は・・気がつくとやられてましたね。AWSに、Azureに。
国産クラウドがなにからなにまで微妙であったこと、これは日本のITが製造業とサービス業の僕でしかなかったことに由来すると思っていますが、いつのまにか入り込んでいた黒船、巨人には勝てなかったです。

徐々にデータセンターにデプロイされるサーバの数は減り、EC2がそれに取って代わるようになってきます。
Terraform(2014年7月28日)がこの頃。

## 第３世代　全てをクラウドへ　オンプレもクラウドにつながる時代
2016年ごろにはもうこの風潮であったと記憶しています。

クラウド上のインフラは物理サーバよりは圧倒的に設計、実装が楽になったとはいえ、物理ではない面での煩雑さを解決しようとする動きがうまれます。
それがコンテナであり、k8sであり、インフラを設定ファイルやテンプレートで管理しようという流れです。

そしてもう一つの目的が、ソフトウェアの開発者がインフラを扱えるようにしようという試み。
１０年前よりも、ソフトウェアエンジニアは圧倒的にインフラと近いところにいます。

彼らが、自分の言語でインフラを管理しようと思うのは、自然なことだと思います。

（つづく）
AWS CloudWatch Dashboardで見ておくと良さそうなメトリクス

## はじめに

本記事は、[エムスリーキャリア FY22 AdventCalendar](https://qiita.com/advent-calendar/2022/m3c)の３日目の記事になります

## CloudWatch Dashboardって？

下記の記事に紹介されているように、１ページで、よくみるメトリクスを確認できるページが作れるサービスです。

https://qiita.com/simeji/items/0bdd9bfbcd812c37bc67

## Dashboardをどう運用するべきか

初めはとりあえず作ってみて、週次で見てみるとかすると良いと思います。

アラートを整備すればいいという話もありますが、アラートを整備するのも大変ですし、アラートが多いと、閾値を見直すのも大変です。もう少しカジュアルに運用するという意味ではDashboardを定期的に見ていき、並行してアラートも整備していくのが良いと思います。

また、アラートが上がる前に問題が発生する兆候を発見することができると、プロアクティブに対処することが可能なので、時間的にも精神的にも余裕を持って対処することができます。

## 見ておくとよいメトリクス

私たちのチームで見ているメトリクスは下記の通りです。ほんと最低限しか見ていないので、他にもアプリケーション特性によって監視するメトリクスを増やしてください。

### ALBのTargetResponseTime(平均、およびp99(99% tile)）
- トラブルシュートの手順は[こちら](https://aws.amazon.com/jp/premiumsupport/knowledge-center/alb-troubleshoot-targetresponsetime/)でも紹介されています。
- この指標を2つ合わせて見ておくだけでも、かなりの割合でパフォーマンス劣化が起きてないかどうかがわかります。
- これが悪化している場合、アプリケーションまたはDBなど別のミドルウェアがボトルネックになっている可能性があります。

### ALBのRequestCount（合計）
- 上のTargetResponseTimeにある、トラブルシュートの手順と組み合わせて使います。
- アクセスが多すぎる場合は、暫定対応としてはVPCの設定でIPブロックが可能かどうかを検討します。 あるいはCloudFront + WAF + Sheildを導入しておくとアクセス数が多くても問題になりにくくなると思われます。

### ALB の 4XX, 5XXアクセス件数（合計）
- 単純にアプリケーションエラーが多発していないか見ます。

### RDSのCPUUtilization
- RDSインスタンスの負荷を確認するのに大事
    - もし負荷が高かったら、どのクエリの負荷が高いのか、RDSのPerformance Insightsを使って確認してみるのがよい（無料でも使える。有効化が必要。）

### RDSの CPUCreditBalance, BurstBalance
- CPUCreditBalanceはt系インスタンスをRDSで使用している場合には見ておくと良いです。
    - ただしクレジットが枯渇してもRDSの場合はバーストし続けてくれるそうですので、どちらかというと予算超過しないために必要な設定になります。
- BurstBalanceは全てのRDSインスタンスで見ておくと良いです。とくに　IOが多いアプリケーションについては、EBSのIOクレジットが枯渇しないかを一応見ておくと安心です。

### RDS の NetworkReceiveThroughput, NetworkTransmitThroughput
- これらは **ネットワークIOクレジット** を監視する際に必要です。例えばRDSにラージオブジェクトを格納している場合に特に注意が必要です。
    - ElastiCacheにラージオブジェクトを格納していても、これらのメトリクスを監視した方が良いです。（ElastiCacheの場合、 NetworkBandwidthInAllowanceExceeded, NetworkBandwidthOutAllowanceExceededのようなメトリクスもある模様。）
- ネットワークIOクレジットについては、 [「Amazon EC2 インスタンスのネットワーク帯域幅」の使用可能なインスタンスの帯域幅
](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth) を参照してください。
    - ただし、ネットワークIOクレジットは、CPUクレジットなどと異なり、CloudWatchのメトリクスもなく、メカニズムもほとんど公開されていません。
    - よって、EC2インスタンスに設定されているネットワークのベースライン帯域幅以上のトラフィックが発生するようであれば、ネットワークIOクレジットが枯渇するリスクがあると見て、インスタンスタイプを上げるか、トラフィックを減らすチューニングをするかする必要があります。

## おわりに

いろんな方が、監視しておくのにおすすめのメトリクスを紹介していると思いますので、その一例として参考にしていただければ幸いです。
Cargoプロジェクト以外でもrust-analyzerを使いたい

この記事は、[Ateam Group U-30 のカレンダー | Advent Calendar 2022 - Qiita](https://qiita.com/advent-calendar/2022/ateam-group-u30) の 3 日目の記事です。

https://qiita.com/advent-calendar/2022/ateam-group-u30

## はじめに

Rust の練習がてらに[rustlings](https://github.com/rust-lang/rustlings)をやっているのですが、[rust-analyzer](https://rust-analyzer.github.io/)の補完や型チェックがほしいと思ったので、VS Code で Cargo プロジェクト以外でも使えないか調べてみました。

## 結論

`rust-project.json`を以下のいずれかの方法で設定することで使える様です。

- 対象のプロジェクトのルートに`rust-project.json`ファイルを配置する
- VS Code の`rust-analyzer.linkedProjects`の設定に、`rust-project.json`ファイルへのパスを記述する
- VS Code の`rust-analyzer.linkedProjects`の設定に、直接`rust-project.json`ファイルの中身を記述する

`rust-project.json`ファイルは以下のような内容を記載しておきます。

```json:rust-project.json
{
  "sysroot_src": "/home/ohakutsu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library",
  "crates": [
    {
      "root_module": "src/main.rs",
      "edition": "2021",
      "deps": []
    }
  ]
}
```

`sysroot_src`は自身の環境に合わせて設定をする必要があります。

また、各設定項目に関しては、[Non-Cargo Based Projects - User Manual](https://rust-analyzer.github.io/manual.html#non-cargo-based-projects) に詳しく載っています。

上記の設定を行うことで、rust-analyzer が動くようになりました。

![スクリーンショット 2022-11-23 13.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/7f8928d6-81e3-0070-f0a5-b3c801621985.png)

## さいごに

間違っている点などありましたら、ぜひコメント・編集リクエストをいただけると勉強になります！

## Refs

- [Non-Cargo Based Projects - User Manual](https://rust-analyzer.github.io/manual.html#non-cargo-based-projects)
- [Feature Req: Add support for Rust files without Cargo.toml or valid cargo workspaces · Issue #4477 · rust-lang/rust-analyzer](https://github.com/rust-lang/rust-analyzer/issues/4477)
- [rust-analyzer/rust-project.json-example - GitHub](https://github.com/rust-analyzer/rust-project.json-example)

---

ぜひ、[Ateam Group U-30 のカレンダー | Advent Calendar 2022 - Qiita](https://qiita.com/advent-calendar/2022/ateam-group-u30) を購読設定して、明日の記事もご覧いただけると嬉しいです。
PHPUnit を簡単に自作した

## PHPUnit を自作した
PHP の勉強ついでに、PHPUnit のコードを読んで、それを実装してみました。成果物は主に下のファイル。

https://github.com/YmBIgo/Mini_PHPUnit/blob/master/src/MyPhpUnit.php

## PHPUnit とは

PHPUnit と言えば、PHP のテストではみんなが使っていると言われているライブラリーです。
最新版のバージョンは 10 になっていて（ dev バージョンなので、一番使われている最新版は 9.5 や 8 などになると思います）、10 と 8 や 9 は内部の関数の仕様が変わっていたりしています（`run` の返り値が `TestResult` から `void` に変わるなど... ）。

#### PHPUnit の使い方

https://qiita.com/YmBIgo/items/dcd814944f68b2b25314

などを見れば、PHPUnit10 の使い方が書いてありますが、Composer で簡単に使い方を説明すると、

```php:./tests/CounterTest.php
<?php

require 'vendor/autoload.php';

use PHPUnit\Framework\TestCase;

class CounterTest extends TestCase {

  public function testCounter() {
    $counter = 1;
    $this->assertSame($counter, 1, "This should be equal.");
  }

}

```

のようなファイルを書いて、

```
./vendor/bin/phpunit ./tests
```

を実行すれば、テストを実行できます。

## ミニ PHPUnit の解説

PHPUnit を読んでみると、PHPUnit 自体は全て理解しようとして読むのはタフで大変ですが、簡単に実装するだけなら簡単です。実際読んでみれば、PHPUnit の基本の「キ」くらいは分かるのではないでしょうか？
一応ソースコードの解説をします。

---

全体像を説明すると、

1. MyPHPUnit を継承したクラスと MYPHPUnit自体 からメソッドを全取得。
2. メソッド名から、テストのメソッド・テスト前に実行するメソッド・テスト後に実行するメソッド を分ける。
3. 分けたメソッドを順番通りに実装し、テストメソッドでは結果を集計する。
4. 結果を取得する。

では、コードを読んでみましょう。

###### メソッドの全取得

まず、メソッドの全取得を行なっているのが、[ここ](https://github.com/YmBIgo/Mini_PHPUnit/blob/d6eb16a234580a1f1e3b1cd131ff5577f9edb4f4/src/MyPhpUnit.php#L53-L54)の、

```php
		$current_class = new ReflectionClass($this);
		$class_methods = $current_class->getMethods();
```

になります。継承しただけで、親の方から子のメソッドにアクセスできるなんて、PHP は簡単にできていますね。

###### メソッドの分別

次に、上で取得した $class_methods を Test配列・Before配列・After配列に分別します。

```php
		foreach ($class_methods as $class_method) {
			$class_method_name = $class_method->name;
			if (str_starts_with($class_method_name, "test")) {
				array_push($test_methods, $class_method_name);
			} elseif (str_starts_with($class_method_name, "before")) {
				array_push($before_methods, $class_method_name);
			} elseif (str_starts_with($class_method_name, "after")) {
				array_push($after_methods, $class_method_name);
			}
		}
```

###### テスト・Before・After を順番に実行

内容は簡単ですが、[run](https://github.com/YmBIgo/Mini_PHPUnit/blob/d6eb16a234580a1f1e3b1cd131ff5577f9edb4f4/src/MyPhpUnit.php#L34-L50) で テストを実行しているのがわかると思います。
原本のコードだと、[ここ](https://github.com/sebastianbergmann/phpunit/blob/35136a4fb2045460949428bd138c9c091441e5be/src/Framework/TestCase.php#L1015) らへんになります。

```php
		foreach ($before_methods as $before_method) {
			$this->{$before_method}();
		}
		foreach ($test_methods as $test_method) {
			$this->setName($test_method);
			$this->run();
		}
		foreach ($after_methods as $after_method) {
			$this->{$after_method}();
		}
```

###### 結果の取得

最後に結果を `MyPHPUnit->getResult()` から取得します。
コードを読んでみると、中身は結構簡単に見えると思います。

## 最後に

ここまでコードを辿れば、PHPUnit のやっていることが、分かったのではないでしょうか？
簡単な実装だけなら、結構簡単でしたね。
中身のもっと難しい実装に興味を持ってもらって、PHPUnit の気持ちになって開発ができる一助になれれば幸いです。
テスターから広報・マーケになって感じたこと

##
みなさま、はじめまして。@apstk_zifa です。
現在は広報・マーケのお仕事を担当しております。

今年の春にテスターから、
広報・マーケに業務内容が変わり様々なことを経験させていただきましたので、
感じたことなどを、書き連ねていってみようと思います。


## ◇自己紹介
・前職は飲食店などでトリプルワークをしていた(フリーター)
・テスターも広報も全くの未経験
・表現関係のことも趣味的な感じでやっている。なのに緊張しい
・珈琲が大好き
・ゲームはタクティクス系が好き

## ◇テスターをしていたころ
テスターは約2年ほど経験しました。
テスターとして未経験入社をしましたが、本当に全くの未経験だったので、毎日インプット/アウトプットの繰り返し。
案件のテスターをしたりテスト設計を少しさせていただいたり・・・・テストリーダーもさせて頂いたおかげで様々な知識や経験が身につきました。

## ◇テスターから広報・マーケへ・・・・
社内で広報・マーケを出来る人を探していたのもあって、広報やってみない？とお声がけしていただきました。
（色々経て上記のようになったのですが、それはまたどこかで・・・笑）

好奇心旺盛で知らないことはとりあえずやってみる！タイプの人間だったので、
結構な二つ返事でやります！と言って少しずつ広報・マーケのお仕事をさせていただくことになりました。
（もちろん広報のお仕事にも昔から興味がありました）


## ◇広報・マーケになって
とはいえ、広報・マーケも全くの未経験です。右も左もなんのこっちゃわかりません。
お仕事のお相手も、業務内容も全くと言っていいほど異なるし、知らない用語が飛び交っています。
毎日ひいひいしながら調べものをしたり、お知らせ出すたびにド緊張していました。
MTGも追いつくのに必死、イベントも夏秋は盛りだくさん！という感じで毎日がむしゃらでした。
とはいえ「知らないことを知る」というのが好きなのでこんなことあるんだ！こういう考えもあるんだ！と毎日学ぶことばかりで楽しさもありました。

現在の業務内容としては、
- プレスリリース作成/配信
- イベントの企画/運用
- SNS/ブログ（次世代ゲームテスト研究所）の運用
- ちょっとしたデザイン物の制作

などなど・・・一般的に言われているであろう広報のお仕事をさせていただいています。
テスターさんのお仕事とは全く違いますね、本当に。

今はかなり業務に慣れて、春よりは余裕があるのでは！と思っています。

## ◇テスターから広報になって
テスターから広報になって、以下の点は非常に良かったなと思います。

- 現場や営業側のどちらの意見も理解がしやすい
- テストについての知識があるので、自社の売り出しポイントも課題も分かる
- 自社ツールへの把握も早い（と思いたい）

現場の困ってることや、やりたいことなども現場を多少知ってるので割と理解がしやすいというのが最大のメリットだと思っています。

# ◇さいごに
テスターから広報になっている方はあまりいらっしゃらないだろうということはなんとなく察しています。
なのでテスターから広報になるのおすすめ！！！とは言いません。
が、何の業務をしても姿勢は変わらずで、一旦飛び込んでみる精神はどこにいっても大事だし、様々な方の意見を聞くというのも何に対しても大事かなと思っています。
（もちろん様々なことをさせて頂ける環境も必要です。）

結局何が言いたいかというと、
<b>何の仕事をするかではなく、どんな姿勢で向き合うかが大事</b>なんじゃないかなと思っています。
これからも私はやりたいこと、気になることはどんどんやってみる精神で突き進んでいこうと思います。（もちろんたまには立ち止まります。）


なんか色々連ねてみましたが、最後までお読みいただきありがとうございました。

次世代ゲームテスト研究所や、Twitterも覗いてみてくださいね。笑
という広報っぽいことをして終わりたいと思います。ありがとうございました。
正常系と異常系と準異常系

テストケースを大まかに分類すると **「正常系」「異常系」「準正常系」** に分類することができます。
それぞれの意味は↓です。画像アップロード機能を例として挙げると

 -  **正常系** 
    - 想定内の入力をした時に想定通りの出力ができることの確認
        - 例) 正常に画像をアップロードできることを確認する
 -  **異常系** 
    - 想定外の入力をした時の挙動の確認(想定外エラーの確認)
        - 例) 画像アップロード中にネットワークエラーの時の挙動を確認する
 -  **準正常系** 
    - 想定外の入力ではあるが、想定通りの出力ができることの確認(想定内エラーの確認)
        - 例)想定外の拡張子をアップロードした時のエラー挙動を確認する

異常系や準正常系に目を向けてテストケースを作成するようにすると網羅的なテストができるようになります。また、異常系や準正常系についてテストパターンが膨大になる場合は同値分割の考え方を応用して代表値の入力パターンを考えるようにすると少ないテストケースで網羅的な可能になります。

組込み系ソフトウェア/ミドルウェアの開発では極力異常系パターンは減らしたいので仕様設計の段階で準正常系のパターンを決め込んでいく⇨全パターンテストする、ことが多かったです。