OmniAICreator/Qiita-1.07M huggingface dataset:
デベロッパーのための「次世代Webテクノロジー大特集」

# はじめに

みなさん、こんにちは！今日は、ここ数年で急速に話題となっている「次世代Webテクノロジー」について深掘りしていきます。
このブログでは、最新のトレンドについて紹介していきたいと思います！

# 対象読者

- テクノロジーに興味がある方
- 最新のWeb開発について知りたい方
- トレンドについて理解を深めたい方

# 目次

1. WebAssemblyとは
2. Progressive Web Apps（PWA）の利点
3. Webコンポーネントの未来
4. サーバーレスアーキテクチャ
5. フロントエンドとバックエンドの統合

# 1. WebAssemblyとは

まずはWebAssemblyについて見ていきましょう。WebAssembly（ワブアセンブリ）は、ブラウザ内でネイティブのパフォーマンスを実現し、JavaScriptに代わる新しい実行形式です。この技術は、特に計算量が多いアプリケーションやゲーム開発において、その真価を発揮します。

### WebAssemblyの基本

WebAssemblyは、バイナリ形式の実行形式で、ほとんどのモダンブラウザでサポートされています。これにより、CやC++などの言語で書かれたコードをブラウザ内で高速に実行することが可能です。

### WebAssemblyの実用例

現在、WebAssemblyは画像処理、音声解析、ゲーム開発などさまざまな分野で活躍しています。例えば、Adobeの製品やAutoCADの一部は、WebAssemblyを採用してパフォーマンスを向上させています。

:::note info
WebAssemblyを使えば、JavaScriptだけでは実現できない高性能なアプリケーションを開発することができます。
:::

# 2. Progressive Web Apps（PWA）の利点

次に、Progressive Web Apps（PWA）についてお話しします。PWAは、ウェブページとネイティブアプリケーションの利点を組み合わせたものです。

### PWAの基本

PWAは、オフラインでも動作し、プッシュ通知が可能で、ホーム画面にアイコンを追加するなどネイティブアプリのような機能を提供することができます。これにより、ユーザー体験が向上し、エンゲージメントが増加します。

### PWAの実用例

PWAの代表的な例として、TwitterのTwitter LiteやUberのWebアプリなどが挙げられます。これにより、ユーザーはブラウザ経由でスムーズにアプリを利用することができます。

:::note info
PWAを導入することで、ユーザーエクスペリエンスを格段に向上させることができます！
:::

# 3. Webコンポーネントの未来

次に、Webコンポーネントについて見ていきましょう。Webコンポーネントは、再利用可能な独立したUIコンポーネントを作成するための技術です。

### Webコンポーネントの基本

Webコンポーネントは、HTMLテンプレート、カスタムエレメント、シャドウDOMの3つの技術から成り立っています。これにより、他のコードと干渉しない独自のコンポーネントを作成することが可能です。

### Webコンポーネントの実用例

Webコンポーネントを使って、企業のデザインシステムやUIライブラリを構築することが一般的です。これにより、コンポーネントの再利用性が高まるだけでなく、メンテナンスも容易になります。

:::note info
Webコンポーネントは、モダンなフロントエンド開発において中心的な役割を果たしています。
:::

# 4. サーバーレスアーキテクチャ

続いて、サーバーレスアーキテクチャについて説明します。サーバーレスアーキテクチャにより、開発者はインフラの管理から解放され、コードのみに集中することができます。

### サーバーレスの基本

サーバーレスは、必要なときにだけリソースを消費し、それに応じて課金される仕組みです。これにより、インフラストラクチャのコストが削減され、スケーラビリティが向上します。

### サーバーレスの実用例

Amazon Web Services（AWS）のLambdaやGoogle Cloud Functionsなど、主要なクラウドプロバイダーがサーバーレスサービスを提供しています。これにより、スタートアップから大企業まで幅広く採用されています。

:::note info
サーバーレスアーキテクチャを導入すれば、自動的にスケーリングが行われ、インフラの管理が不要になります。
:::

# 5. フロントエンドとバックエンドの統合

最後に、フロントエンドとバックエンドの新しい統合方法について紹介します。従来のモノリシックアーキテクチャからマイクロサービスアーキテクチャへのシフトが進んでいます。

### 新しい統合の基本

モダンなWeb開発では、GraphQLやgRPCなどの新しいプロトコルを使ってフロントエンドとバックエンドのコミュニケーションを効率化しています。これにより、データの取得と処理が高速化されます。

### 新しい統合の実用例

GitHubのAPIやShopifyのAPIは、これらの新しいプロトコルを採用しており、開発者にとって柔軟かつ効率的なデータアクセスを提供しています。

:::note info
GraphQLやgRPCを使えば、より柔軟で効率的なデータ通信が実現します！
:::

# まとめ

次世代Webテクノロジーに関する話題を一通り紹介しました。
どの技術も非常に魅力的で今後の可能性があると思います。ツールやフレームワークを活用し、ぜひ皆さんのプロジェクトに取り入れてみてください！
【FastSAM】超簡単、超高速何でもセグメンテーション FastSAMを使ってみる

## 高速セグメンテーションモデルFastSAM
画像上に写っている様々なものを高速にセグメンテーションできるFastSAMの使い方紹介です。
モデルのほうで何でも認識してセグメンテーションしてくれるので、ユーザーは事前学習等を考慮する必要がありません。そのため通常SAMは処理時間がネックなのですが、FastSAMはその名の通りとても早くセグメンテーションできます。

https://docs.ultralytics.com/ja/models/fast-sam/#model-architecture


### 早速使ってみる
大体1フレーム当たり100ms～200msくらいでセグメンテーションできていました。
環境は以下です。
Intel(R) Core(TM) i9-14900HX　24コア　2.20 GHz
NVIDIA GeForce RTX 4080 Laptop GPU

 
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605106/62d455ba-373a-1c76-291a-31584e56e7a1.gif)

　　
きれいにセグメンテーションできてますね。

  　　
動画はこちらを使わせていただきました。

https://video-ac.com/video/4667


## インストール
ここは公式サイトそのままに
```python
git clone https://github.com/CASIA-IVA-Lab/FastSAM.git
cd FastSAM
pip install -r requirements.txt
pip install git+https://github.com/ultralytics/CLIP.git
```

## コード
```python
from FastSAM.fastsam import FastSAM, FastSAMPrompt 
import torch
import cv2

class FASTSAMmodl:
    
    def __init__(self, SEGMENTATION):
        self.model = FastSAM(SEGMENTATION["model"])
        self.retina_masks = SEGMENTATION["param"]["retina_masks"]
        self.imgsz = SEGMENTATION["param"]["imgsz"]
        self.conf = SEGMENTATION["param"]["conf"]
        self.iou = SEGMENTATION["param"]["iou"]

    def Segment(self, frame):

        if torch.cuda.is_available():
            device = 'cuda'
        else:
            device = 'cpu'

        everything_results = self.model(frame, device = device, retina_masks = self.retina_masks, imgsz = self.imgsz, conf = self.conf, iou = self.iou)

        prompt_process = FastSAMPrompt(frame, everything_results)
        segment_filter = prompt_process.everything_prompt()

        if(len(segment_filter) > 0):
            result = prompt_process.plot_to_result(annotations = segment_filter)
        else:
            result = frame

        return segment_filter, result
    

par = {
        "model" : "FastSAM/weights/FastSAM-x.pt",
        "param" : {
            "retina_masks" : True,
            "imgsz" : 1000,
            "conf" : 0.7,
            "iou" : 0.9
        }
    }
FS = FASTSAMmodl(par)

filepath = "input.mp4"
video = cv2.VideoCapture(filepath)
framerate = video.get(cv2.CAP_PROP_FPS)

while True:
    ret, image = video.read()
    if not ret:
        break

    segment_filter, segmented_image = FS.Segment(image)

    cv2.imshow("image", segmented_image)
    cv2.waitKey(int(1000.0/framerate))

video.release()
cv2.destroyAllWindows()
```
チェリー本7.7.6

# チェリー本7.7.6一部解説

Ruby のメソッド定義は式になっていて、 メソッド定義が完了するとメソッド名をシンボルとして返します。
これを利用すると、メソッド定義が正常に行われたかどうかを確認したり、メソッド名を後で利用することができます。
```
def foo
 'foo'
end
#=> :foo
```
この知識を応用すると、 次のようにメソッド定義と同時にそのメソッドをprivateメソッドにすることが可能です。


```
class User

 private def foo
 　'foo'
 end
 
end

user = User.new
user.foo #=> private method 'foo' called for #<User:0x000000013c144398> (NoMethodError)
```
・流れ
①fooメソッドが定義される
②シンボル:fooは、その返り値となる
③:fooがprivateメソッドの引数となるため、foo メソッドは private として扱われる。
AWSのEC2に登録からDjangoアプリをデプロイするまでの手順 part 1 (ssh接続編)

