OmniAICreator/Qiita-1.07M huggingface dataset:
資料作成で私が大事にしていることと、参考書籍のご紹介

こんにちは。Crane＆Iの藤島です。
本日は、「プレゼンテーション資料作成」に有益と感じた書籍のご紹介をしてみようと思います。

# 最初に
仕事柄、私は資料作成をすることが多くあります。
社内研修用の資料であったり、営業資料、採用資料、社内向けの説明資料、エグゼクティブ向けの提案資料等、様々なプレゼンテーション資料作成を行います。

たまに、社員の方に「なんでそんなに資料うまく作れるんですか」と聞いていただけることがあります。
とても嬉しいと思いますが、もっともっと上手な資料作りをされる方は山ほどいらっしゃるので、おこがましくも感じつつ、せっかくそのように言ってくださるのであればと。
少しだけ紐解いて言語化できないかなと考えてみた次第です。

そんなわけで、自分なりの持論ではありますが、参考になりそうな要素を纏めてみたいと思います。


結論から申し上げますと、私が資料作りの時に意識しているのは以下の3点です。
**①ストーリー性**
**②デリバリー性**
**③デザイン性**

それぞれの観点と、それの参考となりそうな書籍を合わせて紹介していきますね。

## ①ストーリー性
1つ目の要素は、「ストーリー性」です。
資料は、結論が大事です。
結論と、それに紐づく要素が、どれだけ繋がりをもち、理解が出来るか。という点がとても重要です。
この観点が、ストーリー性だと考えています。

私が資料を作る際に、最初に使うのはA4の白い紙です。
昔は、資料作りと言ったらまずPowerPointを起動していたのですが、いろんなことを学んでいった結果、PowerPointの起動は一番最後にするようになりました。
作成の流れは以下のような感じです。

#
A4用紙に殴り書きをする
↓
PCのメモ帳に全体の流れを纏める
↓
メモ帳の内容を区切って、小さなまとまりを作る
↓
小さなまとまりを、入れ換えたり作り替えたりして、話の趣旨が伝わりやすい構成を検討する
↓
大体流れが決まったら、PowerPointを開き、まとまり毎のページを作成していく
↓
全体の違和感がないかどうかをチェックする

https://amzn.asia/d/0hjrKS4N

この書籍は、目的からゴールまでの組み立て方をわかりやすく説明をしているなぁと感じた書籍になります。


## ②デリバリー性
2つ目の要素は、「デリバリー性」です。
あまり聞いたことがない要素だと認識されることも多く、このお話をすると「デリバリーって何ですか？！」という反応もしばしば。
デリバリーは、あのデリバリーです。「届ける」ということ。
いくら作りこんでも、伝えたいことが伝わらない資料はとても勿体ないと感じます。
届けるということは、相手が分かる解釈にする、相手に情報が届く。という観点が満たされていることがとても重要です。


https://amzn.asia/d/08klJTc1

https://amzn.asia/d/0atIvhaB

2つほどお勧めの書籍を載せましたが、セミナー講師とかいう「資料作りか・・・？」と思われるようなタイトルですね。ですが、一般的に不特定多数の沢山の人に、「情報を届ける」という観点では非常に参考になった書籍です。
デリバリーという言葉は、3つの中でもキーワードとしてはマイナーですが、個人的に一番大事にしているのはこの要素だったりします。

## ③デザイン性
最後の要素は、「デザイン性」です。
これは分かりやすいですね。いかに格好良い資料に装飾が出来るか。
私も凝り始めたらもう止まりません(笑)
ですが、取り組むのは最後にしています。
伝えたいことが明確になり、伝えたいことが伝わる構成や表現になり、そして最後のこの装飾です。
1番目、2番目の要素が満たされているからこそ、資料はデザインで光るのだと私は考えます。

https://amzn.asia/d/04UT9p9b

これ、最近買ったんですけどね。
マジお勧め。もっと早く出会いたかったです。
（2024年3月発売だから、最近じゃなければ出会えませんでしたが(笑)）
それぞれのページ構成ごとに、レイアウトを視覚的に見ることが出来ますし、通常のPowerPointの機能だけで、結構格好良い表現ができるようになります。
デザインのアイディアが浮かんでこない方は、ぜひ読んでみてください。
パラパラめくってるだけでインスピレーションわいてきますよ。

# まとめ
改めて、結論を申し上げますと、私が資料作りの時に意識しているのは以下の3点です。

**①ストーリー性**
**②デリバリー性**
**③デザイン性**
それぞれは似ているようで違う観点なので、ぜひ意識してみてくださいね。

#
今日は、資料作成の際に活用できそうな考え方と、参考書籍について書いてみました。
プレゼンテーション資料を作るだけではなく、上司への報告や、後輩への教え方などにも使えるスキルだなと思うので、良ければ参考にしてみてください。

最後までお読みくださりありがとうございました。
また次の記事でお会いしましょう。
[ROS2] １つのコールバック関数で複数Topicからのデータを処理したい

# はじめに
ROS2での開発をしていると複数センサの出力にセンサごとに異なる処理を施して３次元地図データのような一つの大きなデータにしたいときがあると思います（僕にはありました）．
例えば，Lidarとステレオカメラからそれぞれ取得したポイントクラウドをセンサ特性を考慮した前処理を加えて３次元地図構築処理に入力するといった具合です．
今回はそうした場合に対応するための方法を模索したのでそれを共有しようと思います．

# 方法
今回は具体的なコード（コンパイルしてすぐに使えるもの）ではなく要点だけ書いたコードで説明します．

以下のようなデータ処理を行う基底クラス`ProcessorBase`があるとして，これを継承した`Processor1`, `Processor2`, `Processor3`があるとします．

```c++
class ProcessorBase
{
public:
    // センサデータに何らかの処理を行う関数
    virtual void process(/*args*/) = 0;

    /**
    * コンストラクタ, デストラクタ,その他必要な関数と変数の宣言，定義
    */
};

class Processor1: public ProcessorBase
{
public:
    void process(/*args*/) override

    /**
    * コンストラクタ, デストラクタ,その他必要な関数と変数の宣言，定義
    */
};

/**
* Processor2, 3の宣言,定義が続く
*/
```

そして，サブスクライブしたデータを上記のクラスを利用して処理をかけるノードを以下のように書きます．
今回は`sensor_msgs::msg::PointCloud2`を受け取るとします．
```c++:node.hpp
class ProcessorNode: public rclcpp::Node
{
public:
    ProcessorNode(rclcpp::NodeOptions options)

private:
    std::vector<rclcpp::Subscription<sensor_msgs::msg::PointCloud2>::SharedPtr sub_point_clouds_;
    void callbackPointCloud(const sensor_msgs::msg::PointCloud2& msg, const size_t processor_no);

    std::vector<std::shared_ptr<ProcessorBase>> processors_;
};
```


```c++:node.cpp
ProcessorNode::ProcessorNode(rclcpp::NodeOptions options)
: rclcpp::Node("my_node", options)
{
    processors_.push_back(std::make_shared<Processor1>(/*args*/));
    processors_.push_back(std::make_shared<Processor2>(/*args*/));
    processors_.push_back(std::make_shared<Processor3>(/*args*/));

    for (size_t i=0; i<3; ++i)
    {
        sub_point_clouds_.push_back(
            create_subscription<sensor_msgs::msg::PointCloud2>(
                "input/point_cloud"+std::to_string(i), rclcpp::QoS(1), 
                [this, i](const sensor_msgs::msg::PointCloud2::UniquePtr msg)-> void
                {
                    this->callbackPointCloud(*msg, i);
                }
            )
        );
    }
}

void ProcessorNode::callbackPointCloud(const sensor_msgs::msg::PointCloud2& msg, const size_t processor_no)
{
    processors_[processor_no]->process(msg, /*args*/);

    /**
    * 他の処理
    */
}

/**
* その他関数の定義
*/
```

# 説明
ポイントは`callbackPointCloud`をそのままサブスクライバのコールバック関数に登録するのではなくて，ラムダ式で定義されたコールバック関数の中でどのセンサのデータか（どのトピックが受け取ったか）を判別するための引数を追加して`callbackPointCloud`を呼び出すということです．
直接`std::bind(&ProcessorNode::callbackPointCloud, std::placeholders::_1, i)`のようにサブスクライバーのコールバック関数を与えることもやってみたのですが，サブスクライバーに登録できるコールバック関数は受け取ったメッセージ１つだけを引数にとる関数だけに限定されているような感じがしました（ビルドしてエラーがでた程度の認識なので，詳しい実装内容をご存知の方がいらっしゃればコメントしてください）．

# 終わりに
今回は同じ処理を受け取るデータのソース（トピック名）で分けるようなサブスクライブ時のコールバック関数の登録について書いてきました．かなり抽象的なコードになっていますが要点は**ラムダ式を一度かませてどのトピックから受け取ったかを判別するための引数を追加する**というところだけになっています．
また，`filters`というROS2ライブライの実装方法を真似るとパラメータファイルからセンサ処理の方法や処理系の数を変えることができるのでソースが1つでも２つでもリビルドなしに実行できます（気が向いたらこのことについても記事を書いてみようかな）．

