OmniAICreator/Qiita-1.07M huggingface dataset:
picoCTF #Forensics - CanYouSee

■問題
How about some hide and seek?

かくれんぼしない？

■解き方
①ファイルをダウンロードする

②解凍する

③exiftoolを使用し、解凍したファイルのメタデータを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/6826ba1b-4d1d-9645-c0b4-f44e1aac5b17.png)
※参考
exiftoolは、画像やドキュメント、音楽ファイルなどのメタデータを表示・編集するためのコマンドラインツール

メタデータとは、ファイル自体の内容ではなく、ファイルに関する追加情報（例えば、撮影日時、カメラの種類、地理位置情報など）を指す。
このメタデータに隠し情報やフラグが埋め込まれていることがあるため、フォレンジックやCTF（Capture The Flag）などの分野でよく使用される。

④attribution URLに記載されている内容をbase64でデコードしフラグを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/af630c4c-4d7f-cabf-a2e3-7ae87a044b5d.png)
※参考
Linuxでは、base64コマンドを使ってBase64エンコードされたデータを簡単にデコードすることができる。
~基本的な使い方~
Base64エンコードされたデータをデコードする方法(例)
echo "<base64文字列>" | base64 --decode
YOLOv8で物体追跡（MOT）する

### クラスIDとバウンディングボックスから、接近検知を行いたい…

* Jetson Orin, Jetson Nano
* YOLOv8.3.11

### 物体追跡（MOT）
参考にさせていただきました：
https://qiita.com/daifuku10/items/50cb5cd9740e07fde591

```:track_webcam.py
import cv2
from ultralytics import YOLO

model = YOLO('yolov8n.pt')  # 学習済みモデルをロード

cap = cv2.VideoCapture(0)   # カメラを開く
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)  # 横1280ピクセル
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)  # 縦720ピクセル

while True:
    success, frame = cap.read()  # 1フレーム読み込み

    # 物体のトラッキング persist:フレーム間でトラッキングを永続化
    # verbose:コンソールへのログ出力を無効化 conf：信頼しきい値
    results = model.track(frame, persist=True, verbose=False, conf=0.5)

    annotated_frame = results[0].plot()  # トラッキング結果をフレームに描画

    items = results[0]  # 複数の物体情報を取得

    for item in items:  # 1つ取得し
        cls = int(item.boxes.cls)   # クラスIDを取得
        label = item.names[int(cls)]    # クラスIDからラベル名を取得

        score = item.boxes.conf.cpu().numpy()[0]    # 信頼度を取得

        x1, y1, x2, y2 = item.boxes.xyxy.cpu().numpy()[0]  # バウンディングボックスの座標を取得

        id_value = item.boxes.id  # トラッキングIDを取得 存在しない場合はNone
        if id_value is None:    # トラッキングIDが存在しないなら空文字
            track_ids = ''
        else:   # 存在すればIDを取得
            track_ids = item.boxes.id.int().cpu().tolist()[0]

        print(str(cls), str(label), str(score), str(track_ids), \
            str(x1), str(y1), str(x2), str(y2))

    cv2.imshow("YOLOv8 Tracking", annotated_frame)

    if cv2.waitKey(1) != -1:
        break

cap.release()   # カメラを開放
cv2.destroyAllWindows()  # ウィンドウを閉じる
```
【感想】Tableauを使ってみた（約3ヶ月）

# ■ はじめに
・あくまで個人的見解です。参考程度にしてください。
・Tableauを約3ヶ月使いました。
　厳密には、Tableau Desktopです。
・他のBIツールとの比較は別の記事で紹介します。
・初学者なので、専門的な用語は無いです。
　小学生の作文だと思って、暖かく見守ってもらえますと有り難いです。
・説明内容に誤り等あれば、コメントいただけますと幸いです。

# ■ 感想
## ◎ 結論
BIツールを使ったことがない人にもオススメです。
理由・所感は以下の通り。
・操作性が良い
・重たいデータもサクサク処理してくれる
・困っても安心
・整っていないデータは無理・・・

### ▶︎ 操作性が良い
私は取扱説明書を読まずに使用するタイプの人間です。（使って覚えれば良い精神）
例の如く、今回も説明書等は読まずに使用しましたが
全体構造をある程度把握したら、あとは特に詰まることなく操作できました。

Tableauによく出てくるワードを覚えたら、ある程度は操作できます。
例えば、ペイン、ディメンション、メジャーなど。

私の場合、3ヶ月でウォーターフォールや壺型ピラミッドなどのグラフを作れるようになりました。
取扱説明書がなくても使用できると言うのは、”操作性が良い”です。

### ▶︎ 重たいデータをサクサク処理してくれる
EXCELでデータ集計をしたことある方は大勢いるのでは無いでしょうか。
私もデータ集計はよくするのですが
扱うデータが何万ものレコードになってくると、EXCELは処理待ちの時間が長くなってしまいます。
ちょっと休憩したり、トイレに行ったり、、、なんて時間を潰しますが
処理待ちの頻度が増えるとそうもしていられません。

今回、数万レコードのデータをTableauで扱う機会がありましたが
データを取り込んでからグラフ化するのに、待ち時間は全く発生しませんでした（びっくり！）
ストレスフリーです。

### ▶︎ 困っても安心
困っているのに、安心とはどう言うことか・・・。

すぐに悩みが解決するからです。
Tableauユーザーは非常に多いです。
ネットで検索すると、様々な記事が見つかります。
あなたの抱える悩みもきっと見つかるでしょう。

また、UdemyやYoutubeでも数多くのTableau動画があり参考になります。
Tableauの特徴でもありますが、社内外に多くのコミュニティがあり、交流が活発です。
あなたもコミュニティに参加して、課題解決や更なるスキルアップを目指すことができます。


### ▶︎ 整っていないデータは厳しい・・・
ここまで良い意見しか言っていないTableauなので
何でもこなしちゃうツールなのかなと期待しましたが
基となるデータが整っていない場合は、整える作業が発生しました。
流石のTableauもそこまではフォローしてくれませんでした。（ヒトでも出来ないことは無理）

半角全角が統一されていない、入力ルールがバラバラといったデータは
クレンジングが必要です。

ただTableauの場合、「Tableau Prep Builder」というツールがあります。
このツールを使うことで、データの結合や変換などが容易に行えます。
ノーコードなので、使用しやすいと思います。


## ■ 終わりに
ここまでお付き合いいただき、ありがとうございました。
あくまで主観的な意見ですが、少しでも参考になれば幸いです。

## ■ ご参考
・Tableauを使ってみたいと悩んでいる方へ

Tableauは無料で使うことができます。
「TableauDesktop」を2週間無料トライアルをするか、「Tableau Public」を使う方法です。使用条件はありますが、「Tableau Public」もほぼほぼTableau Desktopと機能に差はないと思います。
まずは一度、「Tableau Public」を使ってみて検討いただくこともありかなと個人的には思います。
picoCTF #Forensics - Secret of the Polyglot

■問題
The Network Operations Center (NOC) of your local institution picked up a suspicious file, they're getting conflicting information on what type of file it is. They've brought you in as an external expert to examine the file. Can you extract all the information from this strange file?

あなたの地元の機関のネットワークオペレーションセンター（NOC）が、怪しいファイルを検出しました。そのファイルの種類について矛盾する情報が得られているようです。彼らはこのファイルを調査するために、外部の専門家としてあなたを招きました。この奇妙なファイルからすべての情報を抽出できますか？

■解き方

①hereをクリックし遷移先のpdfの中身を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/71329dad-6bef-3fc3-fd3f-4ebbfef58dfe.png)

②ファイルをダウンロードする

②fileコマンドでファイルの種類を特定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/b8075dce-7d45-1fa8-060c-482c2b41d3b0.png)

③ファイルの拡張子をpngに変更し、画像を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/60ef8b28-3657-e476-7c8b-a25c18fc78b3.png)

④pdf時に記載されていた文字列とpngに変更後の文字列を繋ぎ合わせるとフラグとなる
JetBrains FleetでKMPを使ってみる

# Fleetとは
https://www.jetbrains.com/help/kotlin-multiplatform-dev/fleet.html
> Fleet は、あらゆる言語に対応した強力な開発ツールに変身できる、あらゆる言語に対応したコード エディターです。Kotlin Multiplatform に優れたエクスペリエンスを提供することを目指しています。最初のステップとして、Fleet は Kotlin Multiplatform を macOS に導入します。
Fleet を使用すると、Android、iOS、Web、デスクトップ プラットフォームを対象としたマルチプラットフォーム プロジェクトをすばやく開いて実行できます。Fleet のスマート モードは、適切なコード処理エンジンを自動的に選択します。
iOS をターゲットとする場合、プロジェクトで使用されるすべての言語でナビゲーション、リファクタリング、デバッグが利用できます。これにより、混合言語のコードベースの管理が容易になります。Fleet はすぐに使用できる状態で Swift を完全にサポートしているため、アプリケーションのネイティブ部分を拡張および維持できます。

JetBrainsが開発している新しいIDEです。公式にあるようにSwiftまで完全にサポートしているため、マルチプラットフォーム開発と相性が良さそうな気がするので、使って見ようというモチベーションです。

現在、Prevew版は無料で利用できます。

# 開発環境の準備
必要条件
* macOS：Fleetは現在、macOSのみでKotlin Multiplatformをサポートしています。

