OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】アプリケーションの新規作成

# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はアプリケーションの新規作成についてを記載します。

# 環境
- 開発 (cloud9)
- 言語 (Ruby 2.6.3)
- フレームワーク(Rails 6.1.6)

# アプリケーションを新規作成する
アプリケーションを新規作成するコマンドは以下になります。
```:terminal
$ rails new アプリケーション名
```
今回は「bookers_re」という名前のアプリケーションを作成してみます。
```:terminal
$ rails new bookers_re
```

#### アプリケーションを削除したいとき
もしアプリケーション名を間違えて作成した場合は、以下のコマンドでアプリケーションを削除できます。
```:terminal
rm -rf アプリケーション名
```

# エラー「Blocked host」
サーバーを立ち上げて、ページを確認すると「Blocked host:〜」というエラーが発生するかもしれません。エラーメッセージの内容は「ホストがブロックされました。リクエストを許可するために環境設定に以下のコードを追加してください」というものらしいです。

メッセージ内に表示されているコードをコピーして、設定を追加します。
URLは環境によって異なるらしいです。
```:config/environments/development.rb
config.hosts << "URL"
```
コピペできましたら、サーバーを停止してから再度立ち上げます。
「Yay! You’re on Rails!」の画面が表示されていましたら、正常にアプリケーションが作動できています。

# 最後に
記事をご覧いただきありがとうございました。
記事の内容に誤りや理解不足な点がありましたら、ご指摘いただけると幸いです。
Pythonでコロナ感染者数を軽く集計した話

コード
---
使っているモジュール
``pandas`` (``pip install pandas``でインストール可能)
``matplotlib`` (``pip install matplotlib``でインストール可能)


```python:main.py
import pandas
from matplotlib import pyplot

hyouji = ["ALL","Hokkaido","Aomori","Iwate","Miyagi","Akita","Yamagata","Fukushima","Ibaraki","Tochigi","Gunma","Saitama","Chiba","Tokyo","Kanagawa","Niigata","Toyama","Ishikawa","Fukui","Yamanashi","Nagano","Gifu","Shizuoka","Aichi","Mie","Shiga","Kyoto","Osaka","Hyogo","Nara","Wakayama","Tottori","Shimane","Okayama","Hiroshima","Yamaguchi","Tokushima","Kagawa","Ehime","Kochi","Fukuoka","Saga","Nagasaki","Kumamoto","Oita","Miyazaki","Kagoshima","Okinawa"]

for i in hyouji:
    pyplot.figure()
    pyplot.title(f"{i}")
    
    score = pandas.read_csv("https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv",encoding="utf-8")
    score2 = score[i]
    date = [score["Date"][a][0:6] for a in range(0,len(score["Date"]))]

    pyplot.xticks(rotation=30)

    pyplot.bar(date, score2)

    pyplot.savefig(f"コロナ感染者数/コロナ - {i}.png")
```
大まかに、やっていること
1 感染者数のCSVデータを収集
2 X軸を``yyyy/MM``形式にする※1
3 Y軸は感染者数値にする
4 棒グラフ(?)としてグラフを生成する
5 png画像で出力※2
という流れ
※1 よって、一ヶ月単位での感染者数表示とする
※2 例えば、北海道なら、``コロナ - Hokkaido.png``という名前で保存される

グラフの例
---
``コロナ - ALL.png``(全国の感染者数)で試した場合
![コロナ - ALL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612963/569e3247-efb9-a83b-01c2-c0ef8e67c559.png)
matplotlibを使っているため、結構きれいに出てきます。

まとめ
---
結構使えると思います
以上！((

ご視聴ありがとうございました！
iRICソフトウェア version3の格子生成プログラムをversion4に対応させる

# 概要
iRICソフトウェアversion3からversion4へのバージョンアップに伴い、`cgnslib`は使用されないように変更され、`iriclib`内部の関数について追加、削除、関数名の変更が行われました。（詳しくは[こちら](https://github.com/i-RIC/v4_migration_guide_jp/blob/master/iriclib_changes.md))

そのため、iRICソフトウェアversion3で使用していたソルバー、格子生成プログラムをiRICソフトウェアversion4で使用するには更新作業が必要となります。

本記事では格子生成プログラムを更新する方法を紹介します。

# 0.全体イメージ

今回の更新作業は、iRIC ver3で使用していた格子生成プログラム内の`cgnslib`および`iriclib(ver3版)`の関数を、`iriclib(ver4版)`の関数に置き換える作業となります。

::: note
ver3で使用されていた`cgnslib`の関数については、同様の機能の関数が`iriclib(ver4版)`に追加されています。
（ただし、複数の格子や非構造格子を使うような一部のソルバーなどで必要な関数は iRIClib では提供されません。そのようなソルバーでは、cgnslib で用意された関数を直接利用する必要があります。）
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/66bce6c7-d5a8-1cc3-d27b-416f5be94e08.png)

# 01.更新する対象
iRICで追加したい格子生成プログラムを使用するには、ver3では`iRIC\gridcreators`にフォルダを作成し、プログラムの実行ファイルの他に`definition.xml`（定義ファイル）や`translation_ja_JP.ts`等の辞書ファイルやREDOMEファイルを配置していました。
格子生成プログラムのver3→ver4対応の更新だけであればプログラム実行ファイル以外のこれらの変更は不要です。

更新するのはあくまで格子生成プログラムです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/fb6dd3cd-8186-29c7-a6fe-76bee7a6bd69.png)

# 02.更新手順
今回はiRIC ver3に搭載されていた「多機能格子生成ツール」を例にver4に対応できるように更新を行います。

## (1)格子生成プログラム用のフォルダを作成する
上でも少し触れましたが格子生成プログラムをiRICで使用するにはそのプログラム専用のフォルダを作成しその中に定義ファイル等を配置する必要があります。

iRIC ver4では`iRIC_v4\giridcreators`か`iRIC_v4\private\gridcreators`にプログラム専用フォルダを作成しますが、オリジナルの格子生成プログラムの場合は標準のプログラムと区別するため、`iRIC_v4\private\gridcreators`に作成するようにしてください。

今回はすでに存在するプログラムの更新なので、ver3の`iRIC\gridcreators`に保存されている格子生成プログラムのフォルダを`iRIC_v4\private\gridcreators`にコピーして対応します。

なお、`iRIC_v4\private\gridcreators`にコピーした方のフォルダに入っている実行ファイル(.exe)はプログラムをver4対応版に更新後差し替えるので消してしまいます。

![fuguai1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/dff8983d-836c-3c72-a7b8-a87443841c12.gif)

問題が無ければiRIC ver4の格子生成アルゴリズムの選択画面で一覧に追加した格子生成プログラムの名前が表示されているはずです。(実行ファイルがないのでまだ格子生成自体はできませんが。)

![iRIC_v4_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/3ca34a60-148c-4182-2821-c1eeea880e41.png)

## (2)ver4版のヘッダファイルとライブラリに差し替え
格子生成プログラムをビルドする際にはヘッダファイルとライブラリが必要となります。
これらはiRIC ver4のインストール時に同梱されているため、特段入手のために何かをする必要はありません。

標準的な場所にインストールをした場合ファイルは`C:\Users\(userid)\iRIC_v4\sdk`にあります。

使用している言語に合わせたヘッダファイルとライブラリをver3からver4のものに差し替えて下さい。



## (3)格子生成プログラム内の関数を修正する
以下のiRIC ver3からver4へバージョンアップに伴う`iriclib`の変更点をまとめた記事を参考に、格子生成プログラムのソースコードの修正を行います。

https://github.com/i-RIC/v4_migration_guide_jp/blob/master/iriclib_changes.md

### 関数についての解説

iRIC ver4の`iriclib`の関数について詳しく知りたい場合は以下のver4版のマニュアルをご確認ください。

https://iric-solver-dev-manual.readthedocs.io/ja/v4_jp/06/03_reference.html

ver3版のマニュアルは以下です。

https://iric-solver-dev-manual-jp.readthedocs.io/ja/latest/06/03_reference.html

## (4)格子生成プログラムをコンパイルして作成したフォルダに格納する
ヘッダファイル、ライブラリの更新の差し替え、ソースコードの修正ができたら格子生成プログラムのコンパイルを行います。

コンパイルされた実行ファイルは手順(1)で作成した格子生成プログラムのフォルダの中に格納します。

以上で格子生成プログラムのver3→ver4対応は終了です。

iRIC ver4上で格子生成プログラムを動かすことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/e3ecbb5d-d704-4892-4935-b5f965664651.png)
【React】公式のチュートリアルをやってみる～⑤関数コンポーネント

