OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby on Rails】ActiveRecord::Relation に対して present? や blank? メソッドを使用していたら性能低下していた話

# はじめに
これは私が ActiveRecord::Relation に対して present? や blank? メソッドを使用したら API サーバが機嫌を悪くしてレスポンスを返してくれなくなったので、なんで機嫌を損ねたのかを共有するための記事です。

# なんで機嫌を損ねたの？
さていきなり本題です。なぜ API サーバが機嫌を悪くしたのか？それを解き明かすために、まずは ActiveRecord::Relation に対して present? や blank? メソッドを使用するとどのような流れで ActiveRecord::Relation が存在しているかを評価するのか確認しましょう。評価の流れは大まかに以下の流れで実行されます。

1. 格納している条件を元にクエリを発行
1. クエリ実行結果をメモリにロード
1. 存在チェック

はい、ここで感の良い皆様なら既にお気づきでしょう。問題なのは「2. クエリ実行結果をメモリにロード 」の部分です。結果が何百万レコードもあるクエリを発行すると「2. クエリ実行結果をメモリにロード 」で API サーバーがお腹いっぱいにも関わらず、更にデータをお腹に詰め込もうとします。鬼畜ですね。私も同じことされたら機嫌を悪くするどころじゃ済まないです。

ということでデータ件数が膨大になりそうな ActiveRecord::Relation に present? や blank? を使用するのはやめて API サーバーと仲良くしていきましょうというお話でした。

# 参考
https://scoutapm.com/blog/three-activerecord-mistakes-ja
【#PowerApps】縦にも横にもスクロールするギャラリーを作る方法

# 概要

項目数の多いギャラリーを表示する場合横にスクロールしたくなることはよくあります。項目が多い場合はデータテーブルでスクロールすることもありますが、実はギャラリーでも可能です。
今回は縦にも横にもスクロールできるギャラリーの作り方をご紹介します。


# 作り方

今回使うものはギャラリーとコンテナになります。
それぞれを以下のように配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/ef62a854-ff29-3950-d88d-bbcb8adfc54f.png)


その後以下のプロパティを変更します。

|コントロール|プロパティ|変更前の値|変更後の値|
|--|--|--|--|
|Container|LayoutOverflowX|LayoutOverflow.Hide|LayoutOverflow.Scroll|
|Gallery1|FillPortions|1|0|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e5c1ea6a-c589-6a5d-a8f6-e9470a288a6c.png)


以上で、横スクロールと縦スクロールができるギャラリーの完成です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <br>縦にも横にもスクロールできるギャラリー Qiita用 <a href="https://t.co/WHTBE7VBUD">pic.twitter.com/WHTBE7VBUD</a></p>&mdash; たく丸 (@taku_ma_ru) <a href="https://twitter.com/taku_ma_ru/status/1402517401506181126?ref_src=twsrc%5Etfw">June 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ

コンテナの中にギャラリーを入れれば可能です。
VirtulBox開発環境構築メモ


## メモ
VirtulBoxに、CentOS8（LAMP）を設定した際のベースとなるメモ。応用できるようにあくまでベースのみ。

## ホスト側設定
### ポートフォワーディング設定
　　環境に合わせて適時修正。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22018/76c43746-e0fe-05fb-e24e-636f958dd8c5.png)

### 共有フォルダ設定
　　フォルダーのパス：環境に合わせて適時修正。
　　フォルダー名：任意
　　読み込み専用：なし
　　自動マウント：チェックする
　　マウントポイント：なし
　　永続化する：チェックする
/media/sf_任意/ にマウントされること。


### VirtulBoxのネットワーク設定を行いホストからゲストにping疎通できるようにする。
・アダプター２を有効化しホストオンリーアダプターを設定する。
・アダプター１は初期設定のNATのままとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22018/7d683367-837e-2fd5-3438-884c76a3513f.png)

IPv4アドレスの確認
・ホスト側からゲスト側へping でNATのアドレスが疎通できるか確認する。
・ゲスト
ip addr
・ホスト
ping xxx.xxx.xx.xxx

### メモ帳を管理者権限で起動して開発環境用のドメインとゲストのIPを紐付け設定する。
（Apacheのバーチャルホストを利用する際記載する。利用しない場合はポートフォワードで代用でも良し）
・開発環境用ドメインでWebサイトが閲覧できること。
C:\Windows\System32\drivers\etc\hosts　を管理者権限のメモ帳で開き開発環境用のドメインを追加する。
IPはホストオンリーアダプターのIPを指定すること。
ローカル開発環境用設定（VirtualBox）
xxx.xxx.xxx.xxx virtualbox.dev.com


## ゲスト側設定（前提としてCentOS8をゲストとする）
### VBoxGuestAdditionsインストールするための準備
※以降についてはすべてrootユーザーにて実施。

```sh
yum -y update kernel
reboot
yum -y install gcc gcc-c++ make bzip2 kernel-headers kernel-devel elfutils-libelf-devel perl tar
```

### VBoxGuestAdditionsのインストール
※VBoxGuestAdditionsはVirtualBoxのバージョンに合わせること。下以外だとVBoxGuestAdditionsのisoをCD-ROMでマウントする。

```sh
wget http://download.virtualbox.org/virtualbox/6.1.22/VBoxGuestAdditions_6.1.22.iso
mount -t iso9660 /root/VBoxGuestAdditions_6.1.22.iso /mnt/cdrom
sh /mnt/cdrom/VBoxLinuxAdditions.run
```

### firewalldの無効化
※ローカル開発環境のみ実施

```sh
systemctl stop firewalld
systemctl disable firewalld
```

### SELinuxの無効化

```sh
vim /etc/selinux/config
　SELINUX=disabled
```

### Apache httpd をインストールする
・2.4.37 をインストール
・自動起動有効化

```sh
yum -y install httpd mod_ssl
systemctl enable httpd.service
```

### AppStreamモジュラーの依存に関する問題対応のための設定

```sh
dnf module enable perl:5.26
```

### MySQL のインストール
・AppStream(RHEL/CentOS 8 限定)でインストールを行う
・8.0.17 をインストール
・自動起動有効化

```sh
yum module list
#AppStreamのmysql8がデフォルトになってることを確認する。
yum install mysql mysql-errmsg mysql-server
systemctl enable mysqld.service
```

### PHP のインストール
・AppStream(RHEL/CentOS 8 限定)でインストールを行う
・7.2 をインストール

```sh
yum module list
#AppStreamのphp7.2がデフォルトになってることを確認する。
yum install php php-gd php-json php-mbstring php-mysqlnd php-pdo php-xml php-xmlrpc
```

### apache にvboxsfグループ（VirtulBoxの共有フォルダのグループ）を追加する
VirtualBoxの共有フォルダ配下のソースをapacheで読み書きできるようにするため。

```sh
usermod -G vboxsf apache
# 確認
id apache
systemctl restart httpd.service
```

バーチャルホスト（もしくは単に公開フォルダ）の公開先を共有フォルダのシンボリックリンクとする。
ホストで修正された内容が適時反映されるようになる。

```sh
ln -s /var/www/バーチャルホストの公開フォルダ /media/sf_任意/共有フォルダ
```

ホストネームを変更する。
VirtualBoxはvboxのホストネームにする場合

```sh
hostnamectl set-hostname vbox
reboot
```
【javascript】動的なtable生成、tdに動的なselectを生成

#やりたいこと

tableの行を動的に追加。
さらにoptionも配列から動的に追加

#想定

配列はDBから取得。DBが変われば、option選択肢も動的に変更されるようにする

※本当はjqueryを使ったほうがみやすくすっきりしますが、あえてjavascriptで書きます。
　jqueryでの記述バージョンもそのうちアウトプットしようと思います。

#下記をもっとシンプルに分解した記事

