OmniAICreator/Qiita-1.07M huggingface dataset:
apacheサーバー接続のオーナー名の変更についての参考例 - あくまでも実験でやってます。ご注意ください\(_ _)/(一応、これも玄人編)FUKUTAKA編)

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)

# apacheサーバー接続のオーナー名の変更についての参考例 - あくまでも実験でやってます。\(_ _)/(一応、これも玄人向けです)(FUKUTAKA編)

先日apacheサーバーとSQLite3 のWebブラウザでのアクセス方法を書きましたが、

中には、オーナー名を変えたい方がいるかもしれませんので、記述します。

なので、試しに仮想サーバなどで試されてください。
そのサーバーには貴重なデータなどは入れておかないかバックアップをしておいてください。

# apacheサーバーの設定ファイルのhttpd.conf(Ubuntuならapache2.conf)
を変更するのだが、項目に

User apache
Group apache

という項目があると思います。これを変更すればよいのですが、
ただ、変更して httpd(apache2)を再起動してもエラーが返されます。

では、どうするのかですが、

例として`apache_user`というユーザ名でやります。

２通りあります。

① apache というユーザ名とgroup名を変更して、apacheサーバの変更をする
② 新たに追加ユーザをして、設定する

### ①つ目：apache というユーザ名とgroup名を変更して、apacheサーバの変更をする
`# usermod -l apache_user apache`
`# groupmod -n apache_user apache`
で、変更をかけ、

httpd.conf(Ubuntuならapache2.conf)を

`User apache_user`
`Group apache_user`

に変更し

apacheサーバーの再起動をする

あとは、前回の「Alma Linux 9/Rocky Linux 9 、apacheサーバーで、sqlite3のDBファイルのネットワークで使うためのコツ(一応、玄人向けです。) [FUKUTAKA編]」

をしておく

### 通常はここまででしておいた方が安全だと思います。

すみません。先にここから先が思いついてしまいました\(_ _)/
一応、載せておきます

②つ目：新たに追加ユーザをして、設定する
apacheオーナーを残して追加でやりたいなら

新たにユーザを追加してパスワード無し（実験では有りでもなりました。）にしておくのです。
例として、

`# useradd apache_user`

そして、そのまま
httpd.conf(apache2.conf)の

`User apache`
`Group apache`

を

`User apache_user`
`Group apache_user`

に編集して、httpd(apache2)を再起動してください

そして、前回の

「Alma Linux 9/Rocky Linux 9 、apacheサーバーで、sqlite3のDBファイルのネットワークで使うためのコツ(一応、玄人向けです。) [FUKUTAKA編]」

と同じやり方で、ディレクトリとDBファイルのオーナー名を変えてください。

ただし、ユーザのホームディレクトリやユーザシェルなどで、支障がでるかもしれませんので、これも変えます。

では変え方ですが、

`# cat /etc/passwd` で中を見て、
apache の項目をみていただくと、

ユーザーホームディレクトリが
`/usr/share/httpd`

ユーザシェルが、
`/sbin/nologin`

になってると思いますので、これに変えるのです。

つまり、ここまでしなくてよいのでは、思うかもしれませんが、
apache項目とほぼ同じ項目にするということですね。

では、ここから特に注意

コマンドは

`# usermod -d /usr/share/httpd apache_user`(新しいapacheユーザー名)
で、ユーザホームディレクトリを変える
`# usermod -s /sbin/nologin apache_user`(新しいapacheユーザー名)
で、ユーザシェルを変えます。

ちなみに/etc/passwd のapacheの項目に
Apache とあると思いますが、これはコメントだそうです。

では、確認です
`# cat /etc/passwd`

`/etc/shadow`
の手動編集します。

`# vi /etc/shadow`

変えるのは、

第1フィールド：ユーザ名
第2フィールド：パスワード
第3フィールド：パスワードを最後に変更した日
第4フィールド：変更可能最短期間
第5フィールド：未変更可能最長期間
第6フィールド：未変更時警告日
第7フィールド：ログインしない場合に無効になる日数
第8フィールド：アカウントが失効になるまでの日数
第9フィールド：フラグ

の

第1フィールド：ユーザ名
第2フィールド：パスワード
第3フィールド：パスワードを最後に変更した日

以外の
`:`と`:`間を空欄にする

`例
apache_user:!!:19755::::::`というふうに
※ 「:」の数を間違えないでください。

そして、httpd(apache2)の再起動して、確認をしてください。

もしかしたら、ここまでのことはしなくて良いかもしれませんが、
あくまでも一例として載せています。

大げさだなぁと思うかもしれませんが、
何かあっても責任は負いかねませんので、ご了承ください。

なので、試しに仮想サーバなどで、されてみてください。
そのサーバーには貴重なデータなどは入れておかないかバックアップをしておいてください。

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)
【bat】リストを使用したファイルの移動


```bat:moveFile.bat
@echo off
set "sourceFolder=C:\元のフォルダのパス"
set "destinationList=C:\移動先のファイル・パスのリスト.txt"

if exist "%destinationList%" (
    for %%a in ("%sourceFolder%\*.*") do (
        set "fileName=%%~nxa"
        set "destinationPath="
        
        rem 指定したファイル名に一致する行を検索し、パスを取得
        for /f "usebackq tokens=1,* delims=," %%b in ("%destinationList%") do (
            if /i "%%b"=="%fileName%" (
                set "destinationPath=%%c"
                goto MoveFile
            )
        )
        
        echo ファイル "!fileName!" の移動先が見つかりませんでした。
        goto ContinueLoop
        
        :MoveFile
        if not exist "%destinationPath%" mkdir "%destinationPath%"
        
        move /Y "%sourceFolder%\!fileName!" "%destinationPath%\"
        echo ファイル "!fileName!" が "!destinationPath!" に移動されました.
        
        :ContinueLoop
    )
) else (
    echo 移動先のファイル・パスのリストが見つかりませんでした。
)

pause

```
Next.jsでパンくずリストの構造化データを作る

Next.jsでパンくずリストの構造化データを生成するようにしました。

## パンくずリストの構造化データのコンポーネントを作成

パンくずリストは複数あるのでmapで回りながらitemListElementを動的に作ります。パンくずリストの構造化データができたらScriptコンポーネントを利用してscriptタグとして生成します。

```js
import { BreadCrumb } from "@/_libs/domain/BreadCrumb";
import Script from "next/script";

type Props = {
  breadCrumbs: BreadCrumb[];
};

export const BreadCrumbJsonLD = ({breadCrumbs}: Props) => {
  const itemListElement = breadCrumbs.map((breadCrumb, index) => {
    return {
      "@type": "ListItem",
      "position": index + 1,
      "name": breadCrumb.title,
      "item": `${process.env.BASE_URL}${breadCrumb.path}`
    }
  })

  const jsonld = [
    {
      "@context": "https://schema.org",
      "@type": "BreadcrumbList",
      "itemListElement": itemListElement
    }
  ];

  return (
    <>
      <Script
        id="breadcrumb-jsonld"
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonld) }}
      />
    </>
  );
};
```


## パンくずリストの構造化データを生成する
上記で作成したコンポーネントをページで呼び出します。

```js
const breadCrumbs = [
  {
    title: "TOP",
    path: "/",
  },
  {
    title: "記事一覧",
    path: "/articles",
  },
  {
    title: article.title,
    path: `/articles/${article.id}`,
  },
];

...

<BreadCrumbJsonLD breadCrumbs={breadCrumbs} />
```

正しく呼び出すと以下のように構造化データのHTMLが生成されています。
```html
<script id="breadcrumb-jsonld" type="application/ld+json" data-nscript="afterInteractive">
[{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":
[{"@type":"ListItem","position":1,"name":"TOP","item":"http://hoge.com/"},
  {"@type":"ListItem","position":2,"name":"記事一覧","item":"http://hoge.com/articles"},
  {"@type":"ListItem","position":3,"name":"Next.jsでパンくずリストの構造化データを作る","item":"http://hoge.com/articles/1"}
]}]
</script>
```

## パンくずリストの構造化データが正しく登録されているか確認

最後にリッチリザルトテストで正しい構造化データになっているかを確認します。

https://search.google.com/test/rich-results?hl=ja

上記のサイトにアクセスして構造化データを入れた対象のページのURLを入力してテストすると結果が返ってきます。以下のように有効なアイテムを検出しましたとなれば完了です。

![スクリーンショット 2024-02-02 15.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242816/e9eac319-c06f-479c-a8fe-3b784a2735ba.png)
スマホアプリの「Amazon」に生成AIが組み込まれる模様 〜🇺🇸から〜

Amazonがモバイルアプリ内で「Rufus」というAIショッピングアシスタントを導入しました

# はじめに
ショッピングアプリの「Amazon」に生成AIの新機能がアメリカの一部の顧客に先行してリリースされるようです。
今回リリースされるのが、Amazon内の商品やWEB上のデータでトレーニングされたAIショッピングアシスタント「Rufus」です。
Amazonのスマホアプリ内でRufusとチャットして、商品の検索・商品の比較・商品の提案を受けることができます。

