OmniAICreator/Qiita-1.07M huggingface dataset:
確率微分方程式入門

# はじめに

確率微分方程式の入門的な内容をまとめましたので、よかったらお読みくだされば幸いです。

# 確率微分方程式

https://github.com/Hideki105/mathematical-engineering/blob/main/%E7%A2%BA%E7%8E%87%E6%95%B0%E7%90%86%E5%B7%A5%E5%AD%A6/hdk/%E7%A2%BA%E7%8E%87%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F/Stochastic_Differential_Equation.pdf
情報幾何の事前準備

# はじめに

情報幾何に入門するために必要な微分幾何についてまとめましたので、よかったらお読みくだされば幸いです。


# 微分幾何

https://github.com/Hideki105/mathematical-engineering/blob/main/%E5%B9%BE%E4%BD%95%E6%95%B0%E7%90%86%E5%B7%A5%E5%AD%A6/hdk/%E5%BE%AE%E5%88%86%E5%B9%BE%E4%BD%95/Differential_Geometry.pdf
自作鯖のNextプロジェクトを独自ドメインで公開する方法

STEP 1: DockerとDocker Composeのインストール
```
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo apt-get update
sudo apt-get install -y docker-compose
```
```
# Docker Compose Pluginのインストール（不要ならば省略可）
sudo apt-get install -y docker-compose-plugin

# インストール確認
docker compose version
```
STEP 2: Next.jsアプリケーションのセットアップ

```
npx create-next-app next-app
cd next-app
```
Next.jsアプリケーションのルートディレクトリにDockerfileを作成します。

```
Dockerfile
# Use an official Node.js runtime as a parent image
FROM node:18.17.0

# Set the working directory in the container
WORKDIR /usr/src/app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the local source files to the container
COPY . .

# Build the application
RUN npm run build

# Expose port 3000
EXPOSE 3000

# Command to run the application
CMD ["npm", "start"]
```
ビルドとコンテナの起動:

```
docker build -t next-app .
docker run -p 3000:3000 next-app
```
STEP 3: Nginxの設定
新しいNginxの設定ファイル my-nextjs-app を作成:
```
sudo nano /etc/nginx/sites-available/my-nextjs-app
以下の内容を貼り付け、[ここにドメイン名やIPなど] を実際のドメイン名やIPアドレスに置き換えます。
```
```
server {
    listen 80;

    server_name [ここにドメイン名やIPなど];

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
```
シンボリックリンクの有効化:

```
sudo ln -s /etc/nginx/sites-available/my-nextjs-app /etc/nginx/sites-enabled/
```
Nginxの構文チェック:
```
sudo nginx -t
```
Nginxの再起動:

```
sudo systemctl restart nginx
```
ZED SDK での点群をすっきりさせる

ZED SDK はStereoLabsのカメラ zed2, zed-x, zed mini を使うためのライブラリである。

## 想定する読者
stereolabsのzed2, zed mini, zed z などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

## 前提
ZED SDK 4.0

## 課題：　前の物体と背景とを結ぶ点がいっぱいでてくるのをなんとかできないの
- 3Dの表示の際にとてもそれらの点がじゃまになります。
- 対象物体の計測をする際にもじゃまになります。

## 解決方法

```
runtime_parameters = sl.RuntimeParameters()
runtime_parameters.confidence_threshold = 50  # max = 100
```

- 値が大きくなればなるほど、点群の点の残る数が増えます。
- 100から少しづつ値を減らしていくのがよいでしょう。
- `init_params.depth_mode = sl.DEPTH_MODE.NEURAL` としている状況では、同じ撮影の配置ならば、init_params.camera_resolutionの画素数を増やした方が、depthが求まりやすいようです。

## SEE ALSO
https://www.stereolabs.com/docs/depth-sensing/confidence-filtering
【iOS】初心者がSwift UI でフェイストラッキングをやってみた

# はじめに

こんにちは、エンジニアのkeitaMaxです。

以下の記事で紹介されているソースを動かしてみてiOSのFace Trackingを自分なりに理解してみようと思います。

https://seeds-digital.com/switui-ar-face-tracking/


# ソースをそのまま動かしてみる。

まずは前回作成した`example-ar-app`に組み込んでみようと思います。

```swift:FaceTrackingView
import SwiftUI
import RealityKit
import ARKit

struct FaceTrackingView : View {
    var body: some View {
        ARFaceTrackingContainer().edgesIgnoringSafeArea(.all)
    }
}
struct ARFaceTrackingContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        // ARViewをゼロサイズのフレームで作成
        let arView = ARView(frame: .zero)
        
        // Face Trackingの設定を作成
        let configuration = ARFaceTrackingConfiguration()
        
        // Face Trackingの設定でセッションを開始
        arView.session.run(configuration)
        
        // 顔に表示する3Dモデルを作成
        let mesh = MeshResource.generateBox(size: 0.15, cornerRadius: 0.01)
        let material = SimpleMaterial(color: .red, roughness: 0.1, isMetallic: false)
        let modelEntity = ModelEntity(mesh: mesh, materials: [material])
        
        // 顔の位置にアンカーを作成
        let anchor = AnchorEntity(.face)
        
        // 3Dモデルを顔のアンカーに追加
        anchor.addChild(modelEntity)
        
        // 顔のアンカーをARViewのシーンに追加
        arView.scene.addAnchor(anchor)
        
        // 設定されたARViewを返す
        return arView
    }
    
    // ARViewを更新するメソッド
    func updateUIView(_ uiView: ARView, context: Context) {}
}



#Preview {
    FaceTrackingView()
}
```

これをビルドして使ってみると、顔の部分にキューブがつきました。

※画像を撮ったのですが、Qiitaの容量画像の制限に引っかかってしまったので後ほどあげます。


```
let mesh = MeshResource.generateBox(size: 0.15, cornerRadius: 0.01)
```
この部分で顔に貼る物体を作成しているので、球体にしたい場合は以下のようにすると球体になります。
```
let mesh = MeshResource.generateBox(size: 0.15, cornerRadius: 1.0)
```

# 困ったこと
本当は目のトラッキングをできるようにしたいなと思っていたのですが、調べてみたもののやり方がわからなかったです。

https://developer.apple.com/documentation/arkit/arkit_in_ios/content_anchors/tracking_and_visualizing_faces

この公式のアプリをなんとかSwift UIでかきたいと思って色々やってみてはいるのですが、なかなかうまくいかないです。

もし、Swift UIで目のトラッキング方法を知っている方がいらっしゃいましたら教えていただけると幸いです。


# おわりに

Story Boardで書いてあるものをサンプルのアプリをSwift UIで書いてみようと思っているのですが、なかなかうまくいかなかったです。

もっとSwiftとSwift UIについての理解を深めてから再挑戦しようかなと思っています。

やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。

# 参考文献

https://qiita.com/john-rocky/items/77dd077a5778c7ca9369
Oracle Cloud(OCI)の環境リソースと仮想マシン名を作成後に名前変更してみた

# はじめに
Oracle Cloudでは仮想マシンをはじめとしたリソース名について作成後に簡単に変更することが可能です。
いろいろなリソースがあるのですが今回は代表的な仮想マシン名を変更する方法を中心にご紹介いたします。




# 目次
1.[名前変更の実施](https://qiita.com/ogacloud/items/590fe6cdd91edf571b97#1%E5%90%8D%E5%89%8D%E5%A4%89%E6%9B%B4%E3%81%AE%E5%AE%9F%E6%96%BD)
2.[仮想マシン以外の名前変更について](https://qiita.com/ogacloud/items/590fe6cdd91edf571b97#2%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E4%BB%A5%E5%A4%96%E3%81%AE%E5%90%8D%E5%89%8D%E5%A4%89%E6%9B%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
3.[参考にしたドキュメントまとめ](https://qiita.com/ogacloud/items/590fe6cdd91edf571b97#3%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81)

# 1.名前変更の実施
ナビゲーション・メニューを開き、「コンピュート」→「インスタンス」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/f3bdf97f-d844-2e9c-f0ed-5f4fb6e1dbbb.png)


名前を変更したいインスタンスをクリックします(今回はtestcomputerです)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/af793749-7eb2-4888-8399-6c9413269140.png)

「その他のアクション」→「編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/4066c62a-2609-c78e-c90a-b5f6a1eec63b.png)

