OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellで定期的にpingを。

わたしの今の作業環境では接続先までのネットワークが不安定なことが多々あります。ネットワーク接続の問題が理由で反応が遅いのか、単に送った処理が重いのかを一目で切り分けをできるようにpingで接続状況を監視し続けるスクリプトを書いてみました。

GPT-4と相談しつつ作ったので細かい部分の内容は把握できていませんが、定期的にpingの結果を出力してくれます。定期的に動いているかどうかはカウンターの数値とphaseの数値を比較すれば確認できるようになっています。定期的に動いているかどうかはネットワークが不調になったときにログが滞ってしまっていることに気づけるように付与しました。

みなさんの参考になればと思い共有します。そのままPowerShellに貼り付ければ利用できます。ご自由にご利用ください。

```powershell
function myPing {
    param(
        [string]$addr,
        [int]$interval = 1000,  # Pingの間隔（ミリ秒）
        [int]$fullcount = 9999  # Pingカウンタの最大値
    )

    $scriptBTime = Get-Date
    $ctr = 0

    while ($true) {
        # Pingカウントのインクリメントとリセット
        $ctr = ($ctr + 1) % ($fullcount + 1)

        # 経過時間とフェーズ番号の計算
        $curTime = Get-Date
        $total = $curTime - $scriptBTime
        $nPhase = [int]([math]::Floor($total.TotalMilliseconds / $interval) + 1) % ($fullcount + 1)
        $phaseStr = "{0:D4}" -f $nPhase

        # 現在のループの開始時刻を計算
        $offsetTime = $total.TotalMilliseconds % $interval
        $beginTime = $scriptBTime.AddMilliseconds($total.TotalMilliseconds - $offsetTime)

        # Pingの実行
        $res = Test-Connection -ComputerName $addr -Count 1 -ErrorAction SilentlyContinue

        # Ping結果のフォーマット
        $ctrStr = "{0:D4}" -f $ctr
        $msg = if ($res) {"successful: $($res.ResponseTime)ms"} else {"failed"}

        # 結果の表示
        Write-Output "Ping ID:$ctrStr $msg (Phase: $phaseStr)"

        # 次のループの開始時刻までの待機
        $nextTime = $beginTime.AddMilliseconds($interval)
        $sleepTime = ($nextTime - $curTime).TotalMilliseconds
        if ($sleepTime -gt 0) {
            Start-Sleep -Milliseconds $sleepTime
        }
    }
}
```
redmineのチケットについて

## チケットとは
チケットは、ToDo管理の進化版です。登録する→やったで終わるのではなく、書いた人が「誰に」「いつまで」やってほしいのか、その進捗はどうなのか（New->On going->Done->Closeといったような）という一つのワークフローを「チケット」という単位で管理します。
メールのやりとりでもこのような流れを返信でつなげて、数十件になっているメール案件を見たことがあると思います。これをもう少し賢くやりましょうというのが、redmineのチケットです。ソフトウェア開発のために開発されたので、以下の資料もソフトウェア寄りですが、資料作成だろうが、イベント運営だろうが基本的なフローは一緒なので、redmineのチケットシステムは実は大体のグループタスクに使えるGeneralなものであると言えます。

http://fr.slideshare.net/akipii.oga/redmine-presentation-846109

## チケットの作り方
チケットは、redmineのプロジェクトサイトのタブの「新しいチケット」というページから作ります。題名・説明を書けば、作れてしまうのですが、それだけを記入して作られたチケットはあまり活用されません。プロジェクトのメンバの「誰に」作業を振り、「いつまで」にやって欲しいかを登録することでそのメンバにメールで通知が送られます。そのメンバがそのチケットに応えることで、コミュニケーションが生まれるというのが、チケット運用の基本的な概念です。一見、パッシブなシステムですが、メール通知機能を持つことでインタラクティブ性をもったシステムになっています。具体的な作り方は以下を参照のこと

http://redmine.jp/tech_note/first-step/user/create-issue/

## チケットの更新
チケットをアサインされた人は、チケットを更新することで仕事を進めます。プロジェクトのチケットタブから、いつでもそのプロジェクトのチケット一覧は確認できますが、慣れてくるとこのページからチケットの確認をするのはリーダーさんだけになります。それより「マイページ」の自分のチケット一覧、もしくはメール通知のリンクから、辿って更新することが多くなります。

大事なことは、更新するときに、「担当者」をしっかりとアサインすることです。例えば、仕事をする上で疑問点がでてきて質問を書き込んだのに、担当者が自分のままだと質問にこたえるべき人がその内容に気づかないことがあります。メーリングリストで全体に質問を投げても返ってこないことがあるように、メッセージのキャッチボールを意識して、担当者の変更は適切にしましょう。

http://redmine.jp/tech_note/first-step/user/issue/
http://redmine.jp/tech_note/first-step/user/update-issue/

## 終わったチケットは必ずクローズしよう
チケットシステムは、作成者（仕事をそもそも振ったリーダー）が存在します。担当者の仕事が終わっても、誰かがチケットをクローズしないとそのチケットはずっとアクティブな状態で残ります。これは、進捗確認をするときの一覧性を著しく下げるとともに、ToDoがごちゃごちゃになって、チケットで仕事を進める意欲を低下させます。

仕事でも、結局、作業確認がおこなわれず「あれ、どうなったんだっけ」「たしか○○さんがやってたんですが、どうなったんでしょうね」という無責任なやりとりを一度ならず聞いたことがあると思いますが、チケットの仕組みでは、このような確認作業が必ず行われるように、ワークフローのDoneとCloseが明確に区別されています。なので、チケットを作成した人、もしくは担当者は確認作業をした後、しっかりとチケットをCloseしてとむらいましょう。

## メールでいうとCcに当たるWatcher
チケットの担当者はこの人なんだけど、他の人にも見てもらいたい。メールでいうとCcに当たるようなことをチケットでもしたいことは良くあります。そのニーズを満たすために、ウォッチャーという機能がチケットに用意されています。ウォッチャーを登録すると、そのチケットの通知は作成者、担当者だけでなく、ウォッチャーとして登録された人にも届きます。必須ではないけど、コメントがあったらしてほしいといったようなニーズがあるときにはその人をウォッチャーとして登録しましょう。

http://redmine.jp/glossary/i/issue-watcher/
Terraformのnull_resourceでAWS CLIを使うときの注意点

Terraformの`null_resource`ではawsプロバイダで指定している`profile`が使用されない。
例えばECRにPushするときのクレデンシャルを取得する`get-login-password`は
```
aws ecr get-login-password --profile=production | docker login ...
```
といった感じにprofileを明示してあげる必要がある。
地味にハマりポイントなので注意。
Oracle Databaseの監査ログをOCI Logging Analyticsへ連携する

## はじめに
Oracle Databaseには「監査」と呼ばれる機能があり、この機能を用いることでデータベース・アクティビティの監視を行うことが可能です。
この監査機能を利用して、Oracle Databae上の特定のテーブルに対するアクションを記録し、その情報をOCIのLogging Analyticsで表示する検証を行ったため、備忘として記録します。

## Logging Analytics
OCI Logging Analyticsには、様々なリソースから取得したログ情報を表示分析する機能が有ります。加えてラベルやログ・データに応じたアラート通知を行い、通知サービスであるNotificationと連携させることで、メールやSMSを送ることも可能です。そのため、リソースの利用状況が逼迫した場合に自動で通知を受け取るといった運用監視にも利用可能です。

## Oracle Database監査ポリシーを作成
はじめにOracle Database監査ポリシーを作成します。今回の検証では、GUIでSQLを実行できるAutonomous Databaseを利用しました。Autonomous DatabaseとLogging Analyticsを連携させる場合、別途Computeを用意してAgentを設定する必要があります(本投稿では省略)。

監査対象とする検証用のテーブルとしてTEST_AUDITテーブルを作成し、そのテーブルに対する全てのアクションを監査するポリシーを作成します。実利用の場合はログが膨大になることが想定されるため、SELECTやUPDATEなどの特定アクションや特定ユーザーからの操作等に絞って設定することが望ましいと考えられます。
```
CREATE AUDIT POLICY all_actions_on_test_audit ACTIONS ALL ONLY TOPLEVEL;
```

CREATE AUDITだけでは作成した監査ポリシーは有効化されないため、CREATE AUDIT後に以下を実行します。
```
AUDIT POLICY all_actions_on_test_audit;
```

この状態でデータベース内に作成されたすべての監査ポリシー情報を取得してみると、先ほど作成したポリシーが登録されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/60b43bcb-2ab5-5d9d-aada-58c5144c8ece.png)


ポリシーが有効化されているかどうかも確認してみます。結果に先ほど作成したポリシーが含まれていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/4c786e89-25e0-c9f5-5824-2e0231bf3aa7.png)


これでTEST_AUDITテーブルにDML操作を行うとアクションが記録される状態になっていることがわかりました。作成したTEST_AUDITテーブルに対してSELECTを実行した後に、UNIFIED_AUDIT_TRAILの情報を取得してみると、SELECTを行ったことが記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/0c0cb433-fcb8-48ca-e8e4-298614b99146.png)

## Logging Analyticsの設定 
次にLogging Analyticsの設定を行います。Logging Analyticsは、OCIコンソール上でログを分析できるログ・エクスプローラー機能を有したサービスです。

初めに、ロググループを作成します。Logging Analyticsの「管理」からログ・グループの作成が可能です。任意の名前を設定して、ロググループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/a05e563b-e20d-fd0c-b42d-cd2b664e846c.png)


次にエンティティを作成します。ロググループ作成時と同様にLogging Analyticsの「管理」から作成可能です。管理エージェントには、Computeで設定したAgentを登録します。プロパティにあるプロパティ値は、Autonomous Database DB接続情報に記載の内容を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/7e830ea4-02b8-7531-137e-9895c1827633.png)

