OmniAICreator/Qiita-1.07M huggingface dataset:
カーマイケル数（Carmichael number）を探す

### カーマイケル数（Carmichael number）

あまりなじみの無い名前ですが[カーマイケル数（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%9E%E3%82%A4%E3%82%B1%E3%83%AB%E6%95%B0)によると、

```math 
\begin{align}
&カーマイケル数とは、nと互いに素である任意の自然数 a に対し\\
&\large a^{n-1} \equiv 1 \pmod n \\
&となるnのこと
\end{align}
```
この式を見ると[フェルマーの小定理](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E5%B0%8F%E5%AE%9A%E7%90%86)の合成数版と考えると分かりやすいかもしれません。

今回はこのカーマイケル数をできるだけ多く探していこうと思います。

### カーマイケル数（Carmichael number）の判定方法


```math 
\begin{align}
&カーマイケル数の必要十分条件は\\
&1. 素数ではない\\
&2. 無平方数（\mathrm{squarefree\ number}）である\\
&3. すべての素因子pに対して p-1 | n-1 となる\\
&（ p-1 | n-1 はp-1がn-1の約数だということをを表す）
\end{align}
```

この判定方法で$n \le 2000$のカーマイケル数を求めます。

```python 
import sympy as sp
N = 2*10**3
total = 0
for n in range(3, N+1, 2):
  f = sp.factorint(n)
  if len(f)>1 and max(f.values()) == 1 and all((n-1)%(p-1)==0 for p in f):
    print("#", n, f)
    total += n
print(f"# N = {N}, total={total}")
# 561 {3: 1, 11: 1, 17: 1}
# 1105 {5: 1, 13: 1, 17: 1}
# 1729 {7: 1, 13: 1, 19: 1}
# N = 2000, total=3395
```

### アルゴリズムの高速化（無平方数を生成）

さすがにこの方法だとすべての奇数について因数分解をしているので、もっと良い方法がありそうです。

判定方法の２．に 無平方数（squarefree number）というのがあるので素数のリストからすべてのN以下の無平方数を生成する方法が考えられます。

ただ問題はその最大素因数pですが、よく考えると$p \le \sqrt{N}$であることが証明できます（下に証明を添付しました。）

この考え方を使ったコードが以下になります。なんとか$N=10^8$ぐらいまでは求めることが出来ました。

```python
from sympy import nextprime
def Carmichael(n, plist):
  ret, p1 = 0, 2 if plist == [] else plist[-1]
  while p1 <= int(N**0.5):  # prime factor is less than sqrt(N)
    p1 = nextprime(p1)
    n1, plist1 = n * p1, plist+[p1]
    if n1 > N: break
    if len(plist1) > 1 and all((n1-1)%(q-1) == 0 for q in plist1):
      ret += n1
    ret += Carmichael(n1, plist1)
  return ret

N = 10**8
total = Carmichael(1, [])
print(f"N = {N}, total = {total}")
# N = 100000000, total = 7145594043
```
### カーマイケル数の最大素因数pがNの平方根以下になる証明

```math 
\begin{align}
&カーマイケル数をn、最大素因数pとすると\\
&n = pr = (p-1)r + r\\
&n-1 = (p-1)r + r-1 \\
&p-1 | n-1 なので p-1 | r-1 \\
&p(p-1) | p(r-1) = n -p \\
&p(p-1) | n -p \\
&p(p-1) \le n - p \\
&p^2 \le n\\
\end{align}
```

（開発環境：Google Colab）

この考え方はProject Euler, Problem 536: Modulo Power Identityを解くのに役に立ちます。
業界完全未経験の30歳が案件参画しました。

新卒から務めた業界大手整体サロンを辞め、完全未経験のIT企業に転職しました。
そんな私が案件参画まで何をしたのか、どんな会社で勤めているのかなどを書いていきます。

## 私について
- 学歴：体育学部4年大学卒業
- 職歴：業界大手整体サロンへ入社 6年間勤務したのちに現在のIT企業へ転職
- 転職理由：整体業界のDX化に貢献したいと思い転職を決意
- プログラミング経験：なし、転職後に社内のカリキュラムを履修
- 現在は：某大手企業のコーポレートサイトの改修にフロント側で携わっています

## 現在の会社へ入社してから今まで
転職活動は、現在勤めている会社と同じような会社を数社受けました。
内容としては、【未経験からでも挑戦ができる】【社内のカリキュラム制度が充実している】【一般稼働をしながら勉強ができる】といった会社です。
現在の会社に入社を決めたのは、単純に面接官が自分のやりたいことに対して共感し、そうなるための道筋や入社後何ができるのかを詳しく丁寧に伝えてくださったことです。
あとは、コワーキングスペースを展開している会社なので、勉強をするのに良い環境と感じたからです。

### 入社後
⚫︎勉強面
カリキュラムを渡され、各自自分のペースで勉強を開始
毎日オンラインスクールや自習などの時間が設けられ、自分で予約をして参加するような仕組みです。
その中では担当講師に質問をしたり、同じくらいの進捗の仲間と話し合いながら勉強を進めます。
カリキュラムの内容は、HTML、CSS、JavaScript、jQuery、PHP、Laravel、などです。
演習問題が用意されていてセクションごとに学んだことを演習問題でアウトプットし、講師に提出するを繰り返し行います。
講師とのやりとりは、redmineを通して行い、演習問題のコードをgithubで提出する流れでした。

完全未経験で早い人は半年でカリキュラム修了し、だいたいが1年くらいで修了します。
私は、スタートダッシュだけ勢いがあり、途中で躓き結局終了まで丸1年かかってしまいました、、、。

⚫︎一般稼働面
案件参画までは勉強しながら、一般稼働をします。
稼働先はそれぞれで、私はデータ入力や電話対応を行う事務員として働いていました。
これはこれで、タイピングが今までよりも速くなったり、電話対応で外部の人とのやり取りを学ぶことができたので、この期間も大事だったかなと思います。
他の同僚だと、電話受付の窓口や、量販店で販売員、コワーキングスペースの受付などさまざまです。

### 現在
現在は、某大手企業のコーポレートサイトの改修にフロント側で携わっています。
主な業務は、ディレクターが作成した指示書や現行サイトを確認し、コンポーネントを組み合わせてページを制作していくという内容になります。
HTMLの流し込み作業みたいなものですかね、、、。
完全未経験の初参画案件だったので、私的には少し安心しましたが、プログラミングの勉強を始めたばかりの人でもある程度は理解して遂行できてしまいそうな案件なので、今後は自分自身がディレクター側を経験できるようになったり、自分で考えてモノを作るといったレベルまで成長していきたいと考えています。

## 最後に
長くなりましたが、完全未経験でIT企業に入社したアラサーが今後学んだことや、挑戦したことなどを記事にしていければなと思い、Qiitaを始めさせていただきました。
自分のアウトプットの練習にもしていきたいと思っています！！！！
if ($user['role'] === 'admin')←こういうのやめたいって話

今日も今日とてドメインをモデリングしているみなさん、こんにちは。  

今回は別にドメインモデリングの話をしたいわけではなくて、そんな話ができるような知識ベースが私の中にあるわけでもないのですが、それに近い何かだとは思います（？）

## とある現場にて

「このシステムのドキュメントってありますか？」  
「そんなのないよ。なんで？」  
「管理者と一般ユーザーの権限の違いを把握したくて」  
「コード読めば分かるでしょ」  
「あっはい分かりましたありがとうございますお邪魔しました」

言いたいことは色々あるでしょうが、そこはぐっと堪えていただいて。
コードを読めば分かるとのことなので、さっそく目を通してみましょう。

```PHP
if ($user['role'] === 'admin') {
    /* 管理者限定の処理 */
}
```

どこか懐かしい気持ちになるコードですね。

`'admin'`をハードコーディングしているのが良くないというのは分かると思います（`$user`が配列なのもポイント高いですけどね）。

このままでは修正が面倒なので定数を作ることにしましょう。

```PHP
define('ADMIN', 'admin');

if ($user['role'] === ADMIN) {
    /* 管理者限定の処理 */
}
```

これがダメという話ではありません。変更すべき箇所が減るのは良いことです。システムの規模によってはこれで充分という場合も少なくはないでしょう。

しかし、これは私たちが真に恐れるべき本質的な複雑さを解決するものではないのです。

## ユーザーの役割と権限を分けて考える

ここが一番重要なのですが、ユーザーが持つ役割と、役割ごとに与えられる権限は別物です。本来異なるはずの概念を混同してしまうと、モデリングされなかった概念は揮発してシステム全体に霧散してしまいます。

それの何がよろしくないのか？　「このシステムにおいてroleがadminなユーザーは何ができるのか」という、roleごとの権限を把握することが非常に難しくなり、冒頭の会話劇のような状況に陥ってしまうのです。

それを避けるため、役割と権限を分けた実装を試みることにします。
とりあえず役割だけをenumで表してみましょう。  

```PHP
enum UserRole: string {
    /** 管理者 */
    case Admin = 'admin';

    /** 一般ユーザー */
    case Normal = 'normal';
}
```

ではこれらの役割に対して、権限とはどういう概念なのでしょうか？
こちらもenumで表現してみましょう。

```PHP
// ただのマーカー
interface UserPermissionInterface {
}

// 権限を表現するEnum
enum UserPermission implements UserPermissionInterface {
    /** 閲覧権限 */
    case Show;

    /** 編集権限 */
    case Edit;
}
```

roleが特定の権限を有しているか判定するメソッドを、先程の`UserRole`に追加します。

