OmniAICreator/Qiita-1.07M huggingface dataset:
scm-manager で作成される svn リポジトリをバックアップする

scm-manager で作成されるsvn リポジトリのディレクトリは単純にリポジトリ名ではなくハッシュか何かで作られていて、かつその情報が metadata.xml に格納され、リポジトリディレクトリが .../data にあるかと思いきや同じ ".../data" が2つ作成されているなどチョーめんどくさいのでどうにかする。

基本的にはプロジェクト情報が記述された metadata.xml を読み込んで対象ディレクトリを決定し、バックアップ名称も決める。

svn-backup-dumps.py に -i を渡しているが週1回程度フルバックアップになるようこのオプションなしで実行しないと差分リビジョンが増えすぎてつらいことになる

```php
<?php
$backup_directory_base = '/home/vagrant/backup/';
$repository_directory_base = '/var/lib/scm/repositories/';
$svn_buckup = '/usr/local/bin/svn-backup-dumps.py';

$metadataFiles = glob($repository_directory_base. '*/metadata.xml');
foreach($metadataFiles as $metadataFile){
    $metadata = new SimpleXMLElement(file_get_contents($metadataFile));
    $backup_directory = $backup_directory_base.$metadata->namespace . "_" . $metadata->name;
    if (!is_dir($backup_directory)) {
        mkdir($backup_directory);
    }

    $repository_directory = $repository_directory_base . $metadata->id . '/data';
    $command = "{$svn_buckup}  -i -z -q {$repository_directory} {$backup_directory} > /dev/null &";

    exec($command);

}
```
意思決定マトリックス



+ [Advanced Rules with Business Rules Engine](https://trailhead.salesforce.com/content/learn/modules/advanced-rules-with-business-rules-engine)
+ [ビジネスルールエンジンの設定](https://help.salesforce.com/s/articleView?id=sf.set_up_business_rules_engine.htm&type=5)
+ [アプリケーションの意思決定マトリックスの作成](https://help.salesforce.com/s/articleView?id=sf.create_decision_matrix.htm&type=5)

# トレイルヘッド

+ [ビジネスルールエンジンを使用した高度なルール](https://qiita.com/Keiji_otsubo/items/00c351e9caa9549c870d)


# エラー

+ [【未解決】Error while creating Decision Matrix/BRE](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LW8A3)
Git にて特定のコミットハッシュの内容を手元で再現する手順

### 要約

* リモートリポジトリから特定のコミットを取得し、現在のブランチをそのコミットにハードリセットします。

```bash
# リモートリポジトリから特定のコミット（<hash値>で指定）を取得し、
# 浅いクローン（shallow clone）を行います。
git fetch --depth 1 origin <hash値>
# 現在のブランチがFETCH_HEADの位置に強制的に移動し、
# ワーキングディレクトリがリセットされ、最新のコミット状態になります。
git reset --hard FETCH_HEAD
```

### MEMO:
* 既にマージされちゃってたり、リバートされちゃってたりして、
「HEADだと不都合だけど、この時のこのコミットで動作確認などをしたいとき」。
* ピンポイントでコミットハッシュ(SHA)をベースに手元に状態を復元！
ABC256-C-Filling 3×3 array

### 今回は、C-Filling 3×3 arrayの模範解答であるDFSを解説します。
はじめに模範解答のコードを示しておきます。
```C.cpp
#include <iostream>
using namespace std;
int h[3], w[3], a[3][3];
long long ans = 0;
void dfs(int ij) {
  int i = ij / 3, j = ij % 3;
  if (i == 3) {
    ans++;
    return;
  }
  if (i == 2) {
    int x = w[j] - a[0][j] - a[1][j];
    if (x <= 0) return;
    a[i][j] = x, dfs(ij + 1);
  } else if (j == 2) {
    int x = h[i] - a[i][0] - a[i][1];
    if (x <= 0) return;
    a[i][j] = x, dfs(ij + 1);
  } else {
    for (int x = 1; x <= 30; x++) a[i][j] = x, dfs(ij + 1);
  }
}
int main() {
  for (int i = 0; i < 3; i++) cin >> h[i];
  for (int j = 0; j < 3; j++) cin >> w[j];
  if (h[0] + h[1] + h[2] != w[0] + w[1] + w[2]) {
    cout << 0 << "\n";
    return 0;
  }
  dfs(0);
  cout << ans << "\n";
}

```


このコードは、3x3のマス目に数値を書き込む方法を探索するためにDFS（深さ優先探索）を使用しています。以下に、コードの主要な部分を詳しく解説します。

### 1. 変数の宣言:
- `h[3], w[3]`: 各行と列の合計値を格納する配列。
- `a[3][3]`: 3x3のマス目の値を格納する2次元配列。
- `ans`: 条件を満たす書き込み方法の数。

### 2. DFS関数 (`void dfs(int ij)`):
この関数は、現在のマス目の位置`ij`を引数として受け取り、そのマス目に数値を書き込む方法を再帰的に探索します。

- `int i = ij / 3, j = ij % 3;`: `ij`を使用して行`i`と列`j`を計算します。
- `if (i == 3)`: すべてのマス目が埋まった場合、答えのカウントを増やします。
- `if (i == 2)`: 最後の行の場合、列の合計から既に書き込まれている値を引いて、現在のマス目の値を計算します。
- `else if (j == 2)`: 最後の列の場合、行の合計から既に書き込まれている値を引いて、現在のマス目の値を計算します。
- `else`: それ以外の場合、1から30までのすべての値を試して、次のマス目に進みます。

### 3. メイン関数 (`int main()`):
- 入力を受け取ります。
- `if (h[0] + h[1] + h[2] != w[0] + w[1] + w[2])`: 行と列の合計が等しくない場合、条件を満たす方法は存在しないため、0を出力します。
- `dfs(0)`: 最初のマス目からDFSを開始します。
- 最後に、答えを出力します。

### 例:
入力が `3 4 6 3 3 7` の場合、以下のように動作します。

1. 行と列の合計が等しいか確認します。
2. 最初のマス目からDFSを開始します。
3. 各マス目に1から30までの値を試しながら、条件を満たすか確認します。
4. すべてのマス目が埋まった場合、答えのカウントを増やします。
5. 最終的に、答えとして1が出力されます。

このように、DFSを使用して3x3のマス目に数値を書き込むすべての方法を探索し、条件を満たす方法の数を計算しています。


## 参考記事
[C-Filling 3×3 array 解説 by Nyaan](https://atcoder.jp/contests/abc256/editorial/4129)
Django基本編２～view.pyを作って、urlsを紐づけてみた。果たしてブラウザからのぞけるか？(・・;)

今回はシンプルなviewを作ってみて、実際にブラウザから結果を覗くところまで
やってみようと思います。うまくいきますように。

１．Viewの作成
（１）view.pyを作成する
　アプリケーションフォルダ作成時に自動生成されたview.pyを修正していきます。
　やりたい事は、ユーザーからのリクエストを受け取り「どーもー」と
　レスポンスを返すことです。

　ざっくりした手順は、、、
　　・アプリケーションフォルダのview.pyを開く
　　・赤くくくったその１：HttpResponseをインポートする
　　・赤くくくったその２：index(request)という関数を書きます。
　　　httpresponseを使用して、簡単なHTMLをreturnで返しています。
　　　（今回は引数(request)はお使用しませんが、今後使うことがあるかとおもうので
　　　　おまじないで定義してます）
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/837d84d7-1fe7-b562-4ed5-065e7bac13b7.jpeg)
（２）アプリケーションフォルダに、urls.pyを作成します。
（1)で修正したview.pyに追加したindex関数の情報を記載していきます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/fdc84262-8581-2423-8912-c9cae2c9fd40.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/0f1e262e-8683-477a-dfd6-736b23e65b76.jpeg)
下記のようにライブラリのインポート及び、処理を書き込みます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/dca092a7-d514-d94f-81c0-c3567d1f4fb0.jpeg)
（３）プロジェクトフォルダ側のurlsを修正します。
　　　現状、プロジェクトフォルダ側のurls.pyには作成したアプリケーションフォルダ
　　　norizo_appの情報を記載されておらず、紐づけを発生させる必要があります。
　　　おさらいとして、プロジェクトフォルダのsetting.pyを覗いてみましょう
　　　　![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/4ef2d248-6253-6109-f885-4d62b801b7dd.jpeg)
　・その１
　　　インストールアプリケーションたちには、今回作成したアプリケーションフォルダを
　　　作成した「norizo_app」が追加されている
　・その２
　　　ＵＲＬＳ情報の参照先は「norizo_project.urls」と定義している。

　　※今回、norizo_project.urlsをnorizo_appに紐づける必要があります。

  　　　では、以下のように修正します。
　　　　　・プロジェクトフォルダのurls.pyを開く
　　　　　・赤くくくったその１
　　　　　　　urlsライブラリの中の、includeをimportする。
　　　　　・赤くくくったその２
　　　　　　　pathに今回追加したアプリケーションフォルダを割り当てて
　　　　　　　配下のurls.pyをincludeで紐づける。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/92fdea19-0ba9-ae46-a41a-1a20b64d085b.jpeg)
（４）Djangoを起動する
　　仮想環境をactivateし、プロジェクトフォルダに移動したうえで、、、
　![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/2aa9a384-49bc-85a6-32fc-5e7218ae295d.jpeg)
　　以下のコマンドを入力し実行します。
　　「python manage.py runserver」
　　
上手く起動しました。「リンクにアクセス」をクリックしてブラウザを起動します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/9a3fd050-6720-ae1a-333d-779d5e57583f.jpeg)
そのまま起動すると下記のように表示されますのでURLを正しく入力します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/132bd83d-af9a-a82b-6f12-0676acb8b27f.jpeg)
以下のように入力し実行します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/c94a5efb-083e-a9c1-b2ed-726d790eb9bd.jpeg)
成功です。「どーもー」と表示されています。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/10caba27-cf2d-cf35-4323-7dc1f5036eac.jpeg)