次にLogging Analyticsのソースを設定します。同様に、Logging Analyticsの「管理」から「ソースの作成」が可能です。作成画面でデータベースの問い合わせとして、UNIFIED_AUDIT_TRAILから情報を取得するようSQL問い合わせ定義をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/f743608c-ad21-2a4c-d0be-1e9ad0cb956c.png)


最後にエンティティとソースの関連付けを行います。


Logging AnalyticsでUNIFIED_AUDIT_TRAILからの情報を表示させる準備は完了したので、実際にLogging Analyticsで確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599194/cf5ccd71-d7f3-105f-8afb-f4a233cfd5ee.png)

画面イメージの通り、Autonomous Database上に記録されたUNIFIED_AUDIT_TRAILの情報が取得できていることが確認できました。検索画面では取得対象の時間幅も指定可能であるため、より広い範囲や狭い範囲で状況を確認することも可能です。

本投稿に記載はしていませんが、Logging Analyticsではしきい値、時間範囲を指定してアラーム作成が可能です。そのため、アラームを用いてNotificationへ連携させることで、条件に応じてメール等による通知を得ることが可能です。
空間とチャンネルを動的なパラメータで捉えるViT【Restormer】



**原論文**
Restormer: Efficient Transformer for High-Resolution Image Restoration
https://arxiv.org/pdf/2111.09881.pdf





# 結論
空間方向とチャンネル方向のどちらも動的なパラメータで捉えるように設計したViTで，高画質画像でも効率的（計算量が大きすぎず）に計算できる．

# 概要
画像認識のスタンダードモデルとして，CNNモデルがあるが，CNNは，カーネルの範囲内（3x3画素）の情報を集約する計算をするため，受容野が狭い．また，静的なパラメータで入力画像に柔軟に適応できない問題点がある．
次に発表されたViTモデルは受容野が広く，入力画像に柔軟に適応できる動的なパラメータを持つ．しかし，ViTモデルは計算量が大きすぎて，特に，高画質タスクに不向きである問題点がある．そこで，高画質な画像を使用する画像生成タスクにおいて，効率的なモデルを提案する．


〜〜〜〜
`動的なパラメータ：入力画像の持つ値を使用して重みを計算する．つまり，入力画像によって異なる重みを持つ．入力画像には，近い位置に重要な情報があるか，遠い位置に重要な情報があるかは異なる．これら情報を加味してパラメータを決定する．`
〜〜〜〜


# モデル構造
ViTで使用されるmulti-head Self Attention（SA）の代わりにmulti-Dconv head ‘transposed’ attention(MDTA)を提案し，以下の図のうすだいだい色(a)に示す．
また，ViTで使用されるFFNの代わりにgated-Dconv FN(GDFN)を提案し，以下の図の水色(b)に示す．


## MDTA
MDTAはViTのSAの代わりに導入する．
通常のSAの場合，Q(HW$\times$C)とK(HW$\times$C)の内積計算で，$C$を打ち消し合ってA(HW$\times$HW)の特徴量を獲得する．つまり，空間の重要度を計算する．提案された，MDTAの場合，Q(HW$\times$C)とK(HW$\times$C)の内積計算で，$HW$を打ち消し合ってA(C$\times$C)の特徴量を獲得する．つまり，チャンネルの重要度を計算する．これによって，空間情報が多い場合（高画質画像）に空間の重要度計算が大きすぎる問題を解決する．


これら，QKVを使用した構造は動的なパラメータ（重み）を持つ．QKの内積計算からsoftmaxをとり，値を0~1に集約して，その重要度をVにかける．この重みは入力画像から取り出した値であるため，入力画像に柔軟に適応できる動的なパラメータを持つ．
また，QKVには，それぞれ3$\times$3の畳み込み層(Dconv)が導入されて，局所的な空間情報を埋め込む．


## GDFN
GDFNはViTのFFNの代わりに導入する．
ViTのSAでは空間的な情報を獲得しているので，通常のFFNでは，チャンネル方向の情報を獲得する．しかし，以下のモデルで採用されるMDTAはチャンネル方向の計算をしている．そのため,GDFNでは，空間的な情報を計算する．


入力された特徴量を2つのルートそれぞれに入力して$1\times1conv$,$3\times3Dconv$を計算した後，片方に活性化関数を通す（どんな関数でもいいと思うけど論文では，GELU）．
これにより，特徴量の重要度が決定され，もう片方にかけることで重要度を計算する．（下ルートで値が0になった場合は，上ルートの同じ位置の値は0になる．逆に，下ルートで値が2に(1を超える)なったら，上ルートの同じ位置の値は強調される．）


これも，入力特徴量の値を使用して重み（重要度）を決定しているため，動的なパラメータを持つ．$H\times H \times \gamma C$の$\gamma$は通常4を使用し，チャンネル数を$1\times1conv$で拡張させる．後の$1\times1conv$で元に戻す．


![スクリーンショット 2024-02-07 9.00.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/cfe24110-49c4-c48b-8b88-ac6e89481cd7.png)





# 実験
　画像生成の分野で，ノイズがなくクリアな画像を生成できるようになったよ

![スクリーンショット 2024-02-07 9.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/8f0ea6d5-a410-19c6-3707-79b02cf2ce34.png)


# まとめ
今回は，空間とチャンネルを動的なパラメータで捉えるViT【Restormer】について解説した．高画質画像を使用する画像生成タスクにおいて，MDTAでは，チャンネル方向の重要度を計算し，GDFNでは，空間方向の重要度を計算することで，高画質画像でも効率的な計算が可能なモデルになる．
弊社で取り組んでいるデータ活用システムの取り込み方法について

## はじめに
弊社オープントーンで提供している、
データの投入とそのデータを分析、活用するツールです。

業務のデジタル化により効率化を図るだけではなく、
デジタル化によって収集されるデータの分析・利活用により、
ビジネス戦略の再検討や、新たなビジネスモデルの創出が望まれています。

昨今弊社では様々なビジネス上のユーザーデータを集めて、データ集計・分析する取り組みをし、それを顧客に提供しています。
その中でいくつかのデータの投入方法を実現しています。

そのようなデータを集積・分析するには実際のデータを吸い上げることが必要で、
また統計データの集計値ではなく、実際のデータを利用するため、
より現実に即したデータで分析を行うことができるものになります。

ここではその一例を紹介します。

## データの投入方法について
データの投入をするという話を上記で触れたかと思いましたが、
以下のような取り込み方法に対応しています。

- 1.SFTP投入
- 2.スクレイピング投入
- 3.API投入
- 4.手動投入

## SFTP投入
エンドユーザーから直接S3にSFTPでデータファイルを配置頂く形になります。
S3にデータが投入されたのをトリガーとしてLambdaがバッチを呼び出し、投入頂いたデータをそのままDBに投入するような連携方法。
![SFTP.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730947/8f1fdfaf-8a44-a22f-73ec-eaed60544577.png)

## スクレイピング投入
Eventbridgeで定期的に発火を行い、
データが格納されているWebページからバッチにてクレイピング対象サイトからファイルを取得しDBにそれぞれ投入までを行う連携方法
![scraping.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730947/597175ec-404e-b7a6-b993-244e0483bf36.png)

## API投入
Eventbridgeで定期的に発火を行い、
エンドユーザーが使用しているシステムのベンダーが提供している外部APIを利用し、
そのレスポンスをシステムDBに投入する連携方法。
![API.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730947/03e44658-497d-4627-d68e-d69d010962fe.png)


## 手動投入
上記3つの取り込みで対応できないようであれば、
エクセルシートやcsvによるアップロード（独自フォーマットではなく、ユーザーが運用しているフォーマットからETL処理）を行います。
アプリのフロント画面からエクセルファイルをアップロードし、それをDBに投入する連携。
S3にデータが投入されたのをトリガーとしてLambdaがバッチを呼び出し、投入頂いたデータをそのままDBに投入するような連携方法をとります。
![手動.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730947/5df507ef-20cf-488e-07b1-022ad260de5a.png)
Pull Request、ちゃんとpullしてますか？

記事を読んでいただきありがとうございます。
普段はPM業務をしている駆け出しエンジニアです。

ある時先輩に、Pull Request（以下PR）レビューのコツについて聞いてみると、その先輩はレビューをする時はいつも`git pull`をしてlocalで動作の確認をしているそうです。その話を聞いて面白いなと思ったので、記事にまとめてみました。

PRとは、開発の内容（マージ先との差分）を確認してもらうために提出する、Githubの機能の1つです。
チーム開発をした方であれば、誰もが使ったことがあると思いますが、割とGithubの画面上だけの確認になってしまいがちです。よくよく考えてみれば、「(git) pull依頼」という意味なので、元は`git pull`をする前提だったのかなと思います（常識だったらすみません）。

## エディタの静的エラーが出る

今回その先輩と一緒に入っている案件は、PHP/Laravelの案件でした。
PHPは動的な言語なので、何も設定していなければ「動かしてみるまでエラーがわからない」です。

例えば、2つの引数が必要なメソッドに1つだけしか渡していない状態でも、実際に動くまではエラーになりません。

```php
function test(int a, int b): int
{
  return a + b;
}

// 実際に動かすまでエラーが発生しない！
test(1);
```
こういったミスがあったとしても、CIを導入していない限りGithub上では分かりにくいです。
レビュワーも人間ですから、確認漏れが発生してしまう可能性もあります。

そこで`git pull`をしてみましょう。エディタの静的解析ツールが即座に警告を提供するため、動的言語でも事前にエラーを検出できます。
上記だけではなく、未使用の変数や型エラーなどもいけます。

```php
function add(int a, int b): int
{
  return a + b;
}

// 波線で警告してくれる！
add(1);
```

