OmniAICreator/Qiita-1.07M huggingface dataset:
Dronecode Devマニュアル抜粋&翻訳 - PX4 Reference Flight Controller Design

#この記事は
Dronecode本家サイトの[PX4 Reference Flight Controller Design](https://dev.px4.io/master/en/hardware/reference_design.html)ページの抜粋・翻訳です。

※主に自分の理解用に書いています。

# PX4 Reference Flight Controller Design
現在最新のリファレンスデザインは第５世代で、第6世代の設計が進行中です。

## Binary Compatibility
[FMU](https://qiita.com/sakaeda11/items/289a1fba3800f6a7f0b8#fmu)の第1~3世代はオープンハードウェアとして設計されていますが、第4と5世代のFUMはピン配置および電源仕様のみを定義し、回路図は個々のメーカーに任される設計になっています。
互換性をより確実に保証するために、FMUv6以降は完全なリファレンスデザインモデルに戻ります。


## Reference Design Generations
- FMUv1: 開発用基盤 (STM32F407(CPUチップ), 128 KB RAM, 1MB flash) (現在は未サポート)
- FMUv2: Pixhawk (STM32F427(CPUチップ), 168 MHz, 192 KB RAM, 1MB flash)
- FMUv3: Pixhawk の2MB flashバリエーション (3DR Pixhawk 2 (Solo), Hex Pixhawk 2.1, Holybro Pixfalcon, 3DR Pixhawk Mini, STM32F427(CPUチップ), 168 MHz, 256 KB RAM, 2 MB flash)
- FMUv4: Pixracer (STM32F427(CPUチップ), 168 MHz, 256 KB RAM, 2 MB flash)
- FMUv4 PRO: Drotek Pixhawk 3 PRO (STM32F469(CPUチップ), 180 MHz, 384 KB RAM, 2 MB flash)
- FMUv5: Holybro Pixhawk 4 (STM32F765, 216 MHz, 512 KB RAM, 2 MB flash)
- FMUv6: 進行中 6s(STM32H7, 400 MHz, 2 MB RAM, 2 MB flash) というバリエーションと、6i (i.MX RT1050, 600 MHz, 512 KB RAM, external flash)というバリエーションがある


## Main/IO Function Breakdown
以下の図は、PixhawkシリーズフライトコントローラーのFMUとI/Oボードの間のバスと機能を示しています（なお、ボードとしては一つに組み込まれています）。

![px4_fmu_io_functions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124098/97d3503e-a91b-b648-3023-d6bc72d2e9b7.png)


一部のPixhawkシリーズは、小型化や複雑さ軽減のためや、特定の使用例に対応するために、I/Oボードなしで構築されています。
I/Oボードは、パラメーターSYS_USE_IO = 0を設定することによって無効になります。
I/Oボードが無効な場合は以下の様な挙動をします：

- 「MAIN」mixerファイルがFMUに読み込まれます（そのため、機体リファレンスにリストされている「MAIN」出力は、AUXというラベルの付いたポートに表示されます）。 AUX mixerファイルが読み込まれないため、AUX mixerファイルで定義されている出力は使用されません。
- RCからの入力はIOを経由せず直接FMUに送られます。

I/OボードのないフライトコントローラにはMAINポートがありますが、AUXポートはありません。
そのため、そういったフライトコントローラはAUXポートを使用しないか、（RCパススルーなど）特殊な用途のみに使用する機体に利用されます。そしてたいていは、モーターや重要な制御にMAINポートのみを使用するマルチコプターと（RC制御でのセーフティのない）自律型車両で使用されます。

注意：
>I/Oボードのないフライトコントローラーは、AUXポートを重要なフライトコントロールまたはモーターにマップする機体では使用できません（AUXポートがないため）。

ノート：
>I/Oボードのないメーカーのフライトコントローラーバリエーションは、多くの場合、I/Oボードを含むバージョンの「diminutive」版と呼ばれます。たとえば、Pixhawk 4 Miniや_CUAV v5 nanoなど。


ほとんどのPX4 PWM出力は、ミキサーのMAINまたはAUXポートにマッピングされます。
カメラトリガーや[Dshot ESC](https://docs.px4.io/master/en/peripherals/dshot.html)を含むいくつかの特定のケースは、FMUピンに直接マッピングされます（つまり、フライトコントローラーにI/Oボードがあるかどうかに応じて、MAINまたはAUXに出力されます）。
local にデータベースの host も client も無い時に docker でのちょろっとした確認方法

- Updated at 2020-07-12: Microsoft SQL Server, Presto を追加

手元の端末でちょろっとqueryの確認をしたいけど、そもそもローカルにclientすらインストールしていなかった時の不便を解決するための備忘録です。サーバ側のバージョン違いによる機能や挙動の確認は docker tag で制御する想定。

## Postgresql

- `p15`, `mydb` はご自由に変更を
- `docker exec` をすぐに実行してしまうと `docker run` の初期化が終わっておらずエラーが出ることがあるが、深呼吸して時間をおいて実行すれば動きます

```bash
$ docker run --rm -d --name=p15 -e POSTGRES_USER=u -e POSTGRES_PASSWORD=p -e POSTGRES_DB=mydb postgres:15
$ docker exec -it p15 psql -h localhost -U u -d mydb
# inside docker
exit;
# outside docker
$ docker stop p15
```

## MySQL

- `m8`, `mydb` はご自由に変更を

```bash
docker run --rm -d --name=m8 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -e MYSQL_DATABASE=mydb mysql:8
docker exec -it m8 mysql -h localhost mydb
# inside inside docker
exit;
# outside docker
docker stop m8
```

## SQLite

- 公式dockerイメージは見つからなかった。
- 出力をカンマ区切りにするためには　`$'\t'` を `,` に変更すればよい

```bash
docker run -it --rm nouchka/sqlite3 sqlite3 -header -separator $'\t'
sqlite> .q
```

## Microsoft SQL-Server

- [公式手順](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash) 通り


```bash
# local
docker run --rm -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
   -p 1433:1433 --name sql1 \
   mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P "<YourStrong@Passw0rd>"

# SQLコマンド後に結果の表示に `go` とタイプする必要がある。 
# inside docker
1> exit

# local
docker stop sql1
```

## Presto

- [GitHub README](https://github.com/prestosql/presto/blob/master/docker/README.md) 手順を踏襲

```bash
docker run --rm -d -p 8080:8080 --name presto prestosql/presto
docker exec -it presto presto
# inside docker 
presto> exit

# local
docekr stop presto
```


## Trino

- [Github Page](https://github.com/trinodb/trino/blob/master/core/docker/README.md) 手順を踏襲

```bash
docker run --rm -p 8080:8080 --name trino trinodb/trino
docker exec -it trino trino

# inside docker
trino> show catalogs;
trino> use tpch.sf100;
trino> show tables;
trino> show columns from customer;
trino> exit
```
OctoberCMSでPaginatorをカスタマイズしてみた（Customizing The Pagination View on OctoberCMS）

#TL; DR
適当なPluginを作って、その中にviewsディレクトリを切りhtmを作成する。
ペジネータは$paginatorで渡される。

#やりたかったこと・やったこと
Laravelでは、適当にbladeファイルを作ることでカスタムペジネータを作れる。
(eg.) https://qiita.com/C_HERO/items/8e1203e1d3a773fd83d0

ならばLaravelベースのOctoberCMSでも同じことができるのではないか？とググってみたものの、やってる人が皆無だったのでトライアンドエラーでどうにかしてみた。

具体的に言うと、backend/CMSのPageで

```
 {{ results.appends(this.page.query).links()|raw }} 
```

みたいな書き方をしている部分があったので、そのままカスタムペジネータをねじ込めないかなと試行錯誤したという話。（this.page.queryは別途定義した引き継ぎたいクエリストリング。withQueryStringが使えない悲しみ……）

もちろんそのままPage内に書いてもよかったのだけど、けっこうたくさんのページに共通して入れたかったので再利用性を高めたかったのと、appendsをちゃんと引き継いでくれるか不安？だったので。

#やり方
まず、適当なPluginを作る。ここではTest.Paginateとする。

その後、Test.Paginateのディレクトリ配下（plugins/test/paginateあたり？）にviewsというディレクトリを新規で切る。そして、その中にカスタムペジネータとして使いたいhtmファイルを作成。ここでは仮にpaginator.htmとする。

で、以下みたいな書き方をする。ご覧の通り、$paginatorとしてペジネータ変数が渡されます。

```HTML:paginator.htm
{% if paginator.lastPage > 1 %}
<ul class="pagination">

    {% if paginator.currentPage > 1 %}
        <li>
            <a class="button " href="{{ paginator.previousPageUrl }}"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
        </li>
    {% else %}
        <li>
            <i class="fa fa-arrow-left" aria-hidden="true"></i>
        </li>
    {% endif %}
    
    {% for page in range(1, paginator.lastPage) %}
        <li>
            <a href="{{ paginator.url(page) }}">{{ page }}</a>
        </li>
    {% endfor %}

    {% if paginator.lastPage > paginator.currentPage %}
        <li>
            <a href="{{ paginator.nextPageUrl }}" class="button"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
        </li>
    {% else %}
        <li>
            <i class="fa fa-arrow-right" aria-hidden="true"></i>
        </li>
    {% endif %}

</ul>
{% endif %}
```

もちろんタグ構造とかロジックとかは別で作ってください。ただし、PageとかComponentっぽくonStartとかでPHPの埋め込みができないので注意。Twigで頑張るか、別途コントローラっぽくPageを使ってviewへデータを渡しましょう。viewへのデータの渡し方は後述します。

そしてこれをPageへ埋め込むには、

```
{{ results.appends(this.page.query).links('test.paginate::paginator')|raw }}
```

こういう書き方をします。で、もしPageからviewにデータを渡したければ、

```
{{ results.appends(this.page.query).links('test.paginate::paginator', {"test": "test"})|raw }}
```

こんな感じ。Twigでは["test" => "test"]みたいな書き方をするとエラー吐きます。

これでたぶんペジネータが表示されてくれるはず。

#おわりに
~~正直なところ、ペジネータのviewはPlugin配下に置くんではなくPartialとかにしたいんですが、たぶんlinksで参照できなそうなんですよね。かなC~~
よくよく考えたら、普通にPartialへpaginator変数渡して動かせばいいじゃないですかね。アホか。

まあ、いい感じに動いてるのでいいとします。動くコードが正義。なにかいい感じの方法ありましたら教えていただけると嬉しいです。

#参考

https://laravel.com/docs/7.x/pagination#customizing-the-pagination-view
https://qiita.com/C_HERO/items/8e1203e1d3a773fd83d0
https://octobertricks.com/tricks/customize-pagination-markup
https://octobercms.com/docs/services/response-view#views
Espresso入門

# はじめに
AndroidでUIテストをするためには何を使うのが良いか調べて見たところ、
単一のアプリのUIテスト方法として [Espresso](https://developer.android.com/training/testing/espresso)がDeveloperGuideでも紹介されていたので、試してみました。
# 導入〜テスト作成まで
AndroidStudioで簡単なプログラムを作成して、それに対するUIテストを書いてみました。

が、~~面倒くさそう~~難しそうなので、書くのは大変そうですね...

いい方法がないか調べていると、DeveloperGuideにもこんなページが..

**[Espresso テスト レコーダーで UI テストを作成する](https://developer.android.com/studio/test/espresso-test-recorder?hl=ja)**

この方法が使えるならと..試しみました。。

SampleにAndroidStudioのプロジェクト作成で一発で作成できるLoginActivityを..

<img width="902" alt="スクリーンショット 2020-06-21 12.06.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/413d09e8-f5bf-b0a7-f805-35b121c4015a.png">

出来上がるアプリはこんな感じのシンプルな画面です。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/556e813d-2d71-7e21-e8d3-e47d02b2323f.png" />

プロジェクトを作成して、Espressoを実行..

<img width="1182" alt="スクリーンショット 2020-06-21 11.22.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/4db0a4fd-4ee0-3096-afd6-bb43511d694f.png">


アプリが起動して、IDとパスワードを入力して、ボタンをタップしてみました。
すると、以下のキャプチャのように記録されます。
（マシン性能によりそうですが、実際は結構重く、入力もすんなりできませんでした..）

<img width="476" alt="スクリーンショット 2020-06-21 11.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/73f00426-4e7a-c41e-d501-2babec2412a1.png">

OKをタップするとテストクラスを出力できます。

コードはこんな風に出力されます。
テストクラスなので、実行できます。

```kotlin
@LargeTest
@RunWith(AndroidJUnit4::class)
class LoginActivityTest {

    @Rule
    @JvmField
    var mActivityTestRule = ActivityTestRule(LoginActivity::class.java)

    @Test
    fun loginActivityTest() {
        val appCompatEditText = onView(
            allOf(
                withId(R.id.username),
                childAtPosition(
                    allOf(
                        withId(R.id.container),
                        childAtPosition(
                            withId(android.R.id.content),
                            0
                        )
                    ),
                    0
                ),
                isDisplayed()
            )
        )
        appCompatEditText.perform(replaceText("test"), closeSoftKeyboard())

以下省略
```

「Add Assertion」ボタンを押せば、キャプチャのようにアサーションを追加できます。
（ダイアログもできるのですが、レイアウト位置が正しく設定されず手直しが必要です..）

<img width="785" alt="スクリーンショット 2020-06-21 11.48.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/a7c5a8ca-da0c-bddc-01b4-da16750f5e7c.png">

# まとめ
ものによっては手直しが必要ですし、ボイラーコードになりがちなのでメンテナンステストもかかりそうですが、
（UIテスト自体コストも高いし..）
UIテストはコストが高いからだけで今まで避けてきたので意外とハードルは高くないのかなと思いました。

ログインやエラーハンドリングのようなそのものはあまり変わらない部分であれば導入してみるのも良いかと思いました。
クソコードの果てに

## クソコードを大量に書け！

- 下書きだと思うべし！
- いきなり清書しようとするな！
- いきなり清書しても成功しやすいのは過去に似たようなコードを書いたことがある時だけだ！
- より優れたプログラマになる為の経験をより多く積む為にも躊躇せずに様々なクソコードを量産しまくれ！

## コストをかけずに書け！

- 生き続けてるコードは常に修正され続ける！ 述べ修正行数が元の数倍から数十倍に及ぶのも珍しいことではない！
- 修正される前提で書け！
- 将来の修正は正確に予想できるような物ではないし修正される前提で書くってのはコストをかけず書くってこと！
- コストをかけない為に富豪的プログラミングで書け！
- コストをかけず書いてりゃ丸々ちゃぶ台返しすることになってもコスト的なダメージは最小化できる！
- かけ過ぎたコストを回収できない理想的なコードより、最悪の場合でもイチから書き直す羽目で済むコストをかけてないクソコードの方がずっとマシだ！

## クソコードをそのままにするな！

- クソコードは必要な過程であって求められる結果ではない！
- 既存のクソコードは新たなクソコードを誘発する！
- 常にクソコードを浄化して清書し直し続けろ！
- 誰が書いたクソコードだろうが容赦無く直せ！
- クソコードに慈悲など要らぬ！
- クソコード、直さぬお前が、クソコーダー！

## クソコードを生み出す要因を赦すな！

- クソなAPIはそれ即ちクソコードであり、クソコードの連鎖を産む元だ！
- クソなAPIは必ずラップして、クソコードの連鎖を断て！

## 実践にあたって

### 壊れていないものを直すな！

- 不用意な修正はエンバグの元であり、直すのはいまコーディングしたばかりの箇所、あるいは現在修正中の関連コードのみに留めましょう。

### コストをかけすぎるな！

- 例外が無くも無いですが一般的にクソコードを完全に排除するのは明らかにオーバーエンジニアリングであり、投資したコストに見合うだけのリターンはまず得られません。コストのかかる清書はその修正がコストに見合うだけのリターンが見込めそうか一考しましょう。
- コストをかけ過ぎた綺麗なコードはそのコードが不要になってもかけ過ぎたコストを回収することはできず、またコードや設計の修正時に本来的には不要になってもかけ過ぎたコストを惜しんで削除することを惜しみ躊躇してしまう事にも繋がります。

### 踏み倒せる借金(技術的負債)を返すな！

- 技術的負債と呼ばれる類いのモノは実際のところその大半は踏み倒せるモノです。火が付いてる状態で悪影響を及ぼし続けてるモノならともかく、計画的に踏み倒す事も視野に入れましょう。
- 逆の視点で捉えると、いつまでもそのままになりやすいという事です。最初からあるべき形になってないと不味いというポイントは見極めてプログラミングに臨みましょう。

### 設計の見直しや仕様の削り込みを検討すべし！

- 望ましい形の清書がなかなかできない場合、上位の設計がクソ設計なことは良くあります。クソコードより直すべきはクソ設計です。
- 不必要な仕様はまだ残ってませんか？ クソ設計より直すべきはクソ仕様です。

### クソ設計について

- レイヤーがより上位というだけでクソ設計についてもここで述べてるクソコードと概ね同じ事が当てはまります。
- ただ、クソコードよりも影響が大きくなり易く修正コストも大きくなり易いので、設計がクソであることが発覚し易いようにコストをかけずに素早く進行することで傷を浅くしましょう。

## 果てに

- あなたがプログラマとしてのより多くの経験を積んでいけば**コストをかけずに**より良いコードをサラリと記述できる場面が増えていくことでしょう。

## 関連記事

- [最良のコード](https://qiita.com/wraith13/items/69ba8d91072791a54d9a)

<link rel="canonical" href="https://wraith13.github.io/writing/?programming%2Ffxxking.code.md" />
この記事の転載元URL: <a rel="canonical" href="https://wraith13.github.io/writing/?programming%2Ffxxking.code.md">https://wraith13.github.io/writing/?programming%2Ffxxking.code.md</a>
静的HTMLコンテンツをSharePointに公開しようとして詰まる～解決までの顛末

# 静的HTMLコンテンツをSharePointに公開しようとして詰まる～解決までの顛末

　とりあえず最後までやってみるのが良かった。


## 結論

以下サイトを参考に、途中でうまく表示できなかったとしてもとにかく「SharePoint Online Management Shell でカスタム スクリプトを許可するところまでやる（対象サイトのDenyAddAndCustomizePagesフラグを0にする）」

- [SharePoint ： チームサイトやコミュニケーションサイトではライブラリにアップロードした\.aspxファイルはクリックすると表示されずにダウンロードされてしまう \| Art\-Break : Tech ;](https://art-break.net/tech/?p=1972)
- [静的 HTML ファイルを SharePoint にアップロードして公開する \| idea\.toString\(\);](https://idea.tostring.jp/?p=1717)


## 詰まったポイント

1. 拡張子をaspxにすれば特に他のことをしなくてもブラウザ表示できるケースがあるように見える
  - ということでチームサイトのドキュメントライブラリで試してみたのだけれども、拡張子変更だけでは相変わらずダウンロードする動きとなり失敗。ここで色々悩んでしまった。

1. Connect-SPOServiceで指定するURLなんだっけ…？
  - これはSharePoint管理サイトのURLになるため、わからなければ一旦ShaerPonint管理サイトを開いて確認する。

1. 接続できているんだかできていなんだかわからない状態で、コマンド打つのやだなー。
  - Get-SPOSite を使ってサイト一覧を表示させると良い。サイトごとにフラグを0にするため、コマンド実行前にサイトURLを確認しておくとコマンド入力が楽。

    ```PowerShell:コマンドサンプル
    PS C:\WINDOWS\system32> Get-SPOSite
    
    Url                                                  Owner
    ---                                                  -----
    https://hogehoge.sharepoint.com/sites/SharePointTest
    https://hogehoge.sharepoint.com/portals/hub
    https://hogehoge.sharepoint.com/
    https://hogehoge.sharepoint.com/sites/Test
    ```

## 注意事項

　カスタムスクリプトを許可する場合、デメリットもいくつかあることに留意する。

- [カスタム スクリプトを許可する場合のセキュリティに関する考慮事項 \- SharePoint Online \| Microsoft Docs](https://docs.microsoft.com/ja-jp/sharepoint/security-considerations-of-allowing-custom-script)


## 今後調査したいこと

　DenyAddAndCustomizePagesフラグを0にしてaspxファイルを一通りおいたあと、DenyAddAndCustomizePagesフラグを1に戻すとカスタムスクリプトを禁止しつつ、静的HTMLコンテンツが表示できそう。テストサイトをこの設定にして1週間ぐらいおいて様子を見てみる。


## 参考
- [カスタム スクリプトを許可または禁止する \- SharePoint Online \| Microsoft Docs](https://docs.microsoft.com/ja-jp/sharepoint/allow-or-prevent-custom-script?redirectSourcePath=%252fja-jp%252farticle%252f1f2c515f-5d7e-448a-9fd7-835da935584f)
G検定　受験に向けての備え

qiitaにある参考になりそうな投稿をまとめみました。

##自然言語処理の概要まとめ
https://qiita.com/Hiroki1928/items/ebdf9fe1201e26917b72#word2vec

word2vecの参考
https://qiita.com/g-k/items/69afa87c73654af49d36

https://ja.wikipedia.org/wiki/Word2vec

##G検定 本番困りそうな所まとめ
https://qiita.com/highno_RQ/items/5f4aa73c362477d90169

##G検定の問題でよく見る人物名についてまとめてみた
https://qiita.com/Hiroki1928/items/6d66bf66f44df55a2f4e

##G検定メモ⑰　G検定試験前日に発狂しながら書きなぐったメモを公開する
https://qiita.com/momopeee/items/2c1bb7001673ba61d577
大きなサイズのファイルを高速に作る方法

# はじめに

空のファイルを作る時、どのようなコマンドを使っているでしょうか？
私の場合は以下のように、ファイルサイズが0であれば`touch`コマンド、一定のサイズのファイルが必要な場合は`dd`コマンドを使っていました。

ところが`dd`コマンドとは別に、一定のサイズのファイルを作る方法として`fallocate`というコマンドがあることを知ったので、両者のパフォーマンスを比較してみました。

```shell-session
[nkojima@akagi sample_files]$ touch sample.txt
[nkojima@akagi sample_files]$ dd if=/dev/zero of=./sample2.txt bs=1K count=1024
1024+0 レコード入力
1024+0 レコード出力
1048576 バイト (1.0 MB) コピーされました、 0.00580267 秒、 181 MB/秒
[nkojima@akagi sample_files]$ ls -lah
合計 1.0M
drwxrwxr-x  2 nkojima nkojima   43  6月 21 12:18 .
drwx------. 5 nkojima nkojima  175  6月 21 12:17 ..
-rw-rw-r--  1 nkojima nkojima    0  6月 21 12:17 sample.txt
-rw-rw-r--  1 nkojima nkojima 1.0M  6月 21 12:18 sample2.txt
```

# テストに使用した環境

* CPU
 * Kabylake: [Pentium G4560](https://ark.intel.com/content/www/jp/ja/ark/products/97143/intel-pentium-processor-g4560-3m-cache-3-50-ghz.html)
* マザーボード：[ASRock H110M-STX](https://www.asrock.com/MB/Intel/H110M-STX/index.jp.asp)
* メモリ：8GB（4GB×2枚）
* ストレージ：256GB SSD（NVMe）
* OS
 * CentOS 7.8（2003）

# テスト方法

* `dd`コマンドと`fallocate`コマンドを使って、様々なサイズのファイルを作成して、その処理速度を測定しました。
 * ファイルサイズ：100MB、500MB、1GB、2GB、4GB、8GB、16GB
* `dd`コマンドのオプションのブロックサイズ（-bs）は1MBとしました。
* 処理時間の測定には、以下のように`date`コマンドを使ったため、正確な処理時間でありません。
* 処理を3回実行して、その平均値をテスト結果としました。

```shell-session
[root@akagi ~]# date; dd if=/dev/zero of=dd.txt bs=1M count=100; date;
2020年  6月 21日 日曜日 12:48:28 JST
100+0 レコード入力
100+0 レコード出力
104857600 バイト (105 MB) コピーされました、 0.0362178 秒、 2.9 GB/秒
2020年  6月 21日 日曜日 12:48:29 JST
[root@akagi ~]# date; fallocate -l 100m ./fallocate.txt; date;
2020年  6月 21日 日曜日 12:48:52 JST
2020年  6月 21日 日曜日 12:48:52 JST
```

# テスト結果

* 以下の表を見れば一目瞭然、圧倒的に`fallocate`コマンドの方が高速でした。
 * swap領域を作る時など、単一の大きなファイルを作る必要があるケースでは、特にfallocateコマンドが有用だと考えられます。
* `dd`コマンドは高速なストレージ（NVMe-SSD）を使ってもそれなりに処理時間がかかるので、低速なストレージだとさらに大きな差がつくのではないかと思います。

|ファイルサイズ|ddコマンドの処理時間(秒)|fallocateコマンドの処理時間(秒)|
|---|---|---|
|100MB|<1|<1|
|500MB|<1|<1|
|1GB|1|<1|
|2GB|2|<1|
|4GB|4|<1|
|8GB|7|<1|
|16GB|15|<1|


# 関連記事

* [指定したサイズと数量でテスト用ファイルを生成](https://qiita.com/nkojima/items/32d70a90fd5a428c8fbd)
 * こちらの記事も、`dd`コマンドから`fallocate`コマンドを利用する形に修正したほうが良さそうです。
【Julia・Genie】Genieでのコントローラの生成できない

#Genieでのコントローラの生成ができなかった
**失敗例**

```julia
#アプリ名にnewcontrollerメソッドを叩いていた。
julia> アプリ名.newcontroller("コントローラ名")
```

**成功例**

```julia
#Genieに対してnewcontrollerを叩く。
julia> Genie.newcontroller("コントローラ名")
```
Arduinoで各種コントローラを制御する。①検討

※自分用のメモも兼ねてます。随時更新予定。

Arduinoで各種コントローラを制御する。①検討 は <a href="https://qiita.com/mako0314tama/items/1653b117b95afd54638f">こちら</a>
Arduinoで各種コントローラを制御する。②ハードウェア は <a href="https://qiita.com/mako0314tama/items/6679d89658f91b758712">こちら</a>
Arduinoで各種コントローラを制御する。③ソフトウェア は <a href="https://qiita.com/mako0314tama/items/0bf414f0bf0d81d5966d">こちら</a>


#開発背景

某ゲームで、決まった操作を連続で行うことがある。
一連の操作を簡単に行えるようにしたい。

#概要

####既存の有線USBコントローラをベースとする
「中国文字が入ってる~~怪しい~~良心的な価格の製品」
https://www.amazon.co.jp/dp/B084ZJG988/ref=cm_sw_em_r_mt_dp_U_QjS7EbEJ80JTX

####Arduino互換ボードTeensy3.6を利用して、ボタンの入力を外部から制御する。

「Teensy3.6 - スイッチサイエンス」
https://www.switch-science.com/catalog/2989/

![diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659663/69d3f224-1cef-5855-7ed0-1dc496fc9f3a.png)


#機能
####連射機能
~~HORIのコントローラのようにモード分けをする。~~
ハード的に実装が困難だったため見送り(2020/07/04追記)
![180309_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659663/117fc6a0-2f22-9a5c-0a56-5ee0c2814af9.jpeg)
(https://game.girldoll.org/ps4-controller-rensya/#2 参照:2020/06/21)

####自動ボタン操作
入力モードと出力モードを設け、パターンを変更できるようにする。
入力モード：各ボタンの入力を保存する
出力モード：押している間、保存されたパターンを出力


#ハードウェア検討
####連射モード用
~~TURBOボタン
TURBO LED(緑)
ボタン用抵抗
LED用抵抗~~
連射モードを実装しないため不要(2020/07/04追記)
####自動モード用
AUTOボタン
AUTO RECボタン
AUTO resetボタン
AUTO REC LED(赤)脚を赤塗
AUTO REC LED(緑)脚を黒塗
~~ボタン用抵抗 *3~~
Teensy内Pullup抵抗を使うため不要
LED用抵抗 (10Ωx4)
####各種ボタン用
~~電流制限用の抵抗 *18 (タクトスイッチ使ってるやつはいらないかも）~~

#ソフトウェア検討
1/30秒ごとに以下の処理を行う

    ボタンのステータス確認・保存
      Teensy接続ボタン3個 (前とステータスが違えば押下&離す認識)
      if AUTO REC flag
        コントローラのボタン18個

    if 連射モード押下
      if AUTO REC=ON
        error flag (赤LED&緑LED早点滅)
      Swith ボタン.連射ステータス
        連射: 連射ホールドに
        連射ホールド: 連射OFFに
        連射OFF: 連射モードに
    else if AUTOボタン押下
      if AUTO rec =NONE
        error flag (赤LED早点滅)
      else
        AUTO out flag
    else if AUTO RECボタン押下
      if 連射モード=ON
        error flag (赤LED&緑LED早点滅)
      else
        AUTO REC flag トグル (REC時赤LED遅点滅 & RECデータ有時赤LED点灯)
  
    ボタン出力　LED更新

#参考サイト
「[デュアルショック4乗っ取り] - 松蔵さん家の物置場(仮)」 2020/06/21アクセス
https://rezius2.jimdofree.com/%E5%B7%A5%E4%BD%9C%E3%81%AE%E6%A3%9A/%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF4%E4%B9%97%E3%81%A3%E5%8F%96%E3%82%8A/

「DualShock 4-PS4開発者Wiki」2020/06/21アクセス
https://www.psdevwiki.com/ps4/DualShock_4

「デュアルショック4のアナログスティックを乗っ取る(1)：分解〜回路図〜試験 | ファミコンと心中するの？」2020/06/21アクセス
https://ameblo.jp/bit287/entry-12426938822.html
Zerynth Studio で Virtualize device に失敗する場合

　Windows 環境の Zerynth Studio において，Virtualize device に失敗する場合は，C:\users の自身のユーザー名を確認してください．
　ユーザー名にスペースが含まれている場合，それが失敗の原因です．
　私は，後からユーザー名を変更するのが厄介だったので，Zerynth 用にアカウントを新規作成して解決しました．
install apt-get to Mac

NOTE: install time is maybe 60~80 minutes

## Environment

OS X : 10.15.5
Shell Type：zsh
xcode: 11.5

## Requirements

1.Xcode Command Line Tools

Open link: https://developer.apple.com/download/more/
Next, search: Command Line Tools
Download file that matched your xcode version.

2.JDK

https://www.oracle.com/jp/java/technologies/javase-downloads.html


## Process

Open link: http://www.finkproject.org/download/srcdist.php?phpLang=en
Download ``` InstallFink.tgz ``` file from https://github.com/fink/scripts/releases/tag/setup/0.45.1

Next, type below commands.

```
tar -xvf InstallFink.tgz
cd InstallFink
sh Install\ Fink.tool
```

NOTE: When XQuartz is downloaded and installed by Install\ Fink.tool, sh command is stopped command.

Then you just execute ``` sh Install\ Fink.tool ```.

While installing, terminal ask some questions.
Then you just type "Enter".(If you don't need to customize)

Finally, open another tab.
Then you type ``` apt-get ```

```
$ apt-get
apt 0.5.4 for darwin x86_64 compiled on Jun 21 2020 10:23:53
```

reference:

https://qiita.com/taka_baya/items/c84e306f05e2513e4a67

https://qiita.com/___xxx_/items/4a318f29e1dd68ad8071
Mbed Studio 1.0 リリース！

MbedのオフラインIDEであるMbed Studioの1.0がリリースされました。
これまでもお試し版が公開されていましたが、正式にversion 1.0が公開されました。
![image.png](https://os.mbed.com/static/img/mbed-studio/Mbed-Studio-Overview.e7deb8b07d49.png)

# Mbed Studioとは
オンラインコンパイラが特徴のMbedですが、その環境がローカルPC上でも使用できる開発環境です。オンラインコンパイラと同じく無料で使用できます。マルチプラットフォームでWindows、Mac、Linuxそれぞれにインストーラが用意されています。インストーラは以下からダウンロードできます。

https://os.mbed.com/studio/

使用方法の説明は以下のリンクにあります。

https://os.mbed.com/docs/mbed-studio/current/introduction/index.html

# [Mbed CLI](https://os.mbed.com/docs/mbed-os/v6.0/quick-start/build-with-mbed-cli.html)との違い
今まではオフラインの環境としては[Mbed CLI](https://os.mbed.com/docs/mbed-os/v6.0/quick-start/build-with-mbed-cli.html)が提供されていました。Mbed CLIはCUIベースで、自動テストができることや他の統合開発環境と連結してデバッグできることがオンラインコンパイラとの違いでしたが、Mbed Studioはエディタやデバッガも統合されているので、初心者でも扱いやすい仕様となってます。
さらにMbed CLIはコンパイラとしてGCC Armが付属していましたが、Mbed Studioはオンラインコンパイラと同じArm Compilerが付属されています。GCC ArmとArm Compilerは最適化効率が異なるため、オンラインコンパイラではマイコンのFlashに収まるサイズだったもののMbed CLI上でコンパイルしたら収まらないということがありました。Mbed Studioではそのようなことはありません。
WindwosではGCC Armのコンパイルは遅いので、その点も解消されます。

# Mbed Studio対応プラットフォーム
Mbed用の統合開発環境なので、Mbedプラットフォームしか対応していません。そのなかでもMbed OS 5.12以降もしくはMbed OS 6に対応しているプラットフォームとなります。詳細は以下のリンクから確認することができます。

https://os.mbed.com/platforms/?q=&Mbed+Studio+support=Build+and+run&Mbed+Studio+support=Debug

# Mbed Studioの機能
Mbed Stduioの見た目は[Visual Studio Code](https://ja.wikipedia.org/wiki/Visual_Studio_Code)に似ていますが、ベースは[Theia IDE](https://theia-ide.org/)（もしかしたらオンラインコンパイラもTheia IDEベースになる？）です。
オフラインのツールですが、Mbedのユーザー登録とMbed Studioからのログインは必要です。

特徴的な機能は次のようになっています。

## Git連携
オンラインコンパイラのソースコード管理はMercurialでしたが、Mbed StudioではGitのソースコード管理ができます。設定がちょっと面倒ですが、Github上のリポジトリとも連携させることができます。
説明は以下のドキュメントに書いてあります。

https://os.mbed.com/docs/mbed-studio/current/source-control/index.html

## プラットフォーム検出&ファーム書き込み
MbedプラットフォームをPCに接続すると自動的に認識するようになっています。そのまま、GUI操作でコンパイルしたバイナリを書き込むことができます。

## デバッグ
ステップ実行や変数の値の確認、スタックトレースができるようになっています。
ただ現在、対応しているプラットフォームは少ないです。以下のリンクから対応プラットフォームの確認ができます。

https://os.mbed.com/platforms/?q=&Mbed+Studio+support=Debug

# あとがき
Mbedのハンズオンやワークショップなどを行うのにオンラインコンパイラは何もPCにインストールすることなく使用できるので、便利なのですが、オンラインコンパイラは使用できなくなることもあるので、オフラインの選択肢も用意されるようになったのは良いですね。
しかも買うと数十万以上するArm CCが無料で制限なく使用できるのは魅力的です。
vistaでquartus その8

#概要

vistaでquartusやってみた。
俺cpuやってみた。
0から9まで、数えて見た。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#アセンブラで書く。


```
  push  0
  set  i
loop:
  get  i
  push  10
  <
  if  pass 
  get  i
  push  48
  +
  out
  get  i
  push  1
  +
  set  i
  jp loop

```

#ハンドアセンブル


```
		mem[0] =  16'h1000;//push 0
		mem[1] =  16'h300f;//set 15
		mem[2] =  16'h200f;//get 15
		mem[3] =  16'h100a;//push 10
		mem[4] =  16'hf00f;//<
		mem[5] =  16'h5005;//if 5 
		mem[6] =  16'h200f;//get 15
		mem[7] =  16'h1030;//push 48
		mem[8] =  16'hf000;//+
		mem[9] =  16'he000;//out
		mem[10] =  16'h200f;//get 15
		mem[11] =  16'h1001;//push 1
		mem[12] =  16'hf000;//+
		mem[13] =  16'h300f;//set 15
		mem[14] =  16'h4002;//jp  2
		mem[15] =  16'h0000;//i
```

#iverilog実行結果

```
0
1
2
3
4
5
6
7
8
9

```


以上。
Car.java

class Car{
  private String name;
  private String color;
  private int distance = 0;
  private int fuel = 100;
  Car(String name,String color){
    this.name = name;
    this.color = color;
  }
  
  public void printData(){
    System.out.println("名前："+this.name);
    System.out.println("色："+ this.color);
    System.out.println("走行距離："+this.distance+"km");
    System.out.println("ガソリン量："+this.fuel+"L");
  }
  public void run(int distance){
    System.out.println(distance+"km走ります");
    if(distance <= this.fuel){
      this.distance += distance;
      this.fuel -= distance;
    }else{
      System.out.println("ガソリンが足りません");
    }
    
    System.out.println("走行距離："+this.distance+"km");
    System.out.println("ガソリン量："+this.fuel+"L");
  }
  public void charge(int litre){
    System.out.println(litre+"L給油します");
    if(litre <=0){
      System.out.println("給油できません");
    }else if(litre >=100){
      System.out.println("満タンまで給油します");
      this.fuel = 100;
    }else{
      this.fuel += litre;
    }
    System.out.println("ガソリン量："+this.fuel+"L");
  }
}
Main.java 自転車　車のガソリン残量　給油

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Bicycle bicycle = new Bicycle("ビアンキ","緑");
    System.out.println("【自転車の情報】");
    bicycle.printData();
    System.out.println("-----------------");
    System.out.print("走る距離を入力してください：");
    int bicycleDistance = scanner.nextInt();
    bicycle.run(bicycleDistance);
    System.out.println("=================");
    Car car = new Car("フェラーリ","赤");
    System.out.println("【車の情報】");
    car.printData();
    System.out.println("-----------------");
    System.out.print("走る距離を入力してください：");
    int carDistance = scanner.nextInt(); 
    car.run(carDistance);
    System.out.println("-----------------");
    System.out.print("給油する量を入力してください：");
    int litre = scanner.nextInt();
    car.charge(litre);
    
  }
}
Docker+JupyterLabで決定木モデルの可視化(graphviz/dtreeviz)

# 概要
決定木についての詳細は記載しませんが、決定木によって生成されたモデルの可視化で一般的なのがgraphvizです。これをDocker+JuptyerLabの環境で使おうとしたら微妙にハマった部分があったので、やり方をまとめておきます。またgraphvizではなく、より分かり易い可視化でdtreevizが便利だったのでそちらも記載します。

# 環境
以下を参考にDockerでJupyterLabが使える状態を前提とします。
[Dockerで起動したJupyterLabでvimキーバインドを使う](https://qiita.com/hikarut/items/ec2ba860f5bcfc0d05d3)

# Dockerfile
Dockerfileに以下追記してビルドし直す事でgraphvizとdtreevizが使えるようになりました。

```dockerfile:Dockerfile
RUN pip install pydotplus
RUN pip install dtreeviz
RUN apt-get dist-upgrade
RUN apt-get update
RUN apt-get install -y build-essential graphviz-dev graphviz pkg-config
RUN pip install graphviz
```

graphvizはPythonのライブラリとLinuxのライブラリで両方入れる必要があり、
Linuxライブラリの方がなかなかうまく入ってくれなかったですが、上記でうまくできました。

Dockerfileの全体についてはこちらにもまとめてあります。
https://github.com/hikarut/Data-Science/blob/master/Dockerfile

# モデルの可視化
### graphviz
<img width="691" alt="スクリーンショット 2020-06-21 10.34.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110485/88664fd3-9322-80b4-5d7c-a5aba55fca37.png">

* 1行目：条件式
* 2行目：ジニ係数
* 3行目：ノードのサンプル数(サンプル割合)
* 4行目：クラス毎のサンプル数(サンプル割合)

### dtreeviz
<img width="269" alt="スクリーンショット 2020-06-21 10.35.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110485/5ccbb1b5-8eef-e333-0617-ec000e9928a5.png">

向きを左→右にする事もできます。
<img width="454" alt="スクリーンショット 2020-06-21 11.02.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110485/a5062592-3187-e78d-6e47-177c6a590100.png">


ソース
https://github.com/hikarut/Data-Science/blob/master/notebooks/decisionTree/sample.ipynb

# 参考
* [Pythonの決定木をdtreevizでスマートに可視化する](https://qiita.com/calderarie/items/e4321bff95ac3042601b)
* [Python決定木可視化!Graphvizの導入とdot処理方法](https://watlab-blog.com/2020/01/02/graphviz/)
Sassについて

#Sassについて
## Sassとは
・CSSの機能を拡張した言語
・CSSとは異なる言語
・CSSを簡潔にかける
・CSSの中で変数を使ったり、計算を行うことができる

##Sassファイル
・SassはCSSファイルに記述はできない
・SassファイルにCSSを記述はできる
・Sassの拡張子は、.sass or .scss
　・上記はそれぞれ記法が異なる

###.sass拡張子
・波カッコの省略やセミコロンが不要
・CSSの記法と差がありすぎて普及しなかった

###.scss拡張子
・CSSの記法と似ている

##Sassのメリット
・記述の簡略化ができる
・プログラムのような処理ができる
・複数のCSSファイルを1つにまとめることができる
・同じ値を使い回すことができる

###記述の簡略化ができる
・CSSをネスト(入れ子)して記述することができる。
・ネストして記述することで深い階層になっても親子関係がわかりやすい。
・親要素を複数記述しなくて済

###プログラムような処理ができる
・変数を使用することができる

```CSS
$section-color: rgb(30,30,30);
section {
  background-color: $section-color;
}
```

###複数のCSSファイルを1つにまとめることができる
・パーシャルという機能を使用すると
・複数のSassファイルを1つのCSSファイルとしてまとめることができる

####パーシャル
・分割したSassファイルのこと
・分割することで、機能や内容ごとに管理ができる

###同じ値を使い回すことができる
・変数を使える
・mixin、スタイルを定義する

##Sassのファイルの種類
###index.html
・HTMLを記述するファイル
・ブラウザに表示される
###style.css
・HTMLファイルで読み込むことでスタイルを適用させる
・sassコマンドを実行することでstyle.cssファイルを作成・更新できる。
###stylesheetsフォルダ
・全てのSCSSファイルを管理するフォルダ
###style.scss
・全てのSCSSファイルを@importで読み込むことで一つのファイルに統合できる
###_reset.scss
・ブラウザによって初めからCSSがそれぞれのHTMLに設定されている
・意図しないデザインになってしまう
・はじめにCSSをすべてリセットする

###configフォルダ
・プロジェクトの設定ファイル
・scssで使用する変数を定義するファイルなどを管理するフォルダ
###mixinフォルダ
・SCSS内で使用するmixinファイルを管理するフォルダ
###modulesフォルダ
・モジュールを管理するためのフォルダ
・モジュール＝いくつかの要素をまとめた部品の集合という意
・ヘッダー、フッったーのような用途ごとに分けることができる
###vendorフォルダ
・ライブラリのファイルを管理するフォルダ
・cssにはライブラリと呼ばれるものがある
・ライブラリとはあらかじめCSSが書かれたファイル
・有名なCSSのライブラリでは、bootstrapがある
・ライブラリを効率よく利用することで、コーディングのスピードが格段に上がる
###overrideフォルダ
・overrideフォルダは、vendorフォルダに格納してある外部のライブラリを上書きするためのscssファイルを管理するフォルダ
DockerコンテナのホストでGUIを起動する

#環境
Ubuntu20.04
Docker 19.03
#1.ホストでの準備
下記のコマンドでX WindowサーバがContainer内からの接続を受け入れるように設定します。

```
xhost local:
```
[参照](https://qiita.com/ymfj/items/ac47d2c2b46433665929)

#2.コンテナを起動
GUIを使えるようにオプションを設定しコンテナ起動する。
下記のコマンドを実行するとpython3.8.3が使えるコンテナをインタラプタモードで起動する。

- コマンドのオプションの説明

 - `-e DISPLAY=$DISPLAY` : GUIを転送するX11サーバーのアドレスを設定
 - `--net host` : コンテナ上のX11クライアントがサーバーにアクセスできるよう、コンテナのネットワーク設定をホストと共有する

```
docker run -v $PWD:/working -e DISPLAY=$DISPLAY --net host --name python -it python:buster  /bin/bash
```

[参照](https://kamino.hatenablog.com/entry/docker_gui)

#3.GUIが使えるかの確認
コンテナのbash上で下記のコマンドを実行してGUIが使えるかを確認

##1.xeyesを使う

```
apt update
apt install x11-apps
xeyes
```
##2.matplotlibを使う
```test.py
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
img=list([[2,3,4],[5,6,7]])
plt.imshow(img, cmap='Greys')
plt.show()　#画像を表示させる

```
上記のコードをpythonで実行
[参照](http://arduinopid.web.fc2.com/Q5-8.html)

#うまく表示されないときは？

```
nano ~/.bashrc
```
環境変数を追加

```
export QT_X11_NO_MITSHM=1
```
反映させる

```
source ~/.bashrc
```
[参考](https://qiita.com/oreyutarover/items/cca3511012b6ad97a1ce)
UiPathでExcelを操作する(活用編: CSVファイルをxlsx形式に変換する)

#UiPathでExcelを操作する(活用編: CSVファイルをxlsx形式に変換する)

## 概要
UiPathでcsvファイルをxlsx形式に変換して保存する方法をご紹介します。

本記事では、[UiPathでExcelを操作する(活用編: 名前を付けて保存する[完成版])](https://qiita.com/takusonix/items/d8070b61c06900d75c92)の実装および、アクティビティを流用します。


## お約束事項（免責事項）
- この記事は2020年6月時点の情報を基に作成しております。
- 記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## スキル
この記事には、C#によるカスタムアクティビティの開発が含まれます。
カスタムアクティビティの開発方法は、UiPath公式のドキュメントを参照ください。
（本記事では最低限のみ記載します。）
https://docs.uipath.com/activities/lang-ja/docs/creating-a-custom-activity

## 必要なソフトウェア
- Visual Studio
- Nuget または Nuget Package Explorer
- Microsoft Office

## 実装（前回と同じ）


```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;

namespace UiPathCustomLibrary
{
    public class SaveAs : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Input")]
        public InArgument<String> FileName { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            // 引数(InArgument)より、WorkbookApplicationのオブジェクトを取得する
            // WorkbookApplicationの属性に必須（RequireArgument）を指定しているため、workbookappのnullチェックは不要
            object workbookapp = WorkbookApplication.Get(context);
            
            // WorkbookApplicationから、Microsoft.Office.Interop.Excel.Workbook型として（キャストして）、CurrentWorkbookを読み込む
            Workbook workbook = workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;

            // WorkbookのプロパティからApplicationを取得する
            Application application = workbook.Application;
            // 変更前のDisplayAlertを保持する
            bool prevDisplayAlert = application.DisplayAlerts;

            // DisplayAlertを一時的にFalseにする
            application.DisplayAlerts = false;
            
            // 名前を付けて保存する 
            workbook.SaveAs(Filename: FileName.Get(context), FileFormat: XlFileFormat.xlOpenXMLWorkbook, CreateBackup: false);

            // DisplayAlertを元に戻す
            application.DisplayAlerts = prevDisplayAlert;
        }
    }
}

```


## 実行確認
ExcelApplicationScopeでは”Sample.csv"ファイルを指定し、SaveAsでは"Sample2.xlsx"としています。
Nuget Package Explorerで作成したライブラリをUiPath Studioでインストールした後、早速使ってみます。
「c:\tmp\Sample2.xlsx」として名前を付けて保存します。
※ 保存先は絶対パスで指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/bff57037-9398-975d-6ba8-9e38c5b13360.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/193ce004-0dbb-fd92-483f-2fc40a2aa7b8.png)
QIIME2 で生成するcore-metrics-resultsについて（１）

#core metrics resultとは？
core metrics resultとはα-diversityやβ-diversityに関する情報をまとめたファイルです。QIIME2のターミナルでコマンドを実行すればファイルが自動的に生成されるので、私自身、使い方や内容を理解するのに時間がかかりました。なのでcore-metrics-resultに含まれるファイルから具体的にどのような多様性指数がわかるのかをまとめてみました。
#core metrics result の作り方
以下のコマンドをQIIME2のターミナルで実行するだけです。一度に複数の多様性指数が計算され、サンプルの希釈（rarefy）も実行されます。

```Python:qiita.rb
qiime diversity core-metrics-phylogenetic \
  --i-phylogeny rooted-tree.qza \#系統樹ファイル
  --i-table table.qza \#OTUテーブル
  --p-sampling-depth 'サンプルの最小リード数'\#サンプル希釈(rarefy)
  --m-metadata-file sample_metadata.tsv \#サンプルのメタデータファイル
  --output-dir core-metrics-results#ディレクトリとファイル名を入力
```
#core metrics resultの中身
####QZAファイルとQZVファイル
指定したディレクトリの中にcore-metrics-resultsというファイルが生成されるので中身を確認してみると、QZAファイルとQZVファイルが生成されています。拡張子が.qzaのファイルはデータをRで読み込んで統計解析などを行うときに使いますが、拡張子が.qzvのファイルはQIIME2内でデータを図やグラフなどで見たい時に有効です。
####多様性指数
ここで得られる多様性指数は以下の8つです。OTUテーブルを使って計算したので、OTUレベルの指数になります。それぞれ簡単にどのような指数なのかまとめました。

#####α-diversity（サンプルごとに観察される多様性）
- observed_otu
    - あるサンプルで観察されたOTUの数。richness。
- evenness
    -  組成の均等度。Pielouのevennessであることに注意。
- shannon
    - 生物の多様性指数として最も広く使われている。生物種の種数(richness)を反映する。
- faith_pd
    - 系統的な違い（系統樹の距離）から計算される。

#####β-diversity（コミュニティ間の多様性の比較）
- bray_curtis
    - 種のカウントデータ（この場合はOTU）からコミュニティ間の非類似度を計算している。
- jaccard
    - 生物の在不在データからコミュニティ間の多様性の違いを計算している。

- unweighted_unifrac
    - 系統発生距離と在不在データから計算される。
- weighted_unifrac
    - 系統発生距離とカウントデータから計算される。

#####その他
- rarefied_table.qza
    - 希釈（rarefy）済みのOTUテーブルを入手できます。前回紹介したphyloseqオブジェクトを作成するときに使えます。
    
#おわり
最後まで読んでいただきありがとうございます。次回はここで得られた多様性指数を、実際に使ってみたいと思います。

#参考URL
- QIIME2の公式チュートリアル
    - https://docs.qiime2.org/2020.2/plugins/available/diversity/core-metrics-phylogenetic/
- こちらのブログは、多様性の考え方について大変詳しく書いてくださっているのでおすすめです
    - http://crusade1096.web.fc2.com/diversity.html
AndroidでDividerを描画する方法

## これは何

アンドロイドアプリを開発している際、任意の場所に区切り線を描画したいことがあるかと思います。
区切り線の描画方法について検索しても、情報が乱立していてどれが正しいのか分からなかったのですが、おそらく正解であろう方法を見つけたのでまとめました。

## dividerを設定する方法

答えはこちらのデモアプリにありました。

[Material Components Catalog App](https://github.com/material-components/material-components-android)

以下のxml要素をdivierを描画したいところに設定するだけです。

```xml:layout.xml

<!--    horizontal divider    -->
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="?android:attr/listDivider" />


<!--    vertical divider     -->
    <View
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:background="?android:attr/listDivider" />

```

マテリアルデザインを導入している場合は、dark themeに切り替えても自動的に色を反転してくれます。

## 参考リンク

- [Material Components Catalog App](https://github.com/material-components/material-components-android)

- [Material Components Dividers](https://material.io/components/dividers)
ブラウザのテキスト入力をVim化

こんにちわ
ゴリラです

仕事に限らず、普段はブラウザでテキストを入力することも多々あると思います。
ぼくは、その度にVimのキーバインドを使えたらなと思ったことがこれまで何度もありました。

そこで、[wasavi](http://appsweets.net/wasavi/)というChromeの拡張を教えてもらいました。
試してみた結果とても良かったので紹介します。

Chromeは[こちら](https://chrome.google.com/webstore/detail/wasavi/dgogifpkoilgiofhhhodbodcfgomelhe?hl=ja)からインストールできます。

## どんな感じ？
こんな感じです。
![wasavi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/9969098a-225a-b73c-b3f8-c1392de16987.gif)

## 使い方
デフォルトは`CTRL-Enter`でViに切り替わります。
`:w`で入力が反映され、`:wq`で反映してViを終了します。

他にもオプションなどを設定できます。

## 設定
いくつかの`ex`コマンドが使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/89b155b0-bc81-2484-3066-84cc5344340e.png)

デフォルトではbellが鳴るのでそれをオフにすると良いです。(bellのオプションがあるが、なぜか効かなかったので)

```
set bellvolume=0
```


デフォルトは`textarea`のみ対象になっていますが、`input`系も入れておくと便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/fb1ebfdb-e878-5122-be35-16a33bfc7483.png)

Vimに切り替えるキーをいくつか設定できます。デフォルトは`CTRL-Enter`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/1eb7b914-aac1-938a-6367-6182514bf7c7.png)

## さいごに
日本語入力の削除の挙動が若干変ですが、とても便利なのでVimmerの方はぜひ試して見ください
ぼくはQOLが上りまくりです
IAM単語まとめ

# IAM単語まとめ
備忘録として概要をまとめておきます。

- 責任共有モデル：セキュリティの責任をユーザーとAWSで分担している
    - ユーザーの責任：物理インフラ以外
    - AWSの責任：物理インフラ
- IAM：アクセス権限管理の仕組み
    - ポリシー：アクセス権限
        - 管理ポリシー：複数のプリンシパルエンティティに紐づけられる
            - AWS管理ポリシー：AWSが作成して管理
            - カスタム管理ポリシー：AWSアカウントで作成して管理
        - インラインポリシー：１つのプリンシパルエンティティに紐づけられる。自分で作成して管理
    - ポリシー
        - ユーザーベース：ユーザーにリソースへのアクセス権限を設定
            - ユーザー、グループ
        - リソースベース：リソースに別のリソースへのアクセス権限を設定
            - ロール
    - プリンシパルエンティティ(ポリシー設定単位)
        - ユーザー
        - グループ
        - ロール
【Rails】ancestryを用いた多階層カテゴリー機能の実装『編集フォーム編』

# 目標

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/9e75c70b-d0d0-6cd5-5ec9-894af5d3bb34.gif)

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[Bootstrap3導入](https://qiita.com/matsubishi5/items/b117c95f4dd71340cc80)
・[Font Awesome導入](https://qiita.com/matsubishi5/items/a4c72f436e64ad106ee8)
・[ログイン機能実装](https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d)
・[投稿機能実装](https://qiita.com/matsubishi5/items/1a5aeab651b5822d1f2c)
・[多対多のカテゴリー機能実装](https://qiita.com/matsubishi5/items/a805fbcfd96f768dd622)
・[多階層カテゴリー機能実装(準備編)](https://qiita.com/matsubishi5/items/77aadc97a2e63c98cd91)
・[多階層カテゴリー機能実装(seed編)](https://qiita.com/matsubishi5/items/91248fce37b4b0d2e0f1)
・[多階層カテゴリー機能実装(作成フォーム編)]
(https://qiita.com/matsubishi5/items/4afb4a4f307023126c66)

# 実装

## 1.コントローラーを編集

```ruby:books_controller.rb
def edit
  unless @book.user == current_user
    redirect_to books_path
  end
  @category_parent_array = Category.category_parent_array_create
end

def update
  if @book.update(book_params)
    book_categories = BookCategory.where(book_id: @book.id)
    book_categories.destroy_all
    BookCategory.maltilevel_category_create(
      @book,
      params[:parent_id],
      params[:children_id],
      params[:grandchildren_id]
    )
    redirect_to @book
  else
    @category_parent_array = Category.category_parent_array_create
    render 'edit'
  end
end
```

### 【解説】

#### ① 中間テーブルから編集する本に対応するレコードを全て抽出し、削除する。

```ruby
book_categories = BookCategory.where(book_id: @book.id)
book_categories.destroy_all
```

## 2.ビューを編集

```slim:books/edit.html.slim
/ 追記
.category-form
  = label_tag 'ジャンル'
  = select_tag 'parent_id', options_for_select(@category_parent_array), class: 'form-control', id: 'parent-category'
  i.fas.fa-chevron-down
br
```

# 注意

`turbolinks`を無効化しないとセレクトボックスが非同期で動作しないので、必ず無効化しておきましょう。

[turbolinksを無効化する方法](https://qiita.com/matsubishi5/items/c4c8a5df03ae630ae534)


# 続編

[多階層カテゴリー機能実装(Bootstrapeでウィンドウ作ってみた編)](https://qiita.com/matsubishi5/items/28e805f6daae3cb4528c)
AWS CLI用のIAMユーザ/ロール設定

## はじめに

ユーザとロールの分離とMFA設定をやった記録です。プライベートだとゆるみがちだったIAM周りを引き締めます。  

## やったこと

### ロール作成

新規でロールを作成し、AWSのサービスを操作するのに必要十分な権限を付与します。※今回は安直にAdmin

「SwitchRoleAdmin」というロールを作成した上で、下記のポリシーを付与します。

```json:SwitchRoleAdminロールのポリシー（Admin）
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
```

このロールを想定しないユーザから使用されると困るため、特定の条件下でのみ使用できるように設定します。ここではMFA認証済みの特定ユーザのみ許可します。

IAMロール詳細画面の「信頼関係」タブから下記の設定を追加します。

```json:信頼関係の編集（ポリシードキュメント）
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/nanakenashi-cli"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}
```

### ユーザ作成

主な権限はユーザからは分離してロールに持たせるため、そのロール（SwitchRoleAdmin）を委任するための権限だけが必要です。

「nanakenashi-cli」ユーザを作成し、下記のポリシーを付与しました。

```json:nanakenashi-cliユーザのポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/SwitchRoleAdmin"
    }
  ]
}
```

加えて、コンソールで使用するときと同様にMFAデバイスを割り当てておきます。

### CLI設定

#### ユーザ設定

※メインで使用する設定なのでprofileは使用していません

```sh:CLIの設定ファイル作成
$ aws configure
AWS Access Key ID [****************HOGE]: 
AWS Secret Access Key [****************hoge]: 
Default region name [ap-northeast-1]: 
Default output format [json]: 
```

#### ロール設定

ロールを使用するためのプロファイル設定を `~/.aws/config` に追記します。

```sh:~/.aws/config
[profile default-admin]
region = ap-northeast-1
output = json
role_arn = arn:aws:iam::123456789012:role/SwitchRoleAdmin
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/nanakenashi-cli
```

### 試用

プロファイルの指定を忘れない。

```sh:プロファイルの指定
$ export AWS_DEFAULT_PROFILE=default-admin
```

コマンドを実行してみるとMFAの入力が求められ、認証が済めば実行できます。

```sh:検証（使用しているcredentialの確認）
$ aws sts get-caller-identity
Enter MFA code for arn:aws:iam::123456789012:mfa/nanakenashi-cli:
{
    "UserId": "XXXXXXXXXX",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/SwitchRoleAdmin/botocore-session-1234567890"
}
```

MFA認証済みをAssumeRoleの条件にしているため、mfa_serialの記述を消すと実行時にエラーになります。

```sh:エラーになった例
$ aws sts get-caller-identity
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::123456789012:user/nanakenashi-cli is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/SwitchRoleAdmin
```

## むすび

セキュリティ意識は大事。
ビット演算

```py
print('論理和')
print(0 | 0)
print(0 | 1)
print(1 | 0)
print(1 | 1)

print('論理積')
print(0 & 0)
print(0 & 1)
print(1 & 0)
print(1 & 1)

print('排他的論理和')
print(0 ^ 0)
print(0 ^ 1)
print(1 ^ 0)
print(1 ^ 1)

print('反転')
print(bin(0))
print(bin(~0))
print(bin(1))
print(bin(~1))

print('シフト')
print(bin(1 << 0))
print(bin(1 << 1))
print(bin(1 << 2))
print(bin(1 << 3))
```
実行結果：

```txt
論理和
0
1
1
1
論理積
0
0
0
1
排他的論理和
0
1
1
0
反転
0b0
-0b1
0b1
-0b10
シフト
0b1
0b10
0b100
0b1000
```
【Kaggle】LGBMを使ってみる

#1.目的

Kaggleのようなコンペでは、xgboostやLGBMといった勾配ブースティングがよく使われている。
ただ、これらについては参考になる記事やサイトが少ないと感じたこと／自分で実装する際に結構困ったので、今回はLGBMについて、自分が試したこと・各パラメータの意味合いを記しておくことが目的。

※参考書籍
今回は基本的にこちらの書籍に則って実装しています。
「Kaggleで勝つ　データ分析の技術」
https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437

※前回の記事ではxgboostを実装して、今回はそれのLGBM版です。
[【Kaggle】xgboostを使ってみる](https://qiita.com/Hawaii/items/52e80b5fe1532a5d2351)


#2.勾配ブースティングの利点
・欠損値の補完が不要
・冗長な特徴量があっても問題ない（相関が高い説明変数があってもそのまま使える）

・ランダムフォレストとの違いは、木を直列に作っている点。

上記の様な特徴があり、勾配ブースティングはよく使われるようです。

#3.LGBMを使ってみる
今回もkaggleのHousepriceを使用して実装してみる。

https://www.kaggle.com/c/house-prices-advanced-regression-techniques

##(1)前処理
###(ⅰ)インポート
```python
import numpy as np
import pandas as pd

#データ分割用
from sklearn.model_selection import train_test_split

#XGBoost
import xgboost as xgb
```

###(ⅱ)データ読み込み・結合
```python
#データ読み込み
df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

#データ結合
df_train["TrainFlag"] = True
df_test["TrainFlag"] = False

df_all = df_train.append(df_test)
df_all.index = df_all["Id"]
df_all.drop("Id", axis = 1, inplace = True)
```

###(ⅲ)ダミー変数化

```python
df_all = pd.get_dummies(df_all, drop_first=True)
```

###(ⅳ)データ分割

```python
#df_allを訓練データとテストデータに再度分ける
df_train = df_all[df_all["TrainFlag"] == True]
df_train = df_train.drop(["TrainFlag"], axis = 1)

df_test = df_all[df_all["TrainFlag"] == False]
df_test = df_test.drop(["TrainFlag"], axis = 1)
df_test = df_test.drop(["SalePrice"], axis = 1)
```

```python
#データ分割
y = df_train["SalePrice"].values
X = df_train.drop("SalePrice", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
```

##(2)LGBMを使ってみる

###(ⅰ)LGBMのデータ作成

```python
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)
```

####※注意点
・LGBMを使うには、lgb.Datasetでデータを加工する必要がある。
・xgboostでは、df_test（大元のテストデータ）も「.Dataset」で加工が必要だったが、LGBMはその必要はない。このあたりのデータの使い方がxgboostとLGBMで微妙に異なるので注意。

###(ⅱ)パラメータ設定

```python
params = {
        # 回帰問題
        'random_state':1234, 'verbose':0,
        # 学習用の指標 (RMSE)
        'metrics': 'rmse',
    }
num_round = 100
```

####※パラメータの簡単な説明
詳細は下記参照
https://lightgbm.readthedocs.io/en/latest/Parameters.html

・verbose：学習途中の情報をどこまで表示させるか。デフォルトは1。
・metrics：誤算関数の測定方法。
・num_round：最大の学習回数。

###(ⅲ)モデル訓練

```python
model = lgb.train(params, lgb_train, num_boost_round = num_round)
```

###(ⅳ)予測

```python
#予測
prediction_LG = model.predict(df_test)

#小数を丸めている
prediction_LG = np.round(prediction_LG)
```

###(ⅴ)提出用ファイル作成

```python
submission = pd.DataFrame({"id": df_test.index, "SalePrice": prediction_LG})
```

以上で終了です！

#4.結び
いかがでしたでしょうか。
LGBMは有名な割に、初学者は実装までに時間がかかる印象です。

なるべく簡単に実装方法が分かるようにシンプルなコードをご紹介してみました。
また、コードをコピペすれば実装できますが、各コードがどんな意味を持っているのかざっくりでいいので知ることは非常に重要だと感じます。

少しでも理解の深化の一助になりますと幸いです。
つ 息抜きにSQLクイズでも (3)

# はじめに
仕事中の息抜きや、暇つぶし用にちょっとしたSQLクイズをどうぞ。

# データの説明
`baskets`テーブルに以下のデータが入っています。
`basket_number`は籠の番号で、籠ごとに、中に入っている果物の数だけレコードが存在します。

| basket_number | fruit |
| ------------- | ----- |
| 1             | りんご   |
| 1             | バナナ   |
| 1             | ぶどう   |
| 2             | バナナ   |
| 2             | いちご   |
| 2             | メロン   |
| 3             | りんご   |
| 3             | ぶどう   |
| 4             | りんご   |
| 4             | バナナ   |
| 4             | メロン   |
| 4             | ぶどう   |
| 5             | バナナ   |
| 5             | メロン   |
| 5             | ぶどう   |

# 問題
```
中に（りんご、バナナ、ぶどう）の組み合わせで果物が入っている籠の番号を取得するSQLを書いてください。
```

## 前提事項
* ちょうど（りんご、バナナ、ぶどう）の組み合わせが入っている籠を対象とします。（りんご、バナナ、メロン、ぶどう）のように余計な果物が入っている対象外です。

## 制約事項
* できるだけ標準SQLベースで書いてください。
* できるだけDISTINCTは使わないでください。

## 期待結果
| basket_number |
| ------------- |
| 1 |

# DDL/DML
ローカル環境や[DB Fiddle](https://www.db-fiddle.com)などの環境で以下のSQLを流してください。
（動作確認は、DB Fiddle上のPostgreSQL 11で行いました）

> DB Fiddleで試す場合、左側のSchema SQLというペインに下記のSQLをコピー&ペーストし、右側のQuery SQLというペインにクエリを記述します。画面上部ナビバーのRunをクリックすると結果が表示されます。

```sql:DDL&DML
    CREATE TABLE baskets (
      basket_number integer,
      fruit varchar(50)
    );
    
    INSERT INTO baskets VALUES (1, 'りんご');
    INSERT INTO baskets VALUES (1, 'バナナ');
    INSERT INTO baskets VALUES (1, 'ぶどう');
    INSERT INTO baskets VALUES (2, 'バナナ');
    INSERT INTO baskets VALUES (2, 'いちご');
    INSERT INTO baskets VALUES (2, 'メロン');
    INSERT INTO baskets VALUES (3, 'りんご');
    INSERT INTO baskets VALUES (3, 'ぶどう');
    INSERT INTO baskets VALUES (4, 'りんご');
    INSERT INTO baskets VALUES (4, 'バナナ');
    INSERT INTO baskets VALUES (4, 'メロン');
    INSERT INTO baskets VALUES (4, 'ぶどう');
    INSERT INTO baskets VALUES (5, 'バナナ');
    INSERT INTO baskets VALUES (5, 'メロン');
    INSERT INTO baskets VALUES (5, 'ぶどう');
```

# 解答例
SQLの実現方法は色々あると思いますが、以下に一例を示します。

```sql:解答例
select 
  basket_number 
from 
  baskets 
group by 
  basket_number 
having 
  COUNT(1) = 3 
  and SUM(
    case when fruit in (
      'りんご', 'バナナ', 'ぶどう'
    ) then 1 else 0 end
  ) = 3
```

以下、上記SQLの解説となります。

今回のポイントは、列ではなく行方向のAND条件となることと、組み合わせがちょうど合致するもの**だけ**を抽出しないといけない点です。

## 行方向のAND条件対応
以下はSQL初心者がやりそうな(?)誤答例です。

```sql:NG
select 
  basket_number 
from 
  baskets 
where 
  fruit = 'りんご' and fruit = 'バナナ' and fruit = 'ぶどう'
group by 
  basket_number;
```

`fruit = 'りんご' and fruit = 'バナナ' and fruit = 'ぶどう'` を同時に満たすレコードは存在しえません。
そこで、工夫が必要となります。`basket_number`で`GROUP BY`したグループの中において、`fruit`が`'りんご', 'バナナ', 'ぶどう'`のいずれかに合致した明細レコード数を数えて、それが`3`に等しければ`'りんご', 'バナナ', 'ぶどう'`を含むはずです。

```sql
group by 
  basket_number 
having 
  SUM(
    case when fruit in (
      'りんご', 'バナナ', 'ぶどう'
    ) then 1 else 0 end
  ) = 3
```

## 組合せがちょうど合致するもの
先ほどの条件だと、`'りんご', 'バナナ', 'メロン', 'ぶどう'`が入っている4番の籠も条件に当てはまってしまいます。
これを除外するには、籠の中の果物の総数を見る必要があり、`COUNT(1) = 3`の条件を加えてあげます。

```sql
having 
  COUNT(1) = 3 
  and SUM(
    case when fruit in (
      'りんご', 'バナナ', 'ぶどう'
    ) then 1 else 0 end
  ) = 3
```

# おわりに
暇つぶしになったでしょうか？
よい別解があったら是非コメント欄で教えてください！

# バックナンバー
[つ 息抜きにSQLクイズでも](https://qiita.com/yonetty/items/9413c0b35eef5773d4b0)
[つ 息抜きにSQLクイズでも (2)](https://qiita.com/yonetty/items/a57885e2b568a2b1d6eb)