名前の部分(今回はAP-Server1)を変更し「変更の保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/3e5fd01d-f4f4-3675-bf3e-a5da9001338e.png)
変更した名前が反映されたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/2a1b5359-5072-504d-45aa-60743572b934.png)

# 2.[仮想マシン以外の名前変更について]()
ちなみに仮想マシン以外は名前変更についてはどうなのかという部分も気になる方がいると思いますが、リソースの隣に編集タブが出ているリソースに関しては一通りOCIの画面から変更が出来ます。下記は今回変更してみた一例です。

例１:boot Volumeの変更画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/e3c5ce2a-49a2-dee7-1690-cf71400e5ae7.png)

例2:Subnetの名前変更画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/f6535b7f-18de-cfbd-4538-9db11197b70b.png)

例3:テナンシの名前変更(ホームリージョンからのみ可能)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/3b25b2de-a83f-b7b7-d92b-a6df0f0140d6.png)
参考手順:[テナンシおよびクラウド・アカウントの名前変更](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/renamecloudaccount.htm)

特殊例:VCNの名前変更
編集タブがないですがCLIから変更可能です。
[CLI]→下記変更コマンドを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172788/6610a858-e691-e28b-6915-138acffd9e91.png)
```
$ oci network vcn update --vcn-id [vcn-ocidを入力] --display-name [変更後のvcn名]
```

参考手順:[VCNの更新のCLIタブ](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/update-vcn.htm#)



このように手軽に作成後変更可能なため検証用の名前で作成した環境を名前変更し本番用環境として使う運用や計画もOCIなら組み込むことができます。


# 3.参考にしたドキュメントまとめ

[テナンシおよびクラウド・アカウントの名前変更](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/renamecloudaccount.htm)
[VCNの更新](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/update-vcn.htm)
[インスタンスの名前変更](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/renaminginstance.htm)
Azure Open AI 関連リンク集


Azure AI Search での取得拡張生成 (RAG)

https://learn.microsoft.com/ja-jp/azure/search/retrieval-augmented-generation-overview

https://qiita.com/yahayuta/items/fc51b6a5abb214b68c5a

https://learn.microsoft.com/ja-jp/azure/search/search-get-started-retrieval-augmented-generation

https://zenn.dev/microsoft/articles/semantic-kernel-v1-001

https://zenn.dev/microsoft/articles/semantic-kernel-10

https://learn.microsoft.com/en-us/semantic-kernel/overview/

https://learn.microsoft.com/en-us/dotnet/api/microsoft.semantickernel.text.textchunker?view=semantic-kernel-dotnet

https://www.docswell.com/s/hiro128_777/KP9124-2024-02-17-204458

https://github.com/TomohiroSuzuki128/aoai-myblog/

https://qiita.com/watanabe-tsubasa/items/12dc7ba9a6de55e8afd9

https://qiita.com/tomomi-kawashita/items/a10607e5c0d7b453d9bc

https://zenn.dev/microsoft/articles/semantic-kernel-5

https://github.com/microsoft/sample-app-aoai-chatGPT

https://qiita.com/hedgehog051/items/26ab1a5b035dd7760faf

https://github.com/microsoft/llmops-promptflow-template

https://learn.microsoft.com/ja-jp/semantic-kernel/overview/

Azure Semantic KernelにおけるRetrieval Augmented Generation (RAG)パターンの実装についての情報

**Azure AI SearchによるRAGと生成AIの実装の概要** - Azure AI Searchのインデックス作成、コンテンツの回収、およびLLMとの統合に関する詳細は、Microsoftの公式ドキュメントから参照できます。

https://learn.microsoft.com/ja-jp/azure/search/retrieval-augmented-generation-overview

**RAGパターンの限界と拡張の可能性** - 単一のデータソースに依存することの限界と、より複雑なデータソース統合のためのアプローチに関する考察は、Microsoft Developer Blogsで提供されています。

https://devblogs.microsoft.com/premier-developer/how-to-enhance-your-chatbot-so-it-can-retrieve-data-from-multiple-data-sources-orchestrate-its-own-plan-with-c-semantic-kernel-planner-azure-openai-part-1/

**セマンティックチャンキングと文書インテリジェンスの活用** - セマンティックチャンキングを通じてドキュメントの解析と組織化を強化する方法については、Microsoft Tech Communityでの投稿を参照してください。

https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/elevating-rag-and-search-the-synergy-of-azure-ai-document/ba-p/4006348



**Semantic Kernel v1.0.1 のプラグインを見てみよう

https://zenn.dev/microsoft/articles/semantic-kernel-v1-003

Azure OpenAI Service の利用を VNet 経由に限定する方法

https://qiita.com/kske_t/items/c5535e5bd3e27ad1baf5

Azure OpenAI Service のクォータと制限

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/quotas-limits

GPT プロンプト ビルダー

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2023wave2/ai-builder/gpt-prompt-builder
docker+wsl よく使うコマンド

1.dockerコンテナ内に入って作業したい
以下のどちらかを使用
```
docker run -it <image name> /bin/bash
docker exec -it <container id> /bin/bash
```

2.名前付きコンテナ
--nameでコンテナの起動等名前指定で動かせるようになる。
```
docker run --name #{任意のコンテナ名} -it #{利用したいイメージ}
```

3.ssh接続して、リモート先に開発環境移行
```
scp -r src #{user_name}@#{host_name}:#{remote_dir}
```
-r をつけると、ディレクトリ丸々コピーすることができる

2.アタッチ・デタッチとは？
特定のコンピューターやデバイスと他のものを接続したり、切断したりすること。
ex)
アタッチ→PCにUSBをとりつけ、PCがUSBを認識する
デタッチ→PCからUSBを取り外す前にPCのデスクトップ内で「USBを取り外す」を選択。
DiskExplorerでbootgrub.img

# 概要
DiskExplorerでbootgrub.binやってみた。

# DiskExplorerとは
ディスクイメージにアクセスして、ファイル操作できる、神アプリ。

https://www.vector.co.jp/soft/win95/util/se107750.html

# bootgrub.imgとは

grubが起動する、FATなフロッピーイメージ。

# 環境
windows10
windows11

# 手順

- DiskExplorerを、ダウンロード、解凍

- bootgrub.gzを、ダウンロード、解凍


- DiskExplorerを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8f3b093e-a794-8725-e010-54acf8073eb7.png)


以上。
STM32C011からシリアルに送信(PC14ハードウェアシリアル)(STM32C011J4M7)


目的
1ピンからシリアル出力

結果

![o_cop984.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cbbfeffc-4103-9cf9-caac-8e0def6ac7ec.jpeg)



プログラム


```c++


//SER_PC14_printf_C011_1


//初期化
void setup() {

  //00:PB7
  //01:PC14
  //1x:Reserved
  SYSCFG->CFGR3 = SYSCFG->CFGR3 | 0b01;

  Serial.setTx(PC14);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  //ピンの初期化 PA8
  pinMode(PA8, OUTPUT);

} //setup


//メインループ
void loop() {

  //「46」を出力
  Serial.printf("%d\r\n",46);
  
  digitalWrite(PA8, HIGH);//PB7をオン
  delay(1000); //1秒待つ

  digitalWrite(PA8, LOW);//PB7をオフ
  delay(1000); //1秒待つ

} //loop


```
STM32C011でPC14をLチカして遊ぶ。(STM32C011J4M7)