## 2024/8/1追記
複数のノードで１つのトピックにデータをパブリッシュすることができるそうです．もしもメッセージから`frame_id`などを利用してどのノードからのトピックかが判別できるなら，このような面倒なことをしなくても良いかもです．

ここまで読んでいただきありがとうございました．ご参考になればと思います．
なにか改善点，不明点や誤りがあれば教えてください．
【DAY10】パッケージについて

# パッケージとは
パッケージとは、ソフトウェアやプログラムなどのコンポーネントやリソースをまとめた単位です。
システムやアプリケーションのインストール、アップグレード、削除を容易にするために使用されます。

## パッケージの構成要素
* 実行プログラム
インストールされたプログラムを実行するためのバイナリ実行可能ファイル

* ライブラリ
共有ライブラリやモジュールなど、他のプログラムから共有されるコードのコレクション

* 設定ファイル
インストールされたソフトウェアの設定や構成情報を格納するファイル

* ドキュメント
パッケージに関するドキュメント、マニュアル、ライセンス情報など

* 依存関係
パッケージが依存する他のパッケージやライブラリ

## yumコマンド
yumは、RPMパッケージを扱うためのパッケージ管理コマンドです。
基本的なものには以下のようなコードがあります。
yum install パッケージ名
yum update パッケージ名
yum erase パッケージ名
【DAY9】AWS Coud9について

# AWS Cloud9とは
「AWS Cloud9」とは、AWSが提供するサービスの一つで、クラウド環境でアプリケーションの開発やデータベースなどの利用が可能な統合開発環境(IDE)です。
## AWS Cloud9を利用するメリット
### ブラウザ上のみでコードを記述できる
AWS Cloud9はクラウドベースのサービスであるため、クラウド環境のみで開発環境を作れます。場所を問わず、どこからでも作業ができます。
### リアルタイムで共同作業ができる
AWS Cloud9はペアプログラミング機能を有しており、効率的に作業できます。
ペアプログラミングとは、単一の環境で2人のユーザーが一緒に同じコードに対して作業することを指します。
【DAY8】OSについて

# OSとは
OSはOperating Systemの略で、パソコンの操作やアプリを使うために必要なソフトウェアのことを指します。OSはコンピュータ全体の動作を管理、制御して人間がコンピュータを使えるようにする役割があります。
OSはコンピュータが動作するために必要となるソフトウェアであるため基本ソフトウェアとも呼ばれます。一方で、ゲームやワープロソフトなど各機能を提供するソフトウェアは応用ソフトウェア（アプリケーション）と呼ばれます。
## OSが必要な理由
OSはPCやスマホ端末を使えるようにするために必要なソフトウェアであり、OSがないとPCやスマホで以下のような操作をすることができません。
* 電源のオンオフ
* キーボードでの文字入力
* マウス操作
* CPUの制御

## Windowsについて
WindowsはMicrosoft社が開発したPCのOSで、トップシェアを誇っています。GUI機能に優れており操作性も高いという特徴があります。また、利用ユーザーが多いため、ソフトウェアの開発もWindowsに対応したものが多く使えるソフトウェアが多いという特徴もあります。一方で、利用者が多いゆえにウイルスが広まりやすいという側面もあります。

## Linuxについて
Linuxは、リーナス・トーバルズ氏が開発したPCのOSです。オープンソースであるため無料でインストール可能です。また、自分がカスタマイズしたものを再配布することもできます。
Linuxはグラフィック関連の処理負荷が少ないため動作が軽く、安定性があります。一方、マウス操作はしづらくコマンド入力に慣れている必要があります。
【DAY7】AWS 、GCP、Azureの違い

## AWSの特徴
AWSは最も広範なサービスを提供しており、クラウドサービスの中でもトップシェアを誇ります。
また、データセンターは世界中に分散されており、日本語によるサポートも24時間365日受けることができます。

## GCPの特徴
GCP(Google Cloud Platform)はビッグデータの処理やAI、機械学習の開発に優れたサービスに強みを持っています。
また、Googleが運営しているためGoogle社内で利用されているインフラ環境・技術を利用できます。

## Azureの特徴
AzureはMicrosoftが提供しているクラウドサービスであるため、Microsoft製品との相性がよく、様々なアプリケーションやサービスとの連携や移行が可能です。
また、Azureはオンプレミス環境とクラウド環境の両方に対応しており、高いセキュリティ機能も備えています。
【DAY6】サーバーについて

# サーバーとは
サーバーとは、データや情報などの「コンテンツを提供するコンピューター」のことを指します。
「提供する存在」であるサーバーの対義語は、「要求する存在」である「クライアント」です。

## サーバーの例
サーバーぼ種類として、具体的には以下のようなものが挙げられます。
* DNSサーバー
* ウェブサーバー
* メールサーバー
* ファイルサーバー

例えば、ウェブサーバーはパソコンなどのクライアントから「このページが見たい」という要求を受け、そのページを表示するのに必要なHTMLファイルや画像を提供します。

## 汎用PCとサーバーの違い
PCは、複数人が同時に使うことはあまりなく、また24時間365日稼働し続ける必要もありません。
一方で、サーバーは同時に多くの人がアクセスする可能性があるため、それを捌くことができるサーバー用のCPUが求められることが多いです。また、強固な耐久性も求められます。「冗長化」というバックアップを備えた電源や、データを分散保存することで速やかなリカバリーを可能にする「RAID」機能なども必要になります
【DAY5】AWSのアカウント、ユーザーについて

# AWSアカウント
AWSにおけるアカウントとは、「ひとつひとつの環境のこと」を指しています。
利用者はそのアカウントの範囲内でVPCやEC2といったAWSリソースを複数持つことが可能です。

# rootユーザー
rootユーザーとは、AWSアカウントの作成時に作成されるものです。
アカウント内の全てのAWSサービスとリソース、請求情報についてフルアクセス権限を持ったユーザーになります。

# IAMユーザー
IAM(AWS Identity and Accecc Management)は、AWSリソースへのアクセスを安全に管理するためのサービスです。
IAMユーザーはAWSアカウント内での権限をカスタマイズできるユーザーになります。
IAMポリシーをアタッチすることで権限のカスタマイズができるようになります。

## アカウントとユーザーの違い
アカウントというと直感的には個人のものを想像すると思います。(Googleアカウントなど)
しかし、AWSにおけるアカウントはAWS環境のことを指します。
そして、Googleアカウントのような個人のものがユーザーに当たります。
paiza Bランク問題「3Dプリンタ」を Elixir で解いてみた

## はじめに

paiza B ランク問題を Elixir で解いてみます

## 3Dプリンタ

`#` でブロック、 `.` で空白を表す３次元の設計図が与えられます

入力はXY平面の層（３次元ブロックを上から見た平面図）が複数与えられ、X方向から見た立面図を出力します

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/3d_printer

```elixir
defmodule Paiza do
  def main do
    [x, y, _z] =
      :stdio
      |> IO.read(:line)
      |> String.trim()
      |> String.split(" ")
      |> Enum.map(&String.to_integer(&1))
 
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.split("--")
    |> Enum.map(fn layer ->
      layer
      |> String.trim()
      |> String.split("\n")
      |> Enum.map(&String.codepoints(&1))
    end)
    |> Enum.reverse()
    |> tl()
    |> Enum.map(fn layer ->
      # 一旦座標のマップに変換する
      map =
        layer
        |> Enum.with_index()
        |> Enum.flat_map(fn {row, x_index} ->
          row
          |> Enum.with_index()
          |> Enum.map(fn {block, y_index} ->
            {{x_index, y_index}, block}
          end)
        end)
        |> Enum.into(%{})

      0..y-1
      |> Enum.map(fn y_index ->
        # X 方向の最小値を取得する
        0..x-1
        |> Enum.map(fn x_index ->
          Map.get(map, {x_index, y_index})
        end)
        |> Enum.min()
      end)
      |> Enum.join("")
      |> IO.puts()
    end)
  end
end

Paiza.main()
```

## 解説

最初の行に X, Y, Z の領域（最大値）が入っています

それより後の行を `--` で区切ると Z 方向に並んだ各層の平面図が取得できます

各平面図を改行で区切ると Y 方向に並んだ１行分になります

さらに `String.codepoints` で文字毎に分割すると一つ分の座標の値（`#` か `.`）が得られます

入力は下から順に与えられますが、出力は上から順に行うため `Enum.reverse` で逆転させ、 `tl`で余計な空の層を捨てます

各層で X 方向に一つでも `#` があれば立面図上は `#` になります

`#` は `.` より小さいため、  X 方向に最小値を取得します

## まとめ

Nx が使えれば行列演算もできるのですが、仕方ないですね
（全て数値化しないといけないという問題もありますが）
rails7で、Stimulusを使う

## はじめに
自分用の学習メモです。
Stimulusを使って、クリックすると色が変わるボタンを実装します。

## 実装
bootstrapを使って、ボタンを実装します
```rb
  <div class="btn btn-primary m-5">ボタン</div>
```
　　
Stimulusコントローラを作成します。
```rb
rails generate stimulus btn
```
これで、app/javascript/controllers/btn_controller.jsというファイルが作成されます。

