OmniAICreator/Qiita-1.07M huggingface dataset:
R3liveの実行手順②(キャリブレーション編）

#### この記事ではR3liveを実行する前に行うLiDARとカメラのキャリブレーションを行う方法について記載する。

https://github.com/hku-mars/r3live

## 使用するパッケージ

https://github.com/hku-mars/livox_camera_calib

## 使用機器と対応するrosドライバー
・Livox Avia=Livox_ros_driver
・Blackfly S USB3=Spinnaker_camera_driver

https://github.com/Livox-SDK/livox_ros_driver

https://www.flir.cn/support-center/iis/machine-vision/application-note/using-ros-with-spinnaker/

今回の組み合わせの場合、上のパッケージが必要なので先にインストールを行う。



## インストールに必要な各種パッケージのインストール
## ROSの追加パッケージ
```
sudo apt-get install ros-XXX-cv-bridge ros-xxx-pcl-conversions
```

## Ceres Solverのインストール
### vasion 2.1.0推奨→コードが最新版に対応していない
ここからダウンロードできる
http://ceres-solver.org/version_history.html

```
sudo apt-get install cmake
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev
#ダウンロードしたファイルを解凍する
cd (解凍したファイル)
mkdir ceres-bin
cd ceres-bin
cmake ../ceres-solver-2.1.0
make -j3
make test
make install
```

## Eigenのインストール
```
sudo apt install libeigen3-dev
```

## PCLのインストール
以下のサイト等を参照する
https://qiita.com/tewi_r/items/941acb2af690f8f184a1

## packageが揃ったのでビルド
```
cd ~/catkin_ws/src
git clone https://github.com/hku-mars/livox_camera_calib.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash
```

ビルドができたら次に画像ファイルと点群ファイルを用意する。
画像ファイル→jpeg,png形式など
点群ファイル→PCD形式
※livox社のLiDARの場合lvx形式で出力されるのでファイル拡張子の変換を行う必要がある。

## キャリブレーションパラメータの設定
キャリブレーションを行うために
```
# データのパスを変更する
common:
    image_file: "/home/ycj/data/calib/image/0.png" 
    pcd_file: "/home/ycj/data/calib/pcd/0.pcd"　
    result_file: "/home/ycj/data/calib/extrinsic.txt"
    

# Camera Parameters. Adjust them!
#カメラのマトリックスパラメータを変更する
　勉強不足でよくわからない。。
 livox aviaの場合はr3liveの設定ファイルのものに合わせれば良い
camera:
    camera_matrix: [1364.45, 0.0,      958.327,
                0.0,     1366.46,  535.074,
                0.0,     0.0,      1.0     ]
    dist_coeffs: [0.0958277, -0.198233, -0.000147133, -0.000430056, 0.000000]

# Calibration Parameters.!
calib:
    calib_config_file: "/home/ycj/catkin_ws/src/livox_camera_calib/config/config_outdoor.yaml"
    use_rough_calib: true # set true if your initial_extrinsic is bad

```
## キャリブレーションの実行
```
source ~/catkin_ws/devel/setup.bash
roslaunch livox_camera_calib calib.launch

結果が指定のファイル名、ファイルパスに出力される。

```

##
##
##
##
[paiza]宝くじ (paizaランク C 相当)

# Cランク解いてイキりたい
サマージャンボが当たったら、フルテレOKな会社に転職して、犬のブリーダーやりたい。。。
こんなクソ暑い中、~~コロってても~~出社を推進してくる会社があるとか頭おかしいよね～

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

# 面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所は[こっちの記事](https://qiita.com/AsilHatake/items/842548e48ae4a0eae119)に書いてあるYO!!

```javascript:lottery.js
// [問題文（原文）]
// 今年もパイザ宝くじの季節がやってきました。パイザ宝くじ券には 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 枚の宝くじ券の各番号が入力されるので、それぞれの番号について、何等に当選したかを出力するプログラムを書いて下さい。
function lottery(lines) {
  // 入力は以下のフォーマットで与えられます。
  // 
  // b
  // n
  // a_1
  // a_2
  // :
  // a_n
  // 
  // ここで、b は当選番号、n は購入した宝くじの数、a_1,…,a_n は購入した宝くじ券の番号をそれぞれ表します。
  if (!Array.isArray(lines) || lines.length < 3) {
    console.log("3行以上入れろや！");
    return;
  }
  if (!lines.every(line => Number.isInteger(Number(line)))) {
    console.log("全行数値入れろや！");
    return;
  }
  // 当選番号(1等)
  const hitNo = lines[0];
  const hitNoNum = Number(hitNo);
  // 購入数
  const buyCnt = Number(lines[1]);
  if (!(buyCnt >= 1 && buyCnt <= 100)) {
    console.log("購入数は1～100の整数入れろや！");
    return;
  }
  // 当選確認したいやつら
  const lots = lines.slice(2);
  if (lots.length !== buyCnt) {
    console.log("購入数と確認したい数が合わんのや！");
    return;
  }
  if (![hitNo, ...lots].map(lot => Number(lot)).every(lot => Number.isInteger(lot) && lot >= 100000 && lot <= 199999)) {
    console.log("番号は100000～199999の範囲で入れろや！");
    return;
  }
  // 期待する出力は n 行から成ります。各 i 行目 (1 ≦ i ≦ n) には、a_i が何等に当たったかに応じて、以下の文字列を出力して下さい。
  // 
  // 1等の場合: first
  // 前後賞の場合: adjacent
  // 2等の場合: second
  // 3等の場合: third
  // それ以外（外れ）の場合: blank
  // 
  // 最後は改行し、余計な文字、空行を含んではいけません。

  // 当選番号情報
  const hitNos = [
    { value: hitNo, label: "first" },
    { value: String(hitNoNum + 1), label: "adjacent" },
    { value: String(hitNoNum - 1), label: "adjacent" },
    { value: hitNo.slice(-4), label: "second" },
    { value: hitNo.slice(-3), label: "third" },
  ];
  lots.forEach(lot => {
    const check = hitNos.find(hit => lot.endsWith(hit.value));
    console.log(check ? check.label : "blank");
  });
}

module.exports = {
  lottery
};
```
Cランクに上がったからか、ちょっとコード量が増えた気がするけど気のせいかもね。
ちなみにfindは見つかった最初の値を返すので、比較する側（当選番号）の配列の順番さえきちんと定義していれば大丈夫。
条件として6桁固定の比較になるので、endsWithで全部チェックしても問題なし。
PowerAppsでカスタムコネクタを含むソリューションをインポートする

## はじめに
PowerAppsでカスタムコネクタを含むソリューションを他の環境にインポートしようとした際に、インポートエラーとなり詰まりました。この問題に関する情報がなかなか見つからなかったため、解決策を置いておきます。

## この記事でわかる・できること
カスタムコネクタを含むPowerAppsソリューションのインポート方法

## エラー内容
カスタムコネクタを含むソリューションをインポートするとこのようなエラーとなります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804982/6dc0a635-70a4-0799-1544-d7e7208d32b0.png" width="300">

## 参考記事
ここに答えがありました。

https://learn.microsoft.com/en-us/connectors/custom-connectors/customconnectorssolutions#known-limitations
>接続参照またはフローの前に、まずカスタム コネクタをインポートする必要があります。
環境のソリューションにカスタム コネクタが含まれていない場合は、カスタム コネクタのみを含む別のソリューションをインポートします。Azure ではカスタム コネクタを事前に登録する必要があるため、実際のソリューションをインポートする前にこのインポートを行ってください。
カスタム コネクタとフローを含むソリューションをインポートする場合、Azure は接続参照またはフローを登録している間はカスタム コネクタを登録できません。これは、以前に別のソリューションにインポートされなかったカスタム コネクタの接続参照にも適用されます。Azure がカスタム コネクタを登録していない場合、インポートは失敗するか、インポートを開始できません。

この記事にしたがってカスタムコネクタのみのソリューションを作成していきます。


## カスタムコネクタのみのソリューションを作成
アプリを含むソリューションとは別のソリューションを作成します。

ソリューション > 新しいソリューション > 既存を追加 > カスタムコネクタ から目的のカスタムコネクタを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804982/a39be526-e8b2-ea8b-4ca4-122c2864dfc0.png)

このようにカスタムコネクタのみが含まれたソリューションになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804982/b3a7fef4-68cd-ed98-5dab-088a44a457d6.png" width="550">

このソリューションに関する作業は以上です。エクスポートをしましょう。

アプリを含むソリューションにカスタムコネクタを含める必要はありません。

## 移行先でのインポート
移行先の環境で下記の順でインポートします。
1. 先ほど作成したカスタムコネクタのみのソリューションをインポートする
1. アプリを含むソリューションをインポートする

以上です。

## まとめ
PowerAppsの情報はあまり多くなく、公式資料がわかりにくいので変なところでハマりますね。
これで救われた人がいたら嬉しいです。
Deeplabcut2.3.10の不具合

deeplabcut2.3.7を使用していたが、いつの間にかdeeplabcut2.3.10になっていて（たぶん、なにかやったんだと思う）、create videoが実行できなくなったので、私が行った対処方法やその他の不具合症状を記載します。2024.8.1時点

![img2.3.10_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/f860523e-3548-9bc6-93ef-4476ae7808f6.png)

:::note info
不具合：１　create video　を実行するとエラーがでてvideoが作成されない
　　　　　画面下に　`Plots could not be created・・・・・`とエラー表示
:::