[【React】公式のチュートリアルをやってみる～④stateのリフトアップ](https://qiita.com/asahina820/items/c1045cacda14dc23204d) の続きです。
stateを持たないSquareコンポーネントを、シンプルに書くために関数コンポーネントに置き換えます。

## Squareコンポーネントをクラスコンポーネントから関数コンポーネントに置き換える

### 変更前（クラスコンポーネント）
```jsx
class Square extends React.Component {
  render() {
    return (
      <button 
        className="square" 
        onClick={() => this.props.onClick()}
      >
        {this.props.value}
      </button>
    );
  }
}
```

### 変更後（関数コンポーネント）
```jsx
function Square(props) {
  return (
    <button className="square" onClick={props.onClick}>
      {props.value}
    </button>
  )
}
```

### クラスコンポーネントと関数コンポーネントの違い
- クラスコンポーネント
    - stateを参照する時やメソッドを用いる時にthisを使う必要がある
- 関数コンポーネント
    - フックを用いるとthisを使う必要がなくなり、コードがシンプルになる
        - フックとは、Reactの機能に「接続 (hook into)」するための特別な関数で、stateの機能を関数コンポーネントに追加できる。useState, useEffectなどあるが、追々勉強する
    - React公式もこちらを推しているようだ


![ReactApp6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/9297b9a1-a399-6db1-8e72-e6caa0602792.png)
前回の記事と同じように、マスを押したらマスにXが表示されるようになってます。
関数コンポーネントの方がコード量少なくかけますね。

## 参考文献
- https://ja.reactjs.org/tutorial/tutorial.html#function-components
- https://ja.reactjs.org/docs/hooks-state.html
- https://ja.reactjs.org/docs/hooks-intro.html
アプライアンスサーバ とは

## 勉強前イメージ

そういう機能サーバ？

## 調査

### アプライアンスサーバ とは

特定の機能や用途に特化したサーバ製品のことを総称してアプライアンスサーバと呼ばれます。
日本語では単機能サーバとも呼ばれます。

あるサーバをwebサーバ専用にしたからと言ってそれがアプライアンスサーバになるわけではなく、
多くの場合は用途に応じた機能がセットアップされた状態で出荷されるので
その機能専用のサーバというイメージです。
目的が限定されているので必要なスペックが強化しやすいのが特徴です。

### アプライアンスサーバの種類

webサーバやキャッシュサーバ、メールサーバなどがあります。
ほかにもファイヤーウォールやロードバランサーなども存在します。

### アプライアンスサーバのメリット

- 低コスト

シンプルなので、他の汎用サーバより導入コストを削減することが可能です。

- 導入・運用が簡単

予め必要なものが組み込まれた状態で購入するので
導入、また運用も汎用サーバより容易にできます。

## 勉強後イメージ

APサーバの逆的な感じ？

## 参考

- [アプライアンスサーバ 【appliance server】 単機能サーバ](https://e-words.jp/w/%E3%82%A2%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%90.html)
- [アプライアンスサーバー](https://www.otsuka-shokai.co.jp/words/appliance-server.html)
ダイアログのエンジニア新人研修を受けてみて

## はじめに
この記事では、株式会社ダイアログのエンジニア新人研修を受けて、その内容や感じたことを記録しています。
ダイアログでは2022年入社から新卒採用を開始したため、エンジニア新人研修も初めての取り組みとなっています。


## 自己紹介
2022年4月より株式会社ダイアログに入社した者です。
2021年に大学を卒業し、新卒入社した会社ではエンジニアとはあまり接点のない仕事をしていました。そのため、エンジニア業務未経験者としてダイアログに入社しました。
入社後は一ヶ月ほど新卒の社員の方々と一緒に全職種共通の新人研修を受講させていただき、5月からエンジニアチームに配属されました。
配属後、一ヶ月半ほどのエンジニア新人研修を受けて、その後はOJTでプロジェクトにアサインされていく予定となっています。



## 研修内容

### 概要
研修内容は以下の通りです。
①paizaラーニング
②社内製品に関する研修
③その他講義形式の研修
④質問会や1on1

### paizaラーニング
まずは基礎的なプログラミングの知識をつけるためにオンラインプログラミング講座の「paizaラーニング」を受講しました。
paizaでは様々な言語の入門的な内容を学べるよう、数多くの講座が用意されています。
弊社の新人研修で受講した講座は以下の通りです。

* Webデザイン入門編
* HTML/CSS入門編
* JavaScript入門編
* Git入門編
* Web技術入門編
* 新・SQL入門編
* シェルコマンド入門編
* Linux入門編
* PHP入門編
* Webアプリ開発入門 PHP-Web編
* Webアプリ開発入門 Laravel編
* Webセキュリティ入門編

これらのpaiza講座を受講して、以下のことを感じました。
* 動画＋演習問題で、自身でコーディングする力が身に付く
* 短期間で様々な言語を学べる
* 動画の内容であまりよく理解していない点があっても、スルーしてしまいがち（流し見）になる時がある
* 講座によっては、全くの初心者が理解するには難しい内容がある

paizaは解説動画を見ながら同じ画面上にあるpaizaOS環境で手を動かしながら進めます。各動画は3~6分ほどの内容になっていて、視聴が終わると動画の内容とほぼ同じような演習問題を解き、正解したら次の動画視聴に進むという流れです。
環境構築せずにレッスンを始めることができるため、様々な言語や技術を浅く広く学びたい方にはおすすめできると思います。

一方で、動画内のコーディングのスピードが速い時があり、一時停止や巻き戻しをしないと追いつけなくなることがありました。また、あまり説明のない関数などが急にコーディング中に出てくる（さらっと説明があったかもしれないが全部は記憶しきれず）こともあり、コード全体を理解するのに時間がかかってしまった講座がありました。このため、講座によっては全くの初心者がpaizaだけで全てを理解するのは難しいと感じました。<br>
私が特に初心者には理解が難しいと感じたのは以下の講座です。

* Git入門編
* シェルコマンド入門編

これらはオンラインプログラミング講座のProgateや先輩社員への質問会を使って、別途理解を深めました。



### 社内製品に関する研修
ダイアログは、倉庫管理システム（＝WMS）が主力製品となっています。
このWMSに関する以下の社内研修がありました。

* 操作に関する研修
* ER図に関する研修
* インフラ研修
* スマホアプリ研修

どの研修も、実際に手を動かす実践形式ではなく、資料に沿って説明を聞く形式のものでした。
実務に入る前に概要を理解するための研修があることで、開発業務のイメージがつき、実務で活きてくるのではないかと思います。
しかし、話を聞いて理解できるのと、自分で手を動かしてできるのは違うため、プロジェクトにアサインされた際には、研修で学んだことを思い出しながら自力でできるようにしていくことが重要だと感じました。（これから頑張ります。）

### その他の講義形式の研修

* オリエンテーション
* 情報発信に関する研修
* チーム内での自己紹介

情報発信についての研修では、Qiitaや[twitter](https://twitter.com/dialog_techteam)などの運用についての話がありました。
この情報発信に関する研修を受けて、会社として情報を外部に発信していくことのメリット（エンジニア採用などにつながるなど）や情報発信のやり方を学びました。私も含めて、この研修を受けたことにより、早いうちから情報発信に興味を持つ社員が増えたため、会社の発信力がさらに高まっていくことに繋がるのではないかと思いました。

### 質問会や1on1
毎日30分間、質問会または1on1がありました。
当初は質問会はなく、研修でわからないことがあればチーム内のチャットで新入社員が質問文を送り、先輩社員からチャット内で返答をもらうという方式をとっていました。しかし、質問事項が多かったり、文章での質問のやり取りだと伝わりづらいという意見が出たことにより、オンライン会議形式での質問会を実施していただけることになりました。
質問会の時間が設置されたことにより、質問のやりとりがスムーズになっただけではなく、質問に付随した疑問点や回答を聞いてさらに疑問に思ったことなどをその場ですぐに聞けるようになり、プログラミングの理解がより深まったと思います。

また、ダイアログのエンジニアチームではリモートワークがメインとなっているため、新入社員の中ではチームの方々とどのようにコミュニケーションを取れば良いのか分からないという声が上がっていました。
この課題も、質問会や1on1を毎日どこかに組み込んでいただいたことにより、先輩方と様々な話をする機会ができ、小さな悩みや疑問も相談できる関係性が構築しやすくなったことによって解消されたと思います。

## 最後に
以上がダイアログのエンジニア新人研修のまとめです。
新入社員からの視点で新人研修について思ったことを改善点も含めて書かせていただいたので、何か参考になることがあれば幸いです。
また、今回初めての未経験者受け入れにも関わらず、様々な研修コンテンツを企画してくださった先輩方に改めて感謝申し上げます。
PowerShell の Install-Module でエラーが発生する「このオブジェクトにプロパティ 'ValidAuthenticodeSignatureInFile' が見つかりません」

# 現象

PowerShell で`Install-Module`を実行したら以下のようなエラーが発生したインストールに失敗しました。

```powershell
PackageManagement\Install-Package : このオブジェクトにプロパティ 'ValidAuthenticodeSignatureInFile' が見つかりません。
プロパティが存在することを確認してください。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1772 文字:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exce
   ption
    + FullyQualifiedErrorId : PropertyNotFoundStrict,ValidateAndGet-AuthenticodeSignature,Microsoft.PowerShell.Package
   Management.Cmdlets.InstallPackage
```

# 発生条件
- OS：Windows Server 2016（1607）
- PowerShell バージョン： 5.1.14393.5066
- PowerShellGet バージョン：1.0.0.1
- PackageManagement バージョン：1.0.0.1

# 解決策

:::note info
`Install-Module`に`-SkipPublisherCheck`オプションを付与して実行した。
:::

```powershell
Install-Module <Name> -Force -SkipPublisherCheck
```

このオプションは以下の場合に使用するもののようなので、非推奨なやり方かもしれません。

> 既存のモジュールが信頼できる発行元によってデジタル署名されているが、新しいバージョンが信頼できる発行元によってデジタル署名されていない場合です。

https://docs.microsoft.com/ja-jp/powershell/module/powershellget/install-module?view=powershell-5.1
GitHubがパスワード認証の際にエラーが発生したときの対処法

## 症状
いつものようにgitbashでwebアプリのコードをgithubにアップしようと思ってパスワードを入力したところ以下のメッセージが出ました。😲
```bash:gitbash
$ git remote add githuborigin https://github.com/ユーザーネーム/リポジトリ名.git
$ git push githuborigin master
Username for 'https://github.com': ユーザー名
Password for 'https://username@github.com': ここでパスワードを入力

#この下からエラー文
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/ユーザーネーム/リポジトリ名.git/'
```

## 原因
パスワード認証は2021年8月13日をもって使用できなくなったから


## 解決法 　SSH認証かアクセストークン認証をする
今回は簡単なアクセストークン認証ご紹介します♪
## アクセストークンでの認証方法
1. 以下でアクセストークンを取得する画面へ
　[アクセストークン取得](https://github.com/settings/tokens )
2. 項目蘭の[repo] にチェックを入れ[Generate new token]をクリック
3.トークンをコピー　!!(ページを離れると再び見ることができなるなるので注意)！
4. 今まで使っていたパスワードの代わりに使用します

## 使用例
```bash:使用例
$ git remote add githuborigin https://github.com/ユーザーネーム/リポジトリ名.git
$ git push githuborigin master
Username for 'https://github.com': ユーザー名
Password for 'https://username@github.com': ここに取得したアクセストークンを入力
```
以上です
Mampデータベース共有化　Dropbox var.

# Mampのデータベースを共有化　Dropbox var.

Worpressをローカル環境で複数のデバイスで管理する際、時間がかかってしまった為
備忘録として残します。

## 手順の流れ
1. mampのデータベースのバックアップ
2. 共有したいデータベースをDropbox配下に移動
3. ターミナルでシンボリックリンクの設定
4. mamp再起動

## 1. mampのデータベースのバックアップ
まず、はじめにバックアップを作成します。

`/Applications/MAMP/db/mysql57`
mysqlのデータベースファイルが上記の階層にあるので`mysql57_bak`と言う名前で　バックアップを取ります。

[![Image from Gyazo](https://i.gyazo.com/afd395a6ef7e2709159111870af177b6.png)](https://gyazo.com/afd395a6ef7e2709159111870af177b6)

## 2. 共有したいデータベースをDropbox配下に移動
元の`mysql57`フォルダをDropbox配下に移動します。

## 3. ターミナルでシンボリックリンクの設定

```:ターミナル
ln -s /Users/ユーザー名/Dropbox/mysql57 /Applications/MAMP/db/mysql57

```
上記を実行することで
mampを起動した際、mysqlの接続の為`/Applications/MAMP/db/mysql57`にアクセスし
シンボリックリンクを介し`/Users/ユーザー名/Dropbox/mysql57`に最終的にアクセスします。

※補足
シンボリックリンク（lnコマンド）とはファイルやディレクトリのリンクを作成するコマンドです。
windowsのショートカットやMacのエイリアスのように、異なる場所から異なる名称でアクセスすることができます。

今回の場合は
`ln -s　　/共通で参照したいファイル名・位置/  半角スペース /共有元にするファイル名・位置/`

## 4. mamp再起動

最後にmampの再起動をしてください以上となります。
5.17 (標準) 順序統計量6

## 答案

![5.-28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/e654a07f-6636-41ba-0c60-88fad9614c60.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
テクニカルレポート：Unity Perception: Generate Synthetic Data for Computer Vision


## Info
- タイトル：Unity Perception: Generate Synthetic Data for Computer Vision
- 著者：Steve Borkman, Adam Crespi, Saurav Dhakad, Sujoy Ganguly, Jonathan Hogins, You-Cyuan Jhang, Mohsen Kamalzadeh, Bowen Li, Steven Leal, Pete Parisi, Cesar Romero, Wesley Smith, Alex Thaman, Samuel Warren, Nupur Yadav
- 論文：https://arxiv.org/abs/2107.04259
- プロジェクトページ：https://github.com/Unity-Technologies/com.unity.perception

## 概要
- Unity Editorとエンジンコンポーネントを拡張し、アノテーションを施したデータセットを生成するツールを紹介する。
- 拡張可能なランダム化フレームワークを提供する。データセットにバリエーションを持たせるためのランダム化のシミュレーションパラメータを簡単に設定することができる。

## 背景
- ディープラーニングのタスクが複雑になるにつれてアノテーションも複雑になり、レビューが必要になるなどデータ構築コストは増大していく。
- EUのGDPRやカリフォルニアのCCPAなど、プライバシー保護関係の法整備により、ユーザーのデータを使用することが難しくなっている。
- バーチャルなデータ生成環境があれば、アノテーションコストを削減でき、プライバシーの問題も発生しない。

## 手法
Perceptionではボックス、セグメンテーション、キーポイントのアノテーションを利用可能。フレームワークに沿ってスクリプトを書くことで、機能を拡張することもできる。

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/d5cd953b-f06b-8fc1-f6e1-63c2b69acf39.png">

<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/01f4a7b9-ac86-6288-23de-94d189d2af90.png">

データの生成はシナリオと呼ばれるエンティティとランダマイザーと呼ばれるエンティティで構成される。ランダマイザーはランダム化のための環境パラメータを持ち、物体の配置や物体の回転等を生成する。シナリオは全てのランダマイザーを順番に実行する制御の役割を持つ。シナリオとランダマイザーはベースのクラスを継承して自分で拡張することができる。

<img width="200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/10a53756-3c4e-b667-1645-60f0c8534bfa.png">

データ生成はローカルコンピュータのUnity Editorでも実行できるし、クラウド計算環境サービスであるUnity Simulationでも実行できる。クラウド環境は大規模な並列計算環境で、大規模データセットを構築に向いている。並列計算ではあるが、決定論的なランダムサンプリングとランダム化の順序付けにより、生成されたデータの再現性が担保されている。

Perceptionパッケージに加えて、DatasetInsights3という付属のPythonパッケージが提供されている。データセットの統計情報の生成と可視化が可能。

## サンプルプロジェクト

プロジェクトSynthDetを行った。63種類の日用品の物体検出で、人工データと実データを使用して比較を行った。モデルはFaster-RCNNを使用した。

### データセット

背景には位置・回転・色相・テクスチャをランダムに決定したシンプル形状の物体を配置した。前景には位置・回転・スケールをランダムに決定した日用品オブジェクトを配置した。前景のさらに前の位置には、少数のオブジェクトを配置してオクルージョンが発生するにようにした。また、照明にもランダム要素を加え、出力画像にはblurなどもランダムに加えた。

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/5e02b25f-0731-0d50-5dea-2a537fb69883.png">

人工データは400,000枚、実データは1,267枚用意した。

### 学習戦略
ResNet50(pretrained ImageNet)をbackboneとして、3つの学習戦略を比較した。

1. 実データのみ学習に使用。実データを6:2:2=760:253:254で分け、それぞれ学習、バリデーション、テストに使用する。ミニバッチは8で、100epoch学習。
2. 人工データのみ学習に使用。90%を学習、残り10%をバリデーションに使用し、テストは戦略1と同じ。ミニバッチは4で、GPUを8個用意し10epoch学習。
3. 戦略2で学習したモデルを、760個からサンプルした実データでファインチューニング。ミニバッチは8で、30epoch学習。

### 評価

それぞれ5回繰り返して平均をとって精度を算出。表3左のmAPはIoU[0.5:0.95]の平均であることに注意。

<img width="800px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/6b5f5624-e1e3-ea05-18b6-f387842d8597.png">

また、人工データを増やしていった場合の精度比較も実施。

<img width="800px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/457c5eb7-43bf-a57d-d220-cc9c303efef2.png">


## まとめ・感想
- 人工データで学習後、実データでのファインチューニングは必須に思える。
- 人口データを増やしすぎてもあまり効果はなさそう。実データが少ないとむしろ悪影響？
- ランダマイザーの拡張自体は容易だが、そもそもUnityに癖があって初心者はむしろUnityにとっつきにくい。
React初学者からみた最良のディレクトリ構造

こんにちは！最近、中華料理ばっかり食べてる話をしていたら「中華マン」というあだ名を
つけられました、中華マンことゆーだいです。

今回は、ReactでTodoアプリを作る際に、どのようなディレクトリ構造がベストなのかについて疑問に思ったので記事にしました。


# とりま、Google先生に聞いてみる
この手の話題は、既にパイオニアの方々が答えを導き出しているに違いない！と思い、Google先生に英語と日本語でそれぞれ聞いてみました！

SEOがトップの高い記事が一番信頼が厚いという信用のない考えから、言語別検索のトップ３の記事に辿り着きました。

#### 日本語検索：「react ディレクトリ 構造 ベスト」
[zenn：Reactベストプラクティスの宝庫！「bulletproof-react」が勉強になりすぎる件](https://zenn.dev/meijin/articles/bulletproof-react-is-best-architecture)
[Qitta：【個人的】 React ディレクトリ構成 のベストプラクティス](https://qiita.com/tk-r1d3r/items/aec311c78846f7c9bf04)
[Qitta：Reactのディレクトリ構成どうしてる？](https://qiita.com/Sotq_17/items/7c7ab9880597336b3ee5)

#### 英語検索：「react file structure best」
[TatvaSoft：REACT BEST PRACTICES AND SECURITY](https://www.tatvasoft.com/blog/reactjs-best-practices/)
[React公式様:File Structure](https://reactjs.org/docs/faq-structure.html)
[onoufriosm:React best practices-React at scale (Part 2)](https://onoufriosm.medium.com/react-best-practices-react-at-scale-part-2-11b69b96f5e)

どの記事も身が詰まった良記事なので、気になった方は、ぜひぜひ上記のリンクからアクセスして欲しいです🙇‍♂️

# 記事から得た自分が思う最強のディレクトリ構造！！！
```xml
my-app
　　L node_modules
　　L public
　　　　L index.html
　　L src
　　　　L __tests__
　　　　L assets
　　　　L components
　　　　L modules
　　　　　　　　　L auth
　　　　　　　　　　　　　L components
　　　　　　　　　　　　　L api
　　　　　　　　　　　　　L pages
　　　　　　　　　　　　　  L index.js
　　　　　　　　　L tasks
　　　　　　　　　L \...etc
　　　　L api
```
あくまで自分が使いやすいベストプラクティスを優先したフォルダ構造にしてみました！
src以下のディレクトについて説明します！

### modules
> 今回の一番のキモ！！！reactの各機能をベースにモジュール化したフォルダ
中には、部分的に共有化したいcomoponentsやロジック的に分離したいapiやpagesに細分化されているため
ページ数の肥大化に耐えられる堅牢なディレクトリ構造になっているのではないかと感じた。

### \__tests__
> テストファイルを格納するためのフォルダ
拡張子が.spec.js or .test.jsもしくは\__tests__にテストファイルを格納しているだけでJestがファイルを見つけてくれる！

### assets
> HTML/CSSをハードコーディングしていた時代の人からすると懐かしの駄菓子屋さんのような存在
faviconや画像などのその他もろもろのアセットを入れるためのファイル

### components
> 繰り返し使用される共通のコンポーネント格納するためのフォルダ
例：ヘッダー(App bar)、テキストフィールド、ボタンなど
デザイン規格が厳密なMaterial Designなどを採用していると全ての共通するcomponentsも多いはず

以上！調査する以前は、src直下にpagesフォルダを置いていたので、
ロジック的にもグループ化に近い構造を学べてかなり気持ちがいいです！

# 最後に
これはあくまで、React初学者がなんとなくの使い勝手で理解したものです！
俺が考えた最強のディレクトリ構造をお持ちの方は是非是非コメントに記入して貰えると嬉しいです！

また、この膨大なネットの海でご縁があることを期待しています！

```:攻殻機動隊 STAND ALONE COMPLEX ５話より
コードを書きたいって囁くのよ
あたしの、ゴーストが
```
Wordpress カスタム投稿でページネーションの2ページ目以降が404になる

カスタム投稿の一覧（archive-xxx（カスタム投稿タイプ名）.php）で、サブループのposts_per_pageで1ページの表示件数を設定すると、表示件数には問題ないけど、ページネーションの2ページ目以降が404になってしまう事がある。

条件は
管理画面＞表示設定＞1ページに表示する最大投稿数　が、posts_per_pageより大きい場合。

https://meshikui.com/2019/02/25/1537/

カスタム投稿ごとに、functions.phpにposts_per_pageを書く。
そして、archive-xxx.phpにはposts_per_pageを書かない。

やろうと思えばfunctions.phpにまとめて書けそうな気がするが、とりあえずこれで解決。
【基本情報技術者】IPアドレス

基本情報技術者試験の分野「IPアドレス」についてご紹介いたします。

## IPアドレス
**IPアドレスは、TCP/IPネットワーク上にある端末やネットワーク機器を識別するための番号**。現在広く使われているのは、IPv4で、IPアドレスは、2進数32ビットで構成されていて、8ビットずつを10進数に変換して表記している。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/9a503a0a-81a0-53a7-8257-a1535433080f.png)
IPアドレスは、「192.218.88.180」です。

## ドメイン名
**ドメイン名**は、IPアドレスを人が理解しやすいよう英字、数字、記号を使って文字列に置き換えた別名。**「インターネット上の住所」にあたり、電子メールを送ったり、ホームページを見たりする時に相手がインターネット上のどこにいるかを特定する**ためのものです。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/cf11009e-a7e1-f2ac-c0d1-5ca571741a43.png)

### ホスト名
**ネットワーク上のコンピュータを人が識別しやすいように付けられた名前**のことで、URLの中では「ホスト名＋ドメイン名」のように、ドメイン名の前に位置します。
**ホスト名＋ドメイン名のような形式をFQDN**(Fully Qualified Domain Name)と呼ぶ。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/410be375-450f-edfa-6ef6-420ac12a1fbd.png)

## DNS(Domain Name System)
**DNSは、ドメイン名とホスト名などとIPアドレスを対応付けるシステムのこと。ドメインとIPアドレスを相互に変換してくれるシステム（サーバー）のこと**をいいます。
DNSサーバに「〇〇サイトのIPアドレスは？」と尋ねるとDNSサーバは、「192.〇〇〇.××.180」と答えてくれる。ドメイン名からIPアドレスを取得する。これを**名前解決**という。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/ed8c6f5d-8900-046f-2e56-b052f3fe32c0.png)

## グローバルIPアドレスとプライベートIPアドレス
IPアドレスは、グローバルIPアドレスとプライベートIPアドレスの2つに大別される。
**グローバルIPアドレスは、インターネットで使用するIPアドレス**です。
**プライベートIPアドレスは、LANなどの独立したネットワークで使用するIPアドレス**です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/728ea22e-a681-eddb-82b8-6843225c90d8.png)

### DHCP
DHCP（Dynamic Host Configuration Protocol）とは、インターネットに接続されたコンピュータなどに対して、**IPアドレスをPC起動時などに自動的に割り当てるプロトコル**。
### NAT
**NAT**（Network Address Translation）は、ネットワークアドレス変換とも呼ばれ**1つのプライベートIPアドレスと1つのグローバルIPアドレスに相互変換する技術とされています**。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/2fe8b72d-32c0-f32f-7ec0-79103fe48662.png)

### NAPT
**NAPT**（Network Address Port Translation）は、**1つのプライベートIPアドレスと複数のグローバルIPアドレスに相互変換する技術とされています**。
**IPマスカレード**とも呼ばれている。
【React】RechartsのResponsiveContainerでウィンドウを小さくするときだけwidthが再計算されない問題について

## 発生した問題
- ReactライブラリであるRechartsのResponsiveContainerコンポーネントを使用。
- ブラウザ幅に応じてチャートの大きさを変更したい。
- ブラウザのウィンドウを大きくするときは再計算されるが、ウィンドウを小さくする時は再計算されない。

## こんな感じ
![anime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006362/6672a5f4-a3d6-05a2-8537-2c3589f519e4.gif)

※いま、趣味で作っているWebサービスです。

## 原因
こちらの[issue](https://github.com/recharts/recharts/issues/172)で同問題が報告されていました。

フレックスボックスを使い、ResponsiveContainerの親要素がフレックスアイテムになると生じるとのこと。

どうやら、ResponsiveContainerの親要素のwidthが明示的に指定されていないと、Rechartsの再計算ができないみたい。

## 解決策
ResponsiveContainerの親要素に`width:0;`を追加する。
※上記のgif画像参考

```react
//Material-ui使用
<Container maxWidth="lg" sx={{ mt: 6, display: 'flex' }}>
  <Box>
    <Formula />
  </Box>
  <Box sx={{ flexGrow: 1, ml: 6 ,width:0}}>{/*widthを追加 */}
    <Chart />
  </Box>
</Container>
```

なお、issueを解決する上で紹介されていたstackoverflowは下記。
https://stackoverflow.com/questions/7985021/css-flexbox-issue-why-is-the-width-of-my-flexchildren-affected-by-their-content
Github草問題について

## 草が生える条件

コミットに使用されるメールアドレスがGitHubアカウントと連携されていること
フォークされたリポジトリではなく、独立したリポジトリでコミットされること
デフォルトブランチもしくはProject Pages sitesでのコミットであること

## 草が生えるタイミング

- 原則コミットから24時間が経ってから
- デフォルトブランチにブランチをマージすると即時に草が生える
- デフォルト以外のブランチにpushしても草は生えない（大体の場合はmainがデフォルトブランチに設定されているが、githubからデフォルトブランチを変更することも可能）ブランチをデフォルトブランチにマージするタイミングで草の反映がされる

## 草が生えていない質問をもらった時に確認すること

- 最後のコミットから24時間が経っているかの確認（git log）
- push先がデフォルトのブランチになっているか
- フォークされたリポジトリではないか
- $ git config user.email で出力されたメールアドレスとgithub上に登録しているメールアドレスの登録が一致しているか。（メールアドレスは設定から複数登録可能）
未公開のリポジトリでなおかつ草を生やさない設定になっていないか

Githubのメールアドレスの紐付け方法
```
## 紐づいているのかを確認する
$ git config user.email
-> 紐づいていればメールアドレスが出力される。（間違っている可能性もあるため一致するかを確認する　ex. example@gmali.comでgmailのスペルが間違っていることがあった）

## メールアドレスの修正補法
$ git config --global user.email 登録したいメールアドレス
```

そのコミットにemailが紐づいてるかを確認する方法


[こちら](https://qiita.com/ko-he-8/items/519c72c6eb4daccba871)の方が書かれている記事がかなりわかりやすかったです。

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/viewing-contributions-on-your-profile
5.16 (標準) 順序統計量5

## 方針

(1)は5.14とほぼ同じ．(2)は分布収束の問題でCLTは関係なさそうなので分布関数から考える．

## 答案

![5.-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/f8442d96-936e-aec1-5123-1b4ccea30f9c.jpeg)
![5.-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/0a239b8b-a367-df83-9d77-0354a39b1d2e.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads() の解決法

###### 環境
- Windows 10 Pro(ホストOS)
  - VMware Workstation 16 Player 16.2.3
    - Ubuntu 22.04 LTS(ゲストOS)
    - Hadoop 3.3.3
    - openjdk version 11.0.15

###### 検証
1.下記コマンドを実行
```
hadoop jar share/hadoop/tools/lib/hadoop-streaming-3.3.3.jar -files /var/tmp/mapper.py,/var/tmp/reducer.py -mapper /var/tmp/mapper.py -reducer /var/tmp/reducer.py -input /user/hadoop/input.txt -output /user/hadoop/pythonOutput
```
```/var/tmp/mapper.py
#!/usr/bin/env python
import sys

for l in sys.stdin:
    for word in l.strip().split(): print('{0}\t1'.format(word))
```
```/var/tmp/reducer.py
#!/usr/bin/env python
from collections import defaultdict
from operator import itemgetter
import sys

wordcount_dict = defaultdict(int)

for line in sys.stdin:
    word, count = line.strip().split('\t')
    wordcount_dict[word] += int(count)

for word, count in sorted(wordcount_dict.items(), key=itemgetter(0)):
    print('{0}\t{1}'.format(word, count))
```
```/user/hadoop/input.txtの中身
hadoop fs -cat /user/hadoop/input.txt
a b b c c c
```

2.以下のエラーが発生
```
                                            ・
                                            ・
                                            ・
2022-06-09 00:17:52,964 INFO mapreduce.Job: Task Id : attempt_1654688981443_0018_m_000000_0, Status : FAILED
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 127
	at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:326)
	at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:539)
	at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130)
	at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)
	at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
	at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:466)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:350)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:178)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/javax.security.auth.Subject.doAs(Subject.java:423)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:172)
                                           ・
                                           ・
                                           ・
```
3.コマンドを修正し実行
```
hadoop fs -rm -r /user/hadoop/pythonOutput
hadoop jar share/hadoop/tools/lib/hadoop-streaming-3.3.3.jar -files /var/tmp/mapper.py,/var/tmp/reducer.py -mapper "python3 /var/tmp/mapper.py" -reducer "python3 /var/tmp/reducer.py" -input /user/hadoop/input.txt -output /user/hadoop/pythonOutput
```
4.結果確認
```
hadoop fs -cat /user/hadoop/pythonOutput/*
a	1
b	2
c	3
```
GAのクロスドメイントラッキング用の_gaパラメータが付かない時に手動で付ける方法

# 前提
* GAのクロスドメイントラッキング用のGA・GTMの設定はされている
* GAのクロスドメイントラッキングではURLに_gaパラメータが付く事を知っている
```
https://example-pet-store.com/?_ga=........
```

# 内容
## そもそも _gaパラメータが自動で付く条件はどんな時か
答え: リンクやフォームの遷移先のドメインが違う時

ここで言う「ドメインが違う」はサブドメインは含みません
* example.com と example-pet-store.com はドメインが違う
* example.com と example2.co.jp はドメインが違う
* example.com と sub.example.com はドメインは一緒（サブドメインが違う）
    * サブドメインが違う場合はこの記事の方法ではなく cookieDomain の設定の方が簡単です

## _gaパラメータが付かない遷移の仕方

1. ドメイン「example.com」に存在するLP
2. ドメイン「example.com」に存在する「example-pet-store.com」にリダイレクトするPHP（Ruby、PythonでもWebサーバでも一緒）
3. ドメイン「example-pet-store.com」に存在する登録フォーム


## _gaパラメータが付かない理由

* 1と2はドメインが一緒なので付かない
* 2と3は2がPHP（サーバーサイド）のリダイレクトなのでHTMLは存在せず、HTMLの中で動くGTM・GAももちろん動かないので _gaパラメータ は付かない

## _gaパラメータを手動で付ける方法
2と3の間では絶対に _gaパラメータ を付けれないので、1と2の間で手動で _gaパラメータ を付ける方法がないかなと探したら `decorate` という手動で付ける方法がありました。

### GAで手動で付ける方法
下記公式のドキュメントで説明されています。
後述のGTMの方法よりやっている事はわかりやすいです。

> リンカー パラメータの手動追加
> https://developers.google.com/analytics/devguides/collection/analyticsjs/linker?hl=ja#manually_adding_linker_parameters

### GTMで手動で付ける方法
下記は対象のリンククリック時に _gaパラメータ を付ける設定です

#### タグの設定
* タグの種類
    * `Google アナリティクス: ユニバーサルアナリティクス`
* トラッキングタイプ
    * `リンクを装飾`
* 区切り文字としてハッシュを使用
    * `偽`
* Googleアナリティクス設定
    * {UAのトラッキングIDを設定した変数}

![スクリーンショット 2022-06-08 16.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131603/88b8ea47-6a16-85dc-84ab-1a6e7493d6a0.png)

#### トリガーの設定
_gaパラメータ を付けたいリンクのクリックを条件としたトリガーを設定します
クリックイベントを計測する時のトリガーと同様です
（記事の本筋じゃないので詳細は省略）

#### フォームの場合
リンクではなくフォームの場合はトラッキングタイプ「フォームをデコレート」を使います。

## リダイレクトで_gaパラメータを引き継ぐ必要もある
上記で1と2で_gaパラメータが付くようになりますが、2と3で_gaパラメータが引き継がれないとクロスドメイントラッキングが成立しないので、リダイレクト時に引き継がれるようにすることも必要になります。

## ちょっとした罠
使用するトラッキングタイプが

* `リンクを装飾`
* `フォームをデコレート`

ですが、英語の選択肢だと

* `Decorate Link`
* `Decorate Form`

となっていて「Decorate」が「装飾」と「デコレート」と訳され方が違います。
調査した時に最初に英語の情報に辿り着いたので、同じ選択肢と気づくのに少し時間がかかりました。
 `decorate` という仕組みなので「デコレート」で統一してほしかった。。。

# 参考
https://www.simoahava.com/analytics/decorate-links-decorate-forms-tags/
https://sem-technology.info/blog/posts/00128/
kintoneアプリのアプリIDを取得する。

# どうして必要か？
 kintoneアプリをテンプレート化して、アプリテンプレートからアプリを作成するとアプリIDが新たに採番されます。一方でkintoneのREST APIを使用して別画面（外部アプリ）のデータ参照/更新するには対象アプリのアプリIDが必要です。環境ごとのコード修正を回避したい場合、どうにかして外部アプリのアプリIDを取得する必要があります。

# どうするか？
kintoneのルックアップと関連レコードには、参照先のアプリIDが取得できるAPIがあるのでそれを使用します。

・ルックアップの場合
関連付けるアプリに、アプリIDを取得したい外部アプリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355999/e2d3bf55-a471-e4a3-9157-a7dec017bc2d.png)
・関連レコードの場合
参照するアプリに、アプリIDを取得したい外部アプリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355999/a08350bc-8b36-04b9-93ff-3a522358b2b6.png)
・Javascript
ルックアップの場合はgetLookupTargetAppId()、関連レコードの場合はgetRelatedRecordsTargetAppId()でアプリIDを取得できます。

```get_appid.js
(function() {
    "use strict";
    var events = [
        // レコード追加画面表示時、レコード詳細画面表示時、編集画面表示時
        'app.record.create.show',
        'app.record.detail.show',
        'app.record.edit.show'
    ];
    var handler_submit = function(event) {
        // ルックアップフィールドの参照先アプリIDを取得
        var lookupid = kintone.app.getLookupTargetAppId('ルックアップ');
        console.log("ルックアップの参照先アプリID:" + lookupid);

        // 関連レコード一覧の参照先アプリIDを取得
        var relatedid = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧');
        console.log("関連レコードの参照先アプリID:" + relatedid);
    };  
    kintone.events.on(events, handler_submit);
})();
```
# 最後に
今回の方法では、ルックアップや関連レコードで紐づいていない外部アプリのアプリIDは取得できません。画面上の入出力に使用しない項目を追加するのに抵抗のある方もいらっしゃるかもしれませんが、ルックアップ関連レコード項目を使用しない画面でも、一旦紐付けを行った上で項目を非表示化することができますので、検討してみてください。
Power BIのレポートをPower Pointにエクスポートしてみた

Power BI ServiceにあるレポートをPower Pointに埋め込む新機能が出たらしくて（22年5月時点）それを試してみました。
本記事書いてあるものはすべて個人見解で、あくまで自分で試した結果を興味ある方と共有したいだけです。
ちなみに本人の作業環境はMicrosoft 365 Business Standard PlanとPower BI Proのライセンスが持っています。

ではまずPower BIクラウドのほうを開きます。Power Pointを選んだら二つ選択肢あるんです。
![060801.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/5aefbe7e-35b8-b0c2-4707-afe265e803b3.jpeg)

「画像を埋め込む」にしますと、レポートそのままがPower Pointファイルとして保存しました。それを開くと、![060801.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/86166cce-a4be-ab1b-2f02-5272c45fa0c3.jpeg)

次に、二番目のエクスポートをやっていきます。「ライブデータを埋め込む」を選択します。
![060802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/f0f7ac6c-2136-44f8-7c5d-f941973e0346.jpeg)
そして次の画面が出てきます。
![060802.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/7368f128-4d97-376c-b1c3-b714d22ae19c.jpeg)
「レポートページのリンク」をコピーで取っておきます。

先ほど取っていたリンクをPower Point に埋め込みたいので、Power Pointを開きます。
![060802.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/82dd5a61-d7a9-5bba-7a7b-e61848ff9003.jpeg)
「アドイン入手」を押しますと、数秒間かかる場合もあります。すべてのアドインが出てくるんで、Power BIを検索します。![060802.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/48665a92-44ed-74fc-e758-e268148f97ae.jpeg)
ここで混乱になりそうですが、ちゃんと二番目のMicrosoft Power BIを選択します。
![060802.3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/437b6cbf-b107-c110-dcae-6990f5e399a4.jpeg)
入手できたら今回またPower Pointに戻ると、
![060802.4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/300995f8-5138-45b0-ca69-1c92f92a8714.jpeg)
ここに追加ボダン押しますと![060802.5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/05ad1ac5-3328-7609-15b3-583fe2d454d6.jpeg)
最初に取ったリンクを貼ることができました！
ビジュアル反映するまで数秒間かかりましたが、出た瞬間感動しました。ちなみにこんな感じです：
![060802.8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875168/17b5a99e-f639-c996-07b1-c8f571083029.jpeg)
操作感はPower BIクラウドでとほぼ同じです。これでPower Pointでライブデータを見えるのも可能になりました。まだプレビューの機能ですが、これからもいろいろ機能更新に楽しみにしています。
css プロパティ、セレクタ

# CSSはどこに書くのか？
CSSは、HTMLとは別のファイルに記述

# セレクタ、プロパティは何を表すのか？
要素名を```セレクタ``、変更項目を```プロパティ```

# プロパティ（変更項目)の種類
## 要素の色を変える```color```

```css
h1 {
  /* 文字の色を#ff0000にしてください */
  color: #ff0000;
  
}
```
```:```で仕切り、```;```で終わらせる。

## 文字の大きさを変える```font-size```
```css
 font-size: 40px;
```
必ず```px```をつける。

## 文字の種類を変える```font-family```
```css
font-family: serif;(明朝体)
```
種類は覚える必要はない。

## 背景色を変える```background-color```
```css
background-color: #ffd800;
```

## 要素の横幅、高さを変更する```width(ウィズ）```,```height(ハイト)```
```css
  height: 80px;
  
  width: 200px;
```
go getがつかえない。（oapi-codegenのインストール）

# Goのバイナリを取得する。

oapi-codegenを使おうと思って、`go get`したら怒られました。

go 1.17以降は`go install`を使わないとだめそうです。

```
$ go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.8.2
go: go.mod file not found in current directory or any parent directory.
	'go get' is no longer supported outside a module.
	To build and install a command, use 'go install' with a version,
	like 'go install example.com/cmd@latest'
	For more information, see https://golang.org/doc/go-get-install-deprecation
	or run 'go help get' or 'go help install'.

```

メッセージの中にあるインフォメーションを見たら、
go modで使うものと、コマンドとして使うバイナリの両方で使うと混乱するから辞めたそうです。

こんな感じでコマンド実行してやればOK

```
$ go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.8.2
```


# oapi-codegenをコマンドに登録する

##### `go install` で手に入れたバイナリはどこにあるのか？

GOPATHに記載されたところに入っているらしい。
```
$ go env | grep PATH
GOPATH="/Users/[Username]/go"

$ ls /Users/[Username]/go/bin
oapi-codegen
```

##### .bash_profileの編集

```.bash_profile
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

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

# serverless (node)
export PATH="$HOME/code/sls/node_modules/.bin/:$PATH"
# awscli
export PATH="$HOME/Library/Python/3.7/bin/:$PATH"
# go
export PATH="$HOME/go/bin:$PATH"   ##←これを追加。
```

`source .bash_profile`でファイルを読み直したらコマンドが実行できるようになります。
SlackのWFBでスプレッドシートを編集した際、タイムスタンプを設定



今回、Slackのワークフロービルダー（以下WFBとよぶ）を使って、スプレッドシート（以下GSSとよぶ）を更新しました。その際に、タイムスタンプも併せて入力できるようにしました。


■前提条件
・SlackでWFBが作成されていること。
・WFBで入力した内容が、スプレッドシートに登録されること。


■ゴール
下記のように各セルにタイムスタンプと日付が入力されるようにします。

![タイムスタンプ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705860/858f0bec-6f3b-a75f-550d-34e120605291.png)

■やり方
編集するのは、拡張機能のApps Scriptを選択し、タイムスタンプと日付を入力できるようにコーディングしていきます。


```
function addTimeStampAndDate() {
  const rawSheet        = '日報';
  const headerRow       = 1;
  const timeStampColumn = 1;
  const dateColumn      = 2;
  const slackNameColumn = 3;
```

まずは、反映先シートやのセルを指定するために、変数に値を設定します。


```
  const sheet = SpreadsheetApp.getActiveSheet();
  const sheetName = sheet.getName();
```
そのあと、アクティブになっているシートを設定し、そこからシート名を取得します。

```
  if (sheetName !== rawSheet) return;

  const range = sheet.getActiveRange();
  const col   = range.getColumn();
  const row   = range.getRow();
```
アクティブになっているシートが編集するシート名でなければ、編集しないということでreturnを返しています。
日報のシート名であれば、そのシートの範囲を選択し、取得します。


```
  if (row === headerRow) return;

  const currentDate = new Date();
  const timeStamp   = Utilities.formatDate(currentDate, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
  const date        = Utilities.formatDate(currentDate, 'Asia/Tokyo', 'yyyy/MM/dd');

  const timeStampCell = sheet.getRange(row, timeStampColumn);
  const dateCell      = sheet.getRange(row, dateColumn);
  const slackNameCell      = sheet.getRange(row, slackNameColumn);
```


取得した行がヘッダーでなければ、タイムスタンプと日付を取得します。
さらに、繁栄先のセルを設定します。

```
  if (slackNameCell.isBlank()) return;

  if(timeStampCell.isBlank()) timeStampCell.setValue(timeStamp);
  if(dateCell.isBlank()) dateCell.setValue(date);
}
```
最終的には、繁栄先のセルがブランクであれば、タイムスタンプと日付を入れます。これで、Apps Scriptのトリガーを設定すれば、編集時に反映されるようになります。
Azure Storage v12 での非互換変更について

# Azure Storage v12 での非互換変更について

もう何度目だよという Azure Storage ライブラリのオーバーホールですが、今回ほどドツボにはまったのは初めてだったので記録を残します. というか、非互換変更がまとまっているページが見つからないので、他にもあるかもしれません.

GitHub のレポジトリに CHANGELOG.md や BreakingChanges.txt があるのですが、v12 以降の情報しか載ってなくて、肝心な v11 から v12 で何が変わったのかは全く分からないという…….

流石に無いわけがないだろと思うので、変更一覧ページの URL を知っている人がいたらコメントしてください. 情報お待ちしております.

## v11 ではデフォルトで上書きされていたのが、v12 ではエラーになるようになった

Microsoft.Azure.Storage.Blob v11 の Upload は既にブロブが存在していた場合に上書きするが、v12 ではデフォルトでは上書きされずに例外が飛ぶようになりました.

[Upload(Stream, Boolean, CancellationToken)](https://docs.microsoft.com/en-us/dotnet/api/azure.storage.blobs.blobclient.upload?view=azure-dotnet#azure-storage-blobs-blobclient-upload(system-io-stream-system-boolean-system-threading-cancellationtoken))

> The Upload(Stream, CancellationToken) operation creates a new block blob or throws if the blob already exists.

[UploadFromStream(Stream, AccessCondition, BlobRequestOptions, OperationContext)](https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.storage.blob.cloudblockblob.uploadfromstream?view=azure-dotnet-legacy#microsoft-azure-storage-blob-cloudblockblob-uploadfromstream(system-io-stream-microsoft-azure-storage-accesscondition-microsoft-azure-storage-blob-blobrequestoptions-microsoft-azure-storage-operationcontext))

> Uploads a stream to a block blob. If the blob already exists, it will be overwritten.

今まで通り上書きアップロードをしたい場合には、Upload に bool 型の overwrite 引数が追加されているので true を渡してください.

```
containerClient.GetBlobClient(blobName).Upload(fileStream, true);
```

## v11 ではデフォルトで Base64 エンコーディングされていたのが、v12 ではされなくなった

Microsoft.Azure.Storage.Queue v11 では送信メッセージがデフォルトで Base64 エンコーディングされていたのが、v12 ではされなくなりました.

[チュートリアル:.NET で Azure Queue Storage キューを操作する](https://docs.microsoft.com/ja-jp/azure/storage/queues/storage-tutorial-queues)

> v12 より前のバージョンの SDK でメッセージがキューに送信されると、自動的に Base64 でエンコードされます。 v12 以降では、この機能は削除されています。 v12 SDK を使用してメッセージを取得しても、自動的に Base64 デコードされることはありません。 コンテンツは、明示的に Base64 デコードする必要があります。

既に使っている人はバージョンアップでチュートリアルを見直したりなんてしないと思うんですが、他に書かれている場所見つからないんですよね…….

一番ひどいのは Microsoft が提供している Azure Functions や Azure App Service WebJobs の QueueTriggers は Base64 エンコーディングされていることを期待していて、プレーンで送信すると動きません. 普通は、デフォルトは Base64 エンコーディングするままで変えずに、性能が必要な人だけオプションでプレーン送信するよう変更するだろって思うんですけどねえ.

送信データを Base64 エンコーディングするには、`QueueServiceClient` の生成時に以下のオプションを設定します.

```cs
var serviceClient = new QueueServiceClient(connectionStrings, new QueueClientOptions()
{
    MessageEncoding = QueueMessageEncoding.Base64,
});
```
belongs_to,とhas_manyを使ったDBへの参照先指定( アソシエーション)


こんにちは。
modelはDBの情報を動かすために、DBに格納されている情報を引き出してくる役割がありますが、

今回は、アソシエーションの１：Nの関係を紐づけるときに使われる
has_manyとbelongs_toについてざっくりと掘り下げてみることにしました。

<h2>開発環境</h2>
<ul>
<li>Cloud9</li>
<li>Rails 6.1.4</li>
</ul>

<h2>ターミナルでの作業手順</h2>
１.rails g model コマンドでマイグレーションファイルの作成<br>
→マイグレーションファイルのテーブル内容を編集<br>
（この時点でテーブルはまだ作成されていない）

２.rails db:migrate
→マイグレーションファイルからテーブルを作成

<h2>belongs_toとhas_many</h2>
　例として、booksテーブルとUsersテーブルに格納されているデータがあります。

```Schema.rb
create_table "books", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.integer "user_id"
    :
  end
...
  create_table "users", force: :cascade do |t|
    :
    t.string "name"
    t.text "introduction"
    :
  end
```

```book.rb
belongs_to :user
```
belongs_toで、モデルに対応したテーブルに格納されている情報を参照先に指定しており
この場合、booksテーブルに格納されているuser_id（ここでは外部キーを省略できます）、
例えばuserIDが１だった場合、usersテーブルからuser_id1の情報を参照しています。

bookから見て、bookを投稿したuserは一人なので、
一つのuser_idを持つデータをUsersテーブルから参照しています。

```user.rb
has_many :books
```
has_manyでuserは複数book情報を持っており、booksテーブルを参照先に指定しています。
この場合、複数のbooksテーブルに格納されているレコード'title,　body,　user_id'を参照先に指定しており、
userは複数のbooksテーブルに格納されたレコードを参照できます。

userから見て、userはbookを複数投稿できて、
userは複数のbooksテーブルのレコードを参照先に指定しています。

```books_controller.rb
book.user
```
このような記述があった場合、booksテーブルに格納されているレコードの中のuser_idを参照している（かもしれないです）
5.15 (易) 順序統計量4 順序統計量のハザード関数

## 答案

![5.-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/8cb8effc-9c26-ed49-f92c-1e142394e828.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
5.14 (標準) 順序統計量3 順序統計量の同時分布

## 方針

全ての順序統計量の同時分布は，それぞれがx_1,...,x_nを取る組み合わせがn!通りあるので

```math
f_{X_{(1)},...,X_{(n)}}(x_1,...,x_n)=n!f_{X_1,...,X_n}(x_1,...,x_n)
```

である．

## 答案

![5.-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/dda1ba52-6ffd-53f0-376c-e64ef225c784.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
業績評価と経営管理システム

## 業績評価手法
### BSC(バランススコアカード)
<b>「財務」「顧客」「業務プロセス」「学習と成長」の四つの視点から、具体的に目標を設定して業績を評価する。

![バランススコアカード-bsc-の戦略マップの作成例-見本.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/06fbcc8a-c0de-1418-e25f-365acf6dd04b.jpeg)
<b><font color = blue>KGI</font> - 目指すべき最終的な目標となる数値
<font color = blue>KPI</font> - HGIを細分化した中間的な目標をなる数値
<font color = blue>CSF</font> - 最終目標を達成するために必要不可欠となる要因
### PDCA
<b>Plan -> Do -> Check -> Act を繰り返して継続的に改善していく手法
## 経営管理システム
### SCM(サプライチェーンマネジメント)
<b>生産・物流・販売の一連のプロセスを<font color = blue>サプライチェーン</font>という。
<font color = blue>SCM</font>はサプライチェーンの情報を一元管理し共有することで、業務プロセスの全体最適化を図る手法。
商品を受注してから納品するまでの期間を<font color = blue>リードタイム</font>という。
### CRM
<b>個別の顧客に関する情報や対応履歴などを一元管理し共有する事で、長期的な視点から顧客との良好な関係を築き、収益の拡大を図る手法。<font color = blue>顧客生涯価値</font>を向上させる事が目的。
### SFA
<b>個人が持つ営業に関する知識・ノウハウなどを一元管理し共有する事で、効率的・効果的に営業活動を支援する手法。
<font color = blue>コンタクト管理</font>がある。
### ERP
<b>企業の基幹業務の情報を一元管理し共有することで、企業の経営資源の最適化を図る手法。
### ナレッジマネジメント
<b>社員個人がビジネス活動から得た客観的な知識や経験、ノウハウなどを一元管理し共有する事で、全体の問題解決力を高める経営を行う手法。
JavaScriptで画面がPCサイズかスマホサイズか取得

基本的にメディアクエリ使えばええんやけど
デザインだけにとどまらず、ちょっとJSでこちゃこちゃしたい時がある
正しいやり方としては、window.matchMedia というのがあるらしい
https://coliss.com/articles/build-websites/operation/javascript/javascript-media-queries.html

なんかめんどくさそう

```JavaScript
let isPc;
let isSp;
window.addEventListener('resize', () => isSp = !(isPc = window.innerWidth >= 800));
```

もうちょっと複雑な条件の場合は、素直に window.matchMedia 使った方が良さげ
LF will be replaced by CRLFエラー

Gitbashでデータを作成し、Addしようとしたらこのようなエラーメッセージが出てしまい、Addができない。
![0607 git error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/e905ad96-42fc-583c-70f1-9aa90f0e0433.png)
Gitがデータの改行コードをLFからCRLFへ自動変更しようとするようなので、

解決策として
git config --global core.autoCRLF false
をしてこの機能を停止させることで解決できるようになる。

以降のAddもPushも問題なし。
Pull requestのConflictを解決する

Branch間Conflict：Pullされていない状態の2つ以上のCollaborationが異なるBranchで行われ（同じデータを異なる内容に編集・修正）、Pull requestされたときに発生。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/fc2359ca-8f71-2b1a-c94d-c2f0d3f98792.png)

ex)Main branchとMain以外のBranch(no-al5) がConflictした時の解決策
Command lineをClickすると以下のように出る
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/2b1fdeac-b789-9a09-c327-d9471abc4b86.png)
git checkout main：Main branchへ移動
git pull：Main branchでPullする
git checkout no-al5：ConflictされたBranchに移動
git merge main：Main branchとのMerge作業で、以下で編集できるようになるので
![병합작업창.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/3e86b30c-d968-65fe-df5b-4dbc5b74532d.png)
データを修正する
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/9108acb6-7261-8747-9d74-8b50d6bb5a32.png)
修正後、
git commit -am "comment"
git push
git checkout main：Main branchに移動
git merge no-al5：最終修正されたno-al5とMain branchをMerge
git push
Conflictは解決、Mergeまで終わった
![최종.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/be54aa0a-2a88-abff-8403-fdc7863fb281.png)
M5stack きゃらっく作成方法

#きゃらっくとは？
英文字だと、charac ですね。
まあ、M5stackでキャラクターを動かしたい。でもどうするの？
難しすぎて．．．。

調べても、なかなか出てこないのを、ちょっとまとめています。

#環境
M5stack BASIC ＋SDカード16GB
PC Win10
Paint 
Arduino 1.8.19

#お絵描き
元絵は、なんでもいいのですが、
わかりやすいようにWin10の標準ペイントで書いてみます。

画像サイズは320x240で用意。
ネコの絵を書きます。
24bitBMPでface16_2で保存します。
![fig1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705751/8d0ec3c5-b871-6d13-3195-4e0428f90d15.jpeg)

これで、元絵は完成です。

ここから作業です。
目を切り取ります。eye16で保存
![fig101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705751/2d254a17-dfd5-b552-e5b7-6d3e9b1a9c33.jpeg)

目周辺を切り取ります。開始位置をメモって下さい。sp_eye16で保存します
![fig2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705751/9a13e870-61fc-d7c7-20d1-acc14f716b51.jpeg)

目を修正します。eye16.bmpを開いて、目の周辺を白(0xFFFF)で塗りつぶします。そして上書き保存
目周辺を修正します。sp_eye16.bmpを開いて、目を白目にします（0xFFFF)で塗りつぶします。
できたら、上書き保存。

あとは、下記サンプルコードで試してください。
コード最後に、M5Display.cppより、BMPから配列にいれる為、関数をコピペして、修正する必要があります

```c
#include <M5Stack.h>
#include "M5Display.h"


TFT_eSprite img   = TFT_eSprite(&M5.Lcd);
TFT_eSprite img2  = TFT_eSprite(&M5.Lcd);


int x = 57;
int y = 75;
int w = 135;


int flag = 0;


uint32_t sTime ;


void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Power.begin();

  M5.Lcd.setBrightness(30);
  M5.Lcd.clear();

  img.createSprite(250, 118); // 下記sp_eye16.bmpのpix値を入れる 値はファイル右クリックのプロバディ詳細に書いてある
  img2.createSprite(42, 70);  // eye16.bmpのpix値を入れる


  M5.Lcd.drawBmpFile(SD, "/img/face16_2.bmp", 0, 0);    //画面に描画
 
  drawBmpFile_saka(SD, "/img/sp_eye16.bmp", 0, 0, img); //ファイルからimgスプライトに描画

  drawBmpFile_saka(SD, "/img/eye16.bmp", 0, 0, img2);   //ファイルからimg2スプライトに描画

  face_up(); //スプライトを画面に描画コール
  sTime = millis();
}

void loop()
{
  if ((flag == 0) & (millis() - sTime > 1000)) {//1秒単位毎描画、"1000"を"random(10)*100"にすれば1秒～0.1秒で動く
    face_up();
    sTime = millis();
  }

}


void face_up() {

  x = random(20) + 57; // 目の開始位置x座標+20pixの目の動き乱数
  y = random(20) + 75; // 目の開始位置y座標+20pixの目の動き乱数

  img.pushSprite (30   , 56);         //メモった目の枠の位置に描く
  img2.pushSprite(x    ,  y, 0xFFFF); //右目描く
  img2.pushSprite(x + w,  y, 0xFFFF); //左目描く w=目の幅
  img.pushSprite (30   , 56, 0xFFFF); //再度目の白（0xffff)を透明にして描く
}

//下記M5Display.cppより該当するものをコピペし修正する。
// read16｛～｝,read32｛～｝,drawBmpFile｛～｝を下記にはりつけ、修正する。下記は修正した行しか記載していない

uint16_t s_read16(fs::File & f) {

uint32_t s_read32(fs::File & f) {

void drawBmpFile_saka(fs::FS & fs, const char *path, uint16_t x, uint16_t y, TFT_eSprite & tmpimg) {
  if ((x >= 320) || (y >= 240)) return;
  if (s_read16(bmpFS) == 0x4D42) {
    s_read32(bmpFS);
    s_read32(bmpFS);
    seekOffset = s_read32(bmpFS);
    s_read32(bmpFS);
    w = s_read32(bmpFS);
    h = s_read32(bmpFS);
    if ((s_read16(bmpFS) == 1) && (s_read16(bmpFS) == 24) && (s_read32(bmpFS) == 0)) {
      M5.Lcd.setSwapBytes(true);
         tmpimg.pushImage(x, y--, w, 1, (uint16_t*)lineBuffer);

```


以上
scipy.stats: ベイズ統計による信頼区間 bayes_mvs

# scipy.stats: ベイズ統計による信頼区間 `bayes_mvs`

ベイズ統計による，平均値，分散，標準偏差およびそれらの信頼区間を求める。

`bayes_mvs(data, alpha=0.9)`

戻り値は，平均値，分散，標準偏差およびそれらの信頼区間である。


```python
from scipy.stats import bayes_mvs
import numpy as np

x = np.array([49.3, 57.4, 40.4, 57.8, 60.9, 62.8, 51.5, 42.3, 53.3, 46.1])
bayes_mvs(x)
```




    (Mean(statistic=52.17999999999999, minmax=(47.72731707529156, 56.632682924708426)),
     Variance(statistic=75.85942857142857, minmax=(31.38582084623029, 159.6986403355363)),
     Std_dev(statistic=8.405156481984777, minmax=(5.602304958339049, 12.637192739510477)))
UIStackViewのdistributionの設定で迷った時のチートシート

# UIStackViewのdistributionはどれを使えば良いか
UIStackViewのdistributionの設定で
結局、どういう時にどれを使えば良いのか悩んだので一旦、備忘録として整理しました。

※ 前提としてAxisはVerticalを想定（縦に積まれているイメージ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160605/48b78d35-eebb-c79b-b137-941d587c1574.png)

## 結論
- 高さor比率が決まっているViewがUIStackView内に一つもない
→ [`fillEqually`](https://developer.apple.com/documentation/uikit/uistackview/distribution/fillequally) ※同じ高さになるので注意
- 高さor比率が決まっているViewがUIStackView内に存在し、View同士の間隔が決まっていない
  - View同士の間隔を一定にしたい
 →[`equalSpacing`](https://developer.apple.com/documentation/uikit/uistackview/distribution/equalspacing)
  - Viewを一定間隔に配置したい
 →[`equalCentering`](https://developer.apple.com/documentation/uikit/uistackview/distribution/equalcentering)
- 高さor比率が決まっているViewがUIStackView内に存在し、View同士の間隔が決まっている
  - 高さが決まっている場合
  →[`fill`](https://developer.apple.com/documentation/uikit/uistackview/distribution/fill)
  - 比率が決まっている場合
  →[`fillProportionally`](https://developer.apple.com/documentation/uikit/uistackview/distribution/fillProportionally)

※`equalSpacing`はSpacingを設定すると、最小Spacingの設定値でView同士の間隔を担保してくれる

## 参考
[Apple公式ドキュメント「UIStackView」](https://developer.apple.com/documentation/uikit/uistackview)


。。。てな感じでしょうか。