OmniAICreator/Qiita-1.07M huggingface dataset:
GCED受験記

# はじめに
GCED（GIAC Certified Enterprise Defender）はGIACが提供する資格試験の1つです。
最新の試験範囲、問題数等は以下の公式サイトを参照してください。

https://www.giac.org/certifications/certified-enterprise-defender-gced/

本記事ではGCED試験の特に試験範囲について記載し、今後受験を検討する際の参考になる情報を記載しています。

# 試験概要
本記事執筆時点（2024年2月28日）の問題数は115問、試験時間は3時間です。
他のGIAC試験と異なり、CyberLive（実技試験）は出題されません。
試験範囲は以下のとおりです。

Defending Network Protocols
Defensive Infrastructure and Tactics
Digital Forensics Concepts and Application
Incident Response Concepts and Application
Interactive and Manual Malware Analyses
Intrusion Detection and Packet Analysis
Malware Analysis Concepts and Basic Analysis Techniques
Network Forensics, Logging, and Event Management
Network Security Monitoring Concepts and Application
Penetration Testing Application

# 試験範囲について
上記の通り、試験範囲はかなり広いです。ルータの設定、ペネトレーションテスト、フォレンジック、マルウェア解析、パケット解析といった分野を中心に出題されます。これに加えて一部ですがクラウド、ログ分析に関する問題が含まれ、およそセキュリティ分野の技術的な要素はほぼ含まれる試験といってよいと思います。

# 試験のレベル感
試験範囲が広いならその分1つ1つの問題は簡単なのだろうと思っていましたが、意外とそうでもありません。
例えばネットワークに関する問題であれば、「SSHのポート番号は？」のようなレベルの問題は出ません。SSHが22/tcpであることを知っている前提で答える問題が出題されます。また、TCPやIPヘッダも一通り知っておく必要があります。もちろんその他のヘッダからも出題される可能性があります。
マルウェア解析であれば、静的プロパティ解析、動的解析、リバースエンジニアリングの違いはもちろん、Windows APIまで出題されますし、難読化、パックといったよく使われるテクニックも含まれます。
フォレンジックであれば、各種アーティファクトを正しく理解していないと解答できない問題が出題されます。
ペネトレーションテストであればnmapやMetasploitを実際に使っていないと解けない問題が出てきます。この他ペネトレーションテストの流れも含まれます。
入門向け資格であるGSECであればどれも概要レベルで出題されますが、GCEDではそれなりに深い知識が要求されます。

試験のレベルの目安ですが、例えばペネトレーションテスト分野であればGPENやGWAPT、マルウェア解析はGREM、フォレンジックはGCFEといった具合に、各分野に特化した別の試験があります。これらで出題される内容と比較して、個々の問題そのものの難易度はそこまで変わらないと思います。
例えばGCED、GCFE共に各種フォレンジックアーティファクトが出題されますが、問題の難易度は同程度だと思います。GCFEではより広範囲のアーティファクトから出題されていると思われます。
GPEN、GWAPT、GREMも同様に、個々の試験よりは狭い範囲から出題され、難易度は同程度という感じです。
他のGIAC資格を持っている人はイメージできると思いますが、意外と難易度は高めだということが理解できると思います。

# 試験対策
SEC501のトレーニングの受講するのが一番ですが、難易度、内容を考慮するとその必要はないと判断したため、2回の模擬試験のみで受験しました。
模擬試験に出てきた知らない用語は調べてメモした上で本番に臨みました。
ただ本番ではこのメモを見ることはあまりなく、ほぼ今の知識で解答しました。

なお、2回の模擬試験でペネトレーションテスト、フォレンジック、マルウェア解析、ネットワークについては概ね正答できており、逆にルータの設定はほぼ経験がないことから誤答が目立ちました。ただこれに関しては出題数は少なく、出題されたら捨て問と割り切って適当に選択して解答するという方針としました。

試験結果は80%で、合格点の69%を十分上回る結果でした。

# 感想
GCEDは認定者5000人ほどで、他のGIAC資格と比べると人気がある資格ではありませんが、私はこの試験はかなり良いと思いました。
特定の分野の経験が長い人は別の分野の知識が不足しがちです。以前は私もフォレンジックばかりやっていたため、他の分野の知見はほぼありませんでした。専門性が高いことは良いことですが、他の分野をある程度知っておくことは自身の専門性をさらに高めることにつながりますし、他の分野の面白さに気付けるかもしれません。
セキュリティの経験が長い人ほどこういった広い範囲かつそこそこ深い内容の試験が良いのではないかと思いました。逆にセキュリティ入門者はまずGSECの方が良いかもしれません。GCEDは技術面に特化しており、セキュリティの基本的な考え方の部分はあまり出てこないため、同じGIACを受けるならGSECの方が良いと思います。

なお、本試験は115問の選択式問題のみが出題されます。英語のネイティブスピーカーではない人にとって115問の選択式問題はかなり大変だと思います。GIACが初めてという方は問題数が少ないCyberLiveがある別の資格の方が良いと思います。CyberLiveの方が問題自体も簡単で、長文の英語を読む必要もありません。
[翻訳転載] Golang Tip #14: エラーメッセージを大文字で始めたり区切り記号で終えたりしない

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1755232851401076925?s=20

# エラーメッセージを大文字で始めたり区切り記号で終えたりしない

これは、最初は少し変に見えるかもしれないですが、実用的な理由があります。

**なぜ小文字で始めるのでしょうか？**

エラーメッセージは他のメッセージと組み合わされることがあります。

もしエラー文字列が大文字で始まっていると、それが文の途中に挟まれたときに不自然に見えたり、場違いに見えたりします。