対策：悪戦苦闘の結果'Analyze videos'タブのところで'Filter predictions'を✓することでcreate videoを実行できることを確認
![img2.3.10_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/0fb8b86a-c3b5-edc3-fd5d-e82e3a57ced5.png)

:::note info
不具合２：Drow skeletonの✓をはずしたのに骨格が表示される
:::

対策：✓をはずしたら表示されないでほしいのですが・・。
　　　たぶんすでに、ラインが引かれていると思われるので、
   　　　'Build skeleton`でラインをclearしexportする
　　　しかし、そのままcreate videoを実行すると途中で止まる・・・。
   　　　そこで、一度、deeplabcutを終了し、loadし直してから
      　　　create videoするとＯＫでした。



結局、いろいろと不具合が出てきたので、最新もいいけど、もとに戻したい・・・。、
anacondaで新しい仮想環境を別に作り、Deeplabcut2.3.7を入れて何事もなかったことにした・・。
~~~
pip install 'deeplabcut[gui,tf]==2.3.7'
~~~
fetchとaxios

Vue勉強中にaxiosというAPIが出てきて調べている際に（前回の記事）、
axiosに似たAPIにfetchというものがあるとわかった。

比較してる記事がいくつかありました。

https://www.wantedly.com/companies/company_1071330/post_articles/865429

https://rakuraku-engineer.com/posts/axios/

> ✅axiosはfetchを進化させたようなライブラリ。

>ざっくり解説「シンプルにHTTPリクエストができるfetchが進化したライブラリ」

とのこと。

確かに、fetchの方が長く、axiosのほうが簡潔なコードになるようだ。

前回の、axios のコード
```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        users: []
    }),
    mounted: function() {   
        axios.get('https://jsonplaceholder.typicode.com/users')
        .then(response => this.users = response.data)
          .catch(error => console.log(error))
    },
})

app.mount('#app')

```

これを、fetchで書くと、こうなった。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        users: []
    }),
    mounted: function() {   
        fetch('https://jsonplaceholder.typicode.com/users')
          .then(response => {
                if (!response.ok) {
                throw new Error('Network response was not ok');
                }
                return(response.json());
          })
          .then(data => this.users = data)
          .catch(error => console.log(error));
    },
})

app.mount('#app')

```

axiosだと、`then()`は1個でいいけど、fetchは2個書かなきゃいけない。
1個目の`then()`の中でエラー処理したり、`json()`で、jsonに変換したりとかしないといけない。
こういう部分が、axiosの方が簡潔、という話らしい。

```html:html
<body>
    <div id="app">
        <ul v-for="user in users">
            <li >{{ user.name }}</li>
            <li>{{ user.email }}</li>
            <li>{{ user.company.name }}</li>
        </ul>
    </div>
</body>
```

画面表示結果は、前回と同じ。

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/cdc6fa02-a839-5083-0b67-8e3f0c520744.png)
いい実装が満たすべき条件

- 問題の設定がよい
    - その問題が解決すれば、実用性が高まる。
    - 再利用性が高い。
    - その時点での解決可能な範囲にある部分で問題を設定している。
- 問題の定式化がよい
    - 最小化する量が明解である
    - 拘束条件が明確である
    - 何が得られるのかが明確である
    - 関連分野の進展を取り込みやすい
- 単純である
    - 同じことを実現できる単純な手法と複雑な手法があったときには単純な方がのぞましい。
    - [「ある事柄を説明するためには、必要以上に多くを仮定するべきでない」](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%83%E3%82%AB%E3%83%A0%E3%81%AE%E5%89%83%E5%88%80) 
- アルゴリズム
    - 従来の実装に比べて性能がいい理由が明確である
    - 従来の実装に比べて改善される対象が何かが明確である
- 得られた結果が良好であるのか判断しやすい
    - 例：目視での判定がしやすい
    - データセット全体での評価がしやすい
    - 評価指標がはっきりしている
- 利用できる範囲が明確である
	- その範囲では安心して使うことができる。
	- できない内容についての理由が明確である。
	よくない問題の設定・定式化では、従来よりも良かったり悪かったりがありすぎて、本当に改善になっているのかがはっきりしない。たまたま選んだデータセットに範囲でだけ、改善しているように見えるだけであり、別のデータセットでは、悪化しているということがある。
- データセットが目的の範囲で十分に多様である
    - 例：対象物の多様性
    - 例：背景の多様性
    - 例：視野の方向の多様性
- ソースコード
    - ソースが公開されていて、実装をトレースできる
- 入出力が明解である
- train
    - 学習用・評価用のデータセットの与え方が明確である
    - データを拡張する際の、データの取得方法・アノテーションの方法などについてたどれる
    - 標準化されたデータ形式を使っている
    - 学習用・評価用のデータセットが公開されている
    - 学習を再現できる
- 推論
    - pre-trained のモデルが公開されてる
    - 入力データへの過度の想定がない
        - 例：人による補助的な入力を必要とする
- 実装
    -  不要なライブラリのimportをなくしてある
    -  OS依存性を減らしてある
    - 高速化が考えられている（GPUの利用）
    - 読みやすいコードの記述
    - ドキュメンテーションコメントが嘘になっていない
    - 
- ドキュメント
    - installする手順、実行する手順にしたがって、実行までたどり着ける
    
# いい実装かどうかに他人の判断状況を利用する
- github 上でのStarの数が少ないものを除外する。
- paperwithcode をみる
----

付記：
- いい実装とは何であるのかを、自分がいま抱えている分野について明らかにしなければ、いい実装は作れない。
- いい実装とは何であるのかを知っていれば、近年の実装の中から、何に着目し、何を無視すればいいのかを選ぶことができる。
- いい実装とは何であるのかを知っていれば、既存の実装をそのように変更できる。
- いい実装とは何であるのかを知っていれば、どのように活用できるのかがわかる。
GitHub などで Markdown 折りたたみはスラッシュだけで行える

## やり方

スラッシュを打つだけ

<img width="300" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281147/3befb2e3-1f73-4e78-aba2-5b083d00c25a.png">

以下のような出力をしてくれます
```
<details><summary>Details</summary>
<p>



</p>
</details> 
```

## 参考

https://qiita.com/matagawa/items/31e26e9cd53c3e61ae07#comment-5f37abaf37ab67322a1d

## あとがき

自分はコンソールの結果などを貼り付ける際に度々検索してはコピペしてたので、地味に衝撃的でした..
知識は力なり
Qiitaなどでもサポートされてるようです。
よろしけばいいねをお願いします！
Ruby：多重ループを抜ける大域脱出とは

※この記事は初学者が自分なりにまとめたものになります。

# 目次
- [はじめに](#はじめに)
    - [大域脱出とは](#大域脱出とは)
- [代表的な大域脱出方法２選](#代表的な大域脱出方法２選)
  - [1. return](#1-return)
  - [2. throw catch](#2-throw-catch)
- [まとめ](#まとめ)
  - [使い分けのポイント](#使い分けのポイント)

# はじめに

今日は、Rubyにおいて２重３重に重なったループを一撃で抜ける方法を調べてみました！

### 大域脱出とは

この何重にも重なったループを抜け出す処理を"**大域脱出**”と言います。

# ＜代表的な大域脱出方法２選＞

以下は、Rubyの大域脱出の方法で代表的なもの２つです。

**1. return**

メソッドやブロックの実行を終了し、呼び出し元に制御を戻します。メソッドの中で使われることが多いです。

**2. throw catch**

特定のスコープから大域脱出するための方法で、throwは指定されたシンボルを投げ、対応するcatchブロックに制御を戻します。複雑な制御フローが必要な場合に使われます。

どちらの方法でも多重ループから抜け出すことができるのですが、明確な違いがあります。

メソッド内で多重ループの処理があって、そこから大域脱出した時に同メソッド内の後の処理を実行するのかどうかという点です。

実際のコードで見てもらった方が早いと思います。

## return

このコードでは、2つの範囲オブジェクト (1..3) を使って各ループが1から3までの値を順に取り、全ての組み合わせを総当たりで処理します。
特定の条件が満たされた場合に、returnを使って**メソッド全体から抜け出します**。
returnに行く条件は、if文で2.2の組み合わせの時としています。
そのため、returnされる2.2以降の2.3, 3.1, …といった組み合わせは出力されません。

```ruby
def nested_loops_with_return
  (1..3).each do |i|
    (1..3).each do |j|
      if i == 2 && j == 2
        # 内側のループからメソッド全体を抜け出す
        return "Exited with return"
      end
      puts "i: #{i}, j: #{j}"
    end
  end
  "This line will not be executed"
end

puts nested_loops_with_return
# Output:
# i: 1, j: 1
# i: 1, j: 2
# i: 1, j: 3
# i: 2, j: 1
# Exited with return
```

## throw catch

このコードも、2つの範囲オブジェクト (1..3) を使って各ループは1から3までの値を順に取り、全ての組み合わせを総当たりで処理します。
特定の条件が満たされた場合に、throwを使って**catchブロックから抜け出します**。
catchブロックから抜け出すのみなので、メソッド内のその後の処理を実行することができます。

throwは名前のとおり、指定のシンボルを投げます。

そして、対応するcatchブロックに制御を戻します。

今回、指定のシンボルは:exit_pointとしました。

```ruby
def nested_loops_with_throw_catch
  result = catch(:exit_point) do
    (1..3).each do |i|
      (1..3).each do |j|
        if i == 2 && j == 2
          # 内側のループから外側のループ全体を抜け出す
          throw :exit_point, "Exited with throw and catch"
        end
        puts "i: #{i}, j: #{j}"
      end
    end
  end
  # 外側のループ全体を抜け出した後の処理
  puts "This line is inside the method after throw"
  puts result
