OmniAICreator/Qiita-1.07M huggingface dataset:
作成したリストアイテムに自動生成-->更新をかけたファイルを添付しようとするとエラーに。。【解決しました→別の】

####

「ファイルコンテンツの取得」アクションで謎のエラーが出ました。

```
{
  "status": 400,
  "message": "Route did not match\r\nclientRequestId: 3c82b01f-a249-4c0a-ad50-444144e5592f\r\nserviceRequestId: 3c82b01f-a249-4c0a-ad50-444144e5592f"
}
```
![スクリーンショット 2022-10-21 170132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/159fa1a8-3a07-0e3d-6728-0d118a87ace8.png)


「ファイルコンテンツの取得」アクションでエラーになることはまずないため日本語のTipsまわりの記事は何もHITせず、英単語検索で以下の投稿にたどり着きました。

https://powerusers.microsoft.com/t5/Building-Flows/Attach-file-to-itself-when-item-is-created-in-SharePoint-list/m-p/833972#M116680

サーバがうまく動いてなかった、で解決扱いになった後に匿名さんが投稿してくれている事象と今回発生した事象が似ていましたが解決に至らず投稿が途切れていました。
「更新をしたファイルコンテンツを取り直さないとダメだよ」というところは実装済だったので「詰んだわ、、」と打ちひしがれました。


#### たまたま原因と対処法が見つかる

リストアイテムへの添付を諦めて次の作りこみをしようと（Office Scriptsを利用していたので）「セルのロックのプロパティを付けれるのかな」と検索をかけていると平野愛さんのブログタイトルが見えたのです。

![スクリーンショット 2022-10-20 170524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/28797871-ac74-c98e-2c21-4c05c23b4326.png)

奇跡！（本当に集中線が見えました。線はフリーハンド）
原因はこれじゃないか？（**＝ファイルのロック**）と。

https://shanqiai.weblogs.jp/sharepoint_technical_note/2021/06/officescript-troubleshooting-filelock.html


#### 実装あるのみ

平野さんのページの引用先にHTTP400のステータスコードは雑だから（400を返す条件や返答メッセージがばらばら）とのことなので、"Route"のメッセージがなくなったら```IsFileLocked=false```とする処理を追加してうまくいきました。
平野さんには足を向けて寝れません。

![スクリーンショット 2022-10-21 172712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/58b90a35-be69-3003-e13b-96ae6ff3a8ac.png)



#### 待ち時間の実装で実行時間に差が発生

![スクリーンショット 2022-10-21 170722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/883ca085-3745-35a2-2f49-4a46884e6298.png)

待ち時間（30秒）を入れておくか、ファイルコンテンツの取得アクションが失敗しても処理を続けるよう条件を設定しDo Untilの実行回数（既定は60回）を増やして対処するかは各自のご判断で。

#### Do Untilのタイムアウトについて

https://www.spguides.com/power-automate-do-until/
opencv-contrib-pythonが読み込めない

# 環境
- Ubuntu:  `18.04.6 LTS`
- Python: `3.9.13`
- Pipenv: `version 2022.4.20`
- opencv-pythonの最新バージョン: `4.6.0.66`

# 問題
- `from cv2 import dnn_superres` をしようとすると `ImportError: cannot import name 'dnn_superes' from 'cv2'` と怒られる
- モジュールのアンイストールとかをごちゃごちゃやっていると `cv2` のほうでエラー発生
  - `AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' (most likely due to a circular import)`
- バージョンを `4.5.5.64` に下げるといいという投稿に従ってやっても直らず
  - `cv2` のエラーはなくなったが、`ImportError: cannot import name 'dnn_superes' from 'cv2'` が再度出る
- 別の `easyocr` というパッケージをインストールした場合もエラー

# 原因
- opencv系のパッケージは4つあり、そのうち1つのみをインストールすることになっている
  - `opencv-python`, `opencv-python-headless`, `opencv-contrib-python`, `opencv-contrib-python-headless`
- しかし他のパッケージで別のopencv系のパッケージを利用していると、その環境下で複数のopencv系のパッケージを利用していることになってしまう
  - 例: `easyocr`
- おそらくユーザが `import cv2` などで呼び出しているのは、最後にインストールしたopencv系のパッケージ
  - contribインストール後に別のopencv系のパッケージがインストールされるとエラー
  - `from cv2 import dnn_superres` -> `ImportError: cannot import name 'dnn_superres' from 'cv2'`
- opencv系のパッケージ間でバージョンが異なる？とエラー
  - `import cv2` -> `AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline'`
  - (もしかしたら特定のバージョン利用によるエラーかもしれない)

# 解決法
1. 環境を作り直す
    * このときopencvに関連するパッケージはインストールしない
2. opencv系のパッケージを利用してるパッケージを先にインストール
    * `pip show <package-name` の `Requires:` の欄を確認
3. 利用されているopencv系のパッケージを最新にアップデートしておく
    * `pipenv install opencv-python-headless==4.6.0.66` (`pip install opencv-python-headless==4.6.0.66`)
    * (どれがインストールされているかわからないときは、とりあえず `pip show` で4つのopencv系パッケージを調べ、インストールされていてバージョンが古いものをアップデートしておけばOK)
4. opencv-contrib-pythonをインストール
    * `pipenv install opencv-contrib-python==4.6.0.66` (`pip install opencv-contrib-python==4.6.0.66`)

(今後opencv系のパッケージを利用しているパッケージをインストールし、新しくopencvがインストール・アップデートされた場合は、再度3・4を実行する)


<!--
テストデータ
- pipenv
  - [**F**] opencv-python -> opencv-contrib-python -> easyocr
    1. 
    2. 
    3. [F] `ImportError: cannot import name 'dnn_superres' from 'cv2'`
  - [**F**] easyocr -> opencv-python -> opencv-contrib-python
    1. [P]
    2. [F] `AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline'`
    3. [F] `AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline'`
  - [**P**] easyocr -> opencv-python==4.6.0.66 -> opencv-python-headless==4.6.0.66 -> opencv-contrib-python==4.6.0.66
  - [**P**] easyocr -> opencv-contrib-python==4.6.0.66
-->
SSL ライブラリをポータブルかつ CMake でビルドするメモ

SSL(TLS v1.3 とか電子署名とか)な機能使う C/C++ アプリをビルドしたい...
OpenSSL cmake 使ってない... つらい...
cmake つかっていても Perl(!) とか asm とか要求されてつらい...
Windows(MSVC)でもビルドしたい..

TLS v1.3 通信するアプリ(e.g. WebTransport, iquic)を WASM でセキュアに動かしたい...

C/C++ compiler + CMake だけでビルドしたい...

## OpenSSL

configure スクリプトでビルドします :cry: そのため素では使えません.

### openssl-cmake

https://github.com/janbar/openssl-cmake

ありがたや. 1.1.1 では TLS v1.3 も対応されていますので, とりあえずこれを使っておけばよいでしょう.

3.0.0 は Perl でコード生成なのが増えたため, 3.0 系は未対応です.

https://github.com/janbar/openssl-cmake/issues/21


## BoringSSL

標準では ASM, Perl, Go(!) を要求されます.

- ASM : Assembler 実装をオフにすればよい(別に性能は必要ないとき)
- Perl : Asm コードの生成で使っています. これも Asm off にすれば OK
- Go : テストコードやエラーメッセージとかの生成に使っています.

Go でのエラーメッセージ生成だけ前処理しておけば, ビルドしやすくなると思います(CMakeLists でいくつか asm 使ったりテストコードのターゲットを off にする必要はあります)

## LibreSSL

ポータブルな実装(asm 使ってない) + cmake があります.
現時点(v3.5.3)では TLSv1.3 は対応していますが, 

https://github.com/libressl-portable/portable/issues/228

OpenSSL 互換(?) の TLS 1.3 API 使うには現状ヘッダファイルをいじる必要があります(CMakeLists には設定はない)

https://qiita.com/kinichiro/items/60b0e284ea6645bc4384



ほかにも, `*_XOF` な API や BLAKE3 あたりなどが足りないので, 既存の OpenSSL 使うのを想定しているライブラリやアプリではいろいろ書き換えや機能の disable が必要になります. たとえば Python ssl ライブラリを LibreSSL で差し替えてビルドするなどはできません(Python SSL module 側ソースコードでいろいろコードを uncomment すればいける...)

