OmniAICreator/Qiita-1.07M huggingface dataset:
エクスプローラで「隠しファイル」を有効にしても表示されないフォルダの原因と表示方法

# いきさつ

ある時、これまで存在していたはずのフォルダがエクスプローラやdirコマンド上で表示されなくなる問題が発生しました。

このフォルダ上には「可視フォルダ」「不可視フォルダ」「不可視フォルダ2」という3つのフォルダが存在しますが、「隠しファイル」を有効にしても「不可視フォルダ2」が表示されません。また、誤って削除した可能性を考慮し、ファイル復元ソフトで調べてみましたが、「不可視フォルダ2」が削除された痕跡はありません。

更に調べてみたところ、パスを直接表示すると「不可視フォルダ2」へアクセスすることができました。フォルダへアクセスすることができたため、ファイルシステムの破損を疑い `chkdsk` コマンドでチェックしてみましたが、エラーは見つかりませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/59d82450-1d94-5b42-4bf7-dff7b01c90b9.png)

# 原因

## attrib コマンドで確認する
attribコマンドを実行したところ、次の結果が出力されました。

```
F:\example>attrib /D
    H                F:\example\不可視フォルダ
   SH                F:\example\不可視フォルダ2
                     F:\example\可視フォルダ
```

見えないフォルダには `SH` という属性が適用されています。
`S` はシステムファイル属性、 `H` は不可視属性です。

以上から、システムファイル属性と不可視属性の両方が適用されたフォルダは、エクスプローラー上に表示されない、という仮説にたどりつきます。

## 「保護されたオペレーティングシステムファイルを表示しない」を無効化する（チェックを外す）

エクスプローラのフォルダオプションには、「保護されたオペレーティングシステムファイルを表示しない」という設定項目があります。通常、この項目にはチェックが入っていますが、この項目のチェックを外して確認してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6105152d-397b-a4a3-c815-4c27cf84cbbb.png" width="400">

チェックを外してから設定を適用すると、これまで表示されなかった「不可視フォルダ2」も見えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ac06f61c-1f07-dba3-9d5b-50a40f332801.png)

以上より、先に仮設した「システムファイル属性と不可視属性の両方が適用されたフォルダは、エクスプローラー上に表示されない」が証明されました。ちなみに、このような隠しフォルダ・ファイルは「スーパー隠し属性」と言われるようです。

## 表示されない隠しフォルダ（スーパー隠し属性が適用されたフォルダ）を、普通の隠しフォルダに変更する
以下のコマンドを実行することで、システムファイル属性が解除され、「スーパー隠し属性」から普通の「隠し属性」のフォルダに変更されます。

なお、システムファイル属性と不可視属性の両方が適用されている場合は、一方の属性のみを解除することは出来ず、両方の属性を解除する必要があります。よって、普通の隠しフォルダとする場合は、一旦システムファイル属性と不可視属性の両方を解除してから、不可視属性を適用するという手順で対応します。

```
attrib -S -H 不可視フォルダ2
attrib -H 不可視フォルダ2
```
# 最後に

このページにたどり着いた方は、おそらく意識的にシステムファイル属性を適用した覚えのない方であろうと思います。また、なぜこのような問題が発生するのか、ほとんどのケースにおいては明確な原因が分からない状態であろうと思います。

原因は別として、もし同様の事象が発生した際には、本記事の内容が参考になれば幸いです。

# 参考

https://www.inasoft.org/webhelp/rnsf7/HLP000246.html
２次元配列をシートに貼り付けする

```vb
Sub PasteArrayToSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("貼り付け先のシート名") ' 貼り付け先のシート名を設定
    
    Dim arr As Variant
    arr = ExtractRowsStartingWithOne() ' 関数から2次元配列を取得
    
    If Not IsEmpty(arr) Then
        Dim startCell As Range
        Set startCell = ws.Range("貼り付け開始セル") ' 例: "A1"
        
        ' 貼り付ける範囲を計算
        Dim endRow As Long
        endRow = startCell.Row + UBound(arr, 1) - 1
        
        Dim endColumn As Long
        endColumn = startCell.Column + UBound(arr, 2) - 1
        
        Dim endCell As Range
        Set endCell = ws.Cells(endRow, endColumn)
        
        ' 計算された範囲に配列の内容を貼り付け
        ws.Range(startCell, endCell).Value = arr
    End If
End Sub
[MacOS]ssh接続の際、接続拒否エラー

# 経緯
MacOSからwsl（ubuntu)へssh接続を試みた際、何度やっても繋がらない。
試しにlocalhostの通信を試したら、以下のようなエラーと出くわす。

# エラー内容
```
ssh localhost
ssh: connect to host localhost port 〇〇: Connection refused
```

# 解決策
**Macでは、デフォルトで SSH での接続を受け付けないように設定されている**

「システム設定」→「共有」と検索→「リモートログイン」を有効にして、sshでの接続ができるようにする。

以下の図はMacOS Sonoma14.1での例

![スクリーンショット 2024-03-19 14.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/a454ad0b-7ba5-1bc3-8a72-c84724cbc6a0.png)
Spring スタータ・プロジェクト (Spring Initializer) メモ(eclipse2023)

Eclipse2023 使って Spring スタータ・プロジェクト (Spring Initializer) よりプロジェクト作るときの簡易メモ
依存関係はデフォルトから Thmeleaf だけ追加してます  

# 環境
- windows11
- Eclipse2023 (pleiades)
- Spring Boot 3.2.3 (Maven)
- Java21

# やったこと（手順的なやつ）

## プロジェクト作成

1. Eclipse で Spring スタータ・プロジェクト(Spring Initializer) の新規作成
    [ファイル] - [新規] - [Spring スタータ・プロジェクト(Spring Initializer)] をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/7903f95e-b617-9351-8079-ffe8505b3e6a.png)

1. 設定のダイアログ① は以下の設定を行い [次へ] をクリック
    名前：任意でOK
    タイプ：Maven ※環境合わせるため
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/929829b2-ea8b-0c65-852d-c72aa06dfac4.png)

1. 設定のダイアログ② は以下の設定を行い [完了] をクリック
    依存関係：Thmeleaf チェック追加（他はデフォルトでOK, 以下が参考）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/d41bae3b-a9d1-60e2-2c71-ad922b767032.png)

1. プロジェクト demo1 が作られる（表示されればOK）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/ce13d31b-1190-b1b7-e263-5e807c7b7c25.png)

1. コントローラのパッケージ作成
    `src/main/java/com/example/demo` の `controller` を作成
    [demo1] - [src/main/java] - [com.example.demo] 右クリック - [新規] - [パッケージ]
    ダイアログの [名前] に `com.example.demo.controller` を入力 - [完了] をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/5a8ab23f-7f41-f935-8f51-a97b6ab3d6e5.png)

1. 作ったパッケージに HomeController.java 作成
    [controller] 右クリック - [新規] - [クラス]をクリック
    ダイアログの[名前]に `HomeController` を入力 - [完了]をクリック
    ファイルの内容は入力    
    ```Java:HomeController
    package com.example.demo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class HomeController {
    
        @GetMapping("/home")
        public String method() {
            return "hello";
        }
    }    
    ```

1. hello.html 作成
    [demo1] - [src/main/resources] - [templates] 右クリック - [新規] - [HTMLファイル] クリック
    ダイアログの[ファイル名]に `hello.html` を入力 - [完了]をクリック
    ファイルの内容は以下
    ```HTML:hello.html
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset='utf-8'>
        <meta name='viewport' content='width=device-width, initial-scale=1'>
        <title>Page Title</title>
    </head>
    <body>
        <p>Hello World</p>
    </body>
    </html>
    ```

1. プロジェクト実行
    [demo1] 右クリック - [実行] - [SpringBoot アプリケーション] クリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/a32aabb5-95dd-3e0b-e7c0-37d287790e0f.png)
    ※ 何個かアクセス許可を求めるダイアログあがるので許可する（他のダイアログもある！）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/ad36b3f6-b961-7656-e3c7-0bb91340c4a3.png)
    ※ コンソールにこんな感じのが表示されればOK
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/2cb5e0e9-c59c-6d7a-c49d-eab8d170d1a0.png)

1. http://localhost:8080/home にアクセスして以下が表示さればOK
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/915c16e5-9d3e-4c63-9d73-469c0a4289c0.png)
配列をコレクションに

```vb
Function ExtractRowsStartingWithOne() As Variant
    Dim ws As Worksheet
    Set ws = ActiveSheet ' アクティブシートを使用
    
    Dim rng As Range
    Set rng = ws.Range("A3:T10000") ' 指定範囲
    
    Dim arr As Variant
    arr = rng.Value ' 範囲のデータを配列に読み込む
    
    Dim tempList As New Collection
    Dim i As Long, j As Long
    
    ' 条件に合う行を一時的なコレクションに追加
    For i = LBound(arr, 1) To UBound(arr, 1)
        If Left(arr(i, 1), 1) = "1" Then
            Dim rowArray() As Variant
            ReDim rowArray(1 To UBound(arr, 2))
            For j = LBound(arr, 2) To UBound(arr, 2)
                rowArray(j) = arr(i, j)
            Next j
            tempList.Add rowArray
        End If
    Next i
    
    ' コレクションから2次元配列に変換
    Dim result() As Variant
    If tempList.Count > 0 Then
        ReDim result(1 To tempList.Count, 1 To UBound(arr, 2))
        
        For i = 1 To tempList.Count
            For j = 1 To UBound(arr, 2)
                result(i, j) = tempList(i)(j)
            Next j
        Next i
    Else
        ReDim result(0, 0) ' 条件に合う行がない場合、サイズ0の配列を返す
    End If
    
    ExtractRowsStartingWithOne = result
