OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP】endroid/qr-codeライブラリを使用したQRコード生成方法

QRコード生成はgoogleAPIを使用する方法等ありますが、外部リンクを読み込む方法を採用するのはAPIの仕様変更やサービス停止を考慮すると危険です。

そこでPHPのライブラリ「endroid/qr-code」を使用したQRコード生成の方法を紹介します。

※ここではCakePHP3で実際に導入した方法を紹介します。

### 「endroid/qr-code」のインストール
Composerを使用して「endroid/qr-code」 のインストール を行います。

※Composerはインストール済みという想定で進めます。

 

composer.jsonのあるディレクトリで次のコマンドを実行

```:terminal
composer require endroid/qr-code
```

以上で「endroid/qr-code」 ライブラリの導入が完了です。

 
### 「endroid/qr-code」の使用方法
ライブラリの導入が完了したので、ここからは実際にQRコードを表示するまでの例を紹介します。

 

GitHubのREADMEに載っているコードを参考にしつつ、次のようなsample.phpを作成します。

```:phpファイル
<?php
require_once(__DIR__ . '/vendor/autoload.php');

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

// URLをセット
$url = 'https://www.qrcode-test.com/'

// QrCodeオブジェクトを生成して各種オプションを設定
$qrCode = QrCode::create($url)
            ->setEncoding(new Encoding('UTF-8'))
            ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
            ->setSize(150)
            ->setMargin(25)
            ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
            ->setForegroundColor(new Color(0, 0, 0));

// PngWriterオブジェクトを生成し、QrCodeオブジェクトの情報を書き込む
$writer = new PngWriter();
$result = $writer->write($qrCode);

// Base64でエンコード
$qrCodeBase64 = base64_encode($result->getString());

// QRコードのimgタグを生成してスタイル属性でサイズを設定
$qrCodeImg = '<img src="data:image/gif;base64,'.$qr_code_base64.'" alt="QR Code" style="width:200px;">';

// QRコードを画面に表示
echo $qrCodeImg;

?>
```

作成したsample.phpにブラウザでアクセスすると以下のようなQRコードが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295385/51bc4b0f-3ba8-1480-b751-a0cbafafe684.png)
 
cakephp3で実際に導入したときには、wordpressのプラグインとcakeの内部APIでデータを行き来する必要があったため、Base64でエンコードしてからimgタグを生成しています。

※上記で紹介した方法の他にも出力の方法があるようなので、用途に合わせて変更してみてください。
QRコードを読み取りやすくする方法

## QRコードを読み取りやすくする方法
QRコードの読み取りがうまくいかないときの対策をいくつか紹介します。
1. QRコードの画質を良くする
2. QR生成ツールのバージョンを最新にする
3. QRコードの誤り訂正レベルを上げる
### 1. QRコードの画質を良くする
QRコードをより鮮明に表示するために画質を上げます。
ライブラリ等QRコードを生成する大元では1,000px×1,000pxなど大きいサイズで出力し、それを実際の出力サイズに合わせてCSSで小さくすると鮮明なQRコードを表示できます。
### 2. QR生成ツールのバージョンを最新にする
QRコードを生成するツールのバージョンが古いと、読み取り側のデバイスのバージョンと仕様が合わずに読み取れない恐れがあるため、QR生成ツールのバージョンを最新にアップデートします。
### 3. QRコードの誤り訂正レベルを上げる
QRコードは一部破損しても読み取りを可能とする誤り訂正機能があります。
誤り訂正レベルは以下の表のとおり、QRコードの何%が破損していても読み取れるかを定める項目です。

|レベルL|レベルM|レベルQ|レベルH|
|:-:|:-:|:-:|:-:|
|誤り訂正 7%|誤り訂正 15%|誤り訂正 25%|誤り訂正 30%|

※設定方法はQRコードを生成するツールのよって異なるので、ツールの使用方法を参照ください。

誤り訂正レベルを高く設定するほどQRコードの目が細かくなります。

QRコードが読み取れない原因によっては、目を細かくすることでさらに読み取りにくくなる可能性があるので、状況に応じてレベルを設定をHとLのどちらに寄せるか判断してください。
REST APIって何?

# 結論
#### REST APIとは
RESTのルールに従ったAPIのことです。

# そもそもRESTとは何か
webサービス設計思想の１つ
Twiiterなどのアプリを作るときにどういう手段で作っていくかを考える思想の１つ

# REST4大設計のルール
※RESTは４つ以上ありますが今回は一般的な４つを解説します。
このルールを満たしたサービスがRESTfullと言われています。


#### 1.アドレス可能性(Addressability)
#### 2.統一インターフェース(Uniform Interface)
#### 3.ステートレス性(Stateless)
#### 4.接続性(Connectability)

## 1.アドレス可能性(Addressability)
クライアントが送ったURL(アドレス)をサーバーが理解しそれをクライアント返していること。

例：
ユーザーがQiitaのマイページのボタンを押したときにクライアント側からユーザーがマイページが見たいですといった情報がサーバーに送られる。
そしてサーバーが分かりましたとマイページの画面がクライアント側に返ってくる。

## 2.統一インターフェース(Uniform Interface)
この４つのメソッドを統一して使おうというのが統一インターフェースです。
1.GET
2.POST
3.PUT
4.DELETE

サーバーはjson形式でデータを返します。

## 3.ステートレス性(Stateless)
クライアントの情報を持たないように設計する。

例：
Qiitaのページに初めて入ったときに一覧の画面にいきますがこれが2回目に入った場合前回投稿ページで画面が閉じられたので投稿ページを開いてあげるといった前回の情報を覚えている状態のことをステートフル(状態を持っている)と言います。
逆に毎回前回の情報を忘れて一覧ページを開くのがステートレスな状態となります。

これを聞くとステートフルな状態の方がいいと思う方もいらっしゃると思いますがこれは管理がとても大変でユーザーごとに前回の情報を記憶しないといけなくなります。

ステートレスだと記憶をしなくて良くなるので管理が簡単で欲しい情報を言えばサーバから返ってくるので拡張性が上がります。

## 4.接続性(Connectability)
Qiitaで言うと一つの記事に対して複数のリンクがある状態のこと。
蜘蛛の巣のようにリンクが広がっていくこと。
【rails db:migrateに失敗】StandardError (An error has occurred, this and all later migrations canceled:PG::DuplicateTable: ERROR:  relation "posts" already exists ):

# 事象

マイグレーションの移行のため、`rails db:migrate`を実行すると、以下のエラーが発生。
```
StandardError (An error has occurred, this and all later migrations canceled:

PG::DuplicateTable: ERROR:  relation "posts" already exists
):
```
データベースに`posts`が既に存在しているというもの。
前回一度`rails db:migrate`をしたが、一旦全てのアプリを削除し、今回は再作成している状況であったため、残っていたと想定。

# 解決方法
まずは、現状を以下で確認。
```
❯ rails db
```
前回作成したデータベースの`posts`を削除するために以下を実行。
モードが切り替わり、`post_bootstrap_app_development=#`となるため、以下を`\d`を実行。
すると、以下のように、`posts`の存在を確認。
```
                  List of relations
 Schema |         Name         |   Type   |  Owner
--------+----------------------+----------+----------
 public | ar_internal_metadata | table    | ユーザ名
 public | posts                | table    | ユーザ名
 public | posts_id_seq         | sequence | ユーザ名
 public | schema_migrations    | table    | ユーザ名
(4 rows)
```
この`posts`を削除するため、以下を実行
```
drop table posts;
```
そして、`\d`で確認すると、
```
                List of relations
 Schema |         Name         | Type  |  Owner
--------+----------------------+-------+----------
 public | ar_internal_metadata | table | ユーザ名
 public | schema_migrations    | table | ユーザ名
(2 rows)
```
ちゃんと、`post`が消えていることを確認。
そして、再度マイグレーションを実行。
```
❯ rails db:migrate
```
`rails s`でサーバ起動し、正しい動作を確認できた。
awkコマンドについて

# awkコマンドについて

## 記事を書いた背景・概要

仕事でログ解析をすることが多くなりました。今まではエクセルを使って集計をやっていました。
ただ、データ量が多い場合、エクセルの動作が遅くなってきました。なにかいい方法はないかと調べたところawkコマンドに出会いました。

この記事では覚えたawkコマンドの動きや使ったことを簡単にまとめました。
備忘録的な使い方もしていますが、ご容赦ください。

## awkコマンドの基本

//:TODO

## 実例

### 対象ログ

access_logの中にはこんな形

