OmniAICreator/Qiita-1.07M huggingface dataset:
NLP relation extraction library using a pre-trained model - 組み込みAI セルフサービス型デジタル共創体験(DSCE)

# 組み込みAI セルフサービス型デジタル共創体験(DSCE)とは

[組み込みAI セルフサービス型デジタル共創体験](https://qiita.com/trtrbohz/items/356a5a4b66624b2c94a2)に記載しておりますが、現在STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIがサーバーに接続しなくても組み込んで利用することが可能となりました。

その情報がこちらの[サイト](https://dsce.ibm.com/)、DSCE([Digital Self-Serve Co-Create Experience](https://dsce.ibm.com/);"組み込みAI セルフサービス型デジタル共創体験"？)にて紹介されております。

今回はそのDSCEの中から、「NLP keywords extraction library using a pre-trained model」 の実施方法を説明します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回は 「NLP relation extraction library using a pre-trained model」 
https://dsce.ibm.com/wizard/try/results/embed-nlp-relation-container-pt#try
この NLP relation extraction library は非構造化データを構造化された情報を抽出してその関係性を表示することを目的としています。例えば、文中に人名があるとその人名と組織や関連イベント等を抽出してくれます。
今回もPlotly社製のOSSウェブフレームワークDashを使いNLP( Natural Language Processing (自然言語処理)) を利用したウェブアプリを構築します。

# 1. 前提
* ターミナル環境
mac : ターミナルを使います。[ココ](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac) を見てターミナルを起動できるようにしてください。
windows : powershellを使います。[ココ](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3) を見てpowershellを起動できるようにしてください。
* リソース取得
下のURLにアクセスしリソースを取得します。
https://github.com/IBM/dsce-sample-apps/tree/main
※コード改変＆プルリクをするのであれば「git clone」コマンドを使うのですが、今回はソースコードの入手が目的ですので以下の様に Zip 形式でリソースを入手します。
![スクリーンショット 2023-08-12 22.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e97bd8bc-0767-b52e-9914-d11c0af69259.png)
リソース取得後、zipファイルを展開すると以下のようなフォルダ構成になっていると思います。今回はその中の[sentimet-analysis]配下にあるリソースを使用します。

# 2. 手順
# 2.1. [relation-extraction]フォルダに移動
* zipファイルを解凍した場所を起点として[relation-extraction]フォルダに以下のようにして移動します。

      cd dsce-sample-apps-main/relation-extraction

# 2.2. 必須ライブラリのインストール

      pip3 install -r requirements.txt

# 2.3. アプリ実行

     python3 relation-extraction.py

# 2.5. Access the local application
ブラウザを開き、[localhost:8050](localhost:8050) にアクセス
以下の様な画面が表示されます。
そこにはサンプル分文章とその抽出例が記載されており、マハトマ・ガンディーに関して関連情報の抽出をしております。

ご自身の文章を用いたい場合には、
1. 画面上部のテキスト欄に文章を入力してください。
2. テキスト欄右の「Extract relations」ボタンをクリック
3. 分析した結果が表示されます。

![スクリーンショット 2023-10-14 13.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/3f23434a-e21f-b156-e850-cbed19511bc7.png)



参照：[NLP relation extraction library using a pre-trained model
](https://dsce.ibm.com/wizard/try/results/embed-nlp-relation-container-pt#try)
初投稿です。Qiitaへの登録で悩みました。

# 初投稿です。Qiitaへの登録のメールアドレス認証ができず、2時間悩みました。

  Qiitaへの登録をPC端末でやり始めて、スマホでメールを受け取って、そのスマホ端末で登録しようとしたら、メールアドレス認証ができませんでした。

## 結果として
PC端末で登録しようとしたので、同じPC端末でメールを受取、そのメールで登録したらできました。

要は、セキュリティ上、最初の端末で登録した同じ端末で認証するように作られているみたいです。
php artisan view:cacheとview:clearって結局なに？

Laravelの`php artisan view:cache`コマンドと`php artisan view:clear`コマンドが何をやってるのか良く理解していなかったので、調べてみました。

### Laravelのテンプレートの自動コンパイル
Laravelのテンプレートファイル（bladeファイル）は大まかに以下の流れで実行される。
```mermaid
graph TD;
    コンパイル済みのテンプレートが存在するか-->存在する
    コンパイル済みのテンプレートが存在するか-->存在しない
    存在する-->現在のbladeファイルがコンパイル済みのテンプレートと一致するか
    現在のbladeファイルがコンパイル済みのテンプレートと一致するか-->一致しない
    現在のbladeファイルがコンパイル済みのテンプレートと一致するか-->一致する
    存在しない-->現在のbladeファイルからコンパイル
    一致しない-->現在のbladeファイルからコンパイル
    現在のbladeファイルからコンパイル-->テンプレートを実行
    一致する-->テンプレートを実行
```
※コンパイル済みのテンプレートは`/storage/framework/views`に保存されます。


### php artisan view:cacheでコンパイル済みのテンプレートを作成
上記流れで実行されますが、この処理には少なからず時間がかかってしまいます。
なので、予め全部のbladeファイルからテンプレートを作っておこう、というのが`php artisan view:cache`コマンドです。
このコマンドを実行すると現在の全bladeファイルからテンプレートが作成されて`/storage/framework/views`に保存されます。

### php artisan view:clearでコンパイル済みのテンプレートを全削除
`/storage/framework/views`に保存されているテンプレートを全削除したい時に`php artisan view:clear`を実行します。
CSSの変更が上手く反映されない時とかに実行するイメージですかね。

### 調べてみて
clear系のコマンドと一緒になんとなくで`view:clear`を実行してたけど、実行しなくて良い場面も多々あったなあと思いました。。。
ですが、実行したところで特に害はなさそうかな、と思います。
何か間違っているところがありましたらご指摘頂けますと幸いです。

### 参考
速習Laravel改訂2版 速習シリーズ（山田祥寛）
https://wings.msn.to/index.php/-/A-03/WGS-PHP-002/
開発に必要と感じた知識集め10/14~10/22

# 1.はじめに
+ チーム開発時に知っていればよかったなと思ったものを学習のテーマとする。
+ 書いた記事を都度リンクに追加する。

# 2.テーマ
+ Git, GitHub周りの知識
+ 通信周り
+ 並行処理（非同期処理）
+ OS周りの処理
+ UML図周り
+ 開発の一連の流れの理解
+ OOP周りの理解
+ デザインパターンの理解

# 3.リンク
### Git,GitHub系
### 通信系
### 並行処理（非同期処理）
### OS周り
### UML図
### 開発の流れ
### OOP系
### デザインパターン
# ex.参考文献
+ ChatGPT-3.5
+ [Recursion](https://recursionist.io/)
+ [Pythonドキュメント](https://docs.python.org/ja/3/index.html)
PicoCTF 2021 Mod26

# Mod 26
###### tags: `PicoCTF` `Cryptography` `2021`

## 問題
>暗号は簡単です。ROT13を知っていますか？

>Cryptography can be easy, do you know what ROT13 is?

問題サイト：[PicoCTF](https://play.picoctf.org/practice)
配布された文字列：cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}

## ROT13とは
以下のような特徴がある。
* シーザー暗号、単換字式暗号と呼ばれるものの一種で、アルファベットを後ろに13文字分ずらす処理。(ex. a → n, b → o)
* アルファベットのみが対象であるため数字や記号は変化しない。
* 変換前と変換後は大文字小文字が変わらない。(ex. a → n, A → N)
* アルファベットは26種類存在しているため2回ROT13の処理を行うと元の文に戻る。(26文字分ずらしたことになり丁度一周している)

## 解法
サイトでROT13について検索をかけると暗号化や解読ができるサイトが複数あった。それらを利用してもよいがせっかくなので自力でプログラムを組んで復号していく。

ROT13を復号するには、まずアルファベットであるか、真ならそれが大文字か小文字かを判別したあと、その文字のASCIIコードに13を足すことで元に戻すことを1文字ずつやればよい。

```python:solve.py
import string

flag = "cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}"
print(flag)

#文字列を1文字づつ分割してリスト化
flag = list(flag)

for i in range(len(flag)):

    #要素がアルファベットか否かを判別
    if flag[i] in string.ascii_letters:

        #大文字の場合
        if ord(flag[i]) < 97:
            base = 65

        #小文字の場合
        else:
            base = 97

        #13文字ずらす
        num = (ord(flag[i]) - base + 13)%26
        flag[i] = chr(num + base)

flag = ''.join(flag)
print(flag)
```

## 解答

```
$ python3 solve.py
cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}
picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}
```

復元成功
**picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}**
Hyper-V Server2019をWindows11のHyper-Vマネージャーに接続する

職場の環境に同じようなものがあったのでやってみたくなった。
これもうまくいかずだいぶハマった…

参考サイト
https://www.vwnet.jp/windows/WS16TP2/HVMan/Credential.htm

ドメインではなくWORKGRUOPで構築します。

Hyper-VServer2019は別PCに適当にインストール。
アップデートを行い、静的IPアドレス設定とリモデを有効にしておく。
PC名は変えたければ変えておく。

コマンド上でstart powershellと入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/21dec69a-5627-fa46-b54e-1b95fc9868ef.png)

PowerShellが開くので
 Enable-WSManCredSSP -Role Server -Force　と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/31f42399-f48f-e3b0-c3c8-cc13ce6e971b.png)


これでHyper-VServer側は完了

Windows11側の設定
設定でネットワークとインターネット、イーサネットからプライベートネットワークに変えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/cf5b9bf9-a5a6-70bf-0f0b-141b76109b33.png)

Windowsターミナルを管理者で実行PowerShellを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/5b73ab7b-007c-12de-a58a-dccfcad82373.png)