End Function
```
[MacOS]ssh接続の際、パーミッションエラー

# 経緯
MacOSからwsl(ubuntu)へssh接続を試みた際に遭遇したエラー。
サーバーとクライアント側の公開鍵が一致していない場合に出会う。

# エラー内容

```
Warning: Permanently added '[ip]:port' (ED25519) to the list of known hosts.
user@ip: Permission denied (publickey).
```

# 解決策
公開鍵を手動でペーストしていたので、スペルミスや、一文字削除してしまっているケースがある。

WSLやWindowsで公開鍵のファイルを確認して修正する。
ユーザー管理機能　【devise】について

`gemfile`の中の一番下に
```ruby
gem　'devise'
```
をかく。（私はよく'device'と書いてしまうので注意が必要だ。。）
その後ターミナル上に
```ruby
bundle install
```

と書き`rails s`をするとGemの反映を開始される。サーバーが起動した際にgemが反映されるため必須。

```rails
rails g devise:install
```
をターミナル上でする。これはdevise専用のコマンドで設定ファイルを作成する必要があるため。deviseを追加したら、最初に1度実行しておく！！

その後は
```ruby
rails g devise user
```
でUserモデルを作成。すると
config>routes.rb
```ruby
Rails.application.routes.draw do
  devise_for :users
end
```
と自動的に追記されルーティングする必要がなくなる。
(devise_forは、ユーザー機能に必要な複数のルーティングを一度に生成してくれるdeviseのメソッド)
ｄｂ内のマイグレーションの中にはすでにデフォで
```ruby
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
     t.timestamps null: false
```
が書かれており、email とパスワードは既存で入っているため最低限の入力フォームは整っていることが分かった！！とっても便利！！
その後は忘れずターミナルで`rails db:migrate`と`rails s`をすることも忘れない！！

# deviseにおける新しいファイルを作成する際
```ruby
rails g devise:views
```
を書くとログイン、サインアップ画面が自動で作られる
[MacOS]ssh接続の際、リモートホストの識別エラー

# 経緯
MacOSからwsl(ubuntu)へssh接続しようとした際、なかなかうまくいかずsshの公開鍵を変更してみたり、リモートリポジトリのサーバー証明書を変更したり...そういった試行錯誤の末に出会ったエラーのひとつ。

# エラー内容

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:aoisudhfaeirgjbriubseubhrdjbslid.
Please contact your system administrator.
Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/user/.ssh/known_hosts:7
Host key for [ip]:port has changed and you have requested strict checking.
Host key verification failed.
```

# 解決策
~/.ssh/known_hostsのファイルを削除することでホストの再登録ができる。

`rm ~/.ssh/known_hosts`
新規事業開発記録01

【今日学んだ内容】
N1の大事さ。

山田さんの講義を聞いて感動した言葉がありました。（https://www.foresight.ext.hitachi.co.jp/_ct/17303621）


「一人を幸せにできないのに多くの人を幸せにできるか」
まずは一人を幸せにするサービスを作るこれがN1の真髄に気づきました！

「考えてもわからなくなったら行動」
考えてもわからないものは仮説になる。そこは行動して人に聞きにいく！
それが01の基礎だと理解しました。
BigQueryとCloud SQL連携　Cloud SQLのクエリを改行する方法

シングルクオートやダブルクォートだけだと改行できません。
3回続けたクォート/ダブルクォートなら改行できます。

```sql
SELECT
  *
FROM
  EXTERNAL_QUERY("XXXXXX.XXXXXX.XXXXXXXX",
    '''
    SELECT 
        table_name 
    FROM
        information_schema.tables 
    WHERE
        table_schema = 'public'
    ;
    '''
  );
```

あと、DB側のクエリの返り値は、対応している型が限られています。対応表は以下にありますので必要に応じてキャストして使う必要があります。

https://cloud.google.com/bigquery/docs/reference/standard-sql/federated_query_functions?hl=ja


## 参考

https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#literals
【Windows PowerShell】 ssh接続で権限エラー

# 経緯
windowsのPower ShellからsshでWSL(ubuntu)に接続する際、権限エラーが発生した。
ファイルの権限がオープンすぎると出会う。

# エラー内容
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/user/.ssh/id_rsa.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/user/.ssh/id_rsa.pub": bad permissions
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
user@ip: Permission denied (publickey).
```

# 解決法
下記を参考にファイルの権限を変更する

https://qiita.com/eltociear/items/02e8b1f5590b49eb9d87
filter() map() reduce()の意味と使い方

# filter()の使い方
filterメソッドは配列の要素を指定した条件で絞り込む関数です。
配列を1つ1つ判定して、関数の中でtrueになったものだけをまとめて配列として返します。
trueとなったもののみを配列として返すだけなので、実際に処理を加えるわけではありません。
Arrayオブジェクトが持つ関数なので配列にのみ仕様できます。

```javascript
const array = [1, 2, 3, 4, 5]
const newArray = array.filter(value => {
    return value > 3
})

console.log(newArray)

// 出力結果
> [4, 5] //配列として返す
```

# map()の使い方

mapメソッドはfilterメソッドと違い、配列の各要素に処理を加えるメソッドです。

```javascript
const arr = [10, 20, 30, 40, 50];

// mapの場合
const mapResult = arr.map(value => {
  return value / 2;
});
console.log(mapResult); //[5, 10, 15, 20, 25]実際に処理を加える

// filterの場合
const filterResult = arr.filter(value => {
  return value / 2;
});
console.log(filterResult); //[10, 20, 30, 40, 50]処理可能(true)のものだけ絞り込んで返す
```

# reduce()の使い方
mapとfilterの処理を一つの関数内で同時にできます。

```javascript

//reduceの文法
//配列.reduce(collback, 初期値)
//callbackのprevは初期値で[],currは現在の配列の値即ちnumbersのこと

const numbers = [1,2,3,4,5];

const doubledEvenNumbers = numbers.reduce((prev, curr) => {
  if (curr % 2 === 0) {//ここでfilterがやっていた絞り込み処理を行う
    const doubledEvenNumber = curr * 2;//filterで絞り込んだに処理を加える（mapの処理）
    prev.push(doubledEvenNumber);　//初期値の[]にdoubledEvenNumberをpush
  }
  return prev;
}, []);

console.log(doubledEvenNumbers); // [0, 4, 8]
ECSを自己署名証明書でHTTPS化する

# 目的

動作確認用に自己署名の証明書を ALB に付けて、ECS に HTTPS でアクセスできるようにしたときのメモ。

# 前提

VPC、ターゲットグループ、ALB は作成済みで、Nginx を動作させた ECS を ALB 経由でインターネットに HTTP で公開している状態。

# 証明書作成

`your_site.ap-northeast-1.elb.amazonaws.com` のところは自分の ALB のホスト名を入れる。
有効期間は約 10 年 (3650日) としている。

```sh
openssl genrsa -out private.key 2048 
openssl req -new -x509 -days 3650 -subj "/CN=your_site.ap-northeast-1.elb.amazonaws.com" -key private.key -sha512 -out server.crt
```

# AWS Certificate Manager に証明書を登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/47e1600f-5418-5a95-10da-1a5af1a1f744.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/977ef7d3-557f-9ab0-bda7-9e5cddba720c.png)

あとは好みでタグを追加して作成するだけ。

# ALB の設定