* [JetBrains Toolbox](https://www.jetbrains.com/toolbox-app/)：複数のJetBrains製品バージョンを管理するためにToolboxアプリをインストールします。

* JDK 17：JDK 17以上をインストールしていることを確認します。

* [Android Studio](https://developer.android.com/studio)：Androidのターゲットに必要です。

* [Xcode](https://developer.apple.com/xcode/)：iOSのターゲットに必要です。

手順
* JetBrains Toolboxをインストール：JetBrainsアカウントにログインし、Fleetをインストールします。

* JDKバージョンを確認：コマンドラインツールでjava -versionを実行します。

* Android StudioおよびXcodeをインストール：両方のアプリケーションを少なくとも一度は開いてセットアップを完了します。

* 仮想デバイスを作成：Androidのために、Android Studioで仮想デバイスを作成します。

* iOSセットアップを確認：XcodeからiosAppフォルダ内の組み込みプロジェクトを実行できることを確認します。

* Fleetを再起動：問題が発生した場合は、Fleetを再起動します。

# プロジェクトの開始
* マルチプラットフォームプロジェクトを作成：[Kotlin Multiplatformウィザード](https://kmp.jetbrains.com/?_gl=1*yjfvni*_ga*MTQyMjg2NzM4MS4xNzI1MTU0NTg5*_ga_9J976DJZ68*MTcyOTk0NjM3OS4zLjEuMTcyOTk0ODgzNS4wLjAuMA..)を使用します。
  * IDEからプロジェクトを作るのではなくベースをWEBで作って開く形ですね。新しい。ひとまずAndroidとiOSだけチェックでいい。いろんなプラットフォームに対応しようとすると、ほぼハマるので最小限で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663620/554a9132-b3d5-1a63-8428-a1f3656dd004.png)


* DLしたプロジェクトをFleetで開く:最初は時間がかかります。

* スマートモードを有効化：右上⚡️マークを押して、スマートモードを有効化して自動コード処理を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663620/72faf58a-c0b0-50b4-f577-8c830e4d764a.png)

# 実行
* ショートカット`⌘ R`
* メイン メニューで[実行] | [実行とデバッグ]を選択
* 実行構成ウィンドウの上部にあるアイコン`▷`をクリック
いずれもAndroid/iOSどちらで実行するか選んでできます

# サンプルプロジェクトを起動した感想
環境構築は早いですね。Android・iOS開発をしている前提だと15分もかからないのではないかと思います。使用感はAndroidStudioを使っているAndroid開発者にとっては、特に違和感はないかと思います。同じ会社ですし。ひとまず、適当なアプリを開発してみて感想は別途追記していこうかと思います。

# プロジェクト作成してみて
簡単なWEB通信するプロジェクトを作成してみましたが、本格利用することはないという結論です。
動作が遅すぎて、全く使い物になりません。ライブラリをimportしてsyncするだけで５分くらいかかります。流石に実用に堪えるものではない。。。高級な開発マシンを使っている人用の開発環境でした。残念です。
アンケート調査ラベリング（個人用）

Sub ProcessExcelSheet()
    Dim wb As Workbook
    Dim newWb As Workbook
    Dim ws As Worksheet
    Dim filePath As String
    Dim fileName As String
    Dim newFileName As String
    
    ' 元のブックのパスと名前を取得
    filePath = ThisWorkbook.Path
    fileName = ThisWorkbook.Name
    newFileName = filePath & "\" & Replace(fileName, ".xlsm", "") & "_done.xlsx"
    
    ' 元のブックをコピーして新しいブックを保存
    ThisWorkbook.SaveCopyAs newFileName
    Set newWb = Workbooks.Open(newFileName)
    Set ws = newWb.Sheets(1)
    
    ' E列をキーにして昇順に並べ替え
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("E2:E" & ws.Cells(ws.Rows.Count, "E").End(xlUp).Row), Order:=xlAscending
        .SetRange ws.Range("A1:E" & ws.Cells(ws.Rows.Count, "E").End(xlUp).Row)
        .Header = xlYes
        .Apply
    End With
    
    ' 2行目から抽出処理を開始
    Dim i As Long
    For i = 2 To ws.Cells(ws.Rows.Count, "E").End(xlUp).Row
        If ws.Cells(i, 5).Value = "" Then Exit For
        ' ↓6列目にラベルを吐き出す。変えたければws.Cells(i,n（任意の列）)に
        ws.Cells(i, 6).Value = extraction(ws.Cells(i, 5).Value, Worksheets("rule").Range("A1:AV39"))
    Next i
    
    ' 処理完了後の通知
    MsgBox "処理が完了しました。ファイルは " & newFileName & " に保存されました。"
End Sub


Function extraction(S1 As String, R1 As Range) As String
  Dim i As Integer, j As Integer
  Dim V1 As Variant
  V1 = R1.Value
  For i = LBound(V1, 1) To UBound(V1, 1)
    For j = LBound(V1, 2) + 1 To UBound(V1, 2)
      If V1(i, j) <> "" And InStr(1, S1, V1(i, j), vbTextCompare) > 0 Then
        extraction = V1(i, 1)
        Exit Function
      End If
    Next j
  Next i
End Function


これをこのままコピペする
picoCTF #Forensics - Scan Surprise

■問題
I've gotten bored of handing out flags as text. Wouldn't it be cool if they were an image instead? 

テキストとしてフラグを配布するのが退屈になってきました。
画像として配布するのはクールだと思いませんか？

■解き方
表示されたQOコードを読み込むだけ。
フラグがすぐに表示される。

①SSH接続

②QRコードが表示されるため、ツール等で読み込みフラグを取得する。
システム開発の改善

# はじめに
今、所属している会社は、情報システム部門は存在するが、30年前で時間が止まっているようなレガシーオブレガシーな状況です。
そんな状況を改善する人材が欲しいという募集があり、応募したところ、採用に至ったのが今の私。

頭を抱えるようなことも多いが、改善に向かって前進している実感はあり、日々充実しています。

頑張って、楽しんで、時には悩んで、苦しんで、改善に取り組んだ内容はきっと、他のシステム関連ではない一般の企業にとって役に立つことが少しはあると信じ、ここに記録しておこうと思います。

# 私の経歴
新卒で、金融機関のシステム系関連会社に入社。
約12年ほど勤めました。
ここでは評価されており、後輩先輩を見てもおそらく最速で出世していたと思います。

もっと大規模なプロジェクトに参画したいと思い、超大手SI企業に転職。
誰もが知る大企業。
正直、ここに入社できたことはとても嬉しかったです。
でも、家族が病気になった。
フル出社で、ハードな働き方を求められるこの企業ではどうしても働くことが難しく、一年以内という短期間で離職せざる負えなかった。
頑張れなかったことがいまでも悔やまれる。

そして今の会社です。
給料は下がったが、社内SEなので仕事の納期などの調整が効き、テレワークも3日まで可能ということで、私生活と両立できるため、入社を決めました。

# システム関連のいま
前置きが長くなってしまいました。
長らくシステム開発を主業務としていない社員が異動してきて、管理・運用してきただけに、数日勤務しただけでも以下の大きな問題があることが分かりました。
ちなみに開発作業自体は、関連会社に委託している状態です。

1. リリースの遅延が非常に多く、スケジュール管理ができていない
2. 業務に影響があるようなバグが頻発している
3. ドキュメント類の整備がいい加減で、当てにならない
4. 3のことがあるので、開発のたびにコードを調査しており、開発に時間がかかりすぎている
5. 3のことがあるので、ユーザーからの問い合わせ対応時にコードを調査しており、対応に時間がかかりすぎている
6. 日々の運用の中で、手作業のメンテナンスや月次処理が非常に多い

ざっとわかった範囲でもこんな感じ。

# 原因とは？
委託先企業の技術力不足もあるが、やはり根本的な原因は、マネージメント不足。
きちんと管理できていないのだから、委託先企業ばかり責められない状況です。

業務分野のマネージャーであっても、やはりシステム開発のマネージメントはどうやら勝手が違うようです。
例えばスケジュールが遅延した場合の対応策一つとっても、ただ単に人を追加投入させるだけであったりする。これでは単純に＋１人月にならないことは、システム開発をしている人であれば常識であるが、そうではない。

# 改善への道のり
さて現状は以上の通りです。
これらを改善していくのが私の業務。
何から取り掛かるべきか、問題の影響度が高く、効果が出やすいものから着手することにしました。

まずは、**致命的なバグの回避**。

具体的な改善策とその結果については、次回以降順次記載していきたいと思います。

仕事のやり方を変えると、既存社員からの反発も大いに有り得る。
同僚は敵ではなく、仲間なため、可能な限り、対立を避けて取り組んでいくことを念頭に置いています。

# 最後に
同じような境遇の方がいれば、ぜひなにかコメント残していただけると幸いです。
もしなにか私にできることがあれば、可能な限りアドバイスさせていただきますし、私の書いていることは間違っていて、こうしたほうが良いなどのアドバイスも大歓迎です。

もちろん愚痴等でも構いません。

日本のDX化が遅れているのは、こういったITとは関係のない一般企業であって、ここのボトムアップができれば、きっと日本はまだ戦えると信じています。
Custom Brewing Equipment for Your Unique Needs

Comprehensive Support
When you partner with Micet Craft, you gain access to comprehensive support throughout your brewing journey. Our knowledgeable team is here to assist you with equipment selection, installation, and ongoing maintenance. We believe that quality extends beyond our products to the service we provide. With Micet Craft, you can rely on expert guidance to ensure your brewing operations run smoothly and efficiently.
<a href="url">Micetgroup</a>
![対応していない形式のファイルです。]()
Reactを学習したのでまとめてみた

# Reactを学習したのでまとめてみた
案件でReactを使うことになったので調べてみて理解したことをまとめてみました。
（ほとんどAIに聞きました）

## 1. コンポーネント
Reactアプリケーションは、再利用可能なUIの部品であるコンポーネントで構成されます。コンポーネントには、関数コンポーネントとクラスコンポーネントの2種類があります。

### 関数コンポーネント
```jsx
function Greeting(props) {
  return <h1>Hello, {props.name}!</h1>;
}
```

### クラスコンポーネント
```jsx
class Greeting extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}
```

## 2. JSX
JSXは、HTMLのような構文でReactコンポーネントを記述するための拡張構文です。

```jsx
const element = <h1>Hello, World!</h1>;
```

## 3. Props（プロパティ）
Propsは、親コンポーネントから子コンポーネントにデータを渡すための仕組みです。

```jsx
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

function App() {
  return (
    <div>
      <Welcome name="Alice" />
      <Welcome name="Bob" />
    </div>
  );
}
```

## 4. State（状態）
Stateは、コンポーネント内で管理されるデータです。関数コンポーネントではuseStateフックを使用し、クラスコンポーネントではthis.stateを使用します。

### 関数コンポーネントでのState
```jsx
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
```

### クラスコンポーネントでのState
```jsx
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  increment() {
    this.setState({
      count: this.state.count + 1
    });
  }

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={() => this.increment()}>Increment</button>
      </div>
    );
  }
}
```

## 5. イベント処理
イベント処理は、ユーザーアクションに応じてコンポーネントの動作を定義するために使用されます。

```jsx
function Button() {
  function handleClick() {
    console.log('Button clicked!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}
```

## 6. 条件付きレンダリング
条件に応じてコンポーネントの表示を切り替えるために、条件付きレンダリングを使用します。

```jsx
function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;

  if (isLoggedIn) {
    return <h1>Welcome back!</h1>;
  }
  return <h1>Please sign up.</h1>;
}
```

## 7. リストとキー
配列データを元にコンポーネントを動的に生成するために、リストとキーを使用します。

```jsx
function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    <li key={number.toString()}>
      {number}
    </li>
  );
  return (
    <ul>{listItems}</ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);
```

## 8. フォーム
フォームは、ユーザー入力を受け取り、stateと同期させるために使用されます。

```jsx
function NameForm() {
  const [name, setName] = useState('');

  const handleSubmit = (event) => {
    event.preventDefault();
    alert('A name was submitted: ' + name);
  }

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Name:
        <input type="text" value={name} onChange={(e) => setName(e.target.value)} />
      </label>
      <input type="submit" value="Submit" />
    </form>
  );
}
```
ABC377をPythonで（A～D）

トヨタシステムズプログラミングコンテスト2024（AtCoder Beginner Contest 377)の解答等の速報的まとめ

https://atcoder.jp/contests/abc377



# A問題
https://atcoder.jp/contests/abc377/tasks/abc377_a

配列に入れてソートして確認
```python:A
print("Yes" if sorted(list(input())) == ["A", "B", "C"] else "No")
```
# B問題
https://atcoder.jp/contests/abc377/tasks/abc377_b

横方向で#がない行の数$\times$縦方向で#がない列の数
```python:B
s = [input()for _ in range(8)]

r = 0
c = [True] * 8
for i in range(8):
    if "#" not in s[i]:
        r += 1
    for j in range(8):
        if s[i][j] == "#":
            c[j] = False

print(r * sum(c))
```
# C問題
https://atcoder.jp/contests/abc377/tasks/abc377_c

各ナイトがいけるマスの数を調べて、マスの総数から引く
```python:C
n, m = map(int, input().split())
s = set()

for _ in range(m):
    a, b = map(int, input().split())
    s.add((a, b))
    for i, j in [(2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1)]:
        if 1 <= a + i <= n and 1 <= b + j <= n:
            s.add((a + i, b + j))

print(n ** 2 - len(s))
```
# D問題
https://atcoder.jp/contests/abc377/tasks/abc377_d

各区間の左端を固定して右端をどこまで伸ばせられるかを順番に計算する
前計算で各座標を左端とする区間のうち最初にいずれかの区間を含む右端の座標を求めておく
```python:D
n, m = map(int, input().split())
data = [tuple(map(int, input().split())) for _ in range(n)]

INF = float("inf")
lst = [INF] * (m + 1)

for l, r in data:
    lst[l] = min(lst[l], r)

for i in range(m - 1, -1, -1):
    lst[i] = min(lst[i], lst[i + 1])

ans = 0
for i in range(1, m + 1):
    if lst[i] < INF:
        ans += lst[i] - i
    else:
        ans += m - i + 1

print(ans)
```
エスケープシーケンス、変換指定子について


#目次
[エスケープシーケンスとは](#エスケープシーケンスとは)
[よく使うエスケープシーケンス](#よく使うエスケープシーケンス)
[変換指定子について](#変換指定子について)
[よく使われている変換指定子](#よく使われている変換指定子)
[変換指定子のポイント](#変換指定子のポイント)
[まとめ](#まとめ)

## エスケープシーケンスとは
C言語の**エスケープシーケンス**は、文字列や文字の中で特別な指示を与えるために使われる特殊な文字です。エスケープシーケンスを使用することで、改行やタブ、特定の制御文字などを表現できます。

要約すると、プログラムの中で文字や数字に対して、「合図」を送って特別な指示を送っています。

## よく使うエスケープシーケンス
1.`\n`改行：
行を変えて、新しい行から文字を表します。
`Hello\nWorld!`と入力すると
```text
Hello
World!
```

2.`\t`タブ
横にスペースを開けて文字を表示します。
`Hello\tWorld!`と入力すると
```text
Hello  World!
```

3.`\\`バックスラッシュ
バックスラッシュ（\）そのものを表示します。普通は「エスケープシーケンスの始まり」を意味をする記号なので`\\`と2つ続けて書くと、バックスラッシュを表示することができます。
`C:\\Program Files`と入力すると
```text
C:\Program Files
```

4.`\"`ダブルクォート
ダブルクォートを表示します。普通の文字として表示したい時に使います。
`"He said, \"Hello\"!"`と入力すると
```text
He said, "Hello"!
```

5.`\'`シングルクォート
シングルクォートを表示します。ダブルクォートと同じように特別な文字として使います。
`It\'s fun!'`と入力すると
```text
It's fun!
```
:::note
文字列とは
:::
""で囲まれた部分。文字列リテラルとも呼ばれます。

```c
printf("21+10");
```
この記述では出力が`21+10`とされ、計算せずに表示されます。
これは文字列と認識されているため、計算できないことを示しています。

計算するために、文字列から数値と読み込ませるために必要なのが、<font color="red">変換指定子</font>になります。

## 変換指定子について
変換指定子は、プログラムで数や文字などを綺麗に表示したい時に使う「特別なルール」です。例えば、数を表示するときの指定や、文字列を表示するときの指定ができます。**変換指定子**を使うことで、画面にきちんとした形で数や文字を出すことができます。

要約すると、`%`のマークを使って、「ここには数を入れて！」や「ここには文字を入れて！」とPCに指示をします。

## よく使われている変換指定子
1.`%d`整数（普通の数）
「d」はdecimal「デシマル」の略です。
普通の整数を表示したい時に使います。少数点含まない数です。
`printf("%d", 10);`結果：10

例：整数を表示する
```c
int age = 12;
printf("I am %d years old.\n", age);
```
結果：`I am 12 years old.`

2.`%f`少数
小数点がある数(3.14など)を表示したい時に使います。
`printf("%f", 3,14);`結果：3,140000
　※小数点以下はデフォルトで6桁表示されますが桁数を指定することも可能です。
 `printf("%.桁数f, 数値");`
`printf("%.2f", 3.14159);`結果：`3.14`

例：少数を表示する
```c
float pi =3.14159;
printf("Pi is approximately %f\n", pi);
```
結果：`Pi is approximately 3.141590`（小数点以下6桁まで表示されます）

:::note
float型（フロート）
:::
`float`型の変数には、小数点が含まれる数（実数）を保存することができます。ここでは、`3.14159`の数値を使用することが出来ています。
またint型と同様、4バイト（32ビット）のメモリを使用します。

 3.`%c`文字（1文字）
 1文字（アルファベットや数字、記号など）を表示したい時に使います。
 `printf("%c", 'A');`結果：`A`


 4.`%s`文字列（複数の文字）
 複数の文字からなる言葉や文章を表示したいときに使います。
 `printf("%s", "Hello");`結果：Hello

```c
char letter ='A';
char name[] ="Arice";
printf("Letter: %c, Name: %s\n", letter, name);
```
結果：`Letter: A, Name: Alice`

:::note
char（キャラ）
:::
・1文字を保存するためのデータ型です。
・メモリのサイズは1バイト（8ビット）で<font color="red">0~255</font>までの数値を扱えます。
※環境によって変化します。


 5.`%x`/`%X`
 16進数（0~9とA~Fを使った数）で表示したい時に使います。
 `printf("%x, 255);`結果：`ff`
 `%X`で大文字にすると結果も大文字になります。
 `printf("%X", 255);`結果：`FF`

 ### 変換指定子のポイント
 データ型に合わせて使う
 `%d`は整数用
 `%f`は少数用
 `%c`は1文字用
 というように、表示したいデータに合わせた指定子を使います。
 複数の指定子を一度に使うと・・
 ```c
 int age = 10;
float height = 135.5;
printf("Age: %d, Height: %.1f\n", age, height);
 ```
 結果：`Age: 10, Height: 135.5`

 ## まとめ
 変換指定子を使うと、プログラムの中で数や文字を簡単に表示できます。決まられた指定子を使って、綺麗に画面に出したいものを表示できるので、とて便利なので、積極的に使っていきたいと思います。
投稿 118 RubyのMVCモデル環境構築 2024/10/26

本日の勉強時間　3H

Ruby on RailsのMVC（Model-View-Controller）モデルで
ローカルサーバーにHTMLビューが反映されるまでの流れは次のとおり。


これらの手順を踏むことで、ブラウザに期待したHTMLが表示されます。
1 Railsプロジェクトの作成
```
rails new プロジェクト名
cd プロジェクト名
```

2 コントローラーの作成
表示したいページに対応するコントローラーを作成します。たとえば、PostsControllerを作成するには、次のコマンドを実行します。
```
rails generate controller Posts index
```


これにより、app/controllers/posts_controller.rbが生成され
indexアクションが自動で追加されます。


3 ルーティングの設定
Railsでは、リクエストをコントローラーに紐付けるために
config/routes.rbにルーティングを設定します。
例として、PostsControllerのindexアクションをトップページとして
設定する場合：
```
# config/routes.rb
Rails.application.routes.draw do
  root "posts#index"  # トップページをposts#indexに設定
  resources :posts, only: [:index]
end
```



root "posts#index"を指定すると、http://localhost:3000/にアクセスしたときにPostsController#indexが呼び出されます。


4 ビューの作成
app/views/posts/ディレクトリにindex.html.erbファイルを作成します。
このファイルに、表示したいHTMLコードを記述します。
```
<!-- app/views/posts/index.html.erb -->
<h1>Welcome to the Posts Index Page</h1>
<p>This is your first page in Rails.</p>

```



5 サーバーの起動
ローカルサーバーを起動します。
```
rails server
```

これでローカルサーバーが起動し

http://localhost:3000/

にアクセスすると、app/views/posts/index.html.erbの内容がブラウザに表示される。


6 確認
ブラウザでhttp://localhost:3000/
にアクセスして、ビューが正しく表示されるか確認します。もし正しく表示されない場合は、以下を確認。


・config/routes.rbでルートパスが正しく設定されているか。
・PostsControllerがindexアクションを持っているか。
・index.html.erbファイルがapp/views/posts/に配置されているか。


RailsのMVCモデルでビューをローカルサーバーに表示する基本的な流れは完了するはず....
【ansible】Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user

# エラー
ssh ユーザーと実行ユーザーを変更して ansible playbook を実行したら、一時ファイルの権限エラーが発生してしまった
```hosts.ini
ansible_ssh_user=my_ssh_user
ansible_user=execute_user
ansible_become_user=execute_user
ansible_become_pass=execute_user_pass
app_env=dokka
```
```error.
Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user
```

# 解決
ansible.cfg の pipelining を True に設定することで解決した
```ansible.cfg
[defaults]
...
pipelining = True ;こいつ追加
```
:::note info
`pipelining` を `True` に設定すると、サーバーにファイル転送を行わず実行するようになるため、一時ファイルの権限エラーを回避できる。また、ファイル転送がなくなるため、パフォーマンスが大幅に向上するらしい。しかし、サーバーの設定によっては使えないようなので要確認。
:::


# 参考
https://maomaomaopan.hatenablog.com/entry/2018/10/16/000000

https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-pipelining
git チートシート

# Gitコマンドチートシート

## リポジトリの初期化と設定
- `git init`: 新しいGitリポジトリを初期化する
- `git clone <url>`: 既存のリポジトリをクローンする
- `git config --global user.name "<name>"`: ユーザー名を設定する
- `git config --global user.email "<email>"`: ユーザーのメールアドレスを設定する

## 変更の追跡と staged 状態への追加
- `git status`: ファイルの状態を確認する
- `git add <file>`: ファイルを staged 状態に追加する
- `git add .`: すべての変更を staged 状態に追加する
- `git rm <file>`: ファイルを削除し、変更を staged 状態に追加する
- `git mv <old> <new>`: ファイル名を変更し、変更を staged 状態に追加する

## コミットと履歴の閲覧
- `git commit -m "<message>"`: staged 状態の変更をコミットする
- `git commit -a -m "<message>"`: すべての変更を自動的に staged 状態に追加してコミットする
- `git log`: コミット履歴を表示する
- `git log --oneline`: コミット履歴を1行ずつ表示する
- `git show <commit>`: 特定のコミットの詳細を表示する

## ブランチの操作
- `git branch`: ブランチの一覧を表示する
- `git branch <branch>`: 新しいブランチを作成する
- `git checkout <branch>`: 指定したブランチに切り替える
- `git checkout -b <branch>`: 新しいブランチを作成して切り替える
- `git merge <branch>`: 指定したブランチを現在のブランチにマージする
- `git branch -d <branch>`: ブランチを削除する

## リモートリポジトリとの連携
- `git remote add <name> <url>`: リモートリポジトリを追加する
- `git push <remote> <branch>`: ローカルのブランチをリモートリポジトリにプッシュする
- `git pull <remote> <branch>`: リモートリポジトリの変更をローカルにプルする
- `git fetch <remote>`: リモートリポジトリの最新の状態を取得する

## その他の便利なコマンド
- `git diff`: ワークツリーと staged 状態の差分を表示する
- `git stash`: 現在の変更を一時的に退避する
- `git stash pop`: 退避した変更を復元する
- `git reset <file>`: ファイルの変更を取り消す
- `git revert <commit>`: 指定したコミットを取り消すコミットを作成する
Amazonアソシエイトプログラムの活用法 はじめに

Amazonアソシエイトプログラムは、ブログやウェブサイトを運営している方々にとって、収益化の手段として非常に魅力的な選択肢です。このプログラムを利用することで、自分のコンテンツに関連する商品を紹介し、売上の一部を報酬として得ることができます。本記事では、Amazonアソシエイトプログラムの基本、メリット、成功するためのヒントを解説します。

Amazonアソシエイトプログラムとは？
Amazonアソシエイトプログラムは、Amazonが提供するアフィリエイトプログラムです。登録をすると、自分のウェブサイトやブログにAmazonの商品リンクを作成し、それを通じて訪問者が購入した場合に報酬を受け取ることができます。報酬は、購入された商品の価格に基づいて計算されます。

プログラムの特徴
豊富な商品数: Amazonには数百万の商品のカタログがあり、ほぼすべてのニッチに対応できます。これにより、自分のコンテンツに最適な商品を見つけやすくなります。

簡単なリンク作成: Amazonは、簡単にリンクを作成できるツールを提供しています。これにより、技術的な知識が少ない方でも手軽に利用できます。

リアルタイムの報酬追跡: 売上やコンバージョン率をリアルタイムで確認できるダッシュボードが提供されています。これにより、効果的な戦略を見つけやすくなります。

ユーザーフレンドリー: Amazonは世界中で広く利用されているため、ユーザーにとっても信頼性があります。これにより、訪問者が購入する際の安心感が増し、コンバージョン率が向上します。

Amazonアソシエイトプログラムのメリット
収益の多様化: 自分のコンテンツに関連した商品を紹介することで、収益源を増やすことができます。
簡単に始められる: アカウントを作成するだけで、すぐにリンクを生成し始めることができます。
サポートリソース: Amazonは、マーケティング戦略や成功事例に関するリソースを提供しており、初心者でも学びやすい環境が整っています。
成功するためのヒント
ニッチを絞る: 特定のジャンルにフォーカスすることで、ターゲットオーディエンスに対して効果的なコンテンツを作成できます。たとえば、ガジェットや書籍など、自分の興味がある分野に特化することが重要です。

質の高いコンテンツを作成する: 商品レビューや比較記事を通じて、訪問者に価値を提供しましょう。読者が信頼できる情報を得ることで、購入意欲が高まります。

SEO対策を行う: 検索エンジン最適化（SEO）を意識し、キーワードを適切に使用することで、検索結果での露出を高めることができます。

SNSを活用する: 自分のコンテンツをSNSでシェアすることで、より多くの人にアプローチできます。特に、視覚的な要素を含む投稿は効果的です。

リンクの配置を工夫する: 商品リンクを自然にコンテンツに組み込むことで、クリック率を向上させることができます。テキストや画像リンクを適切に配置しましょう。

まとめ
Amazonアソシエイトプログラムは、手軽に始められるアフィリエイトの選択肢であり、収益化の可能性を秘めています。ニッチに特化した質の高いコンテンツを作成し、SEOやSNSを活用することで、成功への道が開けるでしょう。あなたもこのプログラムを活用して、収益化の一歩を踏み出してみませんか？
Rye でパッケージ管理をするためのコマンドや説明などのメモ

## 概要

Python の**パッケージ管理**と**バージョン管理**ができる`Rye`を使って Python のパッケージ管理をするときに使用するコマンドなどをまとめました。

-   参考： [Rye の公式ドキュメント](https://rye.astral.sh/guide/basics/)

インストールや環境構築の手順などはこちら

https://qiita.com/p-marry/items/ff78c21425fe5635cbbe

## パッケージ構築

### init <パッケージ名>

Rye を使って新しいパッケージを初期化します

```bash
rye init <パッケージ名>
```

-   作成例

    ```bash
    rye init my-project
    ```

    新しく`my-project`という名前のパッケージが作成され、次のようなディレクトリ構造が生成されます
    `pyproject.toml`にパッケージの情報が記録されていきます

    ```bash
    my-project
    ├── .git
    ├── .gitignore
    ├── .python-version
    ├── README.md
    ├── pyproject.toml
    └── src
        └── my_project
            └── __init__.py
    ```

### pin <任意のバージョン>

パッケージ内で使用される Python のバージョンを`init`で生成されたものから任意のものに指定できます

-   `.python-version`が上書きされます

```bash
pin <任意のバージョン>
```

-   使用例

    ```bash
    rye pin cpython@3.13
    ```

### sync

`pyproject.toml`の内容に基づいて仮想環境を構築します

-   パッケージのディレクトリに`.venv`フォルダが生成されます
-   `requirements.lock`と`requirements-dev.lock`の 2 つのファイルが生成されます

```bash
rye sync
```

## ライブラリの管理

### add <ライブラリ名>

パッケージにライブラリを追加します

-   `pyproject.toml`に追加されます

```bash
 rye add <ライブラリ名>
```

### add --dev <ライブラリ名>

開発時にのみ使用するライブラリを追加します

-   `pyproject.toml`に追加され、`requirements-dev.txt`にも追加されます

```bash
 rye add  --dev <ライブラリ名>
```

-   追加例
    -   `rye add  --dev pyinstaller`

### list

パッケージに追加されているライブラリを一覧します

```bash
rye list
```

### remove <ライブラリ名>

パッケージからライブラリを削除します

```bash
 rye remove <ライブラリ名>
```

## パッケージの管理

### show

現在のパッケージの情報を表示します

```bash
rye show
```

## 仮想環境の有効化/無効化

通常のように仮想環境の操作もできます
仮想環境を有効化することで、インストールされたライブラリをパッケージ内で使用することなどもできます

### .venv\Scripts\activate

仮想環境の有効化

```bash
.\venv\Scripts\activate
```

### deactivate

仮想環境の無効化

```bash
 deactivate
```
初心者の私が使う開発環境

#　はじめに
大学1年生の後期授業でプログラミングの授業と演習の必修科目を履修しています。
高校の時に少しだけ授業でやっただけのど初心者の私が使っている開発環境を紹介します。

## 開発環境
**Visual Studio Code**です
大学指定の開発環境を使っています。

## パソコンについて
パソコンは入学時に購入したDELLのパソコンでOSはWindows11 Homeです。

# 最後に
お薦めの開発環境があれば教えてください。
構文解析器作成用言語ParserScriptで簡単な式のマッチングを行う

:::note warn
現在、ParserScriptは非推奨です。
:::
　今回はParserScriptで簡単な式のマッチングを行います。
　使用するバージョンは2.0です。

https://github.com/MueLangDeveloper/ParserScript-Ver2.0

 # 式の定義
　簡単な四則演算の文法をEBNFで書く。
```bnf
<factor>     ::= [ "-" ] [ ( "0." | "." ) ] NUMBER | "(" <expression> ")"
<term>       ::= <factor> { ( "*" | "/") <factor> }
<expression> ::= <term> { ( "+" | "-" ) <term> }
```
　これをParserScriptで書くと
```prs:Grammar.prs
ESCAPE ' '
CALL EXPRESSION
AST FACTOR
    NOESCAPE ' '
    RECORD
    VRECORD ""
    MATCH "-"
    DOWNPUSH
    VRECORD ""
    RECORD
    MATCH "0."
    NOMATCH?
        BREAK
       MATCH "."
    END
    DOWNPUSH
    NUMBER
    NOMATCH?
        BREAK
        ESCAPE ' '
        MATCH "("
        CALL EXPRESSION
        MATCH ")"
    END
    ESCAPE ' '
LAST
AST TERM
    CALL FACTOR
    VRECORD ""
    SET
    VRECORD ""
    MATCH "*"
    NOMATCH?
        BREAK
        MATCH "/"
    END
    CALL FACTOR
    MATCH?
        JUMP
    END
    NOMATCH?
        DOWNPUSH
    END
LAST
AST EXPRESSION
    CALL TERM
    VRECORD ""
    SET
    VRECORD ""
    MATCH "*"
    NOMATCH?
        BREAK
        MATCH "-"
    END
    CALL TERM
    MATCH?
        JUMP
    END
    NOMATCH?
        DOWNPUSH
    END
LAST
```
　となります。
　予約語は大文字でも小文字でも良いです。
# Grammar.prsの実行
　以下はC#のParserScriptの実行方法
```cs:Program.cs
using System;
using ParserScript;

class Program {
    static void Main() {
        string str = Console.ReadLine() ?? "";
        var res = ParserScript.Run(@"./Grammar.prs", "(3 + 4 / 2) * 3");
        // 第一引数にファイルのパスを書く
        Console.WriteLine(res.Success ? "Passed" : "Failure");
        Console.WriteLine($"Result: {res.Value}");
    }
}
```
　結果↓
```
(3 + 4 / 2) * 3
Passed
Result: (3 + 4 / 2) * 3
```
　「1 +」とかだと
```
1 +
Failure
Result: 
```
　になります。
# 終わりに
　このままでは式のマッチングだけなので、式を逆ポーランド記法に変換するコードが完成したらその記事を書こうと思います。
RaspberryPiでローカルLLMにチャレンジ（準備）

RaspberryPiでLLMを実行するための環境としてはOllama,llama.cppなどがあります。
それ以外にMicrosoftからはOnnxRuntimeの拡張ライブラリとしてonnxruntime-genaiがリリースされています。

今回はRaspberryPi5にonnxruntime-genaiをインストールしてみたいと思います。

## 環境
・RaspberryPi5 8GB
・RaspberryPi OS with desktop 2024/07/04版
・32GB以上のストレージ（やはりSSDがいいと思います）

## ビルドの準備
現時点でonnxruntime-genaiのARM64バイナリはWindows版だけ配布されているので、MacやLinuxではソースコードからビルドする必要があります。
また、ビルドする際にはCMakeを使用するのですが、最新のRaspberryPi OS にaptでインストールできるCMakeのバージョンが少し古いため、CMakeの最新版をビルドするところから始めます。

ビルドに必要なライブラリをインストールしてから、ソースコードを取得してビルド、インストールを行います。
```
$ sudo apt install libssl-dev
$ wget https://github.com/Kitware/CMake/releases/download/v3.30.5/cmake-3.30.5.tar.gz
$ tar zxvf cmake-3.30.5.tar.gz
$ cd cmake-3.30.5
$ ./bootstrap
$ make
$ sudo make install
```

次に任意のディレクトリにonnxruntime-genaiのレポジトリをクローンします。
```
$ git clone https://github.com/microsoft/onnxruntime-genai
$ cd onnxruntime-genai
```

ビルドにはonnxruntimeのバイナリも必要なのでダウンロードしてレポジトリ内のディレクトリ(ort)に配置しておきます。（2024/11/01 onnxruntimeが1.20.0にバージョンアップしました。）
```
$ curl -L https://github.com/microsoft/onnxruntime/releases/download/v1.20.0/onnxruntime-linux-aarch64-1.20.0.tgz -o onnxruntime-linux-aarch64-1.20.0.tgz
$ tar zxvf onnxruntime-linux-aarch64-1.20.0.tgz
$ mkdir ort
$ mv onnxruntime-linux-aarch64-1.20.0 ort
```

最後にビルドスクリプトを実行します。
```
$ python build.py --config Release
```

ビルドが完了すると onnxruntime-genai/build/Linux/Release/wheel/ にwhlファイルができています。
後はこれをpipでインストールすればonnxフォーマットのLLMで推論が可能になります。

次回はonnxruntime-genaiを使ってPhi-3-miniを動かしてみたいと思います。
サイトでActivityを表示する方法




### 標準オブジェクトの場合
#### 方法１
Generic|Record Detail をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/e3f9b06d-f7f7-4b49-8524-df0947db6455.png)

タブ４の種類で「活動タイムライン」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/f572f8ae-bea7-9248-1903-efe4ab5c633c.png)

#### 方法２
または、コンポーネントから「活動」を画面に配置する
注意：「活動」はHOMEページに配置できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/6811d01c-de72-e9fa-7931-9579124e134d.png)

設定後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/cd7c0c98-5b57-ed17-6b04-87c73800cad4.png)

### カスタムオブジェクトの場合
標準オブジェクトの方法１、方法２と同じ
注意点は、カスタムオブジェクトのRecored Detailのページで配置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/d939e9b0-d2ce-73ad-3c44-2959fb1b4533.png)
携帯でPythonを使う

# iphoneでもpythonを使う！
iphoneのapp storeでpythonを検索するといくつか出てきますが、実はシェル環境をインストールするとpythonがついてきます。
なので
https://apps.apple.com/jp/app/a-shell/id1473805438
を入れればpythonインタープリタをシェルから起動できます。
pipでインストールされているライブラリも調べることが可能でエディタはvimが起動します。

# androidでもpythonを使う！
iphoneのa-shell同様にシェルが使えればpythonもついてきます。
androidではTermuxというアプリを使うとシェルが起動します。
https://play.google.com/store/apps/details?id=com.termux&hl=ja
こちらもvimが起動します。
pipで見ると拡張されたライブラリはありませんでした。
No connection to gradle server. Try restarting the server. が出た時の対処法

## Gradleサーバーとの接続に問題？
![スクリーンショット 2024-10-26 21.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775030/0be6330e-96b3-676c-13ff-d64d9551e571.png)

今回のエラーは、Gradleサーバーとの接続に問題が発生したことを示しており、これは通常、ネットワーク接続、Gradleのキャッシュ、またはIDEの設定に関連する問題みたいです。

私の場合、IDEの設定に問題があったみたいでして、java関連のソフトをインストールをしたらビルドできました。

# インストールしたソフト

・Extension Pack for Java
・Gradle for Java
![スクリーンショット 2024-10-26 21.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775030/640b2a74-dbfb-b86f-5504-78dd3d05e69e.png)


# 終わりに
ビルドするのにGradleサーバーとやらに毎回接続しているっぽい？よくわかっておりませんが解決できました。

参考にした記事は下記になります。本当に助かりました、ありがとうございます😭
https://pgcodetutor.com/vscode%E3%81%A7java%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/
「活動予定」、「活動履歴」関連リストと活動ビュー

### 普通は「活動」タブが画面の右側に表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/64834be2-2c93-763f-70b3-9058557fe531.png)

### 右側側の表示を非表示にして、関連リスト形式にする方法
設定｜ユーザーインターフェース｜レコードページの設定
で「関連リスト」を選択し「保存」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/af46913b-a279-f489-6bd3-995ef006cd71.png)

以下のように関連リストに「活動予定」と「活動履歴」が表示される
右側には表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/acd22f1d-62b5-0d8f-9225-b238dd9bda61.png)
【見落とし厳禁！】知らないとヤバいセキュリティグループとネットワークACL

## はじめに

こんにちは、uiroleです！
今回は、AWSのセキュリティには欠かせない、セキュリティグループとネットワークACLについて解説していきます。

AWS SCS試験でも、セキュリティグループとネットワークACLどちらかを選択する問題が出てくることもあるので、しっかり押さえておきましょう！

### 【対象者】

この記事は、以下のような方を対象としています。
- セキュリティグループやネットワークACLの違いが分かりにくいと感じている人
- AWS環境でネットワークのセキュリティ設定をしっかり行いたいと考えている初心者・中級者
- AWSのアクセス制御のベストプラクティスを学びたいインフラエンジニア

### 【前提】

この記事では、以下の前提をもとに進めていきます。
- VPCやEC2インスタンスなどの基本的な操作に慣れていること
- 基本的なネットワークの概念（サブネットやポート番号など）を理解していること

### 【この記事を読んで解決すること】

- **セキュリティグループとネットワークACLの違い**が分かり、それぞれの役割を理解できる
- 適切な設定方法を学び、AWS環境のアクセス制御を強化できる
- 実際の設定方法を通じて、**AWS環境をセキュアに保つための基本的なテクニック**を身につけられる


## 【1. セキュリティグループとは？】

**セキュリティグループ**は、EC2インスタンスなどのリソースに対して適用される仮想ファイアウォールです。
インバウンドおよびアウトバウンドのトラフィックを管理し、指定したルールに基づいてアクセスを許可または拒否します。

### セキュリティグループの特徴
- **ステートフル（有状態）**
インバウンドルールを許可すれば、対応するアウトバウンド通信も自動で許可されます。
- **インスタンス単位の適用**
個々のインスタンスに対して直接設定可能で、柔軟なアクセス制御が可能です。
- **許可ルールのみ**
セキュリティグループでは、許可したい通信のみを明示的に設定するため、デフォルトで全てのアクセスが拒否されます。

### セキュリティグループの設定方法
1. **セキュリティグループの作成**
AWSコンソールのVPCメニューから、対象のVPC内に新しいセキュリティグループを作成します。
2. **インバウンド/アウトバウンドルールの設定**
許可するプロトコル、ポート範囲、接続元IPアドレスを指定してアクセス制御を行います。
3. **EC2インスタンスに適用**
作成したセキュリティグループを対象のインスタンスにアタッチして適用します。

## 【2. ネットワークACLとは？】

**ネットワークACL** （NACL）は、サブネット単位で適用されるファイアウォールです。
セキュリティグループと異なり、ネットワークACLは **ステートレス（無状態）** であるため、インバウンドとアウトバウンドのトラフィックルールをそれぞれ設定する必要があります。

### ネットワークACLの特徴
- **ステートレス（無状態）**
アウトバウンドルールも設定が必要で、インバウンドとは別に制御されます。
- **サブネット単位の適用**
同じサブネット内のインスタンス全てに影響を与えます。
- **許可と拒否のルール**
ネットワークACLでは、トラフィックを許可するルールと拒否するルールの両方を設定できます。

### ネットワークACLの設定方法
1. **ネットワークACLの作成**
AWSコンソールから、対象のVPC内で新しいネットワークACLを作成します。
2. **ルール番号の順序設定**
ネットワークACLではルールに番号を割り振り、小さい番号が優先されて評価されます。
3. **サブネットに適用**
設定したネットワークACLを特定のサブネットにアタッチします。


## 【3. セキュリティグループとネットワークACLの違い】

セキュリティグループとネットワークACLには異なる役割があり、それぞれの違いを理解することで、より適切なアクセス制御が可能です。

| 特徴 | セキュリティグループ | ネットワークACL |
|:-----------|:------------|:------------|
| 単位 | インスタンス | サブネット |
| 状態 | ステートフル（有状態） | ステートレス（無状態） |
| ルールのタイプ | 許可のみ | 許可と拒否 |
| デフォルト設定 | 全てのアクセスを拒否 | 全てのアクセスを許可 |


::: note info
【使い分けのポイント】
- インスタンス単位で細かく管理したい場合はセキュリティグループを使用。
- サブネット全体で一律のルールを適用したい場合はネットワークACLが効果的。
:::


## 【4. ベストプラクティス：セキュリティグループとネットワークACLの活用】

1. **最小権限の原則を徹底**
アクセスを許可するルールは必要最低限に抑え、不要なトラフィックの流入を防ぎます。
2. **定期的な監査と見直し**
セキュリティルールの見直しを定期的に行い、不要な設定を削除してセキュリティレベルを保ちましょう。
3. **セキュリティグループとネットワークACLの併用**
複数のレイヤーでアクセス制御を行うことで、より堅牢な防御体制を構築します。


## まとめ

AWS上でのセキュリティ対策として、セキュリティグループとネットワークACLは重要な役割を担っています。これらの仕組みを正しく理解し、適切に設定することで、AWS環境でのアクセス制御を強化しましょう。

セキュリティ強化に役立つと感じたら、ぜひ「いいね」やフォローをお願いします！
ChatGPT 4o-miniを活用した読み飛ばしのない議事メモ作成ツール

## 1. 概要

会議での音声認識テキストは、そのままだと読みづらいと思います。
それをChatGPTやClaudeなどに貼り付けて整形をしますが、文字が多いほど読み飛ばしが多くなります。

そこで、ChatGPT 4o-miniを活用して、400文字ずつ分けてテキスト整形を行い
読み飛ばしのないかつきれいな文章の文字起こしを実現したいと思います。
こちらに誰でもご使用いただけるように公開しました。
（自社の機密情報の取り扱いなどご確認の上ご利用ください）

どんなインプットでも日英の文章に出来ますので、翻訳ツールとしてもご利用いただけます。

https://b_yohgmtnvwt3.v0.build/

タイトルにServiceNowと書いてますが、ServiceNowに関する情報は無く一般的な議事メモ整形ツールとしてご利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/42fec6a7-1934-8800-2cea-c48b20619aec.png)


