OmniAICreator/Qiita-1.07M huggingface dataset:
クラスの継承

#クラスの継承とは
クラスの継承とは既存のクラスを元に新しいクラスを作ることです。

#なぜクラス継承は必要なのか
それは、クラスの継承を使えば、共通する部分をまとめることができて効率的だからです。

例えば、タンパク質、脂質、炭水化物のクラスを作成するならば、3つに共通する情報をまとめた栄養素クラスを作成し、その栄養素クラスを継承したクラスを作成したほうが効率的だからです

#継承の書き方
あるクラスを継承して新しいクラスを作る場合には以下のように
「新しいクラス < 元となるクラス」と書きます。

```
class Protein < Nutrition
  
end
```
#継承されるもの
クラスを継承すると、親クラスから子クラスへ以下のものが引き継がれます。

親のインスタンス変数
親のインスタンスメソッド

```
class Nutrition

  def initialize(name1)
    @name1 = name1
  end

  def makuro
    puts "3大栄養素のひとつは#{@name1}です"
  end

end

class Protein < Nutrition
  
end

nutrition_name = Protein.new("タンパク質")

nutrition_name.makuro

# ターミナル出力結果
# 3大栄養素のひとつはタンパク質です

```
上記を見てみると、Proteinクラスの中には何も記述をしていませんが、継承元のNutritionクラスのインスタンス変数およびインスタンスメソッドを使うことが確認できます。

#おわりに
クラスの継承はプログラミングにおいて効率的なコードを書くのに必要なため、アウトプットさせてもらいました
【VSCode】初心者が最初に覚えておきたいショートカットキー　7選

#はじめに
今回はプログラミング初心者向けにVisual Studio Code(VSCode)で開発する上で最低限覚えておきたいショートカットキーを７つ紹介します。

#VSCodeで使えるショートカットキー

##１．カーソル行削除
行を削除する方法は、2つあります。
1つは、行をカット(Ctrl + X)する方法です。ただ、この方法ですとクリップボードにカットした行が上書きされます。
クリップボードに削除する行を保存したくない場合は、以下のショートカットを使用しましょう。
windows:　Ctrl + Shift + K
mac:   Command + Shift + K

これで行を簡単に削除できます。

##２．下に行を追加
コードを書いていると、行の途中にカーソルがあるときに改行したい時があります。
そのような時は、以下のショートカットを使用すると、カーソルを行末や行頭に移動しなくても空白行を追加できます。
windows: Control + Enter
mac:   Command + Enter

##３．カーソル行を上下移動
カット＆ペーストしてもよいですが、VS Codeでは選択した行を上下に動かすショートカットキーも用意されているので覚えておきましょう。移動したい行を選択した後に以下を使えばOKです。
windows:　ALT + 上下の矢印キー
mac:　Option + 上下の矢印キー

##４．カーソル行を上下コビー
上記のカーソル行の移動にShiftキーを加えると、選択した行の複製をすることができます。
windows:　Shift + Alt + 上下矢印キー
mac:　Shift + Option + 上下矢印キー

使用してみると分かると思いますが、普通にコピー＆ペーストするよりも格段に効率が良くなるのでしっかり覚えておきましょう。

##５．コメントアウト（再度押すと解除）
コメントの切り替えをするためのショートカットキーが VS Codeには用意されています。
行を選択して以下のショートカットを使用します。
windows: Control + /
mac: Command + /

##６．開いているエディタ内の検索
ファイル内でテキスト検索するときは、以下のショートカットで検索ウィジェットを開きます。
windows: Control + F
mac: Command + F

ウィジェット内で検索ワードを入力し、Enterキーを押すと、該当するワードが強調表示されます。検索結果が複数ある場合は、ウィジェット内でEnterキーを押すごとに、次の結果に移動できます。前の結果に戻るときは、Shift + Enterキーで移動します。

##７．行にインデントを追加/削除
インデントを挿入したいときは、インデントを挿入する行を複数選択しておき、以下のショートカットを使用します。
windows: Control + ]
mac: Command + ]