設定を変更したいロードバランサー(ALB)を選択し、リスナーとルールにリスナーを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/29bb0200-8640-92bf-d941-b4a152249f53.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/3018f098-1831-d227-85ac-c597cc707ea9.png)

# ターゲットグループの設定

VPC のページで左ペインの「VPCでフィルタリング」を使い目的の VPC に絞り、左ペインのセキュリティグループをクリックすると目的のセキュリティグループが出てくるのでクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/19f57036-5bfa-b5e1-1988-4a76c340dca5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/a2b3ec16-9af0-c45a-aff9-f63f4001a4aa.png)

HTTPSのルールを追加する。ソースは適切なものを選ぶ。ここでは全世界に公開する Anywhere-IPv4 を選んだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/5509fcb9-afa5-0b5c-49f2-4890de43ae29.png)
Three.jsのインポートで躓いた

# 初めに
最近Three.jsを趣味で触りたいと思い、勉強を始めました。初学者のため、誤りや不適切な部分があれば教えていただけると幸いです。

## 躓いたこと
マウス操作の機能をつけるために`OrbitControls`をインポートしようとしたところ、エラーになりました。

* 問題のコード
```
import * as THREE from "./build/three.module.js";
import { OrbitControls } from "./jsm/controls/OrbitControls.js";
```
* コンソールに表示されたエラー文
```
Uncaught TypeError: Failed to resolve module specifier "three". Relative references must start with either "/", "./", or "../".
```

## 考察
threeというモジュールが見つからないようなので、パスの位置が今参考にしている資料のバージョンと異なるみたい。
→今のバージョンの正しいインポート元はどこだろう？

検索したところ、以下の内容が参考になりそう。

https://stackoverflow.com/questions/65697410/not-using-node-js-uncaught-typeerror-failed-to-resolve-module-specifier-thre

## 原因と修正
r137以降、ブラウザーでGLTFLoaderなどのES6モジュールを使用するにはインポート マップが必要になったようです。
まず初めにHTMLファイルのbodyタグ配下に以下のコードを記載します。

```
    <script type="importmap">
      {
        "imports": {
          "three": "./build/three.module.js"
        }
      }
    </script>
    <!-- インポート マップはjsファイルの呼び出しより前に記載すること -->
    <script src="任意のjsファイル" type="module"></script>
```

次にjsファイルを修正します。
```
import * as THREE from "three"; // 修正
import { OrbitControls } from "./jsm/controls/OrbitControls.js";
```

画面を更新してエラーが消え、レンダリングが正しく表示されていればOKです。

## 最後に
Three.jsは日本語の学習教材が少なく、バージョンによる違いも多い気がします。しかしなかなか楽しいので英語と格闘しつつ、いろいろ作ってみようと思います。
破損したエクセルファイルが送られてきた時の状況

# 概要

次に似たいようなこと起きた時、『アプリケーションの問題ではなく、ファイルが破損している』と早めに判断できるように、状況まとめ。

# 状況

> 『ファイル名』の一部の内容に問題が見つかりました。
可能な限り内容を回復しますか？
ブックの発行元が信頼できる場合は、[はい]をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7ccec1e3-2045-50ef-f53b-e974beed89d1.png)

『はい』を選択すると、別ユーザーが開いてるはずがないのに下記のような読み取り専用を選択させるような表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b2f38bde-f5c1-3262-04cf-5468e4d68a49.png)

> ファイルを読み込めません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/035f1894-25d3-9871-d197-310af314989c.png)

> ブックは破損しているため、Microsoft Excelで開いたり、修復できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/696a3714-2b64-3e97-dd56-b655e876a3ff.png)

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Microsoft Excel for Microsoft 365 MSO (バージョン 2402 ビルド 16.0.17328.20124) 32 ビット
fishをやめてzshを使う

この話題はよくあることなので今更だけど、fishを好んで使っていたが、マイナーなソフトウェアを使うときにfish用の設定がなかったりして、結局デフォルトで用意されているものを使うのが良いことに気付いた。
https://zenn.dev/hiramekun/scraps/1533721f570c98

# ZshをHomebrewでインストールする
なんとなくHomebrewのものを使うことにした。
https://smashawk.com/post-2
ちなみに、現時点では、
```shell-session
> /bin/zsh --version   
zsh 5.9 (x86_64-apple-darwin23.0)
> /opt/homebrew/bin/zsh --version
zsh 5.9 (arm-apple-darwin23.0.0)
```
なので、特にバージョンの違いはなかった。

`/etc/shells`に`/opt/homebrew/bin/zsh`を加えて、
```shell-session
chsh -s /opt/homebrew/bin/zsh
```
で、Homebrewのzshを使えるようになる。

# 設定を書く場所と基本的なこと
基本的な設定は`.zshrc`に書くのが良さそう。
PATHは`.zshenv`に書いておいた方が良いみたい。
https://qiita.com/muran001/items/7b104d33f5ea3f75353f

とりあえずよく見かけるものを適当にコピーする。
```zsh:.zshrc
bindkey -e
autoload -Uz colors
colors
autoload -Uz compinit
compinit
setopt extended_glob

zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
                   /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin

zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}'
```

# zplugを入れる
よくわかってないけど、あちこちでおすすめされていたので入れてみる。
```shell-session
brew install zplug
```
あとは適当にネットで見つけた設定を入れる。
初期設定の`zplug/init.zsh`の場所を探すのにちょっと躓いた。
```zsh:.zshrc
source /opt/homebrew/opt/zplug/init.zsh
zplug 'zplug/zplug', hook-build:'zplug --self-manage'
zplug "mafredri/zsh-async"
zplug "zsh-users/zsh-syntax-highlighting"
zplug "zsh-users/zsh-autosuggestions"
zplug "zsh-users/zsh-completions"
zplug "chrissicool/zsh-256color"
zplug "modules/prompt", from:prezto
# 未インストール項目をインストールする
if ! zplug check; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi
zplug load
```
テーマは`prompt -l`で色々と探すこともできるのだが、もっとシンプルなもので良かったので、結局自分で設定した昔のものをそのまま使うことにした。
```zsh:.zshrc
PROMPT="%{${fg[cyan]}%}%n%{${reset_color}%}@%m %~> "
```
# .zshrcのカスタマイズ
色々とやってみたけど、zplugの挙動がよくわからないことが多すぎたので、結局こちらを参考にしながら必要なものだけ使うことにした。
https://gist.github.com/tsu-nera/5648961
時刻計測

`ftime()`関数を`<sys/time.h>`の`gettimeofday()`関数で代替する場合、次のようなコードを使用できます。

```c
#include <stdio.h>
#include <sys/time.h>

int main() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    printf("Seconds since epoch: %ld\n", tv.tv_sec);
    printf("Microseconds: %ld\n", tv.tv_usec);
    return 0;
}
```

このコードは、現在の時間を秒単位で取得し、エポックからの経過秒数とマイクロ秒単位の時間を表示します。

もし、精度の高い時間情報が必要な場合は、`<time.h>`の`clock_gettime()`関数を使用できます。

```c
#include <stdio.h>
#include <time.h>

int main() {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    printf("Seconds since epoch: %ld\n", ts.tv_sec);
    printf("Nanoseconds: %ld\n", ts.tv_nsec);
    return 0;
}
```

このコードは、`CLOCK_REALTIME`を使用して、実時間の時間情報を取得します。
Mybatis

```
<!-- YourMapper.xml -->

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.YourMapper">
    <select id="selectForUpdateNowait" resultType="YourResultType">
        SELECT * FROM your_table
        WHERE id = #{id}
        FOR UPDATE NOWAIT
    </select>
</mapper>
```

```
<!-- generatorConfig.xml -->

<generatorConfiguration>
    <!-- 既存の設定... -->

    <!-- 生成されるXMLファイルへのパスを指定 -->
    <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
        <!-- カスタムXMLファイルを追加 -->
   
    <sqlFile path="YourMapper.xml" />
    </sqlMapGenerator>
</generatorConfiguration>

```
【セキュリティ入門】DDosとは？基本概念と対策の説明

セキュリティについて新ためて勉強を始めたので、学んだことをアウトプットしたいと思います。

# 想定読者
- これからセキュリティについて学びたいエンジニア
- これからエンジニアになりたい人、IT一年目

# Dosとは？　アクセス集中によるサイト妨害行為
まずはDosについて説明します。

Dosとは、Denial of Service attackの略で
サービス妨害攻撃などと訳されます。