![image](https://pbs.twimg.com/media/GFvVNPvbYAAX3-r?format=jpg&name=medium)

エラーメッセージを小文字で始めると、組み合わされたメッセージに、そのメッセージをより自然になじませることができます。

``` console
// application startup failed: failed to initialize module: could not open the database
```

もう一つのポイントは、メッセージの最後に"... "が現れることです。

これは、フォーマットされたエラー文字列の`%w`に続くテキストは、メッセージ全体の最後に追加されることを意図していることを意味します。

**なぜ区切り記号で終えないのでしょうか？**

それは、あるメッセージが別のメッセージに追加されたとき、
その結果がフレーズのごちゃまぜではなく、首尾一貫した文のように見えるようにするためです。

# おわりに

go1.20で[`errors.Join`](https://cs.opensource.google/go/go/+/refs/tags/go1.22.0:src/errors/join.go)が追加されている。
この関数でエラーを結合すると、`: `ではなく、　`\n`で結合されたメッセージとなる。
こうなると大文字始まり/区切り文字終わりのエラーメッセージを結合した際の不自然さが軽減されるのではないかと思っている。

つまり大文字始まりや区切り文字終わりについては気にしなくてもよくなったのかもしれない。
PHPのcurl拡張モジュールでDNSやhostsを使わずに名前解決する方法

# はじめに
コマンドラインのcurlでは、`--resolve` オプションを利用することで、DNSやhostsを利用せずに指定されたドメイン（FQDN）の名前解決を行うことができます。

※`-H 'Host: example.jp'` のようにリクエストヘッダとしてHostを渡すことでも同様の対応は可能ですが、HTTPSの場合SNIを考慮する必要がある（リクエストヘッダとしてHostを渡す方法だけではSNIを考慮することができない）ため、 基本的にはリクエストヘッダではなく `--resolve` オプションを使うのがベターです。

https://everything.curl.dev/usingcurl/connections/name

この方法は、本番環境移行時におけるDNS切替前のリリース前確認（バックエンド内のAPI通信の動作確認）のような場面において非常に役立ちます。また、DNSやhostsの変更が行えない開発環境・検証環境においても有効です（レンタルサーバ、PaaS/FaaS、自分が管理者ではないサーバ等）。

# PHPのcurl拡張モジュールで `--resolve` オプションを利用する

PHPのcurl拡張モジュールで `--resolve`オプションを利用する場合は、次のように指定します。
```php
curl_setopt($ch, CURLOPT_RESOLVE, [$fqdn . ':'. $port . ':127.0.0.1']);
```
`$fqdn` リクエスト先サイト（システム）のFQDN
`$port` リクエスト先サーバ（ホスト）のTCPポート番号
`127.0.0.1` リクエスト先サーバ（ホスト）のIPアドレス

# コード

以下のコードは、Wordpressのプラグインやテーマファイル上でcurlを利用する例になります。Wordpressでは `home_url()` で公開URLを取得することができますので、こちらの値を加工してFQDNとして活用することとします。

なお、以下では移行環境や開発環境、検証環境を想定して `CURLOPT_SSL_VERIFYPEER` を `false` （サーバ証明書を検証しない）を追加しています。こちらは環境に応じて要否を判断のうえ、必要であれば追加し、不要であれば削除します。

```php
<?php

$url = home_url() . '/hoge';
$fqdn = str_replace(['https://','http://'],['',''],home_url());

if (! isset($port)) {
	$port = strpos(home_url(), 'https://') !== false ? '443' : '80';
}

curl_setopt($ch, CURLOPT_RESOLVE, [$fqdn . ':'. $port . ':127.0.0.1']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$result = curl_exec($ch);
curl_close($ch);
```
[翻訳転載] Golang Tip #13: 空スライスとnilスライス

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1754852685369524574?s=20

# 空スライスとnilスライス

値を持たないスライスを使用するには2つの方法があります。

- **`var`の使用： `var t []int`**

この方法は`int`型のスライス`t`を初期化せずに宣言します。
このスライスはnilとみなされます。

これは、実際には基底となる配列が存在しないことを意味します。
スライスの長さ (`len`) と容量 (`cap`) はどちらも`0`です。

**- リテラルの使用： `t := []int{}`**

`var`の使用とは異なり、このスライスは`nil`ではありません。
これは要素を持たない配列を基底するスライスです。

**さて、慣例とみなされるのはどちらでしょうか。**

1 . **nilスライスはメモリを割り当てません**

空スライスが基底となる配列に少量のメモリを割り当てるのに対して、
nilスライスは対象の存在しないただのポインタです。

ほとんどの場合、この差は無視できるものですが、
高いパフォーマンスを求められるアプリケーションでは大きな差になる可能性があります。

2 . シンプルさとゼロ値というGo言語の哲学により慣用的であると考えられているため、**Goのコミュニティはnilスライスのアプローチを好んでいます**

3 . **例外もあります**

たとえば、JSONを扱う場合、nilスライスと空スライスでは動作が異なります。

A nil slice (var t []int) encodes to JSON as null, whereas an empty slice (t := []int{}) encodes to an empty JSON array ([]).
nilスライス（`var t []int`）はJSONに`null`としてエンコードされますが、
空スライス（`t := []int{}`）は空のJSON配列（`[]`）にエンコードされます。

4 . また、**要素を持つスライス、空スライス、およびnilスライスを同様に扱う**ようにコードを設計することも慣用的です。

Goに十分慣れているならご存知かと思いますが、
`for range`、`len`、`append`などでnilスライスを使用してもパニックにならずに動作します。

![image](https://pbs.twimg.com/media/GFp81dGXkAADvEb?format=jpg&name=medium)

# おわりに

スライスとその基底配列の関係については以下わかりやすかった。

https://qiita.com/seihmd/items/d9bc98a4f4f606ecaef7
オンライン会議でリアクション機能をもっと使おう

オンライン会議時、参加者の反応が分かりづらいという問題に対して
カメラをオンにしてもらうという対策をとられることがありますが、
個人的にはリアクション機能の利用がもっと普及してほしいと思います。

# リアクション機能を使いたい理由
1. カメラはオンにしたくない場合も多い
    - CPU/メモリ/帯域などの都合
        - 特にエンジニアの場合、裏でビルドやテスト、VMなどを起動していることも多い
    - 寝癖や化粧などの都合
        - Zoom標準のアバター機能もあるが、瞬き・口の動き・頭の向きしか取れないので厳しい
1. 画面共有を行っている場合、そもそも参加者はあまり見えない
    - 一列で数名しか表示されず、参加者がそれ以上の場合は見切れる
　    - ディスプレイ1枚の場合はスペースの都合で参加者を非表示にすることも多い
    - プレゼンかつ発表者の場合、発表者ツールで更に画面スペースが削られる

もちろんカメラをオンにして表情や仕草で伝えることは有効ですし、
リアクション機能では伝えられない微妙な意図も伝えることができますが、
画面共有をしていることが多かったり、大勢の参加者がいたりする場合などは
そもそも伝わらない可能性が高くなりますので併用していくのがいいと思います。

# チャット機能という選択肢もあるにはある
勉強会などでは発表後にチャット機能を使っての拍手などを促される場合もありますが、
個人的にはチャット欄に88888などと書くのは少し馬鹿らしく感じたり、他の意味のある発言を流してしまうので苦手です。
発表者にとって反応は大事だと思っているので他の手段がなければやるのですが、
リアクション機能が用意されていればそちらのほうが気軽に反応を返すことができます。

# ジェスチャー機能
Zoomにはジェスチャー機能が搭載されており、カメラオンの状態で挙手あるいはサムズアップをすると、そのジェスチャーに応じたリアクション機能が実行されます。
まだ有効活用できたことはないのですが、今後機能が進化して、頷く・首をかしげるといったものも検知してリアクション機能と連携するようなことが可能になれば、2番の表示が見切れる問題については緩和していくかもしれません。
（嫌がってオフにされることも多そうですが）


# まとめ
・司会/発表者は反応がないと不安になるので、参加者は意識して反応を返すようにしよう
・反応を返す上ではリアクション機能が確実。他と併用するとなお良い

# TODO
現状とリアクション機能利用推進後に2回アンケートを取って、
聞き手の反応がみえにくいという不満が減少するかどうかを定量的に追いかけたいです。


[Web会議で不便・不満を感じる点の市場調査レポート](https://prtimes.jp/main/html/rd/p/000000372.000032317.html)
要素を横に並べる

次のようなリストをCSSで横並びにしてみる。
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/69a9bf9e-9b1a-5ed9-6517-cbf73c8ae1d6.png)



①リストをインラインにする
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/5992e3f4-6113-5677-44cc-997c4e5add7c.png)


②floatを使う
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/75222875-0ebb-e450-436c-999c174c0ff7.png)

③flexを使う
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/db06a515-21d4-6e1d-5b2f-a3de27c26e3c.png)

・flexについて
flexは親要素が子要素を横並びにさせる。
justify-contentなどで様々な配置をしていさせることができる。

![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/6d3fc476-9cf0-a649-3d7b-78a238312783.png)
Turbo Streamsを利用してモーダル画面表示と他の処理を同時に行った

## 今回実装した処理の流れ
フォーム送ると、①非同期のジョブ、②モーダルの表示、③ジョブ結果を描画するテーブルの表示、の3つの動作を同時に行う機能を実装しました。
この記事ではそのturboのでのモーダル表示部分のみを記録しています。


## 実装したもの
モーダル部分
```index.html.erb
<div id='modal-container'></div>
```
これだけ。ここをturbo_streamによってパーシャルに書き出したものと置き換えることでモーダル画面を描画させる。
<br>


同じページのボタン部分
data: { turbo_stream: true }をつけるとコントローラーでturbo_streamのリクエストとして受け取ることが出来ます。
```index.html.erb
<%= form_with url: hoge_path(@hoge), scope: :huga, data: { turbo: true } do |f| %>

```

<br>

切り出したパーシャル。bootstrapのモーダルを使っています。
モーダル表示と同時実行で行われる別の処理の終了をもってモーダルを閉じるためにこのような実装をしています。
```_modal.html.erb
<div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">モーダルのタイトル</h5>
      </div>
      <div class="modal-body">
        中身
      </div>
    </div>
  </div>
</div>

<script>
  $('#modal').modal('show');

  const checkHogeJob =() => {モーダルが表示されている間に実行する別の処理。処理完了後にmodalを再度非表示にする}
</script>
```
<br>


コントローラー部分