```
192.0.2.0 - - [11/Dec/2019:12:01:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
198.51.100.0 - - [11/Dec/2019:12:02:22 +0000] "POST / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
203.0.113.0 - - [11/Dec/2019:12:01:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
198.51.100.0 - - [11/Dec/2019:12:02:22 +0000] "GET / HTTP/1.0" 200 35 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3602.2 Safari/537.36"
```

### IP部分の抽出・計算

IP部分の抽出をしたい場合

何も指定しない場合、区切り文字は「 」（半角スペース）です。また、出力したい要素を$と要素番号で指定する。
$1で一番はじめの要素である、IP部分を出力する。

``````sh
$ cat access_log | awk '{print $1}'
192.0.2.0
198.51.100.0
203.0.113.0
198.51.100.0
``````

何回同じIPからアクセスが来ているかカウントしたい場合

連想配列ipMapにipをキーとして出現回数をvalueとして保持する。End部で、ipMapからipと出現回数を出力する。

「uniq -c」と「sort」コマンドでもできますが、awkコマンドだけでやってみました。

``````sh
$ cat access_log | awk '{ipMap[$1]++}END{for(i in ipMap){print i,ipMap[i]}}' | sort
192.0.2.0 1
198.51.100.0 2
203.0.113.0 1
``````

### 時刻部分を抽出・計算

時刻の部分は[]の間に書かれており、また、+以下のタイムゾーンはいらないので、以下を区切り文字として使います。
- [
- ]
-  （半角スペース）

[]は正規表現のパターンとして認識されてしまうため、バックスラッシュを前につけます。awkのリファレンスを読むとバックスラッシュ２つでバックスラッシュの意味になるので、２つつけています。（ここがわからず苦戦しました。）

``````sh
$ cat access_log | awk -F'\\[|\\]| ' '{print $5}'
11/Dec/2019:12:01:22
11/Dec/2019:12:02:22
11/Dec/2019:12:01:22
11/Dec/2019:12:02:22
``````


## 参考
https://zenn.dev/nutmeg/articles/awk_charm_02
雀魂 ワンライナー

:::note warn
**コードの利用は、自己責任でお願いします。**
:::

# onbeforeunload

タブを閉じる前や更新する前に、確認のメッセージを挟むコードです。雀魂以外のサイトでも実行できます。[^extension]

```JavaScript
window.onbeforeunload = () => 1;
```


# 日付
**1週間前** や **1ヶ月前** のような日付の表記を、年月日に変更します。

```JavaScript
game.Tools.time2Desc = date => new Date(date * 1000).toLocaleString();
```

ゲームを再起動するか、次のコードを実行すると、元の表記に戻ります。
```JavaScript
game.Tools.time2Desc = game.Tools.time2DescServer;
```



# 順位

順位が **999+** と表示されていても、正確な順位を確認できます。三人麻雀の場合は ```{type: 2}``` に変更してください。

```JavaScript
app.NetAgent.sendReq2Lobby("Lobby", "fetchLevelLeaderboard", {type: 1}, (err, res) => console.log(res.self_rank));
```



# 牌譜のブックマーク

ブックマークに追加するボタンが表示されない牌譜を、ブックマークに追加できます。牌譜画面で次のコードを実行すると、ボタンが表示されます。

```JavaScript
uiscript.UI_DesktopInfo.Inst._btn_collect.visible = true;
```


# スタンプ

対局開始後に実行すると、CPU を含む対局相手のスタンプが非表示になります。

```JavaScript
uiscript.UI_DesktopInfo.Inst._player_infos.filter(v => v.headbtn).forEach(v => v.headbtn.emj_banned = true);
```



# 観戦ロビーのプルダウン

観戦ロビーのプルダウンの項目を並び替えて、**3人東風戦** を一番下に配置します。
```JavaScript
uiscript.UI_Ob.Inst.modes.sort((a, b) => b.name1 === "3人東風戦" ? -1 : 0);
```

ゲームを再起動するか、**3人半荘戦** に変更してコードを実行すると、元の順番に戻ります。



# cfg

```cfg``` には、雀魂の様々な設定が格納されています。次のコードは、雀魂のキャラクター名を取得します。

```JavaScript
cfg.item_definition.character.rows_.map(row => row.name_jp);
```



# clickHandler

次のコードをロビー画面で実行すると、寮舎の画面に移動します。

```JavaScript
uiscript.UI_Lobby.Inst.enable && uiscript.UI_Lobby.Inst.btns.me.getChildAt(0).clickHandler.method();
```



[^extension]: [Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)（[FireFox版](https://addons.mozilla.org/ja/firefox/addon/tampermonkey/)、[Edge版](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd?hl=ja-JP)）を使うと、常に実行されるように設定できます。
GoogleFit連携をReactNativeで実装

# はじめに

GoogleFitから体重、心拍、血圧、歩数を取得するアプリケーションをReactNativeで作ってみました。
わりと簡単に作れたのと、AndroidStudioのデバイスで動作確認もできるのを知らず、できたことに少し驚きました。

ソースはGithubに上げてありますので主にGoogleCloudでの手順を解説していきます。

大きな流れはこんな感じ。

1. FitAPIを有効化する
1. 認証情報の設定
1. 同意画面の作成＆テストユーザの登録
1. アプリケーションの起動
1. 動作確認


# 事前準備

## AndroidStdioのインストール＆設定

AndroidStudioのエミュレータを使って動作確認できるのでインストールしておきましょう。

Fitアプリはデフォルトで入っていませんので、PlayStore付きのデバイスを使います。私はPixel4を利用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/7666b6a2-e6cf-0d62-7ed7-706d71bcf2bf.png)

環境変数はANDROID_SDK_ROOTとadbコマンドを動かすためにPATHを設定しておけば大丈夫です。

参考：[Android デベロッパー > Android Studio > ユーザーガイド > 環境変数](https://developer.android.com/studio/command-line/variables?hl=ja)

## ソースを取得しておく

```
git clone https://github.com/uzresk/react-native-google-fit-sample.git
```

# Fit APIを有効化する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/6e31a0c3-4de3-c9a9-e06d-0500ebace7e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/4a1a6208-71ba-58f3-5d5d-b131e647f1cc.png)

# 認証情報を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8aa34497-4fdd-b7ac-cf70-060f4cac3679.png)

認証情報を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/baa7104f-2d3b-11b1-9ea2-95b6b4a85edf.png)

パッケージ名は、AndroidManifest.xmlに記載されているものを記載します。
SHA-1証明書のフィンガープリントは以下のコマンドで取得したものを利用します。

- debug.keystoreへのパスはソースにあるものを指定してください

  ```
  keytool -list -v -keystore "debug.keystoreへのパス" -alias androiddebugkey -storepass android -keypass android
  ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/a47f03e0-3ec1-63b5-6b55-2b9da2a36845.png)

同意画面は適当に作っておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/6774b6ae-8306-ae81-10c8-f5247316364a.png)

要求するスコープも定義。今回はサンプルなのでREAD権限を全部追加しておきました。本番利用時は勿論必要最小限にしておきます（そうじゃないと審査も通らないと思います）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/a5acf097-cfaf-9b58-d71e-c0dd8adf4e77.png)

続いてテストユーザを追加。上限100まででアクセス可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/ace6654b-3cdc-c9e0-b1b6-49da1021dde3.png)

# アプリを起動する

以下のコマンドを実行すると、androidエミュレータが自動で起動するはずです。

```
npx react-native run-android
```

# 動作確認


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/dbba696e-f309-9993-86e4-97fcee6ffbdc.png)

Googleの認証を通しているわけではないのでワーニングが出ますが「Continue」します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/546316f7-6fe6-277b-18b1-b6ddfb5d8adf.png)

認可が求められます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/6900e659-b549-a3a4-778b-6e96276b43ab.png)

ボタンを押すと、Fitアプリからデータが取れることが確認できるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/c9fbf14b-e442-3f1e-db15-948d6bf7ae39.png)

# 参考

- [GoogleFit OAuth 2.0 クライアント ID を取得する](https://developers.google.com/fit/android/get-api-key)
Windows10でAWS "sam init" コマンドがPermission Errorになるとき

## 以下の手順で直りました。

1\. Open Registry Editor (regedit.exe).
2\. Navigate to Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
3\. Set LongPathsEnabled to 1.

[Permissions Error: Unstable state when updating repo](https://issuehint.com/issue/aws/aws-sam-cli/3479#121495657)
[パスの最大長の制限](https://docs.microsoft.com/ja-jp/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd)

【エラーメッセージ】
Error: Unstable state when updating repo. Check that you have permissions to create/delete files in C:\Users\user\AppData\Roaming\AWS SAM directory or file an issue at https://github.com/aws/aws-sam-cli/issues
Nodejsのバージョンを上げたら`error:0308010C:digital envelope routines::unsupported`が出てしまう

# はじめに
最近はRailsしか触っていない筆者です。
本業の大きなプロジェクトが落ち着き、ほっとしております:smile:

さて今回は、Nodejsのバージョンを上げることで、Gatsbyのプロジェクトが`error:0308010C:digital envelope routines::unsupported`で怒られてしまったので、その暫定対応について記載します。

とりあえず、動かしたい方はこちらが参考になれば幸いです。

# 前提
- Nodejsのバージョン: 18.7.0
- npmのバージョン: 8.15.0

# 結論
`openssl-legacy-provider`オプションを使用する。

私は、package.jsonを編集し、以下のようにしました。

```diff
  "scripts": {
-    "develop": "gatsby develop",
+    "develop": "NODE_OPTIONS='--openssl-legacy-provider' gatsby develop",
  }