目的
ミキサーを切り替える



参考　なんどかリロードすると画面がでるよ

http://nemuisan.blog.bai.ne.jp/?cid=7420

結果

![o_cop985.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/283219ac-1fad-df28-5687-0576a20b19aa.jpeg)


プログラム

```c++


//GPIO_PC14_ON_C011_1


//初期化
void setup() {

  //00:PB7
  //01:PC14
  //1x:Reserved
  SYSCFG->CFGR3 = SYSCFG->CFGR3 | 0b01;
  
  pinMode(PC14, OUTPUT);

}//setup


//メインループ
void loop() {
  
  digitalWrite(PC14, HIGH);  delay(1000);
  digitalWrite(PC14, LOW);   delay(1000);
  
}//loop


```
【PhotonFusion】Network Property の値が変化した要因に応じた Action を実行するクラス

いくつかの要因で変化する Networked プロパティに対して、過剰に細かくイベントを設定できるクラスを書いてみました。
実用的ではなく動作も未確認ですが、初学者の参考になれば幸いです。

``` SelfChangeDetector.cs
using Fusion;
using System;

public class SelfChangeDetector<T>
{
    /// <summary> Reliable value </summary>
    public T Value { get; private set; }

    /// <summary> Client predicted value </summary>
    public T AlphaValue { get; private set; }


    /// <summary> Action invoked when the value changes </summary>
    public event Action<T, T> OnChanged;

    /// <summary> Action invoked when the value actually changes </summary>
    public event Action<T, T> OnActuallyChanged;

    /// <summary> Action invoked when the value changes in client prediction </summary>
    public event Action<T, T> OnAlphaChanged;

    /// <summary> Action invoked when client predicted value is changed in rollback </summary>
    public event Action<T, T> OnRollBackChanged;

    /// <summary> Action invoked when the value changes at the timing of isForward </summary>
    public event Action<T, T> OnForwardChanged;


    public SelfChangeDetector(T defaultValue)
    {
        Value = defaultValue;
        AlphaValue = defaultValue;
    }

    /// <summary> Run it with FixedUpdateNetwork() </summary>
    public void Update(T defaultValue, NetworkBehaviour nb) => Update(defaultValue, nb.Runner, nb.HasStateAuthority);
    /// <summary> Run it with FixedUpdateNetwork() </summary>
    public void Update(T defaultValue, NetworkRunner runner) => Update(defaultValue, runner, runner.IsServer || runner.IsSharedModeMasterClient);
    /// <summary> Run it with FixedUpdateNetwork() </summary>
    public void Update(T networkedProperty, NetworkRunner runner, bool hasStateAuthority)
    {
        if (hasStateAuthority)
        {
            if (Value.Equals(networkedProperty) == false)
            {
                OnChanged?.Invoke(Value, networkedProperty);
                OnActuallyChanged?.Invoke(Value, networkedProperty);
                OnForwardChanged?.Invoke(Value, networkedProperty);
                Value = networkedProperty;
            }
            return;
        }

        if (runner.IsFirstTick && runner.IsResimulation)
        {
            if (AlphaValue.Equals(networkedProperty) == false)
            {
                OnChanged?.Invoke(AlphaValue, networkedProperty);
                OnRollBackChanged?.Invoke(AlphaValue, networkedProperty);
                AlphaValue = networkedProperty;
            }
            if (Value.Equals(networkedProperty) == false)
            {
                OnActuallyChanged?.Invoke(Value, networkedProperty);
                Value = networkedProperty;
            }
            return;
        }

        if (AlphaValue.Equals(networkedProperty) == false)
        {
            OnChanged?.Invoke(AlphaValue, networkedProperty);
            OnAlphaChanged?.Invoke(AlphaValue, networkedProperty);
            if (runner.IsForward) OnForwardChanged?.Invoke(AlphaValue, networkedProperty);
            AlphaValue = networkedProperty;
        }
    }
}
```
【Raspberry Pi 5】PiCamera2をDockerコンテナで動かす方法

# はじめに

Bullseye以降からRaspberryPiOSのカメラ制御の仕様が変わり、従来のraspistillからlibcameraに置き換えられました。
またこれに伴いPythonのライブラリも変更されOpenCVでは制御できなくなりlibcameraベースのpicamera2が必須になりました。

https://github.com/raspberrypi/picamera2

RaspberryPiOS（Bullseye以降）にはPiCamera2とlibcameraがプリインストールされているためホスト側では難無くカメラを使用できますが、仮想環境においてはそもそも前提となるlibcameraの構築手順の情報が乏しく、Pythonライブラリの依存性の問題でほとんどの方が苦労していると思います。

ここではDockerコンテナ内でカメラを制御する方法を確立しまとめています。
具体的なユースケースやプロジェクトの要件に合わせてDockerfileをカスタマイズしてください。

ソースコードは[こちら](https://github.com/souri-t/PiCamera2-Docker)に載せています。

https://github.com/souri-t/PiCamera2-Docker

## 実行環境例

こちらでは以下の環境で動作できました。
始める前にはRaspberry Piにカメラモジュールが接続され、有効化されていることを確認してください。

- Raspberry Pi 5(8GB)
- Raspberry Pi OS 64bit Bookworm(Release 2023-12-05)
- Docker及びDocker Compose
- Camera Module v3


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27488/48759e1b-3976-d8da-a715-5d65c1725668.png)


## 全体構成

```
app
|-- code
|   `-- camera.py
|-- docker-compose.yml
`-- Dockerfile
```

### Dockerイメージ

RaspberryPiOSをベースイメージ化した以下のイメージを使用しています。
https://github.com/dtcooper/raspberrypi-os-docker

```Dockerfile
FROM dtcooper/raspberrypi-os:python3.11-bookworm

RUN apt update -y && apt upgrade -y && apt install git vim -y

#libcamera
RUN apt install libcamera-tools libcamera-apps-lite -y
RUN apt install libcap-dev libcamera-dev -y
RUN apt install libatlas-base-dev libopenjp2-7 libkms++-dev libfmt-dev libdrm-dev -y
RUN pip install rpi-libcamera rpi-kms

#picamera2
RUN apt install -y python3-picamera2 --no-install-recommends
RUN pip install picamera2

WORKDIR /code
```



Dockerコンテナはカメラハードウェアとのやり取りに特権アクセスが必要です。
`privileged`フラグは、コンテナがホストシステムのデバイスにアクセスするために使用されます。
また、カメラのデバイスファイルにアクセスできるように`/dev/video0`と`run/udev:ro`ディレクトリをマウントしています。


```docker-compose.yml
version: '3.3'
services:
    picamera2:
        build: .
        stdin_open: true
        tty: true
        container_name: picamera2
        volumes:
            - ./code:/code
            - /run/udev/:/run/udev:ro
        devices:
            - /dev/video0:/dev/video0
        command: bash
        privileged: true
```

### カメラスクリプト

```camera.py
from picamera2 import Picamera2

picam2 = Picamera2()
picam2.start_and_capture_file("test.jpg", show_preview=False)

```

## 起動方法
```
$ docker-compose up -d
```





## カメラスクリプトの実行

Dockerコンテナ起動後は`/code`ディレクトリに配置された`camera.py`という名前のPythonスクリプトを実行します。
これで`test.jpg`という名称の静止画が出力されます。


```
$ docker-compose exec picamera2 bash
$ python3.11 camera.py
```
または
```
$ docker-compose exec picamera2 python3.11 camera.py
```

## 最後に

PiCamera2は自動設定を使用しない限り、接続するカメラに応じて設定を変える必要があります。
個別に設定する場合は`/boot/firmware/config.txt`をコンテナにマウントする必要があるかもしれません。

https://www.raspberrypi.com/documentation/computers/camera_software.html
EmEditor での Insert Final Newline の設定

# [EmEditor](https://jp.emeditor.com/) での Insert Final Newline の設定