end

nested_loops_with_throw_catch
# Output:
# i: 1, j: 1
# i: 1, j: 2
# i: 1, j: 3
# i: 2, j: 1
# This line is inside the method after throw
# Exited with throw and catch
```

# まとめ

メソッドから抜け出すのが**return**、

ブロックから抜け出すのが**throw catch**です。

## **使い分けのポイント**

1. **メソッド全体を終了させたい場合**:
- returnを使用します。メソッドの途中で処理を終了し、呼び出し元に制御を戻したい場合に適しています。
1. **ネストされたループや特定のスコープから抜け出したい場合**:
- throw catchを使用します。特定の条件が満たされた場合に、ネストされたループや複雑な制御フローから抜け出し、その後の処理を続けたい場合に適しています。

3.**後続の処理が必要かどうか**:

- returnはメソッド全体を終了させるため、後続の処理は実行されません。
- throw catchは特定のスコープから抜け出すため、後続の処理を実行することができます。

状況に応じて使い分けましょう！
画面遷移パターン

Sub ExtractTransitionPatterns()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    Dim outputWs As Worksheet
    On Error Resume Next
    Set outputWs = ThisWorkbook.Sheets("OutputSheet")
    On Error GoTo 0
    
    If outputWs Is Nothing Then
        Set outputWs = ThisWorkbook.Sheets.Add
        outputWs.Name = "OutputSheet"
    End If
    
    outputWs.Cells.Clear
    
    Dim row As Long, col As Long, outputRow As Long
    outputRow = 1
    
    ' Header for the output sheet
    outputWs.Cells(outputRow, 1).Value = "元画面"
    outputWs.Cells(outputRow, 2).Value = "遷移先"
    outputRow = outputRow + 1
    
    ' Iterate through each row in column B
    For row = 7 To ws.Cells(ws.Rows.Count, "B").End(xlUp).row ' Assuming data starts from row 7
        Dim currentScreen As String
        currentScreen = ws.Cells(row, "B").Value
        
        If currentScreen <> "" Then
            ' Check each column for the symbols
            For col = 3 To ws.Cells(6, ws.Columns.Count).End(xlToLeft).Column ' Assuming headers are in row 6
                Dim symbol As String
                symbol = ws.Cells(row, col).Value
                
                If symbol = "◯" Or symbol = "R" Or symbol = "B" Then
                    Dim nextScreen As String
                    nextScreen = ws.Cells(6, col).Value
                    
                    ' Write to the output sheet
                    outputWs.Cells(outputRow, 1).Value = currentScreen
                    outputWs.Cells(outputRow, 2).Value = nextScreen
                    outputRow = outputRow + 1
                End If
            Next col
        End If
    Next row
End Sub
よくフォルダーの名前で使われているbinってなんなの？

# 初めに
Cのコンパイラをダウンロードしたり、pythonで仮想環境へ入るためにコマンドを書いたりする際に、ふと目にするbinって何なの？と思ったのでまとめて見ました。
# bin
binaryの略です。
binaryとは0,1だけで書かれているデータのことで、例を挙げるとexeファイルなどがあります。
binの中には、/bin、/usr/bin、/usr/local/binの三つのフォルダーがあり、
一つ目の/binには、シングルユーザモードでも利用できるコマンドが置かれます。シングルユーザモードとはシステム管理者だけが操作をすることができる状態で、システムが正常に動かなくなったときに使われます。
反対に二つ目と三つ目の/usr/binと/usr/local/binにはシングルユーザモードで利用しないコマンドが置かれます。/usr/binと/usr/local/binの違いは/usr/binには、パッケージ管理システムにより管理されるコマンドがはいっているが、/usr/local/binには、パッケージ管理システムに管理されないコマンドがはいっているという違いがあります。localという名前からもユーザ独自のものである感じが伝わってきますね。


# 最後に
今回はbinについてまとめてみました。binにも3種類あるなんて驚きました。ふとした疑問を調べるのってやはり大事ですね。最後まで読んでいただきありがとうございます。

# 参考文献

https://wa3.i-3-i.info/word14226.html
https://oshiete.goo.ne.jp/qa/1511973.html
https://linuc.org/study/knowledge/544/
MySQLを使ってテーブルを操作する

# テーブルを操作するSQLコマンド
テーブル名をusersとするidとnameをアイテムに持つテーブルに対して操作する。

## 取得
```sql
SELECT * FROM users;
```

テーブルにアイテムがない場合は以下の結果が得られる。
```
Empty set (0.02 sec)
```

## 挿入
```sql
INSERT INTO users(name) VALUES ('にんじゃわんこ');
```

挿入後にアイテムを取得すると以下の結果が得られる。
```
+----+----------------+
| id | name           |
+----+----------------+
|  1 | にんじゃわんこ |
+----+----------------+
1 row in set (0.01 sec)
```

<details>
<summary>基本的なINSERT INTOの用法</summary>

```sql
INSERT INTO テーブル名 (列1, 列2, ...)　VALUES (値1, 値2, ...);
```

上記では**name**に**にんじゃわんこ**の値を入れているが、idは入れていない。
idはAUTO_INCREMENTでテーブルを作っているため、自動で生成される。
※INSERT INTOは最後のレコードに対して追加するため、一番後ろのidの値に対してインクリメントする。
　また、列の記載は値を全て入力すれば省略できる。

</details>

## 更新
アイテムにpriceがあるテーブルだとする。
```sql
UPDATE users SET price=250 WHERE name='ミルク';
```
nameがミルクのレコードはpriceを250にアップデートする。

<details>
<summary>基本的なUPDATEの用法</summary>

```
UPDATE (表名) SET (カラム名1) = (値1) WHERE (条件);
```

</details>

## カラム追加
```sql
ALTER TABLE users ADD COLUMN stock INT;
```
テーブル(users)に対してカラム(stock)をINTで追加する。

# データベースとテーブルを削除する
削除操作は一度実行すると元に戻すことができないので慎重に行う。

## テーブルの削除
```
DROP TABLE users;
```

`SHOW tables;`を使ってテーブルが削除されていることを確認する。

## データベースの削除
```
DROP DATABASE test_db;
```

`SHOW databases;`を使ってデータベースが削除されていることを確認する。

## 引用
https://prog-8.com/docs/mysql-database-setup

https://qiita.com/tasty_uni/items/fb403460984e963ba1ca

https://products.sint.co.jp/topsic/blog/sql-update

https://prog-8.com/docs/mysql-column-operations
systemdについてまとめてみた

# systemd（システムディー）とは
# 概要
システムの電源を入れてから、linuxが動作するまでの手順の一つ
**systemd**を採用したシステムでは、initプロセスの代わりに**systemd**プロセスを起動し、各種サービスを管理する。

**systemd**では下記表のような複数のデーモンプロセス（常駐プロセス）が存在する。

|プロセス |説明 |
|---|---|
|systemd|systemdのメインプロセス|
|systemd-journald|ジャーナル（ログ）管理プロセス|
|systemd-logind|ログイン処理プロセス|
|systemd-networkd|ネットワーク管理プロセス|
|systemd-timesyncd|システムクロック同期プロセス|
|systemd-resolved|名前解決プロセス|
|sustemd-udevd|デバイス動的検知プロセス|

:::note info
**デーモン**
メモリ上に常駐してシステムサービスやサーバサービスを提供するプロセス
:::

# Unit
**systemd**では、システムの起動処理は多数の**Unit**と呼ばれる処理単位に分かれている
**Unit**にはサービスを起動する**Unit**や、ファイルシステムをマウントする**Unit**などがある

|種類 |説明|
|---|---|
|service|各種サービスを起動する|
|device|各種デバイスを表す|
|mount|ファイルシステムをマウントする|
|swap|スワップ領域を有効にする|
|target|複数のUnitをグループ化する|
|timer|指定した日時や間隔で処理を実行する|

## systemdの特長
**systemd**は、サービスAを起動するにはサービスBを起動する、といった各種サービスの依存関係や順序関係を処理できる。
**systemd**では、必要なサービスのみが起動し、サービスの起動は並列に行われるので、システムの起動時間はSysVinitに比べて短縮される。



#

**オワリ**
MySQLテーブルを作るまでに使うコマンド

## ログインする
```
# localhostのMySQLサーバに接続する場合
$ mysql -u [ユーザー名] -p

# ワンラインでパスワードまで渡す場合
$ mysql -u [ユーザー名] -p[パスワード]