## Botan

https://botan.randombit.net/handbook/building.html

独自 Python で Makfile 作ります!
CMake は対応していません... :cry:

tls 1.3 は experimental

CMake 100% でなくて, Python で makefile つくってもいい! という人向け.

## wolfSSL

https://github.com/wolfSSL/wolfssl

ASM off にすればビルドできるでしょう.
ただ GPL2.0 ライセンスです.


## mbedTLs

https://github.com/Mbed-TLS/mbedtls

CMake とかありました!

ただ, git `development` branch では ビルド時に python jsonschema で一部ファイル生成が必要でした.
Release パッケージでは不要かもはしれません.

## おまけ

### TLS v1.3

TLS v1.3 だけほしいとき

* https://github.com/h2o/picotls
  * minicrypto 使えばビルドもやりやすい... かも?
 
### wasm-crypto

https://github.com/jedisct1/wasm-crypto

WASM のライブラリ(Rust 実装)として SSL 関連の実装 wasm-crypto が提案されています.
TLS v1.3 も入るかしらん :thinking:
gRPCを使ってあそんでみる　クライアント編

# gRPCを使ってあそんでみるの目的
ログデータを永続化するgRPCサービスを立ち上げログを記録する。

## 今回のお題
ログを記録するgRPCサービスに対してメッセージを送信しログに記録されるか確認します。

## ■事前環境
・Windows10 バージョン21H2
・IntelliJ IDEA 2022.1.4(Community Edition)
・OpenJDK Runtime Environment Zulu17.36+17-CA (build 17.0.4.1+1-LTS)
・Gradle

## １．クライアントクラスを作成
https://qiita.com/shigemax999/items/fa9c3354ee79691b36d5

サービス起動編の続きとなります。
サービスに対してメッセージを送信するクライアントクラスを作成します。
サービスに対してステータスをINFO、メッセージにhello world.のリクエストを送信するクラスです。
レスポンスステータスを標準出力に表示させています。
~~~ ClientMain.java
package logging;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import logging.proto.Logging;
import logging.proto.LoggingServiceGrpc;

public class ClientMain {
    public static void main(String[] args) {
        final String server = "localhost";
        final int port = 8080;
        ManagedChannel channel = ManagedChannelBuilder.forAddress(server, port)
                .usePlaintext()
                .build();

        LoggingServiceGrpc.LoggingServiceBlockingStub stub = LoggingServiceGrpc.newBlockingStub(channel);

        Logging.LoggingRequest request = Logging.LoggingRequest.newBuilder()
                .setStatus("INFO")
                .setMessage("hello world.").build();

        Logging.LoggingResponse response = stub.write(request);

        System.out.println("response status: " + response.getStatus());
    }
}
~~~

## ２．クライアントクラスの実行
クライアントを実行して状態を確認します。
標準出力とログファイルに以下のように出力されます。

~~~ 標準出力
> Task :ClientMain.main()
response status: OK
~~~

~~~ ログファイル
10月 21, 2022 5:10:08 午後 logging.LoggingService write
情報: hello world.
~~~

## 参考
今回、利用したソース一式です。

https://github.com/shigemax999/sample-grpc-logging
ABINITの導入記録