逆にインデントを削除したいときは、] の所を [ に変えます。
windows: Control + [
mac: Command + [

#まとめ
プログラマーにとってエディタを使いこなすことは必須のスキルです。
今回紹介したショートカットキーはよく使うので覚えておくとよいかと思います。
『鬼滅の刃』の画像をVGG16で転移学習させ画像分類するAIを作ってみた

こんにちは。かをるです。

今流行りの【鬼滅の刃】の主要キャラである5キャラを用いて画像分類をしました。

結論、70％を超える精度で見分けることができました。

まだまだ、モデルの作成に手を加えることで精度は上がっていきそうですね。

コードやファイルは<a href="https://github.com/kaworu-mg/VGG16_kimemtsu/tree/master">GitHub</a>に上げています。

ブログ記載しました。
https://kaworublog.com/kimetsunoyaiba_vgg16_ai/
VSCODE多用ショートカットキー一覧

# はじめに
VSCODEのショートカットはとても便利であり、特にマルチカーソルを使いますが、よく使い方を忘れます。備忘録として、自分が使うものだけをまとめました。

## 基本
| 重要 | キー                 | 内容                           | メモ                                 |
| :--- | :------------------- | :----------------------------- | :----------------------------------- |
| ○    | `Ctrl` + `Shift` + P | コマンドパレットの表示         | Compare active fileなど              |
| ○    | `Ctrl` + ,           | ユーザー設定                   |
| ○    | `Alt` + ↑↓           | 行を移動                       | 実行順の変更                         |
| ○    | `Shift` + `Alt` + ↑↓ | 行を下にコピー                 |
| ○    | `Ctrl` + `Shift` + k | 行を削除                       |
| ○    | `Ctrl` + `Shift` + \ | ブラケットへ移動               |
| ○    | `Ctrl` + `Shift` + o | ファイル内のシンボルへ移動     | 変数を探す時等                       |
|      | `Ctrl` + t           | ワークスペース内のシンボル移動 | 変数が多いと使い勝手が悪い。         |
|      | `Ctrl` + k → m       | 言語モードを選択               | `Ctrl` + n のあとに実行              |
|      | `Ctrl` + k → v       | プレビュー                     | markdown時に使用                     |
| ○    | `Ctrl` + ,           | セッティングを表示             |
|      | `Ctrl` + m           | フォーカス切り替えモード変更   | タブの動作がおかしくなった場合に押す |
<br><br>

---

## エラー処理

| 重要 | キー                 | 内容             | メモ |
| :--- | :------------------- | :--------------- | :--- |
|      | `Ctrl` + `Shift` + m | 問題へ移動       |
|      | F8                   | 次のエラーへ移動 |
|      | `Shift` + F8         | 前のエラーへ移動 |
<br><br>


---
## カーソル関係

| 重要 | キー                     | 内容             | メモ |
| :--- | :----------------------- | :--------------- | :--- |
|      | `Ctrl` + Enter           | 行を下に追加     |
|      | `Ctrl` + `Shift` + Enter | 行を上に追加     |
| ○    | `Ctrl` + [               | インテンドを設定 |
| ○    | `Ctrl` + ]               | インテンドを解除 |
<br><br>


---
## 選択とマルチカーソル

| 重要 | キー                     | 内容                     | メモ                     |
| :--- | :----------------------- | :----------------------- | :----------------------- |
|      | `Shift` + `Alt` + i      | 行末にカーソルを挿入     | 複数行を選択した後に実行 |
|      | `Ctrl` + l               | 1行全体を選択            |
|      | `Ctrl` + `Shift` + l     | 一致する箇所すべてを選択 | キーワードを選択後に実行 |
|      | `Shift` + `Alt` + ←→     | 選択範囲を拡大/縮小      |
| ○    | `Ctrl` + d               | カーソル選択範囲を追加   |
|      | `Ctrl` + k →　`Ctrl` + d | `Ctrl` + d 使用時に使う  |


<br>

## 参考

[VS Code キーボードショートカット一覧 （オススメ付き）](https://qiita.com/TakahiRoyte/items/cdab6fca64da386a690b)

[VSCodeのマルチカーソル練習帳](https://qiita.com/TomK/items/3b1f5be07d708d7bd6c5)
CloudFrontでファイルがないエラーは404にしてほしいのに403で返ってくる...それ設定が足りてないだけですよ

タイトルの通り。
些細なことではあるけど長年の疑問だったのでメモ。

## TL;DR
CloudFrontのOriginに使うS3のバケットポリシーに `s3:ListBucket` を加えましょう。


## 作業のログ
S3+CloudFrontで静的ファイルの配信というよくあるやつをやろうとしてぐぐると
だいたい下記のように `s3:GetObject` だけAllowしたバケットポリシーを設定しろと出てくる。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket/*"
        }
    ]
}
```

上記でも動くものの、ファイルがないエラーの時に `AccessDenied` となりステータスも `403` である。

```xml
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>xxxxxxxxxx</RequestId>
<HostId>xxxxxxxxxx</HostId>
</Error>
```
バケットポリシーに `s3:ListBucket` を加えると

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXX"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket"
        }
    ]
}
```

ファイルがないエラーの時に `NoSuchKey` となりちゃんとステータスも `404` になる。

```xml
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>moge1.txt</Key>
<RequestId>xxxxxxxxxx</RequestId>
<HostId>xxxxxxxxxx</HostId>
</Error>
```

403だとなんか気持ち悪いなーと思いつつもSPA用にCloudFrontのCustom Error Pageに403にindex.htmlを指定してたりしたことが多いと思うんですが、やっとすっきりした。

## 参照
この世のAWSのことはだいたいクラメソに書いてある。
いつもお世話になってます。

https://dev.classmethod.jp/articles/tsnote-cloudfront-s3-notexistobject-403-001/
Railsでモデル、コントローラー、ビューを作成する。

#投稿モデルの作成
アプリ制作の下準備が完了したので、早速開発に取り掛かります。
つぶやきの投稿や削除ができるよう、まずは「投稿」モデルを実装します。

```
$ bin/rails g model Post content:text
```

Postモデルが作成され、db/migrateにcreate_posts.rbというファイルが作成されました。

```ruby:create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :content

      t.timestamps
    end
  end
end
```

changeメソッドには、postsというテーブルを作成すること、postsテーブルがcontentというカラム、打刻用カラム（timestamps）を持つことが記されています。
このままマイグレーションを実行します。

```
$ bin/rails db:migrate
```

これでDBにpostsテーブルが追加されました。

#コントローラーとビューの作成
CRUD機能を作成するため、HTTPメソッドがGETのアクションを作成します。
index(一覧表示)、show(詳細表示)、new(新規投稿)、edit(編集)アクションを指定し、ジェネレータコマンドを実行。

```
bin/rails g controller posts index show new edit
```

これで、コントローラーとビューの雛形を作成できました。
この方法では、4つのアクションについて個別のルーティングを追加してくれるようですが、一括で設定したいのでconfig.routes.rbからこれらのアクションについての設定を消します。
代わりに次の設定を追加。

```ruby:config.routes.rb
resources :posts
```

resourcesメソッドはCRUDに関するルーティングを一括で設定してくれます。
また、ルートパス「/」に投稿一覧が表示されるようするため、以下を追記。

```ruby:config.routes.rb
root to: 'posts#index'
```

サーバーを再起動し、ローカルホストにアクセスすると…
![ABCAA74E-1E1A-487C-8402-889A7AD99C08_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/6f4fb627-7c2e-a5a9-4222-5e0c0d411e36.jpeg)

ちゃんと変更されたようです。

#参考
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=ppx_yo_dt_b_d_asin_title_o03?ie=UTF8&psc=1)
ブロードキャストについて調べてみた

## 勉強前イメージ

ネットワーク内のホストの全員に対してデータを送ること・・かな？

## 調査

### ブロードキャスト とは

同じネットワーク内の全宛先に対して、1対多数で行われるデータの通信のこと。
使用例としては、ARP要求パケットです。
ARPとはIPアドレスからEthnetのMACアドレスを取得するプロトコルで、
ARPの要求をする際に、ネットワーク内の全宛先に対して「192.168.1.1のホストいますか？」と呼びかける際に使用します。

### ブロードキャストアドレス というものがある

- ブロードキャストアドレス とは

ブロードキャストアドレスというものがあります。
ブロードキャストを行う際に使用されるのが、ブロードキャストアドレスです。
ブロードキャストアドレスで送信されたパケットは同じネットワーク内の全ホストに対して送られます。

- ブロードキャストアドレスの計算方法

今回は `192.168.0.0/24` のネットワークのブロードキャストアドレスを見ていきます。
ブロードキャストアドレスは、ホスト部のビットが1になる値になります。
※ちなみにホスト部のビットが1になる値はネットワークアドレスと言います。

まず、192.168.0.0は8ビットずつ見ていくと
11001010.10101000.00000000.00000000になります。
/24なので、第3オクテットまでの、11001010.10101000.00000000 がネットワーク部になり、
第4オクテットの00000000 がホスト部になります。
ブロードキャストアドレスは `ホスト部のビットがすべて1の状態` なので、
11001010.10101000.00000000.11111111 になります。
それを見やすい状態に戻すと 192.168.0.255 になります。
これがブロードキャストアドレスです。

![ブロードキャストアドレスUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/398dac8e-1252-c015-c778-9fa44679bc46.png)


### ブロードキャストアドレスの種類

以下2種類があります。

- ローカルブロードキャスト
	- 自身が接続しているネットワークのブロードキャスト
	- ブロードキャストアドレスは 上記と同様であれば、 192.168.0.255
- ダイレクトブロードキャスト
	- 自身が接続していないネットワークへのブロードキャスト
	- もし、192.168.1系ネットワークがあればそれにあたる
	- セキュリティ上の問題もあるため、基本的には設定されない


## 勉強後イメージ

ブロードキャストには2種類あるって知らなかった。
基本的には、xxさんいますかー？とかいうパケットに使われるやつなのね。

## 参考

- [IP address - Network Address / Broadcast Address](https://www.infraexpert.com/study/ip4.html)
- [ARPの動作](https://www.itbook.info/study/p73.html)
- [ブロードキャストアドレスの用途](http://atnetwork.info/tcpip/tcpip56.html)
- [unicast / multicast / broadcast](https://www.infraexpert.com/study/networking8.html)
【Laravel】ClockWorkでAPIサーバーのデバッグをする流れ

# ClockWorkって？
Laravelで使えるデバッグするツール。`clock()`という関数を使って変数の中身を確認することができる。
APIサーバーとしてLaravelを書いていると`dd()`とか使えない為、ClockWorkを使用する。

# 用意するもの
Chromeの拡張アプリ
https://chrome.google.com/webstore/detail/clockwork/dmggabnehkmmfmdffgajcflpdjlnoemp

# インストールコマンド

```
$ composer require itsgoingd/clockwork
```

# Laravelのバージョンがv5.5よりも前の方の追加手順

```php:config/app.php
'providers' => [
    ...
    Clockwork\Support\Laravel\ClockworkServiceProvider::class
]

'aliases' => [
    ...
    'Clockwork' => Clockwork\Support\Laravel\Facade::class,
]
```

`providers`と`aliases`にそれぞれ追記が必要だそうです。必要に応じて追記してください。

# 使い方
### laravel公式のDockerファイルを使用している方

```
$ sail artisan route:list
```

使ってない方

```
$ php artisan route:list
```

ルートを確認してもらうとわかりますが、見覚えのないルートが追加されています。

```
http://localhost/__clockwork/app#
```

アクセスするとデバッグができるようになります。便利
Gemfile.lockをどうしても削除したい

## Gemfile.lockがゾンビみたいに復活するという記事を見つけた
自分もどうしてもGemfile.lockを削除したい。ただそれだけなのです。でも何度削除しても一瞬で復活・・・。裏で復活させている奴がいるだと・・・。

## 結論
Springを停止している間に削除するんだ・・・！

```
bin/spring stop
```

削除したら又Springを開始させておく。

```
bin/spring start
```

なぜ止めれば復活しないのかは後日書きたい。
java.util.Date使い向けのDateTimeFormatter簡単使い方

この記事は、昔からJavaのプログラムを書いていて、`java.util.Date`や`java.util.Calendar`での日付処理に慣れ親しんでいる人が、「`DateTimeFormatter`はスレッドセーフなので`SimpleDateFormat`より使いやすそう。でも今のコードでどう使えばいいの？」というときのヘルプになればと思います。

# Javaでの日時処理
Javaでの旧世代の日時処理と言えば`Date`クラスと`Calendar`クラスです。`Date`クラスはJavaの一番最初期JDK1.0のころからある日時のクラス。`Calendar`クラスはその直後Javaの国際化の中で導入された日時のクラスです。プログラムでは`Date`クラスは日時の入れ物に、`Calendar`クラスをタイムゾーン処理や日時演算に使うという使い方が多かったのではないでしょうか。
一方、Java8で新しい日時処理のクラスとして、`java.time`パッケージが導入され日時の概念や処理が整理され詳細化されました。日時を文字列変換して出力するためには`DateTimeFormatter`クラスが導入され、これまで`SimpleDateFormatter`の悩みだった「マルチスレッドで使えない」「インスタンス毎回作ると遅い」などの不満が解決されたものになっています。

# DateTimeFormatterで日時出力
前置きはこれくらいにしておいて、`DateTimeFormatter`クラスで日付を整形して出力するには`DateTimeFormatter.formatter(TemporalAccessor)`を使います。`Date`クラスをこの引数にどう合わせるか、ですが、`Date.toInstant()`というメソッドを使うと変換ができるようになっています。`DateTimeFormatter`にはあらかじめ定数としてよく使いそうな書式が定義されています。例えばISO-8601の書式で出力するには次のコードで出力できます。

```iso_date.java
import java.util.Date;
import java.time.format.DateTimeFormatter;

// java.util.Dateの現在時刻をISO-8601形式(UTC)で表示
Date now = new Date();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(now.toInstant()));
```

出力例

```
2021-02-01T02:33:29.291Z
```

ただ、他の書式、例えば RFC1123形式の _Mon, 01 Feb 2021 15:00:00 +0900_ で表示をするには同じコードではNGで例外が発生します。

```rfc_date.java
Date now = new Date();
System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(now.toInstant()));
```

発生した例外

```
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth
	at java.time.Instant.getLong(Instant.java:603)
	at java.time.format.DateTimePrintContext$1.getLong(DateTimePrintContext.java:205)
	at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
	at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2551)
	at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2190)
	at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
	at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
```

この書式では時刻のオフセット、すなわちタイムゾーン情報を設定することが必要です。`Date`クラスにはタイムゾーンの概念が無いのでこうなるのですかね。エラーメッセージはちょっとわかりにくいところです。

`Date.toInstant()`で得られたオブジェクトに`atZone`メソッドでタイムゾーン情報を設定すればこの書式で表示ができるようになります。`ZoneId.systemDefault()`はシステムの既定のタイムゾーンを取得します。

```rfc_date.java
Date now = new Date();
System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(now.toInstant().atZone(ZoneId.systemDefault())));
```

出力例

```
Mon, 1 Feb 2021 11:34:30 +0900
```

タイムゾーンを指定したい場合は以下のように指定ができます。

```rfc_date_UTC.java
System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(now.toInstant().atZone(ZoneId.of("UTC"))));
```

出力例

```
Mon, 1 Feb 2021 02:34:30 GMT
```

# おわりに
過去に作ったコードや各種ライブラリなど`Date`クラスは未だ現役で使われる場面も多いので、「内部データとして`Date`は使わざるを得ない。でも表示処理など周辺は楽に書きたい」という場合にお役に立てば幸いです。
ただ、これからの日付処理では`java.time`パッケージの日時クラスを使うのが良いと思うので、乱用はバッドノウハウになるかもしれません。十分ご注意ください。（かくいう私も結構つかってしまっています…）
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ Pardot の基本 (Salesforce Classic) ⇒ Pardot の管理の基本について

１．Pardot アカウントで指定した連絡先で受信するものは何ですか?
２．Pardot にはデフォルトのユーザーロールが 4 つあります。4 つのロールはどれですか?
３．あなたの会社では Salesforce に好みの製品を収集する項目を設定しており、その情報を Pardot で使用したいと考えています。実行すべき操作はどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/7824bc2a-da2f-6fe7-0a2c-a3e6c12052f6.png)
GGJ2021 NEOSVRで作ったもの備忘録

#はじめに

2021年1月に行われたGGJ2021で作った作品
[Found the melody](https://globalgamejam.org/2021/games/found-melody-7)
の中身の解説です。

ゲーム自体は
メロディーにあわせてボタンを押す簡単なゲームです。 NeosVRの中で遊びます。 高得点をだせると音声でほめてくれます。

なお、音声でほめてくれるところは間に合わず、手動で再生ボタンを押します・・・

#核となる部分

音ゲーのような感じで、メロディーデータをMIDIから取り出せると良いなと。とりあえずタイミングだけでもと試してみた。

メロディーのデータは #maxmsp を使っています。
でテキスト化したものをタイミングとして取り出すようにしてみたものです。

#動いている様子
https://twitter.com/tatmos/status/1355755206462464005?s=20

#中の構造

![2021-02-01 20.51.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/9dd56ba9-cce3-2602-3475-ccc239875f57.jpeg)

Audioにoggを置いている
![2021-02-01 20.57.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/e80860e1-da59-c8c3-fe92-acdddbf80396.jpeg)

登録したままここに並べているので、デバッグもしやすい。

![2021-02-01 20.54.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/9e44ef3f-300b-66ca-a6c0-dd96e3607849.jpeg)

NEOSのボタンからIsPressedをみて、FireOnTrueでPlay
でメインのBGMが再生される

![2021-02-01 20.54.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/b80f3971-6844-080d-b318-a70dbf6fa660.jpeg)
BGMの再生ステート（PlaybackState)から再生時刻、全体の長さを取り出して

ここでは再生2秒後に「ゲーム開始」の音声を再生
![2021-02-01 21.02.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/47655d96-93a4-9863-a8e1-d8fb84d5515c.jpeg)

ここでは終わり20秒前に「残り10秒」の音声を再生![2021-02-01 20.56.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/ac0aeb41-d654-106a-9fa3-3d05ebb262c3.jpeg)

ここではメロディーのタイミングをとりだしている
![2021-02-01 21.02.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/76d41642-9c4a-5f0d-2950-eb35d80c38a6.jpeg)

文字列で4文字ずつ取り出す。　100で1秒なので、99秒まで記録できる。
![2021-02-01 20.57.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/9e0e4056-24b7-6b16-faa4-9c965d5eb275.jpeg)

この数値は、メロディーのMIDIを出力したものを、Maxでタイミング情報の数字を取り出してテキストにしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/9c66c82c-5f08-36f4-3ecb-df9402e09dbe.png)
seqでMIDI再生して、midipareseでノート情報を取り出し、timerで時刻を記録　この時msecを　cent sec?に変えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/e9517d8c-be43-816f-7916-39eca8a966f6.png)
そこで得られた数値をappendで書き出している。　ここでは3桁のものやスペースが入ってしまうので、後で、テキストエディタで、0埋めして4桁にし、スペースを削っている。


そしてsubstringでテキストを4文字ずつ分解し、Indexを操作して時間経過ごとにIndexを変更している。
![2021-02-01 21.06.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/90dacb73-5733-e40b-f6e2-774a39e9c769.jpeg)

そのタイミングを利用して、0.2秒ほどで0になるConstantLerpを作り、
メロディーの変化タイミングでボタンを押すとスコアが入るようにしている。

![2021-02-01 21.06.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/1d1067e7-bef6-bd4b-e8c2-0c455da70c0c.jpeg)


#改善したいところ

何かもっときれいに書けないだろうか？
##カウンター
特にカウンターのようなものを使うときにIntとWriteを使っていて、初期値に戻すのもWriteを使って　とごちゃごちゃしてしまっている。
もっとスマートに書けないのかな・・

##値の参照
ボタンの状態を見てFireOnTrueとか書いているけど、他の方法がありそうな。（ボタン押したときのDelegateみたいなのに実装するとか）


#ゲーム内容で改善したいところ
シーケンスの読み込みを1小節前くらいにして、呼び動作を反映させてあげたいところ。（円が小さくなってボタンに収束していくみたいなのとか　タイミングゲームによくありそうな表示）
丸いオブジェクトを用意して、1小節かけて小さくし、Activeを切る　とか、　1小節で消えるオブジェクトをDuplicateして、変化タイミングで
発生させるとかありそう。
バリデーション　項目ごとにエラー文を表示させる

#今日の勉強
バリデーションでエラー文を表示させる。
入力項目が複数ある時に
エラーがあった項目にそれぞれ
エラー文を表示させる

ちなみに
[PHPフレームワーク　Laravel入門](https://www.shuwasystem.co.jp/book/9784798060996.html)
をもとに学習を進めていく。

##

```php:index.blade.php
   @if (count($errors) > 0)
   <p>エラー！</p>
   @endif
```

この count　が一体何者なのかわからなかったので調べた。
count()の変数の中に要素が何個入っているかカウントしれくれる。
つまり$errorsのなかに１つでも値が入っていたら( > 0)
「エラー！」を表示してね。という処理。
バリデーションでエラーが確認されたら
$errors（という箱？）に保管されるので
一つでもエラーが確認されたら
エラー文が表示される。

```php:index.blade.php
   <form action="/hello" method="post">
   <table>
      @csrf
      @if ($errors->has('name'))
      <tr><th>エラー</th><td>{{$errors->first('name')}}</td></tr>
      @endif
      <tr><th>名前: </th><td><input type="text" name="name" value="{{old('name')}}"</td></tr>
  .
  .
  .
  .
```

has()はエラーメッセージを持っているかチェックしてくれる。

以下参考ページ
[入門者のためのLaravelのバリデーションとエラーメッセージ](https://reffect.co.jp/laravel/laravel_validation_understanding#i-2)

エラーが発生した場合は
$errors->first()のという値を出力
firstは（）の中の最初のエラーメッセージを取得する。
【Swift】UITextFieldの枠線を消して下線（アンダーライン）をつけてかっこよくする

`UITextField`のデフォルトレイアウトの枠線で囲われているのあまりカッコ良くないですよね。
今回はカッコ良くアンダーラインをつける`Extension`を紹介します。

```swift
extension UITextField {
    func setUnderLine() {
        // 枠線を非表示にする
        borderStyle = .none
        let underline = UIView()
        // heightにはアンダーラインの高さを入れる
        underline.frame = CGRect(x: 0, y: frame.height, width: frame.width, height: 0.5)
        // 枠線の色
        underline.backgroundColor = .white
        addSubview(underline)
        // 枠線を最前面に
        bringSubviewToFront(underline)
    }
}
```
設定したい`UITextField`で呼び出せばOK

```swift

textField.setUnderLine()
```
こんな感じでアンダーラインが表示されます！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/39500837-8cdb-5601-3cdd-cc50b0fe79df.png" width=50%>
ESP32+I2S DAC(PCM5102)でMP3再生


EPS8266Audioライブラリスケッチ例”PlayMP3FromSPIFFS”をベースにI2S DAC用に改修しPCM5102 DACボードからMP3を再生する

# 準備

* Arduino IDE(ESP32をセットアップ済とします）
* [ESP32 Dev Module](https://akizukidenshi.com/catalog/g/gM-11819/)
* [I2S接続PCM5102 DAC](https://www.amazon.co.jp/dp/B07QBY5Y9K/ref=cm_sw_em_r_mt_dp_DM2HYTHG9AVWJ0VEW6VE?_encoding=UTF8&psc=1)

下記ライブラリをダウンロードしてArduino\libraries以下にコピー

* https://github.com/earlephilhower/ESP8266Audio
* https://github.com/Gianbacchio/ESP8266_Spiram



SPIFFSに ”pno-cs.mp3” が転送済みであることとします。
SPIFFSへのファイル転送はmgo-tec電子工作さんブログを参考にさせていただきました。[こちら](https://www.mgo-tec.com/blog-entry-spiffs-uploader-plugin-arduino-esp32.html)

ESP32とI2Sアンプを下記のように接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067139/e45500b3-ddb1-ad6e-78ad-1c62d9107337.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067139/a1ea89bc-4ef9-679e-d4ca-7819dc2c0dcb.png)


# MP3再生

下記コードを書き込むと音が流れると思います。

```
#include <Arduino.h>
#ifdef ESP32
  #include <WiFi.h>
  #include "SPIFFS.h"
#else
  #include <ESP8266WiFi.h>
#endif
#include "AudioFileSourceSPIFFS.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

// To run, set your ESP8266 build to 160MHz, and include a SPIFFS of 512KB or greater.
// Use the "Tools->ESP8266/ESP32 Sketch Data Upload" menu to write the MP3 to SPIFFS
// Then upload the sketch normally.  

// pno_cs from https://ccrma.stanford.edu/~jos/pasp/Sound_Examples.html

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;


// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{
  (void)cbData;
  Serial.printf("ID3 callback for: %s = '", type);

  if (isUnicode) {
    string += 2;
  }
  
  while (*string) {
    char a = *(string++);
    if (isUnicode) {
      string++;
    }
    Serial.printf("%c", a);
  }
  Serial.printf("'\n");
  Serial.flush();
}


void setup()
{
  WiFi.mode(WIFI_OFF); 
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  Serial.printf("Sample MP3 playback begins...\n");

  audioLogger = &Serial;
  file = new AudioFileSourceSPIFFS("/pno-cs.mp3");
  id3 = new AudioFileSourceID3(file);
  id3->RegisterMetadataCB(MDCallback, (void*)"ID3TAG");
  out = new AudioOutputI2S();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(id3, out);
}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop();
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}
```
[ruby] classのnewとinitializeについて

#はじめに
記憶の定着のためアウトプットさせてもらいます

#initializeメソッドとは
initializeメソッドはclassがnewされた時に呼び出されるメソッドです
主にクラスの初期化処理をするものです

#newメソッドとは
クラスをインスタンス化できます
インスタンス化とはclassの定義をもとに新たな変数を作成することです。

#具体例コード
```
class Car

  # クラスの初期化メソッド
  def initialize(name)
    @name = name
  end

  # クラスのインスタンスメソッド
  def car_name
    puts "#{@name}が走ってる！！"
  end

end

# classのnewメソッドに引数を渡す
car = Car.new("purado")

# newメソッドからinitializeメソッドに渡って初期化された名前が使用される
car.car_name
```
実行結果

```
puradoが走ってる！！
```
上記のコードではCar.newメソッドをつかってCarクラスをインスタンス化（変数化）しました

その後、変数carに対してcar_nameメソッドを実行するように命令してます

その結果Carクラスのcar_nameメソッドが実行されて「puradoが走ってる！！」が出力されます

#newとinitializeの関係
initializeメソッドはnewメソッドが呼び出された際に呼び出されます。

また、newメソッドに渡された変数も、そのままinitializeメソッドに渡されます。

#おわりに
簡単なアウトプットでした
【Ruby】カウントアップ　カウントダウン　メソッド

【コード】

```
カウントダウンの場合

N = 10
M = 3

def countdown(n,m)
n.downto(m){|n| p n}
end
countdown(N,M)
```
```
カウントアップの場合
N = 1
M = 10

def countup(n,m)
n.upto(m){|n| p n}
end
countup(N,M)
```

【出力結果】

```
カウントダウンの場合
10
9
9
7
6
5
4
3
2
1
```
```
カウントアップの場合
1
2
3
4
5
6
7
8
9
10
```

【解説】*カウントダウンを基準に解説

まず変数NとMを用意、カウントダウンを開始させたい数値をNに、終了させたい数値をMへ代入します。

今回ですと、10がカウントダウンのスタートの値、1がカウントダウン終了の値です。

カウントダウンメソッドを用意し、実引数に(N,M)を入れ、仮引数(n,m)へと渡します。

メソッドの中身を記述し、実行するとカウントダウン結果が出力されます。

カウントアップの場合はカウントダウンの逆に数値を代入し、メソッド内のdowntoをuptoに書き換えればOKです。
CORS、XSS、CSRFが覚えられないのだが

## はじめに
CORS、XSS、CSRFについて皆さんご存知かと思います。
WEBサイトの惰弱性絡みの仕組みや攻撃手法です。

しかし、私は、いまいち覚えられず、「CORSって何だっけ？」と
何度も検索を繰り返しております。

なぜ覚えられないか?と考えたところ、
CORS、XSS、CSRFについて英語や略語で覚えようとしていて馴染み辛いのが原因なのかな？
と思いました。

ということでこれらの用語で使われている単語の意味を解説し、
少しでも覚える手助けが出来ればと思います。


## CORS
クロスサイトリソースシェアリング

英: Cross-Origin Resource Sharing
読み方: コルス or シーオーアールエス

### 概要
あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組み。
クロスサイトリクエストフォージェリ(CSRF)などのセキュリティ攻撃を防止するためにある。

### 単語の意味
#### クロスサイト
サイト横断
#### リソース
資源。
ここで言えば、他のWEBサーバーにあるデータなど

#### シェアリング
共有する

### 全体の意味
サイトを横断して、データを共有する

## XSS
クロスサイトスクリプティング

英: cross-site scripting
読み方: エックスエスエス

### 概要
ユーザー（被害者）の Web ブラウザで任意の JavaScript を実行させることを許す脆弱性または攻撃手法

### 単語の意味
#### クロスサイト
サイト横断
#### スクリプティング
スクリプト(プログラム)実行する

### 全体の意味
サイトを横断して、スクリプト(プログラム)実行する


## CSRF
クロスサイトリクエストフォージェリ

英: cross-site request forgeries
読み方: シーサーフ

### 概要
正規ユーザを誘導し、強制的に特定の処理を実行させる攻撃を許す脆弱性または攻撃手法

### 単語の意味
#### クロスサイト
サイト横断

#### リクエスト
要望すること。
ここで言えば、WEBサーバーにリクエストを送ること

#### フォージェリ
偽造

### 全体の意味
サイトを横断して、偽造してリクエストを送る


## おわりに
うまく翻訳できておりますでしょうか？

用語の意味を理解することは難しいですが、それぞれの単語の意味を調べていくと用語の成り立ちや本質が見え、覚える手助けになるのでないでしょうか？

## 参考
[なんとなく CORS がわかる...はもう終わりにする。](https://qiita.com/att55/items/2154a8aad8bf1409db2b)
[XSS と CSRF って結局何が違うのか？](https://qiita.com/att55/items/a50ca43adde206017525)
Java + Spring Boot アプリケーションを DokerizeしてAWS Fargateを使ってデプロイ(Docker&AWSの知識ゼロでOK)


![スクリーンショット 2021-02-01 20.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637360/fdc5930c-fb6e-c1de-94d2-5e9c91b7ea48.png)
### 開発環境
- MacBook Air Big Sir
- Java 11
- Spring Boot 2.4.2
- Thymeleaf
- PostgreSQL 12.5
- VSCode

1. Java + Spring Boot でアプリケーションを作り、ローカル環境で動かせるようにする
2. こちらの[Youtube](https://www.youtube.com/watch?v=KEH0-rHHNxM&t=2585s)にしたがってAWS RDSでDBを作成し、application.ymlのDB接続先に設定する

```yml

  datasource:
    # ↓ローカル上のPostgres
    # url: jdbc:postgresql://localhost:5432/database
    # ↓AWS(RDS)上のPostgres
    url: jdbc:postgresql://<RDSデータベースのエンドポイント>:5432/<RDSのDB名>
    username: postgres
    password: postgres
```
3.こちらの[Youtube](https://www.youtube.com/watch?v=e3YERpG2rMs&list=PLVz2XdJiJQxzMiFDnwxUDxmuZQU3igcBb&index=2)にしたがってSpringBootアプリケーションからDockerイメージを作る
4. こちらの[Youtube](https://www.youtube.com/watch?v=oGxkLH_OAlc&list=PLVz2XdJiJQxzMiFDnwxUDxmuZQU3igcBb&index=3)にしたがって3.で作成したDockerイメージをDockerHubにプッシュ(動画ではDockerToolBoxを使っていますが、普通にDocker for MacをインストールしてターミナルでDockerコマンドが打ててればOK)
5. こちらの[Youtube](https://www.youtube.com/watch?v=z7_LdCVnCRU&t=294s)にしたがってAWS Fargateから4.で作成したDockerイメージをデプロイ

こちらで紹介した動画は全て英語ですが、そんなに難しくないと思うので画面を見るだけでもなんとなく理解できると思います。1時間ほどでデプロイできます、Youtube様様です!
Google Earth Engine上で指定した対象領域(ROI: Region Of Interest)をGeoJSONファイルで出力

##概要
こんにちは。
　衛星画像を解析する上では、対象領域（以下ROI）の特定が必要な場合が多いです。特に近年高解像化が進む衛星画像はとんでもなくデータ容量を食う（一枚数百MB～数GB）ため、これを毎回全部扱っていてはメモリとSSDがいくらあっても足りません。ですので、特定領域だけ切り抜いて処理した方が計算時間と財布に優しいことが殆どです。</br>
　ROIを指定するのには色々な方法がありますが、Polygonの形で保持するのが一般的かと思います。特にGeopandasのGeoDataFrameはマップに表示したりする上でも非常に使い勝手が良く、よく使われています。</br>
 ROIのGeoDataFrameへの取り込みは、Shapefile(.shpの拡張子のモノ）を使うやり方がよく使われています。Shapefileの取り込みや、GeoDataFrameについての説明は[ここが詳しいです。](https://automating-gis-processes.github.io/2016/Lesson2-geopandas-basics.html)</br>
 行政区画等はShapefileで配布されてることが多いのですが、自分は代替としてGeoJSONファイルによってROIを指定し、それをGeoDataFrameへと取り込む手法を使っています。本記事では、Google earth Engine（以下GEE)を使って描いたROIをGeoJSON形式で出力し、pythonへ取り込んで地図と重ねて表示する方法をご紹介したいと思います。
##前提条件
1. GEEのアカウントを作成済みであること（アカウントが無い方は[こちら](https://earthengine.google.com/)からサインアップしてください）
2. Google Colabで実行 (記事執筆時点でのバージョンはpython 3.6.9)

##コード等（GEE）
　今回の例として、JAXAの種子島宇宙センター・ロケット発射場をROIとして見てみます。GEEのCode Editorを開いたら、自分の注目したい領域についてズームします。
![GEEcodeEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/6c65b46e-5c66-7464-7368-84d7ca08ce46.png)
　左上にある小さいマークの中から、図形を描画を選択して、クリックしながらROIを描いていってください。最後に始点となった点をクリックすることで、PolygonとしてROIが描かれます。
![DrawAPolygon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/37487ea1-5dff-232a-1150-6d68a6b37e30.png)
![Polygon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/370cd50a-c5ad-6f12-d639-95c4d27709e5.png)

　ROIを描き終わったら、以下のコードを打ち込んでください。打ち込んでからコンソール上のrunボタンを押すことで、コードが実行されます。ファイル名を指定したければ、'vectorsToDriveExample'の部分をお好みの名前に編集してください。


```JavaScript:GEE.js
var polygon=geometry;
var polyFeature = ee.FeatureCollection(polygon);
Export.table.toDrive({
  collection: polyFeature,
  description:'vectorsToDriveExample',
  fileFormat: 'GeoJSON'
});
```
　ここからが絶妙に分かりにくいのですが、コードを実行すると右上のtaskボタンがオレンジ色になっています。これを選択して、runを押すことによってGeoJSONファイルがGoogle drive上に書き出されます（正確にはrunを押すと保存先指定等のダイアログが出ると思いますが、保存先がdriveになっていることさえ確認しておけば大丈夫です）。
![Task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/444ee140-24cd-e982-267b-040911174807.png)
![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/b3f13a1c-09c4-2a69-947d-e3d648738f4f.png)
　driveを確認すると、無事にGeoJSONファイルが出力されていました。
![GeoJSON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/7d0e1712-844d-f5fc-843c-5c25dad23311.png)

##コード（python）
　作成したGeoJSONファイルをpythonへと取り込み、マップ上で表示してみたいと思います。geopandasをインポートしましょう。インポートできない場合には、pip insall geopandasでインストールしてください。地図を表示するためにfoliumも同時にインポートしています。

```python:import.py
import geopandas as gpd
import folium
```

　あとはGeoDataFrameへ先ほどのGeoJSONを取り込み、マップへと表示してみましょう！

```python:mapView.py
polygon=gpd.read_file('/content/drive/MyDrive/Colab Notebooks/GeoJson/vectorsToDriveExample.geojson')
m=folium.Map([30.40,130.9576],zoom_start=14) #マップで表示するおおよその緯度・経度とズーム倍率の指定
folium.GeoJson(polygon).add_to(m)
m
```

![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/62d54473-729e-7710-d501-eaaad89a5584.png)
初めてのRaspberry Pi Pico ④ Circuitpythonで気圧センサLPS25HB

　第2回では、BMP280をつないで、気圧や温度をMuに表示しました。ここでは気圧センサLPS25HBを使いまします。どちらのブレークアウト・ボードもAdafruit製です。動作環境はラズパイ4です。

###LPS25HBボードのおもなスペック

- 動作電圧　3.3V（デバイスは1.7～3.6 V）
- 測定範囲　260～1260hPa
- 確度　±0.1hPa（25℃）、±1hPa（0～80℃）
- インターフェース　SPI、I2C。I2C用プルアップ抵抗は実装、５V用レベル変換回路実装

###準備
　ダウンロード・フォルダにあったadafruit-circuitpython-raspberry_pi_pico-en_US-6.2.0-beta.1.uf2をデスクトップにドロップしておきます。
　BOOTSELボタンを押したまま、ラズパイとPicoをUSBケーブルをつなげます。つながったら、BOOTSELから手を放します。RPI-RP2ドライブがマウントされます。そのRPI-RP2ドライブへ、adafruit-circuitpython-raspberry_pi_pico-en_US-6.2.0-beta.1.uf2をドラッグします。コピーが数秒で終わると、デスクトップには、CIRCUITPYドライブがマウントされています。

<img width="170" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c37d3112-f479-8765-c6cf-1017e3b4b44b.png">



　エディタMuを起動します。Circuitpythonモードで立ち上がります。
###接続
　Adafruitの気圧センサLPS25HB（[Adafruit LPS25 and LPS22 Barometric Pressure and Temperature Sensors](https://learn.adafruit.com/adafruit-lps25-pressure-sensor)）をBMP280の4ピン・コネクタにつなげます。ケーブルは純正ではないので、色はSTEMMA QTと異なっています。

![IMGP0146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c9d2e168-25a1-53b4-c3f3-cb5185478bf6.png)

|STEMMA QTコネクタ |物理的ピン番号 |GPIOピン番号|
|:-----------|------------:|:------------:|
|SCL 緑 |12 |GP9|
|SDA 黄|11 |GP8|
|Vcc 赤|36 |3.3V|
|GND 黒|13 |GND|

　Muで次のプログラムを動かします。i2cのScannerです。

<img width="370" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0a0a9b3c-9285-cf48-8659-b7042523ef78.png">



　探してきたのは二つのアドレスです。119は16進で0x77なので、BMP280です。93は16進で0x5dで、LPS25HBのスレーブ・アドレスです。

###WHO_AM_I

　データシートにWHO_AM_I（0x0f）を読み出し、0xbdが読めれば正常に通信できていると書かれているので実行します。

<img width="370" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/1dbf8355-a497-50da-4141-8159e80e3e54.png">




　10進の189は16進では0xbdなので、うまく読めていますね。

###LPS25HBのドライバとプログラム
　ラズパイのlibフォルダにあるadafruit_lps2x.mpyをPicoのlibフォルダへコピーします。また、adafruit_resisterフォルダもコピーします。

![pico203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/4c0b3dbd-3309-e4ff-81a7-2ce2ba991ee4.png)

　確認します。
<img width="450" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e004505d-88b3-b990-125d-b60c3bec2526.png">




　ラズパイのexamplesにあるlps2x_simpletest.pyをエディタで読み込みます。
（※）ラズパイのlib、examplesというのは、第2回でAdafruitからダウンロードしたzipファイルを解凍して出てきたフォルダをラズパイの\piへコピーしものです。どちらもPicoのEEPROMの容量が小さすぎてコピーできないので、必要なものだけをコピっています。

　第2回のBMP280のプログラムに、必要なものを追加します。

```python
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import busio
import adafruit_bmp280
import adafruit_lps2x

# Create library object using our Bus I2C port
i2c = busio.I2C(board.GP9, board.GP8)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
lps = adafruit_lps2x.LPS25(i2c)

while True:
    print("\nTemperature: {:0.1f} C  {:0.1f} C".format(bmp280.temperature, lps.temperature))
    print("Pressure: {:0.1f} hPa {:0.1f} hPa".format(bmp280.pressure, lps.pressure))
    time.sleep(2)
```


　実行中の様子です。
![pico206a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f53f4afb-d8f4-b50d-8c69-1f2092b9faca.png)
【Solved】タスクスケジューラやVSOAgentでWinMergeが動かない

# はじめに
タイトルの通り

* WinMergeのExcelファイル比較が特定端末(というか本来動かしたい端末)で動かない...（フリーズしているように見える）
* バッチファイルを用意してコマンド実行(直接バッチを手動で実行)するとなぜか動く

# 結論
TODOで色々試そうとしたが、参考サイトに書いてあった【仮想デスクトップ設定】と【DCOM設定】が当たりだった!!

# 参考サイト
◆タスクスケジューラからExcelが開けない
　http://heppokosehuntouki.blog.fc2.com/blog-entry-4.html
　　※タスクスケジューラは、仮想デスクトップがないとExcel等のオブジェクトを開けない
　　　仮想デスクトップは、32bitと64bitで作成場所が異なる。
　　　　x86 - C:\Windows\System32\config\systemprofile\Desktop
　　　　x64 - C:\Windows\SysWOW64\config\systemprofile\Desktop
◆「0x800A03EC」が出た…だと…？
　https://maigo-pg.seesaa.net/article/219678550.html
◆IIS で Excel を実行する方法 -COM参照と対話ユーザー- | asp.net
　https://itblogdsi.blog.fc2.com/blog-entry-418.html
　　※Microsoft Excel Application のプロパティから ID タブで、起動したユーザーを設定したらうまくいった!!


# TODO
- [ ]  回避策の導入（先に担保を...）
 - [ ]  TFSのテスト機能を試す
 - [ ]  WinMergeが成功するサーバでリモート操作
 - [ ]  下記サイト試す<br>
　◆Visual StudioなしでMSTestを使用する方法<br>
　　https://qa.codeflow.site/questions/261290/how-do-i-use-mstest-without-visual-studio<br>
　　　※Agents for Visual Studio
- [ ]  WinMergeの別バージョンで試す(最新バージョン入手込)
- [ ]  キャッシュ調査　※ProcessMonitor使う!?
v-ifとv-showの違いとメリット・デメリット

#概要
何かしらのアクションによって表示したり消したりするコードを書く場合、`v-if`と`v-show`での使い分け方が分からなかったので、両者の違いをメリット・デメリットとともにまとめたいと思います。

#違い
|| v-if | v-show |
|:-:|:-:|:-:|
|①|要素ごと削除する   |cssでdisplay:none;にしている   |
|②|テンプレートに適用できる   |テンプレートに適用できない   |
|③|v-elseが使える   |v-elseが使えない   |

##①要素の変更方法
```.vue
<template>
  <p v-if="piyo">piyo</p>
  ↓変更
　<!--全部消えます-->
  
  <p v-show="hoge">hoge</p>
  ↓変更
  <p v-show="hoge" style="display:none;">hoge</p>

</template>
```
`v-if`の場合、条件に当てはまらないものは要素ごと消えます。
`v-show`の場合、styleに"display:none;"が適用されることによって要素を見えなくしています。
描画速度は`v-show`の方が速いです。

##②テンプレートへの適用
`v-if`の場合、`<template v-if="piyo">piyo</template>`のようにテンプレートにディレクティブをつけることができますが、
`v-show`の場合は、つけることができません。

##③v-else
`v-if`は`v-else`で条件分岐させることができますが、
`v-show`には`v-else`は適用できません。

`v-show`で再現しようとする場合は、`<p v-show="!hoge">hoge</p>`などでやる必要があります。

#まとめ
切り替える頻度が高い場合は`v-show`を使い、条件分岐が多いものやテンプレートに適用させたい場合は`v-if`を使うと言った感じで使い分けると良さそうです。
面接で出題されたコーディングテストを冷静になって考えてみた

#はじめに
本日の企業との面談でコードについてテストされる場面があり、そのときはうまく答えることができなったので、冷静になった今なら、どう答えるか考えてみました。

##問題
問題はあくまで例えです。

```ruby:Ruby
"aiueo"
#=>"oeuia"
```
文字列を逆から出力されるようにする。
ただし、`reverseメソッド`は使わない。

##回答

```ruby:Ruby
def reverse_str(str)
  array = str.split("")        #与えられた文字列を配列に一文字ずつ入れる
  ary_count = array.length     #配列の要素の数を数える

  ary_count.times do |i|       #配列の要素の数だけ繰り返し出力する
    print array[ary_count - i] #1周目はi=1になる
  end

  puts array[0]                #最後の文字だけ出力されないので、付け足す
end
str = "aiueo"
reverse_str(str)               #メソッドを呼び出す
```
とりあえず、少し調べたらこんな感じになりました。
最低限その場でこれくらいできたらよかったなぁ。

もう少し考えるか…
<font color=red>上のコードでは、一文字ずつ出力している(`print array[ary_count - i]`の部分)のが、なんかスマートじゃないなぁ…</font>

これならどうだ？


```ruby:Ruby
def reverse_str(str)
  array = str.split("")                #与えられた文字列を変数arrayに配列で一文字ずつ入れる
  re_str = []                          #出力するとき用の配列の入れ物を用意する

  array.length.times do |i|            #arrayの配列の要素の数だけ繰り返す
    re_str << array[ array.length - i] #出力用の入れ物にarrayの一番後ろの文字から配列で入れる
  end
  re_str << array[0]                   #arrayの一文字目を最後に入れる

  puts re_str.join                     #配列を文字列に変換して出力する
end
str = "aiueo"
reverse_str(str)                       #メソッドを呼び出す
```
もう一つ配列の入れ物を用意して(`re_str = []`)、一文字ずつ入れていき、最後に配列を文字列に変換する(`puts re_str.join`)。

##もう少し追加の問題

今は、5文字の文字列だが、これがもっと増えて上のコードでは、処理に時間がかかってしまうとしたら、どうしますか？

##回答
ここで考えられるのは、そもそも配列に入れないと解決できない問題なのか？
いや、文字列のまま処理することもできるかも…
よく考えたら、文字列でも添字を付ければ、任意の文字を指定して出力することができる？

```ruby:Ruby
str = "aiueo"
puts str[1]
#=>i
```
これが成り立つなら…

これだ！

```ruby:Ruby
def reverse_str(str)
  re_str = []                     #一文字ずつ文字をいれる配列の入れ物を用意する
  str.length.times do |i|         #文字列の文字数文だけ処理を繰り返す
    re_str << str[str.length - i] #配列に一文字ずつ最後の文字から入れる
  end
  re_str << str[0]                #文字列の最初の文字を一番最後に入れる
  puts re_str.join                #配列を文字列に変換して出力する
end
str = "aiueo"
reverse_str(str)                  #メソッドを呼び出す
```
今は、これが限界かなぁ…
これなら、さっきまでの、与えられた文字列を配列に入れ直す処理がなくなるので、少しは早くなるはず。
でも、`re_str = []`配列の入れ物を用意することが最適解なのかはわかりません。
ただ、`re_str << str[0]`の部分がスマートではないと思っています。どうしても最初の文字だけtimesメソッドに組み込むことができない…

##最後に
あ〜、こんな風に回答することができたらよかったんだなぁ…
本気で行きたい企業だっただけに、その場でできなくて、悔しいなぁ…
少し調べてやってみたけど、やっぱりこの過程が楽しいと思えました。
面接中は、信じられないくらい緊張して、コード打つときに頭真っ白になって、手が震えた（笑
VSCodeの開き方すらわからなくなってた…
さらには、簡単なメソッド(getsメソッド)すら、頭に浮かばなくて、より焦るという悪循環でした(笑

それにしても、自分のポートフォリオを見ていただけたことは素直に嬉しかった。質問に対して明確に答えられなかったところはたくさんあったし、課題はまだまだあるけど、現役エンジニアの方に見てもらったのは初めてだったので、ちょっと恥ずかしくもありました。

メソッドの裏側の処理なんて考えたことがなかったから、とても勉強になりました。
面接を通して、エンジニアを身近に感じることができた一日でした。

もし、ご縁があれば、よろしくお願いします。
…と、ここで言ったところで何も変わらないかっ（笑
Pythonの組み込みモジュールの効果的な使い方（1）【Effective Python】

# はじめに

Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

# 今回学習する教材

- [Effective Python](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Effective+python&qid=1609408832&sr=8-3)

    - 8章構成
    - 本章216ページ

- 第6章：組み込みモジュール

## functiools.wrapsをつかって関数デコレータを定義する

デコレータは、ラップする関数への呼び出しの前後で機能を追加することができます。
例えば、デバッグ時に、関数呼び出しの引数と戻り値を確認したいとします。
そのようなデコレータを定義します。
この際に、functools のwrapsヘルパー関数をwrapper関数に適用することで、
内部関数についてのすべての重要なメタデータが外部関数にコピーできます。

```python
from functools import wraps

def trace(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print('%s)%r, %r) -> %r' %
                (func.__name__, args, kwargs, result))
        return result
    return wrapper

@trace
def fibonacci(n):
    """Return the n-th Fibonacci number"""
    if n in(0, 1):
        return n
    return (fibonacci(n - 2) + fibonacci(n - 1))
```

```python
fibonacci(4)
```

実行結果

```result
fibonacci)(0,), {}) -> 0
fibonacci)(1,), {}) -> 1
fibonacci)(2,), {}) -> 1
fibonacci)(1,), {}) -> 1
fibonacci)(0,), {}) -> 0
fibonacci)(1,), {}) -> 1
fibonacci)(2,), {}) -> 1
fibonacci)(3,), {}) -> 2
fibonacci)(4,), {}) -> 3
```

```python
help(fibonacci)
```

実行結果

```result
Help on function fibonacci in module __main__:

fibonacci(n)
    Return the n-th Fibonacci number
```

## contextlibとwith文をtry/finallyの代わりに考える

with文はopenとclose、ロックとリリースなど、開始と終了が必ずセットで必要な処理を簡潔に書くことができます。
例えば、相互排他ロックをwith文と、try/finally文 で書いてみましょう。

```
from threading import Lock

### with文
lock = Lock()
with lock:
    print('Lock is held')

### with文と等価のtry/finally
lock.acquire()
try:
    print('Lock is held')
finally:
    lock.release()
```

このようにwithを使うことで、コードを簡潔に書けます。
with文では、contextilibを使うことで、オブジェクトや関数の利用が楽になります。
contextlibのcontextmanagerデコレータは、単純な関数をwith文で使えるようにできます。
例として、2つのレベルでロギングを行う関数を考えます。
プログラムのデフォルトのロギングレベルは、WARNINGなので、この関数を実行したとき、出力されるのは、logging.errorのメッセージのみです。

```python
def my_function():
    logging.debug('Some debug data')       # ロギングレベルWARNINGでは出力されない
    logging.error('Error log here')        # ロギングレベルWARINIGで出力
    logging.debug('More debug data')       # ロギングレベルがWARNINGでは出力されない

my_function()
# Error log here
```
この関数のロギングレベルをコンテキストマネージャを定義することで、一時的に上げることができます。

```python
@contextmanager
def debug_logging(level):
    logger = logging.getLogger()
    old_level = logger.getEffectiveLevel()
    logger.setLevel(level)
    try:
        yield                               # withブロックの内容が実行される
    finally:
        logger.setLevel(old_level)

with debug_logging(logging.DEBUG):          # ロギングレベルDEBUG
    print('Inside:') 
    my_function()                           # logging.debug, loggin.error ともに出力される
print('After:')
my_function()
``` 

実行結果

```result
Inside:
DEBUG:root:Some debug data
ERROR:root:Error log here
DEBUG:root:More debug data
After:
ERROR:root:Error log here
```
SQLSTATE[42S02]: Base table or view not found: 1146 Table '×××' doesn't exist (SQL: select * from `×××`)の解決方法

Laravel初心者です。
オリジナルアプリを作成しています。

今回はその過程で出たエラーと解決方法を残しておきます。
理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |


## エラー発生

![スクリーンショット 2021-02-01 20.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/f3685f7e-2731-dc78-c101-a2616539075e.png)

```
SQLSTATE[42S02]: Base table or view not found: 1146 Table '×××' doesn't exist (SQL: select * from `×××`)
```

と出ました。

内容は
`×××って名前のテーブルもしくはビューは見つからないよ`
という意味みたいです。

画面下の方に
`マイグレーションしたら？`って出てるので

```
php artisan migrate
```

してみましたが

```
Nothing to migrate.
```

となりました。
確認で

```
php artisan migrate:status
```

でマイグレーションの確認をしたら全て`Yes`になっている。
困りました。

## 解決

簡単でした！
[こちら](https://malg7.com/base-table-or-view-not-found/)の記事を参考にさせて頂きました。
ありがとうございます！

記事の通りに`app/Models`配下の該当の`モデル名.php`を確認します。

```PHP:app/Models/×××.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ××× extends Model
{
    use HasFactory;

    protected $table = "ここ";
}
```

上記の`ここ`というところに書くテーブル名が単数形になってました。
`photos`にしないといけないところを`photo`にしてたのでエラーになっていました。

修正し無事に解決です！
【Rails6】jQuery / Bootstrap /  Font Awesome の導入

# はじめに

今回は下記の導入について、主にフロント周りの投稿となります。

### 1. jQuery
「フォローボタン」や「いいねボタン」など、ページ遷移を伴わない（非同期通信）機能の実装に必要です。
Bootstrapの一部機能でも必要になります。


### 2. Bootstrap
フロントエンドのフレームワークで、ナビゲーションバーやボタンなど、ページのデザインをかんたんに変更出来るようになります。
ドロップダウン機能など、jQuery以外にも popper.jsが必要になるため、この記事ではそちらも導入します。

詳しくはこちら
https://getbootstrap.jp/docs/4.3/getting-started/introduction/

※「JavaScript を必要とするコンポーネントを表示」を参照。popper.jsを必要とする機能を利用しないのであれば popper.jsは不要と思います。


### 3. Font Awesome
いい感じのアイコンが無料で利用出来ます。検索ボタンに虫眼鏡のアイコンを表示するといったことがかんたんに出来るようになります。


### 開発環境

- MacOS Catalina 10.15.7
- ruby 2.7.1
- rails 6.0.3.4


# jQueryのインストール

ターミナルで実行します。

```termnal
yarn add jquery
```

設定を追記します。constと module.exportの行は初期からあると思いますので、その間に追記します。

```js:config/webpack/environment.js

const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)

module.exports = environment
```

# Bootstrapのインストール

ターミナルで実行します。

```termnal
yarn add bootstrap popper.js
```

設定を追記します。

```js:app/javascript/packs/application.js
require("bootstrap");
```

ファイルを作成します。

```scss:app/javascript/stylesheets/application.scss
@import '~bootstrap/scss/bootstrap';
```

### 使い方

たとえばボタンリンクのデザインを変える場合はこんな感じです。

```erb
<%= link_to "ボタンに表示する文字列", リンク先, class: "btn btn-primary" %>
```

# Font Awesomeのインストール

ターミナルで実行します。

```termnal
yarn add @fortawesome/fontawesome-free
```

設定を追記します。

```js:app/javascript/packs/application.js
require("@fortawesome/fontawesome-free");
import '@fortawesome/fontawesome-free/js/all';
```

ファイルを作成します。

```scss:app/javascript/stylesheets/application.scss
@import '@fortawesome/fontawesome-free/scss/fontawesome';
```

### 使い方

Font Awesomeのページにアクセスし、左上の検索フォームで検索します。

https://fontawesome.com/
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651975/37444052-4038-986b-3cea-9e9b5113fafd.png">

「search」というワードで検索すると、検索結果に虫眼鏡アイコンを見つけることが出来ると思います。
検索結果をクリックするとアイコンのページに移動しますので、``<i class="～～～></i>``という部分をクリックするとコピーできます。

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651975/0e4361be-cffa-7cb8-c32c-05494286c8e9.png">

あとは viewテンプレートの使用したい部分に貼り付けるだけです！
たとえば検索ボタン（リンク）を設置する場合はこんな感じです。

```erb
<%= link_to 'リンク先' do %>
  <i class="fas fa-search"></i> 検索
<% end %>
```
DJ選曲術！！有名DJの1500個のセトリから分析

## 研究目的
1500個のミックス音源(Dance Music)を解析することで
1. 曲のトランジションの長さの分析
1. ミックスする前後2曲のBPMの差異の分析 
1. キーの転置の分析
1. DJ間で同じ曲の混ぜ方の違いについての分析
をする．

## データセットについて

Summary |statistic All Matched
---|:---:
The number of mixes |1,564 1,557
The number of unique tracks |15,068 13,728
The number of played tracks |26,776 24,202
The number of transitions |24,344 20,765
Total length of mixes (in hours) |1,577 1,570
Total length of unique tracks (in hours) |1,038 913
Average length of mixes (in minutes) |60.5 60.5
Average length of unique tracks (in minutes) |4.1 4.0
Average number of played tracks in a mix |17.1 15.5
Average number of transitions in a mix | 14.5 12.9

曲の情報（BPMやKey, Cueポイント)はDTW[1]で生成する．
>[1] R. Sonnleitner, A. Arzt, and G. Widmer, “Landmarkbased audio fingerprinting for DJ mix monitoring.” in Proc. International Society for Music Information Retrieval Conference (ISMIR), 2016, pp. 185–191.

## 分析結果
用語定義

* Cue Out = 次の曲を流した瞬間

* Cue In = 前の曲を完全に途切れた瞬間

* Cue Middle = 曲同士を混ぜている中で，メイン出力を次の曲に切り替えた瞬間．たとえば，前の曲のlowを切って，次の曲のlowをあげたタイミングなど．

### 曲のトランジションの長さの分析
Figure 6に曲のトランジションの長さのヒストグラムを示す．
トランジション領域のCue InとCue Outを抽出することで，トランジションの長さを計算している．
Figure 6から曲のトランジションは32beatもしくは64beatで行うのが定番であることがわかる．また，8beatや16beatでトランジションするよりも0beatで切り替えられていることの方が多い．意外にも16beatでトランジションすることは少ない傾向にある．
64beat以降はbeat数に比例して，トランジション方法としてはレアになる．

### ミックスする前後2曲のBPMの差異の分析
曲のミックス音源のBPMとオリジナル音源のBPMの違いを比較する．
Figure 4はミックス音源のBPMとオリジナル音源のBPMの差異をパーセンテージで表したヒストグラムである．
例えば，5％の差があれば，オリジナル曲のBPMがミックスで再生されている間に5％上昇していることを示している．
Figure 4は平均0の正規分布の形をしていて，BPM差が5%以下なのが全体の86.1%，
BPM差が10%以下なのが全体の94.5%を占める．
つまり20曲のセットリストを組んだとすると，18曲はBPM差が5%以下である曲で構成することが望ましい．

### キーの転置の分析
Figure 5は曲のミックス音源とオリジナル音源のkeyの違いを表したヒストグラムである．
Figure 5の横軸は転調度を意味し，0はオリジナル音源との同じkey，1はオリジナル音源のkey+1（例えば，オリジナル音源のkeyが”A”なら”B♭”）を意味する．
Figure 5から，転調されているのは2.5%で，転調されているトラックのうち，94.3%は＋1しか転置されていないことがわかる．
この結果から，一般的にDJはキーの転調を行わず，マスターテンポ機能をオンにすることが望ましい．
また，長くトランジションする場合は，keyが同じ曲同士で行うことが望ましいとされていると考える．

### DJ間で同じ曲の混ぜ方の違いについての分析
トランジションを曲のどの部分で行うかは，DJが選択できる．
しかしながら，曲ごとに”綺麗に”トランジションできる部分は限られていることが考えられるため，DJ間でのトランジション部分に差異はないことが予想される．
そこで，Figure 5にDJ間でのCue In とCue Outの乖離を示す．
その結果，全体の23.6%のペアが偏差ゼロであり，そのうち40.4%が1小節（4拍）以内，73.6%が8小節以内，86.2%が16小節以内であるとわかる．
従って，予想通り，曲ごとにトランジションする部分は決まっていると考えられる．

![スクリーンショット 2021-02-01 15.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267067/cb574098-3d1c-1748-d1bf-c17d2c059c9c.png)
OpenLayers で地図をグレースケールにしたり乗算合成したり

[OpenLayers] で地図をグレースケールにしたり、乗算合成する方法です。
この記事は [OpenLayers v3 時代に一度書いていましたが](https://qiita.com/cieloazul310/items/473300534e4e506ec0b9)、[2019年11月にリリースされた v6][v6] では CSS で実装可能になっていたので、メモとして残しておきます。

デモページ (Observable)
<https://observablehq.com/@cieloazul310/openlayers-v6-blend-mode-and-filters>

## v6 の実装方法

v6 での実装は CSS で記述することができます。v5 以前のイベントによる実装に比べるととても簡単になりました。以下がサンプルコードです。

### JavaScript

```js
import TileLayer from 'ol/layer/Tile';
import XYZSource from 'ol/source/XYZ';

// 地理院標準タイル
const layer = new TileLayer({
  className: 'hoge', // className を設定
  source: new XYZSource({
    url: 'https://cyberjapandata.gsi.go.jp/xyz/cjstd/{z}/{x}/{y}.png',
    attribution: '国土地理院',
  }),
});
```

### CSS

```css
.hoge {
  mix-blend-mode: multiply;
  filter: grayScale(1);
}
```

以上！

レイヤに className を設定し、CSS で [mix-blend-mode] や [filter] を設定することで、地図の乗算合成やグレースケール化などが簡潔に実装できます。

## v5 以前の書き方

v5 以前はレイヤにイベントを実装し、レイヤの描写時に canvas の `globalCompositeOperation` 属性をいじることでレイヤの乗算合成やグレースケール化が可能でした。
この方法はイベント名を `precompose` → `prerender`、`postcompose` → `postrender` に変更することで v6 でも利用することができます。

```js
// v5 以前は layer.on('precompose', (event) => {});
layer.on('prerender', (event) => {
  // 乗算合成
  event.context.globalCompositeOperation = 'multiply';
});

// v5 以前は layer.on('postcompose', (event) => {});
layer.on('postrender', (event) => {
  // 元に戻す
  event.context.globalCompositeOperation = 'source-over';
});
```
<!-- References -->
[v6]: https://github.com/openlayers/openlayers/releases/tag/v6.0.0
[mix-blend-mode]: https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode
[filter]: https://developer.mozilla.org/ja/docs/Web/CSS/filter

[OpenLayers]: http://openlayers.org/ "OpenLayers"