Dosは
**特定のWebサイト対しアクセスしまくることで**、
**Webサイトをダウン**（サイトを停止させ、アクセスできない状態にする）させたり、**遅延状態**（なかなかページが表示されない）に追い込む攻撃です。

# DDosとは？　複数PCを利用したDos
DDosとは、Distributed Dosの略で
日本語だと分散型Dosと訳されます。

**多数のウィルス（マルウェア）に感染されたPCを利用して、
集中アクセス**を行います。

**複数PCを利用したDosの強化版**、という認識でいいと思います。

ちなみに、脆弱性パッチを当てることなく、使わずに放置されているPCを、ゾンビPCなどと呼びます。

知らぬ間に悪意ある攻撃に加担させられるのが、DDosの怖いところですね。

# ボット化とは？ DDosの手順
マルウェア感染させ、自動的に攻撃する端末に仕立て上げることを
**ボット化**と言います。

悪意あるハッカーは、
このボット化されたPCに命令を下すサーバーを用意し、DDos攻撃を実現します。

このボットPCに一斉命令をするサーバーをC&Cサーバー（Command & Control）と呼びます。
命令（Command）して、支配する（Control）サーバーというので覚えやすいですね。

ボット化されたPCは、
C&Cサーバーから「深夜の２時３０分にこのショッピングサイトにアクセスしろ！」のように命令を受け、DDosを開始します。



# DDos対策の難しさ　
Dos/DDosは対策が難しいことでも知られています。

難しい理由の１つとしては、
**「正規のアクセス」と「DDos攻撃」の判別**が難しいことにあります。
例えば、
SNSでインフルエンサーなどにWebサイトを紹介され、突然アクセス数が増えたとします。
正規のアクセスだから防ぐ必要はないですが、集中アクセスという事象としてはDosと同じなため、判別が難しかったりします。

また、DDosの場合は複数PCを利用するので、
**攻撃元を特定する**のが困難です。
「このIPアドレスからのアクセスは禁止する」などと、一つずつ設定することは現実的じゃありません。

# DDos対策：主な３つを紹介
DOs/DDosの対策としては、主に、以下３つが挙げられます。

1. 負荷耐性の向上
1. 負荷分散
1. （個人向け）ボット化への感染防止

１番の負荷耐性の向上としては
AWS WAFなどのクラウドサービスを利用してDDosに備えたり、
Webサイトに使用するサーバーのスペック（処理能力）などを向上させることが挙げられます。

２番の負荷分散は
ロードバランサーなどの仕組みを利用し、
システムへのアクセスを、複数のサーバー（サイト用のPC）に振り分け、１つのサーバーに負荷が集中しないようにすることです。


最後のボット化への感染防止は、個人の対策になります。
WindowsやMac、スマホでもそうですが、
販売元から送られてくる更新プログラムをきちんと行なったり、セキュリティ対策ソフトを導入するなどして、
ゾンビPCとならないようにします。

# まとめ
- Dos/DDosとは、アクセス集中によってWebサイト運営を妨害する攻撃手法
- DDosは複数PCを利用したDosの強化版
- ボット化によってDDosを実現している
- DDos対策はきちんとしよう

ここまで読んでいただきありがとうございます。
今後もセキュリティに関して学び、記事投稿を続けたいと思います。
いいね、ストック等していただけたら励みになるので、よろしくお願い致します。


また、この記事は初心者向けに書いています。

もし、ベテランのセキュリティエンジニアの方が見ていただき、
「この説明は間違っている」
「セキュリティはこういう勉強・本がおすすめだよ」
などがあれば、ご教授いただけますと嬉しいです！


# 参考
- [この一冊で全部わかる　セキュリティの基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%81%BF%E3%82%84%E3%82%82%E3%81%A8-%E3%81%8F%E3%81%AB%E3%81%8A/dp/4797388803)