[ABINIT](https://www.abinit.org)を東京大学物性研スーパーコンピュータシステムB（ohtaka）上でビルドしたのでその手順を記録しておきます。

:warning: この文書は書きかけで、随時更新中です。

# 準備
### モジュール
```
intel_mpi/2020.4.304
intel_compiler/2020.4.304
intel_mkl/2020.4.304
```
### 環境変数
netcdfで必要になりそうなので、以下を``~/.bashrc``に記入して``source``しておくと良いでしょう。
```
export C_INCLUDE_PATH=${HOME}/local/include
export LIBRARY_PATH=${HOME}/local/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=${HOME}/local/lib:${LD_LIBRARY_PATH}
```
### ABINIT バージョン
* 9.6.2

### 必要な外部ライブラリ
* libxc
* HDF5
* netCDF
* netCDF-fortran

# 外部ライブラリのインストール

ライブラリはすべて``$HOME/local``以下にインストールするものとします。

### libxc

[こちら](https://qiita.com/ikutaro_hamada/items/34c69597c7acdb4b4b20#libxcのインストール)を参照して下さい。

### HDF5

HDF5の[ダウンロードページ](https://www.hdfgroup.org/downloads/hdf5/source-code/)からソースコードをダウンロードします。リンクが得られなかったので``wget``は使用せず、ソースコード（*.bz2）をダウンロードし、サーバにアップロードします。
``$HOME/local``でファイルを展開します。
```
bzip2 -dc hdf5-1.12.2.tar.bz2 | tar xvf -
```
``configure``を以下のように実行します。
```
./configure --prefix=$HOME/local --enable-fortran --enable-cxx --enable-shared --enable-unsupported
```
``make``を実行しビルドが成功したらインストールも行います。
```
make
```
```
make install
```

### netCDF
ソースコードをダウンロードします。
```
wget https://downloads.unidata.ucar.edu/netcdf-c/4.9.0/netcdf-c-4.9.0.tar.gz
```
``configure``
```
./configure --prefix=$HOME/local
```

### netCDF-fortran

ソースコードをgit経由でダウンロードします。
```
git clone -b v4.6.0 https://github.com/Unidata/netcdf-fortran.git
```
``configure``
```
./configure --prefix=$HOME/local CC=mpiicc CXX=mpiicpc FC=mpiifort
```
``CXX=mpiicpc``は必要無いかもしれません。


# ABINITのビルド
ABINITのソースコードはホームディレクトリ以下でビルドするものとします。
```
ABINIT/src
```
ここでソースコードをダウンロードします。
```
wget https://www.abinit.org/sites/default/files/packages/abinit-9.6.2.tar.gz
```
展開し``abinit-9.6.2``以下に``build``というディレクトリを作成しビルドを実行します。
```
tar zxvf abinit-9.6.2.tar.gz
```
```
cd abinit-9.6.2
```
```
mkdir build; cd build
```
``configure``の実行
```
../configure --with-mpi --enable-openmp --with-fftw3 --with-libxc=$HOME/local --with-hdf5=$HOME/local --with-netcdf=$HOME/local --with-netcdf_fortran=$HOME/local CC=mpiicc CXX=mpiicpc FC=mpiifort
```
エラーが出なければ``make``を実行
```
make
```
``make``が成功すれば

``build/src/98_main/``に``abinit``コマンドが生成されています。
【小ネタ】MUI の SvgIcon の色を Theme で変更する

# はじめに

たまにハマって調べるので備忘録として。

## 対応バージョン

* MUI > v5.10.10 (たぶん、5系なら大丈夫）

## やり方

```tsx
import { ThemeProvider } from "@mui/material/styles";
import { createTheme } from "@mui/material/styles";
import { createRoot } from "react-dom/client";
import App from "./app";

const theme = createTheme({
  components: {
    MuiSvgIcon: {
      styleOverrides: {
        colorPrimary: {
          "& path": {
            color: "#67C23A",
          },
        },
      },
    },
  }
});

const container = document.getElementById("root");
const root = createRoot(container as Element);
root.render(
  <ThemeProvider>
    <App />
  </ThemeProvider>
);
```

## 軽く説明

`SvgIcon` は、 `svg` タグの子要素として `path` タグがあり、アイコンはその `path` タグで描いているため、
色を変える場合は `path` タグを指定する必要がある。
【新規事業】それっぽいWebアプリを手短に作るためにやったこと備忘録【プロトタイプ】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556658/6ec16fbf-ad49-b975-cf6a-642ab0476747.png)

## はじめに
株式会社マイスター・ギルド新規事業部のヒツジーです。
弊社新規事業部では、新規サービスの立ち上げを目指して
日々、アイディアの検証やプロトタイプの作成などを行っています！


つい最近、新規事業部でWebアプリのプロトタイプを作成しました。
期日1か月、工数は1人月＋α（エンジニア2人＋リーダー1人）です。
1か月後には展示会に出展し、来場者の前でWebアプリを動かしながら説明をしなければなりませんでした。
他にもやるべき仕事はあるので、1日フルで時間をかけることはできません。皆さんならどうしますか？
どうやって短い納期の中でWebアプリを作りますか？
考えながら読み進めていただけたらと思います！

## 作ろうとしているもの
大きくわけて2つのアプリを作ります。
それらはそれぞれが独立したものになりますが、データは共通したものを利用します。

この場合、よくある構成では以下の図のように、フロントエンドとバックエンドに切り分けることを考えると思います。
バックエンドのAPIサーバからデータを受け取り、フロントエンドでそのデータを使って画面に描画します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556658/fef509c2-fe46-dccd-e3da-00192b82aee4.png)

新規事業部の開発メンバーで考えました。これでいいのか？と
これで、期日に間に合うのか？言語はどうする？サーバーはどうする？
いろいろ考えることが多いです。

## どこまでのクオリティのものを作るのか
考えることが多かったので、展示会に出展するにあたってどこまでのものを作ればいいのかをまずは整理しました。
以下になります。

- 展示会でWebアプリを来場者の前で動かしながら説明ができる
- ネットに接続されていなくても動かすことができる
- デザインはそれなりで十分。デザイナークオリティは求めない
- あとで作り直すので、設計、実装は汚くても大丈夫。製品クオリティじゃなくてもいい
- 設計書は不要。画面設計図くらいはあった方がいい
- 試験書は不要。モンキーテストで不具合がでなければいい
- ただし、動きを見せたいので、ある程度動的なものでないとダメ。静的なものはNG

受託でつくる製品であればあり得ないですが、今回は自社製品のプロトタイプです。上記の内容で可でした。
これをもとに、どういう技術を採用するか、インフラをどうするかを考えます。

## 技術選定
まずはインフラを決めました。
> - ネットに接続されていなくても動かすことができる

ということなので、ローカルの開発用PCで動けばいいやとなり、`Docker`を採用しました。
このときのために、ヒツジーはDockerを勉強していました。[記事](https://qiita.com/Shinkijigyo_no_Hitsuji/items/2bf11569290f484cfa62)にもしたので、見てください。

技術についてですが、↑でも書きましたが、フロントとバックをどうするか問題があります。
フロントは、HTML/CSSのマークアップ言語とJavaScript(JS)にしました。
開発仲間の[ウサギーがJSに強い](https://qiita.com/Shinkijigyo_no_Usagi)ので即決です。

問題はバックをどうするかです。
APIサーバをたてるのか？それでいいのか？です。


結論、APIサーバはやめました。
Interfaceをどうするのかとか、DBの用意とか、もろもろに時間がかかるので。


じゃあデータをどう管理するのか？ですが、`LocalStorage`を使いました。
`LocalStorage`を使うことで、どの画面でも共通のデータを利用することができるようになります。

このときの判断は、今でも拍手したいくらいに英断だったと思います。
これで必要工数が半分以下くらいになったんじゃないかと思います。
APIサーバを作らずに、JSだけで簡単にデータの操作が行えます。

実際、基本的な機能実装は2週間で完了しました。
プラス1週間で機能追加と修正作業をして、残り1週間はプロトタイプを使って出展時の製品紹介の練習を行いました。

## まとめ
新規事業部開発メンバーは1か月という短い期間で2つのアプリのプロトタイプを作成しました。
インフラはDocker、フロントはHTML/CSS/JSを採用、バックエンドはなしで、LocalStorageを使ってデータを扱いました。
これにより、想像していたよりも手短に作成でき、余裕をもって展示会に出展することができました。

以上、新規事業部での開発の備忘録です。
ATM(Asynchronous Transfer Mode)をかんたんに説明してみる

# 勉強前の理解度
* ネットワークの勉強を始めてからよく聞く
* データリンク層の用語らしい
* 多分銀行とは関係ない

# ATMの概要
* データリンク層のプロトコル
* ITUやATMフォーラムなどで規格化された

# 用途
　既存の一般電話回線(B-ISDN)の高速化のために考案されたが、広く普及することはなかった。ATMの技術はMPLSに引き継がれている。

# 特徴
### データの処理単位が小さい
　ATMはセルの大きさが**53オクテット**(ヘッダ5オクテット+データ48オクテット)の**固定長**となっている。セルの大きさが小さく固定されているため、中継や受信にかかる時間が短くて済むので、特に音声信号の扱いに向いているらしい(音声信号のやり取りは20~30ms以内と短く収める方が好ましいみたい)。
　なお、ヘッダを挿入することで実際の通信速度が本来より若干(10%程度)落ちる。

### 大容量データの転送効率が良い
　データの処理単位が小さいため、回線の占有時間を短く抑えることができる。また、一つの回線を論理的に分割することで、同時多重通信を実現している。

### 輻輳するリスクが高い
　ATMにはイーサネットやFDDIのように送信権の制御ができないため、多くのコンピュータが一斉に大量のデータを送信することが可能である。また、小分けにしたセルのうち1つでも失われてしまうと、全てのセルを再送信しなければならない。
　以上のことからネットワークが輻輳しやすいので、注意が必要である。(末端のネットワークの帯域の合計をバックボーンの帯域よりも小さくなるようにするなど)


# 参考

[ATMとは 「非同期転送モード」 (Asynchronous Transfer Mode)： - IT用語辞典バイナリ:](https://www.sophia-it.com/content/ATM)
[MPLSが生きながらえる理由（中） - MPLSが生きながらえる理由：Computerworld](https://project.nikkeibp.co.jp/idg/atcl/19/00285/040100002/?ST=idg-cm-network&P=2)
[マスタリングTCP/IP](https://www.ohmsha.co.jp/book/9784274224478/)
[【NTT西日本】ATM（Asynchronous Transfer Mode）｜ICT用語集｜法人・ 企業向け ICT サービス ・ ソリューション](https://www.ntt-west.co.jp/business/glossary/words-00017.html)
[Asynchronous Transfer Mode - Wikipedia](https://ja.wikipedia.org/wiki/Asynchronous_Transfer_Mode)
現場でよく使うmysqldumpコマンド

業務で``mysqldump``コマンドを使用する時、あれ？こうしたい時ってどういうコマンドだっけなって毎回なるので、備忘録として残しておきます。
主にテーブル単位でデータをdmpする場合を想定しています。

# dmpコマンド
MySQLからデータをdmpするコマンドになります。

## テーブル定義とデータのdmp
```bash
mysqldump -u [user_name] -p -h [host_name] [db_name] [table_name] > output.dmp
```

## テーブル定義のみdmp
```bash
mysqldump -u [user_name] -p -h [host_name] [db_name] [table_name] -d -n > output.dmp
```

## テーブルデータのみdmp
```bash
mysqldump -u [user_name] -p -h [host_name] [db_name] [table_name] -t > output.dmp
```

## WHERE句を使用したdmp
```bash
mysqldump -u [user_name] -p -h [host_name] --where "id >= 100" [db_name] [table_name] > output.dmp
```

## 複数テーブルのdmp
```bash
mysqldump -u [user_name] -p -h [host_name] [db_name] [table_name1] [table_name2] [table_name3] > output.dmp
```

# リストアコマンド
dmpファイルからMySQLにデータをリストアするコマンドになります。
```bash
mysql -u [user_name] -p [db_name] < output.dmp
```

現場からは以上です。
WordPressにて，下の方にエラー警告が出てしまう

初心者向けです

WordPressを組み込んでいると，
なにやら下部に警告が．．

![スクリーンショット 2022-10-20 15.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/c817811f-7e49-5dca-6034-d3e0638162ee.png)

該当箇所のbtnという変数で
Undefined indexが起こっています

Undefined indexは， `$_POST`や`$_GET`でよく起こるエラーです
if (!empty) などで逃げてもいいですが，構成によっては効かない場合も。
ここは根本的な問題であるこの表示自体を無くしましょう。


## WordPressのデバッグモードをオフにしましょう
```wp-config.php
// define( 'WP_DEBUG', true ); これを変更

define( 'WP_DEBUG', false );
```

たったこれだけでした　焦らず対処しましょう
[GoLand] 複数カーソル


![go_multicursor_virtual_space_mode.animated.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078128/7c2a51eb-9c60-19fc-2b35-e50aa5cf2b59.gif)

# カーソルを追加

## Mac

**option**を２回押したままの状態で、**up**または**down**の方向キーを押す

# Reference

https://www.jetbrains.com/help/go/multicursor.html#add-carets-above-or-below-the-current-caret
Go言語入門 学習メモ 9 Stringerインタフェース、Errorインタフェース

# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

# 対象読者
- これからGo言語を学習する方
- 既に他の言語で基本構文を学習されている方

# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
- Windows 11 Home / 22H2
- VSCode / 1.72.2
- go version go1.19.2 windows/amd64
- git version 2.38.0.windows.1

https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e

# 前回までの学習
前回は インタフェース、型アサーション、型スイッチ を学習しました。

https://qiita.com/fsd-osw/items/b935508aa2b0a6604185

# Stringerインタフェース
fmtパッケージが標準で持っているインタフェースのようです。githubでGoのソースを見てみると、このインタフェースは下記の実装になっており、 `String() string` がただ１つ宣言されています。

このString()が何者か調べてみると、どうやらJavaでいうところのtoString()のようです。インタフェースを実装した型の変数を `fmt.Println(変数)` のように渡すと、出力形式をString()で定義した通りにしてくれる、というものです。

以下でしか動作確認していませんが、少なくともこの2つはStringerインタフェースの実装にしたがって出力するようです。
- fmt.Println()
- fmt.Print()

```go:print.go
type Stringer interface {
	String() string
}
```
Stringerインタフェースを実装したもの、してないもので出力がどう変化するのか確認しました。結果は一目瞭然で、Stringerインタフェースを実装した側は出力形式が全く異なっています。

```go:サンプルコード
package main

import "fmt"

type Human struct {
	Name string
	Age  int
}

type Person struct {
	Name string
	Age  int
}

// Person型にStringerインタフェースを実装
func (person Person) String() string {
	return fmt.Sprintf("名前は%sです。年齢は%d歳です。", person.Name, person.Age)
}

func main() {
	fmt.Println("Stringer未実装")
	human := Human {"田中太郎", 99}
	fmt.Println(human)

	fmt.Println("\nStringer実装済")
	person := Person {"鈴木たろう", 50}
	fmt.Println(person)
}
```

```go:実行結果
Stringer未実装
{田中太郎 99}

Stringer実装済
名前は鈴木たろうです。年齢は50歳です。
```

# Errorインタフェース
Goには例外機構は備わっていないようです。その代わり(?)に戻り値とは別にエラーを示す値を返すことでエラー処理を行うようです。

どうやら、標準ライブラリなどはちょくちょく戻り値を2つ返すらしく、2つ目の戻り値がerrorインタフェース型になっているようです。error型のデータはCでいうところのerrnoと同じ感じでしょうか。

こちらもGoのソースを確認してみると、builtin.goにerrorインタフェースが定義されており、`Error() string`が1つだけ宣言されていました。

こちらを実装して適切なエラー処理をしていくということですね。公式ドキュメントを確認してみると、エラー処理の起点となるerrorインタフェース型がnilならエラーではない、ということのようです。

https://pkg.go.dev/builtin#error

こちらは完全に余談ですが、達人たちは例外を使わないようです。

https://qiita.com/Maki-Daisuke/items/80cbc26ca43cca3de4e4

```go:builtin.go
type error interface {
	Error() string
}
```
ErrorインタフェースもStringerインタフェース同様、fmt.PrintX(err)のように指定することで中身を吐いてくれるようです。

```go:サンプルコード
package main

import (
	"fmt"
	"time"
)

type TestError struct {
	When time.Time
	Msg  string
}

// errorインタフェースの実装
func (err TestError) Error() string {
	return fmt.Sprintf("%v: %v", err.Msg, err.When)
}

// errorインタフェース型の戻り値を返し、エラーと解釈させる
func causeError() error {
	return TestError{
		time.Now(),
		"エラー発生！",
	}
}

func main() {
    // Errorインタフェース型はnilであればエラーは起きていない
	if err := causeError(); err != nil {
		fmt.Println(err)
	}
}

```

```go:実行結果
エラー発生！: 2022-10-21 16:00:22.8513887 +0900 JST m=+0.002260301
```
fmtパッケージには `fmt.Errorf()` なるものもあるようです。下記が参考になります。

https://code-database.com/knowledges/108

# おわりに
今回はここまでです。
フィッシャーの正確確率検定（直接確率）

# フィッシャーの正確確率検定（直接確率）

分割表において，期待値が 5 以下の桝目が全体の桝目の 20% 以上あるか，期待値が 1 以下の桝目が 1 つでもある場合には，「$\chi^2$ 分布を利用する独立性の検定」は不適当である[^1]。

そのような場合には本法により独立性の検定を行う[^2]。

[^1]: フィッシャの正確確率検定については，「特殊な実験条件下で得られるものであり，どのような場合にも適用できるものではない」，「連続性の補正を行わない独立性の検定（比率の差の検定）を行うべきである」という批判もある。

[^2]: ここでは $2 \times 2$ 分割表の場合のみについて述べるが，それより大きい分割表を扱うことができる。

-  帰無仮説 $H_0$：「2 要因は独立である」，または「比率に差がない」。
-  対立仮説 $H_1$：「2 要因は独立でない」，または「比率に差がある」。

1. 2 変数 A，B についての分割表を以下のように定義する。
2 群の比率の差の検定を行うと解釈する場合には要因 A（または要因 B）が群になる。

 | | $B_{1}$ | $B_{2}$| 合計|  
 |:--:|:--:|:--:|:--:
 | $A_{1}$| $a$| $b$| $e$|  
 | $A_{2}$| $c$| $d$| $f$|  
 |合計| $g$| $h$| $n$|  

1. 周辺度数 $e$，$f$，$g$，$h$ を固定した分割表は複数個考えられるが，観察された分割表が得られる確率（生起確率）は次式のようになる。

```math
    P_{a} = \displaystyle \frac{{}_{e}C_{a} \times {}_{f}C_{c}} {{}_{n}C_{g}} = \frac{e!\ f!\ g!\ h!} {n!\ a!\ b!\ c!\ d!}
```

2. 周辺度数を固定したとき，$2 \times 2$ 分割表の自由度は $1$ であり，4 つの桝目のどれか 1 つを決めれば，残りの桝目は自動的に決る。

3. $a$ が取りうるすべての値をとった場合の分割表それぞれについての生起確率 $P_{a}$ を計算する。

4. 観察された $2 \times 2$ 分割表の生起確率を $P_{o}$ とする。

5. 検定（両側検定）は，得られた分割表のうち，観察された分割表における生起確率 $P_{o}$ 以下の生起確率 $P_{a}$ を合計したものを $p$ 値とする[^3]。

[^3]: Fisher が示した正確確率検定は，観察された分割表の生起確率よりも小さな生起確率を持つ分割表を「極端な分割表」であるとして，その生起確率を加えたものを $p$ 値とするものである。これ以外の方法もある。

## プログラム例


```julia
using SpecialFunctions

function fisher(a, b, c, d)
    lchoose(n, k) = logfactorial(n) - logfactorial(k) - logfactorial(n - k)
    Stats(i, e, f, g, n) = exp(lchoose(e, i) + lchoose(f, g - i) - lchoose(n, g))
    e, f, g, h, n = a + b, c + d, a + c, b + d, a + b + c + d
    mi = max(0, e + g - n)
    length = min(e, g) - mi
    prob = [Stats(mi + i, e, f, g, n) for i in 0:length]
    println("Fisher's Exact Test for Count Data (two tailed)")
    println("p value =", sum(prob[prob .<= Stats(a, e, f, g, n)]))
end;
```

## 使用例

四分表の a, b, c, d を与える。


```julia
fisher(10, 13, 16, 61)
```

    Fisher's Exact Test for Count Data (two tailed)
    p value =0.055089906063581565



```julia
fisher(20, 80, 13, 87)
```

    Fisher's Exact Test for Count Data (two tailed)
    p value =0.2528171706994786



```julia
fisher(13, 4, 6, 14)
```

    Fisher's Exact Test for Count Data (two tailed)
    p value =0.008138143815466493


## HypothesisTests パッケージの FisherExactTest との比較

HypothesisTests パッケージの FisherExactTest の両側検定結果は，デフォルトでは上述のプログラムによる結果と異なる。


```julia
using HypothesisTests
result = FisherExactTest(13, 4, 6, 14)
```




    Fisher's exact test
    -------------------
    Population details:
        parameter of interest:   Odds ratio
        value under h_0:         1.0
        point estimate:          7.11326
        95% confidence interval: (1.44, 43.82)
    
    Test summary:
        outcome with 95% confidence: reject h_0
        two-sided p-value:           0.0117
    
    Details:
        contingency table:
            13   4
             6  14




ここで得られる両側検定の $p$ 値は，該当する片側検定の $p$ 値を 2 倍するものである。<br>
このような計算方法は R や matlab などの他の統計ソフトと違う。<br>
同じ結果を得るためには，オプション設定 method=:minlike としなければならない。


```julia
pvalue(result, method=:minlike)
```




    0.008138143815466445
c#、.Net FrameWork と.Net Core

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/0f38fa59-97bb-1c2d-6807-d0f50aa3b482.png)

1,Net FrameWork と.Net Coreは、.netの二つフレームワーク

2,Net FrameWorkは、Windowsのアプリの開発に使える
　Asp.NetとAsp.Net MVCはwebに開発可能
3,NET Coreは、マイクロソフトの最新フレームワークで、Windows、MAC、Linuxなどで使える
とりあえず触り始めるための Athena v CloudWatch Logs Insights

どちらもAWSサービス、データを検索できるやつです。

細かいチューニングや知見は後回しでいいから、ざっくり今すぐサクッと使ってもらいたい。

どうしても気になるのは費用ですが、どちらも「無茶苦茶（もの凄い量をもの凄い回数扱う）な使い方をしなければお安い」範囲だと思うので、その範疇ならあまり気にしなくていいかも。

## 使い分け

* [Amazon Athena](https://aws.amazon.com/jp/athena/) をオススメするケース
  * データを正しくフォーマットして溜め、アドホックな検索を行いたい場合＝DBテーブルに対してアドホックなSQLを連発したい
  * 検索するまでの準備に対して、ある程度労力を割いてもよい
* [Amazon CloudWatch Logs / CloudWatch Logs Insights](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html) をオススメするケース
  * 直近のデータからささっとグレップしたい
  * 検索するまでの準備に対しては、あまり労力を割きたくない

## Athena

* てきとうに言うと
  * とあるS3バケット階層以下の全S3オブジェクト内容をDBテーブルレコードに見立ててクエリーで検索できる
    * 例：CSVファイルを多数保存しておくなど
* 使用例
  * 指定日のアクセスログから「◯◯」を含むものを検索したい
* 検索方法
  * SQL
* 主な費用
  * クエリーで走査したデータ量に依存
    * テーブルのパーティション（＝S3オブジェクトPrefix）を正しく設計することで費用を削減できる
      * 例：とある期間のデータはとあるPrefix以下にだけ保存されている
* 主な良いところ
  * 保存データ容量上限を気にしなくてよい
  * データ走査量によらず検索速度が良好
* 主な注意点
  * S3へのデータ出力
    * 一定のファイルフォーマットが必要
    * 一定の保存先（S3オブジェクトPrefix）ルールが必要
    * 自アプリケーションやAWSサービスからS3へどのように出力するか考慮が必要
  * ファイルフォーマットや保存先に合わせたテーブル設定が必要

### Athena例

対象S3バケット階層のS3オブジェクトの中身イメージ

```console
$ cat path/to/2022/10/19/hoge-1.log
1,alice,18

$ cat path/to/2022/10/19/hoge-2.log
2,bob,20
3,carol,22

$ cat path/to/2022/10/20/fuga.txt
4,dave,18
```

クエリーイメージ

```sql
SELECT
  name
FROM
  my_table
WHERE
  date = '2022/10/19'
  AND
  age >= 18
LIMIT
  10
;
```

## CloudWatch Logs Insights

* てきとうに言うと
  * 溜めてあるログ内容をクエリーでフィルタリングできる
* 使用例
  * いまエラーアラートが発生したので、30分以内の実行ログから「◯◯」を含むものを検索したい
* 検索方法
  * 独自クエリー（Linuxコマンドをパイプで繋いでいる時のような感覚）
* 主な費用
  * クエリーで走査したデータ量に依存
    * 期間指定することで走査対象を絞り費用を削減できる
* 主な良いところ
  * 保存データ型を気にしなくて（ただの文章で）良い
    * とはいえJSONで出力しておくとクエリーでJSONプロパティを直接指定できるため便利ではある
  * 検索速度まあまあ
  * 「CloudWatch Logsにログを出力できる」ようなAWSサービスが多いので、出力方法構築に労力をあまり割かなくて済む
* 主な注意点
  * 走査範囲は「現在 〜 指定の過去日時」までとなる
    * 「過去のとある日1日だけ」のような検索が費用的な意味で実施し辛い
      * 「現在〜指定の過去日時まで全て舐めるけど抽出するのは過去のとある日1日だけ」という挙動になる
      * クエリー実行期間を「相対」から「絶対」に変更して回避する必要有り
    * 検索速度は走査範囲による

### CloudWatch Logs Insights例

対象ロググループのログストリームの中身イメージ

```console
$ cat 2022/10/19/[$LATEST]abc001cde
2022-10-19T12:34:01.789Z {"id":1,"name":"alice","age":18}

$ cat 2022/10/19/[$LATEST]abc002cde
2022-10-19T12:34:02.789Z {"id":2,"name":"bob","age":20}
2022-10-19T12:34:03.789Z {"id":3,"name":"carol","age":22}

$ cat 2022/10/19/[$LATEST]abc003cde
2022-10-19T12:34:04.789Z {"id":4,"name":"dave","age":18}
```

クエリーイメージ（※クエリーとは別でクエリー実行期間も指定することになる）

```text
fields @timestamp, name
| filter age >= 18
| sort @timestamp desc
| limit 10
```

```text
fields @timestamp, @message
| filter @message like 'carol'
| sort @timestamp desc
| limit 10
```
JupyterHubのインストールと設定し複数人で使用する

# 目的

これまで，Jupyter Notebookを使用してきたが，複数人で使用できるようにするためにJupyterHubをインストールし，複数人で使用できるように設定する．
ついでに，JupyterLabを使用するようにする．

# 環境

- Ubuntu 20.04 LTS

# インストール

JupyterHubとJupyterLabをインストールする．

```
$ sudo apt-get install npm
$ sudo pip3 install jupyterhub
$ sudo pip3 install jupyterlab
$ sudo npm install -g configurable-http-proxy
```

# 設定

使用するユーザーの追加とjupyter用のディレクトリの作成
```
$ sudo adduser user1
$ sudo su user1
$ mkdir ~/notebook
$ exit
```

設定ファイルの作成

```
$ sudo su 
# cd /etc/
# mkdir jupyterhub
# cd /jupyterhub/
# jupyterhub --generate-config
```

下記の個所を変更

```jupyterhub_config.py
#管理ユーザを追加
c.JupyterHub.admin_users = set(["admin"])
c.Authenticator.admin_users = set(["admin"]) 
c.JupyterHub.confirm_no_ssl = True #ssl通信を使わない
#jupyterを使用するユーザーを追加
c.Authenticator.allowed_users = set(["user1"])
#各ユーザのホームディレクトリのnotebook以下をjupyterが使用するように設定．デフォルトだとホームディレクトリが使用される．
c.Spawner.notebook_dir = '~/notebook'
```

sytemdに登録して，serviceで起動できるように設定．

```/etc/systemd/system/jupyterhub.service
[Unit]
Description=Jupyterhub
After=syslog.target network.target

[Service]
User=root
ExecStart=/usr/local/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

[Install]
WantedBy=multi-user.target
```

jupyterhubを起動

```
# service jupyterhub start
```

デフォルトでは，
http://IPアドレス:8000
にアクセスすることで，JupytrHubが起動し，下記画面が表示される．
作成したユーザのアカウント名とパスワードでログイン可能．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/60d40383-17b7-0537-af15-73979cb1466d.png)

# ハマった部分

一部のユーザのみ
Spawn failed: Server didn't respond in 30 seconds
と表示されサーバーが立ち上がらないという現象が起きた．

原因は，jupyter notebookを使用していた際の設定ファイルが，残っていたためであり，各ユーザのホームディレクトリ下の
~/.jupyter/jupyter_notebook_config.pyを削除することで問題なく動作するようになった．
Google UXデザイン：アイディエーションを理解する

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">

# アイディエーションとは
問題を定義できたら、問題を解決するためのアイディエーションフェーズに移ります。

***<font color="MediumVioletRed">『与えられたトピックについて、判断や評価を試みることなく、幅広いアイデアを生み出すプロセス』</font>***　

重要なこと。

- ***幅広いアイデア***
    - アイディエーションは、たくさんのアイデアを出すことです

- ***判断しない***
    - 判断して捨てることなく、あらゆるアイデアを探求することが必要です。おかしなアイデアでも、実はとても価値のあるものだったりします。

アイディエーションの醍醐味は、「悪いアイデアはない」というメンタリティです。

たくさんのアイデアを出すのが苦手でも、心配はいりません。デザイナーという職業は、意図的にできるだけ多くのアイデアを模索し、そのうちのいくつかは、あるいはほとんどはうまくいかないとわかっているものなのです。そして、たくさんのアイデアを出す練習をすればするほど、それが自然に感じられるようになります。

# アイディエーションのポイント

- デザイナーは、個人でもグループでも、声を出してブレインストーミングを行う。
- すべてのアイデアは、付箋紙やホワイトボードに記録されることが多い。
- 目標は質より量のアイデアなので、できるだけ多くのアイデアを共有する。
- この段階では、評価は許されない。
- グループでブレーンストーミングを行う場合は、異なる背景や視点を持つ多様なチームを集める。
- 当たり前のことを疑ってみる。
- アイデアを検討する際には、どのアイデアを選ぶか、その理由を持つことが重要である。

# アイディエーションを評価する方法

1. ***<font color="MediumVioletRed">『Feasible』</font>***　技術的に可能か？
2. ***<font color="MediumVioletRed">『Desireble』</font>***　あなたが注目しているユーザーの問題を解決しているか？
3. ***<font color="MediumVioletRed">『Viable』</font>***　ビジネスとして金銭的なメリットがあるか？

もし、この3つの基準を満たすアイデアがあれば、それは前進するための良い選択肢となるかもしれません。

# サンプル

:::note info
オリビアは、2歳のルカが自分の自転車に乗れないので、一緒に自転車に乗る方法を必要としている親です。この問題に対するソリューションは、すでにたくさん存在しています。しかし、それが新しい製品であると想像してみましょう。
:::

- 大人の後ろにシートを付ける。
- 大人の前にシートを付ける。
- 二人乗りの自転車を作る。
- 子供は大人と一緒にペダルを踏む。
- 子供が大人の後ろに乗るためのミニバイクを付ける。
- 子供が座るためのバスケットをハンドルに付ける。
- バイクのサイドカーを付ける。
- 大人のヘルメットにシートを付ける。
- 自転車の後ろに引く屋根付きトレーラーを付ける。

これらのアイデアの中には、ばかげたものもあるのでしょうか？
もちろんです。しかし、アイデアを練るときは、当たり前のアイデアを押しのけて、革新的なアイデアを見つけたいものです。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c9c4ed9-b9d4-c868-3f8c-07d348e49f3d.png" width="700">

# ビジネスニーズを認識する

アイディエーションでは、デザインするビジネスについて考えることも重要です。

UXデザイナーは、しばしばマーケティングやブランディングのチームと密接に仕事をします。

それは、ブランディングが、ユーザーが製品をどのように体験するかに大きな影響を与えるからです。

# さいごに

アイディエーションには膨大な時間がかかりますが、とても楽しい作業でもあります。アイディエーションは、ユニークなソリューションを思いつくことを後押ししてくれます。

アイデアを出すときは、あなたの創造力をフルに発揮してください。
【Laravel】インスタンスの書き方

## モデルの処理はインスタンスで呼出します

MVCの概念として、長尺になりやすいデータベースの操作コードは
モデルに記述し、コントローラーに呼び出すのがお作法です

記述したコードはコントローラーでインスタンス化し
変数に代入することで中身の関数を利用できます。


## インスタンスとは何？

インスタンス化とは、設計図（クラス）を具現化したものを指します。
実際のコードはModelに存在するため、コントローラーで利用するためには
具現化する必要があります。

具現化するには任意の変数名に代入するだけでよいため
中身の関数を利用するためには、アロー関数(->)で中身を指定します


**modelファイル**
```php

 class モデル名 extends Model
{
    public function 任意の関数名($引数名){
         // データベースを操作するコードを記述します           

      }
}


// 実際に記述した場合の例

 class Tests extends Model
{
    public test_index ($request){
         /* テーブルから全てのレコードを取得する */
            $tests = Tests::query();
      }
}

```
**controllerファイル**
```php
use App\利用するモデル名;

public function アクション名(Request $request)
    {

      
            /* インスタンス呼び出し */
            $任意の変数名1 = new モデル名();
            $任意の変数名2= $任意の変数名1->モデル内の関数名($引数名);
      
      }

// 実際に記述する場合の例

use App\Tests;

  public function index(Request $request)
    {

               /* インスタンス呼び出し */
        $test = new Tests();
        $test_index = $test->test_index($request);
        
        return view('test.index', ['test_value' => $test_value]);

    }


```
MotionBuilder同じrigのアニメーションretarget

Step 1.
Source Fbxを開けて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/daefda43-fd3c-d511-978e-969a9f171123.png)

Step 2.
Switch Two Panes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/35ad2c66-d384-5eb4-d5db-740af396555f.png)

Ctrl + E switch to perspective view
Ctrl + W switch to hireachy view

Step 3.
Top hireachyを選択　右クリック　Add/Remove namespace
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/a0112d8a-2b66-6127-6005-7faf55bc654c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/ffa818fd-f4be-24c2-f1b9-1b068f3a3692.png)

Step 4.
Remove Namespace
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/dca9cc3a-4a6d-1943-6d1b-9b96e1e6ba3e.png)

Step 5.
Merge
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/f392a3a0-29ab-f8cd-1f18-5acc4116b23a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/774d6173-4c0c-7d62-ec9a-deabec1fc3a2.png)

Step 6.
Export fbx
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/c8057510-5ea6-1159-88d2-cdbfc29b86b0.png)
[記事紹介] BIMIを使ってメールにロゴを表示する方法 (概要編)

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。

### BIMIを使ってメールにロゴを表示する方法 (概要編)
https://qiita.com/hirachan/items/f904edd03abf25a83004
[AWS] ssm-userが作成されるタイミング

# 結論
`ssm-user`は
- 最初のセッション確立時に作成される。
- ただし、Run Asを有効化している場合は作成されない。


## 少し説明

GithubのレポジトリのREADMEに書いてある通り、

https://github.com/aws/amazon-ssm-agent


>The first time a Session Manager session is started on an instance, the agent will create a user called "ssm-user" with sudo or administrator privilege. Session Manager sessions will be launched in context of this user.

`ssm-user`は**最初のセッション確立時**にssm-agentによって作成されます。インスタンスの起動時やssm-agentが起動したときには作成されません。

また、SSMには`SSMSessionRunAs`というタグをIAMユーザーやロールで設定することで、SSMでのログインユーザを設定することができます。(セッションマネージャ側で`Run As`を有効にする必要があります。)
この機能はユーザーのアクセス制御をする上でとても便利な機能です。

https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-run-as.html

そして、この機能を有効化しているときは`ssm-user`は**作成されません。**

## おまけ

ちなみにssmだけを利用するのに必要なIAMポリシーは以下に貼っておきます。
EC2のインスタンスを見るためのポリシーは書いてません。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:GetConnectionStatus",
                "ssm:ResumeSession",
                "ssm:DescribeInstanceInformation",
                "ssm:TerminateSession",
                "ssm:StartSession"
            ],
            "Resource": "*"
        }
    ]
}
```
移動平均を用いた仮想通貨のランキング作成

# 目的
価格データの移動平均を用いて仮想通貨のランキングを作成します
作成したランキングを投資戦略の提案に利用することが今後の目標です

# <font color="Red">実施事項 [!]</font>

1. 移動平均を用いた仮想通貨のランキング作成
2. 次のトークンに対して投資シミュレーション
    a. ランキング上位の仮想通貨
    b. ランキング下位の仮想通貨も含めた全仮想通貨
3. a で得た ROI（投資利益率）が b より大きい場合にランキングが妥当であると判定

プログラムの実行は **Kaggle Notebook** で行いました
<!-- 本記事の実験は Kaggle Notebook で再現することができます -->

# 使用データ
仮想通貨の過去（`2020/10/01` ~ `2022/04/01`）の価格データ（from ~~[Daily prices for 2700 cryptocurrencies | Kaggle](https://www.kaggle.com/datasets/patrickhallila1994/daily-prices-for-2700-cryptocurrencies)~~ 異なるデータセットを用いていた可能性があるので確認中）

▼ データセットから Pandas DataFrame を作成するコード

```python
import pandas as pd
fn = "../input/daily-prices-for-2700-cryptocurrencies/crypto_prices.csv"
df = pd.read_csv(fn)[["ticker", "Date", "Close"]]
nan_dates = [
    "No data is available now", 
    'Loading data...'
]
df["Date"] = df["Date"].replace(nan_dates, np.nan) # 日付でない値を欠損値とみなす
df["Date"] = pd.to_datetime(df["Date"], format = '%b %d, %Y') # 文字列を日付型に変換
first_date, last_date = "2020-10-01", "2022-04-01"
df = df.pivot_table(index='Date', columns='ticker', values='Close').loc[first_date:last_date]
```

▼ 作成した Pandas DataFrame：`df`
![作成した Pandas DataFrame](https://i.gyazo.com/6e14780447a35c71a14030b0f20da500.png)

## 収録トークン
メジャーなトークン（`BTC`, `ETH`, `XRP`, `SOL` etc.）からマイナーなトークンまで，約 **2000** 個以上を収録しています
ランキングの作成に十分なトークン数だと思われます

# 実験
ランキングを次の手続きで作成します
1. $m$日移動平均の算出（$m = 30$ とする）
2. 各日の移動平均をランキング
3. 上位$n$%にランクインした回数をヒストグラムにプロット（$n = 12.5$ とする）

## 手続きの具体例
\###

# 結果
## 移動平均によるランキング作成
▼ 30日移動平均が上位 12.5% である仮想通貨
![移動平均上位12.5%の仮想通貨](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2926049/119a5743-ff16-af0c-3137-203ae556bd24.png)

## ROI による妥当性の判定
ランキング上位 12.5% の仮想通貨を用いることで **ROI が 10%~30% 増加** しました
移動平均による仮想通貨ランキングの作成は妥当だと言えます

▼ 上位 12.5% 仮想通貨と全仮想通貨の ROI 差分
![投資シミュレーション結果の差分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2926049/ead599ee-4b17-0405-be88-164634d59f37.png)
【Terraform】リソースの設定の変更を無視したい場合の対応方法

## はじめに
Terraform にて AWS リソースを tfstate に Import する際に、リソースの変更を無視するための対応を実施しました。
今回、その対応方法を記事として残したいと思います。
※こちらの対応は、`aws_s3_object` リソースにて実施しました。

## 対応を実施した際の Terraform のバージョン
v4.0.0

## リソースの設定の変更を無視したい場合
リソースに以下のように記載する。

```terraform:書き方
resource "リソースの種類" "リソース名" {

  lifecycle {
    ignore_changes = [
      変更を無視したい設定
    ]
  }
}
```

```terraform:記載例
resource "aws_s3_object" "test_object" {
  bucket             = aws_s3_bucket.test_object.id
  bucket_key_enabled = false
  cache_control      = "no-cache, no-store, must-revalidate"
  content_type       = "image/png"
  etag               = "****************************"
  key                = "key.png"
  metadata           = {}
  storage_class      = "STANDARD"
  tags               = {}
  tags_all           = {}

  lifecycle {
    ignore_changes = [
      acl,
      force_destroy,
    ]
  }
}
```


## 参考情報
https://www.terraform.io/language/meta-arguments/lifecycle

https://github.com/hashicorp/terraform-provider-aws/issues/25412#issuecomment-1256313001
【Laravel】データベースのトランザクションの書き方

## トランザクションを実行するtry~catch処理

トランザクションとは処理をひとまとめにすることで
途中でエラーが発生した場合に
処理全体を中断ではなくキャンセルすることができます

```php