```

原因は、Nodejsのバージョンが上がったことによるOpenSSLの互換エラーのよう。
今回の対応は、あくまでも暫定対応で、OpenSSL3をレガシープロパイダーに戻すことで対応しています。

もしくは、Nodejsのバージョンを戻すことも検討してもいいかもです。とりあえずで動かしたいならですが。。

# おわりに
Nodejsのバージョンアップは一筋縄ではいかないですね:sob:
gatsbyもv4にしたいけど、プラグインがついてこないし、どうしたものか。。

それでは:pray:
【Laravel】Laravelで改行コードを反映してブラウザ表示する方法

### 反映方法
LaravelのBladeファイルで改行コードを反映させて表示するには以下のように記述する。
```:bladeファイル
{!! nl2br(e(改行ありのテキスト)) !!}
```
### 解説
1. laravelヘルパー関数の```e()```を使用してテキストをエスケープする。
2. phpの```nl2br()```の関数で改行文字を```<br>```に変換する。
3. ```{!!  !!}```を使用して```<br>```のみエスケープせずに表示する。

※```e()```を使用しないとスクリプトタグ等が有効となったままなので注意が必要。
【Laravel】useしているのにClass not foundエラーが出たときの対処方法

### 原因
対象の名前空間を指定したファイルが存在するのに、クラスが見つからない主な原因は、そのファイルがコンパイルされていないこと。

### 対処方法
ファイルの変更内容が読み込んで適切にコンパイルし、クラスを生成してくれる以下のコマンドを実行する。

```:terminal
composer dump-autoload
```
【AWS】EC2からRDS内のMySQLにログインする方法


### EC2からRDSのMySQLにログイン
EC2からRDS内のMySQLにログインする場合、エンドポイントの指定が必要。

```
mysql -h エンドポイント -u ユーザー -p
```
### mysqldumpを使用する場合
dumpデータの出力なども同じくエンドポイントを指定する。

```
mysqldump -h エンドポイント -u ユーザー -p DB名 > ファイル名
```
Railsでアプリを再作成した時のファイルを確認できない

# 事象
`rails g model`を実行すると、以下のエラーが発生。
```
❯ rails g model Post title:string content:text
Running via Spring preloader in process 16060
      invoke  active_record
The name 'Post' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative or use --skip-collision-check or --force to skip this check and run this generator again.
```
既にPostモデルが作成されているというエラー。
ただし、vscodeやfinderで確認しても、Postモデルを確認できない。

# 解決方法
一度railsでアプリを作成して、削除後（ゴミ箱）に移動後、railsアプリを再作成していた。
今回のモデル作成では、ゴミ箱のディレクトリに作成されたままだった。
そのため、 ゴミ箱で対象アプリを削除した後、再度`rails g model`を実行すると、成功した。
ゴミ箱のアプリの削除が必要だとは思わなかったので、今後気をつけたい。
FinalIKでオブジェクトに触れる（Unity ver.2019）

# はじめに
私の環境ではFinalIKをチュートリアルと同様に進めると動作しなくなるため、動作するまでの手順を備忘録にと書き起こしたものです。

# 環境
Unity 2019.4.31f1
[FinalIK](https://assetstore.unity.com/packages/tools/animation/final-ik-14290?locale=ja-JP)

# 参考動画
[FinalIK Turorial](https://www.youtube.com/watch?v=r5jiZnsDH3M&list=PLVxSIA1OaTOu8Nos3CalXbJ2DrKnntMv6&index=4)

# 実装手順
①ダミーを追加
- 「Full Body Biped IK」と「Interaction System」をアタッチ
![dummy setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820849/3d5456c6-630f-7b66-c50d-dc905f48e95a.png)
②３Dオブジェクトから球体を追加
- コライダーを削除
- Weight Curvesの値を１に変更し、以下のカーブになるよう調整する
![weight curve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820849/dd7f8c14-5349-172f-e2b5-f6b13c45e754.png)
- 「Interaction Target」をアタッチ

③ダミーに「Interaction System Test GUI」をアタッチ
- Interaction Objectに球体を指定
- Effextorsのサイズを１に変更し、Element 0にLeft Handを指定
![dummy with cube.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820849/30aff23f-b4b7-86c7-8e5a-144d0ca80a0a.png)

④ゲームを実行すると画面左上にボタンが追加されており、そこをクリックすると球体に手を伸ばしてくれる


# おわりに
今回は球体に対して直接Interaction Targetを使用していますが、チュートリアル動画を見進めればわかる通り、移動させたい先の座標をもつ空オブジェクトに対してアタッチするのがきれいな使い方だと思います。
あくまでチュートリアルと足並みをそろえると立ちいかなくなってしまうため、それを解決する応急処置方法です。
【Docker】Dockerfileでヒアドキュメントを使用する方法

## Dockerfileでヒアドキュメントを使用する方法
`Dockerfile`に以下のように記述することでヒアドキュメントを使用することができます。
ただし、Buildkitを使用している必要があります。

```Dockerfile:Dockerfile
# syntax=docker/dockerfile:1
ARG RUBY_IMAGE_TAG
FROM ruby:${RUBY_IMAGE_TAG}

ARG PROJECT_NAME
ARG RUBYGEMS_VERSION
ARG USER_NAME=ruby
ENV TZ=Asia/Tokyo

RUN adduser ${USER_NAME}

COPY --chown=${USER_NAME} Gemfile Gemfile.lock /${PROJECT_NAME}/

WORKDIR /${PROJECT_NAME}
RUN <<-EOF
  gem update --system ${RUBYGEMS_VERSION}
  bundle install
  chown -R ${USER_NAME} ${GEM_HOME}
EOF

COPY --chmod=755 /.docker/api/entrypoint.sh /usr/bin/
ENTRYPOINT ["entrypoint.sh"]

USER ${USER_NAME}
RUN mkdir -p /${PROJECT_NAME}/tmp/sockets/

EXPOSE 3000

CMD ["bundle", "exec", "pumactl", "start"]

```

https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#here-documents

`Dockerfile`に`# syntax=docker/dockerfile:1`を記述するのを忘れないようご注意ください。
`# syntax=docker/dockerfile:1`の`1`はバージョンの指定です。

https://hub.docker.com/r/docker/dockerfile

ヒアドキュメントの使用方法は以下をご参照ください。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
ロースペックPCでStableDiffusionを実装し実行時間を計測

# 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
本稿はロースペックPCでStableDiffusionを導入してみた際の手順です。

# 環境(マシンスペック）
OS: Windows 10
CPU: Ryzen 5 3500U
GPU: AMD Radeon Vega8 Graphics VRAM 2GB（オンボード）
メモリー: 8GB

Python : 3.9.13
diffusers : 0.2.4
torch : 1.12.1
transformers : 4.21.2