# 余談
数年前、[ジャンプ+](https://shonenjumpplus.com/)は月曜深夜0時にアクセスすると、
ものすごく反応が遅かった時期がありました。

ほぼ間違いなく、今週発売のジャンプを朝まで待てない、ジャンプファンによる集中アクセスでしょう。
悪意はなく（むしろ熱意しかなく）、個々人の意思によるアクセスなので、これは正規のアクセス集中です。

決して、ジャンプ・ファンが決起して行なった、DDos攻撃ではありません　笑

また、
ここ最近ではそのような遅延もなく、深夜0時でもスムーズに利用できて、非常に快適です。
ジャンプ+の開発に携わったエンジニアさんによる、負荷向上と負荷分散の賜物でしょう。

ジャンプ+の開発者様にこの場でこっそり感謝申し上げます。
（備忘）rememberCoroutineScope,LaunchEffect,launchそれぞれの違いについて

Jetpack Composeでは、非同期処理を行うために主に以下の3つの方法が使われます: `rememberCoroutineScope`、`LaunchedEffect`、そして`CoroutineScope.launch`による通常の`launch`です。

## rememberCoroutineScope

- `rememberCoroutineScope`は、Composable関数内で使用可能な`CoroutineScope`を返します。これを使うと、そのComposable関数と同じライフサイクルを共有するコルーチンを起動できます。

- この方法はよく**イベントハンドラ内で使われ**、例えばユーザーがボタンをクリックした時にバックグラウンド処理を開始したい場合に便利です。

- `rememberCoroutineScope`によって提供される`CoroutineScope`は、Composableが存在する間生存し続け、Composableが再構築されてもキャンセルされません。

```
val scope = rememberCoroutineScope()

Button(onClick = {
    scope.launch {
        // 非同期処理
    }
})
```

## LaunchedEffect

- `LaunchedEffect`は、**特定のキーが変更された時に実行される副作用（サイドエフェクト）を**Composable関数内で起動します。キーが変わらなければ副作用は維持されますが、キーが変わると副作用はキャンセルされて新たに起動されます。

- `LaunchedEffect`はComposable関数のライフサイクルに密接に結びついており、Composableが画面から取り除かれると自動的にキャンセルされます。

- これは**初期化処理やデータの読み込みなど、一度だけ実行したい非同期処理に使用**されます。
```
LaunchedEffect(Unit) {
    // 一度だけ実行する非同期処理
}

例
以下のcounterの値が変わるたびにLandingScreen内のonTimeoutの内容が"Even"や"Odd"に更新され
3秒のDelayが終わったタイミングで最新のonTimeoutが実行される

@Composable
fun ParentScreen() {
    var counter by remember { mutableStateOf(0) }

    Button(onClick = { counter++ }) {
        Text("Increment")
    }

    val onTimeout = {
        if (counter % 2 == 0) {
            println("Even")
        } else {
            println("Odd")
        }
    }

    LandingScreen(onTimeout = onTimeout)
}

@Composable
fun LandingScreen(onTimeout: () -> Unit) {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        // このLaunchedEffectは、onTimeoutの参照が変わるたびに再起動します。
        LaunchedEffect(onTimeout) {
            delay(3000) // 3秒のディレイ
            onTimeout()
        }
    }
}
```

## CoroutineScope.launch

- `launch`は**コルーチンを開始するために**`CoroutineScope`内で直接呼び出されます。これは通常、`ViewModel`や`Activity`、`Fragment`など、**ライフサイクルを持つコンポーネント内で使用**されます。

- コルーチンのライフサイクルは`CoroutineScope`によって管理され、このスコープは通常、`viewModelScope`やライフサイクルスコープ（`lifecycleScope`）などに基づいています。

- これは、`ViewModel`でのデータの読み込みや長期実行タスクなど、**UIのライフサイクルとは独立して非同期処理を行いたい場合に適しています**。

```
viewModelScope.launch {
    // 長期間実行する非同期処理
}
```

まとめ

これら3つの方法は、それぞれ異なるシナリオとライフサイクル管理の要件に基づいて非同期処理を実行するためのものです。

- `rememberCoroutineScope`は**イベントに基づく動的な起動**に使用
- `LaunchedEffect`は**Composableのライフサイクルに密接に結びついた副作用**に使用
- そして`launch`は**ViewModelやActivityといったコンポーネントのライフサイクルが管理する長期間実行する非同期処理**に使用されます。
flatpickrを使う時に見るといいもの

## flatpickrとは
JavaScriptで作られた軽量な日付ピッカーライブラリで、日付を選択するためのカレンダーを簡単に作成できる。jQueryなどの他のライブラリに依存せずに動作する。

## 資料
- ドキュメント
https://flatpickr.js.org/


- 日本語訳のドキュメント（公式ではない？）
https://tr.you84815.space/flatpickr/examples.html

## 使い方

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
  <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
  <script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.js"></script>
</head>
<body>
  <input class="flatpickr">
  
  <script>
    flatpickr('.flatpickr');
  </script>
</body>
</html>
```
![スクリーンショット 2024-03-19 11.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2560732/6afc9454-70f2-dc7f-1483-7f5e026e25ba.png)

### 日本語化
```diff_html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
  <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
  <script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.js"></script>
+  <script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/ja.js"></script>
</head>
<body>
  <input class="flatpickr">
  
  <script>
-    flatpickr('.flatpickr');
+    flatpickr('.flatpickr', {
+      locale: "ja"
+    });
  </script>
</body>
</html>
```

![スクリーンショット 2024-03-19 11.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2560732/045385bc-8626-a61a-1b71-5af8c891efea.png)

Coming Soon...
【ChatGPT有＋DALL-E3】でできた画像を活用する。


　どうも、カーブミラーです。

　今回は、できた画像を活用する方法の紹介です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　訃報が届きました。
　　2024/2024/03/10とのこと
　　　だそうです。

　イラストレーターであり
　　アニメーターであり
　　　漫画家であった
　　　　いのまたむつみ先生が
　　　　　天国に召されました。
[X-Twitter いのまたむつみ先生の妹様より ](https://twitter.com/inomatanekomata/status/1769574473504883081?t=BMFsWLvd7x54v2IXZoWSIQ&s=19)

　アニメの原画のキャラデザインも担当
　　『宇宙戦士バルディオス』
　　『戦国魔神ゴーショーグン』
　　『魔境伝説アクロバンチ』
　　『プラレス3四郎』
　　『幻夢戦記レダ』
　　『ウインダリア』

　テレビゲームのキャラデザインも担当
　　『テイルズ オブ』シリーズ
　　『ブレンパワード』

　このあたりのタイトルを
　　見るだけでも
　　　どういう方か
　　　　わかりますね。

　詳しくは
　　ウィキペディアで
　　　どうぞ。

　御冥福をお祈り申し上げます。
***
　昨日（2024/03/18）の
　　[【ChatGPT有＋DALL-E3】に関してですが、ポリシーが変更されたようです。](https://qiita.com/kabumira/items/13ff81ffd2e65f54de79)
　　　についてですが、
　　　　早合点だったようです。

　制限になったら、ふつうに
　　赤枠のメッセージが
　　　出てきました。

　失礼いたしました🙇

　いい機能だと
　　思ったのですがねぇ😣
***
　さて、
　　本題です。

　“できた画像を活用する”と
　　題しましたけれど、
　　　ふつうに考えると、
　　　　プリントして
　　　　　アルバムに貼る
　　　　　　程度かと思います。

　それでも
　　いいのですが、
　　　形あるものに
　　　　したくはありませんか？

　例えば、
　　Ｔシャツなんかは
　　　手軽な感じですよね。

　それから
　　カレンダーとか、マグとか。
　　　スマホケースや
　　　　キーホルダーなんかも
　　　　　いいですね。

　クッションも（AI画像）
![1710816148590.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/6b55fc01-b9f7-3407-5ae0-f96dfbc53879.jpeg)

　マグカップも（AI画像）
![1710816167805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/d8e3c0de-904e-8182-8d93-72b50f69261c.jpeg)
***
　こうしたものは
　　実は、注文可能です。

　お近くの
　　スマホやメモリの画像を
　　　店舗のパソコン画面で
　　　　選んで、発注すれば
　　　　　プリントしてくれる
　　　　　　お店に行けば
　　　　　　　対応してくれる
　　　　　　　　はずです。

　そんなところなので
　　金額もさほど高くはありません。
　　　いや、ピンキリかな？w

　私が知っているお店では、
　　マグカップだと、1290円税込〜
　　クッションだと、3300円税込〜

　どちらも
　　二週間ほどの
　　　期間を必要とします。

　ほかにも
　　ブランケット
　　ジップポーチ
　　ハンカチ
　　ミニタオル

　それから
　　うちの子クッション
　　うちの子ストラップ
　　　なんてのもあります。
　　　　こちらは、画像の形状に
　　　　　できますので、
　　　　　　ペツトの写真で
　　　　　　　作る方がいるようです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
単体テストで、日付を扱う

日付を扱った単体テストを実施することがあったので、その際にモック化したり色々問題があったので、まとめてみました。
Hiltでの単体テストに関しては、こちらの記事を[参考](https://qiita.com/shimizu-you/items/ad8ad91b9b27c227d2a5)してください。


### Mockkを導入

```kotlin
testImplementation("io.mockk:mockk:1.13.9")
```

### 日付ライブラリーの導入

日付関連のライブラリーとして、Androidに最適化された[threetenbp](https://github.com/ThreeTen/threetenbp)を使用します。
ただし、単体テストをする際に注意点があります。
単体テストでは、threetenabpが使えないため、除外してthreetenbpを使用する必要があります。

```kotlin
implementation("com.jakewharton.threetenabp:threetenabp:1.4.6")
testImplementation("org.threeten:threetenbp:1.6.8") {
    exclude("com.jakewharton.threetenabp:threetenabp:1.4.6")
}
```


### 日付の単体テスト

setUp()内で実施しているmockkStaticで、LocalDateTimeをモック化して、テスト対象のメソッド内で実装されているLocalDateTime.now()をlocalDateTimeの固定値を返すようにします。

```kotlin
@HiltAndroidTest
@Config(application = HiltTestApplication::class)
@RunWith(AndroidJUnit4::class)
class DateTimeTest {
    @get:Rule
    var hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var dateTimeRepository: DateTimeRepository

    private val localDateTime = LocalDateTime.of(2023, 1, 1, 0, 0, 0)

    @Before
    fun setUp() {
        hiltRule.inject()

        mockkStatic(LocalDateTime::class)
        every { LocalDateTime.now() } returns localDateTime
    }

    @After
    fun close() {
        clearAllMocks()
    }

    @Test
    fun `日付テスト`() {
        val dateTime = LocalDateTime.of(2023, 1, 1, 0, 0, 0)
        val result = dateTimeRepository.getNow()
        assertEquals(dateTime, result)
    }
}

```

```kotlin
class DateTimeRepository @Inject constructor() {

    fun getNow(): LocalDateTime {
        return LocalDateTime.now()
    }
}
```

### まとめ

日付関連のメソッドで、now()を使用する場合に固定された値ではないと単体テスト出来ないと思いますのでモック化して単体テストを実施してください。
また、日付に関しては必要とした日付を理解出来ているのが、実装者だけだったりすることが多いので、是非単体テストを導入してください。
[Ruby] enumを使いたい!!

Rubyでenum (列挙型)を使いたいときには、クラスでそれらしいものを作ることができます。

- 実装

```ruby
class Weather
  RAINY = "RAINY"
  CLOUDY = "CLOUDY"
  SUNNY = "SUNNY"

  class << self
    def rainy
      @rainy ||= Weather.new(RAINY)
    end

    def cloudy
      @cloudy ||= Weather.new(CLOUDY)
    end

    def sunny
      @sunny ||= Weather.new(SUNNY)
    end
  end

  def initialize(weather_str)
    @weather_str = weather_str
  end

  # 等価演算子==をオーバーライドするためにto_sを定義しています
  def to_s
    @weather_str
  end

  # ifやcaseで条件分岐できるようにオーバーライドしています
  def ==(weather)
    to_s == weather.to_s
  end
end
```

- 利用

```ruby
weather = Weather.sunny
```

```ruby
pp "Today is sunny!!" if weather == Weather.sunny
```
wslで、最小のカーネルをコンパイル その16

# 概要
wslで、kernel.elfのコンパイル、やってみた。
cで、書いたカーネルで、俺言語を組み込んだ。
配列を16進ダンプしてみた。

# 写真

![スクリーンショット 2024-03-19 112755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/14e1a596-9b91-a0bf-18ff-e919e6c24d59.png)

# サンプルコード

```

const uint8 hex_codes[16] = {
	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};

void ordr() {
	int i;
	int j;
	int k;
	unsigned char m;
	unsigned char n;
	getvr();//Vc Adr
	Ptr++;
	Ptr++;
	if (RD(Ptr) == '"')
	{
		Ptr++;
		putlp('"');
	}
	else
	{
		expr();//Val
		if (Vc == 's')
		{
			init_vga(WHITE, BLUE);
		}
		else if (Vc == 'o')
		{
			init_vga(WHITE, BLUE);
			for (i = 0; i < 16; i++)
			{
				for (j = 0; j < 16; j++)
				{
					k = i * 16 + j;
					m = ram[k];
					n = m >> 4;
					n = n & 0x0f;
					print_char(hex_codes[n]);
					n = m & 0x0f;
					print_char(hex_codes[n]);
					print_char(' ');
				}
				print_new_line();
			}
		}
  		else if (Vc == 'r')
		{
			print_new_line();
		}
		else if (Vc == '?')
		{
			putint(Val);
			putchr(' ');
		}
		else
		{
			WR(Adr, Val);
		}
	}
}

```

以上。
AWS Certified DevOps Engineer - Professional（DOP-C02）合格体験記（2024/03）

## はじめに
2023年にアソシエイト資格を取得できたので、2024年はプロフェッショナル資格にチャレンジしています。
今回はDOPを受験してきました。

## まずは結果から
920点で合格しました！
WEB問題集で解いた問題が多く出題されていたため、かなり高い点数を取れました。

## DOP試験の傾向
DVA/SOAの上位資格ということで、これまで学習したことがベースになります。
新しく覚えたというのは、CodeシリーズとControlTowerくらいかなと思います。
内容的には以下のようなものがポイントになっていたかと思います。

- Codeシリーズの組み方、デプロイ手段の選択​
- AWS ConfigとTrustedAdvisorやGuardDutyとの使い分け
- ControlTower・Organization（SCP）を使った規制や管理の仕方​
- RTO/RPOを意識したDR構成の組み方
- クロスアカウントの利用方法

＃AWS Configと他サービスの使い分けとControlTowerは、実はまだしっくり来ていないところがあるので、今後の業務で覚えていきたいと思います。。

## アソシエイト資格との違い
DOPからプロフェッショナル資格となりますので、アソシエイト資格との違いを簡単に触れたいと思います。
- 問題文も回答文も文字数が多くなる。
途中で読むのが嫌になって気絶すると、何を問われているのかが分からなくなります。。読んでる途中で投げ出さない強い気持ちが大事です。
また、スマホでは学習し辛くなります。選択肢の比較ができませんし、回答文読んでるうちに問題文が分からなくなります。スキマ時間での勉強がし辛くなるので、学習方法も考える必要があります。
- 問題数が65問→75問、試験時間が130分→180分になる。
事前にトイレ済ましておくとか、試験会場の暑さ・寒さ対策とか準備が大切になってきます。
受験前に本番を想定した問題数と制限時間で模擬試験など行うのがいいかと思います。

## 学習方法
### WEB問題集
-  CloudLicense

https://cloud-license.com/

今回もお世話になりました。
新問題の#38以降のセクションのみ行いました。
これまで旧問題も行っていたのですが、古い問題を混ぜると知識が混乱しそうなので止めました。

学習方法としては、こんな感じで進めました。
1. とりあえず1周。知らない・分からない問題にはとりあえずマーク。
1. 間違った問題に対して再挑戦して復習
1. 1と2をもう1回最初から。
1. 本試験モードを3回くらい（9割は取れるレベルまで）
<br>

- Udemy

https://www.udemy.com/course/dop-c02aws-devops-2024/

これまで同様にCloudLisenceと併用しました。
ただ、DOPではほとんど同じ問題だったので、CloudLisenceかどちらか片方でよさそうに思えました。
<br>

- 公式問題集

https://explore.skillbuilder.aws/learn/course/external/view/elearning/14541/aws-certified-devops-engineer-professional-official-practice-question-set-dop-c02-japanese

公式問題集です。こちらは毎回実施しておくといいと思います。

### 書籍
DOP向けの書籍はありませんでした。

### ハンズオン
- AWS 初心者向けハンズオン
[AWS Code サービス群を活用して、CI/CD のための構成を構築しよう！ ​](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cicd-2022-reg-event.html?trk=aws_introduction_page)
 Codeシリーズを使ってみるために利用しました。実際のパイプラインの組み方などイメージをつけるのに役立ちました。
 
https://aws.amazon.com/jp/events/aws-event-resource/hands-on/

### その他・参考にしたサイト
- クロスアカウントの利用方法
これまでの資格でも毎回出題されているイメージなのですが、また「引き受ける」かよ…「引き受ける」の意味がわかんないんだよ…どっちのアカウントに何したらいいんだよ…みたいな、とても苦手な問題で色んなサイト見てもピンと来ず、ずっと曖昧に過ごしてきたのですが、以下のブログでやっと理解ができました。ありがとうございました。
https://blog.serverworks.co.jp/assume-role-divedeep

## 試験当日
いつもの郊外のテストセンターで予約しようと思ったのですが、テスト時間が長くなるためか申し込みできず、近くの別のテストセンターで受験しました。
いつものテストセンターは古い感じのビルの狭い部屋でちょっと寒い感じだったので、念のため厚着していったのと、季節柄、花粉症真っ只中ということでマスクもしていったのですが、今回のテストセンターはしっかりしたところ？で、暖房が効いてて逆に薄着のほうが良いくらいでした。

そのため、試験自体はほとんど回答に悩むことはなかったのですが、
ちょっと暑いからセーター脱ぎたいな・・・、でも脱いだら怪しまれるかな・・・
マスクも取りたいな・・・、これもダメなのかな・・・（結局取った）
みたいな、問題とは関係ないところで集中力が削がれてしまって変なところで大変でした。
（集中するために行った準備が、逆に集中力を削いでしまうという残念な感じ。。）



結果は20時過ぎにでました。
今回はかなり手応えあったので、いつもより早めに祝杯あげました。合格しててよかったです。

## 感想
プロフェッショナル帯へのチャレンジ１つ目でしたが、DOPは思ったより難しいとは感じませんでした。
Web問題集をしっかり行えていれば割と取得しやすいのではないかと思います。
ただ、文字数の多いことが本当に厄介で、学習中の集中力やモチベーションを保つのが大変でした。（というか保ててないので、散歩とかおやつタイムとか気分転換をかなり多く入れました）

## 次は
3年後の更新が重なると辛そうなので、少し期間を置いてSAPの取得に挑みたいと思います。
ラスボスということなので、時間をかけてじっくり学習していきたいと思います。

最後まで読んでいただき、ありがとうございました！

## AWSの相談・お困りごとありましたら、、、
AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
AWS Security Hubの新機能 ～Findingにメタデータを追加～

ちょっと前の話になりますが、[AWS re:Invent 2023](https://aws.amazon.com/jp/events/reinvent-2023/)で発表されたAWS Security Hubの新機能の中から、個人的に気になった「**Findingに新たなメタデータを追加**」というアップデートを確認してみたので、まとめてみます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/new-finding-enrichment-aws-security-hub/

# Findingsとは
AWS Security Hubは、HealthやInspectorなどの様々な統合サービスから検知情報が連携されてきますが、それらの情報をまとめるのが**Finding**です。
セキュリティサービス統合からの集約・整理・優先順位付けをした結果となっており、**AWS Security Finding** (以下、ASFF）と呼ばれるJSONの結果形式で表現されます。

以下のように、Security Hubの検出結果の画面から確認することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/1db9ce76-f08f-dd54-5d57-44c58a128d0f.png)

# アップデート内容
アップデートにより、AWSアカウント名・リソースタグ・アプリケーションタグの情報が追加で表示されるようになりました。以下のようなメタデータが新規で追加されています。

- AwsAccountName	：　アカウント名
- ApplicationArn		：　アプリケーション情報
- ApplicationName		：　アプリケーション情報

S3のコンプライアンス非準拠となっている検出結果を確認してみたところ、アカウント名が確かに表示されていることが分かりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/124bafba-cb29-477b-9778-54670071be3c.png)

ASFFでも、**AWS AccountName**として表示されていることが確認できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/2c8ca9e7-51b1-77d6-37fe-42ba21cb8f66.png)

## アプリケーション名をたしかめる
新たに表示されるようになったメタデータの1つに、**アプリケーション名**があります。
アプリケーション自体は、CodeDeploy等を用いて構成することができますが、昨年末に新たなサービスがGAしました。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/applications.html

それが、**myApplications**というものです。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/myapplications-view-manage-applications-aws/

アプリケーション単位でコストや健全性、セキュリティ体制、パフォーマンスを簡単に管理およびモニタリングできる機能となっています。
以下のように、指定したリソースをアプリとして管理することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/bf2bae54-a853-98f6-993e-df6ce17da28e.png)

myApplicationsに登録したものが、SecHubで確認できるか、Findingを確認すると、たしかにアプリケーション名の情報も記載されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/e65040ab-81e1-70a8-1fa1-02f1d4845ada.png)

# まとめ
アカウントIDなどは元々Findingに表示されていましたが、アカウント名も表示されるようになったので、いちいちどのアカウントか確認する必要がなくなりました。
今回のre:Inventで、AWS Security Hubについては、派手なアップデートはないものの、他にも地味に使えそうな新機能がいくつかあります！気になる方はぜひ！

↓ reCapの資料です

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_reInvent2023digest_1201_v1.pdf
Reactでオシャレなアラートを出す方法

`React`で`sweetalert2`という`npm`を使用して下記の画像のようなオシャレなアラートを出す方法を記載します。
![modalsweet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627510/b17ee74c-ae5b-9393-d888-7ea0acead298.png)

# sweetalert2の使用方法
## 導入方法

プロジェクトフォルダで以下のコマンドを実行して、`sweetalert2`をインストールします。
```
npm install sweetalert2
```
使用するファイルで、`sweetalert2`をインポートします。
```JavaScript
import swal from 'sweetalert2';
```
コードは注意してご使用ください。
## 基本的な使い方
```JavaScript
swal.fire({
  title: 'タイトル',
  text: 'メッセージ',
  icon: 'success',
  confirmButtonText: 'OK'
});
```
コードは注意してご使用ください。

## オプション

`swal.fire()`には、さまざまなオプションを設定できます。
- `title`：アラートのタイトル
- `text`：アラートのメッセージ
- `icon`：アラートのアイコン
- `confirmButtonText`：確認ボタンのテキスト
- `cancelButtonText`：キャンセルボタンのテキスト
- `showCancelButton`：キャンセルボタンを表示するかどうか
- `showConfirmButton`：確認ボタンを表示するかどうか

## その他の使用例
- 例1(confirm)
```javascript
swal.fire({
  title: 'タイトル',
  text: 'メッセージ',
  icon: 'warning',
  confirmButtonText: 'はい',
  cancelButtonText: 'いいえ',
  showCancelButton:true,
}).then((result) => {
  if (result.isConfirmed) {
    // ユーザーが「はい」をクリックした場合の処理
  } else {
    // ユーザーが「いいえ」をクリックした場合の処理
  }
});
```
- 例2（prompt）
```javascript
swal.fire({
  title: 'タイトル',
  text: 'メッセージ',
  input: 'text',
  inputPlaceholder: '入力してください',
  confirmButtonText: 'OK'
}).then((result) => {
  if (result.value) {
    // ユーザーが入力した値
  }
});
```

## 注意
SweetAlert2は、JavaScriptのライブラリです。使用するには、JavaScriptの知識が必要です。
SweetAlert2は、ブラウザの標準機能ではありません。使用するには、事前にライブラリを導入する必要があります。
## その他

SweetAlert2は、さまざまなカスタマイズが可能です。
SweetAlert2の詳細は、公式ドキュメントをご覧ください。
公式ドキュメント：https://sweetalert2.github.io/
SweetAlert2は、オープンソースのライブラリです。
Xpathが正しいかをチェックする方法：画像付で優しい説明（windows/chrome）

自動テストでXpathを自動取得しても要素が探せない、手動で直してもうまくいかない、そもそもこのXpathってあってる？がわからないときはChromeで純粋にXpath要素取得だけをチェックすることが手っ取り早いです。
（Chromeの拡張機能でもそういう機能があるはずなので、デベロッパーツールが難しいと感じてしまう人は拡張機能を探してみるのもアリですが筆者はデベロッパーツールが一番使いやすいと感じています）
## Xpathを検証する方法
### 対象ページをChromeで開く
ここでは例として自動テスト用に用意されているダミーサイトを開きます
https://hotel.testplanisphere.dev/ja/index.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/7087ec74-e59e-9a1c-2e00-992fc071f97e.png)

### デベロッパーツールを開く
Windowsは``F12``キー
Macは``Command`` + ``alt`` + ``i``らしいです
※どっちにしろ画面の右クリックから「検証」を選べばでるはず

開いたとき画像下部の「Console」がなかったら``Esc``キーを押下で表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/be6923af-c9be-f2a4-7084-7734a4018624.png)

### Xpathを用意
今回は試しにこちらのh3要素を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/0fc428da-aadf-f726-c70a-478e58df7aac.png)
↓用意したXpath
```
//h3[text()="サイトの構成"]
```

### コンソールに$x('ここにXpath')を入力してEnter
以下のように入力することで、検証できます。
```
$x('ここにXpath')
```
↓今回用意したXpathでの例
```
$x('//h3[text()="サイトの構成"]')
```
↓入力すると以下のような表示が返ってきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/b5c8315d-c519-463b-8382-338106ceacd1.png)
右向きの▲アイコンを押して中身を開いて確認しましょう

↓中身を開いて確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/d5fcba0a-8fcf-e0e9-f1b4-4188a90d33d2.png)

``0:h3.my-4``は0番目にヒットした要素がh3タグでクラスがmy-4ということです
これが複数あると0のところが1...2..と続いて表示されます。
カーソルを当てると画面上で要素がハイライトされ、正しく取得されていることがわかります。
``length:1``は記載したXpathに当てはまる要素が1件あるということです。ここが0だと、Xpathでのヒットする要素がないということになります。
↓Xpathを間違えて要素がヒットしない状態の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/2925b5aa-252a-7e7e-b374-0c067da65dfb.png)


以上です
GitHub Pagesでサイトを公開してみた

# GitHub Pagesとは
[GitHub Pages](https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages)とは、GitHub上のリモートリポジトリにあるリソースをwebサイトとして公開できるサービスです。
ドメイン取得などの面倒な手続きなく簡単な操作でwebサイトを公開できる便利なサービスです。

# 手順について
**リソースについてはGitHub上に上がっているものとする**
1. まず公開したいリポジトリを開く
![スクリーンショット 2024-03-18 15.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/c8f879ba-8fce-7b45-9ab1-0404ed51f6ef.png)
1. Settingタブへ移動
![スクリーンショット 2024-03-18 15.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/193f6453-4d9f-2cc3-02f9-617ad9f71cbd.png)
1. 垂直タブより`Code and automation`の中の`Pages`を開く
![スクリーンショット 2024-03-18 15.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/a469a570-957d-a6d7-9ea7-54f494e43a01.png)
1. `Branch`の`None`のプルダウンより任意のブランチを選択し`Save`
![スクリーンショット 2024-03-19 9.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/58c4abe4-d059-a7ef-8bdd-210d4bbc3324.png)
![スクリーンショット 2024-03-19 10.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/7d0072ae-7c3b-906f-e9f2-b89f24663f25.png)
1. 数分待つことでサイトが公開される
![スクリーンショット 2024-03-19 10.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/bf74a871-b050-b0f6-a821-e188f1c93046.png)
![スクリーンショット 2024-03-19 10.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/5396cc70-ee3d-75be-4f99-607a341f647f.png)

# 補足
**エンドポイントはリポジトリをルートにし、指定可能**
![スクリーンショット 2024-03-19 10.48.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671028/b93dcb78-85ae-345f-f238-a2d2300b4663.png)

**相対パスにてリソースを取り込んでいた場合は、絶対パスに変更する必要がある**
例：
`css/styles.css`
↓
`https://yuuya-apple.github.io/resume/css/styles.css`
クエリシリーズ

https://paiza.jp/works/mondai/query_primer/query_primer__single_insertion

```py

N,K,Q = map(int,input().split())
A = [int(input()) for _ in range(N)]
A.insert(K,Q)

for a in A:
    print(a)

```

https://paiza.jp/works/mondai/query_primer/query_primer__single_search

```py
N,K = map(int, input().split())
A = [int(input()) for _ in range(N)]
flag = 'NO'
for a in A:
    if a == K:
        flag = 'YES'
        break

print(flag)

```
よく考えたら、前にもリストの中にKがなかったらというのがありましたね。。。
忘れてました。それさえあれば下記の様に短くできますね

```py
N,K = map(int, input().split())
A = [int(input()) for _ in range(N)]
print("YES" if K in A else "NO")
```

https://paiza.jp/works/mondai/query_primer/query_primer__multi_search

```py
N,Q = map(int,input().split())
A = [int(input()) for _ in range(N)]
B = [int(input()) for _ in range(Q)]
for b in B:
   print('YES' if b in A else 'NO')
```
これもこれでOK!と思ったら、、、
最後のケースが膨大なとき、タイムオーバーでだめでした。
回答を見ると、これが計算量と言われるジャンルらしく
（クエリの次が計算量という分野でした）
というわけで別の方法を探さないといけないと。
で、どうするかというと、Aは順番はなくてもよいので集合にして、
あとはそのまま計算。という。

```py
N,Q = map(int,input().split())
A = {int(input()) for _ in range(N)}
for _ in range(Q):
   print('YES' if int(input()) in A else 'NO')
```

https://paiza.jp/works/mondai/query_primer/query_primer__single_pop

```py
N = int(input())
A = [int(input()) for _ in range(N)]

A.pop(0)
#上の行は下のように書いても良い
del A[0]

for a in A:
    print(a)
```

https://paiza.jp/works/mondai/query_primer/query_primer__multi_pop

```py
N,K = map(int, input().split())
A = [int(input()) for _ in range(N)]
for _ in range(K):
    if input() == 'pop' and len(A) > 0:
        del A[0]
    else:
        for a in A:
            print(a)
```
これでもいいんですが、計算量を意識しないと量が大きくなったときに駄目になると。
テスト４が0.64秒と他のケースより時間がかかるので、これを短くすると考える。

配列は１個消すたびに、配列を移動させないといけないので時間がかかる。
と解答の説明には書いてあるのだけど、
配列というのは箱のようなものでその一つ一つに要素をいれているようなもの。
で、最初の要素を消すたびに２番目の要素を１番目の箱に、３番目の要素を２番目の箱に、、、と全部移動させないといけない、、、とイメージすれば良い。

でそれを解決するために両端キューというのがあるらしい。
これは末尾への要素の追加と先頭要素の削除を高速(O(1))に行うことができる、と説明されているのだが、
前にもキューというのを習ったんだけど、
キューというのは両端が開いているイメージのデータ構造になっていて
enqueはおしりに数値を入れ、
dequeは頭から数値を取り出していくという感じ
...という風に習った。
dequeだけあればよいので

```py
from collections import deque
N,K = map(int, input().split())
#これをdequeにする
A = deque([int(input()) for _ in range(N)])
for _ in range(K):
    if input() == 'pop' and len(A) > 0:
        #頭から削除
        A.popleft()
        continue
    #ちなみにelseする必要はなく、popでなかったらもうskipしてしまえばよい
    for a in A:
            print(a)
```
ケース４は0.64秒⇒0.24秒になりました。短いな。

ちなみに他にも解法があって、削除したことにして＋１要素を進めるという方法もある
なるほど！

```py
N,K = map(int, input().split())
A = [int(input()) for _ in range(N)]
f = 0
for _ in range(K):
    if input() == 'pop':
        f += 1
        continue
    for i in range(f,N):
            print(A[i])
```
ケース４は0.64秒⇒0.27秒になりました。ちょっと解法１には負けるけどそれでも
短くなってますね。
たしかに箱を移動しなくても良いしね。
これが計算量というやつですね。。。勉強になりました。

今日はこのへんで。
AWS Security Hubのステータスについてまとめてみた

AWS Security Hubを使用したセキュリティサービスを提供しているチームに所属しており、Security Hubの**ステータス**について調べる機会があったので、本記事でまとめます。

[JAWS-UG横浜 #70 AWS re:Invent 2023 Recap Security](https://jawsug-yokohama.connpass.com/event/299305/)で登壇した際の内容になります。

# AWS Security Hubとは
そもそも、AWS Security Hubとは？という人向けに簡単に説明します。

AWS Security Hubは、AWS環境全体のリソースに対してセキュリティのベストプラクティスをチェックしてくれるクラウドセキュリティ体制管理サービスです。
AWS ConfigやAmazon GuardDuty、Amazon Inspectorなど、様々なセキュリティサービスと連携しており、セキュリティアラートを集約して簡単に修復を加えることも可能となります。

https://aws.amazon.com/jp/security-hub/

このサービスを利用して、AWSを安心安全に使用するためにセキュリティ対策済みのアカウントを社内外に提供するサービスを展開しています。
- 社内セキュリティガイドラインに準拠した環境を提供
- 上記に違反した設定項目や変更があった場合に通知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/69e878d3-c3ec-20dd-ead6-00e6769abb58.png)

などなどの機能を提供しています。
# AWS Security Hubのステータス
他AWSのサービスなどの状態をチェックして管理するサービスであるAWS Security Hubには、複数のステータスが存在します。それぞれの概要をまとめてみます。
#### コンプライアンス
AWS Configの属性（AWS Config ルールが準拠しているかどうか）を管理します。
4つのステータス（**Compliant・Non Compliant・Not Applicable・Insufficient**）が存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/08acd9ce-7e44-01fa-cfa7-57838662065f.png)