use Illuminate\Support\Facades\DB;


// トランザクション開始

class コントローラー名 extends Controller
{
        DB::beginTransaction();

        try {
            // 例外が発生する可能性のあるコードを記述します
            // データベースの操作コードや
            // インスタンスの呼出コードなどを記述します
        
             DB::commit(); //データベースに反映します。
        } catch (Exception $e) {
            // 例外が発生した場合に行う処理を記述します
            // $eは任意の名前の変数です
        
             DB::rollBack(); // 処理をトランザクション開始まで戻します
        }

}
```

## try(試す）　catch（捉える）

tryの内側にて処理を実行し
catchの内側にてエラーが起きてしまった場合の処理を実行します
cathcの内側にエラーメッセージを入力したり
最後にDB::rollBack();を記述することで処理前に戻すことができます。
MacにNode.jsをインストール

# 環境
```
% sw_vers
ProductName:	macOS
ProductVersion:	12.6
BuildVersion:	21G115
% 
% brew -v
Homebrew 3.6.6
Homebrew/homebrew-core (git revision c6c9e681ea6; last commit 2022-10-19)
```

# インストール
## 1. nodebrew をインストール
```
% brew install nodebrew
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).

You have 1 outdated formula installed.
You can upgrade it with brew upgrade
or list it with brew outdated.