公式サイトよりRufusのイメージ映像が公開されていましたのでご覧ください。

![amazon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/24e32254-c663-d4ca-4505-969e829787e8.gif)
(https://www.aboutamazon.com/news/retail/amazon-rufus より)

公式サイトより引用です。
>Rufus を使用すると、お客様は次のことが可能になります。
> + 製品カテゴリを購入する際に何に注意すべきかを学ぶ
顧客は Amazon でより一般的な製品リサーチを行うことができ、「ヘッドフォンを購入する際に何を考慮すべきか?」、「自宅で車の詳細を検討する際に何を考慮すべきか?」、「何を考慮すべきか?」などの質問をすることができます。クリーンな美容製品ですか？」ショッピングの目的に役立つ情報を受け取ります。
> + 機会や目的別に購入
顧客は、「寒い天候でのゴルフには何が必要ですか?」などのさまざまな質問をすることで、アクティビティ、イベント、目的、その他の特定の使用例に基づいて製品を検索して見つけることができます。 「室内菜園を始めたい」 Rufus は、ゴルフのベースレイヤー、ジャケット、グローブから種苗、鉢植えミックス、栽培用ライトに至るまで、ショッピング可能な製品カテゴリと、顧客がクリックしてより具体的な検索を実行できる関連する質問を提案します。
> + 製品カテゴリの比較に関するヘルプ
顧客は「リップ グロスとリップ オイルの違いは何ですか?」と質問できるようになりました。または、「ドリップ コーヒー メーカーとプアオーバー コーヒー メーカーを比較」することで、自分のニーズに最も適した製品のタイプを見つけて、さらに自信を持って購入の決定を下すことができます。
> + 最適な推奨事項を見つける
顧客は、「バレンタインデーに最適なギフトは何ですか?」など、自分が必要とするものについての推奨事項を尋ねることができます。または「5歳児に最適な恐竜のおもちゃ」。 Rufus は、特定の質問に合わせた結果を生成し、顧客がより洗練された結果を迅速かつ簡単に閲覧できるようにします。
> + 製品の詳細ページで特定の製品について質問する
顧客は、Rufus を使用して、製品の詳細ページを表示しているときに、「このピックルボール パドルは初心者に適していますか?」など、個々の製品に関する特定の質問に対する回答をすぐに得ることができます。 「このジャケットは洗濯機で洗えますか?」または「このコードレスドリルは持ちやすいですか?」 Rufus は、リストの詳細、顧客のレビュー、コミュニティの Q&A に基づいて回答を生成します。

ここからはエンジニアとしてRufusに関して考察を含めて書いていきます。

# Rufusの技術的基盤
Rufusは、Amazon内の商品、商品レビュー、商品のQ&A、そしてWEB上からのデータに基づいて訓練された生成AI技術を使用しています。このシステムは、自然言語処理（NLP）、機械学習（ML）、およびディープラーニングの最先端技術を駆使しており、顧客の質問に対してリアルタイムで、かつ精度高く答えることが可能だと思います。

# 自然言語処理の応用
Rufusの核心技術は自然言語処理です。この技術を使用して、顧客の質問を理解し、適切な回答を生成します。NLPアルゴリズムは、言語のあいまいさを処理し、膨大なデータセットから関連情報を抽出する能力が求められます。これには、最新のトランスフォーマーモデルやBERT（Bidirectional Encoder Representations from Transformers）のような技術が活用されていると思われます。

# 機械学習とパーソナライゼーション
Rufusは、顧客の過去の購買履歴や検索履歴を分析することによって、個々の顧客に合わせた推薦を提供します。このパーソナライゼーションは、複雑な機械学習モデルを使用して実現されており、顧客一人ひとりの好みやニーズを理解することができます。

# eコマースにおけるAIの影響
RufusのようなAIショッピングアシスタントは、eコマース業界における顧客体験の新たな標準を設定します。このような技術により、ショッピングはより便利で、パーソナライズされ、効率的なものになると思われます。

# おわりに
Amazonの最新のイノベーションであるAIショッピングアシスタント「Rufus」は、eコマース体験を根本から変える可能性を秘めています。最先端の自然言語処理（NLP）、機械学習（ML）、ディープラーニング技術を活用し、Amazonの商品カタログ、レビュー、Q&A、さらにはWeb全体からのデータに基づいて訓練されたRufusは、消費者が持つあらゆる質問に対し、リアルタイムで正確な回答を提供することができます。商品選択から比較、推薦に至るまで、Rufusはショッピングをより個人化されたものにし、顧客にとって価値のある情報を提供します。

この技術の応用により、Amazonは顧客体験をさらにパーソナライズし、効率化することを目指しています。顧客一人ひとりのニーズに合わせた推薦を提供することで、ショッピングのプロセスを簡単にし、顧客の満足度を高めることが可能になります。また、Rufusはeコマース業界におけるAIの活用の新たな標準を示し、ショッピング体験の未来を形作る重要な役割を担っています。
息を吸うように使いたいgitのコマンド

gitのコマンドを生まれて初めて叩いてから１か月の自分が、既に100回以上は叩いた＆毎回メモから探すコマンド達。
毎回バラバラのメモやURLから探すのも大変なのでまとめます！

## git init

新規でgitリポジトリを作成する。これをしないと何も始まらない。

```bash
git init
```

## git status

現在のGitの状態を確認するコマンド。
変更されたファイルがあるか、ステージングエリアに登録されたファイルがあるかなどを把握できる。

```bash
git status
```

## git add

ステージングエリアにファイルを登録する。
コミットする前にステージングエリアに登録をする必要がある。

```bash
git add <ファイル名>
```

## git commit

コミットするコマンド。`-m`オプションでコメントも一緒に入力できる。

```bash
git commit -m “コメント”
```

## git push

ローカルのコミットをGitHubなどリモートリポジトリに登録するときに使う。
add~pushまではほとんどセット。
URLの部分はGithubのSSHを入力するか、既に登録しておいたリモートリポジトリ名を入力しても良い。

```bash
git push <URL> <ブランチ名>
```

## git remote -v

現在のローカルリポジトリに登録されたリモートリポジトリの一覧を確認できる。

クローンしてきたリポジトリは既に別のリポジトリ名が登録されているので確認しておいたほうが良い。

```bash
git remote -v
```

## git remote add

リモートリポジトリを登録したいときに使う。

```bash
git remote add <名前> <URL>
```
既存である名前のリモートリポジトリを上書きする場合はsetコマンドを使う。
```bash
git remote set-url <名前> <URL>
```

## git branch

gitのブランチを切る。

```bash
git branch <ブランチの名前>
```

## git checkout

ブランチを切り替える

```bash
git  checkout <ブランチ名>
```

ブランチを切った上で切り替えも同時に行うときは`-b`オプションを使う

```bash
git checkout -b <ブランチの名前>
```

## git clone

github上にあるリポジトリをクローンする。

```bash
git clone <URL>
```


また１か月後くらいに増えてたら更新したい…
直近のAWS認定試験の変更点まとめと全冠達成までの総額について

:::note info
2024/7追記
現在、beta版のテストも予定されていますが、あくまでbeta版のため正式な認定の一覧に入れておりません。
:::



# AWS認定試験の大きな変更

2024年も一か月が経過しましたが、先月はAWS認定試験の変更が多々あったかと思います。
今回は変更点をおさらいしていこうと思います。


# 変更点
- 試験料金の値上げ
https://aws.amazon.com/jp/certification/policies/before-testing/

為替レートの影響でAWS認定試験が全体的に値上げします。
Foundational 4,000円値上げ
Associate 5,000円値上げ
Professional 10,000円値上げ　
Specialty 10,000円値上げ


- 3認定試験の廃止と1認定試験の追加
廃止
AWS Certified Data Analytics – Specialty (DAS)　4 月 8 日まで
AWS Certified Database – Specialty (DBS)4 月 29 日まで
AWS Certified: SAP on AWS – Specialty (PAS) 4月29日まで

    追加
 AWS Certified Data Engineer – Associate (DEA) 3月12日から
 
https://aws.amazon.com/jp/blogs/news/aws-certification-retirements-and-launches/



簡単にいうと認定が3つ減って1つ増えます。また受験料が値上げします。
# 申し込みについて
料金の値上げの反映は4月1日申し込み分からのようで、2月2日現在、4月1日以降を指定してオンラインの受験を行おうとすると旧料金の金額が表示されます。試験日変更は料金が変わらないため、受験予定のある方は早めの申し込みをおすすめします。
(テストセンターでの受験については2月2日現在まだ4月1日の申し込みができないため不明です。)

# 参考(上記の変更後)

|認定名  |旧料金  |新料金  |
|---|---|---|
|AWS Certified Cloud Practitioner (CLF)  |11,000  |15,000  |
|AWS Certified Solutions Architect - Associate (SAA)  |15,000  |20,000  |
|AWS Certified Developer - Associate (DVA)  |15,000  |20,000  |
|AWS Certified SysOps Administrator - Associate (SOA)  |15,000  |20,000  |
|【追加】AWS Certified Data Engineer - Associate (ADE)|15,000  |20,000  |
|AWS Certified Solutions Architect - Professional (SAP)  |30,000  |40,000  |
|AWS Certified DevOps Engineer - Professional (DOP)  |30,000  |40,000  |
|AWS Certified Security - Specialty (SCS)  |30,000  |40,000  |
|AWS Certified Advanced Networking - Specialty (ANS)  |30,000  |40,000  |
|AWS Certified Machine Learning - Specialty (MLS)  |30,000  |40,000  |
|【廃止】AWS Certified Database - Specialty  |30,000  |40,000  |
|【廃止】AWS Certified: SAP on AWS - Specialty  |30,000  |40,000  |
|【廃止】AWS Certified Data Analytics - Specialty  |30,000  |40,000  |




# おまけ
変更前に一からAWS認定試験全冠達成しようとすると受験費用の合計は296,000円
変更後に一からAWS認定試験全冠達成しようとすると受験費用の合計は295,000円
全冠達成に着目した場合千円安くなっています。
Incus: Alpine 3.19 を使う

## image を探す

```bash
incus image list images:alpine | grep amd64
```

## コンテナーのインストール

```bash
incus launch images:alpine/3.19/amd64 alpine319
```

インストールされたことを確認

```text
$ incus list
+------------+---------+----------------------+------+-----------+-----------+
|    NAME    |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+------------+---------+----------------------+------+-----------+-----------+
| alpine319  | RUNNING | 10.56.160.133 (eth0) |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
| arch       | RUNNING | 10.56.160.101 (eth0) |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
| fedora39   | RUNNING | 10.56.160.21 (eth0)  |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
| ubuntu2204 | RUNNING | 10.56.160.209 (eth0) |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
```

root のパスワードを設定

```bash
incus exec alpine319 -- passwd
```

```
$ incus exec alpine319 -- passwd
Changing password for root
New password:
```

## login

```bash
incus console alpine319
```

```text
$ incus console alpine319
To detach from the console, press: <ctrl>+a q

Welcome to Alpine Linux 3.19
Kernel 6.7.2-arch1-2 on an x86_64 (/dev/console)

alpine319 login:
```

## Login 後の設定

ユーザーの作成

```bash
adduser -u 1200 uchida
```

sudo のインストールと設定

```bash
apk add sudo
addgroup uchida wheel
```

```text:/etc/sudoers.d/wheel
%wheel ALL=(ALL) ALL
```

sshd のインストール

```bash
sudo apk add openssh
sudo service sshd restart
sudo rc-update add sshd
```

作成したユーザーでログイン

```bash
ssh 10.56.160.133
```
初めての投稿

# 自己紹介
 初めまして。DMMWEBCAMP2024年1月生(2024年2月時点で在学中)23歳女です。
もともと医療関係のお仕事をしていましたが、現在は退職し未経験でのエンジニア転職に向けて日々勉強中です！
プログラミング**完全未経験の超初心者**ですが、学ぶにつれて自分の学んだことをアウトプットする場が欲しいと思い、Qiitaで成長ブログのようなものをこれから書いていこうと思います。
ちなみに言語のアウトプットの練習にもなるため、面接にも役立ちそうというのも狙いです。


初回記事の内容は、**超初心者が何でこのコードを書いているか忘れがちなポイント第一弾**です！
(第何弾やれば終わるか分からない笑)
ではさっそく書いていきます。


## before_action :authenticate_user!, except: [:アクション名]
　`authenticate_user!`が初心者には見慣れないですね。
これはコントローラの記述を書く際に、2行目以降必要となってくる記述です。
意味としては、『アクションを始める前に**ログインしていないユーザー**は、ログインページにリダイレクト！アクション名で指定されたページ以外は行けない』といった感じです。この記述がないとログインしていないユーザーでもいろんなページにアクセスしたり、投稿、編集、削除などができてしまいます。逆にexceptで指定していたアクション(indexやshowなど)は閲覧することができます。
 
参考にさせていただいた記事はこちら。
こちらのサイトにはexcept以外にも、onlyやif、unlessなどの説明も載っています！
私自身とても勉強になりました。

https://ichigick.com/rails-before-action/


## if user_signed_in?(deviseのメソッド)
　使いどころとしては、サインインしている人にはこれを見せたい、サインインしていない人にはこれを見せたいと思ったときに、表示などを使い分けるため使用するものです。
 
 実際の使用例
```erb:application.html.erbなど
    <% if user_signed_in? %>  
      <%= link_to "新規投稿", new_xxxx_path %>
      <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
      <%= link_to "マイページ", user_path(current_user.id) %>
    <% else %>
      <%= link_to "新規登録", new_user_registration_path %>
      <%= link_to "ログイン", new_user_session_path %>
    <% end %>
```
この使用例ではif user_signed_in?の直下にサインインしている人用のリンク、elseの下にはif user_signed_in?でfalseを返したときサインインしていない人が見れるリンクがコードされています。
viewページだと、サインインしている人とそうでない人の画面表示の違いをだせます。
　ほかにもゲストログインユーザーには見せないようにしたい時にも使えます！


## form_withのアクションによる違い
　超初心者の私から言わせていただくと、form_withは新規投稿や編集のときに使うものぐらいに思っていました。もちろんそうではありますが、実際はモデルの中の変数に新しい情報を渡すか、既存のidに情報があるものにさらに情報を渡しているかどうかというところでnewアクションかupdateアクションか決まります。使用例はこちらです。

 ```erb:_form.html.erbなど
 <%= form_with model: @xxx do |f| %>
  <div class="form-group">
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div class="form-group">
    <%= f.label :opinion %>
    <%= f.text_area :body %>
  </div>
  <div class="form-group">
    <%= f.submit %>
  </div>
<% end %>
```
これは新規投稿と編集の部分テンプレートになっています。新規投稿と編集で別々にコードを書いても良いですが、上記の説明の通り全くおなじコードを使っていても情報を受け渡す際にアクションが選別されるため、部分テンプレートとして作成した方が効率が上がります。

参考にした記事はこちらです。form_withとform_forの違いも載っていますので是非！

https://qiita.com/snskOgata/items/44d32a06045e6a52d11c

## さいごに
　~~中学生の時以来~~久しぶりにブログを書きましたが、アウトプットすると情報が整理されて今まで以上に学習が定着しているように感じました！今回のようにその日に解決したことや調べたことはまとめていきたいと思います。温かい目で見守っていただけると幸いです。Markdown法ももう少し学んで読みやすい記事を書けるように頑張ります！
rm コマンドについて

# この記事の背景
```rm```コマンドをたまに使う機会があるんだけどディレクトリを削除するときのオプションってどうだっけ？っていつもなるから自分が必要になることだけメモっとこ。新しい使い方をしたときはまた追記します。
# 使い方
## 基本
とりあえず指定したファイルを削除したいとき
```
$ rm hoge.txt
```
この方法だとカレントディレクトリにある```hoge.txt```を削除することができる。

## ディレクトリごと削除したいとき
ディレクトリを```rm```だけで消そうとすると次のように怒られる。
```
$ rm dir
rm: 'dir' を削除できません: ディレクトリです
```
なのでディレクトリを消したいときは```-r```オプションをつける
```
$ rm -r dir
```
するとディレクトリを中身ごと削除できる。
以上。アデュー
VSCodeからSSH接続できなくなった対処(2024年1月アップデートの変更)

# VSCodeのアップデート

結論から書くと、VSCodeのアップデートの影響でした。

https://code.visualstudio.com/updates/v1_86

先日配信されたv1.86を適用するとLinuxの最小要件が更新されています。
>Linux の最小要件の更新
このマイルストーンでは、デスクトップ クライアントを構築するためのツールチェーンを更新しました。このリリース以降、VS Code デスクトップは、Debian 10、RHEL 8、Ubuntu 20.04 など、glibc 2.28 以降および glibcxx 3.4.25 以降に基づく Linux ディストリビューションとのみ互換性があります。

glibc 2.28の要件が追加されたからでした。
Amazon Linux2023は大丈夫そうですが、Amazon Linux2だと接続できなくなってそうです。
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/core-glibc.html


>Linux ディストリビューションをアップグレードできない場合は、Web クライアントを使用することをお勧めします。デスクトップ バージョンを使用したい場合は、VS Code リリース 1.85 をダウンロードできます。プラットフォームによっては、そのバージョンを維持するためにアップデートを必ず無効にしてください。ポータブル モードでインストールをセットアップすることをお勧めします


対応としては以前のバージョンに戻すかTeratermなど別のクライアントを使用です。
ひとつ前のv1.85のリンクを載せておきます。
以下からダウンロード可能です。
https://code.visualstudio.com/updates/v1_85

![スクリーンショット 2024-02-02 171922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/eaad0b1f-0a71-7e99-91ae-56670df45eab.png)
投稿記事情報の一覧を表示するスクリプト


Qiita CLI ディレクトリ以下にある記事(.mdファイル)の一覧を使用した情報を出力します。

Qiita CLI 初期化(<code>npx qiita init</code>)後の public 以下が id ファイルが多数（記事の粗製乱造が原因）だったので、内容を把握するために作りました。

https://github.com/ikiuo/qiita-cli-script

**実行例(1)** : "3D" タグの付いた記事の一覧を出力する

```
$ ./qcarticle.py --tag 3D
0292a58993c4e6d14f2d.md  15157  2023/01/21 22:02:11  ---  '正多面体のデータ（厳密値）' (3D,Mathematica,正多面体)
11ae22df25279d731f70.md   2506  2021/07/23 21:25:53  ---  '正多面体の双対性と共通値' (3D,正多面体)
1f8d3c8e799cb2a242f9.md   7739  2023/07/12 14:06:34  ---  '回転行列の補正' (Matrix,3D)
68f3559468fb9a76bf89.md  41413  2024/02/01 17:55:37  ---  '長方形の逆透視投影（写真中の四角形を立体補正）' (HTML,JavaScript,WebGL,3D,Mathematica)
913fc7e893db05909be4.md   5933  2021/11/25 09:35:02  ---  '固定小数点演算：乗算を使わないオイラー角による回転行列の生成' (C,assembly,3D,アセンブラ,回転行列)
d7486f40f2378af15288.md  88304  2022/01/20 10:35:16  ---  '正多面体のデータを作る[改] (HTML+JavaScript版)' (JavaScript,3D,正多面体)
f13309f8b1023e47d20b.md   3793  2023/07/12 14:04:39  ---  '備忘録：任意軸の回転行列' (Matrix,3D,Quaternion)
f5905c353858fc43e597.md  66072  2023/01/03 12:06:40  ---  '正多面体のデータを作る' (Python,3D,正多面体)
```

**実行例(2)** : 記事に付けたタグの一覧を出力する

```console:
$ ./qcarticle.py --taglist
タグ一覧:
 - 10進数
 - 10進文字列
 - 2進数
 - 3D
 - 6502
 - 8086
 - AMD
 - ARM
 - C
 - C#
 - C++
 - C++11
 - CPU
 - CRC32
```
Incus: Fedora 39 を使う

## image を探す

```bash
incus image list images:fedora | grep amd64
```

## コンテナーのインストール

```bash
incus launch images:fedora/39/amd64 fedora39
```

インストールされたことを確認

```text
$ incus list
+------------+---------+----------------------+------+-----------+-----------+
|    NAME    |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+------------+---------+----------------------+------+-----------+-----------+
| arch       | RUNNING | 10.56.160.101 (eth0) |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
| fedora39   | RUNNING | 10.56.160.21 (eth0)  |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
| ubuntu2204 | RUNNING | 10.56.160.209 (eth0) |      | CONTAINER | 0         |
+------------+---------+----------------------+------+-----------+-----------+
```

## root のパスワードを設定

```bash
incus exec fedora39 bash
```

```text
$ incus exec fedora39 bash
[root@fedora39 ~]# 
```

## login

```bash
incus console fedora39
```

```text
$ incus console fedora39
To detach from the console, press: <ctrl>+a q

fedora39 login:
```

## Login 後の設定

ユーザーの作成

```bash
useradd -u 1200 -m -g wheel uchida
groupadd -g 1200 uchida
passwd uchida
```

sudo のインストール

```bash
yum install sudo
```

sshd のインストール

```bash
yum -y install openssh-server
systemctl start sshd
```

## 作成したユーザーでログイン

```bash
ssh 10.56.160.21
```

パスワードなしで sudo が実行できるようにする

```bash
sudo visudo
```

```text
（省略）
%wheel ALL=(ALL)    NOPASSWD: ALL
（省略）
```


パッケージのアップデート

```bash
sudo dnf update
```

## ping を使えるようにする

インストール直後の状態

```text
$ ping -c 3 8.8.8.8
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?
```

cap_net_raw を設定

```bash
sudo setcap 'cap_net_raw+p' /bin/ping
```

確認

```text
$ getcap /bin/ping
/bin/ping cap_net_raw=p
```

```text
$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=50.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=54.6 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=12.7 ms
```
Dockerについてつまづいたところ

Dockerの使い方をよくわかっていない初心者が記載したメモ書き。間違っている箇所もあるかもしれません。


# Dockerのセットアップ

```docker
# v1の場合
docker-compose up [オプション] [--scale サービス=数...] [サービス...]

# v2の場合
docker compose up [オプション] [サービス...]
```

Docker Composeのv2として`docker compose`コマンド（`docker-compose`ではなく、ハイフンなし）が導入されている。

v2で「docker-compose up」を実行するとエラーになった。



# docker compose の起動

Dockerfile に基づいてDockerイメージがビルドされ、その後でサービスがバックグラウンドで起動される。
デタッチド・モード(-d)を入れないと、この後どうやって動かすんだ状態になる。

```
docker compose up --build -d
```

この後、requirements.txtのパッケージがインストールされてなかったり、pythonのコードが実行できなかったりするのはdockerfileのコンテナ内の作業ディレクトリ内に移動していないから。


# Dockerfileについて

```dockerfile
# コンテナ内の作業ディレクトリ設定
WORKDIR /app

# 現在のディレクトリ内容のコピー
COPY . /app
```

ここでの /app ディレクトリは、コンテナ内のファイルシステム上に存在します。つまり、ホストマシン（あなたのコンピュータ）のファイルシステム上に直接見ることはできません。（考えるな、感じろ）


コンテナ内の /app ディレクトリを確認するには、コンテナにアクセスする必要があります。



以下の手順でアクセスできます：
1. *稼働中のコンテナの確認*:
   ターミナルで以下のコマンドを実行し、稼働中のコンテナをリストアップします。
   
   ```
   docker ps
   ```


   
2. *コンテナに入る*:
   稼働中のコンテナのIDまたは名前を使用して、以下のコマンドでコンテナ内に入ります。
   
   ```
   docker exec -it <コンテナIDまたは名前> /bin/bash
   ```
   
   sh を使用するコンテナの場合は、/bin/bash の代わりに /bin/sh を使用してください。
3. *ディレクトリの確認*:
   コンテナに入ったら、以下のコマンドで /app ディレクトリの中身を確認できます。
   
   ```
   ls /app
   ```
   
   または、直接 /app ディレクトリに移動することもできます。
   ```
   cd /app
   ls
   ```
   
これで、Docker コンテナ内の /app ディレクトリの中身を確認することができます。











## 参考記事
https://docs.docker.jp/compose/reference/up.html

https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350

https://qiita.com/HorikawaTokiya/items/fbe5b7c27ea1c0209e3c
承認の利用を開始する

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)