```controller.rb
def create #ジョブの実行、モーダルの表示、ジョブを保持するテーブルを表示する動作を行う
    hoge_log = @hoge.logs.create!
    HogeJob.perform_later(hoge_log, @hoge.id)
    
    # respond_toで処理を分ける
    respond_to do |format|
      format.turbo_stream do
        render turbo_stream:
         # update:対象のidを持つ要素の中身を書き換える
          turbo_stream.update('modal-container', partial: 'admin/hoge/modal', # アドミン配下のときはパスを書かないといけない
                                                 locals: { hoge_log_id: hoge_log.id }) +
        # ジョブの結果を保持するためのテーブルも同時に表示させた 
          turbo_stream.update('hoge_logs_table', partial: 'admin/hoge/hoge_logs_table',
                                                   locals: { hoge_logs: @hoge_logs })
      end
    end
  end
```




<br>


## 参考にした記事
https://qiita.com/mochimochifarao/items/9c5cd27f554d462f4d2e

https://pikawaka.com/rails/respond_to

https://getbootstrap.jp/docs/4.2/components/modal/
urlparseのparamsとは何者か

# 初めに
https://docs.python.org/ja/3/library/urllib.parse.html

urlparseの結果には以下のようにparamsという値があります
```
ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='',
            query='query', fragment='fragment')
```
ドキュメントの説明を見ると**最後のパス要素に対するパラメータ**とありますがイミフです
さらにサンプルを見ても全て空になっており、どういう場合に入るのかわからなかったため調べました


# 結論
以下のようなURLの場合に入ります
https://hoge/users;id=123
```Python
from urllib.parse import urlparse

url = 'https://hoge/users;id=123'
print(urlparse(url))
```
```
ParseResult(scheme='https', netloc='hoge', path='/users', params='id=123', query='', fragment='')
```

# これはなんなのか
マトリクスパラメータというものらしいです
こちらに詳しい解説などがありました

https://www.baeldung.com/cs/url-matrix-vs-query-parameters

クエリパラメータはリクエスト全体に適用するのに対して、マトリクスパラメータはパスに対して適用するものという考え方らしいですが、一般的じゃ無いのでマトリクスパラメータはあんまり使わない方がいいよってことみたいです

本来は
https://hoge/users;id=123/friends
みたいなパスの途中にマトリクスパラメータを入れるみたいなこともありらしいですが、パスの途中だとurlparseは解釈できないみたいです（だから**最後のパス要素に対するパラメータ**ってことなのかも）


あと、サーバーの解釈違いによる脆弱性みたいなのもあるらしいです

https://www.ubsecure.jp/blog/20230302

# 最後に
マトリクスパラメータが必要になる場面は滅多に無いので基本知らなくても影響無いとは思いますが、urlparseを使う場合には頭の片隅に置いておくといいかもしれません
【python】乃木坂46でクラスの継承を勉強する②

# はじめに
以前公開した下記の記事でアドバイスしていただいた部分を修正するソースコードを公開します。

https://qiita.com/nogizakapython/items/218054822a90feb4a586

## 自転車クラス

```python
class Bycycle:

  # コンストラクタ
  def __init__(self,name="人"):

    self.__name = name



  # getter Div
  # getter name
  @property
  def getName(self):
    return self.__name

  @getName.setter
  def setName(self,set_name):
     if len(set_name) > 0:
        self.__name = set_name


  def ride(self):
    print(f"{self.__name}は自転車を漕ぐ")

  def breaking(self):
    print(f"{self.__name}はブレーキをかけて止まる")

```

## 電動自転車クラス

```python 
from bycycle import Bycycle

class ElectricBycycle(Bycycle):
  def __init__(self, name="人"):
    self.__name = super().__init__(name)

  def electronic_ride(self):

    print(f"{self.__name}は電動自転車を漕ぐ")
```

## インスタンスを作って実行したソースコード

```python
from bycycle import Bycycle
from bycycle_electrnic import ElectricBycycle

by1 = Bycycle("梅澤美波")
by1.setName = "山下美月"
driver_name1 = by1.getName
by1.ride()
by1.breaking()

by2 = Bycycle()
by2.setName = ""
driver_name2 = by2.getName
by2.ride()
by2.breaking()

eby = ElectricBycycle("")
eby.setName = "久保史緒里"
driver_name3 = eby.getName
eby.ride()
eby.breaking()
eby.electronic_ride()
```

## 実行結果

![result1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/4f668545-898d-36f1-0f8b-d6ebc977fbd0.jpeg)

## 最後に
むしろ修正したソースコードの方がすっきりしますね。
EKS初回構築時の権限（iamidentitymapping）

## IAMIDENTITYMAPPINGでEKS内部の情報を確認する

### ■事象
プロジェクトで構築されたEKSの、Podの詳細などが確認できなかった。

### ■分かったこと
EKSはIAMだけでなく、Kubernetesの世界でも権限管理がある。
初回構築を行った際、構築を行ったユーザにKubernetesのmaster権限が渡される。
そのため例えAWSのAdmin権限を持ったユーザでも、Podの詳細などが確認出来ない場合があり、構築時のユーザだけがPodの中身を見れるといった事象が発生してしまう。

### ■解消方法
EKSCTLコマンドを打つ必要がある。
```
eksctl create iamidentitymapping --cluster <クラスタ名> --region <リージョン名> --arn <登録させたいユーザのARN> --username <EKS内部でのユーザ名を決める> --group system:masters --no-duplicate-arns
```
上記のコマンドを打って登録したユーザでEKSのマネジメントコンソールを開くと、Podの中身が確認できるようになった。
はじめた

Qiitaを始めてみた

IT全くの未経験者がIT業界へ転職しようとしている。

店舗という現場でのデータ不足、会議の生産性の悪さからデータ分析を学び始め
現場での仕事をもうやめたい半分、データ分析の仕事をしてみたい半分で

専門実践教育を受講

データサイエンティストを志すも難易度の高さに心が折れそうになっています。
地道に他のIT関連職、エンジニア等で経験を積んだ方がよさそうだということはわかりました。

自分は今後どうなるのだろう。

初心者中の初心者、学歴も高くなく、文系でしかない自分は大丈夫なのだろうか。
学習中にQiitaの中のブログから情報を探してみたりしたけど、大半が何言ってるか分からなくて
すぐに閉じてしまう。コピペしてchatGPTに聞いての繰り返し

職に就けるのだろうか。

就けたとしても、着いていけるだろうか。

未経験の職に挑戦してみようという意気と、専門実践教育で学んでみたという経験だけに支えられている。

頑張ることになるかもしれないし、ハードルを下げて着実な道を選ぶかもしれないし、

このノートも続かないかもしれない。
macで、Googleミーティングで画面共有ができない！⇨解決した件

# 問題点
・MACを使用しており、環境設定のセキュリティ許可で、Google Chromeを許可しているにも関わらず、画面共有ができない。

　
# 対処
・Google Chromeを更新した。

⇨画面共有できるようになった！


# memo
・Google Chromeは４週間毎にアップデートされているそうなので、MACで環境設定のセキュリティ許可を設定していても画面共有ができない場合は、Google Chromeの更新がないかチェックしてみてください。
Android リンクをクリックできるHTMLを表示したい（kotlin）

## この記事でわかること
- HTMLを表示する
- リンクをクリックできる

## 記事を書くきっかけ
アプリ開発中にhtmlを表示するタスクがありました。htmlの表示自体は簡単にできたのですが、リンクをクリックできるようにする時に少し詰まったので記事に残そうと思います。
参考リンク（https://medium.com/@giorgos.patronas1/endless-scrolling-in-android-with-jetpack-compose-af1f55a03d1a ）

## コード
```kotlin
@Composable
fun HtmlText(html: String) {
    val textColor = Color.Black
    val linkColor = Color.Blue
    val spannedText = HtmlCompat.fromHtml(html.trimIndent(), 0)

    AndroidView(
        modifier = Modifier,
        factory = {
            TextView(it).apply {
                movementMethod = LinkMovementMethod.getInstance()
                setTextColor(textColor.toArgb())
                setLinkTextColor(linkColor.toArgb())
                isVerticalScrollBarEnabled = true
                isScrollContainer = true
            }
        },
        update = {
            it.text = spannedText
        },
    )
}
```
詰まったポイントとしては参考リンクのコードではリンクをクリックしても遷移しなかったことです。原因は`linksClickable = true`が必要なくて`movementMethod = LinkMovementMethod.getInstance()`のみを設定してあげるとリンクをクリックして遷移できる状態になります。
猫派なのにDatadogの広告が出続ける様になった