## 2. 特徴や使い方

1. **日英言語対応**: 日本語と英語の両方で文字起こしの整形が可能です。
2. **カスタマイズ可能**: チャンクサイズ、出力言語、最大トークン数などを調整できます。
3. **用語集機能**: 特殊な用語や略語を事前に登録し、正確な変換を実現します。
4. **デバッグモード**: 処理の詳細情報を確認できるモードを搭載しています。

### 使用方法：

1. APIキーを入力します。
2. 整形したい文字起こしテキストを入力欄に貼り付けます。
3. 必要に応じて用語集を入力します。
4. オプション設定で処理パラメータを調整します。
5. 「整形開始」ボタンをクリックして処理を開始します。
6. 結果を確認し、必要に応じてコピーして利用します。

#### 使用しているプロンプト文
内部はもっと複雑ですが、連続で処理をする要点になるプロントは以下のとおりです。
これを400文字ずつ繰り返しています。その際に、全体感がわかるように要約もプロンプトに入れてます。

```markdown

あなたは会議での字幕翻訳ツールです。次のテキストを臨場感あふれるかつ読みやすく短い日本語にしてください。フィラーワードを削除し、自然で読みやすい日本語の文章に整形してください。全体の要約を参考にして、より詳細な文字起こしを行ってください。用語集に記載されている用語がある場合は、それを優先して使用してください。重要な要素（固有名詞、ネクストアクション、決定事項など）は**太字**にしてください。結果をシステムに表示するため結果以外の文字は必ず削除してください。」「の記号は出力禁止。

全体の要約: {summary}
用語集: {glossary}
処理するテキスト: {input_text}

```