==> Downloading https://ghcr.io/v2/homebrew/core/nodebrew/manifests/1.2.0
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/nodebrew/blobs/sha256:eed2aef
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/
######################################################################## 100.0%
==> Pouring nodebrew--1.2.0.all.bottle.tar.gz
==> Caveats
You need to manually run setup_dirs to create directories required by nodebrew:
  /opt/homebrew/opt/nodebrew/bin/nodebrew setup_dirs

Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew's directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/opt/homebrew/var/nodebrew

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Summary
🍺  /opt/homebrew/Cellar/nodebrew/1.2.0: 8 files, 40.7KB
==> Running `brew cleanup nodebrew`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

% nodebrew
nodebrew 1.2.0

Usage:
...
（長いので省略）
...
```

## 2. nodebrew のセットアップ
インストールログに記載されている以下にしたがって、セットアップをする。
```
You need to manually run setup_dirs to create directories required by nodebrew:
  /opt/homebrew/opt/nodebrew/bin/nodebrew setup_dirs

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

## 3. node.js をインストール
```
% nodebrew install v16.18.0
Fetching: https://nodejs.org/dist/v16.18.0/node-v16.18.0-darwin-arm64.tar.gz
################################################################################################################### 100.0%
Installed successfully

% nodebrew list
v16.18.0

current: none

% nodebrew use v16.18.0
use v16.18.0

% nodebrew list        
v16.18.0

current: v16.18.0

% node -v
v16.18.0 
```

