OmniAICreator/Qiita-1.07M huggingface dataset:
Desktop : OpenCV Denoise3

<H5>Goal</H5>
Test OpenCV denoise.

```OpenCV_Denoise3.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.photo.Photo;

import java.util.ArrayList;
import java.util.List;

public class OpenCV_Denoise3 {

    public static void main(String args[]){
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat im = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg",Imgcodecs.CV_LOAD_IMAGE_COLOR);
        Mat im1 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena1.jpg",Imgcodecs.CV_LOAD_IMAGE_COLOR);
        Mat im2 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena2.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
        List<Mat> srcList=new ArrayList<Mat>();
        Mat dst=new Mat();
        srcList.add(im1);
        srcList.add(im2);
        srcList.add(im);
        Photo.fastNlMeansDenoisingMulti(srcList, dst, 2, 1);
        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\fastNlMeansDenoisingMulti_lena.jpg", dst);
    }

}
```

<h5>Result</h5>
![fastNlMeansDenoisingMulti_lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/17b478cc-4eff-4481-44a2-d98021ba106c.jpeg)
Desktop : OpenCV Denoise2

<h5>Goal</h5>
Test OpenCV denoise.

```OpenCV_Denoise2.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.photo.Photo;

public class OpenCV_Denoise2 {

    public static void main(String args[]){
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat im = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");
        Mat dst=new Mat();
        Photo.fastNlMeansDenoisingColored(im, dst);
        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\fastNlMeansDenoisingColored_lena.jpg", dst);
    }
}
```

<h5>Result</h5>
![fastNlMeansDenoisingColored_lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/0f96d5ee-16ba-2d4d-fab9-b8fda9778d45.jpeg)
Desktop : OpenCV Denoise

<h5>Goal</h5>
Test OpenCV denoise.

```OpenCV_Denoise.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.photo.Photo;

public class OpenCV_Denoise {

    public static void main(String args[]) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat im = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg");
        Mat img = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena-gray.jpg", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
        Photo.fastNlMeansDenoising(im, im);
        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\fastNlMeansDenoising_lena.jpg", im);
        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\fastNlMeansDenoising_lena-gray.jpg", img);
    }

}
```
<h5>Result</h5>
![fastNlMeansDenoising_lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/2df760dc-2417-bbbe-b758-032998299fbc.jpeg)
![fastNlMeansDenoising_lena-gray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/ad502b5e-f555-aa0b-c7c3-eebf985eab6a.jpeg)
DockerHub・Dockerイメージについて初心者が学んだこと

## DockerHub
### 概要
* Dockerイメージのレジストリサービス
* Dockerイメージの公開・検索・ダウンロードができる 