## 3. 処理シーケンス図
1) 初期設定を行う
2) テキストと用語集を入力する
3) 全体要約を作成する
4) 400文字ずつテキストをチャンクに分割する
5) 各チャンクを処理する
6) 結果を統合して表示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/fc402d39-9e52-8d7d-de60-22844560738f.png)


## 4. 入力/出力の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/a4d0fa13-0cca-ef09-f14c-d95314b17bfa.png)

## 5. さいごに

この文字起こし整形ツールを活用することで、会議の内容を迅速かつ正確にまとめることができ、チームの生産性向上に大きく貢献します。また、多言語対応により、グローバルなコミュニケーションの促進も期待できます。

ぜひ、このツールを日々の業務に取り入れ、効率的な情報共有と意思決定の実現にお役立てください。皆さまの生産性が向上することを心から祈っています。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
CakePHPで自クラスの関数を呼び出す方法

# 記事作成の背景
処理の肥大化を抑止するために、共通処理を作り、呼び出し元で使用するための備忘録として作成。

# ズバリ「self::」を使う！
「self::」は、自クラスを表すキーワードです。

こんな感じで使います。
```
self::関数名(引数)

(例)
self::getUserinformation($id)
```

このキーワードを使えば、呼び出し先の関数を使用することができます。

::: note warn
<b>注意</b>
「<b>self::</b>」キーワードを付けないと、呼び出し先の関数が未定義となってしましますので、ご注意ください。
:::