もちろん、CIによる自動テストが最も確実ですが、git pullを使うことで発生するエラーを前もって防げるのは大きな利点です。
上記以外にも、型エラーなども出してくれるので便利です。

## スペルミスが防げる

エディタやその拡張機能によっては、英語のスペルミスを指摘する機能があります。
スペルミスはCIテストでは検出しにくく、人による確認でも見落とされやすいです。

```php
function retrunText(): string
{
    return "Hello, World!";
}

// スペルミスでもエラーが発生しない
$str = retrunText();
```

上記の`retrunText()`は見ての通りスペルを大ミスしています。
にもかかわらず、エラーにはなりません。正しく間違ったスペルのメソッドを呼び出しているからです。

正しくは以下ですね（命名がキモいのは一旦置いておいてください）。

```php
function returnText(): string
{
    return "Hello, World!";
}

$str = returnText();
```

スペルチェック機能を備えたエディタなら、この種のスペルミスも検出します。

## 自動整形が効く

これも大きいメリットです。
不要なスペース、インデント、use宣言の並び替え、etc....
数多くの小さな問題を一発で検出できます。

huskyなどのツールで自動整形が設定されている場合を除き、GitHubのfile changesでこれらを全て検出するのは困難です。

ファイルをセーブしただけで一撃で自動整形し、remoteとの差分を見ればどこを指摘すれば良いのか丸わかりになります。わざわざ一行ずつ「不要な改行はないか...？ズレてるインデントは...」と探す必要もないのです。

## 実際に動かせる

検証環境の前に実際に動かすことができるのも大きなメリットだと思います。
個人的にはCIでテストコードが自動化されていても心配になってしまうので...。

localで手順に従って動作確認を行うことで、ドメイン知識に基づいた具体的なフィードバックが可能になります。
他の人のタスクに関するドメイン知識はふわっと理解している場合が多く、コードの清潔さに焦点が当たりがちです。

一番大切なのは要件を満たしているかどうかなので、テストコードだけで不安な場合は、local環境での実行をお勧めします。

## 逆にデメリット

逆にデメリットだなぁと思った部分で言うと、当然ながらGithub上のみでレビューするよりも時間がかかります。
さらに、各開発者の環境によっては、localでのセットアップや依存関係の問題で実際に動作確認するまでに追加の手順が必要になる場合があります。

ただ、もしCIが導入されていない現場だった場合、動作検証などには時間をかけるべきと思うので、localにpullして確認することも検討してみてはいかがでしょうか？
Amplify ディレクティブ一覧

Amplifyで使用できるディレクティブ一覧をまとめた物です。

以下の公式サイトを和訳したものですので、詳細はそちらをご覧ください。
https://docs.amplify.aws/javascript/tools/cli/graphqlapi/directives-reference/#pageMain

|  ディレクティブ |  詳細  |
| ---- | ---- |
|  @model  |  トップレベルのデータモデルを定義する物です。内部的にはDynamoDBが生成されます  |****
|  @primaryKey  |  データモデルに対して、カスタムのプライマリーキーを設定します  |********
|  @index  |  データモデルに対してカスタムのセカンダリインデックスを設定します  |********
|  @auth  |  データモデルとフィールドに対して認証ルールを定義します  |********
|  @hasOne |  二つのデータモデル間で、一方向の１対１リレーションを作成します。 一つのプロジェクトが一つのチームを持つような関係性を示します。これにより、一つのクエリでプロジェクトとチームの情報を一度に取得することができます。 |********
|  @hasMany  |  二つのデータモデル間で、一方向の１対多リレーションを作成します。一つの投稿が複数のコメントを持つような関係性を示します。これにより、一つのクエリで投稿データとそれに紐づくコメントを一度に取得することができます。|********
|  @belongsTo  |  二つのデータモデル間で双方向の@hasOneまたは@hasManyのリレーションを作成します。一つのプロジェクトが一つのチームを持つような関係性を示します。これにより、チームのレコードから関連するプロジェクトを取得、またはその逆を行うことが可能になります。 |********
|  @manyToMany  |  二つのデータモデル間に多対多のリレーションを作成します。内部的には、二つのモデル間に連結テーブルを作成し、リレーションを円滑にします。一つのブログが複数のタグを持ち、一つのタグが複数のブログを持つような関係性を示します。  |********
|  @function  |  フィールドに対してlambda関数のリゾルバーを設定します。  |********
|  @http  |  フィールドに対してhttpのリゾルバーを作成します。  |********
|  @predictions  |  Amazon Rekognition, Amazon Translate, and/or Amazon PollyなどのAI/MLサービスを呼び出します。  |********
|  @searchable  |  Amazon OpenSearchへデータをストリーミングすることで、検索や集計を可能にします。  |********
|  @mapsTo  |  データモデルに削除不可のデータが存在する場合、@mapsToを使用することで、データを削除することなく、データモデル名を変更することができます。  |************
Fortigate で異なるAS間でのBGPルーティングを行いたい

現在の、検証中で同一AS内でのピアは確立できることを確認しました。
でも、異なるAS間でのピアが確立できません。
AS間(異なるAS間)でBGPでルーティングする場合、ピア確立時にBGP Openメッセージで自分のAS番号を通知しますが、ピア同士が異なるAS番号の場合、自動的にEBGPでピア確立されるのが普通、という理解でよろしいのでしょうか？
下記のようなメッセージが表示され、TCPセッションが終了し、ピアが確立できませんでした。

AS100と200間でのピア確立時にFortigateの画面に表示されたエラーメッセージ
(ちなみにAS100と200間の通信を想定しています。)
メッセージ：
BGP: 10.1.0.2-Outgoing[DECODE] Open: Bad RemoteAS(200), expected 100

ルータ同士は直結です。(したがってTTLの変更の必要はないと思います。)
Fortigateの設定上でEBGP/IBGPを明示的に設定する必要があるのでしょうか？

対抗のASが自ASと異なって至る場合、OPENメッセージでそれを認識すると自動的にEBGPになるものだと理解していたのですが、設定が必要なのでしょうか？

ぜひ、ご協力お願いいたします。
ChatGPTで資料作り

## ChatGPTを使ってプレゼン資料を作る
資料作りを行う上で、ChatGPTを多用しているので共有します。
出力は今回、Marpからスライドを作成します。

## 使用するツール
・ChatGPT
・Marp for VS Code

## 作成方法
1.ChatGPTでプレゼン資料にしたい内容をMarp形式で出力するよう指示する
2.Marp for VS Codeを拡張を入れた、VS Codeに貼り付け
3.スライド爆誕


## 実践
ChatGPTで作成するプレゼン資料という本記事の題名を例にして、ChatGPTに指示を出した例です。作成したいスライドの内容に応じて指示内容は変えてください。

#命令書:
あなたは、プロのエバンジェリストです。
以下のスライドの題名、スライドの内容と制約条件を厳密に守り 最高のライトニングトークとなるようなスライド作成をお願いします。尚、スライドはMarp for VS Codeで作成するため対応したMarkdownを出力してください。

```
#制約条件:
・目次を付けること
・視認性が良い配色とし、カッコいいと感じるデザインとすること
・5分以内で説明できる内容
・誰にでもわかりやすく
・重要なキーワードを取り残さない
・画像や図形を用いて説明すること
・ITエンジニア向けの内容とすること
・出力するMarkdownはコピー＆ペーストできる形式で出力すること

#スライドの題名:
ChatGPTで作成するプレゼン資料

#スライドの内容:
ChatGPTとMarp for VS Codeを使ってスライド作成を行う方法について説明する
```

ChatGPTの出力結果は長いので割愛
→ChatGPTから出力された結果をVSCodeに張り付けるだけで完成!!

あとは、VS CodeからPDFなどお好きな形式にして使ってください。

以上、プレゼンや資料などを作るときに便利なのでぜひ使ってみてください。
Reactのinput type="number"でintegerのみに制限させるには？

# inputで整数のみを入力させるのは意外と面倒

```tsx
<input
  type="number"
  value={value}
  onChange={(event) => {
    console.log("event:", event)
    event.target.value
  }}
/>
```

この状態で`.` `e`を打ってもまずeventが飛んでこないので、制御のしようがない。

![Screenshot 2024-02-07 at 8.36.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/b808e331-b3ba-fb33-6966-05dbd2f75c7d.jpeg)

なので、例えこういう感じで強制しても、

```tsx
<input
  type="number"
  value={value}
  onChange={(event) => {
    console.log("event:", event)
    setValue(`${parseInt(event.target.value)}`)
  }}
/>
```

![Screenshot 2024-02-07 at 8.39.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/e51d98f0-26c2-17b4-2697-54db65fdae08.jpeg)

`10.`とか全然出来る。（整数ではあるが、絶対使う側から「なんで？」って言われる）

# 解決方法

`onChange`だとキー入力の補足が出来ないので、`onKeyDown`を併用する。

```tsx
import React from "react"
interface Props {}

const ALLOWED = ["-", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Backspace"]

const test: React.FC<Props> = (props) => {
  const [value, setValue] = React.useState("")
  return (
    <input
    type="number"
    value={value}
    onChange={(event) => {
      const newValue = parseInt(event.target.value)
      if (isNaN(newValue)) {
        event.preventDefault()
        return
      }

      setValue(`${newValue}`)
    }}
    onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
      if (event.key.match(/\d/)) return
      if (ALLOWED.includes(event.key)) return

      // e . その他は無効
      event.preventDefault()
    }}
  />
)
}
export default test
```
Raycast備忘録（随時更新）

# すぐに使いこなせる機能

1. browserのBookmark検索: `bm`のaliasをつけている
    1. Google Profileの切り替えもできるので便利 (切り替えが頻繁に発生するとちょっときつい)