# 経緯
某ツイッターランドで、こんなツイートをした。

https://x.com/hira0912/status/1762595496370290764?s=20

その直後、またDatadogの広告が出て来たので、
引き続きこんなツイートをした。

https://x.com/hira0912/status/1762602730106040708?s=20

<font color=red>**これ以降、Datadogの広告ばかり出る様になった**</font>。
猫派なんですよ、私。犬には良い思い出が無い。

# 理由
**ターゲティング広告**の特性が理由である。

https://business.twitter.com/ja/advertising/targeting.html

これの中にある、キーワードターゲティングと呼ばれるものが、
影響していると思われる。

>特定のキーワードを使って検索した、ポストした、あるいは反応した利用者をターゲティングまたは除外します。

この投稿をした前日に、オブザーバビリティに関する投稿をしたので、
オブザーバビリティを実現する為のツールである、
Datadogが表示される様になったものと思われる。

また、Datadogのプロモーションを引用ツイートした関係で、
余計に点数が加算されてしまい、表示される可能性が大幅に上がってしまった。
そういう事なんだと思われる。<font color=red>**逆効果だった**</font>。

# どうすれば改善されるのか？
Xを無料ユーザとして利用しているので、広告が出てくるのは仕方が無い。

なので、**別のターゲティング広告が出て来る様に仕向ければ良い**。
予想ではあるが、直近のツイートを優先的に参照する様になっていると思われるので、
Datadogが関連しなさそうなツイートをする事で、
他の広告の表示可能性が上がり、
間接的にDatadogの広告の表示確率が下がるはずである。

## 検証
何となくDatadogから遠そうな領域という事で、**美容**をテーマにツイートした。

https://x.com/hira0912/status/1762674672142000434?s=20

これ以降、Datadogの広告の表示は減った。
<font color=red>**私の全面勝利**</font>である。<font color=lightgray>減っただけで、普通に出て来るけど。</font>

しかしながら、**美容関係の広告が出る様になった問題**については、
ここでは言及しない事にしておこう。

::: note 
この世は「あちらが立てば、こちらが立たず」なのである。
:::


# ブロックとかミュートすれば良くね？
それはそう。

しかしながら、オブザーバビリティを実現する為のツールとして、
Datadog自体は有益なサービスであると思うので、
是非皆さん使ってみて下さい。別にステマではありません。
犬が苦手なだけなんだ。

https://www.datadoghq.com/ja/

# おわりに
我が家は猫を飼ってるからね。他所のお家で元気にやるんだよ。

https://x.com/hira0912/status/1762682299639062615?s=20
ブロック要素とインライン要素

・ブロック要素
行全体のまとまりを作る。
div,header,footer,nav,section,article,p,ul


![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/81cb6b29-59a2-2cc4-8110-f09c79172cf8.png)


・インライン要素とは
行の中の一部のまとまり
span,img,small,strong,a...など

![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/8bd5c354-5909-af34-16fa-cbcb7f7cc8b2.png)
委譲（delegate）

# 委譲とは
メソッドの処理を他クラスにやってもらう事です。
他クラスのメソッドを再利用する形となるので、同じメソッドを何度も実装する必要が無くなります。
場合によっては不要な継承を防ぐ事も可能です。

# 継承との違い
継承は親クラスの全ての機能を子クラスで利用する事が出来ます。

委譲は他クラスの機能の内から必要な部分だけ再利用できます。
その為、親クラスと子クラスの間にis aの関係があるかなどクラス間関係の制約に縛られにくいです。


# 参考文献

http://www.code-magagine.com/?p=16987

https://chmod774.com/oop-inheritance-delegation/#toc1

https://itsakura.com/java-delegation

https://qiita.com/tonluqclml/items/c0110098722763caa556
構造体の整列 

https://paiza.jp/works/mondai/class_primer/class_primer__sort


指定されたアルゴリズムの問題は解けたので構造体に戻ります。
構造体の整列から。

```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
    

        
#main
N = int(input())
members =[]

for _ in range(N):
    member = Member(*input().split())
    members.append(member)
    

#sort members[1]=oldに注目してソート
members.sort(reverse=False, key=lambda x:x[1])

for i in range(N):
    print(members[i].name,members[i].old,members[i].birth,members[i].state)

```
とここまでかけたんですが、ソートの仕方が間違っているようでエラーに。

```
Traceback (most recent call last):
  File "Main.py", line 19, in <module>
    members.sort(reverse=False, key=lambda x:x[1])
  File "Main.py", line 19, in <lambda>
    members.sort(reverse=False, key=lambda x:x[1])
TypeError: 'Member' object is not subscriptable
```

なぜかなと思ったんですが、添字が間違っていたようで。

```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
    

        
#main
N = int(input())
members =[]

for _ in range(N):
    member = Member(*input().split())
    members.append(member)
    

#sort membersのoldに注目してソート
members.sort(reverse=False, key=lambda x:x.old)

for i in range(N):
    print(members[i].name,members[i].old,members[i].birth,members[i].state)

```
これでいけました。
で、回答を見たんですが、上のラムダ式を使わない方法。
これ、多分選択ソートですね。
アルゴリズムの勉強したのが早速役に立ったようです。

```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
    

        
#main
N = int(input())
members =[]

for _ in range(N):
    member = Member(*input().split())
    members.append(member)
    

#sort membersのoldに注目してソート
#左端から右端まで
for i in range(N):
    #左端+１番めから右端まで
    for j in range(i+1, N):
        #左端の要素と比較して小さかったらスワップ
        if members[i].old > members[j].old:
            members[i], members[j] = members[j], members[i]

for i in range(N):
    print(members[i].name,members[i].old,members[i].birth,members[i].state)



```
クイックソート

# クイックソート 


## クイックソート 手順

クイックソートは以下の手順で行われる。

1. ピボットの選択：適当な値（ピボット（英語版）という）を境界値として選択する
2. 配列の分割：ピボット未満の要素を配列の先頭側に集め、ピボット未満の要素のみを含む区間とそれ以外に分割する
3. 再帰：分割された区間に対し、再びピボットの選択と分割を行う
4. ソート終了：分割区間が整列済みなら再帰を打ち切る

### 時間計算量

| アルゴリズム   | 平均時間複雑度 | 最悪時間複雑度 | 最悪空間複雑度 |
|----------------|-----------------|---------------|----------------|
| クイックソート | O(n log(n))     | O(n^2)        | O(log(n))      |

### JAVAサンプルコード

```java
package Quick_sort;
import java.util.Scanner;

public class Quick_sort {

    static class Student {
        String name;
        int mark;

        public Student(String name, int mark) {
            this.name = name;
            this.mark = mark;
        }
    }

    static int partition(Student[] arr, int low, int high) {
        int pivot = arr[high].mark; // Choose the rightmost element as pivot
        int i = (low - 1); // Index of smaller element

        for (int j = low; j <= high - 1; j++) {
            if (arr[j].mark > pivot) {
                i++;
                Student temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        Student temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;
        return (i + 1);
    }

    public static void swap(int arr[], int i,  int j) {
        int temp = arr[i];
        arr[i] =  arr[j];
        arr[j] = temp;
    }

    public static void quick_sort(Student[] arr, int low, int high) {
        if (high > low) {
            int pivot = partition(arr, low, high);
            quick_sort(arr, low, pivot - 1);
            quick_sort(arr, pivot + 1, high);
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // Create a Scanner object
        System.out.print("Enter the number of students (n): ");
        int n = scanner.nextInt();  // Read user input

        Student[] students = new Student[n];

        for (int i = 0; i < n; i++) {
            System.out.print("Enter name for student " + (i + 1) + ": ");
            String name = scanner.next();
            System.out.print("Enter mark for " + name + ": ");
            int mark = scanner.nextInt();
            students[i] = new Student(name, mark);
        }

        quick_sort(students, 0, n - 1);

        // Display names of M students with highest marks
        System.out.println("Students with the highest marks:");
        for (int i = 0; i < n; i++) {
            System.out.println("name is " + students[i].name + " mark is " + students[i].mark);
        }

    }
}
```
SAMのわかりやすい記事