さっそく、ソースコードを見ていきましょう。

userInfoEdit()関数では、ユーザーIDを引数にして呼び出し先の関数「selectUserById()」で特定のユーザー情報を配列にして取得するというものです。

呼び出し元のuserInfoEdit()関数の中では、<b>self::</b>キーワードが使われていますね。

<b>self::</b>キーワードを付けてあげることで、自クラスの関数を呼び出すことができてますね。


```RegistersController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\ORM\TableRegistry;/*追加*/



/**
 * Registers Controller
 *
 * @method \App\Model\Entity\Register[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
class RegistersController extends AppController
{       
    
    public function initialize(): void
    {
        parent::initialize();
        //companiesのDBを指定
        $this->usersTable = TableRegistry::get('users');
        //セッションをセットする
        $this->session = $this->getRequest()->getSession();
        //ページネーションで表示件数を指定
        $this->paginate['limit'] = 10;
    }

    ～(略)～
        //ユーザー情報を更新する
    public function userInfoEdit()
    {
        //HTTPプロトコルがPOST通信であるかを判定
        $this->request->is('post');

        //IDを取得
        $getId = $this->request->getData('targetEditId');
        
        //自クラスの関数を呼び出す
        $targetUser = self::selectUserById($getId);
        //dd($targetUser[0]->name);

        $this->session->write('targetId', $targetUser[0]->id);
        $this->session->write('targetUser', $targetUser[0]->name);
        $this->session->write('targetUserName', $targetUser[0]->username);
        $this->session->write('targetPassword', $targetUser[0]->password);                            

        return $this->redirect(['controller'=>'Registers','action' => 'editok']);                                                      
    }

    private function selectUserById($id)
    {
        $selectUsersTable = TableRegistry::getTableLocator()->get('users');
        $selectUsers = $selectUsersTable
                        ->find()
                        ->select(['id','name','username','password'])
                        ->where(['id'=>$id])->toList();
        //dd($selectUsers);
        return $selectUsers;
    }
    
}
```

