OmniAICreator/Qiita-1.07M huggingface dataset:
Archで無線が繋がらなかった時の自分用メモ

# 前提
- 環境: Macbook Air
- wifi-menuでnetcat用の設定ファイルを作成した．
- wpa_supplicantを使用．

# 方法
1. `# systemctl`で赤文字になっているnetcatだかdhcpだか@<設定ファイル名>.serviceを探す．
2. `# ip link`でインターフェイス名を確認し，`# ip link set <インターフェイス名> down`でダウン状態にする．
3. `# systemctl start netcatだかdhcpだか@<設定ファイル名>.service`で起動．
4. `# ping 8.8.8.8`で確認．繋がるはず．
Digdag の td_wait>: を Timeout させる

`td_wait>:` には Timeout させるようなオプションがないので自分で実装する必要がある。下記は TreasureData に問い合わせたときの回答。

> ｀td_wait>｀ には現状timeout機能がないため、設定に因るKILLは残念ながらできません。
（1タスクあたりの最大実行時間を24時間と設定しておりますため、24時間実行され続ける場合は自動的にKILL、エラーとなります）

> おっしゃる通りshなどのスクリプト系オペレーターが利用できるdigdagサーバーでは digdagコマンドや下記digdagのAPIから操作することでWorkflow自体のKILL対応は可能と思います。
https://github.com/treasure-data/digdag/blob/f225a5c89e10e802c3d2e41e3df62996f4aacc0f/digdag-client/src/main/java/io/digdag/client/DigdagClient.java

> ただその場合ポーリングされたTreasure DataのジョブはKILLされませんので、別途KILLするなども考慮頂く必要があるかもしれません。

ということで、下記のような感じで、 `sla` とシェルスクリプトを組み合わせて頑張った。

### Sample Workflow

60min を超えた場合に `session_id` を指定してタスクを kill するシェルを呼び出すワークフロー。

```yaml:sample_timeout.dig
sla:
  duration: 00:60:00
  fail: true
  +kill_task:
    sh>: /bin/sh kill_task.sh ${session_id}
```

### タスクを kill  するシェルスクリプト