1. screenshotの検索: 頻度は高くないので`search screenshots`を愚直に使う
1. Jira検索: 普段Jiraを使っていれば便利
1. Confluence検索: 普段Confluenceを使っていれば便利
1. Notion検索: Notionの検索もExtensionをいれれば簡単
1. Windowのサイズ変更: `option` + `command` + `↑` で上半分など hotkeyを設定
1. VSCodeのSearchProject: Windowが増えがちなので最近開いたプロジェクトをすぐに見つけられるのが便利

# 使いこなしたいけどまだできてないもの

1. Google Calendar確認: nativeのCalendarはGoogle CalendarをMacのCalendarに同期しないといけないので若干不便
    1. [Raycast で作業スピードを爆速化 ! Google カレンダー連携 拡張機能の作り方](https://goodpatch-tech.hatenablog.com/entry/raycast-extension-oauth2)
    1. [Raycastでスケジュール管理（My Schedule）](https://zenn.dev/fujishiro/scraps/8aa0e1edca246b): Google Calendarと連携
1. GitHubの検索: GitHubの検索やリンクなどはいつも使うのでもっと使いこなしたいが現状はまだすぐにRaycastでできていない
1. Floating Note: 便利そうであまり使いこなせていない
1. Bard: 連携できるので使ってみたい
    1. https://github.com/raycast/extensions/blob/9a89848c055c9dc306655fd9be4d04b324081ae9/extensions/raycast-bard-ai/README.md
1. Slackの検索:
    1. https://dev.classmethod.jp/articles/raycast-post-slack-message/
    1. https://www.raycast.com/mommertf/slack 試してみたがまだ動いてない

# 使ってみたけどあまりやめたもの

1. ChatGPT: 対話っぽくならないのが若干微妙でUninstall


# 参考

1. https://zenn.dev/yum3/articles/i_raycast_or_alfred
1. https://qiita.com/mtaku29/items/31ec3b0ac48ab35d8a80
論理式の簡略化

# カルノー図

　論理式を図的に表現したものをカルノー図と呼ぶ。
　以下の式を図で表す。
 
・式
　¬A・¬B + ¬A・B + A・¬B

・図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663746/afde1455-8cff-a39c-32bd-6088180c1b1b.png)

　①AとBの真偽値をマトリックス図にする。
　②¬A・¬Bがtrueとなる部分に1を記入
　③¬A・Bがtrueとなる部分に1を記入
　④A・¬Bがtrueとなる部分に1を記入
　⑤いずれの式もtrueとならない部分に0を記入

　
・次に、図の中で縦と横で1が連続しているマスをまとめる。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663746/78b53af3-e9a9-4f96-1fa1-14024eb9141f.png)

　左の図では、Bの真偽に関係なく、¬Aであれば真となる。
　右の図では、Aの真偽に関係なく、¬Bであれば真となる。

　¬A・¬B + ¬A・B + A・¬B = ¬A
　¬A・¬B + ¬A・B + A・¬B = ¬B

　上記のように式を置き換えることが可能
システム運用保守における調査対応について

## はじめに
この記事ではメンバー目線（特に1、2年目）での調査対応の乗り越え方を書いてみました。
自分なりにやってよかったことをまとめております。

大きく以下の3つに分けて書いております。
①調査の依頼が来た時
②調査中に気を付けること
③調査結果をまとめる時

## ①調査の依頼が来た時
基本的に調査依頼というものは必ず目的があって依頼されますが、
その目的を「`理解しておく`」ことが大切だと考えております。
理由としては、
<dt>顧客との認識相違を生まないようにするため</dt>
になります。

調査内容にお互いの認識相違があった場合、
せっかく調べたものも無駄になってしまったり
顧客からも「大丈夫かな？」と不安に思われてしまいます。

調査依頼が来たときは依頼内容をそのまま実施だけではなく、
目的を理解しつつ、必要であれば認識をすり合わせながら進めていくことが大切です。

## ②調査中に気を付けること
調査依頼の目的を理解して調査を進める際、
以下の点には気を付けた方が良いと思いました。
- <dt>調査した内容はテキストなどにメモしながら進めていく</dt>
　　頭の中を整理するのに必要です。
　　経験があればメモしなくても大丈夫にはなってきますが、
 　　見返すことができるようにメモしておいた方が他の調査で参考にしやすいです。
- <dt>それぞれの設計書の意味を理解しておく</dt>
　　ここは障害対応と同じです。
　　情報を効率的に集めるにはどんな時に使用する設計書か理解する必要があります。
- <dt>足りない情報は提供していただく</dt>
　　調査依頼は顧客から提供されたデータ（ログやエビデンスなど）を
  　　もとに実施することも多いです。
    　　しかし、調査に必要な情報がないことや顧客にしかわからないものも存在しますので
      　　その際は随時確認して情報を提供していただく必要がございます。
- <dt>依頼の対応期限に合わせて柔軟に動けるようにする</dt>
　　調査依頼の対応期限は必ず把握しておくことが必要です。
  　　対応期限に間に合わなさそう、であれば調査結果を小出しにしながら
    　　進めていくなどで顧客側の不安を抑えるようにしたり、
      　　他メンバーの力を借りるなどの対応も必要となります。
- <dt>調査結果の裏取りをしておく</dt>
　　機能の調査などについては設計書だけで調査することも可能ではありますが、
  　　ソースコードも併せて確認することで情報が確実なものとなります。
    　　設計書などのメンテナンスがしっかり行われるプロジェクトであればよいですが、
     　　万が一現行の実装と違った内容を伝えてしまう可能性もありますので、
       　　裏取りをしておくことは重要です。

## ③調査結果をまとめる時
調査依頼を提出する先の顧客は自分たちと同じエンジニアではないことが多いです。
そのため、調査結果を報告する際の文章・資料の作成については、
エンジニアでなくともわかる内容（何もわからない状態で見ても理解できるような）にする必要があります。
そのため、私は以下のことを意識しております。
・文章構成は「調査依頼内容への回答⇒理由⇒補足⇒質問（必要であれば）」にする
・資料作成時はシンプルかつ「見やすさ」を意識する

## まとめ
調査対応は慣れるまでは時間がかかる作業だとは思います。
しかし、調査した内容は今後の遺産にもなりますので、
説明力が重要な作業だと思いました。
今回の記事で初学者の方などの参考になればとても幸いです。
windowsでiverilog その143

# 概要　
windowsでiverilogやってみた。
cpu見つけたので、verilogで書いてみた。


# アセンブラ

「hello」を出力。

```
  LD      ACC, 104
  OUT
  LD      ACC, 101
  OUT
  LD      ACC, 108
  OUT
  LD      ACC, 108
  OUT
  LD      ACC, 111
  OUT
  HLT
```


# サンプルコード

LDとOUTとHLTを実装。


```

module kemu(input clk, input rst, output [7:0] outport);
	reg [7:0] acc;
	reg [7:0] ix;
	reg [7:0] pc;
	reg [7:0] outport;
	reg [7:0] rom[31:0];
	reg [7:0] ram[31:0];
	reg cf;
	reg zf;
	reg nf;
	reg vf;
	wire [7:0] code;
	wire [3:0] op;
	wire a;
	wire [2:0] b;
	wire [1:0] sm;
	assign code = rom[pc];
	assign op = code[7:4];
	assign a = code[3];
	assign b = code[6:4];
	assign sm = code[5:4];
	task init_rom;
	begin
		rom[0] <= 8'h62; //LD      ACC, 104
		rom[1] <= 8'h68; //
		rom[2] <= 8'h10; //OUT
		rom[3] <= 8'h62; //LD      ACC, 101
		rom[4] <= 8'h65; //
		rom[5] <= 8'h10; //OUT
		rom[6] <= 8'h62; //LD      ACC, 108
		rom[7] <= 8'h6c; //
		rom[8] <= 8'h10; //OUT
		rom[9] <= 8'h62; //LD      ACC, 108
		rom[10] <= 8'h6c; //
		rom[11] <= 8'h10; //OUT
		rom[12] <= 8'h62; //LD      ACC, 111
		rom[13] <= 8'h6f; //
		rom[14] <= 8'h10; //OUT
		rom[15] <= 8'h0f; //HLT
	end
	endtask
	always @(posedge clk, negedge rst)
	begin
		if (!rst)
		begin
			init_rom;
			acc <= 8'h0;
			ix <= 8'h0;
			pc <= 8'h0;
			cf = 0;
			vf = 0;
			nf = 0;
			zf = 0;
		end
		else
		begin
			if (cf && zf)
				pc <= pc + 1;
			else
			begin
				case (op)
				4'h0:// NOP HLT
					pc <= pc;
				4'h1:// IN OUT
					if (a == 0)
					begin
						outport <= acc;
					end
				4'h2:// SCF RCF
					pc <= pc;
				4'h3:// B**
					pc <= pc;
				4'h4:// RA LA RL LL
					pc <= pc;
				4'h5:// data
					pc <= pc;
				4'h6:// LD
					if (a == 0)
					begin
						pc = pc + 1;
						acc = rom[pc];
					end
				4'h7:// ST
					pc <= pc;
				4'h8:// SBC
					pc <= pc;
				4'h9:// ADC
					pc <= pc;
				4'ha:// SUB
					pc <= pc;
				4'hb:// ADD
					pc <= pc;
				4'hc:// EOR
					pc <= pc;
				4'hd:// OR
					pc <= pc;
				4'he:// AND
					pc <= pc;
				4'hf:// CMP
					pc <= pc;
				endcase
				//if (rega != 7)
				pc <= pc + 1;
			end
		end
	end
	initial
	begin
		//$monitor("%d %h %h %h %h", pc, acc, op, code, outport);
	end
endmodule

module test;
	reg clk,
		rst;
	wire [7:0] outport;
	kemu u(.clk(clk), .rst(rst), .outport(outport));
	initial
	begin
		$monitor("%s", outport);
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#30
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule


```