```PHP
enum UserRole: string {
    /** 管理者 */
    case Admin = 'admin';

    /** 一般ユーザー */
    case Normal = 'normal';

    /** roleが特定の権限を有しているか判定するメソッド */
    public function hasPermission(UserPermissionInterface $permission): bool {
        $permissions = match ($this) {
            // Adminは閲覧と編集の権限を持っている
            self::Admin => [
                UserPermission::Show,
                UserPermission::Edit,
            ],
            // Normalは閲覧権限のみ持っている
            self::Normal => [
                UserPermission::Show,
            ],
        };

        return in_array($permission, $permissions);
    }
}
```

そうするとユーザーの権限によって処理を分ける記述はこのように書けます。

```PHP
if ($user['role']->hasPermission(UserPermission::Edit)) {
    /* 編集に関する処理 */
}
```

はてさて、これでいったい何がどう良くなったんでしょうか？  

まず、`UserRole`と`UserPermission`を作成したことでファイルが増えたので、そのぶん複雑化しました。条件式も長くなって読みにくいです。ついでにenumだとかmatchだとか、よく分からない新しい機能をすぐに使いたがるのも気に食わないですね。

一方、`UserRole.php`を見ればroleごとの権限が一目瞭然になるというメリットがあります。まあそもそもそれをメリットだと捉えるかどうか、という話ですね。「散らばっていないと分かりにくいじゃないか！」ということであれば、そうしたほうがよいでしょう。

## まとめ

改良できそうなところは多々ありますが、目的は達したのでこれでよしとします。[^1]
[^1]:UserPermissionは商品管理やユーザー管理などの業務ドメインごとに分けたほうがよさそうですが、あとから気軽にリファクタできる範疇だと思います。

改良前と改良後の条件式をもう一度比べてみてほしいのですが、はじめは「ユーザーの役割がadminか」という条件だったのが、「ユーザーが編集権限を持っているか」という条件に変わっているのが分かるでしょうか？

```PHP
// 改良前
if ($user['role'] === ADMIN) {
    /* 管理者限定の処理 */
}

// 改良後
if ($user['role']->hasPermission(UserPermission::Edit)) {
    /* 編集に関する処理 */
}
```

本来重要なのは「ユーザーの役割が何であるか」ではなく「ユーザーが特定の権限を有しているか」だったのですが、改良前はそのことを発見できていなかったわけですね。

今回は比較的単純な例で説明させてもらいましたが、表面的な分類に目を奪われて重要な概念を見落としていないか考えることは、コードの見通しをよくするうえで非常に重要です。

忌憚なくマサカリいただければ幸いです。それでは！
【Linux】LPIC202合格の最短ルート

## 使用した書籍やサイト
・あずき本
・スピマス（通称：白本）
・ping-t
・VirtualBox(WindowsPC上へインストール)

## 受験までの期間
・１か月（１日：約３～４時間勉強のペースで）

## 試験までの流れ
１．あずき本をとりあえず一通り読んでみる。（あんまりイメージが沸かない。）

２．ping-tの最強Web問題集を使用（10問形式で解く→解説を繰り返して全問行う。）
【重要！】この期間が一番しんどいけど、諦めずに毎日コツコツと短い時間でもいいから継続する。

３．VirtualBox上でLinuxOSを起動し、各種サーバ（Web、メール、NFS、SMB、DNSなど）を立ち上げてみる。
　【参考動画(youtube)】公式　Linux Professional Institute 日本支部 LPI

４．スピマスの第１章～第７章までを解いて、全問解けるようにする。

５．スピマスの問題でコンスタントに９割取れればPeasonVUEにて試験予約

６．スピマスの模擬試験を解いてみる。（解けない場合は、解答を見て理解し、できるまで解けるようにする。）

７．試験

## 受験してみての感想
　このLPIC202の試験が今まで受けてきたLPICの中で一番難しかったです。
 今まで、ping-tに助けられてきましたが、今回のLPIC202に関して言うと、間違いなくスピマスのおかげで合格できたと思っています。（スピマスと類似する問題が多く出題されたため。）
 加えて言うと、VirtualBoxを使用したハンズオンもやってよかったと感じました。参考動画を見ながらやっていくと各種設定ファイルの編集も実施するので、理解が深まっていきました。
 是非、受験を考えている方は参考にしてください。
デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第4回)

## (第4回)目のかすみにはマニュアル点眼薬

こんにちは！京セラコミュニケーションシステムの大山です。
前回の投稿からだいぶ空いてしまいすみません！再開いたします！
前回丁度いいサイズの広角レンズUSBカメラを入手しまして、オートフォーカスで調整の手間がかからないのでこれでいける！と思ったのもつかの間、画像取得すると時々フォーカスがあってない状態で保存されてしまう問題が発生。そこまで頻度は多くないですがデモ中にぼやけてしまうとAIも困ってしまうということでこれを何とかしたい！ということで第4回スタートです！

## 連載記事一覧
[デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第1回)](https://qiita.com/kccs_susumu-oyama/items/7d758f524b0bbfb1b3e0)

[デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第2回)"バッチ検査ってそういうこと！？"](https://qiita.com/kccs_susumu-oyama/items/f92a0c7b164ca3846130)

[デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第3回)"救世主あらわる・・だが？"](https://qiita.com/kccs_susumu-oyama/items/26f56a460da3ea5b5577)

**デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第4回)****"目のかすみにはマニュアル点眼薬"　★本記事★**

## この記事の対象者
Node-REDでRaspberryPiのGPIOを制御したい方
Node-REDのダッシュボードを使ってみたい方
ラズパイでリレー制御してみたい方
ﾌｨｯｼｬｰﾃｸﾆｯｸを動かしてみたい方(もう少々お待ちを・・・)

## オートがあるならマニュアルもできるのでは
オートフォーカスであわせる事ができるのであればマニュアルで設定もできるんじゃないかと思い探してみたところV4L2(VideoForLinux2)というコマンドでUSBに挿したカメラを操作できるかもしれない事が分かったので試してみることに

v4l2-ctl -L
上記コマンドで接続しているカメラの設定できるパラメータ一覧を取得できます。こちらを実行してみたところ

![Q0106_カメラパラメータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/b31cbc89-2483-f47b-5a55-a2ec1c7ba3b3.png)

何かいろいろと出てきました。
一つ例を上げますと
briteness 0x00980900(int) : min=-64 max=64 step=1 default=0 value=0
ブライトネスの操作で最小-64から最大64まで1づつ操作でき初期値は0で現在の値も0という意味合いみたいです。
そして問題のフォーカス設定ですが
・forcus_automatic_continuousでマニュアル/オート切替
・forcus_absoluteでフォーカス調整
できそうですのでVLCメディアプレイヤーを開いてフォーカス調整ができるか試してみることに
※Raspberry Pi OS(64-bit)又は(32-bit)のOSを選択したらデフォルトでソフトが入っています(2023/9時点)
※VLCメディアプレイヤーは再生タブから再生を選びキャプチャーデバイスタブのビデオデバイス名を/dev/video0を選択して再生ボタンを押すとカメラ画像が再生されます。

![Q0106_マニュアル変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/ad0d3c54-d6e7-6a04-e71a-17f2fe649c5d.png)

フォーカス設定をマニュアルに変更
v4l2-ctl -d /dev/video0 -c focus_automatic_continuous=0
フォーカス設定がマニュアルに変更されていることを確認
v4l2-ctl -d /dev/video0 -C focus_automatic_continuous
フォーカスの現在値を確認
v4l2-ctl -d /dev/video0 -C focus_absolute
※USBポートに挿したカメラは大抵/dev/video0かと思いますが変更できない場合はv4l2-ctl --list-devicesのコマンドで接続しているカメラの一覧から確認してみてください。

![Q0106_現在値確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/e095aa88-91ae-7e6d-a8be-355588b9ee7e.png)

フォーカスの値は112なのでとりあえず500に設定して見え方が変わるか確認します。
フォーカスを500に設定します。
v4l2-ctl -d /dev/video0 -c focus_absolute=500
フォーカスの現在値を確認
v4l2-ctl -d /dev/video0 -C focus_absolute
※少しわかりにくいですが値の入力の時は-c(小文字)、値の確認は‐C(大文字)となります。

![Q0106_forcusを500に変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/5d59c70d-d14f-ff20-99aa-c378b2f86887.png)

画面がぼやけたのでカメラのフォーカス設定ができそうです。
最後にオートに戻してみてフォーカスが戻るのか確認してみます。
v4l2-ctl -d /dev/video0 -c focus_automatic_continuous=1

![Q0106_オートに戻す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/622e6ff9-64b8-2190-384f-74fd9aded124.png)

フォーカスがもどりました。
数値も最初の112になっています。
node-redのusbcameraノード撮影前後でもフォーカスに変動がないか確認したところ
フォーカス固定されていることを確認出来たのでマニュアルで設定できそうです。

##　まとめ
V4L2(VideoForLinux2)を使えばマニュアル切替と設定ができ、設定値も固定してくれそうということが分かったのでfocus以外の設定項目も含めてNode-REDのダッシュボード上からexecノードでコマンドを実行してカメラ調整できるように今後していきたいと思います。
ということで今回はここまで、次回はオフライン筐体の製作と動作テストの風景のご紹介をしていきたいと思います。

次回「イメージを形に！！」お楽しみに。
ChatGPTと一緒にJavaScriptをゼロから勉強する記録【JSの基礎】#01