# ex. その他のコマンド

* インストール可能なバージョンを確認する。
`nodebrew ls-remote`
初めまして！

初めまして！今、sierとして働いているハタハタです。本日初めてブログを書きます。今私は運用監視オペレーターとして働いていますが、技術が身に付かないことを危惧し、また将来的に介護とitを結びつけたいと思いアプリ開発の勉強をしたいと考えております。そのためにも最初はjava scriptの勉強から始めたいと思います。みなさんはどのように勉強しはじめましたか？よろしくお願いします！
WatchOSのEmptyView()が機能していない

## 問題点
EmptyViewを使いたい意図として、  
WatchConnectivityを使い、iOS App側で操作を行ったときにAppleWatchの画面も遷移させる処理をさせたい。この際にAppleWatch側には画面遷移用のボタンを表示させたくなかった。

------

変数`pushViewFlag`が`true`になると画面遷移するサンプルコード
```swift
struct ContentView: View {
    
    @State private var pushViewFlag: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                Text("サンプルな画面")
                NavigationLink(destination: NextView(),
                            isActive: $pushViewFlag) {
                    // 何も表示しない
                    EmptyView()
                }
            }
        }
    }
}
```
出力される画面
↓↓↓↓
![incoming-88114DE0-C5A7-429B-8CBC-74819791821A.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272313/d9e648b6-0129-4652-a3f8-8e694817c25b.png)