# 実行結果

```
>vvp a.out

h
e
l
o
kemu0.v:145: $finish called at 34 (1s)

```


以上。
cutomHooksの作成(Typescript) @yukilulu0229

## hooks

ロジックを分離することで可読性を高める

```hooks/useAllUsers.ts

import axios from "axios";
import {useState} from "react";
import {UserApi} from "../types/api/userApi.ts";
import {UserProfile} from "../types/UserProfile.ts";

export const useAllUsers = (() => {
  const [userProfiles, setUserProfiles] = useState<Array<UserProfile>>([])
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(false);

  const getUsers = () => {
    setLoading(true);
    setError(false);

    axios.get<Array<UserApi>>("https://jsonplaceholder.typicode.com/users").then((res) => {
      const data = res.data.map((user) => ({
        id: user.id,
        name: `${user.name}(${user.username})`,
        email: user.email,
        address: `${user.address.city}${user.address.suite}${user.address.street}`
      }))
      setUserProfiles(data);
    }).catch(() => {
      setError(true)
    }).finally(() => {
      setLoading(false);
    })
  }

  return {getUsers, userProfiles, loading, error}
})

```

### 型定義を読み込む

```types/api/userApi.ts
export type UserApi = {
  id: number;
  name: string;
  username: string;
  email: string;
  address: {
  street: string;
    suite: string;
    city: string;
    zipcode: string;
    geo: {
    lat: string;
      lng: string
  }
};
  phone: string;
  website: string;
  company: {
  name: string;
    catchPhrase: string;
    bs: string;
  }
}

```

```types/userProfile.ts
export type UserProfile = {
  id: number,
  name: string,
  email: string
  address: string
}

```

### 使いたい場所

```App.tsx
import './App.css'
import axios from "axios";
import {useState} from "react";
import UserCard from "./components/UserCard.tsx";
import UserProfile from "./UserProfile.tsx";
import {useAllUsers} from "./hooks/useAllUsers.ts";


function App() {
  const {getUsers, userProfiles, loading, error} = useAllUsers()
  const onClickFetchUser = () => {
    getUsers();
  };
  return (
    <>
      <button onClick={onClickFetchUser}>Get Users</button>
      <br />
      {error ? (
        <p style={{color: "red"}}>データの取得に失敗しました</p>
      ) : loading ? (
        <p>loading</p>
      ) : (
        <>
          {userProfiles.map((user) => (
            <UserCard key={user.id} user={user} />
          ))}
        </>
      )}
    </>
  )
}

export default App

```

```
const {getUsers, userProfiles, loading, error} = useAllUsers()
```
hooksから使いたいものを読み込む

```
getUsers();
```

hooksのgetUsers関数を使えるようにする

```
{userProfiles.map((user) => (
    <UserCard key={user.id} user={user} />
))}
```
hooksのuseStateのuserProfilesを使えるようにする

```
{error ? (
    <p style={{color: "red"}}>データの取得に失敗しました</p>
) : loading ? (
    <p>loading</p>
) : (
    <>
      {userProfiles.map((user) => (
        <UserCard key={user.id} user={user} />
      ))}
    </>
)}
```

useStateのerrorとloadingも使えるようにする
websocket

```HTML
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Example</title>
</head>
<body>
    <div>
        <label for="message">Message:</label>
        <input type="text" id="message" name="message">
        <button onclick="sendMessage()">Send</button>
    </div>
    <div id="messages"></div>
    <script>
        var ws = new WebSocket("ws://127.0.0.1:8000");
        function sendMessage() {
            var message = document.getElementById("message").value;
            ws.send(message);
        }
        ws.onmessage = function(event) {
            var messages = document.getElementById("messages");
            messages.innerHTML += "<p>" + event.data + "</p>";
        };
    </script>
</body>
</html>
```

```jav
// WebSocket オブジェクトを作成
var ws = new WebSocket("ws://example.com");

// WebSocket が接続されたときのイベントハンドラ
ws.onopen = function(event) {
  // サーバーに接続したことを表示
  console.log("Connected to server");
};

// WebSocket からメッセージを受信したときのイベントハンドラ
ws.onmessage = function(event) {
  // サーバーから受信したデータを取得
  var data = event.data;

  // データのタイプを判別する
  if (data instanceof Blob) {
    // データが画像の場合
    // 画像を表示するための canvas 要素を作成
    var canvas = document.createElement("canvas");
    var context = canvas.getContext("2d");

    // 画像を読み込むための Image オブジェクトを作成
    var image = new Image();
    image.onload = function() {
      // canvas のサイズを画像のサイズに合わせる
      canvas.width = image.width;
      canvas.height = image.height;

      // canvas に画像を描画する
      context.drawImage(image, 0, 0);

      // canvas を HTML ドキュメントに追加する
      document.body.appendChild(canvas);
    };
    // 画像のバイナリデータを URL に変換する
    image.src = URL.createObjectURL(data);
  } else {
    // データがテキストの場合
    // テキストを表示するための p 要素を作成
    var p = document.createElement("p");
    p.textContent = data;

    // p 要素を HTML ドキュメントに追加する
    document.body.appendChild(p);
  }
};

```
メモ帳とコマンドプロンプトでゲームを個人製作した話

タイトル通りです。ノートパソコンで製作しました。言語はC#で、"Game of Challenge"という名前でBoothに公開しました。
# 作るのに必要だったもの
- Windows入りノートパソコン
ほぼメモ帳(ソースコードエディタ)とコマンドプロンプト(コンパイル&実行環境)です。
- 素材
サウンドと画像です。知り合いに作ってもらいました。
# なぜメモ帳とコマンドプロンプトで?
ノートパソコンでVisual Studioを入れられるほど容量がないというのとそれ以外の方法を知らなかったからメモ帳とコマンドプロンプトという最小限のツールになりました。
# 実際どうだったか
### ノートパソコンで開発はきつい
一番きつい部分としてとにかく重いです。コマンドプロンプトで直接コンパイルしていたのでコンパイルではそんなに気にならなかったですが、実行時のテストプレイなどもノートパソコンなのでバグがあるかどうかの確認がしづらいというのがきつかったです。
### メモ帳なのは意外と気にならない
ただし等幅フォントじゃないと見づらくて目が死にます。あとUDデジタル教科書体は1とlや0とOの違いがないのでMSゴシックとかがおすすめです。
### ゲームエンジンはすごい
GamemakerとかGodotとかはすごいです。ちゃんとしたゲームを手間を少なくできるように作られていることが数時間触ったらわかりました。
# 余談
呪われているのか、私のノートパソコンかつ私のゲームの時だけ音が出なくなりました。それ以外なら普通に音が出ます。
Java（FW:Spring）の為の環境構築

簡単な新規アプリ作成のために環境構築したら、
えらい大変だったので、その過程の学びを共有します。

# 結論
https://willbrains.jp/
↑ここから該当するものをダウンロードして下さい。
下記の４つ全部入りなのでそのまま使えます。

そして何が何のために必要なのかチンプンカンプンだったので、
まとめました。

**OpenJDK(Java Development Kit):**
オープンソースのJava開発キットであり、Javaアプリケーション開発に必要なコンパイラやライブラリなどが含まれています。

**STS (Spring Tool Suite):**
Spring開発に特化したEclipseベースのIDE(統合開発環境)で、Springプロジェクトのセットアップやテスト、デバッグを容易にします。Spring Bootなどのフレームワークとの統合が強化されており、開発の効率化を図れます。

**Pleiades:**
Eclipseの日本語化プラグインで、IDE(統合開発環境)のメニューやオプションを日本語表示に変更することができます。

**Eclipse:**
多言語に対応した汎用IDE(統合開発環境)で、プラグインによる機能の拡張が可能です。Java開発の基本的な環境として広く使用されており、カスタマイズ性が高い点が特徴です。

**開発環境：**
OS:macOS Sonoma 14.1.1
Java Springでデバックする方法

Java Spring 環境においてデバック方法は大きく２つです。

# IDEを使用したデバッグ
IDEを使用したデバッグは、開発者がコードを実行中に
ブレークポイントを設定して、特定の行や条件で実行を
停止させる機能です。

**ブレークポイントの設定**

コード内の任意の行にブレークポイントを設定します。
このブレークポイントがある行にプログラムの実行が到達すると、IDEはそこで実行を一時停止します。

**ステップ実行**

実行を一時停止した後、一行ずつコードを実行することができます（ステップオーバー）、または関数内に入って行く（ステップイン）、または関数から抜ける（ステップアウト）などの操作を行うことができます。

**変数の検査**

実行を停止した状態で、ローカル変数やインスタンス変数の値を確認することができます。これにより、変数の値が予期したものであるかを確認し、バグの原因を特定できます。

**条件付きブレークポイント**

特定の条件が真のときのみブレークポイントで停止させることができます。これにより、問題が発生する特定のシナリオをデバッグしやすくなります。

**例外ブレークポイント**

例外が投げられた時点で実行を停止するように設定することができ、例外の原因をより簡単に特定できます。

# **ログ出力でデバック**
ログ出力は、アプリケーションの実行時の情報を外部に記録するための手法です。Spring Bootでは、以下のステップでログを設定し利用します

**ログフレームワークの選択**

logbackやlog4j2は、Javaのログフレームワークの中でよく使用されるものです。Spring Bootはlogbackをデフォルトで使用しますが、log4j2など他のログライブラリに変更することもできます。

**ログレベルの設定**

application.propertiesまたはapplication.ymlファイルでログレベルを設定します。たとえば、logging.level.org.springframework.web=DEBUGと設定すると、Spring FrameworkのWeb関連のクラスのデバッグ情報が出力されます。

**ログの出力**