```js
import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="btn"
export default class extends Controller {
  connect() {
      console.log("こんにちは！")
  }
}
```
　　
HTMLにStimulusコントローラを適用するには、データ属性を使用します。div要素にdata-controller="btn"を追加します。
```rb
  <div class="btn btn-primary m-5" data-controller="btn">ボタン</div>
```
コンソールに、こんにちは！が出力されれば成功です。
<br>
data-btn-target="btn"を追加します。
```rb
<div class="btn btn-primary m-5" data-controller="btn" data-btn-target="btn">ボタン</div>
```
この属性により、btnコントローラの中で特定のHTML要素をターゲットとして識別できるようになります。

<br>
btn_controller.jsにclassを変更するメソッドを追加します。

```js
export default class extends Controller {
  static targets = ['btn'];

  change_color() {
    const btn = this.btnTarget;
    if (btn.classList.contains('btn-primary')) {
      btn.classList.replace('btn-primary', 'btn-success');
    } else if (btn.classList.contains('btn-success')) {
      btn.classList.replace('btn-success', 'btn-danger');
    } else if (btn.classList.contains('btn-danger')) {
      btn.classList.replace('btn-danger', 'btn-primary');
    }
  }
}
```
replace(変更前のclass,変更後のclass)ここで、classを変更して色を変えています。

<br>

```rb
 <div class="btn btn-primary m-5" data-controller="btn" data-btn-target="btn" data-action="click->btn#change_color">ボタン</div>
```
data-action="click->btn#change_colorを設定し,この要素をクリックすると、btnコントローラのchange_colorメソッドが呼び出されます。

## 最後に
これで、クリックすると色が変わるボタンを実装できました。
VSCodeでプロジェクト全体をコンパイルチェック対象にする（VSCode付属TS版）

VSCodeでプロジェクト全体をコンパイルチェックする方法です。

以前 [VSCodeをエディタにしたTypeScript環境を構築する](https://qiita.com/msh0x01/items/ed8f150c291b6f283ae9) で記載した方法がありますが、今回は別の方法を紹介します。

今回はVSCode付属のTypeScriptでプロジェクト全体をコンパイルチェックする方法になります。

VSCodeは[Using newer TypeScript versions](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions)に記載がある通り、TypeScriptを付属しています。

tsファイルをVSCodeで開くと右下に { } があり、マウスカーソルをあてるとVSCode付属のTypeScriptのバージョンが確認できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/f8614439-386b-766a-4d52-c73b0eea5df4.png)

さらに「Select Version」にマウスカーソルをあてるとTypeScriptの配置先が確認できます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/6e33a7fd-cc69-865a-19e0-a11416f48a6b.png)

VSCode付属のTypeScriptのおかげで明示的にTypeScriptをインストールしなくてもコンパイルチェックや入力補完が行われるというわけです。

Playwrightでテストコードを書く場合など、付属のTypeScriptを使えば十分な場合に使っています。

デフォルトだと、開いているtsファイルのみがコンパイルチェックされ、TypeScriptの恩恵を受けにくいです。

プロジェクト全体をコンパイルチェックするには、settings.jsonに以下を追記します。
```json
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
```
追記のしかたは以下の通りです。
1. Ctrl + Shift + Pでコマンドパレットを表示します
1. "open user settings (json)"を検索します
1. settings.jsonが開くので、上に挙げた設定を追記します

加えて、tsconfig.jsonをプロジェクトフォルダ直下に配置します。内容は以下でよいです。
```json
{
    "compilerOptions": {
    }
}
```
この設定はtsconfig.jsonがないと有効になりません。

以下のように開いていないtsファイルもコンパイルチェックされるようになります。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/c44aaf98-f1ab-83ca-a385-f89eb6e5d0b7.gif)

ただし、設定キーに"experimental"とある通り実験的機能です。

ファイルコピーしたときなど、コンパイルチェックがおかしくなることがあります。

その場合、VSCodeを開きなおすと、直ります。

マウスでVSCodeを開きなおすのは面倒くさいので、ショートカットキーを使うと楽です。
1. Ctrl + Shift + Pでコマンドパレットを表示します
1. "Reload Window"を検索します
1. Enterを押します
1. 次回以降は"Reload Window"が最上位にあります
<hr />