![スクリーンショット 2024-10-02 1.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881103/d76e508b-d131-f481-eb19-ad29612f0816.png)
# はじめに
こんにちは。web開発未経験からwebアプリケーションエンジニアになるため、勉強を始めようと思い記事にいたします。
私のこれまでの経験はC言語を嗜む程度であり、コンピュータサイエンスに関する知識がゼロのところからのスタートとなりますので暖かく見守っていただけると幸いです。最終的にはReact、Next.jsとモダンなweb開発?へと繋げていけたらと思います。また、初学者の方は、私の記事と一緒に勉強していけたらと思います。
よろしくお願いいたします！

# 1.変数
どの言語でもそうですが、変数を宣言してあげる必要がありそうです。
```javascript
var name = 'Kenta';
let age = 30;
const country = 'Japan';
```
`var`、`let`、`const`とあります。ざっくりした使い分けとして、

・基本は`const`を使う。再宣言、再代入ができないため、エラーを未然に防ぐことができる。
・繰り返し構文には`let`を使う。
・`var`は汎用性が高すぎるが故にあまり使わない。

とのことです。
ここで関数スコープとブロックスコープという言葉が出てきました。
簡単言うと、関数スコープは関数全体で有効になる、ブロックスコープはブロック内(`{}`で囲まれた部分)のみで有効という意味らしいです。
ここで、`var`は関数スコープで、`let`、`const`はブロックスコープです。

```javascript
function testVar() {
  if (true) {
    var x = 10;  // varは関数スコープ
  }
  console.log(x);  // ここでもxにアクセス可能 => 10
}

function testLet() {
  if (true) {
    let y = 10;  // letはブロックスコープ
    console.log(y);  // ここではyにアクセス可能 => 10
  }
  console.log(y);  // ここではyにアクセスできない => エラー
}
```

へー、おもしろ。

# 2.データ型
JavaScriptには7つの基本データ型があり、特徴としてJavaScriptには動的型付けがあり、変数は宣言時に型が決まらない。実行時に型が決まるらしい。へぇー。

1. `Number`: 整数や小数
1. `String`: 文字列（例: "Hello", 'World'）
1. `Boolean`: 真偽値（trueかfalse）
1. `Undefined`: 初期化されていない変数の型
1. `Null`: 明示的に値がないことを示す型
1. `Symbol`: ユニークな識別子
1. `BigInt`: 超巨大な整数（ES2020以降）

# 3.演算子
#### 算術演算子
`+`、`-`、`*`、`/`、`%`はCと同じだ。
#### 比較演算子
`==`：型変換を行い比較する
`===`：方も含めて厳密に比較する
```javascript
console.log(5 == '5');  // true（型変換が行われる）
console.log(5 === '5'); // false（型が異なるため）
```
へぇー。おもしろ。`===`で比較できるようなコーディングしたほうが管理しやすいコーディングな気がするな。
#### 論理演算子
`&&`、`||`、`!`これらもCと同じだ。

# 4.条件分岐
`if~else`と`switch`があるらしい。
`if~else`は条件に応じた分岐、`switch`は値に応じた分岐っていう違いがある。


```javascript:if~else
let score = 85;

if (score >= 90) {
  console.log('A');
} else if (score >= 80) {
  console.log('B'); //今回はここ
} else {
  console.log('C');
}
```
```javascript:switch
let fruit = 'apple';

switch (fruit) {
  case 'apple':
    console.log('This is an apple.'); //今回はここ
    break; //breakがないと次のcaseに進んでしまうので必要。
  case 'banana':
    console.log('This is a banana.');
    break;
  default:
    console.log('Unknown fruit');
}
```

なるほど、範囲画広くなきゃswitchか。

ちょ待って、全部`if~else`でよくない？そう思った私は質問してみた。
すると、条件が多い時は`switch`の方がスッキリ書けるらしい。納得。

# 5.ループ
基本通り`for`と`while`があると。一応備忘録も含め例を書いておく。
```javascript:for
for (let i = 0; i < 5; i++) {
  console.log(i);
}
```
```javascript:while
let count = 0;
while (count < 5) {
  console.log(count);
  count++;
}
```
Cと一緒で安心。

# 6.関数
なんか色々書き方があるみたいなので、次章以降に。
```javascript
function greet(name) {
  return 'Hello, ' + name;
}
```
```javascript
const greet = (name) => 'Hello, ' + name;
```
ちなみに下はアロー型というらいしい。
それぞれ、特徴があって使い分けるらしいわ。
ほえー。難しそう。

# おわりに
今回は変数や型などの基本的な部分について学習しました。
これだけ学んでも何も動かせないので、早く何かプロダクトを作ってみたいものです。
記事に足を運んで下さりありがとうございます。
それではまた。
万物はプログラミングである

プログラミングをしていると、ふと気づくことがある。世界そのものがプログラムと同じ仕組みで動いているのではないか、という考えだ。たとえば、私たちの日常は条件分岐やループに似ている。朝、目覚まし時計が鳴り、毎日同じように起きる。この一連の動作はまさにプログラムされたループだ。目覚めるか、寝続けるか。if文のように二者択一の選択を迫られる。

自然界も同様だ。四季の移り変わり、夜と昼の交替、潮の満ち引き――すべてが正確に「実行」されている。何かしらの条件が整ったときに「イベント」が発生する。雨が降るのは、湿度と温度、気圧などの条件が整った結果だ。それはまるで、膨大なコードの中でif文が真になり、雨を降らせる「関数」が呼び出されたように見える。

だが、こんなことを言うと「それは単なる自然現象だろう」と反論されるかもしれない。確かに、自然はプログラムされているわけではない。しかし、プログラミングの概念を借りると、世界のあらゆる現象が合理的に説明できる。複雑に見える世界の背後には、見えない「アルゴリズム」が存在するかのように。

人間の行動もプログラムに似ている。私たちは過去の経験や知識に基づいて行動する。新しい情報をインプットすれば、それをもとに意思決定の「アルゴリズム」が更新される。感情の起伏も変数のように揺れ動き、状況によってその値は変化する。怒り、喜び、悲しみ――すべては何らかのトリガーで「呼び出された」感情の一部に過ぎないのかもしれない。

そして、すべての人間はデバッグを続けている。誰もが自分の人生のバグを修正し、より良い結果を求めて試行錯誤している。エラーが出れば学び、次の試みに備える。最適化を続けながら、私たちは前に進む。

一見、プログラミングとは関係ない事象も、よく見ればその背後にプログラミング的な要素が潜んでいる。たとえば、料理をすることもプログラミングだ。レシピという「コード」に従い、材料を「入力」し、手順通りに「処理」する。結果として料理という「アウトプット」が得られる。レシピを変えれば、結果も変わる。条件に応じて、手順をアレンジするのはプログラミングと同じだ。

つまり、万物はプログラミングであり、プログラミングでないものなど存在しない。
mindの研究 その86

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
電卓を操作して、１７＋１３を求めよ。

# 環境
windows11

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f24179fb-daa4-b13a-4e92-b320dd59d3ed.png)


# サンプルコード

```

送信とは
　数１は　変数
　結果は　変数
　数１に　入れ
　数１をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　数１をつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
。

メインとは
　「calc.exe」を　プログラム実行
　一秒待つ
　031hをつみ　送信し
　037hをつみ　送信し
　06bhをつみ　送信し
　031hをつみ　送信し
　033hをつみ　送信し
　0dhをつみ　送信し
。



```

以上。
Dockerで立ち上げたwordpressとmysqlのバックアップとリストア方法

## 前提条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/357a660b-c733-82e5-8bfe-0c900634cfa5.png)


D:\Docker_app\docker_wordpress ここにdocker-compose.ymlと、buckupフォルダおいています。
buckupの中身は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/2374ee3f-0b33-c5e2-286e-8cc1e36c5247.png)

これとします。
mysqlとwordpress別々でバックアップをとります。

## バックアップ取得
まず、mysqlとwordpressのデータはdockerVolumeにあります。dockerVolumeはwindowsのエクスプローラーから見えないので、コマンドプロンプトを使って、バックアップとリストアを行います。

### バックアップ開始前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/12a32c0f-4d63-6804-c83d-36f182316c17.png)
stopします。
```
docker run --rm ^
-v docker_wordpress_wordpress_data:/var/www/html ^
-v D:/Docker_app/docker_wordpress/backup/wordpress:/backup ^
busybox sh -c "tar -czf /backup/wordpress_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /var/www/html ."
```
dockerVolumeからD:\Docker_app\docker_wordpress\backup\wordpressに、wordpress_backup.tar.gz(圧縮ファイル)として保存します。
```
docker run --rm ^
-v docker_wordpress_mysql_data:/var/lib/mysql ^
-v D:/Docker_app/docker_wordpress/backup/mysql:/backup ^
busybox sh -c "tar -czf /backup/mysql_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /var/lib/mysql ."

```
同様にMySQLもバックアップ
バックアップ終了したら、dockerスタートしてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/c394c7e2-a38c-b379-5f6c-afa316593b2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/91891eda-c2c5-f5f2-f3d4-45895245d8d8.png)


### リストア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/12a32c0f-4d63-6804-c83d-36f182316c17.png)
stopします。
```
docker run --rm ^ -v docker_wordpress_wordpress_data:/var/www/html ^ -v D:/Docker_app/docker_wordpress/backup/wordpress:/backup ^ busybox sh -c "tar -xzf /backup/wordpress_backup.tar.gz -C /var/www/html"
```
D:\Docker_app\docker_wordpress\backup\wordpressからdockerVolumeに、wordpress_backup.tar.gz(圧縮ファイル)を解凍してｺﾋﾟﾍﾟしてます。
～～～.tar.gzはバックアップしたファイルの名前です。　