# 外部MySQLサーバに接続する場合
$ mysql -u [ユーザー名] -p -h [host名] -P [ポート番号]
```

## 現在のデータベースを表示する
```sql
show databases;
```

クエリの最後にセミコロン(;)を忘れないようにする。セミコロンがない状態でEnterを押すとクエリは実行されずに改行される。改行されてしまった場合は、改行されたままセミコロンを入力してEnterを押すとクエリが実行される。

コマンド実行結果
```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```

基本的にデータベースはプロジェクトごとに分けてデータを管理する。

## データベースを作成する
```sql
CREATE DATABASE test_db
```

test_dbという名前のデータベースを作成する。
データベースが作成できたのかをshowコマンドで確認する。
コマンド実行結果
```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
5 rows in set (0.00 sec)
```

test_dbが追加できたことが確認できる。

## テーブルを作成する
### データベースを選択する
```sql
USE test_db;
```
データベースを選択しないとテーブル作成ができない。
テーブル作成する前にデータベースを選択する。

データベースを選択したら、テーブル一覧を見る。
```sql
SHOW tables;
```

### テーブルを作成する
```sql
CREATE TABLE users (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id)) DEFAULT CHARSET=utf8;
```

SHOWを実行する。
```
+-------------------+
| Tables_in_test_db |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)
```

usersというテーブルがtest_dbに作成される。

テーブル構造を表示する DESCRIBE を使って想定どおりにテーブルが作成されたことを確認する。
```sql
DESCRIBE users;
```

実行結果
```
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| name  | text | YES  |     | NULL    |                |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
```

## ログアウトする
```
quit
exit
```

## プライマリーキーについて
プライマリーキーとはレコードを識別するための制約で、設定したカラムには重複する値を挿入できなくなる。

例えばプライマリーキーの設定されている id カラムに値「1」が存在すると、新しく挿入するレコードの id カラムに値「1」をいれることができなくなる。

users テーブルのように id カラムにAUTO_INCREMENTを設定し、id カラムをプライマリーキーに指定することで意識をしなくても重複しない値が割り当てられるようになる。

## 引用
https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4

https://prog-8.com/docs/mysql-database-setup
GROWI 7.0.16リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.0.16がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 改善点

- 管理ページのユーザーグループリンク
- サイドバーヘッダーのテキストサイズ
- ユーザーアイコンの位置変更

## 不具合修正

- 一部のOIDC認証設定が適用されない問題を修正
- インストーラの作成ボタンにポインタカーソルを追加

他、幾つかの不具合修正と各種メンテナンスも行われています。詳細は[Release v7.0.16 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.0.16)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。
TiDB 関連イベント 8月分

暑いですねー！ 8月がやってきました。今月もイベント頑張っていきます！

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。

イベント/社内勉強会でTiDBについて話してほしいというリクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までご連絡ください。

## TiDB User Dayのアーカイブ視聴が可能になりました！

https://pingcap.co.jp/tidb-user-day/

7月3日に行われたTiDB User Dayのセッションアーカイブが公開されました。是非登録して御覧ください。


## 8月24日まで！: TiDB Future App Hackathon 2024

https://pingcap.co.jp/event/tidb-future-app-hackathon-2024/

TiDB Serverlessを用いたAIアプリケーションのハッカソンです！ ことしはスポンサーにAI関連の様々な企業をお迎えして、ワールドワイドで優れたAIアプリケーションの開発を競います。日本からの参加もお待ちしています！

ハッカソンのサイトはdevpostで行っていますので、記事中のリンクから登録開始してください。8月24日が投稿の締め切りです。

## 8月1日（木）、8月2日（金） Google Next Tokyo 24'

https://pingcap.co.jp/event/google-cloud-next-2024-tokyo/

Google Nextに出店しています。また、8月1日にはMenuさまにTiDB事例についてご講演いただきます。
ブースはG14ですので是非お立ち寄りください。

## 8月21日（水） 〜 8月23日（金） CEDEC ビジネスデイ

https://pingcap.co.jp/event/cedec-2024

CEDECにも協賛しています。発表はWonderplanet様から、「パンドランド」でのTiDBの利用についてお話しいただきます。
ブースも出店していますので是非お立ち寄りください。ゲームっぽいノベルティをご用意しています。

## 8月20日（火） TiUG ソースコード輪読会　#2

https://tiug.connpass.com/event/324903/

ユーザーグループによるTiDB　ソースコードの輪読会です。TiDBのオプティマイザを題材にしています。
今回が初めての方も是非どうぞ。頑張って読まないと・・・
FlutterのStateful Widgetの理解を深める

値が変更されたときに、UIを更新してほしいWidgetを作る時に使うのがState。

StatefulWidget を継承したWidgetと
State を継承したデータ
を作成することで、Stateを元にUIが作成される。

### StatefulWidgetを継承したクラスの作成
```dart
class MyWidget extends StatefulWidget {
  @override
  // インスタンスの作成
  _MyWidgetState createState() => _MyWidgetState();
}
```

### Stateを継承したクラスの作成

```dart
// クラスのインスタンス化で生成したStateを継承して使う
class _MyWidgetState extends State<MyWidget> {
  // データを宣言
  int count = 0;
```
Julia コルーチン内でのエラーを捕捉する

## Juliaのコルーチン
Juliaには強力なコルーチン機構がある。1つのスレッド内で複数のコルーチンを並行に動作させることで、IOを効率的にハンドルすることができる。しかしコルーチン内で発生したエラーは、エラーが起こった後でタスクを表示したりしないと顕在化しない。

``` julia
julia> t = @async begin sleep(1); error() end
Task (runnable) @0x000000010bdf6590
```

タスクに対して`wait`すればスタックトレースが出る。
``` julia
julia> wait(t)
ERROR: TaskFailedException
Stacktrace:
 [1] wait(t::Task)
   @ Base ./task.jl:352
 [2] top-level scope
   @ REPL[14]:1

    nested task error: 
    Stacktrace:
     [1] error()
       @ Base ./error.jl:44
     [2] (::var"#15#16")()
       @ Main ./REPL[13]:1
```

しかし、複数の長時間実行されるタスクを並行に実行する場合には`wait`はできない。どちらかに対して`wait`するとそこでブロックしてしまうからだ。下の例では`t0`が終了するまでは `t1`のエラーが捕捉できない。そもそも `t0` が終了するとは限らないので、その場合は`t1`のエラーは捕捉できないことになる。

``` julia
t0 = @async begin sleep(10); error() end
t1 = @async begin sleep(1); error() end
wait(t0)
wait(t1)
```

### @sync
どうしたものか、調べてみたらそのものズバリのissueがあった。

https://github.com/JuliaLang/julia/issues/36854

`@sync` を使うと、そのブロック内で起動されたタスクすべての終了を同時に待つ事ができる。

``` julia
@sync begin
    t0 = @async begin sleep(10); error() end
    t1 = @async begin sleep(1); error() end
end
```

しかし、どうもすべてが終了するまでエラーが表示されないようで、個別に待つのとあまり変わらない。

### ラッパタスクを使う
これを解決する方法も上のissueに書かれている。
対象タスクを、そのタスクを`wait`するだけのタスクでラップすればいい。
``` julia
@async begin
    t = @async begin sleep(1); error(); true end
    try 
        wait(t)
    catch
        display(t)
    end
end
```

さらにすすめて、これをマクロ化したものもあった。
``` julia
macro monitored_async(expr)
    quote
        @async begin
            t = @async $(esc(expr))
            try
                wait(t)
            catch
                display(t)
            end
        end
    end
end
```

これを`@async`の代わりに使えばいい。

``` julia
julia> @monitored_async begin sleep(1); error(); true end
Task (runnable) @0x000000010cc5e0e0

julia> Task (failed) @0x000000010cc5f210

Stacktrace:
 [1] error()
   @ Base ./error.jl:44
 [2] macro expansion
   @ ./REPL[30]:1 [inlined]
 [3] (::var"#42#44")()
   @ Main ./REPL[28]:4
```

便利。。`@async` をそのまま使うと、すべてのエラーがサイレントに握りつぶされてしまって非常に不便だったので、助かる。
ReactやVue.jsでよく使われるAtomicDesignとは

# Atomic Designとは
Webサイトの見た目やアプリの見た目を作る時に使う考え方です。
この方法は小さいパーツから組み合わせて大きなパーツを作り、
全部のパーツを組み合わせて、アプリやサイトを作っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/1ff6294b-e367-8160-17c2-db20f189589b.png)

> 引用　https://zenn.dev/bizlink/articles/b5c8985af8407a

# この記事の説明
開発の用語だけでなく、レゴで例えて説明していきます。

# atoms(原子)
これはレゴで例えると***一番小さなブロック***です。

ex)
レゴの1つのポッチだけのブロック

ウェブサイトでは、ボタンや見出し（タイトル）などがこれにあたります。

atomsは、```ボタン、入力フィールド、アイコン、ラベル、テキストなど```が含まれ、これらの要素は非常にシンプルで、単一の機能があります。


# Molecules（分子）
Atomsを組み合わせたものです。```小さなブロックをいくつか組み合わせたもの```です。

ex)
2つのポッチがくっついたブロックや、レゴの人形の頭と体

```ラベルと入力フィールドを組み合わせたフォームグループ、ウェブサイトでは、ボタンとテキストを組み合わせたナビゲーションバー```などです。

# Organisms（有機体）
Moleculesをさらに組み合わせたもので、もっと大きなレゴの塊です。
ヘッダーやフッターなど、
ex)
ヘッダー、フッター、カードなどの複数の分子を組み合わせた部分

# Templates（テンプレート）
***組み立てるための設計図で、Organismsを配置したページのレイアウトの骨組みで具体的なデータは含まれていません***。***ウェブサイトでは、ページ全体のレイアウトや構造***です。

# Pages（ページ）
ウェブサイトでは、実際にユーザーが見るページ全体のことです。

ex)
完成したレゴの作品


# レゴで例えると
Atomic Designは、レゴブロックを使って大きな作品を作るのと同じように、***小さなパーツから始めて、だんだん大きなパーツを作っていく方法***です。


# イメージ図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/9d1fc582-4002-b161-1b8e-1982e3d55ca0.png)


> 引用　https://zenn.dev/bizlink/articles/b5c8985af8407a


# 最後に
Atomic Designで個人開発もするので、今後も情報を追記していきます。
Grafanaの背景色を変える

Grafanaでの背景色はテーマ変更で行うのですが、lightとDarkの２種類しかない。

管理者でログインしてDefault preferencesを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/51d4c83f-c6c5-7d96-7b33-c151cd6f705a.png)

インターフェーステーマを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/929b551c-0c40-bef8-7c7b-a5cc8d28c33c.png)

### テーマを自分で追加できればいいのだが、テーマの作り方が分かっていないので、簡単な方法で実現してみました。

### １）grafana.iniに以下を追加
HTMLのサニタライズを無効にする
grafana.iniは/etc/grafana/の下にある
```
[panels]
disable_sanitize_html = true
```

### 2) VisualizationsのTextをダッシュボードに貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/0a71fcf5-9dd7-003d-813e-444f08fc8bb7.png)

### 3) Textボックスの記述モードをHTMLにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/fb8b4f3a-8c92-e8b4-8eec-d18ca5559511.png)

### 4) Textボックスに以下を記入する
```
<style>
  body {
    background-color: #66cdaa
  }
</style>
```

### 以下のようにVisualizationsの背景に色が付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/c1aaec84-d971-bccd-ee4e-8d65e0702740.png)

Textボックスがダッシュボードの中にないと有効になりませんが、styleタグが有効になったので後はcssのclassが分かればいろいろカスタマイズできるはず。
Build Tool プラグインとしての SwiftLint 導入時のエラー対処

:::note info
2025.02.07 追記
Run Script にペーストするスクリプトが公式サイトで変更されていたので修正
:::

# はじめに
Xcode 15.4 で、Build Tool プラグインとしての SwiftLint の実行に失敗する現象に遭遇しました。
基本的には SwiftLint パッケージをプロジェクトに導入 -> `Build Phases` の `Run Build Tool Plug-ins` に追加するだけで動作するはず（以前は動作していた）なのですが、Xcode のマイナーバージョンアップをしたところエラーが発生するようになりました。

細かくは検証できていませんが、Xcode 15.1 から 15.4 の間のどこかからのようです。
また、SwiftLint 自体も、導入の際に指定する URL が変わっていたりするようです。

執筆時点で最新の、Xcode 15.4 における回避方法を記載します。

今回、iOS プロジェクトは Xcode のウィザードから作成したものを利用しています。
そのため、今回はマニフェストファイルを利用せず、Xcode からパッケージを追加します。

# 検証環境
- macOS Sonoma 14.5 (23F79)
- Xcode 15.4 (15F31d)

# 導入手順
## SwiftPM を利用して SwiftLint への依存性を追加
1. Xcode メニュー -> `Add Package Dependencies...`
1. 検索欄に `https://github.com/SimplyDanny/SwiftLintPlugins` を入力し、`Add Package` ボタンをクリック
    - URL が SwiftLint 公式のものでない点に注意
        - 以前の手順では、公式の `https://github.com/realm/SwiftLint` となっていた
    - `Dependency Rule` は `Up to Next Major Version` のままで OK