ちょっとしたことなんだけど、意外と忘れやすいキーワードなので、ぜひメモっておいてくださいね。

以上です。
liberty フィーチャーをインストール

<h1></h1>

<h3>フィーチャーをインストールできなくて困っていた</h3>

<h3>エラーメッセージ</h3>


```
コマンド bin/installUtility install wmqjmsclient-2.0 を実行して、当該フィーチャーをインストールしてください。 あるいは、コマンド bin/installUtility install defaultServer を実行して、この構成で参照されるすべてのフィーチャーをインストールすることもできます。

```
<h3>ふむふむ</h3>


```
Microsoft Windows [Version 10.0.22631.4317]
(c) Microsoft Corporation. All rights reserved.

C:\Users\kenke>cd C:\pleiades\2022-12\liberty\wlp\bin

C:\pleiades\2022-12\liberty\wlp\bin>installUtility.bat

使用法:  installUtility {download|find|install|testConnection|uninstall|viewSettings|help} [オプション]


C:\pleiades\2022-12\liberty\wlp\bin>installUtility.bat install defaultserver
サーバーが必要とするフィーチャーの欠落がないか検査中...
構成されたリポジトリーへの接続を確立しています...
このプロセスは、完了するまでに数分間かかる場合があります。

構成されたすべてのリポジトリーへの接続が成功しました。

資産をインストールする準備をしています。 このプロセスは、完了するまでに数分間かかる場合があります。
サーバーには次の追加フィーチャーが必要です: wmqJmsClient-2.0 jndi-1.0 webProfile-8.0 localConnector-1.0。  リポジトリー からフィーチャーをインストールしています...

追加の Liberty フィーチャーをこのサーバー用にインストールする必要があります。

追加のフィーチャーをインストールするには、フィーチャーの使用条件を確認して同意してください:
ステップ 1 / 22: wmqJmsClient-2.0 をダウンロード中...
ステップ 2 / 22: wmqJmsClient-2.0 をインストール中...
ステップ 3 / 22: cdi-1.2 をダウンロード中...
ステップ 4 / 22: cdi-1.2 をインストール中...
ステップ 5 / 22: servlet-3.1 をダウンロード中...
ステップ 6 / 22: servlet-3.1 をインストール中...
ステップ 7 / 22: jaxrsClient-2.0 をダウンロード中...
ステップ 8 / 22: jaxrsClient-2.0 をインストール中...
ステップ 9 / 22: jaxrs-2.0 をダウンロード中...
ステップ 10 / 22: jaxrs-2.0 をインストール中...
ステップ 11 / 22: servlet-3.0 をダウンロード中...
ステップ 12 / 22: servlet-3.0 をインストール中...
ステップ 13 / 22: jaxrs-1.1 をダウンロード中...
ステップ 14 / 22: jaxrs-1.1 をインストール中...
ステップ 15 / 22: servlet-5.0 をダウンロード中...
ステップ 16 / 22: servlet-5.0 をインストール中...
ステップ 17 / 22: servlet-6.0 をダウンロード中...
ステップ 18 / 22: servlet-6.0 をインストール中...
ステップ 19 / 22: restConnector-1.0 をダウンロード中...
ステップ 20 / 22: restConnector-1.0 をインストール中...
ステップ 21 / 22: インストール済みフィックスを検証中...
ステップ 22 / 22: 一時ファイルをクリーンアップしています...


すべての資産が正常にインストールされました。

製品妥当性検査を開始します...
製品妥当性検査が正常に完了しました。

C:\pleiades\2022-12\liberty\wlp\bin>
```
デュアルブートできるLiveUSBを作る