#### ワークフロー
検出結果に対する調査の進行状況を表します。
4つのステータス（**New・Notified・Suppressed・Resolved**）が存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/ffaf619d-2335-4be0-2b69-80a9592329fb.png)

#### レコード
結果を送信するサービスから入ってきた段階での状況を表します。
2つのステータス（**Active・Archived**）が存在します。

## チェックすべきステータスは？
では、この中から利用者がチェックすべきステータスは何でしょうか。
もちろん、状況に応じて変わってきますし、一つだけチェックすればいいケースもたくさんあると思います。ただ、通知が多すぎると、検知内容を見なくなってしまうものです。

幣チームのサービス自体も、元々はワークフローステータスが「New」となっているもののみ、通知対象としていました。
しかし、「**通知するべきか**」「**診断結果を保存すべきか**」といった個々の観点で考慮すると、ニーズや目的が異なるため、それぞれ別々のステータスでイベントを仕分けするべきという結論になりました。

そこで、各ステータスの状態遷移図を以下にまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/975c3224-5b13-011f-e8a3-d05e2ad094ee.png)

ざっと、**レコードステータス**→**コンプライアンスステータス**→**ワークフローステータス**の流れになっています。

レコードステータスが「**Active**」の場合、コンプライアンスステータスに遷移し、コンプライアンスステータスが「**Warning**」「**Failed**」「**Not Available**」の場合、ワークフローステータスが「**New**」となります。