    <img width="80%" alt="swiftlint_add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100115/27a4828d-098f-0293-c914-ca6a4f19cd88.png">

## Build Phases から Run Script を追加
1. アプリターゲットを選択し、`Build Phases` タブを選択
1. `+` アイコンから `New Run Script Phase` を選択して `Run Script` を追加し、ドラッグして `Compile Sources` の後へ移動
1. 以下の内容を `Run Script` で実行するスクリプトとして貼り付け
    ```bash
    SWIFT_PACKAGE_DIR="${BUILD_DIR%Build/*}SourcePackages/artifacts"
    SWIFTLINT_CMD=$(ls "$SWIFT_PACKAGE_DIR"/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/swiftlint-*-macos/bin/swiftlint | head -n 1)
    
    if test -f "$SWIFTLINT_CMD" 2>&1
    then
        "$SWIFTLINT_CMD"
    else
        echo "warning: `swiftlint` command not found - See https://github.com/realm/SwiftLint#installation for installation instructions."
    fi
    ```

    <img width="80%" alt="run_script.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100115/d70d59b1-6664-6df8-2e91-75eaf0810b57.png">

本来は `Build Phases` の `Run Build Tool Plug-ins` に SwiftLintBuildToolPlugin を追加するだけで OK なはずですが、プロジェクトのディレクトリ構成など様々な理由により上手くいかないことがあるようです。
その回避策として、SwiftLint の公式サイトで上記の方法が示されていました。

# 実行
command + B などでビルドを実行すると、SwiftLint が実行されます。
<img width="80%" alt="swiftlint_warning.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100115/5fccf168-6a93-62eb-64ce-f3b5eb844a4c.png">

通常通り設定ファイル `.swiftlint.yml` をプロジェクトのルートディレクトリに配置して、チェックするルールをカスタマイズできます。ルールについて詳しくは、公式サイト内の [Rules](https://github.com/realm/SwiftLint?tab=readme-ov-file#rules) の項目をご覧ください。

# まとめ
SwiftPM の Build Tool プラグインや、Xcode の Build Phases などに関してはまだ理解が浅い点が多いのですが、SwiftLint の公式サイトを見ても「Xcode 15 でパーミッションが変わった」とか「Apple Silicon だと Homebrew でインストールされるパスが変わった」とかいろいろ書かれています（後者は今回の件とは無関係ですが）。
まずは、公式の情報を見て環境を構築できるのが大切ですね。その上で、必要な部分を深掘りしていきたいと思います。

この記事は、[私のブログ](https://yagamo-style.com/2024/swiftlint-plugins/) にも投稿しています。

# 参考
[realm/SwiftLint: A tool to enforce Swift style and conventions.](https://github.com/realm/SwiftLint)
保守改修の事前作業と必要な成果物（メモ）

# 保守改修作業の手順
巨大な泥団子のような仕様不明のShellのシステムに四苦八苦したためメモ
## 現行使用の把握
1. DFD（データフローダイアグラム）を作成する
- 入力と出力の間でどのような処理名が挟まっているか
- 入力データと出力データの間の中間ファイルなど
- 読み込んでいるマスタデータ
2．入出力定義書を作成する
3. フローチャートを作成する
	DFDの処理名として洗い出した処理を詳細化する
## 要求される成果物
- 入出力定義書
- DFD（データフローダイアグラム）
- フローチャート

---
この後に変更内容を洗い出し、作業を見積る（事実上の設計作業）

2024/08/07
DFDを1に、入出力定義書作成を2に変更した。3でもいいかもしれない。
Ansible 2.17.2→2.16.3にダウングレードする方法

# 1. 結論
```shell_session
$ pipx uninstall ansible
$ pipx uninstall ansible-core
$ pipx install "ansible-core=2.16.3"
$ pipx install ansible
```

# 2. 前提条件
* pipxを導入済みであること

（参考：[pipx install pipx](https://zenn.dev/speg03/articles/ba73af845e029a)）

# 3. 背景
`ansible.builtin.dnf` を実行すると以下エラーが発生した。

```
The full traceback is:
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 894, in _find_spec
  File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
  File "<frozen importlib._bootstrap_external>", line 1131, in _get_spec
  File "<frozen importlib._bootstrap_external>", line 1112, in _legacy_get_spec
  File "<frozen importlib._bootstrap>", line 441, in spec_from_loader
  File "<frozen importlib._bootstrap_external>", line 544, in spec_from_file_location
  File "/tmp/ansible_ansible.legacy.dnf_payload_akxd0m9j/ansible_ansible.legacy.dnf_payload.zip/ansible/module_utils/basic.py", line 5
SyntaxError: future feature annotations is not defined
```

playbookの内容とインベントリは以下。

```yaml:main.yml
---
- name: Dnf test
  hosts: all

  tasks:
    - name: Install
      ansible.builtin.dnf:
        name: make, gcc, perl-IPC-Cmd
        state: present
```

```yaml:inventory.yml
---
all:
  children:
    rhel:
      vars:
        ansible_ssh_user: root
        ansible_python_interpreter: /usr/bin/python3.11
      hosts:
        almalinux8:
          ansible_host: 100.115.92.204
```

上記を`$ ansible-playbook -i inventory.yml main.yml`すると`SyntaxError: future feature annotations is not defined`が発生する。Ansible 2.17系からPython 3.6以下が切り捨てられることによる影響っぽい気がするが、`ansible_python_interpreter`でPython 3.11を指定しているので問題ないはずである。にも関わらずエラーが消えなかったためダウングレードを実施したことが背景である。なお、ダウングレード後は上記コマンドで動作した。

# 4. 感想
`ansible_python_interpreter`でPythonを指定しないと以下WARNINGがでる。
```
[WARNING]: Platform linux on host almalinux8 is using the discovered Python interpreter at /usr/bin/python3.9, but future installation of another Python interpreter could change the meaning of that path. See
https://docs.ansible.com/ansible-core/2.17/reference_appendices/interpreter_discovery.html for more information.
```

Ansible実行環境はPython 3.12で対象ホストのPythonは3.9なのでWARNINGが出ている。ということで、対象ホストのデフォルトはそもそも3.9であり、`SyntaxError: future feature annotations is not defined`は発生しないように思う。なお対象ホストはAlma Linux8.10である。

```shell_session
# cat /etc/redhat-release 
AlmaLinux release 8.10 (Cerulean Leopard)
```

一体どこのPythonを参照しに行っているのだろうか…。いずれにせよ、`ansible_python_interpreter`で指定したPythonを使ってくれないのは事実であるため、2.17.2の使用は控えることにした。
タイピングをそこそこ速くする

# はじめに
特技らしい特技がないのですが、「もしかしたら一般の人よりはタイピングが速い方？」と思ったので書いてみます。
言うまでもなく個人の主観に基づいているのであらかじめご了承ください。

# 前提：筆者のレベル
+ [寿司打](https://sushida.net/)5000円コースで11000~13000円くらいをうろうろ
+ [e-typing](https://www.e-typing.ne.jp/)模擬試験で1級くらい（特級には力及ばずでした。いつかちゃんと受験します）
+ [e-typing](https://www.e-typing.ne.jp/)のランクはNinjaの周辺をうろうろ



# 練習法：文章を書く
アナログではなくデジタルで、スマホではなくパソコンで。
先に挙げたようなタイピング練習サイトももちろん意味はあるのですが、どちらかというと練習そのものよりは力試しのように使った方が良いと思います。

※e-typingの腕試しは自分の苦手なキーがわかるのでありだと思います。

文章の種類はなんでもいいですが、書きたくないものだと習慣化できないと思うので日記とかツイートとかでいいと思います。
技術系記事もありですが、コードのタイピングと日本語のタイピングは別物なので、練習するなら解説の部分で、という感じですね。
 **下手に「いい文章を書くぞ！」と意気込むと飽きて頓挫するので、書きたいものをゆるゆる書くのが一番です。** 趣味の文章だとしても文章構造とかは鍛えられますからね。

 # そうはいっても練習サイトを使いたい
 伸ばしたいスキル別で使い分けるのがいいと思います。
 +  **正確性を上げたい：e-typing。** 間違えると容赦なくランクが下がります。体感、成長実感が得られにくいのでパッと成果を得たい人には不向き。その分ランクが上がったときは嬉しい。
 +  **スピードを上げたい：寿司打。** とはいえ間違えるとボーナスタイムももらえないので、ある程度伸びてきた人は正確性の確認にも使えると思います。

# ホームポジションって守った方がいい？
 **一旦守っておいて損はない。** というのが個人の意見です。
 ある程度寿司打とかでスコアを取れるようになって、安定して4桁レベルの得ができているのであれば無理に意識しなくても少なくとも日常生活上困ることはないと思います。
 **ちなみに筆者は全然守っていません** が、意識して練習していた時期はありそこから我流に変更していったので、基本ができるようになってからいろいろやろう、という感じですね。
 ホームポジションもっと徹底していればなと思うこともあるので、我流が良いという話でもないです。

 # ブラインドタッチって練習した方がいい？
  **速くなれば勝手にできると思います。** 手元がおぼつかないうちはキーボード見ていいと思います。
  
  ※2024/08/01追記
  ある程度速くなってくると、自然と「次打つ文字見た方が早いな」とか「誤字チェックをしながら打った方がいいな」とか思い始めて自然に画面を見るようになるので身につくんじゃないかなと思ってます。
  とはいえ、そこそこ速く打てるようになっていて位置も指に馴染んでいるのにキーボード見ちゃう方は画面を見るように心がけてもいいかもしれません。

 # 文章を速く書くには
「文章を速く書く（打つ）」にはタイピング以外にも特に以下のスキルが重要だと思っています。
+ ショートカットキーを覚える
+ 見出し設定や箇条書きなど、ドキュメント作成の書式設定を覚える


 # おわりに
 いろいろと身に着けるべきスキルはありますが、タイピングほど「地味に便利」なものもない気がしています。
 最近スコアが頭打ちなのでまた練習しなおそうと思います。
ChatHubインテリジェントチャットアシスタント - チャットをより賢明にします!

  最近、私は名称が「ChatHub」のオンラインAIチャットプラットフォームを発見しました。これにより、複数の知的モデルとの対話が簡単になりました。入念なテストの結果、以下のような使用感を皆さんにお伝えします:
一、 ChatHubは、著名な自然言語モデルを統合しており、ユーザーは実際のニーズに応じて迅速に対話相手を選択できます。

   二、各モデルの詳細な設定が一目でわかります。初めて使う人でも簡単に操作できます。

   三、プラットフォームのインターフェイスはシンプルで効率的です。テキストを入力するだけでAIの返答が得られます。各モデルの反応速度は平均1-2秒で、非常にスムーズです。

   四、単一のウェブページとは異なり、このアプリケーションは複数のモデルを統合して使用できるため、ユーザーにより多くの可能性を提供し、並列対話の問題も解決しています。

   五、今後は、より優れた製品をさらに導入し、一部のモデルのパフォーマンスを強化することで、ユーザーによりよい体験を提供できると考えられます。

   総合的に判断すると、ChatHubは推奨できるAIインタラクションプラットフォームです。

   ウェブサイト: https://app.chathub.gg/?via=navi
   ![uploading...0]()
Gray-Sccotモデル

私も含め、数弱のためにわかりやすく書きました。解説を読んでいただければ、わかりやすいかと思います。最低限偏微分の知識が必要です。


### グレイスコット方程式
$$
\frac{\partial u}{\partial t} = D_u \nabla^2 u - uv^2 + F(1 - u)
$$
$$
\frac{\partial v}{\partial t} = D_v \nabla^2 v + uv^2 - (F + k)v
$$

$u$と$v$はそれぞれ、反応物Aと反応物によって生成される物質Bの濃度を表す
$D_u$と$D_v$は$u$と$v$の拡散係数
$F$は供給率で外部からの$u$の供給と反応のバランスを表す
$k$は消失率で$v$の消失を表す

$\nabla^2$はラプラシアン演算子で物質の空間的な拡散を表すことができる
$-uv^2$はuとvの非線形反応項で特定の条件下での自発的なパターン形成を引き起こす
$F(1-u)$は供給項で外部からuを供給する
$-(F+k)v$は消失項であり、$v$が全体から消失する速度を表す

#### ラプラシアン
2次元空間でのスカラー場$\phi$を表すラプラシアンは
$$
\nabla^2 \phi = \frac{\partial^2 \phi}{\partial x^2} + \frac{\partial^2 \phi}{\partial y^2}
$$
となる。$\phi$の二階偏微分のそれぞれの和である。


スカラー場もしくはベクトル場の各点における変化の度合いを記述する


$$\frac{\partial u}{\partial t} = D_u \nabla^2 u - uv^2 + F(1 - u)$$
と
$$\frac{\partial v}{\partial t} = D_v \nabla^2 v + uv^2 - (F + k)v$$
#### 解説

$$\frac{\partial u}{\partial t}$$
および
$$\frac{\partial v}{\partial t}$$
はΔtにおける物質uと物質vの**濃度**の変化量を表す。

$$D_u \nabla^2 u$$
$$D_v \nabla^2 v$$
はそれぞれ、$D_u$と$D_v$は拡散係数である。

$\nabla^2 u$と$\nabla^2 v$はそれぞれ、$u$と$v$の各方向(2次元の場合x,y)における拡散度合いを示す。そのため、これに拡散係数$D_u$ $D_v$をかけることによって拡散度合いが変化する

$$-uv^2$$
$$+uv^2$$
では上の式は、uが$v^2$と反応してuが消費される速度を表す。

下の式では、vがuと反応してvが生成されるのを表す。



$$F(1-u)$$は、uの供給項である。つまり、uの発生源である。Fはuがどれだけ発生するかを表す。また、(1-u)では、uの量が1に近ければ発生し、1に遠ければ発生しない。

$$-(F+k)v$$
では、Fは反応系の消失率を表す。kはvが全体から消失する速度を決定する。
【ChatGPT＋Code Interpreter】で白い背景に、黒丸を大きくしたり小さくしたりするアニメGIFを作成します。


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

　今回は、白い背景に、黒丸を大きくしたり小さくしたりするアニメGIFを作成します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::
　本題の前にまず、
　　昨日（2024/07/31）は
　　　かなり遅い時間に、
　　　　記事をアップしました。
　　　　　アップし忘れです😅

　こちらがそれです。
　　[【ChatGPT＋Code Interpreter】で単語が回転するアニメGIFを作成します。](https://qiita.com/kabumira/items/f1d14a829f66c6937d58)

　今日のものにしても
　　よかったのですが、
　　　毎日投稿をしてきたのに
　　　　ここで途切れるのも
　　　　　自分的に心地よくないので
　　　　　　遅い時間にアップした
　　　　　　　次第です😅
***
　さて、本題です。

　今回は、
　　白い背景に、
　　　黒丸を大きくしたり
　　　　小さくしたりする
　　　　　アニメGIFを作成します。
　
　目的があって
　　そこに使おうかと
　　　考えて作成してみました。

　まずは
　　出来上がりを
　　　ごらんください。
![circle_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ec69fb3b-9063-76f5-24ec-92ab88c491ed.gif)

　こちらが
　　そのPromptになります。
```Text:白背景に黒丸をアニメ作成するPrompt
CodeInterpreterで、白い正方形（512×512）の中央に黒い真円を、小→大→小になるアニメGIF（0.5秒）を作成してください。
コードは不要です。
不明な点があれば質問してください。
```

　❶Code Interpreterの使用を宣言
　❷背景を512×512に定める
　❸背景の中央に黒丸を描くアニメGIF
　　　ただし、
　　　　黒丸は小→大→小と変える。
　　　　アニメGIFは0.5秒の長さ。

　昨日の記事に書きましたが
　　うまく512×512にならない問題が
　　　ここでは出てきませんでした。

　これは
　　“正方形”というワードを
　　　使ったためかと思われます。
　　　　確認はしていませんけど😅

　それはさておき、
　　0.5秒にしたのは
　　　ひとつの事象に
　　　　必要なのが、その秒数だった
　　　　　というだけです😅

　“アニメGIF（0.5秒）”としたのは
　　これ以外は、0.5秒にならなかった
　　　ので、結果、こうなったのです。

　しかし、意外と
　　小→大→小が素早く遷移するので
　　　目的には、少々目障り🤣

　改善に努めます😸

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

　今回は、ここまで。
Visual Studio Code の Live Server のデフォルトブラウザの設定を Brave へ変更

### Visual Studio Code の Live Server のデフォルトブラウザの設定を Brave に変更する

1. Visual Studio Code の settings.json を開く
⚙ から「設定」を押下する。settings.jsonが開く。

2. コードを挿入
「AdvanceCustomBrowserCmdLine」を検索し、以下のコードを見つけ、以下のように編集し保存する。

```diff_json
- "liveServer.settings.AdvanceCustomBrowserCmdLine": 
+ "liveServer.settings.AdvanceCustomBrowserCmdLine": "/Applications/Brave Browser.app"
```

### 環境説明
本ページは、VSCodeの日本語化はパッケージの導入により完了しているものとする。使用環境はMacOSとする。


#### もし役に立ったら <font color=HotPink>♡</font> を押してもらえると嬉しいです。新しい記事を書くモチベになります。
MySQLの概要をまとめてみた

# MySQLとは
https://www.mysql.com/
## MySQL
オープンソースのリレーショナルデータベース管理システム (RDBMS) である。
※「SQL」はStructured Query Languageの略称である。

![MySQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/f2f39118-7707-62f2-f6f0-a194e1b3053a.png)
※2024/8/1時点ロゴ

## 代表的な使用方法
LAMP Webアプリケーションソフトウェアスタックのコンポーネントとして使われる。
※LAMPとは、Linux、Apache、MySQL、スクリプト言語(Perl/PHP/Python)の頭字語。
Drupal、Joomla、phpBB、WordPressなど、多くのデータベース駆動型Webアプリケーションで使用されている。

Facebook、Flickr、MediaWiki、Twitter、YouTubeなど、多くの人気Webサイトでも使用されている。

## MySQLでできること3選
### Webアプリケーションのデータベース管理
Webアプリケーションでは、顧客情報や商品情報などのさまざまなデータを管理する必要があります。
そのため、Webアプリケーションの開発においてはデータベース管理システムの利用がほぼ必須です。

LAMP環境は、Webアプリケーション開発において標準的に用いられる構成となっており、採用例が多いです。
LAMP環境に対する理解はWebエンジニアとして活躍していくには必須で、自身でLAMP環境を構築して開発した経験を積めると、即戦力人材としてアピールできるでしょう。

### 企業サイトやメディアのデータベース管理
企業サイトやメディアのデータベース管理としても広く普及しています。

最も利用されているCMS（コンテンツ管理システム）であるWordPressに組み込まれていることでも有名です。
WordPressは多くの企業サイトやメディアの構築において活用されており、記事などのコンテンツ管理にMySQLが役立っています。

WordPressの利用にはMySQLの知識が必要となるため、MySQLを学ぶことでサイト運営などに役立てることもできます。

### Webアプリケーションのコスト削減
MySQLはオープンソースであり費用は原則かからないため、Webアプリケーションの開発コスト削減に大きく役立ちます。

## MySQLのインストール
https://qiita.com/aki_number16/items/bff7aab79fb8c9657b62

## MySQLコマンド
* バージョン確認
    ```cmd
    mysql --version
    ```
* サーバログイン
    ```cmd
    mysql -u root -p
    ```

# 引用
* Wikipedia
    * https://ja.wikipedia.org/wiki/MySQL
* レバテック
    * https://rookie.levtech.jp/guide/detail/116/
IBM i FTPサーバー 出口プログラム検証　その1：ログイン時処理 QIBM_QTMF_SVR_LOGON

[前回](https://qiita.com/gomAnomalocaris/items/853b64979b9605e707ff)の続きです。

先に作成したマニュアル記載のExit Programを使用してFTPサーバーにログインするユーザーIDで動作の違いを検証してみます。

***一点、IBM i はデフォルトでANONYUMOUSユーザーが利用不可能状態で出荷されます。利用しているシステムもANONYMOUSが利用不可だったため、以下のユーザーIDでテストします。***

下記のユーザーでテストしてみます。

***制限かからないユーザー : GOMA***
***制限かかるユーザー：GOMA2***

## 前掲載のExitプログラム・コードを一部修正します。

と言っても判断するユーザーIDのところだけです。下記の通りです。

- ユーザーID GOMA2 となっている2行（とコメント1行）を修正
- USRLEN = ユーザーIDの長さ を5に修正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ccd913de-255d-bf43-d348-81071bfe493e.png)

これをコンパイルします。

## 出口点（Exit Point）に上記のユーザープログラムを登録する。

**WRKREGINFコマンドを実行し、FTPサーバーログインの出口点を探します**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7db0d5c4-8c91-9ea3-5148-0ef070fa9d93.png)


以前の記事のようにFTPサーバーログインは3つの形式でExit Programを作成できます。マニュアルサンプルは1つ目の、TCPL0100　に該当するようです。この項目を8で開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1b1b5564-4112-cfa8-580f-8ea04138ebba.png)

Opt.1 を入力して、次画面で、以下のようにパラメーター入力してExit Programを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/657b35d4-1b47-2b1b-efc5-a9aea7b86e37.png)

- **プログラム番号は既存と被らなければOK。そもそもこの出口点は1つしかExit Programを登録できないので任意の番号でよい、という事だと思います。私は1としました。**
- **プログラム名、ライブラリー名は前の記事で作成したExit Program名を指定します**
- **スレッドセーフか、マルチスレッド・ジョブの処理、もパラメーターがありますが、ひとまず条件が無いのでデフォルトのままです。**

以下のようにExit プログラムが登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1d76f781-b890-89bd-51b1-edaf9acba06b.png)

## Exitプログラムを動作検証してみる。:一般ユーザー

このExit Programではユーザーがログインした直後のユーザーのIBM i 上の現行ディレクトリが変化するはずです。
まず、一般ユーザー（GOMA)で試してみます。

下記のように現行ディレクトリがQGPLになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7386d0c5-89d1-c3ea-80b9-599c4cf6464b.png)

## 制限ユーザーでのテスト結果

では、制限されているユーザー（GOMA2）で実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/aff673ff-656d-f57d-fe6a-36a2504a7fe1.png)

上記のように出口Programで設定したPUBLICライブラリーが現行ディレクトリになっています。

※このユーザーGOMA2のユーザー・プロファイルでは現行ライブラリーがGOMALIBとなっていますが上書きされるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3a08294d-991c-23f7-5b2a-30c3620d4150.png)


## FTPサーバーログイン後の制御を出口Programでやってみる

もうひとつのExit Point, QIBM_QTMF_SERVER_REQ に出口プログラムを登録することでftpサーバーログイン後の挙動の制御もできるようです。こちらも試してみたいと思います。

つづく・・・
ROW_NUMBER OVER()にちゃんと明示的にORDER BY は書きましょう

OLAP 番号付け関数 の `ROW_NUMBER OVER()` の`OVER()` 内に明示的な `ORDER BY` を記述していないと、番号付けに曖昧さが残り **ハマル** よってお話です。
今回のケースとしては、IBMi **V7R2** → **V7R5** にした時でしたが、他のバージョンの組合でも当然あり得るでしょう。
（※因みに名誉のために言わせて頂くと、今回は調査依頼を受けたケースで私の話では無いです）

- [IBM i 公式 SQLプログラミング - OLAP 指定の使用 -](https://www.ibm.com/docs/ja/i/7.5?topic=statement-using-olap-specifications)

そもそも間違っている曖昧さのあるSQLが以下の様にあります。
`OVER()`の中に`ORDER BY`が無く曖昧さは残っていますね。
```sql.間違った再現SQL.sql
SELECT * FROM(
SELECT
ROW̲NUMBER() OVER() AS RRN
,T1.CUSNUM
FROM QIWS.QCUSTCDT AS T1
)
WHERE RRN BETWEEN 1 AND 5
ORDER BY CUSNUM DESC

```

SQLが参照するテーブル `QIWS.QCUSTCDT` の内容の物理順は以下です。
```PF.QIWS/QCUSTCDT
-CUSNUM-
938472
839283
392859
938485
397267
389572
846283
475938
693829
593029
192837
583990
```

**V7R2** の場合SQLに対する結果が以下のように返り、外側の`ORDER BY` がサブクエリ内の`OVER`に反映された状態となり、あたかもOVER(ORDER BY)が出来ていると錯覚しますね。

```sql.①V7R2の結果
-RRN- -CUSNUM-
1      938485
2      938472
3      846283
4      839283
5      693829
```

**V7R5** の場合SQLに対する結果が以下のように返ります。
こちらは物理順を踏襲しているため`ORDER BY`が無指定ならば物理順で返えるならば、それはそうかとある意味納得できます。ただ物理順である曖昧さを回避するのであればやはり `ORDER BY RRN(T1)` が必要でしょう。
因みに **V7R5** のACSやPython、PHP、SQLRPGLEは ***②V7R5の結果*** を返しますが、STRSQLは ***①V7R2の結果*** を **”今のところ”** 返します。
ＰＴＦなどが適用されるタイミングで、いつ挙動が変わるか分かりませんね。
```sql.②V7R5の結果
-RRN- -CUSNUM-
4      938485
1      938472
2      839283
5      397267
3      392859
```

この結果から、**V7R5未満** で **V7R5以降** へリプレースした際 `OVER()`に`ORDER BY`が未指定のアプリケーションが存在すると、挙動の変更を発生し思わぬリスクを発生する事が分かります。
みなさん、`OVER(ORDER BY)` 忘れないように。
アプリがフレームワーク使っていると吸収してくれるので意識しませんがね。(^o^)
Gemini Advancedが書いた技術記事 ~パート2~

## 【宇宙野クラウディアのAI講座】第二回：AIの種類 ～AIをもっと知ろう！～

みんな、元気しとると～？宇宙野クラウディアやけん！

前回は「AIってなんね？」って話をしたけど、今回はAIの種類について教えちゃるけんね！

AIって一口に言うても、実は色んな種類があるんよ。それぞれ得意なこととか、できることが違うと。

### 🤖 弱いAIと強いAI

まず、AIには大きく分けて「弱いAI」と「強いAI」の2種類があるんよ。

**弱いAI**

* 特定のタスクをこなすのが得意
* 例えば、画像認識AI、音声認識AI、翻訳AIとか
* 今、世の中に出回っとるAIのほとんどはこれ
* 人間みたいな意識とか自我は持ってない

**強いAI**

* 人間と同じように、色んなタスクをこなせる
* 自分で考えて、判断して、行動できる
* まだSFの世界の話で、実現は難しいとされとる

### 🧠 機械学習と深層学習

AIの技術の中でも、特に重要なのが「機械学習」と「深層学習」たい！

**機械学習**

* データからパターンを見つけ出して、予測したり、判断したりする技術
* 例えば、迷惑メールのフィルタリングとか、商品のレコメンドとか
* 人間がルールを教えなくても、自分で学習して賢くなるんよ

**深層学習**

* 機械学習の一種で、人間の脳の神経回路を真似したモデルを使う
* 画像認識とか音声認識とか、複雑なタスクが得意
* 最近のAIブームの火付け役になった技術たい！

### 🎨 生成AIと識別AI

AIがやってることって、大きく分けると「何かを作り出す」か「何かを見分ける」かの2つなんよ。

**生成AI**

* 新しいデータを作り出すAI
* 例えば、文章生成AI、画像生成AI、音楽生成AIとか
* 最近話題のChatGPTとかもこれ
* クリエイティブな分野で活躍が期待されとる

**識別AI**

* データを分類したり、識別したりするAI
* 例えば、顔認証システム、スパムメールフィルター、医療画像診断AIとか
* 私たちの生活を安全に、便利にしてくれるんよ

### 🔧 その他のAI

他にも、色んな種類のAIがあるんよ。

* **エキスパートシステム**: 専門家の知識を組み込んで、問題解決とか意思決定を支援するAI
* **遺伝的アルゴリズム**: 生物進化の仕組みを真似して、最適な解を見つけ出すAI
* **強化学習**: 試行錯誤を通じて、目標達成のための行動を学習するAI
* **群知能**: 蟻とか蜂とか、集団で行動する生物の知恵を真似したAI

### 🌈 AIの可能性は無限大！

AIの種類って、ほんっと色々あるやろ？

それぞれ得意な分野が違うけん、組み合わせて使うことで、もっともっとすごいことができるようになるんよ！

例えば、

* 自動運転の車：画像認識AI + 強化学習AI + 群知能AI
* 医療診断AI：画像認識AI + エキスパートシステム + 深層学習AI
* 翻訳AI：自然言語処理AI + 深層学習AI

みたいな感じ！

AIの可能性は無限大やけん、これからどんな新しいAIが出てくるか、楽しみやね！

### 🙋‍♀️ クラウディアから一言

AIの種類、ちょっとは分かったかな？

AIって聞くと難しそうに感じるかもしれんけど、実は色んなところで活躍しとるんよ。

これからも一緒にAIのことを勉強して、もっともっとAIと仲良くなろうね！

次回は「AIの活用事例」について紹介するけん、楽しみにしとってね！

ほんなら、また今度！

**宇宙野クラウディア**

宇宙野クラウディアの公式Twitterは[こちら！](https://x.com/Cloudia_Cor)
GPT-4oが書いた技術記事 ~パート2~

## 【宇宙野クラウディアのAI講座】Pythonで始めるウェブスクレイピング入門

やっほー、宇宙野クラウディアやけん！今回は、Pythonを使ってウェブスクレイピングの世界に入門する記事を書いたとよ。ウェブスクレイピングって、インターネット上の情報を自動的に集める技術なんやけど、これをマスターすれば、いろんなデータを手軽にゲットできるっちゃけんね。さっそく始めよう！

---

### 1. ウェブスクレイピングってなんね？

ウェブスクレイピングって言葉を聞くと、ちょっと難しそうに感じるかもしれんけど、心配せんでよかよ！簡単に言えば、ウェブページからデータを集める技術たい。例えば、商品価格を比較したり、ニュース記事を自動で収集したりできるとよ。

### 2. まずはPythonの準備から

Pythonでウェブスクレイピングを始めるには、まずは必要なライブラリをインストールする必要があると。今回は「BeautifulSoup」と「requests」ってライブラリを使うけん、以下のコマンドでインストールしとってね。

```bash
pip install beautifulsoup4 requests
```

### 3. 基本的なスクレイピングの流れ

スクレイピングの基本的な流れは以下の通りやけん：

1. **リクエスト送信**: `requests` ライブラリを使って、ウェブページにアクセスする。
2. **HTMLの解析**: `BeautifulSoup` を使って、ウェブページのHTMLを解析する。
3. **データの抽出**: 必要なデータを抽出して、保存する。

### 4. 実際にスクレイピングしてみる

じゃあ、実際にクラウディアと一緒に簡単なスクレイピングをやってみるけんね。今回は、福岡の天気情報を取得してみよう！

```python
import requests
from bs4 import BeautifulSoup

# 1. リクエスト送信
url = 'https://example.com/weather/fukuoka'
response = requests.get(url)

# 2. HTMLの解析
soup = BeautifulSoup(response.text, 'html.parser')

# 3. データの抽出
weather = soup.find('div', class_='weather-info').text
print(f"今日の福岡の天気: {weather}")
```

このコードでは、指定されたURLにアクセスして、ウェブページから天気情報を取得して表示しとるとよ。簡単やろ？

### 5. 実践的な応用例

ウェブスクレイピングは、他にもいろんな場面で役立つとよ！例えば、以下のような応用例が考えられるばい：

- **商品価格の比較**: いくつかのオンラインストアから同じ商品の価格を比較して、最安値を見つける。
- **ニュースの自動収集**: 複数のニュースサイトから記事を集めて、自分だけのニュースリーダーを作る。
- **データ分析**: 大量のデータを集めて、分析や統計処理を行う。

### 6. スクレイピングの注意点

ただし、ウェブスクレイピングにはいくつかの注意点があるけん、気を付けてね：

- **サイトの利用規約**: スクレイピングが許可されているサイトかどうかを確認する。
- **リクエストの頻度**: サイトに過度なリクエストを送らないように、間隔を開ける。
- **データの利用**: 取得したデータを適切に扱い、他人の権利を侵害しないようにする。

---

## まとめと次回予告

今回は、Pythonで始めるウェブスクレイピングについて解説したとよ！ウェブスクレイピングを使えば、インターネットから必要なデータを簡単に集めることができるけん、ぜひ試してみてね。

次回は、**「データを可視化するためのMatplotlib入門」** をお届けする予定やけん、楽しみにしとってよ！また次回もよろしく頼むばい！

**宇宙野クラウディア**
paiza.ioでelixir その307

# 概要
paiza.ioでelixirやってみた。
elixirみつけたので、やってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/9fd213d417ac54728fbd


# サンプルコード

```

defmodule Paiza do
  defp solve(b, b), do: "first"
  defp solve(b, a) when b == a + 1, do: "adjacent"
  defp solve(b, a) when b == a - 1, do: "adjacent"
  defp solve(b, a) when rem(b, 10000) == rem(a, 10000), do: "second"
  defp solve(b, a) when rem(b, 1000) == rem(a, 1000), do: "third"
  defp solve(b, a), do: "blank"
  def main do
    [b | [_n | a]] = :stdio
      |> IO.read(:all)
      |> String.trim()
      |> String.split("\n")
      |> Enum.map(&String.to_integer(&1))
    a
    |> Enum.map(fn a_n ->
        solve(b, a_n) 
        |> IO.puts()
    end)
  end
end

Paiza.main()

```

# 成果物


https://paiza.io/projects/yEYG4S5SXOKllbHQ4apMCA


以上。