コード内でログを出力するには、Loggerオブジェクトを使用してメッセージを記録します。例えば、logger.debug("Debug message")と記述すると、デバッグレベルのログが出力されます。

**ログのフォーマット**

ログの出力形式をカスタマイズできます。タイムスタンプ、ログレベル、スレッド名、クラス名などの情報を含めることができます。

**ログのローテーションと保持**

ファイルサイズや日付に基づいて古いログをアーカイブし、新しいログファイルを開始する設定を行うことができます。
Vue.jsで簡易Todoリストアプリを作成してみた

Vue.jsの理解の一助として簡易Todoリストアプリを作成してみました。

他のフレームワーク触っていないのでVue.jsの特性と言えるか分からないですが、作ってみてとても便利だと感じたのがリアクティブシステムです。

# リアクティブシステムとは、
データ同士が紐付けられて、どちらか一方のデータが更新されると、もう一方も更新される仕組みのことです。

このリアクティブシステムをJavaScriptで実装しようとすると、処理が複雑になりコード量も多くなってしまいますが、リアクティブシステムを使うと処理が簡潔になるだけでなく、誰が書いても似たようなコードになるので、メンテナンスしやすいというメリットがあります。

データを同期させるためには、HTML要素に特別な属性を与えることが必要です。その属性のことを ディレクティブといい、Vue.jsが提供する属性であることを示す「v-」で始まる名前が付けられています。

v-bindは、JavaScriptのデータが更新されるとDOMのデータが更新される、一方通行でバインドするデータとして定義するディレクティブです。

v-modelは、双方向でバインドするデータとして定義するディレクティブで、v-bindの動作に加え、フォームからユーザーの入力があるたびにJavaScriptのデータを更新します。

上記らを用いることで、「チェックボックスを押下したら、タスク内容がグレーアウトする処理」を追加できます。

html
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Vue.js TODO APP</title>
  <link rel="stylesheet" href="./style.css">
</head>
<body>
  <div id="to-do">
    <p>
      NewTask:
      <input type="text" v-model="newTask">
      <button @click="addTodo()">Add</button>
    </p>
    <hr>
    <ul>
      <li v-for="todo in todos">
        <input type="checkbox" v-model="todo.isCompleted">
        <span :class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span>
        <button @click="deleteTodo(todo)">Delete</button>
      </li>
    </ul>
  </div>

  <!-- Vue.js -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
  <script src="./main.js"></script>
</body>
</html>
```
css
```
ul {
  margin: 0;
  padding: 0;
  list-style-type: none;
}

ul > li {
  margin: 5px;
  text-indent: 0;
}

#to-do {
  width: 800px;
  margin: 0 auto;
}

ul > li > .complete {
  text-decoration: line-through;
  color: #ddd;
}
```
js
```
new Vue({
  el: '#to-do',
  data: {
    newTask: '',
    todos: [
      { task: 'Rubyの勉強をする', isCompleted: false },
      { task: 'Vue.jsのアプリを作る', isCompleted: false },
      { task: 'Youtubeをみる', isCompleted: false }
    ]
  },
  methods: {
    addTodo: function() {
      if (this.newTask == '') return;
      this.todos.push(
        { task: this.newTask, isCompleted: false }
      );
      this.newTask = '';
    },
    deleteTodo: function (todo) {
      var index = this.todos.indexOf(todo)
      this.todos.splice(index, 1)
    }
  }
});
```
下記サイトを参考にしました。 
https://zenn.dev/shima_zu/articles/vuejs_todo_application#%E7%AD%86%E8%80%85%E3%81%AE%E5%AD%A6%E7%BF%92%E6%99%82%E3%81%AE%E6%8A%80%E8%A1%93%E3%83%AC%E3%83%99%E3%83%AB
どちらが良いの？　intelliJ IDEA vs Eclipse

Java Spring環境でのアプリケーション開発において、IntelliJ IDEAとEclipseは共に広く使用される統合開発環境（IDE）ですが、いくつかの違いがあります。両者の主な特徴とメリット、デメリットを説明します。

# IntelliJ IDEA
**メリット**

**ユーザーインターフェース:**
直感的でモダンなユーザーインターフェースを持ち、使いやすいと多くの開発者に評価されています。

**スマートなコード補完:**
高度なコード補完機能を持ち、コードの記述を効率的に支援します。

**強力なリファクタリングとナビゲーションツール:**
コードのリファクタリングやソースコード内のナビゲーションが容易です。

**Springに特化したサポート:**
Springフレームワークに対する優れたサポートがあり、
Spring Bootアプリケーションの開発が容易です。

**デメリット**

**リソース使用量:**
比較的多くのシステムリソースを消費し、特に古いまたは低スペックのマシンでは遅くなることがあります。

**コスト:**
無料版（Community Edition）もありますが、すべての機能にアクセスするためには有料版（Ultimate Edition）が必要です。

# Eclipse
**メリット**

**オープンソース:**
無料で利用でき、多くのプラグインが提供されているため、カスタマイズが容易です。

**広範囲なプラグインエコシステム:**
様々なプラグインにより、さまざまな開発ニーズに対応できます。

**リソースの使用量:**
IntelliJ IDEAに比べてリソースの使用量が少なく、軽量です。

**デメリット**

**ユーザーインターフェース:**
IntelliJ IDEAに比べると古めのインターフェースであり、一部のユーザーには直感的でないと感じられることがあります。

**設定とカスタマイズ:**
設定やカスタマイズが複雑で、初学者にはやや難しいと感じられる場合があります。

**パフォーマンスの問題:**
大規模プロジェクトや多くのプラグインを使用する場合、パフォーマンスの低下を経験することがあります。

# 結論

**初学者向け:**
IntelliJ IDEAの方が使いやすく直感的なので、初学者には特に推奨されます。特に、Springフレームワークを使用する場合、IntelliJ IDEAのサポートは非常に役立ちます。

**リソースとコストを考慮する場合:**
Eclipseは無料でリソースを少なく消費するため、コストやマシンの性能に制限がある場合に適しています。
Pythonの基本的な入門

## 前提
Pythonのインストールはこちら

https://qiita.com/Tasuku-Q/items/8625321f2c3a7f062c4f

Pythonはプログラム初心者でも学びやすい言語と言われています
またプログラム言語ランキングでもよくTOP5に入っている言語です


## Pythonの基本
・Hello world
新しい言語の勉強ではまずこれでしょう

test.pyのファイルを用意して実行してみましょう

```test.py
print("Hello world")
```

用意できたら実行してみましょう
```zsh
% python test.py
Hello world
```
はい、「Hello world」が確認できました
ではPython基本的なところを学んでいきましょう
各項目毎にサンプル処理を紹介しますので一緒に「test.py」などにコピペして実行してみてください

#### ※pythonの実行に関して
インストールしているpythonが3系の方は実行コマンドがこちらになります、本記事では実行コマンドは「python」で統一していきますがインストールしているバージョンに合わせて実行してみてください
```zsh
% python3 test.py
Hello world
```

・変数とデータ型
Pythonでは変数を使ってデータを格納し操作します、変数と基本的なデータ型の例です
```python
# 変数の宣言
x = 5
y = "Hello, Python!"

# データ型の確認
print(type(x))  # int
print(type(y))  # str
```

実行結果
```
% python test.py
<class 'int'>
<class 'str'>
```

・条件分岐と繰り返し
制御構造はプログラムの流れを制御します、以下は条件分岐と繰り返しの例です
```python
# 数値を入力
x = int(input("xの数を入力してください: "))

# 条件分岐
if x > 0:
  print("xは正の数です")
elif x == 0:
  print("xはゼロです")
else:
  print("xは負の数です")

# 繰り返し（for文）
for i in range(5):
  print(i)
```

実行結果
```
% python test.py
xの数を入力してください: 3
xは正の数です
0
1
2
3
4
```

・関数
関数を定義して再利用可能なコードを作成できます
```python
# 関数の定義
def greet(name):
  return f"Hello, {name}!"

# 関数の呼び出し
result = greet("Takasi")
print(result)
```

実行結果
```
% python test.py
名前を入力してください: takasi
Hello, takasi!
```

・簡単な計算
入力された二つの数値を計算してみます
```python
# 二つの数値を入力
num1 = float(input("最初の数を入力してください: "))
num2 = float(input("次の数を入力してください: "))

# 足し算
sum_result = num1 + num2
print(f"合計: {sum_result}")

# 掛け算
multiply_result = num1 * num2
print(f"積: {multiply_result}")
```

実行結果
```
% python test.py
最初の数を入力してください: 10
次の数を入力してください: 5
合計: 15.0
積: 50.0
```

・リスト
リストは複数の要素を格納するためのデータ構造です
```python
# リストの定義
fruits = ["りんご", "ばなな", "いちご"]

# リストの要素を表示
for fruit in fruits:
  print(fruit)