空のViewを表示するコードを書いているはずが、
上記の画像のような状態で空白のボタンが表示される。

## とりあえずの解決方法
遷移のトリガーとして使っている`pushViewFlag`が`true`の時以外は、 　
画面に描画されないように分岐する。

```swift
struct ContentView: View {
    
    @State private var pushViewFlag: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                Text("サンプルな画面")
                if pushViewFlag {
                    NavigationLink(destination: NextView(),
                                   isActive: $pushViewFlag) {
                        // 何も表示しない
                        EmptyView()
                    }
                }
            }
        }
    }
}
```


SwiftUIでの開発が初めてだったのでここで地味につまづいた。  

iOSだと空のViewが生成されるらしいが、WatchOSで`EmptyView()`でViewが生成されているのはバグなのか...?
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-01

今回の内容は動画でも公開しています

https://www.youtube.com/watch?v=sIieb02hkAk

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

SalesforcePlatform認定アプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1

今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース) 
Salesforce の基本事項の学習

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

今回の内容はこちらです



![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3e012ed0-2a1d-c9e2-f146-17697fc1cb08.png)


正解はBです


App ExchangeとはSalesforce公式マーケットプレイスです

こちらから条件を満たすアプリケーションを探してダウンロードしましょう

アプリケーションのダウンロードをした場合、開発をするよりも安くて手軽に実現できることがおおいのでＢが正解ですね


