OmniAICreator/Qiita-1.07M huggingface dataset:
Github Actionsで自動デプロイ

# この記事は「[Sunrise Advent Calendar 2019](https://adventar.org/calendars/4184)」4日目の記事です

# Sunriseではできなかった自動デプロイがしたーい！
Sunriseでは作業の優先度を考慮して自動デプロイはしませんでしたが、今回は私の欲望のままに(?)自動デプロイをしたいと思います
ということで、なんか最近正式にリリースされたらしいgithub actionsを使ってサクッとやってみました(クォリティの低さは許してくれ...テストとレポートが(ry )

# サンプルプログラム
- これをもらう[FirebaseでWebチャットアプリをデプロイするまで（1時間コース）](https://qiita.com/mun_takamatsu/items/9e651e8cffaa90681426)

# 本題のGithubActions
- 最近出たばっかりだからfirebaseにdeployするやつなんてあるかなって思ったんですが、ありました↓
- [GitHub Action for Firebase](https://github.com/marketplace/actions/github-action-for-firebase)

# ありがたく使わせてもらい、実装
- フォルダ構造(新規作成)

```tree.txt
└── .github
    └── workflows
        └── deploy.yaml
```

```deploy.yaml
name: deploy_on_firebase

on:
  push:
    branches: 
      - master

jobs:
  deploy:
    name: deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repository
        uses: actions/checkout@v1
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting

        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
          PROJECT_ID : ${{ secrets.PROJECT_ID }}
```

- envの${{secret.xxx}}はリポジトリの「setting→Secret」から設定(名前をFIREBASE_TOKENとかにする)

# 結果
- ___はまりまくった(正直よくわからない)___
<img width="890" alt="スクリーンショット 2019-11-30 23.13.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/0a8c915c-8c15-6bd9-0061-667e7e75487f.png">
- エラーメッセージも「予期せぬエラーが...」みたいなことが書いてある
<img width="1280" alt="スクリーンショット 2019-11-30 23.14.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/94b01fdd-9391-3564-dfe1-59693e9dd7f2.png">

# 次の日
<img width="1279" alt="スクリーンショット 2019-11-30 23.16.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/20474e50-a9c4-0875-9c3f-2520fdd1d541.png">

- ___なんか通ったんですけど!?!?___
- github側の問題だったのかな...ということにしておきます。

# 業務効率上がった？
- 正直このプロジェクトは「firebase deploy」って打てばhosting完了してしまうのでそこまで変わらないような気がする
- buildを必要とするプロジェクトなら結構楽になりそう(buildしたっけ？とかも無くなるので)
- まぁでもそんなに導入にコストもかからないんでサクッとやっちゃえばコマンドを打つ回数も減りそうですね

# 読んでいただいてありがとうございました!
明日...じゃなくて明後日はジュエルさんお願いします！
年末まで毎日webサイトを作り続ける大学生 〜47日目 JavaScriptでスナップショットを撮る〜

##はじめに
こんにちは！@70days_jsです。

JavaScriptでスナップショットを撮るサイトを作ってみました。

今日は47日目。(2019/12/4)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day47.html

##やったこと
JavaScriptでスナップショットを撮るサイトを作ってみました。
chrome以外では動かない可能性があります。
gif↓
![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/87d1f1d4-d50c-7ac1-7f1b-8a453a5a4274.gif)

やっていることはシンプルで、カメラにアクセスしてボタンを押すとスナップショットを撮るだけです。

```html
  <body>
    <h2>Camera Punch</h2>
    <div class="videoWrapper">
      <video id="player" autoplay></video>
      <div id="capture"></div>
    </div>
    <div id="snapshotWrapper"></div>
  </body>
```
videoタグで映像、id="capture"でボタン、.snapshotWrapperクラスでスナップショットを表示しています。
.snapshotWrapperクラスには、JavaScriptを使って子要素にcanvasタグを加えていきます。

```javascript
let player = document.getElementById("player");
let captureButton = document.getElementById("capture");
let snapshotWrapper = document.getElementById("snapshotWrapper");
let beferCanvas;
let handleSuccess = function(stream) {
  player.srcObject = stream;
};
captureButton.addEventListener("click", function() {
  let canvas = document.createElement("canvas");
  canvas.setAttribute("class", "snapshot");

  // 2枚目以降のスナップショット
  if (beferCanvas) {
    beferCanvas = snapshotWrapper.insertBefore(canvas, beferCanvas);
    randomColor(snapshotWrapper.firstChild);
  } // 1枚目のスナップショット
  else {
    beferCanvas = snapshotWrapper.appendChild(canvas);
    randomColor(snapshotWrapper.firstChild);
  }

  var context = canvas.getContext("2d");
  context.drawImage(player, 0, 0, canvas.width, canvas.height);
});

navigator.mediaDevices.getUserMedia({ video: true }).then(handleSuccess);
```

> navigator.mediaDevices.getUserMedia({ video: true }).then(handleSuccess);

getUserMedia APIを使いました。
getUserMedia APIはpromiseを返します。

Mediaの取得ができれば、handleSuccessを実行します。

> let handleSuccess = function(stream) {
  player.srcObject = stream;
};

handleSuccessは、streamをsrcObjectに格納しています。
srcObjectはメディアソースを提供するオブジェクトをvideoタグ（id="player")に設定しています。

あと細かいですが、最新のスナップショットを左端に置いていくためにif文を使っています。
作成した要素をbeferCanvas変数に格納して、insertBeforeとappendChildを使い分けることで実現しています。

##感想
APIの力はすごいなぁと思いました。
こうやって簡単に便利な機能を実装できるAPIやライブラリが増えていくと、プログラマーは必要なくなるんじゃないかと思いました。
が、なくならないんですよね。なぜか。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. ユーザーから画像を取得する  |  Web  |  Google Developers (https://developers.google.com/web/fundamentals/media/capturing-images/?hl=ja#top_of_page)

とても分かりやすかったです。ありがとうございます！
TypeScriptで 'Uncaught TypeError: this.arrow is not a function'


## はじめに

表題のエラーに遭遇したので、解決方法を探りました。
この記事は、表題の問題の詳細と解決方法を共有するためのものです。

### 発生環境

TypeScript 3.7.2

## 問題の詳細

### 発生した問題

コンストラクタ内で特定のアロー関数がundefinedとなります。

```console
pen.js:32 Uncaught TypeError: this.arrow is not a function
    at ExtendClass.init (pen.js:32)
    at ExtendClass.BaseClass (pen.js:14)
    at new ExtendClass (pen.js:24)
    at pen.js:36
```

### 問題が発生する最小限のコード

```ts
class BaseClass {
  constructor()
  {
    this.init();
  }
  
  init():void{
    console.log("init Base Class");
  }
}

class ExtendClass extends BaseClass{
  constructor(){
    super();
  }
  
  init():void{
    super.init();
    this.arrow();
  }
  
  arrow = () =>{
    console.log("Arrow func");
  }
}

const instance = new ExtendClass();
console.log( instance );
```

CodePenは[こちら](https://codepen.io/masatomakino/pen/ExxmxNM)です。

### 問題の発生手順

問題が発生する手順は

1. 基底クラスを定義する
1. 基底クラスのコンストラクタ内で関数を呼び出す
1. 基底クラスを継承した拡張クラスを定義する
1. 拡張クラスで手順2の関数をオーバーライドする
1. 手順4の関数内部でアロー関数を呼び出す

となります。

## 問題の原因

[TypeScript Playground](http://www.typescriptlang.org/play/index.html)で上記のコードをJavaScriptに変換すると、以下のコードとなります。

```js
"use strict";
class BaseClass {
    constructor() {
        this.init();
    }
    init() {
        console.log("init Base Class");
    }
}
class ExtendClass extends BaseClass {
    constructor() {
        super();
        this.arrow = () => {
            console.log("Arrow func");
        };
    }
    init() {
        super.init();
        this.arrow();
    }
}
const instance = new ExtendClass();
console.log(instance);
```

原因はここです。

```js
    constructor() {
        super();
        this.arrow = () => {
            console.log("Arrow func");
        };
    }
```

アロー関数がコンストラクタの内部で宣言されています。したがって`ExtendClass.init`関数が実行された時点で`arrow`関数はまだ定義されていません。

## 解決方法

### アロー関数ではなく通常の関数にする

```ts
class ExtendClass extends BaseClass{
...中略...
  arrow():void{
    console.log("Arrow func");
  }
}
```

アロー関数を使う必要がないなら、通常の関数に置き換えるのが最も簡単な解決方法です。

### オーバーライドした関数からは呼び出さず、コンストラクタ内から呼び出す

```ts
class ExtendClass extends BaseClass{
  constructor(){
    super();
    this.arrow();
  }
  
  arrow = () =>{
    console.log("Arrow func");
  }
}
```

設計上アロー関数でなくてはいけない場合、コンストラクタの内部で呼び出すことでこの問題を回避できます。
アロー関数は定義後に実行されます。

以上、ありがとうございました。
Classic Load BalancerからApplication Load Balancerへの移行

Classic Load BalancerからApplication Load Balancerへ移行したのでその時の手順を記録しておきます。


## 移行のメリット
移行には基本的にメリットしかないと思うのですが以下の点に魅力を感じて移行しました

### ホストベース・パスベースのルーティングのサポート
これまで１サービス１ロードバランサの構成だったのですが、ALBに移行することで、一つのロードバランサで済みます。
あまり多くのサービスとつなぐと設定が複雑になるので避けるべきかもしれませんが、費用が削減できます。

### ヘルスチェックの高機能化
これまでは単一のヘルスチェックしか動かせなかったのですが、複数のターゲットグループが存在する場合、それぞれにヘルスチェックを設定することが可能となります。

### WAFの設定が可能
ALBであればWAFが設定可能です。

### リダイレクト設定
これまでEC2インスタンスで設定していたものがロードバランサでの設定で対応可能となります。

いくつか上げましたが、[こちら](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/introduction.html#application-load-balancer-benefits)を参照すると詳細なメリットがわかります。

## 移行手順
1. 移行ウィザードを使って新ALBを作成
2. Route53でELBのDNS設定の重み付けを95にする
3. Route53で新規ALBのDNS設定を重み付け5で作成する
4. 動作確認、新規ALBのアクセスが問題ないことを確認して、ELBのDNS設定の重み付けを0にする
5. 問題なければELBのDNS設定の削除、ELBの削除

それぞれ簡単に解説すると…

### 移行ウィザードを使って新ALBを作成
![スクリーンショット 2019-12-04 12.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/9e1e10ff-851a-6947-4c3d-d99c875187a1.png)
クラシックロードバランサを選択すると移行ウィザードが表示されるのでそこから新しいALBを作成します。
この時ロードバランサの名称やターゲットグループの名称も決定します。デフォルトでは同じ名称となっていますが、変更する場合はここで変更します。後からでは名称の変更ができない（はず）です。

### Route53でELBのDNS設定の重み付けを95にする
![スクリーンショット 2019-12-04 13.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/705a3f1e-b819-bb4e-f9aa-fc8043886823.png)
Route53でこれまで設定していたELBのAレコードの設定を変更する。
上記画像のように重み付けを加えて95としておく。
このとき95というのは適当な数字で自分がわかりやすいものとした。一旦は5%をALBに飛ばすつもりにしたので次にALB側で重みを5とすると95%と5%とわかりやすく分かれる。
任意ではあるが、重みは0～255の間で設定できるのでその点だけ注意。
セットIDは一意であれば任意のものでOK

### Route53で新規ALBのDNS設定を重み付け5で作成する
2番と同じ様に重み付けを変更します。

### 動作確認、新規ALBのアクセスが問題ないことを確認して、ELBのDNS設定の重み付けを0にする
動作確認します。ALBを通してEC2インスタンスにアクセスしていることを確認するために、ALB・EC2共にモニタリングします。
動作・モニタリング結果共に良好であれば、CLBの重み付けを0とします。

### 問題なければELBのDNS設定の削除、ELBの削除
すべてALB経由でアクセスすることを確認したのち、CLBを削除します。Route53にした重み付けはそのままでもOKです。



以上で移行が完了しました。移行ウィザードとRoute53の重み付けの設定をいじるだけで簡単に移行ができました。
高機能かつ費用が抑えられるので早めの移行をおすすめします。
開発効率をあげるCLIツール

## 背景
NEMアプリケーションを開発する上でCatapult-bootstrapは必要不可欠ですが、まだベータ版であるが故に、起動がうまくいかなかったり、急にトランザクションが読み込まれなくなるなど不安定な側面も持っています。

その対処法として `./cmds/clean-all`や`./cmds/clean-data`コマンドを叩いてカタパルトのリセット処理をしますが、例えば発行したモザイクをフラグとした処理を開発している時にリセットすると、エイリアスをつけたネームスペースとモザイクを生成し直すシーンが度々ありました。

個人開発で1・2回程度ならまだしも、チーム開発で頻繁になると顕著に開発効率が下がっていたので、コマンド一発で以下の「実装機能一覧」にあるものを取得できるCLIツール「nem2-util」を作るに至りました。

## 実装機能一覧
1. ネームスペースの取得 + モザイクの生成 + エイリアス設定(モザイクリンク)
2. ネームスペースの取得 + エイリアス設定(アドレスリンク)


## セッティング
リポジトリはこちら
https://github.com/keita1484/nem2-util

### .env
`.env.dist`ファイルを参考にルートに`.env`ファイルを作成して、適宜値を変更。
`MASTER_PRIVATE_KEY`は処理を行いたいアカウントのプライベートキーに書き換えてください。
#####`.env.dist`ファイル
```
CATAPULT_URL=http://localhost:3000
GENERATION_HASH=REPLACE_THIS_VALUE
MASTER_PRIVATE_KEY=REPLACE_THIS_VALUE
```


## 機能詳細
`ts-node`を使って`src/index.ts`を実行していきます。

### 1. ネームスペースの取得 + モザイクの生成 + エイリアス設定
以下のコマンドでネームスペースの取得〜エイリアス設定まで実行されます。
今回エイリアスは、`mosaicAliasTransaction`でネームスペースをモザイクへリンクさせているので、ネームスペースからモザイク参照ができるようにしています。

```
$ ts-node index.ts -c nsmosaic -r ticket --sn1 2019 --sn2 event
```

ネームスペースは最大`3階層`まで取得できます。
サブネームスペースを指定する`--sn1`と`--sn2`はオプショナルなので、ルートネームスペースだけ取得したい場合は、`-r`とバリューを指定するだけでOKです。

ちなみに、ネームスペースを取得する上で以下のルールがあります。
* ネットワーク内でユニークの`64`文字以内
* 利用可能な文字は`a, b, c, …, z, 0, 1, 2, …, 9, _ , -`


アナウンスされればステータスとトランザクションハッシュが返ってきます。

```
[Transaction announced]
Endpoint: http://localhost:3000/transaction/8D957BE945E5908FB2B73FC67EED01E63C95EA0001C1A62FDCA862DEE5621BC2
```

本当は`Listener`まで実装して、トランザクションがブロックに取り込まれれば結果が返ってくるようにしたかったのですが、一旦ご了承ください。


### 2. ネームスペースの取得 + エイリアス設定(アドレスリンク)
ネームスペースだけであればnem2-cliを使えば良いのですが、どうせならということで機能追加しています。

```
$ ts-node index.ts -c ns -r dog --sn1 shiba --sn2 male
```

2019.12時点でメタデータの送信はnem2-cliになかったと思うので（認識間違っていたらすみません）、直近は`アカウントメタデータの送信`と`Listener`対応をする予定です。


## おわりに

時間の都合で荒削りな状態ですが、少しでも皆様の快適なNEM開発ライフに繋がれば幸いです。

ちなみに皆さんの開発効率化に繋がるように更新していく予定なので、追加して欲しい機能などあれば是非コメントくださいませ。
Windowsシミュレータで学ぶuITRON (5) - 周期ハンドラ

# はじめに

**uITRON（FreeRTOSベース）Windowsシミュレータ - Qiita**
https://qiita.com/imagou/items/42c687402e6e58fccddb

今回のお題は、タイマ機能の一つである、**周期ハンドラ**です。

# 本編

## 1. 環境

[こちらの記事](https://qiita.com/imagou/items/42c687402e6e58fccddb#1-1-%E7%92%B0%E5%A2%83)を参照ください。

## 2. 動かしてみる

### 2-1. 周期ハンドラの開始

コンソールで「cyclic」と入力してみましょう（入力後にEnterを押してください）。

```console
[TimerTask]: DELAY 3000ms
[TimerTask]: DELAY 3000ms
cyclic
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (1)
[TimerTask]: DELAY 3000ms
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (2)
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (3)
```

定期的に`SendTask`が`Cyclic Timer Expired (n)`を受信するようになりました（カッコ内の数値は満了回数）。

### 2-2. 周期ハンドラの停止

次に、コンソールで再度「cyclic」と入力してみましょう。

```console
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (10)
cyclic
[TimerTask]: DELAY 3000ms
[TimerTask]: DELAY 3000ms
```

前述の定期的なイベントが発生しなくなっています。

## 3. 解説

### 3-1. 概要

周期ハンドラは、その名の通り、**定周期で何らかの処理を実施する仕組み**です。

組み込みで言えば、定期的にデバイスの状態を監視する・・・などでしょうか。

### 3-2. コードによる説明

以降は、プログラムコード - `main.c`を引用して説明します。

#### 3-2-1. 周期ハンドラ生成

`cre_cyc()`で生成します。

```C
    T_CCYC ccyc;
    ccyc.cycatr = TA_HLNG;
    ccyc.cychdr = UserCyclicHandler;
    ccyc.cyctim = 1000;
    ccyc.cycphs = 0;
    cre_cyc(CYCLIC_ID(USER), &ccyc);
```

このパラメータは下表：

|パラメータ番号|名称|説明|
|---|---|---|
|第1パラメータ|周期ハンドラID|単なるID。<br>以降はこのIDでもって開始・停止を実施。|
|第2パラメータ|T_CCYC構造体変数|下表で説明。|

T_CCYCのメンバは下表：

|名称|指定可能な値|説明|
|---|---|---|
|cycatr|( TA_HLNG &#124; TA_STA )|属性。<br>それぞれ、高級言語を使用、即開始するか。|
|cychdr|void *func*(void*)|満了時に呼び出すハンドラ関数。|
|cyctim|ミリ秒|ミリ秒単位の周期。|
|cycphs|ミリ秒|起動位相（開始時に遅延する時間）。本シミュレータでは（FreeRTOSが非対応のため）使えません・・・。|

**※なお、属性はこれ以外の値も指定可能（だが、上記のみで必要十分と考える）。**

#### 3-2-2. 周期ハンドラ開始・停止

それぞれ`sta_cyc()`、`stp_cyc()`を使います。

```C
        /* Cyclic */
        else if (EQUALS_(cyclic)) {
            T_RCYC rcyc;
            ref_cyc(CYCLIC_ID(USER), &rcyc);
            if (!(rcyc.cycstat))    sta_cyc(CYCLIC_ID(USER));
            else                    stp_cyc(CYCLIC_ID(USER));
        }
```

また`ref_cyc()`を用い、周期ハンドラが起動しているか参照していますが、こちらの説明は割愛。

#### 3-2-3. ハンドラ関数

**ハンドラは非タスクコンテキスト、すなわち割り込みから呼ばれるので、簡潔な処理に留めます。**
（超重要なので太字にしました、笑）

今回はまさしく定石手段、イベントフラグを立てて終了としています。

```C
static void UserCyclicHandler(void* params)
{
    /* Just to remove compiler warning. */
    (void)params;

    iset_flg(FLAG_ID(SEND), EVENT_CYCLIC);
}
```

# おわりに

同じタイマ機能として、ワンショットを実現する**アラームハンドラ**がありますが、次回紹介予定です。

# 参考

**Micro-ITRON4.0 Specification (in Japanese)**
http://www.ertl.jp/ITRON/SPEC/mitron4-j.html
re:Invent 2019 - Lambda Provisioned Concurrency やってみた

## Provisioned Concurrency とは
Lambda のコードスタート対策として、CloudWatch Events から定期的に Lambda を呼び出すという処理を、一般機能として提供されます。

## 前提条件
- **$LATEST** バージョンに設定できない
- **エイリアス** か **バージョン** の設定が必要
- 無料枠に適用されない

## どう設定する
Lambda の設定画面で設定できます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/5b62a02c-91bc-2446-f910-3490139fdcb0.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/44983f90-c15d-3d97-5186-e77f541c762b.png)

## 料金設定 (東京リージョン)
||Price|
|---|---|
プロビジョニング同時実行数		| $0.000005384 for every GB-second
リクエスト数 | $0.20 per 1M requests
実行時間 | $0.000012562 for every GB-second

## 実際にいくらかかる
[公式：Lambda Pricing](https://aws.amazon.com/lambda/pricing/?nc1=h_ls)
日本語版まだ更新されていないため、英語版の例を翻訳すると

### 事例１
|使用条件||
|---|---|
メモリ	| 1024 MB
プロビジョニング同時実行数| 1000
プロビジョニング有効時間| 2 hour
リクエスト数| 1,200,000
実行時間| 1 Second
プロビジョニング料金| 1000 * 1024MB/1024MB * 7200s * $0.000005384 = **$38.7648**
リクエスト料金| 1.2M * $0.2/M = **$0.24**
実行時間料金 | 1.2M * 1 second * 1024MB/1024MB * $0.000012562 = **$15.0744**
料金合計| 38.7648 + 0.24 + 15.0744 = **$54.0792**

### 事例2
|使用条件||
|---|---|
メモリ	| 256 MB
プロビジョニング同時実行数| 100
プロビジョニング有効時間| 31 day * 24 hour
リクエスト数| 100 million / month
実行時間| 1 Second
プロビジョニング料金| 100 * 256MB/1024MB * 31 * 24 * 3600s  * $0.000005384 = **$360.51264**
リクエスト料金| 100M * $0.2/M = **$20**
実行時間料金 | 100M * 1 second * 256MB/1024MB * $0.000012562 = **$314.05**
料金合計| 360.51264 + 20 + 3134.05 = **$694.56264**

## まとめ
コードスタートがマネージドサービスになり、新規開発と保守の負担減って、より開発に集中できるようになりました。
EC-CUBE3 の受注管理で「帳票出力」ボタンを押しやすくするカスタマイズ

## モチベーション

EC-CUBE3では帳票出力プラグインを導入することで帳票出力が可能となる。
帳票出力はよく使う機能ではあるが、ボタンが「その他」項目にまとめられていて押しにくい。
少しでも簡単に帳票出力ができるようにしたい。

<img width="681" alt="スクリーンショット 2019-12-04 11.23.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206259/04822fa2-d6df-58a2-8d82-356f8048d387.png">

## 方針

「その他」を展開して表示させることで、そのほかのボタンも押しやすくする。
JavaScriptが効かなくなるので、HTMLの構造は崩さず、CSSで変更する。

## 変更

[`src/Eccube/Resource/template/admin/Order/index.twig`](https://github.com/EC-CUBE/ec-cube3/blob/3.0/src/Eccube/Resource/template/admin/Order/index.twig#L31) の `stylesheet` ブロックに以下のようにCSSを追加します。

```twig:src/Eccube/Resource/template/admin/Order/index.twig
{% block stylesheet %}
<link rel="stylesheet" href="{{ app.config.admin_urlpath }}/assets/css/bootstrap-datetimepicker.min.css">

{# ここから追加 #}
<style type="text/css">
#result_list_main__other_menu_toggle { display: none }
#dropmenu .dropdown-menu { display: block; position: static; border: none; padding: 0; margin: 0; float:none }
#dropmenu .dropdown-menu li { display: inline-block }
</style>
{# ここまで追加 #}

{% endblock stylesheet %}
```

すると「その他」が展開され、以下のような表示となります。

<img width="660" alt="スクリーンショット 2019-12-04 11.21.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206259/dadc3caf-c1da-3943-6c20-681d0a50978b.png">

「その他」が煩わしいと思われた方はぜひ試してみてください。
NTP Pool Project 日本語訳：翻訳者募集

# はじめに
これは、NTP Pool Project の翻訳ガイドラインの翻訳対象には含まれていない[Translators needed!](https://www.ntppool.org/en/translators.html) を Google 翻訳にかけ、用語の前後にスペースを追加したり、リンク先を訂正したり、注釈を加えるなどの手直しをおこなったものです。
2019年12月3日 (3rd Dec 2019) 現在公開されているドキュメントに基づきます。
翻訳ガイドラインの翻訳対象に含まれているドキュメント及び PO ファイルは、別途[プルリクエスト](https://github.com/abh/ntppool/pull/182)しました。

# 翻訳者募集 (Translators needed!)
NTP プール Web サイトの基本コンテンツをほぼすべての言語で利用できるようにしたいと考えています。 しかし、私たちはあなたの助けが必要です！

# 必要なもの (What you'll need)
- 英語の有能な読者であり、他の言語にも堪能です。
- 最初の翻訳に 3〜4 時間かかります。
- 変更に伴う翻訳の更新には、3 か月に 1〜2 回、10〜20 分かかります。
- 基本的な HTML のある程度の知識。
- 理想的には git または subversion の基本的な知識。
- 数千人の利益のために無料で働きたい！

# 始めましょう (Get started)
最も簡単に開始する方法は、[git](https://git-scm.com/) でコードを「クローン」することです。
[git を使用](https://help.github.com/en/github/getting-started-with-github/set-up-git) するには、まず github でアカウントを作成してから、[リポジトリ](https://github.com/abh/ntppool/) を [複製（フォーク）](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) します。
[フォーラム](https://community.ntppool.org/) にサインアップして、(非常に低いトラフィックの) [翻訳者と国際化のカテゴリ](https://community.ntppool.org/c/i18n) にサブスクライブしてください。

# 翻訳をおこなう (Do the translation)
ソースコードを入手したら、翻訳する文字列を2つの場所で見つけることができます。

- i18n ディレクトリ内の po ファイル。 これらは、テキストエディターまたは [po edit](https://poedit.net/) などの専用ツールで編集できます。 ご使用の言語のファイルがない場合は、en.po ファイルをコピーして開始できます。
- docs/ntppool ディレクトリ内の言語固有の HTML ファイル。 「en」ディレクトリをコピーすることから始めます。 「言語ディレクトリ」内のファイルのみが翻訳を必要とします。 残りは英語のみで提供されるか、または po ファイルを介して翻訳されます。 最も重要なファイルは「homepage.html」、「join.html」、および「use.html」です。[^1]
- 未完成の翻訳が「ベータ版に」ある可能性があります。（ [テストサイト](https://web.beta.grundclock.com/ja/) で「ベータ版」言語を探してください）

[^1]: この翻訳者募集ページ自身、および前に訳したベンター向け情報ページも翻訳対象外になっています。

# 提出する (Submit it back)
完了したら、git でコミットし、github にプッシュして [プルリクエスト](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests#about-pull-requests) を作成します。
質問がある場合は、[翻訳者フォーラム](https://community.ntppool.org/c/i18n) に投稿してください。

# ベータテスト (Beta test)
新しい言語を開始すると [ベータサイト](https://web.beta.grundclock.com/ja/) に表示されます。
それがそこにあるとき[^2]、それをレビューしてください。そして可能であればあなたの言語に堪能な他の誰かにそれを通して見てもらいましょう。
github またはフォーラムにフィードバックを投稿して、メインサイトに行く準備ができていることを伝えてください。

[^2]: うまく翻訳できませんでした。原文 When it is up there
TypescriptでフロントStripeの実装したときの話


`JP_Stripes Advent Calendar 2019`の3日目の記事になります！
こちらQiitaではなくADVENTでやっておりますので公開先は[こちら](https://adventar.org/calendars/4333?fbclid=IwAR3Rdo8H6j27Z7tEsyrI1oXke4FF885nMR-dcarxmwNWaN6x23fRbheLHnE)

## 概要
ちょっと前にAngularでフロント部分を実装していたときに気づいたことだけまとめようと思います！
躓いたところ一覧ってほどでもにないですが、時間はそこそこ持っていかれたので、参考になれば・・・

## Referenceは絶対読みましょう。
既に持っていかれてから気づいたのですが、ほぼ答えはReferenceにありました。
<font color="Red">**悩んでる時間より英語を解読する時間のが短いかもしれないです。**</font>

## npmでインストールするのは型定義のみ
npm(yarn)でインストールしているのは型定義のみです。
実態はJSなのでTypescirptで使えるようにするために必要です。

まぁ、無くても出来ますがそれなら最初からJSで書けばいいじゃんってなります。

なので、`node_module`の中にあるのは@typesの中だけです。

僕は実装時は`checkout`しか使わなかったので、これだけ。

```json:package.json
"dependencies": {
	"@types/stripe": "^6.32.13",
	"@types/stripe-checkout": "^1.0.1",
	"@types/stripe-v3": "^3.0.8",
}
```

もし、`@types`以外のところに`stripe`ってあったら、それサーバサイド用のライブラリなのでここではいらんです。

## 実態はScriptタグで読み込む

```html:head
<script src="https://js.stripe.com/v3/"></script>
```

これを`<head>`タグ内に埋め込むだけで実装準備はOKです。
ちなみに、この`<scirpt>`タグを埋めてるページに関しては、不正行為を示す異常な動作の監視対象になります。

なので、Stripe側はCheckout機能を使うところ以外にも差し込んでくださいって感じですね。

これSPAとかで、`<head>`タグ入ってるComponentを全ページに使ってたらそれでいいのかな？

## 型を使いましょう
せっかくTypescriptを使うのだから、ちゃんと型を使って指定しましょう。
何を呼び出したら結果何が返ってくるかを、可視化するのは大事です。

例えばCard情報をTokenにするメソッドだとしても、こんな感じ。

```typescript
createToken = (card: stripe.elements.Element, options: stripe.TokenOptions): Observable<stripe.TokenResponse> =>
    from(this.stripe.createToken(card, options))
```

引数に`stripe.elements.Element`と`stripe.TokenOptions`を受け取って、Responseは`Observable<stripe.TokenResponse> `を返すというのを明示しておくと、あとから型情報を調べる必要ないし、それ以外の引数が着てもエラーが出ます。


## 初期化＋テストでハマった

<font color="Red">**これが一番時間持ってかれた。**</font>

初期化はReference通り行うと以下の通り

```typescript
const stripe = Stripe('pk_test_VIRaaRQleDBZMfL2GNAuT0CG');
```

`Stripe([パブリックキー]) `で初期化完了。
その後は、初期化後のオブジェクトが入っている変数を使っていくことになる。

ただ、単体テストを通したときCompornentは通るが、Serviceで毎回`Stripe() not found`が出てくる。


**そいえば`Stripe()`ってどこにあるんだ？？？**
<font color="Red">**ここでハマった・・・**</font>


答えは`<script>`でURLから直接読み込み、読み込み後に`WindowObject`に入る挙動をします。

つまり実際に使ってるStripe()は、window.Stripe()となります。
JS初心者にはこの挙動は気づけなかったです／(^o^)＼


<font color="Red">**なのでServiceを単体でテストすると、画面はないのでwindowオブジェクトもないし、そもそも`<script>`タグを読み込みません。**</font>

おとなしく、mockで**Stripe()を呼び出しているテスト**だけしましょう。


## まとめ
今回は特に実装方法などは明記を特にしませんでしたが、実装するうえで考慮してほしいことなどをまとめました。
ざっくり書いてるので、あとから修正はいるかもですがご参考までに


## 参考ページ
[Stripe.js Reference
](https://stripe.com/docs/stripe-js/reference)
phpstormでtwigをinclude時に補完させたい

EC-CUBE4を開発中にtwigファイルで補完されないから、どうやるんだろうと調べた。

以下の設定をすると呼び出し元に飛べたり、補完が出るようになる。

参考
https://symfony.com/doc/4.1/templating/namespaced_paths.html

## twig.yamlに定義する

eccube_theme_front_default_dirに定義されているから
include'@~/Components'で補完はされるもののnamespaceがないと怒られてしまう。
今回は新しくThemeを定義した。

``` yaml
twig:
    globals:
      BaseInfo: null
      eccube_config: '@Eccube\Common\EccubeConfig'
    paths:
      '%eccube_theme_front_dir%': ~
      '%eccube_theme_front_default_dir%': ~
      '%kernel.project_dir%/app/Plugin': ~
      '%eccube_theme_admin_dir%': admin
      '%eccube_theme_admin_default_dir%': admin
      '%eccube_theme_user_data_dir%': user_data
      '%eccube_theme_src_dir%/toolbar': toolbar
      '%eccube_theme_src_dir%/common': common
      '%kernel.project_dir%/app/template/default': Theme //追加
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
    form_themes: ['bootstrap_4_layout.html.twig']
```

## phpstormの設定
Preferences | Languages & Frameworks | PHP | Symfony | Twig / TemplateからThemeで設定したディレクトリを設定する。

定義した値に@つけてあげればphpstorm側で補完してくれる。
これで開発が捗るね！

```twig
{# 商品名 #}
  <div class="ec-productRole__title">
    {{ include('@Theme/Components/ProductDetail/Profile/productName.twig') }}
  </div>
```
%time, %timeitの結果を加工する

Jupyter/IPythonで`%time`や`%timeit`で実行時間を計測できるのはよく知られていると思いますが、これを加工したり可視化したいと思ったことはないでしょうか？

`%%capture`を使うと、標準出力をPythonのオブジェクトとして扱えます。
実際にやってみましょう。

```python
%%capture result
%timeit 2 ** 100
```

`%%capture`の引数がオブジェクト名となります、ほかのオプションについてはヘルプを参照してください。

```
  %capture [--no-stderr] [--no-stdout] [--no-display] [output]

run the cell, capturing stdout, stderr, and IPython's rich display() calls.

positional arguments:
  output        The name of the variable in which to store output. This is a utils.io.CapturedIO
                object with stdout/err attributes for the text of the captured output.
                CapturedOutput also has a show() method for displaying the output, and __call__ as
                well, so you can use that to quickly display the output. If unspecified, captured
                output is discarded.
```

`stdout`属性を参照すると、標準出力が文字列に格納されていることがわかります。

```python
print(result.stdout)
```

```
292 ns +- 4.24 ns per loop (mean +- std. dev. of 7 runs, 1000000 loops each)
```

この`292 ns`の部分を数値として扱えるように秒に変換してみます。

```python
value, unit = result.stdout.split()[:2]
float(value) * {"s": 1, "ms": 1e-3, "us": 1e-6, "ns": 1e-9}[unit]
```

```
2.92e-07
```

`%timeit`に限らず、`%%capture`を使うとさまざまな出力をJupyter上から加工できます。よいJupyterライフを！
特定の映画の出演者の他の出演作品を表示する。#neo4j

#始めに
advent calendarに乗じて、興味があったがあまり触れていなかったグラフDBを少し触ってみようと思い、この題材になりました☺️
映画の出演者が出ている他の映画を簡単に検索できるような物を作成します。(今後も、絶対Wikipediaを使います。🥳)

## neo4jとは　https://neo4j.com
様々な要素同士の関係性を扱えるDB
RDBではなく、GraphDB
無向グラフ.(有向グラフも扱うことはできるが、非推奨)

Wikipediaとかがいい例
アイアンマン(映画) -> ロバートダウニー・Jr -> アベンジャーズ 
->キャプテンアメリカ ->　(以下ループ)

## データの作成
まず、映画と出演者のデータを作成します。
今回はneo4jのSample Dataを利用します。
```$ :play movie graph```
Web Consoleに上記を入力します。
すると、2ページ目にSample Dataを作成するためのQuery(Cypher)が表示されます。(以下Cypher)
Cypherが書かれているTextBoxをクリックするとConsoleに自動入力され、実行できます。
<img width="1267" alt="スクリーンショット 2019-12-04 11.18.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/fa099841-4ee3-7807-9d32-84d93e3afefd.png">
実際の作成後が以下になります。
<img width="964" alt="スクリーンショット 2019-12-04 11.22.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/87ae6069-8b08-6e90-c2c6-529089abc135.png">

##特定の映画の出演者の他の出演作品を表示する。
まず、特定の映画の出演者を表示してみましょう。(今回は、マトリックスです。)
以下のCypherを実行します。
```$ MATCH(n:Movie{title:"The Matrix"})<-[r:ACTED_IN]-(m:Person)  return n,m```
を実行します。

<img width="916" alt="スクリーンショット 2019-12-04 11.40.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/e7b03262-abe6-f7a3-0dfa-1dba54e60642.png">

すると,The Matrixの出演者が表示されます。
次にこの演者が出ている他の映画を表示します。
以下Cypherを実行します
```MATCH(n:Movie{ title:"The Matrix"})<-[r:ACTED_IN]-(m:Person)-[d:ACTED_IN]->(s:Movie) return n,m,s```
<img width="917" alt="スクリーンショット 2019-12-04 11.56.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/4daa6da9-de08-8489-a145-30a39177665b.png">
これで、The Matrixの出演者の他の出演作品を取得することができました。

neo4jでは、tableなどグラフ以外の表示が可能なので、必要な情報に絞って表示します。
```MATCH(n:Movie{ title:"The Matrix"})<-[r:ACTED_IN]-(m:Person)-[d:ACTED_IN]->(s:Movie) return m.name,s.title```
上記のCypherの結果が以下です。
<img width="974" alt="スクリーンショット 2019-12-04 12.19.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/8f7965b2-d0ba-d85d-3578-b40fe3a1ea5d.png">

これで、The Matrixの出演者の他の出演作品が一覧で確認できるようになりました。(マトリックスが3部作とは知らなかった、、、🤔)

#最後に
neo4jのWeb Consoleを触りましたが、様々なプログラミング言語で利用できます。
neo4jでないですが、グラフDBはパナマ文書の解析やFacebookなどにも使われています。
今後、グラフDBを用いて面白い物が作成できればと思います。
統計学_学習

#　用語
| 用語 | リンク |
|:--|:--|
| 相関係数  | https://qiita.com/kenmero/items/1265d8c89c67650e4c13#%E7%9B%B8%E9%96%A2%E9%96%A2%E6%95%B0 |
| 箱ひげ図   |   |

## 相関係数

```
相関係数（ピアソン相関）の考え方は、2つの要素（確率変数）の「線形関係」を見つけるものである。
※線形とは、変数と変数の関係が直線的である関係を表す言葉である。(= xとyの関係が1次関数）

相関係数には、原則や単位は存在せずに、
-1から1の間に実数値をとります。

1に近いときは2つの要素にプラスの相関があるといい、
-1に近いときにはマイナスの相関があるといいます。

※プラスの相関・・・片方が上がれば、もう片方も上がる
　マイナスの相関・・片方が上がれば、もう片方は下がる

0にちかいときは相関は弱い（ない）と判断されます。

また、相関関係は2つの関係が線形の場合に効果を発揮するものであるため、
非線形（2次曲線など、、）には効果はでず、相関がない（0に近似した値）となります。
```
![相関係数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377129/7049ef4f-07a8-0c5c-3717-7013102c9115.png)

※wikiから抜粋
https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

参考サイト:
http://tomoshige-n.hatenablog.com/entry/2014/08/06/035001
https://qiita.com/te20/items/e91faee8f9eb9b1a869c

# 箱ひげ図
```
データの中央値（平均値）の個所をパット見で判断しやくした図。
箱ひげ図では全体の25%(第１四分位数)、50%(第2四分位数)、75%(第3四分位数)の値を特定し図に表現する。
25%から75%の間の値が集中しているデータであると判断する。

以下の場合の箱ひげ図を例に説明
7人に数学のテスト結果を箱ひげ図で洗わす。
1点 3点 4点 5点 6点 6点 10点

手順
１．最小値と最大値を特定する。
 最小値：1点
 最大値：10点

２．中央値を特定する
 中央値：5点（第２四分位数：50%の値）

３．２から最少値の間の中央値を特定する
 中央値(左)：3点（第一四分位数：25%の値）

４．２から最大値の間の中央値を特定する
　中央値（右）：6点（第三四分位数：75%の値）

```
<img width="400" alt="箱ひげ図サンプル.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377129/cfc237c5-09a7-110d-1ce2-50a543d52ad3.png">
強化学習28　colaboratory+OpenAI＋chainerRL　小まとめ

（２０１９年１２月８日にchokozainerRLを更新しています。）

　中学生から大学生までのAI初学者を対象にしています。
強化学習シリーズを２７まで書いてきました。1日１個のペースだったので、約１ヶ月。
ここから始めると楽になるというような、まとめを書きます。新しいことはありません。

　手軽にGPUを使った機械学習を始めるならば、colaboratoryは無料なのでオススメです。面倒なインストールも必要ないし。
ただ、それだけでは動かないので、手順をまとめてみようということです。
フレームワークにchainerRLを選びました。tensorflowもいいのだけれど、使ったことないので、、、。
　そのうち、tensorflowも使ってみると思います。
　途中にも書きますが、できる限りソースコードを見ましょう。githubで公開されています。関数名がわかりやすいので、理解しやすいと思います。chainerは日本人が作っているためか、英語的に読みやすいです。というか、chromeで日本語訳すると、ちゃんとした日本語になります。tensorflowは、？？？です。
　chainerRLのラッパーであるchokozainerRLを公開しています。大したことはしていませんが、強化学習の「人間の学習」に役立てばと思います。

#１　Googleアカウントを取得
こちらから作成してください。

Googleアカウントの作成
https://support.google.com/accounts/answer/27441?hl=ja

#2　Colaboratoryのページを開く

こちらから開きます。
https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja
ブックマークしておきましょう。

#3　chokozainerのサンプルページを開いて、自分のフォルダに保存

##3-1　ノートブックを開く
![open_toolbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/daaf3ee1-957b-2b23-95d7-e1a8e25c7102.png)

ファイル−ノートブックを開く
![select_abc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/07a76064-2f86-6b23-f04f-6520c3d994c8.png)

GitHubタブを選択します。
chokozainerで検索して、
ipynbs/abc.ipynb
を選択します。

開かれたabc.ipynbは、そのままでは使えないので、ドライブにコピーを作ります。
![select_save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/33b0c292-c9d2-97f7-bd8b-271cad1d6f0d.png)

そして、コピーされたファイルの名前を変更します。
![change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/1b1bf27c-cef3-5e60-0c5a-1304e60a788c.png)

#4　ノートブックを実行する。

ノートブックの実行は、いろいろなサイトで詳しく説明されているので、自力でやってください。
学習前は、数ステップしかできなかったのが、学習後には設定の２００ステップまでバランス取れるのがわかります。
こんな感じの動画が作られます。
![videoimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/50b43295-a9f5-6f1f-bc0f-d432ca8d0ba0.png)

学習実行結果は、こんな感じです。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/c2ea005b-77db-9071-d6e2-1ac4f9995968.png)

elapsedは実行時間（秒）なので、１５分程度で学習が終了します。
EventEmitterですべてのイベントを取得する（ワイルドカード）

Node.jsのEventEmitterは便利なんですがすべてのイベントを取得できません。
何で実装していないのかよくわかりません。

[EventEmitter2](https://github.com/EventEmitter2/EventEmitter2)というEventEmitterを便利にしたものがありこれを使えば良いのですが、更新が止まっています...

頑張ればできるんじゃねと思って書いたら数分でできたのメモ的な意味を込めて記事にしてます。
↓
[WildEventEmitter](https://github.com/mouse484/WildEventEmitter)作りました、この記事の内容をモジュール化しただけなのでめんどいなって思った人がいたら使ってください.(tsだと型エラーうるさいのでやめたほうがいいです ~~いい方法教えて~~）

## コード
```js:index.js
// いつものEventEmitter
const EventEmitter = require("events");

// いつものEventEmitterを拡張
class ExtendEventEmitter extends EventEmitter {
    // emitされた内容を"*"に再emit
    emit(name, ...args) {
        return super.emit("*", name, ...args);
    }
}

// 拡張したEventEmitter
const event = new ExtendEventEmitter();

// ワイルドカードでイベントを受ける
event.on("*", (name, ...callback) => {
    console.log(`name: ${name} |`, ...callback);
});

/* emit */
event.emit("ready", "ready...");

event.emit("number", 1, 2, 3, 4);

event.emit("array", ["a", "b"]);

event.emit("object", { "abc": 123, "def": 456 });
```

## 結果
```js
name: ready  | ready...
name: number | 1 2 3 4
name: array  | [ 'a', 'b' ]
name: object | { abc: 123, def: 456 }
```
Python　配列のよく使う書き方まとめ（自分用）

主に自分用のまとめ。
競プロのためにPythonを始めたので、ちょくちょく忘れる内容をメモしておく。

#部分配列、部分文字列の書き方
基本的にはls[2:5]などのように後ろに範囲の指定をつける。
この場合は、lsの要素のうちindexが2以上5未満のが出力される。

```python
ls=[0,1,2,3,4,5,6,7,8,9]
subls_1=ls[2:8]
print(subls_1)
  #=> [2,3,4,5,6,7]
```

部分配列を何度か取る場合は、indexに注意する。（何度か失敗した）

```python
ls=[0,1,2,3,4,5,6,7,8,9]
subls_1=ls[2:8]
subls_2=ls[1:4]
print(subls_2)
  #=> [3,4,5]
```

どちらかの数字は省略できる。

```python
ls=[0,1,2,3,4,5,6,7,8,9]
subls_3=ls[:8]
print(subls_3)
  #=> [0,1,2,3,4,5,6,7]
subls_4=ls[2:]
print(subls_4)
  #=> [2,3,4,5,6,7,8,9]
```

2つおき、3つおきの要素を取り出すこともできる。
数字を省略する際、「:」に注意すること。

```python
ls=[0,1,2,3,4,5,6,7,8,9]
subls_5=ls[2:8:3]
print(subls_5)
  #=> [2,5]
subls_6=ls[::3]
print(subls_6)
  #=> [0,3,6,9]
```

#出力するときのまとめ

配列をスペース区切りで出力するときは、前に「*」をつける。

```python
ls=[0,1,2,3,4,5,6,7,8,9]
print(ls)
  #=> [0,1,2,3,4,5,6,7,8,9]
print(*ls)
  #=> 0 1 2 3 4 5 6 7 8 9
```

文字を出力するときなど、スペースが必要ないときには配列を結合してから出力する。
これはint型には使えないので注意すること。

```python
ls2=['a', 'b', 'c']
print(ls2)
  #=> ['a', 'b', 'c']
print("".join(ls2))
  #=> abc
```

（追記）　型を気にせず使える方法をコメントで教えていただきました。
ありがとうございます。

```python
ls=[0,1,2,3,4,5,6,7,8,9]
print(*ls, sep='')
  #=> 0123456789
```
★RPAで本気の挫折をせずに頑張れてきた事について★

IT未経験からRPAを初めて、本気の挫折をせずに頑張れてきた事について。



RPAの存在を知ったのは2017年の夏。
一般事務の仕事をしていた企業が「WinActer」のテスト導入をおこなっていた時期に、タイミングよく就業していた事がきっかけでした。

Excelのみの業務を自動化した時の「感動」「達成感」「将来性」を強く感じた事で、キャリアチェンジを決意。

どうしたら仕事に就けるのか？どんな知識が必要なのか？をかなり調べまして、運よく派遣としてRPA業務に潜入できました。

分からない事しかない状況で「IT知識もないVBAもほとんど分からないが、何故か「変数の意味は知っている(Excelの関数はきっちり使えるが、マクロは未経験状態)」という偏った状態でしたので、絶妙な部分で変な苦労がありました。

初めてRPAの仕事に就いた際に「同時期に着任した仲間」がいた事が、一番の大きな支えでした。
研修は最後まで終わらず、プロパーや先に着任している派遣さんからのコソコソ話は、どうした訳か「本人にはばっちり届いていました」
だからこそ「朝少し早く来て勉強する」ことに。

AAは日本語マニュアルがなかったのと、マニュアル系も外部持ち出し厳禁でしたので、

「覚えたら、手書きでノートに書く」
「手書きマニュアルを作る」

を実行しましたね、良い思い出です。


.。★1つ目の心の支え★。.

★一緒に頑張ろうとしてくれる仲間がいますか？
　社内外、ツールの違いや色々な違いはあれど「RPA」で繋がっている仲間がいるって素晴らしいです


◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆:christmas_tree:


自分は「感情で決断する事がある」を認めました。

１社目を辞めた理由は「感情」でした
どうしても許せない発言をされた事に、怒っています(まだ許していない)

2社目は、体調不良でした
3社目も若干の感情が入りました

もういろいろダメ人間なんですよ。

よく考えたら「１年で3回も職場が変わるとか馬鹿の極み」とは思います(今4社目。。。)
しかし、この経験はそんなに出来る事でもなく「3社もRPAのノウハウを持つ企業の経験を積めた」って事を、私は前向きに捉えています。
とても「濃厚」です。



.。★2つ目の心の支え★。.

★すべての経験を前向きに受け取ってみる、しかし改善すべき点には向き合おう。
それでもなんかしっくりこない時や、納得できない時は、自分の感覚に委ねていいと思う




◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆:snowman:◆◆◆◆◆◆◆◆◆

やっている事が、果たして誰かの役にたっているのだろうか？ただRobot作っていればいいのか？
成果物さえ提出が出来ていればOKなんだろうか？
RPAエンジニアの存在意義とは？

めちゃくちゃめんどくさい事を考えていた「負の時期」がありました。
※今も考えますが、、、

答えは「全てYES」です
様々な立場でRPAに関わる方と出会って思いました。

ある場所では「Robot作っていればいい:zap:」
ある場所では「成果物を出せばいい:mushroom:」
ある場所では「コミュニケーション取って仲良く:point_up:」
ある場所では「RPAなんてWW:tongue:」
ある場所では「助かりました:relaxed:」
ある場所では「すごい！！面白い！！:heart_eyes:」
ある場所では「ありがとう:kiss_mm:」
etc...


もうね「割り切り」
割り切っちゃうの！ズバッと！！
と心の中のレミさんが言うので(冗談です)そうしてます(え？)
(※しかし大人げないので、感情が先走ってしまうんですよね。。。)

「ビジネスとして区切る事」
「RPAはサービス業」

くらいの天と地の差がある思考的割り切りで、臨機応変に変化してゆく事が、自分のメンタルを守ります。
また、聞いてくれる同業者には「甘えて」ください。
そんな話を聞いたら「とりあえず聞いとく」の姿勢でGo！でいいです。
同じ悩みを共有すると、ひょんなことから解決策でてくる事があります。


.。★3つ目の心の支え★。.

★柔軟な割り切りは必須、しかし愚痴は吐き出そう
(心の中にレミさんを置いておくOR修三さん)



◆◆◆◆◆◆◆◆◆◆:christmas_tree:◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

その他にも
RPAの事を全く考えない日を確実に作る
お日様を浴びる
飲みまくる(笑)
等々


挫折しかけた時こそ、初心に戻ってみて欲しいなぁと思います。

今も「RPAに向いていないのに、なぜ執着してるのだ？」とか「もうRPAやめたら？」と自問自答はしてます。
きっと「現実」が見えてきている時期に、いろいろな方が到達してきているのかな？と、勝手に感じています。
RPA自体も幻滅期と言われていますし、ちょど良い時期ですので(年末だし)

心の大掃除と、気持ちをさっぱりさせて「可愛いRobotちゃん」を作り出す活力を養いましょう:relaxed:





おわり:writing_hand:
laravelのmigrateができなかったときのメモ

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the clientみたいなエラーを解決できたのでそのメモ。

とりあえずマイグレーションさえしてくれればよかったのでrootで動かしてみました。

```
mysql> select User, Host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```

rootユーザーの認証方式を**caching_sha2_password**から**mysql_native_password**へ変更したらマイグレーションできました。

```
alter user root@localhost identified with mysql_native_password by "secret";
```

```
mysql> select User, Host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
```
kintone ポータルアプリをスペースに移行する時の作業メモ

ポータルに作成したアプリをスペース内に移行する時の手順の覚書です。

# はじめに

ポータル直置きで作成してきたアプリを、スペースに入れたい時に行う手順です。
スペースに入れる理由は色々ありますが、例えば[スペース内検索](https://jp.cybozu.help/k/ja/user/search/search_details.html#%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E5%86%85%E6%A4%9C%E7%B4%A2)を行いたい場合があります。

スペース内検索では、[複数のキーワードで検索](https://jp.cybozu.help/k/ja/user/search/search_details.html#%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B)することができます。
ただし、検索できるキーワードは10件までで、条件はAND検索だけです。

# 想定する移行環境

* レコードは新規で移行する

# 基本の流れ

1. 移行元にてアプリをテンプレート化
2. 移行先スペースにてテンプレートからアプリ作成
3. 移行元にてデータ書き出し
4. 移行先にてデータ読み込み

# アプリ本体の移行

アプリ本体はテンプレートを利用します。

## 移行元にてアプリをテンプレート化

### 単体アプリの移行

1. kintoneシステム管理
2. アプリ→アプリテンプレート
3. 作成
4. アプリ検索→アプリ選択
5. テンプレ名入力
6. スペース選択（またはゲストスペース）
7. アプリを追加
8. 登録済みのテンプレートからアプリを作成
9. アプリを作成

* データはCSVで書き出し→読み込みます。
* １〜３の作業はアプリ管理者が行います。

# データの移行

移行元のアプリのデータが100MB以上の場合は、ファイルに書き出すことができないので注意してください。
[ファイルにデータを書き出す場合の注意](https://jp.cybozu.help/k/ja/user/app_collectdata/data_export.html#app_collectdata_data_export_10)
また、添付ファイルとコメントもファイルに書き出すことができません。

参考：
データが100MB以上の場合や添付ファイルの移行には、[cli-kintone](https://github.com/kintone/cli-kintone)が利用できます。

## ファイル書き出し

前準備として移行データ用の一覧を作成しておきます。
一覧にはテーブルを含む全てを指定しておきます。

1. 移行元アプリの一覧からファイルに書き出し
2. 移行先アプリにてファイルから読み込み

* 読み込む際には、[レコード番号]を読み込み対象から外してください。

## ファイル読み込み時の注意点

・移行先と移行元アプリのフィールドは同じにしておきます。
フィールド名が同じであっても、移行先がテーブルの場合は下記エラーで移行できません。
>GAIA_II03: アプリのテーブルにデータを読み込もうとしています。アプリのテーブルにデータを読み込む場合は、データの1列目にレコードの開始行を示す列が必要です。アプリのテーブルにデータを読み込まない場合は、アプリのテーブル内のフィールドに、読み込むファイルの列を指定しないでください。

・ドロップダウンなどの値選択フィールドは、移行先に同じ選択肢が無いとエラーで移行できません。
>GAIA_IL16: ファイルの2行目のフィールド「受注確度」の値に問題があります。フィールド「受注確度」に設定されている条件（必須項目にする、値の重複を禁止するなど）を確認して、ファイルの値を修正してください。ドロップダウンやラジオボタンの場合は、設定されている選択肢のいずれかと、ファイルの値が一致していることを確認してください。

 **移行先のアプリにルックアップフィールドが設定されている場合** 
・ルックアップ元のフィールドが重複禁止設定になっていないと移行できません。
　（読み込み時の選択肢に表示されません）


# その他

## 移行処理の権限について

・アプリのファイルの書き出しと読み込みの権限が必要です。
　ファイルの書き出しができるのは下記。
　・cybozu.com共通管理者
　・自分が作成したアプリ（アプリ作成権限付与）
　・書き出すアプリの設定のアプリ権限設定でファイルの書き出し、読み込みが付与されている

注意：
・アプリの作成権限は、kintoneシステム管理者がユーザーに対して、kintoneシステム管理→権限→アクセス権で付与します。
<img width="1202" alt="スクリーンショット 2019-11-29 7.39.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/5a91e560-9256-00fd-bae2-fb52653b0f68.png">
・作成されたアプリに対するユーザーの権限は、アプリ毎にアプリの作成者、cybozu.com共通管理者によるアプリの設定変更のアプリ権限から設定します。
<img width="1052" alt="スクリーンショット 2019-11-29 8.04.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4e0171c0-dc91-83ba-e13b-91e85d32140f.png">


## ルックアップの紐付けを解いて移行

後ほど

## 添付ファイルの移行

[cli-kintone](https://github.com/kintone/cli-kintone)を利用します。

* https://developer.cybozu.io/hc/ja/articles/202957070#step10

# 参考

- [入出力できるデータの一覧](https://jp.cybozu.help/k/ja/admin/other/import_export.html#appdata)
ec2-userをパスワード認証にする

公式に書いてある通りではうまくいかず
一味加える必要があったゾ…（PubkeyAuthentication no）

```
# #ec2-userにパスワードを設定する
# sudo passwd ec2-user

# #sshd_configをちょっといじる必要がある
# sudo vim /etc/ssh/sshd_config
-----------------------------------------------------------
PasswordAuthentication yes 	#パスワード認証を有効化
PubkeyAuthentication no 	#鍵認証を無効化
-----------------------------------------------------------

# #sshdを再起動しないと有効にならない
# sudo service sshd restart

# #リログして確かめるゾ～
# exit
```

#追記：↑を設定したEC2インスタンスのAMIに問題が…
そのAMIから起動したインスタンスがSSHログイン不能に ／(^o^)＼

とりあえずAMI化する際には

```
PubkeyAuthentication yes
```
に戻さねばという情けない状態…

今度時間あるときに詳しく調査ゾ…
M5Stackの中にpixelaの草を出現させる

[GMOペパボ Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/pepabo) 4日目の記事です。

昨日はudzuraさんの [ext4とoverlayfsのシステムコール速度の比較をしようとした - ローファイ日記](https://udzura.hatenablog.jp/entry/2019/12/03/191431) でした。

今日12/4は、第8回 Pepabo Maker Festival Tokyoという社内イベントが開催されており、そこに出品した作品（？）について書きます。

## M5Stackとpixela

この2つで遊ぶのは、技術書典6([技術書典6でM5Stackの本を頒布します | けんちゃんくんさんのWeb日記](https://diary.shu-cream.net/2019/04/05/m5stack-techbookfest-6.html))に続いて2回目で、どちらもとても好きなプロダクトです。

今回は、pixelaの草状況をM5Stack上に再現するというのをやってみました。

百聞は一見にしかずということで、こんなかんじです。7*7のマス目を表示し、そこにpixelaのAPIで取得した49日分のアクティビティを表示しています。

![M5Stackにpixelaの草が表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186836/99f6e560-6304-88d5-d743-759a8079f19e.jpeg)

## 開発環境について

M5Stack上で動作するプログラムの開発環境はいくつかありますが、今回は[UI Flow](http://flow.m5stack.com/)というWebブラウザ上で動く開発環境を利用しました。

UI Flowでは、Scratchのようなブロックを組み合わせて作るモードと、MicroPythonで記述するモードの2つが提供されています。この開発環境が素晴しいのは、それら2つをいつでもスイッチで切り替えられるようになっているところです。ブロックモードで組んだものがMicroPythonではどう表現されるのかを確認できるのがとても便利で、ざっくりとしたUIをブロックモードで組んでから、Pythonでロジックを作り込んでいくことで、思ったよりも早く動くものができたと感じています。

なお、「ブロックからMicroPython」への切り替えはうまくいきますが、「MicroPythonからブロック」は当然ながら表現できない場合もあるので、その場合はダイアログがでてから以前のブロックの状態に復元されます。

## コードについて

7*7のマス目を出す部分は、UI Flowにもある「Emoji」というモジュールをそのまま使いました。デモ映えするように、一定期間で草をリセットして描画しなおすようにループを作っています。

また、MicroPythonでの日付の演算方法がぱっとでてこなかったので、日付を文字列としてハードコードしてしまいました…今後の改善点とします…

```python
from m5stack import *
from m5ui import *
from uiflow import *
from emoji import Emoji

import json
import urequests
import utime

setScreenColor(0x222222)

pixela_token = 'YOUR_TOKEN'

dates = [
    "20191020",
    # ここにあと48日
]

emoji = Emoji(7, 7, 15, 9)

while True:
    for index in range(len(dates)):
        date = dates[index]

        try:
            res = urequests.request(method='GET', url='https://pixe.la/v1/users/kenchan/graphs/scrapbox-stats/' + date, headers={'X-USER-TOKEN':pixela_token})
            response = res.text
            status = res.status_code
        except:
            response = ''
            status = res.status_code

        if status == 200:
            quantity = int(json.loads(response)['quantity'])

            if quantity < 2:
                emoji.draw_square(int(index / 7), index % 7, 0xd6e685)
            elif quantity < 5:
                emoji.draw_square(int(index / 7), index % 7, 0x8cc665)
            elif quantity < 8:
                emoji.draw_square(int(index / 7), index % 7, 0x44a340)
            else:
                emoji.draw_square(int(index / 7), index % 7, 0x1e6823)
        else:
            emoji.draw_square(int(index / 7), index % 7, 0xffffff)


    utime.sleep(15)
    emoji.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]], 0xffffff)
```

## おわりに

M5Stack(UI Flow)とpixelaを組み合わせて、草を表示するガジェットをつくってみました。UI Flowという開発環境は、標準で提供されているUIコンポーネントが充実しているので、まずはブロックでためしてみて、凝ったところはMicroPythonで書きなおすという方法がよいと感じました。

この記事で興味をもった社内の人がいましたら、夜のPepabo Maker Festivalに見にきてください！
【Laravel】クエリビルダでWhere句にA OR (B AND C)を書く

使用する機会があり、メモ程度にまとめてみます。

#環境
PHP : 5.6.30
MySQL : 10.1.21
Laravel : 5.1.46

#テーブル
以下サンプルテーブルです。

| id | name | created_date | updated_date |
|:---|-----:|:------------:|:------------:|
| 1  | Suzuki Taro | 2019-01-01 12:00:00 |  2019-01-01 12:00:00 |
| 2  | Tanka Hanako | 2019-01-25 10:00:00 | 2019-01-29 12:00:00 |
| 3  | Takahashi Jiro | 2019-02-01 16:00:00 | 2019-02-01 16:00:00 |

#元のSQL
~~~sql
SELECT name FROM users
WHERE (created_date BETWEEN '2019-01-01 00:00:00' AND '2019-01-01 23:59:59'
OR (updated_date < '2019-02-01' AND id >= 1));
~~~

#クエリビルダでの書き方
~~~PHP
$test = Users::query()
   ->select('name')
   ->where(function ($query) {
                // created_dateが2019-01-01中
                $query->whereBetween('created_date', ['2019-01-01 00:00:00', '2019-01-01 23:59:59'])
                    // またはupdated_dateが2019-02-01より前、かつidが1以上
                    ->orWhere(function ($query) {
                        $query->where('updated_date', '<', '2019-02-01')
                            ->where('id', '>=', 1);
                    });
            })
~~~
Windows PCから疎通確認


# Windows PCから疎通確認

Windows PCからAWSのインスタンスの接続確認したかったので探してみたら、
PowerShellで良さげなコマンドを発見したので。今後も使いそうなのでメモ。

## Test-NetConnectionコマンド

Test-NetConnection IPAddress [-Traceroute] [-Port <Int>] [-InformationLevel <"Detailed"|"Quiet">]

### -Tracerouteオプション

宛先までの経路を確認する。
TraceRoute に経路情報が表示される。

```
PS C:\Users\xxxxxx> Test-NetConnection 10.194.8.234 -traceroute


ComputerName           : 10.194.8.234
RemoteAddress          : 10.194.8.234
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.2.134
PingSucceeded          : True
PingReplyDetails (RTT) : 18 ms
TraceRoute             : 192.168.2.1
                         10.194.8.234
```

### -Portオプション

指定したポート番号へ接続できるかを確認する。
TcpTestSucceeded に確認結果が表示される。

```
PS C:\Users\xxxxxx> Test-NetConnection 10.194.8.234 -Port 80

ComputerName     : 10.194.8.234
RemoteAddress    : 10.194.8.234
RemotePort       : 80
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.2.134
TcpTestSucceeded : True
```

### -InformationLevelオプション

結果の出力レベルを指定する。

詳細結果を表示

```
PS C:\Users\xxxxxx> Test-NetConnection 10.194.8.234 -Port 80 -InformationLevel Detailed


ComputerName            : 10.194.8.234
RemoteAddress           : 10.194.8.234
RemotePort              : 80
NameResolutionResults   : 10.194.8.234
MatchingIPsecRules      :
NetworkIsolationContext : Internet
IsAdmin                 : False
InterfaceAlias          : Wi-Fi
SourceAddress           : 192.168.2.134
NetRoute (NextHop)      : 192.168.2.1
TcpTestSucceeded        : True
```


ポートの接続可否のみ表示

```
PS C:\Users\xxxxxx> Test-NetConnection 10.194.8.234 -Port 80 -InformationLevel Quiet
True
```


## 参考元

https://docs.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection?view=win10-ps

https://4thsight.xyz/8268
Zscalerが動作している状態でのAndroid Studioのセットアップ(Build Gradleまで)

# 目的
Android Studioをインストールして、Build Gradleまで行う

# 環境
Windows10 64bit professional
Zscalerが動作している

# 手順

[通常の手順]
1. Android Studioの最新バージョンをDownloadします。
https://developer.android.com/studio/install?hl=ja
2. インストールします。
3. プロジェクトを作成します。
4. Build Gradleでを実行します。

以上で、基本は問題ないのですが、
Zscalerが邪魔をして、
4.の段階でエラーをだします。

```
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
```

なので、
4.を実行する前に異常の作業を追加します。

# 手順の追加

[参考]
https://sacha-k.github.io/2017/04/18/Android-Studio-behind-Zscaler.html

参考ページそって作業をおこないますが、
私の場合Android StudioでのProxyは必要ありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143249/c213faf1-65a3-8db1-32e7-2d0c54b2a961.png)


1.Zscaler　のCertificationをChromeからExportします。
2.Exportしたファイルを　Android Studioに登録します。
  File --> Tools --> Server Certification
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143249/23a7cdb2-4e5b-a5c4-e25b-8c8d07846a59.png)

3. PowerShellを管理者権限で起動します。
4. keytoolでZscalerをcacertsに登録する。

私が実行したコマンド(一部伏字)

```
PS C:\Program Files\Android\Android Studio\jre\bin> .\keytool.exe -import -alias Zscaler  -file 'C:\Users\*******\Downloads\zscaler.cer'  -keystore "C:\Program Files\Android\Android Studio\jre\jre\lib\security\cacerts"
```
Password : changeit

5.Android Studio 「File → Invalidate Caches/Restart...」を実行し、再起動する。
6.Android Studio にてBuild Gradleを実行して、Buildが成功すればOK



# 感想
こんなことに時間を取られる人が少しでもすくなくなりますように。
DockerのMySQLがエラーで起動できない

dockerで開発をしている際に、
`Could not write unix socket lock file /var/run/mysqld/mysqld.sock.lock`
といったエラーが出てMySQLが起動できなくなってしまったので、
その対処法をメモ。

エラーにある意味どおり、書き込みができないとあるので、
MySQLが正常に終了出来ずにlockが外れなかったのが原因かな？
とりあえずコンテナとイメージの削除をしてみる。

```
# コンテナとイメージを一括削除
$ docker container prune
$ docker image prune

# ビルドしてコンテナ立ち上げ
docker-compose up --build
```

なおった
イメージの容量が30GB超えてて驚いた
llコマンドを使えるようにするときの設定

よく忘れるのでメモ。

## .bashrcを開く

```console
$ sudo vim ~/.bashrc
```

ちなみにMacのzsh版なら以下の通りです。

```
$ echo $SHELL
/bin/zsh
```

```
$ sudo vim ~/.zshrc
```


## エイリアスを追加

```vim:.bashrc
alias ll='ls -lah'
```

## 反映させる

```console
$ source ~/.bashrc
```
rvestによるinvalid multibyte string at エラーの回避方法

# rvest最高!

と思って日本語のHPをスクレイピングし始めると、必ずぶち当たった

```
invalid multibyte string at '<ef>ｼ<8d>蛟<8d>'
```

このエラー。

特に、表を取得したい場合にこれが起こるとPythonの優位性（このようなエラーが自分の環境ではめったに生じない)を強く感じ、Pythonで仕方なく処理をすることも多々ありました。（PythonよりRのtidyverse環境のほうが好きなのです）

しかし、

[こんな記事](https://www.r-bloggers.com/web-scraping-and-invalid-multibyte-string/)を発見してその通りにやったらこれまで悩んでいたのが嘘のようにサクサク動いたのと、日本語でこの情報があまり出回っていない気がしたので、Qiitaの記事にしてみました。

## 解決法

**`rvest`でスクレイピングをする際に、次のようにするだけ**

```r
Sys.setlocale("LC_ALL", "English")

# rvest でスクレイピング！
# html_tableなどでスクレイプしたデータの変換等も実施

Sys.setlocale("LC_ALL", "Japanese")
```

こうすることで、問題なくスクレイピングとデータ変換ができました。
最後にJapaneseに戻しておかないと、スクレイプしたデータの日本語が文字化けしてしまうので
これは忘れずに。
（Windows環境で実施しているので、Macだと設定方法が違うかもしれません。ただ、考え方は、UTF-8を含むLocaleでないとrvestがおかしな挙動をするというところみたいです。）

Have a nice R life!