# 新しい要素の追加
fruits.append("みかん")
print(fruits)
```

実行結果
```
% python test.py
りんご
ばなな
いちご
['りんご', 'ばなな', 'いちご', 'みかん']
```

## おわり
筆者はASWのLambdaを活用したいのでPythonを少しまとめてみました
今後はLambdaで使いそうなPythonのサンプルなど書いていこうかと思います
vue.jsと他のフレームワークの比較

Vue.jsはモダンなJavaScriptフレームワークの中でも他の主要なフレームワークであるAngularやReactと比較すると、いくつかの顕著な利点があります。

# Vue.js vs Angular
AngularはGoogleによって開発された強力なフレームワークですが、その複雑さがしばしば障壁となります。AngularはTypeScriptを使用し、MVC（モデル-ビュー-コントローラ）アーキテクチャに基づいているため、学習曲線が急です。一方でVue.jsは、そのシンプルさと直感的なAPI設計で知られています。Vue.jsはHTML、CSS、JavaScriptの基本的な知識があればすぐに始められ、複雑な設定やビルドプロセスが必要ないため、小規模から中規模のプロジェクトに特に適しています。

Vue.jsはまた、HTMLベースのテンプレート構文を採用しており、これにより開発者はすでに親しんでいるHTMLを活用してアプリケーションを構築できます。これはAngularのTypeScriptや特別な構文と比較して、より手軽で直感的です。

# Vue.js vs React
ReactはFacebookによって開発されたライブラリで、UIコンポーネントの構築に焦点を当てています。ReactはJSX（JavaScriptとXMLの構文拡張）を使用し、コンポーネントベースのアプローチを取っていますが、Vue.jsはHTMLベースのテンプレートを採用しています。この点において、Vue.jsは多くのウェブ開発者にとってより親しみやすく、習得が容易です。

また、Vue.jsはリアクティブなデータバインディングと計算されたプロパティをサポートしており、これによりアプリケーション内のデータフローの管理が容易になります。Reactでは、このような機能を実現するために追加のライブラリやフックを利用する必要があります。

# まとめ
Vue.jsは、その学習のしやすさ、直感的なHTMLベースのテンプレート構文、およびリアクティブなデータ管理の能力により、AngularやReactと比較して独自の地位を築いています。これらの特徴は、特に新しい技術を迅速に習得し、効率的な開発プロセスを必要とする個人開発者や中小規模のチームに適しています。Vue.jsのシンプルさは入門者にやさしく、その強力な機能セットは複雑なアプリケーションの開発にも対応しているため、幅広いプロジェクトでの利用が可能です。

参考サイト： 
https://udemy.benesse.co.jp/development/system/javascript-framework.html

https://www.sejuku.net/blog/70110

https://freelance-start.com/articles/71
Javaってなんぞい？

Javaはプログラミングの世界で非常に人気があり、オブジェクト指向の概念を核とするプログラミング言語です。プログラミングが初めての方にとって、オブジェクト指向という言葉は少し難しく感じるかもしれませんが、実際には私たちの日常生活に非常に近い考え方です。この記事では、Javaとオブジェクト指向の基本を解説し、プログラミングの世界への理解を深める手助けをします。

# Javaとは何か？
Javaは、1995年にサン・マイクロシステムズによって開発されたプログラミング言語です。その主な特徴は「Write Once, Run Anywhere(一度書けば、どこでも動かせる)」というスローガンに題されるポータビリティです。Javaで書かれたプログラムはJava仮想マシン（JVM）上で実行されるため、Windows、Mac、Linuxなど、さまざまなオペレーティングシステムで動作します。これにより、開発者は特定のプラットフォームに縛られることなく、アプリケーションを作成できます。

**オブジェクト指向プログラミング（OOP）**
オブジェクト指向プログラミングは、プログラムを「オブジェクト」という単位で考えるアプローチです。オブジェクトとは、実世界の物体や概念をコンピュータの世界で表したものです。

オブジェクト指向の鍵は、「クラス」と「インスタンス」です。クラスはオブジェクトの設計図であり、インスタンスはその設計図から作られた具体的な実体です。 オブジェクト指向の利点は、コードの再利用性、拡張性、管理のしやすさにあります。オブジェクトごとにコードを分割することで、プログラム全体を理解しやすくなり、変更や拡張が容易になります。

**Javaでのオブジェクト指向**
Javaを学ぶ上で、オブジェクト指向の概念を理解することは非常に重要です。Javaはオブジェクト指向言語であり、すべてがオブジェクトとして扱われます。Javaでプログラムを書くときは、まずクラスを定義し、そのクラスからオブジェクト（インスタンス）を生成して使用します。

Javaのオブジェクト指向の特徴は以下の通りです：

**継承：**
あるクラスの特性を別のクラスが引き継ぐことができます。これにより、コードの再利用性が向上します。

**ポリモーフィズム：**
同じインターフェースや基底クラスを持つオブジェクトが、異なる実装を持つことができます。これにより、柔軟なコード設計が可能になります。

**カプセル化：**
オブジェクトの詳細な実装を隠蔽し、外部からの直接的なアクセスを制限します。これにより、オブジェクトの安全性と信頼性が向上します。

**抽象化：**
複雑な実態を単純な形で表現することで、プログラムをより理解しやすくします。

**まとめ：**
オブジェクト指向の考え方は、最初は複雑に感じるかもしれませんが、慣れると非常に自然な思考法となります。Javaを通じてオブジェクト指向の世界に触れ、プログラミングのスキルを深めていくことは、これからのデジタル時代を生きる上で大きな資産となるでしょう。
APIについて

API（Application Programming Interface）は、プログラミングの世界において非常に重要な概念であり、アプリケーションやソフトウェアが互いに通信し、機能を共有するための手段を提供します。APIの基本を理解し、その重要性と利用方法について学ぶことを目指します。

# APIとは何か？
APIは、「アプリケーションプログラミングインターフェース」の略で、ソフトウェアコンポーネント間でデータを交換し、機能を共有するための一連の規則、プロトコル、ツールのことを指します。簡単に言うと、APIはソフトウェアアプリケーションが他のアプリケーションと「話す」ための方法です。

**APIの重要性**
APIは、異なるソフトウェアシステム間で情報を共有し、機能を統合することを可能にします。例えば、ソーシャルメディアプラットフォームのAPIを使用して、ウェブサイトに最新のソーシャルメディアフィードを表示したり、地図サービスのAPIを利用して、アプリケーション内に地図を組み込んだりすることができます。これにより、開発者はゼロから全てを構築する必要なく、既存の機能を活用して新しいアプリケーションを迅速に開発することができます。

**APIの種類**
APIにはいくつかの主要な種類がありますが、ここでは特に一般的な2つを紹介します。

**ウェブAPI:**

インターネットを介してサービスを提供するAPIで、RESTやSOAPなどのプロトコルを使用します。ウェブAPIは、ウェブベースのアプリケーション間でデータを交換するために広く使用されています。

**ライブラリベースのAPI:**

特定のプログラミング言語やソフトウェアライブラリで提供されるAPIで、そのライブラリの関数やクラスを通じて機能を利用します。

# APIの利用方法
APIを利用する基本的なプロセスは以下の通りです。

**エンドポイントの理解:**

APIエンドポイントは、APIが提供する特定の機能やリソースにアクセスするためのURLです。APIのドキュメントを参照して、使用可能なエンドポイントとそのパラメータを理解します。

**リクエストの送信:**

APIを利用するには、HTTPリクエストをエンドポイントに送信する必要があります。このリクエストには、必要に応じて認証情報や追加のパラメータが含まれます。

**レスポンスの処理:**

APIからのレスポンスは通常、JSONまたはXML形式で返されます。このレスポンスデータをアプリケーション内で適切に処理し、ユーザーに必要な情報を提供します。

# APIのベストプラクティス
**セキュリティを重視する:**

APIを介して敏感なデータを扱う場合は、適切な認証と認可のメカニズムを実装することが重要です。

**レート制限を守る:**

多くのAPIにはリクエストのレート制限があります。これを超えると、APIアクセスが一時的に制限される可能性があります。

**エラーハンドリングを適切に行う:**

APIリクエストが失敗した場合には、エラーコードをチェックし、問題を適切に処理することが重要です。

## まとめ
APIはプログラミングにおいて非常に強力なツールであり、異なるアプリケーション間で機能を共有し、統合することを可能にします。APIの世界は広大であり、学ぶべきことはまだまだたくさんありますが、基本を押さえることで、より複雑なAPIの利用に挑戦する事ができます。
Prismatixとは

Prismatixは、ECサイトとCRM（顧客関係管理）のためのAPIプラットフォームを提供するサービスです。

# **特徴**
**マイクロサービスアーキテクチャ:**

Prismatixは、ECやCRMに必要な機能をマイクロサービスとして提供します。これにより、カート、注文、決済、商品管理、在庫管理、顧客管理などの各機能が独立したサービスとして展開されます。

**API利用の促進:**

共通のAPIを通じて、フロントエンドシステムやバックオフィスシステムが情報を操作できるようになります。これにより、データの統合と処理が容易になります。

**ビジネス規模やサービスフェーズに合わせた構成の選択:**

Prismatixのマイクロサービスアーキテクチャにより、ビジネスの成長や変化に合わせて必要な機能のみを選択し、柔軟なシステム構築が可能です。

**汎用性と拡張性:**

さまざまな業界やビジネスモデルに適用可能で、特にECサイトやCRMシステムの構築において、ビジネスの要件に応じたカスタマイズが可能です。

**無償提供のテンプレート:**

UI/UXの実現に集中できるよう、Prismatixは事前に構築されたテンプレートを無償で提供し、開発の効率化を支援します。

# **メリット**
**効率的なシステム統合:**

独立したマイクロサービスを通じて、システム間の統合が容易になり、開発と運用の効率が向上します。

**柔軟性とスケーラビリティ:**

必要な機能を選択し、ビジネスの成長に合わせてシステムを拡張することができます。

**開発コストの削減:**

共通の機能をAPIで提供することで、開発時間とコストを削減し、リソースを他の価値ある活動に集中できます。

**カスタマイズとユーザーエクスペリエンスの向上:**

ビジネスの特定のニーズに合わせてシステムをカスタマイズでき、エンドユーザーにとってより良い体験を提供できます。

**迅速な市場投入:**

テンプレートとマイクロサービスの活用により、製品やサービスを迅速に市場に投入できます。

# **まとめ：**
Prismatixは、これらの特徴とメリットを通じて、ビジネスのデジタルトランスフォーメーションを支援し、効率的で柔軟なシステム構築を可能にするEC・CRMプラットフォームです。

**参考：**

https://prismatix.jp/

https://youtu.be/Nylabi5tNBg?feature=shared

https://dev.classmethod.jp/articles/this-is-prismatix-team-style/
useStateで配列を更新する際に少しでも記述量を減らす（学習記録アプリ）

## 初めに
今回簡単な学習記録アプリを開発して、その流れの中でコードの量を減らす記述方法を学んだので共有します！

## 修正前の記述
```js
const [inputText, setInputText] = useState("");
const [inputTime, setInputTime] = useState("");
const [records, setRecords] = useState([]);
const [error, setError] = useState("");