なかなか、アクションの情報を探せません。デスクトップ用とごちゃになって出てきてよく分からん。

+ [データ操作を使用する](https://learn.microsoft.com/ja-jp/power-automate/data-operations)

-----------------------

+ [承認の利用を開始する](https://learn.microsoft.com/ja-jp/power-automate/get-started-approvals)

ざっと見ても何が違っているか理解できない。

|アクション  |概要|
|:----------|:----------------|
|[承認を作成](https://learn.microsoft.com/ja-jp/connectors/approvals/#%E6%89%BF%E8%AA%8D%E3%82%92%E4%BD%9C%E6%88%90)	|自動承認プロセスを開始しますが、承認が完了するまで待機しません。 承認はキャンセル可能です。|
|[承認を待機](https://learn.microsoft.com/ja-jp/connectors/approvals/#%E6%89%BF%E8%AA%8D%E3%82%92%E5%BE%85%E6%A9%9F)	|指定された承認が完了するのを待機します。|
|[開始してテキストの承認を待機](https://learn.microsoft.com/ja-jp/connectors/approvals/#%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%89%BF%E8%AA%8D%E3%82%92%E5%BE%85%E6%A9%9F)	|自動テキスト承認プロセスを開始し、完了まで待機します。 承認はキャンセル可能です。|
|開始して承認または拒否を待機 - 最初に承認に応答 [非推奨]|このアクションは非推奨になりました。 代わりに、開始して承認を待機を使用してください。|
|[開始して承認を待機](https://learn.microsoft.com/ja-jp/connectors/approvals/#%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%A6%E6%89%BF%E8%AA%8D%E3%82%92%E5%BE%85%E6%A9%9F)|自動承認プロセスを開始し、完了するのを待機します。 承認はキャンセル可能です|
|開始して承認を待機 [非推奨]	|このアクションは非推奨になりました。 代わりに、開始して承認を待機を使用してください。|

この説明を読んでも何が違うか全く理解できないです。例えば２段階の承認が必要な場合は何を使うのだろうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3bcca71a-5f00-e2ca-a684-3a0d4bd96e1e.png)

+ [Power Automate での承認ワークフローを作成し、テストします](https://learn.microsoft.com/ja-jp/power-automate/modern-approvals)

以下の具体的な設定は全く理解できませんでした。

長期にわたる承認の作成
承認依頼のキャンセル


+ [シーケンシャル承認フロー](https://learn.microsoft.com/ja-jp/power-automate/sequential-modern-approvals) を作成します。
+ [パラレル承認フロー](https://learn.microsoft.com/ja-jp/power-automate/parallel-modern-approvals)を作成します。
[React] Reactでポップアップ領域を作成する方法

# はじめに

今回は、ページ内へポップアップ領域を表示する方法について紹介します！
HTMLの `<div>` 要素を使用してポップアップ領域を作成し、Reactの状態管理を活用します。

# 1. PopUpコンポーネントの作成

まず、ポップアップ領域を管理する `PopUp` コンポーネントを作成します。
状態を使用してポップアップの表示・非表示を切り替えます！


```jsx
// components/PopUp.js
import React, { useState } from "react";
import styles from "../styles/PopUp.module.css";

const PopUp = () => {
  const [isPopUpVisible, setPopUpVisible] = useState(false);

  const togglePopUp = () => {
    setPopUpVisible(!isPopUpVisible);
  };

  return (
    <div>
      <button onClick={togglePopUp}>ポップアップを開く</button>

      {isPopUpVisible && (
        <div className={styles.PopUp}>
          {/* ポップアップの中身 */}
          <p>ここにポップアップの内容を記述します。</p>
          <button onClick={togglePopUp}>閉じる</button>
        </div>
      )}
    </div>
  );
};

export default PopUp;
```
```jsx
/* styles/PopUp.module.css */
.PopUp {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: #fff;
  padding: 20px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
```
# 2. フォームをページに組み込む
次に、作成した PopUp コンポーネントをページに組み込みます！
```jsx
// pages/index.js
import React from 'react';
import PopUp from '../components/PopUp';

const HomePage = () => {
  return (
    <div>
      <h1>ポップアップ領域を作成する</h1>
      <PopUp />
    </div>
  );
};

export default HomePage;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/aaade485-2420-6121-da6d-aac4471a4614.png)
# まとめ
今回は、ページ内へポップアップ領域を表示する方法について紹介しました！
この記事を参考に、色々試してみてください！
A summary of the basic usage of FastAPI [Super beginner]

## FastAPI とは？
- Python 3.6以降でAPIを構築するための、モダンで高速なWebフレームワーク
- 使いやすい: Pythonの標準である型ヒントに基づいており、コードが読みやすく、理解しやすい
- 開発時間の短縮: FastAPIは使いやすく、コード量も少ないため、開発時間を短縮できる

## 型ヒント（type hints）

```type_hints.py
# Nomal
price = 100
tax = 1.1

def calc_price_including_tax(price, tax):
    return int(price*tax)

if __name__=='__main__':
    print(f'{calc_price_including_tax(price=price, tax=tax)}円')

# type hints 型ヒントは、変数や関数の引数、戻り値の型を宣言するための機能

price: int = 100
tax: float = 1.1

def calc_price_including_tax(price: int, tax: float) -> int:
    return int(price*tax)

if __name__=='__main__':
    print(f'{calc_price_including_tax(price=price, tax=tax)}円')

# from typing は、Python のコードで型ヒントを使用するために必要なモジュール
from typing import List, Dirt

sample_list: List[int] = [1, 2, 3, 4]
sample_dict: Dict[string, string] = ['username': 'abcd']
```

## 必要なライブラリをインストール
```
pip3 install fastapi
pip3 install uvicorn
```
## FastAPIを起動する
```
uvicorn main:app --reload
```

```main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def index():
    return {"message": "Hello World"}
```

## APIドキュメントの自動生成

[Swagger UI](https://swagger.io/tools/swagger-ui/)

- Swagger UI とは、Swagger Specification（OpenAPI Specification） で記述された API のドキュメントを視覚的に表示・検証できるオープンソースツールのこと

## パスパラメータ

```type_hints.py
# パスパラメータ 1
from fastapi import FastAPI

app = FastAPI()

@app.get("/contries/{country_name}")
async def country(contry_name: int):
    return {"contry_name": contry_name}

# パスパラメータ 2
from fastapi import FastAPI

app = FastAPI()

@app.get("/contries/japan}")
async def japan():
    return {"message": 'This is Japan!'}

@app.get("/contries/{country_name}")
async def country(country_name: str):
    return {"country_name": country_name}
```

## クエリパラメータ

```type_hints.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/contries/")
async def country(country_name: str, country_no: int):
    return {
        "country_name": country_name,
        "country_no": country_no
        }
```
## パスパラメータ + エリパラメーター

```type_hints.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/contries/{country_name}")
async def country(country_name: str='japan', city_name: str='tokyo'):
    return {
        "country_name": country_name,
        "city_no": city_name
        }
```

## Reference site
[【FastAPI超入門】直感的にWeb API開発ができるモダンなPython WebフレームワークFastAPIの基礎を80分でマスター](https://www.youtube.com/watch?v=vVNCVgYb6Xw&t=1173s)
SharePoint のアクション グループ


このセクションでは、Power Automate のすべてのアクションへの参照を見つけることができます。

+ [SharePoint のアクション グループ](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/sharepoint)

気になるところを抜粋

>SharePoint のアクション グループでは、デスクトップ フロー内から SharePoint コネクタ を利用できるため、多くの場合、アクションを使用するためにクラウド フローを作成する必要がなくなります。 このコネクタは、Power Automate クラウド フロー、PowerApps、および Logic Apps 全体で使用されるものと同じです。 同じパラメーターを使用し、同じ型のデータを返します。

# 制限

SharePoint クラウド アクションとデスクトップ フローの共有はサポートされていません。 共同所有者がこのように共有されたデスクトップ フローを実行するには、接続参照を独自のもので上書きする必要があります。 読み取りアクセス権を持つユーザーは、このようなフローを実行できません。



# なぜ、クラウド フローではなく、デスクトップ フロー内で SharePoint アクションを使用する必要があるのですか?

ユーザーは引き続き SharePoint アクションと デスクトップ用 Power Automate で構築したフローを実行 アクションを組み合わせることができます。 ただし、デスクトップ フロー内で SharePoint アクションを使用すると、クラウド アクションとデスクトップ アクションの間をループする必要がある場合に、そのパフォーマンスと使いやすさが向上します。

もしかして、このアクショングループはクラウド アクションではあんまり関係ない？
2024最新版 EgretEgretをインストールする

EgretEngineを提供していた白鹭科技は倒産したということで2024年1月にアクセスしたところ勝手の公式サイトはすべてシャットダウンしていました。

2022年夏ごろに時価25億の白鹭科技(Egret Technology)は破産したようです
https://36kr.com/p/1774667729533448
https://finance.sina.cn/tech/2022-06-04/detail-imizirau6508342.d.html

---
# 作ってしまったゲームのメンテナンスどうするの問題

有志のコミュニティーが非公式のダウンロードサイトを運営しています。
https://www.egret.uk/download/

もちろん様々なリスクが考えられますのでご注意ください。

ひとまず以下をダウンロードしてください。

- Egret Launcher1.2.4
- Egret Engine
- Egret Wing

ダウンロード方法ですがおすすめは「UC下载」(UCダウンロード）です。

「下载PC端」をクリックしてダウンローダーをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/7c8abcc3-9f90-79df-39df-bec4fcac3d78.png)

ダウンローダーをダウンロードしたらWeChatアカウントでアカウント作成（ログイン）してください。

次に左にチェックを入れて右の「保存到网盘」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/3d1fd8f6-56f6-a583-3f97-868cf329ffc4.png)

次にダイアログが開いた右側のボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/8cb774b4-dbaa-82ae-8aaa-526f7d8dc8ae.png)

そうするとダウンローダーを起動していいかブラウザーが許可を求めてきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/00a4aef6-0099-e649-0981-c66dc516a7f7.png)

ブラウザーのアラートで「UC网盘」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/30100ef4-7eb2-2c9a-31b4-a7022861440b.png)

ダウンローダーで確認画面がでますので右下を押してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/385b2cee-9f78-337a-7569-a6505b03c53f.png)

このようにダウンローダーに追加されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/bdb344c7-0431-ec38-48a1-28e7c3ed41ae.png)

ダウンロードしたいファイルにチェックをいれて右上の「下载」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/7bbed966-52ee-f395-009b-769c45827595.png)

ひとまずは以上です。
【Swift】private(set) と fileprivate(set)

`private(set)` について簡単にまとめました。

# private(set)
private(set) は値が初期化中にのみ設定することができ、いつでも読み取ることができる「読み取り専用のプロパティ」を作成することができます。

```swift
class MyClass {
    private (set) var myProperty: String
    
    init(myProperty: String) {
        self.myProperty = myProperty
    }
}

let myInstance = MyClass(myProperty: "Hello World") // 初期化なのでOK
print(myInstance.myProperty) // 出力：Hello World
myInstance.myProperty = "Goodbey World" // Error すでに初期化されているのでOUT
```
この例にある MyClass の myProperty は、初期化時のみ値を設定することができる読み取り専用のプロパティです。
実際に、初期化時に`"Hello World` という値を設定します。
「初期化中にのみ設定できる」なので問題なく出力できます。
しかし、`"Goodbey World` を代入するとエラーになります。すでに初期化して、読み取り専用プロパティとなっているのでOUTです。

# fileprivate(set)
private(set) に似たものとして、fileprivate(set) というものがあります。
これは、現在のファイル内で変更できます。
以下は、Swift で fileprivate(set) を使用する方法の例です。
 
```swift
class MyFileClass {
    fileprivate(set) var myProperty: String
    
    init(myProperty: String) {
        self.myProperty = myProperty
    }
}

extension MyFileClass {
    func changeMyProperty() {
        myProperty = "Goodbye World"
    }
}

let myFileInstance = MyFileClass(myProperty: "Hello World")
print(myFileInstance.myProperty) // 出力：Hello World
myFileInstance.changeMyProperty()
print(myFileInstance.myProperty) // 出力："Goodbye World"
```

# 参考文献
https://qiita.com/mototaji/items/d1ae68457a118df71458

https://egg-is-world.com/2016/02/09/swift-property-access/

https://qiita.com/codelynx/items/43e1c4f176730d952d13
Vertex AIでリアルタイム共同編集を有効にする方法

タイトルのとおり。

# 環境
Vertex AI（ユーザー管理のノートブック）
※マネージドノートブックにおけるやり方をご存知の方、ご教示いただけましたら幸いです。

# やり方
### 新規にインスタンスを立てるとき
ワークベンチ → 新規作成 → 詳細オプション → 環境 → メタデータ欄の「メタデータを追加」 → key:use-collaborative, value:true に設定 → 作成

### 既存のインスタンスを変更するとき
ワークベンチ → ノートブック名をクリック → VMの詳細「Compute Engineで表示」 → 編集 → メタデータ欄の「項目を追加」 → key:use-collaborative, value:true に設定 → 作成


# 参考
https://stackoverflow.com/questions/71888324/is-real-time-collaboration-supported-by-user-managed-notebooks-on-google-verte
[Git] gitconfigの基本とオススメ設定

　Gitを使っていると設定を変更することがあります。例えば、ユーザー名やメールアドレスの登録やリモートリポジトリの登録などがあります。Gitを使いはじめた頃は、作業スペースを変えると毎回リモートリポジトリを設定しなおすべきなのか理解していませんでした。gitconfigについてまず知っておきたいことをまとめました。

## Gitの設定ファイル

### 設定ファイルの種類

　Gitの設定にはシステム設定とグローバル設定とローカル設定があります。システム設定はgitconfigファイル、それ以外は.gitconfigファイルとして存在しています。なお、システム設定については基本的に触ることはないのでここでは説明を省略します。（そういうものがあるんだなっていう認識で大丈夫です）

![gitconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3419244/11dd21e2-5449-5d74-6ef0-0019958b7a73.png)


#### グローバル設定

　Gitを操作する上で全ての作業スペースで共通の設定項目です。ルートディレクトリに.gitconfigファイルとして存在しています。
git config --globalコマンドでルートディレクトリの.gitconfigファイルに設定内容を登録できます。
下記のコマンドはGitで最初に設定するのはGitHubなどのユーザーネームとメールアドレスを登録するコマンドです。

```bash:ユーザー名とメールアドレスの登録
$ git config --global user.name 'ユーザー名'
$ git config --global user.email 'メールアドレス'
```

　git config --globalコマンドで登録した設定内容は、ルートディレクトリ内すべてに適用されます。そのため、作業スペースを変更してもいちいちユーザーネームやメールアドレスを登録する必要はありません。

#### ローカル設定

　各作業スペースでの設定項目です。.gitconfigファイルはgit initで作成された.gitフォルダの中に保存されています。--globalのオプションをつけずにgit configをするとローカルの.gitconfigに保存されます。他にもgit remote addコマンドでリモートリポジトリを登録した場合もローカルの.gitconfigファイルに保存されます。

```bash:リモートリポジトリの登録
$ git remote add origin リモートリポジトリのURL
```

　ローカル設定は互いに独立しています。例えば、下図のように作業スペースAで設定したローカル設定は作業スペースCには反映されません。そのおかげで他の作業スペースへ移動してもリモートリポジトリを登録しなおす必要はありません。

![gitconfig_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3419244/445a425e-634a-8b30-a1b4-5ec4117f1c5e.png)

### Gitの設定の優先順位

　設定ファイルの優先順位は

ローカル＞グローバル＞システム

となっています。ローカルで設定した項目が優先され、それ以外はグローバル設定のものが適用されます。（さらにグローバルで設定されていない項目はシステム設定が適用されます）

　ある作業スペースだけに適用したいものをローカル設定に、共通して使いたいものをグローバル設定にすれば良いということになります。逆に、グローバル設定したつもりなのに設定が反映されていない場合は、--globalのオプションをつけ忘れてどこかのローカル設定にされている可能性が高いです。このことを理解しておけばGitの設定で悩むことは少なくなると思います。

## オススメのグローバル設定：alias（エイリアス）

　最後にGitの操作効率を上げるalias（エイリアス）の設定を紹介します。Gitでよく使うコマンドにエイリアスを設定するとコマンド入力を削減することができます。

　下記のコマンドをそれぞれ実行するとエイリアスを設定できます。（--globalオプションを忘れずに！）

```bash:Gitのエイリアス設定
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.co checkout
```

このように設定しておくと、それぞれのコマンドをalias.⚪︎⚪︎の「〇〇」の文字だけで実行できます。例えば、下記のようにコマンドを短縮して実行できます。

```bash:エイリアスの使用例：git commit
$ git ci -m "first commit"
```
```bash:エイリアスの使用例：git status
$ git st
```
```bash:エイリアスの使用例：git branch
$ git br -d feature
```
```bash:エイリアスの使用例：git checkout
$ git co -b feature
```
ぜひ試してみてください。
ざっくりと理解するApache MPMのprefork/worker/eventの違い

# TL;DR
基本的にはevent >= worker > preforkの順で優れていると考えてオッケー。
スレッドセーフじゃないものに関してはpreforkを使った方が良いが、それ以外はeventで問題ない。

# prefork
1プロセスが1リクエストを捌く方式。
メモリあたりの捌けるリクエスト数は少ないが、スレッドセーフでないプログラムを動かす場合はこの方式を使う必要がある。

# worker
preforkの改良版。
1スレッドが1リクエストを捌く方式。
メモリ効率がpreforkよりも良くなっているが、同一プロセス内のスレッド間ではメモリ領域が共有されているので、スレッドセーフではないプログラムには適さない。

# event
workerの改良版。RHEL8以降のデフォルト。
keepaliveが有効になっている場合に、workerよりも効率的にリクエストを捌くことができる。ただしそれができるのはhttpの時のみ。

# 参考文献
https://qiita.com/esparrago_b/items/4f368599aba1a059dbd1
https://l-light-note.hatenablog.com/entry/2013/12/01/184352
LaravelのDB設計って今どうなってん？




# 目次
[1. マイグレーションファイル多すぎ](#1-マイグレーションファイル多すぎ)
[2. スキーマファイル作れるらしい](#2-スキーマファイル作れるらしい)
[3. これでやっと](#3-これでやっと)

# 1. マイグレーションファイル多すぎ
Laravelに限らず、バックエンド系フレームワークのマイグレーションファイルって多すぎますよね。僕のようにインフラ面が分からなすぎるために、ソースコードからDB設計を把握するしかない人間もいるんですよね。
Railsであれば`schema.rb`ファイルとかいう**神ファイル**があるので問題ないのですが、Laravelってそういうファイルがないから時々どころか相当な頻度で困ることがあるんです。何のカラムを持っているのか分からないからマイグレーションファイルを見にいってという労力を毎回使ってたんです。

# 2. スキーマファイル作れるらしい

これが当たり前だと思っていたのですが、ふと調べてみたのです。`「Laravel Schema」`でググってみました。すると、**スキーマ系のファイル作れるけど今まで何してたの**と言わんばかりにあるコマンドのことが大量に出てきたんです。それが、

```shell:スキーマを作成
php artisan schema:dump
```

これさえ実行してしまえば、こんなSchemaファイルができてしまうんです。

```sql:database/schema/*-schema.sql
  :
  :
  :
DROP TABLE IF EXISTS `members`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `members` (
    `id` char(26) COLLATE utf8mb4_unicode_ci NOT NULL,
    `image_id` char(26) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
    `last_name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
    `first_name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
    `address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `email_verified_at` timestamp NULL DEFAULT NULL,
    `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `members_email_unique` (`email`),
    KEY `members_image_id_foreign` (`image_id`),
    CONSTRAINT `members_image_id_foreign` FOREIGN KEY (`image_id`) REFERENCES `images` (`id`) ON DELETE SET NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  :
  :
  :
```

# 3. これでやっと
長年(数ヶ月)の「Railsは`schema.rb`ファイルあって良いなあ」案件が解消されました。
また一段階、Laravelのことを好きになれた気がします。今日から沢山スキーマファイル作ろうと思います。
Rails知っておきたい用語【初級】

Railsの基礎学習の中で覚えておきたいまたはよくわからなかった用語を調べてまとめてみました。これから学習が進み次第追記していこうと思います。



# Webサーバソフトウェア

Webサーバソフトウェアは、ブラウザとアプリケーションサーバの間に立ち、ブラウザからのリクエストをアプリケーションサーバにリクエストし、アプリケーションサーバからのレスポンス（HTML、CSS、JavaScriptなど）をブラウザへ返す役割を持つ。静的ファイルの場合は、そのままブラウザへレスポンスを返す。

## アプリケーションサーバソフトウェア

アプリケーションサーバソフトウェアは、ブラウザやWebサーバと通信し、動的なコンテンツを生成して送信する。また、リクエストによって、データベースサーバーにアクセスしデータの抽出や加工処理を行う。ローカル環境の場合、Webサーバを持たずアプリケーションサーバとブラウザが直接やりとりすることもある。

## データベースサーバソフトウェア

データベースサーバソフトウェアはデータの記録、読み書きを行う。MySQLやPostgreSQLなどのソフトウェアを使用してデータの処理を行う。

## Puma

Pumaはアプリケーションサーバとして動作するソフトウェアの一種で、マルチスレッドで処理することによって高速な処理が可能。Rubyで使用するアプリケーションサーバの別の例としてUniconがある。

## Gem

GemはRuby以外の文脈ではライブラリと呼ばれ、プログラムが搭載されたの部品のようなもの。RailsもGemの一種で、複数のGemの集合体である。

## Node.js

JavaScriptの実行環境。JavaScript自体はブラウザ上での動作しか担当していないが、Node.jsを使用することでOS上にてJavaScriptを実行できるようになる。

## Webpacker

WebpackerはRailsでフロントエンド開発を行う際に使用されるGemで、webpackを実装している。WebpackはCSS、JavaScript、画像などのアセットを１つのファイルにまとめるための部品のこと。

## MVC

MVCはアプリケーションの役割分担方式で、以下の役割ごとの概念の頭文字を取ったもの。

- **コントローラ:** ModelとViewの間を取り持ち、ユーザからの値をModelに渡したり、Modelから受け取った処理結果をViewに渡す
  
- **モデル:** データベースの操作やデータの計算などを担当する
  
- **ビュー:** ユーザが見る画面への出力を担当し、HTMLを生成する

## アクション
>Railsガイドから引用:<https://railsguides.jp/action_controller_overview.html>
アプリケーションがブラウザからのリクエストを受け取ると、ルーティングによってコントローラとアクションが指名され、Railsはそれに応じてコントローラのインスタンスを生成し、アクション名と同じ名前のメソッドを実行します。

この文脈から、アクションはルーティング時に指定される名前のこと。メソッドは、アクションの指定によって実行されるコントローラクラスのメソッドのこと。

## マイグレーション

マイグレーションはデータベースにあるテーブルを操作するための仕組みで、マイグレーションファイルを操作することでテーブルの操作が可能。マイグレーションファイルはテーブルの設計図のようなもので、カラムやデータ型の定義された情報が含まれる。

## ルーティング

ルーティングはブラウザやWebサーバから受け取ったリクエストに対して適切な処理を行うコントローラに案内するためのルール。



## 参考にしたサイト
- Puma https://puma.io/
- 【Ruby/Ruby on Rails】重要用語・基礎知識まとめ【プログラミング学習開始128日目】
https://qiita.com/fuku_tech/items/4d2517ec5bbd53726997
- Railsガイド https://railsguides.jp/getting_started.html
- Webpackerとは https://zenn.dev/yusuke_docha/articles/550eee06b1ab1e
- Node.jsとはなにか？なぜみんな使っているのか?
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
- RailsにおけるMVC(モデル/ビュー/コントローラ)
https://www.javadrive.jp/rails/ini/index7.html
- Railsにおけるマイグレーションとは
https://diveintocode.jp/blogs/Technology/migration
- Railsのルーティングを学ぼう①
https://diveintocode.jp/blogs/Technology/Routing1
「as const」って何？

# as constを使ったきっかけ

こちらの記事
https://qiita.com/hayahaya925/items/31f6c262f9048d857c3f
で定数の定義の仕方を書いた

```statuses.js
export const statuses = {
    NOT_START: { "id": 0, "value": "未実施" },
    DOING: { "id": 1, "value": "処理中" },
    COMPLETED: { "id":2, "value": "完了" }
};
```

だが、この書き方だと外部で使用したときにVScodeで値の中身を参照できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073405/fd398169-4738-7456-84dd-7aa0e0982e76.png)
↑型しかわからない...

ここでTypescriptを使うと中身を参照できるようになる

まず、ファイル形式をtsに変更する

```statuses.ts
export const statuses = {
    NOT_START: { "id": 0, "value": "未実施" },
    DOING: { "id": 1, "value": "処理中" },
    COMPLETED: { "id":2, "value": "完了" }
};
```

そして、一番後ろに「as count」をつける
```statuses.ts
export const statuses = {
    NOT_START: { "id": 0, "value": "未実施" },
    DOING: { "id": 1, "value": "処理中" },
    COMPLETED: { "id":2, "value": "完了" }
}as const;
```
こうすることで、カーソルを載せたときに値の中身を見ることができる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073405/6529a7d9-d562-10f4-3a13-72df7b8fe8fe.png)

# そもそもas constってなんだ

`as const`は式の末尾につけることで値をreadonlyにするアサーション。
`as const`を付けない場合、`export const`で定数を定義していてもその中身には再代入が可能となる。
⇒再代入不可なのは`STATUS`オブジェクトであり、その中身`STATUS.NOT_START`などには再代入することができる

`as const`をつけることでその中身にも再代入不可となり、値が確定するので外部からも中身を参照することができるようになった...ということ？

# まとめ
`as const`は値をreadonlyにするアサーション

オブジェクトの後ろにつけることで、オブジェクトの中身も再代入不可にすることができる。
jpgからpngへの変換

フォルダ内のjpegをpngに変換する

```python
from google.colab import drive
drive.mount('/content/drive')

from PIL import Image
import os

def convert_jpg_to_png(input_folder, output_folder):
    # 1. 入力フォルダ内のJPEG画像をリストアップ
    jpg_files = [f for f in os.listdir(input_folder) if f.endswith('.jpg')]

    # 2. 出力フォルダが存在しなければ作成
    os.makedirs(output_folder, exist_ok=True)

    # 3. 各JPEG画像をPNGに変換
    for jpg_file in jpg_files:
        jpg_path = os.path.join(input_folder, jpg_file)
        # PNGの出力パスを生成
        png_path = os.path.join(output_folder, os.path.splitext(jpg_file)[0] + '.png')

        # 画像の変換
        img = Image.open(jpg_path)
        img.save(png_path, 'PNG')

if __name__ == "__main__":
    input_folder = "path"  # JPEG画像があるフォルダ
    output_folder = "path"  # PNG画像を保存するフォルダ

    convert_jpg_to_png(input_folder, output_folder)
```
いざというときに備えよう AWS CloudWatch ログのインサイトの使い方 簡易版

## 概要

障害対応時などに重宝するCloudWatchのログのインサイト（SQLっぽいクエリでログを検索できる仕組み）の使い方を簡単にまとめておく

## 注意

ログのインサイトは検索するデータ量に応じて料金が変わってくるはずである。後述するlimitなどを使って意図しない料金請求が発生しないように注意しよう。

## 使い方

ログのインサイトは1つ以上のロググループに対してクエリを実行する事ができる。

1. 検索したいロググループの名前を調べる。
1. AWSにログインしCloudWatchのコンソール画面に移動する。
1. 左サイドバーの「ログ」の中の「ログのインサイト」をクリックする。
1. ロググループを選択する。
1. クエリを入力・実行し結果を得る。

## ログの内容を指定して検索する（SQLの`select`みたいな感じ）

例えば@messageフィールド（ログのメッセージ部分）にが「error.」という文字列で終わっているエラーを最新の10件見たい場合、下記のようになる。どうやら正規表現にも対応している模様。

```
fields @timestamp, @message, @logStream
| filter @message like "error."
| sort @timestamp desc
| limit 10
```

SQLのselectでカラム指定する部分が`fields`の部分で、SQLのwhereで条件を絞り込む部分が`filter`の部分である。
ソートとリミットはそのまである。
`limit`に関しては付与する癖をつけたほうが良さそうである。特に「すべてのデータをヒットさせたい」場合以外はなるべく`limit`を使おう。出力結果の量に応じて料金が変わるらしい。意図しない料金請求に注意だ。

## 条件にあったログの個数を検索する（SQLの`count(*)`みたいな感じ）

例えば@messageフィールド（ログのメッセージ部分）にが「error.」という文字列で終わっているエラーの個数を見たいときは下記のようになる。

```
filter @message like "error."
| stats count()
```

## クエリ対象期間の指定はどうやってやるの？

対象期間はクエリでは行わず、ログのインサイトの画面上部の設定で行う。

![Cursor_と_ログ___CloudWatch___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/166d42a4-d824-7592-eb0f-5b2614ce1f5a.png)

## もっと複雑なクエリを組みたいんだけど・一回実行したクエリを保存したいんだけど

参考になりそうなクエリはこちらある。（ログのインサイト画面の右側の「クエリ」）ボタンからもアクセスすることが可能

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-examples.html

また、クエリ入力欄に「保存」ボタンがあるのでそこからクエリを保存する事ができる。
v-html使ってる人、今すぐやめて。




先日プログラマに怒られまして。


機能的には


「ちょ！ なんでここ、v-html使ってんの？」

「えっ？ ユーザが入力した改行とか死んじゃってたんで。」

「あかんよ！ 脆弱すぎ。」

「・・・。 なんで？」

というようなことがありまして。


脆弱の理由は簡単で、「攻撃される」ってことですわ。
ようはscriptタグとか埋め込まれたらなんでもできちゃうってこと。

特に不特定多数のユーザが使用する場合は、変数はちゃんと{{ }}で囲って、
whitespace: pre;（）pre-lineあたりつけときましょね。

使うときは更新の際にバリデーション
eclipse Intellij 開発のショートカット

#### 元の場所に戻る・進む
- Eclipse
Alt + ← または →
- Intellij
Alt + ← または →
#### 選択した行を上/下に移動
- Eclipse
[Alt] + [↑/↓]
- Intellij
Alt + Shift + ↑／↓
Ctrl + Shift + ↑／↓
#### 選択した行をコピー
- Eclipse
Ctrl + Alt + ↑ or ↓
- Intellij
Ctrl + D
#### 選択した行を消去
- Eclipse
[Ctrl] + [D]
- Intellij
Ctrl + Y
#### ファイル検索
- Eclipse
Ctrl + Shift + R
- Intellij
Shift 2回連打
#### 型の検索ボックス表示
- Eclipse
Ctrl + Shift + T
- Intellij
Shift 2回連打
#### 行のコメントアウト
- Eclipse
Ctrl + /
- Intellij
Ctrl + /
#### 複数行のコメントアウト
- Eclipse
Ctrl + Shift + /
- Intellij
Ctrl + Shift + /
#### フォーマット
- Eclipse
Ctrl + Shift + F
- Intellij
Ctrl + Alt + L
#### 型の階層表示
- Eclipse
F4
- Intellij
Ctrl + H
#### コードのアウトライン表示
- Eclipse
Ctrl + O
- Intellij
Ctrl + O
#### アウトラインを上下に移動
- Eclipse
Ctrl + Shift + ↑ または ↓
- Intellij
Ctrl + Shift + ↑ または ↓
#### 検索画面の表示
- Eclipse
Ctrl + F
- Intellij
Ctrl + Shift + F
#### ショートカットの表示
- Eclipse
Ctrl + Shift + L
- Intellij
#### import文を一括で編成(必要なものは追加し、使わないものは消去)
- Eclipse
[Ctrl] + [Shift] + [O]
- Intellij
Ctrl + Alt + O
#### 呼び出し元階層を開く
- Eclipse
Ctrl + Alt + H
- Intellij
Ctrl + Alt + H
#### 指定行へ移動
- Eclipse
Ctrl + L
- Intellij
Ctrl + G
#### ローカル変数への代入
- Eclipse
Ctrl + 2, L
- Intellij
Alt + Enter
#### インデントの訂正
- Eclipse
Ctrl + I
- Intellij
#### 選択箇所をif、while、forなどで囲む(Surround With)
- Eclipse
Alt + Shift + Z
- Intellij
Ctrl + Alt + T
CertMetrics（Google Cloud 認定資格の受験者向けポータル）にログインできなくなった件とその対処

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki)です。

みなさんは Google Cloud の認定資格をお持ちでしょうか。

2023年9月に Google Cloud 認定資格の受験者向けポータル CertMetrics ができましたが、わたしはある日エラーメッセージが出力されログインできなくなってしまいました。

## エラー内容

ある日ログインしようとしたら以下のエラーメッセージが表示されログインできなくなっていました。

`the specified email is used by multiple certmetrics accounts`

パスワードリセットなど試みましたが、再設定しようにも再設定用メール自体が届きませんでした。。
事象発生前はログインできており心当たりもなく、リリースされたばかりなのでそのうち直るかなと思って放置しました。

[サポートページ（日本語）](https://support.google.com/cloud-certification/gethelp?hl=ja)もたまにチェックしていましたが、以下のメッセージが表示されまだサポートの口がないのかな？と深追いしませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/3a056687-a00e-a9a2-2348-21f1f511655f.png)

## サポートに問い合わせ

ある日、社内で別なトラブル（認定証が届かない）に遭っていた人が、サポート（英語）の方で解決したとチャットで共有がありました。

わたし：（へー。そういうこともあるんだ。ん・・・英語？）

-> [サポートページ（**英語**）](https://support.google.com/cloud-certification/gethelp?hl=en)を開く。

-> 日本語ページにはなかった Email があるじゃないですか😇
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/adc8e7ff-4f16-eddc-eec2-0165bd6a1048.png)

その後は「CertMetricsにログインできない。サポートお願い。」を翻訳ツールにかけて問い合わせたところ、パスワードリセットと First Time Login の指示がありましたが、どちらも NG な旨伝えたら専門チームにエスカレーションとなり、最初の問い合わせから 2 週間ほどで無事ログインできるようになりました。

## 学び

よく公式ドキュメントで英語版のみ反映され他言語のページへの反映が遅れることがありますが、Certification のサポートも同様でした。

まだまだ訓練（英語版で確認する）が足りてないようです。

同じような事象で困っている方の助けになれば幸いです。
福田昭のデバイス通信 第7回 第8回 第9回

# キャッシュの更新

次のシステムのメモリアクセスを考える。

- 1次キャッシュ (命令キャッシュとデータキャッシュ)
- 2次キャッシュ (命令とデータの区別無し)
- 外部メモリ

1次データキャッシュに存在する場合、その値をCPUに返す。
1次データキャッシュに存在せず、2次キャッシュに存在する場合、その値をCPUに返し、1次データキャッシュにコピーする。
1次データキャッシュと2次キャッシュに存在せず、外部メモリに存在する場合、その値をCPUに返し、1次データキャッシュと2次キャッシュにコピーする。

# ライトスルーとライトバック

キャッシュラインにコピーするアロケーションと、削除するエビクションがある。
エビクションには、ランダムに削除、順番に削除、最古のデータを削除する方法がある。
キャッシュに書き込む時、外部メモリにも書き込む方式をライトスルーと呼ぶ。
回路は単純だが、メモリアクセスが多発すると性能が著しく低下する。
キャッシュを削除する時、外部メモリに書き込む方式をライトバックと呼ぶ。
回路は複雑だが、メモリアクセスが多発しても性能は殆ど低下しない。

# キャッシュの性質と弱点

投機的プリフェッチは、近い将来アクセスする確率の高いデータを事前に読み込む。
例えば、0x8000、0x8020、0x8040にアクセスした場合、0x8060にアクセスする確率は非常に高い。
また、memsetなどのキャッシュを汚染する関数を検知し、キャッシュの更新を一時的に止める。
キャッシュを支えるのは時間的局所性と空間的局所性であり、局所性の低いアプリケーションには効果が薄い。
キャッシュミスが多発する場合は、性能を低下させることもある。

# 仮想メモリ

アプリケーションは仮想メモリを使用し、物理メモリを認識しない。
物理メモリが3GBで仮想メモリが4GBの場合、不足分はHDDに割り当てられる。
ハイパーバイザーが複数のゲストOSを管理する場合、独自のページテーブルを使用し異なるアドレス空間を提供する。
ゲストOSのページテーブル、ハイパーバイザーのページテーブルの2段階変換を行い、真の物理アドレスを得る。
macでのPythonの環境構築


# home berwのインストール
[homebrew](https://brew.sh/ja/)

# pyenvを使ったpythonのインストール
`brew install python`だと、固定のバージョンしか使うことができないので、pyenvを使うことを検討する。

`brew install pyenv`

brewを使ってpyenvをインストールした。

[参照したリンク](https://github.com/pyenv/pyenv)
For zsh のところの設定を実行した。

``` pathの設定

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```
その後、source ~/.zshrcで読み込ませる。

## pyenvを使ったpythonのインストール

`pyenv --version`
pyenvのバージョンを確認するコマンド、今回は2.3.35をインストールした。

`pyenv install --list`
このコマンドでインストールすることができるpythonのバージョンのリストを取得することができる。

今回は、3.11.2をインストールしてみることにした。
`pyenv install 3.11.2`
このコマンドでインストール可能。

`pyenv global 3.11.2`

その後、pythonコマンドで実行できることを確認した。

# メモ
## pythonのPATHの確認
`where python`
どこのpythonを使っているのかを確認するためのコマンド

## macのshellの確認方法
`echo $SHELL`
/bin/zshと表示されたので、zshを使っている。