winrm quickconfig -Force　と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/8412af8a-15b2-3d8b-ffaf-b02fc7345c75.png)


Enable-WSManCredSSP -Role Client -DelegateComputer * -Force 
と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/3e16231a-8373-bf21-38cd-e497e698c331.png)

ローカルグループポリシーエディタを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/86a8ca2d-679f-3fa1-68f6-bedb15a3909d.png)

[コンピューターの構成]-[管理テンプレート]-[システム]-[資格情報の委任][NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効、値を＊にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/177a02aa-cfdd-426a-09fb-fccb4c6b98b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/45d68e10-5c3f-8515-9f59-0ae908b08e87.png)


[コンピューターの構成]-[管理テンプレート]-[システム]-[資格情報の委任][NTLM のみのサーバー認証で保存された資格情報の委任を許可する]を有効、値を＊にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/0281cefa-7b87-9934-7358-a63bff4a82f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/a980379d-d1a4-b896-dd00-4b34cabdcd8d.png)


Windows11のHyper-Vマネージャーからサーバを接続を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/193315ed-0556-a971-a887-19d027f56a72.png)

別のコンピュータでHyper-VServer側のPC名を入力
別のユーザーとして接続するにチェックしユーザーの設定を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/5efce1ac-fab1-3aa1-1a3c-d97c1cbf2d73.png)

資格情報を入れる
デフォルトなら
.￥administrator
パスワード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/3f42ffa7-83e0-1685-27e7-e9f486d0d10e.png)

これでOKを押下


接続できた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/f9cbb792-13d7-2f11-6da1-c1474ea638f2.png)


ちょっと手順は忘れたがサービスでWindowsリモートマネジメントサービスを有効にしたと思う。あとC:\Windows\System32\drivers\etc\hosts にIPとサーバのPC名を書いたと思う
場合によってはファイアウォールの穴あけも必要かも…

次はドメインを組んでやりたい。
というかそっちの方が正しいのかな…
応用情報技術者試験　勉強法　午前試験

#  はじめに
応用情報技術者試験に合格するコツを、実体験からまとめます。
私は一度目の受験で午後試験不合格、二度目の試験で合格しました。
合格点数は午前試験、午後試験ともに8割前後です。

合格年度は2022年春期です。
前提として、私は新卒未経験からSES会社に就職、
エンジニア歴1年弱で基本情報技術者試験(2021年内)に合格しました。
そのため、この記事は基本情報技術者試験レベルの知識を持っている方向けです。

# 午前試験対策
どんなサイトにも書いてあると思いますが、ひたすら過去問を解きました。
私は「キタミ式イラストIT塾 応用情報技術者」のテキストを一周読んでから、
応用情報技術者過去問道場で繰り返し練習しました。
解いた過去問は、過去5年分です。(10試験分)

https://www.ap-siken.com/apkakomon.php


解けなかった問題は、テキストで復習して解説まで理解すると、
午後試験にも応用できる知識が身に付きます。


# 当日の感想

最新のITトレンドに関する問題等、予想できないものは解くことができませんでした。
過去問にしっかりと取り組んでいれば、7割越えは狙えます。
過去問6割〜7割、過去問で得た知識を応用する問題2割、最新のITトレンド問題が1割~2割ほど出題されているのが体感です。

合格するために、確実に点数を取れる過去問対策に勉強時間を当てていきましょう！
オブジェクト指向についてまとめてみた

# はじめに
オブジェクト指向という概念が自分も含め難しいく奥が深いので、自分なりに要約してみました。
はじめてこの概念を聞いた方に簡単にまとめたので参考にしていただけたらなと思います。



# 前提知識

### オブジェクトとは

JavaScriptにおけるオブジェクトとは、データや処理を一つにまとめてあるもの。

### JavaScriptのデータ

JavaScriptのオブジェクトの中でいうデータとは変数のことであり、この変数の中にプロパティというハッシュ形式（キーとバリューの組み合わせ）で格納されている。

```jsx
変数名 = {キー: バリュー}
        |  プロパティ  |
```

### JavaScriptの処理

JavaScriptのオブジェクトの中でいう処理とはメソッドと呼ばれている。メソッドとはプロパティに紐づけられた関数のことであり、関数宣言や関数式、アロー関数によって定義された一個一個の処理のことを指す。

```jsx
// 関数式
変数 = function( 引数 ){
  // 関数内の処理
}
```

# オブジェクト指向とは

いくつもの変数や処理をひとまとめにしことを中心に意識しながらアプリケーションなどを実装する設計思想のこと。

一連の処理であったり、データの集まりに名前をつけてテンプレート化しておくイメージ。

# メリット

• 役割ごとにオブジェクトを分けることで、実装がしやすくなる

• 役割ごとにオブジェクトを分けることで、あとからコードを改変するときも、他のオブジェクトに影響しなくなる（コードの改変がしやすくなる）

# 関数とオブジェクトの違い

関数は一つの処理を定義したもの。

オブジェクトとはそれら一つ一つの処理から作られる一連の処理や処理に必要なプロパティをひとまとめにしたもの。
Clang&CMakeでuefi.hを使う