【参考】
[Vscode doesn't show typescript errors if file isn't opened](https://stackoverflow.com/questions/76263988/vscode-doesnt-show-typescript-errors-if-file-isnt-opened)
アフェリエイターへの道（２）システム構想

https://qiita.com/EasyCording/items/6f874f6fd66ee48b0558

この休み中のマイルストーンを書いてみた

# 自動記事生成システムの構築計画

| 日付 | 主なタスク | 詳細 |
|------|------------|------|
| 7/29 (月) | 環境整備 | - 自宅LAN見直し（WiFiルーター追加）<br>- NAS設定の検討<br>- PCデスクトップ環境の見直し |
| 7/30 (火) | 作業環境改善 | - PCチェアの検討<br>- リモート接続問題の調査 |
| 7/31 (水) | NAS上のWordPress公開検証 | - Synology-WordPressをWEB上に公開すること |
| 8/1 (木) | WordPress設定 | - ブログRSSのインポート、逆の他ブログへのエクスポート検証 |
| 8/2 (金) | CLAUDE-API統合 | - APIクライアント実装<br>- 基本的なプロンプト設計 |
| 8/3 (土) | WordPress連携機能開発 | - WordPress REST APIの基本理解<br>- 簡単な投稿スクリプトの作成 |
| 8/4 (日) | アフィリエイト広告基礎 | - アフィリエイト広告の基本概念理解<br>- 広告挿入プラグインの探索 |
| 8/5-8/7 | 旅行 | アイデアの熟成期間 |
| 8/11 (日) | トリガソースＡＰＩの調査||
| 8/19 (月) | 会社復帰 | - 休暇中の成果を仕事に活かす準備<br>- 学んだことの共有準備 |

# WordPress
1. WordPress 実際に記事を書いてみて、投稿から公開までの流れを体験する
1. RSSインポートでブログ記事を取り込む方法
1. 全ブログをWordpress化、ブログへの逆投稿自動化
1. 各種情報からの自動トリガ発行
1. RAGエンジンによる投稿品質の向上
1. 内部自己リンク多重化によるアクセス数増大

# 課題感

やや先行きが長いが仕方なし、無料にこだわり自作すること
一般ブログサイトの広告なしサービス（有料）に対して、どこまで優位性が保てるのか
WORDPRESS-API、生成AI-APIを、どこまでPythonで連携できるのか


```plantuml

@startuml
!define RECTANGLE class

RECTANGLE "データ収集" as DataCollection {
  [ウェブスクレイピング]
  [APIからのデータ取得]
  [ユーザー入力]
}

RECTANGLE "データ処理" as DataProcessing {
  [データのフィルタリング]
  [データの整形]
}

RECTANGLE "コンテンツ生成" as ContentGeneration {
  [OpenAI APIを使用]
  [テンプレート適用]
}

RECTANGLE "投稿" as Posting {
  [WordPress APIを使用]
  [投稿のスケジューリング]
}

DataCollection --> DataProcessing
DataProcessing --> ContentGeneration
ContentGeneration --> Posting

note bottom of DataCollection
  各サイト専用の
  データ収集ロジック
end note

note bottom of ContentGeneration
  AI利用による
  自動コンテンツ生成
end note

note bottom of Posting
  自動投稿と
  サイト管理
end note

@enduml
```
[SQL]ON → WHERE → HAVINGの順番を覚えた

SQLを書いていると条件の書き方が色々ある。
初心者にはなかなか難しい。ということでまとめてみた。

## 軸はJOINとGROUP BY
どっちもWHEREが関わってくるけど、WHEREが影響するタイミングの異なることが難しかった。
### JOIN
ON → JOIN → WHEREの順番に評価する

### GROUP BY
WHERE → GROUP BY → HAVINGの順番に評価する

### 合わせてみると
ON　→　JOIN　→　WHERE　→　GROUP BY　→　HAVING

## 終わりに
WHEREが前に来たり後に来たりして難しかったけど、SQL全体的な流れを見ることで理解しやすくなった。
【ChatGPT＋Code Interpreter】で単語が回転するアニメGIFを作成します。


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

　今回は、単語を回転するアニメGIFを作成します。

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

　まずは、ニュース。

　Leonardo Aiが、
　　Canvaとの提携を発表。
　　　Canva内で使えるようになる？
[ひろちゅ～さんポスト](https://x.com/hirochuu8/status/1818299297764634702?t=lBwxm7FDXtVPdS0CZqYftw&s=03)
***
　次のニュース。

　画像生成AI
　　MidjourneyのV6.1が
　　　リリースされました。
　　　　詳しくはこちら。
　　　　　[小猫遊りょうさんポスト](https://x.com/jaguring1/status/1818419404193120549?t=O4iY5kAWfEnFSsrtNJW0XA&s=03)

　小猫遊りょうさんによると、
　　ひと月後くらいに、
　　　V6.2が発表される
　　　　らしいですよ。
***
　お次のニュース。

　こちらは
　　OpenAIからになります。
　　　[OpenAIポスト](https://x.com/OpenAI/status/1818353580279316863?t=AlthbH9XX-zyeTef-2Jr3w&s=19)

　前に発表されていた
　　GPT-4oの音声会話についてです。

　すでに音声会話は
　　できていましたが
　　　仕組み的にタイムラグが
　　　　発生するものでした。

　今回の音声会話モードは
　　そのタイムラグが少なく、
　　　またリアルな会話になる。

　今回のニュースは
　　その音声会話モードが
　　　Plusユーザーに
　　　　徐々に開放されていく、
　　　　　というお知らせです。

　解放されたユーザーには
　　メールとアプリにメッセージが
　　　届くそうです。

　最終的に
　　秋にはすべてのPlusユーザーに
　　　開放されるとのこと。

　待ち遠しいですね😸
***
　さて、本題です。

　昨日（2024/07/30）は
　　単語を傾けました。
[【ChatGPT＋Code Interpreter】で単語を傾けます。](https://qiita.com/kabumira/items/19d29f5d47e116f86ef6)

　今回は、
　　単語が回転する
　　　アニメGIFを作成します。

　まずは
　　そのアニメGIFをどうぞ。
　　　回転しない場合は
　　　　タップしてください。
![rotating_work.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/d15c899e-59dc-0616-2677-13f49c41ca89.gif)

　たまたまですが
　　“o”を中心に回転しました😅

　それはさておき、
　　Promptをごらんください。
```Text:単語が回転するアニメGIF作成Prompt
CodeInterpreterで、“Work”を回転させるアニメGIFを作成してください。
それを表示するとともに、ダウンロードリンクもお願いします。
```

　簡単に説明しますね。
　　必要もありませんけど😅

　❶Code Interpreter使用する宣言
　❷単語が回転するアニメGIF作成依頼
　❸表示とダウンロードリンク提示

　実は、ここで
　　アニメGIFは表示されるのですが、
　　　アニメとして表示されずに、
　　　　画像が表示されます。

　セッション中に
　　アニメGIFのフレームの
　　　一枚だけが表示される
　　　　仕様のようです。

　このことを
　　ChatGPTさんに
　　　尋ねてみました。
***
***user***
質問。セッション上で、アニメGIFは表示できないのですか？
説明だけでお願いします。

***GPT-4o***
はい、セッション上でアニメーションGIFを直接表示することは可能ですが、セッション内の制限によりGIFアニメーションは静止画として表示される場合があります。具体的には、生成されたGIFを表示する際に最初のフレームのみが表示されることが多いです。そのため、ダウンロードリンクを提供してユーザーが自分の環境で完全なアニメーションを確認できるようにするのが一般的です。
***

　まぁ、仕様ですから
　　仕方がないですね😅

　仕様と言えば、
　　文字の回転でもそうでしたが、
　　　単語に日本語が使えないのは
　　　　残念ですよね。

　フォントをアップロードすれば
　　できるような気もしますけど。

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

　今回は、ここまで。
Laravel Viteとは

## Laravelデフォルトのフロントエンドビルドツール
:::note info
Laravel 9.18以降ではビルドツールが**Laravel mix**に代わって**Laravel vite**が採用されています。
:::
## ビルドツールの役割
これまでwebサイトをブラウザに表示する時、CSSやJSを記述してサイトに装飾を施していました。
しかし、技術の進化によりブラウザが対応できない新しい技術が生まれてきました。
そこで活躍するのが**LaravelMix**です。
このLaravelMixを使うことで、新しい技術の形式をブラウザが対応できる従来の形に変換してくれています。
この時に使うコマンドが```npm run dev```コマンドです。
この変換作業をすることにより、ブラウザが対応していない新しい技術でもちゃんとブラウザに表示されるようになっています。

## Laravel MixからViteになった理由
- 高速なビルド速度
    - ホットリロードの速度が早く、ブラウザに変更点を即反映ができる
- モダンな開発支援
    - Viteは最新のフロンエンド技術をサポートしており、開発者がより効率的にモダンな技術（React、Vueなど）を使用できる
- シンプルな設定
    - Laravel Mixより設定ファイルが簡潔でわかりやすく、設定が簡単にできる

このようなメリットがあり、開発プロセス全体が高速化され、開発生産性が向上します！
## 最後に
今まで、なにも考えずに```npm run dev```と、叩いていましたが何をしているのかは分かっていませんでした。
今回、ビルドツールについて改めて調べてみて勉強になりました。
まだ知識は浅いですが少しずつ理解を深めていきたいと思います！
Mac 環境構築手順書

# 目次
[1.homebrew](#1-homebrew)


# 1. homebrew
https://brew.sh/

まずは、homebrewを入れる。これは、Mac用のパッケージマネージャーである。これを通してさまざまなパッケージをインストールすることでバージョン管理が格段にしやすくなる。

```terminal
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
ここで打つコマンドは、上記のリンク先にあるものである。時期によって変わっている可能性があるので、要注意である。
この状態だとPATHが通ってないので、下記のコマンドで通す。

```terminal
$ (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<username>/.zprofile
```
以降は、ここで入れたhomebrewを用いてさまざまなものをインストールしていく。

# 2. chrome
https://www.google.com/chrome/

次に、ブラウザアプリを入れる。

```terminal
$ brew install --cask google-chrome
```

# 3. iTerm2
https://iterm2.com/

次に、ターミナルアプリを入れる。純正よりもこちらの方が使いやすい。

```terminal
$ brew install --cask iterm2
```

ここからは、iTerm2を用いてさまざまなコマンドを入力していく。（好みの問題で、純正のterminalアプリを用いてもできると思う。）

# 4. neovim
https://neovim.io/

次に、エディタを入れる。これを機にneovimへと転向する。

```terminal
$ brew install neovim
```
にてneovimを入れる。

# 5. packer.nvim
https://github.com/wbthomason/packer.nvim

Vim用のプラグインマネージャーを導入する。READMEに書いてある通りに導入する。

```terminal
$ git clone --depth 1 https://github.com/wbthomason/packer.nvim\
 ~/.local/share/nvim/site/pack/packer/start/packer.nvim
```

でインストールできる。これは、`lua`で書くことのできる`Vim`の設定ファイルにおいて、使用できる。

# Git 

https://git-scm.com/

プロジェクトのバージョン管理システムである。

```shell
$ brew install git
```

git の設定で、ユーザー名とメールアドレスを設定しておく。

```
git config --global user.name "<user name>"
git config --global user.email "<mail adress>"
```

と設定をしておく。


# 6. まとめ

今回は、Mac OSの初期設定の方法について紹介した。ここから、`Vim`の設定やプログラミング言語の環境構築などまだまだすることがあるが、それはまた後日紹介する。
整数(8)をビット(1000)に変換して表示してあそぶ


x 過去ログをみよ
x arduino uno用は、気分次第
(最終的には、まとめ的に動かす予定　、　(各自、移植の事))
(printfをprintに変えれば動くはず)
x 入力変数破壊のマクロだよ
x 軽量高速化

結果

![o_coq269.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e67ac1b5-7587-be1f-bcd8-73b23d7826d5.jpeg)


プログラム

オンラインコンパイラ

```c++

#include <iostream>
using namespace std;

#define bit16_put(aa) for(int ii=16;ii!=0;ii--) \
{if(aa & 0x8000){printf("1");}else{printf("0");}aa=aa<<1;}

int main(void){
    // Your code here!

    //       1234567890123456
    int aa=0b1000000000001000;
    int bb; //一時
    

    printf("\n\n");

    //破壊読出しなので注意
    bb=aa;
    bit16_put(bb);

    //for(int ii=16;ii!=0;ii--){
    //    if( aa & 0x8000 ) {printf("1");}else{printf("0");}
    //    aa = aa << 1;
    //}

    printf("\n\n");
}


```
Scene-Aware Context Reasoning for Unsupervised Abnormal Event Detection in Videos

## はじめに

本研究は，ACMMM 2020 に採択されたものであり，本記事では，技術的な内容についてまとめる．

```
Sun, C., Jia, Y., Hu, Y., & Wu, Y. (2020, October). Scene-aware context reasoning for unsupervised abnormal event detection in videos. In Proceedings of the 28th ACM international conference on multimedia (pp. 184-192).
```

## 概要

ビデオにおける異常イベントの検出において，文脈情報を取り入れることは重要である．例えば，道路の交通状況において，渋滞中に車が止まるのは正常だが，通常の場合は異常である．従来手法では，文脈情報の利用にあたり，事前に手動で定義された情報に依存していたが，この場合．事前情報の完全性に制限されてしまう．そこで本論文では，データから自動的に文脈情報を取得することで，異常イベントの検出を強化する新しいアプローチが提案されている．

## 技術的なポイント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2116254/107bbb86-51ce-2ca6-e548-d46b920274f4.png)

### Spatio-Temporal Context Graph (STC Graph)

文脈情報は，STC Graphにエンコードされる．そのために以下の流れをとる．

1. 各フレームから，Region Proposal Network[^1] を用いて物体認識を行う
1. Mean-field[^2][^3]を用いてグラフ推論を行い，検出した物体をノード，物体間の位置関係をエッジとして表現し，SC Graphを作成する
1. SC Graphを，Structural-RNNに入力することで，STC Graphを得る

### Unsupervised Learning via Scene Clustering
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2116254/bb34dc61-1ae3-ccbf-81f6-caa35e94dec4.png">

SC Graphを新たに構築した上図に表されるGraph-based Deep Gaussian Mixture Model (GMM) に入力し，その出力を用いてクラスタリングを行い，正常クラスターと異常クラスターに分けることで，異常イベントの判定を行う．
GMMでは，SC Graphに対してGCNによる埋め込みを行ったのち， Average Pooling Layer (AP) と，MLNを通すことでベクトル表現を得る．

## 本研究の重要性

### セマンティックギャップの克服

STC Graphを構築することで，物体と物体間の時間的・空間的な関係をグラフ表現に符号化し，文脈情報を明示的にモデル化することができる．さらに，GMMの開発により，教師無し学習で効果的に正常/異常イベントを識別し，STC Graphを推論することを可能にしている．

### パフォーマンスの向上

<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2116254/f1b843eb-7493-3c5f-94b0-779bc3e6ba69.png">

複数のデータセットを用いて，提案手法が既存の最新の教師なし手法を上回り，最新の教師あり手法と同等であることが実証されている．上図では，Sultani et al. の手法は教師あり学習を用いた手法であり，それと同等のかつ，他の手法を上回っている性能があることが確認できる．


[^1]: [Faster R-CNN: Towards real-time object detection with region proposal networks](https://ieeexplore.ieee.org/abstract/document/7485869/)
[^2]: [StagNet: An attentive semantic RNN for group activity and individual action recognition](https://ieeexplore.ieee.org/abstract/document/8621027)
[^3]: [Scene graph generation by iterative message passing](https://openaccess.thecvf.com/content_cvpr_2017/html/Xu_Scene_Graph_Generation_CVPR_2017_paper.html)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（81/100）

【81日目】
トピック 8：SAPS/4HANAの製造指図（13/15）

≪問題81≫
製造指図を登録しようとしています。どのような方法を使用できますか。
（２つ選択）
□かんばんプロセスでの登録
□指図発行による登録
□購買依頼を変換
□品目なしでの登録

≪解答≫
■かんばんプロセスでの登録
□指図発行による登録
□購買依頼を変換
■品目なしでの登録

≪解説≫
◆資材所要量計画で登録された計画手配を、一括変換、個別変換、または部分変換で製造指図に変換することができる。
◆この他にも、製造指図を登録するためのさまざまな特別要件に応じて使用できるオプション（代替方法と特殊バリアント）が多数ある。
（1）製造指図の登録の代替方法-品目による登録-品目なしでの登録-受注用登録-プロジェクト指定登録
（2）製造指図の登録の特殊バリアント
- 組立指図機能で（受注用）方針グループ82
- 一括指図として:特殊調達52
- バリアント選定を使用
- 確認による（リワーク用）
- かんばんプロセスで
paizaの問題をPowerShellで解いてみた【宝くじ (paizaランク C 相当)】

この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。

- 難易度別に問題を選ぶ
- 問題文を読んで、解答コードを書く
- 提出するとテストケースが実行されて結果をわかる
- 正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます

## こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方

通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery


今年もパイザ宝くじの季節がやってきました。パイザ宝くじ券には 100000 以上 199999 以下の 6 桁の番号がついています。毎年1つ当選番号 (100000 以上 199999 以下)が発表され、当たりクジの番号が以下のように決まります。

1等：当選番号と一致する番号
前後賞：当選番号の ±1 の番号（当選番号が 100000 または 199999 の場合，前後賞は一つしかありません）
2等：当選番号と下 4 桁が一致する番号（1等に該当する番号を除く）
3等：当選番号と下 3 桁が一致する番号（1等および2等に該当する番号を除く）

たとえば、当選番号が 142358 の場合、当たりの番号は以下のようになります。

1等：142358
前後賞：142357 と 142359
2等：102358, 112358, 122358, …, 192358 （全 9 個）
3等：100358, 101358, 102358, …, 199358 （全 90 個）

あなたが購入した n 枚の宝くじ券の各番号が入力されるので、それぞれの番号について、何等に当選したかを出力するプログラムを書いて下さい。

#### 入力される値
入力は以下のフォーマットで与えられます。

b
n
a_1
a_2
:
a_n

ここで、b は当選番号、n は購入した宝くじの数、a_1,…,a_n は購入した宝くじ券の番号をそれぞれ表します。

#### 期待する出力
期待する出力は n 行から成ります。各 i 行目 (1 ≦ i ≦ n) には、a_i が何等に当たったかに応じて、以下の文字列を出力して下さい。

1等の場合: first
前後賞の場合: adjacent
2等の場合: second
3等の場合: third
それ以外（外れ）の場合: blank

最後は改行し、余計な文字、空行を含んではいけません。

## コード:

~~~
$b = [int](read-host)  # 当選番号
$n = [int](read-host)  # 宝くじの数
$tickets = @()
for($i=0;$i -lt $n;$i++){
	$tickets+=[int](read-host)
}


foreach($i in $tickets){
    if($i -eq $b) {
        write-host "first"
    } elseif(($i -eq ($b - 1)) -or ($i -eq ($b + 1))){
        write-host "adjacent"
    } elseif((($i % 10000) -eq ($b % 10000)) -and ($i -ne $b)) {
        write-host "second"
    } elseif((($i % 1000) -eq ($b % 1000)) -and ($i -ne $b) -and (($i % 10000) -ne ($b % 10000))) {
        write-host "third"
    } else {
        write-host "blank"
    }
}

~~~

## コードの説明:

### 入力処理:
~~~
$b = [int](read-host)  # 当選番号
$n = [int](read-host)  # 宝くじの数
$tickets = @()
for($i=0;$i -lt $n;$i++){
	$tickets+=[int](read-host)
}
~~~
最初の値を当選番号 $b
次を宝くじの数 $n として入力
宝くじの番号を$n回入力してticketsに格納する。

### 判定処理:
~~~

foreach($i in $tickets){
    if($i -eq $b) {
        write-host "first"
    } elseif(($i -eq ($b - 1)) -or ($i -eq ($b + 1))){
        write-host "adjacent"
    } elseif((($i % 10000) -eq ($b % 10000)) -and ($i -ne $b)) {
        write-host "second"
    } elseif((($i % 1000) -eq ($b % 1000)) -and ($i -ne $b) -and (($i % 10000) -ne ($b % 10000))) {
        write-host "third"
    } else {
        write-host "blank"
    }
}
~~~
宝くじの番号リストticketsから１つずつ取り出し、以下の条件をチェック:
ticket == b の場合は "first"。
ticket == b - 1 または ticket == b + 1 の場合は "adjacent"。
下4桁が一致し、かつ ticket != b の場合は "second"。
下3桁が一致し、かつ ticket != b および下4桁が一致しない場合は "third"。
それ以外は "blank"。







## 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8
自動運転AIチャレンジ2024専用AIアシスタントを作ってみよう！　～ NotebookLM編 ～

# はじめに
今年も[自動運転AIチャレンジ](https://www.jsae.or.jp/jaaic/2024ver/)に参加させていただいています。例年に比べて参加者も増え、大いに賑わっております（中には高校生もいるそうです、すごい！）。

さて、近年 Autoware / ROS 2の利用は広がっているものの、初学者には依然としてハードルが高いと感じています。
優しく寄り添い、学習をサポートするAIアシスタントがいてくれたらなぁ…、なんて思いませんか？

そんなあなたに捧ぐ本記事です、自分だけのAIアシスタントを作ってみましょう！

# 要件

高校生の方でも使えるように、以下の点を考慮します：
- 費用を抑えること
- 専門知識がなくても簡単に構築できること

# 技術選定

最近の自然言語処理技術やツールの進展は目覚ましいです。コードベースのAIアシスタントツールだけでなく、ノーコード / ローコードのツールも充実しています。今回はその中でも手軽に使用できる **NotebookLM** を選択しました。

※ 以下表は記事作成時点（2024年7月末）の内容、かつ **筆者の主観** です

| 実現手段<br>(ツール) | 費<br>用 | 容<br>易<br>さ | 拡<br>張<br>性 | 回答<br>性能 | 備考 |
|---|---|---|---|---|---|
| [NotebookLM](https://notebooklm.google/) | ◎<br>(¥0) | ◎ | △ | ○ | 構築が非常に容易 |
| [Dify](https://dify.ai/) | ◎<br>(¥0~) | ✕ | ◎ | ○ | 細かいチューニングやクローリングが可能ですが、無料で使うにはハードルが高めです |
| 大手クラウドサービス | ✕ | ○ | ◎ | ◎ | 費用はかかりますが、リソースを含めフルマネージドでセキュリティも◎ |

ROS 2の基本的な知識に関しては、[ROS2ではじめよう GPT](https://chatgpt.com/g/g-2he14Pn6Z-ros2tehasimeyou-gpt?ref=taaft&utm_medium=referral&utm_source=taaft) を活用するのも良いでしょう。
ただし、AIチャレンジのルールに基づくアドバイスが必要な場合は、アシスタントに適切な知識や情報を与える必要があります。そのために上記のツールやサービスを利用します。

# 作成手順
1. Googleアカウントを作成します。
2. [NotebookLM](https://notebooklm.google/) から **"Try NotebookLM"** をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/7c25833c-5de1-c0df-5de6-50874748b12c.png)

3. **新しいノートブック** をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/2ae004c4-c2b0-12f4-8ff2-c9d64d8a1350.png)

4. **ウェブページのURL** をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/c06eb75e-37e2-ad45-d17d-03c6c2cad132.png)

5. **ウェブサイトのリンクを貼り付ける** 欄に [AIチャレンジ2024のリンク](https://automotiveaichallenge.github.io/aichallenge-documentation-2024/index.html) を貼り付けて **挿入** をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/92e3d8e4-332a-9dca-399b-89516bb2351d.png)

6. **入力を開始します…** に質問を入力します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/2788d579-b0de-f6fc-d771-557ff4049590.png)

    たとえば…こんな感じ。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/107ac189-85d8-5544-e4f7-0886b64b6f61.png)

どうでしょうか、とっても簡単ではないでしょうか。
NotebookLMでは、このようにウェブページ等のソースを追加することで、特定の領域に特化した自分だけのAIアシスタントを作成することができます。

# おわりに
ソースを追加すればするほど、アシスタントは賢くなります。
どんどん追加してみましょう。

N番煎じなNotebookLM記事でしたが、初学者の皆さんのなにかの役に立てば幸いです。
予選も残り半分、楽しみましょう！

つづく

この記事は、AI文章校正ツール「ちゅらいと」で校正されています。
AtCoder 勉強記録[C++] その37

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Hammer
[B - Hammer](https://atcoder.jp/contests/abc270/tasks/abc270_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define m 998244353


int main() {
  ll x, y, z;
  cin >> x >> y >> z;
  if(y<0){
    x *= -1;
    y *= -1;
    z *= -1;
  }
  if(x<y) {
    cout << abs(x) << endl;
  }
  else if(z>y) cout << -1 << endl;
  else cout << abs(z)+abs(x-z) << endl;
}

```
### 解法
場合分けすることで上手く解くことができる。`Y`が0以下の場合はすべての正負を反転することで場合分けが簡単になる。`X<Y`の場合、必ずゴールに行くことができる。`Y<Z`の場合、必ずゴールにはいくことができない。それ以外の場合ではハンマーを手に入れてからゴールに行くことができる。
"default" is not exported by "src/App.js"というエラーの対処

# はじめに
cicd時になぜかbuildの箇所でエラーが出るのでその解決策を載せていきます。ただかなり個人的なエラー(他の人がつまらそうなところ)なので、あくまで参考程度に見ていってください。例えば"default"の箇所や"src/App.js"が人によって違う値になり得ると思います。

# ここまでの状況
- react,tsをviteで構築
- firebaseへのデプロイ
- jest/testing-libraryの導入
- これからcicdが動くか確認する状況

# 問題
push時に動くcicdで、buildのステップで以下のエラーが出る。
```
src/main.tsx (3:7): "default" is not exported by "src/App.js", imported by "src/main.tsx".14
```
# 解決策
1. tsconfig.jsonを修正
2. main.tsxでApp.tsxをインポートしてる箇所を修正

まずデフォルトで書き出されるtsconfig.jsonの内容を大きく変更します。エラーが出ていた時は以下のようなtsconfig.jsonになっていました。
```json
{
  "compilerOptions": {
    "jsx": "react",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    
  },
  "include": [
    "src",
    "./jest.setup.ts"
  ],
  "files": [],
  "references": [
    {
      "path": "./tsconfig.node.json"
    }
  ]
}
```
tsconfig.jsonを以下の内容に修正します。
```json
{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "allowJs": false,
    "skipLibCheck": true,
    "esModuleInterop": false,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "types": ["node", "jest", "@testing-library/jest-dom"]
  },
  "include": ["src"],
}
```
これでいけたかなと思ったのですが今度は以下のエラーが出ました。
```
An import path can only end with a '.tsx' extension when 'allowImportingTsExtensions' is enabled.
```
特定の設定（allowImportingTsExtensions）が無効になっている場合、インポートパスが.tsxで終わることは許可されないみたいです。そもそもこの拡張子はなくても動作するので拡張子を消すことでエラーは解消されました(js拡張子でもエラーは消える)。
```diff_tsx
/*---main.tsx---*/
import React from 'react'
import ReactDOM from 'react-dom/client'
-import App from './App.tsx' //デフォルトではこうなってる(はず)
+import App from './App'
import './index.css'

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)
```

以上で無事正常にbuildされ、cicdが実行されました。

# おわりに
tsconfig.jsonの書き方やオプションをもっと知る必要があると思ったので、公式docやサバイバルts等で都度学習していこうと思います。
【AWS】クラウドインフラストラクチャの構築をしてみた

<br>
こんにちは、Reikaです。<br>私は現在、アプレンティスの5期生として日々勉強に励んでいます。<br>

https://apprentice.jp/lp

<br>
<br>

アプレンティスの課題として **AWSでクラウドインフラストラクチャの構築** に取り組みました。<br>学習を進める中で、私は以下の山浦さんのUdemy講座を参考にしながら、まるで二人三脚のように進めていました。↓<br>

https://www.udemy.com/course/aws-and-infra/?couponCode=ST4MT73124

最初はネットで情報を検索し、操作し、分からないことがあればその都度調べるという方法をとっていましたが、その過程で何をしているのか迷子になってしまいました。<br>そこで、山浦さんのUdemy講座を受講し始め、しっかり理解しながら学習と構築を進めることができました。冗談抜きで、非常におすすめです。笑


今回はこの経験を通じて学んだことについて、記述していきます！<br>

# 目次
1.AWSとは？
2.今回構築したクラウドインフラストラクチャ
3.構築手順
4.VPCの構築
5.EC2の構築
6.RDSの構築

## 1.AWS(Amazon Web Services)とは？

Amazon社が提供するクラウドサービスです。<br>サービスの数が非常に多く、クラウドサービスとして **世界最大規模** です。 <br>「フルマネージドサービス」という、AWSが管理を代行するサービスもあり、 **高負荷に耐えられる信頼性の高いシステムを少ない手間で運用できます。** 

## 2.今回構築したクラウドインフラストラクチャ
私は今回、EC2とRDSを利用して、以下のクラウドインフラストラクチャを構築しました。


![VPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/c3cbb74b-fca7-6a3e-80c7-36f5e6b9f2b6.png)

 **サーバー** とは、クライアントに対してサービスを提供するコンピューターのことを指します。<br>それらサーバー（EC2、RDS）やネットワーク（VPC）のことを **インフラ** といいます。<br>

ここから構築手順を説明しようと思いましたが、設定箇所があまりにも多く、Udemyの参考動画と全く同じ内容になってしまいそうなので、手順の詳細は省略します。<br>私の主観で、理解していても忘れがちな重要なポイントをまとめていきます。

## 3.構築手順
AWSでインフラを構築する場合、<br> **VPC(ネットワーク)を構築し、そのVPC内にEC2やRDS(サーバー)を設置して、そのサーバーで必要なアプリケーション(今回はApacheとMySQL)をインストールする** <br>という流れで構築します。<br>大きな部分から順に作成していくイメージです。

## 4.VPCの構築
* 日本でサービスを展開する場合、リージョンは東京を選ぶのがおすすめです。応答時間が短くなります。
* アベイラビリティゾーンは複数設置することを推奨します。災害が発生しても、他のゾーンでシステムが稼働し続けるようになります。

## 5.EC2の構築
勉強が一区切りついたら、料金が発生しないように以下を実行します。
* Elastic IPアドレスの関連付けを解除し、アドレスを解放する
* インスタンスを停止する

## 6.RDSの構築
私はRDSサーバーにMySQLをインストールしようとした際、必要なファイルやライブラリが見つからないというエラーが発生しました。

実行コマンド(MySQLのインストール)
```
sudo yum -y install mysql
```

エラー文
```
...
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'yum clean packages'.
Error: GPG check FAILED
```

調べてみると、MySQLのクライアントツールをインストールしようとした際に「GPGキーが正しくない」というエラーが発生していることがわかりました。<br>GPGキーとは、ソフトウェアの正当性を確認するための「秘密のサイン」のようなもので、これがないとパッケージを安全にインストールできない場合があります。

 **結論:** 以下のコマンドを実行したらインストールに成功しました。
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
```

# 最後に

今回は初めてAWSを使ってサーバーを立て、インターネットに接続するという経験をしました。<br>まだまだデータベースの作成や実際のデプロイなど、やりたいことはたくさんあります。<br>AWSに触れたことがない方、AWSが気になる方は、ぜひ山浦さんのUdemy講座を受講してみてください^^
VirtualBoxで立ち上げ後にteratermで入れない事象

# 事象

VirtualBoxでUbuntuを立ち上げた後、teratermで入れなかった。
ポートフォワーディングに設定もしてteratermで該当のポートを指定して入ると
「接続が拒否された」などのメッセージが出ずに落ちてしまった。

# 確認したこと
127.0.0.1:2224を使おうとしています

## 使用ポートの利用状況の確認
VirtualBoxでUbuntu起動前

```cmd
> netstat -na | findstr 2224

>
```

特に2224は使われていない
起動後
```cmd
> netstat -na | findstr 2224
  TCP         127.0.0.1:2224         0.0.0.0:0              LISTENING
>
```
LISTENINGになった

## sshdの確認
Ubuntu内のターミナルでsshdが動いているか確認する
```bash
$ sudo systemctl status ssh

Unit ssh.service could not be found

$ sudo systemctl is-active ssh

inactive

$ sudo systemctl is-enabled ssh

Failed to get unit file state for ssh.service:No such file or directory
```
sshd起動されていないしsshdがないのかな
これが原因だった

# 解決方法
Ubuntuを入れて、立ち上げさせたけど、OSだけ立ち上げて
中身が空だったのかな？

下記コマンドで更新やsshdの有効化で解決した

```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install openssh-server
$ sudo /etc/init.d/ssh restart
$ sudo systemctl enable ssh
```
```bash
$ sudo systemctl status ssh

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-07-31 22:31:46 JST; 5min ago
       Docs: man:sshd(8)
```
有効化になってくれたのでteratermからも入れるようになった
supabaseでテーブル作成時にoptionでnon nullを設定する手順

## 設定手順

1プロジェクトに入る
2Table Editorをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/72c7b117-ae65-5bde-d8b6-e5d097ba5fff.png)

3 create new Tableクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/24bdb95c-c5d5-5cde-163c-e5748b82209d.png)

4 Columnsのところにcolumn名やデータ型等を入力・選択する

5 4のColumnsの項目の一番右にある歯車マークをクリックしてis Nullableのチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/cebaed62-9c5e-1c3d-5949-0e51a81e8bdf.png)

5save後作業は完了
ICLR2024: Reading "Training Unbiased Diffusion Models From Biased Dataset"

# This is my trial post using SpeakerDeck.

I recently read an intriguing paper on domain adaptation in diffusion models, and I created a slide deck to share my personal interpretation of the paper!

<script defer class="speakerdeck-embed" data-id="152986d42bbe486e84311d1a48090ee7" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

The original paper can be found at the following URL:

https://openreview.net/forum?id=39cPKijBed
【JavaScript】振り子もどき


![furiko.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/b9ae4681-cf27-b19f-662e-8271bf6d2beb.gif)

https://mogamoga1024.github.io/FurikoModoki/

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>振り子もどき</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <canvas></canvas>

  <script src="main.js"></script>
</body>
</html>
```

```js:main.js
const canvas = document.querySelector("canvas");
const context = canvas.getContext("2d");

canvas.width = 800;
canvas.height = 500;

const baseX = 400;
const baseY = 150;
const ballRadius = 20;
const g = 9.80665;

let t = 0;
const fps = 60;

setInterval(() => {
    context.clearRect(0, 0, canvas.width, canvas.height);

    const colors = ["purple", "blue", "green", "red", "orange"];

    for (let i = 4; i >= 0; i--) {
        for (let j = 4; j >=0; j--) {
            const l = 60 * (i + 1);
            const maxRadian = Math.PI / 8 * (j + 1);
            const angularFrequency = Math.sqrt(g / l);
            const radian = maxRadian * Math.cos(angularFrequency * t);

            const x = baseX + l * Math.sin(radian);
            const y = baseY + l * Math.cos(radian);
            drawPendulum(x, y, ballRadius, colors[i], (j + 1) / 5);
        }
    }

    t += 1 / fps * 10;
}, 1000 / fps);

function drawPendulum(x, y, r, color = "black", alpha = 1) {
    context.beginPath();
    context.globalAlpha = 0.2;
    context.moveTo(baseX, baseY);
    context.lineTo(x, y);
    context.stroke();
    context.beginPath();
    context.arc(x, y, r, 0, Math.PI * 2);
    context.fillStyle = color;
    context.globalAlpha = alpha;
    context.fill();
}
```

ちゃんとした振り子を作りたい場合は運動方程式がどーのこーの、微分積分がどーのこーのとしないといけない。

これは振り子っぽいやつを作っている。

## 参考にしたサイト

https://w3e.kanazawa-it.ac.jp/math/physics/category/mechanics/masspoint_mechanics/simple_pendulum/henkan-tex.cgi?target=/math/physics/category/mechanics/masspoint_mechanics/simple_pendulum/sp_approximate_solution.html
Stream#flatMap()って少しややこしい？わかりやすく解説！

## はじめに
stream()を利用することもよくあると思うけど、最近実際にflatMapメソッドを利用したので、どういうものだろうかと調べてみたので記事にするよ。少し似ているmapメソッドと比較してみるよ。

## Stream#map()
mapはstreamの各要素に対して指定の操作を行って返すよ。
[公式ドキュメント](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/stream/Stream.html#map(java.util.function.Function))には以下のように記載されているよ。
> このストリームの要素に指定された関数を適用した結果から構成されるストリームを返します。

例えば、map処理で小文字→大文字の処理をしたとすると、イメージは以下のようになるね。
```
// 処理前 → 処理後
[a, b, c] → [A, B, C] 
[[a, b, c], [d, e, f]] → [[A, B, C], [D, E, F]] 
```
実際にコードを書くと以下のようになるよ。
```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sample_1 = List.of("a", "b", "c");
        final var sample_2 = List.of("d", "e", "f");
        final var sampleList = List.of(sample_1, sample_2);

        // 結果１
        final var map_1 = sample_1.stream().map(String::toUpperCase).toList();
        System.out.print(map_1);

        // 結果２
        final var map_2 = sampleList.stream() //
            .map(r -> //
                r.stream().map(String::toUpperCase) //
                .toList()) //
            .toList(); 
        System.out.print(map_2);
```
```
// 処理結果
[A, B, C] // 結果１
[[A, B, C], [D, E, F]] // 結果２
```
ただし、次元は落とせないので、結果を以下のようにしたい場合にflatMapメソッドが使えるよ。
```
// 処理前 → 処理後
[[a, b, c], [d, e, f]] → [A, B, C, D, E, F] 
```
それでは、flatMapメソッドを見てみよう！

## Stream#flatMap()
mapメソッドど同じように各要素に対しての処理を行うことができ、さらにフラット化（配列の次元を1次元落とせる）することができるよ。
[公式ドキュメント](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/stream/Stream.html#flatMap(java.util.function.Function))を見ると以下のように記載されているよ。

> このストリームの各要素をマップされたストリーム(指定されたマッピング関数を各要素に適用することで得られる)の内容で置き換えた結果から成るストリームを返します。
APIの注:
flatMap()操作には、ストリームの要素に対して1対多の変換を適用した後、結果の要素を新しいストリーム内にフラット化する効果があります。

言葉では難しいので、実際のコードを見せるよ。
```java
import java.util.List;

public class Main {
    public static void main(String[] args) {
        final var sample_1 = List.of("a", "b", "c");
        final var sample_2 = List.of("d", "e", "f");
        final var sampleList = List.of(sample_1, sample_2);

        // 結果３
        final var flatMap = sampleList.stream() //
            .flatMap(r -> r.stream() //
                .map(String::toUpperCase)) //
            .toList();
        System.out.print(flatMap);
```
```
// 処理結果
[A, B, C, D, E, F]
```


## まとめ
flatMapはよくわからない！って人もこれで使いどころや使い方がわかるはず！
flatMapは少し難しいようにも思うけれど、どういうときに使うか理解して少しずつ慣れていこう。
Python `typing.Union`と`typing.Optional`で柔軟な型ヒントを書く

## はじめに

Pythonの型ヒントは、コードの可読性を高め、潜在的なバグを早期に発見するのに役立ちます。特に`typing`モジュールの`Union`と`Optional`を使うことで、より柔軟で表現力豊かな型ヒントを書くことができます。この記事では、これらの使い方と利点について解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/baeee174-2876-2096-4534-88ec31dd5d01.png)

## `typing.Union`とは

`Union`は、複数の型のいずれかを取り得ることを示すために使用します。

```python
from typing import Union

def process_data(data: Union[str, int]) -> str:
    return str(data)

# 使用例
print(process_data("Hello"))  # 出力: Hello
print(process_data(42))       # 出力: 42
```

この例では、`process_data`関数が文字列または整数を受け取ることができることを示しています。

## `typing.Optional`とは

`Optional`は、指定した型またはNoneを取り得ることを示すために使用します。

```python
from typing import Optional

def greet(name: Optional[str] = None) -> str:
    if name is None:
        return "Hello, Guest!"
    return f"Hello, {name}!"

# 使用例
print(greet())           # 出力: Hello, Guest!
print(greet("Alice"))    # 出力: Hello, Alice!
```

`Optional[str]`は実際には`Union[str, None]`のエイリアスです。

## `Union`と`Optional`の組み合わせ

これらを組み合わせることで、より複雑な型ヒントを表現できます。

```python
from typing import Union, Optional

def process_input(data: Optional[Union[str, int]] = None) -> str:
    if data is None:
        return "No input provided"
    return f"Processed: {data}"

# 使用例
print(process_input())       # 出力: No input provided
print(process_input("text")) # 出力: Processed: text
print(process_input(42))     # 出力: Processed: 42
```

この例では、`data`パラメータが文字列、整数、またはNoneのいずれかを取り得ることを示しています。

## 利点

1. **コードの意図を明確に**: 型ヒントにより、関数が期待する入力と出力の型が明確になります。
2. **バグの早期発見**: 静的型チェッカー（mypy等）を使用することで、型の不一致を早期に発見できます。
3. **IDEのサポート向上**: 多くのIDEが型ヒントを利用して、より良い補完や警告を提供します。

## 注意点

- Python 3.10以降では、`Union`の代わりに`|`演算子を使用できます（例：`str | int`）。
- 過度に複雑な型ヒントは可読性を下げる可能性があるため、適度な使用を心がけましょう。

## まとめ

`typing.Union`と`typing.Optional`を使用することで、Pythonコードにより柔軟で表現力豊かな型ヒントを追加できます。これにより、コードの品質と保守性が向上し、開発効率が高まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/eb5264f0-3f55-7f4b-bf00-698ee607cba9.png)

## 公式の参考情報

より詳細な情報や最新の使用方法については、以下の公式ドキュメントを参照してください：

1. [Python公式ドキュメント - typing — 型ヒントのサポート](https://docs.python.org/ja/3/library/typing.html)
   - `Union`と`Optional`の詳細な説明と使用例が記載されています。

2. [PEP 484 -- Type Hints](https://www.python.org/dev/peps/pep-0484/)
   - Pythonの型ヒントの基本的な仕様と設計原理が記述されています。

3. [mypy documentation](https://mypy.readthedocs.io/en/stable/)
   - Pythonの静的型チェッカー「mypy」の公式ドキュメントです。型ヒントの検証方法や高度な使用例が紹介されています。
複数のブックを１ブックに集約

```Module1.bas
Const dirPath As String = "DATA*.csv"
Const rowCopyStart As Long = 5 'コピー開始行

Dim wbParent As Workbook '親エクセル貼り付け用
Dim rowPasted As Long    '次回貼り付け開始行

Sub ボタン1_Click()

    '親エクセルを変数に保存
    Set wbParent = ThisWorkbook
    rowPasted = 1

    Dim buf As String, cnt As Long
    Dim Path As String
    Path = ThisWorkbook.Path & "\"
    ChDir ThisWorkbook.Path
    buf = Dir(Path & dirPath) '''''''''''''''''''''''''データ取得対象ファイル
    
    Do While buf <> ""
    
        'Close時の警告表示を一時的に非表示
        Workbooks.OpenText Filename:=buf
        
        Call DataCopyPaste
        
        'Workbook Close
        Application.DisplayAlerts = False
        Workbooks(buf).Close
        Application.DisplayAlerts = True
        
        cnt = cnt + 1
        buf = Dir()
    Loop
    
    Range("A1").Select
    
    
End Sub
Sub DataCopyPaste()

    Dim rowEnd As Long

    'データの最下行を検索
    Range("A1000").Select
    Selection.End(xlUp).Select
    rowEnd = ActiveCell.Row
    
    'コピー
    Rows(rowCopyStart & ":" & rowEnd).Select
    Selection.Copy
    
    '貼り付け
    wbParent.Activate
    ActiveWorkbook.Sheets("out").Select
    Cells(rowPasted + 1, 1).Select
    ActiveSheet.Paste
    
    '次回貼り付け開始行計算
    Range("A1000").Select
    Selection.End(xlUp).Select
    rowPasted = ActiveCell.Row
    
End Sub
```
【Unity】オブジェクトを一定速度で目標の方向に向かせる

### 概要
Unityにおいてオブジェクトを目標の方向に向かせる一般的な方法は`Transform.LookAt`だが、これは当然ながら一瞬でオブジェクトの方向が変化してしまう。オブジェクトの方向を時間をかけて変化させ、かつ方向の変化が一定の速度（角速度）になるような方法が欲しかった。

### 実装
``` c#
public class SampleObject : MonoBehaviour
{
    // 目標
    public Transform target;
    // 角速度(deg/sec)
    float angularVelocity = 90f;

    void Update()
    {
        // 目標の方向
        Quaternion rotation = Quaternion.LookRotation(target.position - transform.position);
        // 現在の方向と目標の方向がなす角度
        float angle = Quaternion.Angle(transform.rotation, rotation);

        if (angle > 0)
        {
            // 経過時間によって変化させる角度
            float deltaAngle = angularVelocity * Time.deltaTime;
            // オブジェクトの方向を変更
            transform.rotation = Quaternion.Slerp(transform.rotation, rotation, deltaAngle / angle);
        }
    }
}
```

現在の方向から目標の方向に一定速度で変化させるには、2つの方向の間で任意の角度だけ変化させる必要がある。
`Quaternion.Slerp`は引数で指定した2つの方向を第3引数の率で補間するため、第3引数に「変化させたい角度」÷「現在の方向と目標の方向がなす角度」を指定すれば、現在の方向から目標の方向に任意の角度だけ変化させた方向が得られる。なお、第3引数が1を超えた場合、1として扱われるので特に補正は不要である。

### 用途
NPCがプレイヤーの方向を向く速度を調整することを想定している。例えば以下のようなケースである。

- 敵NPCの背後を取りたい
- 老人NPCをゆっくり動かしたい
- 店主NPCがプレイヤーの方向を向いていない隙に・・・
初回ログイン時にパスワード変更を要求する

# やりたいこと
Linuxサーバに新規ユーザを追加した際、ユーザに対して初回ログイン時にパスワードを変更するよう求める。

# 1. ユーザ追加&初期パスワード設定
新規ユーザを追加し、初回ログイン時に使用する初期パスワードを設定する。
```bash
# useradd -u <UID> <ユーザ名>
# passwd <ユーザ名>
  (パスワードを入力)
```

# 2. 初期パスワードを期限切れにする
--expireオプションによって期限切れに設定する。
```bash
# passwd --expire <ユーザ名>
```

---
完了！
初回ログイン時の様子はこんな感じ
```bash
パスワード：(初期パスワードを入力)
You are required to change your password immediately (administrator enforced).
Current password:(初期パスワードを入力)
新しい パスワード：
新しい パスワードを再入力してください：
```
【Thymeleaf】コメントアウトっぽく見えたが違うやつ

# コメントアウト
消してはいけないコメントアウトがありました。
結論から言うと、コメントアウトっぽく見えますが、Thymeleafの記法ではコメントアウトではありませんでした。

# これ
```
<!--/*/ <th:block th:include="fragments/navbars :: navbar"></th:block> /*/-->
```




# 何をしているか

## コメントアウトの中身
### Thymeleafの<th:block>ブロック

・通常のHTMLパーサーによっては無視される（＝コメントアウトとして扱われる）。

・Thymeleafがこのテンプレートを処理する際には、このコメント内のThymeleafブロックを認識し、実行することができる。

## コメントアウトされてる？

### 実はコメントアウトじゃなかった。

>Thymeleafには、テンプレートが静的に（例えばプロトタイプとして）開かれた場合にはコメントになり、テンプレートとして実行された場合には通常のマークアップとして扱われる特別なコメントブロックもあります。

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#thymeleaf%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E3%81%BF%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF

```
<span>hello!</span>
<!--/*/
  <div th:text="${...}">
    ...
  </div>
/*/-->
<span>goodbye!</span>
```
>Thymeleafのパースシステムは単純に<!--/*/と/*/-->のマーカーを削除しますが、コンテンツは削除しないので、そのコンテンツがアンコメントされて残ります。ですので、テンプレートを実行するときにはThymeleafからは実際このように見えます：

```

<span>hello!</span>

  <div th:text="${...}">
    ...
  </div>

<span>goodbye!</span>

```





## なんのために？

テンプレートエンジンの処理を制御しながら、HTMLとしてはコメントアウトされたままの状態を保つことができる。





# 確認　Thymeleafとは

https://www.thymeleaf.org/

>Thymeleaf is a modern server-side Java template engine for both web and standalone environments.

テンプレートエンジンであるらしい。

>Thymeleaf's main goal is to bring elegant natural templates to your development workflow — HTML that can be correctly displayed in browsers and also work as static prototypes, allowing for stronger collaboration in development teams.

HTMLをいい感じに表示させるためのものらしい。

>With modules for Spring Framework, a host of integrations with your favourite tools, and the ability to plug in your own functionality, Thymeleaf is ideal for modern-day HTML5 JVM web development — although there is much more it can do.

Spring frameworkと相性が良いらしい。


# 結論

コメントアウトっぽく見えたが、コメントアウトではなく、
一つの書き方であった。

### ブラウザはHTMLは読めるけど、Thymeleaf記法は読めない！
### なので、テンプレートエンジンだけがこれを読めるようにこういう書き方をする必要があった！

テンプレートエンジンが読み込む（動的に読み込む）ときにのみ、通常のマークアップとして扱われ、以下のように処理されていた。
それによって、共通のnavbarをいい感じに読み込むことを達成。

```

<th:block th:include="fragments/navbars :: navbar"></th:block>

```

以上