ひとつきになっていたのが、、、
プロジェクトファイルのurls.pyにもともと記載されていたこのurlは何でしょうか
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/6680cb56-8c48-564e-560b-e59b836b2e5b.jpeg)
ちょっとアクセスしてみますね。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/278f8798-57f1-b0be-65c7-8501491942f7.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/dcb6386a-bf63-603e-b465-bcaaebef63a3.jpeg)
ジャンゴ行政ってすごい翻訳、、、(笑）
管理画面でした。
React備忘録#1「簡単な最低限の知識」

# React基礎知識の見直し
・今まで上っ面だけ理解した気になってReactを使用していたので、見直しを兼ねて記事を残します。

## 1. そもそもReactって何？
概念の見直しからします。
従来のReactなどのFrameWorkを用いないでwebサイトを制作すると、DOMやStyleをJavaScriptで変更した場合画面構成の際にレンダリングがかかります。
一方Reactを用いて作成した場合条件にもよりますが、DOMやStyleの変更をした場合にレンダリングは起こりますが効率よくレンダリングしてくれます。

さらにReactの基本構文はパッと見だと既存のものと違い分かりにくいと感じるかもしれませんが、実はHTMLでの作成の方法をそのまま使用すると簡単なwebサイトなら作れます！！
**例：**
```
function Sample() {
  return (
    <div>
      <p>hello world</p>
    </div>
  );
}

export default Sample;
```
上記のようにreturn()の中にHTML構文があると思います、Reactではこの部分が描画されるコードになります。
作成の際には、基本的にHTML構文を従来通り記述すればOKです！！
じゃあreturn()以外はというと、Reactでは上記全体をまとめてこれは**コンポーネント**と呼ばれています。
コンポーネントは簡単にいうと、web作成のためのパーツと覚えておいてください。
Reactではこのコンポーネントを色々と作っていき画面を構成していきます。
コンポーネントの作成構文は**JSX構文**と呼ばれ、記述しているファイルの拡張子は**jsx**となります。

## 2.今回最低限覚えたいこと
- コンポーネント
- state

以上二つは今回最低限覚えておきたい知識になります。
**・コンポーネント**
項目1で触れた通りで、web作成のためのパーツと覚えてください。
作成構文は**JSX**、記述されたファイルの拡張子は**jsx**となります。

**・state**
stateとは、Reactで値の保持などで使用されるものです。　
**例：**
```
import './App.css';
import { useState } from 'react';

function App() {
  const [number, setNumber] = useState(0);
  return (
    <div className="App">
      <p>{number}</p>
      <button onClick={() => setNumber(number + 1)}>加算</button>
    </div>
  );
}

export default App;
```
例の中でuseStateメソッドを使用して作成されているものがありますが、このnumberとなっているものがStateになります。
実際に上記例をsrc/App.jsに記載して、npm startでローカルサーバーを立ち上げてもらえると確認できますが、加算ボタンを押すと数値が増えていくと思います。
これは何故かというと、State作成時にnumberと同時にできたsetNumberのおかげになります。
実は、Stateの作成時には値が保存される変数と変数に値を保存させるメソッドが同時に作成されます。
```const [stete名, set+頭文字大文字のstate名] = useState(stateの初期値 or 初期値無しなら空)``` の形でStateは基本作成します。
ここでできたset~がメソッドになっていて**set~(stateに保存したい値)** の形で使用します。
例ではボタンが押された時に動く様にしてnumber+1の値を保存する様にしています。
すると
```<p>{number}</p>```
で出力される値が増加していくことが確認できると思います。
この様にStateの値が変化すると内部的には再レンダリングが走るのでDOMが再構築されます。

## 3.まとめ
今回の簡単な仕組みだけでもバニラJavaScriptで書くとちょっとめんどくさいですが、Reactで作るとこれだけの量ですみます。
【Moment.js】MonentオブジェクトをJSON.StringifyするとUTC時刻に変換されてしまう

# はじめに
今どきMomentオブジェクトを取り扱う人も少ない、こんな事する人いないと思いますが、、
諸事情あり躓いたので、備忘録として残しておきます。

# 本題

![スクリーンショット 2023-10-11 14.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/50a4069f-b28a-ebae-39c3-1617979ea05d.png)

キャプチャのような、`Fri Oct 27 2023 00:00:00 GMT+0900 (日本標準時)`のMomentオブジェクトがあったとして、
このオブジェクトを`JSON.stringify()`すると、`2023-10-25T15:00:00.000Z`と出力されます。（-9時間された時刻）

JSTがUTCに変換されてしまう挙動らしい
[WSL2 Ubuntu] nvmからasdfへの移行

## nvmによるNode.js及びnpmの削除
- こちらの記事を一部（.bashrcなどに）読み替えればOK！
- 尚、`$ rm -rf $NVM_DIR` により、nvm自体も削除されています

https://zenn.dev/doshimaf/scraps/5d80e1190c8261

## asdfの導入
- 未だ入っていないなら `$ sudo apt install curl git`
- `$ cd` としてホームディレクトリへ移動
- `$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1`（バージョンは下記公式サイトを参照して下さい）
- ~/.bashrc の最後尾に次の記述を追加
```bash:.bashrc
# asdf setting (Bash & Git)
. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
```
- `$ source ~/.bashrc` として反映
- ~/.default-npm-packages に次の記述を追加
```config:.default-npm-packages
yarn
typescript
ts-node
typesync
npm-check-updates
```
- Node.jsインストールのためのプラグイン及びNode.js本体をインストールし、グローバルに使用するNode.jsのバージョンを指定
1. `$ asdf plugin add nodejs`
2. `$ asdf install nodejs latest`
3. `$ asdf global nodejs latest`
- `$ node -v` として確認
- 尚、.default-npm-packages に記述したnpmパッケージ群は、Node.jsインストールに伴い、自動でインストールされます

https://asdf-vm.com/guide/getting-started.html#_1-install-dependencies
jemallocでSidekiqのメモリリークを止める

この記事は
===

* SidekiqをDocker環境で安定稼働させるためのメモです

困っていたこと
===

* [Sidekiq](https://github.com/sidekiq/sidekiq)は便利なワーカサーバなのですが、長時間起動しているとメモリリークしていく特性があります
* [sidekiq-worker-killer](https://github.com/klaxit/sidekiq-worker-killer)など、無理やり再起動をかますライブラリも存在するのですが、Dockerとの相性が悪くコンテナが終了してしまうので、今っぽい環境ではうまく使えません

原因
===

* そもそもメモリの断片化が原因らしく、Sidekiqの問題というかRuby自体の問題のようです
* pumaも放っておくとどんどんリークするから、[puma-worker-killer](https://github.com/zombocom/puma_worker_killer)は必須ですもんね・・・

jemalloc
===

* これを解決できるのが[jemalloc](https://github.com/jemalloc/jemalloc)です
* これは普通のmalloc（glibc malloc）と同じメモリ管理をする役割のライブラリですが、独自の断片化対策がされているんだそうです
* Rubyがjemallocを利用するように対応すれば、エンドレスのメモリリークを止めることができます

対応方法
===

* Dockerファイルに下記を追記するだけです（debianベースのコンテナの場合）

```Dockerfile:Dockerfile
RUN apt-get install -y libjemalloc2
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
```

* ちなみにApple Siliconの開発機上のdockerで動きを見る場合は下記になります（パスが変わる）

```Dockerfile:Dockerfile
ENV LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2
```

効果
===

* datadogのグラフを見ていると、それまで右肩上がりに上がり続けていたメモリ使用量が横ばいになりました！
* 数ヶ月見ていますが、特に動きが不安定になって落ちるなどもなく、性能も変化なく安定稼働しています

LD_PRELOAD
===

* 上記の```LD_PRELOAD```という環境変数が入ると、このコンテナで動いているプログラムほぼ全てにおいて、jemallocが利用されるようにすげ変わることになります
* つまりRuby以外のプログラムが想定外の動きをする可能性を完全に否定はできないということです

信頼性について
===
* Sidekiqを作っている人たちもjemallocを推しているそうなので、そういう意味ではそこの相性問題はそうそう起こらないのかなーと思います
* 一方で、上記LD_PRELOADの方式は、若干トリッキーなので注意ではあります
    * Ruby界隈ではかなり検索にひっかかり、比較的に普及した方法なので、ことさらにリスクが高いわけではありませんが・・・
* あるべき論でいうとrubyをビルドする時にjemaloocをリンクするような方式が正しいとは思います
    * [fullstaq-ruby](https://github.com/fullstaq-ruby/server-edition)という、ちゃんとjemallocをリンクしてビルドして配布されているバイナリも存在しているようです
    * この手のはメンテがどこまで続くのが不安なので個人的には避けています・・・（RubyEEとかあったよねー懐）

終わりに
===

* もうメモリで悩まなくてもええんや！
インポート時のNullの上書き


+ [プロスペクトのインポートを行うときに上書きのチェックボックスの動作](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LVbiG)

似たような設定はデータローダにもあるので、おそらく同じ挙動だろうな。

デフォルトでは、データローダは CSV ファイル内の空白のセルを、その項目に変更が必要ないかのように扱います。データローダを使用して項目の値を削除して空白または NULL として表示させたい場合は、データローダの設定を更新してください。

[データローダを使用してレコードを空白または null で更新する方法](https://help.salesforce.com/s/articleView?id=000385542&type=1)


また以下のヘルプの説明から考えると、オフの時はCSV ファイル上の値が「空白」なら何も変換しないのではと思います。Data Laderでもこのような機能をオンにしないとNullで上書きしないので、同じ機能だと思います。
 
Account Engagement の null 値をインポートすることはできません。[既存のデータを上書きする] オプションがオンで、.CSV ファイル上の値が「空白」でも、項目がクリアされることはありません。この理由は、クリアされる値は Salesforce 側から取得される必要があるためです。

[Account Engagement の null 値または空の値をインポートできない](https://help.salesforce.com/s/articleView?id=000383766&type=1)

 
以下の英語の説明でも同じように思います。

How do you clear out the bad data from a Pardot field?

Your first instinct might be to just import a new CSV, and be careful to match up the columns correctly, and also include a new column full of blank cells to overwrite the field you previously mixed up.

And yes, if you just have a couple of swapped fields:

If there is data in every field that you uploaded
And you map the fields correctly
And you select “overwrite existing data”
https://invadosolutions.com/pardot-marketing/fixing-data-import-problems-in-pardot/



> Developer環境では、CSVの値が設定されたのですが 

とのことですが、CSVの値はNull(空白)でなくて、値があったということでしょうか？
そうであれば、その値に更新されると思います。

私の認識ではこの上書きオフはあくまでもNullの時に値をクリアーしないだけです。
Null以外の値があれば、その値に上書きされると思います。
Amazon Lightsail の Bitnamiインスタンスで Let's Encrypt の SSL 証明書をインストールする方法



Bitnamiを利用することで、Webアプリケーションの運用が容易になります。特に、SSL証明書を管理することは、Webサイトのセキュリティを保つ上で重要です。このドキュメントでは、BitnamiにおけるSSL証明書の更新方法について説明します。

## 前提条件
- BitnamiでホストされているWordPressインスタンスにアクセスできること
- ターミナルまたはSSHクライアントを利用してサーバーにアクセスできること

## 手順

### 1. bncertツールの確認
まず、サーバーに`bncert`ツールがインストールされていることを確認します。大抵の場合、`bncert`ツールはインストールされています。

```bash
sudo /opt/bitnami/bncert-tool
```

### 2. bncert ツールの実行
次に、以下のコマンドを入力して`bncert`ツールを実行します。

```bash
sudo /opt/bitnami/bncert-tool
```

実行すると、`domain list []:`と表示されます。この後ろに、ドメイン名を入力します。例として、プライマリドメイン名が`example.com`、代替ドメイン名が`www.example.com`の場合を考えます。以下のように入力してください。

```plaintext
domain list []: example.com www.example.com
```


### 3. リダイレクトの設定
`bncert`ツールは、ウェブサイトのリダイレクトの設定方法を尋ねます。使用できるオプションは表示されるので、適切なオプションを選択してください。

### 4. 変更の確認
これから実行される変更が一覧表示されます。変更内容を確認し、`Y` と入力し、`Enter`を押して確認し、続行します。

### 5. メールアドレスの入力
Let's Encrypt 証明書に関連付けるメールアドレスを入力し、`Enter`を押します。例えば、`you@example.com`と入力します。

```bash
Email address []: you@example.com
```

### 6. Let's Encryptサブスクライバー合意書の確認
Let's Encrypt サブスクライバー合意書を確認し、`Y`と入力し、`Enter`を押して契約に同意し、続行します。

以上で、BitnamiでSSL証明書の更新方法に関する手順は完了です。これらの手順に従って、SSL証明書の更新を行うことができます。また、Bitnamiの公式ドキュメントも参照して、さらに詳しい情報を確認することができます。
リーダブルコードをリーダブルにするぞ（その2）

# はじめに
こんにちは
リーダブルコードの社内向け輪読会の資料です。
以下記事の続きです。

https://qiita.com/eisuke000000/items/70d25e5cdaf8c4e1db94

今回は4~6章をやります。

# 第4章 美しさ
この章で言う「美しさ」はロジックの美しさでなく、見た目の美しさの話です。
改行位置を周りと同じにしたり、インデントをそろえたりといった部分は、フォーマッタをチームで導入すればすぐ解決されるでしょう。
Pythonであれば[Black](https://github.com/psf/black)、TypeScriptやJavaScriptであれば[ESLint](https://eslint.org/)の導入で解決できそうです。
フォーマッタの選定は世の中の主流のフォーマッタの流れに乗ってしまうのが良いと思っています。

ただ、
1. メソッドを使った整列
1. コードを段落に分ける

についてはフォーマッタのみでは解決できなさそうですね。
この辺はレビューで指摘していきましょう。


# 第5章 コメントすべきことを知る
コメントについてはコードで理解できる部分についてはコメントはする必要がありません。
例えば以下のコードにおけるコメントはただのメソッド名の和訳になっています。
```
# 入力されたフォーマットが正しいか確認するメソッド
def checkStrFormat(text):
   ...
```
リーダブルコードの今までの章で、メソッド名や変数名については多少名称が長くなっても情報を入れるべきだと書かれており、コメントは最終手段だと意識するべきです。
(この章でも言及していますが、メソッド名がわかりづらいものであればコメントするよりメソッド名を変更すべきです)

上記のコード例の場合、”なぜ入力された文字列をフォーマットしなければならないのか”をコメントしたほうがよさそうです。
この時、何をコメントすればよいか悩んだら、この章に書かれている通り、監督のコメンタリーのように何を考えていたかをとりあえず書いてしまうとよさそうですね。
コメントはなるべくしないほうが良いと上で書きましたが、とりあえず書いてレビュアーに見せる、あるいは明日の自分に見せる、のようなコメントを書くのは良いことです。
何か書いた後に削るような考え方のほうが結果的に適格なコメントが残せそうです。


# 第6章 コメントは正確で簡潔に
この章は具体例が多く、「コメントは領域に対する情報の比率が高くなければならない」を実際どうすればよいのか、を書いています。

### 6.5 入出力のコーナーケースに実例を扱う
コメントに困ったとき、監督のコメンタリーのようにコメントを書く、といった話が出てきましたが、さらにこちらの書き方のほうが意図を漏れなく伝えられそうです。
コードレビューがあるならば、とりあえず入力と出力と意図を書いて、どういったコメントを書けばよいのかレビュアーと相談する、といったこともありかなと思います。

### 6.7 「名前付き引数」コメント
インラインコメントが使えない言語において、以下のような形でメソッドの引数の説明を追加できる
```
Connect(/*timeout_ms=*/10, /*use_encryption=*/false)
```
確かにこのような書き方はできそうですが、あまり見たことないですね(Javaをあまり書かないからかもしれません)
行は長くなりますが、インデントをうまく使えば読みやすくなりそうです。

### 6.8 情報密度の高い言葉を使う
ただ一言「キャッシュ」といえばよいことだけを回りくどく書いてしまうのは個人的にやりがち。
ただ、例で挙げている言葉がわかりづらいので解説します。
- ヒューリスティック: 経験則
- ブルートフォース: 総当たり
- ナイーブソリューション: 単純な方法、実行結果は正しいが、あまり効率は良くない方法

これら言葉はコードに入れるのであればチーム内で合意はとったほうが良いかもしれません。

# おわりに
今回もリーダブルにできましたね。
次回もリーダブルにしていきましょう。

# 参考文献
- リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック p.41～78
  URL：https://www.oreilly.co.jp/books/9784873115658/
SiteGuard Server Edition (WAF)の管理者用ページにアクセスできなかった場合に試すこと

# 目次

[1. はじめに](#1-はじめに)
[2. エラーの内容](#2-エラーの内容)
[3. エラーの原因](#3-エラーの原因)
[4. 直し方](#4-直し方)
[5. おわりに](#5-おわりに)

# 1. はじめに
SiteGuard Server Editionを使用している際に、急に管理者用画面にアクセスできなくなることがしばしば発生しているので忘備録として記載します。

# 2. エラーの内容
アクセスした際に下記エラーメッセージが表示されアクセスできなくなります。ページの再読み込みや時間をおいてからアクセスしても状況は変わりません。
WAFとしては「< script >」等を含むデータを防いでいたので作動していたのですが、管理用画面にはアクセスできなくなり、設定変更やレポートの出力はできません。

↓こんな画面になります
![503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990903/10ba7b9d-3575-242a-406d-5ebd667aa307.png)
```:エラーメッセージ
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
```

# 3. エラーの原因

**サーバーにてSiteGuard Server Editionの管理者用プロセスが落ちている**

サーバーのSiteGuard Server Editionのプロセスを調べると下記２種類あります。
![linux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990903/d6ddbfec-fb65-32d0-88f0-319a8b704fb0.png)

このうち、adminのプロセスが作動していないため管理者用画面にアクセスできなくなっていました。
siteguardlite.admin.serviceの「loaded」の後が「failed」になっています。

![linux2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990903/50aeff33-1d91-7c1f-4d3c-30cd9569b15d.png)

# 4. 直し方

1.adminプロセスを起動する。
（centOS7の場合：sudo systemctl restart siteguardlite_admin.service）
作動状況確認のため systemctl list-units --type=service | grep -i siteguardも打ち込んでみましょう。
![restart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990903/6a6e52e3-a660-e33b-3dd3-dd4fd92017ab.png)
2.管理者画面にアクセスできるか確認する。
↓のようにアクセスできるようになれば成功です。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990903/9a28aa1d-34de-9082-5135-1bffc8f67c9a.png)

# 5. おわりに

本件はWeb検索しても解決策が見当たらなかったため記事にしました。
もし間違い等あればご指摘いただければ幸いです。
PandasをクエリするPythonのライブラリ

# はじめに
データ解析を行う際、PandasはPythonのデータ解析ライブラリとして非常に人気があります。しかし、SQLを使用してデータベースからデータを取得・操作するのに慣れている人にとって、Pandasの構文は少し難しく感じることがあります。そこで、pandasqlというライブラリが役立ちます。このライブラリを使用すると、Pandas DataFrameに直接SQLクエリを実行することができます。

このブログ記事では、pandasqlを使用してPandas DataFrameにSQLクエリを実行する方法を紹介します。使用するデータセットとして、seabornライブラリの'tips'データセットを使用します。

# pandasqlについて
https://pypi.org/project/pandasql/

# 環境構築
```
pip install pandas seaborn pandasql
``

# コード
```python
import pandas as pd
import seaborn as sns
from pandasql import sqldf

# seabornからtipsデータセットを読み込む
tips = sns.load_dataset('tips')

query1 = """
SELECT *
FROM tips
LIMIT 5;
"""

result1 = sqldf(query1, globals())
print(result1)

query2 = """
SELECT *
FROM df
WHERE total_bill > 30
LIMIT 5;
"""

result2 = exec_query(query2)
print(result2)

query3 =  """
SELECT day, avg(total_bill)
FROM df
GROUP BY day;
"""
result3 = exec_query(query3)
print(result3)
```

# 解説
```python
import pandas as pd
import seaborn as sns
from pandasql import sqldf

# seabornからtipsデータセットを読み込む
tips = sns.load_dataset('tips')
```
必要なライブラリをimportします
seabornのtipsというデータセットにはレストランで支払われたチップのデータが含まれています

```python
query = """
SELECT *
FROM tips
LIMIT 5;
"""

result = sqldf(query, globals())
print(result)
#    total_bill   tip     sex smoker  day    time  size
# 0       16.99  1.01  Female     No  Sun  Dinner     2
# 1       10.34  1.66    Male     No  Sun  Dinner     3
# 2       21.01  3.50    Male     No  Sun  Dinner     3
# 3       23.68  3.31    Male     No  Sun  Dinner     2
# 4       24.59  3.61  Female     No  Sun  Dinner     4
```
クエリを実行するにはpandasqlのsqldf()関数を使用します。

```python
query2 = """
SELECT *
FROM df
WHERE total_bill > 30
LIMIT 5;
"""

result2 = exec_query(query2)
print(result2)
#    total_bill   tip     sex smoker  day    time  size
# 0       35.26  5.00  Female     No  Sun  Dinner     4
# 1       39.42  7.58    Male     No  Sat  Dinner     4
# 2       31.27  5.00    Male     No  Sat  Dinner     3
# 3       30.40  5.60    Male     No  Sun  Dinner     4
# 4       32.40  6.00    Male     No  Sun  Dinner     4
```
WHERE句を使用して絞り込みが可能です。
チップの総額が30より多く払っているデータを抽出します。

```python
query3 =  """
SELECT day, avg(total_bill)
FROM df
GROUP BY day;
"""
result3 = exec_query(query3)
print(result3)
#     day  avg(total_bill)
# 0   Fri        17.151579
# 1   Sat        20.441379
# 2   Sun        21.410000
# 3  Thur        17.682742
```
GROUP BYを使用してグループ化が可能です。
day(曜日)ごとにグループ化して、チップ総額の平均を抽出します。
土日の方がチップの金額が高い傾向です。

# おわりに
pandasqlは、SQLを使用してPandas DataFrameにクエリを実行するための強力なツールです。SQLに慣れているデータアナリストやデータサイエンティストにとって、このライブラリはPandasの操作をより直感的にすることができます。

今回のブログ記事では、pandasqlの基本的な使用方法と、seabornのtipsデータセットを使用した実例を紹介しました。これにより、Pandas DataFrameに対してSQLクエリを簡単に実行する方法を学ぶことができました。

データ解析の作業を効率化するために、pandasqlを活用してみてください！
Kathara Lightweight Container-based Network Emulation Systemを試す

ネットワークのシミュレーターを探して検索していると，[GNS3 Alternatives](https://alternativeto.net/software/gns3/)で[Kathara](https://www.kathara.org/index.html)が紹介されていた．Linux, Windows, MacOSそれぞれで動くようなので，試してみた．

## インストール環境
OS: Debian12
コンテナを利用するのでDockerが必用．今回は既にdocker-ceをインストール済みの環境にインストールした．

## 手順
Linux(その他のOSも)へのインストールは[Instllation Guides](https://github.com/KatharaFramework/Kathara/wiki/Installation-Guides)にまとまっている．
今回はDebian12へインストールしたので，[Debian11](https://github.com/KatharaFramework/Kathara/wiki/Linux#debian-11)の記述を参考に作業をしたが，そのまま手順を実施すると，`apt install kathara`のところで`libssl1.1`の依存関係が満せなくエラーになった．libssl1.1はbullseys(Debian11)までは存在していたパッケージのようですが，bookworm(Debian12)からは用意されてない．
Katharaをインストールするためのapt-lineを見ると，Ubuntuの`focal`がバージョンとして指定されているが調べると，より新しい`jammy`用のパッケージも提供されているようなので，apt-lineを `s/focal/jammy/` で修正
```
deb [ signed-by=/usr/share/keyrings/ppa-kathara-archive-keyring.gpg ] http://ppa.launchpad.net/katharaframework/kathara/ubuntu jammy main 
deb-src [ signed-by=/usr/share/keyrings/ppa-kathara-archive-keyring.gpg ] http://ppa.launchpad.net/katharaframework/kathara/ubuntu jammy main 
```
これで依存関係のエラーなくインストール完了

## テスト
どう使っていいのかも不明なので，とりあえず簡単に試せそうな[Basic Topics](https://github.com/KatharaFramework/Kathara-Labs/tree/main/main-labs/basic-topics)のTwo hostsを試してみる．

### 初期設定
```
kathara settings
```
+ default manager: Docker
+ default image: kathara/frr:debian10
を設定．あとはデフォルトのままにした．

### Two hosts
```
$ kathara vstart --eth0:A -n pc1
```
を実行すると，katharaからコンテナが作成，実行される．
```
$ kathara vstart --eth 0:A -n pc1
INFO - ====================== Starting Device ======================
INFO - Installing Kathara Network Plugin (kathara/katharanp_vde:amd64)...
INFO - Kathara Network Plugin installed successfully!
Deploying collision domains...|###########################################| 1/1
INFO - Pulling image `kathara/frr:debian10`... This may take a while.
Deploying devices...|#####################################################| 1/1
```
コンテナのデプロイが終わると，pc1のターミナルが開く
![kathara-pc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/cc8c7c7b-7e0a-bf51-747b-8d8285576cc0.png)

次にpc2を作成する．
```
$ kathara vstart --eth 0:A -n pc2
INFO - ====================== Starting Device ======================
Deploying collision domains...|###########################################| 1/1
Deploying devices...|#####################################################| 1/1
```

pc1のIPを設定する．
```
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 up
```
pc2のIPを設定する．
```
ifconfig eth0 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255 up
```
それぞれからpingを打って，疎通を確かめる．
![kathara-twohosts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/faf63c5d-8c82-4d5f-dd6c-ea7d7fc30af4.png)

# まとめ
KatharaはGUIで簡単にネットワークを構築して演習できるようなネットワークエミュレータではなさそうですが，これはこれで使い勝手がよさそうなので，試してみようとおもいます．
スマホにTaskerアプリを入れて制御する①


# やりたいこと
スマホのWifiのオンオフってめちゃくちゃめんどくさいし
オンのまま稼働していても電池の持ちが気になるし
外で変にフリーWifiに繋がっても煩わしいしで、
なんかいい方法ないかなーってことでTaskerでの自動化を運用してます
運用し始めてからだいぶ経っていますが、もう手放せませんねこの機能は
他にも細かいこといろいろと運用してます

ただ最近はいくらでも他の方法があるのでtaskerなんて使ってねえよって方が多いかもしれませんが、お許しください
Androidの変更により、tasker使えなくなったよね、なんてこともあったりしましたので・・・・


# Taskerとは
taskerはプログラミングライクな感じで動作条件、動作を設定できます。
→スマホの動作条件で発動（ディスプレイONとかスマホ振るとか、センサー類も指定できる）
→動作(ボリュームあげるとかいろいろ）を指定できます。
外部アプリの起動とかも絡められるので素敵。
ひと昔前はrootedの端末じゃないとできなかったりしたことができるのは素晴らしいことです。


# TaskerのWifi,Bluetooth,toggle周りが使えなくなった問題
Androidのverが上がり、Wifi,Bluetooth周りのAPI関係が更新されたことによりWifiの制御ができなくなりました。
Android10以降でのAPIが更新されたようです。(API29以降)
そしてどうやら、googlePlaystoreでのWifi制御アプリが配布されなくなったようです。

googlePlaystoreでの配布ができないだけですので
開発者がGitHubで配布してます
https://github.com/joaomgcd/TaskerSettings

直接appをインストールすれば改善されます
あくまでもTaskerの動作補助をするアプリです。
HUAWEI、Xiaomi端末用のカスタムappもあります。


# いま使ってるTaskerのプロファイル一覧

・HOME（自宅に帰ったかどうかを判断するプロファイル）
・Nowifi（外出したかどうかを判断するプロファイル）
・CELLHOME（家の近所に来たかどうかの判断するプロファイル）
・PHONEIDLE（通話終了したらバイブレーションして知らせる）
・Charge(充電開始したらバイブレーション、POPUpにて通知）
・BTHoME(家の近所についたらBluetoothをONにするプロファイル）

![zenmen.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242965/1e88dfc7-2b4b-8532-7cdb-c0741df26c6e.jpeg)


他にもいろいろできるとは思うんですが、現状こんなもんの運用です。


# HOME
![home.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242965/35821abe-4c4a-c29b-7343-c17fedb25d86.jpeg)

発動条件
1.Location
2.Display Unlocked

LocationはGPSで家の場所を指定しています。
最小半径は30mから指定できます。

Display Unlockedはスマホ画面が点灯させたとき（ロック解除もしなくても）に条件を満たします。

上の二つの条件を満たしたときにタスク(→homesettings)が作動します。


# Nowifi
![Nowifi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242965/988cbb8d-2a52-cb69-9c19-09f91d2826f1.jpeg)

発動条件
すべてANDです。全て満たすとタスクが発動します。

1.Notwificonnected
2.Not Cell Near
3.Display Unlocked
　　　　　　　　　　　です。

1.Not Wifi Connected

[state]→[Net]→[Wifi Connected]を使用します。
SSIDの欄にはVariable（VARS)の"%SSID"の変数を使用します。（後記）
Invertにチェックを入れることで反転します。
なので非接続で条件を満たすことになります。

![Notwificonnect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242965/001f7ba0-b059-03b0-7a39-4d4efcd6f9cc.jpeg)



2.Not Cell Near

[state]→[phone]→[CellNear]
SCANを押すと近くの携帯基地局の情報がSCANされます。
Invertにチェックを入れると条件が反転します。
なのでその携帯基地局に接続されていない時に条件を満たします。

![Netcell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242965/6252ce77-56b7-5982-82c0-779971b336a1.jpeg)


3.Display Unlocked

携帯画面を点灯させると条件発動です。


# CELLHOME

1.CellNear
[state]→[phone]→[CellNear]
SCANを押すと近くの携帯基地局の情報をSCANします
近くの携帯基地局に接続されると条件を満たします


#PHONE IDLE
[EVENT]→[Phone]→[Phone Idle]
通話が切れたときに条件を満たします。

#Charge
[state]→[Power]→[Power]
充電されたときに条件を満たします。
Sourceで充電形態を選べます。
・Any
・AC
・USB
・Wireless
・other
から選べます。

#BTHoME
[Cellnear]
[Display Unlocked]

家の周りの携帯基地局に繋がると条件を満たします。


taskについては、長くなったので次にします。
→https://qiita.com/onm/items/827c70375e47c41ca68e
[ROS2] WARNING:colcon.colcon_ros.prefix_path.ament対処法

なにかパッケージを消した後colcon buildしたときに出てくるwarning解消法

Warning
```
[0.289s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/you/test_ws/install/package' in the environment variable AMENT_PREFIX_PATH doesn't exist
[0.289s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/you/test_ws/install/package' in the environment variable AMENT_PREFIX_PATH doesn't exist
```

解消法
```
unset AMENT_PREFIX_PATH
unset CMAKE_PREFIX_PATH
```
CudaGraphについての資料まとめ

Cuda Graphは個々のGPU上の操作（カーネルの呼び出しなど）のグラフ構造を予め構築しておくことで、カーネルのオーバーヘッドをなくす技術です。
記事が散在しているので、見つけた限りの資料をまとめてみた。

-   Tutorial
    - https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cuda-graphs

- Detail information
    - https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__GRAPH.html#group__CUDART__GRAPH

- Technical Blog
    - https://developer.nvidia.com/blog/cuda-graphs/
    - https://developer.nvidia.com/blog/employing-cuda-graphs-in-a-dynamic-environment/
    - https://developer.nvidia.com/blog/constructing-cuda-graphs-with-dynamic-parameters/
    - https://developer.nvidia.com/blog/enabling-dynamic-control-flow-in-cuda-graphs-with-device-graph-launch/
    - https://developer.nvidia.com/blog/a-guide-to-cuda-graphs-in-gromacs-2023/

- Video
    - https://www.nvidia.com/en-us/on-demand/session/gtcfall21-a31421/
    - https://youtu.be/HOVvQfcBMTQ
- PDF
    - file:///home/koki/Downloads/CUDA_C_Programming_Guide.pdf
    - https://cuda-tutorial.github.io/part3.pdf

- Git
    - https://github.com/hummingtree/cuda-graph-with-dynamic-parameters

- Japanese slide
    - https://www.docswell.com/s/fixstars/5RXQJ2-20220623#p84
AWSの代表的なサービス纏め

最近AWSを触る機能がなかなかないので、復習を絡んで、AWSの代表的なサービスを纏めました。

# AWS IAM（ユーザーアクセスと暗号化キーの管理）

「AWS IAM」は “AWS Identity and Access Management” の略称
AWSの各サービスやリソースに対して、作成したグループごとにアクセス権を管理できるサービスです。


    IAMでは、以下の機能が用意されています。
        ・IAMユーザー（グループ）
        ・IAMポリシー
        ・IAMロール
https://aws.amazon.com/jp/iam/

https://aws.amazon.com/jp/iam/features/

# Amazon EC2（安全でスケーラブルなクラウド上の仮想サーバー）
「Amazon EC2」は “Amazon Elastic Compute Cloud” の略称
なにかアプリケーションを起動させたい際は、まずEC2の起動が必要になります。

https://aws.amazon.com/jp/ec2/

https://aws.amazon.com/jp/ec2/features/

    ・世界の各地に存在する複数の拠点から、起動場所を選択できる
    ・OSの種類を複数選択肢の中から選択できる
    ・使用した分だけコストが発生する
    ・一時停止と再開が可能
    ・オンプレミスでいうサーバ調達から起動まで、数週間～数ヵ月かかる流れが、数分でできる
    ・同じ構成を持ったEC2インスタンスを複数起動できる（設定した内容を簡単に複製できる）
    ・セキュリティグループを作成し、通信を制御できる

# Amazon S3（拡張性と耐久性を兼ね揃えたクラウドストレージ）
「Amazon S3」は “Amazon Simple Storage Service” の略称
なにかデータを入れておきたいときに使用します。

https://aws.amazon.com/jp/s3/

https://aws.amazon.com/jp/s3/features/

    ・保存できるデータ容量やファイル数が無制限
    ・高い耐久性（99.999999999%（イレブンナイン）（11 9s））に加え、自動的に冗長化して保存されるため、バックアップを意識しなくて良い
    ・インターネット経由でアクセス可能なため、静的なコンテンツであれば配信もできる

# Amazon RDS（マネージドリレーショナルデータベース）
「Amazon RDS」は “Amazon Relational Database Service” の略称
AWSで簡単にリレーショナルデータベースを使用できるサービスで、データベースのエンジンは、「Aurora MySQL」「Aurora PostgreSQL」「RDS for MySQL」「RDS for MariaDB」「RDS for PostgreSQL」「RDS for Oracle」「RDS for SQL Server」の7つの中から選択できます。

https://aws.amazon.com/jp/rds/

https://aws.amazon.com/jp/rds/features/

    ・OSやデータベースエンジンのメンテナンスをAWSがおこなってくれる
    ・デフォルトで7日間の自動バックアップが設定されており、追加で設定が必要でないかぎりバックアップの管理が不要
    ・マルチAZ配置をオンにすると、障害時の対応を自動でおこなってくれる

# AWS Lambda（イベント発生時にコードを実行）
サーバーやクラスターについて検討することなくコードを実行
お客様のコードが高可用性コンピューティングインフラストラクチャで運用され、お客様のコンピューティングリソースの管理のすべてが行われます。
またLambdaはイベント駆動型と呼ばれ、「何らかのイベントが起こったら、このプログラムを実行する」といった仕組みになっているため、あらかじめトリガーを設定しておく必要もあります。 

https://aws.amazon.com/jp/lambda/

https://aws.amazon.com/jp/lambda/features/

    ・高速開発が可能である
    ・プログラムを実行するためのサーバを用意する必要がない

# Amazon CloudFront（グローバルなコンテンツネットワーク機能)
「Amazon CloudFront」とは、スピードと安全性の高さが魅力の「高速コンテンツ配信ネットワーク機能」です。
グローバルにに分散した550以上のPoP（Point of Presence）を使用し、最も低い遅延度でコンテンツを配信できるCDN（Contents Delivery Network）サービスです。

https://aws.amazon.com/jp/cloudfront/?nc=sn&loc=1

https://aws.amazon.com/jp/cloudfront/features/?whats-new-cloudfront.sort-by=item.additionalFields.postDateTime&whats-new-cloudfront.sort-order=desc


    ・キャッシュを持たせることができるため、コンテンツを低遅延でブラウザに表示させることができる
    ・世界中の拠点を使用できるため、ユーザーから一番近く、遅延度の低い拠点から配信ができる
    ・ドメインの証明書を設定すると通信データを保護できたり、AWSのセキュリティサービスを組み合わせることで外部の攻撃からも守ることができたりするため、安全性が高い
オンプレミスとクラウドの違いを比較


# オンプレミスとクラウドの違いを比較
|                      | オンプレミス                          | クラウド                                        |
|:--------------------:|:-------------------------------------:|:-----------------------------------------------:|
|導入しやすさ         | 構築に時間がかかる                    | アカウント登録後すぐ利用可能                    |
|初期費用             | 初期費用が高額になりがち              | 初期費用はかからない                            |
|維持コスト           | 減価償却で費用負担は下がっていく      | 従量課金で利用分だけの請求                      |
|障害時対応           | 自社で復旧対応が必須                  | クラウド提供者の対応箇所もあるため負担が減る    |
|カスタマイズ         | 自由にカスタマイズできる                                     | サービスが提供される範囲内という制約はあるが、比較的自由度は高い  |
|自社システムとの連携 | システムと連携しやすい                                       | ネット利用前提だと連携できないケースもありえる  |
|会計処理の簡単さ     | 固定資産税がかかり減価償却処理が必要                         | 経費として処理が可能固定資産税はかからない      |
|セキュリティ         | セキュリティ対策を万全にすれば非常に高い                     |基本的にはセキュリティは高いがクラウドサービス提供事業者による   |
|保守・管理           | すべて自社で対応する必要があるので、手間がかかる             |基本的にクラウドサービス提供事業者が行うので、手間がかからない   |
|拡張性               | 容量や機能を追加するには設備の買い足しが必要でコストがかかる |サービス内容を変更するだけで変更が可能でコストを抑えられる  |

# メリット・デメリット

<table>
  <tbody>
    <tr>
      <th colspan="2">
        <p>
          <b>オンプレミスのメリット・デメリット</b>
        </p>
      </th>
    </tr>
    <tr>
      <th>
        <b>メリット</b>
      </th>
      <td>
        <ul>
          <li>
            選べる範囲に制約なく柔軟なカスタマイズができる</li>
          <li>社内ネットワーク内で運用することで
            <b>既存のシステムなどと連携しやすく、セキュリティを非常に高くすることもできる</b>
          </li>
        </ul>
      </td>
    </tr>
    <tr>
      <th>
        <b>デメリット</b>
      </th>
      <td>
        <ul>
          <li>
            特に初期費用が高額になりやすい</li>
          <li>
            <b>運用や保守管理に手間</b>がかかり、専用の要員を確保する必要がある</li>
        </ul>
      </td>
    </tr>
  </tbody>
</table>

###### クラウドのメリット・デメリット
<table>
  <tbody>
    <tr>
      <th colspan="2">
        <p>
          <b>クラウドのメリット・デメリット</b>
        </p>
      </th>
    </tr>
    <tr>
      <th>
        <b>メリット</b>
      </th>
      <td>
        <ul>
          <li>初期費用を抑えやすくサービス利用料金も使用した分だけ発生するので無駄なコストを削減しやすい
          </li>
          <li>導入時に加えて運用や保守管理時も、
            <b>手間がほとんどかからない</b>
          </li>
          <li>
            <b>利用する内容や規模の変更が簡単</b>ですぐにできる</li>
        </ul>
      </td>
    </tr>
    <tr>
      <th>
        <b>デメリット</b>
      </th>
      <td>
        <ul>
          <li>選べる構成などは提供されるサービスの範囲に限られる
          </li>
          <li>従量課金制なので、
            <b>利用する規模が大きい場合や期間が長い場合は、総コストが高くなることがある</b>
          </li>
        </ul>
      </td>
    </tr>
  </tbody>
</table>
[Heroku Connect] Boolean(チェックボックス)をNULLで更新してはいけない

## 前書き

やらかしであるな。

## Salesforceのデータ型が「チェックボックス」の項目をConnectした際の挙動

Salesforce側のデータ型が「チェックボックス」の項目をConnectすると、Postgres側のデータ型はBooleanになります。
このBoolean、BooleanといいつつSalesfoece側からのデータはTrue or NULLで降ってくるようになっています。

## やらかし
降ってくるデータに合わせ、Heorku側で画面上のチェックボックスのチェックが外れた場合、NULLでUPDATEする処理を深く考えずに実装しました。

## NULLで更新すると起こること
Postgres上では問題なくUPDATEできるのですが、Heroku ConnectがNULLでの同期を受け付けてくれず、結果valueがTrueに戻るという事象が発生しました。

## 対策
ConnectされたBoolean項目にはNULLを入れず、TrueかFalseのみ保存しましょう。
PySide6 での QCoreApplication.application~

# 初めに
Qt6のアプリを pythonへ移植した際にバージョン表記などで困ったので

# QCoreApplicationのapplication~で取得できる情報

## Qt6 で開発したアプリの場合: C:\Path\to\folder\app\app.exe
|applicationDirPath|applicationFilePath|applicationName|
|-|-|-|
|C:\Path\to\folder\app|C:\Path\to\folder\app\app.exe|app|

## PySide6 で開発したアプリの場合: C:\Path\to\folder\app\app.py
pythonのインストール先: C:\Python\Python311
|applicationDirPath|applicationFilePath|applicationName|
|-|-|-|
|C:\Python\Python311|C:\Python\Python311\python.exe|python|

pythonが.pyファイルを実行しているからこうなってしまうんですね
当たり前なのかもしれませんが

# 対応策
これが最善ではないだろが思いついた方法
* `applicatoinName`には`sys.argv[0]` か `__file__` に aaa.py が入っているのでそれを使う
* `applicationDirPath`と`applicationFilePath`は読み込み専用なので変更できないから`QCoreApplication`のインスタンスに属性として設定し使用する
* `applicationVersion`も使用したい場合は メインモジュールで`QCoreApplication`のインスタンスへ`setApplicationVersion`で設定する
```python:例
import sys
import PySide6.QtCore

if "__main__" == __name__:
  __version__ = "1.0.0.1"
  app = PySide6.QtCore.QCoreApplication(sys.argv)
  app.setApplicationVersion(__version__)
  # 以下 PySide6 使ってるので osモジュールではなくQFileInfoで
  fi = PySide6.QtCore.QFileInfo(__file__)
  app.setApplicationName(fi.baseName())
  app.application_file_path = fi.absoluteFilePath()
  app.application_dir_path = fi.absolutePath()
```

nuitka で .exe にした場合はまた別の話

# 終わりに
Qt6 のC++コードをPySide6へ移行することは比較的簡単だったが この様な細かい調整が必要
Djangoの基本１～開発の準備作業

■MVTという考え方
DjangoはMTVモデルという考え方で成り立っています。
以下に説明があるのでリンク張っておきました。
https://www.sejuku.net/blog/27387#index_id0

■今回やってみる事
開発の準備作業ということで、こんなことしてみようと思います。
１．プロジェクトフォルダの作成
２．初期DB,初期TBLの作成
３．アプリケーションフォルダの作成

１．プロジェクトの作成
今回は、フォルダの構成やファイルの役割なんかもみてみてみました。
プロジェクトを作成すると、下のファイルが自動的に出来ます。
役割はこんな感じらしいです。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/37421a67-2fad-fac0-cf45-53316ea8269f.jpeg)
asgi,wsgiについて詳しく書いてあるりんくみつけましたのでご参考に。
　asgiとは、、、
https://blog.framinal.life/entry/2021/04/18/153507#ASGIAsynchronous-Server-Gateway-Interface%E3%81%A8%E3%81%AF
　wsgiとは、、、
https://blog.framinal.life/entry/2021/04/18/153507#WSGIWeb-Server-Gateway-Interface%E3%81%A8%E3%81%AF

２．初期DB,初期TBLの作成
Djangoで使用出来るDBには以下のものがあります。
（公式ドキュメントより2023/10時点）
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/ab165785-342b-2706-a517-8d519e7588fc.jpeg)
settings.pyを覗くと、プロジェクト作成時点ではデフォルトで、sqlite3のようです。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/ddf33d0f-e476-bb06-eb5f-6e0f8b2686b9.jpeg)
まだ、モデル構築してませんが、初期時点でのマイグレーションを行ってみたいと思います
マイグレーションについてご参考
https://qiita.com/okoppe8/items/c9f8372d5ac9a9679396
仮想環境をアクティブにしている状態でプロジェクトフォルダに移動し
「python manage.py migrate」とタイプし実行します。
上手くいきました。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/7982c346-9711-1d37-f8bf-7822a29305ed.jpeg)
DBの中身をちょっと覗いてみましょうか、その前に、VISUAL STUDIO CODEの拡張機能に
sqlite3のテーブルを覗くツールを追加インストールしておきます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/14bb0fd8-56d4-0d67-9c55-e10904afc85d.jpeg)
VISUAL STUDIO CODEの、表示>コマンドパレット

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/56a52245-f45b-754a-8fdd-672ffb241ccc.jpeg)
SQLite　Open　Databaseを選択
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/a1766433-e64f-ee6c-4eac-b8d71e901cec.jpeg)
作成したプロジェクト内のDBを選択する。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/87e3adab-4d46-02dd-1fd6-c6e4e572fef4.jpeg)
するとVISUAL STUDIO CODEのエクスプローラ左下側に作成したDBやTBLが現れます
Djangoで用意されている管理画面に関連するTBL等が
自動作成されています。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/4c89331a-c345-4a28-0642-25db319dd78a.jpeg)
３．アプリ作成
Djangoは、機能毎にアプリケーションのフォルダを分けて管理することが出来るみたいです。
１から作るというより、アプリケーションのフォルダ単位に最低限必要な要素を自動で用意してくれるようです。それでは試しに一つアプリケーションフォルダを作成してみますね。
「python manage.py startapp アプリケーション名」を入力し実行します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/696833ab-7418-c262-c907-795c36682b49.jpeg)
上手くいきました。下記のファイルが自動作成されます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/140b8be3-81a2-0f5f-f12a-a328ceaa894a.jpeg)

アプリケーションフォルダを作成するとプロジェクトフォルダの設定ファイルとの紐づけが必要になります。
ではやってみますね。
こんな感じです。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/8ecde874-284e-fa71-daa7-2269faef9ccc.jpeg)

今回は開発の準備作業してみました。
Profile

# Hello!

けーです。
![YouTube_バナー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574683/fdc1e27c-dc04-7e1f-276a-b2dcaa8d79a0.png)

## アイコンの子

お名前は『アーリア・ネージュ／縁日FESTIVAL』。FRIDAY FRIDAYの曲の子です。
浴衣姿がとても可愛くて好き。お気に入りポイントはりんご飴とおしゃれなヘッドホンです。
![アーリア・ネージュ／縁日FESTIVAL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574683/e982bc1c-bbc8-cf36-86da-498b5bb325aa.png)

# 頑張ってる音ゲー

## CHUNITHM

SEGAの音ゲー【CHUNITHM】にどハマりして約8年、Max Rating17.38の虹ポゼプレイヤー。
現在の私の腕前を知りたい方は[chunirec](https://chunirec.net/users/k_chunithm)でも見てください。


https://chunirec.net/users/k_chunithm


## Malody

CHUNITHMの鍵盤力を上げるために始めた音ゲー。Streamについての記事を執筆中。
もうちょい上手になったらまた何か書きます。

## ユメステ

STELLAは全AP、OLIVEIRは星章85%ちょい。
完全4鍵譜面は大好き、人中薬指の3鍵に苦戦してます💦
![ユメステ_profile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574683/24afca8d-3408-61d9-d516-7ba8e703e050.jpeg)
こっちはフレンド募集してるのでよかったら申請してください〜
フレコ：5660199045

## Info

- [X(~~Twitter~~)](https://twitter.com/k_chunithm)...よくリザルトとご飯を投稿してます、生存確認はここで🙏
- [YouTube](https://www.youtube.com/channel/UCI6s-MHtD_wnWjH5i03LW4Q)...手元動画はもちろんのこと、short動画や全国対戦実況動画(~~最近サボり気味~~)など色々がんばってます。よかったら見にきてください、喜びます☺️

https://www.youtube.com/channel/UCI6s-MHtD_wnWjH5i03LW4Q
Bootstrap5のドロップダウンをマウスオーバーで表示する

検索しても良いのが見つからなかったので

html部分  
bootstrap.bundle.min.jsを読み込む
色々端折ったので足りないかも
```html
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
<div id="mov-out">
<a id="mov-click" class="nav-link" href="#" data-bs-toggle="dropdown" aria-expanded="false">開く</a>
<div class="dropdown-menu">
表示
</div>
</div>
```

css部分  
これは無くても問題ないので必要に応じて
```css
.nav-link:focus-visible {
  box-shadow: unset;
}
```

js部分  
bootstrap.Dropdownのオブジェクトでshow,hideする
```js
window.addEventListener("load", function() {
	const mov = document.getElementById('mov-click');
	const dropdown = new bootstrap.Dropdown(mov);
	mov.addEventListener('mouseover', function() {
		dropdown.show();
	});
	document.getElementById('mov-out').addEventListener('mouseleave', function() {
		dropdown.hide();
	});
});
```

jQueryで書くと  
```js
$(function(){
	const dropdown = new bootstrap.Dropdown($('#mov-click'));
	$('#mov-click').mouseover(function() {
		dropdown.show();
	});
	$('#mov-out').mouseout(function() {
		dropdown.hide();
	});
});
```
PowerAutomateの技術ポイントをまとめ

# 自動化フロー、スケジュールされたフロー、インスタント フローの制限事項
https://learn.microsoft.com/ja-jp/power-automate/limits-and-config

# クラウド フローでのエラーハンドリングの方法
https://jpdynamicscrm.github.io/blog/powerautomate/CloudFlow-ErrorHandling/
![img6[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/0e2aa70d-c8e7-2c9f-fa7e-7cd756c3fbac.png)


☑ 並行処理OKであれば「並列」で分岐するように追加するとパフォーマンス期待できる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/74ece630-e19f-022d-79e7-52d84641452b.png)
☑ 書き方をサンプルとする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/328abfff-e2eb-7d33-d756-76d35d5e1dc4.png)


# Power Apps と Power Automate 連携 その② （フロー呼び出しとアプリへ返却）
https://youseibubu.com/apps/apps_automate_2/

















※ネット上の良い情報を纏めてます。参照するまで役に立てます。
ゲームを作るときに感じたこと，考えたこと

# はじめに
こんにちはkmです．
絵を描くこととゲームをするのが趣味です．学生としての本分をどうにかして全うする傍らで趣味に没頭しています．

2023年の夏ごろに3週間ほどでゲームを個人開発しました．
その際に感じた，考えたことについて記録を残しておこうと思ったのでここで共有します．

# 開発環境と制作したゲーム
- 開発環境
    - OS: Windows11 Home
    - CPU: (第11世代)Intel Core i3
    - GPU: (内蔵GPU)Intel UHD Graphics
    - 統合開発環境: Visual Studio
    - フレームワーク: Siv3D

- 制作したゲーム
    - タイトル: Hamburg Battle
    - 動作環境: Windows10~11, MacOS
    - ソースコード(Github): https://github.com/inte-nent/Hamburg_Battle
    - 配布サイトURL(itch.io): https://inte-game.itch.io/hamburg-battle


# ゲームは本編だけじゃない
ゲームの開発をする際にはコンセプトに合わせてゲーム本編の内容をよく考えます．
しかし一般にゲームは本編のみで構成されているものではありません．
世の中のほとんど全てのゲームにはタイトル画面やオプション画面などのゲーム本編以外でゲーム体験の導入・補助機能を持った画面やシステムが用意されています．

私はゲーム本編の内容を考えることにのみ注力して，それらの機能をどうやって実装するのか急いで考える必要に迫られました．

# 設計が大切
理由があり，私は3週間でゲームを作る必要がありました．
当時の私は作品制作の手法としてプログラミングを用いた経験がありませんでした．
そのため設計工程を軽視しており，最低限の設計(ノートへの軽いメモ程度)でコーディングをしていました．

開発時の私の思想は「初心者の私が設計の工程で躍起になったところで時間を無駄に消費するだけだ！コーディング無くして動作無し！」というものでした．
そしてやっとの思いで書き上げたコードは動作せず，修正に手間取り，結局締め切りギリギリで完成というお粗末な開発になってしまいました．

この経験から設計の重要さを実感しました．
コーディング前に綿密な設計を構築したうえでコーディングを開始するというのが健全な開発なのだと，身に染みた思いです．

# 操作へのフィードバック
ゲームはインタラクティブなメディアです．
映画や本などは視聴・読者の行動に関わらずあらかじめ定められた内容を出力し続けます．
しかしゲームにおいてはプレイヤーの入力操作がトリガーとなり，プレイヤーは毎フレーム更新される画像や音の情報を得ます．

このように，ゲームはプレイヤーとゲームが一体となって進行していくユニークなメディアです．
そのためプレイヤーの操作に対応した適切なフィードバック(画像・音・振動など)がゲームには必要不可欠です．

「もしロード画面で「ロード中」と表示されなかったら」，「爆弾が爆発した時に爆破エフェクトが無かったら，爆破音が鳴らなかったら」このように考えるとフィードバックの重要性が分かると思います．

# まとめ
ゲーム開発で様々な知見を得ることができました．
ゲーム開発に限らず，初心者・初学者が開発を始める際は界隈内でメジャーなサービスを利用して開発をすることを勧めます．
Pythonって何？なぜ人気なの？

# はじめに
こんにちは、2年目のエンジニアです。
今まで主にflutterでの開発をおこなってきましたが、
新しい挑戦として他の言語にも挑戦しようと思い、Pythonについて調べてみることにしました。
調べた結果をまとめて、Pythonの特徴などについてざっくりまとめてみました！

# 概要
2023年9月最新のTIOBEプログラミング言語ランキングで１位となっている『Python』
なぜここまで人気なのか？何が得意な言語？逆に何が苦手な言語？など
Pythonについて色々とまとめてみました。
これから少しでもPythonの勉強を始めようか迷ってる方の参考になればいいなと考えています。

# そもそもPythonって何？
Pythonとは、**インタープリタ型の高水準汎用プログラミング言語**です。
※インタープリタ型とはプログラミング言語で記述したソースコードをコンピューターが実行できる機械語の形式に逐次翻訳しながらプログラムを実行してゆくプログラムのこと
※高水準とはプログラミング言語の中でも人間にとって理解しやすい構文で書かれている言語

# Pythonで何が作れる？
Pythonでは主に下記のものが作れます。
機械学習を用いた人工知能の開発や自動データ処理/分析などの業務効率化、
Web上の画像・テキストデータの自動収集などで利用されます。
* AI（機械学習・深層学習）
* Webサイト作成
* ゲーム制作
* データ処理・分析・解析
* Web上の情報収集ツール

# Pythonはなぜ人気なのか
Pythonが人気な理由としてはいくつかありその中の8つ紹介しようと思います。

### 理由１：言語が簡単で初心者向き
Pythonはコードがシンプルで他の言語と比較すると覚えるべきものが少ないという特徴があります。
シンプルさや読みやすさを重視しているため、初心者にも理解のしやすい言語となっています。

### 理由２：書きやすく読みやすい
Pythonはコードがシンプルで、エンジニアもコーディングがしやすく、
開発者以外がコードを読んでも何が書いてあるのか読みやすい言語となっています。

### 理由３：プラットフォームの充実
PythonはWindows、Mac、Linuxという現在の主要OSをサポートしているため、さまざまなプラットフォームで動作させることができます。

### 理由４：ライブラリが豊富
Pythonは機械学習に専門特化したライブラリや統計に特化したライブラリなど、さまざまなライブラリが整備されているという特徴があります。

### 理由５：汎用性が高い
Pythonはできることが非常に多い言語です。
AIや機械学習、データ分析など、AIを活用したIoTの開発やロボット制御といったことから、
Webアプリケーションやゲームの開発にも使われています。

### 理由６：年収が高い
エンジニア自体、日本の平均年収を上回っていますが、Pythonエンジニアは
年収は400～850万円程と言われています。
Pythonは需要が高まってきているため、スキルを身につければ年収も上昇することが予測できます。

### 理由７：グローバルな言語
Pythonは世界的に人気のある言語となっています。
グローバルにエンジニアとして活躍したい人にはおすすめの言語となっています。

### 理由８：学習情報量が豊富
Pythonは世界的に人気のある言語であるだけに、学習情報量が豊富にあります。
プログラミングではエラーが起きた時に、解決できずに躓いてしまうことがあるのですが、
Pythonは学習情報量が豊富なため、基本的に調べれば出てきます。
初心者でも勉強がしやすい言語となっています。


# Pythonが苦手なことは？
### スマホアプリ開発
アプリ開発をサポートするライブラリも存在しますが、スマートフォン向けのアプリは得意とは言えません。
スマートフォン向けアプリ開発に最適な言語は他に多く存在しています。

### 高速な処理が求められるもの
Pythonはインタプリタ型言語であるため、コンパイル言語と比較すると処理速度の面ではどうしても負けてしまします。

# 最後に
以上となります。
今回は自分で調べた内容を簡単にまとめました。
もっと詳しく知りたいと思えたら是非調べてみてください。

#### 参考サイト
https://www.acrovision.jp/career/?p=2637

https://www.akkodis.co.jp/candidate/insight/column_100
[Salesforce] オブジェクトIDからそのレコードの詳細画面をカンタンに開くには

## 前書き

Salesforce Adminの方々からするときっと当たり前のことだと思うのですが、最近（今更）気がついて「おっ」と思ったので。
ボーッと生きているのでそんなことかよ！みたいな気づきがよくあります。

## ここでいうオブジェクトIDとは

レコードの作成時に自動生成される英数字で構成された15桁または18桁の識別子です。
```
#こんなやつ
a3h10000000XXXXAA0
```

## 今までの（面倒な）自分的アクセス方法

Salesforceの画面から同一カスタムオブジェクトの適当なレコードを開く
```
#こんな感じのURL
https://domain/foo/bar/{カスタムオブジェクトのAPI参照名}/{適当に開いたレコードのオブジェクトID}/view
```
開きたいレコードのオブジェクトIDをURLのID部分にコピペしてEnter
```
https://domain/foo/bar/{カスタムオブジェクトのAPI参照名}/{開きたいレコードのオブジェクトID}/view
```

>同じカスタムオブジェクトの適当なレコード詳細画面を開く

これがめんどくさい！

## スマートな(？)アクセス方法
```
https://domain/{開きたいレコードのオブジェクトID}
```
これだけのことでした。
Clipyのスニペットに登録しました。
KID FRESINOとオブジェクト指向

KID FRESINOを使ってオブジェクト指向を説明したい。
以下はそれぞれの概要をWikipediaより引用した。

### KID FRESINO 
>KID FRESINO（キッド フレシノ、1993年〈平成5年〉11月25日 - ）は、日本のラッパー・DJ・トラックメイカーである。
1993年11月25日生まれの埼玉県出身。2013年に当時ラップ歴10か月で1stソロアルバム『Horseman's Scheme』[2]をリリースしたのを皮切りに、2014年にAru-2との共作「Backward Decision for Kid Fresino」[3]、フリーDLミックステープ「Shadin'」[4]、2015年に「Conq.u.er」[5]、2016年にC.O.S.A.との共作『Somewhere』[6]、2017年にEP「Salve」[7] をリリースする他、自身が主催でもあるイベント「OFF-CENT」で全国をDJ巡業している。現在は結婚していて子供もいることを明かしている。

加えて、KID FRESINOのフロウとリリックは圧倒的オリジナリティであることを付け加える。

#### オブジェクト指向

>オブジェクト指向（オブジェクトしこう、英: object-oriented）は、ソフトウェア開発とコンピュータプログラミングのために用いられる考え方である。
オブジェクトとは、プログラミング視点ではデータ構造とその専属手続きを一つにまとめたものを指しており、分析/設計視点では情報資源とその処理手順を一つにまとめたものを指している。データとプロセスを個別に扱わずに、双方を一体化したオブジェクトを基礎要素にし、メッセージと形容されるオブジェクト間の相互作用を重視して、ソフトウェア全体を構築しようとする考え方がオブジェクト指向である。

以下に共通点をまとめたものを列挙する


# 独自性とカプセル化
KID FRESINOの特徴:
KID FRESINOは彼独自のスタイルとフロウを持っています。他のアーティストとは一線を画すそのスタイルは、彼の音楽の中にしっかりとカプセル化されています。

オブジェクト指向のカプセル化:
オブジェクト指向では、カプセル化という概念が中心的な役割を果たしています。データとそのデータに関連するメソッドを一つの「オブジェクト」としてカプセル化することで、外部からの不要なアクセスや変更を防ぎます。

 KID FRESINOの曲を聴くときはKID FRESINOを期待するしオブジェクトにはそのオブジェクトの結果を期待する。
曲の制作過程や実装内容まで知らずとも期待した通りのものが返ってくると言う点で両者はカプセル化に成功しているといえる

# 多様性とポリモーフィズム
KID FRESINOの多様性:
KID FRESINOは多様なビートやフロウに対応する能力を持っています。異なるトラックやフィーチャリングでもその本質を失わず、さまざまな形で表現することができます。

オブジェクト指向のポリモーフィズム:
ポリモーフィズムは、異なるオブジェクトが同じインターフェースやメソッドを共有することを指します。これにより、異なるオブジェクトでも同じように操作することが可能になります。

KID FRESINOはその独特のフロウとビートで異なるトラックやアーティストとのコラボレーションにも柔軟に対応します。彼のこの多様性は、オブジェクト指向プログラミングのポリモーフィズムに似ています。ポリモーフィズムは、異なるオブジェクトが同じ動作やインターフェースを共有することを可能にし、これによりさまざまなオブジェクトを統一的に操作することができます。

# コラボレーションとコンポジション
KID FRESINOのコラボレーション:
彼は多くのアーティストとのコラボレーションを果たしています。それぞれのアーティストとの組み合わせによって、新しいサウンドやメッセージが生まれます。

オブジェクト指向のコンポジション:
オブジェクト指向におけるコンポジションは、異なるオブジェクトやクラスを組み合わせて新しい機能や構造を作り出すことを指します。この方法により、再利用や拡張が容易になります。

KID FRESINOは、異なるアーティストとのコラボレーションを通じて、新しいサウンドやメッセージを生み出す能力があります。彼の音楽は、組み合わせる要素によって異なるニュアンスや価値を持ちます。これは、オブジェクト指向プログラミングの「コンポジション」の考え方に似ています。コンポジションでは、異なるクラスやオブジェクトを組み合わせることで、新しい機能や構造を作り出します。このアプローチにより、コードの再利用や拡張が効率的に行えるようになります。

# まとめ
KID FRESINOはカプセル化されたラッパーでありポリモーフィズムとコンポジションに基づいて楽曲を制作しているという意味で
オブジェクト指向型のラッパーであるといえる。