## 目的
StableDiffusionの資料を探しているとCUDAを使用した環境の構築が多いものの一応動作させること自体はCUDAなしでもできそうだったためその環境を構築してみます。
## Python仮想環境設定
今回は実用的な速度にならないことが予想できていたため後から削除しやすいよう専用の仮想環境を用意します。
```:コマンドプロンプト
python -m venv (作業用フォルダのパス)\stbl_dffsn
(作業用フォルダのパス)\stbl_dffsn\Scripts\activate
```
## 環境構築
[GitHubのCompVis/stable-diffusionページ](https://github.com/CompVis/stable-diffusion,"stable-diffusion")にて以下の様に紹介されている方法で導入を目指します。
>simple way to download and sample Stable Diffusion is by using the diffusers library:

というわけでDiffuser経由でStableDiffusionを動作させること目指します。まず動作に必要なDiffuserに必要なPytorch、Transformersを導入します。
### Pytorch
[Pytorch公式ページ](https://pytorch.org/,)のインストール補助ツールを用いて**CPU版**のPytorchをpipで導入します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/c97bdd9d-b634-0a03-3997-af93911b8a6e.png)
ちなみに筆者は一度ここでPythonのバージョンによるエラーが発生していました（Python 3.8.1では導入不可）

### Transformers
必須ではないかもしれませんが私の環境では導入したPytorchを動作させた際にTransformersを要求されたため追加で導入します。
```:コマンドプロンプト
pip install transformers
```

### Diffusers
Diffusersもpipでインストールします。
```:コマンドプロンプト
pip install diffusers
```
### モデルの入手
この段階で動作に必要な環境は整いましたがStableDiffusionのモデルを利用するためには[Hugging Faceのアカウントを作成](https://huggingface.co/join)しトークンを取得する必要があります。トークンの取得はアカウントにログインした状態で[モデルのページ](https://huggingface.co/CompVis/stable-diffusion-v1-4)にアクセスし利用規約に同意することで取得できます。ここで取得したトークンはヘッダーの右上にあるアカウント情報>Setting>Access Tokensからも確認することができます。

## 実装
環境構築章で触れたサンプルコードを一部改変し以下の様に実装しました。
```python:stable-diffusion.py
from torch import autocast
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained(
	"CompVis/stable-diffusion-v1-4", 
	use_auth_token="ここにアクセストークンを記載"
)

prompt = "a photo of an astronaut riding a horse on mars"
with autocast("cuda"):
    image = pipe(prompt)["sample"][0]  
    
image.save("astronaut_rides_horse.png")

```
生成する画像を指示しているのはpromptに代入しているa photo of an astronaut riding a horse on mars（火星で馬に乗っている宇宙飛行士の写真）になります。
実行中以下のようなエラーが出ますが動作自体には問題ありませんでした。
```:出力
warnings.warn('User provided device_type of \'cuda\', but CUDA is not available. Disabling')
```
最後に以下のようなメッセージと共にastronaut_rides_horse.pngが生成されました。
```:出力
51it [43:23, 51.04s/it]
```
![astronaut_rides_horse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/0faf87e0-bd57-9bd4-0860-14e7c326ea82.png)
確かに火星で馬に乗っている宇宙飛行士の写真のようです。とはいえ出力からわかる通り43分23秒かかってしまいました。一応他のソフトウェアなどは起動せずCPU使用率も常時100%に近い状態を保っていましたがやはりかなり時間はかかってしまいます。
きちんとGPUを使用した方が実用的でしょう。
[小ネタ] Cognitoを使用してS3アクセスする際、AWS.CognitoIdentityCredentialsのidentityIdの取得にはまった話。

# 背景

結構前の自分の記事でCognitoのIDプールでユーザー毎フォルダにアクセスしていました。最近、このプロジェクトをVue2からVue3に移行したり、TypeScriptに変えたり、ログイン画面でAmplifyUIコンポーネントを使うように移行したりしました。

https://qiita.com/silverbox/items/7a7ef64401e15f62ee52

今回はTypeScriptの移行ではまった部分があり、原因と解消方法はシンプルだったのですが、なかなかそれらしき記事が無く時間かかってしまったので、同じ現象にはまっている方の手助けになればと思って小ネタ記事を書いてみます。

# エラー発生個所と解消方法

S3にアクセスする際、ユーザー毎のフォルダ制限はRoleにおいて`identityId`で指定します。
移行前のjavaScriptのソースは以下の感じです。

```javascript:移行前のソース（javaScript）
import AWS from 'aws-sdk'
const PROVIDER_KEY = 'cognito-idp.' + awsconfig.Region + '.amazonaws.com/' + awsconfig.UserPoolId
//・・中略・・
  // Initialize the Amazon Cognito credentials provider
  AWS.config.region = awsconfig.Region
  AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: awsconfig.IdentityPoolId,
    Logins: {
      [PROVIDER_KEY]: ${JWTトークン}
    }
  })
  var identityId = AWS.config.credentials.identityId
  var s3key = 'cognito/myhome-account/' + identityId + '/testfile.txt'

```

そのままTypeScriptとしてビルドすると以下エラーが発生します。

```console
TS2339: Property 'identityId' does not exist on type 'Credentials | CredentialsOptions'.
  Property 'identityId' does not exist on type 'Credentials'.

  > 75 |         const identityId = AWS.config.credentials.identityId;
       |                                                   ^^^^^^^^^^
```

CognitoIdentityCredentialsにはちゃんとidentityIdが存在します。

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html#identityId-property

# 原因

エラーメッセージを見るとわかりますが、`type 'Credentials | CredentialsOptions'`とあり、`AWS.config.credentials`は`CognitoIdentityCredentials`でなく`Credentials`である事が解ります。  
`CognitoIdentityCredentials`は`Credentials`の継承クラスでした。

# 対応

```typescript:修正部分（TypeScript移行済み）
const credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: awsConfig.Auth.identityPoolId,
  Logins: {
    [PROVIDER_KEY]: idToken
  }
});
AWS.config.credentials = credentials;
const identityId = credentials.identityId;
```

一度、`CognitoIdentityCredentials`クラスのインスタンスとして`credentials`を作成し、それを`AWS.config.credentials`に設定する事で設定を行い、identityIdの取得時にも`credentials`変数から取得する様にしました。

# まとめ

TypeScriptの型指定に引っかかったという話でした。javaScriptだとコンパイルエラーにもならず動作もするので最初凄く深く考えてしまいました。ちゃんとエラーメッセージをよく読んで何が起きているのか落ち着いて考えればもっと早く気付いたと思います。
やっとPowerShellとpdfuniteでフォルダ内のPDFを全て結合できた。

# 目的

+ フォルダ以内にある全てのPDFを一つのpdfに結合する。
+ フリーソフトの使用。
+ ファイル指定にワイルドカードを使用する。

# 環境
+ OS: Windows11 home (version 21H2 OSビルド 22000.856 )
+ Terminal: Windows Terminal (version 1.14.2282.0)
+ Shell: PowerShell (version 7.2.6)
+ 使用ソフト  popplerのpdfunite (version 22.04.0)
    + pdfuniteはCUIのフリーソフトです。
    + scoopでpopplerをinstall した。

# 使用想定
フォルダ内の全てのPDFを*.pdfで指定し、一つにまとめたPDFを同一フォルダ内にoutput.pdfで出力する。


# 成功例

PowerShellでは以下の 4つは成功し、一つになったoutput.pdfが作成された。

```powershell
pdfunite (ls *.pdf) output.pdf

pdfunite (dir *.pdf) ouput.pdf

pdfunite (Get-ChildItem *.pdf) output.pdf

pdfunite (Get-Item *.pdf) output.pdf
```


# 失敗例

```
pdfunite *.pdf output.pdf

I/O Error: Couldn't open file '*.pdf': No error.
Syntax Error: Could not merge damaged documents ('*.pdf')
```

cmd.exeでは以下も試したが、駄目でした。
```
pdfunite (dir /w *.pdf) output.pdf

I/O Error: Couldn't open file '(dir': No error.
Syntax Error: Could not merge damaged documents ('(dir')
```



# 感想

+ これで簡単にPDFを結合できる。
+ なぜかWindowsでは()が大事なようだ。
+ cmd.exeでは成功する方法はわかりません。
Walker_Commentを継承したクラスがうまく適用されなくて悩んだ話

## はじめに

Wordpressのカスタムテーマを1から作成しており，コメント機能の部分をカスタマイズしたいと考えていた．Wordpressで，記事へのコメントを独自のhtml構造で出力するには，以下のようにWalker_Commentを継承して，html5_comment()をオーバーライドするのが一般的だが，定義した内容でうまく出力されずに悩んでいた．

```php:classes/class-custom-walker-comment.php
<?php
class Custom_Comment_Walker extends Walker_Comment
{
    function html5_comment($comment, $depth, $args)
    {
?>
        <article class="comment-body">
            表示したいコメント構造など．
        </article>
<?php
    }
}
```

```php:function.php
require get_template_directory() . '/classes/class-custom-walker-comment.php';
```

```php:comments.php
<?php
if (have_comments()) {
    echo '<ol class="my-comments">';
    wp_list_comments(
        array(
            'walker'      => new Custom_Comment_Walker()
        )
    );
    echo '</ol>';
} else {
    echo 'No comments';
}
```

しかしながら，これがいつまで経っても適用されなかった...

## 結論

実は，html5_commentが呼ばれるためには，そのテーマがhtml5をサポートしていることが前提となる．従って，wp_list_comments()を呼び出すときに，明示的にフォーマットを指定しておく．

```php:comments.php
<?php
if (have_comments()) {
    echo '<ol class="my-comments">';
    wp_list_comments(
        array(
            'walker'      => new Custom_Comment_Walker(),
            'format'      => 'html5'
        )
    );
    echo '</ol>';
} else {
    echo 'No comments';
}
```

以上でうまく表示されるはずである．ちなみに，デフォルトではxmlフォーマットが適用されるようだ．

## 感想

自動でhtml5フォーマットをサポートしてくれればいいのに．
【入門】DjangoRestFrameworkとReactHooksでHello world表示 

<h2>はじめに</h2>
タイトルの通り、バックエンドにDjangoRestFramework、フロントエンドにReactHooksを採用してブラウザに「Hello world」を表示するだけのアプリを作ったのでアウトプットします。
<h2>環境</h2>

- Windows10
- Python 3.10.2
- Django==4.1
- djangorestframework==3.13.1
- django-cors-headers==3.13.0

## バックエンド

<h3>1. 環境構築</h3>
作業ディレクトリを作成して仮想環境を作成します。

```
$ mkdir backend
$ cd backend
$ python -m venv myvenv
$ myvenv\Scripts\activate
```
必要なライブラリをインストールします

```
(myvenv)　pip install django
(myvenv)　pip install djangorestframework
(myvenv)　pip install django-cors-headers
```

プロジェクトとアプリを作成します
```
(myvenv)　django-admin startproject project .
(myvenv)　django-admin startapp app
```
<h3>2. settings.py</h3>
INSTALLED_APPSに以下の３つを追加

```python:settings.py
INSTALLED_APPS = [
    'rest_framework',
    'corsheaders',
    'app',
]
```

MIDDLEWAREに以下を追加
```python:settings.py
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
]
```

CORS_ORIGIN_WHITELIST追加

```python:settings.py
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',
)
```
<h3>2. views.py</h3>
以下のサイトのFunction Based Viewsを引用させてもらいました。

https://www.django-rest-framework.org/api-guide/views/

```python:views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view()
def hello_world(request):
    return Response({"message": "Hello, world!"})
```
<h3>3. 動作確認</h3>
http://127.0.0.1:8000/app/hello_world

にアクセスすると{message:Hello world1}が取得できることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610435/cb672758-1660-7aa4-a26b-36379b83b2fc.png)

## フロントエンド
<h3>1. 環境構築</h3>

`npx create-react-app [プロジェクト名]`でプロジェクトフォルダを作成します。

```
$ npx create-react-app frontend
```
今回は以下のファイルを編集します

- src/App.js
- src/components/ApiFetch.js（新規作成）
<h3>2. ApiFetch.js（新規作成）</h3>

```react:ApiFetch.js
import React from 'react'
import { useEffect } from 'react';
import { useState } from 'react'

const ApiFetch = () => {
    const initialState = {"message": ""};
    const [message, setMessage] = useState(initialState);
    useEffect(()=>{
        fetch("http://127.0.0.1:8000/app/hello_world", {method: "GET"})
        .then(res=>res.json())
        .then(data => {setMessage(data)});
    }, [])
    return (
    <div>
            {message.message}
    </div>
  )
}

export default ApiFetch
```
<h3>3. App.js</h3>

```react:App.js
import './App.css';
import ApiFetch from './components/ApiFetch';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <ApiFetch />
      </header>
    </div>
  );
}

export default App;
```
## 動作確認
<http://localhost:3000/>にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610435/af93740c-a892-56c9-b381-8afbba8c3599.png)
iTerm2のカスタマイズで.zshrcを編集したら、Reactのnpm startできなくなった

iTerm2を以下を参考にカスタマイズをしていたら、Reactを起動できなくなった。
https://zenn.dev/nagan/articles/03af9bf1946c84

```
❯ npm start
zsh: command not found: npm

❯ yarn start
zsh: command not found: yarn
```

確かにzshを編集していた。
ただコマンドが使えないだけのよう…

{ホームディレクトリ}/.zshrc
に以下を追加

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

リロードしたら解決
```
source .zshrc
```
【Rails初心者】モデル同士の関連付け(Association)まとめ

## _【Rails初心者】Associationまとめ_
Markdown記法の学習もかねて、理解が浅い部分を自分なりにまとめてみた…

## 目次
1. ___Associationとは？___
2. ___必要な追記処理___
3. ___具体例___
4. ___まとめ___
5. ___参考サイト___

## 1.Associationとは？
異なる 2 つのモデルの間に、1:N の関連性を持たせること

## 2.必要な追記
対象の _model_ へ以下を記載する必要がある
- `has_many` 
- `has_many` に付随する `dependent: :destroy` 
- `belongs_to` 


## 3.具体例
例えば、Task管理を行うアプリがあるとする。
`user`と`task` の２つのモデルが 1:Nの関係の場合
それぞれのmodelに必要な要素を追加していく

~~~ruby:app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable

  #ここから下の部分(has_many以降)を追記
  has_many :task, dependent: :destroy

end
~~~

:::note warn
__Point__ 
- `has_many :task`
  - `has_many :task`について __「has_many」__ を日本語に直訳すると、 __「たくさん持っている」__ となる
    また、`app/models/user.rb`に`has_many :task`を記載しているため、
    `user`が`task`をたくさん持っているという考え方をする

- `dependent: :destroy`
  - dependent: :destroyを追加することで、
「親モデルを削除する際に、その親モデルに紐づく「子モデル」も一緒に削除できる」ようになる
今回の場合は、`user`を削除すると`user`に紐づく`task`も削除されるようになる
:::


~~~ruby:app/models/task.rb
class Task < ApplicationRecord
  belongs_to :user
end
~~~


:::note warn
__Point__ 
- `belongs_to :user`
  - `belongs_to :user`について __「belongs to」__ を日本語に直訳すると、 __「～に属している」__ となる
    また、`app/models/task.rb`に`belongs_to :user`を記載しているため、
    `task`は`user`に属しているという考え方をする

:::

## 4.まとめ
ModelとModelを紐づけることを、Associationといい、
Associationをするために、`has_many` `dependent: :destroy`　`belongs_to` を利用する！

記事の書き方について、見やすい記事を参考にブラッシュアップしないといけない…
見づらいや誤っている記載等あればコメント頂けると助かりますm(__)m

最終的には公式サイトから必要箇所を精査して、理解できるようになりたい！！

~~Pointに[note warn]使うのは良くない気もするが…~~



## 5.参考サイト
[Markdown記法 サンプル集 - Qiita](https://qiita.com/tbpgr/items/989c6badefff69377da7)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[[Rails] dependent: :destroy について](https://qiita.com/Tsh-43879562/items/fbc968453a7063776637#%E7%B5%90%E8%AB%96)
入門Docker 学習メモ

# Dockerとは
異なるサーバーの上で同じ仮想環境を再現できる便利ツール
Infrastructure as Codeとしての機能であるDockerfile" と "Image"で構成される。
Infrastructure as Codeはインフラ構成をコードに落とし込んだもの。
VMに比べて軽量で仮想化できて便利。

# 入門Dockerで学習する
Nginxとは…オープンソースのwebサーバー

> AlpineLinux…リナックスディストリビューションのひとつ
> リナックスディストリビューション…
 再配布・改変の自由を認めたオペレーティングシステムであるLinuxをパッケージ化したもの。カーネル、シェル、各種ドライバー、アプリケーションソフトなどがひとまとめになっている。
[Weblio辞書](https://www.weblio.jp/content/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

cat…ファイルのコマンドを表示する

## Component
### image
…特定の環境のスナップショット、わかりやすくいうと特定環境のコピー

> * Docker Imageは特定の環境のスナップショットで、Imageを起動することで環境を再現することができる
> * DockerHubから様々なDocker Imageを取得することができる
> * tagを指定することで特定のバージョン(とレジストリ)を使用することができる
[入門Docker](https://y-ohgi.com/introduction-docker/)

### dockerfile
imageを作成する元となるファイル

> * Dockerfileを記述してDocker Image を作成する
> * Docker Image はDockerレジストリへアップロードすることで容易に保管/配布ができる
> * Dockerfileは基本的に7個のコマンドの組み合わせで作成できる
[入門Docker](https://y-ohgi.com/introduction-docker/)

### Docker Container 
imageをもとに作成されるファイル

フォアグラウンド…バックグラウンドの反対、人間に見える一番前の部分。
> * コンテナは隔離された環境で実行される
> * Dockerコンテナは1つのコマンドを実行してプロセスを実行する
> * 基本的に「1コンテナ1プロセス」
> * ライフサイクルは実行されたコマンドがフォアグラウンド上で実行されている期間
> * バックグラウンドでプロセスが立ち上げられていてもフォアグラウンドでコマンドが終了したらコンテナは停止する
[入門Docker](https://y-ohgi.com/introduction-docker/)


### network
> * 1プロセス1コンテナ、複数プロセスはネットワークを通して通信を行う。
> * Bridgeを基本的に使用する。
[入門Docker](https://y-ohgi.com/introduction-docker/)


### volume
コンテナ上で作成されたファイルはコンテナの終了とともに消えるが、
volumeを使用することでデータを永続化できる。

> * データの永続化にVolumeを使用する
> * コンテナ間でVolumeの共有は可能
> * Dockerはエフェメラルになるような設計を求められるため、基本的にVolumeは使用しないことが好ましい。
[入門Docker](https://y-ohgi.com/introduction-docker/)
Windows 10のライブラリ「3D オブジェクト」を非表示にする

# Windows 10のライブラリ「3D オブジェクト」が邪魔
<span style="color: gray; ">（どーでも良いので読み飛ばし推奨。）</span>
もうWindows 11が世に出始めているのでかなり古い話にはなるが、Windows 10のライブラリに「3D オブジェクト」なるものが実装された。どういうものかは置いておいて、これの何が邪魔って、、、**ライブラリの種類が７つになったってこと**なんだよ…。
今まで横２列で表示するくらいの表示でやってきた私からすれば、６つから７つになる＝３列が４列になるってこと。それはつまり縦に長くなるので見栄えが大幅に変わるってこと！我慢ならぬ！（我ながらなんでやねん。）

# というわけで非表示にする方法
まず「3D オブジェクト」が表示されているワケ＝実体がどこにあるのかについて。
これはレジストリの以下のキーが該当する。
> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}

なのでこれを削除すれば良い。これで解決。簡単。
**（もちろんレジストリの編集になるので、バックアップは適宜取りましょう。）**

# バッチファイルにした
他人に説明するとこれ面倒なのよね。「なんで○○さんのとこにはコレないんですかぁ？わたしのも(ry」てなったのに説明しても理解しようともしないのはちょっとどうかと…。レジストリってなんだとかregeditを初めて見たとか。知らんわ。分からんなら君にはこの話は早かったってことで諦めなよ…。
閑話休題。のでコマンド化＆バッチファイル化しました。
**ただしバックアップはしてないので自己責任で。**
```batchfile:del-reg3d.bat
reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A} /f
```
高能力のプログラマが少数精鋭で作るほうが良いプログラムが出来るというが

- 高能力のプログラマが少数精鋭で作るほうが良いプログラムが出来るという。では何故どの組織でもそうしないのか。もし世の中の多くの組織が高能力のプログラマを雇おうとすると彼らを雇う値段は高騰する。するとやがて臨界点が訪れて低能力・低賃金のプログラマを雇う方が得をするポイントが訪れる。こうして市場の原理によって低能力のプログラマでも需要が保たれ続ける。
- 3000円かけて買った技術書が訳に立たなかった時の虚しさと言ったら。
- プログラムの挙動には正解があるが設計に正解はない。
- 本で学べることは世の中の1%。残り99%は実践だ。
- システム開発は巨大なゲームなので一生楽しめると思う。
- 文字情報を大量に目に入れた次の日に限ってひどく疲れている気がする。文字情報は体に悪い。
- 方法論より対話を優先せよ。
- Googleの無料ランチってそんなに嬉しいんだろうか。ランチぐらい自分で買って食べられるだろう。
- AはBであると思いついた途端にBではないかもしれないという反証を思いつく。
- 死ぬのが怖くなる夢を見る。体がしびれたまま人生の終わりを待つだけなのだ。本当に怖い。
- 当たり前だが読書で物事は習得できない。学習でさえない。ただ知識の入り口だ。
- Twitterでつぶやいて反応がないのはメンタル的にマイナスだ。だからTwitterはやらない。
- HOW TO系やビジネス系の邦書には呆れる。方法は書いてあるが根拠が書いていない。そもそもの主張を信じるに値する証拠が希薄なのだ。もしかしたらその方法は毒薬かもしれない。毒でこそなくてもメリットは妄想かもしれない。根拠薄弱なメソッドを実践するのは命がけだ。
- 大事なことを言うべきだが、言うと壊れる場合、言わない。
- 何故人間は鉱物より柔らかいのだろう。これでは鉄の部屋に閉じ込められたら自力では出られない。人間の意志が物質に阻まれるなどあってはならない話だと思う。

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
Visual Studio Codeでフォントサイズを拡大・縮小について

# 概要
今日はVisual Studio Codeでソースコードを拡大・縮小できるように設定について説明致します。
基本インストールだけではこの機能が動かないので、設定が必要です。

# Visual Studio Codeインストールについて
前の記事を参考してインストールをしてみてください。

https://qiita.com/neomi/items/f570677b0bfa2eebadcc

# 設定手順
まずはVisual Studio Codeを起動します。

①以下の画面のように「ファイル(F)＞ユーザー設定＞設定」選択または「Ctrl+,」キーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/d51e89b0-c281-cd5c-fba6-4b7962b7132c.png)

②次の画面の入力欄で「mouse」を入力した後「Enter」キーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e9b9b837-6fdc-e9e7-b0a3-fa7227db1acf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/60ae8fb8-e606-b188-4594-5ac77abb1a58.png)

③下記の項目にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/3de544a3-4ad9-3578-40d3-1fa746336b30.png)

④Visual Studio Code画面の「設定×」タブを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/b17fc141-9ea6-4f09-407a-278f56dd819f.png)

⑤次の画面で「ファイル(F)>新しいテキストファイル」メニューを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/8e824a49-35bc-0ab7-c5f8-43a207136eb1.png)

⑥以下の画面が表示されます。適当にテキストを入れてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/a8c85892-87cc-a887-67eb-88468282851f.png)

⑦次のテキストを書いた後、「CTRL+マウスフィールを上下に動かす」と記載されているコードが拡大されたり縮小されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/76670a8c-e226-cc45-3265-dc8006c9c4e4.png)

・拡大された画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/671a57f8-9dd6-5f5a-c3cd-c890ede39e0e.png)

・縮小された画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/9f3709b7-4e07-5464-f880-c8b68a5aaa21.png)

