OmniAICreator/Qiita-1.07M huggingface dataset:
Floorpがバージョンアップ…だが。

## これまで
ここで [Floorpというブラウザを使ってみた](https://qiita.com/array/items/fb6cd6edbdd24f0b1c14) と言う記事を書きましたがここ9月下旬～10月頭でバージョンアップがあったので追記・感想などを。

## バージョンアップ
* 変わったところ
    * サイトバー以外にウェブパネルがついた
    * ESRでのバージョンアップがある
## 使い勝手
### ウェブパネル
Vivaldiを知っている人はわかりやすいと思いますが新しい表示領域を作ったということです。当初はブラウジングライブラリと履歴・ブックマーク・TSTなどが設定されていますが新しいサイトを直感的ではないがセットできます。(設定画面からセットする)

ここでブラウジングライブラリを選ぶといわゆるFirefoxのブラウジングライブラリでツリー構造しか見えないのですがこれは幅を広げないと履歴・ブックマークなどにアクセスできません。当初から広げた状態にしておいたほうが良かったのでは?と思います。私は当初気づかず、何でブラウジングライブラリがあって履歴・ブックマークが単独であるのか理解できなかったです。履歴・ブックマークはクリックすると左にツリー、右に内容が出るようになっています。これはどちらかでもよかった気がしますし、選択ができれば良かったかと思います。

### Tree Style Tab
これはバージョンアップの頻度が結構高い拡張機能なのですがバージョンアップされて **いません。** 現行は3.9.5ですが、どうもそれより古いようです。TST Active Tab in Collapsed Treeとか3.8.1以降を要求するTSTの拡張は使えないので ~~3.8.1未満のように思えます。~~ 3.8.2だそうです。使えない理由の回答とオーバーライドのインストールもできる旨回答があり追記しました。 [^1]  ~~これが確認できないのが不満。多分インストール直後だとTSTのアイコンがでるのでそこで確認はできるかと思いますが、自分でバージョンアップできないのでかなり残念です。~~

### uBlockOrigin
これ、効いているのかな?と言うのがわからないのが不安。GmailのCMラインが出るのでどうも効いていないようです。ただほかはブロックしているので何か別のブロッカーを使っているのかなと思います。

### マウスジェスチャー
拡張で対応していますが、この拡張はバージョンアップ版をインストールすると勝手にインストールされます。前2つの拡張と動きが違います。

あとは大きい変更点はないのですが売りにしている
> 当初はLocaleをEN-USでインストールして
> 起動すると環境をみてそのLocaleにあわせる
というのがTSTには働かず、設定は英語のままです。これは前バージョンからそうなので気づいていたんですが報告忘れました。

### じゃあ常用する?
うーん、前バージョンはあらが目立たなかったのとFirefox派生が珍しかったし応援したい気持ちもあったのでバージョンアップまで常用してましたが、今回、TSTがアップデートされないことに気づいてFirefoxでできることが拡張をインストールしてもだめ、同期を取るとあとから同期した方が勝つのでFloorpにない拡張はFirefoxから消えてしまうというのに気づいてちょっと常用はあきらめようと思います。
Vivaldiの便利さとFirefoxの良さを持ったブラウザだと思いますが、拡張がアップデートされないというのが一番不安。FirefoxはESRで続けるというのは納得感があるのですが拡張はバグ修正・機能追加・脆弱性対応などがあるのできちんとアップデートできないとちょっと **いや** です。今回は見送り。

---
追記：Floorpの担当者の方からツイートをいただきましたのでこちらが誤解しているところもあるようなので追記しておきます。
特にTSTについてです。
---
以下2022/10/05　16:20位のツイート Floorp担当者様（抜粋です）
1．
> 脆弱性に関わるTSTのアップデートはありません。最終更新は7月に行われています。
> Floorp に TST は統合されているので、アップデートも慎重なんです。
> 脆弱性に関する情報があればいち早く対処します。

[^1]:
 2． 
> また、アドオンによる追加機能は使えません。組み込みのアドオンが他のアドオンの干渉を受けられないだけなので単純に使えないだけかと。
> また、TST をオーバライドしてインストールすることも可能です。この場合も問題なく動作します

3．TSTのバージョンは3.8.2のようです。

本文では脆弱性と書いてしまいましたが（最近あった気がしたので）今調べたらそこまでのはないのです。この点は訂正してお詫びします。
ただ、3.8.2以降、かなりの機能追加と不具合の修正がなされています。
詳しくは
(https://piro.sakura.ne.jp/xul/_treestyletab.html#focused-folding-item(folding-item-history-443 を参照してください。
現在のバージョンは **3.9.4** です。
特に気になるのはウェブパネルにTSTを入れて使えるようにしたことなのですが右サイドバーの扱いに多分なっているのではないか、これに対するTSTは3.8.9からなので多少の見づらさとか使いにくさがでてしまうのでは無いかということです。

まあオーバーロードしてインストールしてしまえばいいというご意見ですがそれだとFirefoxでよくない？と言う気もしないでもないです。

ただこれだけ迅速な回答をえられる環境はよいと思います。応援はしていこうと思います。
React開発を2年続けて学んだ事

ここ2年Reactベースのアプリを開発してきました。
開発も一段落するので開発する中で得た知見を整理したいと思います。
とりあえず、ざっと以下に書き並べてみました。

1. useStateやuseEffectを使用する上での注意点
2. Component分割
3. グローバルな状態の保持方法
4. React Query(TanStackQuery)について
5. Suspenseの利用
6. ErrorBoundaryの扱い
7. React Routerについて
8. wsによる高頻度push受信と画面への描画
9. storybookの導入について
10. Jest及びReact-Testing-Libraryでのテスト
11. その他

粒度もバラバラだったり未だはっきりしない部分もありますが、他にも思いついたら追加していきます。
また、それぞれの項目については長くなると思うので個別に記事を書いていきます。
minio+ssl+docker-compose エラーにならないコンソールURLの設定方法

```docker-compose.yml
  minio:
    image: minio/minio:latest
    container_name: minio
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password
      MINIO_SERVER_URL: https://localhost:9000
    command: server --address :9000 --console-address :9001 /data
    volumes:
      - ../certs:/root/.minio/certs #localhostで有効な証明書置き場
    ports:
      - 9000:9000
      - 9001:9001

```

## ポイント

`MINIO_SERVER_URL`を指定しないと、以下のURL以外ではコンソールアクセスが
`Post "https://172.18.0.3:9000/": x509: cannot validate certificate for 172.18.0.3 because it doesn't contain any IP SANs`というエラーになってしまう。

```
minio    | API: https://172.18.0.3:9000  https://127.0.0.1:9000 
minio    | Console: https://172.18.0.3:9001 https://127.0.0.1:9001 
```
wordpress関数〜基本取得編

投稿の取得でよく使うwordpress関数です。
ループの中で使用します。
```
使用例
<?php if ( have_posts() ) : ?>
  <?php while( have_posts() ) : the_post(); ?>
      <?php the_title( '<h2><a href="' . esc_url( get_permalink() ) . '">', '</a></h2>' ); ?>
      <p><?php the_time('Y年m月j日');?></p>
      <p><?php the_content(); ?></p>
  <?php endwhile;?>
<?php endif; ?>
```

## 投稿タイトル取得
```
<?php the_title(); ?>
```
## 投稿日取得
the_date();とthe_time();両方とも日付の取得が可能だが、
the_date();は「同じ日に複数の他の記事がある場合、最初の記事のみ日付が出力される」仕様になっているため、
一覧ページの場合は、the_time();を使用した方が良い。
```
<?php the_date('Y年m月j日'); ?>
または
<?php the_time('Y年m月j日'); ?>
```
## リンク取得
### the_permalink();
```
<?php the_title( '<a href="' . esc_url( get_permalink() ) . '">', '</a>' ); ?>
または
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
```

### get_permalink
URLを文字列として取得する。

```
<?php $permalink = get_permalink(); ?>

投稿のIDを指定するとループの外でもURLを取得することができる。
<?php $permalink = get_permalink( 投稿のIDを記述 ); ?>
```
## 投稿内容取得

### the_content();
本文をそのまま表示する場合に使用する。
```
<?php the_content(); ?>
```

### get_the_content();
文字列として取得する場合に使用する。
strip_shortcodes()関数を使用すると純粋なテキストのみを取得することができる。
```
<?php            
  $content  = get_the_content();
  $text     = strip_tags( strip_shortcodes( $content ) ); 
?>      
```
### wp_strip_all_tags();
あらゆるHTMLタグを除去する。
例えば、一覧ページに詳細ページの本文を抜粋する際に、文字列で表示するには不向きなタグ(画像やリンクなどのhtml)が入っている場合に、文字列のみ取り出すことができる。
```
<?php 
$content = get_the_content();               
echo '<div>'. wp_strip_all_tags($content). '</div>'; ?>             
```
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その044

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: データと自動化
データ管理と分析管理の演習

にある練習問題12問目をご紹介します

なお今回の内容は動画でも解説しています。ご確認ください

https://www.youtube.com/watch?v=nbiFH9EuYno&list=TLPQMDUxMDIwMjJR8IN7llS4KA&index=1

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-security-and-data-management/review-data-management?trail_id=administrator-certification-prep


![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/726028e7-314d-7389-1933-42c95a072c2e.png)


正解はCです

この現象はどのようになっているのか　という話です


入力規則を作成すれば選択リストによりエラーを表示させることが可能です


入力規則の詳細などはこちらの動画で解説しています


https://www.youtube.com/watch?v=nbiFH9EuYno&list=TLPQMDUxMDIwMjJR8IN7llS4KA&index=1
Laravel + DoctrineでのDDD開発をした

# この記事は？
https://qiita.com/yuichi_sano/items/f66d70d85a37f288f340

この雛形を使用した開発が一旦区切りがついたので、素のlaravelと比較しながら感想を述べたもの
これを使用して社内の標準化を進めているので、それの役に立てば良いなという思いも

# 素のlaravelとの比較・利点など

詳しくは上記の記事に書いてあるので、自分が触れたところをざっくりという感じです

### Clientとapiのソースが完全に分けられている
　Client側を気軽に入れ替えやすい
　今はvue2系を使用しているが、今後reactやらモダンなフロント言語に移行しやすいので今後も長く使えるのかなあと思った

### ドメイン駆動設計
　ドメイン駆動設計。データベースのロジックが複雑なシステムに向いている気がする

### presentation層の半自動化
　Swaggerを使ってAPIの設計書を作成 jsonファイルで作成するが、
そのファイルを参照してrequest,resource,controller,routeをある程度作成してくれる
(ただし、Controllerはおまけ程度、名称など指定できない)
　素のlaravelだと、make::〇〇コマンドを作成する分叩かないといけないので、作業効率が上がっている（もちろん、中身などはある程度作成しないといけないが）

### migrationがflyway
　DBのlaravel依存を減らせていて、疎結合になっている

### doctrineを使用したxmlマッピング
　ドメイン層とrepository周りのインフラストラクチャ層の分離のために使用、ファイルの数は増加する

### buildツール完備
　一個叩くだけでコーディング規約のチェック、テストなどが一気に通るので効率化につながっていると思う。
　他人の作業ブランチにpushする前にこのコマンドを通してしまい、競合が約200件とかになってしまうということもあるので使い方に注意する

# 開発してみて気づいた欠点など

### DB周りの実装の重さ
　機能的比較で述べたように、controllerやrequest周りはある程度自動で作成されるが、service、domain、doctrineのxmlマッピング、インフラ層、SQLの実装などがあり、どうしてもlaravel標準のeloquentなどに比べると、実装に時間がかかるという感覚
　特に、ドメイン層、doctrine周りの実装に時間がかかり、doctrine周りは学習コストも高めなのでより顕著
　疎結合にするためにはしょうがないとはいえ、手打ちでの実装箇所が多くなるにつれて、タイポなどの些細なミスが増えてくるので、エラーが頻発して精神的に苦しい場面はあった
　ドメイン層も対象となるテーブルが多くなったり、ロジックが複雑になったりすると、コーディングの負担が多くなる。しかし一旦作成してしまえば、軽微な仕様変更等にもある程度対応できるのでそこまででもない、継続的な開発に真価を発揮するのかもしれない

### client層のAtomicDesign周りに苦労
　clientにはvue2系を使用して、AtomicDesignを使用しているが、それに対する学習コストも発生するので大変
　特に開発初期はコンポーネントの数も少なく、AtomicDesignの意義が感じにくい
　画面数がwebサイト並に多かったり、画面表示も凝って整えるのであれば話は別だが、機能ありきのシステムにこの設計手法を導入するメリットはあまり感じられないかなと思った。

### キャッチアップの難しさ
　素のlaravelも同様であるが、レイヤーなどの構造が理解しにくい
　これにドメイン駆動設計の要素やdoctrineやflyway、client周りの学習も入ってくるので、余計初期のキャッチアップが困難　laravelを使用した開発を行っていたのであれば、追加された機能やパッケージについて学習するだけで済むが、今後これを社内の開発基盤にしていくのであれば、学習コストがかかるということは意識するべき

# 別案での標準化検討

　特に致命的なデメリットは感じられないので、機能的にはこのまま進めるべきだと思った
　強いて言うならDB周りの実装が軽くなるツールがあればそれに乗り換えてもよいと考える

# 強化案

　doctrineやドメイン層周りの実装の重さの改善が欲しいと思った
swaggerのapi自動作成のような、ドメインの設計を記述したjsonファイルを元にドメインのphpファイルとそれに対応するテーブルのマッピングを記述したxmlを自動作成するコマンドを作成中しているので、それが完全になれば開発速度が大幅に向上すると思う

# まとめ
　実際開発してみて、素のlaravelより学習コストは高くなるが、非常に堅実な開発ができると思った
この開発基盤の社内標準化に向けて、色々調査や改善をしていきたい
グラフ入門

# 対象とする読者
この記事は以下の方を対象としています。
- データ アナリスト／サイエンティストの方
- （リレーショナル）データベース管理者・エンジニアで、グラフデータベースを検討している方

# グラフとは

分析やデータを取り扱う場合、グラフと言われると棒グラフ・折れ線グラフなどをイメージしがちですがここで説明するのはグラフ理論（グラフ構造）とよばれるものです。

グラフ理論においてグラフとは、バーテックス（ノード/頂点）とエッジ（辺）で構成された図形を指します。

```mermaid
flowchart LR
	A((バーテックス1)) -- エッジ1 --- B((バーテックス2))
	B -- エッジ2 --- C((バーテックス3))
```

グラフには無向グラフ（Undirected Graph）と有向グラフ（Directed Graph）に分類されます。

- 無向グラフ：バーテックスとエッジで構成された図形
    
    ```mermaid
    flowchart LR
    	A((V1)) --- B((V2))
    	B --- C((V3))
    	C --- A
    ```
    
- 有向グラフ：バーテックスと向きを持つエッジ（矢印）で構成されたグラフ
    
    ```mermaid
    flowchart LR
    	A((V1)) --> B((V2))
    	B --> C((V3))
    	A --> C
    ```
    

# グラフが着目される理由

データを主眼において物事を考えて（分析して）いくと、データには様々な関係性があります。例えば、FacebookやTwitterなどのSNSにおいて、ユーザ同士は「友達」や「フォロー」という関係がありますし、投稿した内容に対して「いいね」をする場合もユーザAがユーザBのXという投稿に対していいねをしたというデータで表され（保存され）ます。

**データスキーマ（定義）イメージ**

```mermaid
flowchart LR
	A((ユーザ)) -- 友達 --- A
	A -- 投稿 --> B((コンテンツ))
	A -- いいね --> B
	
```

**データイメージ**

```mermaid
flowchart LR
	A((ユーザA)) -- 友達 --- B((ユーザB))
	B -- 投稿 --> C((コンテンツX))
	A -- いいね --> C
```

またAmazonなどのEコマースにおいて、「おすすめ（レコメンデーション）」もユーザAが閲覧している商品Xをみた他のユーザが閲覧（または購入）した商品を表示するなどデータの紐付きを利用してそのロジック（アルゴリズム）を構築しています。

**データスキーマ（定義）イメージ**

```mermaid
flowchart LR
	A((ユーザ)) -- 閲覧 --> B((商品))
	A -- 購入 --> B
```

**データイメージ**

```mermaid
flowchart LR
	A((ユーザA)) -- 閲覧 --> B((商品X))
	C((ユーザB)) -- 購入 --> B
	D((ユーザC)) -- 購入 --> B
	E((ユーザD)) -- 購入 --> B
	C((ユーザB)) -- 購入 --> F((商品Y))
	D((ユーザC)) -- 購入 --> F
	E((ユーザD)) -- 購入 --> F
```

このようにデータの関係性を利用したデータ分析（探索）をおこなうためにグラフに特化したデータベース（またはグラフデータを保存できるデータベース）が開発され提供されています。

ではどのような利点があるのでしょうか。

前述にあるようにグラフ データベースは関係性ごとデータとして扱うことを得意としています。いくつかの分析観点からお話をしていきたいと思います。まず一つ目に関係性を保持しているので特定のデータから別のデータまでの経路を探索することが容易に実現できます。例えば、東京都内で地下鉄を利用して新宿駅から日本橋駅までの経路を探索することを考えて下さい。路線図を見れば、新宿駅からどの駅で乗り継ぎが必要なのかを視覚的に理解することが可能です。これがまさしくグラフ構造化されたデータであり、人間にとって視覚的にわかりやすく分析できるのが特徴です。リレーショナル データベースで同じ分析ができるかという観点では、「要件が確定していればできる」が回答です。例えば新宿から隣接する10番目の駅という定まった要件を抽出するだけならリレーショナルデータベースでもできますが、分析に必要な柔軟さ（アドホックな分析を実行する）を持ち合わせていません。

**メトロネットワーク図（[https://www.tokyometro.jp/station/202006_shosai_ja.pdf](https://www.tokyometro.jp/station/202006_shosai_ja.pdf)）**
![メトロネットワーク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843915/10aa38ac-bc85-cca3-93fc-e5255ed4abfd.png)


二つ目に関係性のパターンを検索することができます。以下を例にお話をしていきましょう。SNSで以下の様な関係するデータが存在します。この中から特定のパターンを検索する事も可能です。データが繋がっているからこそデータの関係性のパターンを識別し抽出する、または、最頻出するパターンを見出すなどグラフ構造をデータ抽出に利用できます。

**SNSにおける各ユーザのリレーション図**
![SNSのリレーション図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843915/961740d1-4d16-59f6-070d-005119f250f0.png)


**検索パターンのイメージ**
![検索パターン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843915/089ff505-96d5-968a-5943-3c995e8ea036.png)


三つ目に関係性を利用した分析のアルゴリズムを適用しやすいというのもグラフ データベースの特徴です。一つ目でお話しした地下鉄の路線から新宿駅から日本橋駅に至るための「最短経路検索」を用いることで、停車する駅数、各駅間走行時間などを活用して経路を求めることができます。またEコマースサイトにおいて、各ユーザの特定の行動（商品閲覧や購買）から「類似度（ジャッカード係数やコサイン類似度など）」を利用したレコメンデーションエンジンを構築することができます。
Ubuntu 22.04にsambaをインストールしてファイルサーバにする（Linuxユーザーのホームディレクトリを共有）

# aptパッケージをインストール

```bash
sudo apt update
sudo apt upgrade
```

# Sambaをインストール

```bash
sudo apt install -y samba
```

# 設定ファイル編集
## 設定ファイルをバックアップ

```bash
cd /etc/samba/
sudo cp -a smb.conf smb.conf.default
```

## 設定ファイル編集

```bash
sudo vim smb.conf
```

smb.confの末尾に下記追加

```conf
[｛ユーザー名｝]
path = /home/｛ユーザー名｝/
browsable = yes
writable = yes
guest ok = no
read only = no
```

# Linuxユーザーにsambaパスワードを設定

```bash
sudo smbpasswd -a ｛ユーザー名｝
```

```
New SMB password:
Retype new SMB password:
```

と聞かれるので、共有フォルダへアクセスする際のパスワードを設定します。

# 共有フォルダへアクセスする

```txt
\\｛samba接続先IPアドレス｝\｛ユーザー名｝
```

へアクセスし、ユーザー名とパスワードを聞かれたら、ユーザー名と、smbpasswdで設定したパスワードを入力します。
php.iniを使ってエラー表示方法

php.iniはphpのファイル設定のことを指す。

エラーの表示方法はphpのファイルのデフォルト設定では
デフォルトの設定では「display_errors = Off」となっています。
こちらの記述を編集します。

これを、
「display_errors = On」
にします、

場所は「Applicants > MAMP > bin > php > php7.3.8 > conf」
の順に移動していきます。

ファイル内検索で、「display_errors」を検索すれば、手間が省けます。

デフォルトでは「display_errors = Off」となっているので、
　
設定を「On」に編集してファイルを保存します。


それも表示がうまくいかない場合は、PHPファイルに直接記述していきましょう。
```javascript
//エラー表示
<?php

ini_set('display_errors', 1);

?>

//エラーしない
<?php

ini_set('display_errors', 2);

?>
```

となります。
AI Programmerの作法 その3

# 概要
AI Programmerの作法、調べてみた。

# 投入したソースコード
- C++

- 
「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、２匹分適当なデータでインスタンスを作成し、それぞれを戦わせてください。
戦いとは敵の体力を削ることです。ダメージは敵の攻撃力まいなす自分の防御力で決まり、体力からダメージを引きます。
一方の体力がゼロになったところで勝負が決まります


# 実行結果

```
「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、２匹分適当なデータでインスタンスを作成し、それぞれを戦わせてください。戦いとは敵の体力を削ることです。ダメージは敵の攻撃力まいなす自分の防御力で決まり、体力からダメージを引きます。一方の体力がゼロになったところで勝負が決まります。

#include <iostream>
#include <string>

class Monster {
public:
    std::string name;
    int hp;
    int attack;
    int defense;

    Monster(std::string name, int hp, int attack, int defense) {
        this->name = name;
        this->hp = hp;
        this->attack = attack;
        this->defense = defense;
    }

    void attackMonster(Monster &enemy) {
        int damage = this->attack - enemy.defense;
        enemy.hp -= damage;
        std::cout << this->name << "の攻撃！" << enemy.name << "に" << damage << "のダメージを与えた！" << std::endl;
    }
};

int main() {
    Monster slime("スライム", 10, 5, 2);
    Monster dragon("ドラゴン", 100, 30, 20);

    while (true) 
    {
        slime.attackMonster(dragon);
        dragon.attackMonster(slime);

        std::cout << "スライムのHP: " << slime.hp << std::endl;
        std::cout << "ドラゴンのHP: " << dragon.hp << std::endl;

        if (slime.hp <= 0) 
        {
            std::cout << "ドラゴンの勝ち！" << std::endl;
            break;
        } 
        else if (dragon.hp <= 0) 
        {
            std::cout << "スライムの勝ち！" << std::endl;
            break;
        }
    }

    return 0;
}
```

# paiza.io 実行結果

```
スライムの攻撃！ドラゴンに-15のダメージを与えた！
ドラゴンの攻撃！スライムに28のダメージを与えた！
スライムのHP: -18
ドラゴンのHP: 115
ドラゴンの勝ち！
```

# 成果物

https://paiza.io/projects/gbD1y53rlR7XXYwXgA6Bbg?language=cpp


以上。
「円柱を直径で入力したい」をsympyとFreeCADでやってみた。

**オリジナル**
Part Cylinder￥Scripting
cylinder.Radius
以下で十分のような気もします。

https://wiki.freecadweb.org/Part_Cylinder#Scripting


**日本語フォーラムより**

https://forum.freecadweb.org/viewtopic.php?f=16&t=71440


# sympy入力とFreeCAD作図で
sympyだと、√や分数のままで計算できます。ただし、出力時に、float変換必要です。
座標を文字出力しています。

```python
import FreeCAD
import Part
import Draft
import Mesh
import FreeCAD as App
# 入力 ############################################################################
from sympy import *
C=Point(5,10,15)
cylinder_Radius,cylinder_Height=20/2,50
Rx,Ry,Rz                       =75,60,210
# 作図 ############################################################################
def my_Cylinder(cylinder_Radius,cylinder_Height,A,Rx,Ry,Rz):
    print(A)
    Vx=float(A.x)
    Vy=float(A.y)
    Vz=float(A.z)
    cylinder = doc.addObject("Part::Cylinder", "myCylinder")
    cylinder.Radius = cylinder_Radius
    cylinder.Height = cylinder_Height
    cylinder.Placement = App.Placement(App.Vector(Vx,Vy,Vz), App.Rotation(Rx,Ry,Rz))
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxt_XYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    print(P5x,P5y,P5z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '5'
doc = App.activeDocument()
my_Cylinder(cylinder_Radius,cylinder_Height,C,Rx,Ry,Rz)
myTxt_XYZ(C,"C"+myXYZ2Txt(C))
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
doc.recompute()
```
![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/5c6d5351-2594-13d4-c243-fbf2acc82988.png)
# 参考

https://qiita.com/mrrclb48z/items/1162439c3e37611388ef
Laravel8 Jetstream team版でOwner以外にチームメンバーのロール編集権限を持たせる

Laravel8 Jetstreamであれやこれや作っています。
今回はチーム内に管理者を置いて、共同管理ができるようにしたく、まずはロール変更が出きるようにしてみました。

### 条件
- Laravel8
- Jetstream team版導入済み
- 新規ユーザ登録時にチームIDは指定し、ロールはreaderを持たせている

### なんでこれが必用か
JetstreamのチームメンバーのロールはTeam Ownerしか変更できません。
そこで、editorにも編集権限を渡したいと思います。

### 参考にしたサイト

https://jetstream.laravel.com/2.x/features/teams.html#member-management


### ロールの確認

app/providers/JetstreamServiceProvider.php
の
editorに**update**があることを確認する。

```php:JetstreamServiceProvider.php
        Jetstream::role('editor', 'Editor', [
            'read',
            'create',
            'update', //<----これ
        ])->description('Editor users have the ability to read, create, and update.');
```


app/policies/TeamPolicy.phpを編集する。

変更前のこれ
```php:TeamPolicy.php
   public function updateTeamMember(User $user, Team $team)
    {

        return $user->ownsTeam($team);

    }
```


を


```php:TeamPolicy.php
   public function updateTeamMember(User $user, Team $team)
    {

        if($user->hasTeamPermission($team, '　update')){
            return true;
        }

        //変更前は以下
        //return $user->ownsTeam($team);
    }
```
にします。

これだけでした。

### これは動かなかった
function名を変えると動きませんでした。

app/policies/TeamPolicy.php

```php:TeamPolicy.php
  public function modifyTeamMember(User $user, Team $team)
    {
        if($user->hasTeamPermission($team, 'update')){
            return true;
        }
    }
```

function名で参照しているのかな。

最初はOwnerがロール変更をする必用があります。
VSCodeでM5stack開発環境構築（全編）

# VSCodeでM5stack開発環境構築（全編）

この記事では`VSCode`で`M5Stack`開発環境構築を行った手順を示します．

前編は[こちら](https://qiita.com/HorimotoHiroto/items/7e47ccab7774ff1c48a2)
中編は[こちら](https://qiita.com/HorimotoHiroto/items/08d9acfbcfffd3cf715c)
後編は[こちら](https://qiita.com/HorimotoHiroto/items/3ea83dd7197a8d48bfc0)

前編では，Arduino IDEのインストールとシリアル通信のドライバインストール．中編では，Arduino IDEの設定，後編では，Visual Studio Code の導入とArduino機能の拡張さらに，サンプルプログラムを実行します．

## 動作環境
Windows 11
M5Stack BASIC

## 参考にした記事
+ https://docs.m5stack.com/en/arduino/arduino_development
+ https://qiita.com/OharanD/items/bb8359b986dc24d68636
+ https://haratta-tech-lab.com/m5stack-intro-arduino-vscode/
+ https://mag.switch-science.com/2021/11/01/m5stack-v2-6-changes/
Powerpointのフリーフォーム（多角形）を直線に変換したい


# なぜこんなものを？
オフィスの図形ツールに含まれているフリーフォームで図形を描くと、再編集したい場合にとても不便です。「頂点の編集」を利用するため水平垂直を保ったままの編集ができないことが最大の弱点です。

とはいえ、下図をトレースしたり、連続したいわゆるポリライン的なものを描いたりするときにはとても便利なのでCAD的にポンチ絵を描く際に「あー、この連続線を単線に分解したいなあ」と思うことがしょっちゅうあります。ということで、選択した図形の頂点を連続取得し、単線に分解するぷち機能を作りました。
![2022-10-05_11h25_11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/c925e013-c603-b251-daa3-6df8ea7b73a0.gif)



# 導入
デフォルトのPowerpointではリボンの中に『開発タブ』が出ていないので、オプションのリボン設定から開発タブをONにし、VBEに貼り付けてください。

# 実際のコード
``` vb
Sub 多角形を直線にする()
On Error GoTo ErrHandl

i = ActiveWindow.Selection.SlideRange.SlideIndex
With ActiveWindow.Selection.ShapeRange
    Weight = .Line.Weight
    SelectionColor = .Line.ForeColor
    R = Val("&H" & Left(Hex(SelectionColor And 255), 2))
    G = Val("&H" & Left(Hex(SelectionColor And (256 ^ 2 - 256 ^ 1)), 2))
    B = Val("&H" & Left(Hex(SelectionColor And (256 ^ 3 - 256 ^ 2)), 2))
    dash = .Line.DashStyle
    cnt = .Nodes.Count

    For j = 1 To cnt - 1
        vertArray = .Vertices
        x1 = vertArray(j, 1)
        y1 = vertArray(j, 2)
        x2 = vertArray(j + 1, 1)
        y2 = vertArray(j + 1, 2)

        With ActivePresentation.Slides(i).Shapes.AddLine(x1, y1, x2, y2)
            .Line.Weight = Weight
            .Line.ForeColor.RGB = RGB(R, G, B)
            .Line.DashStyle = dash
        End With
    Next j
End With

ActiveWindow.Selection.ShapeRange.Delete
Exit Sub

ErrHandl:
MsgBox "図形を選択してから実行してください。"
End Sub
```
# 使い方
このマクロが入ったPowerpointファイルのフリーフォームの図形を選択して、マクロを実行すると直線に分解されます。誤って何も選択しないばあいには怒られます。

よいPPTライフを。
AI Programmerの作法 その2

# 概要
AI Programmerの作法、調べてみた。

# 投入したソースコード
- C++
- 九九

# 実行結果

```
九九表

#include <iostream>

int main()
{
	for (int i = 1; i <= 9; ++i)
	{
		for (int j = 1; j <= 9; ++j)
		{
			std::cout << i * j << ' ';
		}
		std::cout << '\n';
	}
}
```

# paiza.io 実行結果

```
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
```

# 成果物

https://paiza.io/projects/1UHmYqY_Z4g9fuHq7WPuxQ?language=cpp

以上。
AI Programmerの作法

# 概要

AI Programmerの作法、調べてみた。

# 参考にしたページ

https://qiita.com/bkh4149/items/51185dcd67797848dec2

# 投入したソースコード

- C++
- fizzbuzz

# 実行結果


```
fizzbuzz

#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 100; i++)
    {
        if (i % 3 == 0 && i % 5 == 0)
        {
            cout << "fizzbuzz" << endl;
        }
        else if (i % 3 == 0)
        {
            cout << "fizz" << endl;
        }
        else if (i % 5 == 0)
        {
            cout << "buzz" << endl;
        }
        else
        {
            cout << i << endl;
        }
    }
    return 0;
}
```
# paiza.ioで実行結果

```
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz
buzz
```

# 成果物

https://paiza.io/projects/otQHLygml15DlvXoUENm8w

以上。
OSS-DB silver試験対策

# OSS-DB silverとは
- [公式ページ](https://oss-db.jp/outline/silver)

## 試験の概要
- オープンソースのデータベースソフトウェアであるPostgreSQLを基準とした試験
- SilverとGoldの二段階ある
- PostgreSQLを利用したデータベースシステムの設計・開発・導入・運用ができる技術者であることを問う基本資格
- Silverが認定の対象とするのは「データベースシステムの設計/開発/導入/運用ができる技術者」と定義されている


## 問われる内容
- 一般知識、運用管理、開発・SQLなど
- 主に、PostgreSQLの一般的な知識やインストール/設定方法、SQLコマンドの基本的な使い方

## 出題構成
- 一般知識 16%　運用管理 52%　開発/SQL 32%


# 一般知識
- 

# 運用管理
- [pg_ctlコマンド](https://qiita.com/kkk777/items/a2bc50ec27a9870b0ad4)
-  [pg_hba.conf](https://qiita.com/kkk777/items/c3edab99821051ef3d57)
-  pg_settings
- [権限と権限設定コマンド](https://qiita.com/kkk777/items/dfb2ffb103a5f5ab2cdb)
- [情報スキーマ（information_schema）とシステムカタログ](https://qiita.com/kkk777/items/0a9928756ced1596f94d)

# 開発/SQL
- [インデックス](https://qiita.com/kkk777/items/0cc13dd8abf9bdcd7f40)
- [ビュー・マテリアライズドビュー](https://qiita.com/kkk777/items/a4da53b5a6ca0df96fba)
- [スキーマ](https://qiita.com/kkk777/items/3ac148176cfee80bcc33)
- [PL/pgSQL](https://qiita.com/kkk777/items/26b82c9aaab4577adc58)
マルチメディア

# 動画の形式と配信方法
## 動画の圧縮形式
動画の標準的な規格としてMPEGがある。
### MPEG-１
ビデオテープ並みの品質
### MPEG-2
デジタルテレビ放送などで、使用される高画質
### MPEG-4
低速データ通信での使用を見込んで策定され、圧縮効率の高い

### H.264/MPEG-4 AVC
2003年5月にITU（国際電気通信連合）によって勧告された、```動画データの圧縮符号化方式の標準の一つ```。ISO（国際標準化機構）によって```動画圧縮標準MPEG-4の一部```（MPEG-4 Part 10 Advanced Video Coding）としても勧告されている。このため、一般的には「H.264/MPEG-4 AVC」「H.264/AVC」のように両者の呼称を併記する場合が多い。
.
.
.
H.264は携帯電話のテレビ電話といった低速・低画質の用途から、ハイビジョンテレビ放送などの大容量・高画質の動画まで幅広い用途に用いられる。

出典
https://e-words.jp/w/H.264.html

## ストリーミング
```ネットワーク上にある音声や動画データの配信方式```のこと。
データファイル全体をダウンロードしなくても、その```一部を読み込んだ時点で再生が可能```になる。

## ビデオオンデマンド
```ネットワークを通じた動画配信サービス```。
いつでも視聴可能

# 3次元CGの描画手順
## モデリング
被写体となる３次元の物体を```数値と式で記述する形状データとして作成```する。
物体の表面を、```無数の小さな多角形であるポリゴンに分割して表現```するモデリング手法

## 幾何学的モデルの決定
被写体となる3次元の物体を、```どの視点から書くかを決定```する。
```複数の被写体の位置関係、画角やアングル```を決定する。

## 光学的モデルの決定
```光の当たり具合```を決定する。
高原の種類や光の強さ、光源からの距離や方向などを決めるが、これによって```被写体表面の反射や影のつき方```が変わってくる。

## レンダリング
ここまでは、仮想の```3次元空間を数値で表現したが、これをディスプレイに表示```するには2次元の画像に変換する必要がある。```3次元形状モデルから2次元画像への変換処理をレンダリング```という。

## レンダリングの処理
### 透視投影
```3次元形状を2次元画像に投影```。
雅楽や消失点によって表示領域外となるぶぶを除外これを```クリッピング```という。

### 隠面消去
```手前にある物体によって隠れる部分を削除する```。
カメラから物体へ届く光を追跡し、```物体と光の交点ごとに一番手前になる面（ポリゴン）を計算する方法をレイトレーシング```という。

### ラスタライズ
```数値で表された形状を、対応する画素（点)によって表現```する。
ラスタ化する際に射線や曲線の部分に階段状の```ジャギーが発生```する。
これを目立たないようにする加工の処理を```アンチエイリアシング```という。

### 陰影付け
光の当たり具合や物質表面の性質によって、```表面の色の濃淡を描き分けるシェーディング```を行う。
また、```光が遮られる部分に影をつけるシャドーイング```もある。

### 効果付与
物質表面お模様や微細な模様や細微な凹凸などを、写真や平面の画像から3次元形状の表面に対応付けて```素材感を付与```する手法を```テクスチャマッピング```

# アニメーションの制作
## モーフィング
```ある物体から別の物体へと変化```していく動きを見せる方法で、２つの物体を静止画で描くと、```その間の動きが自動的に生成```される。

## モーションキャプチャ
身体の関節などのポイントにマーカをつけて撮影し、```マーカの動きをキャラクタの動き```として計算される。

# マルチメディアの応用
## VR（Virtual Reality：　仮想現実感）
３D映像をヘッドマウントディスプレイ（ゴーグルのようなディスプレイ）に映し出し、```使用者の動きをセンサで読み取って画像脳動きを合わせる```ことでコンピュータが作り出した空間にいるように感じられる。

## AR（Augmented Reality：　拡張現実感）
実際に見えているもの（現実の風景など）に、```別映像や文字情報などを重ね合わせる```手法。

## バーチャルサラウンド
利用者を取り囲むように```複数のスピーカを設置することにより得られる立体音響を２つのスピーカやヘッドフォンで仮想的に実現```したシステム。

## オーサリング
```文字、画像、動画、音声などの素材を組み合わせて、マルチメディアコンテンツを作成すること```。
また、それを行うためのソフトをオーサリングツールと呼ぶ。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
雛形リポジトリを作ってESLintなどの設定を使いまわす

# ESLintやPrettierなどの設定を使いまわしたい

毎回設定するのが面倒なので、いつも使う設定はあらかじめ雛形のリポジトリを**GitHub**に置いておき、使いたいときに`git clone`して使うようにしたかった。

`create-next-app`して、**ESLint**設定して、**GitHub**と連携してだと、気軽に始めたいときに腰が重くなるので、個人開発でぱっと始められるようにするため調べた方法の備忘録です。

### まず、雛形のリポジトリをGitHub上に作っておく

**ESLint**や最近よく使う**ChakraUI**や**recoil**などのライブラリや、**tsconfig**などを設定済みのリポジトリを、依然プロジェクトから引っ張ってきて作りました。

### 使い始めるとき

- プロジェクトを始めるディレクトリ上で`git clone`します。

```
git clone [雛形となるリポジトリのURL] .　←最後に"."をつけるとリポジトリの中身だけcloneされる
```

- 一度`git remote -v`コマンドでリモートの追跡対象を確認

```
git remote -v

origin  https://github.com/dende-h/[雛形のリポジトリ名].git (fetch)
origin  https://github.com/dende-h/[雛型のリポジトリ名].git (push)
```

- GitHubに新しいプロジェクトのリポジトリを作ってそこと連携する

```
git remote set-url origin [新しいリポジトリのURL]

git remote -v

origin  https://github.com/dende-h/[新しいリポジトリ名].git (fetch)
origin  https://github.com/dende-h/[新しいリポジトリ名].git (push)

こうなればOK
```

- 最後に`git pull origin`を忘れずに

```
git pull origin
```

## 時々メンテは必要

当然のことながらNextやReactやその他ライブラリ等のバージョンは更新されないので、時折そういった対応のメンテナンスは必要になります。

ですが、ちょっと個人でプロジェクト作る際は気軽度が増すかと思います。よく使いまわすものはテンプレを作っておくのは良いなと思いました。

## 参考にさせていただいた記事

[リポジトリを使いまわしたい](https://zenn.dev/kkoouuya/articles/ab7efae69f6a02)
ハッシュとシンボルについて

# はじめに
ハッシュの定義方法とシンボルのことについて、忘れないようにするために記録を残す。

## ハッシュとは
ハッシュとは、キーと値をセットでデータとして管理することができるオブジェクトのこと。

    hoge = {"りんご"　=> 100,"みかん"　=> 120,"ブドウ"　=> 150}

このようにして変数に代入することができ、りんごやみかんがキー、100や120が値である。

##　シンボルとは
キーとして定義できるオブジェクトの一つ。
上記のりんごやみかんは文字列で定義されているが、:(コロン)を用いることでシンボルとして定義することができる。

    hoge = {:りんご　=> 100,:みかん　=> 120,:ブドウ　　=> 150}
    hoge = {りんご: 100,みかん: 120,ブドウ: 150}

## シンボルと文字列の違い

シンボルは、コード上では文字列のように見えているが、内部的には数値として処理される。
よって、検索するときは文字列と比べて速度的に有利。
そのため、基本的にハッシュのキーは、シンボルが使われることが多い。
Databricksのメニュー構成が変わります

「サイドメニューにユーザー設定がない！」ということにならない様にご連絡いたします。

こちらのリリースとなります。日本リージョンでも数日中に反映されます。

https://docs.databricks.com/release-notes/product/2022/october.html#top-navigation-bar-in-the-ui

以下の項目がサイドバーからUIの上部にあるトップバーに移動します。

- ユーザー設定
- Adminコンソール
- アカウント管理
- ヘルプ
- ワークスペーススイッチャー
- 検索

現在のサイドメニューの構成は以下の様になっています。下にある人型マークをクリックすると「ユーザー設定」などが表示されます。

![Screen Shot 2022-10-05 at 10.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3ad93d6b-44af-8d1d-fabb-a2518e00e2c3.png)

反映後は以下の様になります。下部にはPartner Connectとサイドバーの設定のアイコンのみとなります。

![Screen Shot 2022-10-05 at 10.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c309d7e9-5f51-209c-d99c-cd87e2cc076a.png)

画面全体はこちらになります。上部にトップバーが追加され、右側にはワークスペースを切り替えるワークスペーススイッチャー、ヘルプ、ユーザー名(メールアドレス)が表示されます。
![Screen Shot 2022-10-05 at 10.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a6802c90-7580-b519-ade2-b7468493e937.png)

なお、Azure Databricksでは以下の様になります。
![Screen Shot 2022-10-05 at 11.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/982f3e65-7fe0-7a93-ebbb-40519276966c.png)

ユーザー名をクリックするとユーザー設定などが展開されます。
![Screen Shot 2022-10-05 at 10.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/87b48ed6-033d-5b8b-ad3a-236cef59c688.png)

左上には検索ボックスが移動しています。こちらをクリックすると検索ダイアログが表示されます。
![Screen Shot 2022-10-05 at 10.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3a18b112-a439-cde4-7022-63f4f378ef2d.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Rails】 Formオブジェクトを使って複数モデルを更新する

## 背景
Formオブジェクトめちゃめちゃ便利だな〜と思ったので、まとめました。
開発環境は「Rails7」です。

### Formオブジェクトとは？
FormとModelの役割を分ける時に使用するオブジェクト

Modelに依存しないので、複数のモデルを更新する専用フォームとかが作れる

### Formオブジェクトを使うとき
- 1つのフォームで複数のモデルを更新したいとき
- 複雑なフォームの場合

### 今回のケース
記事と画像（`1:多`）を投稿するフォームを作成する。

```ruby
# post.rb
class Post < ApplicationRecord
    belongs_to :user
    has_many :photos, dependent: :destroy
    validates :caption, presence: true
end
```

```ruby
# photo.rb
class Photo < ApplicationRecord
    belongs_to :post
    validates :image, presence: true
    mount_uploader :image, ImageUploader    #アップローダー
end
```

#### 1. フォームオブジェクトの作成
フォームオブジェクトは、　`app/forms`に作成することが推奨されている
`***_form.rb`

##### 作成したフォームオブジェクト
Formオブジェクト内に、保存が必要になる、属性・バリデーションを全て定義する

```ruby
class PostPhotosForm
    include ActiveModel::Model      # モデルの機能を利用するために記載
    include ActiveModel::Attributes # モデルの機能を利用するために記載
    extend CarrierWave::Mount       # アップローダーの使用

    # 属性の定義
    attribute :caption, :string     # Post
    attribute :user_id, :integer    # Post
    attribute :image, :string       # Image

    # Carrier Wave アップローダー
    mount_uploader :image, ImageUploader

    # バリデーション
    validates :caption, presence: true
    validates :image, presence: true
    validates :user_id, presence: true

    # レコードの保存
    def save
        # bool値を返す
        return false if invalid?

        # トランザクション処理
        ActiveRecord::Base.transaction do
            post = Post.create!(caption: caption, user_id: user_id)
            post.photos.build(image: image).save!
        end
    end
end
```

#### 2. ビューの作成
Formオブジェクトのインスタンスを指定

```erb
 <%= form_with(model: @post_photos, url: posts_path, local: true, data:{turbo: false}) do |f| %>
  <%= f.label :caption %>
  <%= f.text_field :caption %>
  <%= f.file_field :image %>
  <%= f.submit "投稿", class: "btn btn-primary" %>
<% end %> 
```

#### 3.　コントローラー
ストロングパラメータを定義
```ruby 
class PostsController < ApplicationController
    before_action :authenticate_user!

    # 記事の作成画面
    def new
        @post_photos = PostPhotosForm.new
    end

    # 記事作成処理
    def create
        @post_photos = PostPhotosForm.new(post_photos_params)

        if @post_photos.save
            redirect_to root_path, flash: {notice: '投稿が保存されました'}
        else
            flash[:alert] = "投稿に失敗しました"
            render :new, status: :unprocessable_entity
        end
    end

    private
    # PostPhotosForm ストロングパラメータ
    def post_photos_params
        params.require(:post_photos_form).permit(:caption, :image).merge(user_id: current_user.id)
    end
end
```

#### 補足（バリデーションメッセージ）
通常のモデルと同様の記載方法
```erb
<ul>
    <% @post_photos.errors.full_messages.each do |error| %>
      <li><%= error %></li>
    <% end %>
</ul> 
```

### まとめ
モデルから責務を分離できるのは便利ですね。
大規模なフォームなどで積極的に活用していきたい。
MacbookでDisplayLinkを使ったら通知が表示されなくなった話

## 概要
- MacbookProで3画面出力したい
- Ankerのドッキングステーションを買った
- DisplayLinkを入れた
- 通知が来なくなった

## 起因
### MacbookProを買った

退職し、フリーランスに戻ったので自分のPCで開発することになったた。
自前の、MacbookPro（２０１６）は流石に重すぎてしんどかったので、新しくMacbookProを買うことにした。
MacbookPro13（２０２１）を買い、画面出力したところ、1画面しか出力されない。
困った。中古だから壊れてる？ディスプレイが少ないと、何気に効率が落ちるのでできれば2画面以上は出力したい。

### Ankerのドッキングステーションを買った

前々から気になっていてAmazonでセールしていた、[ドッキングステーション](https://amzn.to/3RBoYDC)はどうやら３画面
出力できるらしいので買ってみることにした。


### DisplayLinkをインストール

繋いでみたところ、出力枚数は変わらず…？
説明を見てみたところ、[DisplayLink](https://www.synaptics.com/products/displaylink-graphics/downloads)というアプリを入れる必要があるらしい。
とりあえず入れてみたら３画面出力することに成功した！
これで快適開発ライフ！！

## 問題発生
### 動画が真っ黒

DisplayLinkを使って問題が一つ出た。
**なんと、Netflixの映像が出力されない。**
Dアニメもアマプラも見れない。
まぁ仕事用だし、それはテレビで見るとしよう…。

### 通知が表示されない

通知が来なくなった。
音だけは聞こえるのだが、バナーが表示されない。
Slackの通知は音すら聞こえない感じで、気づくのが遅れた。

## 解決？
### 通知が来ない対策

システム環境設定 > 通知と集中モード　の下部にある「ディスプレイをミラーリング中または共有中」という項目にチェックを入れることで、通知が来るようになった。

![スクリーンショット 2022-10-05 10.19.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20599/b029b83d-2ec9-0aa1-711d-21181d74e924.png)

### Netflixは…
別のPCで見ることにした。


DisplayLinkはあまり良いものではないのかもしれん…。
マクロの実行がブロックされました

# 概要
Excelで「マクロの実行がブロックされました」の対応。

# 症状

「セキュリティリスク　このファイルのソースが信用できないため、Microsoftによりマクロの実行がブロックされました。」が表示される。

# 原因

9月辺りから、インターネットから取得したエクセルのマクロが実行できなくなった原因は、Microsoftによりセキュリティが強化されたからです。Excelのバージョン2203以降からが、対象です。

# 対処

- 対象のマクロ付きエクセルを右クリック
- メニューから「プロパティ」を選択
- 「全般」タブの下にあるセキュリティから「許可する」をチェックし、「OK」を選択

以上。
enebularでkuromoji その6

# 概要
enebularでkuromojiやってみた。
練習問題やってみた。

# 練習問題
クイズを作って見て。
複数行に対応して。

# 参考にしたページ

https://qiita.com/BuniBuni/items/5d6fd6f11b828af48b5c

# 投入した文章

```
サッカーは、丸い球体を用いて1チームが11人の計2チームの間で行われるスポーツ競技の一つである
アソシエーション・フットボールないしはアソシエーション式フットボールとも呼ばれている
他のフットボールコードと比較して、手の使用が極端に制限されるという特徴がある
蹴球とも言う
サッカーは、210を越える国 と地域で、多くの選手達によってプレーされており、4年に一度行われるFIFAワールドカップのテレビ視聴者数は全世界で通算310億人を超えており、世界で最も人気のあるスポーツといえる
試合は、それぞれの短い方の辺の中央にゴールがある長方形のフィールドでプレーされる
試合の目的は、相手ゴールにボールを入れ得点することである

```

# 実行結果

```
q: サッカーは、丸い球体を用いて1何が11人の計2チームの間で行われるスポーツ競技の一つであるか
a: チームが

q: サッカーは、丸い何を用いて1チームが11人の計2チームの間で行われるスポーツ競技の一つであるか
a: 球体を

q: 他のフットボールコードと比較して、手の何が極端に制限されるという特徴があるか
a: 使用が

q: 他のフットボールコードと比較して、手の使用が極端に制限されるという何があるか
a: 特徴が

q: サッカーは、何を越える国 と地域で、多くの選手達によってプレーされており、4年に一度行われるFIFAワールドカップのテレビ視聴者数は全世界で通算310億人を超えており、世界で最も人気のあるスポーツといえるか
a: 210を

q: サッカーは、210を越える国 と地域で、多くの選手達によってプレーされており、4年に一度行われるFIFAワールドカップのテレビ視聴者数は全世界で通算310億何を超えており、世界で最も人気のあるスポーツといえるか
a: 人を

q: 試合は、それぞれの短い方の辺の中央に何がある長方形のフィールドでプレーされるか
a: ゴールが

q: 試合の目的は、相手ゴールに何を入れ得点することであるか
a: ボールを


```

# 成果物

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

以上。
OBS 28 の仮想カメラ(VirtualCam)をOpenCVで取得する on Windows

OBS 28にアップグレードしたらVirtualCamプラグインが動かないって~!?  
これじゃあOpenCVで仮想カメラデバイスとして認識できないじゃあないか。どうしよう。  


# これを使え  
ここの最新バージョン\(ver 3.*\)のインストーラーを使用してください。

https://github.com/Avasam/obs-virtual-cam/releases

Home Page   

https://github.com/Avasam/obs-virtual-cam  

## 動作  
一応動作確認用の環境情報とコードを貼り付けておきます。  

### 環境  
- Windows11, 10
- OBS 28.0.3 64 bit
- Python 3.10.6
- OpenCV 4.6.0  

### コード  

```py  
import cv2
import time

capture = cv2.VideoCapture(0) # 0ではない場合が多いですが筆者は0でした。

while True:
    start = time.time()
    ret, frame = capture.read()
    cv2.imshow("capture", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

    elapsed = time.time() - start
    print(f"fps: {1/elapsed: .3f}")

```  

# 備考  
このプラグインはOBS 27 以前では動作が確認されていません。  
[27以前のOBSを使用する方はこちらのVirtualCameraPlugin 2.0.5を使用してください](https://github.com/Fenrirthviti/obs-virtual-cam)
WordPress 同サーバー内でリニューアルWordPressと切り替え

## 名称

既存の公開されているWP⇨古いWP
新しく公開したいWP⇨新WP

## ディレクトリ構成

古いWPの中に新WPが入っている

## 変更前のURL

古いWP:https://aaaaa.com
新WP：https://aaaaa.com/wp


## 手順
1. バックアップ取っとく
2. 新WPにログインして「設定」⇨「一般」を開いて【サイトアドレス（URL）】を変更



|  変更前のサイトアドレス（URL）  | 変更後のサイトアドレス（URL）   |
| ---- | ---- |
| https://aaaaa.com/wp   |  https://aaaaa.com  |

![スクリーンショット 2022-10-05 9.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482906/6d8e484d-38c4-a824-7f1e-7d2f67cc1e9e.png)



３. 古いWP内のindex.php編集（ここもバックアップしとく）
一番下にあるコードを変更

```index.php
# 変更前
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';

```

```index.php
# 変更後
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp/wp-blog-header.php';

```

多分以上。

はっきり思い出せないため自己責任で。
また近日中にするのでそのときアップデートする
文字化けの対応

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [Salesforceで外字を使う](https://qiita.com/Keiji_otsubo/items/d040decc1c07a537baf5)

# よく分からんけど、修正がある？
+ [UTF-8 characters garbled when using Flow External Services POST](https://salesforce.stackexchange.com/questions/330013/utf-8-characters-garbled-when-using-flow-external-services-post)

>The team is working on addressing a number of issues here where we are currently ignoring the "consumes" directive, including the charset. By default Latin-1 is used and thus any other Unicode characters are coming across as Latin-1 encoded which is not UTF-8 which then show as garbled characters on the server or in flow in case the "produces" directive has UTF-8 as the charset.
You can expect better support here in the Summer '21 release

しかし、発見できない。


+ [Mitrepresentation of letters and characters](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O6CxvSAF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ca17d49e-9e44-46a9-d328-2f95b514a8da.png)


:::note
Are you working with UTF-8 encoded characters?
The following is written for Pardot, but I think it's the same.

https://help.salesforce.com/s/articleView?id=000382242&type=1
:::


+ [? 記号は SF で作成された電子メールに表示されます (MS Outlook 365 で表示するときに表示されます)](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007cmLf7)

:::note
Salesforce で作成されたメールに ? 記号が表示される原因の 1 つは、メール内の特殊文字である可能性があります。エンコードを上記のオプションのいずれかに変更してみてください。変更が完了したら、テストメールを送信して問題が解決したかどうかを確認してください。


さらに、この問題をよりよく理解して解決するのに役立つ可能性のある同様のスレッドを確認してください。

+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8X7pSAF
+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A93EpSAJ
:::

。カスタマー サービス担当者は引き続きこの動作を受けていますが、現在は署名行にのみ発生しているため、この問題が発生する原因を絞り込むように努めます。(プレーン テキストとして貼り付けるのではなく、コピーして貼り付けるなど)。 

# ContentVersionのTitleが文字化け : ファイル名のところ

+ [ContentVersionのTitleが文字化けを起こす...](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmXbh)

:::note
ダウンロードして文字化けするPCのOSはMS Windowsでしょうか？

そうであれば、ファイル名の文字コードが違うことが原因だと思います。

MS Windows では cp-932 ですが、SalesforceではUTF-8です。

Apexクラスでダウンロードするときにファイル名の文字コードを変えるしかないと思います。ただApexで変換する関数は無かったので自作するしかないと思います。

ファイル名だと長さに制限があるので（長くない）、Apexの制限は気にしなくていいかもしれません。

Auraのコンポーネントも使っているのなら、Java Scriptのコントローラの中で変換するのが楽かもしれません。
:::
ケースの複製のまとめ


[Apex: Clone a record, then make the new record the Parent of the old cloned Record](https://salesforce.stackexchange.com/questions/151683/apex-clone-a-record-then-make-the-new-record-the-parent-of-the-old-cloned-reco)

```
public static void cloneTransferCases(Map<Id,Case> oldMap,List<Case> newList){
    System.debug('MM++++ oldMap: ' + oldMap.keySet());
    System.debug('MM++++ oldMap Values: ' + oldMap.values());
    System.debug('MM++++ newList: ' + newList);
    Set<id> processedAbandonCloneRecords = new Set<Id>();
    Map<Id,Case> mapCaseToInsert = new Map<Id,Case>();

    for(Case cs : newList){
        // check to see if this record has been processed already in this transaction
        if(!processedAbandonCloneRecords.contains(cs.Id)){
            if(cs.Status == 'Abandoned'){
                if(cs.Abandoned_Reason__c == 'Transferred' && oldMap.get(cs.Id).Abandoned_Reason__c != 'Transferred'){
                    if(cs.Transfer_To__c != null && cs.ParentId == null){
                        // Create a temporary case using oldMap
                        // to get field values prior to Abandonment
                        Case tempCase = oldMap.get(cs.Id).clone();
                        // set owner of new case to match the Transfer To user
                        tempCase.OwnerId = cs.Transfer_To__c;
                        tempCase.ParentId = null;
                        mapCaseToInsert.put(cs.id,tempCase);

                        // mark this record as processed in this transaction
                        processedAbandonCloneRecords.add(cs.Id);

                        // if we are running tests, insert and update will
                        // occur in same transaction so we should actually
                        // not stop cascade
                        if(Test.isRunningTest()){
                            processedAbandonCloneRecords.remove(cs.Id);
                        }
                    }
                }
            }
        }
    }

    if(!mapCaseToInsert.isEmpty()){
        insert mapCaseToInsert.values();
    }

    for(Case cs : newList){
        if(mapCaseToInsert.containsKey(cs.id)) {
            cs.ParentId = mapCaseToInsert.get(cs.id).id;
        }
    }
}
```
Azure Fundamentals(AZ-900)：クラウドの概念について説明する「信頼性と予測可能性」「セキュリティとガバナンス」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「信頼性と予測可能性」「セキュリティとガバナンス」**
◇対応するMicrosoft Learn ラーニングパス
[Microsoft Azure の基礎: クラウドの概念について説明する](https://learn.microsoft.com/ja-jp/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/)
◇対応するモジュール
[クラウドの信頼性と予測可能性の利点について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-benefits-use-cloud-services/3-reliability-predictability-cloud)
[クラウドでのセキュリティとガバナンスの利点について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-benefits-use-cloud-services/4-security-governance-cloud)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：クラウドの概念について説明する「可用性と拡張性」](https://qiita.com/fsd-jume/items/3ff16444827addf2cfa2)

## 信頼性(Reliability)
**システムが障害から復旧して動作を続行する能力**
→Microsoftでは、「信頼性が高い」 = 「回復性と可用性を備えている」と定義
→クラウドは分散型設計のため、必然的に信頼性が高いインフラを提供可能

**◆リージョン(Region)
クラウド事業者がデータセンターを設置している地域**
・例)「東日本リージョン」や「西日本リージョン」、「シンガポールリージョン」など
・各リージョンにはペアになるリージョンが設定されているため、一つのリージョンで障害が発生した際に自動で別のリージョンに移行させることも可能

**◆可用性ゾーン(Availability Zones)
リージョン内で物理的に分離したデータセンター群( = 分離境界)**
・それぞれが独立した電源や冷却手段、ネットワークを備えた1つまたは複数のデータセンターで構成
・可用性ゾーンは高速のプライベート光ファイバーネットワークを介して接続
・1つのゾーンがダウンした場合、他のゾーンが動作を継続
※回復性を確保するため、すべての可用性ゾーン対応リージョンに最低3つの個別の可用性ゾーンが存在
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/8fc508a7-6b92-01bf-5336-be629a2d0ddf.png)

## 予測可能性(Predictability)
**◆パフォーマンスの予測可能性
必要なリソースを予測することに焦点を当てている**
・例)自動スケーリングにより、負荷に合わせて自動でリソースを増減
・例)負荷分散機能により、通信が1つの領域に集中した場合に、通信を負荷の少ない領域に転送して自動的に負荷を分散

**◆コストの予測可能性
クラウド支出のコストを予測することに焦点を当てている**
・クラウドで運用し、リソース使用の状況や傾向を分析することで、将来のコストを予測可能
・総保有コスト(TCO)や料金計算ツールなどのツールを使用して、将来起こりうるクラウド支出の見積もりを取得することも可能

## クラウドにおけるセキュリティとガバナンスの利点
**◆セキュリティ(Security)
求めるセキュリティ要件に応じてサービスを選択可能**
・セキュリティを最大限に制御したい場合 → IaaS (OSやソフトウェアの管理は利用者)
・パッチやメンテナンスを自動化したい場合 → PaaS, SaaS

**◆ガバナンス(Governance)
すべてのリソースに対して同一なガバナンスやコンプライアンスの標準を適用可能**
・新しく作成するリソースも同一な企業の標準を準拠させることが可能
・企業の標準が更新された場合、導入しているすべてのリソースに新しい標準を自動で適用可能
・導入しているリソースが企業の標準に準拠しているか自動で確認でき、違反している場合は自動で準拠させることができる

## 次の学習内容
**◆Azure物理インフラストラクチャ**

https://qiita.com/fsd-jume/items/503268657c26a9b45749

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
vuetify で todo アプリ(GUIのみ) を作るのメモ

vuetify 2.6系で todo アプリ(GUIのみ) の作った際のメモを残しておく。

# projectベース作り

- `vue create vue-todo` を実行する
    -  preset 通りに vue project が作成される
    -  vue create の設定はプロジェクト毎に選ぶ必要がある 
- `npm run serve` を実行する
    - この時点では通常の vue project が立ち上がる

- vue add vuetify を実行する
    - Default (recommended) を選択する

```
vue add vuetify

✔  Successfully installed plugin: vue-cli-plugin-vuetify

? Choose a preset: (Use arrow keys)
  Configure (advanced) 
❯ Default (recommended) 
  Vite Preview (Vuetify 3 + Vite) 
  Prototype (rapid development) 
  Vuetify 3 Preview (Vuetify 3) 
```

- 再度、`npm run serve`を実行する 
    - この時点で vuetify project になっている
    - ![vue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/dc551737-18a5-a749-4fca-8c70cd48fda3.png)

# 開発
- view の中に components と pages がある構造に変える
- task 一覧を作る 
    - 初期値でタスクを 2 個用意しておく
    - check box を v-for で表示する
    - https://vuetifyjs.com/ja/components/checkboxes/#model-as-boolean
    - こんな感じになる
        - ![スクリーンショット 2021-11-07 0.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/8bd0ad1c-de61-6235-207f-2a355f191b66.png)
- task 追加機能を作る
    - form のサンプル (submit & clear でのバリデーション) を参考に task 追加のコードを書いてみる
        - https://vuetifyjs.com/ja/components/forms/#submit-26-clear3067306e30d030ea30c730fc30b730e730f3
    - こんな感じになる
        - ![スクリーンショット 2021-11-07 0.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/506ddf3f-632a-89e5-af80-f48ad6b3b1f3.png)
円と円の交点計算を「AI_Programmer」でやってみた。

プロトタイプとして無償公開
「コードを生成」を複数回クリックの場合があります。

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1444554.html

# 実行例1
python
円と円の交点計算

実行結果:以下は、そのままでは、うごきません。
```python
def get_intersection(x1, y1, r1, x2, y2, r2):
a = x2 - x1
b = y2 - y1
c = r2 - r1

if c ** 2 > a ** 2 + b ** 2:

print("There is no intersection")

elif c ** 2 == a ** 2 + b ** 2:

print("There is a single intersection point")

else:

print("There are two intersection points")
```

修正しました。
```python
def get_intersection(x1, y1, r1, x2, y2, r2):
    a = x2 - x1
    b = y2 - y1
    c = r2 - r1
    if c ** 2 > a ** 2 + b ** 2:
       print("#There is no intersection")
    elif c ** 2 == a ** 2 + b ** 2:
       print("#There is a single intersection point")
    else:
       print("#There are two intersection points")
get_intersection(0,0,1,1,0,1)
#There are two intersection points
```

# 実行例2
python
sympyで円と円の交点計算

実行結果:以下は、そのままでは、うごきません。
```python
import sympy

x1, y1, r1 = sympy.symbols('x1 y1 r1')
x2, y2, r2 = sympy.symbols('x2 y2 r2')

s = sympy.solve([(x1-x2)**2 + (y1-y2)**2 - (r1+r2)**2, (x1-x2)**2 + (y1-y2)**2 - (r1-r2)**2])
print(s)
```

修正しました。
```python
from sympy import *
x,y,x1, y1, x2,y2,r1, r2 = symbols('x y x1 y1 x2 y2 r1 r2')
ans=solve([(x-x1)**2 + (y-y1)**2 - r1**2, (x-x2)**2 + (y-y2)**2 - r2**2],[x,y])
mySubs={x1:0,y1:0,r1:1,x2:1,y2:0,r2:1}
print("#",ans[0][0].subs(mySubs),ans[0][1].subs(mySubs))
print("#",ans[1][0].subs(mySubs),ans[1][1].subs(mySubs))
# 1/2 sqrt(3)/2
# 1/2 -sqrt(3)/2
```
githubで履歴から該当データを完全に削除

プロジェクトの最初の頃はログデータもgithubにアップしてた方が楽だったが、徐々に規模が大きくなってくるとログデータが重くなってくる。

そんな時にログ出ただけ削除する方法。

githubのルートディレクトリで以下を実行。

```
git filter-branch --tree-filter "rm -f -r [消したいディレクトリパス] " HEAD
```

例えば`./tutorial/data/*`を消したい場合には以下を実行する。

```
git filter-branch --tree-filter "rm -f -r ./tutorial/data/*" HEAD
```

次にリポジトリの最適化

```
git gc --aggressive --prune=now
```

`-f`オプションで強制プッシュ

```
git push -f origin master
```

あとはそのローカルのレポジトリを消してpull仕直せばいいらしい。
DeepL API + PyMuPDF + PySimpleGUIで英文翻訳プログラムをGUI化してみた。

## 概要
下のホームページで紹介されていたプログラムをGUIで操作できるように改造してみました。

https://ai-research-collection.com/translate_pdf/

今回目指したのは、
1.任意のPDFファイルをGUIで選択する
2.元のファイルと同じディレクトリにMarkdown形式で保存（〇〇.pdf->〇〇.md）
の2点です。

## 事前準備
- Pythonと必要なライブラリ（後述）のインストール
- DeepLのAPI取得：上記HPを参考にしてください

## 必要なライブラリ
- PyMuPDF
- PySimpleGUI
- requests(エラーが出るようなら追加でインストール)

## コード
```
# 必要なライブラリのインポート
import PySimpleGUI as sg
import fitz
import requests
import json

# PySimpleGUIの設定
font_size = 50

layout = [
    [sg.Text("PDFファイルを選択：", font=font_size),
     sg.InputText(key="-INPUTNAME-"),
     sg.FileBrowse(key="-INPUTFILE-")],
    [sg.Button("翻訳開始", key="-TRANSLATION-", font=font_size),
     sg.Button("CLEAR", key="-CLEAR-", font=font_size)]
]

window = sg.Window("Translation App", layout)

#　プログラムを実行する
while True:
    event, values = window.read()

    # Get file name
    pdf_file_path = values["-INPUTNAME-"]
    output_file_path = str(pdf_file_path.split(".")[0]) + ".md"
    page_num = 1

    if event == "-TRANSLATION-":
        with fitz.open(pdf_file_path) as pdf_in:

            text = ""
            for page in pdf_in:
                page1 = page.get_text()

                data = {
                'auth_key': 'ここにはDeepLのAPIを入力してください',
                'text': page1.replace('-\n', '').replace('\n', ''),
                'target_lang': 'JA'
                }

                response = requests.post('https://api-free.deepl.com/v2/translate', data=data)
                d = json.loads(response.text)
                _text = f"""### Page{page_num}\n{d['translations'][0]['text']}\n"""
                text = text + _text
                page_num += 1

        with open(output_file_path, 'w', encoding='utf-8') as file:
                file.write(text)

        sg.popup("翻訳が完了しました。")
    
    # CLEARボタンを押した時には-INPUTFILENAME-を空にする
    if event == "-CLEAR-":
        window["-INPUTNAME-"].update("")

    if event == sg.WIN_CLOSED:
        break

window.close()


```