//ボタンをクリックした時の動作
const onClickAdd = () => {
    const newRecord = {
      title: inputText, //フォームに記入した学習内容
      time: inputTime, //フォームに記入した学習時間
    };

    // 学習内容と学習時間がどちらも記入されていれば処理を回す
    if (inputText !== "" && inputTime !== "") {
      const recordsArray = [...records, newRecord];
      setRecords(recordsArray);
      setInputText(""); //ボタンをクリックしたらフォーム内に記入した学習内容を初期化
      setInputTime(""); //ボタンをクリックしたらフォーム内に記入した学習時間を初期化
      setError(""); // 学習内容と学習時間がどちらも記入されていれば注意文は表示しない
      
    // 学習内容と学習時間がどちらかが記入されていなければ注意文を表示
    } else {
      setError("入力されていない項目があります");
    }
};

```
この記述な中で省略できる箇所があります。
## 修正後
```js
const [inputText, setInputText] = useState("");
const [inputTime, setInputTime] = useState("");
const [records, setRecords] = useState([]);
const [error, setError] = useState("");

//ボタンをクリックした時の動作
const onClickAdd = () => {
    const newRecord = {
      title: inputText, //フォームに記入した学習内容
      time: inputTime, //フォームに記入した学習時間
    };

    // 学習内容と学習時間がどちらも記入されていれば処理を回す
    if (inputText !== "" && inputTime !== "") {
      setRecords([...records, newRecord]); 
      setInputText(""); //ボタンをクリックしたらフォーム内に記入した学習内容を初期化
      setInputTime(""); //ボタンをクリックしたらフォーム内に記入した学習時間を初期化
      setError(""); // 学習内容と学習時間がどちらも記入されていれば注意文は表示しない
      
    // 学習内容と学習時間がどちらかが記入されていなければ注意文を表示
    } else {
      setError("入力されていない項目があります");
    }
};
```
答えは
```js
const recordsArray = [...records, newRecord];
setRecords(recordsArray);
//上のコードを以下のように変更しました
setRecords([...records, newRecord]); 
```
## 終わりに
今回はたった1行の省略ですが記述量が増えてくれば、少しでもコードの可読性を上げるためにこういった省略記法も大切！
他にも省略できる箇所はあるかもしれないので、リファクタリング進めていきたいです！
USCIS Announces Organizational Accounts: H-1B Process to Get Easier?

The H-1B visa program, bridging the gap between U.S. businesses and global talent, is a lifeline for companies seeking specialized skill sets. Yet, unlocking its potential often requires navigating a bureaucratic maze. Recognizing this, U.S. Citizenship and Immigration Services (USCIS) recently announced the upcoming launch of a package of customer experience improvements for H-1B cap season.

Read this blog to find out what this significant step is all about.

What’s Changing?
Organizational Accounts: Launching in February 2024, these accounts allow multiple authorized users within companies and their legal representatives to collaborate on H-1B registrations and petitions (Form I-129) electronically. This streamlines communication, lowers redundancy, and simplifies the overall process.
Online Filing for Form I-129: Following the launch of organizational accounts, online filing for Form I-129 will become available, eliminating the need for paper submissions. This enhances efficiency, reduces processing times, and minimizes errors.
Benefits for Employers and Legal Representatives‍‍

Better Collaboration: Multiple individuals within a company can work together on H-1B petitions within the secure organizational account platform.
Reduced Errors: Electronic filing minimizes the risk of typos or missing information, increasing petition approval chances.
Faster Processing: Online filing and efficient collaboration are expected to shorten processing times for H-1B petitions.
Cost Savings: Eliminating paper forms and postage reduces administrative costs for both employers and legal representatives.
Additional Initiatives

USCIS Lockbox Transition: Paper filings for Forms I-129 and I-907 (Premium Processing Service) will move to a central lockbox for standardization and efficient processing.
National Engagements: USCIS will conduct informational sessions in January and February to guide organizations and legal representatives through the new system.
Looking Ahead
The launch of organizational accounts and online filing represents a significant modernization of the H-1B petition process. This will benefit employers, legal representatives, and, ultimately, the skilled workers seeking H-1B visas. By promoting transparency, collaboration, and efficiency, USCIS is taking a positive step towards a smoother and more streamlined H-1B experience for all stakeholders.

OnBlick is committed to monitoring the USCIS and will promptly share the latest updates as soon as they become available.

![organizat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678143/987df701-dcf8-d98f-747b-a41537c296f5.jpeg)
【OCI】ADBで不要な資格証明 (Credential)を削除する方法

## はじめに
Oracle Cloud Infrastructure（OCI）のAutonomous Database (ADB)へ、OCIオブジェクトストレージからデータをロードする際に、色々試していたら資格証明 (Credential)を作りすぎてしまい、消すのに困ったことがありました。なので、ADBで不要な資格証明を削除する方法についてご紹介しようと思います。

## 不要な資格証明を確認する方法
**■ 前提条件**
・ADB上で対象の資格証明を作成
　ADMINユーザーで削除する資格証明「Test_1」「Test_2」「Test_3」を作成します。

 **1. ADB上の資格証明の参照**
今回は、ADBの機能のDatabase ActionsでSQL文を実行し、資格証明の参照と削除を行っていきます。
まず、OCIのコンソール上で利用するADBのDatabase Actionsを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/c3678efa-a324-15d8-0d32-4e4b876323b7.png)

次に対象の資格証明を保有しているユーザーを選択し、ワークシートにSQLを入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/00f043f0-9b67-4d5e-f177-965071ef091c.png)

ADB上で作成してある資格証明を参照するためのSQL文は以下の通りです。
~~~
select * from user_credentials;
~~~
今回の場合ですと、出力結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/30e6c128-9647-a700-0b19-d41456d63124.png)
赤枠で囲ったCREDENTIAL_NAMEの情報を用いて、資格証明を削除していきます。

 **2. ADB上の資格証明の削除**

資格証明を削除するには以下のプロシージャをDatabase Actionで実行します。
~~~html
	begin
	   DBMS_CREDENTIAL.DROP_CREDENTIAL ('<資格証明名>', TRUE);
	end;
~~~
今回の場合ですと、<資格証明名>の部分を「TEST_1」などに変更すると、資格証明が削除されます。

## おまけ（資格証明を更新する方法）
以下の記事には、資格証明の内容を変更する方法が書かれていますので、削除ではなく内容の更新をしたい場合はこちらを参考にすると良いです。

https://qiita.com/ayamakkk/items/1c85b4013e44f552fee5

## おわりに
ADBで不要な資格証明が増えてしまい削除するなどして整理したいときに、今回紹介した内容が役に立つと思います。
本記事がADBを利用する上での一助になれば幸いです。
テストコードのカバレッジは100%じゃなくてもいい

# はじめに
今回はこちらのコードカバレッジに関するGoogleのテストブログを読んだので
コードカバレッジの目安についてまとめていきたいと思います。

https://testing.googleblog.com/2020/08/code-coverage-best-practices.html

# コードカバレッジとは
コードカバレッジはテストコードの指標として用いられます。対象ソースコードに対して、どれだけ網羅してテストできているかを表します。カバレッジにもいろいろな種類があり、関数単位、ソースの行単位、条件文を網羅できるかなど、様々な観点でカバレッジを出すことができます。
基本的には、テストされたアイテム数、コードで見つかったアイテムに対して、カバレッジ率（コードで見つかったアイテムのうち、テストされたアイテムの割合）を算出します。カバレッジ率が高ければ、高いほど網羅性が高いです。

# コードカバレッジが高い ≠ 品質が高い
コードカバレッジが高ければ、より網羅的にテストできていることを表すことができますが、品質がめちゃくちゃ高いかどうかはまた話が変わってきます。網羅的にテストできてることが、テストケースがバグを適切に検出できてるとは言えないです。
カバレッジを数値化している目的は、あくまでどのソースコードの箇所がテストできていないかを分かるようにするためです。本来の目的であるバグを減らすことを考えると、網羅性に加えて、バグをより検出できるテストコードを書くほうに力を入れる必要があります。

# コードカバレッジは100%じゃなくていい
コードカバレッジを100%に近づけようとすることに重点を置くと、テストケースの品質が下がり、無駄な作業に時間をかける場合があります。例えば、コードカバレッジを100%にするため、あと1行をカバーするテストコードを書く必要があり、そのコードをどう書くか考えます。最終的に残っている個所は特殊な書き方じゃないとカバーできない箇所だったりすることが多く、これらを考えるのに見合ったリターンがなく、不毛な作業が増えます。体感、コードカバレッジを0%から80,90%までにすることよりも、95%を100%にすることのほうが、時間がかかると思います。
こうした作業に時間をかけるよりも、テストケースが適切なものになっているか見直したほうがより良いテストコードにすることができます。

# コードカバレッジの目安
Googleでは、コードカバレッジのパーセンテージの目安が
60%：「許容できる」
75%：「賞賛に値する」
90%：「模範的」
となっています。

https://bliki-ja.github.io/TestCoverage

こちらの記事も見ると、85～99%の間が推奨されています。
ベストな目安は85%以上と考えられます。

# まとめ
コードカバレッジについて調べなおして、改めてコードカバレッジの数字だけが大事ではないことに気づかされました。
これからは、コードカバレッジの数字だけでなく、バグをより少なくできるテストコードを書けてるか意識して書いていきたいです。