# はじめに
LinuxのLiveUSBを作成したときに、USBメモリの領域が余るのはもったいないので、余計な物を詰め込んでみました。
以下はその作業を簡単にまとめたものです。

:::note alert
警告
この記事には、使用中のPCのデータを破壊し得る操作が記述されています。
この記事が原因で発生したデータの損失について筆者は補償できません。
:::

### 目的
+ USBメモリの有効活用
+ Linuxのブートプロセスについて学んだのでおさらい

### 機能
+ 2種類のLinuxのデュアルブートおよび、ユーザーデータの用途で使用可能
+ `Linux Mint` + `Tiny Core Linux`の組み合わせのみサポート
組み合わせによっては干渉等によって起動しない可能性がある

### 用意するもの
+ 作業用PC(Ubuntu 20.04)
+ USBメモリ(8 GiB以上)
+ 平常心

# USBメモリの準備
`gparted`を使用して、USBメモリを以下の4つの領域に分割する(パーティション)。
パーティションテーブルはgpt(GUID)とする。
1. ブート領域
2. Linux Mint
3. Tiny Core Linux
4. 余り

### ブート領域
先頭の100 MiBはブート用の領域とする。
fat32でフォーマットした後、`フラグを編集`でboot、espフラグを有効にする。

### Linux Mint
LiveCD用のisoファイル+マージンのサイズがあれば良い。執筆時点では3GiB程度。
ext4でフォーマットする。

### Tiny Core Linux
100 MiB程度で良い。追加する機能によってはその限りではない。
ext4でフォーマットする。

### 余り
残った領域は自由にフォーマットして使用して良い。

# イメージファイル
LiveCD用のisoファイルの内容をUSBメモリにコピーする。

+ isoファイルおよび、USBメモリをマウントする
+ isoファイルは`nautilus`から右クリックして`ディスクイメージマウンター`を起動する
+ USBメモリは`gnome-disks`を使用するのが良い
+ マウント先は`gnome-disks`で確認できる。コピーの実行例は以下の通り
```bash
cd /media/<ユーザー名>
ls -a ./<ISOファイルのディレクトリ>
# TODO: 必要なファイルと不要なファイルを区別する
sudo cp -r ./<ISOファイルのディレクトリ>/* ./<USBメモリの領域>/ 
sudo cp -r ./<ISOファイルのディレクトリ>/.disk ./<USBメモリの領域>/ 
```


# ブートローダー
USBメモリにブートローダーを書き込む。

1. `Linux Mint`および`Tiny Core Linux`の`<マウント先>/boot/grub/`に`grub.cfg`があることを確認する
1. USBメモリのブート領域をマウントする
1. 以下のコマンドでGRUBをインストールする
1. `<ブート領域>/boot/grub/`に以下の内容で`grub.cfg`を作成する
UUIDは`gnome-disks`または`gparted`で確認できる。