EmEditor で、ファイルを保存する際、末尾に改行がなければ自動的に追加する設定のしかたは以下のとおり。

-「ツール」メニューから設定ダイアログを開き、「ファイル」グループにある「保存時」ボタンをクリックして「保存時の詳細」ダイアログボックスを開く。「各ファイルの最後に改行コードが存在することを確認する」をチェックする。

![20240308emeditor_saveWithReturn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120262/20bbe45e-817d-25f4-4255-711a4dd4a2a0.png "設定ウィンドウを開いたところ")

EmEditor Professional, EmEditor Free の Version 21.5 (2022年2月公開)以降でサポートされている。

# EmEditor と EditorConfig

EmEditor は version 21.5 から [EditorConfig](https://editorconfig.org/) をサポートしており、ここで取り上げている Insert Final Newline の設定もこのタイミングで導入された。.editorconfig ファイルを作成し、テキストエディタのオプションを統一的に定義し、管理することが可能になる。今回紹介しているファイル末尾の改行の自動挿入は、同ファイルに `insert_final_newline = true` を記述することでONにできる。

なお、EditorConfig は EmEditor Professional, EmEditor Free の両方でサポートされているが、設定をオフにできるのは EmEditor Professional のみ([参考](https://jp.emeditor.com/emeditor-core/emeditor-v21-5-0-%e3%82%92%e5%85%ac%e9%96%8b%e3%81%97%e3%81%be%e3%81%97%e3%81%9f-%e3%83%86%e3%82%af%e3%83%8b%e3%82%ab%e3%83%ab-%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%82%92%e5%90%ab%e3%82%80/))。

# [EmEditor](https://jp.emeditor.com/) について

[EmEditor](https://jp.emeditor.com/) は Emurasoft によるシェアウェア。[巨大ファイルの編集](https://jp.emeditor.com/text-editor-features/large-file-support/large-file-controller/)や [Unicode](https://jp.emeditor.com/text-editor-features/versatility/unicode-support/) の処理、[高速な正規表現の処理](https://jp.emeditor.com/text-editor-features/coding/regular-expressions/)など、長くお世話になっています。

# 参考

[Insert Final Newlineの設定をしようという話](https://qiita.com/kyo_nanba/items/d384b2a46170bf8764dd)
[Why should text files end with a newline?](https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline)
[EmEditor v21.5.0 を公開しました (テクニカル レビューを含む)。](https://jp.emeditor.com/emeditor-core/emeditor-v21-5-0-%e3%82%92%e5%85%ac%e9%96%8b%e3%81%97%e3%81%be%e3%81%97%e3%81%9f-%e3%83%86%e3%82%af%e3%83%8b%e3%82%ab%e3%83%ab-%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%82%92%e5%90%ab%e3%82%80/)
[EditorConfig-Properties#insert_final_newline](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#insert_final_newline)
Pythonの標準オブジェクトで@を使いたい

Numpyなど使っていると見る、行列積を求める時の`@`←これ、ありますよね(呼び方は知らない)。
ただこれ、`list`などの標準オブジェクトには実装されていない。
↓
じゃあ、`list`に実装しよう。←いまここ

[github/list-at-list](https://github.com/refrain-net/list-at-list)←ソースはここ

↓コピペするならここ
```python
# forbiddenfruitをインストールすること
# pip install forbiddenfruit

from forbiddenfruit import curse

# matmulを実装するためのMatrixクラス定義(__getitem__とかも適宜実装する)
class Matrix (list):
    def __init__ (self, values): self.__values = values
    def __matmul__ (self, other): return Matrix(Matrix.multiply(self.__values, other.__values))
    def __imatmul__ (self, other): return self.__matmul__(other)
    def __rmatmul__ (self, other): return Matrix(Matrix.multiply(self.__values, other.__values))
    def __repr__ (self): return f'<Matrix values="{self.__values}">'
    def __getitem__ (self, index): return self.__values[index]
    def __setitem__ (self, index, value): self.__values[index] = value
    @staticmethod
    def multiply (mat1, mat2): return [[sum(mat1 * mat2 for mat1, mat2 in zip(mat1_row, mat2_col)) for mat2_col in zip(*mat2)] for mat1_row in mat1]

# 標準オブジェクトに__matmul__を追加する
curse(list, '__matmul__', lambda self, other: Matrix(self) @ Matrix(other))

a = [[1, 2, 3], [4, 5, 6],]
b = [[7, 8], [9, 10], [11, 12]]

c = a @ b
print(c[0])
# > [58, 64]
```

説明とかは苦手 + 説明するまでの内容も無いので、コピペ用記事として置いておきます。
使うときは自己判断でオナシャス！
gemでrailsがインストールできなかった話。

レアケースです。

# エラー
    ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.

# 原因
俺は馬鹿だからよくわかんねぇけど、rbenv配下のrubyを使わず、システムにあるrubyを使っていることが原因らいい。。

# 根本原因
/.bash_profile内のhomebrewのパスの指定ミス。
brewのパス→rbenvのパス出通すべきところがrbenvのパス→brewのパスの順になっていた。

# 解決方法
rbenvはbrewの配下にいるべき人間なので、brewのパスをrbenvのパスの上に持ってくる。
（コマンドの擬人化）

## 感想
・調べてたら、M1macはみんなzshのシェル使ってる。（不安）
　小学校の家庭科の授業で自分だけおばあちゃんから借りたエプロンを使っているかのような不安。
[ODC]Zipの使い方、及びExternal Logicでないことの確認

[External LogicのInput Parameterサイズには上限がある](https://qiita.com/jyunji_watanabe/items/3fd3b68b5a9cf75fdc76)に示した通り、ODCのExternal Logicには、Actionのパラメータサイズに5.5MBという上限がある。
さらに、Appとは別のURLで動くため、.NETのObjectをパラメータに露出させることもできない。

ところが、OutSystems提供のライブラリZipは、ZipHandleという名前のObject型パラメータが露出している。これは、Appのメモリ上でZipファイルを開いて操作していることを示唆する。
そこで、実際にZipを使ったプログラムを作成し、5.5MBを上回るファイルを操作して確認してみる。

# 環境情報
ODC Studio(Version 1.3.19)
Zip(Version 1.0.3)

# Zipファイルを作成する
## サンプルAction
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/677e2396-d051-99fc-056d-7f762411fb12.png)
以下、全てZip内のAction。
1: CreateZIPでZipファイルをメモリ上に作成し、そのハンドルを返す
2: AddFileで作成したZipファイルに任意のファイルを追加する（ZIPファイルはハンドルを渡すことで指定）
3: CommitChangesでZipファイルの変更を確定する（Descriptionに、AddFileしたら、GetZIPBinaryする前に呼べと書いてある）
4: GetZIPBinaryでメモリ上のZipファイルをBinary Data型として取得する

## 5.5MB以上のファイルを作成するテスト→できた
539.6KBのPDFファイルを用意し、作成したZipファイルに15回登録してみた。
以下の通り、5.5MBを上回るサイズのファイルをZipライブラリを使って作成できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/85e1561d-2c3b-e0b2-aa05-7c684292495e.png)

# Zipファイルを読む
## サンプルAction
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/dd7e4011-88c4-55f7-aa50-7fd7b4dfc3df.png)

1: LoadZIPでZipファイルのBinary Dataをメモリに読み込む
2: GetFilesで、1で読んだZipファイルから中身のファイルを取り出す
ここでは、GetFilesのOutput Parameterを別の変数に詰め替えている。

## 5.5MB以上のファイルを読み込むテスト→できた
「Zipファイルを作成する」のテキストで作成したZipファイル（6206 KB)をZipのActionで読み込み、ファイル名のリストを取り出してみた。

↓は、取り出したリストをJSONSerializeして画面に表示したところ。問題なく5.5 MBを超えるファイルをInput Parameterとして受け取れている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/93b61146-034f-a9b2-5d83-55a0e932e2e0.png)

# 結論: ZipはExternal Logicでは無さそう
External Logicのように外部URLではなく、Appと同じコンピュータ上で動いているものと思われる。
C#でこういうライブラリを作る方法は現段階（2024/03/08）では公開されていないが、OutSystems提供のものにはあるということになる。
Markdown記法メモ

```qiita.rb
puts 'The best way to log and share programmers knowledge.'

```

```diff_awk
-puts 'Hello'
+puts 'World'
```

`インラインです`と書いて、インラインにすることも

# h1タグです
# h2です
### h3です

*italick type*
**協調**

>これは引用です

- - -

<dl>
  <dt>リンゴ</dt>
  <dd>赤いフルーツ</dd>
  <dt>オレンジ</dt>
  <dd>橙色のフルーツ</dd>
</dl>


1. リスト
1. リスト
1. リスト


通常の文章です。

- リスト
- リスト
- リスト

[Qiita](http://qiita.com)

[link-1]: http://qiita.com/
[ここ][link-1] と [この][link-1] リンクは同じになります。
[link-1] という書き方もできます。

![Qiita](https://qiita-image-store.s3.amazonaws.com/0/45617/015bd058-7ea0-e6a5-b9cb-36a4fb38e59c.png)

<img width="50" src="https://qiita-image-store.s3.amazonaws.com/0/45617/015bd058-7ea0-e6a5-b9cb-36a4fb38e59c.png"><br>


| 列1 | 列2 | 列3 |
|:-:|:-:|:-:|
| aaa  |bbb   |ccc   |
| ddd  | ddd  |  eee |
| aa  | d  |  ee |
<br>


| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |

<br>
<table>
  <caption>HTML</caption>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> table </td> <td>テーブル</td>
  </tr>
  <tr>
    <td> caption </td> <td>テーブルのキャプション</td>
  </tr>
    <tr>
    <td> caption </td> <td>テーブルの。。。</td>
  </tr>
</table>


### 絵文字チートシート
https://www.webfx.com/tools/emoji-cheat-sheet/
#### sample絵文字
\:kissing_closed_eyes: chu☆
<br>

リンクカードは、URLの前後に空行必須

https://qiita.com/Qiita/items/c686397e4a0f4f11683d


#### *スラッシュ* を入力することで、補完機能が使えます。
```
```
:::note alert

:::

:::note warn

:::

:::note info

:::

<!--

-->

<details><summary>details</summary>
折り畳み
</details>
採用試験でコードレビューしてもらうのがちょうどいいかもしれない

# 以下のプログラムを見て感じたことを教えてください。

```c
#include <stdio.h>
int main(void){
    int age;
    printf("あなたの年齢を入力してください:");
    scanf("%d", &age);

    if( age <= 5 ) {
        printf("あなたは令和生まれですね\n");
    }
    if( 5 <= age && age <= 35 ) {
        printf("あなたは平成生まれですね\n");
    }
    if( 35 <= age && age <= 98 ) {
        printf("あなたは昭和生まれですね\n");
    }
    if( 98 <= age && age <= 112 ) {
        printf("あなたは大正生まれですね\n");
    }

    return 0;
}
```

# 想定回答と判定
まぁ見ればわかる程度のプログラムだが、コードレビューしてもらうことで採用面接にちょうどいい課題なのではと思ったので、想定回答と判定を挙げてみた。
たったこれだけのプログラムなのに、いろいろ指摘できるもんですね。

## 「この言語は使ったことがないので」
C言語を使ったことがあるかどうかは、仕方のないことなので減点はしないが、概要は読み取れると思う。
「使ったことがない」だけだと減点対象。
## 「仕様書ありますか？」
念のための確認であれば問題なし。
このレベルで仕様書がないと何もできないようであれば減点対象。
## 「このプログラムは動くんですよね？」
そういう試験問題（コンパイルエラーになることが理解出来ているかどうか、という試験問題）もあるが、そういう問いではない。
判定者によっては減点されそう。
## 「age変数が初期化されていないです」
その通り。加点。
仕事であれば、気付いてほしいところ。
## 「数字以外を入力した際の動作が気になります」
実際、数字以外を入力するとまともに動作しない。加点。
## 「scanf関数の復帰値がどうのこうの」
正しい。が、そこだけだと加点も減点もなし。
## 「scanf関数はセキュリティ的にまずいのでは」
理由まで説明できるのなら加点。理由が説明できない場合は減点。
雉も鳴かずば撃たれまい。
## 「if文ではなく、else-if文のほうがいいのではないか」
要求仕様次第なので else-if にしてはいけない可能性もあるが、複数のif文条件に該当してしまうことを気付いてくれているので加点対象。
## 「例えば35って入力したら、２行出力されてしまいますね」
同上。加点対象。
## 「例えば113って入力したらどうなるんですかね」
このプログラムだと何も出力されない。よくある「設計漏れ」に気付いているので加点。
## 「if文の判定でAND条件するときはカッコで囲わないとだめです」
「個人的な好み」の問題。強制してくるようであれば減点もやむなし。
「カッコで囲むと間違いがない」のは確かにそうで、そこに異論はない。
であっても、全世界で絶対に守るべきルールかどうかは微妙。
## 「if文の判定は、変数を右側（左側）に揃えるべき」
「比較のためのイコールが、ミスって代入になるのを防ぐ」とか「日本語読みするときに、変数が左側にあったほうがよい」とか、わからんではないが、これも「個人の趣味」の問題。
## 「if文のマジックナンバーはやめておいたほうが」
「マジックナンバーは避けたほうがよい」はセオリーだが、マジックナンバーにしか気が付いていないようだと減点対象。馬鹿の一つ覚え。
## 「if文の判定条件の数値が共通なので、定数として切り出します」
正しい意見だが、加点するほどではない。
そこまで気付いたのなら、次項までいってほしい。
## 「if文の判定条件、毎年書き換えるんですかね」
運用時の問題まで見えているので加点。
個人的には、これに気付いてくれただけで合格にしたい。
## 「年齢だと正確な判定はできないんじゃないでしょうか」
その通り、年月日まで含めて判定しないと本当に正しい結果にはならない。
これも要求仕様次第ではあるんのだが、そこに気付いているので加点対象。
## 「判定をテーブルに切り出したほうがいいのではないでしょうか」
わからんではないが、今回のケースでは冗長。くどいようなら減点対象。
## 「判定結果の文章を共通化して、元号の部分だけ入れ替えられるように」
わからんではない。加点も減点もなし。
## 「特にコメントはないです」
経験者だとゴメンナサイかな。
フィールド値のみを利用するには

getterメソッドを用いるとフィールド値のみを取り出す事が出来ます。

~~~
アクセス修飾子 フィールドの型　getフィールド名(){
    return this.フィールド名;
 }
~~~
この時、フィールド名の最初の文字を大文字にする必要があります。
npm run devが動かない！

# 備忘録
~~~
内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
~~~

このエラーが出て苦しんでいた。。。
↓のサイト様を参考にしてエラー解決した。
フォルダの名前に「&」を入れてるからだった。。
https://pc-more.fimplex.com/article/not_recognized_as_a_program_or_batch_file/
【JavaScript】オブジェクトから指定したプロパティを削除する方法

以下のようにdelete演算子を使用すると指定したプロパティを削除できます。

```js
const obj = {
  name: "Name",
  age: 32,
}

delete obj.age; 

console.log(obj) // {name: "John"}
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/delete
Claude 3 on Bedrockの超簡単チャットを作る。

LangChainの対応を待ちきれず、Boto3とStreamlitで作りました。

Claude 3のMessages APIに対応しました。
どうしてもストリーミングレスポンスに対応させたかったのでそこだけ一工夫しました。

70行弱です。

```python
import json

import boto3
import streamlit as st

st.header("Claude 3 Sonnet on Bedrock")

if "messages" not in st.session_state:
    st.session_state.messages = []


def create_body(
    user_prompt: str, system_prompt: str = None, assistant_prompt: str = None
):
    st.session_state.messages.append(
        {"role": "user", "content": [{"type": "text", "text": user_prompt}]}
    )
    if assistant_prompt:
        st.session_state.messages.append(
            {
                "role": "assistant",
                "content": [{"type": "text", "text": assistant_prompt}],
            }
        )

    body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "messages": st.session_state.messages,
    }

    if system_prompt:
        body["system"] = system_prompt

    return body


def stream(response: dict):
    for event in response.get("body"):
        chunk = json.loads(event["chunk"]["bytes"])
        if "delta" in chunk and "text" in chunk["delta"]:
            yield chunk["delta"]["text"]


for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"][0]["text"])


if prompt := st.chat_input("何でも聞いてください。"):

    st.chat_message("user").markdown(prompt)

    client = boto3.client("bedrock-runtime")
    response = client.invoke_model_with_response_stream(
        modelId="anthropic.claude-3-sonnet-20240229-v1:0",
        body=json.dumps(
            create_body(
                user_prompt=prompt, system_prompt="フレンドリーに回答してください。"
            )
        ),
    )

    with st.chat_message("assistant"):
        response = st.write_stream(stream(response))
    st.session_state.messages.append(
        {"role": "assistant", "content": [{"type": "text", "text": response}]}
    )
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8ad95ba1-5a81-ab63-817b-e51f524430ea.gif)
デッドロック検証

<tag>SQLServer</tag>
## 目的
意図的にデッドロックを発生させる

## 手順 
1.テーブルを作成

```.sql
CREATE TABLE Table1 (
    ID INT PRIMARY KEY IDENTITY,
    Name VARCHAR(50)
);
``` 

2.データ投入

```.sql
@echo off
sqlcmd -S localhost -d sampleDB -U sa -P sample -Q "INSERT INTO Table1 (ID, Name) VALUES ('John');"
sqlcmd -S localhost -d sampleDB -U sa -P sample -Q "INSERT INTO Table1 (ID, Name) VALUES ('Alice');"
```

3.1→2の順にSELECT

**ポイント**
* ID2を参照後 10秒待機
```.sql
BEGIN TRAN

SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 1

WAITFOR DELAY '00:00:10'

SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 2

ROLLBACK

```

4.2→1の順にSELECT

**ポイント**
3.で10秒待機している間に実行

```.sql
BEGIN TRAN

SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 2

WAITFOR DELAY '00:00:10'

SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 1

ROLLBACK
```
AdBlockなどの広告ブロッカーを使用しているか判定する方法


AdBlockなどの広告ブロッカーを使用しているかをJavaScriptを用いて判定する方法です。

:::note warn

※ これは2016-04-29に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 広告ブロッカーを検知する仕組み

広告ブロッカーは指定のアドレス(例えばGoogle AdSenseのJavaScriptファイル)のアクセスを遮断する他、余分な空白を無くす目的で、例えば `"adsbygoogle"` というclass名がついたdivをまるごと消すといったこともしています。この仕組みを使用し、JavaScriptで `"adsbygoogle"` 等のclass名がついたdivボックスを小さく作成し、広告ブロッカーによって消されたことを検知することによって広告ブロッカーを検知します。

## 広告ブロッカーを検知するライブラリを導入

広告ブロッカーを検出するライブラリはたくさんありますが、シンプルな仕組みの「[BlockAdBlock](https://github.com/sitexw/BlockAdBlock)」をおすすめします。

しかし、このままでは使用できません。当然広告ブロッカーサイドにもこのライブラリが知られており、このライブラリが反応しないように修正されるなどイタチごっこが起きています。そこで `blockadblock.js` を一部書き換えます。

15行目の `baitClass: 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links',` は、前述した小さいdivにつけられるclass名です。このclass名をさらに追加します。

例えば、次のようにします。思いつけば色々追加してみてください。増やせば増やすほど広告ブロッカーに引っかかりやすくなります。非表示にするのは広告ブロッカーのみで「誤検出」は発生しませんのでご安心ください。

`baitClass: 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links ad- ad_ _ad_ ads- -ads- ads_ _ads_ -ads- _ads_ ad ads koukoku blog_ad blog-ad ad-blog ad_blog blogroll adsbygoogle',`

## ライブラリを動作させる

次のコードを挿入します。広告ブロッカー検知時に表示するclass名をxxxとしていますが、この名称は任意です。ただし、広告ブロッカーがブロックしそうな名称または前章で定義した名称にすると非表示になってしまいます。

```html
<script type="text/javascript" src="blockadblock.js"></script>
<script
  type="text/javascript"
  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"
></script>

<div class="xxx" style="display:none;">広告ブロッカーが有効です。</div>
<script>
  function adBlockDetected() {
    /*広告ブロッカー検知時の動作*/
    jQuery(".xxx").show();
  }
  function adBlockNotDetected() {
    /*広告ブロッカー未検知時の動作*/
    jQuery(".xxx").hide();
  }
  if (typeof blockAdBlock === "undefined") {
    /*blockadblock.jsが読み込めない場合は広告ブロッカー検知扱い*/
    adBlockDetected();
  } else {
    /*広告ブロッカー検知*/
    blockAdBlock.onDetected(adBlockDetected);
    /*広告ブロッカー未検知*/
    blockAdBlock.onNotDetected(adBlockNotDetected);
  }
</script>
```

広告ブロッカーが始動していればclass名 `xxx` のdivが表示されます。広告ブロッカーが発動していなければ `xxx` のdivは非表示になります。

尚、念のためJavaScript無効ユーザーに向けてclass名 `xxx` のdivは `style="display:none;"` を追加してデフォルトでは非表示にしています。
バッチファイル自身に自動アップデート機能を搭載する方法


バッチファイル自身に自動アップデート機能を搭載する方法を紹介します。複数のPCの一括適用に便利です。

:::note warn

※ これは2016-09-27に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 需要

Windows PC数十台が稼働しており、それぞれのPCは個人で自由に使えるようにしています。ある作業をするためにバッチファイルを使っています。すべてのPCからNASへ接続できるようにしてあり、バッチファイルのバージョンアップ時は、各自NASからダウンロードして上書き保存をするようにしていました。ユーザーの手間を削減できればいいなと思い自動アップデート機能を搭載しました。

## 方法

NASに最新バージョンのみを記載したテキストファイルと最新版のバッチを設置します。バッチには、作業の最後に最新版があれば更新してから終了するようにプログラムを作成しました。ファイルの末尾に記載するのがミソです。このあとに他の作業をすると不具合がおきます(gotoなど)。

```shell
SET /A CURRENTVERSION=10
SET /P NEWVERSION=<"\\NAS\[~]version"
if %CURRENTVERSION% LSS %NEWVERSION% (copy /y "\\NAS\[~]バッチ.bat" %0)
```

`CURRENTVERSION` に現在のバージョン、最新バージョンのみを記載したテキストファイルの内容を `NEWVERSION` に代入して比較し、 `NEWVERSION` の方が大きい場合は自身のバッチ(`%0`)へ上書きコピーするという仕組みです。

意外と簡単に実装できました。
TinyMCEがTableタグに「width」と「height」を勝手に設定する機能を無効にする


WordPressがアップデートされてから、TinyMCEがTableタグに「width」と「height」を勝手に設定する機能が追加されました。レスポンシブデザインのサイトにおいて、この機能はむしろデザインを崩す原因となってしまいます。この機能を無効にする方法をご紹介します。

:::note warn

※ これは2016-08-28に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 問題

TinyMCE 4.3.3以上(WordPress 4.5以上)においてテーブルの境界線を一度でも触ってしまうと、TinyMCEはTableタグに「width」と「height」を勝手に設定します。

![2×2のHTMLテーブルのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/081b61b8-7c33-8a6b-94aa-de99e05f201f.png)

![テーブルの枠線を触る](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/d30edd2f-e882-6c8d-67a4-7d4030673c95.png)

![テーブルの枠線をドラッグ中](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/f9966a3c-5302-fd09-4ba8-dca21d7672d8.png)

```html
<table style="width: 150px;">
  <tbody>
    <tr>
      <td style="width: 10px;">テーブル</td>
      <td style="width: 118px;">テーブル</td>
    </tr>
    <tr>
      <td style="width: 10px;">テーブル</td>
      <td style="width: 118px;">テーブル</td>
    </tr>
  </tbody>
</table>
```

## 対処方法

TinyMCEのオプション、「table_resize_bars」をFalseに変更(初期値:True)し、「object_resizing」を「img」へ変更(初期値:True)します。

### TinyMCE 単独で用いている場合

`tinymce.init()` の中に、次のコードを追加します。

```js
{
  table_resize_bars: false,
  object_resizing: img,
}
```

### WordPress で用いている場合

functions.phpなどに次のコードを追加します。

```php
<?php
function customize_tinymce_settings($mceInit) {
$mceInit['table_resize_bars'] = false;
$mceInit['object_resizing'] = "img";
return $mceInit;
}
add_filter( 'tiny_mce_before_init', 'customize_tinymce_settings', 0);
```

ちなみに、このコードを用いれば、[TinyMCE のマニュアル](https://www.tinymce.com/docs/)を参考に他の設定もカスタマイズできます。

## 結果

テーブルの境界線を触っても何も起きません。

![2×2のHTMLテーブルのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/081b61b8-7c33-8a6b-94aa-de99e05f201f.png)

![テーブルの境界を触っても、ドラッグアンドドロップできない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/91ea5c54-61f7-ec9a-ee3a-342273afd801.png)

```html
<table>
  <tbody>
    <tr>
      <td>テーブル</td>
      <td>テーブル</td>
    </tr>
    <tr>
      <td>テーブル</td>
      <td>テーブル</td>
    </tr>
  </tbody>
</table>
```
WordPressの記事をPHPから更新だけ行う方法


WordPressの記事や固定ページをPHPから更新だけ行う方法です。

:::note warn

※ これは2016-10-25に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 需要

キャッシュプラグインを使用している時に、一定時間で自動更新される外部ページを読み込む仕組みがあるWordPressの記事を更新したい場合に利用できます。

## 方法

次のようなPHPを実行します。場合によっては読み込みに数秒かかる場合があるのでタイムアウト設定などにご注意ください。

```php
<?php
require( '/[WordPressディレクトリ]/wp-load.php' );
wp_update_post(array('ID'=> [記事ID]));
?>
```

## 参考

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_update_post

post_titleとpost_contentを指定しなければ、更新日時だけが更新されます。

## 追記

デフォルトのままだとping打ちまくる結果となってしまうので[WordPress ping Optimizer](https://ja.wordpress.org/plugins/wordpress-ping-optimizer/)プラグインの導入を強くおすすめします。
「Invalid Certificate Chain」エラーが発生した場合の対処法


Qualys SSL LabsのSSL Server Testで「Invalid Certificate Chain」エラーが発生した場合の対処法です。 ブラウザでは正常に表示が出来るので戸惑ってしまいました。

https://www.ssllabs.com/ssltest/

:::note warn

※ これは2016-08-26に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 原因

中間証明書がサーバから送信されていない。

ブラウザではPC自身に中間証明書がインストールされているためエラーが発生しない。

## 対処方法

中間証明書を送信するように設定する。さくらのレンタルサーバの場合、独自SSLの設定から、中間証明書のインストールを必ず行いましょう。

![さくらレンタルサーバーの独自SSLの設定から「中間証明書のインストール」を選択する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/1ea12631-bf8f-0d87-fe64-e79cf897de8e.png)
Real-Time Find and Replace で置換されないときの対処法


Real-Time Find and Replaceプラグインでの置換が適用されないときの対象方法を紹介します。

:::note warn

※ これは2016-09-26に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## プラグインの概要

https://ja.wordpress.org/plugins/real-time-find-and-replace/

WordPressで表示される公開ページの置換、正規表現置換ができるプラグインです。

## 置換されない…

Autoptimizeプラグインで生成されたjs、cssファイルのURLを変更するために使用したのですが、置換作業がうまくいきませんでした。

## 原因

AutoptimizeプラグインやReal-Time Find and Replaceプラグインも `template_redirect` フックを利用していました。優先順位がどちらも同一であったため、名前順でAutoptimizeプラグインの出力のバッファリングが先に開始されてしまったことが原因です。

## 対処

Real-Time Find and Replaceプラグインの出力のバッファリングの優先順位をあげます。「real-time-find-and-replace.php」の最終行を次のように変更します。-1は場合によって変更してください。Autoptimizeは0でしたので、-1を設定しました。

```diff
- add_action( 'template_redirect', 'far_template_redirect');
+ add_action( 'template_redirect', 'far_template_redirect' ,-1);
```
リソースモニター

リソース状況を確認するコマンドのメモ

# ps
## 出力項目を指定[BSD options]
```
# ps axo user,pid,ppid,pcpu,pmem,vsz,rss,tty,stat,start,time,comm [OPTIONS]
USER         PID    PPID %CPU %MEM    VSZ   RSS TT       STAT  STARTED     TIME COMMAND
root           1       0  0.2  0.3  94684 15072 ?        Ss   22:18:09 00:00:05 systemd
```

## 指定項目でソート
- 昇順 ```# ps OPTIONS --sort FIELD```
- 降順 ```# ps OPTIONS --sort -FIELD```

```
# ps aux --sort %cpu
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.3  0.3  94684 15072 ?        Ss   22:18   0:05 /usr/lib/systemd/systemd --system --deserialize 20

# ps aux --sort -%cpu
```

## OPTIONS
 -H : プロセスを階層表示
 --sort : ソート
 -L : スレッド表示

### プロセスを階層表示
```
# ps -eaf -H
UID          PID    PPID  C STIME TTY          TIME CMD
root        1356       1  0  2月11 ?      00:01:38   /usr/sbin/crond -n
root     1017443    1356  0 10:35 ?        00:00:00     /usr/sbin/CROND -n
root     1017445 1017443  0 10:35 ?        00:00:00       /bin/sh /root/crontest.sh test1
root     1017527 1017445  0 10:35 ?        00:00:00         sleep 1
```

### スレッド
```
# ps -eaf -L
UID          PID    PPID     LWP  C NLWP STIME TTY          TIME CMD
root           1       0       1  0    1 22:18 ?        00:00:05 /usr/lib/systemd/systemd --system --deserialize 20
root           2       0       2  0    1 22:18 ?        00:00:00 [kthreadd]
root           3       2       3  0    1 22:18 ?        00:00:00 [rcu_gp]
```


# top・バッチモード
## 昇順・降順
- 昇順
```bash:
DURATION=1
TIMES=5
top -o -%CPU -d $DURATION -n $TIMES -c -b 
```
- 降順
```bash:
DURATION=1
TIMES=5
top -o %CPU -d $DURATION -n $TIMES -c -b 
```

## 表示項目の選択
- topを会話モードで実行
- "f"を押す
- カーソル移動し、d or <sppace
- q or ESC で表示画面に戻って
- W で保存
```
# samples
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                            PPID nTH WCHAN     
      1 root      20   0   94684  15072   9144 S   0.0   0.4   1:11.15 systemd                               0   1 do_epoll_+
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd                              0   1 -         
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                2   1 -         
```


# vmstat 
```bash:
DURATION=1
TIMES=5
vmstat -t $DURATION $TIMES
```

# dstat 
```bash:
DURATION=1
TIMES=5
OTF=/tmp/foo
# second
dstat -ta --proc $DURATION $TIMES
# mili-sec
dstat --time-adv -a --proc $DURATION $TIMES
# output-file
dstat --time-adv -a --proc $DURATION $TIMES -o $OTF
```
Storybook入門

# はじめに
Storybookは、Reactやその他のフロントエンドフレームワークで使用されるUIコンポーネントを開発、テスト、文書化するためのツールです。
主な目的は、個々のUIコンポーネントを分離して、それらがどのように見えるか、どのように動作するかを視覚的に確認し、テストすることです。
そうすることで、デザイナーとの連携が取りやすくなったり、アプリケーションを起動しなくてもUIコンポーネントの動作確認ができるようになります。


# インストール
今回は、ReactとTypeScriptを使用するので、Reactのプロジェクトを立ち上げます。
```
npx create-react-app study-storybook --template typescript
```

プロジェクトが立ち上がったら、以下のコマンドでStorybookをインストールします。

```
npx storybook init
```
以下のようなファイルが作成されます。
初期では、Button, Header, Pageの3つのストーリーが作成されています。
![スクリーンショット 2024-03-07 22.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/c185c9d4-35bb-aa97-585d-d6d3f46635df.png)

# Storybookを起動
Storybookがインストールできたら、Storybookを立ち上げてみます。
```
 npm run storybook
```

すると、以下のような画面が表示されます。
![スクリーンショット 2024-03-07 22.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/01983a4b-1f86-34be-a8f6-ef18ba19e533.png)


初期では「Button」「Header」「Page」の3つのストーリーが自動で作成されています。
今回は、Buttonコンポーネントをインポートして、ストーリーを作っていくので、自動で作成された「Storybook」フォルダは削除します。
![スクリーンショット 2024-03-07 22.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/3af33613-fe29-72bf-cccd-7eced5af50c7.png)



# ストーリーを作成しよう

ボタンストーリーを作成するために、まずボタンコンポーネントを作成します。このコンポーネントは、次のようになります。
```components/Button.tsx
import { FC } from "react";

interface ButtonProps {
  label: string;
  primary?: boolean;
  onClick: () => void;
}

const Button: React.FC<ButtonProps> = ({ label, primary, onClick }) => {
  const buttonStyle = primary
    ? { backgroundColor: "red", color: "white" }
    : { backgroundColor: "white", color: "red" };
  return (
    <button style={buttonStyle} onClick={onClick}>
      {label}
    </button>
  );
};

export default Button;
```

このコンポーネントは、label（ボタンのテキスト）、primary（プライマリボタンかどうかを示すブール値）、onClick（クリック時のイベントハンドラー）の3つのプロパティを受け取ります。primary プロパティは省略可能で、省略された場合はデフォルトで false が設定されます。ボタンのスタイルはprimary プロパティの値に応じて変更されます。

次に、ストーリーを作成します。ボタンコンポーネントに関するストーリーをまとめるためのモジュールを components/Button.stories.tsx ファイルに作成します。以下のようになります
```components/Button.stories.tsx
import Button from "./Button";
import type { Meta, StoryObj } from "@storybook/react";

// ストーリーのメタ情報を定義します。
const meta = {
  title: "Button", // ストーリーのタイトル
  component: Button, // ストーリーで使用するコンポーネント
} as Meta<typeof Button>;

export default meta;

type Story = StoryObj<typeof Button>;

// Primary ボタンのストーリーを定義します。
export const Primary: Story = {
  args: {
    label: "Primaryボタン",
    primary: true,
  },
};

// Normal ボタンのストーリーを定義します。
export const Normal: Story = {
  args: {
    label: "Normalボタン",
    primary: false,
  },
};
```
それでは、作成したストーリーを見てみましょう。
npm run storybookコマンドを実行し、Storybookを起動します。
すると、以下のように作成した２つのストーリーが表示されます。

![スクリーンショット 2024-03-07 22.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/f5b372d9-d4dc-8e64-aaec-8a48ed6233eb.png)

![スクリーンショット 2024-03-07 22.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/8b62bdb2-d7f3-f3f3-e87d-d5ebbfed1ef8.png)



# 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
ディレクトリ内にあるHTMLファイルを読み込んで、その内容をメール本文として送信する

Python 2.7でディレクトリ内にあるHTMLファイルを読み込んで、その内容をメール本文として送信するには、以下のスクリプトを使用できます。この例では、HTMLファイルを読み込み、`email.mime.text.MIMEText`を使って`'html'`形式でメールを構築します。

```python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# メールパラメータ設定
sender_email = "your_email@gmail.com"
receiver_email = "receiver_email@example.com"
password = "your_password"  # Gmailのパスワード
smtp_server = "smtp.gmail.com"
smtp_port = 587

# メールの件名とHTMLファイルのパス
subject = "HTMLファイルからのメール"
html_file_path = "path/to/your/file.html"

# HTMLファイルを読み込み
with open(html_file_path, 'r') as file:
    html_content = file.read()

# メールメッセージの作成
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# HTMLの本文を追加
message.attach(MIMEText(html_content, "html"))

# SMTPサーバーへ接続してメールを送信
try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # セキュリティのためTLSを使用
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message.as_string())
    print("メールが正常に送信されました。")
finally:
    server.quit()
```

このスクリプトを実行する前に、以下の変数を適切な値に変更してください：
- `sender_email`: 送信者のメールアドレス
- `receiver_email`: 受信者のメールアドレス
- `password`: 送信者のメールアカウントのパスワード
- `html_file_path`: 送信したいHTMLファイルのパス

また、Gmailを使ってメールを送信する場合は、Googleアカウントのセキュリティ設定に注意してください。"安全性の低いアプリのアクセス"を許可する設定や、2段階認証プロセスを使用している場合は、アプリパスワードを生成して使用する必要があります。
【css2行だけ】ページ内リンクでターゲットの少し上に着地する「scroll-padding-top」

### ページ内リンクのリンク先は h2 などの見出しにしたい

`h2` （見出し）にはアクセシビリティの観点的な都合で id を付与したい。
その id をページ内リンクのターゲットとして流用するのがスマートな感じがする。

ところが見出しを直接ページ内リンクのターゲットにすると、ページの上ギリギリになったり、固定のヘッダーが付いてくる場合はそれに隠されたりしちゃう。

「ページ内リンクのちょっと上に着地させたい」




### 「scroll-padding-top」という神プロパティ
（@chocolamint 様に教えていただきました！）

htmlにこの2行を書くだけです。
- `scroll-snap-type: y proximity;`
- `scroll-padding-top: 70px;`

ついでにスムーススクロールつけるのも、これで完了。
```css:css
html {
	scroll-snap-type: y proximity;
	scroll-padding-top: 70px;
 	scroll-behavior: smooth;
}
```

安心の主要ブラウザフルサポート済です。
[※参考：MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-padding-top)


### （旧版）ターゲットの少し上に着地する方法

従来の方法は２種類ありました。
1. cssを使った超シンプルな方法
2. cssだと上手くいかない時にjsを使う方法

#### cssを使って、見出しの上に空間を作る

```scss:scsss
.c-heading {
    // （中略）
    paddint-top: 70px;
    margin-top: -70px;
}
```
これだけで見出しの上 70px のところに着地する。
ところが、見出しの style によってはこれを追加するのが難しいかもしれない。

#### jsを使って、ターゲットの少し上に着地させる

```javascript:js
const headerHeight = 70;
const links = document.querySelectorAll('a[href^="#"]');

links.forEach(link => {
  link.addEventListener('click', function(event) {
    event.preventDefault();
    const href = this.getAttribute('href');
    const target = href === '#' ? document.documentElement : document.querySelector(href);
    const position = target.getBoundingClientRect().top + window.pageYOffset - headerHeight;
    window.scrollTo({
      top: position,
      behavior: 'smooth'); // smooth or instant
  });
});
```