```
docker run --rm ^ -v docker_wordpress_mysql_data:/var/lib/mysql ^ -v D:/Docker_app/docker_wordpress/backup/mysql:/backup ^ busybox sh -c "tar -xzf /backup/mysql_backup.tar.gz -C /var/lib/mysql"
```
同様にMySQLもリストア

リストア終了したら、dockerスタートしてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/c394c7e2-a38c-b379-5f6c-afa316593b2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/91891eda-c2c5-f5f2-f3d4-45895245d8d8.png)

## 感想
dockerを使ったwordpressの実装ですが、環境構築が楽な点がいい。
composeファイルとバックアップさえもっておけば、wordpressサーバーが壊れたとき、すぐに別のサーバーへwordpressを移行させることができます。

composeとバックアップをコピペして、コンテナ立ち上げて、リストアすれば復旧完了。
GitHubにレビュー略語のバッチを設定する！

# はじめに
コードレビューをする際にバッジをつけることでレビューの温度感(絶対直してほしい修正なのか、提案なのかなど)が伝わるようにしています。今回はGitHub上でバッジの設定方法と私の設定しているバッジを紹介します！

# バッジの設定の仕方
https://github.com/settings/replies から設定することができます。

Saved reply titleにバッジ名、Add your saved replyに後述する文章を書きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457651/69e48a50-26c2-15c0-9b34-178751dfe499.png)

例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457651/67fbbe46-7c7b-29d8-895f-d20adb4ff3c1.png)

# 呼び出し方

コメントをする際に呼び出すことができます

- 〼 (Slash commands)を選択
- Saved replies を選択
Saved reply titleに名、Add your saved replyに後述する文章を書きます
- 設定したのタイトルが一覧で表示。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457651/75cc2878-91c9-e262-a6b7-9bff255fe32c.png)

- タイトルを選択するとコメントに自動で埋め込まれ、Previewから確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457651/b42a0be5-b859-9565-ced0-b4db678c7379.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457651/7671173b-ad6f-4fac-574c-d4ecb835bc2d.png)


# 設定しているバッジ
設定しているバッジは全部で11個です！

## ask
![ask](https://img.shields.io/badge/review-ask-9b71ae.svg)
```
![ask](https://img.shields.io/badge/review-ask-9b71ae.svg)
```

## caution
> [!CAUTION]
> 特定の行動のリスクやマイナスの結果についてアドバイスします。
```
> [!CAUTION]
> 特定の行動のリスクやマイナスの結果についてアドバイスします。

```

## good
![good](https://img.shields.io/badge/review-good-success.svg)

```
![good](https://img.shields.io/badge/review-good-success.svg)
```

## imo
![imo](https://img.shields.io/badge/review-imo-yellow.svg)
```
![imo](https://img.shields.io/badge/review-imo-yellow.svg)

```

## must
![must](https://img.shields.io/badge/review-must-critical.svg)

```
![must](https://img.shields.io/badge/review-must-critical.svg)
```

## nits
![nits](https://img.shields.io/badge/review-nits-inactive.svg)

```
![nits](https://img.shields.io/badge/review-nits-inactive.svg)
```

## important
> [!IMPORTANT]
> ユーザーが目標を達成するために知っておく必要がある重要な情報。

```
> [!IMPORTANT]
> ユーザーが目標を達成するために知っておく必要がある重要な情報。
```

## note
> [!NOTE]
> コンテンツを流し読みする場合でも、ユーザーが知っておくべき役立つ情報。

```
> [!NOTE]
> コンテンツを流し読みする場合でも、ユーザーが知っておくべき役立つ情報。
```

## tip
> [!TIP]
> 物事をより良く、より簡単に行うための役立つアドバイス。

```
> [!TIP]
> 物事をより良く、より簡単に行うための役立つアドバイス。

```

## tweet
![tweet](https://img.shields.io/badge/review-tweet-9cf.svg)

```
![tweet](https://img.shields.io/badge/review-tweet-9cf.svg)

```

## warning
> [!WARNING]
> 問題を回避するためにユーザーが直ちに注意を払う必要がある緊急情報です。

```
> [!WARNING]
> 問題を回避するためにユーザーが直ちに注意を払う必要がある緊急情報です。

```
# おわり
他にもおすすめのバッジやコメントがあれば、教えてください！

#  参考
https://qiita.com/kamihork/items/be0d7bdad8ae5a8082fb
https://zenn.dev/ikarin0825/articles/c6a64678ed13ff
Python - pip install したのに ModuleNotFoundError になる＜解決方法＞

## はじめに
Pythonでモジュールをインポートする際に、pip installしたのに「モジュール見つからないよ～」と言われたときの解決方法です。
anaconda と Pythonを両方インストールした記憶のある人はこれで解決する可能性が高いです。
（何度PythonとAnacondaのuninstallとinstallを繰り返したか。。。）
備忘録として書きましたので良ければ参考にしてください。

## 環境
* Windows11
* VSCode

## 状況
コマンドプロンプトでpip installすると「既にインストールされてるよ～」と帰ってくる

~~~
C:\Users\namae>pip install モジュール名
Requirement already satisfied: モジュール名 in c:\users\namae\appdata\local\programs\python\python312\lib\site-packages (4.66.4)
Requirement already satisfied: colorama in c:\users\namae\appdata\roaming\python\python312\site-packages (from tqdm) (0.4.6)
~~~

なのに、以下のようにimportしようとすると「見つからないよ～」と帰ってくる
~~~python.py
import モジュール名
~~~

~~~
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 import モジュール名

ModuleNotFoundError: No module named 'モジュール名'
~~~

## 確認すること
### カーネル
VSCodeの右上にあるPython3.12.4(バージョンは人によって違います)を押してPythonがどこで実行されているか確認

VSCodeの画面![スクリーンショット 2024-10-02 134823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/5fa492cf-ac48-7421-a6c8-ab913deaefbf.png)

この場合はPythonで実行されている。
もし、パスの中にanacondaという単語が入ってたらanacondaで実行されている。
※パス：写真の（~\AppData\...\python.exe）のこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/771f45b7-4cbe-6a01-14dd-88ee34d50f07.png)

### システム環境変数
Pythonがどこで実行されているか確認できたら、次は環境変数が正しく設定されているか確認します。
このとき、PythonがPythonで実行されているのに（分かりづらい）環境変数のpathがanacondaになっている、もしくはその逆だと上手くモジュールのインポートができません。

タスクバーの検索エンジンで「システム環境変数」と入力すると、システム環境変数の編集というのが出てくるのでクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/c1dda9f2-e55f-23e0-c382-fab5ba122f0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/7eda4f48-db79-c53c-e5c2-5f6fa60c3853.png)

右下にある「環境変数」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/9de7d074-e642-683a-87ec-b34b168e6ed2.png)

ユーザーの環境変数から「Path」を選択し、編集をクリック
（黒塗りはユーザー名です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/4de4a40a-8c99-fddd-e955-a50e9eb7a106.png)

こんな感じでパスが色々設定されています。
* カーネルの確認で「Python」上でPythonが実行されている場合
→パスの中にanacondaという単語が入っているものを選択して削除
**※anacondaはもう使わないよ～って人だけやってください。責任は取れません。**
    * 正しいパスを設定する
    フォルダの「Cドライブ→ユーザー→ユーザ名→AppData→Local→Programs→Python」の中にPython312（312はバージョン）があると思うので、探す。（AppDataがない場合、「隠しファイルを表示」みたいなものを検索して設定してください）
この時にPythonのバージョンがカーネルで確認したものと一致していることも確認してください。（カーネルで確認したバージョンが3.12.4であればPython312でOK）
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/a31ebb03-60e5-ef1e-82f2-713b5d5a11fa.png)

Python312までたどり着いたら（Python312の中に入っておく）、画像の赤色部分を右クリック→アドレスをコピーを選択。
システム環境変数に戻り、新規を選択→先ほどコピーしたものを貼り付けでOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/17a538e8-53d7-e686-b5d4-9b7d9ece06ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747240/90f41534-174b-5263-4c52-a4131aa9b4f6.png)

フォルダに戻り、Scriptsの中に入る→先ほどと同様にアドレスをコピー。
システム環境変数にコピーしたアドレスを新規で追加。

ここまでできたらPCを再起動して、インポートしたかったモジュールをpip installし、VSCodeでimportする。


おわり。
【DAY23】Loading画面の作成