```bash:GRUBインストール方法
sudo grub-install --target=x86_64-efi --efi-directory=/media/<ユーザー名>/<ブート領域> --boot-directory=/media/<ユーザー名>/<ブート領域>/boot --removable
```

```text:grub.cfg
insmod all_video

if loadfont unicode ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=ja_JP
  insmod gettext
fi
terminal_output gfxterm
    
set color_normal=white/black
set color_highlight=black/light-gray

set timeout_style=menu
set timeout=30

insmod search_fs_uuid
insmod part_gpt
insmod ext2
	
menuentry "Linux Mint" {
	search --no-floppy --set=root --fs-uuid <Linux Mint領域のUUID>
	configfile /boot/grub/grub.cfg	
}

menuentry "Tiny Core Linux" {
	search --no-floppy --set=root --fs-uuid <Tiny Core Linux領域のUUID>
	configfile /boot/grub/grub.cfg	
}
```

# 動作確認
作業用PCがUSBメモリからブート可能な設定となっているならば、この段階で再起動すればLiveUSBから起動できる。
あるいは、USBメモリをアンマウントして他のPCから起動しても良い。

# おまけ
Linuxのブートについての豆知識を用語集っぽくまとめました。

|用語|説明|
|:--|:--|
|ファームウェア|基板上のチップに焼き込まれたプログラム。電源投入すると最初に起動する|
|BIOS|PCに搭載されたファームウェア|
|UEFI|Intelが策定したBIOSに関する規格。この世には二種類のBIOSがある。UEFIに対応したものと、旧時代の遺物だ。|
|ブートローダー|ファームウェアとOSのつなぎとなるプログラム。ブートローダーが使用される理由は様々である。実は、条件さえ整えばUEFIからLinuxを直接起動できる|
|GRUB|Linux向けに広く使われるブートローダー。Ubuntuをインストールすると付いてくる|
|isolinux|LiveCDに入っているブートローダー。今回は無視した|
|Linux・カーネル|いわゆるOSの中核をなすプログラム。PCが起動している間常駐して、様々な雑事を引き受ける。|
|vmlinuz|Linuxの実行ファイルを圧縮したもの|
|initrd・initramfs・初期RAMディスク|Linux起動時に読み込まれているファイルシステム。ルートファイルシステムをマウントするまでのつなぎとして使われることが多い。LiveCDでは魔改造されている|
|PCの起動|PCが起動したと言えるタイミングは何時か?これは深い問いである。ブートローダーがLinuxを起動したとき、Linuxがsystemdを起動したとき、ログイン画面が表示されたとき(sshdやディスプレイマネージャー等)、考え方によって様々|
Windows PCのUSB-HDDの電源を切れなくする方法

Windows PCのUSB-HDDの電源が自動で落ち、HDDにアクセスすると電源がONになるまで30秒ぐらい待たされてイライラする、といった経験をされている方は多いかと思います。

この現象の対処方法を調べると、Windowsの機能「USBセレクティブサスペンド」を無効化する、といった方法がたくさん出てきます。今回は、これらを試しても改善しなかった場合の対処方法を紹介します。

## 現象

かくいう私も、USBセレクティブサスペンドの無効化や、レジストリをいじる方法など、検索で出てきた方法を一通り試したのですが、改善の兆しが全く見られませんでした。
PC環境は以下です。

- OS: Windows 11 Home
- CPU: AMD Ryzen 7 3700X
- マザーボード: PRIME B550M-K (ASUSTeK COMPUTER INC.)
- USB-HDD: WD Elements 25A3 (10TB)

AMDのCPUがwindowsと相性が悪いのか、WesternDigital製HDDに特殊な設定があるのか、原因はわかりませんが、とにかく、何をやってもダメでした。HDDにアクセスするとエクスプローラが30秒ぐらい固まる現象が度々発生し、ストレスがたまる日々を過ごしてました。

## 対処方法

ようやくたどりついたのは、シンプル、かつ、原始的な方法ですが、

:::note info
一定時間毎にUSB-HDDに自動アクセスする
:::

です。

これを具体的にどう実現するか、は、色々なやり方があると思いますが、今回は以下方法で実現しました。

:::note info
USB-HDDにテキストファイルを出力するスクリプトを、
WSL2+Ubuntuのスケジューラcronで定時実行
:::

WSL2、Ubuntuのインストール手順は、長くなってしまうので省略します。
以下記事等を参照してインストールしてください。

https://qiita.com/hiohio25/items/f12be83e817c87cf09b9

WSL2、Ubuntuのインストール後の手順は以下です。
1. USB-HDDに自動アクセスするスクリプトを作成
1. スケジューラcronの有効化
1. スクリプトをcronに設定

### 1. USB-HDDに自動アクセスするスクリプトを作成

ファイル名／保存場所は適当でOKです。
テキストファイルの中身は何でもよいですが、テキストファイルを出力する場所は、

:::note info
ターゲットとなるUSB-HDD内
:::

にします。

以下例は、現在時刻をテキストファイル（hdd_accessed.txt（※名前は任意））に出力する処理です。
ターゲットとなるUSB-HDDがFドライブだったので、``/mnt/f/``以下にテキストファイルを出力するようにしてます。
```diff_shell:hdd_access.sh
#!/bin/bash
echo `date` > /mnt/f/work/hdd_accessed.txt
```

### 2. スケジューラcronの有効化

WSL2　Ubuntu内で、/etc/wsl.confを以下内容で作成し、wslを再起動`` wsl --shutdown``すれば有効化できます。
```diff_shell:/etc/wsl.conf
[boot]
systemd=true
```

### 3. スクリプトをcronに設定

WSL2　Ubuntuのターミナル上で``crontab -e``と入力すると、テキストエディタが起動するので、末尾行に以下を入力します。

```diff_shell:crontab -e
*/10 * * * * /mnt/f/work/hdd_access.sh
```

行頭の``*/10``が、「10分毎」という設定です。10を20にすれば、20分毎、にできます。その後は「*」を4つ書いた後に、上述で作成したスクリプトファイル名をフルパスで書きます。

詳細な書き方は、以下記事等が簡潔にまとめられてわかりやすかったです。

https://qiita.com/yamikoo@github/items/64c7cd6f2918311a5b0c

これで、スクリプト（hdd_access.sh）が10分毎に実行され、USB-HDDに10分毎に自動アクセスするようになり、USB-HDDの電源が切れることがなくなりました。

:::note warn
なお、WSL内のスケジューラcronは、PC起動後にWSLを一度でも起動しないと動作しません。

なので、日常的にWSLを使ってない方は、スタートアップフォルダにWSL+Ubuntuターミナルのショートカットを置くなど、PC起動後に必ずWSLが起動するような一工夫が必要です。

起動したWSL+Ubuntuターミナルウィンドウは、「×」ボタンで終了しても、cronは動き続けます。
:::

## おわりに

今回の対処方法は、やること自体は原始的でシンプルなのですが、具体的な実現方法が、WSLやLinuxに馴染みのない方にはとっつきづらい方法となってしまいました。最近、会社でたまたま、cronを使った定時実行をやったので、こちらの方法を実施しました。

Windows標準のタスクスケジューラやバッチファイルを使ったやり方で実現できれば、実現のハードルがかなり下がると思うので、そちらのやり方が確立できれば、また投稿しようと思います。

（後記）以下に、Windows標準のタスクスケジューラを使ったやり方をUPしましたので、ぜひご覧ください。

https://qiita.com/shima202102/items/2f9321cc20b04692fcc5
Spring Bootをマスターするまでのロードマップ

# はじめに
業務でSpring Bootを使って、REST APIの開発する予定なので、マスターするまでのロードマップを生成AIに聞いてまとめてみました。

私のスキルレベルはこんな感じ
- Javaは学生の頃からちょくちょく触ってて、業務でもコーディングはしてきた。(半年 ~ 1年未満)
- Spring Bootに関しては、1ヶ月程度研修で勉強したレベル (1年前ぐらい)　　
DIコンテナあたりの概念は知ってて、超基本的な実装だったらできるつもり

# 生成AIに質問してみた
こんな感じで質問してみました、結構良さそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561504/7ac57199-03d0-6c82-7200-2340bc448d87.png)

# 作成したロードマップ
内容精査して、整理してみた。ねずみ色はこれから学習しようと思っていること。
苦手意識があり、注力してしっかり勉強したいことは赤色にしました。
※括弧内は到達レベルの目標です。
## 基本編 (ゴムゴムのピストルが打てるぐらい)
この辺の知識は、割と既に知っていることが多いので、サクサク勉強が進みそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561504/ab0b2026-60da-028e-d14c-3150687a5fb9.png)

## 中級編 (ギアセカンドが使えるぐらい)
ここが一番勉強することが多い感じ。
でもここら辺抑えないと業務で使うことはできないと思うので、苦手意識克服してギアセカンド習得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561504/de663e5a-0aff-c144-a7a9-d2507a985d0d.png)

## 上級編 (覇気が使えるぐらい)
リアクティブプログラミングに関しては聞いたことがありません。Redisあたりは勉強したいと思っていたので、ちょうどいいかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561504/1bcf5707-0443-99f0-48a0-ac04f21448e5.png)

# 最後に
ざっと整理したら、意外といい感じ！
Udemyとか、書籍を使って基本編は11月中、上級編は年内にマスターできるように学習していこうと思います。

Spring Boot勉強したい！と思っている人がいたらぜひ参考にしてみてください。