# はじめに
SAMについてわかりやすい記事のリンクを貼る。


# リンク

https://qiita.com/omiita/items/f24e4f06ae89115d248e

https://qiita.com/mosh/items/afeaf100379f49c470e8

https://qiita.com/T-STAR/items/8c3afe3a116a8fc08429

https://qiita.com/T-STAR/items/318d7fac582bbb18ef71

https://github.com/davda54/sam
strong　parameter内で使うmerge以下について

   def purchase_record_params
     params.require(:purchase_record).permit(:zip_code, :region_of_shipping_origin_id, :city, :street_address, :apartment_name, :tel)
   end

というコード内においてどうやらmergeが必要だったことがわかった。

今回はmergeの使い方を考えてみます。

結論mergeとはハッシュとハッシュの結合ということが分かった。

例
tweet = { name: "たなか", text: "test", image: "test.jpeg" }
uid = { user_id: "1" }
tweet.merge(uid)
=> {:name=>"たなか", :text=>"test", :image=>"test.jpeg", :user_id=>"1"}
Orcale client 19c インストールでのエラー　「Windowsのスタート・メニューまたはデスクトップにアイテムを作成できません」

# Orcale client 19cのエラー
### 概要
「Windowsのスタート・メニューまたはデスクトップにアイテムを作成できません」のエラー原因と対処方法
### 環境
・windows2019
・oracle client 19c
### エラー内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528664/fd78f1dc-b105-81d7-b75c-7112f19b4706.png)
### 調査方法
インストールログを確認
### 原因
**文字化け**
コントロール パネル\時計と地域
地域の設定が日本語ではなかったため