## はじめに
Webアプリケーションを作成したのですが、画像を表示する時などのロード時間が気になりました。そこで、ローディング画面を作成し、ロード中であることが視覚的に分かりやすくしようと考えました。
ローディング画面実装に、以下のサイトを使用しました。
https://loading.io/
また、以下の本を参考にしました。
[1冊ですべて身につくJavaScript入門講座](https://www.amazon.co.jp/%E3%80%90Amazon-co-jp-%E9%99%90%E5%AE%9A%E3%80%911%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-DL%E7%89%B9%E5%85%B8-JavaScript%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88-%EF%BC%91%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F/dp/4815615756)

## ローディング画像の選択
https://loading.io/
こちらのサイトで、APNGのローディング画像を取得しました。

## HTML、CSS、JSの記述
まず、bodyタグの一番上に以下のコードを記述しました。
```html
<div id="loading">
    <img class="loading-img" src="{{ asset('loading.png') }}" alt="">
</div>
```
srcのところには取得したローディング画像のパスを指定してください。私はLaravelで開発をしているので、asset()へルパを使用した少し特殊な記述となっています。

```style.css
#loading {
    transition: all 1s;
    background-color: #fff;
    position: fixed;
    z-index: 100;
    inset: 0;
    display: grid;
    place-items: center;
}
.loading-img {
    width: 200px;
    height: 200px;
}
.loaded {
    opacity: 0;
    visibility: hidden;
}
```
loadedというクラスは、JSにてロードができた時にdivタグに追加します。
```loading.js
const loading = document.querySelector('#loading');

window.addEventListener('load', () => {
    loading.classList.add('loaded');
});
```
これで一通りの処理が書けました。
ここで、ロード画面を半透明にしたいと考え、#loadingにopacityプロパティを追加しました。
```style.css
#loading {
    opacity: 0.5;
}
```
しかし、opacityを指定するとtransitionが効かなくなり、1秒かけてフェードアウトしていたローディング画面が瞬時にフェードアウトするようになってしまいました。
結局明確な原因は分かりませんでしたが、background-colorをrgbaで記述して背景を半透明に指定することで解決しました。
```style.css
#loading {
    transition: all 1s;
    background-color: rgba(255, 255, 255, 0.5);
    position: fixed;
    z-index: 100;
    inset: 0;
    display: grid;
    place-items: center;
}
```
背景を半透明に指定する方法で実装する場合は、ローディング画像の背景が透明でなければいけないので、最初に取得するローディング画面も背景が透明なものにしておきましょう。

これでローディング画面が実装できました。
Dockerでwordpressを立ち上げる。

# やること
Docker上でwebアプリケーション(wordpress)を動かす。
ローカル環境でひとつの物理サーバーに複数のアプリを動かす。

今回の環境は、
①wordpress
②Fess
③Flaskアプリ　...ets
複数のアプリを簡単に立ち上げることができるのがDockerのいいところ。
・導入楽
・リソース競合しない
・ライブラリ競合しない
・

## 前提
windows11
docker for desktopのインストール完了 wsl2は有効化してね
## docker-compose.ymlを作成
自分のローカル環境で話を進めます。
D:\Docker_app\docker_wordpress

ここに、docker-compose.ymlというファイルを作成してください。
中身は↓
```
version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql  # Dockerボリュームに保存
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html  # Dockerボリュームに保存

volumes:
  mysql_data:
  wordpress_data:
```

メモ
 wordpress_data:/var/www/html  # Dockerボリュームに保存
 wordpress_dataというフォルダをdocker内に作成する。

## コンテナ起動
```
cd D:\Docker_app\docker_wordpress
docker-compose up
```
docker-compose.ymlを使ってdocker上にwordpressをつくるイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/ab657614-6ddd-a14c-8938-e2a4b1136213.png)
同じ階層にbuckupフォルダを作ります。次の記事でバックアップの取り方を説明しますのでその時に使用します。

↓
## wordpress 起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/35fb1bec-b6c1-2b1b-9ecf-aca5bc4a5e61.png)
docker見たら、wordpressが立ち上がっているはずです。800:80をクリックすればwordpressのページに飛びます。
wordpressのセットアップを続けてください。
以上です。
Barrierを試したけどうまくいかなかったハナシ

:::note warn
この記事は現状問題の記録になっており、解決策にたどり着けていないことをご了承ください。
:::

## 使用環境
- Windows11 Pro 23H2
- Ubuntu 22.04.5 LTS

## 実現したかったこと
職場でWindowsマシンとLinux(Ubuntu)マシンを使用しており、それぞれにキーボードとマウスを接続していると机が狭くなってしまった。
なにかいい解決策がないかperplexityさんに訪ねたところ、2つの案を出してくれた。
1. 物理的な切替器
1. ソフトウェアによる共有(barrier)

物理的な切替器は数千円ほどするみたいで、とりあえず無料のbarrierで実現できたらうれしいなと考えた。

## やったこと
幸いbarrierは多くの人に利用されているらしく、参考記事が多く見つけられたのでそれに従って設定した。
（参考）
- [Share the mouse between Win11 and Linux]("https://ichino-memo.com/share_the_mouse_by_barrier/")
- [Barrierでキーボードとマウスを複数のPCから共用する]("https://gihyo.jp/admin/serial/01/ubuntu-recipe/0575")

普段はWindowsマシンの方をメインにメールをしたり、調べものをしていたのでこちらをサーバー、開発用に使っているUbuntuマシンをクライアントとしてセットアップした。

Ubuntu側のログでサーバーに接続できたことを確認した。
` NOTE: connecting to '192.168.x.xx': 192.168.x.xx:24800
connected to server `

## 困ったこと
すんなり接続までできたことは嬉しかった。
しかしながらマウスカーソルをサーバー側(Windows)からクライアント側(Ubuntu)に移動すると
` INFO: entering screen `
というログは出るものの、Windows側に帰ってこれなくなってしまった。