:::note warn
この記事は色々書き足りない、不親切な状態なので編集リクエスト等お待ちしております。そして不完全な記事でごめんなさい。
:::
## はじめに
この記事は[前回の記事](https://qiita.com/DanfuncL/items/b037c844e541a3970fd4)の続きです。EDK2からUEFIヘッダー部分だけ抜き取って使いたい人向けの記事です。よろしくお願いします。

## 前提知識
CMakeでtarget_include_directories()を使います。

[みかん本]:https://www.amazon.co.jp/ゼロからのOS自作入門-内田-公太/dp/4839975868
[EDK2]:https://github.com/tianocore/edk2

:::note warn
この記事ではEDK2の機能すべてを使用することはできません。
具体的にはまずプロトコルガイドが使えません。[みかん本]のサンプルコードにはプロトコルガイドを使っていますがそれは別でEDKがプロトコルガイドのメモリ領域を確保しているため使用することができます。この記事の方法に加えて自分でプロトコルガイドをソースコードの中等で作成しておく必要があります。
その他使えない機能があったらコメントで教えてください。
:::

## EDKからヘッダーファイルを引っこ抜く
[EDK2]をダウンロードします。[EDK2/MdePkg/include](https://github.com/tianocore/edk2/tree/master/MdePkg/Include) フォルダを引っこ抜きます。自分のOSとかのディレクトリとかに置いておきましょう。
## インクルード設定をする
```cmake
target_include_directories(アプリのターゲット名 PRIVATEとか 引っこ抜いたフォルダ 引っこ抜いたフォルダ/ターゲットのアーキテクチャ)
```

:::note warn
引っこ抜いたフォルダだけでなく、ターゲットのアーキテクチャ名のフォルダもインクルードディレクトリに追加してください。アーキテクチャ依存のヘッダ(例えば型定義など)がインクルードされません
:::

## おわり
正直かなり記事の内容が不十分だと思いますが適当に[これ](https://github.com/danfunc/uefi-application-with-Cmake)でも参考にしてあーだこーだしてください。そして記事をあげてください(懇願)
記事をあげたらコメントとかTwitterとかで教えてくれると嬉しいです。ここまで読んでいただきありがとうございました。
【AWS】CodeBuild実行時にCannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?となる


## やったこと

- AWS CodeBuildでDockerイメージのビルドを実行

## エラー内容

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

## 原因



## 解決法

- 下記手順に従い、CodeBuildの環境設定で特権モードにチェックをいれる

[Error: "Cannot connect to the Docker daemon" when running a build (ビルドの実行時に「Docker デーモンに接続できません」)](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/troubleshooting.html#troubleshooting-cannot-connect-to-docker-daemon)

> By default, Docker containers are "unprivileged" and cannot, for example, run a Docker daemon inside a Docker container. This is because by default a container is not allowed to access any devices, but a "privileged" container is given access to all devices
> 
> デフォルトでは、Docker コンテナには「特権がありません」ので、たとえば、Docker コンテナ内で Docker デーモンを実行することはできません。これは、デフォルトではコンテナはどのデバイスにもアクセスすることを許可されていませんが、「特権」コンテナにはすべてのデバイスへのアクセスが与えられるためです。

とのことで、Dockerイメージのビルドを行うCodeBuildのコンテナは特権モードで動いていないようである。
そのため、コンテナを特権モードで起動する必要がある。

## 参考

- [Runtime privilege and Linux capabilities](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)
Googleアナリティクス認定試験対策3

googleアナリティクス認定試験合格に向けて、理解度テストの内容をまとめる

#### アナリティクスのプロパティの設定
前投稿のおさらいとして、、、
**プロパティ**はアプリやサイトから収集したデータに基づいて作成されたレポートのコンテナ。**データストリーム**はプロパティ内にあり、アプリやウェブサイトからデータを取得する際のソースとなる。

ウェブサイトでユニバーサルアナリティクスをすでに使用している場合、新しいGoogleアナリティクス4プロパティを設定しても、引き続き既存UAプロパティを使用できる。

#### アナリティクスで必要な情報を測定する
アナリティクスではデータをイベントとして収集することで、アプリとウェブのデータが同じディメンションと指標を使ってレポートにまとめられる

基本的なインタラクションはGoogleアナリティクスのイベントとして自動的に収集される。
拡張計測機能を有効にすることで、Webサイトのコードを修正しなくてもより多くのイベントを自動的に収集できる。（ページビュー、スクロール、ファイルのダウンロード、動画の視聴など）

アナリティクスでは、イベント、イベントパラメータ、ユーザープロパティといったユーザーインタラクションに関連するデータを収集しレポートにまとめる。データをレポートで表すのに、ディメンションと指標を使用する。
**ディメンション**は「誰が何をどこで」という疑問に答え、**指標**は数量に関する情報を表す。
自分で作成するカスタムディメンションとカスタム指標がある。ディメンションと指標にはスコープを設定する必要があり、スコープにはイベントスコープとユーザースコープの2種類がある。
ウェブサイトやアプリで発生しているイベントに関する特定事象の測定・・・イベントスコープ
ウェブサイトやアプリとユーザーのインタラクションに関する特定事象の測定・・・ユーザースコープ
（カスタム指標にはイベントスコープしか使用できない）


ユニバーサルアナリティクスではセッションがレポートの基盤となる。
セッションとは特定時間枠にウェブサイトで発生した一連のユーザーインタラクティブ。
GA4はイベントベース。
デスクトップやエクスプローラのアイコン表示がおかしくなった場合の対処方法

# 内容
　Windows10やWindows11を使用していたら，デスクトップやエクスプローラのアイコン表示でおかしな現象が起きた。時系列的には2が先に起きて解決できず，放置していた。今回，1を解決したら，過去起きた2も解決できた。
「おかしな現象」
１．新規作成メニューのテキストドキュメントのアイコンマークが黒色になった(Windows11)。
２．デュアルモニタ環境でデスクトップアイコンがモニタ1とモニタ2に分かれてしまう(Windows10)。

## 原因
　両方ともに言える原因は，Windowsのデスクトップやエクスプローラのアイコンキャッシュ※が壊れている(参考URL1参照)からと分かった。
※アイコンキャッシュ：アイコンを素早く表示するためにまとめて管理しているキャッシュ(一時)ファイル。

## 対策
1. 1に対する対策
   　下記コマンドをバッチファイルに記載後，バッチを実行してアイコンキャッシュを削除する(以下参照)。
   ```bat:deleteIconcache.bat
   rem 「%userprofile%」：現在，使用している人のアカウントフォルダを表す環境変数で，「C:\Users\ユーザー    名\」が自動で入力。
   cd %userprofile%\AppData\Local\Microsoft\Windows\Explorer

   rem エクスプローラで使用されるアイコンキャッシュファイルを検索して削除。
   del iconcache_*.db

   rem PCを1分後に再起動
   shutdown /r /t 60
   ```
2. 2に対する対策
   　1が終了後，以下の手順を実行する。
   1. 「アイコンの自動整列」と「アイコンを等間隔に整列」のチェックボックスを外す。
   1. すべてのアイコンをモニタ1に移動。
   1. ディスプレイを「1のみに表示する」に設定後，再起動する。
   1. ディスプレイを「表示画面を拡張する」に設定後，再起動する。



# 動作環境
OS：Windows11 Pro
Ver:22H2(OSビルド22621.2428)

# 参考URL
1. [アイコンの表示が変になったら](https://www.sakura-pc.jp/pc/ct/trouble/iconcache.html "アイコンの表示が変になったら")　(2023/10/14時点閲覧可能)
1. [デュアルモニタのWindows10環境で、デスクトップアイコンがモニタ2に表示されてしまう](https://belhb.hateblo.jp/entry/2021/09/30/101040 "デュアルモニタのWindows10環境で、デスクトップアイコンがモニタ2に表示されてしまう")　(2023/10/14時点閲覧可能)
obnizでタクトスイッチ制御メモ


Node.jsから制御してます。

## 抵抗なしでプルアップ

obnizのプルアップ機能を使います。

```js
const Obniz = require('obniz');
const obniz = new Obniz('1234-5678'); //Obniz_ID

obniz.onconnect = async () => {
    obniz.io0.pull("5v"); //IO0をプルアップ
    obniz.io1.output(false); //IO1をGNDに
    
    obniz.io0.input(function(value){
        console.log("changed to " + value);
    });
}
```

## 抵抗入れるパターン

```js
const Obniz = require('obniz');
const obniz = new Obniz('1234-5678'); //Obniz_ID
    
obniz.onconnect = async () => {
    obniz.io0.output('5v');
    obniz.io1.output(false);

    obniz.io2.input(function(value){
        console.log("changed to " + value);
        obniz.display.clear();
        obniz.display.print(value);
    });
}
```

## プルアップダウン抵抗入れたパターン

```js
const Obniz = require('obniz');
const obniz = new Obniz('1234-5678'); //Obniz_ID
    
obniz.onconnect = async () => {
    obniz.io0.output('5v');
    obniz.io1.output(false);
    
    obniz.io2.input(function(value){
        console.log("changed to " + value);
        obniz.display.clear();
        obniz.display.print(value);
    });
}
```

## 参考

- タクトスイッチ

https://deviceplus.jp/arduino/arduino_f06/

- obnizのプルアップダウン
https://docs.obniz.com/ja/reference/common/io/pull-up-down
Google Bard を使ってみた（回答の著作権について聞いてみた）

# はじめに
[Google Bard](https://bard.google.com/) とは、Googleが開発・提供している会話型人工知能であり、現在は試験運用版が一般公開されている。

いろいろ使ってみるにあたり、そういえば回答の著作権ってどうなるんだ？　と思って、直接本人（？）に聞いてみた。
そのやりとりをメモとして残しておく。

# やりとり

- 私の質問：

>Bardの回答の著作権はどうなりますか？

- Bard の回答：
>Bardの回答の著作権は、Google AIに帰属します。Bardは、Google AIが開発した大規模言語モデルであり、その回答はGoogle AIの知的財産です。
>
>Bardの回答は、著作権法によって保護されています。著作権法により、著作権者は、その著作物の複製、公衆送信、翻訳などの利用を独占的に許諾する権利を有します。
>
>したがって、Bardの回答を利用する際には、Google AIの許諾を得る必要があります。許諾を得ずにBardの回答を利用する行為は、著作権法に違反する可能性があります。
>
>ただし、著作権法には、著作物の引用や公正な利用などの例外規定があります。これらの例外規定に該当する場合は、Google AIの許諾を得なくても、Bardの回答を利用することができます。
>
>具体的には、以下の場合に、Bardの回答を利用する際にGoogle AIの許諾を得る必要はありません。
>
>- 引用する目的で、Bardの回答の一部を引用する場合
>- 報道、批評、解説などの目的で、Bardの回答を利用する場合は、引用の要件を満たしていれば、著作権者の許諾を得なくても利用できます。
>- 教育、研究などの目的で、Bardの回答を利用する場合は、公正な利用の要件を満たしていれば、著作権者の許諾を得なくても利用できます。
>
>なお、Bardの回答を利用する際には、著作権法の規定を遵守し、Google AIの権利を尊重することが重要です。


ふむふむ。
なるほどなるほど。
「引用」の範囲ならいいけど、丸ごと利用したい場合は許諾がいるってことか。
じゃあ、本人（？）に許諾もらってみよう。

- 私の質問：
>Bardの回答を利用する許諾をください。

- Bard の回答：
>かしこまりました。Bardの回答を利用する許諾をいたします。
>
>ただし、以下の条件を遵守してください。
>
>- Bardの回答を利用する際には、著作権法の規定を遵守し、Google AIの権利を尊重してください。
>- Bardの回答を利用する目的を明確にし、その目的に沿って利用してください。
>- Bardの回答を利用する際には、Google AIの商標やロゴを表示しないでください。
>
>これらの条件を遵守していただければ、Bardの回答を自由に利用することができます。
>
>なお、Bardの回答を利用する際には、以下のような方法で利用することをお勧めします。
>
>- Bardの回答を引用する際には、引用の要件を満たしていることを確認してください。
>- Bardの回答を報道、批評、解説などの目的で利用する際には、引用の要件を満たしていることを確認してください。
>- Bardの回答を教育、研究などの目的で利用する際には、公正な利用の要件を満たしていることを確認してください。
>
>また、Bardの回答を利用する際には、以下の点にご注意ください。
>
>- Bardの回答は、あくまでも参考情報であり、その内容の正確性や完全性については保証されません。
>- Bardの回答は、Google AIの知的財産であり、著作権法によって保護されています。
>
>これらの点にご注意いただき、Bardの回答を適切に利用してください。

おお！
即断即決で許諾をいただけた。
でも、目的を明確にということなんで、一応明確に伝えておこうか。

- 私の質問：
>Bardの回答を、Qiitaの私の記事にそのまま丸ごと記載する許諾をください。

- Bardの回答：
>かしこまりました。Bardの回答を、Qiitaのあなたの記事にそのまま丸ごと記載する許諾をいたします。
>
>ただし、以下の条件を遵守してください。
>
>- Bardの回答を利用する際には、著作権法の規定を遵守し、Google AIの権利を尊重してください。
>- Bardの回答を利用する目的を明確にし、その目的に沿って利用してください。
>- Bardの回答を利用する際には、Google AIの商標やロゴを表示しないでください。
>- あなたの記事に、以下の表記を追加してください。
>[引用]
>この回答は、Google AIが開発した大規模言語モデル「Bard」によるものです。
>Bardの回答の著作権は、Google AIに帰属します。
>この回答を利用する際には、著作権法の規定を遵守し、Google AIの権利を尊重してください。
>
>これらの条件を遵守していただければ、Bardの回答を自由に利用することができます。
>なお、Bardの回答を利用する際には、以下のような方法で利用することをお勧めします。
>
>- Bardの回答を引用する際には、引用の要件を満たしていることを確認してください。
>- Bardの回答を報道、批評、解説などの目的で利用する際には、引用の要件を満たしていることを確認してください。
>- Bardの回答を教育、研究などの目的で利用する際には、公正な利用の要件を満たしていることを確認してください。
>
>また、Bardの回答を利用する際には、以下の点にご注意ください。
>
>- Bardの回答は、あくまでも参考情報であり、その内容の正確性や完全性については保証されません。
>- Bardの回答は、Google AIの知的財産であり、著作権法によって保護されています。
>
>これらの点にご注意いただき、Bardの回答を適切に利用してください。
>
>なお、Qiitaの投稿ポリシーには、以下のような記載があります。
>
>- 投稿は、投稿者が作成したものである必要があります。
>- 他者の著作物を転載する場合は、引用元を明記し、投稿者が作成したものと誤解されるような表現は避けてください。
>
>これらのポリシーを遵守して、Bardの回答をQiitaの投稿に利用してください。

ちゃんと許諾を得られた、ということでいいかな？

# 終わりに
無事許諾も得られたようなので、メモとして全部丸ごと載せておく。参考となれば。

# Bard の回答部分について
上記のBardの回答は、Google AIが開発した大規模言語モデル「Bard」によるものです。
Bardの回答の著作権は、Google AIに帰属します。
この回答を利用する際には、著作権法の規定を遵守し、Google AIの権利を尊重してください。
Googleアナリティクス認定試験対策2

googleアナリティクス認定試験合格に向けて、理解度テストの内容をまとめる

#### ビジネスに適したアナリティクスアカウントの設定
**アナリティクスアカウント**
アナリティクスには、アナリティクスアカウントからアクセスする。1アカウントに複数のプロパティを格納できるが、1つのプロパティを複数のアカウントに格納することはできない。

↓↓↓

**プロパティ**
プロパティはアカウント内にあって、測定対象のアプリやサイトに対応する構造。収集したデータとそれを扱うプロパティが格納されている。アナリティクスはこのレベルでデータを処理し、Google広告などの他のサービスと連携する。
特定のブランドや地域など、詳細な分析の対象とするユーザーベース毎に別々のプロパティを使用する。
    :point_up:User-ID機能：ログインユーザに独自の永続ID（User-ID）。複数デバイスにおけるユーザー行動経路を測定できる。User-IDを有効化するには、IDをデータと共にアナリティクスに送信する必要がある。
    :point_up:Googleシグナル：Googleにログインしているユーザーから収集したデータを使用する。Googleシグナルを有効にすると、サイトに訪問したユーザーから収集したイベントデータを、情報の共有に同意したログインユーザーのGoogleアカウントに関連づける。Googleシグナルを有効化するには、プロパティ設定から行う。
    :point_up:デバイスID：ユーザーのブラウザやアプリインスタンスIDから取得する。アナリティクスではデバイスIDが自動的にID空間として使用される。

User-ID>Googleシグナル>デバイスIDの順でデータを検索し、同じID関連づけられたデータからユーザー行動経路を作成する。複数のID空間を使用することにより、ユーザーの重複が排除され、クロスデバイスやクロスプラットフォームのデータとレポートがより充実したものになりインサイト改善につながる。

↓↓↓

**データストリーム**
データストリームはプロパティ内にある。アプリやサイトからデータを取得する際のソースになる。プロパティには1つ以上のデータストリームを設定できる。

#### まとめ
アカウントには1つ以上のプロパティが、プロパティには1つ以上のデータストリームが含まれる。
各プロパティは特定のユーザーベースを表す。
利用可能なすべてのID空間を有効化することで、クロスデバイスデータからユーザー重複のないレポートを作成できる。
ReactのプロジェクトをエックスサーバーにUP

package.jsonに下記を追加。
```
"homepage": ".",
```

npm run buildを実行
```
npm run build
```
これにより、buildというディレクトリが生成される。
あとは、これをpublic_htmlにFTPツールなどでアップすればOK.


(ドメイン)/buildにアクセスするとReactで作ったものが表示される。
AWSでサーバーレスWordpress作りに挑戦

筆者について
Qiitaに記事書いたことほとんどなし、Markdown記法はTBA（ごめんなさい）
インフラエンジニア5年生
Docker初学者
EC2-RDS-CDNを活用したWebサイト作りの実務経験有り
サーバーレスってなんぞ？？もしかして…遅れてる…！？というお気持ちで学習中。
ガンダムEXVSシリーズとATLUSゲーが好き。対戦よろしくお願いします。

やりたくなった経緯
ローカルで開発したテストサイトをシームレスに公開したい
開発と公開の基盤構築工数を削減することで、開発者にはより開発に専念してもらいたい

目的
開発と公開に付帯する基盤構築コストの削減
コンテナオーケストレーションを活用してメンテナンスコストを削減
サーバーレスへの挑戦

構成
ローカル
Docker
Wordpress
MysqlDB

パブリッククラウド（AWS）
ECS（Fargate）
Wordpress
MysqlDB

スタート時の疑問点
画像を外部ストレージ（S3）へ格納可能か
Cloudfrontは利用可能か（そもそも必要か）
Wordpressへ導入したプラグインは残るのか
基盤運用的な観点（バッチ処理、ログ取得、ミドルウェアアップデートなど）はどこまでカバーできるか
スケーリングはどの程度可能なのか、またテスト方法
費用はどの程度になるのか、EC2との比較も取りたい


以下、12月末完了を目標とし、
実装と並行して執筆していく（予定）
今更ながらfmpプロトコルについて考えてみる

# URL を使用してファイルを開く
昔からあるURL を使用してファイルを開く（fmpプロトコル）について備忘録です。
改めて読んでると少し変わった？？？
[URL を使用してファイルを開く](https://help.claris.com/ja/pro-help/content/opening-files-url.html)
```
クライアントマシンで Web ブラウザを起動します。
  ブラウザのアドレス領域に、上記の URL 形式の最初の部分を使用してファイルの URL を入力します。

       ・ Claris クライアント: claris://{アドレス/}ファイル名

    　 ・FileMaker クライアント: fmpXX://{{アカウント:パスワード@}アドレス/}ファイル名
```

増えてる...
驚愕の事実...
というかルールも変わってない？？？

## 動かなくなったプロトコル
今回当たったのは、カルテを起動したらfmpプロトコルが走ってURLをキックすることでFileMakerのサブカルテが開く仕組みになってたぽい。

けど何故かIEが死んだぽくてedgeじゃ、URL を使用してファイルを開くが効かない。
何故？？？？？？
誰か教えて。
Win11になったらIEないじゃん？皆どうやってるの？？？？


### 代替品、代用品を考えていく。
今回は、PowerShellで作ってみたい。
カルテを開いた際に、ローカルフォルダにテキストデータ出るからそれを監視して更新されたらfmpプロトコルをキックする仕組みをつくりたい。

```
# 監視対象のファイルとURL
$watchedFile = "C:\user\folder\sample.txt"
$baseUrl = "claris://$/dbname.fmp12"

# 初回のファイル更新日を取得
$lastModifiedDate = (Get-Item $watchedFile).LastWriteTime

# 無限ループでファイルの変更を監視
while ($true) {
    # ファイルの更新日を取得
    $currentModifiedDate = (Get-Item $watchedFile).LastWriteTime

    # ファイルが更新された場合
    if ($currentModifiedDate -ne $lastModifiedDate) {
        # コメントを表示
        Write-Host "ファイルが更新されました."

        # URLを構築して実行
        $url = "$baseUrl"
        Start-Process $url

        # 最後のファイル更新日を更新
        $lastModifiedDate = $currentModifiedDate
    }

    # 更新をチェックする間隔（秒）
    Start-Sleep -Seconds 1
}

```
本来は、テキストデータをごにょごにょしてますが割愛しました。(笑)
これで開いたけど...
Win11なら動くのか？？？
全然わからないや。
今度実験してみます。

PowerShellっていいよね。(笑)
Googleアナリティクス認定試験対策

googleアナリティクス認定試験合格に向けて、理解度テストの内容をまとめる

#### アナリティクスを導入するには
カスタマージャーニーに関するインサイトを得るために、それぞれ以下を利用してビジネスとアナリティクスを結びつける必要がある。
**ウェブサイト→Googleの動的なタグつけソリューション**（:stars:グローバルサイトタグor:city_sunset:Googleタグマネージャー）
    ※タグはピクセルやスペニットとも呼ばれる、Webページに存在する小さいコードを指す。
    　ユーザーが特定のアクションをすると、タグがトリガーされる。

:stars:グローバルサイトタグ設定がおすすめ
    ウェブサイトで直接JabaScriptをコーディングしてタグ管理がしたい場合
    ウェブサイトに少数の簡単なタグだけを設定し頻繁に編集したりデプロイする予定がない場合

:city_sunset:Googleタグマネージャー設定がおすすめ
    簡単にタグ管理ソリューションを導入したい開発未経験者などの場合
    1つの管理画面で複数のインフラ全体を無料でタグ管理を希望する場合


**アプリ→Firebase SDK**
SDK=software development kit,インストール可能な単一のパッケージにソフトウェア開発ツールをまとめたもの
Firebaseとは、Googleのモバイルアプリ開発プラットフォーム。アプリのデータをアナリティクスにリンクするには、まずFirebaseアカウントを作成し、アカウントにFirebaseプロジェクトを作成する。
Firebaseプロジェクトは、Firebaseプラットフォームにアプリを格納するコンテナ。1プロジェクト内に1アプリの全てのバージョン（iOS,Android,Web）を格納する。


#### まとめ
Web版の場合はグローバルサイトタグまたはGoogleタグマネージャーを使用して、アプリの場合はFirefaseを利用してビジネスとGA4プロパティを結びつける。analytics.js タグを使用できるのはユニバーサルアナリティクスのみで、GA4プロパティでは使用できない。
JavaScriptにおいてWindow.addEventLisnerを切り出す理由

# はじめに

JavaScriptにおいてWindow.addEventLisnerに関する記述を最後にする意味が分かりづらかったので、まとめてみました。

# 解決したい内容

JavaScriptにおいてWindow.addEventLisnerの記載を最後にするかを理解する。

### 先にwindow.addEventListenerを記述した場合

```jsx

window.addEventListener('load', function(){

  const pullDownButton = document.getElementById("lists")
  const pullDownParents = document.getElementById("pull-down")
  const pullDownChild = document.querySelectorAll(".pull-down-list")
  const currentList = document.getElementById("current-list")

  pullDownButton.addEventListener('mouseover', function(){
    this.setAttribute("style", "background-color:#FFBEDA;")
  })

  pullDownButton.addEventListener('mouseout', function(){
    this.removeAttribute("style")
  })

  pullDownButton.addEventListener('click', function() {
    if (pullDownParents.getAttribute("style") == "display:block;") {
      pullDownParents.removeAttribute("style")
    } else {
      pullDownParents.setAttribute("style", "display:block;")
    }
  })

  pullDownChild.forEach(function(list) {
    list.addEventListener('click', function() {
      const value = list.innerHTML
    })
  })
})
```

# 何が問題なのか

- 今回は「ページが読み込まれたあとに実行する処理」を記載しただけだが、この後にページに関するオブジェクト(window.addEventListener)を追加で記載しなければならない場合、どこがページの読み込み後の処理なのか分からなくなってしまう。
- 最初の関数宣言で処理自体は実行できるが関数に名前を定義できていない。

### window.addEventListener('load', pullDown)を切り分けた場合

```jsx
function pullDown() {

  const pullDownButton = document.getElementById("lists")
  const pullDownParents = document.getElementById("pull-down")
  const pullDownChild = document.querySelectorAll(".pull-down-list")
  const currentList = document.getElementById("current-list")

  pullDownButton.addEventListener('mouseover', function(){
    this.setAttribute("style", "background-color:#FFBEDA;")
  })

  pullDownButton.addEventListener('mouseout', function(){
    this.removeAttribute("style")
  })

  pullDownButton.addEventListener('click', function() {
    if (pullDownParents.getAttribute("style") == "display:block;") {
      pullDownParents.removeAttribute("style")
    } else {
      pullDownParents.setAttribute("style", "display:block;")
    }
  })

  pullDownChild.forEach(function(list) {
    list.addEventListener('click', function() {
      const value = list.innerHTML
      currentList.innerHTML = value
    })
  })
}

window.addEventListener('load', pullDown)
```

※「ページが読み込まれたあとに実行する処理」の関数名にpullDownとして定義しています。

# 何が良くなったのか

関数の呼び出しを最後にすることで、どこまでが「ページが読み込まれたあとに実行する処理」なのかが分かりやすくなる。

Rubyでクラスメソッドの処理を呼び出す際も処理内容を上に書いて下に呼び出す構文を記載　　している

ページが読み込まれたあとに実行する処理」の関数名にpullDownとして関数に名前をつけることができる。
PS2EXEを用いてPowerShellスクリプト(.ps1)から実行形式ファイル(.exe)を作成する

# 概要
[PS2EXE](https://www.powershellgallery.com/packages/ps2exe)を用いてPowerShellスクリプト(.ps1)から実行形式ファイル(.exe)を作成する手順を述べる．

# 詳細

## PS2EXEのインストール
**管理者権限**でPowerShellを起動し，コマンド `Install-Module ps2exe` を実行する．
```
PS C:\WINDOWS\system32> Install-Module ps2exe
```
NuGetプロバイダーがインストールされていない場合，以下の表示が出る．
Yを入力してNuGetプロバイダーをインストールする．
```
続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\denkiuo604\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
```
特に何も設定していなければ，[PSGallery](https://www.powershellgallery.com/)は信頼されていないリポジトリとして認識される．
Yを入力してインストールを続ける．
```
信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"):
```
これでPS2EXEのインストールは終了である．

## 実行形式ファイルの作成
実行形式ファイルにしたいPowerShellスクリプトが配置されているフォルダで，PowerShellを起動する．
例として，本稿では `C:\Users\denkiuo604\program.ps1` を実行形式ファイルにすることを考える．

:::note info
この手順においては，PowerShellを管理者権限で起動する必要はない．
:::

初めに，コマンド `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process` を実行する．
```
PS C:\Users\denkiuo604> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```

:::note warn
上記はPowerShellの実行ポリシーを変更するコマンドである．これを実行せずに以降の手順を進めると，次のエラーが発生してPS2EXEが実行されない．
```
ps2exe : 'ps2exe' コマンドはモジュール 'ps2exe' で見つかりましたが、このモジュールを読み込むことができませんでした。詳
細については、'Import-Module ps2exe' を実行してください。
発生場所 行:1 文字:1
+ ps2exe
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (ps2exe:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CouldNotAutoloadMatchingModule
```
コマンドの意味や実行ポリシーについては，以下の記事などを参照されたい．
[PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f)
:::

次に，`ps2exe` コマンドを実行する．
```
PS C:\Users\denkiuo604> ps2exe .\program.ps1
PS2EXE-GUI v0.5.0.29 by Ingo Karstein, reworked and GUI support by Markus Scholtes


Reading input file C:\Users\denkiuo604\program.ps1
Compiling file...

Output file C:\Users\denkiuo604\program.exe written
```
これで，PowerShellスクリプトと同じフォルダに実行形式ファイルが作成される．

# 参考
- [PowerShellのps1ファイルをexeに変換するコマンド「ps2exe」 | 迷惑堂本舗](https://maywork.net/computer/powershell-ps2exe/)
- [PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f)
yarn set version stable "Release not found: stable".

# `yarn set version stable`　実行時エラー

```
$ yarn　set　version　stable
warning package.json: No license field
Resolving stable to a url...
error An unexpected error occurred: "Release not found: stable".
info If you think this is a bug, please open a bug report with the information provided in "/../../yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/policies for documentation about this command.
```

# 解決策
`yarn set version berry`を実行する
```
$ yarn　set　version　berry
```
paiza.ioでelixir その256

# 概要
paiza.ioでelixirやってみた。
then、知らなかった。

# 参考にしたページ

https://qiita.com/Alicesky2127/items/2b5ae7702f21cf0060e6


# サンプルコード


```

1 
|> (fn x -> 
	x * 2 
end).()
|> IO.inspect


1 
|> then(fn x -> 
	x * 2 
end)
|> IO.inspect


```

# 実行結果

```
2
2

```

# 成果物

https://paiza.io/projects/sdg7n94idSNUxqxHd2mSDA

以上。
plunkerでopenjscad その8

# 概要
plunkerでopenjscadやってみる。
押し出し、やってみる。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ffdfe02-72ef-d01d-5f68-0dfd1e40319f.png)


# サンプルコード

```
function main() {
	var a = CAG.rectangle({
		center: [0, 10],
		radius: [3, 3]
	});
	a = a.extrude({
		offset: [0, 0, 10],
	});
	var b = CAG.circle({
		radius: 3
	});
	b = b.extrude({
		offset: [0, 0, 10],
	});
	return a.union(b);
}
```


以上。
plunkerでopenjscad その7

# 概要
plunkerでopenjscadやってみる。
solidFromSlicesやってみる。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b983ec5b-44d0-4079-abbe-e4d9e7a5db88.png)


# サンプルコード

```
function main() {
	var sqrt3 = Math.sqrt(3) / 2;
	var radius = 10;
	var hex = CSG.Polygon.createFromPoints([[radius, 0, 0], [radius / 2, radius * sqrt3, 0], [-radius / 2, radius * sqrt3, 0],
		[-radius, 0, 0], [-radius / 2, -radius * sqrt3, 0], [radius / 2, -radius * sqrt3, 0]]);
	var angle = 5;
	return hex.solidFromSlices({
		numslices: 720 / angle,
		callback: function(t, slice) {
			var coef = 1 - t * 0.8;
			return this.rotateZ(5 * slice).scale(coef).translate([radius * 4 * t, t * 15, 0]).rotate([0, 20, 0], [-1, 0, 0], angle * slice);
		}
	});
}
```

# 成果物

https://embed.plnkr.co/plunk/ttt5QRYJZxSINrGv


以上。
Javaで「区切り文字を別の値に設定する」の動作を確認してみた

# 概要

Javaで「区切り文字を別の値に設定する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index3.html

# 実装

以下のファイルを作成しました。
```JSample3_2.java
import java.util.Scanner;
import java.util.regex.Pattern;

class JSample3_2{
  public static void main(String[] args){
    String regex = ":|;";
    var p = Pattern.compile(regex);

    Scanner scanner = new Scanner("Melon:Peach;Grapes:Orange");
    scanner.useDelimiter(p);

    while (scanner.hasNext()){
      String fruit = scanner.next();
      System.out.println(fruit);
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample3_2.java 
$ java JSample3_2 
Melon
Peach
Grapes
Orange
```

# まとめ

何かの役に立てばと。
SQL Serverで全テーブルの件数、カラム数を調べる

# 1. はじめに
* SQL Serverにある全テーブルのレコード件数を調べたい
* SQL Serverにある全テーブルのカラム件数を調べたい

# 2. 開発環境
* SQL Server 2019

# 3. 全テーブルのレコード数を調べるSQL
```SQL
SELECT OBJ.name AS TableName, IND.rows
FROM sys.objects AS OBJ
JOIN sys.sysindexes AS IND
ON OBJ.object_id = IND.id AND IND.indid < 2
WHERE OBJ.type = 'U'
ORDER BY OBJ.name;
```

# 4. 全テーブルのカラム数を調べるSQL
```SQL
SELECT O.name As TableName, Count(C.name) As ColumnCount
FROM sys.objects O INNER JOIN sys.columns C ON O.object_id = C.object_id AND O.type = 'U'
GROUP BY O.name
```

# 5. 参考文献

https://kin-memo.hatenablog.com/entry/2018/04/06/110922

https://shin21.hatenablog.com/entry/2017/01/17/090000
Django基本７～Templateの継承

今回はTenplateの継承についてみてみました。
こちら側で分かりやすい説明をしているのでリンク張っておきます。
https://qiita.com/ysk-s/items/8205d37138129e2af87a#:~:text=DTL%E3%81%A7%E3%81%AF%E3%80%81%E4%BB%96%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E7%B6%99%E6%89%BF%E3%81%97%E3%81%A6%E3%80%82,%E3%81%9D%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%87%BA%E6%9D%A5%E3%82%8B%E3%80%82%20%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E3%82%84%E3%80%81%E7%94%BB%E9%9D%A2%E9%96%93%E3%81%A7%E5%85%B1%E9%80%9A%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%80%81%E7%B6%99%E6%89%BF%E5%85%88%E3%81%A7%E7%8B%AC%E8%87%AA%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82
Proxmox8 を試してみる　その１３　AdGuard Home 入れてみる

# AdGuard Home をインストール
Proxmox でやりたいことをひと通りしたような気がして最近放置気味でしたので、コンテナ（lxc）で AdGuard Home を入れてみます。Unboundを使ってお手軽内向きDNSサーバーでもよかったのですが、AdGuard のダッシュボードがカッコよかったのでちょいと入れてみました。

## local DNS stub listener の利用をやめる
私が知らなかっただけですが、止めておいたほうがよいみたいですね。ただDNSを立ち上ないのであれば放置しておいてもよいと思いますが、listen してて気持ち悪いと思うのであればやったほうがよさそうですね。

https://qiita.com/shora_kujira16/items/31d09b373809a5a44ae5

やりかた

```bash:/etc/systemd/resolved.conf
DNSStubListener=no
```

修正が終わったら。

```bash
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ sudo systemctl restart systemd-resolved
```

この修正で外部が引けなくなってしまったら・・・

```bash
$ sudo echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
```

https://askubuntu.com/questions/91543/apt-get-update-fails-to-fetch-files-temporary-failure-resolving-error

# AdGuard Home インストール
公式サイトにインストール方法が記載されているのでそちらを見てみるとやり方が載っています。今回は `curl` を使ってみます。

https://github.com/AdguardTeam/AdGuardHome#getting-started

```bash
$ sudo curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
```

さっくり終わるので。 `http://IP:3000` にアクセスすると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/d87a0646-4e2c-961a-0bae-022343b6550e.png)

あとは、DNS 先を変更してあげればよいですね。

# DNSブロックリスト の追加
もっと広範囲に広告無しにしたい場合は、別途フィルターを追加することができるらしい。280Blocker サイトさんが提供してるフィルターを追加すればよいらしい。

https://280blocker.net/download/

https://wikiwiki.jp/nanj-adguard/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%83%AA%E3%82%B9%E3%83%88

# 使ってみた感じ
デフォルトのまま使用しても割といい感じにブロックされているので気持ちいですね。ブロックしたドメインとかみると広告として表示されないけどちゃっかり追跡しているっていうのがわかって気持ち悪いです（世の中そういう仕組みでお金稼ぐので仕方っすけどね）。なにより子供が下手気に踏んでしまうのを防げるのはいいことですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/060c41b2-dbcc-5006-f626-913e4b84207a.png)

# AdGuard DNS もいいんじゃない？
会社のネットワークを使用した場合、安易にDNSを立てられないので AdGuard DNS を使用するという手もあります。これの良い点は使用しているPCをプロジェクターとか投影しているときに、変な広告が出ないのがいいです（楽天のデフォルトAD広告が酷すぎて恥かいたことあります）。

https://pc-gamers.info/adguard-dns/

# 参考にさせて頂いたサイト様

https://blog.hitsujin.jp/entry/2023/05/18/tailscaleadguard

https://zenn.dev/tokohito/articles/53e4153c5d6e77
【WebAPI】ステータスコードを正しく使う　400番台編

:::note
400番台は最も種類が豊富で、200番台の次によく使うであろうステータスコード。クライアントのリクエストに起因するエラー、すなわちサーバ側には問題はないが、クライアントのリクエストが理解できないであったり、理解はできるが実行が許可されていない場合に利用するステータスコード。
:::

もちろんAPIの種類や性格によってエラーは千差万別であり、400番台だけでは表せない。ステータスコードはクライアントがたとえエラーの詳細を得るための仕様を知らなくても、おおよその問題を把握できるようにするためのものと捉える。

### 400 Bad Request
そのほか。つまり他の400番台では表すことができないエラーに使うためのステータスコード。
パラメータに間違いがある場合など、他のステータスコードで適切なものがない場合に400を返す。

### 401 Unauthorized / 403 Forbidden
よく似ている2つなので、間違いやすいですが、

* 401 認証のエラー
    * 「あなたが誰であるのか分からないよ」
* 403 認可のエラー
    * 「あなたが誰であるか分かったけど、この操作はあなたには許可されていないよ」

を表す。

### 404 Not Found
「アクセスしようとしたデータは存在していないよ」という意味のエラー。存在しないユーザーの情報を取得しようとしたり、そもそも存在しないエンドポイントにアクセスしようとした場合に404が返る。

一方で「何が存在しないのか」というのはケースバイケースであり、単に404を返すだけではクライアントにとってエラーハンドリングが難しくなる。
たとえば、利用者がユーザー情報を取得しようとして404が返ってきた場合、

* そのユーザーが存在しない
* エンドポイントのURIがそもそも間違っている

といった理由が考えられますが、404だけでは分かりません。利用者の開発効率を上げるためにも、詳しい情報をつけて返すと親切。

### 405 Method Not Allowed
エンドポイントは存在するが、メソッドが許可されていない場合に利用する。

* GETを使ってアクセス可能な検索専用のAPIにPOSTでアクセスしようとした場合
* 情報を更新する専用のAPIにGETでアクセスしてしまった場合

などに405を返す。

### 406 Not Acceptable
クライアントが指定してきたデータ形式にAPIが対応していない場合に返すエラー。たとえば出力形式としてJSONやXMLしか対応していないのにYAMLを指定された、といった場合に406を返す。

### 408 Request Timeout
リクエストをクライアントがサーバを送るのに時間がかかりすぎてサーバ側でタイムアウトを起こした際に発生する。

### 409 Conflict
リソース競合が発生した場合のエラー。
たとえばIDなどユニークキーを指定して新しいデータを登録するようなAPIがあったとして、既に同じIDのデータが存在する時などに409のエラーを返す。

### 410 Gone
404と同じくアクセスしたリソースが存在しないことを表し、単に存在しないというではなく、かつて存在したけれど今はもう存在しないことを表す。
このステータスコードを返すためには、データを削除したという情報を保持する必要があり、それを保持していることを利用者からも分かってしまうので、ユーザー情報をメールアドレスで検索するといったAPIで410を返すという仕様は個人情報保護などの観点から問題を指摘される可能性がある。
Cloud9にRをインストール

# はじめに
Cloud9でRを動かしたくなった時のために、備忘録として記事にしました。


# 環境

- Cloud9
    - Amazon Linux 2

# コマンド

```
sudo yum update

sudo yum install -y R

R
```

# おわりに
今回は、少しだけRを使いたかったので、Cloud9で使う方法を調べました。
がっつり動かしたい場合は、Amazon Lightsail for Research で RStudio を使うのが良いと思います。

https://docs.aws.amazon.com/ja_jp/lightsail-for-research/latest/ug/tutorial-rstudio.html
イベント処理の「イベント」とは？

## なぜ調べたいと思ったか
「ナビゲーションメニューの項目を押すとサブメニューが出てくる」
「スクロールするとポップアップ広告が表示される」
多くのWebサイトを閲覧して、上記の機能を目にすることが多く、調べてみて内部でイベント処理が動いているのが分かった。

・クリックやスクロール以外にどんなイベントがあるか？
・イベント処理の上手く活用するには？

を解決したくて、イベント処理を更に調べようと思った。


## イベントの種類について
![スクリーンショット 2023-10-14 6.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/02501322-c65b-216a-450b-6266747c1328.png)
図表の参照元URL：https://ict-skillup.com/javascript/1402/

イベントは、Webブラウザで何かが起きた時に知らせる信号を指す。Webサイトでのユーザー操作に関するものが多く、イベント発生後にサブメニューやポップアップ広告の表示などの動的処理を実現できる。


## イベント処理を上手く活用するには？
**①部品にどんな変化を付けたいかを明確にして、マークアップ言語やスクリプト言語などを使い分ける**

「メニューボタンにカーソルを乗せた後、そのボタンの色を変える」
上記の機能はCSSのtransitionプロパティで実現でき、動的処理を行っている様にも見える。そこで気づいたのが、「部品の動きの変化(アニメーション効果)」ではなく「部品の装飾の変化」であること。

「メニューボタンのカーソルを乗せた後、それに関連するサブメニューを表示する」
の機能の場合は、Webサイトの装飾に特化したCSSでは実現できない。

「部品にどんな変化をつけたいか」「その変化を実現できる言語は何か」を明確にしないと、イベント処理を実装中に頭を抱えることになる。


**②イベントを使ってWebサイトにどんな動きを付けたいかを明確にする**

動きのパターンは非常に多いので、どのパターンが想定している「動きの変化」に適しているかの判断が重要になってくる。
https://coco-factory.jp/ugokuweb/
https://baigie.me/offihttps://baigie.me/officialblog/2021/02/25/css-tips-1/

Webサイトの動きを意識して開発したことがない場合は、イベント処理を使って様々な動きのパターンを体験して欲しい。
MAUI Tips - ポップアップの背景を透明にする

# 概要
これまでXamarin.Formsで作っていたアプリを、一念発起して.NET MAUIで作り直す中で
調べたことの備忘録。

# 環境
Visual Studio for MAC
.NET MAUI
.NET 7

# 起こった現象
Community Toolkitのポップアップを表示させた際に、
StackLayout等のBackgroundColorをTransparentにしても、
下図のように透明になりません・・・。

``` xml
<?xml version="1.0" encoding="utf-8" ?>
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" 
               x:Class="TestApp.CommOverrayPopup"
               CanBeDismissedByTappingOutsideOfPopup="False"
               >

    <StackLayout Orientation="Vertical"
                 BackgroundColor="Transparent"
                 Margin="0">

        <ActivityIndicator x:Name="Indicator"
                           VerticalOptions="Center"
                           Color="White"
                           IsRunning="True">
        </ActivityIndicator>

        <Label Text="通信中…"
               HorizontalTextAlignment="Center"
               FontAttributes="Bold"
               FontSize="24"
               Margin="20,40"
               TextColor="White"/>

    </StackLayout>    
</toolkit:Popup>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a5f43169-f0f1-ff9a-8f05-99732993d89e.png)


# 解決策
[StackOverflow](https://stackoverflow.com/questions/74478498/add-transparent-background-color-to-popup-page-for-maui-using-community-toolkit)に解決策の記載がありました。

toolkitの名前空間の宣言（xmlns）の後に、Color="Transparent"を記載します。

``` xml
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" Color="Transparent"
               x:Class="TestApp.CommOverrayPopup"
               CanBeDismissedByTappingOutsideOfPopup="False"
               >

```

そうすると、背景が透明で表示されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/10f45804-cd07-a8d4-524c-e6573cef4c28.png)
新卒エンジニアが地方からフルリモートで働いてみて

# はじめに
初めまして、2023年卒の新卒エンジニアとして、東京に本社を置くWeb系の自社開発系企業に正社員として入社をした@takakouと申します。

今回の記事では、新卒一年目から地方でフルリモートをし始めた経験談などを、まだ就職をしていない学生の方々、転職活動中の方々向けに執筆をしてみました。

「**フルリモートで働く**」ことに関して、focusを強く当てて書いてみようと思います。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [フルリモートを選んだ理由](#1-前提条件)
1. [フルリモートで良かったこと](#2-対象者)
1. [フルリモートで損したこと](#3-動作環境)
1. [フルリモートで働く上で意識しなければいけないこと](#4-動作環境)
1. [自分の選択について](#5-技術選定)
1. [最後に](#6-実装手順)
<!-- 各チャプター -->

# 1.フルリモートを選んだ理由
この章ではフルリモートを選んだ理由を述べていきます。

理由は大きく分けて三つあります。
## ドライブ、自然が好き
僕は根っからの **ドライブ** 好きで、自然に触れることも、かなり好きです。

毎週土日は、山へ行ったり海へ行ったり湖へ行ったりと様々なところへ **車** で出かけています。

この生活を手放したくないと思ったのが一つ目の理由です。

新卒で東京近郊に住むとなると、新卒が、車の維持をするのは無理だと思いまし、気軽に自然に触れれなくなるのではと思いました。

## 身近な人との別れ
上京してしまうと、大抵の人との関係は帰郷した際のみになると思います。

今まで何年、何十年と親身にしてきた知人、友人、恋人、家族、全てを手放すのが惜しいと感じました。

## 人混みが苦手
これが一番の理由かもしれません。

人に見られるのが恥ずかしいとかではなく、単純に人混みにいるのが嫌いなのです。

趣味のランニングも夜中に行きますし、買い物も人が少なくなった夜などに行くことが多いです。

上京して、常に人混みにいて心身が疲弊するよりも、人混みがほとんどない田舎をあえて選ぶことにしました。

# 2.フルリモートで良かったこと
この章では、フルリモートで良かったことを述べていきます。

正直あげたらキリはないですが、三つぐらいに絞ってみました。

## ギリギリまで寝れる
フルリモート勤務なので、出張することも基本的にありませんし、日によって就労場所が定められていることもないです。

つまり、朝起きた瞬間から自室で働けばいいだけなのでギリギリまで寝れます。これが最高に気持ちいいです。最近はあえて一時間ほど早めに起きて

## 家事ができる
こんなことを公の場で言うべきではないですが、休憩中に家事ができます。

ハイブリッド勤務の方々は、家事ができる日、できない日が出たりしますが、フルリモートの場合はそれがないです。

掃除もできますし、料理もできます。買い物だっていけます。

家に帰ってきて、「掃除しなきゃ...」となることが無いのはかなりメリットだなと感じています。

## 家賃が安いところに住める
東京と地方だと同じような条件の賃貸でも、体感3,4万円違います。

自分みたいに車をよく乗り、維持している人からしたらこの数万円が浮くのはかなりありがたいです。

駐車場がついている物件が多いのもめちゃくちゃありがたいです。

# 3.フルリモートで損したこと、悲しかったこと
この章では、フルリモートで損したこと、悲しかったことを述べていきます。

個人的にはそんなに思いつかなかったですが、挙げてみました。

## 身なりを気にしなくなる
学生時代は、アルバイトに行ったり、学校に行ったりで、毎日出掛けていたので、もちろん身なりには気を遣っていました。

フルリモートで働き始めた瞬間、髪を切りに行くのが億劫になったり、服を着替えるのが億劫になったりと身なりを気にしなくなったなと思います。

もしもの時に困るのでこれはどうにかしたいものですね...

## 会社の同期や先輩、上司に直接会えない
会社は東京にあるということもあり、東京近辺に住み、ハイブリッド勤務をしている方が多いので、時々出社している方が多く見られます。

なのでそのタイミングでぜひ出社をと思うのですが、時間もお金もかかるので現実的な案ではないです。

飲み会に行ったり、ご飯に行ったりできないのは割と寂しく感じる時があります。

# 4.フルリモートで働く上で意識しなければいけないこと
フルリモート勤務では意識しなければいけないことがいくつかあります。

思いつく限り挙げてみました。

## コミュニケーションは主体的に
基本的にこちらからコミュニケーションを取らないと、何事も前に進みません。

出社をしていたら困っている様子を見て、先輩が声をかけてくれたり、同期が声をかけてくれたりするかもしれませんが、フルリモートの場合は一才それがないです。

なのでコミュニケーションを主体的に行うことを意識した方が良いと感じました。


## 仕事の時間とプライベートの時間を分けること
仕事の時間とプライベートの時間を分けることがとても重要だと感じます。

プログラムを長時間書くのは楽しいと思っている派なので、気づけば無限に時間が過ぎていきます。

なので、仕事の時間をしっかりと決め、プログラムを書きたい場合は個人開発でやりましょう。タダ働きは、働くだけ損です。

## 気分転換をし、モチベーションを維持すること

ハイブリッド勤務であるならば、時々出社することもできると思います。

出社をしていると、気分転換に周りの人と喋ったり、コーヒーを飲んでみたり、はたまた他の人の仕事を邪魔してみたりと、気分転換は数多くあります。

しかし、家にずっといるとなると、何が気分転換が次第にわからなくなってきます。

外にいるときのような偶発的な出会い、事象がないです。

そのため、モチベーションの維持に困ることがあります。そんな時は家の中でできる気分転換の方法を探しましょう。

僕は仕事をしながらですが、テレビでYoutube,Netflixで、国道走破！北海道一周旅！みたいなのをみるのが好きです。

とりあえず言いたいのは気分転換になるものを見つけましょう。じゃないと仕事も私生活もだらけていきます。

# 5.自分の選択について
自分の選択は「**間違っていない**」と思っています。

考え方は人それぞれだと思います。フルリモートは、メリットがかなりあります。

しかし損することもたくさんあります。どちらが良いかは、長い時間をかけてでもいいのでしっかり考えましょう。

# 6.最後に
先人の知恵と言っていいのかわからないような文章ですが、フルリモートをするか迷っている人の助けになれたなら、この記事を執筆した意味があると思っています。

ITの界隈は広いようで狭いのでこの記事を目にしている皆さんとどこかでお会いする機会があるかもしれません。その時は、どうぞよろしくお願いいたします。

最近は、Next.js × MicroCMS ×  Vercel × cloudflare を用いて、自分でブログを作成するのにハマっています。よければ見ていただけますと喜びます！

https://kt-tech.blog
[Python]Seleniumを使ったネットワークアクティビティの取得方法

Webアプリケーションのテストやスクレイピングを行う際、Seleniumは非常に役立つツールとして知られています。この記事では、Seleniumを使用してChromeブラウザのネットワークアクティビティを取得する方法について詳しく解説します。

## コードの概要

上記のコードは、ChromeのDevTools Protocolを使用してネットワークリクエストの詳細情報（URL、ヘッダー、ボディ、クッキーなど）を取得するものです。

## コードの詳細解説

1. 必要なモジュールをインポートします。

   ```python
   from selenium import webdriver
   from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
   import json
   ```

2. Chromeブラウザのネットワークログを取得するための設定を行います。

   ```python
   caps = DesiredCapabilities.CHROME
   caps['goog:loggingPrefs'] = {'performance': 'ALL'}
   ```

3. 設定したキャパビリティを使用してブラウザを起動します。

   ```python
   driver = webdriver.Chrome(desired_capabilities=caps)
   ```

4. 任意のURLにアクセスします。

   ```python
   driver.get('http://example.com')
   ```

5. ブラウザのネットワークアクティビティログを取得し、各リクエストの詳細を分析して表示します。

   ```python
   logs = driver.get_log('performance')
   ```

   ログの中から、リクエストのURL、ヘッダー、ボディ、クッキーなどの情報を取り出して表示します。

6. 最後にブラウザを閉じます。

   ```python
   driver.quit()
   ```

## まとめ

この方法を利用すると、Webページのネットワークアクティビティの詳細を容易に取得できます。特に、APIのリクエストやレスポンスの内容を確認する際などに役立つでしょう。Seleniumを使用してさらに詳しいネットワーク解析を行いたい場合、この方法を基本として拡張していくことができます。


```python
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import json

# ネットワークアクティビティのログを取得する設定
caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}

# ブラウザを起動
driver = webdriver.Chrome(desired_capabilities=caps)

# URLにアクセス
driver.get('http://example.com')

# ログを取得し、ネットワークアクティビティを分析
logs = driver.get_log('performance')
for entry in logs:
    message_data = json.loads(entry['message'])['message']['params']
    
    # リクエスト情報が存在する場合のみ処理
    if 'request' in message_data:
        request_data = message_data['request']
        request_url = request_data['url']
        request_headers = request_data['headers']

        # ボディを取得
        if 'postData' in request_data:
            post_data = request_data['postData']
        else:
            post_data = None

        # クッキーはSeleniumのメソッドを利用して取得
        cookies = driver.get_cookies()

        print(f"URL: {request_url}")
        print(f"Headers: {request_headers}")
        print(f"Cookies: {cookies}")
        print(f"Body: {post_data}")
        print("-" * 50)

# ブラウザを閉じる
driver.quit()

```
[Python]動画ファイルを15分以上なら5分毎に音声ファイルに分割させる

動画編集やポッドキャスティングに携わる中で、動画から音声を抽出して、長い動画の場合に音声を特定の長さで分割したいと考えることがよくあります。この記事では、この作業を自動化するためのPythonツールを紹介します。

## 必要なライブラリ

- **moviepy**: 動画ファイルの読み込みと音声の抽出を行うためのライブラリ。
- **pydub**: 音声ファイルの分割や操作を行うためのライブラリ。

これらのライブラリは、以下のコマンドで簡単にインストールできます:

```bash
pip install moviepy pydub
```

## 関数の実装

以下の関数は、動画から音声を抽出し、動画の長さが15分以上の場合は5分ごとに音声を分割する機能を持っています。

```python
from moviepy.editor import *
from pydub import AudioSegment
from typing import List

def extract_and_split_audio_from_video(video_path: str, output_audio_path: str, output_folder: str) -> List[str]:
    """
    動画から音声を抽出し、指定した条件に従って音声を分割する関数

    Parameters:
    - video_path: 入力動画ファイルのパス
    - output_audio_path: 変換した音声ファイルの保存先パス
    - output_folder: 分割された音声ファイルの保存先フォルダ

    Returns:
    - audio_files: 生成された分割された音声ファイルのパスのリスト
    """

    video = VideoFileClip(video_path)
    video_duration = video.duration

    audio = video.audio
    audio.write_audiofile(output_audio_path)

    audio_files = []

    if video_duration >= 900:  # 900秒 = 15分
        audio_segment = AudioSegment.from_wav(output_audio_path)
        n_chunks = int(video_duration // 300)  # 5分 = 300秒

        for i in range(n_chunks):
            start_time = i * 300 * 1000  # pydubはミリ秒を使用するため、1000をかける
            end_time = (i+1) * 300 * 1000
            chunk = audio_segment[start_time:end_time]
            chunk_path = f"{output_folder}/audio_chunk_{i+1}.wav"
            chunk.export(chunk_path, format="wav")
            audio_files.append(chunk_path)

    return audio_files

# 使用例:
# video_path = 'path_to_your_video_file.mp4'
# output_audio_path = 'path_for_extracted_audio.wav'
# output_folder = 'path_for_audio_chunks'
# generated_files = extract_and_split_audio_from_video(video_path, output_audio_path, output_folder)
# print(generated_files)
```

## 使い方

上記の関数を使用するには、以下のように動画のパス、出力する音声のパス、分割された音声を保存するフォルダのパスを指定します。

```python
video_path = 'path_to_your_video_file.mp4'
output_audio_path = 'path_for_extracted_audio.wav'
output_folder = 'path_for_audio_chunks'
generated_files = extract_and_split_audio_from_video(video_path, output_audio_path, output_folder)
print(generated_files)
```

## まとめ

動画から音声を抽出し、必要に応じて分割するためのシンプルなPythonツールを紹介しました。このツールは、動画編集やポッドキャスティングのプロジェクトで非常に役立つことでしょう。Happy coding!