### 機能
*   [イメージ・リポジトリ](http://docs.docker.jp/docker-hub/repos.html) ：イメージを検索・管理・取得・送信します。イメージはコミュニティ、公式、あるいはプライベートの各イメージ・ライブラリにあります。
*  [自動構築（Automated Builds）](http://docs.docker.jp/docker-hub/builds.html) ：GitHub か Bitbucket リポジトリ上のソースコードに変更を加えると、新しいイメージを自動的に構築します。
*  [ウェブ・フック（Webhooks）](http://docs.docker.jp/docker-hub/webhooks.html) ：自動構築機能でリポジトリに送信された後、Webhook が何らかのアクションを起こします。
*  [組織](http://docs.docker.jp/docker-hub/orgs.html) ：イメージ・リポジトリにアクセスできるユーザを管理するための、ワーク・グループを作成します。
* GitHub と Bitbucket 統合。Docker Hub と Docker イメージを、現在のワークフローに追加します。

[Docker Hub](https://hub.docker.com/)
[Docker Hub 概要 — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/docker-hub/overview.html)

## Dockerイメージ
### 概要
* コンテナ実行に必要なファイルをまとめたシステム
* AUFSなどの特殊なファイルシステムが使用されている
* イメージ上のデータはレイヤで構成され読み取り専用

> Dockerイメージはファイルシステムとアプリケーションやミドルウェア、実行時に必要とするパラメータから構成されます。
> 
> ファイルシステムとはシステムを動作させるのに最低限必要なファイル群であり、ルート以下のディレクトリのことです。
> 
> パラメータとはDockerイメージから作成したコンテナ実行時に行いたいコマンド等が該当します。
> 
> Dockerが一般的な仮想マシンに比べて軽量であるというのはこの構成が理由です。
> 
> また、読み込み専用であるため改ざんの恐れがなく、チーム開発等で環境を統一したい時にも容易にイメージを共有することが出来ます。

[Dockerイメージとは?【Docker解説】 | tataneのうたたね](https://student-engineer.net/docker-image/)

# 各コマンドの説明
* `$ docker images` 
イメージの一覧を表示する
* `$ docker inspect [対象のイメージ名 or イメージID]`
イメージの詳細情報を表示する
* `$ docker rmi [対象のイメージ名 or イメージID]`
ローカルのイメージを削除する	
* `$ docker pull [対象のイメージ名 or イメージID]`
イメージを取得する
`docker push <Docker ID>/<イメージ名>:<タグ名>`
DockerHubへpushする
ShiftJIS を使ってファイルに書き込む・ファイルを読み込む (Kotlin/JVM)

Kotlin (Java) を使ってファイルに出力する時に、 SJIS を使ってファイル出力やファイル読み込みをする場合の方法です。

## ファイルに書き込む場合

### FileWriter を使う

```kotlin
import java.io.FileWriter
import java.nio.charset.Charset

FileWriter(fileName, Charset.forName("SJIS")).use {
    it.write("...")
}
```

### OutputStreamWriter を使う

```kotlin
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.Charset

OutputStreamWriter(
    FileOutputStream(fileName, true), Charset.forName("SJIS").displayName()
).use {
    it.write("...")
}
```

### 専用クラスを作る

もし、SJISで出力する場面が多いのなら、次のようなクラスを作ってしまうと便利です。

```kotlin
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.Charset

class SjisFileWriter(fileName: String, append: Boolean) : OutputStreamWriter(
    FileOutputStream(fileName, true), Charset.forName("SJIS").displayName()
)
```

## ファイルを読み込む場合

### FileReader を使う

### InputStreamWriter を使う

### 専用クラスを作る

```kotlin
import java.io.FileInputStream
import java.io.InputStreamReader
import java.nio.charset.Charset

class SjisFileReader(fileName: String) :
    InputStreamReader(FileInputStream(fileName), Charset.forName("SJIS")) {
}
```
【視聴メモ】Taking Chrome Full Screen with Trusted Web Activities (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=6lHBw3F4cWs

Speaker(s): Peter McLachlan, Andre Bandarra

## Abstract

> A Trusted Web Activity (TWA) displays a full screen Chrome browser inside of an Android app with no browser UI. Although Android apps routinely include web content using a Chrome Custom Tab (CCT) or WebView, a TWA offers unique advantages when you need Chrome’s performance and features in your app in full screen mode. This talk will cover how to get started using a Trusted Web Activity, case studies and quality criteria for inclusion in the Play store. 

訳

> TWA(Trusted Web Activity)はAndroidアプリの中でブラウザのUIなしにフルスクリーンのChromeを立ち上げます。AndroidアプリはCCT(Chrome Custom Tab)やWebViewを用いてWebコンテンツを表示できますが、TWAはアプリでChromeの性能と機能から受ける恩恵を得ることができます。このセッションではどうやってTWAを始めるか、またそのケーススタディとPlayストアにおける品質基準についてお話します。

## Contents

* WebViewはずいぶん昔から存在しているけど、これで込み入ったことをしようと思うとWebブラウザを作るぐらいのことをしないといけない
    * WebViewはブラウザと言うよりただのレンダリングエンジン
* TWAはフルスクリーンでWebコンテンツを表示するための最適な方法
    * ブラウザとして機能完全で、常に最新のChromeで、使いやすい
* TWAはなんのために使える？
    * ネイティブに実装されてない機能を使いたいとき
    * 高速にイテレーションを回したい、テストをしたいとき
    * FAQなどのドキュメント類
* フルスクリーンなのでネイティブの要素（タブバーとか）と混在はできない
* 実際的にただのChromeなのでセッションデータ等はChromeと共有される
* WebView、CCT、TWAの違い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/5772fc67-052e-d00c-85ff-415f1586f7ee.png)

* TWAの始め方
    1. サポートライブラリをインポートする
    2. Digital Asset Linkを設定する
        * サイトのドメインとAndroidのパッケージ名を指定すればいいだけ
    3. TWAを立ち上げる（下図）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/65a3343c-0e56-2f15-9780-f3e51c175f5a.png)

* AndroidのIntentシステムはWebのルーティングパターンに似ている
    * Activityがルートで
    * Androidシステムがルーター
    * Intentがリクエスト
* TWAの立ち上げを行うとTWA用のIntentを補助ライブラリが作成して、そこに遷移するという形になる
* TWAからAndroidのActivityを開きたいときは、カスタムスキーマを書く
    * AndroidManifest.xmlに`intent-filter`というのを書けばいい
    * ホストとスキーマを指定できるので、それをURLとして使えばOK
* Androidの95%を占めるKitKat以降のバージョンでTWAが動作する
* Chromeがインストールされていなければどうなる？
    * 普通にデフォルトのブラウザが（別のアプリとして）開く
    * fallbackは自分で書くこともできる（WebViewで開くようにするとか）
* Launcherから直接TWAを開きたいときはどうする？
    * AndroidManifest.xmlでLauncherActivityという設定をする
* github.com/GoogleChromeLabs/svgomg-twa でデモを試せる
* フルスクリーンなのでTWAだけでアプリになる
    * ちゃんと動くPWAを作る
    * LighthouseでPWAバッジがついててスコアが80以上であればPlayストアに載せられる
* bücher.de というサイトではPWAをTWAとして公開している
* Myntra ではTWAを簡易版という位置づけで公開している
* 他にもOYOやTencent NewsなどがTWAを利用している

**TWAのロードマップ**

* Splashスクリーンが使いやすくなる
* Push通知に対応する
* Firefoxなどのサードパーティ製ブラウザでもTWAが使えるようになる

## Memo

* ユースケースが微妙かと思ったけど、FAQやログイン画面等、どんなサービスでも使えそうなケースがあった
Julia版　Google Colab

# Julia Boxとは
Google Colab便利ですね

JuliaにもGoogle Colabと同じように
Juliaの開発環境がすでに整えられた
[Julia Box](https://www.juliabox.com/)があります

![juliabox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/5ea83173-365b-64fe-dcfa-30670532f7db.png)




- スペック
 - CPUは３コア
 - RAMは12GB
 - Disk Spaceは２GB
 - Session Timeは90分  


Google Colabには大きく劣りますが、とりあえず実行するには十分でしょう
GPUにもいづれ対応するそうです

- 開発環境
Jupyter notebook

- Juliaのversion
  - 0.6.4 
  - 1.0.3 
  
の２つです

この２つのversionがあると最新のコードとver1.0にmajor updateする前のコードが実行でき、最近のJuliaコードはたいてい動かせるかなと思います。



# Julia versionの違いに注意
Juliaはver0.6以降では主要なものとしてver0.7、ver1.0、ver1.1があります。
特にver0.6とそれ以降は大きく異なるので注意が必要です！

ver0.7はver0.6とver1.0での橋渡し的な役割を果たしています。
ver0.6で書いたコードをver0.7で実行すると`warning`を出して変更を促します。
変更せずにver1.0で実行するとエラーが出てしまいます。

ver0.6のコードをver1.0に変更したいときはver0.7で確認しましょう



例えば
スカラーとベクトルの足し算をするときを考えます

```
a = 1
b = [1 2]
```
として `a`と`b`の足し算を実行してみます

- ver0.6  
![julia0.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/3d0ffaa7-c0b0-79d9-2f46-fa6b23e7e27d.png)

- ver1.0  
![julia1.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/bdd47623-4041-03c3-bb5f-27712f22c00d.png)

でエラーが出てしまいます。


- ver0.7では
- ![julia0.7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/465ad7c4-43ec-d5c4-1e0a-3fbedcaacec2.png)

エラーは出ませんが`Warning`がでます。


この`Warning`に従って`a + b`をドット付きの`a .+ b`に変更してver1.0で実行すると
![julia1.0_ver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/1190118c-5714-3235-0b34-f3f72e888ba7.png)


エラーが消えました。


このエラーはbroadcastに関するもので、ver0.7以降ではbroadcastは明示して書くことを求められます。

これ以外にも`linspace`の代わりに`range`を使うようになったり、行列式のlog`log(det(M))`のような計算をするのにパッケージ`LinearAlgebra`の記載が求められるようになっています。

[こちら](https://qiita.com/Hidekazu-Karino/items/eeda08fbd6f16c735843)に詳しくver0.6とver1.0の違いが記載されています
TF-IDFを使ってニュース記事の重要語を抽出すれば、それだけでニュースの内容わかるんじゃね？と思ったら全然ダメだった話

# はじめに
こんにちは。
最近、ネットニュースを見るのが面倒くさくなってきたTakuyaHanadaです。

突然ですが、単語数個見るだけでニュースの内容がわかるって便利だと思いませんか？
私は便利だと思います。

そこで、最近学んだTF-IDFを使ってニュースの重要語を抽出し、順位の高い重要語を並べてニュースの概要がわかるか試してみました！

以下はその結果をまとめたものです。

# 使用したニュース記事
今回使用したニュース記事は、Yahoo!ニュースの4つの記事です。

- [トランプ氏への厚遇ぶり報道＝「ほぼ観光客」「相撲の伝統揺さぶる」－米メディア（時事通信） - Yahoo!ニュース](https://headlines.yahoo.co.jp/hl?a=20190527-00000011-jij-n_ame)
- [トランプ氏握手の作家ら「ご招待」？　桜井よしこ氏ら　「打ち合わせなし」（毎日新聞） - Yahoo!ニュース](https://headlines.yahoo.co.jp/hl?a=20190527-00000048-mai-soci)
- [栗山監督「100球投げて」輝星デビューへ条件提示（日刊スポーツ） - Yahoo!ニュース](https://headlines.yahoo.co.jp/hl?a=20190527-05270788-nksports-base)
- [ドワンゴとグリー、VTuber事業で協業　「バーチャルキャスト」の番組を「REALITY」で配信可能に（ITmedia NEWS） - Yahoo!ニュース](https://headlines.yahoo.co.jp/hl?a=20190527-00000081-zdn_n-sci)

これらのニュース記事から、

- ニュースタイトル
- 画像下の文章
- 本文

の３つをニュースデータとして取り出しました。

![headlines.yahoo.co.jp_hl_a=20190527-00000011-jij-n_ame(iPad) 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/2c874010-c5f4-821c-178a-a48ff4a12e72.png)


# データの前処理
得られたニュースデータを**MeCab**を使って、一般名詞だけの文にしました。

```text:前処理の例
< 処理前 >
トランプ氏への厚遇ぶり報道＝「ほぼ観光客」「相撲の伝統揺さぶる」－米メディア

< 処理後 >
トランプ ぶり 客 相撲 伝統 米 メディア
```

# TI-IDFを計算
計算には**scikit-learn**を使いました。
結果は各文ごとに、各単語のTF-IDF値を足して、ニュース全体の結果としました。

# 結果
TF-IDF値を降順にソートし、上位5件を見てみました。TF-IDF値は小数第4位を四捨五入しています。

- トランプ氏への厚遇ぶり報道＝「ほぼ観光客」「相撲の伝統揺さぶる」－米メディア（時事通信） - Yahoo!ニュース

|順位|一般名詞|TF-IDF値|
|:--|------:|:------:|
|1|大統領|8.562|
|2|トランプ|6.773|
|3|写真|6.612|
|4|炉端|5.749|
|5|焼き|5.749|

- トランプ氏握手の作家ら「ご招待」？　桜井よしこ氏ら　「打ち合わせなし」（毎日新聞） - Yahoo!ニュース

|順位|一般名詞|TF-IDF値|
|:--|------:|:------:|
|1|トランプ|21.350|
|2|席|20.296|
|3|月|16.337|
|4|首相|15.243|
|5|こと|13.614|

- 栗山監督「100球投げて」輝星デビューへ条件提示（日刊スポーツ） - Yahoo!ニュース

|順位|一般名詞|TF-IDF値|
|:--|------:|:------:|
|1|軍|28.906|
|2|戦|16.015|
|3|星|11.031|
|4|こと|8.943|
|5|ドーム|8.943|

- ドワンゴとグリー、VTuber事業で協業　「バーチャルキャスト」の番組を「REALITY」で配信可能に（ITmedia NEWS） - Yahoo!ニュース

|順位|一般名詞|TF-IDF値|
|:--|------:|:------:|
|1|バーチャル|15.860|
|2|キャスト|12.976|
|3|事業|9.011|
|4|ユーザー|8.118|
|5|者|7.621|

# まとめ
全然ダメでした。栗原監督に関しては「ドーム」が入っていなかったら野球のニュースと想像できません。

結果を見る限り、一般名詞の文字数が1のものに関しては、なくてもよいのでは？というものが多いので、一般名詞の文字数を2以上に限定すれば、もう少しマシになるかもしれないです。

次回があれば、もう少し工夫して試してみます。

# 参考
- [Tfidfvectorizerの簡単な使い方(tf idf) - mura632’s blog](http://muramura63.hatenablog.jp/entry/2016/11/11/211756)
- [scikit-learnでtf-idf | mwSoft](http://www.mwsoft.jp/programming/numpy/tfidf.html)
Swift の Comparable プロトコルを基礎から


# この記事は何？
[前回](https://qiita.com/chino_tweet/items/793bccb0384c8460d267)は、`Equatable` プロトコルを扱いました。
今回は、続きとも言える `Comparable` プロトコルです。

## 実行環境
Xcode10.2.1
Swift5.x

# ハンズオン
Playground で動作確認しました。

## こんな型があったとして
フルーツを表現する `Fruit` 型です。
3つのプロパティ `name`, `emoji`, `sugarContent` があります。

````Swift:フルーツ型
struct Fruit {
    var name: String
    var emoji: String
    var sugarContent: Int    // フルーツの甘さ（糖度）
}

let apple  = Fruit(name: "Apple",  emoji: "🍎", sugarContent: 15)
let banana = Fruit(name: "Banana", emoji: "🍌", sugarContent: 10)
let cherry = Fruit(name: "Cherry", emoji: "🍒", sugarContent: 3)
````

なお、実際の各種フルーツとその糖度と比較して、上記コードの値がどうかは知りません。
配列 `fruits` に並べてみましょう。

````Swift:フルーツの配列
let fruits = [apple, banana, cherry]    // [🍎, 🍌, 🍒]
````

甘いフルーツ（つまり、糖度が高い）順に並べ替えらるようにします。

## 小さいかどうか、大きいかどうか
「どっちが大きいか」は、逆にいうと「小さいかどうか」ってこと。
`<` 演算子です。
「小さいかどうか」が調べらることを保証するのが `Comparable` プロトコルです。

`Comparable` プロトコルに準拠していないオブジェクトの大小関係を比較すると...

````Swift:Fruitオブジェクトの大小関係
apple < banana
````
<img width="858" alt="スクリーンショット 2019-05-28 1.42.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/36000d28-ef33-d13e-5431-6872ef4323c2.png">
エラーになります。
「何を基準に大きいか・小さいかを判断したらイイか」が定義されていないんですね。

### Comparable の要件
`Comparable` プロトコルに準拠するには、２つの要件を満たす必要があります。

1. `Equatable` であること
2. `<` メソッドを実装していること


#### 1.Equatableに準拠させる
１つ目の要件を満たすため、型を `Equatable` にします。
詳しくは[前回](https://qiita.com/chino_tweet/items/793bccb0384c8460d267)の投稿を。

````Swift:Equatableに準拠したFruit型
struct Fruit: Equatable {
    var name: String
    var emoji: String
    var sugarContent: Int
    
    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.emoji == rhs.emoji
    }
}
````

#### 2. < メソッドを実装する
プロトコルを列挙したら、`<` 静的メソッドを実装します。
このメソッド内で、「何を基準に大小関係を判断するか」を定義します。
`Fruit` 型では糖度を表現する `sugarContent` の値で大小比較することにします。

````Swift:<を実装したFruit型
struct Fruit: Equatable, Comparable {
    var name: String
    var emoji: String
    var sugarContent: Int
    
    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.emoji == rhs.emoji
    }
    
    // 小さいかどうかをBoolで返す
    static func < (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.sugarContent < rhs.sugarContent
    }
}
````

### 糖度を比較する
もう一度、`apple` が `banana` より小さいかどうかを比較します。

````Swift:リンゴとバナナの糖度
apple < banana    // true
````

`apple.sugarContent` は `5`で、`banana.sugarContent` は `10` なので `true` が得られるようになりました。
大きいかどうかの演算子 `>` はどうでしょうか？

````Swift:大きいかどうか
apple > banana    // false
````

`>` メソッドは実装していませんが、自動的に呼び出せるようになっています。

## 配列をソートする
それでは、糖度が高い順に `fruits` 配列をソートします。
`Array` 型に用意されている `sorted(by:)` メソッドを使いましょう。

````Swift:甘い順にソートして出力
print( fruits.sorted(by: >) )    // [🍒, 🍌, 🍎]

````

コンソールには `[🍒, 🍌, 🍎]` が出力されます。
（`CustomStringConvertible` プロトコル準拠が前提です。[こちら](https://qiita.com/chino_tweet/items/486744701cf64eb6fc83)で解説。）
糖度が高い順に並べ替えができました。
FFT、BeatDetectorを使ったVJ　(vvvv)①

#はじめに
vvvv公式のチュートリアルが終わり、
「さあやるぞ！どうすればいい！」
という人向けです。




---

#画面を音に反応させたい…

反応させたくない？
　　　→音をvvvvで取得する必要がある。

---
#画面を音に反応させたい①

音声をvvvvで取得するには
　　　→FFT (DShow9 4Channels)ノードを使う。


--- 
#画面を音に反応させたい②

ノード検索画面でFFT (DShow9 4Channels)を右クリックするとこんなものが出てきました。
このhelpパッチを読める方はこの記事は読まなくてもいいです。
↓helpパッチのスクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425546/b4060226-1e85-6d87-cd6d-a63abf921904.png)

---
#いや分からん
次ページから解説していきます。

---
#FFTノードって？
簡単に言うと
「音の大きさを数値化するノード」です。

---
#実際にやってみよう
さあやるぞ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425546/fdf8ba38-ae14-7fe3-f29f-8a422fc9b3f9.png)

---
#その前に
RendererをFullscreenにしてしまったら
焦らずに「Alt+Enter」を押してください。

---
#画面をブラックアウトさせてしまったら「Alt+Enter」

---
#ノードを置いていく①
パッチの空白地帯をダブルクリックすると検索画面が出てきます。↓
##今回の主役
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425546/446fcbaf-41ba-69e8-e1dd-c7022f0504ce.png)

---
#ノードを置いていく②
音楽を聞きながら
・Renderer(EX9)
・Linearspread
・Quad(DX9)
・Transform(2D)
を置きます。

---
#ノードを置いていく③
こんな感じの画面になれば成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425546/9aebe81d-2573-5fb4-3391-637f76c8cc59.png)
数字が入っているのはIOBoxです。
今回はquadのtranceformのscaleYにFFTを直接入れてみました。

---
#ノードを置いていった結果
音に合わせて四角が伸びるのすごくない？

---
#おさらい
##FFTをtransformに入れると音に合わせて画が動く！すごい！

---
#次回予告
「音の大きさを直接数値化する」FFTを
「入力が大きくなったことに反応する」
"BeatDetector"に入力してみたいと思います。
Twitter API でツイートと画像が取得できなかった

Twitter API を使ってツイート情報を取得しようとしていたところ 
うまく画像やツイート内容が取れずに苦戦したので共有します。既出かもしれません。

結論としては ```tweet_mode=extended``` をリクエストパラメータに含めることによって解決しました。 
APIの仕様変更ページにしっかり記載されていました。
https://developer.twitter.com/en/docs/tweets/tweet-updates

# 困ったこと
[リファレンス](https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline.html)に従ってタイムラインの取得をリクエストした場合、以下の制限が発生します。 

## ツイートが全文取得できない

140文字を超えるツイートは文が途切れて取得されてしまいます。
```tweet_mode=extended``` パラメータを追加後、レスポンス中の```full_text```から取得できました。


## 画像が取得できない
本来レスポンスのentitiesに含まれるはずの画像URL等が含まれない状態になります。
```tweet_mode=extended``` パラメータを追加後 レスポンス中の```extended_entities```から取得できます


# 参考
https://stackoverflow.com/questions/39709511/twitter-api-not-returning-images
ガンが発生するか予測してみた



##はじめに
　sklearn.datasetsに収録されている乳がんの検査のデータを使って、ガンが発生するかどうかを予測してみる。

##データの読み込み
　ライブラリと乳がんデータを読み込む。


```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
import seaborn as sns

from sklearn.datasets import load_breast_cancer
bc = load_breast_cancer()
df_data = pd.DataFrame(bc.data, columns=bc.feature_names)
df_target = pd.DataFrame(bc.target, columns=['class'])
df = pd.concat([df_data, df_target], axis=1)
```


##データ分析と特徴量エンジニアリング
とりあえず相関みる。

```python
df_corr = df.corr()
sns.heatmap(df_corr)
```

  ![heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401707/df92114e-25f2-acb2-dfe4-7e40598f6959.png)

色々分析はしたいが医学の知識が全くないため、相関の絶対値の高いものだけ特徴量として使うことにする。

```python
X = df.loc[:, df_corr["class"].abs().sort_values(ascending=False).index[1:10]].values
y = df.loc[:, ['class']].values
```
データを標準化する。

```python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X)
X_std = scaler.transform(X)
```

学習用と評価用にデータを分ける。

```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_std, y, test_size=0.3, random_state=0)
```

##学習と評価
グリッドサーチする。サポートベクターマシンを使うのはただの好みです。

```python
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],  'gamma' : [0.001, 0.01, 0.1, 1, 10, 100]}

grid_search_svm = GridSearchCV(SVC(), param_grid)

grid_search_svm.fit(X_train, y_train)
```
学習用のデータと評価用のデータでモデルの正答率を確認。

```python
print('train acc: %.3f' % grid_search_svm.score(X_train, y_train))
print('test acc: %.3f' % grid_search_svm.score(X_test, y_test))
print(grid_search_svm.best_params_)
```
その結果、
train acc: 0.970
test acc: 0.942
{'C': 100, 'gamma': 0.01}
とでた。悪くないスコアだと思うが少し過学習しているようなので、パラメータを軽く調整していく。


```python
svm = SVC(C=300,gamma=0.01)
svm.fit(X_train,y_train)
print('train acc: %.3f' % svm.score(X_train, y_train))
print('test acc: %.3f' % svm.score(X_test, y_test))
```
上のパラメータで、
train acc: 0.972
test acc: 0.965
だった。結構高いので満足。

##まとめ
データ分析の部分がてきとうだったが、精度はよかったので良しとしよう。
VisualStudioCodeでSvelte3をESLintする設定メモ


自分用のメモ

# 参考ページ
eslint-plugin-svelte3
https://github.com/sveltejs/eslint-plugin-svelte3

VSCodeの設定は↓に書いてあるので参考にする
https://www.npmjs.com/package/eslint-plugin-svelte3/v/1.0.0

# VisualStudioCodeの拡張機能をインストール
- [Svelte](https://marketplace.visualstudio.com/items?itemName=JamesBirtles.svelte-vscode)
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)


# ESLint系のパッケージをインストール

```
$ npm i -D eslint
$ npm i -D eslint-config-standard
$ npm i -D eslint-plugin-import
$ npm i -D eslint-plugin-node
$ npm i -D eslint-plugin-promise
$ npm i -D eslint-plugin-standard
$ npm i -D eslint-plugin-svelte3
```

# .eslintrc.jsの設定
[eslint-plugin-svelte3](https://github.com/sveltejs/eslint-plugin-svelte3) に書いてあるサンプルを基本コピペ

ただし [ここ](https://github.com/sveltejs/eslint-plugin-svelte3/blob/master/OTHER_PLUGINS.md) に書いてあるように
`eslint-plugin-import`の一部ルールがあると上手く動作しないようなので
`overrides`で`.svelte`の時に無効にした。

```
module.exports = {
    root: true,
    parserOptions: {
        ecmaVersion: 2019,
        sourceType: 'module',
    },
    env: {
        es6: true,
        browser: true,
    },
    extends: [
        'standard',
    ],
    plugins: [
        'svelte3',
    ],
    rules: {
        indent: ['error', 4],
        'comma-dangle': ['error', 'always-multiline'],
    },
    settings: {
    },
    overrides: [
        {
            files: ['**/*.svelte'],
            processor: 'svelte3/svelte3',
            rules: {
                'import/first': 0,
                'import/no-duplicates': 0,
                'import/no-mutable-exports': 0,
            },
        },
    ],
}
```

## 2019/06/04更新内容のメモ
`overrides`の`files`が`'*/*.svelte'`になっていたが
以下のように階層深くすると`Fuga.svelte`のlintが通らなかったので`**/*.svelte`に書き換えた。


```
./
├ hoge/
│  └ Fuga.svelte
└ Hoge.svelte

```


# CLIから叩いて動作確認する
`--ext`オプションで`svelte`を対象にしてあげる。
テスト用に適当に未使用の変数hogeを作ってテストしてみただけ。

```
$ npm run lint

> svelte-app@1.0.0 lint /path/to
> eslint --ext svelte,js src/


/path/to/src/App.svelte
  23:11  error  'hoge' is assigned a value but never used  no-unused-vars

/path/to/src/main.js
  6:7  error  'hoge' is assigned a value but never used  no-unused-vars
```

`package.json`にlint用のscript書いておくと楽

```
  "scripts": {
    ....
    "lint": "eslint --ext svelte,js src/"
  }
```


# VisualStudioCodeの設定
https://www.npmjs.com/package/eslint-plugin-svelte3/v/1.0.0
に書いてある通りに`settings.json`に以下の記述を追加する。

設定したらVSCodeをリロードして完了。

```
  "files.associations": {
    "*.svelte": "html"
  },
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    {
      "language": "html",
      "autoFix": true
    }
  ],
```

画面ではこんな感じになる
![スクリーンショット 2019-05-28 1.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206915/5e161d61-1631-883b-bcb3-c8465586ba37.png "スクリーンショット 2019-05-28 1.01.05.png")
AT x510でスタックしてみる【汎用DACでできていない人向け】

2021/05/26 記事全体を書き直しました。（内容にはほとんど変更はありません。）

# AT-X510-28GTX

2019年春、秋葉原某所にて、10GbEx4を搭載したAllied Telesisのスイッチが格安で販売されていると話題になりました。
本記事では、そんな格安な10GbEを搭載したスイッチであるAT-X510-28GTXを複数台使用し、スタックを構成した際にうまくいかない場合の対処法を紹介します。

# x510でスタック構成を実現する

スタックを構成するため、SFP+ポートに対して汎用DACを接続し、スタックの設定をして起動すると

```  
Only AT-StackXS and AT-StackOP supported in this port. Please remove.  
```

と出てしまう場合があります。
これは、接続されたDACの仕様がサポートされておらず、純正品を使用するように促すメッセージです。

しかしながら、x510では汎用DAC等でスタックを構成で来たという報告があったため、少し調査を行ったところ、ファームウェアをアップデートすることで**汎用DACでもスタックが構成できる**ようになりました。


筆者は、x510-5.4.9-0.1にアップデートすることで汎用DACでスタック構成を実現することが出来ました。

## ブートローダーをアップデートする

この作業は多分必要ないと思いますが、ファームウェアのバージョン上げるのでついでにやっておきます。
事前に、以下のコマンドを使用してブートローダーのバージョンを確認しておきます。

```
show system
```

2.0.24以前の場合は、以下のファームウェアダウンロード先にブートローダーのアップデート手順についての説明がありますので、そちらを参考にアップデートを行ってください。

## ファームウェアをアップデートする。

以下のコマンドを実行し、ファームウェアのバージョンを確認します。

```
show system
```

Current softwareの項目を確認することで、実行中のファームウェアのバージョンを確認することができます。

ファームウェアのバージョンが古い場合は、以下を参考にアップデートを行ってください。

* アップデート手順
    * https://www.allied-telesis.co.jp/support/list/switch/x510/rel/5.4.2a-0.1/001763a/docs/overview-11.html#sec15
* ファームウェアダウンロード
    * https://www.allied-telesis.co.jp/support/list/switch/x510/download.html

## アップデート後

再起動後は、以下を参考にスタック構成の設定を行います。

https://www.allied-telesis.co.jp/support/list/switch/x510/rel/5.4.3-0.1/001763b/docs/overview-143.html

## 検証したDAC

FS.com 汎用DAC(generic)
* https://www.fs.com/jp/products/74617.html

## 結局x510でスタックに使えるDACは？

[@nvsofts](https://twitter.com/nvsofts)さんがx510でスタック構成に使用可能なDACの条件について調べてくれていました。
掲載許可を頂きましたので、少し紹介します。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">つーことはx510のファーム5.4.9での条件は<br>1. ベンダ名が「AT」から始まる<br>2. トランシーバの種別が「1xCOPPER PAS」である<br>のどちらかの満たすこと になるのか？</p>&mdash; NV(*´ω｀*) (@nvsofts) <a href="https://twitter.com/nvsofts/status/1133162530803552256?ref_src=twsrc%5Etfw">May 28, 2019</a></blockquote>

どうやら、以下のコマンドで確認できる`Type`が`1xCOPPER PAS`となっていなければ、ファームウェアをアップデートしても汎用DACではスタックが出来ないという事のようです。

```
show system pluggable
```

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">つーことは、たいていのDACは最新ファームにすればスタック組めるということになるな・・・ダメなDACはEEPROMの設定が腐ってるということになる</p>&mdash; NV(*´ω｀*) (@nvsofts) <a href="https://twitter.com/nvsofts/status/1133163700599136256?ref_src=twsrc%5Etfw">May 28, 2019</a></blockquote>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ちなみに10GtekのアレはUnknown扱いになってました</p>&mdash; NV(*´ω｀*) (@nvsofts) <a href="https://twitter.com/nvsofts/status/1133161564805091328?ref_src=twsrc%5Etfw">May 28, 2019</a></blockquote>

といった情報もいただいています。
10GtekのDACだと`Type`が`1xCOPPER PAS`にならず`Unknown`になるようでここを書き換える方法がない限り、ファームウェアをアップデートしてもスタックを構成することは出来ないようです。
ROSのcatkin buildが通らない時の対処法

簡単な自分の覚書も兼ねて書いていきます。

# 環境
- OS: Ubuntu16.04
- ROS: kinetic

# 問題
Git HubからcloneしてきたROSパッケージを

> $ catkin build  

をしたときに、BuildしたいパッケージがFailedやAbandoned担ってしまう。

エラーの内容は、
Could not find a package configuration file provided by "-----" with  any of the following names: ---

といったようなもの。

Git Hubのドキュメントを読んでいったら、

> rosdep update
rosdep install --from-paths src -i

をしてと書いてあったので実行。
しかし、次のようなエラーが出てきて通らない…
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies (ROS distro is not set. Make sure `ROS_DISTRO` environment variable is set, or use `--rosdistro` option to specify the distro, e.g. `--rosdistro indigo`):

# 解決策

> sudo rosdep install -r --from-paths src -i

として強制的に実行したところ通すことができた。

その後catkin buildも通すことができて一見落着でした。
rubyのblockの使い方


## blockとは
do ~ endで囲われた引数でyieldで呼び出すことができる
## 例

```ruby
#def give_block( &block )
def give_block
  p 'block comes here'
  yield
end

give_block do
  p 'It called'
end
```

block.rb を実行すると以下のようにブロック内の` 'block comes here'とblockで渡された'It called'が表示される

```terminal
"block comes here"
"It called"
```
Shopifyを導入する時に気をつけること


*BASE*
*STORE*
*EC-CUBE*
*Shopify*

色々なECサービスがある中で日本語のドキュメントが少ないが
でも簡単でカスタマイズできそうだなと思う**Shopify**について気をつけることをまとめてみた

#１、ベーシックプラン以上じゃないとほぼ意味ない#
Shopifyにはライトプラン（９＄/月)、ベーシックプラン（29$/月)、スタンダードプラン（79$/月）、プレミアムプラン(299$/月)

サイトとかにはライトプランが載ってないけど、登録して見たら表示されてて「これでイイやー」と思って洗濯したら、テーマがカスタマイズできないので
**最低でもベーシクプラン以上**

#２、Twitterで連絡するよりもメールした方が断然対応が早かった#
両方で同じ内容の問い合わせをして見たら、メールの方が２日ほど早く返信きた

#３、独自ドメインの反映にはタイムラグがあるから注意#
お名前ドットコムでドメイン取得後、Shopifyに連携しました
**ShopifyのIPをお名前のドットコムのDNSに連携（レコードを追加して、指示されたIPアドレスを指定）**
**CNAMEレコードの追加して「www.ドメイン名」を追加**

*お名前ドットコムさんより*
*A(Address)レコード,ホスト名（※1）とIPアドレス（※2）の関連づけを定義するレコードです。*
*CNAMEレコード,正規ホスト名に対する別名を定義するレコードです。特定のホスト名を別のドメイン名に転送する時などに利用します。*

#４、powerd by Shopifyを消す#
[https://yuji0602.hatenablog.jp/entry/2018/05/01/161006]

この方のブログで一発でいけました。


他の操作方法はドキュメントがあるので、その操作方法に従えばイイかなと。
Shopifyは使いやすいし、アプリやテーマの編集など多岐にわたるカスタマイズができそうなので
今後が楽しみです。
【Python】初心者がリスト内包表記をしてみた

初めての記事になります。
1年前まで引数のことを「いんすう」と呼んでたレベルの人間です。
言葉や考え方の誤りがあると思いますので、その際には優しいご指摘をお願いします。

#リスト内包表記にチャレンジ
linesに含まれる「url~」を消したい！

```python
>>>lines = ["bbb","url:sss","url:999","aaa"]
>>>l_url = [line for line in lines if 'url' in line]
>>> l_url
['url:sss', 'url:999']
>>> for url in l_url:
>>>      lines = [l for l in lines if not l == url]    #linesの中にl_urlと同じものがあるか判定
NameError: name 'url' is not defined
# ["bbb","aaa"]になってほしかった
```
これl_url使わなくても正規表現とかでなんとかなるやつじゃね？
なぜ動かしてるときに気づかないんだ……。

#謎
上のリスト内包表記がすごく気持ち悪いのは重々承知なんですが、黒い画面上では動いたんですよね。
実験的に動いたからクラスやらメソッドの中にぶちこもう！　ってポチポチしたところ定義されてませんよって怒られました。
アクセス的な問題なのかなあとばんやり考えつつ、書き方悪いんだろなあに収束。

#気持ち悪く書きたくないよ～
だが二重ループである。

```python
for url in l_url:
     for l in lines:
       if not l == url:
          lines.append(l)
```
上書きしてる時点で気持ち悪いよ！
とりあえずfor文！　の癖が付きつつあるので、なんとか脱却しようと[こちら](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)などを参考にしながらリスト内包表記に手を出し始めました。
でも長くなってよくわからなくなったので、for文の中にリスト内包表記ぶちこみました。
一行で書けばなんとかなりそうかな？（フラグ）

#試行錯誤
```python
>>> lns=[l for url in l_url for l in lines if not l == url ]
>>> lns
['bbb', 'url:999', 'aaa', 'bbb', 'url:sss', 'aaa']
```
一行で書いてみよう作戦。失敗。

どんなかんじなんだろうとループだけしてみる。
想像力が　足りないよ！

```python
>>> lns=[]
>>> lns=[l for url in l_url for l in lines]#forだけ
>>> lns
['bbb', 'url:sss', 'url:999', 'aaa', 'bbb', 'url:sss', 'url:999', 'aaa']
```
判定出来たものだけ取り除かれてるみたいだからif notじゃなければ良いのかな？
（さっきの見ればわかる）

ひとまず目星は付けつつ、ループに頼るのをちょっとずつ卒業しようと思いました。

#追記
正規表現云々と考えたのですが、リストの要素自体をポイしないとだめだなあと。
（あたりまえなんですけど）

```python
# 文字列を置換してみよう作戦
>>> files_dir = ["あかさた","0525","はまやら","0528"]
>>> f_dir=[re.sub('^[^0-9]+$', '',f_dir) for f_dir  in files_dir]
>>> f_dir
['', '0525', '', '0528']
```
文字列含まれる判定ならinで出来たようなことを思い出す。

```python
#urlが含まれない文字列をlineにぶちこむ
>>> line=[]
>>> line=[l for l in lines if not "url" in l]
>>> line
['bbb', 'aaa']
```
できた！
どっちかと言うと発想の問題でした。

使いどころはないとは思いますが、二重ループ＋if文バージョンも参考までに動いてほしいなあ～と少しチャレンジして挫折しました。
あと、ループの中でリスト内包表記を動かせたコマンドくんは何故なんだい。
Microsoft Certified: Azure Solutions Architect Expert を取得しました

Azure Solutions Architect Expert を取得しました。
試験の概要や勉強したことなどをまとめておきます。

# 資格体系の変更
Microsoft Ignite 2018 でアナウンスがあり、Azure 関連の資格は「新しいロールベースの Microsoft 認定資格」に変更されました。
新しい資格体系については、以下のリンク先がわかりやすかったです。

[Azure関連のMCP試験と認定資格 ～2019年版～](https://blog.nextscape.net/archives/Date/2018/12/mcp2019)

# 認定パス
通常の認定パスでは、以下2つの試験に合格することが必要です。
[AZ-300: Microsoft Azure Architect Technologies](https://www.microsoft.com/en-us/learning/exam-az-300.aspx)
[AZ-301: Microsoft Azure Architect Design](https://www.microsoft.com/en-us/learning/exam-az-301.aspx)

旧資格体系で提供されていた [70-535: Architecting Microsoft Azure Solutions](https://www.microsoft.com/ja-jp/learning/exam-70-535.aspx) の合格者にはもう一つ認定パスがあり、以下の移行用試験に合格すれば認定を取得することができます。
移行期間は 2019年6月30日 までとなっています。
[AZ-302: Microsoft Azure Solutions Architect Certification Transition](https://www.microsoft.com/en-us/learning/exam-az-302.aspx)

# 受験概要
旧資格体系では [MCSE: Cloud Platform and Infrastructure](https://www.microsoft.com/en-us/learning/mcse-cloud-platform-infrastructure.aspx) を取得しており、その際に 70-535 の試験にも合格していたため、今回は AZ-302 を受験してきました。
私が受験した時点での提供言語は英語のみでした。

受験時間　　210分
試験問題数　明記されていないようです（私が受験したときは44問でした）
合格ライン　700点
受験言語　　英語

# 勉強方法
[AZ-302](https://www.microsoft.com/en-us/learning/exam-AZ-302.aspx) の試験案内で公開されている評価観点（Skills measured）を読み、関連するサービスの最近アップデートされた内容を中心に学習しました。
各サービスの公式ドキュメントで新機能や最新の制約事項を確認し、Azure で実際に各サービスを構成して動作を確認しました。
この試験に限ったことではありませんが、手を動かすのが理解を深める早道ではないかと思います。

手を動かす際には、公式ドキュメントのチュートリアルに加えて、[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/)（こちらも Ignite 2018 で発表）が役に立ちました。
無料でサンドボックス環境が利用できるうえ、オンプレミスとのハイブリッド構成、機械学習、データサイエンス、コンテナワークロードの展開など多岐に渡るジャンルでモジュールが提供されており、試験範囲の広い AZ-30x の学習にはうってつけです。

# 受験記録
私の場合は1回目の受験中にエラーが発生し、受験中止→後日再受験となるハプニングがありました。
エラーが出て試験を先に進められなくなってしまった場合は日を改めることになる可能性があるため、AZ-302 の受験を考えておられる方は廃止予定日の直前を避け、余裕を持った日程で受験されることをおすすめします。

一部の設問は問題文に誤記と思われる箇所があり、愚直に問題文を捉えると回答できないものがありました（全く意味がわからないというレベルではなく、出題意図が読めれば回答は可能でした）。
なお、試験終了後に、出題された問題ひとつひとつにコメントできる時間が設けられていました。
今後の受験者のためにも、試験問題で気付いた点があればコメントしておくと良いかと思います。
Localで公開サイトのデータを自宅に再現する

LocalbyFlyWheelという、WordPressをローカル環境に構築できるソフトがあります。

このLocalbyFlyWheelを使って、外部サイトに公開されているWordPressと同じ環境を構築する方法。

なお、今回の外部サイトには、BackWPupというプラグインを予め導入しておき、バックアップをつくっておくものとします。

# 手順
1. LocalbyFlyWheelで空っぽのWordPress環境を作成する(ユーザー名は適当で良いです)
2. 外部公開サイトより、バックアップファイル(zip)をダウンロードし、展開する。
3. Localで作成された環境フォルダ(`%USERPROFILE%\Local Sites\[[SiteName]]\app\public\`に、次のフォルダをコピーする)
    * `wp-content\themes`
    * `wp-content\plugins`
    * `wp-content\uploads\[[yyyy]]`
    * `wp-content\uploads\download-manager-files`
    * ※ ファイルを上書きするかどうか聞かれた場合、すべてスキップで良いはずです
4. LocalのDatabaseタブより、Adminerを表示する
5. インポートより、`[[サイト名]]_wpress.sql`を実行する
6. 左ペインの`wp_options`をクリック、データを表示し、`siteurl`と`home`を、`http://[[Site Domainに表示されているURL(xxx.local)]]`に書き換える

以上で環境が構築できます。ユーザー名は手順1でつくったものではなく、「外部サイトに設定しているもの」に置き換わっていますので、ご注意ください。
docker-compose.yml version 3 で volumes_from を指定する(Windows向け)

# はじめに

`docker-compose.yml` の version 3 でホストOSのディレクトリを共有する場合、下記の設定で行う解説を見かけますが `Windows` では動作しません。

```yaml
volumes:
  sites:
    driver: local
    driver_opts:
      type: none
      device: /path/to/host
      o: bind
```
`Docker` の公式リファレンスに理由が記述されていました。
[docker volume create | Docker Documentation](https://docs.docker.com/engine/reference/commandline/volume_create/#driver-specific-options)
> The built-in `local` driver on Windows does not support any options.

# 解決方法

ボリュームコンテナを使えばこれまで通りディレクトリ共有が可能です。
下の例では `base` でマッピングされた `/data` を `web` が参照しています。

```yaml
version: "3.4"
services:
  base:
    build:
      context: ./base
    image: takaya030/base:1.0
    volumes:
      - ./data:/data
  web:
    build:
      context: ./web
    image: takaya030/web:1.0
    volumes:
      - base:/data

volumes:
  base:
```

# 参考

[Docker Compose Mounting Volume Error: No Such File or Directory - Stack Overflow](https://stackoverflow.com/questions/50265014/docker-compose-mounting-volume-error-no-such-file-or-directory)
月末なのでMacのSleepのログから勤怠情報を導き出そうとする

お疲れ様です。月末ですね。皆さまにおかれましては、きっちり勤怠登録を毎日おこなっているか、そもそも勤怠登録なんてない強い会社にお勤めかと思われますが、念のため、日別でMacのSleep開始、終了を記録したログ（＝おおむね、PCを開いて、閉じた時間＝出退勤時間？）を出力するシェルスクリプト書いたので置いておきいます。毎日勤怠登録はするべきです。


> 参考：Macで蓋を空けたり閉じたりした時間をログから拾う方法
> https://qiita.com/AkihiroTakamura/items/5da0c1532fc509876560

## 環境

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.5
BuildVersion:	18F203
```

## コード

```shell:machine_activity_time
#!/bin/bash -e

IFS=$'\n'
logs=$(/usr/bin/pmset -g log | grep "Kernel Idle sleep preventers")
last_line_cnt=`echo "$logs" | /usr/bin/wc | /usr/bin/awk '{print $1}'`

cnt=0
prev_line=''
prev_log_date=''
for line in $logs;
do
    cnt=`expr $cnt + 1`
    log_date=`echo $line | cut -d ' ' -f 1`

    # 一行目
    if [ "$prev_line" = "" ];
    then
        echo $line | cut -d ' ' -f -3
        prev_log_date=$log_date
        prev_line=$line
        continue
    fi

    # 最終行
    if [ $cnt -eq $last_line_cnt ];
    then
        echo $line | cut -d ' ' -f -3
        continue
    fi

    if [ "$prev_log_date" != "$log_date" ];
    then
        echo $prev_line | cut -d ' ' -f -3
        echo $line | cut -d ' ' -f -3
    fi

    prev_log_date=$log_date
    prev_line=$line
done
```

## 実行結果

```shell
$ machine_activity_time
2019-05-21 01:37:16 +0900
2019-05-21 23:16:29 +0900
2019-05-22 00:56:57 +0900
2019-05-22 21:20:55 +0900
2019-05-23 00:05:38 +0900
2019-05-23 21:15:01 +0900
2019-05-24 09:59:55 +0900
2019-05-24 23:31:12 +0900
2019-05-25 00:35:10 +0900
2019-05-25 23:11:47 +0900
2019-05-26 01:13:30 +0900
2019-05-26 22:24:40 +0900
2019-05-27 00:22:30 +0900
2019-05-27 23:43:01 +0900
```

15日くらいしか残ってないし、あてになるような、ならないような感じなので、ちゃんと勤怠登録はしようと思いました。
DataFrame や Series内のデータ参照は「iat」で行おう

# はじめに
こんにちは。
現在東京大学で主にシステムデザインを学んでいる学生です。
授業で少し大きめのデータを扱った際に普段より長い処理時間に苦労したので、その時に試したちょっとした高速化の工夫をご紹介したいと思います。

# 用意したDataFrame
名前：Data
長さ：10**6
カラム：ITEM, NUM (適当に作った為、特に意味の無いデータです)

```python
>>> Data.head()
	ITEM  NUM
0	02134	1
1	04137	1
2	03900	1
3	00792	1
4	03678	1
>>> print(len(Data))
1000000
```

# メソッドごとの処理時間の比較
ただデータにアクセスするだけの処理を行い、掛かった時間を比較しています。
## 1. メソッドを用いない場合(カラム名、インデックスで直接指定)

```python
t = time.time()
for i in range(len(Data)):
    Data['NUM'][i]
print(time.time()-t)
# 54.22648358345032

```

## 2. `.iloc`を用いた場合

```python
t = time.time()
for i in range(len(Data)):
    Data.iloc[i,1]
print(time.time()-t)
# 16.67137122154236
```

## 3. `.iat`を用いた場合

```python
t = time.time()
for i in range(len(Data)):
    Data.iat[i,1]
print(time.time()-t)
# 10.457467794418335
```

# 結果
それぞれの処理時間をまとめると以下のようになりました。

|メソッド|データ数|処理時間(s)|
|:-:|:-:|:-:|
|**無**|10^6|54.23|
|**iloc**|10^6|16.67|
|**iat**|10^6|10.46|

# 感想
10^6 程の大きさのデータに対してもこれだけの差が出るとは思っていなかった為、少々驚きました。
大きめのデータを扱う際にはPythonのライブラリのメソッドを積極的に活用していきたいと思います。
progateでHTML&CSS初級編を復習した感想

#

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている秋吉です。
普段はマーケティングチームでライティングしつつ、プログラミングコースでカリキュラムを用いて学習しています。
今までQiitaの記事は何もわからないなりに読んだりしていたのですが、Markdown記法で書かれていたことも知りませんでした。（この記事もめちゃくちゃ書き方みながら書いてます）
今回はカリキュラムで学んだ[progate](https://prog-8.com/)で[HTML&CSS](https://prog-8.com/languages/html)初級編を復習した感想について書いていきます。
また、この記事はプログラミング初心者が書いているため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


#####実は復習
progate自体は、未来電子でプログラミングインターンをする前から利用していました。
初学者向けのサービスということもあり、楽しく学べる仕組みがあるところと、スライド学習で自分のペースで見返したりできるところが気に入っています。
始めたのが春休みだったので時間もあり、長くて五時間くらいパソコンの前にいることもありました。
私は一番最初にHTML＆CSSを学習していたので、現時点ではクリア済みになっています。
そういった理由から、今回の学習は復習ということになります。

#####忘れていること多すぎな件について
人間は忘れる生き物です。
エビングハウスの忘却曲線によると、学んだことは何もしなければ六割忘れていく仕組みのようです。
これを復習で定着させるのですが、私がHTML&CSSの初級編をクリアしたのは三月末くらいのこと。
情けないことに、二か月間復習なしでいたものですから、忘れているところも……。

* HTMLの全体構造
* paddingとmargin

主にこれらをだいぶ忘れていたので復習しました。いや全体構造大事だろ、という話ですが、本当にやらないと忘れます。
特に、HTMLの全体構造における```<head>```要素（webページの設定を書くので、サイト上では表示されない）と、HTMLの```<header>```要素（画面の上のほう、例えばQiitaのホームやコミュニティのメニューがあるところ）は字面が似ているだけに一瞬どっちがどっちかわからなくなることがありました。

paddingとmarginは、ざっくり「余白を作る」とだけ覚えているとアレ……？となりました。あたりまえ体操。
ざっくりいうと線とか図形の内側に余白を作るのがpadding、外側に余白を作るのがmarginなのですね。覚えた。

####まとめます

このブログを書いていて、そういや一番初めにやったときもpaddingとmarginで混乱していたな、と思い出しました。
元の理解がしっかりできていなければ忘れて当然ですよね。
今回の復習でしっかり潰せたはずなので、これからも頑張って復習と学習のサイクルを回していきます。
勉強をやってるだけなのではダメなので実践も。サイトの写経とかチャレンジしたいです。
HTMLの基礎

#ネットの基礎
- ドメイン名：IPネットワークでそれぞれのコンピュータを識別する名称
- IP：インターネットの通信の約束事
- IPアドレス：IPネットワークに接続された機器を識別するための番号
- DNS:ドメインとIPアドレスを紐付ける仕組み

インターネット上のコンピュータ同士が接続するとき→IPアドレス(192.168.1.1)
人間が使うとき→ドメイン
→www.google.co.jp

#フロントエンドの三大要素
##HTML
- 文書構造を記述
- Webページの内容を記述するためのマークアップ言語(タグで意味付けをすること)

##CSS
- 文字のサイズ、色、レイアウトなどを指定できる。
- HTMLで書かれた構造化された文章のスタイルを指定するための言語

##JavaScript
- Webサイトの振る舞いを記述（クライアント側での動き）
- Javaと全然違う

#フロントエンド？バックエンド？
##フロントエンドエンド
- ユーザーが見て、操作する部分
- ブラウザで動作するもの
-HTML, CSS, JavaScriptで記述

##バックエンド
- サーバー側で処理が行われるもの
- DBアクセス、ファイルへのアクセス、計算など
- Rubyなどで記述

フロントエンド→インターネット→バックエンドってイメージ

#静的なページ？動的なページ？
##静的なページ
- Webサーバー上に置かれたHTMLファイルをブラウザで表示するだけ。

##動的なページ
- アクセスするたびに、表示する内容が変わる可能性のあるページ
- ユーザーによて表示を書き換えたりする。
- Ex: ツイッター（アクセスするたびに表示が変わる）

#HTML
##基本構文
<タグ名>コンテンツ</タグ名>　←　要素

##MDN
ウェブ開発に関する技術が公開されてるらしい。
「MDN キーワード」でググればだいたいいいのが出るみたい。MDN html p みたいな。

##HTML文書の基本構造
- DOCTYPE宣言・・・使用するHTMLの種類を宣言(HTML5など)
- html要素
 - head要素　文書タイトル、**文書コード**、説明文など。文書の基本情報。ブラウドには表示されない。
 - body要素　ブラウザに表示される内容。ユーザーに見える。

##基本構造
```
<! DOGTYPE html>
<html lang="ja">
	<head>
		<title>はじめてのHTML</title> ブラウザのタブに表示される名前
	</head>
	<body>
		<h1>はじめてのhtml見出し</h1>
	</body>
</html>
```

##基本タグ
`<h1> ~ <h6>`

- `<title>` 検索タイトル、ブラウザタグ
- `<p>` 段落
- `<br>`改行
- `<strong>` 強調。boldかな？
- `<i>` イタリック　参照を表す
- `<em>` イタリック　強調
【Unity】オンラインFPS・TPSを作るのに参考になるチュートリアル2選

## 【Unity】オンラインFPS・TPSを作るのに参考になるチュートリアル2選
Unityを使えば個人でもオンラインFPS・TPSが作れるようになりました。
そこで参考になるサイト２つを紹介します。

### ・Unity公式のFPS Sample
Unity公式がオープンソースでマルチプレーヤーFPSのサンプルを公開しています。
動かすにはPCのスペックが要求されますが、公式なので安心感のあるサンプルです。
https://unity.com/fps-sample

### ・ブログサイト「ゆにブロ」様
https://uniblo.biz/
丁寧な解説付きでオンラインTPS開発の、全１２章のチュートリアルが掲載されています。

サーバーはPhotonの無料枠で収まるので無料で勉強が出来ます。有料レベルの素晴らしいサイトです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Lightsailを使ってWordpress環境を用意する

wordpressの使い勝手を試すため、検証用にwordpressを立ち上げる。

## Lightsailを起動
画面に沿ってサーバーを起動する。
ミニマムの構成で良いので、デフォルトの設定のまま、**Create instance**を選択する。

![スクリーンショット 2019-05-10 12.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/0319a927-2ac6-ce28-412f-bf96dc487687.png)
![スクリーンショット 2019-05-10 12.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/b9a95590-44fe-1d6d-9958-6092cf51787f.png)
![スクリーンショット 2019-05-10 12.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/da6a8ac1-d921-4494-7f45-95e1811935fd.png)

しばらくするとサーバーが起動する。

![スクリーンショット_2019-05-10_12_10_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/f0268ed7-062b-20d6-8e42-0b22863b77c2.png)

## Wordpressにログイン
まずはコンソールを起動しインスタンスにログインする。

初期パスワードはサーバーを起動時にホームディレクトリに作成させるファイルに記述されている。

```
cat $HOME/bitnami_application_password
```

パスワードをハイライトすると右下のクリップアイコンのテキストエリア内に文字列が表示されるので、それをコピーする
![スクリーンショット_2019-05-18_11_57_19-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/7cb35425-7843-4bbf-7b41-7c1144682d53.png)

Wordpressのログイン画面にアクセスし、

Username: user
password: 先程コピーしてきたもの

を入力してログインする。

<img width="412" alt="スクリーンショット 2019-05-10 17.22.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234559/c0db34ca-399a-ba05-f88b-60791d8e7e42.png">




## 参考
https://aws.amazon.com/jp/lightsail/

[Amazon Lightsail - ほんの数分で WordPress のサイトを開設](https://aws.amazon.com/jp/lightsail/projects/wordpress/)

[Getting started using WordPress from your Amazon Lightsail instance \| Lightsail Documentation](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/getting-started-with-wordpress-and-lightsail)
AWS上のWindowsServerに対して、ローカルmacからansibleを実行 #2 pingテスト実行用のplaybook

pingテスト実行用のplaybook。
マニュアルは、https://docs.ansible.com/ansible/latest/modules/win_ping_module.html

```conf:pingTest.yml
---
- hosts:
  - windows  # インベントリファイルで指定した名前

  tasks: 
  - name: Test Ping
    win_ping: 
        data: test  # dataを指定しなければpongになる。crashを指定すると、例外が発生する
        # data: crash

```

以下コマンドで実行。
`ansible-playbook -i ./ansible/hosts ./ansible/pingTest.yml`

```terminal:コマンド実行結果

PLAY [windows] ************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [ホスト名]

TASK [Test Ping] **********************************************************************************************************************
ok: [ホスト名]

PLAY RECAP ****************************************************************************************************************************
ホスト名 : ok=2    changed=0    unreachable=0    failed=0


なお、data: crashにすると、以下の例外が発生する。

fatal: [ホスト名]: FAILED! => {"changed": false, "module_stderr": "boomAt line:14 char:5+     throw \"boom\"+     ~~~~~~~~~~~~    + CategoryInfo          : OperationStopped: (boom:String) [], RuntimeException    + FullyQualifiedErrorId : boom ", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
	to retry, use: --limit @/Users/kuritayu/git/ansible/pingTest.retry

```
sedで正規表現と置換

Macのターミナルでsedを使って置換する事はよくありますが、正規表現でパターンマッチした値を置換後の値に引き継いで使う方法をやったことがなかったのでメモ。

# sedで正規表現
sedの正規表現については`man sed`の中で下記のような記述があります。

```
The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended (modern) regular expressions can be used instead if the -E flag is given.
```

デフォルトではBREが使われるが`-E`オプションを使うことでEREを使うことができるようです。

EREの方が拡張というだけあって機能が豊富であり、記法も異なります。

Gnuのsedのマニュアルなので厳密には違いますが(MacはBSD)、下記のような説明があります。
https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html

ざっくり言うと

BREでは`\`を付けない限り、文字列に特殊な意味を持たない
EREでは`\`を付けると特殊な意味を失う

と書いてます。

BREは特殊文字として扱いたい文字列に`\`を付ける必要がありますが、EREは文字列として扱いたいものに対して`\`を付ける必要があります。
BREとEREで`\`の意味が変わるので注意が必要です。

# 置換すること

さて、今回説明したかったことは正規表現でマッチした結果を使って置換をする方法です。

具体的なケースで考えます。
PostgreSQLで用いるクエリが書かれたsqlファイルがあるとします。
その中のWHERE句に下記のような記述がありました。

```sql
INTERVAL '-10days'
INTERVAL '-2weeks'
INTERVAL '+1month'
```

これを下記のように間にスペースを入れて書き換えたいとします。

```sql
INTERVAL '-10 days'
INTERVAL '-2 weeks'
INTERVAL '+1 month'
```

この時、変換したい文字列のパターンが複数あり、かつ数字の部分も可変です。
そのため正規表現を使った対象を見つけて、その値を引き継いで置換をする必要があるため、単純に文字列置換をすることは難しいです。

そこで正規表現を使ってパターンマッチさせて、うまく変換させることにしました。

# 方法

まず対象を見つける条件として下記のように考えます。

1. 数字が1文字以上存在する
2. その数字の直後に単位(day, week, month等)の文字列がくる
3. 最後にシングルクオートがある

パターンだけ抜き出すと下記のようになります。

```regx
[0-9](day|days|week|weeks|hour|hours|month|months|year|years|DAY|DAYS|WEEK|WEEKS|HOUR|HOURS|MONTH|MONTHS|YEAR|YEARS)\'
```

これを置換するわけですが、結論を言うと下記のように記述することでうまくできます。

```bash
sed -Ei -e "s/([0-9])((day|days|week|weeks|hour|hours|month|months|year|years|DAY|DAYS|WEEK|WEEKS|HOUR|HOURS|MONTH|MONTHS|YEAR|YEARS))\'/\1\ \2\'/g" sample.sql
```

記法としては

```bash
sed -Ei -e "s/(数字の部分のパターンマッチ条件)(単位の部分のパターンマッチ条件)\'/1つめの()内の値\ 2つ目の()の値\'/g" 対象ファイル.sql
```

となっています。
前半の正規表現を()でくくることで、後半の置換内容に実際マッチした値を引き継ぐことができます。
正規表現で対象を探しつつ、その時の値を使って置換ができるので、grepで絞ってから単語単位で置換というステップを踏まなくても良いです。or条件で幅広く指定できるのでサクッと置換したい時には割と役に立つ方法かなと思いました。
ABC - 014- A&B&C

#AtCoder ABC 014 A&B&C
[AtCoder - 014](https://atcoder.jp/contests/abc014)

#A - けんしょう先生のお菓子配り

```java
	private void solveA() {
		int a = nextInt();
		int b = nextInt();
		int mod = a % b;
		out.println(mod == 0 ? 0 : b - mod);
	}
```

#B - 価格の合計

 - xのどの位置のbitが1なのか？
    - bitが1の位置を商品価格のindexと対応させる

```java
	private void solveB() {
		int n = nextInt();
		int x = nextInt();
		int[] wk = IntStream.range(0, n).map(i -> nextInt()).toArray();

		int sum = 0;
		int index = 0;
		while (x != 0) {
			if ((x & 1) == 1) {
				sum += wk[index];
			}
			x >>= 1;
			index++;
		}

		out.println(sum);
	}
```

#C - AtColor

 - 累積和をとってしまえば簡単なんだけど。。。別解思いつかないなぁ

```java
	private void solveC() {
		int n = nextInt();
		int[][] wk = Stream.generate(() -> new int[] { nextInt(), nextInt() }).limit(n).toArray(int[][]::new);

		int[] imos = new int[1000001];
		for (int i = 0; i < n; i++) {
			imos[wk[i][0]] += 1;
			if (wk[i][1] + 1 < imos.length) {
				imos[wk[i][1] + 1] -= 1;
			}
		}
		for (int i = 1; i < imos.length; i++) {
			imos[i] = imos[i] + imos[i - 1];
		}

		Arrays.sort(imos);
		out.println(imos[imos.length - 1]);
	}
```
初めてのwebpack - Babel編

[前回](https://qiita.com/yarimo/items/5d0bcbfa176cec9d0299)、webpackの最小構成の設定をし、実行しました。
今回は、webpackを一層便利に利用するため、Babelを導入してみようと思います。


## Babelについて
webpackとセットで使用するツールにBabelというものがあります。
CSSとかでも、「プレフィックスを使用しないと、このブラウザでは正常に動作しない！」なんてことがあるかと思いますが、JSでも同様です。
ブラウザによる隔たりを解消するためのツールですね。


## インストール
webpackにてBabelを使用するためには、`Babel-loader`というプラグインをインストールします。

```sh
npm i -D babel-loader
```

これでwebpackとBabelが繋がりました。
ただ、肝心のBabel本体がありませんので、本体をインストールします。

※今回は、既にWebpackとBabelの導線はありますので、実際にBabelに書き換えるプログラムだけで十分です。
そのため、Babelの書き換え部分だけを抜き出したプログラムをインストールしています。

```sh
npm i -D @babel/core
```

## 設定
ここまででインストールは完了しましたので、実際に利用できるようにしてみましょう。
まず`webpack.config.js`の`module.exportsメソッド`に、`moduleプロパティ`を追加します。

```js:webpack.config.js
module.exports = {
  entry: './src/js/index.js',
  module: {
  }
}
```

### ルールの定義
次にどのファイルに対し、Babelを適用するのかを設定します。
先ほど追加した`module`内に、`rulesプロパティ`を追加し、そこに「どのようなファイルに」、「どのローダーを適用するのか」をルール付けしていきます。

```js:webpack.config.js
module.exports = {
  entry: './src/js/index.js',
  module: {
    rules: [
    ]
  }
}
```

#### 対象ファイルの設定
「どのようなファイルに」の部分は、`testプロパティ`を追加して設定します。

```js:webpack.config.js
module.exports = {
  entry: './src/js/index.js',
  module: {
    rules: [
      {
        test: /\.js$/
      }
    ]
  }
}
```

このような感じですね。

```js:webpack.config.js
test: /\.js$/
```

肝心の「どのようなファイルに」の部分は、`JSファイルに対して`としています。
正規表現を用いていますが、`/ /`で囲んでいる部分が正規表現のエリアで、ポイントとなるであろう`\`は`.`を正規表現としての`.`ではなく、文字として扱って欲しいので、`\.`とし、これは文字だよとしています。
また、`$`は末尾であることを表しています。つまり拡張子が`.js`であるファイルを対象にということを表しています。
（正規表現部分の説明が拙くて、すみません。この部分につきましては、他のドキュメントの方が詳しく載っているかと思いますので、そちらを参照ください。）


#### ローダーの設定
ここまでで、「jsファイルに対して」という設定ができました。
そのjsファイルに対して、どのローダーを適用するのかを設定します。
その設定には、`useプロパティ`を追加して行います。

```js:webpack.config.js
module.exports = {
  entry: './src/js/index.js',
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader'
      }
    ]
  }
}
```

これで完了、といきたいところですが、もう少し手続きが必要です。


## 変換設定
書き換えるBabelのプログラムも、webpackとの連結も完了したのですが、実際にどういう書き換えを行うのかという部分が抜けています。
この後は、その変換設定を行います。

### インストール
必要な変換設定ファイルをインストールします。

```sh

npm i -D @babel/preset-env
```

### 設定
次に、インストールした設定ファイルを適用します。
先ほどまでは、`useプロパティ`に使用するローダーを設定していましたが、オブジェクトに変更し、そこに使用するローダーと使用するプリセットを設定します。

```js:webpack.config.js
module.exports = {
  entry: './src/js/index.js',
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
}
```

これでJSファイルをIEにも対応したES5に変換し、結合できるようになりました。

次は、ライブラリをimportしたりしてみようと思います。