下記で設定方法を確認して下さい。
[Windows Server 2019ローカライズ手順](https://www.dell.com/support/kbdoc/ja-jp/000111205/windows-server-2019-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%A9%E3%82%A4%E3%82%BA-%E6%89%8B%E9%A0%86#:~:text=Windows%20Server%202019%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%AE%E5%A4%89%E6%9B%B4%201%20%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%20%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E9%96%8B%E3%81%8D%E3%80%81%20%E6%AD%AF%E8%BB%8A%E3%81%AE%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%20%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82,%EF%BC%BD%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20...%205%20%EF%BC%BB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E8%A8%80%E8%AA%9E%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%EF%BC%BD%E7%94%BB%E9%9D%A2%E3%81%A7%E3%80%81%E3%83%AA%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E8%A8%80%E8%AA%9E%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%80%81%EF%BC%BB%20%E6%AC%A1%E3%81%B8%20%EF%BC%BD%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20...%20%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0)
### まとめ
英語の環境に日本語のインストーラーをインストールしてしまっため、文字化けを起こし、ショートカットが作成できなかったです。
【解決】CosmosDBの「ValueError: Unsupported paths count.」について

# 起きた現象
1. 複数のパーティションキーを設定したコンテナを作成
1. `python SDK`を使用してアイテムを登録する。
1. `ValueError: Unsupported paths count.`が発生する。

# 解決策
バージョン`4.5.2b1`をインストールする。
```bash
pip install azure-cosmos==4.5.2b1
```

## もう少し詳しく
### 複数パーティションキーの設定
コンテナ作成時に、複数のパーティションキーを設定することができます。
以下では試しに
- id
- email
- address


を設定しております。

![スクリーンショット 2024-02-28 112906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/b013b171-daf3-c064-b747-81c507d01193.png)

このような設定を行うことで、同じ`id`, `email`, `address` の組み合わせのアイテムを追加することが出来なくなります。

### 実行したコード
このコンテナに対して、pythonを使用してアイテムを追加しようとすると、バージョン`4.5.1`ではエラーが発生しました。

具体的なコードは以下です。

```python
from azure.cosmos import CosmosClient

client = CosmosClient(database_endpoint, database_key)
database_client = client.get_database_client(database_name)
container_client = database_client.get_container_client(container_name)

item = {
    "id": "test_id", 
    "email": "hoge@piyo.com", 
    "address": "kanagawa"
}

# ここでエラー
container_client.create_item(body=item, enable_automatic_id_generation=True)
```

# まとめ
今回のエラーを解決するにあたって、以下のISSUEを参考にさせていただきました。
https://github.com/Azure/azure-sdk-for-python/issues/30670

だれかの助けになれば幸いです。

# ご紹介
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
アプリ内モニタリングに関する解説

外部からdotnet-counterモニターを利用してアプリケーションの監視を開始することができますが、プロセス内で監視指標の収集や表示を行うことも可能です。プロセス内監視の利点として、監視とサービスの分離を完成させるために複数のサービスを起動する必要がなく、アプリケーションが起動するだけで監視指標も生成され、密接な関係にあります。

```csharp
class Program
{
    static void Main()
    {
        Demo01.Run();
    }
}

public class Demo01
{
    public static void Run()
    {
        Console.WriteLine("監視開始");
        var listener = new MyEventListener();
        listener.WriteEvent += Listener_WriteEvent;
        Console.ReadLine();
    }

    private static void Listener_WriteEvent(string key, string value)
    {
        Console.WriteLine($"{key}：{value}");
    }
}

public delegate void WriteContent(string key, string value);

public class MyEventListener : EventListener
{
    protected readonly string[] _countersName = new string[]
    {
        "System.Runtime"
    };

    public event WriteContent WriteEvent;

    protected override void OnEventSourceCreated(EventSource source)
    {
        if (_countersName.Contains(source.Name))
        {
            EnableEvents(source, EventLevel.Verbose, EventKeywords.All, new Dictionary<string, string>()
            {
                ["EventCounterIntervalSec"] = "1"
            });
        }
    }

    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        if (!eventData.EventName.Equals("EventCounters"))
            {
                return;
            }
            for (int i = 0; i < eventData.Payload.Count; ++i)
            {
                if (eventData.Payload[i] is IDictionary<string, object> eventPayload)
                {
                    var counterName = "";
                    var counterValue = "";
                    if (eventPayload.TryGetValue("DisplayName", out object displayValue))
                    {
                        counterName = displayValue.ToString();
                    }
                    if (eventPayload.TryGetValue("Mean", out object value) ||
                        eventPayload.TryGetValue("Increment", out value))
                    {
                        counterValue = value.ToString();
                    }
                    WriteEvent(counterName, counterValue);
                }
            }
        }
}
```

イベント監視のサブクラスを使用して、アプリケーション内で監視した指標を収集することができます。_countersNameには監視したいプロバイダーを配置します。《dotnet内のカウンター説明一》、《dotnet内のカウンター説明二》、《dotnet内のカウンター説明三》では、その説明があります。コードの20行目では、指標をコンソールに出力しているだけですが、ここではESに収集させて表示したり、この部分を時系列データベースに書き込んでGrafanaで表示することも可能です。表示については別の話題であり、ここでは詳しく述べません。

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484490&idx=1&sn=64344726e396b9ba06738c477a81080e&chksm=9f005b60a877d276097e53e102b54991ddc06ebb386e6e6f2d5c229a0c238fa836354a6438e2&token=418912929&lang=zh_CN#rd
wsl上のcabalでcannot find -lgmpとなった時の解決方法


## エラー
```
/usr/bin/ld.gold: error: cannot find -lgmp
```
## ワイは何した
wslにghcupでインストールしたcabalのチュートリアルプロジェクトを作ろうとして次のコマンドを実行した
```
cabal build
```


## 環境
```
wsl
ubuntu
```

## 解決した方法
```
sudo apt-get install libgmp3-dev
```
【備忘】今更ですがOSI参照モデルとは？

## OSI参照モデルとは
### ざっくりお伝え
簡単にお伝えすると、通信機能の仕組みを整理した共通ルール
⇒国際標準化機構（ISO）にて定義づけされたデータ通信機能におけるモデル

### 詳細
通信するときは送り手と受け手で同じルールを共有する必要がある
例）片方が日本語で話しかけても、受け手が英語で返事した場合はコミュニケーションが取れない

その中で、異なるメーカ同士では通信ができなかったため、国際標準化機構が「**データ通信機能のルール（モデル）**」を作成したことで、異なるメーカー同士でも通信することが可能となった

## OSI参照モデルの7つの階層
OSI参照モデルでは、ネットワークを7つの階層に分けられている。

| OSI階層        | 説明                                                         | 代表的なプロトコル         |
|----------------|--------------------------------------------------------------|----------------------------|
| 第7層: アプリケーション層     | ユーザーが直接操作するアプリケーションに関連する通信を担当 | HTTP、SMTP、FTP           |
| 第6層: プレゼンテーション層   | データの表現、符号化、圧縮、暗号化を扱う                     | JPEG、MPEG、SSL           |
| 第5層: セッション層           | 通信の確立、維持、終了を管理                                   | NetBIOS、RPC              |
| 第4層: トランスポート層       | データの転送を管理                                             | TCP、UDP                  |
| 第3層: ネットワーク層         | ルーティングやパケットの転送を行う                             | IP、ICMP、ARP             |
| 第2層: データリンク層         | ネットワーク間でのデータの転送を制御                           | Ethernet、MAC、PPP        |
| 第1層: 物理層                 | データの物理的な伝送を担当                                     | Ethernetケーブル、ハブ    |


### データの流れ
#### 送り手側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303394/1e4254aa-afe4-ff13-3309-f27d42612553.png)

#### 受け手側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303394/7d015f20-040f-9d21-beb9-5ff9a8d54126.png)

##v それぞれの階層の詳細
### 第1層：物理層
ケーブルやコネクタ、電気信号等の物理的なものに関するルールを定めたもの
⇒物理層ではケーブルやコネクタ、実際にデータを変換した電気信号など物理的な物のルールが定められている。

### 第2層：データリンク層
直接つながっている機器への信号の受け渡しに関するルールを定めたもの
⇒データリンク層では「パソコンとLANケーブルでつながったルータ」や「パソコンと無線LANアクセスポイント」のように、直接つながった機器とのやり取りに関するルールが定められている

### 第3層：ネットワーク層
目的の機器への信号の受け渡しに関するルールを定めたもの
⇒ネットワーク層では送信元と送信先のやり取りに関するルールが定められている
例）「IPアドレス」の「IP」はネットワーク層に該当し、IPアドレスは通信相手を特定するための情報となり、「目的の機器とのやり取り」に関するルールが定められている。

### 第4層：トランスポート層
目的の機器への「正しい」信号の受け渡しに関するルールを定めたもの
⇒トランスポート層では、やり取りの正確さに関するルールが定められている。要は「信頼性の確保」

例えば「TCP」や「UDP」と呼ばれている通信プロトコル（通信するときに使うお約束事）はトランスポート層に該当

### 第5層：セッション層
通信の開始から終了までに関するルールを定めたもの
⇒セッション層では、通信の開始から終了までの一連の流れ（セッション）に関するルールが定められている
※よくある説明では「論理的な通信経路を確立する」と説明されるが、要は以下
・会話開始時＝経路の確立
・会話終了後＝経路の解放


### 第6層：プレゼンテーション層
データ形式の変換（プログラム用←→ネットワーク用）に関するルールを定めたもの
⇒プレゼンテーション層では、データ形式の変換に関するルールが定められている

例えば、言語が異なる相手とやり取りする際に言語の変換に関するルールを定めることで、やり取りが可能になる。

### 第7層：アプリケーション層
ネットワークを利用するソフトとやり取りする部分に関するルールを定めたもの
⇒アプリケーション層では、通信機能の実際にソフトとやり取りする部分に関するルールが定められている

通信機能は様々なソフトから利用されており、この「通信機能のソフトとの窓口部分」に関するルールが定められている部分のことをアプリケーション層

## まとめ
OSI参照モデル＝通信機能の仕組みを整理した共通ルール

### 参考情報
https://wa3.i-3-i.info/word1783.html
https://www.itbook.info/cat/network4.html
dotnetのカウンタについての説明（二）

前回はSystem.Runtimeについて説明しました。これはアプリケーションの実行環境のリソースを収集する責任があります。今回はAspNetCoreのHosting、Http.Connections、Server.Kestrelの三つのカウンタについて続けて説明します。
また、以下の指標の各項目（）内の項目は--countersパラメータの[]内の項目で、複数の指標をカンマで区切る形です。

Microsoft.AspNetCore.Hostingカウンタ
このカウンタはリクエストの数値を収集します。.net core 3.1で使用されます。
コマンド：
```
dotnet-counters monitor -n websample --refresh-interval 1 --counters Microsoft.AspNetCore.Hosting
```
ビュー：
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCGmoaibicRZ95zHeIjY9ia15sAGwiausmiamHGEmibMKjkgFibFWOIPfD3RDNE1ONOpIMfqkStFNkxqdzLw/640?wx_fmt=png)
指標：
Current Requests (current-requests) 
現在のリクエスト総数
Failed Requests (failed-requests) 
失敗したリクエスト総数
Request Rate (requests-per-second) 
秒間リクエスト数
Total Requests (total-requests) 
リクエスト総数
Microsoft.AspNetCore.Http.Connectionsカウンタ
WebSocket接続のインデックス、.net core 3.1で使用されます。
コマンド：
```
dotnet-counters monitor -n BlazorAppDemo --refresh-interval 1 --counters Microsoft.AspNetCore.Http.Connections
```
ビュー：
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRDQESzuqt88W4UxBqTtR4INtlmI8z8q1crL6Z4jWSpa3IkFkCP4RsSJqQNo8y9tTNmWsHpORUpGQg/640?wx_fmt=png)
指標：
Average Connection Duration (connections-duration) 
接続の平均継続時間（ミリ秒）
Current Connections (current-connections) 
現在のアクティブな接続数
Total Connections Started (connections-started) 
開始された接続の総数
Total Connections Stopped (connections-stopped) 
停止した接続の総数
Total Connections Timed Out (connections-timed-out) 
タイムアウトした接続の総数
Microsoft-AspNetCore-Server-Kestrelカウンタ
そう、間違いではありません。ここでは「.」ではなく、「-」になっています。この指標はKestrelがホストとして使用される際の収集指標で、>=.NET5で使用されます。
コマンド：
```
dotnet-counters monitor -n BlazorAppDemo --refresh-interval 1 --counters Microsoft-AspNetCore-Server-Kestrel
```
ビュー：
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRDQESzuqt88W4UxBqTtR4INqHaKNgyYiayoq2ySkQ4ic2B3Ag9gnlhFUca64xZ4FZ7P7QnErT2JXrew/640?wx_fmt=png)
指標：
Connection Queue Length (connection-queue-length) 
現在の接続キューの長さ
Connection Rate (connections-per-second) 
秒間の接続数
Current Connections (current-connections) 
現在のアクティブな接続数
Current TLS Handshakes (current-tls-handshakes) 
現在のTLSハンドシェイク数
Current Upgraded Requests (WebSockets) (current-upgraded-requests) 
現在のアップグレードリクエスト数（WebSockets）
Failed TLS Handshakes (failed-tls-handshakes) 
失敗したTLSハンドシェイクの総数
Request Queue Length (request-queue-length) 
現在のリクエストキューの長さ
TLS Handshake Rate (tls-handshakes-per-second) 
秒間のTLSハンドシェイク数
Total Connections (total-connections) 
接続総数
Total TLS Handshakes (total-tls-handshakes) 
TLSハンドシェイク総数

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484488&idx=1&sn=a84134fc681ed07683a6b16a916c5174&chksm=9f005b62a877d274e5cefe99a8b97446abe1750decb68ced0ad414de0954cd41117111a7ddbe&token=418912929&lang=zh_CN#rd
venvで仮想環境構築 (Windows)

## はじめに
venv(ブイエンブ)を使って仮想環境を構築する方法の備忘録