[【javascript】シンプルな動的selectの生成、option（選択肢）の追加](https://qiita.com/forever---beginner/items/622121e16a1d7adebc1c#comment-5e3597dd644c169724eb)
[【javascript】シンプルなtableの動的行追加・削除（ボタンクリックで行追加・削除）](https://qiita.com/forever---beginner/items/7901217dc811d72687f8)
[【javascript】シンプルな動的tableのinputの値取得](https://qiita.com/forever---beginner/items/06c438e478fa70fa0eb9)

#完成形、動作確認（ここでは配列をあらかじめ設定）

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="hfmst" data-slug-hash="ZEejrGP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="js table td→input">
  <span>See the Pen <a href="https://codepen.io/hfmst/pen/ZEejrGP">
  js table td→input</a> by Hirofumi Sato (<a href="https://codepen.io/hfmst">@hfmst</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


#コード

下記、データ取得については別途投稿します。

```html:index.html
<div>
  <button onclick="addrow()">行追加</button>
  <button onclick="getdt">送信</button>
  <button onclick="getdt">取得</button>
</div>
<table border="1" id="tbl">
  <tr>
    <th>日付</th>
    <th>担当</th>
    <th>タスク</th>
  </tr>
</table>
```

```javascript:js.html
function addrow(){
  
  let tbl = document.getElementById('tbl');
  
  let name=["山田太郎","斎藤花子","最上祐樹"];
  let todo=["メール対応","会議","資料作成","掃除"];
  
//input type=dateをtrに追加
  let tr = document.createElement('tr');
  let datetd = document.createElement('td');
  let dateinp = document.createElement('input');
  //↑上記で必要な要素（tr,td,input）を用意

  dateinp.setAttribute('type','date');//inputを日付形式に
  datetd.appendChild(dateinp);        //tdに追加
  tr.appendChild(datetd);               

//下記、createSelect関数に、配列、tr、tblを渡す
  createSelect(name,tr,tbl);
  createSelect(todo,tr,tbl);

  tbl.appendChild(tr);
   
}

//担当とタスクは同じくselectなので、createSelectを使いまわします。
function createSelect(arr,tr,tbl){

  let sl = document.createElement('select');
  let td = document.createElement('td');
  for(let num in arr){        //引数で受け取ったからoptionを作って動的にselect生成
    let op = document.createElement('option');
    op.text = arr[num];
    sl.appendChild(op);
  }
  td.appendChild(sl);
  tr.appendChild(td);
  
}

```
PHP エラー　出力　対処法　サイトまとめ

### php公式　マニュアル

https://www.php.net/manual/ja/pdo.error-handling.php


### エラーの出力方法

https://www.sejuku.net/blog/24522

https://www.welcart.com/documents/archives/3706

https://se-tomo.com/2018/12/16/%E3%80%90php%E3%80%91%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%B0%E3%81%AE%E5%87%BA%E5%8A%9B%E6%96%B9%E6%B3%95%E3%80%90error_log%E3%80%91/


### PHPのvar_dump関数で出力した内容をファイルに保存する方法

https://www.terakoya.work/php-var_dump-output-file-save/


### エラーメッセージの読み方、対処法等


https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5
【 Bootstanp 】Ruby on RailsでBootstampを使用する方法


# はじめに
<!-- 発端や概要を記載 -->
今回はRuby on RailsでBootstampを使用する方法について書かせていただきます。
BootstampやRuby on Railsについては下記のHPをご覧いただければと思います！

（こちらの記事ではrailsのインストール方法などは割愛させていただきます）

・Bootstampについて
https://getbootstrap.jp/docs/5.0/getting-started/introduction/

・Ruby on Railsについて
https://railsguides.jp/



# 開発環境
Bootstamp バージョン５
Ruby on Rails バージョン2.6.5



<!-- 各チャプター -->
# 使用するための準備
①Railsをインストール後、テキストエディタを開き下記のファイルを開く

``app / views / layouts / application.html.erb``



②application.html.erbを開くと元から下記のように記述があるのを確認する

```:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>アプリ名</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

③Bootstampを使用するために下記の二つの記述を追加する
⑴ headタグの中にBootstampのためのCSSの記述

```ruby
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
```


⑵bodyタグ内にBootstampのJavaScriptを読み込むための記述

```javascript
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
```

※こちらは <%= yield %> の下に記述をする


#完成形

```:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>アプリ名</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    ※追加
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>

　　※追加
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>

  </body>
</html>

```

これで問題なく、Bootstampが動きます！
Apacheの再起動コマンド

#環境情報
・CentOS Linux release 7.8.2003 (Core)
・Server version: Apache/2.4.6 (CentOS)

#答え
```
systemctl restart httpd.service
```

#centos6
centos6だとサービスコマンドが違っているようです。

```
service httpd start
```

#経緯
以下のコマンドをcentos7で実行したところ、
リダイレクト処理がかかったので不思議に思ったため調査を行いました。

```
[root@hoge hoge]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service
```
HostOnlyAdapterを使ったVirtualBoxのゲスト間通信

# はじめに
片方のネットワークアダプターにnatを追加すると接続できるのに。。。
なぜかうまくいかないなぁと思っていました。

今回うまくいったので、ご説明したいと思います。

|ゲストos |
|---|
|Kali-Linux-2021.1 |
|Metasploitable2 |

# 結論
同一のネットワークアダプターを使うだけ

Kali-LinuxとMetasploitable2の双方のネットワークに同一のvboxnet0を設定する

こうすることでゲストos間で通信ができます。

![Screen Shot 2021-06-09 at 13.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/3e7a566e-832f-5ec1-7316-3c06b4d60382.png)


# HostOnlyAdapterとは

インターネット接続はできないが、vm同士、vm-host間通信を可能にするネットワークアダプター。

![net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/91af0d15-4df6-8b29-8fa9-d3974537bc61.png)

# 実施

Kali-LinuxからMetasploitable2(192.168.56.5)に通信

![Screen Shot 2021-06-09 at 14.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/600f2805-5847-3503-9f4a-aaa7b3c16f86.png)

以上です。
Leaflet での矩形などの図形を最前面・最背面へ移す

Rectangle など、 Path クラスを継承する図形は、 `bringToFront()` で最前面へ、 `bringToBack()` で最背面へ移動できる

```js
// map や bounds の定義は省略しています
const rectangle1 = L.rectangle(bounds1)
  .addTo(map)
  .bringToFront()
const rectangle2 = L.rectangle(bounds2)
  .addTo(map)
  .bringToBack()
```

Vue 向けのラッパーライブラリである [Vue Leaflet](https://vue2-leaflet.netlify.app/) でもコンポーネントから `mapObject` を取得することでメソッドを利用できる（下記サンプルは Vue 2 向けのものです。 Vue 3 向けのもので利用可能かどうかは調査できてません・・・）

```vue
<!-- l-map 等マップのセッティングについては省略しています --> 
<template>
  <l-rectangle :bounds="bounds" @click="toBack" ref="rectangle"></l-rectangle>
</template>

<script>
import { LRectangle } from 'vue2-leaflet'
export default {
  components: { LRectangle },
  computed: {
    bounds () {
      return [[35.0, 134.0], [35.2, 134.2]]
    }
  },
  methods: {
    toBack () {
      this.$refs.rectangle.mapObject.bringToBack()
    }
  }
}
</script>
```
該当のファイルを削除した時のdb削除方法

ファイルに該当するデータベースを削除し忘れて、先にファイルを削除してしまいました。

ターミナルでのrails db:dropコマンドは該当のディレクトリ上でしか機能したいため、この場合は使用できません。


git cloneして該当のファイルを蘇らせることに。その上でrails db:dropを行いデータベースを削除しました。
データベース設計時のREADMEの書き方

## 注意点

- アソシエーションを記述するときはhas_one、belongs_toにおいては単数系で記述
- has_manyは複数形で記述
- references 型で記述する際は、カラム名の_idは不要
- active_hashを用いて実装するとき、カラム名に「_id」を付ける
docker-compose 手順 


#背景
コンテナを起動し、入るところまでを振り返りました。

#手順

１　以下のファイルを作成する

```
Dockerfile docker-compose.yml Gemfile
```

２　新規アプリ作成する

```
docker-compose run web rails new . --force --database=mysql
```


３　Gemfile が新しく作成されるので新規にイメージをビルドする

```
docker-compose build
```

ビルドには時間かかりました。

４　DBの作成

```
docker-compose run web rails db:create
```

５　rails を起動する

```
docker-compose up
```
これでlocalhost:3000 にアクセスすればデフォルト画面が表示されます。

補足
docker-compose up -d　でバックグラウンドで起動。別のタブを開かずにそのタブで作業可能です。

なお、シャットダウンはdocker-compose down でできます。

６　コンテナに入る

```
docker-compose exec web /bin/bash
```
$ rails generate 実行時、rubyのCPU使用率が100%になる

# 原因
どうやらlisten gemがBigSurをサポートしていないというバグが原因らしい。
[Pegging CPU core on Apple M1 processor #636](https://github.com/rails/spring/issues/636)

# 解決策
Gemfileのlisten gemのバージョンを3.3.0以降のものに指定すればよい。

```:Gemfile
group :development do
  gem 'web-console',           '4.0.1'
  gem 'listen',                '>=3.0.5', '<4.0'
  gem 'spring',                '2.1.0'
  gem 'spring-watcher-listen', '2.0.1'
end
```

# 追記
↓teratailのこちらの記事のやり方でも良さそうです。
[railsのspringが暴走し、rubyがCUPを大きく消費する](https://teratail.com/questions/332866)
VirtualBox VMにssh接続する


# 概要
VirtualBoxのネットワーク設定をNATにしたまま、ホストOSからVirtualBox上のVMにssh接続するポートフォワード設定についてまとめます。
# 実行環境
- macOS Big Sur
- VirtualBox バージョン 6.1.18 r142142 (Qt5.6.3)
- Debian

#VirtualBoxの設定
1. VirtualBoxマネージャーの画面で対象のVMを選択
1. 「設定」→「ネットワーク」を開き、割り当てがNATであることを確認　
1. 「高度」→「ポートフォワーディング」を開き、新規ルールを追加
    - 名前：ssh　(なんでもOK)
    - プロトコル：TCP
    - ホストIP：127.0.0.1（ローカルループバックアドレス）
    - ホストポート：3333（任意の数字）
    - ゲストIP：空
    - ゲストポート：22（VMのsshで使用するポート）
1. VMを再起動

# Macのターミナルからssh接続
` $ ssh 'ユーザー名'@127.0.0.1 -p 'ホストポート' `
で接続できます。

自分の場合は

```
$ ssh rsudo@127.0.0.1 -p 3333
```

になります。
上手くいかなかった場合は

- VMが起動しているか。
- VMのsshサービスが起動しているか。
- ポート番号が合っているか

あたりを確認してみて下さい。

以下、ポートフォワード設定について興味ある方はどうぞ。

# ポートフォワード設定について
まず、 VirtualBoxのデフォルトのネットワーク設定であるNATについて解説します。

NATモードでは、VMはVirtualBox networking engineというVMとホストOSの間にあるルーターを介してインターネットに接続されています。
![CBBFCB55-D2DF-4C52-BA4C-F3892208B306_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595354/7f6c7a1b-d4bb-2d3f-937b-b67bf8d9e7db.jpeg)




図のようにVMはルーターの背後にあるので、VMのプライベートIPアドレスを指定しても外部のインターネットやホストOSから接続することはできません。（グローバルIPアドレスはホストOSと同じなので、グローバルIPアドレスを指定しても接続できない）

そこで、VirtualBoxの設定でホストOSの特定のポートに届いた通信をゲストの特定ポートに転送することでホストOSからVMへの通信を可能にするのがポートフォワード設定です。
今回だと、ホストにポート3333が届いたらゲストのポート22に転送するという設定をしています。
# まとめ
ポートフォワード設定の仕組みがわからず混乱したのでまとめてみました。
[VirtualBoxのマニュアル](https://www.virtualbox.org/manual/ch06.html)によるとNAT以外でもホスト→VMの通信が可能になる設定があるようです。
訂正等あればコメントお願いします。
【論文紹介】Augmented taste of wine by artificial climate room: Influence of temperature and humidity on taste evaluation

#論文紹介
論文：Augmented taste of wine by artificial climate room: Influence of temperature and humidity on taste evaluation
著者：Toshiharu Igarashi, Tatsuya Minagawa, Yoichi Ochiai
https://dl.acm.org/doi/pdf/10.1145/3311823.3311871

#どんなもの
　人工気候室を使って温度と湿度を調整することで、ワインの味覚評価を変える研究

<font color="gray">ワイン1(CROIX DE BEAUCAILLOU 2011)の熟成度については、温度14℃、湿度35％の環境設定が適切であり、温度26℃、湿度40％ではやや過熟／ピーク品質が検出されることがわかった。
温度の上昇とともにリンゴ酸量が増加する。リンゴ酸はワインに酸味を与える成分。(リンゴ酸は熟成中にシャープな酸を与え、エステル化されてモノメチルエステルを得てソフトな酸を与えるため、酸味や苦味が軽減され、まろやかな食感になる。)</font>

<font color="gray">
温度を調整することで、ワインの成分だけでなく、味の主観的な評価も同時に変化することが確認
→ワインの種類と人の好みを特定できれば、温度と湿度を調整することで味を調整できる
(ワイン2(BLAGNY 1 ER CRU LA PIECE SOUS LE BOIS 2014)については、どの評価項目においても統計的に有意な差は検出されなかった)
→被験者は通常のクッキーよりも小さいクッキーを見たときのほうが消費量が多くなった。(視覚的に大きいクッキーと普通のクッキーでは消費量に有意差はなかった) 食べ物を小さく見せたときは食べる量が約15％増え、大きく見せたときは約10％減った。</font>


#先行研究と比較してすごいところ
　これまでの研究では、人の行動を制限するものが多かった。この論文では、人の行動を制限することなく、人工気候室を用いて温度と湿度を調節することでワインの味覚評価を変えることができることを確認した。
　<font color="gray">物理的な制限を伴わず、消費時の環境を変化させることに着目した。</font>

#技術や手法のキモ
　<font color="gray">(ワインの味は、温度によって変わることがわかっている。)</font>温度と湿度がワインの味に与える影響を調べるために、人工気候室を使用した。(人工気候室は温度は -20℃ ~ 50℃, ±0.5℃の誤差で設定できる。湿度は 30% ~ 80%, ±3% の誤差で設定できる )

〇ワインの成分に関する評価
　成分の検出には、Yan Cuiら（2012）の方法を参考に、ネガティブモードのSelected Ion Monitoring（SIM）を採用した。
　<font color="gray">温度変化によるワインの成分の変化を調べるために２種類のワインの成分を14◦C、17◦C、23◦C、26◦Cで調べた。</font>


#検証方法
 　温度と湿度の異なる３つの環境で２種類の赤ワインを飲み、アンケートに回答してもらう。(色、香り、味、総合的な品質(官能評価、嗜好テスト)を採点法のルールに従って評価)

　3 つの環境設定は、温度 14 ◦湿度 35％、温度 17 ◦湿度 40％、温度 26 ◦湿度 40％とした。(室温26◦C、湿度40％は、日本の一般的な室内環境)
　環境設定による有意差を検証し、各環境下での平均値平均にはt検定を用いた。(両側p値が0.05以下であれば有意差があるとした)

〇ワインの成分に関する評価
　ワインの成分に対する温度の影響を分析するために、温度を独立変数、測定可能な各成分を従属変数とした回帰分析を行った。





#議論
　ワインの好みによって主観的な評価になってるのでは？


#気になった論文
　Augmented perception of satiety: controlling food consumption by changing apparent size of food with augmented reality(拡張現実感を利用した満腹感の論文)
SDF Editorのソースコードが公開されたので、レイマーチングがより身近になった！

###SDF Editorのソースコードが公開された!
プロトタイプとして公開されたSDF Editorの出力をPythonでGLSLにコンバートするコードを書いていたら、
なんと、5月30日に***SDF Editorのソースコードが公開された。***
https://joetech.itch.io/sdf-editor
これによって、外部のPythonプログラムを使うことなく、直接GLSLコードを出力するようにソースコードを修正すればいいと考え、作業を開始したら一日ほどで動作するようになった。

これで、SDF Editorでモデリングし、プロジェクトをセーブしたら、<ファイル名>.fragを出力し、
それをVisualStudio Codeで読み込んだら、すぐに表示できるようになり、また、
htmlとしてセーブするとそのまま、WEBに置けば3DCGを表示できる。


![スクリーンショット 2021-06-05 203205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/de85e984-8afb-5cd5-27ea-441d397fa6db.jpeg)

SDF Editorでデザインし出力したコードをShadertoy.comで公開->https://www.shadertoy.com/view/Nts3W2



###SDF EditorのソースコードはGODOT Engine

SDF EditorのソースコードはGODOT Engineで書かれている。その本質はC++だが、Pythonライクなコーディング
ができる。（ただし、Pyhtonとフルコンパチではない。）Pythonライクなので、今までPythonで書いたコンバータ
がほぼそのまま使えて楽だろうと思ったら、件のPythonのコードはほとんど使わずに書けたので拍子抜けした。
今回は、改変したソースコードはデバッグ中なのでそのすべてを示さないが、いくつかポイントを紹介するので
誰でも独自にソースコードを変更することができるだろう。

大まかな方針は以下の通りである。

step1 ***SDFモデルや、tranformやrotateなどのmodifireの変数値をShadertoyのコードに取り込む***

step2 ***SDF関数をShadertoyのコードに取り込む***

　SDF　EditorのソースコードのプロジェクトをGODOTに読み込み、
　シーン -> Saveのスクリプトをを表示し、以下のようにjson_saver.save(path)の下に
emit_signal("my_signal",path)を追加する。

```
　func _on_file_selected(path):
	json_saver.save(path)
	emit_signal("my_signal",path)
```

次に、右端ペインのノードタブをタップし、my_signa()をマウス右ボタンクリックで、接続を選択し、
Scene -> Addに接続する。

### sdf関数のための変数とコードを取得する

また、SceneAdd.gdの先頭を次の二行をつけ加える。

```
var compiler = preload("res://SDF Scripts/Compilers/ShaderCompiler.gd").new()
var uniforms = []
```

###変数の具体的数値を得る

ここで、func _on_Save_my_signal(path): で、

```
	var result = compiler.compile()
	var shdercode = result[0]
	uniforms = result[1]
	
	# sdf関数を書き込む
	var stemp = shdercode
```

とすると、stempにuniformの変数名と、sdf関数の本体を文字列として取り込むことができる。
たとえば、球を一つ追加すると stempは下記のような内容になる。



```
uniform float SpRa_1;

float sdf(vec3 p0)
{
	float d1;

	d1 = pSphere(SpRa_1, p0);
	return d1;
}
```

ここで、SpRa_1を具体的数値に置き換え(球の半径）、このコードをShadertoyのテンプレートに読み込むと、
そのコードはShadertoyに投稿しても、VisiualStuido Code上からでも結果を表示できる。
変数の具体的数値は、以下のように取得できる。

```
var sdffnc = ''
	var j = 0
	for u in uniforms:
		
		var value
		if u[0].has_method(u[1]):
			value = u[0].call(u[1])
		else:
			value = u[0].get(u[1])
		#
		var temp = lines[j].replace('uniform ','')
```

  このようにして取得した数値を変数名のところに置き換え、たとえば、
球を一個追加する例では、

```
float SpRa_1　＝1.0と書き換える。

float sdf(vec3 p0)
{
	float d1;

	d1 = pSphere(SpRa_1, p0);
	return d1;
}
```

この方針で、すべての変数を具体的数値に変更し、Shadertoyのテンプレートコードに挿入して
セーブすると、そのコードが実行し、表示できる。
PHPで件数をカウントしたいときの方法　MySQL

参考サイト

https://qiita.com/mpyw/items/b00b72c5c95aac573b71

上記サイトの参考箇所

https://qiita.com/mpyw/items/b00b72c5c95aac573b71#select-%E3%81%A7%E8%A9%B2%E5%BD%93%E3%81%97%E3%81%9F%E8%A1%8C%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B



基本的に，以下の方法に従います．

* 件数だけでなく結果セットも一緒に欲しい場合， `PDOStatement::fetchAll` メソッドで一気に配列として取得し，それに対してPHPの `count` 関数を使う．

* 件数だけが欲しい場合は， `SELECT COUNT(*) WHERE ...` といったクエリを発行し，その結果を `PDOStatement::fetchColumn` メソッドで得る．

これらの方法が最も推奨されますが，他の方法が無いわけではありません．以下に補足説明を示します．但しこれらはMySQLやPostgreSQLについてのみ当てはまり，SQLiteには当てはまりません．

####バッファクエリ使用時
SELECT に対しても常に `PDOStatement::rowCount` メソッドを使うことができる．

####非バッファクエリ使用時
`PDOStatement::fetchAll` メソッドを実行した後，つまり全てのフェッチが終わった後であれば SELECT に対しても `PDOStatement::rowCount` メソッドを使うことができる．
結果のフェッチを途中で中断したまま次のクエリ実行に移行するときは， `PDOStatement::closeCursor` メソッドを使ってカーソルを閉じる必要がある．1つ目の結果セットをPDOStatementに保持したまま2つ目のSQLを実行することはできないので，その場合はあらかじめ `PDOStatement::fetchAll` メソッドでデータを退避させておく必要がある．
機械学習の環境構築

#環境概要
- Ubuntu 20.04 LTS Server
- Python 3.8.5
- pip3 20.0.2
- pandas 1.2.4
- TensorFlow 2.5.0
- scikit-learn 0.24.2
- CUDA 11.3.0
- jupyter-notebook 6.4.0


#Pythonライブラリのインストール

Ubuntu 20.04では，デフォルトでPython3.8.5がインストールされているので，Pythonのインストールは省略．

必要なPythonライブラリを順にインストールします．

```
$ sudo su
# apt-get update
# apt-get install python3-pip
# pip3 install tensorflow
# pip3 install pandas
# pip3 install scikit-learn
# pip3 install seaborn
# pip3 install notebook
# exit
```

jupyter notebookはデフォルトでは，localからしか接続できないので，
設定ファイルを作成し情報を追記します．
(0.0.0.0はすべてアクセスを許可する設定のため，セキュリティには，注意が必要)

```
$ jupyter notebook --generate-config
$ sed -i "$ a c.NotebookApp.ip = '0.0.0.0'" ~/.jupyter/jupyter_notebook_config.py
```

#CUDAのインストール

GPU環境のため
CUDAのインストール

```
# sudo ubuntu-drivers autoinstall
# wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
# mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
# apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
# add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
# apt-get update
# apt-get -y install cuda
# echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" | sudo tee /etc/apt/sources.list.d/nvidia-ml.list
# sudo apt update
# sudo apt install libcudnn8-dev
# reboot
```

CUDAがすでにインストールされているなどでうまくいかない場合は先にアンインストールしておく

```
# apt-get --purge remove nvidia-*
# apt-get --purge remove cuda-*
```

```.py
import tensorflow as tf
tf.test.is_gpu_available()
```

GPU環境が動作しているかチェック
Qiita 記事投稿の際のフォーマット

# はじめに
<!-- 発端や概要を記載 -->
初めて投稿させていただきます！
今後自分自身で学んだことを頻繁にアウトプットしていけたらと思います！
それにあたり、投稿の効率を上げるために
記事投稿の雛形をメモとして残させていただきたいと思います


# フォーマット本体
```

# はじめに
<!-- 発端や概要を記載 -->

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Chapter1](#Chapter1)
1. [Chapter2](#Chapter2)
1. [参考文献](#reference)

# 開発環境

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1

<a id="#Chapter2"></a>
# Chapter2

<a id="#reference"></a>
# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)
-

 ```
Google App Script(GAS)でurlfetchをしようとするとエラーが出たので、解決してみた


```
var response = UrlFetchApp.fetch('https://api.zoom.us/v2/users/' + userId + '/meetings', options);
```

UrlFetchApp.fetchを使用
zoomのapiを使って、meetingを作成しようとしていたら以下のエラーが！

```
Exception: You do not have permission to call UrlFetchApp.fetch. Required permissions: https://www.googleapis.com/auth/script.external_request
```

解決策：
manifestファイルのappsscript.jsonを編集して、
oauthScopesのところに、エラーで出ていた`https://www.googleapis.com/auth/script.external_request`
を追加してあげる。

その後、実行すればmanifestを変更したために、再度googleの許可を求められるので許可してあげると良い。


参考：
https://stackoverflow.com/questions/58359417/you-do-not-have-permission-to-call-urlfetchapp-fetch
Windows10 PC上への Salome-Meca2018の インストール

# はじめに
Salome-Mecaによる構造解析 入門と初級 を受講することになりましたので、Windows10 PC上へ Salome-Meca2018を インストールします。
# 失敗
zipファイルを展開して、`run_salome.bat`をダブルクリック。

```run_salome.bat
指定されたパスが見つかりません
指定されたパスが見つかりません
指定されたパスが見つかりません
```
ぐぬぬ
# 成功
```run_salome.bat
@ECHO OFF

call "%~dp0\set_env.bat"
echo "%PDIR%
call "%PDIR%\env_launch.bat"
```
バッチファイルを見ると`"`が足りないような気がします。
バッチファイルをコピペして、`"`を追加して、ダブルクリック。
![20210609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/d803ad87-82ca-b1bb-bac0-0634fc826353.png)
起動成功。
# その後
`"`が足りないオリジナルの`run_salome.bat`をダブルクリックしても、起動成功。

うむ、OpenCAEの道は始まったばかり。
# まとめ
+ OpenCAE さんありがとう
+ Salome-Meca さんありがとう
Amazon Cognitoについて

# Amazon Cognitoとは
一言で言うと、アプリケーションの認証・認可を提供したサービスです。

以下AWS公式説明引用。

> Amazon Cognito は、ウェブアプリケーションやモバイルアプリケーションの認証、許可、ユーザー管理に対応しています。ユーザーは、ユーザー名とパスワードを使用して直接サインインするか、Facebook、Amazon、Google、Apple などのサードパーティーを通じてサインインできます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html
## Cognitoでできること
大きく分けるとサインアップ・サインイン機能の提供、ユーザのアクセスコントロールの管理が行えます。

「Email+パスワード」や「ID+パスワード」などの一般的なサインアップ・サインインだけではなく、ソーシャルIDプロバイダやエンタープライズIDプロバイダを利用してのサインインも利用できます。
## 機能
ユーザプール・IDプールを用いたユーザの認証認可管理が主な機能です。

- ユーザプール
    - Cognitoで認証したユーザのディレクトリ。
    - 認証したユーザにはトークンが発行され、このトークンで認証処理が行われる。
    - Oauth2.0,OpenID Connect,SAML2.0などのアクセス管理標準をサポートする。
- IDプール
    - ユーザに対する認可の管理。
    - ユーザ一意のIDを作成し、IDプロバイダに連携させられる。
    - IAMroleと紐づけて、他AWSサービスへのアクセスの認可を管理する。
    - 認証したユーザだけではなく、未認証ユーザ(ゲストユーザ)にも一時認証を提供できる。

ユーザプールとIDプールは同時に使用することも、別々に使用することもできます。

AWS公式が示している「同時に使用する場合の一般的なシナリオ」は以下です。

1. 最初のステップでは、アプリのユーザーはユーザープールを介してサインインし、認証が成功するとユーザープールトークンを受け取ります。
2. 次に、ID プールを使用して AWS 認証情報のユーザープールトークンを交換します。
3. 最後に、アプリのユーザーはこれらの AWS 認証情報を使用して Amazon S3 や DynamoDB などの他の AWS サービスにアクセスできるようになります。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

## Amazon Cognito Sync

ユーザに対してデータストレージを提供し、異なるデバイス間でもユーザデータを同期できるサービスです。

公式説明参照
> Amazon Cognito Sync は、アプリケーション関連のユーザーデータのデバイス間の同期を有効にする、AWS サービスとクライアントライブラリです。これを使用して、独自のバックエンドを必要とせずにモバイルデバイスとウェブ間でユーザープロファイルデータを同期できます。クライアントライブラリはローカルにデータをキャッシュするため、アプリはデバイスの接続状態にかかわらず、データを読み書きすることができます。デバイスがオンラインのときは、データを同期し、プッシュ同期を設定すると、アップデートが利用できることが他のデバイスにすぐに通知されます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-sync.html

同様のサービスとして[AWS AppSync][link-1]というものもあります。
AppSyncのほうが高性能の為、新規サービス立ち上げの際にはAppSyncの利用を推奨しているようです。

[link-1]:https://aws.amazon.com/jp/appsync/

# まとめ
ウェブアプリ・モバイルアプリの面倒くさいユーザ管理を任せられる良いサービスだと思います。
特に、モバイルアプリ開発の際はAWS Amplifyとの親和性が高く、使い勝手が良いと思います。
WARNING: `pyenv init -` no longer sets PATH. の対応

ターミナルを開けると、ある日こんな警告が出ていました。

```shell
WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.
```

結論: https://github.com/pyenv/pyenv/blob/master/README.md に従って環境設定し直しましょう。

例えば Mac + ZSH + Homebrew の組み合わせの場合は以下の実行が必要です。

    echo 'eval "$(pyenv init --path)"' >> ~/.zprofile

うっかり警告どおり `pyenv init` を実行してしまうとこんな表示が出るのですが:

```shell
# (The below instructions are intended for common
# shell setups. See the README for more guidance
# if they don't apply and/or don't work for you.)

# Add pyenv executable to PATH and
# enable shims by adding the following
# to ~/.profile and ~/.zprofile:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

# Load pyenv into the shell by adding
# the following to ~/.zshrc:

eval "$(pyenv init -)"

# Make sure to restart your entire logon session
# for changes to profile files to take effect.
```

あれ、私の環境には ~/.profile も ~/.zprofile も無いのにどうしたら良いんだ！と混乱する羽目になってしまうので、余計な事考えずに README.md を読むべきだという結論です。
Android Studio　基礎　画面作成方法

AndroidStudioでアプリの画面作成方法の基礎をまとめようと思います。

##レイアウトとは
レイアウトとは、GUIの配置を決めるための仕組みです。
このレイアウトを使うことによって、Androidアプリの画面を簡単に作成することができます。
Android開発においては.xmlで記述してGUIを配置していきます。

##レイアウトの種類
画面を構成する要素（パーツ）は大きくわけて２種類あります。

``ビュー、(ウィジェットとも言う）``
``ビューグループ(レイアウト部品とも言う）``

``ビュー``は画面部品そのもののこと

##res/layoutファイルを編集する

このレイアウトファイルを編集するための専用エディタを**レイアウトエディタ**と呼びます。
レイアウトエディタの右上にボタン群があります。
![スクリーンショット 2021-06-09 12.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/f8a2c5fa-f7d4-e76d-5c7e-bfa3f87cff95.png)
``コードタブ``を選択、コードモードにした状態で、XMLコードを記述していく。
→このXMLコードをAndroid Studioが解析してグラフィカルに表示してくれるのが、``デザインタブ``

layoutファイルを理解する為にも、まずはXMlコードで記述していく。


##主なレイアウト部品

|　タグ | 内容 |
|:-|:-|
|LinearLayout|一番扱いやすいレイアウト|
|TableLayout|表形式で画面部品を配置|
|FlameLayout|画面部品を重ねて配置|
|RelativeLayout|画面部品を相対的に配置|
|ConstraintLayout|RelativeLayout同様に、画面部品を相対的に配置|

##主な代表的なビュー

|　タグ | 内容 |
|:-|:-|
|TextView|文字列の表示|
|EditText|テキストボックス（1行や複数行、数字のみなどの入力制限も可能）|
|Button|ボタン|
|RadioButton|ラジオボタン|
|CheckBox|チェックボックス|
|SeekBar|スライダー|
|RatingBar|☆でレート値を表現|
|Switch|ON/OFFが表現できるスイッチ|

画面構成はタグの組み合わせ

Androidの画面ではレイアウト部品とビュー部品を階層的に組み合わせて使います。

`LineaLayout`
　　∟　`TextView`

####サンプルコード

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#A1A9BA"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvLabelInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="10dp"
        android:background="#ffffff"
        android:text="@string/tv_msg"
        android:textSize="25sp" />
</LinearLayout>

```

####解説
``「android:id="@+id/tvLabelInput"」``は、画面部品のID設定を指定している。
IDを指定することによって、アクティビティ内で、**「@+id/・・・」　・・・**の名前で部品にアクセスできるようになる。


つまり、ここでは、「tvLabelInput」と言う名前でアクセスできるように設定している。

``android:text="@string/tv_msg"``は、画面部品が表示される時の文字列を設定します。
ファイル構成については、→　https://bit.ly/3g58tQH

基本的に文字列はstrings.xmlに記述し、そこからもらってくる。
その方法が**「@string/・・・」** **・・・**に、**strings.xml**で宣言した、**name=・・・**　の**・・・**を指定する。　



```strings.xml
<resources>
    <string name="app_name">画面部品サンプル</string>
    <string name="tv_msg">お名前を入力してください。</string>
</resources>

```

##tips -入力の種類を設定する属性-
今回のサンプルコードでは出てきていないが、``android:inputType``についてまとめておきます。

|値 | 内容 |
|:-|:-|
|text|通常の文字列入力|
|number|数値の入力|
|phone|電話番号の入力|
|textEmailAddress|メールアドレスの入力|
|textMultiLine|複数行の入力|
|textUri|URIの入力|



##tips -数値の単位-

数値を指定する場合は、pxは使用しない。
理由は、画面密度に依存するから。Android端末ごとに画面密度が違うから不向き。

→``dp``、``sp``を使う
``dp``は、密度非依存ピクセルのこと。
密度が異なっていても、OSがサイズ計算をしてくれて、見た目が同じようになる。

``sp``は、スケール非依存ピクセルのこと。
dpと似ているが、画面密度の違いだけでなく、ユーザーが設定した文字サイズも考慮している。

####使い分け
ビューやビューグループのサイズ設定には、``dp``を使用し、
テキストサイズの設定には``sp``を使用する。
VirtualBox　ダウンロードからインストール,仮想化について

VirtualBoxでLinux・CentOS環境構築の第一歩です。

本ページではVirtualBoxのダウンロードとインストール,
関連用語と疑問に対してのまとめを書いています。

#前提条件
ホストOS：Windows10
VirtualBox 6.1.22をインストールします。

#手順
基本的にずっと「Next > 」で進めて問題なさそうでした。

###VirtualBoxダウンロード
VirtualBox
https://www.virtualbox.org/
>左のメニュー一覧のDownloads
→https://www.virtualbox.org/wiki/Downloads
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620534/660d3cb7-655d-d31d-0b3b-3b77ebca35a0.png)



**ホストOSに合った**最新のパッケージをダウンロード
→Windows hosts
VirtualBox 6.1.22

###VirtualBoxインストール
ダウンロードしたインストーラ*VirtualBox-6.1.22-144080-Win.exe*を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620534/763f9a2a-1e6d-c9d0-3742-b8f2d0b31e0d.png)

前述の通り、カスタム等しなければ、「Next > 」で「Install」まで進めて構わないでしょう。

途中、スタートメニューやデスクトップにショートカットを追加するか☑選択できます。
ネットワークが一時的に切断される警告も出ますが、他の優先タスク等なければ「Yes」で進めるしかないでしょう。

インストールが完了し、「Finish」をクリックして終了する際に起動する☑を入れると立ち上がります。

以下のような画面が表示されれば、起動完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620534/2a076a4b-9431-e943-987a-a827a9f57f4c.png)


#FAQ　トラブルシューティング
####インストールできないときは
Hyper-Vが有効になっているためインストールできない可能性があります。
→Hyper-Vを無効,☑を外しましょう。

>Windowsスタート>コントロールパネル>プログラム>:shield:Windowsの機能の有効化または無効化

Hyper-Vにチェックが入っていないことを確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620534/302e39ac-1d49-3d8f-e5ef-e00bfe6dbc1c.png)


#仮想化について　用語と疑問まとめ

####ホストOS,ゲストOSとは
ホストOS:仮想マシンを乗せる土台になるOS,物理ハードウェアのOS
ゲストOS:仮想マシンにインストールしたOS
　*ホストかホストではないか…*
　　*仮想マシンを乗せる土台か、それ以外か*

ハイパーバイザー型:ホストOSと仮想化ソフトウェア,両方の役割,より直接的に

####仮想マシンを導入する理由
・一つのマシン複数アプリケーション
　　アプリケーション毎にマシンを用意する必要ありません。
・コスト削減
　　上記のように、仮想化の以前はマシンを用意する必要があった
    調達にかかる時間も削減できることに
・管理も楽
　　各アプリケーションにリソースを適当に割り当てられます。

####仮想化とクラウドの違い
仮想化は技術そのもの,
クラウドは仮想化で作った場所・環境の名前　

#参考文献
####OracleVM VirtualBoxのインストール手順＜Windows向け＞
https://sukkiri.jp/technologies/virtualizers/virtualbox/virtualbox-win_install.html

####仮想マシンとは？よく聞く"仮想化" "仮想マシン"の基礎知識と特徴を解説
https://ferret-plus.com/8461
####クラウド・コンピューティング　クラウドと仮想化の違い
https://www.redhat.com/ja/topics/cloud-computing/cloud-vs-virtualization
####仮想化　ハイパーバイザーとは
https://www.redhat.com/ja/topics/virtualization/what-is-a-hypervisor

####仮想マシンとは | ホストOSとゲストOSの違いを解説
https://boxil.jp/mag/a1300/

簡単になりましたが以上です。
何か間違い等ありましたらご教授いただけると嬉しいです！
Symbol Waiting for broker to start 対策方法

SymbolのNodeを起動しようとすると、以下のようなエラーが出てうまくいかないことがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309172/2368d17c-cba1-3963-2840-412e64dc9915.png)

## 1　Dockerグループの確認
ユーザーがdockerグループに追加されている必要があります。
くれぐれも、rootユーザーでNodeを実行しないように。

### 確認方法

~~~
groups 
~~~

docker グループが含まれていればOK

### 追加方法

~~~
usermod -aG docker <ユーザー名>
~~~

参考：https://forum.nem.io/t/trouble-getting-symbol-supernode-up-and-running/29133

## 2 targetフォルダの削除

結局の所、このエラーが起きるときはデータベースに何らかの異常が起きてうまく復旧できていないことが多い気がします。
（MongoDBにアクセスできる設定で立ち上げたら、セキュリティの設定が適切にできておらずハッキングされたことが原因でこのエラーが出たことも...）
targetフォルダを削除して、再度composeし直すことで復旧しました。
必要なymlファイルなどは事前に救出しておきましょう。
IE非対応表示に関してベストプラクティスを考える

# 🙁課題
IEの利用者向けに「IEは非対応です。別のブラウザをお使い下さい」という表示をしようと思います。ところが**IEの判定ルーチン部分や画面表示に関してはIEで処理できる必要があり**、Webpack導入済みの環境で真面目にこれをやろうとすると、IE対応の必要なファイルとそうでないファイルを切り分けて云々……とする必要があります。
IE判定なんて複雑なものでもなし、告知画面そのものは所謂ペライチでJSすら使わないレベルなのに、これは面倒or本末転倒……っていうのが今回解決したい課題となります。

# 👴結論
**そもそもIE判定及び告知画面についてはWebpackで扱わず、手打ちのHTML,CSS,JSファイルを作ってwebpackの出力先フォルダに突っ込んだ方が楽なのでは。** babel関係も不要で、Gitの無視ファイル設定だけちょこっと弄るだけですし。

# 手順
## 1. IE判定を行い、非対応の告知画面ページへ遷移するルーチンを書いたJSファイルを作る
```js
const isIe = function (userAgent) {
  return (userAgent.indexOf('msie') != -1 || userAgent.indexOf('trident') != -1)
}
if (isIe(window.navigator.userAgent.toLowerCase())) { location.href = "【警告画面のHTMLファイルのパス】" }
```
もちろん、ここでDOMを書き換えて告知画面を出してもいいのですが、

- 何かの拍子にwebpackでバンドルしたjsと干渉しそうで不安
- 書き換え処理のJSもIE11対応する必要がある
- 告知画面のHTMLファイルは要件の性質上、直書きできる可能性が高く、この場合エディタの補完が効く

という点を考慮して、告知画面は別ファイルに切り出してます。
それから[IE11でもconstは使えます。](https://blog.capilano-fw.com/?p=1273#const)

## 2. メインとなるHTMLファイルのheadタグ内にWebpackで生成したファイルより先に記述する
```html
<head>
  <script type="text/javascript" src="【IE判定＆遷移ルーチン（要IE11対応）】.js"></script>
  <script type="text/javascript" src="【Webpackで作ったファイル】.js"></script>
</head>
```

## 3.非対応の告知画面はざっくり手打ちの静的ファイルだけで構成
「IEは非対応です。別のブラウザ使ってください」という旨の表示以外何もしようがないので、手打ちHTMLとCSSだけで何とかなる範疇かと。HTMLファイル内に全部書いてしまってもいいかもしれませんね。

もうちょっとユーザーフレンドリーにするなら、エラー画面を見ているユーザーはWindowsユーザーかつEdgeをインストール済みであることが期待できるので、「Edgeで開く」リンクを置いておくといいと思います。
マイナーなテクニックですが、Windowsの場合、レジストリにパラメータを登録しておくと、ブラウザからURLスキームを使ってインストールしてあるソフトを呼び出すことができるんですね。
そしてedgeに関してはインストールした時に登録済みなので、

```html
​<a href="microsoft-edge:【edgeで開かせたいURL】">Edgeで開く</a>​​​​​
```

こういうリンクを踏ませるだけでedgeで開かせることができます。
ただまぁメジャーなChromeじゃなくてマイナーなEdgeを薦めるのはどうか、という葛藤もありますが、IE11を使ってるユーザー相手ですとねぇ……。B2BでITとは縁遠い業界相手になるほど刺さるかと。

# 備考
告知画面の表示ですが手抜きしすぎて、適当な背景＋画面のど真ん中に「Internet Explorerはサポート外です。別のブラウザをお使い下さい」という表示を出すだけだと、**怪しげなフィッシングサイトに飛ばされた感が半端ないです**😅 背景ぐらいは通常サイトに揃えるなり、一緒に会社ロゴを表示するなり、多少なり公式アピールをした方がいいです。

# 参考
[使用してるブラウザを判定したい - Qiita](https://qiita.com/sakuraya/items/33f93e19438d0694a91d)
[Microsoft EdgeでWebページを開くインターネットショートカット  初心者備忘録](https://www.ka-net.org/blog/?p=6040)
transformersのBertJapaneseTokenizerでMeCabオプション

[transformersのBertJapaneseTokenizer](https://huggingface.co/transformers/model_doc/bert_japanese.html)でMeCabのオプションを指定する
NEologdを使いたいときとか

## やり方
BertJapaneseTokenizerは`mecab_kwargs`でオプション指定できるが、実際に使っている例があまりなくてわかりづらいので紹介

```py
from transformers import BertJapaneseTokenizer

# 通常のpretrainedモデル呼び出し
tokenizer = BertJapaneseTokenizer.from_pretrained(
    "cl-tohoku/bert-base-japanese-whole-word-masking",
    do_subword_tokenize=False)

# MeCabオプションを指定したいとき
tokenizer2 = BertJapaneseTokenizer.from_pretrained(
    "cl-tohoku/bert-base-japanese-whole-word-masking",
    do_subword_tokenize=False,
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d /path/to/dic"})
# ※辞書を差し替えたいときは必ず"mecab_dic": Noneを指定する(デフォルトではipadicが読み込まれる)

# 自分で用意したボキャブラリーを使いたいとき
tokenizer3 = BertJapaneseTokenizer(
    "/path/to/vocab.txt",
    do_subword_tokenize=False,
    word_tokenizer_type="mecab",
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d /path/to/dic"})
```

## 上記の方法でNEologdを指定してみる
```py
>>> tokenizer.tokenize('ガッキー逃げ恥婚')
['ガッキー', '逃げ', '恥', '婚']
>>>
>>>
>>> tokenizer2.tokenize('ガッキー逃げ恥婚')
['ガッキー', '逃げ恥', '婚']
```
NEologdを使った方は`逃げ恥`が一単語として認識されていることがわかります

## 注意点
NEologdを使いたいときなど、dicを指定するときは`"mecab_dic": None`を指定する必要があります
これはソースでいうと[この辺](https://github.com/huggingface/transformers/blob/master/src/transformers/models/bert_japanese/tokenization_bert_japanese.py#L240-L277)が理由で、`MecabTokenizer`クラスは`mecab_dic`引数にデフォルトで`ipadic`が入っていて、明示的に`None`を指定しないと自動的に`-d`オプションが指定されてしまうからです

## その他
MeCabのオプションはもちろん`-d`だけでなく`-u`とか他のオプションも使えるので、いろいろよしなに指定したらいいと思います
内部的にはここで[指定したオプションを受け取っているのはMeCabラッパのfugashiのGenericTagger](https://github.com/huggingface/transformers/blob/master/src/transformers/models/bert_japanese/tokenization_bert_japanese.py#L285)なので、fugashiのGenericTaggerで受け取れるものなら使えるのではないかと
(試してないけど、[wrapperオプション](https://github.com/polm/fugashi#dictionary-use)とかもいけるのかもね？)
SOQLのLike句でバインド変数を使う

使ったことはないけど、可能みたいです。


```
Set<String> fuzzyMatches = new Set<String> { 'www.abc.com%', 'www.defg.com%', 'etc.com%' };
List<Account> records = [SELECT phone FROM Account WHERE website LIKE :fuzzyMatches];
```

この質問のために探してみました。
https://trailblazers.salesforce.com/answers?id=9064S000000DwKo
ブロックチェーン 6/7のニュース

G7、ステーブルコインへの見解を示す
エルサルバドル、ビットコインを法定通貨として採用か
テキサス州知事、ブロックチェーン・暗号資産の発展ため、法的枠組みを構築へ
米Square、太陽光発電を利用したマイニング施設建設へ
Solana、約320～490億円で資金調達中か
double jump.tokyo、NFT管理ウォレットを核としたエンタメDXのSaaS「N Suite」の提供開始
Datachainのインターオペラビリティプロジェクト「YUI」Hyperledger Labsプロジェクトに
竹中鋼管が再エネ100%調達開始　アスエネのブロックチェーン活用しCO2排出削減
JVCEAの第2種会員にCrypto Garage入会
Dev Protocol、オタクコイン協会戦略パートナーへ参画


幻冬舎「あたらしい経済」、6/7版『ブロックチェーン・仮想通貨ニュース』より
IBM Cloud の初期データ移行方法 - Power Systems Virtual Serverにおける考慮点

柔らか層本 第4章にデータ移行方法について紹介されていますが、Power Systems Virtual Server (以降 Power VS) の場合にどのような考慮点があるのかをまとめてみました。
https://ibm.ent.box.com/v/ibmcloud-yawaraka

前提として、柔らか層本 第3章 (3-6) でPower VS のネットワーク接続について理解しているものとします。（Power VSのネットワークは、Classic Infrastructure と呼ばれるIBM Cloud のネットワークとは異なるネットワークセグメントにあります。パブリック接続、プライベート接続、それぞれの接続パターンが柔らか層本で図解されています。）


初期データ移行には、大きく分けてネットワーク転送とデバイスを利用した物理輸送があり、それぞれに2つの方法があります。各4つの方法におけるPower VSの考慮点についてみていきます。

1. ネットワーク転送
1-1. Public側から、インターネット/VPN経由
1-2. Private側から、専用線(Direct Link) 経由

2. デバイスを利用した物理輸送
2-1. IBM Data Transfer Service (DTS)
2-2. Mass Data Migration (MDM) 


#1. ネットワーク転送
##1-1. Public側から、インターネット/VPN経由
お客様サイトから インターネット/VPN経由でIBM Cloud Object Storage (ICOS) にデータをアップロードしてデータ転送を行う方法です。高速転送Asperaを無償利用することができます。

###Power VS における考慮点
お客様サイトからICOSにデータをアップロードするところまでは同じです。ICOSに上げたデータをPower VSから読み取る際は、Classic Infrastructure 経由となります。Power VSとClassic Infrastructure の間の無料Direct Link Conncectを設定した上で、Classic Infrastructure にリバース・プロキシ、あるいはNAT機能が必要となります。

##1-2. Private側から、専用線(Direct Link) 経由
あらかじめ専用線(Direct Link)を接続し、それを利用してデータ転送を行う方法です。	

###Power VS における考慮点
お客様サイトとClassic Infrastructure の間のDirect Linkは通常通り有償です。Classic Infrastructure と Power Systems VS の間は無料のDirect Link Connect をご利用頂くことができ、設定が必要です。Classic Infrastructure にリバース・プロキシ、あるいはNATを構成する事により、お客様サイトから Power VS にデータ転送が可能となります。

※ 2021年5月: 大阪はMegaport を利用してPower VSのネットワークセグメントに直接専用線接続できるようになりました。（東京は未だです。）


#2. デバイスを利用した物理輸送
##2-1. IBM Data Transfer Service (DTS)
お客様デバイスをデータセンターに送付/持ち込み、IBM Cloud側でDTSラックに格納しセッティングすることにより、Classic Infrastructure のベアメタル・サーバーからデバイスをiSCSI マウントできるようになります。

###Power VS における考慮点
デバイスはClassic Infrastructure 側のネットワークに接続され(※)、ベアメタル・サーバーからiSCSI マウントできます。Classic Infrastructure と Power VS の間は無料Direct Link Connect をご利用頂くことができ、設定をした上でPower VSからベアメタル・サーバーにマウントしたデバイスにアクセスできるようになります。
※　デバイスの直接Power VSネットワークへの接続は未対応です。また、DTS のデバイスを直接Power VSにiSCSI マウントすることもできません。


##2-2. Mass Data Migration (MDM) 
大容量データをセキュアに保存する専用デバイスをIBM Cloud からお客様サイトに送付し、返送いただく方法です。これにより、テラバイト〜ペタバイト級のデータを IBM Cloud Object Storage に安全に移動することができます。

###Power VS における考慮点
ICOSへのデータ移行は上記の通りです。ICOSに上げたデータをPower VSから読み取る際は、Classic Infrastructure 経由となります。Power VSとClassic Infrastructure の間の無料Direct Link Conncectを設定した上で、Classic Infrastructure にリバース・プロキシ、あるいはNAT機能が必要となります。


#まとめ
ネットワーク接続を把握できれば、Power VSでもx86系と同様に初期データ移行できることが分かりますね。
Tips: Hive, Prestoで配列に値が含まれているかを判定する方法

## これは何

https://qiita.com/official-events/d523df99d6479293ffa7

の参加記事です。


## はじめに
データとして配列を持っているテーブルを考えます。

| id | ids |
|:-:|:-:|
| 1 | [2, 3]|
| 2  | [1, 3]  |
| 3  | [1, 2]  |


このようなテーブルがあった時、配列データに値が含まれているかどうかで絞り込みや結合などを行いたい場合もあると思います。
その方法を紹介します。

## Presto

Prestoには`CONTAINS(array, value)`という関数があります。これが第一引数に渡した配列に第二引数に渡した値が含まれているかどうかを判定する関数になります。これを用いてこのようなことができます。

```sql:例(WHERE)
SELECT *
FROM data
WHERE CONTAINS(ids, 1)
```

```sql:例(JOIN)
SELECT *
FROM data d1
INNER JOIN data d2 ON CONTAINS(d1.ids, d2.id)
```


## Hive
Hiveにも`ARRAY_CONTAINS`という関数があるのでPrestoと同様にかけます。

```sql:例(WHERE)
SELECT *
FROM data
WHERE ARRAY_CONTAINS(ids, 1)
```

```sql:例(JOIN)
SELECT *
FROM data d1
INNER JOIN data d2 ON ARRAY_CONTAINS(d1.ids, d2.id)
```

## 参考文献

https://prestodb.io/docs/current/functions/array.html

https://cwiki.apache.org/confluence/display/hive/languagemanual+udf
STM32F103C8のGPIOの速さを測る


x 指摘がありましたのでGPIOの速度の条件を明確化しました。6/10

目的
GPIOのテスト
WS2812Bを光らせる。光らせたい。

構成
windows 10 20H2
Arduino
1.8.13(Windows Store 1.8.42.0)
STM32duino 1.9.0

BluePill F103C8


digitalWriteの速さは、404khz
ODRの速さは、1.027Mhz

参考

https://www.aitendo.com/product/13348


```c++

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PC13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(PC13, HIGH);   // turn the LED on (HIGH is the voltage level)
  //delay(1000);                       // wait for a second
  digitalWrite(PC13, LOW);    // turn the LED off by making the voltage LOW
  //delay(1000);                       // wait for a second
}



```


```c++



// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PA7, OUTPUT);
}
                      //     65432109876543210
    int on1  = GPIOA->ODR | 0b0000000010000000;
    int off1 = GPIOA->ODR & 0b1111011101111111;

// the loop function runs over and over again forever
void loop() {
  GPIOA->ODR = on1;
  //delay(1000);                       // wait for a second
  GPIOA->ODR = off1;
  //delay(1000);                       // wait for a second
}


```
PythonでLINEに通知するための爆速メモ

YouTube: https://youtu.be/ojKO37qO700

[LINE Notify](https://notify-bot.line.me/ja/) は、トークンを発行してコピペするだけでLINEと一瞬で連携できてとても簡単で簡単なので、PythonからLINEに通知するためのYouTube用の爆速備忘録として掲載します。

# LINE側

https://notify-bot.line.me/ja/

## ログイン

ページの右上のログインボタンから、メールアドレスとパスワードを入力してログイン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/d6eae8c5-ae79-ed10-27bc-67c670b36ce0.png)

##マイページに移動

右上がログインから、LINEアカウントのユーザー名に変わっているので、クリックしてマイページを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/e62b91e1-fc18-79a3-ecf1-7b2d8f4387a3.png)

## トークンを発行

一番下に「トークンを発行する」というボタンがあるのでクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/e69d7b6f-ef6f-79bd-7447-2e34e775b3a5.png)

## トークン名と送り先の設定

トークン名を適当に書いて、「1:1でLINE Notifyから通知を受け取る」を選択して「発行する」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/698f49d0-cd98-b538-e4c9-10363edb07cb.png)


## 発行したトークンをコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/0926d203-382e-bd6d-88bb-d6193b02dbf0.png)

発行したアクセストークンは、閉じると二度と見れなくなってしまうので、どこかメモ帳などで残しておくと良いですね。

# Python側

下記のコードの、```text```に送りたいメッセージ内容と、```token```の中身を先ほど発行したアクセストークンに書き換えて実行します。

```linenotify.py
# ライブラリ
import requests

# 送りたい内容
text = 'こんにちは〜！'

# アクセストークン -> LINE Notify ( https://notify-bot.line.me/ja/ ) のサイトからトークンを発行
token = '*******************************************'

# 送信
url = "https://notify-api.line.me/api/notify"
headers = {'Authorization': 'Bearer ' + token}
payload = {'message': text}
requests.post(url, headers=headers, params=payload)
```

LINEに通知が来たら、成功です。

# おまけ

## スタンプも送りたい場合

```sticker.py
# スタンプ送信　https://developers.line.biz/ja/docs/messaging-api/sticker-list/#sticker-definitions
url = "https://notify-api.line.me/api/notify"
headers = {'Authorization': 'Bearer ' + token}
payload = {
    'message': text,
    'stickerPackageId': 789,
    'stickerId': 10855,
    }
requests.post(url, headers=headers, params=payload)
```

スタンプのIDは[こちら](https://developers.line.biz/ja/docs/messaging-api/sticker-list/#sticker-definitions)
https://developers.line.biz/ja/docs/messaging-api/sticker-list/#sticker-definitions

## 画像も送りたい場合

```img.py
# 画像を保存（Google Colaboratory を使う場合）
from google.colab import files
uploaded_file = files.upload()

# 画像送信
img = '***************.jpg'
files = {'imageFile': open(img, 'rb')}
payload = {
    'message': '保存された画像です。',
    }
requests.post(url, headers=headers, params=payload, files=files)
```

Google Colaboratory で画像を保存できない方は[こちら](chrome://settings/cookies)からcookiesの許可をしてください。
chrome://settings/cookies
任意の色をくり抜いて画像を合成する方法 2(仮)

※画像が多いです


今回はこれと
---
![weather_report_for_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263329/feb5c6ea-fc06-2c96-3a28-b4dcb1f05357.png)
これを組み合わせて
---
![weather_material_FF0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263329/e33f58bd-1d1f-f3ce-8e50-fba20cd82d25.png)
---
![weather_mixed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263329/6f585c49-9a3d-038e-09a3-040e0a39a118.png)
---
これを作ります。(日本の形が変なのは許してください。)
python、pillow、opencv、そしてnumpyを使います。

```python
def mixTest():
    material = cv2.imread("./resources/weather_material_FF0000.png")
    bgrLower = np.array([0, 0, 255])
    bgrUpper = np.array([0, 0, 255])

    # 抜き出す色は白に、それ以外は黒になる。
    MonoMask = cv2.inRange(material, bgrLower, bgrUpper)
    cv2.imwrite("./resources/mask.png", MonoMask)

    orImg = Image.open("./resources/weather_report_for_test.png").convert("RGBA")
    mrImg = Image.open("./resources/weather_material_FF0000.png").convert("RGBA")
    msImg = Image.open("./resources/mask.png").convert("L")
    im = Image.composite(orImg, mrImg, msImg)
    im.show()
```
stress-ngコマンドでCPU、メモリ、ディスクに負荷をかける

## 概要
stress-ngコマンドで負荷検証をするための簡単な使い方。

## 環境
- CentOS 7.8
- stress-ng 0.07.29

## Installation

```console
$ sudo yum -y install epel-release
$ sudo yum -y install --enablerepo=epel stress-ng
$ stress-ng -V
stress-ng, version 0.07.29
```

## CPU
`-c` は起動するプロセスの数。

CPU使用率100%

```console
$ stress-ng -c 1
```

CPU使用率50%

```console
$ stress-ng -c 1 -l 50
```

## メモリ
10秒間にメモリを1GB使用。
`-m` は起動するプロセスの数。

```console
$ stress-ng -m 1 --vm-bytes 1G --timeout 10
```

## ディスク
ディスクを2GB使用する

```console
$ stress-ng -d 1 --hdd-bytes 2G
```

## 書き込み速度を測る
ダミーファイルを作成して、書き込み速度を測る方法。計測する度にサーバーのキャッシュクリアを行う。

[/dev/zero](https://wa3.i-3-i.info/word11744.html)を使う。

```bash
# 10Gのダミーをファイル作成(1MiB*10000)
time dd if=/dev/zero of=zero.txt bs=1MiB count=10000; time sync
# 1Gのダミーをファイル作成(1MiB*1000)
time dd if=/dev/zero of=zero.txt bs=1MiB count=1000; time sync
# 1Mのダミーをファイル作成(1MiB*1)
time dd if=/dev/zero of=zero.txt bs=1MiB count=1; time sync
# 4kのダミーをファイル作成(4KiB *1)
time dd if=/dev/zero of=zero.txt bs=4KiB count=1; time sync
```

```console:実行例
$ time dd if=/dev/zero of=zero.txt bs=4KiB count=1; time sync
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000268956 s, 15.2 MB/s
 
real    0m0.003s
user    0m0.000s
sys 0m0.002s
 
real    0m0.007s
user    0m0.001s
sys 0m0.001s
```

| 表示 | 意味 |
| --- | --- |
| real %e | そのコマンドを実行するのにかかった時間 |
| user %U |そのコマンドを実行するのに使用したユーザーCPU時間 |
| sys %S | そのコマンドを実行するのに使用したシステムCPU時間 |

## 読み込み速度を計測
書き込み速度の計測で出力したファイルを読み込む。

```
$ time dd if=zero.txt of=/dev/null
```


## 参考
- [CPU、ディスク、メモリに負荷をかけるstress-ngコマンドの紹介(https://armadillo.atmark-techno.com/blog/53/4148)
- [stress-ngコマンドの使い方](https://qiita.com/hana_shin/items/0a3a615274717c89c0a4)
- [stressコマンドの使い方](https://qiita.com/hana_shin/items/b1d8cd559d1a326f4d42)
- [【AWS】NFSを測ってみる](https://labs.septeni.co.jp/entry/20140915/1437473598)