また、意図的に通知を抑止したい場合は、ワークフローステータスを「**Suppressed**」とします。

これらを考慮し、本サービスを利用して、セキュリティのガイドラインに準拠しているか利用者に通知したい（要対応かつ利用者側で意図していない）場合は、「コンプライアンスステータスが**Failedである**」で「ワークフローステータスが**Suppressed以外である**」という条件にしています。

一方で、診断結果を保存したい場合は、ワークフローステータスのみで判断しています。ログ保管についてはニーズに合わせて変更することが推奨かと思うので、ログ量が膨大になってきたら、チェックするステータスを変更することで、効率的な運用に繋がります。

# まとめ
いかがでしたでしょうか。AWS Security Hubはステータスが複数あるほかに、色々な機能が含まれているので、いきなり使いこなすのは少し難しいかもしれません。
スモールスタートで、用途に合わせて取り込む機能を拡充していく方針をおすすめします。
作業途中だけどgitからpullしたい

最近、暖かくなったり寒くなったりコロコロ変化する気温に翻弄されております。

この間初めて作業途中にgitの最新ブランチからpullしてくる必要がありました。
やり方を調べて実際にやってみたので知識の整理も兼ねて先ほどのトピックスについて説明していきたいと思います。

# 今回使った方法
今回使った方法としては`git stash`で作業中のファイルを退避させる方法です。
作業を一旦commitし、後にこのcommitを上書きする形で最新のブランチをpullする方法もあるようなのですが、今回は次のcommitができるまでに時間がかかりそうだったのでファイルを退避させる方法を採用しました。

# やり方
```terminal
# git管理下にある編集中ファイルの退避
$ git stash

# masterのコミット履歴をリモートリポジトリまで進める
$ git checkout master
$ git pull origin master

# 作業中のブランチに戻ってくる
$ git checkout feature-branch

# masterブランチの修正内容を取り込む
# margeを使うと修正内容を混ぜるのでコミット履歴既にあると混ざって微妙な感じになる為
$ git rebase master

# 退避した修正内容を取り出して再適用
$ git stash pop
```
![退避用 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/6433aeb0-7b65-cdf4-3b7c-53235713d06d.jpeg)

`git stash`によって退避されるのはgitで追跡中かつ編集中のファイルです。
未追跡のファイルについては退避されませんでしたが気にせずpullしても何の問題もありませんでした。

また、注意点としては`rebase`後に
`git stash pop`で取り出す時にコンフリクトしていたケースで
失敗すると修正内容が消し飛ぶ可能性があります。

## 参考・引用
https://teratail.com/questions/352795