## venvは導入が簡単！
pythonの標準機能なのでソフトウェアのインストールが不要！
dockerなどと比較しても軽量なので気軽に仮想環境を構築したい時にはGood

## venvによる仮想環境構築方法
### 環境
・Windows11
・Powershell

### 1. 仮想環境の構築

まず仮想環境を置いておくディレクトリを作成する．
そして，そのディレクトリ内で以下のコマンドを実行．
```
python -m venv env
```
末尾の"env"は仮想環境の名前で，ここは任意で良い．
例えば，pytorchを使いたいのであれば
```
python -m venv pytorch
```
とすれば"pytorch"という名前の仮想環境が構築できる．

### 2. 仮想環境への入り方
```
.\env\Scripts\activate
```
を実行すれば入れる．
その後はpipで必要なライブラリを入れるなりして環境を構築していこう．
### 3. 仮想環境の終了
```
deactivate
```
これで終了できる．

## 最後に
venvはこれだけで仮想環境が作れる！
仮想環境の構築に煩わしさを感じている人にぜひおすすめ！！
TanStack Query v5 入門

# はじめに
この記事では、TanStack Query v5 の基本的な利用方法について記載します。

https://tanstack.com/query/latest

:::note
TanStack Query は、以前は React Query と呼ばれていましたが、v4 以降は TanStack Query という名称が正式のようです。[^1]
:::

[^1]: https://tanstack.com/query/v4/docs/framework/react/guides/migrating-to-react-query-4

# 開発環境
開発環境は以下の通りです。

- Windows11
- VSCode
- TypeScript 5.2.2
- React 18.2.0
- TabStack Query 5.20.2

# パッケージのインストール
以下のコマンドで TanStack Query をインストールします。

```powershell
npm i @tanstack/react-query
```