⑧設定はこれで完了です。

# 参考サイト
https://1-notes.com/visual-studio-code-mouse-wheel-zoom/

# 最後に
参考サイトより分かりやすいでしょうか？
よく使っている方ならすぐ分かるかもしれませんが、初めて使っている人がいると思いますので、画面を手順通りに貼り付けました。次は各ソースを開くと文字化けになるところを自動で該当文字コードで編集画面が表示されるように設定もしたいと思います。
未経験日大文系卒が学ぶ自然言語処理

## 初めに
どうも、python歴6カ月で、今年中に転職を夢見る者です。
ここ1~2週間当たり、自然言語処理を中心として学習しておりました。
その成果物を共有し、私と同じ境遇の他の方々の少しでも助けになればと思います。
モットーは｢俺でも分かるなら誰でも分かる｣です。
一般人向けの参考書やサイトを見て挫折した私ですが、出来る限り丁寧にまとめたつもりではあります。

### 環境
windows11 colab 


## 実装
### 難易度★☆☆☆
[自然言語処理①](https://github.com/Ken-huea/Language-processing/blob/main/%E2%91%A0%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E5%9F%BA%E6%9C%AC.ipynb)　⇒ 自然言語処理の最初の一歩。外観をなんとなく

[自然言語処理②](https://github.com/Ken-huea/Language-processing/blob/main/%E2%91%A1%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%81%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E8%A1%A8%E7%8F%BE.ipynb)　⇒ 続けてこちらもどうぞ。　こちらは単語をどのように数値化してPCに取り込むのかを考えます。


[Word2Vecの実装①](https://github.com/Ken-huea/Language-processing/blob/main/Word2Vec_%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB.ipynb)　単語をベクトル表現するword2Vecの実装を行ってみましょう。記事の取得からがっつり流れで行います。　[資料はこちら](https://github.com/Ken-huea/Language-processing/blob/main/5050_nlp_data%20(1).zip)

### 難易度★★☆☆
文章や単語をベクトル化して機械学習を行います。結果的にはその文章からどの記事ジャンルに割り当てられるのか、その単語から、どの記事ジャンルが近いのか。等を予測するモデルを作成します。　分類モデルの作成。訓練データは記事、テストデータは記事のジャンル。


[文章のベクトル化(mecab)](https://github.com/Ken-huea/Language-processing/blob/main/%E6%B7%BB%E5%89%8A%E8%AA%B2%E9%A1%8C_%E6%B8%85%E6%9B%B8%E7%94%A8%E2%91%A0_mecab.ipynb)  　 [資料はこちら](https://github.com/Ken-huea/Language-processing/blob/main/5050_nlp_data%20(1).zip)

[単語のベクトル化(janome)](https://github.com/Ken-huea/Language-processing/blob/main/%E6%B8%85%E6%9B%B8%E7%94%A8_janome%E2%91%A1.ipynb) 　 [資料はこちら](https://github.com/Ken-huea/Language-processing/blob/main/5050_nlp_data%20(1).zip)

こちらはネガポジ判定です。文章を投入して全体的にこの文章がネガティブ化ポジティブ化を判定する仕組みを作成しております。今回は例として芥川や歌詞を投入して調べています。
[極性辞書のcolab](https://github.com/Ken-huea/Language-processing/blob/main/%E6%A5%B5%E6%80%A7%E8%BE%9E%E6%9B%B8(Mecab)_%E6%B8%85%E6%9B%B8.ipynb)　[極性辞書データ](https://github.com/Ken-huea/Language-processing/blob/main/%E6%A5%B5%E6%80%A7%E8%BE%9E%E6%9B%B8.dic)　[sampleテキスト](https://github.com/Ken-huea/Language-processing/commit/65dcc29cec2d04061d998227edc2c470de5bbd0c)

### 難易度★★★☆

[極性辞書のcolab](https://github.com/Ken-huea/Language-processing/blob/main/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86_%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E5%88%86%E6%9E%90.ipynb)　[データ元資料](https://github.com/Ken-huea/Language-processing/blob/main/Airline-Sentiment-2-w-AA.csv)　　この回では英語のtweetとその内容がpositive/negative/neutral に分類されたデータがございます。このtweetからpositive/negative等のラベルを予測するモデルを作成しております。

## 終わりに
いかがでしょうか。
全体的に難しく、私も全てを理解して解説をしているわけではございません。
随時アップデートを重ねていくつもりですので温かく見守って頂ければと思います。


因みに以前はこのように<font color="red">時系列解析</font>をまとめておりました。この記事も思い入れがあり、採用担当者に胸を張ってお見せできる形を目指しております。ゆくゆくはこの自然言語処理も同じぐらいのクオリティになればと。

https://qiita.com/The_Boys/items/284b250869fb380bc125
負荷試験ツールk6の実行結果を読むときのメモ

## k6とは
Open Sourceの負荷試験ツール。
インストール手順や実行手順は既に良記事がたくさんあるので割愛。

https://k6.io/

## 実行結果の読み方
実行結果の各項目の意味は下記に記載の通り。

https://k6.io/docs/using-k6/metrics/

http_req_duration　≒　レスポンスタイムかと。

※ 公式の説明(Google翻訳)
リクエストの合計時間。これは、http_req_sending + http_req_waiting + http_req_recoming
 (つまり、最初の DNS ルックアップ/接続時間なしで、リモート サーバーが要求を処理して応答するのにかかった時間) に等しくなります。

## http_req_durationの種類
レスポンスタイムを見る時に知っておいた方が良い、統計学チックな用語が出てくるのでメモ。(本題)

| 単位 | 訳 |意味|
| ---- | ---- |---- |
| mean|平均値|データを全て足した合計値をデータ数で割った値|
| max|最大値|データの中で最大の値|
| med|中央値|データを昇順もしくは降順に並べた上で真ん中の順位に位置する値|
| min|最小値|データの中で最小の値|
| p90|90パーセンタイル|データのうち、悪いもの10％を除外した中の最悪値|
| p95|95パーセンタイル|データのうち、悪いもの5％を除外した中の最悪値|
RailsのStrongParametersについて 管理者権限を変更されないようにするため

## まずStrongParameterとは

StrongParametersとはMass Assignment機能を利用する際、起こり得る脆弱性へ対抗する手段の一つである。

## ではMass Assignmentとは

Mass Assignmentとはモデルの生成や更新の際に、Rubyのハッシュを使って一括で属性を設定できるとても便利な仕組みである。

以下はMass Assignmentを使用せずに個別に値を設定
```ruby
irb(main):001:0> book = Book.last
irb(main):002:0> book.name = "キングダム"
irb(main):003:0> book.price = 1980
irb(main):004:0> book.save
```

以下はMass Assignment機能を使用し、データを更新
```ruby
irb(main):001:0> num = {name: "キングダム", price: 2980}
irb(main):002:0> book = Book.last
irb(main):003:0> book.update(num)
```
上記の仕組みを使用することで複数の属性設定を簡単に記述することが可能になるが、不用意に使うとアプリケーションに脆弱性を出してしまう
具体的には意図しない変更をユーザーに許してしまう(管理者権限を付与してしまうなど)

これを防ぐためにある機能がStrongParametersである
StrongParametesはMass Assignmentで利用しても良いHashのkeyを許可リストとして定義しておくことで想定しないパラメーターを利用しないように制限する。

```ruby
  def update
    user = current_user
    # params[:user] => {name: "bob", email: "bob@example.com"}
    user.update(user_params)
  end

  private
  # 外部から渡されたパラメーターをそのまま使用せずに
  # 明示的に許可したキーのみを利用する
  def user_params
    params.require(:user).permit(:name, :email)
  end
```

このようにすることでpermitに許可されていないパラメーター、
例えばadmin=trueなどをリクエストに追加したとしても、モデルに渡す際にはadminパラメーターは許可されないので値を不正に
更新されなくなる。

この例では、
user.updateにparams[:user]をそのままではなく、user_paramsメソッドの戻り値を渡している。
そしてuser_paramsメソッドの中ではparamsからモデルの更新に利用しても良いパラメーターを明確にしている。
```ruby
# この部分が利用しても良いパラメーターを明確化
permit(:name, :email)
```

user_paramsの内容は以下である
・リクエストにはkeyが必要であること
・userの中で受付が可能なのは[:name,:email]であること

もし、requireに指定したパラメーターがparamsに含まれていなかったら「ActionsController::ParameterMissing」例外が発生する。

StrongParametersの条件を状況によって変更したい場合、
例えば管理権限のあるユーザーであればadmin権限を変更できるようにする

```ruby
  def update
    user = current_user
    # params[:user] => {name: "bob", email: "bob@example.com"}
    user.update(user_params)
  end

  private
  # 外部から渡されたパラメーターをそのまま使用せずに
  # 明示的に許可したキーのみを利用する
  def user_params
    if current_user.admin?
        params.require(:user).permit(:name, :email:, :admin)
    else
        params.require(:user).permit(:name, :email)
    end
  end
```

このようにすることで
管理者権限のあるユーザーは自分の権限を変更することができ、
管理者権限のないユーザーは権限を付与することができなくなる。
JAX/FlaxをAArch64で動かす

JAXは、pipを使用すると簡単にインストールできますが、（現状）ARM系CPUが乗ったマシンではエラーを吐きます。
いろいろ試行錯誤した結果、ソースファイルからインストールすると上手くいったので、個人的メモです。

## 0. この記事の前提

- Ubuntuコンテナ（Docker）上にJAXとFlax環境を整備します。
- 検証マシン：OCI, Ampere A1 Compute
    - GPU（CUDA）は使用しません
- Python3 / JupyterLabを使用

## 1. Dockerコンテナの作成

私が作成しているシェルスクリプトをもとに、Python3環境でJupyterLabが自動起動するUbuntuコンテナを作成します。
※自分の好みの環境が既にある方は、次の章にお進みください。

https://github.com/KaiSugahara/docker_template

```bash:bash @ホスト
# リポジトリのクローン
$ git clone https://github.com/KaiSugahara/docker_template.git
$ cd docker_template/jupyter/ubuntu/

# コンテナを起動するシェルスクリプトの実行
$ bash run.sh
作成したいコンテナ名を入力してください（入力例「your_name_ubuntu」）
> jupyter
コンテナユーザのパスワードを入力してください（入力は非表示になっています）
> （パスワードを入力する）
Jupyterに接続するためのポート番号を入力してください
> 22000
HTTP(S)_PROXYを入力してください（指定しない場合はそのままEnter）
> 
保存するイメージ名を入力してください（入力例「your_name/ubuntu」）
> jupyter
```

これだけで完了です。
（`22000:localhost:22000`でポートフォワーディングすれば）http://localhost:22000 でJupyterLabに接続できます。

ここからは、このUbuntuコンテナ上にJAX/Flaxをインストールします。
```bash:bash @ホスト
$ docker exec -it container_name bash
```
により、コンテナ上でコマンドを実行していきます。
（もしくは、JupyterLabで開くターミナルでもOK）

# 2. jaxlibとjaxのインストール

JAXのドキュメント内 "Building from source" に従って進めます。
https://jax.readthedocs.io/en/latest/developer.html

まずは、JAXのソースコードを落とします。
```bash:bash @コンテナ
$ sudo apt install git
$ git clone https://github.com/google/jax
$ cd jax
```

jaxlibをインストールします。（結構時間がかかるので気長に待ちます）
```bash:bash @コンテナ
$ pip3 install numpy wheel
$ python3 build/build.py
$ pip3 install dist/*.whl
```

jaxlibのインストールができたので、次はjaxです。
```bash:bash @コンテナ
$ pip3 install -e .
```

# 3. Flaxのインストール

まず、`cmake`が入っていない場合は、このあとエラーになるのでインストール。
```bash:bash @コンテナ
$ sudo apt install cmake
```

あとはpipでFlaxを入れます。
```bash:bash @コンテナ
$ pip3 install flax
```

以上で、完了です。お疲れさまでした！
[Salesforce]「制限付き選択リスト項目の値が不適切」エラー

## 前提
自分が調べた範囲では記載のなかった原因だったので、記録もかねて共有できればと考えた。

## エラーの内容
レコード挿入時、「INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST：制限付き選択リスト項目の値が不適切です」というエラーが表示された。

## よくある原因
- リストにない項目を設定している
→空白等がこっそり入っている可能性なども考え、リストからコピペしたがエラー
- レコードタイプに項目が反映されていない
→そもそもレコードタイプのないオブジェクト

## 今回の原因
エラーとなった選択リスト項目には**制御項目**が存在しており、制御項目の値を設定していなかった。

## 制御項目の調べ方
1. オブジェクトマネージャから該当のオブジェクトを開く
1. 「項目とリレーション」を**一覧表示の状態で**エラー項目を表示する
1. 「制御項目」欄にオブジェクトがあればそれが制御項目

## まとめ
エラー項目には制御項目があったので、そちらにも値を設定すれば解消された。
VMwareを使い、WindowsでmacOS環境を構築する(VMwareインストールまで)

# はじめに
大学時代に支給されたMacBookでiPhoneアプリを作っていたが、卒業し回収されてしまった。
Windowsしか持っていないが、またアプリを作りたくなったため、その開発環境を作っていこうと思う。
~PCスペック~
プロセッサ	Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz   3.60 GHz
実装 RAM	16.0 GB
エディション	Windows 11 Home

# VMwareのダウンロード
![ダウンロード1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/9bfd0129-a0ed-640e-4819-0893ff2a127c.png)
VMWareの公式サイト([https://www.vmware.com/jp/products/workstation-player.html]())
無償でダウンロードすることができる。

![ダウンロード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/5d43dc26-428f-49e3-82b7-46b34646ffae.png)
「GO TO DOWNLOADS」をクリックする。
![ダウンロード3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/7f2df599-2886-94bc-e5d5-a5c70caac644.png)
「VMware Workstation 16.2.4 Player for Windows 64-bit Operating Systems」を「DOWNLOAD NOE」をクリックし、ダウンロードを開始する。

「VMware-player-full-16.2.4-20089737.exe」がダウンロード出来たら起動する。
![インストール1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/0b9734a7-1e73-f145-7430-89b90eb90413.png)
システムの変更を承認した後、セットアップの最初の画面が表示されるため、「次へ」をクリックする。
![インストール2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/8c36b220-347a-1d73-477d-7aabe22461bc.png)
チェックボックスにチェックを入れた後、「次へ」をクリックする。。
![インストール3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/d49390b0-fbe0-e3a5-973a-4f90cee0fce0.png)
「拡張キーボードドライバ～」のチェックボックスにチェックを入れ、「次へ」をクリックする。
VMware上で稼働するWiondows上でPCのキーボードからWindowsにコマンドを使えるようになる。
これをインストールしないと、VMWareが稼働するPC本体側のWindowsにコマンドが送信されてしまう。
必要に応じてチェックにチェックを入れるかどうか判断する。

![インストール4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/575d25fe-4447-da7a-1310-175043027935.png)
「次へ」をクリックする。
![インストール5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/5b50faa6-f8ac-2b08-d8f0-1ae8e9603249.png)
「次へ」をクリックする。
![インストール6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/5ba8f80b-9656-6f03-0450-3643105043cd.png)
セットアップの準備が完了したので、「インストール」をクリックする。
![インストール7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/fdceaae9-79ee-57df-3b9b-62298e1e00f8.png)
この画面が表示されたらインストール完了。
「拡張キーボードドライバ～」のチェックボックスにチェックを入れたため、再起動を求められ再起動するとVMwareインストールまで完了。

# 次へ
記事が長くなってしまうため、インストール完了まででこの記事は終わろうと思う。
VMwareでのmacOS環境構築については次の記事で投稿する。
続きの記事

https://qiita.com/mikazuki_mitsutsuki/items/00832106ac611da95e0d

# 参考
https://qiita.com/qiita_mona/items/066d8f662409dd84c0d3
新版 エンジニアのための文章術再入門講座 を読んで、なるほどと思った要点

![510XJVfLWZL._SX351_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/1f63fe77-5070-4d39-af38-69834df835e1.jpeg)



## 読もうと思った理由
先日、情熱プログラマーを読んだ時に、エンジニアが文章術を学ぶのはコスパが良いことを知った。
ちなみに過去に『理科系の作文技術』や『考える技術・書く技術』などは読んだことあった。

実は別ジャンルの技術書も買っていたが、この本が先に届いたので先に読んでメモ残そうと思った。


## 学び
### 進捗遅れ
- 遅れは客観的に(客観的に示さないと分からない)
- 遅れの原因は論理的に(原因分析しやすいように)
- 遅れを取り戻せるか(明確に)
 
### 依頼を断る
- 自分都合で断ると不満・不信感がある
- 相手側の立場で考えてデメリットがないか考える
    - 依頼元の「手間、面倒」となる理由
    - 無理に進めた場合のリスク
    - 相手に判断していただく

### チャットスタイルでアイデアを集める
- グランドルールを書く
- 呼び水を書く
- 他の人の意見には素早く反応する

### その他
Amazonの商品ページで目次とか確認できるのでリンク貼っておく。
※アフィないです。
[リンク](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%96%87%E7%AB%A0%E8%A1%93%E5%86%8D%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E6%96%B0%E7%89%88-%E7%8A%B6%E6%B3%81%E5%88%A5%E3%81%AB%E3%81%99%E3%81%90%E5%8A%B9%E3%81%8F%EF%BC%81%E6%96%87%E6%9B%B8%E3%83%BB%E6%96%87%E7%AB%A0%E4%BD%9C%E6%88%90%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E8%8A%A6%E5%B1%8B-%E5%BA%83%E5%A4%AA-ebook/dp/B0854LWHGF?asin=B0854LWHGF&revisionId=&format=2&depth=1)
## まとめ
業界に入って数年経つと自然と出来ていると思うものもあった。その意味では新卒で読みたい本。
目新しいものはないですが、整理されていて手元には置いておきたい本なので購入してよかった。
オフラインでPythonライブラリをインストールする方法

会社や学校でPythonを利用する際、オフライン環境やプロキシの問題でライブラリをインストールできない状況に遭遇した方もいると思います。
本動画では、そのような状況を回避しながらインストールする方法をご紹介します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/w2U6B5AXI7A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

PCの不調でうまく録画できていなかったため、
仮想環境の構築方法を記載させて頂きます。
### 仮想環境の作成の仕方
```py
python -m venv env
.\env\Scripts\activate
```