検索すると、barrierのGithubで似たようなIssueが投げられていた。
- [ Log shows "entering screen" on clients but the display stays in server screen; moving mouse back into server display and log shows "Entering screen" #1628  ]('https://github.com/debauchee/barrier/issues/1628')
- [ when i move the cursor to the client screen, instantly it goes to the bottom right corner of the client screen. and cant be moved from there #1405 ]('https://github.com/debauchee/barrier/issues/1405')

こちらを参考にWindows側のbarrierをV2.4.0からV2.3.3にダウングレードして再起動した。
Ubuntu側は「ソフトウェア」から入れていて、ダウングレードの方法がわからなかったのでとりあえずそのままにした。
すると、Windows側のマウス操作で行き来ができるようになったが、Ubuntu側でカーソルが移動しない。

ログでは
` INFO: entering screen`
` INFO: leaving screen `
が行き来のたびに更新されているが、どうしてもUbuntu側のカーソルは微動だにしていない。

### #WaylandEnable=false　？
- [Mouse disappears while using Barrier](https://askubuntu.com/questions/1407275/mouse-disappears-while-using-barrier)

このQ&Aがまさに私が知りたかったこと！と思い回答の通りに実行したところ、なぜかUbuntuの画面が赤〜くなった。

試してみたらたしかにBarrierはサーバークライアント間でシームレスになっていた。
 **（やりたかったことは実現できた）**

 でも普段のUbuntu画面が明らかに真っ赤な状態で怖いので一旦戻した。
 （最初はびっくりして本当に怖かったので再起動とか色々試した）
 色味がちょっと赤とかではなく、全体に赤いフィルムをかけたような状態だった。

 この原因はおそらく`sudo nano /etc/gdm3/custom.conf `で、` #WaylandEnable=false`　のコメントアウトを外したことだろう。

 調べたところ、WaylandはUbuntu 22.04から採用された画面描画の手法らしい？
[画面描画法が変わった最新Linux「Ubuntu」、アプリ互換性に問題も](https://xtech.nikkei.com/atcl/nxt/column/18/02107/062200004/)
けど全然理解が及ばなかったのでとりあえず諦めた…。
解決方法が見つかったら追記予定。

### 余談
そもそもLinuxマシンにあんまり慣れていない筆者ですので、先日Pythonのバージョンを入れ替えようとして`sudo apt remove python3`を実行してしまい、泣きながらOSクリーンインストールをしたのがトラウマなのです。
ｳﾌﾞﾝﾂｺﾜｲ、ﾅｶﾖｸﾅﾘﾀｲ…
Atomic Simulation Environmentの使い方: 振動解析, IR計算


## 振動解析(IR)
* `ase.vibrations`のInfraredを使う
```python
from ase.io import read
from ase.calculators.vasp import Vasp
from ase.vibrations import Infrared
from ase.constraints import FixAtoms

mol  = read("POSCAR") # do not use previous IR calc. file --- POSCAR is overwritten!

# only C and H atoms are allowed to move --> set in index
vib_index = []
for i,atoms in enumerate(mol):
	if atoms.symbol == 'C' or atoms.symbol == 'H':
		vib_index.append(i)

calc = Vasp(prec='normal', xc='pbe', isym=0, nsw=0, idipol=3,
            ldipol=True, dipol=mol.get_center_of_mass(scaled=True))

mol.set_calculator(calc)

# Omit this section when IR intensitiy is not needed
ir = Infrared(mol, indices=vib_index)
ir.run()
ir.write_spectra(start=1000,end=4000, width=10, normalize=True)
ir.summary()

# Omit this section when vibrational mode is not needed.
# Modes are outputed as *.traj files
vib = Vibrations(mol, indices=vib_index)
vib.run()
vib.summary()
vib.write_mode()
```
* POSCARで`Selective dynamics`を設定しないこと
* trajファイルで振動モードが見える
Atomic Simulation Environmentの使い方: 状態密度の計算・解析


## 状態密度(DOS)
* DOSの種類
    1. total DOS: 単にDOSというとこれ。全電子、s, p, dなどの角運動量成分を全て含む
    2. projected DOS: s, p, dなどの角運動量に分けたもの
    3. localized DOS: DOSを原子や原子種に分けたもの。2とは両立してよい
* スピン分極した場合、上記は全てup成分とdown成分に分かれれる

### ASEを使った描画例
* `ase.calculators.vasp`の`VaspDos`を使う (古いかもしれない)
* 例
```python
from ase import Atoms, Atom
from ase.calculators.vasp import Vasp
from ase.calculators.vasp import VaspDos
import matplotlib.pylab as plt

h2 = Atoms("H2",[(0,0,0),(0,0,0.7)], cell=[10,10,10])
calc = Vasp(prec="normal", xc="pbe", kpts=[1,1,1])
h2.set_calculator(calc)
h2.get_potential_energy()

dos = VaspDos(efermi=calc.get_fermi_level())
energy = dos.energy
dos = dos.dos

plt.plot(energy, dos)
plt.show()
```

* PDOSを得る場合
```python
...
# to lm-decompose, set lorbit=11
calc = Vasp(prec="normal", xc="PBE", kpts=[1,1,1], lorbit=10)
...
iatom = 0
dos = VaspDos(efermi=calc.get_fermi_level())
pdos = dos.site_dos(iatom, orbital="s")
...

```

## Localized DOS
* 原子に射映したDOS
* 作成する手法は主に3つ
    1. University of Texas, Henkelman groupのスクリプト(split_dos, sum_dos)などを使う
    2. ASEで原子ごとのDOSを取り出す
    3. VaspKitを用いる
* 3.が一番楽

## smeared DOSを作る場合
* 通常のDOSはギザギザしすぎるのでsmearすることがおおい
* Gaussian smearingなどを用いることがある
```python
import numpy as np
from scipy.ndimage import gaussian_filter1d
import matplotlib.pyplot as plt

# localized DOS (LDOS) generated by VaspKit
a = np.loadtxt("PDOS_C_UP.dat")
plt.plot(a[:,0], gaussian_filter1d(a[:,2],sigma=4))
plt.show()
```
世界一わかりやすい＆超実践的なRFM分析

RFM
## R：最後購入して今日時点までの期間。(日単位か週単位、月単位）
例えば、本日は2024/7/25日で、あるお客様の最後の購入は2024/7/23です。こういう場合、日単位の場合Rは1になります。
* 購入頻度が高ければ高いほど、集計期間を短くする。
* 大型セールはRに影響することがあります。例えば、サイトユーザー誰でも買うような大型イベント(Amazonプレミアムデー）。こういう場合、Rを集計する前に、期間内の購買を除いたほうがよい場合があります。
* Rは随分過去になっても、ユーザーが完全に離脱しているわけでもない。セールや新品発売の時にまた購入するかもしれません。

## F：一定期間内の購入回数
* 購入頻度が高ければ高いほど、集計期間を短くする。
* F=0とF=1を重点的に確認する必要があります。
新規顧客の場合、F=0&1はLTVが低いとみなしていいかもです。
既存顧客の場合、Fは0の顧客はすでに離脱している可能性が高いです。Fは1の場合、買い溜めやキャンペーンと関係あるかもしれません。
* Fは高ければ、高いほど、再度喚起する可能性が高いです。

## M：一定期間の購入金額
* Rと一緒に確認することが多いです。購入金額が多い人はすでに離脱している可能性が高いからです。
* Mが高ければ、優良顧客と思われがちですが、時間がたつとともに、購入金額が減っていくかどうかを確認する必要があります。

## R＋M
M高い＋R遠い　重点喚起する

## F+M
* M高い＋F低い　
買い溜めの可能性が高いです。クロスセルや新品などをレコメンドしたほうが良いです。消耗頻度などを考慮してアプローチする。また、セールを狙って購入する傾向があるかどうかを確認します。
* Ｍ低い＋F高い
Fが高いということはロイヤリティが高いということになりますので、試しに高額のものをレコメンドするのもありです。
CloudWatchの「StatusCheckFailed_Instance」と「StatusCheckFailed_System」の違いについて

Amazon EC2（Elastic Compute Cloud）インスタンスには、システムの健全性を監視するためのステータスチェックが2種類あります。それぞれ以下の通りです：

- 	StatusCheckFailed_System（システムステータスチェックの失敗）
- 	StatusCheckFailed_Instance（インスタンスステータスチェックの失敗）

これらのステータスチェックは、インスタンスが正常に動作しているかどうかを確認するための重要な指標です。

### StatusCheckFailed_System（システムステータスチェックの失敗）とは？
システムステータスチェックは、AWSインフラストラクチャ側の問題を検出するためのチェックです。
具体的には、以下の要素を監視します：
- ハードウェアの故障：物理サーバーやネットワーク機器の障害。
- 電源障害：データセンター内での電力供給の問題。
- ネットワーク接続の問題：AWSの内部ネットワークやインターネットゲートウェイの障害。
- ハイパーバイザーの問題：仮想化ホスト上での問題。

### StatusCheckFailed_Instance（インスタンスステータスチェックの失敗）とは？

インスタンスステータスチェックは、EC2インスタンス内のソフトウェアや設定に関連する問題を検出するためのチェックです。具体的には、以下の要素を監視します：

- OSのハングやクラッシュ。
- メモリ不足やディスク容量不足。
- ネットワーク設定の誤り（例：セキュリティグループの設定ミス）。
- アプリケーションの異常動作。
- ブートプロセスの失敗。

### まとめ
両者の違い
| 1 | 2 | 3 |
|:-:|:-:|:-:|
|  特徴 |  StatusCheckFailed_System（システムステータスチェックの失敗） | StatusCheckFailed_Instance（インスタンスステータスチェックの失敗）  |
|チェック対象|  AWSインフラストラクチャ（ハードウェア、ネットワークなど） | EC2インスタンス内のソフトウェアや設定  |
| 原因  |  ハードウェア障害、ネットワーク障害、ハイパーバイザーの問題など |  OSのクラッシュ、メモリ不足、ディスク容量不足、設定ミスなど |
|  ユーザーの対応方法 |  主にAWSサポートに依頼、再起動や停止・開始を試みる |  ログの確認、インスタンスの再起動、設定やアプリケーションの修正 |
| 解決可能性  | ユーザー側では解決困難（AWSに依存）  | ユーザー側で解決可能  |
| 影響範囲  |  インフラ全体の問題であるため広範囲 |   特定のインスタンスのみの問題|

	•	StatusCheckFailed_SystemとStatusCheckFailed_Instanceは、EC2インスタンスの健全性を監視するための重要な指標です。
 	•	システムステータスチェックの失敗は、主にAWSインフラストラクチャ側の問題を示し、ユーザー側では直接解決できないことが多いです。
	•	インスタンスステータスチェックの失敗は、EC2インスタンス内のソフトウェアや設定に関連する問題を示し、ユーザー側で対応可能です。
	•	各ステータスチェックの違いを理解し、適切な対応を行うことで、システムの可用性とパフォーマンスを維持できます。
2024年10月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年10月2日の検索結果 (リスティング広告)

![スクリーンショット 2024-10-02 134956.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/f04af06c-fcd2-9b6c-ae18-665559f380f7.jpeg)

* Splunk
* オージス総研
* Dynatrace
* IBM

今月は Splunk が TOP で、2番目にオージス総研が登場しました。Dynatrace と IBM が続いています。

先月の結果はこちら --> [2024年9月 AIOps 定点観測](https://qiita.com/mkodera/items/435b1877e0f049ef6152)

# 2024年10月2日の検索結果 (広告以外)

![スクリーンショット 2024-10-02 135213.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/2ce2070d-20b7-f217-d3f6-f74db47d7429.jpeg)

* Splunk
* AWS
* IBM
* オージス総研
* Monster Lab
* HPE


これまで不動のトップだった HPE がついに陥落しました。広告でも TOP だった Splunk が広告以外でも TOP です。
広告で2番目に登場したオージス総研が広告以外でも4番目に登場しました。形勢が変わりつつあるのでしょうか？ 今後に注目です。

先月の結果はこちら --> [2024年9月 AIOps 定点観測](https://qiita.com/mkodera/items/435b1877e0f049ef6152)
【AI/LLM】アプリケーションにどう取り入れるべき？【持論】


# 結論

### 1.解決すべき課題にAI利用が適しているか考える
### 2.AIを取り入れたとしてもユーザーの手間は増やさない、あるいは最小限に止める
### 3.課題解決に即したAIを選定・変更していく

##### (4.コストに見合うかも重要)


## 1.解決すべき課題にAI利用が適しているか考える
開発者としてはAI・LLMは面白すぎる存在ですし、僕もAPIを使って個人開発したり最新情報を追ったりしています。
そこでなんとなく、とにかくAIを使って何か作りたいなと思うわけですが成果物に対しAI不要なケースが多いのも事実です。（すごくいいアイディア思いついたけどよく考えたらAIじゃなくて既存のシステムの方が適してるな、、みたいな泣）
解決したい問題があるならまずは

**・既存システムで解決できるか検討する**

ことが大事です。（APIはお金もかかります）むしろ現代においては既存システムの方が解決できる問題は多いと思います。

また、AI/LLMが何が得意で何が不得意なのか知識として知っておくことは重要だと思います。
以下はGPTに得意・不得意を聞いてみた返答です😁


<details><summary>得意・不得意に関して</summary>

AI/LLMの得意なこと
・自然言語処理（NLP）

テキストの生成、翻訳、要約、質問応答など、文章を理解し、自然な形で生成する作業が得意です。
大量の文書データからパターンを学び、特定の質問や指示に応じて的確な応答を提供します。
・情報の検索と要約

大量のデータから特定の情報を素早く探し出し、必要な要約を作成することが得意です。これにより、リサーチ作業や資料作成が効率化されます。
・反復的な作業の自動化

同じパターンで繰り返される作業や、ルールに基づいた単純作業は効率的にこなせます。たとえば、チャットボットの運用やメールの自動応答などです。
・大規模データからのインサイト抽出

多量のデータを解析し、そこからトレンドやパターンを見つけるのが得意です。マーケティング分析や予測モデルの作成に役立ちます。
・マルチタスク処理

多様な領域の知識を持っているため、複数の異なる質問に即座に対応したり、多様なタスクを並行して処理できます。

AI/LLMの不得意なこと
・リアルタイムの意思決定や直感的判断

実際の物理世界での状況判断や、人間の直感に基づく意思決定には向いていません。特に、曖昧な状況や未定義の状況では、LLMは誤った判断をする可能性があります。
・最新の情報や専門的な知識のアップデート

LLMはトレーニングされたデータまでの知識しか持たないため、最新の出来事や情報には対応できない場合があります。リアルタイムの情報にはアクセスできないことが多いです。
・創造的な発想や革新的なアイデアの創出

既存のデータやパターンに基づいて回答するため、完全に新しいアイデアや創造的な発想を生み出すのは不得意です。人間の独創性やクリエイティブな発想には追随できません。
・コンテキストを超えた深い理解

会話の文脈を理解する能力は向上していますが、複雑な感情や長期的なコンテキストを保持したままの対応にはまだ限界があります。
・倫理的判断や価値観の評価

人間の価値観や倫理に基づいた判断は不得意です。倫理的に複雑な状況や感情に基づく対応が求められる場面では、誤解や問題を生じることがあります。

</details>




## 2.AIを取り入れたとしてもユーザーの手間は増やさない、あるいは最小限に止める

### チャットボット作ったよ！！→「チャット」という手間が増えただけかも
持論ですが多くのユーザーは新機能や新技術に興味のない、あるいは心理的負担を有する方が多いと感じています。（僕も部分的にそうで、アプリの新機能とかはとりあえず様子見することもあったり）

そこで企画・開発サイドがどれだけ素晴らしい成果物をAIを用いて作り上げてもユーザーサイドは全く興味がない、むしろAIに嫌悪感を持ってしまう人すらいると考えています。

よって何か社会的な課題をAIを用いて解決すると決まった際はAIを参謀のような形で使うのが良いかなと感じています。

具体的にはAIを使うからといって真新しいUIや機能的な体験は現在、成果を出しづらいため避けようということです。
普段からユーザーがソフトウェア上で行なっている操作・体験にAIを忍ばせて価値を高めていくのが直近の理想なのではと思います。（今後のAIの浸透具合に期待！）

うまくいかない例）ECサイト：AIチャットbotでお買い物をサポートします！機能
→ユーザー目線：「本当に使えるの？」「自分で探すからいいや」「結局今までの検索機能と変わらないな」「チャット入力するの**めんどくさい、、**」

### ユーザーの手間を増やさずユーザー体験をよくする例

**・ECサイトの通常の検索機能にAI導入**
ユーザーが検索フォームへ入力するたびにその商品と関連する比較項目をAIが生成し、 UIに届ける感じです。
これのミソは「普段から行なっている検索機能」の体験をAIがよくしてくれている点です。またAIを使うことでユーザーが想像していない、あるいは深層心理に存在していたワードが生成されるかもしれません。


## 3.課題解決に即したAIを選定・変更していく

AI/LLMは現在多くの企業から異なるものが提供され気軽に使えるようになっています。
そこで開発サイドは成果物に対して適したAIを選定することも重要なタスクになってきます。
というのもAIごとに得意なタスクが存在するためです。

比較に関しては以下記事が参考になるかと思います。

https://weel.co.jp/media/japanese_llm/
cscの作法 その523

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
UIAutomationのツリーが見たい。

# 方針
- treeview使う。
- 再帰を使う。
- RawViewWalkerを使う。
- calc使う。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7e432eec-430a-8ae0-a8f1-9b09147721d5.png)


# サンプルコード

```

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows.Automation;
using System.Windows.Forms;
using System.Drawing;


class FormMain: Form {
	private TreeView tv;
	FormMain() {
		Text = "calc";
		Size = new Size(700, 700);
		tv = new TreeView();
		tv.Location = new Point(20, 20);
		tv.Size = new Size(600, 600);
		this.Controls.Add(tv);
		this.Load += new System.EventHandler(this.Form_Load);
	}
	private void Form_Load(object sender, System.EventArgs e) {
		Process process = Process.Start(@"calc");
		Thread.Sleep(2000);
		process = UpdateTargetProcess("電卓");
		AutomationElement mainForm = AutomationElement.FromHandle(process.MainWindowHandle);
		tv.Nodes.Add(CreateTreeNode(mainForm));
	}
	private static Process UpdateTargetProcess(string title) {
		Process process = null;
		foreach (Process p in Process.GetProcesses())
		{
			if (p.MainWindowTitle.Contains(title))
			{
				process = p;
				break;
			}
		}
		if (process == null)
		{
			Console.WriteLine(title + "のプロセスが見つかりません。");
		}
		return process;
	}
	private TreeNode CreateTreeNode(AutomationElement rootElement) {
		TreeNode tn = new TreeNode(rootElement.Current.Name);
		TreeWalker walker = TreeWalker.RawViewWalker;
		AutomationElement elementNode = walker.GetFirstChild(rootElement);
		while (elementNode != null)
		{
			tn.Nodes.Add(CreateTreeNode(elementNode));
			elementNode = walker.GetNextSibling(elementNode);
		}
		return tn;
	}
	[STAThread]
	public static void Main() {
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new FormMain());
	}
}






```

以上。
<title>タグの内容が必ずしもタイトルにならない件について


# <title>タグで囲んだ内容がサイトのタイトルにならないこともあるようです

どういうことかといいますと、HTML の<head>タグ内の<title>タグの内容が検索結果のタイトルとして表示されるのですが、どうやら Google の検索エンジンにおいては必ずしも、それが適用されるとは限らないようです。

https://developers.google.com/search/blog/2021/09/more-info-about-titles?hl=ja#half-empty-titles

2021 年の更新内容では、従来の<title>タグの中身をタイトルに設定するのではなく、<h1>タグやその他ページ内で目立つように表示されるコンテンツをタイトルの候補にすると
いうことだそうです。

# なぜこのようになったのか

> タイトルタグが必ずしもページの内容を的確に表している場合がないこともあるため。

だそうです。

# 使用率

とはいうものの、80%をこえる確率でサイトのタイトルが使用されているようです。

# 解決策

調べてみたところ、恐らく h1 タグと同様の内容にするというのが良いようです。
念の為、上記の Google のページもご参考にしていただきますようよろしくお願いいたします。
日付登録で詰まった場合の引き出し(タイムゾーン)

## タイムゾーンが原因で詰まった話

1. devで開発後stgへデプロイしたが, 挙動がおかしい
    1. お知らせを登録する画面で「公開日時」なるものをDBにインサートすると, 実際の日時からずれて登録されていた
1. devとstgそれぞれのAppサーバーとMysqlのタイムゾーンを確認すると以下だった
    1. dev
        1. Appサーバー: JST
        1. Mysql: JST
    1. stg
        1. Appサーバー: UTC
        1. Mysql: JST
1. stgのAppサーバーのタイムゾーンをUTC -> JSTにすることで解決した
    1. 方法としてはDocker上にJavaアプリを立ち上げていたので, docker-compose.ymlで以下のように記述した
```
services:
  XXX:
    image: XXX
    container_name: XXX
    hostname: XXX
    extra_hosts:
      - XXX
    volumes:
      - XXX
    ports:
      - "8080:8080"
    networks:
      XXX:
        ipv4_address: XXX
    environment:
      - TZ=Asia/Tokyo
```
VPNとは

### VPNを使用するきっかけ

フィリピンでオリンピックを見るためTVerへアクセスしようとしたが上手くいかない
どうやらTVerは日本からのアクセスしか受け付けてないようだ...

VPNを使ってアクセス場所を誤魔化そう！

### VPNの役割

VPNの役割について書く前に改めて使用する流れについて

大まかな流れ
1. フィリピンのWi-Fiを使用してTVerにアクセスしようとする
1. Wi-Fiが持つ地域情報がフィリピンになっているため, アクセスが断られる
1. なので地域情報が日本になるようにしたい
1. そこでVPNが役立つ
    1. VPNを使い「フィリピンからのアクセス」ではなく「日本からのアクセス」であることにする
    1. そうすることでTVerのサーバーはアクセスを許可してくれる
1. フィリピンにいながらTVerが見ることができる

ここでのVPNの役割として, フィリピンからTVerのサーバーへアクセスしているのに対し, 実際は日本からTVerのサーバーへアクセスしているように見せかけている.

#### この裏側で行われていること
(前提)VPNサービスは独自のサーバーを持っている

VPNを使用しない場合のアクセス経路
自分のPC(client) -> TVerのサーバー

VPNを使用する場合のアクセス経路
自分のPC(client) -> VPN独自サーバー -> TVerのサーバー

VPN独自サーバーがTVerのサーバーに対して代わりにアクセスを行っている.(プロキシサーバー的な？？)
VPN独自サーバー自体は日本の地域情報を持っているので, TVerのサーバーからすると, 日本からのアクセスだと錯覚してしまう.そしてVPN独自サーバーが受け取ったレスポンスをそのまま自分のPCに返却している.
この仕組みによりVPNを用いてTVerにアクセスできている.まぁVPN独自サーバーを介している分, 速度は遅くなりますが..
DNS, CDNについて

## DNS, CDNについて

### DNS
- 「A」レコードとは、URL（ドメイン）のIPアドレスを指定するレコード
    - DNSのAレコードがドメインとIPアドレスの紐付けをしている
- 「CNAME」レコードと呼ばれるリソースレコードが存在
    - 特定のドメインを別のドメインに紐付けることができる
    - ドメインAのURLとドメインBのURLを紐付けられるため、ドメインAのURLにアクセスしたまま、ドメインBを表示可能
    - CNAMEの仕組みを利用することで、自社のドメインはそのままに、別のサーバーからコンテンツ（データ）を配信できる

### CDN
- サービスとしてはAkamaiやAWSのCloudFrontが有名
- CDNはDNSとオリジンサーバー、キャッシュサーバーの3つで成り立つ
- 下記手順
    - ユーザーがDNSを経由する
    - キャッシュサーバーへリクエストする
    - データをキャッシュサーバーからオリジンサーバーに取りに来る

### どうやって高速化を図っているのか
- ユーザーのアクセス: ユーザーがwww.example.comにアクセスします。
- CNAMEの適用: CNAMEレコードによってリクエストがcdn.example.comにリダイレクトされます。
- キャッシュサーバーの応答: CDNのキャッシュサーバーがリクエストを受け取り、キャッシュがあれば即座にコンテンツを提供します。
- キャッシュがない場合: キャッシュサーバーにコンテンツがない場合、オリジンサーバーにリクエストを送り、コンテンツを取得してユーザーに返します。取得したコンテンツはキャッシュとして保存され、次回以降のリクエストに対応します。
※オリジンサーバーにアクセスする回数が減る
nasサーバー

## nasサーバーについて調べたきっかけ

業務にて以下の要望があった.
「画面にアクセスできなくなり, nasとの接続(マウント)が上手くいってないことがわかった. 影響範囲調査して, nasがなくても問題なく動くようにして」
ん？nas？...何それ状態.

調べてみると..nasとは
「ネットワークに接続されたストレージデバイス.ファイル共有やデータ保存が可能」

ほうほう..
要はファイルがあって, それを別サーバーからアクセスできたりするよ〜みたいなことね


で, 調査すると以下のことがわかった
- 画面(Webサーバー)のSSL証明書がnasに存在し, それをマウントしている.
    - 今回はそのマウントのところで失敗し, 結果画面にアクセスできない状態になっている

解決法は以下
- nasにあるSSL証明書を違うサーバーに置き, それをマウントするように設定を変更すれば解決


今回の場合はSSL証明書をnasに置いて, ネットワーク接続でWebサーバーへマウントしていた.ということだった


## ついでにnasで節約を考えた件

1. 妹がiphoneの買い替えを考えていた
    1. 今あるiphoneの容量を見ると200GBほど..
1. ただiphoneは128GB or 256GB かで値段が結構変わる
1. 容量の大半は写真が占めていることがわかった
    1. 写真がない状態の容量は80GBほど..
1. であれば写真をどこか違うところに移すことで128GBのiphoneでも十分になる
1. そこで選択肢としては「クラウドを利用するか, USB型のHDDに保存するか, nasに保存するか」の3つがあった
1. 妹の要望としては, いつでも友達と振り返れるような状態がいい.とのこと
    1. この時点でUSBに保存する案は消滅.それにUSBをなくしたり, ハード自体が古くなり一生写真を見ることできなくなる可能性もあるので
1. あとはクラウドか自サーバーかという, 普段の業務に似た事案にww
1. nasの場合はサーバーの購入費, 月額の電気代などを考えたりとするともちろんクラウドの方が安くなるわけで笑
1. 結果icloudを契約しました

まぁnasって何？の状態から, 日常の問題解決の1つの選択肢に上がる状態にまで持って来れたのは良かったかな
認証

## 認証について

- OAuth
    - ユーザーのパスワードを直接共有することなく、他のアプリケーションやサービスにユーザーの情報へのアクセスを許可するための認証プロトコル
    - アクセストークンという一時的なキーが発行
    - 例えば、あなたがTwitterのアカウントを使って別のWebサイトにログインするとき、OAuthを利用して、TwitterがそのWebサイトに対してあなたのアカウント情報への一部のアクセスを許可します。このとき、Webサイトにはあなたのパスワードが知らされることはなく、Twitterが認証を代行します
- Cookie-Based認証
    - Cookie-based認証の流れ
        - ログイン:ユーザーがログインフォームにユーザー名とパスワードを入力し、サーバーに送信します。
サーバーは認証情報を確認し、正しければユーザーを認証します。
        - Cookieの発行:認証が成功すると、サーバーは認証トークン（通常はセッションID）を作成し、それをクッキーとしてユーザーのブラウザに送信します。
このクッキーは、ユーザーのブラウザに保存され、次回以降のリクエストに自動的に含まれます。
        - リクエストの認証:ユーザーが別のページをリクエストすると、ブラウザは保存されたクッキーをサーバーに送信します。サーバーはクッキーに含まれる認証トークンを確認し、有効であればユーザーを認証済みとしてリクエストを処理します。
        - ログアウト:ユーザーがログアウトすると、サーバーはセッションを無効にし、クッキーを削除するか、無効化する指示をブラウザに送信します。
- Token Authentication
    - トークンの発行: ユーザーが最初にログインするとき、サーバーはユーザーの認証情報（通常はユーザー名とパスワード）を確認し、認証が成功すると、トークンが発行されます。このトークンは、認証が成功したことを証明するデジタルキーのようなもの
    - トークンの利用: 認証が必要なリクエストを送る際、ユーザーはこのトークンを一緒に送ります。サーバーはそのトークンを確認し、正当であればアクセスを許可します。これにより、再度パスワードを入力する必要がなくなります
    - トークンの特徴:
一時的: トークンには有効期限があり、期限が切れると再度ログインが必要になります。
セキュア: パスワードが漏れるリスクを軽減します。トークン自体が漏れても、期限が切れたり無効化されたりするので、被害を最小限に抑えることができます。
    -トークン認証は、特にWebアプリケーションやモバイルアプリケーションで、セッション管理やセキュリティの向上のためによく使われます。
- Basic Authentication
    - 最もノーマルな認証方法。ユーザー名とパスワードで認証する。
    - 送信前にパスワードをエンコード, サーバーはパスワードをデコードする
    - セキュリティが貧弱
    - 平文に近い形でネットワークに流れるのでとても危険
    - HTTPSでのパスワード暗号化が主流

## Cookie-Based認証とToken Authenticationって似てね？
状態の管理: Cookie-based認証はサーバーでセッション状態を管理するのに対し、Token Authenticationはクライアント側でトークンを管理し、サーバーはステートレスです。
使われるシーン: Cookie-based認証はWebアプリケーションで、Token AuthenticationはAPIベースのサービスやモバイルアプリケーションでよく使用されます。
セキュリティ: Token Authenticationは、XSS（クロスサイトスクリプティング）などの攻撃に対して脆弱性が少なくなる一方、トークンが漏洩するとリスクがあります。Cookie-based認証もクッキーの盗難（クロスサイトリクエストフォージェリ (CSRF) やクッキー盗難）に対して対策が必要です。
※例えばRestAPIはステートレス(個々のリクエストに依存関係を持たせないため。リクエスト1つですべて完結)
自社プロダクトの開発でJava(spring boot)を使用した際のCI/CD周りについて

自社プロダクトの開発でJava(spring boot)を使用した際のCI/CD周りについて

- ローカル開発
    - ビルドツールはmavenを使用
    - Nexusリポジトリも使用(VPNを繋がないとアクセスできない)
    - mavenで依存関係(ライブラリDLやNexusリポジトリの取得)を解決
    - 開発の際は以下の順番
        - ソースコード修正
        - ビルド(コンパイル)
        - アプリケーション実行の順序で開発する
- ローカル開発の際に出た疑問
    - Intellijでは「ビルド」と「RUN」が分かれた項目としてあるが、違いは何？
        - ビルド(全てのファイルのソースコードを機械語に)
            - ビルドだけを行う
        - RUN(主にアプリケーションの実行を行う)
            - IntellijのRUNは同時にビルドも行ってくれる
            - なのでソースコードの変更後RUNするだけでローカルテストができる
    - Nexusリポジトリの取得でVPN接続が必要　-> ビルドのたびにVPNを繋がないといけない？
        - 結論1回目のビルド時にVPNを繋いでおけばOK。2回目以降は必要なし
        - なぜなら2回目以降は、1回目のビルドで取得したリポジトリのキャッシュを利用しているから
- 本番開発
    - ビルド, デプロイはJenkinsが担当
        - Jenkinsにmaven等の外部アプリを読み込ませることで自動的なビルドが可能
実機に触れてみよう　PCAとPCBのネットワーク疎通確認(Ciscoスイッチ)

基本の基本と言える疎通確認を行います。
# 使用するもの
- PCA(192.168.1.20)
- PCB(192.168.1.30)
※IPアドレスの設定方法
https://qiita.com/kawano-y/items/76df7e8d8a402b8fbb6a
- Ciscoスイッチ
- Ethernetケーブル
# 物理的な接続
- PCA、PCBをスイッチに接続します。
PCA：Fa0/1(青)
PCB：Fa0/2(白)
- スイッチの電源を入れます。
![疎通.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/2533faeb-8614-1b40-b31c-593b92ce2c37.jpeg)
# 疎通確認の実行
PCAからPCBへのping
``ping -c 3 192.168.1.30``
![ピング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/6297fd2e-3bfa-95ca-f495-6e80e434ddf2.png)
無事疎通できているみたいですね。
(PCBからPCAへのpingは割愛します。)
# MACアドレステーブルの確認
``Switch# show mac address-table``
![MACアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/0830463f-ecea-9058-a745-37d8b4469d57.png)
機器も接続されているようです。

# 最後に
やはり実機で行うと物理的な作業などがあり大変ですね。
限られた時間の中で、いかに物音をたてずに行うかが今後の課題です・・・
「こうした方がいいよ！」などがあれば情報共有お願いいたします。