[元ネタ](https://qiita.com/naoto_koyama/items/39eb09d81589f2d01752)を grep, xargs, cut とかを駆使してリファクタリングした結果こうなった。

```kill_task.sh
#!/bin/bash

set -e

session_id=$1
attempts=$(digdag attempts $session_id | grep -E "attempt id:|status" | xargs -L 2 | grep running | cut -d " " -f 3)
for attempt_id in $attempts; do
  digdag kill $attempt_id
  echo Killed the task. Attempt id is $attempt_id.
done

```
Googleスプレッドシートで別スプレッドシートのデータを参照する方法

Googleスプレッドシートで、別のスプレッドシートのデータを参照する方法をお伝えします。

　　
　
手順は以下になります。
　
①参照元ファイルのシートを表示し、スプレッドシートキーをコピー
②参照先ファイルのシートで、挿入するセルを指定
③ツールバーの関数→ウェブ→IMPORTRANGE を選択
④ =importrange(“スプレッドシートキー”,”シート名!セルの範囲”)

　
　
　
#### ①参照元ファイルのシートを表示し、スプレッドシートキーをコピー
参照したいデータがあるファイルのシートを開く
URLの  スプレッドシートキーをコピーする
https://docs.google.com/spreadsheets/d/スプレッドシートキー/〜
<img width="1073" alt="スクリーンショット 2019-06-26 11.39.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401818/11b062ef-5ac2-ba58-210d-1b924e7cf471.png">

　
　　
　　
#### ②参照先ファイルのシートで、挿入するセルを指定
#### ③ツールバーの関数→ウェブ→IMPORTRANGE を選択
　<img width="1236" alt="スクリーンショット 2019-06-26 11.42.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401818/cb1e31b4-9bcf-c55c-1d0a-b38e43d82bba.png">
　
　
　　
#### ④ =importrange(“スプレッドシートキー”,”シート名!セルの範囲”)
第1引数のスプレッドシートキーは先ほど①でコピーしたものを貼り付ける
第2引数はシート名の後に ! を付け、セルの範囲は A1 : G50  のように指定
※ A : G のような範囲指定も可
<img width="1020" alt="スクリーンショット 2019-06-26 11.45.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401818/71dbbb81-f780-254e-dec6-1b949b897a8a.png">
　
　
　
#### 完成!!
<img width="907" alt="スクリーンショット 2019-06-26 11.46.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401818/6f9f7f51-05c3-ad47-c21a-30c38d67d8b2.png">
　※参照されるのはデータのみで、色などは反映されない
GithubやGitlabのアカウント名はハイフンで終わってはいけない


大半の方は関係がない話になりますが、GithubやGitlabのアカウント名のお話です。タイトルの通りアカウント名がハイフンで終わる、例えば「ko-he-」というアカウントの場合、いろいろと不都合が出るのでやめましょうという内容です。

# 不都合その1：GithubでGithub Pagesを作る場合(多分Gitlabも)

Githubには静的なサイトを公開できる[Github Pages](https://pages.github.com/)という機能があります。この機能を

- ユーザー名: ko-he-
- リポジトリ名: testgithubpage

のリポジトリで使用すると`https://ko-he-.github.io/testgithubpage/`というURLで静的なサイトを公開できます。
しかしながらこのページにアクセスするとFirefoxからのアクセスでは

![dns.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/40f7db97-b8ed-e965-5352-80dc02d48064.png)

のように、「潜在的なセキュリティリスクあり」となってしまいます。

# 不都合その2：GitlabのDockerレジストリを使用する場合

GitlabはリポジトリのDockerレジストリが付いています。特にプライベートリポジトリでの開発の時はDocker Hubで公開するわけにはいかないためとても重宝するのですが、これを「ko-」というアカウントで利用すると、リポジトリからレジストリの画面に移動するときに

![dns2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/78c1b087-a0d0-2541-0d48-b4b54aa9976a.png)

のようにステータスコード500が返ってきて利用できません。

# 解決策と原因

解決策は基本的にはユーザ名を変更するしかありません。Github、Gitlabそれぞれ

- Github: https://github.com/settings/admin > Change Usernameをクリック
- Gitlab: https://gitlab.com/profile/account > Change usernameからUpdate

から変更できます。ただし、ユーザ名を変更する場合、リポジトリ名も変更されてしまうので注意が必要です。
それ以外であれば、適当なグループを作成して、その中でプロジェクトを作成し開発するという手もあります。

原因ははっきりとはわかりませんでしたが、不都合その1：GithubでGithub Pagesを作る場合の時に

![dns3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/565c299a-93a3-83ec-13d4-d9b0543871b9.png)

のように無効な証明書と判断されてしまっていることが怪しそうです。
もう少し調べると[ドメイン名のルール](https://www.nic.ad.jp/ja/dom/system.html)では「ラベルの先頭と末尾の文字をハイフンとするのは不可」となっているため今回の`ko-he-.github.io`はルール違反ということになります。
ということで、ここら辺が怪しいのですが、GitlabのDockerレジストリの場合とは直接的な関係はなさそうであり、結局原因ははっきりしませんでした。


# まとめ

アカウント名が「ko-he-」のように最後がハイフンだと起こる不具合を紹介しました。
ただし、Githubに関しては以前は「ko-he-」といったアカウントを作ることができたのですが、現在ではGithubではユーザ名にバリデーションをかけるようになっていて「ko-he-」のようなアカウントは作成できなくなっています。Gitlabに関してはこの記事執筆時点では作成可能だったので気を付けましょう。
DartでEnumの値を文字列で取得する

Flutterでアプリを作っていて、Enumの値をAPIに文字列として送りたいときに、こんな感じで関数用意しておくと便利という備忘録。

```dart
String enumValueToString(Object o) => o.toString().split('.').last;

T enumValueFromString<T>(String key, List<T> values) =>
    values.firstWhere((v) => key == enumValueToString(v), orElse: () => null);
```
リソースを持たない空のリソースグループを一括削除

#概要
　長期間にわたり多数の検証プロジェクトで利用していると Azure サブスクリプション内に、リソースを持たない空のリソースグループがゴミとして多数残ったりします。リソースグループの数が多い場合、それらを一つ一つ目視で確認して削除していくのはかなり面倒です。

#スクリプトによる一括削除
　以下の PowerShell スクリプトは、ログインしたユーザーが所有する全ての Azure サブスクリプションを列挙し、その中にあるリソースを持たない空のリソースグループを強制削除していくコード例となります。あくまでサンプルですので、**本スクリプトの使用は自己責任でお願いします。**

```powershell:remove-RG.ps1
# Azure へログインする
Login-AzureRmAccount

# サブスクリプションの列挙
$subscriptions = Get-AzureRmSubscription
foreach($subscription in $subscriptions)
{
    Select-AzureRmSubscription -SubscriptionID $subscription.Id

    # リソース一覧とリソースグループ一覧を取得する
    $resources = Get-AzureRmResource
    $resourceGroups = Get-AzureRmResourceGroup

    # 空のリソースグループ(リソースを持たないリソースグループ)を削除する
    foreach($resourceGroup in $resourceGroups)
    {
        # リソースを持っているかの判定
        $isEmptyResourceGroup = $TRUE;
        foreach($resource in $resources)
        {
            if($resource.ResourceGroupName -eq $resourceGroup.ResourceGroupName)
            {
                $isEmptyResourceGroup = $FALSE;
                break;
            }
        }

        # リソースを持っていない場合は削除
        if($isEmptyResourceGroup -eq $TRUE) 
        {
            $resourceGroup.ResourceGroupName
            Remove-AzureRmResourceGroup -ResourceGroupName $resourceGroup.ResourceGroupName -Force
            echo "*** Removed ***"
        }
    }
}
```
スラッシュ区切りの ユーザIDパスワード のパスワードを正規表現でマスクする

/ 区切りのパスワードをマスクする。でも / 区切りの日付はそのままにしたい。


```java:FindUserPassword.java
package playground;

public class FindUserPassword {

    public static void main(String[] args) {
        String str6 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest kf010 kfu0100.sh 10 1 249810";
        String str5 = "D:\\ap\\cp\\0100.bat  -id:249810 11 kf010 kfu0100.sh 10 1 249810";
        String str4 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest/ kf010 kfu0100.sh 10 1 249810";
        String str3 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest kf010 kfu0100.sh 10 1 249810";
        String str2 = "D:\\ap\\cp\\01.bat  -id:248669 1 20 12010033/19870420yt 0 tr010_bat -u cp 248669";
        String str = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 kf010 kfu0100.sh 10 1 249810";

        System.out.println("str2: " + str2);
        
        String[] commands = str2.split(" ");
        StringBuffer out = new StringBuffer();
        for (String command : commands) {
            //if ((command.indexOf("/") != command.lastIndexOf("/")) || (command.indexOf("/") < 0)) {
            if (command.matches("\\d{4}/\\d{2}/\\d{2}") || (command.indexOf("/") < 0)) {
                out.append(command).append(" ");
            } else {
                //out.append(command.replaceAll("/.+?", "/**********")).append(" ");

                int start = command.indexOf("/");
                String replacestr = command.substring(start+1);
                //out.append(command.replace(replacestr, "**********")).append(" ");
                out.append(command.replace(replacestr, "/**********")).append(" ");
            }
        }
        System.out.println(out);
    }

}

```

以下、試行錯誤中(str6 をどうにかしたい)

```java:FindUserPassword_renew.java
package playground;
public class FindUserPassword {
        String str6 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest kf010 kfu0100.sh 10 1 249810";
        String str5 = "D:\\ap\\cp\\0100.bat  -id:249810 11 kf010 kfu0100.sh 10 1 249810";
        String str4 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest/ kf010 kfu0100.sh 10 1 249810";
        String str3 = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 guest/guest kf010 kfu0100.sh 10 1 249810";
        String str2 = "D:\\ap\\cp\\01.bat  -id:248669 1 20 12010033/19870420yt 0 tr010_bat -u cp 248669";
        String str = "D:\\ap\\cp\\0100.bat  -id:249810 11 2019/05/24 kf010 kfu0100.sh 10 1 249810";

    public static void main(String[] args) {
        
        String[] commands = {str, str2, str3, str4, str5, str6}; 
        for (String command : commands) {
          if (!command.matches(".+\\d{4}/\\d{2}/\\d{2}.+")) {
            System.out.println(command.replaceAll("/.+? ", "/********** "));
          } else {
              System.out.println(command);
          }
        }

```
GItLab CIでユニットテストを自動実行＋カバレッジを出力してGitLab Pagesにホスティングする

自前で運用しているGitLab CE(Community Edition)で、Pipelineを利用して
LaravelアプリケーションのPHP Unitを自動で回す設定を作成した時のメモ

# PHP Unit設定

PHP Unitを実行した際に、カバレッジのデータがHTMLとして出力されるように、以下の設定を行う

```diff:phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
... 省略

+    <logging>
+        <log type="coverage-clover" target="public/coverage/logs/clover.xml"/>
+        <log type="coverage-html" target="public/coverage"/>
+    </logging>
</phpunit>

```

# GitLab CI設定

Gitリポジトリのルート配下に`.gitlab-ci.yml`を作成する。

```bash:.gitlab-ci.yml
# composerによって生成されるvendor配下をキャッシュする
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - vendor/

# Build and Test
php-7.2: &build
  image: php:7.2-cli-alpine
  variables:
    COMPOSER_VERSION: 1.8.6
  script:
    # 必要なライブラリをインストール
    - apk add git autoconf build-base
    - pecl install xdebug
    - docker-php-ext-install mysqli pdo pdo_mysql
    - docker-php-ext-enable xdebug
    - curl https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar > composer.phar
    - php composer.phar install
    # .envの作成
    - cp .env.example .env
    # ユニットテストの実行
    - vendor/bin/phpunit --configuration phpunit.xml --coverage-text --colors=never
  artifacts:
    paths:
      # 生成したカバレッジレポートを、次のjobで利用する
      - public/coverage

# 異なるPHPのバージョンを指定してジョブを回したい場合、
# 以下のように`build`アンカーを呼び出したうえで、別のalpineのimageを指定すればOK
php-7.1:
  <<: *build
  image: php:7.1-cli-alpine
  # 以下のようにすれば、composerのバージョンを指定できる
  variables:
    COMPOSER_VERSION: 1.6.5

# Unitテストのカバレッジを、Gitlab Pagesにホスティングする
pages:
  stage: deploy
  extends: php-7.2
  artifacts:
    paths:
      - public
  only:
    - develop
```
これで、GitLabのリモートリポジトリにgit pushすると自動でテストが走る。
以下のURLにアクセスすると、HTML出力したユニットテストのカバレッジが確認できる。
`http://{GitLabドメイン}/{プロジェクト名}/coverage/`

# 参考サイト

- [GitLab-CI/CDで複数環境でのテストを簡素に書く - Qiita](https://qiita.com/attakei/items/4d10b97510b88f59b5fa)
jQuery メモ

以下メモしてたやつです！追加してきます。

## DOM
- JavaScriptでhtmlの要素を操作するための仕組み
- jQueryの効果を効かせたいDOMを$('')でくくる。

## セレクタ
- $('#q1')　この中の#q1の部分
- idの場合は#,classの場合は.をつける。cssと一緒。

## メソッド
.〇〇()と書くもの
ex) .css('color', 'red')　対象となっているDOMのcolorをredに変える。

##.click();　
clickメソッドは()の中に関数を書くと指定した要素をクリックした後にその関数を実行するという処理をやってくれる。

## $(this)
超簡単に書くと、この記述の前に指定されたDOMを指定する。

## 関数の雛形
- function 関数名() { }
- 何回も同じ記述をする場合に面倒になるので、関数化するのは非常に重要

## fadeOut()
- fadeOutメソッドはフェードアウトするメソッド

## addClass()
対象のDOMにクラスを追加するメソッド。（引数のクラスに.をつけないので注意）

## animate
cssのプロパティを一定時間かけて変更するメソッド

## find()
指定されたDOM要素から引数に渡された要素を（ここではli）を取ってくるメソッド。

## index()　
その要素が何番目の要素か教えてくれるメソッド。慣れないと理解しづらいが、最初の要素をクリックすると0という値が返ってくるが、それは正常な挙動。

## console.log()　
chrome developer toolのconsoleのタブに引数の値が出力される。

## alert() 
引数の値をアラートとして表示する。

## hover()
- 引数が1つの場合、2つの場合で挙動が異なる少し特殊な関数
- hover(関数)の場合はhoverした場合に関数を実行する。
- hover(関数, 関数)の場合はhoverした後に第一引数の関数がhoverした時に実行され、hoverが離れた時に第二引数を実行する。
- もしスマートフォンでエミュレートしてる場合はhoverは実行されない。なぜならばスマートフォンにはhoverという概念はなく、touchstart, touchmove, touchendでイベントを設定する。

## data()
その要素のdata属性を取得もしくはセットするメソッド。
## .eq()
DOM要素の引数の値に等しい番号のDOMを指定する。

## .addClass()
クラスを追加します。

## .removeClass()
クラスを削除します。
M5Stack を Google Cloud IoT Core (MQTT) に接続してみる

M5Stack を Google Cloud IoT Core (MQTT) に接続してみたくて調べてみたメモです。

# M5Stack
[M5Stack](https://www.switch-science.com/catalog/3647/)
液晶付きマイコン で Wi-Fi や BLE や バッテリーが付いていて、Arduino環境で気軽に開発する事ができます。
千石電商 や スイッチサイエンス で購入できます。

# Google Cloud IoT Core (MQTT)
フルマネージド IoT サービス

- [ドキュメント](https://cloud.google.com/iot-core/?hl=ja)
- [Google Cloud Platform](https://console.cloud.google.com/?hl=ja&_ga=2.193910189.-1236670673.1561439481) で API を有効 にすると利用できるようになります。

# Visual Studio Code + PlatformIO IDE
Arduiono 開発環境はこの構成がおすすめです。自動補完や書き込み、シリアルコンソールの統合された環境で効率的に開発できます。
参考 [M5Stackの開発環境を整える - PlatformIO IDE編](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7)

---

# Google Cloud IoT Core (MQTT) 環境を整える
1. [Google Cloud Platform](https://console.cloud.google.com/?hl=ja&_ga=2.193910189.-1236670673.1561439481) で プロジェクトを作って IoT Core を有効にする
2. [Cloud SDK](https://cloud.google.com/sdk/docs/initializing?hl=ja) を参考にインストールする。
3. `gcloud init` を実行して 1 で作ったプロジェクトを指定する。
4. [gcloud ツールで Pub/Sub を行う](https://qiita.com/ekzemplaro/items/2c47beb962bee54b4609) を参考に topics と subscriptions を登録してみる。
5. [Cloud コンソール](https://console.cloud.google.com/iot/registries?hl=ja) で 登録されているか確認する。
6. `トピック　(topic_1) の削除` / `サブスクリプション (subscription_1) の削除` をしてみる。

ここまでの操作で gcloud ツール と Cloud コンソール で 一通りの MQTT動作確認ができた筈。

# Google Cloud IoT Core 設定
[Google Cloud IoT JWT](https://github.com/GoogleCloudPlatform/google-cloud-iot-arduino) を参考
- レジストリの作成
- デバイス登録

# M5Stack を Google Cloud IoT Core に接続する  

1. [M5Stackの開発環境を整える - PlatformIO IDE編](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7) を参考に環境を整える
2. PlatformIO HOME 画面から 新規プロジェクトを作り `lib` フォルダに [Google Cloud IoT JWT](https://github.com/GoogleCloudPlatform/google-cloud-iot-arduino) を配置する。
3. `examples/Esp32-lwmqtt` を参考にしてコードを書いてみる  

``` c++:Esp32-lwmqtt.ino
#include "esp32-mqtt.h"
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  setupCloudIoT();
}
void loop() {
...
}
```

``` c++:ciotc_config.h
const char *ssid = "SSID";
const char *password = "PASSWORD";

// Cloud iot details.
const char *project_id = "project-id";
const char *location = "us-central1";
const char *registry_id = "my-registry";
const char *device_id = "my-esp32-device";
...
const char *private_key_str = 
...
const char *root_cert =
...
```

`ciotc_config.h` に トピック や サブスクリプションの設定、 証明書の設定を行えば、接続できる筈です。
GitLabとHangouts Chatの連携

# GitLab RepositoryとHangouts Chatの連携
[Hangouts Chat service | GitLab](https://docs.gitlab.com/ee/user/project/integrations/hangouts_chat.html) の解説です。
## できること
GitLabは様々なサービスとの連携ができますが、Hangouts Chatも対象に含まれており、 
 GitLab上の以下のアクションに対する通知をHangouts Chatで受け取ることができます。

- Push
- Issue
    - created
    - updated
    - closed
- Confidential issue
    - created
    - updated
    - closed
- Merge request
    - created
    - updated
    - closed
- Note
- Confidential Note
- Tag Push
- Pipeline(brokenした場合のみの通知も可)
- Wiki page
    - created
    - updated


## Hangouts Chat の設定
1. GitLabからの通知を受け取りたいチャットルームを開きます
2. チャットルームメニュー（画面上部のメンバー数を出している所の▼）より  
   「Webhookを設定」を選びます
3. 「別のWebhookを追加」をクリックし、適当な名前を入力して、  
   「保存」をクリックします
4. 作成されたWebhookのURLを、URLコピー用ボタンで取得します

## GitLab の設定
1. 通知設定を行いたいGitLabのプロジェクトを開きます
2. 左のメニューより「設定」→「Integrations]を開きます
3. 「Project services」より、「Hangouts Chat」を開きます
4. 「Active」にチェックを入れ、「Trigger」より、通知したい対象を選択します
5. 「Webhook」にHangOut Chatの設定の際にコピーしたURLを入力します  
   「Notify only broken pipelines」と「Notify only default branch」は任意で選択してください
6. 「Test settings and save changes」をクリックします。  
    同時に、Hangouts Chatのチャットルーム側にテスト通知が届きます。
後置ifについて！

#後置ifについて
本日は後置ifを使うことのメリットやデメリットを考えてみたいと思います！

<h2>後置ifとは、、、</h2>
>最後のendを省略してif文を処理の後方に配置する書き方です。
elsif, elseにあたる条件分岐が無く、かつ処理が一行で完結する場合に用います。

少しでも短く、且つ分かりやすいコードで誰がみても理解できるコードを目指す私にとっては、是非とも使いこなしたい書き方です！

<h2>通常if文と後置if文の比較です↓↓</h2>

```app/controllers/tweets_controller.rb
 #通常のif表記
  def destroy
    tweet = Tweet.find(params[:id])
    if tweet.user_id == current_user.id
      tweet.destroy
    end
  end

 #後置if表記
  def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy if tweet.user_id == current_user.id
  end
```

#考えられるメリット・デメリット

<h2>メリット</h2>
- 文字の分量的には通常表記と後置表記の大差は無いですが、endが一つ無くなったことで少しスッキリして可読性がUPします！
- 通常表記時のifで始まった時のendが後置時は不要なのでつけ忘れ防止→うっかりエラー回避にも役立ってくれそうです！

<h2>デメリット</h2>
- 条件文が長くなった際（elseやelsifがある際）は使用できません。
- 処理が一行で完結できる場合にしか使用できません。

#結果
使える場面はそんなに多く無い感じがしましたが、短いif文では積極的に使っていきたいと思います！
４日目：FLOCSSとBEMを混ぜること、その他（初学）

#本日の業務での学び
・CSS設計において、FLOCSSとBEMを混ぜ合わせることについて　←メイン
・pタグの中に入れたaタグを、親要素いっぱいいっぱいにする方法

今日は作業中心だったため少なめです。

##CSS設計において、FLOCSSとBEMを混ぜ合わせることについて
まず二つについておさらい。

###FLOCSS
 -Foundation
   　初期化やタイポグラフィなどの土台作り

 -Layout
     サイドバーやメインコンテンツエリアなどのブロックのスタイルを定義（接頭辞l-)

 -Object
     ・Component    再利用できるパターン(接頭辞c-)
     ・Project      プロジェクト固有のパターン(接頭辞p-)
     ・utility      わずかな調整などのお助けクラス(接頭辞u-)

```HTML
<header class="p-headBlock">  /*FLOCKSS例*/
   <div class="p-wrapper">
      <div class="c-btn">
      </div>
   <div>
<header>
```

フロックスは、
**再利用性:無限大**
**保守性　:かなり低**
の印象を受けた。

###BEM
 -Block     塊（もっといい表現が思いつかない)

 -Element   Blockを構成する要素。

 -Modifier  blockまたはelementのバリエーション違い

自分の勤め先では、mindBEMdingの命名規則通り、
**block__Element--modifier**で記述する。

```HTML
<header class="headBlock">  /*BEM*/
   <div class="headBlock__wrapper">
      <div class="headBlock__wrapper__btn--ok">
      </div>
   </div>
</header>
```
ベムはは、
**再利用性:どん底**
**保守性　:超高**
の印象を受けた。

###FLOCSSとBEMのキメラ？
実務では、命名規則：BEM中心
　　　　 設計思想:FLOCSS中心でいいとこ取りをするらしい。
→一体どういうこと？？

解）BEMのBLOCK ＝FLOCSSのELEMENTとして扱う。
**小さなBEMの部品がいっぱい集まってるイメージ！（多分）**
例を見ていきます。

```HTML
<header class="l-headerBlock">
   <div class="p-headBlock__wrapper">
      <div class="c-btn--ok"><div>
      <div class="c-btn--no"><div>
   </div>
</header>
```
この例では、再利用したいボタン部分をBLOCK = ELEMENTと見做すことで、
再利用が可能になっている。（.l-headerBlock外、.p-headBlock__wrapper外でも使用可）
そしてBEM表記によってクラスのダブりが起きにくい&どれがどの入れ子かわかりやすい。


まぜこぜにすることで、BEM表記部分は繋がりがわかりやすい&CSSで指定が被りにくいし、
FLOCSS設計によって、再利用やユーティリティの恩恵にあずかることができる！
パチパチ。
##pタグの中に入れたaタグを、親要素いっぱいいっぱいにする方法
~~そんなことできるのでしょうか。~~ できました。

```HTML
<!-- HTML -->
<p class="memory">
   <a class="memory__link">こちら</a>
   <p class="memory__txt">記憶を飛ばしたいかたはこちら</p>
</p>
```

```CSS
/*CSS*/
.memory {
   position: relative;
   width: 100px;
   height: 100px;
}
.memory__link {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 0;
   z-index: 2; /*親タグにもよるが、スマホ版で押しにくくなる対策*/
}
```
こうすると、親タグごとクリックすることができます！
どうしても親タグをaタグにして、要素を入れ子にできない時に効果的です。

今日は以上！
Webで游ゴシックをiPhoneやAndroidで表示できない？表示するには？

日本語の中でも美しいフォントとされる「游ゴシック体」、略して「游ゴ」。「遊ゴシック」と書かれている時もありますね。
Webデザイナーにも評判のサンセリフフォントの一つです。

先日弊社のデザイナーと共に女性向けメディアを作成する際、
游ゴシック体を使用したサイトの作成を行いました。

PCのインスペクターモードで一通りの確認をパスし、
実機確認に移ったところデザイナーから...

**「iPhone、Android　両実機でフォントが違いま〜す」**

あれ？
CSSで正しい `font-family` を設定したのになぁ...

という事があり、どうやったらスマホで游ゴシック体がきちんと出せるのか調べてみました。

## Windows&Macではきちんと出せる「游ゴシック体」

游ゴシック体は「Windows」、「OSX」の２大PC向けOSにプリインストールされています。
両OS間には、デフォルトの `font-weight: 400`　
で表示されるフォントの太さに違いがあるという頭を悩ませる問題があるものの
フォント自体は下のCSSで表示する事ができます。

``` CSS
html, body {
  font-family: "游ゴシック体", YuGothic, "游ゴシック", "Yu Gothic";
}
```


## AndroidやiPhoneにはプリインストールされていない「游ゴシック体」

「OSX」や「Windows」でプリインストールされているなら
「Android」や「iOS」でも...
と思いたいですが
残念ながらこの**２大スマホOSには游ゴシック体がインストールされていません。**

OSXに入っているのにどうしてiOSに入っていないのかは謎です。

ですので、上記のCSSだけでは全てのスマートフォンで游ゴシック体を出すのは不可能です。


## スマホで「游ゴシック体」を使うには有料のWebフォントを使用する

では、どうすればいいのかというと

https://www.realtype.jp/
から**有料のWebフォントとして游ゴシック体を使うのが現実的**です。
フォント一覧ページから「游ゴシック体」で検索すると使用できるのが確認できます。
**値段は月500円〜1000円**です。

事実、游ゴシック体を作成している字游工房様のサイトも
上のサイトのAPIを経由してフォントを表示していました。
http://www.jiyu-kobo.co.jp/

導入は HTMLに

``` HTML
<!-- XXXXXの部分に自分のID。YYYYYの部分に落としてきたい日本語(絞り込まないと時間がかかる) -->
<style type="text/css" id="RT_ID_YuGothicPr6NM">@font-face {font-family:'YuGothicPr6NM';src:url("http://api.realtype.jp/1/font?id=XXXXX&name=YuGothicPr6NM&text=YYYYY&type=woff&format=woff");}</style>
```

CSSに

``` CSS
html, body {
  font-family: 'YuGothicPr6NM';
}
```

という形で実装ができます。
詳しくはRealtype様のドキュメントを確認してください。


## まとめ

Windows、OSXの両PC向けOSで游ゴシック体がデフォルトで使えるようになったのもここ数年の出来事の為か、
「游ゴシックがWebサイトでも使える！とってもハッピー！」といった記事や
最初に記したCSSで表示が出来ると唄っている記事をたくさん見かけます。

が、**最近のWebサイトの閲覧者はほとんどがスマホからの流入**です。

游ゴシック体を使った美しいデザインも
正しくスマホで表示出来るようしていなければ大半のユーザーに届きません。

**Webフォントを使うための月々のコスト**、**Webフォントが適用されるまでのチラツキや遅延**
など考えることも多いですが、正しく「游ゴシック体」を使ったサイトが増えていくといいと思います。
TECH ~Day3~

学習三日目を終え、やはり新しく覚える用語も難しくなってきたように感じます。
前回から引き続きrubyのレビュー管理アプリケーションの開発カリキュラムを行いました。
後半部分に入りましたが新たな壁にぶつかり、スムーズには進まなくなってきました。

学習内容
・if文、条件分岐（elsif）
・to_iメソッド
・メソッドの定義方法
・繰り返し処理（while）
・配列オブジェクト、<<メソッド

・if文、条件分岐（elsif）
条件分岐を行う際、rubyではifを使用する。
ifは条件式を書き、その条件式が正か負かで処理を行う。（エクセルの時と同じ）
　
　書き方
　if 条件式1　ther
   #この部分は、上の条件式1が真の場合の実行処理を書く
　elsif 条件式２　ther
   #条件式１が偽の場合かつ、
   #条件式２が真の場合の実行処理
  else
   #ここは条件式１と２どちらも偽の場合の実行処理
  end ←最後はendで閉じる


・to_iメソッド
文字列オブジェクトにこの「to_i」を使うと、その文字列を数値オブジェクトに変換することができる。

書き方
　string = "30"←これは文字列の30
　number = string.to_i←数値の30に変換
　puts number + 20←数値の３０に変換後の30と計算されるためこの結果は50になる


・メソッドの定義方法(def)
defでメソッドを定義しておくことで、定義後にメソッド名を打ち込んだ際に簡単にそのメソッドで処理された状態の文書を出すことができる。

書き方
  def メソッド名
    #この部分に実行する処理を書く
  end

!defの横に書いた文字がメソッド名になる。メソッド名は自分で好きにつけることができるが小文字英語から始まり、単語と単語を繋げる時は、「＿」で繋げる。


・繰り返し処理（while）
書き方
  while 条件式　do
   #ここに実行処理を記入
  end

whileは条件式の部分で繰り返し処理を行うのか決める。
条件式が真の場合はすっと処理を続けることになる。


・配列オブジェクト、<<メソッド
様々なデータを入れて管理できるオブジェクトである。
配列オブジェクトに入れられたデータを要素という。
要素は順番を持ち、最初に書いた要素から順番がつく。

書き方
　配列オブジェクト = [an,in,on] ←配列をする時は大括弧

配列オブジェクトに新たにデータを追加するためのメソッドを「<<メソッドという」

書き方
  pencil_case = [an,in,on]
  pemcil_case << "en" ←これによって追加される。

この後に出てくる「引数」というのが個人的に今も理解に苦しんでいて、時間を取られています。妥協せず引き続き気合いを入れて学習したいと思います。
「Gemfile」は「gemfile」じゃだめだよ！

タイトル通り、Gemfileの「G」は大文字じゃないとデプロイの際、エラーになります。
僕は「gemfile」のファイル名のままデプロイして12時間ハマりました。
僕みたいにハマる方がこれ以上生まれないよう、念のため共有しておきます。


ふと新しいwebアプリケーションを作りたいと思い、以下の記事にしたがってrails newしました。
https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26

ただ、以下の記事で説明されているように、gemを--path vendor/bundle配下で管理する必要は別にないかもしれないです。
https://qiita.com/jnchito/items/99b1dbea1767a5095d85

原因はわかりませんがrails newして新しいrailsアプリを作成した時になぜかファイル名が「Gemfile」ではなく「gemfile」（先頭の文字が小文字のg）になっていました。
多分、自分が何かおかしいことをやったんだと思います。

その状態でリモートリポジトリにpush、Herokuにデプロイして、https://×××××.herokuapp.comにアクセスするとエラーが発生しています。

![heroku-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441198/7647a4e1-8946-71e3-a22e-dd7087405373.png)

heroku使っている人なら一度は見たことがあるであろうおなじみの画面ですよね！
そこで試しにheroku run rails cをしてみると

```
Traceback (most recent call last):
	4: from /app/bin/rails:3:in `<main>'
	3: from /app/bin/rails:3:in `load'
	2: from /app/bin/spring:8:in `<top (required)>'
	1: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- bundler (LoadError)
```
bundlerがないと怒られてます。

HerokuダッシュボードのSettingsを見てみると

<img width="514" alt="mosaic.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441198/23b04cfa-7da1-6683-f7f8-a929f35154c5.jpeg">

RailsアプリをデプロイしたのにFrameworkがNode.jsになっています。
HerokuのBuildpacksを見てみると、RailsでWebpackerを利用するために必要なNode.jsのbuildpackしか使われていないことが分かります。

<img width="816" alt="スクリーンショット 2019-06-25 16.31.27.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441198/296b830b-474c-eda9-ab07-9dec091dcc06.jpeg">

肝心なrubyのbuildpackがないため、rubyのbuildpackを追加してもう一度Herokuへデプロイしてみました。

```
remote: -----> Build succeeded!
remote:  !     This app may not specify any way to start a node process
remote:        https://devcenter.heroku.com/articles/nodejs-support#default-web-process-type
remote: 
remote: -----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/ruby.tgz
remote:        More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to ×××××××××××××.
remote: 
To https://git.heroku.com/×××××××××××××.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/×××××××××××××.git'
```
なぜかデプロイできない！！！

ここからが長かった。。。
buildpackについて調べたり、bundlerについて調べたり色々したけど、
結局、原因は「Gemfile」のファイル名が「gemfile」と先頭の「g」がなぜか小文字になっていることが原因でした。

https://devcenter.heroku.com/articles/buildpacks#detection-failure
上記URL先に「アプリケーションのルートフォルダにGemfileがないといけない」と記載されていますが、まさか小文字の「gemfile」だと正しく読み込んでくれないとは気づかなかったです。ってかなんで小文字の「gemfile」になってたんだ...

どこかの記事に「エラーで長時間詰まるときは大体単純なミスが多い」と書いてあったのを読んだことがありますが、今回はまさにそれでした。

今回みたいになぜかファイル名が小文字で「gemfile」となっているようなことが他の方に起こることはほぼないと思いますが、一応投稿して共有させて頂きました。
All About ACS: ACS 日本語処理関連のRFE

[IBM i Access Client Solutionsで出来ないことと改善要望](http://qiita.com/6onoda/items/68192b2288026bd41b4b)で、機能の改善・拡張を Request for Enhancement (RFE) で IBM に要求できることを紹介しました。
ACS 日本語環境/DBCS処理特有のFREを紹介します。

機能拡張に同意される方は、IBM IDでアクセスして「VOTE」して下さい。

**2020-04-24 記載: ここで紹介した3件はバグで動かないものもありますが、機能としては取り入れられました。皆さんも ACS の仕様に不満がある場合、積極的に RFE 申請とお互いの VOTE をお願いします。**

**2021-02-26 記載: 4 件目 5250 の円入力の動きを戻す RFE を掲載しました。**

**2021-03-18 記載: 5250 の円入力の動きを戻す RFE は Declined されました。5 件目 HCP の 5250 セッションへの RFE を掲載しました。**

#### 日本語ホストコードページの5250で、円記号とバックスラッシュを使い分けたい
http://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=132374
今は日本語ホストコードページでは、強制的に円記号に寄せられてしまいます。Qshやpaseでバックスラッシュを使い場合に困りますよね。

2020-02-26 追記 **STATUS が Planned for Future Release に変更されました**
2020-04-24 追記 **1.1.8.4 で実装されました。**「[IBM i Access Client Solutions 1.1.8.4 利用可能](https://qiita.com/6onoda/items/da7ebe142204142b55a7)」

### PDT印刷で外字を印刷したい
https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=130267
Shift_JISにない1399で拡張した文字はPDTで印刷できるようになりましたが、まだ、外字は印刷できません。

2020-04-24 追記 **1.1.8.4 で実装されたことになっていますが、まだ、正常稼働しません。**「[IBM i Access Client Solutions 1.1.8.4 利用可能](https://qiita.com/6onoda/items/da7ebe142204142b55a7)」

### データ転送(アップロード)であふれた文字をカットする時に0E/0Fの整合性を取ってほしい
http://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=123954
今はバイト数で強制カットのため、0E/0Fの整合性が崩れる場合があります。
これでは、あふれた文字のカット機能は、実質 DBCS環境では使えません。

2020-02-26 追記 **1.1.8.2 で実装されたとのことです**

>As of version 1.1.8.2 released May 2019, setting the property:
com.ibm.iaccess.dataxfer.jdbc.AllowCharacterTruncation=true
...should preserve the shift characters during an upload.
>
>Please retry your scenario with version 1.1.8.2 or later.   Let us know if this meets the requirement.

### 5250 で「¥」キーを入力したときに、円記号が入力されるように戻してほしい

https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=147602

「[1.1.8.4 以降の 5250 で円を入力したのにバックスラッシュが入る](https://qiita.com/6onoda/items/7633f5811cb656e60dee)」の記事のように 5250 画面での「¥」キーの入力が円記号からバックスラッシュに変更されました。
もとの動きに戻してほしいという RFE です。

2021-03-18 追記

RFE は残念ながら「Declined」されていました。

> Thank you for submitting your Request For Enhancement.  We understand the issue.   As you know, RFE 132374  requested the current behavior which also matches the behavior of other Windows applications.  Unfortunately, the only solution we have to offer is to remap the keyboard so it produces the expected character.

### 5250 セッションにホストコードページを表示したい

https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=148562

HCP 930/939/1399、自分がどの HCP の 5250 セッションなのが表示してほしいという RFE です。
「Uncommitted Candidate」になっています。

***
2020-02-26 RFE132374、RFE123954の状況を追記
2020-04-24 1.1.8.4 ですべての RFE が受け入れられたことを記載
2021-02-26 4 件目 5250 の円入力の動きを戻す RFE を掲載
2021-03-18 5250 の円入力の動きを戻す RFE が Declined されたことを追記
2021-03-18 5 件目 HCP の 5250 セッションへの RFE を掲載   
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
Nuxtでビルド時にAPIを静的化して、完全にサーバーへのリクエストをなくすト

ビルド時にAPIを静的化するジェネレータを自作しましたので、ご紹介です。（コード有りです。）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Nuxtのジェネレータを自作中...。<br><br>・Airtableでマークダウン<br>・Nuxtビルド時にJSON生成<br>・link rel=&quot;prefetch&quot;にjson追加<br>・ルート生成<br>・コンポーネントからは/_nuxt/xxx.jsonにリクエスト<br><br>って感じで出来たんだけど、爆速なんだが！ <a href="https://t.co/DvJL5hucGq">pic.twitter.com/DvJL5hucGq</a></p>&mdash; 新田聡一郎 (@soichiro_nitta) <a href="https://twitter.com/soichiro_nitta/status/1094890389532635137?ref_src=twsrc%5Etfw">2019年2月11日</a></blockquote>

最近はやりのヘッドレスCMSをやっていこうと思ったのですが、APIのリクエスト制限きびしいんですよね...。

現状だとNuxtは静的generateモードでも、ページ遷移時にリクエストが発生してしまうので、完全に静的化してしまう必要がありました。

以下のような流れになります。

- Nuxtビルド時にJSONを生成
- `<link rel="prefetch">` にJSONを追加
- ルート生成
- コンポーネントからは `/_nuxt/articles/xxx.json` にリクエスト

（`<link rel="prefetch">` の指定で、生成したJSONは前もって準備するようにしています。）

ジェネレータの中身は以下。

``` modules/generator.js
import axios from 'axios'

module.exports = function generateModule(moduleOptions) {
  this.nuxt.hook('build:before', async ({ app }) => {

    // 全データを取得
    const { data } = await axios.get('/hogehoge')
    const posts = data

    // JSONを生成
    this.options.build.plugins.push({
      apply(compiler) {
        compiler.plugin('emit', (compilation, cb) => {
          posts.forEach(post => {
            compilation.assets[`articles/${post.slug}.json`] = {
              source: () => JSON.stringify(post),
              size: () => {}
            }
          })
          cb()
        })
      }
    })

    // link rel="prefetch"にJSONを追加
    const url = this.options.dev ? '' : 'https://xxx'
    this.options.head.link = [
      ...this.options.head.link,
      ...posts.map(post => ({
        rel: 'prefetch',
        href: `${url}/_nuxt/articles/${post.slug}.json`
      }))
    ]

    if (this.options.dev) return

    // ルート生成
    this.options.generate.routes = posts.map(post => `/${post.slug}`)
  })
}
```

こんな感じにモジュールを書いて、`nuxt.config.js` で設定します。

```nuxt.config.js
module.exports = {
  // ジェネレータ内で開発orプロダクションの書き分けに使用しています
  dev: process.env.NODE_ENV !== 'production',

  // モジュールを指定
  modules: ['~/modules/generator'],

  ...
}
```

コンポーネントからは以下のようにデータを取得します。

```pages/_id.vue
<script>
export default {
  async asyncData({ app, params }) {
    const url = process.env.NODE_ENV === 'development' ? '' : 'https://xxx'
    const { data } = await app.$axios.get(
      `${url}/_nuxt/articles/${params.id}.json`
    )
    return { article: data }
  }
}
</script>
```

これで表示・遷移時ともにサーバーへデータ取得のリクエストを送らずにすむようになりました😙

こちらの情報を参考にさせていただきました。
[Firebase、Flamelink、Nuxt、Netlify、PWAを使ってJAMstackなブログを作る](https://qiita.com/miyaoka/items/9774f0250953da419a58)
【Rails】html.erbでの記述

##画像
railsで扱う画像は [app-assets-images] がルートとなる

```
<%= image_tag 'icon/hogehoge.png' %>
```

##テキストリンク

<%= link_to "リンク名","リンクパス" %>

```
<%= link_to "ホーム",root_path %>
```
##テキストリンク内にHTMLタグを入れる

```xxx.html.erb
<%= link_to root_path  do %>ホーム<span>HOME</span><% end %>
```

```xxx.html
<a href="/">ホーム<span>HOME</span></a>
```

##画像リンク

```
<%= link_to image_tag('shop_images/hogehoge.png'),'/areas/hogehoge' %>
```

##クラス/id 属性を追加する

```
<%= link_to 'トップページ', root_path, class: "top-large", id: "top" %>
```


##CSSを読み込む
すべて読み込む呪文

※["\x83" on UTF-8]のエラーが出たことがあったが、cssではなく下記の通りjavascriptが影響していた

```app/views/layouts/application.html.erb
<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
```
###aタグをhoverしたときの修正
rails で動作させたとき、リンクをhoverバックカラーが黒になるのをデフォルトに戻す

```hogehoge.css
a:hover{
  background-color: transparent;
}
```
参考：https://qiita.com/yukiji/items/3c43f8f6d54c561df3fd

##Javascriptを読み込む
すべて読み込む呪文

```app/views/layouts/application.html.erb
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
```

[Encoding::InvalidByteSequenceError]["\x83" on UTF-8]のエラーが出ることがあるが、jsファイルの文字コードのエラーなので、utf-8で保存しなおすとエラーを回避できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/c7571590-0178-4bc1-dfe9-984b2c3d1555.png)


##HTMLの一部をテンプレート化する
ヘッダーやフッターなど共通するHtmlを外部化したいシーンは多々ありますよね。
###共通部分のファイルを作成
保存場所：app/views/shared
ファイル名：_temp.html.erb
※テンプレート化する場合はアンダーバーを前に付ける

###呼び出したい場所で以下の呪文を唱える
<%= render 'ディレクトリ名/部分テンプレート名' %>

```
<%= render 'shared/temp' %>
```
AWS AuroraをMySQL Workbenchでいじる

###はじめに
AWS上のAmazon Aurora（MySQL）を

MySQL Workbenchで外からいじってみました。


###Amazon Auroraとは
- AWSが提供しているフルマネージドなデータベースサービス。
- 可用性99.99％
 - 最低でも3つのAZにデータを6個複製、継続的にAmazon S3にバックアップ
- MySQL、PostgreSQL互換
- いろいろ自動でやってくれる（プロビジョニングとかバックアップとか）
- ストレージが６４TBまで自動で増える。
- Aurora Serverlessを使えばインスタンスの性能まで自動で管理してくれる。

詳しくはこちら
[Amazon Aurora](https://aws.amazon.com/jp/rds/aurora/)

###データベースのセットアップ
AWSコンソールのRDSからいきます。

データベースの作成からAmazonAuroraを選択します。
エディションはMySQLです。

接続のところの追加の接続設定で「パブリックアクセス可能」を「あり」にします
これをしないとVPC外から接続できません。
あと付与するセキュリティグループでインスタンスのポートに接続可能にしておくのも忘れずに（デフォルトだと3306）
他の設定は適当で大丈夫です。

![スクリーンショット 2019-06-25 14.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/c2d233fb-d08c-93d7-0e2a-47997eead527.png)


作成できたらエンドポイントをメモっておいてください。

![スクリーンショット 2019-06-25 14.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/526115b4-45d2-e74d-c6e3-a7cc808e0d58.png)

####MySQL Workbenchを起動

起動したら下の矢印の＋ボタンを押します。

<img width="1136" alt="スクリーンショット 2019-06-25 14.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/e34650f2-70a9-d78f-9144-cf1aeb7672e8.png">

そしたらこの画面が出てくるので先程のエンドポイントとユーザー名、パスワードを入力してOKを押します。

<img width="912" alt="スクリーンショット 2019-06-25 15.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/3e951659-626b-afb7-8491-35fcb14e0a5f.png">

#####スキーマの作成
接続できたらこんな画面
左上のアイコンをクリックするとスキーマが作成できます。

<img width="1508" alt="スクリーンショット 2019-06-25 15.09.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/b908fa0f-0783-4990-6920-0368b55299d5.png">


#####テーブルの作成
適当にスキーマを作成したら
今度はテーブルを作成します。
右隣のボタンです。

<img width="1508" alt="スクリーンショット 2019-06-25 15.10.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/b4b97fbc-8eca-fbe3-6c93-50f3d667f35d.png">

PKとかNNとかなんやっておもったら右下のStorageってところに書いてありました。

PrimaryKeyとかの設定ですね。

#####データ挿入

テーブルが作れたらデータの挿入です

左側のテーブル名のところにカーソルを当てると表っぽいアイコンが出てきてそれをクリックするとテーブルの中身が見えます。
真ん中らへんのEditのところでいろいろ挿入したり削除したりできます。
変更したら右下のApplyで実際のコマンドとして入力するとテーブルが更新されます。

<img width="1508" alt="スクリーンショット 2019-06-25 15.35.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344683/3146a05a-b3c8-ccf3-54b1-ce26bf6f1c63.png">


コマンドで表を操作したり、GUI上でポチポチとテーブルを操作したりできます。
すぐに反映された結果のテーブルが見えるので便利です。


###まとめ

Amazon AuroraをGUIのMySQLクライアントから触ってみました。
いろいろ機能が豊富そうなので研究しがいがありそうです
networkxのランダム有向グラフの生成

あるエッジリストをもとにランダムな有向グラフを生成したいです。

```python
import networkx as nx

G = nx.read_edgelist(path, create_using=nx.DiGraph())#自己ループも多重辺も存在しない。
```

ここで生成するランダム有向グラフの条件として
・Gのノード数と一致する
・GのノードのIn、Outの次数を保存している
・自己ループは存在して良いが多重辺は存在してはならない。よってGのエッジの数を保存している。

```python
A = nx.directed_configuration_model(in_degree_sequence, 
                out_degree_sequence=, create_using=nx.DiGraph())
```

上のコードを用い、ランダムグラフを生成しました。
この関数は普通、MultiDiGraphを返します。そのためDiGraphと指定しました。
しかし、この関数は、指定したグラフを生成するわけではなく、MultiDiGraphを生成した後にそれをDiGraphに直しているようです。
~~そのためノード数は一致しますが次数とエッジ数がGとは異なるランダム有向グラフを生成してしまいました。~~
ノード数が１００万個レベルの大きいデータを扱っている時重複してしまうエッジの数は全体のエッジ数に対して０.5％にも満たないほど小さかったため、グラフの解析において大きな影響を与えないと考えました。
GHCiでHaskellデバッグ チートシート

最近すごいH本でHaskellの勉強を始めたKekehoです。
関数型言語を学ぶのは初めてで、なかなか挙動がスッと理解できないことも多く困っていました。

そんな時、GHCiで簡単にデバッグができてしまうと知ったので記事にしておきます。
まだ勉強中で正しい表現ができているか不安です…おかしいところあればご指摘いただけたら嬉しいです。

もっと詳細に知りたい場合は、以下のリンクがわかりやすかったので読んでみてください。
参考: [GHCiデバッガ](http://www.kotha.net/ghcguide_ja/7.0.4/ghci-debugger.html)


# `:break` ブレークポイントの設置
基本的には指定した行の一番左の部分式にブレークポイントが置かれるようです。
モジュール名が省略された場合、直前にロードされたモジュールとなるようです。

```haskell:ブレークポイントの設置
:break [関数名]  -- 関数を定義した行にブレークポイントを設置
:break [行番号] -- 直前にロードしたモジュールのn行目に設置
:break [行番号] [列番号] -- n行目のm文字目に設置
:break [モジュール名] [行番号]  -- モジュール名の指定も可能(上の3つのように指定しないと、直前にロードされたモジュールになる)
:break [モジュール名] [行番号] [列番号]
```


# `breaks` ブレークポイント一覧
ブレークポイント一覧が表示されます。

```haskell:ブレークポイント一覧
:show breaks
```


# `:step` ステップ実行
ブレークポイントで停止した後、ステップ実行することができます。

```haskell:ステップ実行
:step  -- 普通にプログラム内でステップ実行
:steplocal  -- 現在の関数内でステップ実行
:stepmodule  -- 現在のモジュール内でステップ実行
```


# `:continue` ステップ実行を抜けてプログラムを続ける

```haskell:continue
:continue
```


# ステップ実行中に式を評価する
他の言語で言うところの、変数の中身を見るって感じです。「式を評価する」という表現が適切なのかよくわかりません。指摘お願いします。
ステップ実行中に、普通にその場で式を書けば評価された値が表示されます。

```haskell:式を評価
[式]  -- 評価された値が表示される
:t [式] -- 型の情報
```
他にも代入とかいろいろできます。


# `:list` 現在のブレークポイント周辺のコードを表示

```haskell:周辺のコードを見る
:list
```

# `-fbreak-on-exception` 例外が投げられたら止まる
Exceptionが投げられたらそこで評価が止まり、自動的にステップ実行に入ります。
`:trace`などと併用すると便利です。

```haskell:例外で止める
:set -fbreak-on-exception  -- 例外が発生したら止める
:set -fbreak-on-error  -- 例外が補足されなかった場合にのみ止める
```

# `:trace` 追跡実行
式を追跡付きで評価できます。

```haskell:トレース
:trace [式]

-- 実行後
:hist  -- 履歴一覧
:back -- 履歴を前にさかのぼって調査
:forward -- 履歴をさかのぼっている最中、次に進む
```
知識ゼロから学ぶ ソフトウェアテスト(3章 ブラックボックステスト① 同値分割法)

知識整理のために投稿しています。
本は `知識ゼロから学ぶ ソフトウェアテスト[改訂版]`です。
テストってなかなか書けない。

## ソフトウェアテストは簡単で楽しい
- 4つの振る舞いをテストするだけでほとんどのバグを発見できる
  1. 入力
  2. 出力
  3. 計算
  4. 保存
- 基本さえ理解できれば、あとは応用するだけ
  - テスト業界の技術進歩は遅い

- ブラックボックステスト
  - 様々な入力を行うことにより、ソースコードを利用せずに(見ずに)テストを行う手法

## 同値分割法
入力領域を「同値クラス」という部分集合に分割し、その部分集合に入る入力値を等価と見なす

(例) 
入力A：1~999まで入力可能
入力B：同上
入力C：A*B

### 非常に強いテストケース
| |A|B| |
|:--:|:--:|:--:|:--:|
|⑤ |  500 | 500 | 有効同値 |
|② |  -20 | -20 | 無効同値 |
|⑩ |   -5 |1100 | 無効同値 |
|⑥ |    0 | 500 | 無効同値 |
|③ |  500 |   0 | 無効同値 |
|⑧ |  550 |1100 | 無効同値 |
|⑦ | 1050 | 600 | 無効同値 |
|⑨ | 1100 |1100 | 無効同値 |
|④ | 1500 |  -5 | 無効同値 |
|① |    0 |   0 | 無効同値 |

### テストケースをうまく減らす
無効同値のテストケースが増えてしまう傾向にある
いつでも全部やるのは厳しいので、テストケースを減らすことを考える

**案1**

| |A|B| |
|:--:|:--:|:--:|:--:|
|⑤ |  500 | 500 | 有効同値 |
|② |  -20 | -20 | 無効同値 |
|⑨ | 1100 |1100 | 無効同値 |
|① |    0 |   0 | 無効同値 |
⑨が④⑦⑧⑩をカバー、
②が③④⑥⑩をカバーしている


**案2**

| |A|B| |
|:--:|:--:|:--:|:--:|
|⑤ |  500 | 500 | 有効同値 |
|⑩ |   -5 |1100 | 無効同値 |
|④ | 1500 |  -5 | 無効同値 |
|① |    0 |   0 | 無効同値 |
④が②③⑦⑨をカバー、
⑩が②⑥⑧⑨をカバーしている
Digdagのscheduleとrequireの関係

Digdag Release 0.9.37 で確認。

## TL;DR
* requireオペレータを安易に利用していたらsession_timeが競合して死んだ
* session_timeとschedule設定の仕様を正しく理解しましょう
* 公式ドキュメントは読みましょう

## 何が起こったか
1日1回ずつ動かしたい2つのワークフロー[A.dig/B.dig]から共通のdigファイル[C.dig]をrequireする設計で運用を開始。
が、  **なぜか片方だけが動作していない…。** 
それぞれのdigファイルの中身はこんな感じ。

```digdag:A.dig
schedule:
  daily>: 08:30:00
  skip_on_overtime: true
  skip_delayed_by: 1s

~~

+require-C:
  require>: C.dig
```

```digdag:B.dig
schedule:
  daily>: 18:00:00
  skip_on_overtime: true
  skip_delayed_by: 1s

~~

+require-C:
  require>: C.dig
```

```digdag:C.dig
+main:
  sh>: hoge.sh
```

## 原因は何だったか
A.dig、B.digともにdailyオプションでschedule指定をしていたため、**session_timeが両者ともに00:00:00** となっていた。
**requireは親となるワークフローのsession_timeで子ワークフローを起動する** ため、C.digが同一のsession_timeで2回呼び出されることとなり、時系列順で後の処理が不発となっていた。


## 挙動をまとめてみる
* scheduleのパラメータについて  
ドキュメントにはちゃんと書いてあります。が、完全に見逃していました。  
session_timeが00:00:00(または00:00)となる挙動は、dailyだけでなくhourly/weekly/monthlyオプションでも同様です。  
https://docs.digdag.io/scheduling_workflow.html?highlight=minutes_interval#setting-up-a-schedule  

> When you use hourly, daily, weekly or monthly, a session time may not be same with actual run time.
The session time is actual run day’s 00:00:00 (in case hourly, hour’s 00:00).  

* requireについて  
requireの際にデフォルトで子ワークフローに自分のsession_timeを渡す挙動についてはドキュメント中に確認できませんでした。  
下記のワークフローを用意して検証します。

| workflow_name | schedule |
|:--|:--|:--|
| Parent1 | hourly>: 10:00 |
| Parent2 | hourly>: 15:00 |
| Parent3 | cron>: 20 * * * * |
| Parent4 | minutes_interval>: 11 |
| Child1 | N/A |
| Child2 | hourly>: 40:00 |
| Child3 | cron>: 45 * * * * |
| Child4 | minutes_interval>: 13 |

各Childは自身のsession_timeを出力するだけのワークフロー。
各Parentが全ての各Childをrequireしています。
結果が以下。（mm:ssのみ記載）

| workflow_name | itself | required by Parent1 | required by Parent2 | required by Parent3 | required by Parent4 |
|:--|:--|:--|:--|:--|:--|
| Child1 | N/A | 00:00 | 00:00 | 20:00 | 11*N:00 |
| Child2 | 00:00 | 00:00 | 00:00 | 20:00 | 11*N:00 |
| Child3 | 45:00 | 00:00 | 00:00 | 20:00 | 11*N:00 |
| Child4 | 13*N:00 | 00:00 | 00:00 | 20:00 | 11*N:00 |

やはり親のsession_timeが使われるようです。

補足1) Child2についてはParent1(またはParent2)が同一session_timeで先に起動してしまうため、Child2自身のスケジュールで起動することはありません。
補足2) Parent4とChild4は00:00のsession_timeが競合します。cron記法に則り00:00がスケジュールの起点となるため。

* callについて  
callオペレータを使った場合も親のsession_timeに準じますが、親のサブタスクとなるのでそのsession_timeで子ワークフローが実行されたという記録は残りません。
また、公式ドキュメントにもあるように多重実行制御は行われません。


## 解決
多重実行制御してくれる便利なrequire！callの上位互換！という誤った認識を改めcallオペレータに置き換えました。
またはcronパラメータに置き換えてもいいはずです。むしろ最初からcronパラメータだけを使うのが安全かもしれません。
さらなる解法としてrequire時にsession_timeをオプションとして明示的に渡す方法もあります。
多重実行制御を行いたい、かつhourly等のパラメータを使いたいという場合は工夫が必要でしょう。そんなケースは思い当たりませんが。

## 参考
Digdagのrequireオペレーターの挙動
https://qiita.com/shiozaki/items/b3aaff926b7b601b4f86 参考にさせていただきました。

公式ドキュメントがもうちょっと充実してくれるといいなー。
AWS Well-Architected Framework ホワイトペーパーまとめ 4 【信頼性】

## はじめに
クラウドならではの強みである自動化をうまく活用・管理することで、より信頼性の高いアーキテクチャを設計することができます。

#### 連載目次
[AWS Well-Architected Framework ホワイトペーパーまとめ 1 【導入編】](https://qiita.com/Catetin0310/items/6e5bd6cb573aa38f0fc0)
[AWS Well-Architected Framework ホワイトペーパーまとめ 2 【運用上の優秀性】](https://qiita.com/Catetin0310/items/179f9c587a6b8b540a8a)
[AWS Well-Architected Framework ホワイトペーパーまとめ 3 【セキュリティ】](https://qiita.com/Catetin0310/items/08e1c4843cc5571cd3a5)
AWS Well-Architected Framework ホワイトペーパーまとめ 4 【信頼性】 → 本記事
[AWS Well-Architected Framework ホワイトペーパーまとめ 5 【パフォーマンス効率】](https://qiita.com/Catetin0310/items/12837377ab2d1c8f6c77)
[AWS Well-Architected Framework ホワイトペーパーまとめ 6 【コスト最適化】](https://qiita.com/Catetin0310/items/cc57d8018a3392dd9f73)

## 設計原則とベストプラクティス
設計原則と、ベストプラクティスに紐づくチェック項目を見てみましょう。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/9bf86a44-8988-c185-3adc-09c76f8a2900.jpeg)

管理やモニタリングなど、セキュリティの柱と共通する文言が並びます。セキュリティが高い状態でないと、信頼性の高いアーキテクチャは設計できないませんね。ベストプラクティスの概要を抜き出してみます。

|-|概要|
|:--------------|:--------------|
|***基盤***|信頼性に影響を与える基盤を整える|
|***変更管理***|変更がシステムに与える影響を把握し、変更があった場合にどうするか、事前に計画を作成できる状態にする|
|***障害管理***|論理エラーおよび物理エラーの両方から確実に復旧できる状態にする|


## 候補サービス一覧
この柱のベースとなるサービスは、CloudWatchです。
下記のような構成が基本となります。

- IAMを中心にセキュリティに守られた基盤を構築
- CloudWatchなどで変更ログをトラッキング
- Auto Scalingで必要に応じてリソースをスケール
- 障害が起こった時のためにCloudFormationでテンプレを作成、ストレージにバックアップ

他のマネージドサービスも入れて、一覧表にしてみます。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/81350265-dccb-251f-44e5-730f8bcda19f.jpeg)


## まとめ
信頼性の高いアーキテクチャを設計するうえで留意しなくてはいけないポイントと、活用するサービスの概要、つかめましたでしょうか？次回はパフォーマンス効率の柱についてお送りします！

## 参考リンク
[オフィシャル W-Aホワイトペーパー](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)
Binaryモードでファイルをひらく


## ファイルをひらいてみた

VBAでファイルを開いたり閉じたりしてました。
過去のソースを参考にしながら。

そうすると、こんなコードが。

```vb
      aaaa = "0001"
      
      Open path For Binary As #1
        Put #1, 3, aaa
      Close
```

...Binaryってなに？
調べてみて「Forなんとか」のなんとかってMODEのことだったんだ、と初めて知る。

発見した↑のコードはバイナリモードなんだって。

こういうことらしい。

```vb
Open PathName For Mode [Access Access] [Lock] AS #FileNmber [Len=RecLength]
```



バイナリモードとは
2進数のデータを読み込むモードみたい。 

テキストファイル以外のファイルを開いたり閉じたりするときに使うんだって。




ちなみにPutステートメントの第2引数なにもの？と思ったんだけど、
（以下、MSリファレンスより）


```vb
Put [ # ] filenumber, [ recnumber ], varname
```


|                            |説明     |
|:----------------------|:-----------------------------|
|filenumb                   |必須です。 任意の有効なファイル番号です。| 
|recnumber	            |省略可能。 Variant (Long)。 書込みを開始するレコード番号 (Random モードのファイル) またはバイト番号(Binary モードのファイル) です。 | 
|varname	            |必須。 ディスクに書き込むデータを格納している変数の名前です。| 


余計わからん。
レコード番号ってなんぞ。


おしまい。
Google Apps Scriptでよく使うスプレッドシート操作

# Google Apps Scriptでスプレッドシートを操作する時
* 更新があれば増やしていく

## スプレッドシートを取得

```javascript
function getSpreadSheet() {
  var spreadsheet = SpreadsheetApp.openById('スプレッドシートのキー');
  return spreadsheet;
}
```

## スプレッドシート内のシート数を取得
```javascript
function getNumSheets() {
  var bk = SpreadsheetApp.getActiveSpreadsheet();
  var sh_cnt = bk.getNumSheets();
  return sh_cnt;
}
```

## シート内のセルの値を取得

```javascript
function readValue(spreadsheet) {
  // ２枚目のシート
  var sheet = spreadsheet.getSheets()[1];
  var last_row = sheet.getLastRow();

　// A1からAの最終行まで
  var range = sheet.getRange(1, 1, last_row);
  // 配列で取得
  return range.getValues();
}
```

## スプレッドシート名を取得

```javascript
function getSheetName() {
  var sheet = spreadsheet.getSheets()[1];
  return sheet.getSheetName()();
}
```


## シート内のセルに書き込み

```javascript
function writeValue() {
  // A2に書き込み getRange（列, 行）
  sheet.getRange(1, 2).setValue('書き込みたい値');
}
```
Railsでのsqliteの基本操作


##超基本操作

###--コンソールの起動--
```
$ rails dbconsole
``` 

###--テーブルの確認--
```
sqlite> .tables
```
###--スキーマの確認--
```
sqlite> .schema
```

###--文字列を検索

```コンソール
sqlite>　select * from lists where address like '京都府%';
```

###--項目に予約語を使ってしまった場合のSQL

```
select * from wards where "order"=13;
```

##テーブル(model付き)の作成-----

###--1.コマンドを実行(モデル名は頭大文字の単数形）

```
$ rails generate model Shop url:string name:string price:string surl:string area:string service:string copy:string comment:string time:string tel:string
```

###--2.マイグレーション

```
rake db:migrate
```

##テーブルのカラムの追加・削除
rails g migrationでファイルを作成して、rails db:migration でDBに反映させる流れ

###--カラムの追加--
rails g migration[Addカラム名Toテーブル名] [カラム名:型]
※Addの後のカラム名とテーブル名の表記に注意
※カラム名にしてはいけないワード[img]

```
$ rails g migration AddSurlToLists surl:string
$ rake db:migrate
```

###---カラムの変更--
都道府県テーブル(prefectures)の地域カラム(area)をintegerからstringに変更する

マイグレーションファイルを作成する

```
$rails g migration change_prefectures_area_string
```

マイグレーションファイルを編集する

```20190724_change_prefectures_area_string.rb
class ChangePrefecturesAreaString < ActiveRecord::Migration[5.0]
  def change
    change_column :prefectures, :area, :string
  end
end
```

反映させる

```
$ rails db:migrate
```


###---カラムの削除--

```
$ rails g migration RemoveAreaFromLists area:int
$ rake db:migrate
```


###---テーブル削除-----

####マイグレーションファイルの作成
テーブルを削除するためのマイグレーションファイルを作成する。

```
$ rails generate migration reviews
```

####マイグレーションファイル編集
消したいテーブルを指定する

```
class DeleteRocords < ActiveRecord::Migration[5.1]
  def change
    drop_table :reviews
  end
end
```

下記のコマンドを叩くと、データベースから削除される。

```
$ rails db:migrate
```

##データ型について

| 型 | 説明|
|:-----------------|:------------------:|
|string|字列
|text	|改行を含む長い文字列
|integer|	整数
|float	|浮動小数
|decimal|	精度の高い小数
|datetime|	日時
|timestamp	|より細かい日時
|time	|時間
|date	|日付
|binary	|バイナリデータ
|boolean	|Boolean型


##csvをテーブルにインポートする
別記事：https://qiita.com/ai_qiita/items/479e77dde88655930c83
Vue.jsでオブジェクトのネストしたプロパティーにアクセスできないとき

以下のようなオブジェクトがありまして、この中のmembersの値を取得したかったのですが、、、

```javascript

  var data = {
    [50]: {
      members: {
        0: {
          id: "4",
          name: "谷裏"
        },
        
        1: {
          is: "5",
          name: "眉村"
        },
        length: 2
      },
      facilities: "プール"
    },
  }
```

通常であれば以下のようなコードで取得できるはずなのですが

```javascript
console.log(data[50].members.length);
```

一向に取れず、、、

自分の書き方がおかしいのか？っと調べてみてもあっている様子、、、
いちいちビルドし直すと時間がかかるので、ブラウザ上で簡単にコードを試したりすることができる

https://playcode.io/

でコードがあっているか試してみたところ、間違っていない様子、、、

っと思って改めて調べたところ

以下の記事と同じ現象であることが確認できました
https://codeday.me/jp/qa/20190403/539522.html


##[ネストしたプロパテイーにアクセスする方法]
この記事に書いてあることは、データのロードが完了するのを待ちなさいとのことでした。

データを取得している場所にフラグのようなものを立てて、ロード完了後表示してデータを取得しなさいということでした！
WebStorm Live Editの使い方

本稿では、WebStormをはじめとしたJetBrains製IDEの機能であるLive Editについて紹介する。

## 本稿で知れること

1. Live Editとはどんな機能か？
2. Live Editの使い方
3. Live Editが動かないときの対処法

## Live Editとは

Live Editとは、HTMLやCSS、JavaScriptファイルの更新を検知して、ブラウザに即座に反映する機能で、WebStormやPhpStormをはじめとしたJetBrains製IDEに搭載されている。

![2019-06-25 15.27.48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/86ac1d89-74c8-371b-4fec-e13dcdb092a6.gif)


### どういうときに便利か？

HTMLやCSSをいじっていて頻繁にブラウザをリロードしなければならないときに、Live Editを使うと、IDEとブラウザを行ったり来たりしなくて済む。

## Live Editの使い方

Live EditしたいHTMLファイルを右クリックし、「Debug」をクリックする。

<img width="985" alt="webstorm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/df4df648-1182-6bd2-f801-3d84090dac9b.png">

するとブラウザが立ち上がる。

これで、ファイルを書き換えて保存したタイミングで、変更がブラウザに反映されるようになる。

## トラブルシューティング

### Live Editが動作しないとき

#### LiveEditプラグインが有効になっているか？

Preferences→Pluginsで「LiveEdit」プラグインがインストールされていて、かつ、有効になっているか確認する。

#### Live Editの設定が正しいか？

「Preferences」→「Build, Execution, Deployment」→「Debugger」→「Live Edit」の「Update application in Chrome on changes in...」にチェックが入っているか確認する。

<img width="819" alt="Preferences.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/842d2414-c18a-e179-0e32-5b6bd5a2cbe9.png">