## 本日のお悩み
### AWSのEC2へのデプロイ方法がわからない
アプリケーションの無料ホスト先がなくなってきたのでいよいよec2に手をつけます。
herokuの有料化やstreamlitやrenderが簡単で良かったのですが、無料枠が超えたのと、djangoがデプロイできなそうでした。awsのec2は実務でもシェア率が高いですし転職活動も有利に働くとの情報もありましたので勉強も兼ねて今回はec2でチャレンジしてみました。
**アウトプットも兼ねて簡単に手順を記載していきます。** 
## 本日の処方箋
今回は尊敬している**Pythonプログラミング VTuber サプー**さんの動画を参考にして進めていきます。
[今回の講義動画](https://www.youtube.com/watch?v=AGmkG0wJ8LA&t=1178s)7分38秒くらいまでは動画を見ながら進めていけば大丈夫です。

### awsへのssh接続手順(Mac)
**ホームディレクトリに移動**

  * ```zsh
    cd ~
    ```
**.sshディレクトリが存在しない場合、作成する**

  * ```zsh
    mkdir -p ~/.ssh
    ```
    -p: もし親ディレクトリが存在しない場合、作成
    ~: は現在のユーザーのホームディレクトリを指すので、~/.ssh はユーザーのホームディレクトリに作成される

**作成されたsshディレクトリはセキュリティで可視化されていないため作成したディレクトリに移動してから**ls**コマンドを入力して確認する**

  * ```zsh
    cd ~/.ssh
    ls
    ```

**ダウンロードしたpemファイルに移動**

  * ```zsh
    cd ~/Downloads
    ```

**次に、mvコマンドを使用して、pemファイルを.sshディレクトリに移動します。以下は例です（your-key.pemは実際のpemファイル名に置き換えてください）**

  * ```zsh
    mv your-key.pem ~/.ssh/
    ```

**awsの秘密鍵のパーミッションを設定する(your-keyは自分のpemファイル名)**

  * ```zsh
    chmod 400 ~/.ssh/your-key.pem
    ```

**秘密鍵を使ってEC2に接続する**

 * ```zsh
   ssh -i "~/.ssh/my-key.pem" ubuntu@example.compute.amazonaws.com
   ```
   ubuntuはmacosを選択していたらここはmacosとかに変わるかと思います。僕はubuntuを選びました。
   ec2のインスタンスに接続というところの画面の下にコピー例があるのでそこに **~/.ssh/**を追加してあげて場所を教えてあげればいけます。そのままコピーするとそんなファイルないよとエラーになります。

**まとめるとこんな感じ**

  * ```zsh
    cd ~
    mkdir -p ~/.ssh
    cd ~/Downloads
    mv my-key.pem ~/.ssh/
    chmod 400 ~/.ssh/my-key.pem
    ssh -i "~/.ssh/my-key.pem" ubuntu@example.compute.amazonaws.com
    ```

## 次に続く>>>
M5Stamp C3U MateのBLE通信とHWCDCシリアル通信時のタイムアウト対策

# 概要
　M5Stamp C3U MATE2台を使いBLE通信にてPC側からの要求に対してSever側のデータを
 　Client側で1秒毎に受信する プログラムをC#で作成した際、受信エラー（タイムアウト）
  　となることが多々  あり調べてみました。

 ＜接続概略＞
　PCソフト（C#）⇔シリアル通信（HWCDC）⇔Client側M5Stamp⇔BLE通信⇔Sever側M5Stamp

# 調べたこと
　1.PCからの要求はSeverに到達していて問題は無さそう。
　2.Severからの送信はClientまでは到達してる。
　3.ClientからHWCDCを通してのPCへの送信で問題がありそう。
　4.ClientのUART⇒外部UART⇔USB変換を使うと問題は発生しない。
　5.USBシリアル変換IC搭載のM5Stamp C3 MATEでは問題が発生しない。

 M5Stamp C3UではUSBシリアル変換ICを搭載しておらずMCUに直接USBが接続
 されています。試しにUSBシリアル変換ICを搭載したM5Stamp C3 MATEをClient側に
 使用したところ問題無く送受信できることが分かりました。
 また「HWCDC.cpp」ドライバには色々と問題がありそうで 修正版を試したりしましたが
 解決できませんでした。

 # 解決策
 https://github.com/espressif/arduino-esp32/issues/7779
 こちの記事を見ていてHWCDCを通しての送信タイムアウトエラーが関係していそう
 でしたので送信タイムアウト時間を設定、バッファも少し大きめに設定、
 更に、送信完了待ちを設定したところ PC側での 受信エラーが無くなりました。
 タイムアウト時間については送信~受信までで通常50mSec前後、時々最大で160mSec程度
 を要していたため余裕を持った300mSecに設定しました。
 プログラムとしては1秒毎にデータが取得できれば問題無いためこれでOKとします。
 安定した通信を行うためにはUSBシリアル変換IC搭載機種、若しくは外部UART-USB変換を
 選定すべきかとも思います。
 ちなみにM5StampS3もUSBシリアル変換ICが搭載されておらず同様の問題が発生しますが、
 こちらも同じ設定を行うことで安定した送受信が確認できました。

 この問題解決まで2カ月ほどかかりました・・。やれやれ。(^^♪
 
 ``` cpp
 // HWCDCシリアル設定
  Serial.setTxTimeoutMs(300);  //追加
  Serial.setRxBufferSize(100); //追加
  Serial.setTxBufferSize(100); //追加
  Serial.begin(115200);

 // BLE受信⇒シリアル送信
  if(receivedflg==true){
     Serial.print(rx_Str);
     Serial.flush(); //追加 送信完了待ち 
     receivedflg = false;
  }
  
  ``` 
  # 参考サイト
  https://github.com/espressif/arduino-esp32/issues/7779
  
  https://github.com/espressif/arduino-esp32/pull/9660
【.htaccess】ルート階層以外でルートパスを使う

＜＜　問題　＞＞
公開中のサイトで、/test/のディレクトリにテストページを作成した。
画像・ファイルの読み込み、内部リンクがルートパス指定されていたためホームディレクトリを参照してしまっていた。

■ 実現したいこと
<ul>
    <li>/test/ の配下でルートパス指定をしたときは /test/ をドキュメントルートとして読み込みたい</li>
    <li>それ以外のルートパス指定ではホームディレクトリを参照したい</li>
</ul>

<hr>

＜＜　解決　＞＞
下記をホームディレクトリの.htacessに追記する

Options +SymLinksIfOwnerMatch
RewriteBase /
RewriteCond %{HTTP_REFERER} /test/
RewriteCond %{REQUEST_URI} !/test/
RewriteRule ^(.*)$ test/$1 [L,R]

参考）https://www.gravity-works.jp/gravica/web/htaccess/004589.html
Colabより使いやすいノートブックをおすすめします

最近、友達におすすめされて「Deepnote」というデータ分析のノートブックを試してみました。Jupyter NotebookタイプのSaaSなのですが、Colabよりもかなり使いやすかったので、皆さんにもおすすめしたいと思います。

Deepnoteの特徴は、リアルタイムで他の人と共同コーディングができることと、UIがとても直感的で使いやすいことです。さらに、LLMとの連携も優れていて、自然言語で指示を出すだけでデータ分析をしてくれます。（ノーコーディングデータ分析みたいな感じ）GitHubのCopilotにも似たような機能はありますが、Copilotはどちらかというとコードのエラー修正やコード構造の理解のサポートが中心です。

例えば、次の使用例では、Excelファイルをアップロードすると、自動的に以下のような分析タスクの提案が入力欄に提示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/452f8cad-e17c-96b6-05dc-52cf52b7e250.png)

最初の提案（データセット内の変数間の関係を可視化する）をクリックすると、自動的に必要なPythonコードを作成・実行し、Seabornで可視化結果を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/4cb70f9e-218b-b6ff-281f-22db56ba60f1.png)

自分でコードを書くこともできます。その場合はColabと同じように使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/c7749bfd-cbb6-d36f-d9cd-1071cd2d83d9.png)


APIキーやrequirementsの管理も便利です。画面左側のIntegrationsとFilesセクションで設定すれば、ユーザーの全てのノートブックで自動的に読み込まれるので、最初に読み込みコマンドを実行する必要がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d940c85f-7aea-5aae-dfd9-059ef6e131ac.png)

また、Deepnoteのホームページでは、DeepnoteとColab、SageMakerなどの他ノートブックとの違いを比較するページもあります。そこではDeepnoteの様々な機能について詳しく紹介されていますので、興味ある方は確認してみてください。

![屏幕截图 2024-07-15 194349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d2679a63-c50b-ee96-3e43-046d29f1a791.png)

あと料金については有料版と無料版がありますが、無料版でも十分使えると思います。（有料版の方はデータ分析に特化してファインチューニングされたLLMを使えます）

興味ある方試してみてください：

https://deepnote.com/
Skype for Business Basic クライアントのインストール

# はじめに
このたび、Skype for Business Server を構築する機会がありましたので、その際の手順をまとめました。

Skype for Business の頭文字を取り、略して SfB として記載します。

この記事では、SfB クライアント のインストール手順となっています。

# 接続する SfB サーバーについて
以下の手順で構築した SfB サーバーへの接続を想定しています。

https://qiita.com/carol0226/items/56fc31e66ecb6e7db311

# 前提事項
SfB サーバーに接続するためには、証明書が必要です。
ドメインに参加していれば、自動的に配布されます。

このインストール手順は、Office 365 アプリケーションを導入している環境と同居が可能です。
しかし、パッケージ版 (MSI インストーラー) の Office とは同居ができません。これらの Office を使っている場合は、メディアに同梱の Skype for Business を使ってください。

# インストール手順

0. Microsoft 365（旧：Office 365）へサインイン を行います。
※Office 365 のライセンスが適用されたユーザー
https://www.office.com/
　<br>
0. 下図の通り **インストールなど** を開き **Microsoft 365 アプリをインストールする** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c56f30de-258d-b64c-9496-03ad072d2141.png)
　<br>
0. 左ペインの **アプリとデバイス** を選び、表示された **Skype for Business** から 言語などを指定して **Skype のインストール** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/32fe051c-13a0-cba9-b8bc-440c7941ad17.png)
　<br>
0. ダウンロードが完了したら **OfficeSetup.exe** を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2e4b58f7-5822-bdeb-dec1-68dceea3874f.png)
　<br>
0. ユーザーアカウント制御 (UAC) が表示されたら **はい** で応答します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6bac0adb-1233-74cb-c59b-68385d9f132e.png)
　<br>
0. インストールを待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/064e5eb3-b3c3-7984-f311-15025fef0489.png)
　<br>
0. 完了すると、右下に 以下の通知が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bc076364-125d-d625-e681-91334147bc15.png)
　<br>
0. 以下の完了画面では **閉じる** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7bb87110-24c6-ec31-808d-8330c94857de.png)

# 起動 と SfB サーバーへの接続
0. スタートボタンを押して **Skype for Business** アプリを見つけて、選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/90c8f840-8a59-983c-6b33-910cbaa12b7c.png)
　<br>
0. 起動中のバナーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7c9ecacc-9123-d796-a6e2-d9dd9000f19b.png)
　<br>
0. SfB サーバーに接続できる環境にいる場合は、ドメインにサインインしていたアカウントを使って、自動的にサインインが行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e83431fa-5677-b015-64c6-592a47775d31.png)

# その他

## 手動構成
SfB サーバーの DNS 設定に誤りがあったり、クライアントが DNS サーバーを参照できない場合は、手動構成で接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9406b983-4a1b-e5a2-c38f-cc59e6cc812a.png)

## 証明書エラー
ドメインに参加していない場合は、以下のとおり 証明書エラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/85a07ef4-a8a8-1dd3-c12f-ff0c674038dd.png)

# 参考
https://support.microsoft.com/ja-jp/office/skype-for-business-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-8a0d4da8-9d58-44f9-9759-5c8f340cb3fb#OS_Type=Windows

本記事で紹介している手順は、上記のサイトに記載されているうち、以下の 赤枠 の手順となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f0a7f4a7-ff51-6242-dca0-6612b355e714.png)
Linux で sudo コマンドを実行する方法

Linux をインストールした直後，`sudo` コマンドを実行しようとすると，以下の写真のようなエラーが発生します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206897/1cd7b026-0019-872b-ee80-42fb22753b56.png)

# 解決策

まずは，`su` コマンドで rootユーザーにログインします．

```
su -
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206897/a1586a0d-3409-708b-e047-68ba3efa1b9a.png)

次に，`usermod` コマンドで，`sudo` コマンドを実行したいユーザーを `sudo` グループに追加します．

```
usermod -G sudo <USERNAME>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206897/a1147837-12a8-fa03-8c53-071dfcdb667e.png)

PC を再起動し，もう一度 `sudo` コマンドを実行すると，問題なく実行できるようになっています．
Raspberry Piのwifi設定(ステルスSSID)をnmcliで設定

Raspberry Piのwifi設定を毎回検索するのがだるくなったので、忘備録兼誰かの力になれればと残しておきます。

**※Raspberry PiのOSをSDカードに書き込んで初回起動している前提です。**

## 1.wifiのデバイス名を取得する
wifiのデバイス名を確認します
```
nmcli
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839369/d36d3008-a012-acac-0380-b0a15d3cb733.png)
見づらいですが本環境では**wlan0**になっています。
環境によってはデバイス名が違う可能性もあるのでご注意下さい。

## 2.wifi用のコネクションを作成する。
wifiの接続用プロファイルがないので作成します。
```
nmcli device wifi connect {SSID} password {PASS} ifname wlan0
```
{SSID}の場所へ接続するSSIDを入力して{PASS}の部分へパスワードを入力します。
※この時点でDHCPが有効になっているネットワークであれば接続ができます。

本環境ではDHCPが有効になっていないネットワークなので以下の画像のようになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839369/85eec0d5-103c-6ec5-3bf5-fce6f2d92227.png)


## 3.wifiのプロファイルのプロファイル名を変更
自動作成されるプロファイル名は分かりづらいので、デバイス名と同じものにしておきます。
このままでもいい場合は手順をスキップして下さい。
```
nmcli device 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839369/0826dc56-0f92-0f37-1280-797ea401d14b.png)
本環境では**preconfigured**となっています。
これを次のコマンドでデバイス名と同じ「**wlan0**」へ変更します。
```
nmcli connection modify 'preconfigured' connection.id wlan0
```
再度確認するとコネクション名が「**wlan0**」へ変更されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839369/86365ecc-fa2a-126b-ff70-9610a582d9a6.png)


## 4.wifiプロファイルを変更して固定IPを割り当てる
まず自動設定から手動設定にするためのコマンドを入力します。
```
nmcli connection modify wlan0 ipv4.method manual
```
このコマンドを実行すると手動設定になります。
次にIPアドレスを割り当てます。
```
nmcli connection modify wlan0 ipv4.addresses "192.168.11.5/24"
```
この設定ではwifiには接続できますがインターネットには接続できないので、DNSの設定も行っておきます
```
nmcli connection modify wlan0 ipv4.dns "8.8.8.8, 192.168.11.1"
```
ゲートウェイの設定も行っておきます。
```
nmcli connection modify wlan0 ipv4.gateway "192.168.11.1"
```
最後にwifiコネクションを再起動します。
```
nmcli connection down wlan0 && nmcli connection up wlan0
```

## 5.接続確認
google.comへpingを飛ばして返ってくるかをかくにんします。
```
ping google.com
```
これでgoogleから応答があれば無事に接続が完了しています。
M5stackCore2 で日本語表示

# M5stackCore2 で日本語表示

M5Stack Core2で日本語を表示する方法について紹介します。

lovyanGFXライブラリを入れるとか、SDカードにフォントファイルを入れて読み出すとか初心者が手を出すにはハードルが高いかなと思ったので簡単な方法がないかと調べた結果、

M5Unifiedライブラリを使用すれば、非常に簡単に日本語表示ができることがわかりました。

## 簡単な日本語表示方法

M5Unifiedライブラリを使用している場合、以下のコードを追加するだけで日本語表示が可能になります：

```cpp
#include "M5Unified.h"

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  
  M5.Lcd.setTextFont(&fonts::efontJA_16);
  M5.Display.setTextSize(1);
  M5.Lcd.println("こんにちは");
}
```

これだけです！超簡単！

![IMG_4910.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/855cce66-c51f-ca2e-edfe-e3dbe933d1cb.jpeg)

ちなみにフォント設定をしていないとこうなります。
![IMG_4913.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/00619776-69d0-e0d2-ddf7-b2fadd6c106b.jpeg)
□□□□□□□と表示されてしまいます。

# なぜこれで日本語表示ができるのか？

M5Unified ライブラリは内部で M5GFX ライブラリを使用しています。
M5GFX は LovyanGFX をベースにした、M5Stack デバイス向けに最適化されたグラフィックスライブラリであり、多くのフォント（日本語フォントを含む）が含まれています。

なので、M5Unified を使用することで、M5GFX の機能（フォントを含む）に簡単にアクセスでき、その結果として日本語フォントを直接利用できるのです！

# M5GFXフォント一覧

M5GFX ライブラリには、以下のようなフォントが含まれています：

### 英語（ASCII）フォント：
- `fonts::Font0` ～ `fonts::Font7`
  （サイズや太さの異なる様々なフォントがあります）

### 日本語・中国語フォント：
- `fonts::efontCN_8`
- `fonts::efontCN_10`
- `fonts::efontCN_12`
- `fonts::efontCN_14`
- `fonts::efontCN_16`
- `fonts::efontCN_24`
- `fonts::efontCN_32`
- `fonts::efontCN_64`

### 日本語のみのフォント：
- `fonts::efontJA_8`
- `fonts::efontJA_10`
- `fonts::efontJA_12`
- `fonts::efontJA_14`
- `fonts::efontJA_16`
- `fonts::efontJA_24`
- `fonts::efontJA_32`
- `fonts::efontJA_64`

### その他：
- `fonts::lgfxJapanGothic_12`
- `fonts::lgfxJapanGothic_16`
- `fonts::lgfxJapanGothicP_16`
- `fonts::lgfxJapanMinchoP_16`

フォント名の末尾の数字はフォントサイズ（ピクセル）を示しています。
全てのフォントかどうかは調べていませんが、これだけあれば実用に足りるかなと思いました。

もし、凝ったフォントを使いたいという場合はフォントファイルを作成し、それをSDカードから読み出すというのが良い方法だと思います。時間があれば試してみたい。。

# 最後に
おそらくこういった情報は意外と見つけにくいですし、色々試してみるにはコンパイルやイメージの書き換えに時間がかかるので億劫になりがちです。

今後もハマった部分は極力記事にしていきたいなと思っておりますm(_ _)m
時間が許せば…(´・ω・｀)
BigQueryで相関関係を調べる方法

### BigQueryで相関関係を調べる方法

ビッグデータの解析において、特徴量同士の相関関係を理解することは非常に重要です。特に機械学習モデルを構築する際には、相関関係を把握することで、モデルの性能を向上させたり、不要な特徴量を削減したりすることができます。今回は、BigQueryを使って相関関係を調べる方法を紹介します。

#### Pearsonの相関係数とは

相関関係を調べる方法として一般的なのは、Pearsonの相関係数です。これは、2つの変数間の線形関係の強さを測る指標で、-1から1の範囲をとります。1に近いほど強い正の相関関係、-1に近いほど強い負の相関関係、0に近いほど相関がないことを意味します。

#### BigQueryで相関関係を計算する

BigQueryには、Pearsonの相関係数を計算するための `CORR` 関数が用意されています。これを使えば、簡単に2つのカラム間の相関関係を計算することができます。

以下は、BigQueryで2つのカラムの相関関係を調べるSQLクエリの例です。

```sql
SELECT
  CORR(column1, column2) AS correlation_coefficient
FROM
  your_dataset.your_table;
```

このSQLクエリは、`your_dataset.your_table` テーブルの `column1` と `column2` との間の相関係数を計算します。

#### 複数の特徴量間の相関行列を計算する

複数の特徴量間の相関行列を計算する場合、各特徴量ペアに対して相関係数を計算する必要があります。以下は、複数の特徴量の組み合わせに対して相関係数を計算する例です。

```sql
WITH correlation_matrix AS (
  SELECT
    'column1' AS variable1,
    'column2' AS variable2,
    CORR(column1, column2) AS correlation_coefficient
  FROM
    your_dataset.your_table
  UNION ALL
  SELECT
    'column1' AS variable1,
    'column3' AS variable2,
    CORR(column1, column3) AS correlation_coefficient
  FROM
    your_dataset.your_table
  UNION ALL
  SELECT
    'column2' AS variable1,
    'column3' AS variable2,
    CORR(column2, column3) AS correlation_coefficient
  FROM
    your_dataset.your_table
)
SELECT
  variable1,
  variable2,
  correlation_coefficient
FROM
  correlation_matrix;
```

このクエリでは、3つのカラム `column1`、`column2`、`column3` のペアごとに相関係数を計算し、結果を `correlation_matrix` として取得します。各ペアについて、個別に `CORR` 関数を使って相関係数を計算し、結果を結合しています。

#### スクリプト化による自動化

多くの特徴量間の相関を調べる場合、手作業でSQLを書くのは現実的ではありません。BigQueryではスクリプトを使ってループ処理を行うことが可能で、これを利用して自動化することができます。

以下は、スクリプトを使って複数の特徴量間の相関係数を自動で計算する方法の例です。

```sql
DECLARE columns ARRAY<STRING>;
SET columns = ['column1', 'column2', 'column3', 'column4']; -- 使用する全てのカラムをここにリスト

DECLARE i INT64;
DECLARE j INT64;

SET i = 1;

CREATE TEMP TABLE correlation_matrix (variable1 STRING, variable2 STRING, correlation_coefficient FLOAT64);

WHILE i < ARRAY_LENGTH(columns) DO
  SET j = i + 1;
  WHILE j <= ARRAY_LENGTH(columns) DO
    EXECUTE IMMEDIATE format("""
      INSERT INTO correlation_matrix
      SELECT
        '%s' AS variable1,
        '%s' AS variable2,
        CORR(%s, %s) AS correlation_coefficient
      FROM
        your_dataset.your_table;
      """, columns[ORDINAL(i)], columns[ORDINAL(j)], columns[ORDINAL(i)], columns[ORDINAL(j)]);
    SET j = j + 1;
  END WHILE;
  SET i = i + 1;
END WHILE;

SELECT * FROM correlation_matrix;
```

このスクリプトは、指定したカラムリスト内の全てのペアについて相関係数を計算し、結果を `correlation_matrix` テーブルに挿入します。最終的に `correlation_matrix` テーブルの内容を出力します。

#### まとめ

BigQueryを使えば、簡単に相関関係を調べることができます。特に、特徴量同士の相関を把握することで、機械学習モデルの性能向上や特徴量選択に役立てることができます。今回紹介した方法を使って、ぜひ自分のデータに適用してみてください。
デバッグログやごみ箱について

デバッグログの削除

```
SELECT Id, StartTime, LogUserId, LogLength, Location FROM ApexLog WHERE LogUserId = '005xxxxxx'
```

「LogLength」で並び替える
[Delete Row (行を削除)] をクリックします。



ごみ箱の場所
Classic
https://xxxx.my.salesforce.com/search/UndeletePage

Lightning Experience
https://xxxx.my.salesforce.com/lightning/o/DeleteEvent/home
最高のエンジニアライフプランを紹介しよう

## 最高のエンジニアライフプランを紹介しよう

### はじめに
エンジニアとしてのキャリアは、ドラクエなどに似ていると感じています。新しいスキルを習得したり、難しい課題に取り組むことは、ドラクエで新しい技を覚えたり、強い敵に挑む感覚と非常に似ています。

私がエンジニアとして、何が一番楽しいか考えた時に「**自分のスキルをレベルアップさせるのが楽しい！**」と思うタイプでした。新しい出来ることが増えたり、習熟度が上がったり。
RPGでいうレベル上げが好きなタイプです。
この記事では、自分のスキルをレベルアップさせながら、最高のエンジニアライフを実現するためのプランを紹介します。

### 1. 自己分析と目標設定
#### 自己分析
冒険を始める前に、自分の強みと弱みを理解することが大切です。これは、自分のジョブ（職業）を選ぶようなものです。戦士、魔法使い、僧侶、それぞれのジョブに強みと弱みがあり、どのスキルを伸ばすかを決めるために自己分析が必要です。

#### 目標設定
次に、冒険の目標を設定します。最初のボスを倒すために必要なスキルを学び、最終的には大魔王を倒すという大きな目標を立てましょう。短期目標と長期目標を設定し、それに向けて進むことが重要です。

### 2. スキルアップと学習計画
#### 基礎スキルの習得
冒険の初期段階では、基本的なスキルを習得することが大切です。これは、戦士が剣の扱い方を学び、魔法使いが基本の呪文を覚えるようなものです。プログラミング言語を選び、その基礎をしっかりと学びましょう。

#### 継続的な学習
冒険が進むにつれて、より高度なスキルを習得する必要があります。オンラインコースや技術書を活用して、常に新しい技術を学び続けることが、強力なスキルセットを築くために必要です。ここで重要なのは、新しいスキルや技術を学ぶことで、経験値を積み重ね、自分自身をレベルアップさせることです。例えば、新しいプログラミング言語を学ぶ、フレームワークを習得する、最新の技術トレンドをキャッチアップするなど、常に新しいチャレンジに取り組むことが重要です。

### 3. ネットワーキングとコミュニティ参加
#### コミュニティ参加
私はまだ出来ておりませんが、冒険を共にする仲間を見つけることも大切です。仕事仲間でもいいですが、ハッカソンなどに参加し、オープンソースプロジェクトに貢献することで、ネットワークを広げましょう。仲間との情報交換やコラボレーションは、自分のスキルをさらに高めるために重要です。

#### プロフェッショナルネットワーキング
SNS等を活用して、冒険を共にするプロフェッショナルネットワークを築きましょう。メンターや仲間を見つけることも、成長のために重要です。メンターや仲間からのアドバイスやフィードバックを受けることで、自分のスキルを磨き、キャリアの方向性を定める手助けになります。

### 4. バランスの取れたライフスタイル
#### ワークライフバランス
冒険の合間には、休息も必要です。健康管理やフィットネスを大切にし、趣味やリラクゼーションの時間を確保することが、長い冒険を続けるために必要です。バランスの取れたライフスタイルは、持続可能なキャリアを築くために欠かせません。

#### メンタルヘルス
ストレス管理とメンタルヘルスケアも重要です。定期的に休暇を取り、心身のリフレッシュを図りましょう。リフレッシュすることで、新しいチャレンジに対する意欲や集中力を取り戻すことができます。

### 5. 長期的なキャリアビジョン
#### キャリアの方向性
冒険の終盤には、次のステージを考える必要があります。マネジメントへのキャリアパスや技術スペシャリストとしてのキャリアパスを考え、自分に合った方向を見つけましょう。キャリアの方向性を定めることで、自分の成長を計画的に進めることができます。

#### 継続的な自己改善
定期的な自己評価とフィードバックを活用し、新しい技術やトレンドをキャッチアップすることで、常に成長を続けることが重要です。自己改善のために、定期的に目標を見直し、新しいチャレンジに取り組むことを忘れないようにしましょう。

### 結論
エンジニアとしてのキャリアをドラクエの冒険になぞらえると、レベルアップの楽しさが日々のモチベーションとなります。新しいスキルを習得し、難しい課題に挑戦することで、着実に成長を実感できます！
複数名のGoogleカレンダー予定をAWS Lambdaで取得する

# はじめに
部署やグループ全体のスケジュール調整にはGoogleカレンダーを利用するのが便利ですが、複数のカレンダーを同時に確認するのは手間がかかります。
そこで、GoogleカレンダーAPIを使用して複数人分のスケジュールを取得する方法を紹介します。この処理は主にAWS Lambdaを使用して実装しました。

# 1. GCPでサービスアカウントを用意
まず最初に、GoogleカレンダーAPIを利用するためには、Google Cloudのプロジェクトを作成し、サービスアカウントを設定する必要があります。

このサービスアカウントにドメイン全体の委任を行い、`/auth/calendar.readonly`といったスコープを設定します。※ワークスペースの管理者権限が必要
このサービスアカウントのサービス アカウント キーやWorkload Identity 連携を利用しサービスアカウントの権限でAPIを叩きます。

# 2. 予定を取得するLambda関数
次に、実際に予定を取得する処理をAWS Lambdaで実装します。

実行者のメールアドレスをcredentialのsubjectに指定することにより、実行者から見える予定をすべて取得することができるようになります。
```python
import boto3
import googleapiclient.discovery
from google.oauth2 import service_account

MYEMAIL="example1@email.com" # 実行者のメールアドレス
EMAILS=["example1@email.com,example2@email.com,example3@email.com"] # 予定を取得したいアカウントのリスト

# AWS Lambdaで使用するための設定。ここではサービスアカウントキーを使用する方法を取っている。
BUCKET = 'your-bucket-name'
KEY = 'path-to/your-key.json'
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']

# GoogleAPIのクレデンシャル情報の取得
s3 = boto3.client('s3')
key_data = json.loads(s3.get_object(Bucket=BUCKET, Key=KEY).read().decode('utf-8'))
credentials = service_account.Credentials.from_service_account_info(key_data, scopes=SCOPES)
delegated_credentials = credentials.with_subject(post_data[MYEMAIL])

# Google CalendarのAPIクライアントの作成
calendar = googleapiclient.discovery.build('calendar', 'v3', credentials=delegated_credentials)
```
全ての予定を取得する処理本体は時間がかかるため、人毎に非同期で行っています。

```python
# 予定を取得する関数
# start_date_string,end_date_stringは予定を検索する範囲
async def get_busy_times(calendar, EMAILS, start_date_string, end_date_string):
    tasks = {email: fetch_events_for_user(calendar, email, start_date_string, end_date_string) for email in EMAILS}
    finished_tasks = await asyncio.gather(*tasks.values())
    all_busy_times = {email: task for email, task in zip(tasks.keys(), finished_tasks)}
    return all_busy_times

async def fetch_events_for_user(calendar, email, start_date_string, end_date_string):
    busy_times = []
    page_token = None

    while True:
        events_response = calendar.events().list(
            calendarId=email,
            timeMin=start_date_string,
            timeMax=end_date_string,
            singleEvents=True,
            orderBy='startTime',
            pageToken=page_token
        ).execute()

        events = events_response.get('items', [])
        busy_times.extend(events)

        page_token = events_response.get('nextPageToken')
        if not page_token:
            break

    return busy_times
```

# まとめ
今回、GoogleカレンダーAPIを使用して複数のユーザーのスケジュール取得する方法を紹介しました。
この方法を使えば、複数の人の予定を比較して、共通の空き時間を見つけることができます。Slackなどと連携すれば、社内のだれでも利用できる便利ツールにすることも可能です。

もっと効率的な方法もあるかもしれませんが、この記事が少しでもスケジュール調整のお役に立てれば幸いです。
USBキーボードマウスとして振舞えるM5シリーズまとめ

## 背景
IoT機器をHID(キーボードやマウス)としてPCやスマホにアプローチしたいな
BLEも手としてはあるが下手に開発しても巨額の制裁金喰らう可能性があるから怖いな。
もう物理的にUSBでいいか

## 予備知識

### USBキーボードマウスとして振舞うのに必要な機能
　USB-OTG機能が必要。M5シリーズでその機能を所有しているか確認するにはSoCを確認する必要がある。M5シリーズは2024年4月に親会社になったEspressifのESP32シリーズを採用しているので以下のサイトから
 
 https://products.espressif.com/#/product-comparison

USB-OTGが1以上になっているものが実現可能なSoCである。

### USB-OTG搭載のEspressif

大まかに分類するとS2シリーズ、S3シリーズ、P4シリーズが該当する。
以下20240716時点の詳細

|シリーズ|詳細一覧|
|:-----------|------------|
|S2| ESP32-S2 ESP32-S2FH2 ESP32-S2FH4 ESP32-S2FN4R2 ESP32-S2R2|
|S3| ESP32-S3 ESP32-S3R2 ESP32-S3R8 ESP32-S3R8V ESP32-S3FN8 ESP32-S3FH4R2 ESP32-S3-PICO-1-N8R2 ESP32-S3-PICO-1-N8R8|
|P4|ESP32-P4NRW16 ESP32-P4NRW32|

### USB－OTG搭載のM5シリーズ一覧
今から買うならESP32-S3シリーズを選択。単なる中継器ならATOMS3 Liteがおすすめ。

| M5シリーズ分類|製品名|SoC|USB-OTG|
|-----------|------------|-----------|-----------|
| Core|M5Stack CoreS3|ESP32-S3|1|
| ATOM|ATOMS3 Lite|ESP32-S3FN8|1|
| M5Stamp|M5Stamp S3|ESP32-S3FN8|1|
| M5Dial|M5Dial|ESP32-S3FN8|1|

### USB-OTGがないM5シリーズ一覧
残念ながら振る舞えないものは以下の通り。
| M5シリーズ分類|製品名|SoC|USB-OTG|
|-----------|------------|-----------|-----------|
| Core|M5Stack Basic V2.7|ESP32-D0WDQ6-V3|0|
| Core|M5Stack Core2 v1.1|ESP32-D0WD-V3|0|
| M5StickC|M5StickC Plus|ESP32-PICO-D4|0|
| M5StickC|M5StickC Plus2|ESP32-PICO-V3-02|0|
| ATOM|ATOM Lite|ESP32-PICO-D4|0|
| M5Stamp|M5Stamp C3 Mate|ESP32-C3|0|
| M5NanoC6 |M5nanoC6|ESP32-C6FH4|0|

M5NanoC6は2024年発売だが機能が無いので注意。
【C#5】坂道グループに関するお題を抽選するプログラム

# はじめに
何かのお題を抽選するプログラムをC#で実装しました

## ソースコード
```C#
using System;
// リストを使用するクラスを呼び出す
using System.Collections.Generic;
using System.Linq;
// ファイルの読み書きのためのライブラリを呼び出す
using System.IO;
using System.Text;

namespace Sample
{
    class Sample
    {
        static void Main()
        {   
            // ファイル名を定義
            string file_name = "sakamichi.txt";
            // EIDリストの定義
            var titlelist = new List<string>();
            // StreamReaderクラスを読み込むファイル名とエンコードを指定してインスタンス化する
            StreamReader sr = new StreamReader(file_name, Encoding.GetEncoding("utf-8"));
            // 配列の要素の0番目を指定する変数
            int target = 0;
            while (sr.Peek() != -1)
            {
                // ファイルを1行ずつ読み込み、リストに追加する
                string eid = sr.ReadLine();
                titlelist.Add(eid);
            }

            sr.Close();
            // お題リストの要素をシャッフルする
            titlelist = titlelist.OrderBy(a => Guid.NewGuid()).ToList();

            Console.WriteLine("-----乃木坂に関するお題を１つ表示します-----");
            Console.WriteLine(titlelist[target]);
            
           
        }
    }
}
```

## お題ファイル
```
好きな乃木坂46の曲
好きな櫻坂46の曲
好きな日向坂46の曲
乃木坂46の推しメン
櫻坂46の推しメン
日向坂46の推しメン
```

## 出力結果
![test1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/68fd5225-e574-fdd7-9f15-b8f783399b4b.jpeg)

# 最後に
C#5はWindowsに標準でインストールされるコンパイラーなので、C#5でプログラムを始めてはいかがでしょうか
Ubuntuで「UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.」と出て起動できない時の対応方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128429/fa453f94-e791-8928-15f5-33c9d4f7ddda.png)

VMWare上のUbuntuを起動しようとした際に、以下のようなエラーメッセージが表示され、起動できなくなりました。

```bash
[    2.529603] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
/dev/mapper/vgubuntu-root contains a file system with errors, check forced.
/dev/mapper/vgubuntu-root:
Inodes that were part of a corrupted orphan linked list found.

/dev/mapper/vgubuntu-root: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
        (i.e., without -a or -p options)
fsck exited with status code 4
The root filesystem on /dev/mapper/vgubuntu-root requires a manual fsck

BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs)
```

## 環境

- VMWare Workstation 15
- Ubuntu 22.04

## 手動でファイルシステムの修復を実行する

ファイルシステムに不整合があり、自動修復ができなかったようです。

↓エラーメッセージのこの部分

`/dev/mapper/vgubuntu-root: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.` 

（UNEXPECTED INCONSISTENCYは日本語で「予期せぬ矛盾」）

手動でファイルシステムの修復を実行すると直りました。

1. **initramfsシェルでfsck実行**
    
    以下のコマンドでファイルシステムのチェックを実行します。
    
    ```
    fsck /dev/mapper/vgubuntu-root
    ```
    
    何度か修復するかどうかを聞かれるので、全部 `y` を打ちました。
    
2. **再起動**
    
    `reboot` コマンドを打っても再起動しなかったので、VMWareから仮想マシンを再起動しました。
    
    よく考えるとinitramfsに入っていたので、`exit` を打てばよかったかもしれません。
『価値ある論文を求めて』 Python使ってPDFから本文抽出編 (1/n) 

# 動機
**研究者なら研究以外のことに時間をかけるべきではないです**

そして、良い研究の成果を得るには『良い論文を探す・読み込む・理解する・アウトプットする』
一連のプロセスが重要になります

そこで今回は『私にとって価値のある論文を探す』ことに焦点を当て、
「ChatGPTに論文要約、論文比較を自動的にやってもらう」 ことを目的としています



# 今回行うこと
まずは、文字と画像が含まれる論文のPDFファイルをJsonファイル形式で出力できるようにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/10dc8926-96d3-617a-7442-884ac8d994ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/354a7b7c-f50d-295d-fe61-5bfe780c4141.png)

# 仕様
入力はpdfのみ、出力はjsonのみとします

## 必要ライブラリ
- pypdf
- re
- json 

## 詳細な仕様
1. 題名・著者名はページ0にあると想定
    1. 題名は一番初めに来て、改行がないと想定
    1. "Abstruct"の文字列を検索し、著者名を抽出
1. 改行の直前が"-"の場合これを除去
1. /uniXXXXXXXXを除去(画像を指定する文字？)
1. 複数回連続する空白を除去


# 次回の予定
- arXivから自動的に論文を拾ってくる機能を作る予定

# 付録
実験に使ったコード
気が向いたらGithubにまとめておきます

``` 
# %%
# !pip install pypdf
pip install pypdf

# %%
# !ls *.pdf
ls *.pdf
```

pdf_extructor.py
```
# %%
# ライブラリのインポート
from pypdf import PdfReader
pdf_name = "2304.08069v3"
# PDFファイルの読み込み
reader = PdfReader(f"{pdf_name}.pdf")

# ページ数の取得
number_of_pages = len(reader.pages)

# ページの取得。この場合は、1ページ目を取得する。
page = reader.pages[0]

# テキストの抽出
text = page.extract_text()

# %%
import re
def decord_text(page_texts):
    page_text=""
    for text in page_texts:
        if text[-1] == "-":
            text = text[:-1]
        text.replace('. ', '. \n')
        pattern = re.compile('/uni[0-9a-fA-F]{8}')
        text = pattern.sub('', text)
        pattern = re.compile('\s+')
        text = pattern.sub(' ', text)
        page_text+=text
    return page_text

def extract_paper_sections(reader):
    # タイトルの抽出 (最初の段落として見なす)
    cnt=0
    page_dict=dict()
    page_raw = reader.pages[0].extract_text()
    page_texts = page_raw.strip().split("\n")
    page_dict["title"] = page_texts[0]
    abstruct_flag = [idx for idx, text in enumerate(page_texts) if (text=="Abstract")][0]
    page_dict["authors"] = page_texts[1:abstruct_flag]
    page_dict["page"] = {}
    page_dict["page"][cnt] = decord_text(page_texts[abstruct_flag:])

    for page in reader.pages[1:]:
        cnt+=1
        page_raw = page.extract_text()
        page_texts = page_raw.strip().split("\n")
        page_dict["page"][cnt] = decord_text(page_texts)
    return page_dict

# %%
page_dict = extract_paper_sections(reader)

# %%
import json
with open(f'{pdf_name}.json', 'w', encoding="utf8") as f:
    json.dump(page_dict, f, indent=4, ensure_ascii=False)

```


# 【実験】ChatGPTに入れてみた

全部入れると落ちるので、マニュアルで分割して入れました
将来的には参考論文も自動探索してくれると嬉しいですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/10febd33-88c5-3c31-c66f-74cffa3464ed.png)
Linuxが "SGX disabled by BIOS" のエラーで起動しないときの対処法

# TL;DR
グラボのドライバがインストールされていなかったのでエラーが出ていた．
`nvidia-driver` をインストールすることで解決．

# はじめに
次の構成で検証を行いました．

| 項目名 | 内容 |
| :-- | :-- |
| OS | Debian 12 |
| CPU | インテル® Core™ i7-10700K |
| GPU | NVIDIA GeForce RTX 3060 |
| マザーボード チップセット | H570 |

※ SSD を2枚マウントして Windows 11 とのデュアルブートを行っています．

# エラー概要

Windows 11 と Debian 12 をデュアルブートして利用していましたが，
何らかの原因で Debian 12 が起動しなくなりました．
BIOS のエラーを見ると，以下のようなエラーが出力されていました．

```
SGX disabled by BIOS
```

# 原因と解決策

映像出力に NVIDIA のグラフィックボードを使用しており，NVIDIA のドライバがインストールされていないことが原因でした．
映像出力を グラフィックボードではなくマザーボードから直接行うことで起動できました．

ただこのままだとせっかくのグラフィックボードが使用でできないため，
Linux 上のターミナルで以下のコマンドを実行し，ドライバをインストールしました．

```
sudo apt-add-repository contrib
sudo apt-add-repository non-free
sudo apt update
sudo apt -y install nvidia-driver
sudo reboot
```

コマンドの詳細については[こちら](https://qiita.com/Hietan/items/b6123590bb5cf500b59e)のページを参考にしてください．

https://qiita.com/Hietan/items/b6123590bb5cf500b59e

PC を再起動し，映像出力をグラフィックボードに戻すことで，エラーなく起動できました．

# おまけ

## エラー解決のために試したこと

エラー解決のために，以下の解決策を試してみました．

### BIOS の設定変更

エラー文で検索して最も多かった情報が BIOS の設定変更でした．
BIOS の設定で，`Intel Software Guard Extension (SGX)` を有効にすると治るそうです．
( 参考：[ask Ubuntu, SGX disabled by BIOS in Ubuntu 22.04](https://askubuntu.com/questions/1406760/sgx-disabled-by-bios-in-ubuntu-22-04) )

しかし，私の PC の BIOS には，SGX に関する設定項目がありませんでした．
また，H570 チップセットは SGX をサポートしていないという情報もありました．
( 参考：[パソコン工房 NEXMAG, Z590・H570・H510・B560 チップセットの機能をスペックから徹底比較！](https://www.pc-koubou.jp/magazine/49036#section04-03))

### Linux の再インストール

もともと OS を再インストールする予定だったため，何度か OS の再インストールを試してみました．
Ubuntu 24 や Debian 12 をインストールしてみましたが，変わらず同じエラーが発生しました．
docker runに失敗するDockerコンテナでどうにかshellコマンドを叩く方法

## 想定する背景

- Dockerイメージしか残ってない
- Dockerfile等もあるが，Code buildによってビルドされており，関連するファイルが多くて読む気にならない。

```shell
docker run -it イメージ名 "/bin/bash"
超絶長いエラーがでて起動しない!!
```

→とりあえず動いているイメージを見たいのでダウンロードしてきたが，コンテナがうまく起動しないよ!助けて!という人向けの記事です。


一旦コンテナに入ることでエラーの原因を特定する手がかりがつかめたりしますし，覚えておいても損はないんじゃないでしょうか。

---

## 結論

現在設定されているentrypointを一旦削除してやり，変わりのentorypointを記載することでコンテナの起動はできました。

```shell
docker run -it --rm --entrypoint /bin/bash イメージ名 -c "sleep 99999999"
```

別ターミナルを開いて

```shell
docker exec -it コンテナid "/bin/bash"
```
これで無事起動しないコンテナにログインすることができた!
Webサイトの高速化に関して

Webサイトの高速化に関する情報を、こちらの記事でまとめています。
[Webサイトの高速化に関して、ざっくりと解説！【売り上げやアクセス数にも影響します】｜RAM Inc.](https://raminc.co.jp/speed-up-your-website/)

Webサイトの高速化を考えている方は、ぜひご確認ください！
記載している情報の概要：
- Webサイトが重たくなってしまう原因
- Webサイトを高速化するメリット・デメリット
- いますぐにできる表示速度を改善する施策
- 可能であれば試して欲しい表示速度改善施策、
- WordPressの場合の表示速度改善施策
- ご自身で改善できない場合には、専門の業者へ依頼するのもおすすめです
Pycaretで精度が悪いときに試したほうがよいこと

# はじめに
Pycaret はとても便利なAutoMLサービスです。これは自動で前処理、ホールドアウト、交差検証、ハイパラチューニングなどの面倒な処理を行ってくれるのですが、前処理のせいで逆に「LightGBMを手書きするよりも精度が落ちるが、なぜかわからない」みたいなこともあります。そういうときに試すべきことをまとめました。

今回は、概ね次のようなコードで、(1)モデル比較、(2)ハイパラチューニング、(3)ブレンディング、(4)再度チューニング、(5)予測、という一連の操作を行う、という状況を考えています。

```py
from pycaret.classification import * #回帰の場合は pycaret.regression
setup(train_data, target = "target_col")
compare_models()

model1 = create_model('some model')
model2 = create_model('some model')
tuned_m1 = tune_model(model1)
tuned_m2 = tune_model(model2)

blended_model = blend_model([tuned_m1, tuned_m2])
tuned_blended_model = tune_model(blended_model)
final_model = finalize_model(final_model)
prediction_result = predict_model(final_model, data = test_data)
```



# Preprocess を切る
`setup` を呼ぶと、Pycaretは自動でデータを前処理し、追加の行を作っている。
場合によっては邪魔なので切ったほうがよい。

# test set のサイズを小さくする
デフォルトで `setup` を呼ぶと、データの30%がテストデータとして完全にホールドアウトされる。この部分はCVにも使われず、チューニングにも使われない。30%はかなり大きいので、用意されたデータが十分ない場合は、これだけで精度を落とすこともありうる。（もちろん後述する `finalize_model` を使うことでこの部分のデータも使ってくれるが、チューニングの時点で全データを使うか、70%のデータでチューニングをしてから、そのパラメータで全データを訓練するか、では結果が違ってくる）


特に、Kaggleでよく使われるLightGBMの実装では、特にホールドアウトをせずにCVのみ行うことが多い。こちらの方が訓練データが多いので、正確なCVの値が出ると思われる。

これは`setup(train_size = 0.999)` のように、train_sizeをほぼ100%にすることで無くすことができる。

# finalize model をする
Pycaretに関する記事で、たまにこのように書かれている記事がある。

```python
setup(train_data)
model = compare_models()
prediction = predict_model(model, test_data)
```

これでも動くのだけど、正しくはない。
まず `setup` の時点でデータがtrain, valid, testに分割されている。`create_model` は自動でK分割して交差検証をしてくれるが、このときはtrain, valid 間のみで行われる。testは一切触れられない。

testは完全にホールドアウトされて、最終的にできたモデルの精度を評価するために使われる。このときは `predict_model(model)` を使う。（データセットの指定をしないと、ホールドアウトされたtestデータを使ってくれる）

そして、このtestも最終的には訓練データとして使って予測機を作りたい。このために `finalize_model` をする。したがって、正しいコードはこのようになる。
```python
setup(train_data)
model = compare_models()
final_model = finalize_model(model)
prediction = predict_model(final_model, test_data)
```

# `predict_model` の丸め込みに気をつける
`predict_model` で最終的なモデルの推論をしたいとき、**デフォルトでは小数点以下4桁の精度で丸められる。** Kaggleなど、0.001単位での精度を競う場合はすこし不安なので、`predict_model(final_model, test_data, round = 30)` のようにして、`round` 引数を大きめに取っておいたほうがよい。

# `tune_model` に `choose_better=True` を付ける
`tune_model` や `blend_model` をするとき、探索したパラメータによい値がないと、結局もとのモデルのほうがよかった、ということが起こり得る。なので `tune_model(model, choose_better = True)` を付けておくとよい。この場合、元のモデルのほうが精度がよいなら、そちらを勝手に使ってくれる。どのメトリックを選ぶかは、`optimize = "MSE"` のように指定できる。
COBOLでクリスマスイブイブイブを解く


## はじめに
COBOLは歴史の長い言語でありながら今なお現役で使われています。
その一方でプログラマは減少しつつあり今後人材不足が危惧されています。
なので、多言語を並行して学習している人はその中にCOBOLを入れてみるのも面白いかもしれません。
ここでは、AtCoderの問題をCOBOLで3通りに解いて、COBOLスクリプトの特徴を紹介します。

## 問題
```text
問題文：
とある世界では、今日は 12 月 D 日です。
D=25 なら Christmas, D=24 なら Christmas Eve, D=23 なら Christmas Eve Eve,
D=22 なら Christmas Eve Eve Eve と出力するプログラムを作ってください。
22≤D≤25、Dは整数

使用言語：COBOL (Free) (GnuCOBOL 3.1.2)
```
[abc115_a.cbl](https://atcoder.jp/contests/abc115/tasks/abc115_a)

## 解法１：条件分岐
```cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
WORKING-STORAGE SECTION.
  01 INPT       PIC X(30).  //文字フィールド
  01 D          PIC 9(10).  //数値フィールド

PROCEDURE DIVISION.
  ACCEPT INPT.
  UNSTRING INPT DELIMITED BY SPACE INTO D
  IF D = 22
    DISPLAY 'Christmas Eve Eve Eve'
  ELSE IF D = 23
    DISPLAY 'Christmas Eve Eve'
  ELSE IF D = 24
    DISPLAY 'Christmas Eve'
  ELSE
    DISPLAY 'Christmas'
  END-IF.
  STOP RUN.
```
```py
D=int(input())
if D==22:
    print("Christmas Eve Eve Eve")
elif D==23:
    print("Christmas Eve Eve")
elif D==24:
    print("Christmas Eve")
else:
    print("Christmas")
```
UNSTRINGはPythonのsplit()メソッドと非常に似た機能を持っています。
Pythonと同様にif else文が使えます。

## 解法２：文字列スライス
```cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
WORKING-STORAGE SECTION.
  01 INPT       PIC X(30).
  01 D          PIC 9(10).
  01 E          PIC 9(10).
  01 X          PIC 9(10).
  01 ANS        PIC X(30) VALUE 'Christmas Eve Eve Eve'.

PROCEDURE DIVISION.
  ACCEPT INPT.
  UNSTRING INPT DELIMITED BY SPACE INTO D
  COMPUTE E = 25 - D
  COMPUTE X = 9 + 4 * E
  DISPLAY ANS(1:X)
  STOP RUN.

```
```py
D=int(input())
E=25-D
X=9+4*E
ANS='Christmas Eve Eve Eve'
print(ANS[0:X])
```
ANSの初期値として取りうる最大長の文字列を定義しています。
COMPUTEは、算術演算を行うための命令です。
COMPUTEで切り取る文字数を数値計算し、最後に必要な長さを切り取リます。


## 解法３：文字列結合
```cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
WORKING-STORAGE SECTION.
  01 INPT       PIC X(30).
  01 D          PIC 9(10).
  01 E          PIC 9(10).
  01 STR1    PIC X(9) VALUE "Christmas".
  01 STR2    PIC X(4) VALUE " Eve".
  01 RESULT  PIC X(100).
  01 PT PIC 99 VALUE 1.
  01 CT PIC 99 VALUE 1.

PROCEDURE DIVISION.
  ACCEPT INPT.
  UNSTRING INPT DELIMITED BY SPACE INTO D.
  COMPUTE E = 25 - D.

  STRING 
    STR1 DELIMITED BY SIZE
    INTO RESULT
    WITH POINTER PT.

  PERFORM VARYING CT FROM 1 BY 1 UNTIL CT > E　//for-loop文
    STRING 
      STR2 DELIMITED BY SIZE
      INTO RESULT
      WITH POINTER PT
  END-PERFORM.

  DISPLAY RESULT.
```
```py
D=int(input())
E=25-D
STR1='Christmas'
STR2=' Eve'
RESULT=STR1
for i in range(E):
  RESULT+=STR2
print(RESULT)

```
文字列の結合にはSTRING関数を用います。COMPUTEは数値計算専用であり文字列の結合はできません。
WITH POINTERは生成した文字列の長さを把握し次に結合させる文字列の頭の番地を記録させる仕組みで、COBOL特有のものです。
POINTERを設定することで、正しく文字列が結合できます。"Christmas Eve"
設定せずに結合させると、1番地からの上書きになってしまいます。" Evestmas"

## 終わりに
一つの問題を3通りに解くことで、COBOLの特徴のいくつかにスポットライトを当てることができたかと思います。
AtCorderの簡単な問題をいろいろな言語で解いています。言語間の違いを相互に知ることで、効率的に多言語並行学習を進めることが可能と考えています。皆様にもおすすめします。
クラウドネイティブとは？

# はじめに
こんにちは！
今回は最新のクラウドネイティブ技術について解説していきます！
「クラウドネイティブって何？」という方はぜひ読んでみてください。

# 対象読者
💡 クラウドネイティブ技術について知りたい方  
💡 これからクラウドネイティブの環境を取り入れたいと思っている方  
💡 技術的な最新トレンドに興味がある方  

# 目次
1. クラウドネイティブとは
2. クラウドネイティブ技術の重要性
3. コンテナオーケストレーションとは
4. マイクロサービスアーキテクチャの基礎
5. クラウドネイティブのベストプラクティス

# 1. クラウドネイティブとは
クラウドネイティブってについて知っていますか？
もしかして「クラウド」と「ネイティブ」って違うんじゃないの？と思っている方もいるかもしれません。
それもそのはず、クラウドネイティブという言葉自体が新しい概念だからです。

:::note info
クラウドネイティブとは、クラウド環境下でアプリケーションを開発・運用するための設計思想や技術の総称です。これには、コンテナ、マイクロサービス、継続的デリバリー、インフラストラクチャー自動化などが含まれます。
:::

## クラウドネイティブの基本
クラウドネイティブ技術は、以下の4つの特性が重要です：

1. **開放環境**：消費者が自由に選び、組み合わせることができる
2. **自動化**：インフラとアプリケーションのデプロイと管理
3. **サービスの提供**：分散システムでサービスを利用する
4. **継続的改善**：自動化と継続的デリバリーによる迅速なリリース

これらの基本を押さえておくと、クラウドネイティブ技術の全体像が見えてきますね。次に、この技術がなぜ重要なのかについてお話しします。

# 2. クラウドネイティブ技術の重要性
この章では、クラウドネイティブ技術の重要性について触れていきます。

## 現代のビジネス環境におけるクラウドネイティブの役割
現代のビジネスは、迅速な対応と柔軟性が求められています。その実現において、クラウドネイティブ技術がどれだけ重要か見てみましょう。

### スケーラビリティと弾力性
クラウドネイティブ技術を活用すると、アプリケーションは容易にスケールアップ（またはスケールダウン）できます。つまり、必要なリソースを適時に追加できるため、ビジネスの成長に合わせてシステムを拡張できます。

### アジリティ（迅速な対応力）
クラウドネイティブ技術のもう一つの強みは、迅速な対応が可能な点です。自動化と継続的デリバリーにより、新しい機能や修正を迅速にリリースできます。これにより、業界の変化に柔軟に対応できます。

### コスト効率
オンデマンドでリソースを利用できるため、必要なときにだけコストが発生します。これにより、イニシャルコストを抑えながら必要な機能を実現できるのです。

# 3. コンテナオーケストレーションとは
この章では、クラウドネイティブの中心的な技術であるコンテナオーケストレーションについて掘り下げます。

## コンテナ技術の基本
コンテナとは、アプリケーションとその実行環境を一つにまとめたパッケージのことです。これにより、一貫性が保たれ、アプリケーションがどこでも動作するようになります。

## コンテナオーケストレーションの役割
コンテナオーケストレーションとは、複数のコンテナを自動的に管理・調整するプロセスのことです。代表的なツールにはKubernetesがあります。

### Kubernetesの基本
Kubernetesは、Googleが開発したオープンソースのコンテナオーケストレーションツールです。自動化されたデプロイメント、スケーリング、運用管理を可能にします。

### オーケストレーションのメリット
1. **自動化**：デプロイメントおよび管理作業の自動化
2. **スケーラビリティ**：自動的なスケールアップ/ダウン
3. **高可用性**：アプリケーションの障害耐性の向上

# 4. マイクロサービスアーキテクチャの基礎
ここでは、マイクロサービスアーキテクチャの基本について探ります。

## マイクロサービスとは？
マイクロサービスアーキテクチャとは、アプリケーションを小さな独立したサービスの集合体として構築する手法です。それぞれのサービスは独立してデプロイでき、異なる技術スタックを使用できます。

### マイクロサービスのメリット
1. **拡張性**：サービスごとのスケールアップ/ダウン
2. **柔軟性**：異なる技術を組み合わせる自由
3. **迅速な開発**：独立したチームによる開発とデプロイ

### マイクロサービスの課題
構築と管理が複雑化するのが難点です。サービス間の通信やデータ管理の統制が必要です。

# 5. クラウドネイティブを取り入れる
最後に、クラウドネイティブ技術を取り入れる際の気をつけるポイントについて解説します。

1. **インフラストラクチャーのコード化**：TerraformやAnsibleを使用して、インフラの構築と管理をコード化します。
2. **継続的デリバリー（CI/CD）**：JenkinsやGitLab CIを活用してリリースプロセスを自動化します。
3. **監視とログ管理**：PrometheusとGrafanaを組み合わせて監視、ELKスタック（Elasticsearch, Logstash, Kibana）を使ってログ管理を行います。
4. **セキュリティの強化**：デフォルトでセキュアに構築し、定期的なセキュリティスキャンを実施します。

# まとめ
クラウドネイティブ技術は、現代のビジネスにおいて迅速な対応力と柔軟性を求める中で不可欠な技術です。プロジェクトに取り入れることで効率的な運用を目指しましょう！

# 参考文献
- Kubernetes公式サイト：https://kubernetes.io/
- Docker公式ドキュメント：https://docs.docker.com/
- Google Cloud公式ブログ：https://cloud.google.com/blog

---

このブログが皆さんの技術理解の一助となれば幸いです！次回もお楽しみに！
robloxでassistant その129

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
rainモジュールを使え。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- その下に、rainモジュールを置く。
- スクリプトを書く。
```
local Rain = require(script.Rain)
Rain:SetColor(Color3.fromRGB(script.Color.Value.x, script.Color.Value.y, script.Color.Value.z))
Rain:SetDirection(script.Direction.Value)
Rain:SetTransparency(script.Transparency.Value)
Rain:SetSpeedRatio(script.SpeedRatio.Value)
Rain:SetIntensityRatio(script.IntensityRatio.Value)
Rain:SetLightInfluence(script.LightInfluence.Value)
Rain:SetLightEmission(script.LightEmission.Value)
Rain:SetVolume(script.Volume.Value)
Rain:SetSoundId(script.SoundId.Value)
Rain:SetStraightTexture(script.StraightTexture.Value)
Rain:SetTopDownTexture(script.TopDownTexture.Value)
Rain:SetSplashTexture(script.SplashTexture.Value)

local threshold = script.TransparencyThreshold.Value
if script.TransparencyConstraint.Value and script.CanCollideConstraint.Value then
	Rain:SetCollisionMode(Rain.CollisionMode.Function, function(p)
			return p.Transparency <= threshold and p.CanCollide
		end
	)
elseif script.TransparencyConstraint.Value then
	Rain:SetCollisionMode(Rain.CollisionMode.Function, function(p)
			return p.Transparency <= threshold
		end
	)
elseif script.CanCollideConstraint.Value then
	Rain:SetCollisionMode(Rain.CollisionMode.Function, function(p)
			return p.CanCollide
		end
	)
end
Rain:Enable()




```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/84d20e87-f3f4-7766-de3d-fe5fc2660e16.png)


以上。
MariaDBでアップサート（ON DUPLICATE KEY UPDATE）

# 概要

* 存在していればアップデート。
* 非存在ならインサート。

を **1回のSQL発行** で行う方法です。

# テーブル

こんなふうな主キーやカラムの設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a1e7ecf1-8e93-0a70-cc70-98e1a81f1c67.png)

# アップサートするSQL

```sql:
INSERT INTO unko 
(key_1, key_2, value_1)
VALUES
('あ', 'い', 9)
ON DUPLICATE KEY UPDATE
value_1 = value_1 + 9
```

# 実行結果

レコードが無い状態でSQL流したら下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d7446f0e-ac75-9b1f-45d6-44833a200503.png)

さらにもう一回SQL流したら下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/027b7d16-aaed-712f-655e-624e098286f9.png)

# 参考サイトさん

https://hit.hateblo.jp/entry/2016/10/07/202115

# バージョン

Microsoft Windows [Version 10.0.22631.3880]
MariaDB 10.5.4
How to Create a Link for a Video: Easy-to-use

What are Video Links
A video link is a URL that directs viewers to a specific video. It can be created for videos hosted on various platforms, such as YouTube, Vimeo, or your website. Here are the primary benefits of using video links:

Easy Sharing: Share your video across multiple platforms with a simple click.
Accessibility: Viewers can access the video without downloading it.
Professionalism: Provides a clean, professional way to share video content.
How to create a link for a video on Popular Platforms:
1. YouTube
YouTube is one of the most popular platforms for hosting and sharing videos. Here’s how to create a link for a video on YouTube:

Upload Your Video:

Sign in to your YouTube account.
Click on the camera icon with a plus sign and select “Upload video.”
Follow the prompts to upload your video.
Copy the video link:

Once the video is uploaded, go to your YouTube Studio.
Click on the “Videos” tab.
Find the video you want to share and click on the “Options” (three dots) next to it.
Select “Get shareable link.”
Share the Link:

Copy the link and paste it wherever you want to share the video.
2. Vimeo
Vimeo is another popular video hosting platform known for its high-quality content. Here’s how to create a link for a video on Vimeo:

Upload Your Video:

Log in to your Vimeo account.
Click the “New video” button and select “Upload.”
Follow the prompts to upload your video.
Copy the Video Link:

After uploading, go to the “My Videos” page.
Find the video and click on it to open.
Click the “Share” button on the video page.
Copy the provided link.
Share the Link:

Use the copied link to share your video on various platforms.
3. Google Drive
If you prefer to host your videos on Google Drive, follow these steps:

Upload Your Video:

Go to Google Drive and log in.
Click the “New” button and select “File upload.”
Upload your video file.
Generate a Shareable Link:

After uploading, right-click the video file.
Select “Get link.”
Choose the appropriate sharing settings (e.g., anyone with the link can view).
Copy and Share the Link:


SOURCE: <a href="https://reladex.com.ng/2024/07/how-to-create-a-link-for-a-video-easily.html">Video link</a>:
PHP8 以降で「throw を式として扱える」

PHPマニュアル読んでたら見かけたけどどういう意味やねん！！！

> PHP 8.0.0 以降では、throw キーワードは式として扱えるようになり、 様々なコンテクストで使えるようになりました。 これより前のバージョンでは、throw は文であり、 それが現れる行でだけでしか使えませんでした。

https://www.php.net/manual/ja/language.exceptions.php

ちょっと何言っているか分からなかったので調べてみたら言葉通りでした。
条件式に throw を書けるということですね…。

# サンプルコード

- value が 0 より大きければ value を返却
- value が 0 以下の場合は例外 InvalidArgumentException を投げる

## PHP7以前

```php
if ($value > 0) {
    return $value;
}

throw new InvalidArgumentException(__CLASS__ . " に範囲外の値が渡されました。" . $value);
```

## PHP8以降はこう書ける

三項演算子の false 側で throw とか

```php
return $value > 0 
    ? $value 
    : throw new InvalidArgumentException(__CLASS__ . " に範囲外の値が渡されました。" . $value);
```

if 文の中にそのまま throw を追加するとか

```php
if ($value > 0 || throw new InvalidArgumentException(__CLASS__ . " に範囲外の値が渡されました。" . $value)) {
    return $value;
}
```

# 感想

個人的にはあまり使わないかもです
ただ知らないとコードレビューで戸惑いそうなので知識として覚えておきます