AppExchangeには無料のアプリもたくさんありますね

興味があればPlaygroundに入れて動作を確かめてみてみしょう

なおAppExchnageについての詳細が知りたい場合、こちらのTrailheadをお勧めします

https://trailhead.salesforce.com/en/content/learn/modules/appexchange_basics
Dockerhub上で公開されているイメージのタグのリストをcurlで簡単に取得する

出力結果を増やしたい場合は、page_sizeを調整します。
なお、Dockerhubの認証情報等は不要です。

```
curl "https://hub.docker.com/v2/repositories/<リポジトリ（イメージ）名>/tags/?page_size=100" | jq .results[].name
```

## 例
```
$ curl "https://hub.docker.com/v2/repositories/alfresco/process-services/tags/?page_size=100" | jq .results[].name
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21383    0 21383    0     0  28434      0 --:--:-- --:--:-- --:--:-- 28397
"latest"
"1.11.4.2"
"2.3.4"
"2.3.3"
"2.3.2"
"1.11.4.1"
"2.3.1"
"2.2.0.1"
"2.3.0"
"2.2.0"
"2.1.0"
"2.0.1"
"2.0.0"
"1.11.4"
"1.11.3"
"1.11.2"
"1.11.1.1"
"1.10.0.1"
"1.11.1"
"1.11.0"
"1.10.0"
"1.9.0.1"
"1.9.0"
"1.8.1"
"1.8.0"
"1.7.0"
"1.6.0"
"1.6.4"
"1.6.1"
```
pgAdminで文字列コピーしたセルの引用符 "hoge"が勝手についてしまう

コピーしたセルをテキストなどに張り付けると

"コピーしたセル"　←　" "を解除または、そのままinsert文に使える' ' に変更したい場合の手順

バージョン：pgAdmin 6.8以降

ファイル→設定→クエリツールのツリー開く→結果グリッド

結果コピーの引用符文字　を変更する。（初期値は "）

CSV/TXT出力を変えたい場合は結果グリッドの上にあるCSV/TXT出力の
CSVの引用符文字を変更する
【TypeScript】テンプレートリテラル　メモ 

## テンプレートリテラルとは？？
***テンプレートリテラルは、ダブルクォートやシングルクォートの代わりにバッククォート ` `` ` で囲んで一つの文字列とする***
参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals

## 使ってみる
```typescript
const word1 = '今日';
const word2 = '嬉しい';

//テンプレートリテラルを使わない場合
console.log(word1 + 'は' + word2 + 'ことがありました。');

//テンプレートリテラルを使った場合
console.log(`${word1}は${word2}ことがありました。`);

//出力値：今日は嬉しいことがありました。
```
変数と文字列を使って文章を出力する

* テンプレートリテラルを使わない場合
`''`や`""`で文字列を囲み、`+`で変数と足し合わせる

この方法は他の言語でもこのような書き方をするのでかなり一般的
（この書き方しか知りませんでした…　しかも結構面めんどくさい）

* テンプレートリテラルを使う場合
` `` `を記述してその中に文字列も配列も記述する
変数は`${xxx}`のようにxxxの中に記述する

このようにすることで、毎度`+`や`''`を記述しなくても出力することができるようになった
（RubyやPHP,Pythonなどでもテンプレートリテラルは使えるそう　Javaはない）


***タグ付きテンプレート***なるものもあるらしいがあまり使わなさそうなので↓
参考：https://zenn.dev/nekoniki/articles/bdf79a512e057ae72613

気づいたことなどあればまた記載します
LPC812MAXと時計,DS1307で液晶時計(Mbed)( AQM0802A i2c)


x時間合わせは、なし
x5Vをds1307に接続


x mbed2リビジョン144
x リビジョンの変更ができる人むけ


目的
ただの時計


![o_cop166.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7ab1fa5b-674c-b9c3-d147-3ea4494caebc.jpeg)



```c++



//I2C_LCD_DS1307_812_1

#include "mbed.h"

#define ADDR        (0xD0)   //  address
#define ADDR_LCD    (0x7C)   //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010
I2C i2c(A4, A5); //812

char    data_read[8];   //i2cバッファー

//液晶初期化配列
char INIT_com[]= {0x0,0x38,
                  0x0,0x39,
                  0x0,0x4,
                  0x0,0x14,
                  0x0,0x70,
                  0x0,0x56,
                  0x0,0x6C,
                  0x0,0x38,
                  0x0,0xC,
                  0x0,0x1,
                  0x40,0x41,
                  0x99,0x99
                 };

//液晶のクリア
char INIT_cls[]= {0x0,0x1};

//二進化十進の変換
char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    ch_hex_a_b[0] = '@';
    ch_hex_a_b[1] = '0' + (l_num >> 4);
    ch_hex_a_b[2] = '0' + (l_num & 0xf);
    ch_hex_a_b[3] = ':';
    ch_hex_a_b[4] = 0;
    return(ch_hex_a_b);
}//ch_hex_a_b

//メイン関数
int main()
{
    //液晶の初期化
    for(int ii=0; ii<11; ii++) {
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    } //for

    //無限ループ
    while (1) {
        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //時間の読み込み
        i2c.write(ADDR, "\000", 1);
        i2c.read(ADDR | 1, data_read, 7);

        //時間の表示
        i2c.write(ADDR_LCD, ch_hex_a(data_read[2]),4);
        wait_ms(1);
        i2c.write(ADDR_LCD, ch_hex_a(data_read[1]),4);
        wait_ms(1);
        i2c.write(ADDR_LCD, ch_hex_a(data_read[0]),4);

        wait_ms(1000);
    }//while

}//main




```


![o_cop184.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/487302e8-367b-d474-6422-f5c7a158ad59.jpeg)


![o_cop185.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8e571473-d4d4-20ff-9f78-fa9f32f2142f.jpeg)


![o_cop186.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2d29576f-2507-b8e2-bba2-52d332885675.jpeg)


![o_cop187.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/834b5e94-8aa9-8029-2c09-9116a72cfd31.jpeg)


![o_cop188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b8373ef9-ce42-4cc7-f734-e1fa93dfb887.jpeg)
Herokuで使っているHeroku PostgresにIndexをはるには

基本的なことですがやったことなかったので備忘録

# Heroku Postgresにログインする
コンソールから
`$ heroku pg:psql -a アプリ名`
で利用しているPostgresに入れます

# Indexの貼り方
上記コマンドでログインできているので、あとは一般的なPostgreSQLの作法に従って下さい。

`CREATE INDEX index_name ON table_name (column_name);`
とか、Tableにロックをかけずにインデックスを作成する場合には
`CREATE INDEX CONCURRENTLY index_name ON table_name (column_name);`

とやります。