また、以下のコマンドで [ESLint Plugin Query](https://tanstack.com/query/latest/docs/eslint/eslint-plugin-query) をインストールすることができます。 

```powershell
npm i -D @tanstack/eslint-plugin-query
```

プラグインのインストール後、```.eslintrc.json``` に以下の値を追加することで、推奨設定を適用できます。

```.eslintrc.json
{
  "extends": ["plugin:@tanstack/eslint-plugin-query/recommended"]
}
```

# 実装
まず、TanStack Query を利用するコンポーネントを [```QueryClientProvider```](https://tanstack.com/query/v5/docs/framework/react/reference/QueryClientProvider) で囲みます。
```QueryClientProvider``` の props には、[```QueryClient```](https://tanstack.com/query/v5/docs/reference/QueryClient) を渡します。

```index.tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import CoreConcepts from "./core-concepts/page";
import { Route } from "@/app/type";

const queryClient = new QueryClient();

export default function TanStackQuery() {
  return (
    <QueryClientProvider client={queryClient}>
      <CoreConcepts />
    </QueryClientProvider>
  );
}

```

次に ```QueryClientProvider``` で囲んだ子コンポーネントでデータ取得処理を実装します。
データ取得処理には [```useQuery```](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) を利用します。引数の ```queryFn``` にリクエスト処理を渡します。戻り値で取得したデータやデータの取得状況などを得ることができます。

```CoreConcepts.tsx
import { useQuery } from "@tanstack/react-query";

export default function CoreConcepts() {
  const { isPending, error, data } = useQuery({
    queryKey: [],
    queryFn: () =>
      fetch("https://official-joke-api.appspot.com/random_joke").then((res) =>
        res.json()
      ),
  });

  console.log(
    "status:",
    status,
    "\nisPending:",
    isPending,
    "\nerror:",
    error,
    "\ndata:",
    data
  );

  if (isPending) return "Processing...";

  if (error) return `An error has occurred: ${error.message}`;

  return (
    <ul>
      <li>- Type: {data.type}</li>
      <li>- Setup: {data.setup}</li>
      <li>- Punchline: {data.punchline}</li>
    </ul>
  );
}

```

# 動作確認
ひと通り実装できたので、動作確認をしてみます。

![localhost_3000_tanstack-query-Google-Chrome-2024-02-28-10-49-26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/075635fd-9686-f6a2-97b9-7df6a5c867d5.gif)


# まとめ
データ取得処理だけであれば、簡単に実装できました。
他にも機能がたくさんあったので、実際に実装したり、使いどころを考えていきたいです。

# 参考
- [ESLint Plugin Query](https://tanstack.com/query/latest/docs/eslint/eslint-plugin-query)
- [TanStack Query](https://tanstack.com/query/latest)
Unity　TMP(TextMeshPro)を使いたい、変換方法

## TMPとは
普通のテキストよりいろいろな設定が追加できるよ。
- 文字の太さ変更
- 文字の縁取り
- 拡大してもにじまない
- 文字間の幅調整
などなど

## 初期設定
UnityのPackageからインストール必要がある。手順は他サイト参照

## 普通のフォントとは違う
通常フォントは.ttfというファイルだけど、TMPは.assetという形で利用する。
なのでtffをassetに変換する処理が必要。

## 変換手順
変換する文字一覧が必要だから下記からAdobe-Japan0.txtをDL

https://github.com/kyubuns/Adobe-Japan1-List/blob/main/Adobe-Japan0.txt

ツールバーWindow>TextMeshPro>Font Asset Creator
フォントをセット、CharactrersFromFileでtxtを設定
GenerateFontAtlasを押す
![texttukurikata.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/a3e4bcdd-58fc-fd1e-2d4d-3d7987204c47.gif)

これをセーブするとKleeOne-SemiBold SDF.assetができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/fee38bdd-a221-83c3-a83b-2b73ea192833.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/f9bfb0c2-8bbe-0436-281a-89842562f7ff.png)
あとはこれを利用するだけ。やったね。
## 参考サイト
https://gametukurikata.com/ui/textmeshpro
SRE読み物


## SRE

* [Embedded SRE としてサービスに SRE をやってみた](https://ca-srg.dev/post/first-embedded-sre)
* [SRE初心者が急成長しているEV充電サービスの安定稼働にコミットした話](https://speakerdeck.com/tetsu040e/srechu-xin-zhe-kaji-cheng-chang-siteiruevchong-dian-sahisunoan-ding-jia-dong-nikomitutositahua)
* [SREとは：SREメトリクスと監視のゴールデンシグナル
](https://www.splunk.com/ja_jp/blog/devops/sre-metrics-four-golden-signals-of-monitoring.html)
* [SLO、SLI、SLAとは何か?](https://newrelic.com/jp/blog/best-practices/what-are-slos-slis-slas)
* [このSRE本がすごい！2024年版](https://syu-m-5151.hatenablog.com/entry/2024/01/26/165255)

## DevSecOps

* [DevOps on AWS大全 実践編](https://qiita.com/tech4anyone/items/c27e74f9ae569ced259f)
* [Platform Engineering with CodeCatalyst](https://speakerdeck.com/_kensh/platform-engineering-with-codecatalyst)

## IaC

* [Manning Publication IaC本を読んでIaCのテストを学ぶ](https://techstep.hatenablog.com/entry/2023/07/22/102554)

## Observability

* [近年注目の「オブザーバビリティ」とは？「モニタリング」の違いと導入の必要性について解説](https://sre.sproutly.co.jp/column/about-observability/)
* [監視の考え方 〜あるいは可観測性とはなんなのか〜](https://www.estie.jp/blog/entry/2023/02/14/140442)
* [AWS と考える Observability のベストプラクティス](https://qiita.com/AoTo0330/items/3731f2ff7fbbe1299ca9)
* [【参加レポート】TechBrew in 東京〜オブザーバビリティのベストプラクティス〜に参加してきました！！](https://iret.media/100418)

## Kubernetes

* [プラットフォームの上でものを作るということ](https://toris.io/2019/12/what-i-think-about-when-i-think-about-kubernetes-and-ecs/)
* [プラットフォームエンジニアリングって何？〜基本から AWS での実現方法について〜](https://aws.amazon.com/jp/blogs/news/20240229-platform-engineering-event/)

## Security

* [クラウドセキュリティの技術選択と、セキュリティ対応していく中で出て来た課題
](https://speakerdeck.com/yamaguchitk333/kuraudosekiyuriteinoji-shu-xuan-ze-to-sekiyuriteidui-ying-siteikuzhong-dechu-telai-take-ti)

## Team

* [30分で分かった気になるチームトポロジー](https://www.ryuzee.com/contents/blog/14566)

## Other

* [本番環境などでやらかしちゃった人 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yarakashi)
Zoho ShiftsのOAuthについて

めっちゃニッチな話題ですが、日本語のソースがないので書いておきます。
Zapierでzoho shiftsのOAuth認証をやってた時、
Refresh tokenが発行されず
```
Missing refresh token in response
```
とエラーメッセージが出てしまいました。

Authorization requestの段階で、
```
prompt=consent&access_type=offline
```
とつけないとrefresh tokenが出ないようです。

参考URL
https://help.zoho.com/portal/en/community/topic/missing-refresh-token-in-respose
docker-composeコマンドメモ

### はじめに
よく使用するけど、忘れがちなのでメモとして残します。

#### 特定のコンテナを強制的に停止し、関連付けられているボリュームも含めて削除する
```shell
docker compose rm -fsv 削除したいコンテナ名
```
- `rm`は、Docker Composeプロジェクト内のコンテナを削除するためのサブコマンドです。
- `f`(または`force`)オプションは、コンテナを強制的に削除するためのオプションです。つまり、コンテナが実行中でも削除します。
- `s`(または`stop`)オプションは、コンテナを削除する前に停止するためのオプションです。通常、実行中のコンテナは削除できませんが、このオプションを使用すると、コンテナを停止してから削除できます。
- `v`(または`volumes`)オプションは、関連付けられているボリュームも削除するためのオプションです。通常、コンテナを削除しても、関連付けられているボリュームは削除されませんが、このオプションを使用すると、関連付けられているボリュームも削除されます。

#### サービスのキャッシュを削除し、イメージを新たにビルドする
```shell
docker compose build --no-cache
```

このコマンドは、Docker Composeを使用して、すべてのサービスのイメージを新たにビルドします。--no-cacheオプションを指定することで、キャッシュを使用せずにビルドを行います。キャッシュを無視することで、すべてのレイヤーを再度ビルドし、新しいイメージを作成します。
（エラー） Error: The provided export path '/tags' doesn't match the '/tags/[tag]' page

Tailwind Nextjs Starter Blogで`Error: The provided export path '/tags' doesn't match the '/tags/[tag]' page`エラーが起こった場合の対処。

> npm run dev works no problem, the error started to happen after added some tens of post pages then tried build. The build step passes sometimes, but fails like 3/5 times.
> \> [Error: The provided export path '/tags' doesn't match the '/tags/[tag]' page. · Issue #752 · timlrx/tailwind-nextjs-starter-blog](https://github.com/timlrx/tailwind-nextjs-starter-blog/issues/752)

Githubにこのエラーの問題と解決法がまとまっている。

参考：

- [Next.js + TypeScript + Tailwind CSSなプロジェクトのセットアップ手順 #TypeScript - Qiita](https://qiita.com/notakaos/items/36613850dbfc351b3735)
- [Next.jsのチュートリアルからブログサイトを作成してみる #Next.js - Qiita](https://qiita.com/masafumi330/items/d601b070735b4eef765c)
AWS SES – カスタム MAIL FROM ドメイン ( Return Path ) の設定 / From アドレス / DMARC

# 1.カスタム MAIL FROM ドメイン

SESでこの設定をすることで、メールの Return-path を変えて、カスタムドメインにできるようだ

## SES > ID > ドメイン型のIDを作成、または選択 > カスタム MAIL FROM ドメイン

ここでは検証済みの `example.com` のドメイン型IDに対して操作するものとする

ここでは例として `xxx.example.com` をカスタムドメインに設定する

<img width="851" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/cb29602b-36e6-46b5-9f2d-46259effced0">

## DNSレコードの設定

「カスタム MAIL FROM ドメイン」を設定したら、次はドメインの設定が必要だ

ドメインをR53で管理している場合は、1ボタンでレコード追加ができる

<img width="1170" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/8d293432-aab3-45f0-964f-8515625a1a2c">

## 受信メールの確認

AWSで設定が完了したら、AWS SESから自分宛にメールを送信してみて、受信メールを確認してみる
設定が成功していれば、受信メールのメールソースを見た時に Return path が変わっているのが分かるはずだ

### BEFORE: デフォルトの Return path の例

仮にドメイン設定に失敗していても Return path が `amazonses.com` のもののままになるだけで、特に実害はなさそうな気がする

```
Return-Path: <****************@**********.amazonses.com>
```

### AFTER: カスタムドメインの Return path の例

```
Return-Path: <**********@xxx.example.com>
```

# 2.FROM アドレス

Return-pathではない方の FROMのメールアドレスは任意指定だ
アプリケーションからメール送信する場合も自由な指定ができる

だがここは Return-path のドメインと合わせておいた方が良いのではないかと思う

例: `no-reply@xxx.example.com`

# 3.DMARC設定

FROMアドレスのドメインで `xxx.example.com` を使用している場合、
DMARCも、このサブドメインに対して設定しないといけない気がする

(設定しないと受信メールのヘッダを見た時に、DMARC認証がそもそもおこなわれていないようだった)

TXT レコード名

```
_dmarc.xxx.example.com
```

値の例

```
"v=DMARC1;p=reject;pct=100;rua=mailto:daily-report-dmarc@example.com"
```

実際にメールを受信してみて、メールソースを見て、 DMARC が PASS しているかを確認する

# 参考

Amazon SES の ID の作成と検証
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/creating-identities.html

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
DP-900 合格まで (2024.02)


[AZ-900 と MS-900 合格まで (2023.01) - Qiita](https://qiita.com/e99h2121/items/4ee69f047e555990065d)
[AZ-104 合格まで (2023.06) #AZ-104 - Qiita](https://qiita.com/e99h2121/items/de97a5e78b083739b5a1)
[AI-900 合格まで (2023.11) #AI-900 - Qiita](https://qiita.com/e99h2121/items/f32fcf4648bdf33a5ebd)
[AZ-305 合格まで (2023.12) #AZ-305 - Qiita](https://qiita.com/e99h2121/items/18ed097e6ecb66aafb3f)

2024.02.27  DP-900 を受けて合格したメモです。


## 感想
- 難易度的には体感 AZ-900、AI-900 より易しい。
- 少しでもデータベースを触っている業務の人はたぶん大分楽勝なので、受けてみると自信がつく。

## ロードマップ

とはいえ、色々おさらい。

- ナントカ Analytics 
- 列指向とか行指向とか
- 構造化、半構造化、非構造化

[Azure Cosmos DB - NoSQL およびリレーショナル データベース | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/cosmos-db/)
[Azure SQL Database - マネージド クラウド データベース サービス | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/azure-sql/database/?)
[Azure SQL Database - マネージド クラウド データベース サービス | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/azure-sql/database/?)
[Power BI - データの視覚化 | Microsoft Power Platform](https://www.microsoft.com/ja-jp/power-platform/products/power-bi)
[Azure Stream Analytics | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/stream-analytics)
[Azure Synapse Analytics | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/synapse-analytics)
[Azure Storage ドキュメント ハブ | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/storage/)

等々が出る。

https://learn.microsoft.com/ja-jp/credentials/certifications/exams/dp-900/

https://qiita.com/takaki-imura/items/9d1205461aa1107da113

おかげさまで合格しました～。


## 参考
[DP-900 学習メモ #Azure - Qiita](https://qiita.com/m_saito_ari/items/5e22bd0c61da62c2aff4)
[DP-900合格体験記 #Azure - Qiita](https://qiita.com/fsd-shuhashi/items/e2e0f3b60c31eeabc658)
[Azure & MS Fundamentals資格の勉強方法 | AZ-900、DP-900、AI-900、PL-900、SC-900 #Azure - Qiita](https://qiita.com/sugulu_Ogawa_ISID/items/f228a8fef14bd1a13a1f)


## 次ステップ

ちゃんと勉強時間を取りたい。

そして AZ-204 か AZ-400 を取りたい。


以上です～