OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2、Cloud9、Laravel5.7環境でide-helperをインストール

# 環境
Amazon Linux EC2 t2.micro
Laravel Framework 5.7.22
PHP 7.2.13
Apache 2.4.37
mysql 5.7.23

#ide-helperのインストール

コマンドなどは　[[Laravel] IDEによるコード補完まとめ](https://qiita.com/PruneMazui/items/74034913bcd4af7a4eaf)　を参考にさせていただきました。

~~~
$ composer require --dev barryvdh/laravel-ide-helper
~~~

###失敗

Cannot allocate memoryが発生

~~~
mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 569384960) (tried to allocate 16777224 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/RuleSet.php on line 83

Fatal error: Out of memory (allocated 569384960) (tried to allocate 16777224 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/RuleSet.php on line 83
~~~

###対処

かなり時間を使ってしまいました。もともとphp.iniの設定で2Gも割り当てていたし、過去にスワップファイルを設定していたので、なんでメモリ割当ができないのか謎でした。
一旦、下記のように対処しました。[※以前の手順を参考](https://qiita.com/outase/items/09634f8d5c42a860b312#create-project%E3%82%92%E5%AE%9F%E8%A1%8C)

~~~ /etc/php.ini
memory_limit = -1
~~~

~~~ 
# apache再起動
$ sudo systemctl restart httpd

#確認
$ php -r 'phpinfo();' | grep memory_limit

memory_limit => 512M => 512M
~~~

~~~
# スワップファイルの作成
$ sudo -s /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

$ sudo -s /sbin/mkswap /var/swap.1
$ sudo -s /sbin/swapon /var/swap.1
~~~

###成功しました

念のためcomposerをupdate。

~~~
$ composer update

Package manifest generated successfully.
~~~

~~~
$ composer require --dev barryvdh/laravel-ide-helper

Package manifest generated successfully.
~~~


###後から

よく考えたら、スワップファイルは一時的であるような気がしました。
確認してみたら、やっぱりスワップファイル作成後＆作業完了時点ですが、スワップファイルの割当がされています。

~~~
$ sudo vmstat

#スワップファイル作成前
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 625124      0  85640    0    0    17     6   33  168  0  0 100  0  0


#スワップファイル作成後&作業完了後
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 115200 656136      0 146036    0    1    33    17   47  186  0  0 100  0  0
~~~

#補完ファイルの作成

### app/config/app.phpのservice providerの箇所に追記

~~~config/app.php
'providers' => array(
    // ↓ 下記を追記 ↓
    'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', 
),
~~~

### Facade の補完

IDEに読み込ませるとFacadeのコード補完ができるようになるみたい。

~~~
$ php artisan ide-helper:generate
A new helper file was written to _ide_helper.php
~~~

### modelプロパティーの補完

仕組み的には doctrine/dbal を使い実際にデータベースにアクセスして各テーブルのカラムを判別しコードに落としているらしい。

~~~
$ php artisan ide-helper:model

Do you want to overwrite the existing model files? Choose no to write to _ide_helper_models.php instead? (yes/no) [no]:
 > 何も指定しない
 
Model information was written to _ide_helper_models.php
~~~

### 設定できたのでこれからがしがし活用していきたい。

#本当はPHP Stormを使ってみたい

[ここで紹介](https://uzulla.hateblo.jp/entry/2014/12/22/044120)されているような機能を使えたら嬉しいので、今後要検討。
画像ジェネレータ？っぽいサイトをNuxt.js(SSR) +Firebaseで作ってみる

画像ジェネレータ？みたいなサイトをよく見かけてて
どういう風にしたら作れるのか気になっていた
[こちらの記事](https://qiita.com/serinuntius/items/3017fb6ef51cd47352f6)読んだら素人でもできんじゃね？と思ってこういうものをつくった


### 概要

- 動的な画像生成の簡単な方法を試した
- 生成された画像をFirebaseに保存した
- OGP用のメタタグを設定して生成した画像をTwitter Cardsに登録できるようにした

### 実際にやったこと

かいつまんで…

#### 画像を動的に生成する

クライアント側で画像を生成する方法、なんか楽できないか考えたところ
とりあえず[dom-to-image](https://github.com/tsayen/dom-to-image)というライブラリがあったので使ってみた
これを使うと指定したDOMを画像として吐き出してくれる

雰囲気こんな感じ

```vue
<template>
  <div>
    <target-component ref="target"/>
  </div>
</template>
<script>
import domtoimage from "dom-to-image";
export default {
  //中略
  methods: {
    async submit() {
      const el = this.$refs.target.$el;
      const options = {
        type: "dataURL"
      };
      const output = await domtoimage.toPng(el, { height: 370, width: 370 });
      await this.upload(output);
    },
    async upload(data) {//////}
}
</script>
```

こういう感じで吐き出される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331758/27cd630d-f6d2-79b7-804c-8b1996867397.png)


dom-to-imageだとWebフォントがうまくとってこれないなど
見たままのDOMを生成することはできない
また、クライアントの環境に仕上がりがめちゃくちゃ左右される
ここで生成するのはTwitter Cardsに貼り付けるためだけの画像なので
割り切ることにした

#### 動的に生成された画像をどこかに保管する

Firebaseに保存することにした

```js:~/plugins/firebase.js
import firebase from "firebase";
const config = {
  //呪文
};
if (!firebase.apps.length) {
  firebase.initializeApp(config);
}
export default firebase
```

本体

```vue
<script>
import firebase from "~/plugins/firebase";

export default {

  methods: {
    async upload(data) {
      const db = firebase.firestore();
      const sRef = firebase.storage().ref();
      const name = "test"
      const fileRef = sRef.child(`${name}.png`);
      fileRef
        .putString(data, "data_url")
        .then(ss => {
          const card = db.collection("example").doc(name);
          return card.set(
            {
              message: this.forms
            },
            { merge: false }
          );
        })
        .then(docRef => {
        })
        .catch(err => {
        });
  }
}
</script>
```

めちゃめちゃ簡単だった
え、ほんとにこれでいいのか？

#### OGP用にタグを設定する

コードでやることはmetaタグをheadに書くだけ

```vue
<script>

export default {
  head() {
    return {
      meta: [//中略]
    }
  }
</script>
```

Herokuを使うことにしたので、Heroku用にSSRの設定を書く

```:~/Procfile
web: npm run start
```

nuxtにも、SSRの設定をしとく

```js:nuxt.config.js
module.exports = {
  mode: 'universal'
}
```

### できたもの

わーいTwitter Cardsが表示された

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331758/fd5e4942-f8f0-c9ff-e1a6-9f3bda70c8ea.png)


[つくったやつ](https://videobox-underground.herokuapp.com/miso/miso-karuta-gen)

わけわからんと思うので、文脈を補足
応援しているVtuberのパンチラインを個人的に集めたサイトを作っていた
たまたまその時期が正月だったから、カルタという形でパンチラインを取りまとめていた
作って公開して、ほかの人も好きなパンチラインを共有できるようにできればちょっと面白いかもなと思った
そんなときに[こちらの記事](https://qiita.com/serinuntius/items/3017fb6ef51cd47352f6)読んだら、これっておれでもできんじゃね？と思ってこういうものを試した

### 感想

JavaScript触り始めて一年満たないくらいでも
ひとのもの参考にしながらやったらなんかしら作れるんだな　という実感
とりあえずこの手のサイトを作るうえでの、一通りの流れはつかめた
これ作るの多分1人日くらいだった
firebaseすごい
バックエンド用意すんのかったるそうだと思ってたけど
こんな簡単にできちまうのか、とビビっている
画像生成のところもいけそうな気がするし、簡単な修整もfirebaseでできそうだ

### 最後に

至らない点が多々あるかと思いますが、
「こうすべきだ」というポイントなどあれば
教えていただけたら嬉しいです。
ECS Fargateタイプでも、PrivateLinkが使用できるようになってました！いつのまにか！


> https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

ECSのfargateタイプでプライベートサブネットでコンテナを実行してみます。
（ポイント）ECRからのイメージファイル取得をPrivateLink：エンドポイント経由とする。

↓↓↓
上記URLに従って(従ったつもり)、ECRインターフェースエンドポイントとS3ゲートウェイエンドポイントを作成しましたが、エラー発生中。。

　⇒状況の理由　DockerTimeoutError: Could not transition to started; timed out after waiting 3m0s
 
うーん、どこかの経路が詰まっている？権限が足りない？
また、解決したら書き込みします！

[追記 2019/02/07 07:00]解決しました。
プライベートサブネットなので、CloudWatchのエンドポイントがいるのですね。。
CloudWatchは何もせずとも当たり前のように使えると思っていました(^^;

これで、ECSのfargateでプライベートサブネットでコンテナを起動し、PrivateLink（エンドポイント）でECR(S3)からイメージファイルを取得しコンテナを実行できるようになりました。![gaggaga.PNG](https://qiita-image-store.s3.amazonaws.com/0/350277/2df38ed8-4f25-210b-3282-d571bdd633f6.png)
sinatraのdebug kit 作った

# ごきげんよう
こんにちは、僕は今回sinatraのdebugkitのgemを作っちゃったので、使い方説明しちゃいます。
debug kit と行ってもtableの一覧とその中身が見えるアクションを勝手に作っちゃうとっていうものです

## gem install
gemの名前にaldy入れちゃいました

```shell:shell
gem install aldy_debug_kit_sqlite3
```

## 初期設定
なんとこのコマンド実行すると

```shell:shell
aldy
```


- views/aldy_show_sqlite3_tables.erb
- show_table_action.rb

の２つのテストコードが生成されちゃいます

#### show_table_action.rb
'/models'　にgetリクエスト飛ばすとtable一覧が取れるactionと
#### views/aldy_show_sqlite3_tables.erb
それを表示するtemplateファイルです


## テストコードを使おう
app.rbでrequireしちゃいましょう


```ruby:app.rb
.......
requier 'aldy_debug_kit_sqlite3'
.......
```

## 実行するとこんな感じ

<img width="1401" alt="スクリーンショット 2019-02-07 6.16.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/6e24d821-3524-6e0b-108e-97936c10e812.png">

[![mov](/images/file_icons/movie.svg) 名称未設定.mov](https://docbase.io/file_attachments/b95ebb20-9c68-4e48-bcd4-138dafa3f19a.mov)
Swift：#selectorの使い方

# はじめに
`#selector`の使い方がわからないままでオレはいいのか？
「`Timer`の`selector `引数に渡すときとかで使うけど，まぁ今は動いているから調べるのは今度でいいか」と後回しにすること早5年．Objective-CのライブラリをSwiftに翻訳する仕事に着手し，ついに学ぶ時がきた．

```swift:こういう時に見るやつ
Timer.scheduledTimer(timeInterval: 1,
                     target: self,
                     selector: #selector(hoge), // ←コレ
                     userInfo: nil,
                     repeats: false)

let button = NSButton(frame: NSRect(x: 0, y: 0, width: 30, height: 20))
button.target = self
button.action = #selector(hoge) // ←コレ
```


# 法則
## 引数なしのメソッド呼び出し
```swift:
selecter: #selector(Test.callMethod)　// シンプルにクラス名.メソッド名でOK

class Test {
    @objc func callMethod() {
        Swift.print("Hello World")
    }
}
```
<font color="red">※</font>`@objc`をつけること

## １引数ありのメソッド呼び出し
```swift:ノーマル
selecter: #selector(Test.callMethod(name:))　// シンプルにクラス名.メソッド名(引数名:)

class Test {
    @objc func callMethod(name: String) {
        Swift.print("Hello " + name)
    }
}
```

```swift:引数名省略パターン
selecter: #selector(Test.callMethod(_:))　// クラス名.メソッド名(_:)

class Test {
    @objc func callMethod(_ name: String) {
        Swift.print("Hello " + name)
    }
}
```

```swift:ラベル付きのパターン
selecter: #selector(Test.callMethod(userName:))　// クラス名.メソッド名(ラベル:)

class Test {
    @objc func callMethod(userName name: String) {
        Swift.print("Hello " + name)
    }
}
```

いろいろ書いたけど，そのメソッドが一意に定まるときは引数なくてもいいらしい．

## 複数引数ありのメソッド呼び出し

基本的に引数一個の時の法則はそのままで続けて書く

```swift:
selecter: #selector(Test.callMethod(word:name:))　// クラス名.メソッド名(引数名1:引数名2:)

class Test {
    @objc func callMethod(word: String, name: String) {
        Swift.print(word + " " + name)
    }
}
```

## できないこと

`#selector`でメソッドを渡す時に一緒に引数を渡すことはできない．
あくまで受け取り先が指定している形式でしか渡せない．


# `Selector`を引数にとるメソッドを作る

ちょっとした応用として，Apple標準クラスの`extension`を書くときに`Selector`を引数にとるメソッドを書ける．

```swift:例
extension NSButton {
    public func setAction(selector: Selector) {
        self.action = selector
    }
}
```


# 参照
- [Selectorの書き方](http://galakutaapp.blogspot.com/2017/10/selector.html)
- [Apple Developer Forums](https://forums.developer.apple.com/thread/86081)での役立つ回答
EslintとPrettierの概要


[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンに参加しています。
今週はフロントエンドの開発ツールについて勉強しました。

###Eslint
JavaScriptのコードのエラーチェックをするリンティングツールです。
ESLintはNode.jsを使用して書かれているため、シェル上でnpmを使ってインストールできます。


インストール

```
npm i -D eslint
```

初期設定

```
eslint --init
```

実行

```
eslint test.js
```

実行結果のエラーメッセージが表示されます。
デフォルトで200以上のルールがありますので、[公式サイト](https://eslint.org/docs/rules/)を参照して修正します。
eslint実行コマンドに--fixを追加することで、エラー箇所を自動修正してくれるオプションもありますが、全てのルールが自動修正されるわけではないので注意しましょう。

###Prettier
コードフォーマッターと呼ばれるツールで、コードを自動的に整形してくれます。
Eslintと役割が被るところもありますが、改行処理などより見やすいコードを書くにはPrettierが必要です。

インストール

```
npm i -D prettier
```

実行

```
npm run format
```

###まとめ

EslintとPrettierを併用することで、より質の高いコードを生成できます。
ツールを使ってコード整形を行うことで、エラーチェックにかかる時間の削減とチーム開発でも統一感のあるコードを生成できる効果が期待できます。
bibファイルの日本語文献（2バイト文字）を判定してフラグを建てるPythonプログラム


# 背景

[この記事](https://qiita.com/ossyaritoori/items/7574ab2f3f9b9e8e1836)の続きです。
bibファイルのうち，日本語文献と思しきものに，`isjapanese = {true}`という行を自動で追加するPythonプログラムになります。

# 基本的な流れ

bibファイルの中身は基本的に@で区切られているのでsplitで分解できます。

- @の文字で文章をsplit
- ブロックごとに2バイト文字が存在するか判定
- 日本語判定を受けたブロックの後ろを置換
- @をつけ直して再構成，ファイルに書き込み

という流れをとりました。

## Pythonによる2バイト文字判定

こちらの方の記事を参考にしました。
https://minus9d.hatenablog.com/entry/2015/07/16/231608

```Python
#https://minus9d.hatenablog.com/entry/2015/07/16/231608
import unicodedata
def is_japanese(string):
    for ch in string:
        name = unicodedata.name(ch,'Undefined') 
        if "CJK UNIFIED" in name \
        or "HIRAGANA" in name \
        or "KATAKANA" in name:
            return True
    return False
```

元記事からの変更点として`unicodedata.name`に改行コードを入れるとErrorを吐くのでデフォルト値として'Undefined'を設定しています。
リファレンスがわかりやすくて助かった…
https://docs.python.jp/3/library/unicodedata.html

## その他仕様

```
python addJPflag.py <元ファイル>.bib
```
とうつと

`<元ファイル>_withJPflag.bib`
という名前でフラグ付きのファイルを作成するようにしました。

# ソースコード
結構簡単な仕様でしたので割とすぐできました。
退屈なことはPythonにやらせろってはっきりわかんだね。

```python
import unicodedata
import sys

def is_japanese(string):
    for ch in string:
        name = unicodedata.name(ch,'Undefined') 
        if "CJK UNIFIED" in name \
        or "HIRAGANA" in name \
        or "KATAKANA" in name:
            return True
    return False


if __name__ == "__main__":
    argv = sys.argv

    if len(sys.argv)==1:
        print('Please parse .bib file name!')
        exit(-1)

    # 1. read file
    fname = argv[1]
    f = open(fname,encoding="utf-8")
    data = f.read()
    # 2. split file
    sdata = data.split('@')
    # 3. add string
    output = ''
    for strings in sdata:
        if is_japanese(strings):
            output = output +'@' + strings[:-3] + ',\n isjapanese = {true}\n}\n'
        else:
            output = output +'@'+ strings
    output_bib = output[1:]
    # 4. save as new files
    fname_o = fname.replace('.bib','_withJPflag.bib')
    with open(fname_o,'w',encoding='utf-8') as fo:
        fo.write(output_bib)
```
ACMへ複数ドメインをTerraformで登録する

```
$ terraform apply
  :
data.aws_route53_zone.zone: Refreshing state...

Error: Error running plan: 1 error(s) occurred:

* module.alb.aws_route53_record.validation: aws_route53_record.validation: value of 'count' cannot be computed
```

```ruby
variable "domain_name" {
  description = "Domain name to register."
  default = "example.com"
}

variable "subject_alternative_names" {
  description = "FQDNs to be included in the Subject Alternative Name extension of the ACM certificate."
  default     = ["api.example.com"]
}

variable "number_of_domain_names" {
  default     = 2
}

data "aws_route53_zone" "zone" {
  name         = "${var.domain_name}"
  private_zone = false
}

resource "aws_acm_certificate" "cert" {
  domain_name = "${var.domain_name}"

  subject_alternative_names = "${var.subject_alternative_names}"

  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_route53_record" "validation" {
  #XXX: 未生成なのでlengthが取得できない。かわりに number_of_domain_names で数を教えてあげる
  # count = "${length(aws_acm_certificate.cert.domain_validation_options)}"
  count = "${var.number_of_domain_names}"

  zone_id = "${data.aws_route53_zone.zone.id}"

  ttl = 300

  name    = "${lookup(aws_acm_certificate.cert.domain_validation_options[count.index], "resource_record_name")}"
  type    = "${lookup(aws_acm_certificate.cert.domain_validation_options[count.index], "resource_record_type")}"
  records = ["${lookup(aws_acm_certificate.cert.domain_validation_options[count.index], "resource_record_value")}"]
}

resource "aws_acm_certificate_validation" "validation" {
  certificate_arn = "${aws_acm_certificate.cert.arn}"

  validation_record_fqdns = ["${aws_route53_record.validation.*.fqdn}"]
}
```
Xcode：command compileswiftsources failed with a nonzero exit code

# 背景
XcodeでmacOS向け`Framework`を開発中，`command compileswiftsources failed with a nonzero exit code`が出てコンパイルできなくなった．Tipsが転がっていなくて厄介だった．

# 原因
`PROJECT`の`Deployment Target`が低すぎるだけだった．自分の場合は`10.8`だと低すぎたようだ．`10.10`にしたら普通にコンパイルが通るようになった．
typescript-eslint で eslint-plugin-reactのルールを適用する

今回は、typescript-eslintにeslint-plugin-reactのルール適用を試したいと思います。対象は最近話題となった `target="_blank"` の `rel="noopener noreferrer"` がないコンポーネントの検出です。

では早速やってみましょう。

## セットアップ
typescript-eslintの導入部分は、[こちら](https://qiita.com/supaiku2452/items/9ff427d8002b0c5db5ef)を参照してください。

###  前提条件
以下パッケージがインストールされている

- eslint
- @typescript-eslint/parser
- @typescript-eslint/typescript-estree
- @typescript-eslint/eslint-plugin

**.eslintrc.json(jsでもyamlでも可)** が作成され、eslintが実行できる状態となっている。

以下のパッケージをインストールします。

- eslint-plugin-react

次に、 `plugins` に `react` を、 `rules` に `react/jsx-no-target-blank` を追加します。

```json:.eslintrc.json
{
  "root": true,
  "plugins": ["@typescript-eslint", "react"], // <- 追加
  "parser": "@typescript-eslint/parser",
  "env": {
    "es6": true,
    "browser": true
  },
  "rules": {
    "no-console": "error",
    "react/jsx-no-target-blank": "error" // <-追加ルール
  },
  "parserOptions": {
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  }
}
```

次に、Lintにかかるコンポーネントを追加します。

```App.tsx
import * as React from "react";
import "./App.css";

import logo from "./logo.svg";

interface IProp {
  link: string;
}

// 問題のあるコンポーネント
const CorrectLink = (prop: IProp) => (
  <a href={prop.link} target="_blank">
    {prop.link}
  </a>
);
// 問題のないコンポーネント
const UnCorrectLink = (prop: IProp) => (
  <a href={prop.link} target="_blank" rel="noopener noreferrer">
    {prop.link}
  </a>
);

class App extends React.Component {
  public render() {
    return (
      <div className="App">
        <a href="https://www.google.com">Go to google</a>
        <br />
        <CorrectLink link="http://example.com/correct" />
        <br />
        <UnCorrectLink link="http://example.com/uncorrect" />
        <br />
      </div>
    );
  }
}

export default App;
```

## ESLintの実行
準備が完了したので、 `eslint` を実行します。

すると、以下のような出力結果が得られます。

<img width="1239" alt="1____w_1_0_q_t_typescript-eslint-react-rule-sample__fish_.png" src="https://qiita-image-store.s3.amazonaws.com/0/170140/49a3f9bc-64e5-8731-7652-cab068cac019.png">

## 最後に
今回、社内でも `target="_blank"` について気をつけよう、というアナウンスがあったため、ついでに **typescript-eslint** もやろうと取り組みました。使ってみたところ、 **eslint-plugin-react** に定義されているルールは使用できるみたいですので、特にTypeScript用にpluginが変わるのを待つ必要はなさそうです。メンテナーの方々にはただただ感謝しかありません。

気づくと、 **typescript-eslint** は1.2.0になっており、勢いを再確認した次第です。現時点でもある程度必要なLintはできている印象ですので、みなさんもどんどん使ってみてください。

今回作成したリポジトリは、[こちら](https://github.com/supaiku2452/typescript-eslint-react-rule-sample)です。

今回の記事に対するご指摘などがありましたら、ご連絡ください。
ElmerGUIで境界面を選択したらクラッシュする（メモ）

# 背景

**Windows10環境のElmerGUIは境界面を選択しようとダブルクリックするとGUIが落ちる**

綺麗に落ちるのでむしろアプリの終了に使えるくらいだ。

公式のバグフォーラムでも知られている現象
http://www.elmerfem.org/forum/viewtopic.php?t=5460

対象のバージョンは8.3の最新(2019/2/7時点)
フォーラム内の「mshに変換してからgmeshで境界面の番号を確認して。番号はElmerGUIと一緒だよ」という回答に心を折られた。
クラッシュを回避する方法はないのか、また出来ないとしたらどのような環境で発生するのかを調べたのでメモする。
自分がC++のヒーローになれないのが残念。。。

# 結論

Windows10かつ特定のIntel Graphics driver環境で発生していると思われる。
回避策は上記のグラフィックドライバを使わないこと。
具体的には

- グラボを積んでいるのならそこから起動する
  　アプリのアイコン右クリックから選択できると思う

- 仮想化環境などでLinux上から起動する(ドライバは要確認)
　 VMwareの場合、特に何もしなくてもいいはず
　 VirtualBoxはなぜかLinuxのインストールで躓いたので未検証

- Microsoft Basic Display Adapterを使用する
　Intelのグラフィックドライバを削除すると上記のドライバとなる
　輝度の調整が出来ずモニタが煌々と光るので目をやられる

- Intel Graphics Driverを無効にする
　デバイスマネージャからIntel Graphics Driverを無効にしてElmerGUIを起動する
　これは割と現実的な方法かも

# 駄目だった方法

- 互換モード(Windows7など)で起動する
- Intel Graphics Controlから設定を変更する
- BIOS, OS, Intel Graphics Driverをアップデートする
- Windows Subsystem for LinuxからXmingなどを使ってLinuxのElmerGUIを起動する
- その他色々あがく

# 動作環境の確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/90d18ef6-2019-64b9-4bd6-d29e729dbca9.png)

上記の表から分かる通り、Windows10 + Intel(R) Graphics driver環境でNGが起きている。


# 所感
上記の通りElmerGUIを使うときは境界面の選択に気を付けてほしい。
ソースコードが公開されているというのに、コードを読めないため残念ながら上記のような実験的(帰納法的)なアプローチを取らざるを得なかった。
そのため無駄なトライ&エラーがたくさん発生し手数を増やすことが課題となってしまった。

もちろんコードを読めても解決も問題特定もできないかも知れないが今後は少しでもコードを読む努力をしたい。

しかし、副産物としてElmerGUIにk-εモデルやk-ω SSTモデルを入れる方法を知ったので今後更新していく。

さて、バグフォーラムに投稿した方が良いのかもしれないがこの程度もう調べられているかもしれないし、アカウント作成しないといけないし、英語は苦手だし…
なのでとりあえずまた今度考えよう。
safariでlinear-gradientのtransparentが黒くなった

## safariで、linear-gradientにtransparentの指定を挟んだらchromeとfirefoxはちゃんと表示されたのに、safariだけなんか透過できていなかった。

どうやらsafariの仕様で

**transparent は rgba(0, 0, 0, 0)　つまり （黒の透明度100%）**

と内部的にはなっているらしい。

なので

transparentではなく

**rgba(255, 255, 255, 0) つまり （白の透明度100%）**

にしたらちゃんと他のブラウザと同じ見た目になった。


参考：https://glatchdesign.com/blog/web/css/1254
BetterLogを用いてGoogleAppScriptで簡単にロギングする

# この記事の目的
GoogleAppScriptで簡単にロギングできるようになる。

# この記事の想定読者
GoogleAppScriptでセルから入力した値をgetできるぐらいのレベルの読者を想定しています。その上で以下のようなことをしたい人です。

- GoogleAppScriptで `Logger.log` でのデバッグを卒業したい人
- イベント発火で関数を起動しているため、あとで処理を確認するためにロギングしておきたい人

# BetterLogとは

> With one line of code, BetterLog extends the native apps script Logger and gives you automatic additional features like logging to a spreadsheet and more.

[peterherrmann/BetterLog](https://github.com/peterherrmann/BetterLog) より

(翻訳)一行のコードで、BetterLogは、native app script(この場合はGoogleAppScriptと置き換えて)のLoggerクラスを拡張して、そしてスプレッドシートに対してロギングのような自動的に追加する特徴を与えます。

![logging](https://camo.githubusercontent.com/ec051a9f28d62b893592a4b31912717b01d4f18b/687474703a2f2f692e696d6775722e636f6d2f3655337a37644e2e706e67)

このようなイメージの通りに、シートにログを吐き続けてくれます。

# BetterLogを導入する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142918/485f69b6-9741-6573-b6ca-cc45184953e5.png)

まずライブラリを追加します。

スクリプトエディタで `リソース > ライブラリ` でライブラリモーダルを開いて、 `ライブラリを追加` フォームに 
`MYB7yzedMbnJaMKECt6Sm7FLDhaBgl_dE` を入力して `BetterLog` を追加します。バージョンは最新を使いましょう。この記事の時点では `27` でした。

```javascript
function myFunction() {
  // BetterLogを使うため、スプレッドシートを指定する。
  Logger = BetterLog.useSpreadsheet('スプレッドシートID'); 

  // ログで確認できるとともに、スプレッドシートにもログが吐かれる。
  Logger.log("Hello, World");
}
```
このコードを実行することで、 `Log` というシートが作成され、そこに `Hello, World` とロギングされます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142918/afd9c919-23ca-a28e-2141-2a0a05affbbc.png)

# 参考

[Google Apps Script Loggerライブラリ BetterLogを使う | Monotalk](https://www.monotalk.xyz/blog/google-apps-script-logger%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-betterlog%E3%82%92%E4%BD%BF%E3%81%86/)
Rubyでじゃんけんをするプログラムを書いてみた。

## プログラミングでじゃんけんを再現してみよう!!
会社でRailsを使ったアプリケーションの改修や、CMSの構築などを主にやっています。
プログラミングはほぼ独学で、専門学校や大学など学校に通って勉強はしたことのないぺーぺーが仕事の合間になんとな〜く、「CUI上でじゃんけんできるプログラムってどう作るんだろう?」と思って作ってみたものです。

## 実行環境
- macOS Mojave バージョン10.14.1
- ruby 2.4.1

ちなみにテキストエディタはAtom、ターミナルはiTermを使用しています。

## そもそもじゃんけんをするには...
じゃんけんを実装するにあたり考えることは概ね以下の内容と考えました。

- 自分が何を出すか決める
- 相手が何を出すかランダムで決まる
- 自分と相手の役を比べる
- 勝ち負けが決まる
- 引き分けた場合はもう一度

## それでは書いてみよう!!
上のことを考慮して思ったものを作るまでにやったことを記載していきます。
「効率悪いなー」、「無駄な記述多いなー」と感じた方!!!
ぜひコメントなどでご指摘いただけると嬉しいです。

### 1.相手の役を決める
相手が何を出すのか決めるために、予め`グー、チョキ、パー`を配列にしておき`sample`メソッドを使ってランダムに抽出して変数`cp`に代入する。
実際に書いた内容が以下。

```test.rb
yaku = %w(グー チョキ パー)
cp = yaku.sample
p cp # デバック用：実行のたびにグー、チョキ、パーのいずれかを出力
```

### 2.自分の役を決める
自由入力にすると、勝敗判定が難しいので数値で選択するようにしました。
「何を出しますか?数字で選択してください。 0：グー、1：チョキ、2：パー」
のような説明文を出して数字を入力させて、`yaku`配列から入力した数値を使って抽出し、変数`you`に代入する。
標準入力には`gets`メソッドを使う。
※数字を入力しても文字列として扱われるので、`to_i`とかで数値に変換する。


```test.rb
yaku = %w(グー チョキ パー)
cp = yaku.sample

# 以下から追加した箇所
puts "何を出しますか?数字で選択してください。 0：グー、1：チョキ、2：パー"
num = gets.chomp.to_i
you = yaku[num]

p "you:#{you} vs cp:#{cp}" # デバック用
```

### 3.引き分けだったときの処理を書く
引き分けだった場合、勝ち負けが決するまでloopすることになる。
つまり `you != cp`となったときにloopを抜ければ良い。
逆に`you == cp`となった場合は、もう一度変数`cp`と`you`に値を入れ直す必要がある。

```test.rb
yaku = %w(グー チョキ パー)
cp = yaku.sample

puts "何を出しますか?数字で選択してください。 0：グー、1：チョキ、2：パー"
num = gets.chomp.to_i
you = yaku[num]

# 以下から追加した箇所
loop{
  if you != cp #引き分けでない場合はloopを抜ける
    break
  end
  puts "you:#{you} vs cp:#{cp}"
  puts "Draw!! もう一度、数字を選択してください。 0：グー、1：チョキ、2：パー"
  num = gets.chomp.to_i
  you = yaku[num]
  cp = yaku.sample
}

p "you:#{you} vs cp:#{cp}" #デバック用
```

### 4.勝ち負けの条件で出力内容を分岐する
引き分けについては上記で精査されているので、勝ちの条件に合致するかどうか、それ以外はすべて負け。
という条件分岐を書けば良い。
勝ったときの条件は以下のようになる。

```
自分(you)がグーなら相手(cp)はチョキ または
自分(you)がチョキなら相手(cp)はパー または
自分(you)がパーなら相手(cp)はグー
↓
(you == yaku[0] && cp == yaku[1]) || (you == yaku[1] && cp == yaku[2]) || (you == yaku[2] && cp == yaku[0])
```

実際のコードが以下

```test.rb
yaku = %w(グー チョキ パー)
cp = yaku.sample

puts "何を出しますか?数字で選択してください。 0：グー、1：チョキ、2：パー"
num = gets.chomp.to_i
you = yaku[num]

loop{
  if you != cp
    break
  end
  puts "you:#{you} vs cp:#{cp}"
  puts "引き分けました。もう一度、数字を選択してください。 0：グー、1：チョキ、2：パー"
  num = gets.chomp.to_i
  you = yaku[num]
  cp = yaku.sample
}

# 以下から追加した箇所
puts "you:#{you} vs cp:#{cp}"
if (you == yaku[0] && cp == yaku[1]) || (you == yaku[1] && cp == yaku[2]) || (you == yaku[2] && cp == yaku[0])
  puts "you win!!"
else
  puts "you lose..."
end
```

### 実行結果
```
ruby test.rb
何を出しますか?数字で選択してください。 0：グー、1：チョキ、2：パー
1 #自分で入力してエンター

<引き分けた場合>
you:チョキ vs cp:チョキ
引き分けました。もう一度、数字を選択してください。 0：グー、1：チョキ、2：パー
2 #自分で入力

<勝った場合>
you:チョキ vs cp:パー
you win!!

<負けた場合>
you:チョキ vs cp:グー
you lose...
```

## 作ってみて思った反省点
- エラーや想定外の入力値に対する処理を書いていない。
- 重複したコードや条件分岐がイケてない。

リファクタリングや効率の良いコードの書き方、重複したコードをなくすための設計など
まだまだ勉強することがあるなぁ..と思い知らされました。

## 最後に
プログラミングをしたことがない方が、こういった小さなものから興味を抱いてもらえるととても嬉しいです。
誤字脱字のご指摘、アドバイスなどありましたらお気軽にコメントいただけると幸いです。
最後までお読みいただきありがとうございました。
VMDKファイルをHyper-V(VHDXファイル)に変換する

VMware Playerを使用していたのですが、Dockerを始め昨今のWindowsプラットフォームでの開発ではHyper-V前提になってきており、VMwareだと何かと厳しいので移行するためのメモです。
基本的に[vmdkファイルのWindowsNTをHyper-Vで動かす](https://qiita.com/HirokiSakonju/items/7b5a50a23abd025aecbf)を参考にしながら、所々違うことをしています。

# 環境
ホストOS: Windows 10 Pro 1809
VMware: VMware Workstation 14 Player
ゲストOS: Windows 10 Pro 1809(Workstation 11.x仮想マシン)

# VMDKファイルの編集
VMDKファイルの`ddb.toolsInstallType`をコメントアウトする必要があるらしく、
dsfork.exeというツールが紹介されているが、やっていることはVMDKファイルのヘッダーを差し替えているだけなので、バイナリエディタで置換しました。
具体的には、`ddb.toolsInstallType` の前に `#`を挿入して、その少し後ろのオフセット0x3E0あたりの0x00を削除しました。
多分ddコマンドとかでも同様のことができると思う。

# VHDXファイルに変換
[Microsoft Virtual Machine Converter](https://www.microsoft.com/en-us/download/details.aspx?id=42497)をインストールして、PowerShellの`ConvertTo-MvmcVhd`コマンドレットで変換しました。
`ConvertTo-MvmcVhd`コマンドレットでは、`-VhdFormat` でVHD/VHDXが指定できるので、VHDXにしてます。

```
PS> import-module "C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1"
PS> help ConvertTo-MvmcVhd

名前
    ConvertTo-MvmcVirtualHardDisk

構文
    ConvertTo-MvmcVirtualHardDisk [-SourceLiteralPath] <string> [[-DestinationLiteralPath] <string>] [[-VhdType] {Dynam
    icHardDisk | FixedHardDisk}] [[-VhdFormat] {Vhd | Vhdx}]  [<CommonParameters>]


エイリアス
    ConvertTo-MvmcVhd


注釈
    なし
PS> ConvertTo-MvmcVhd -SourceLiteralPath "D:\Virtual Machenes\Windows 10 x64\Windows10.vmdk" -DestinationLiteralPath "D:\Virtual Machenes\Windows 10 x64\Windows10.vhdx" -VhdFormat Vhdx

Destination                                       Source
-----------                                       ------
D:\Virtual Machenes\Windows 10 x64\Windows10.vhdx D:\Virtual Machenes\Windows 10 x64\Windows10.vmdk

PS >
```

# Hyper-Vの有効化と仮想マシンの作成
VMwareはアンインストールせずに、Windowsの機能の有効化または無効化でHyper-V プラットフォームを有効にした後、Hyper-Vマネージャで新規の仮想マシンを作成します。
その際、世代の指定では第1世代を指定します。
<img width="528" alt="仮想マシンの新規作成ウィザード" src="https://qiita-image-store.s3.amazonaws.com/0/124276/dfab24c7-49f5-d48c-1328-477f7b0bcdcd.png">

第2世代でも試したが、VMWareではSATA(IDE)接続だったせいか、そのままでは起動ロゴが出ずに起動しませんでした。
[stackoverflow](https://stackoverflow.com/questions/37481737/error-when-converting-vmware-virtual-disk-to-hyperv)ではISOファイルで起動して`bootrec.exe /fixBoot`が有効、みたいなことが書いてあったけど、直りませんでした。

# 追記
変換後の仮想マシン(Windows 10)でライセンス認証をしようとしたのですが、今のところ失敗しています。
ハードウェアの変更で行けると思っていたのですが、「Windows をライセンス認証できません」と言われて完了できません。

# 追記2
こちらにP2Vで作成したVHDXファイルを第2世代の仮想マシンで起動する手順が記載されている。
もしかしたら参考になるかも。
[Disk2VHD UEFI ファームウェアのマシンのブート手順](https://blogs.technet.microsoft.com/askcorejp/2019/03/15/disk2vhd-uefi-boot/)
shebangからNode.jsのオプションを指定する

## Node.jsでshebang行を指定する

Node.jsでスクリプトを記述する場合、次のようなshebangを書けばスクリプト名で起動できるようになります。

```
#! /usr/bin/env node
```

JavaScriptで`#`はコメントを意味しませんが、Node.jsでは1行目がshebang行だった場合は無視してくれるのです。助かりますね。

しかし、nodeコマンドにオプションを指定したいような場合はうまくいかないことがあります。

```
#! /usr/bin/env node --experimental-modules 
```

実は、上記shebangが期待通りに動くかは環境依存で、Linux上では期待通りに動きません。Linux上で起動すると次のようなエラーが出てしまいます。

```
/usr/bin/env: node --experimental-modules: No such file or directory
```

Linux上ではshebangの第一引数の後ろは全て第二引数としてまとめられてしまい、 `node --experimental-modules` というコマンドがないため怒られてしまうのです。理不尽ですね。

## shebangでNode.jsのオプションを指定する方法

Linuxの制約を回避するには、シェルスクリプトとしてもJavascriptとしても正しいshebang行を書く必要があります。

具体的には次のように書くことができます。

```
#!/bin/sh 
":" //# ; exec /usr/bin/env node --experimental-modules "$0" "$@"
```

2行目がシェルスクリプトとしてもJavascriptとしても正しいのがミソです。

`:`はシェルスクリプトで何もしないビルトインコマンドです。その後ろをセミコロンで区切って本来起動したいNode.jsをexecコマンドで起動しています。シェルスクリプトのexecはシェル自身のプロセスを置き換えて外部コマンドを実行するので、以降の行はシェルスクリプトとして実行されません。

Node.js起動後、再び2行目がJavaScriptとして解釈されますが、文字列の後ろにコメントがあるという状態になり、何の処理も行わないので無害だというわけです。3行目以降は普段通りJavaScriptを記述すれば期待通り動作します。

なかなか頭おかしい（褒め言葉）ですね。

## 参考資料

本稿の内容は下記ページに書いてあった内容そのものです。面白い内容だと感じたので紹介してみました。

- [Sambal : Passing options to node on the shebang (#!) line](http://sambal.org/2014/02/passing-options-node-shebang-line/)
convert で複数の PNG 画像をアニメーション GIF にする

人生には「ここにフレーム単位の PNG ファイルがある。これをなんとかアニメーション GIF にしてくれ！金ならいくらでも払う！」というときがしばしばある。Photoshop などを使ってもできるけど、 `convert` コマンドを使うと簡単にできる:

```bash
$ convert -delay 0 -loop 0 *.png animated.gif
```

ファイル名で絞り込むとフレームを落とすことも簡単にできる。

```bash
$ convert -delay 0 -loop 0 *0.png *3.png *6.png *9.png animated.gif
```

`convert` なのでついでにサイズを変更したりもできる。
LibreOffice をコマンドだけで操作して .xlsx ファイルを PDF に変換する

LibreOffice は、 GUI を起動せず使える("headless な")機能があって、その中にファイルのフォーマットをいい感じに変換してくれるという意外に便利なものがある。

LibreOffice をインストールすると、 Ubuntu とかだと `libreoffice` コマンドにパスが通っているけど、 OS X では `/Application` の中の Package Bundle を操作しないといけないので、ちょっと大変。でもコマンドのインターフェイスは同じなので、次のようにすると、カレントディレクトリの .xlsx なファイルをすべて PDF に変換してくれる。

``` sh
$ /Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf --outdir ~/somewehere/i/belong/api-doc-pdf *xlsx
```

といっても LibreOffice なので、必ずしも意図通りの表示にならない[こと(もある|が多い)]。

参考: [How to convert documents to PDF on OSX](https://ask.libreoffice.org/en/question/12084/how-to-convert-documents-to-pdf-on-osx/)
多量のページを扱う場合の静的サイトジェネレータのパフォーマンス

# 経緯

多量のページを扱うサイトを静的サイトジェネレータである VuePress で運用していたところ、ページ数が増えるとビルドが終わらなかったりクラッシュするケースがあることがわかった。

VuePress は比較的若いフレームワークなので、同じ Node ベースでもう少し実績のある Gatsby も試したが、似たような結果だった。

そこで、複数の静的サイトジェネレータを使って、ファイル数が極端に多い場合や少量だがサイズの大きいファイルを扱う場合のビルドのパフォーマンスを比較することにした。

比較対象として、これまでよく使ってきた Middleman と、使ったことはないが気になっている Hugo でも試した。

# 注意

厳密なベンチマークを想定していないので、数値は目安程度のもの。

# 検証対象

* [Gatsby](https://www.gatsbyjs.org/) 2.0.76
* [VuePress](https://vuepress.vuejs.org/) 0.14.4
* [Middleman](https://middlemanapp.com/jp/) 3.3.12
* [Hugo](https://gohugo.io/) 0.54.0

# 検証パターン

各ジェネレータごとに次のものを試した。

* だいたい初期状態
* 1.8KB 程度の Markdown ファイルが1000ファイルある場合
* 同15000ファイルある場合
* 単一の約3MBの Markdown ファイルがある場合
* 単一の約17MBの Markdown ファイルがある場合
* 単一の約84MBの Markdown ファイルがある場合

Markdown は、[これ](https://gist.githubusercontent.com/DominikAngerer/b4a29b5ec9a69fc09546882586bc2d6b/raw/aeab6fdd6dbbcb7626e2ef2a8123e677cc19dcc1/lorem-markdown.md)を使用した。

# 検証結果

| フレームワーク | 初期状態 | 1.8KBx1000 | 1.8KBx15000 | 3MBx1 | 17MBx1 | 約84MBx1
|----:|----:|----:|----:|----:|----:|----:|
| **Gatsby** | 0m13.75s | 0m39.85s | クラッシュ[^1] | 84s | 打ち切り[^2] | - [^3]
| **VuePress** | 0m8.954s | 1m10.749s | クラッシュ[^1] | 6m43.184s | クラッシュ[^1] | - [^3]
| **Middleman** | 0m1.386s | 0m6.165s | 1m15.846s | 0m8.783s | 1m9.114s | 11m19.757s 
| **Hugo** | 0m0.108s | 0m1.726s | 1m44.279s | 0m0.380s | 0m1.530s | 0m6.981s

# まとめ

Hugo (Go) が圧倒的。

Node で動く Gatsby, VuePress は並列処理されて CPU は使い切れているが、ビルドはいまいち速くない。また、ヒープが不足といってコケるケースが多かった。

Middleman (Ruby) は CPU は1コアしか使えていないが、意外に速い。

## VuePress はあまり多数のファイルを扱うことを想定していないらしい

一部のファイルには想定される最大サイズがあるらしい。ルーティングなどのためのファイルのようなので、ファイル数が多すぎると問題になるようだ。

```
$ time vuepress build

 WAIT  Extracting site metadata...
[22:50:49] Compiling Client
[22:50:49] Compiling Server
(node:39358) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead
[BABEL] Note: The code generator has deoptimised the styling of /Users/tnzk/.config/yarn/global/node_modules/vuepress/lib/app/.temp/routes.js as it exceeds the max of 500KB.
[BABEL] Note: The code generator has deoptimised the styling of /Users/tnzk/.config/yarn/global/node_modules/vuepress/lib/app/.temp/siteData.js as it exceeds the max of 500KB.
[BABEL] Note: The code generator has deoptimised the styling of /Users/tnzk/.config/yarn/global/node_modules/vuepress/lib/app/.temp/routes.js as it exceeds the max of 500KB.
[BABEL] Note: The code generator has deoptimised the styling of /Users/tnzk/.config/yarn/global/node_modules/vuepress/lib/app/.temp/siteData.js as it exceeds the max of 500KB.
```

[^1]: `FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
[^2]: クラッシュこそしないものの 20分以上経過しても run graphql queries が終わらなかった。
[^3]: 実施しなかった。
dockerで(nginxとphp-fpmと)mysqlを連携させたときのメモ


#前提
nginxはド素人。PHP(Laravel)の環境を作る必要があり、使ったことが無いnginxで動かしてみようという軽いノリで始めたメモ。
すでに、[nginxに関するメモ有り](https://qiita.com/niibori/items/a68e41a695fd1b1b80a1)。[php-fpmに関するメモ有り](https://qiita.com/niibori/items/79a4141d4d557897c356)。
今回は既に作成し連携済のnginxとphp-fpmのコンテナに加えDBを連携させる為の設定メモ。

#docker-compose.yml

```yaml:docker-compose.yml
version: '3'

services:
  web:
    build:
      context: ./docker
      dockerfile: web.docker
    container_name: web00
    depends_on:
      - app00
    ports:
      - 8080:80
    volumes:
      - ./proj/var/www/html:/var/www/html
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - proj-net
  app:
    build:
      context: ./docker
      dockerfile: app.docker
    container_name: app00
    depends_on:
      - db00
    volumes:
      - ./src/var/www/html:/var/www/html
    networks:
      - proj-net
  db:
    build:
      context: ./docker
      dockerfile: db.docker
    container_name: db00
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: projdb
      MYSQL_USER: proj
      MYSQL_PASSWORD: password
    networks:
      - proj-net
network:
  - proj-net
```

##command:
mysqlのイメージは最新版を利用するのだが、後ほどLaravelと連携する際に問題が発生してしまう。
どうやら、mysqlの最新版（現時点ではVer.8）では認証方式が **caching_sha2_password**と言うモノになっているらしい。これを、 **mysql_native_password**に変更しなければならなかったので、```--default-authentication-plugin=mysql_native_password```を付加している。

正しく設定できたかどうかは環境構築後に```docker-compose exec db mysql -u root -p -e "select user,plugin from mysql.user;"```を実施すれば良い。

```
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| proj             | mysql_native_password |
| root             | mysql_native_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | mysql_native_password |
+------------------+-----------------------+
```

##volumes:
データの永続化の為に設定。ただし注意が必要。docker-composeによって気軽に環境構築を繰り返せるが、この設定を行うと構築済の設定が残ってしまうためdocker-compose.ymlに加えられた変更が反映しないことがある。docker-compose.ymlを変更し構築し直す場合には、以前mysqlによって生成されたファイル群は隔離しておく必要がある。

#./docker/db.docker

```dockerfile:db.docker
FROM mysql:latest
```

とりあえず最新版をつかう。
Railsでvueを利用しているときに本番でGCS上に配置した画像を参照するときにどうするか

# 背景

開発時はローカル、本番ではGCSへコピーした画像を参照したい

# やったこと

使うコンポーネントで毎回ローカルとGCSの参照を切り替えるのは面倒なので画像を扱うクラスを用意することにしました
Rails環境でRAILS_ENVにproduction,staging等が指定されGCSではバケット名が [RAILS_ENV]-assets というような名前になっている状態です
NODE_ENVはdevelopmentかproductionが指定されるのでそれを見て開発時のローカルパスを返すか、GCSのURLを返すかを判断します
画像はapp/javascript/images　以下に　image-a.jpg, image-b.jpgが置いてある前提です

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

environment.config.merge({
  resolve: {
    alias: {
      '@': path.resolve(__dirname, '..', '..', 'app/javascript')
    }
  }
})

module.exports = environment
```

```javascript:image.js
'use strict'
import imageA from '@/images/image-a'
import imageB from '@/images/image-b'

const GCS_DOMAIN = 'storage.googleapis.com'
const BUCKET = `${process.env.RAILS_ENV}-assets`
const PROTOCOL = 'https'

class Image {
  static sources = {
    imageA: imageA,
    imageB: imageB
  }

  constructor () {
    this.host = ""
    if (process.env.NODE_ENV === 'production')
      this.host = `${PROTOCOL}://${BUCKET}.${GCS_DOMAIN}`
  }

  /**
   * 画像のパスを取得
   * @returns {String}
   */
  getSrc (key) {
    return `${this.host}${Image.sources[key]}`
  }
}

export default new Image
```

```vue:Image.vue
<template lang="pug">
img(:src="src")
</template>

<script>
import image from './image'

export default {
  data () {
    src: image.getSrc('imageA')
  }
}
</script>
```
create-react-appでSassやCSS-moduleを使う方法



2018年10月のcreate-react-app v2のリリースで色々簡単になったようなので軽くメモ




少し前まで
[create-react-appでSASSファイルを使う方法](https://qiita.com/chieeeeno/items/1dda5c47d4f1e36408e8)
こちらの方法でsassを使っていたのですが、今はよりシンプルに使えるようになったようなので、自分用にまとめておきます。




## プロジェクトフォルダを生成

Node.jsが入っていれば下記のコマンドを叩いてすぐにスタートできます。(node.jsのインストールは割愛します）

```
$ npx create-react-app my-project
```

*npxコマンドはnpm version5.2以降から利用できます。
ローカルにcreate-react-appをインストールしていなくても、npmレジストリから最新版パッケージを取得してプロジェクトを生成してくれるとのことです。（詳細は[公式ドキュメント](https://github.com/facebook/create-react-app)を参照。）


## Sassをインストール
```
$ cd my-project #プロジェクトフォルダに移動
$ yarn add -D node-sass 
```

yarnでなく`npm i -D node-sass`でもokです。


以前は他にも色々インストールしたりwebpackのconfigいじったりで環境設定に時間がかかったわけですが、今はnode-sass入れるだけでOKなので話が早いです。



## 既存のcssファイルをscssにリネーム

`./src/App.css`を`./src/App.scss`にリネームします。

それが終わったら、`./src/App.js`の3行目にある`import './App.css'`の拡張子も併せて`import './App.scss'`に変更します。

これだけでもうsassが使える状態になったので、下記コマンドでアプリを起動してみましょう。

```
$ yarn start
```

デフォルトのreactテンプレートが確認できると思います。

あとは`./src/_variables.scss`など作成して`App.scss`から読み込んでみたり、色々試してみるとちゃんと使えるのが確認できると思います。


## ベンダープレフィックスについて

ベンダープレフィックスはcreate-react-appでbuildした際にautoprefixerが自動でつけてくれます。

autoprefixのコンフィグは`package.json`の`"browserslist"`に記載されていますので、追記してIE10などに対応することもできます。

```package.json
...
"browserslist": [
  ">0.2%",
  "not dead",
  "not ie <= 11",
  "not op_mini all"
]
...
```




## CSS Module を使う方法

`[name].module.css`または`[name].module.scss`のようにファイル名を付ければモジュール化されます。

cssモジュールのスタイルのアウトプットは`[filename]_[classname]__[hash]`のような命名規則で変換されます。


---


至ってシンプルで使いやすくて助かります


参考：[How to use Sass and CSS Modules with create-react-app](https://blog.bitsrc.io/how-to-use-sass-and-css-modules-with-create-react-app-83fa8b805e5e)（英語）
ドットインストール html講座

#自己紹介
初めまして，ffrと申します．
今日からHTMLの勉強を始めました．今までも何度も始めようか迷っていましたが，難しそうで手を付けていませんでした．
勉強の方はというと数学が大の苦手で，数式アレルギーでした．テストでも数学が20点という事も有りました．
過去形なのは仕事で嫌でも三角関数,平方根や積分を使うようになって改めて勉強し直すと学生の頃は受け身で授業を聞いていたのが自分で勉強するとなると数学が面白く感じるようになりました．といってもまだまだ，知識的には中学２年生レベルです．
プログラミングを勉強すれば論理的な思考に役立つというブロガーさんの記事を見て興味を持ちました．
毎日，少しずつ積み重ねて行きたいと思います．よろしくおねがいします．

#プログラミング学習
今日はドットインストールのHTML講座でMyPortforioのコードを勉強しました．
<img src="img/taro.png" width="140" height="140" alt="太郎のアイコン">の表示がどうしても右によってしまって手本通りに行きませんでした．これ以上やっても解決できなさそうなので今日のところはタイムアップで寝ます．

#今日のコード記録
```html:MyPortforio
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>太郎のポートフォリオサイト</title>
  <link rel="icon" href="favicon.ico">
  <meta name="description" content="太郎のポートフォリオサイトです．">
</head>
<body>
  HOME
  ABOUT
  <img src="img/header.png" width="400" height="130" alt="ヘッダー画像">

  <img src="img/taro.png" width="140" height="140" alt="太郎のアイコン">
  <h1>山田太郎</h1>
  <p>UI/UXデザイナー見習いです</p>

  <img src="img/work1.png" width="400" height="260" alt="勇者ゲーム">
  <h2>勇者ゲーム</h2>
  <p>楽しいアプリです楽しいアプリです楽しいアプリです楽しいアプリです</p>

  <img src="img/work2.png" width="400" height="260" alt="宝探しゲーム">
  <h2>勇者ゲーム</h2>
  <p>楽しいアプリです楽しいアプリです楽しいアプリです楽しいアプリです</p>

  <img src="img/work3.png" width="400" height="260" alt="神経衰弱">
  <h2>勇者ゲーム</h2>
  <p>楽しいアプリです楽しいアプリです楽しいアプリです楽しいアプリです</p>
</body>
</html>

```
Qiita API v2をAjaxで利用するためのwebpack設定(ローカル開発環境専用)

[Qiita API v2](https://qiita.com/api/v2/docs)では、Qiitaの記事一覧やユーザー詳細、記事を「いいね」した人の一覧や**ストックした人の一覧**を取得したりできます。
Qiitaの画面上では**記事をストックした人**を見ることはできないので、API経由で記事をストックした人がどんな人なのか見ることができる個人的なWebアプリを作りたくなるかもしれません。

![Image 2019-02-06 12-36-54.png](https://qiita-image-store.s3.amazonaws.com/0/137045/c6dea90d-f6c4-a7b7-b0a5-76767b509da5.png)

しかし、ブラウザでは `https://qiita.com/` と異なるドメインのページ上から[Ajax](https://developer.mozilla.org/ja/docs/Web/Guide/AJAX)で直接 `https://qiita.com/` のAPIへはアクセスできなかったりします。
これはセキュリティ的な観点で正しい挙動で、[CORS](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)という仕組みによるものです。

この記事ではwebpackのローカル開発環境にProxyを設定し、Proxy経由でQiita API v2にアクセスする方法を紹介します。

# webpackの設定
[webpack-dev-server の proxy](https://webpack.js.org/configuration/dev-server/#devserver-proxy)を設定します。

## 設定例
Vue CLIとNuxt.jsでの設定例を以下に示します(`webpack.config.js` でも設定とほぼ同じかと思います)。

以下の例では `/api` 以下へのリクエストを、 `https://qiita.com` へプロキシ(代理)します。

例: ローカル開発環境が `http://localhost:3000` で立ち上がっている場合、 `http://localhost:3000/api/v2/users/:user_id/items` へリクエストすると `https://qiita.com/api/v2/users/:user_id/items` へWebpackが代理でアクセスしてレスポンスを返す

### Vue CLIでの設定例
`vue.config.js` がない場合はファイルを作成します。

```javascript:vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'https://qiita.com'
      }
    }
  }
}
```

`npm run serve` でローカル開発環境が立ち上がり、プロキシも有効となります。

### Nuxt.jsでの設定例
```javascript:nuxt.config.js
module.exports = {
  mode: 'spa',  // or 'universal'

  // 省略

  proxy: {
    '/api': {
      target: 'https://qiita.com'
    }
  },

  // 省略
}
```

create-nuxt-appを利用していれば、 `npm run dev` でローカル開発環境が立ち上がり、プロキシも有効となります。

# LT登壇(予定)
[Meguro.es #19 @ oRo](https://meguroes.connpass.com/event/112921/)にて、「Nuxt.js+Firebaseで個人サービスを作るまで」という題目で本記事に関連した登壇をする予定です。
CP210x USB to UART Bridge VCP Drivers を Mac OS にインストールする方法

Amazonとかで簡単に入手できるシリアル変換モジュールにCP2102という互換機のUSBモジュールがよく見受けられます。これを使って ESP8266 とか ATmega328p とか近頃のIoT機器に自前の Arduino のスケッチを書き込みたいと思って Mac に繋いでも認識してくれないのです。

<a href="https://www.amazon.co.jp/USB2-0-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%C2%B7%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-CP2102-6%E3%83%94%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B00HLUZYXA/ref=as_li_ss_il?ie=UTF8&qid=1549463378&sr=8-6&keywords=cp2102&linkCode=li2&tag=bluemooninc-22&linkId=bf222bd46683ebd9b0aad831d89d09cd&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00HLUZYXA&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=bluemooninc-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=bluemooninc-22&language=ja_JP&l=li2&o=9&a=B00HLUZYXA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

仕方なく Windows で動かしてましたが、解決方法が見つかりましたので書いておきます。


https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

まずは、一般的に SiLabs のURLでドライバをインストールしますが、Arduino の Port に出てくれません。今までは、ここで諦めてました。

で、インストールされたドライバは以下のフォルダで確認できます。

```
$cd /Library/Extensions
# 以下のファイルが見つかればインストールされています
SiLabsUSBDriver.kext
```

以下の３コマンドでOSにロードするコマンドを打ちます。

```
$ codesign -vvvvd /Library/Extensions/SiLabsUSBDriver.kext
$ kextutil -tn /Library/Extensions/SiLabsUSBDriver.kext
$ sudo kextload -v 6 SiLabsUSBDriver.kext
```

すると<img width="674" alt="スクリーンショット 2019-02-06 23.43.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/40217/672795c5-3c50-9950-85c7-2124790ac41c.png">
環境設定のセキュリティとプライバシーのウィンドウに読み込みブロックを許可するボタンが表示されます。

ここで許可すればOK。なんだこの裏技的でバックドア的な仕組みわぁぁぁとか思いましたが、先を急ぐのでここにポストするにとどめておきます。
vim-unmatchparen を作った

# はじめに
この記事では vim-unmatchparen というプラグインを作ったのでそれの紹介をします。
※ 多分まだまだバギーです。
※ PR, issue 大歓迎です。

# vim-unmatchparen
対応が壊れたペアをハイライトします。

似たプラグインに https://github.com/vim-scripts/Highlight-UnMatched-Brackets がありますが、メンテされてないので作りました。

詳細は github をどうぞ。

https://github.com/hrsh7th/vim-unmatchparen

# 注意
誤った開きカッコのハイライトに対応した段階でご検知を完璧に避けるのがきびしくなってきました。

また、あまり自分でも使い込めてないのでご検知がうるさく感じてしまう可能性があります。

そういう場合のオプションも用意しているので使ってください。

# 最後に
英語がやばすぎてお勉強中です。
英語に関する PR, issue に関してもお待ちしています!
Railsでログイン情報を永続化をする方法(クッキー・セッション方式)

Railsでログイン情報がブラウザを閉じると消えてしまう問題に悩まされていましたので、解決方法を記録しておきます。

今まで、ログイン時の処理は、

```ruby
if @user.save
  session[:user_id] = @user.id
```
と書いていました。これを

```ruby
if @user.save
  cookies.permanent.signed[:user_id] = @user.id
```
とすることにより、ブラウザを閉じてもログイン情報が消え無くなりました。

クッキーの中身を参照する場合は、

```ruby
cookies.signed[:user_id]
```

を使います。

## 簡単な解説
Railsのsessionではcookieのexpireがセットされないため、ブラウザを閉じるとそのcookieは無効になってしまいます。(sessionはそうしたい時に使うことが想定されている)

一方、Railsのcookiesではexpireを指定することができます。
cookies.permanentとすると、expireを20年にすることができます。
なお、ブラウザでcookieの値が必要になる場合を除いては、cookiesにsignedを使って暗号化を施すと良いです。(認証情報の場合は必須)
[詳しくは公式ドキュメントをご覧ください。](https://api.rubyonrails.org/v5.2.2/classes/ActionDispatch/Cookies.html)
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
VPS(Ubuntu)のログインにGoogle 2段階認証プロセス(2FA)を使う方法

## 環境
Conoha VPS(Ubuntu 18.04)

# 方法
以下、root権限を持ったアカウントで作業してください。
### １：UbuntuにGoogle 2FAを入れる
```
sudo apt-get install libpam-google-authenticator
```
### ２：設定を進める
１で2段階認証プロセスが無事入ったことが確認できたら、次に以下を打ち込み、設定を進めましょう。

```
google-authenticator
```
###３：詳細設定
そうすると、以下のように質問形式で設定を進めていくようになりますので、自分の要件に満たす回答を選んでください。

```
Do you want authentication tokens to be time-based (y/n):fist_tone4: y
（時間に基づいた認証トークンを使いたいですか？）
```
これをYESと答えると、コンソール上に巨大なQRコードが出てくると思います。
フルスクリーンモードにしないと見えないかもしれませんが、これをスマートフォンのAuthenticatorのアプリで読み込むと、自動でトークンが発行されます。
Authenticatorのアプリをお持ちでない場合には、こちらからダウンロードできます。
[iOS](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8&uo=4&at=)
[Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)
次に、以下のような質問が出てくると思います。
これはセキリュティ上NOにする理由がないので、これもYESにしましょう。

```
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y
（同じトークンで複数のユーザーがログインするのを防ぐ）
```
次に、トークンの有効期限延長について聞かれますが、これはNoでいいと思います。


```
By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n
```

最後の質問です。
こちらはブルートフォースアタックを防ぐための設定です。
３０秒間にログイン試行を３回までに限定できますので、これはYESにしましょう。

```
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
```
###４：Google 2段階認証プロセスを有効にする
以上の通りに設定が終わると、次に2段階認証を有効にしましょう。

```/etc/pam.d/sshd
auth required pam_google_authenticator.so　(初めの行に追記）
```
次に、```/etc/ssh/sshd_config　```　ファイルを編集します。

```/etc/ssh/sshd_config　
ChallengeResponseAuthentication yes　（コメントアウトを削除）
```
ここまでで全てのファイルが設定完了となりますので、設定を再読み込みしましょう。

```
sudo systemctl restart sshd
```
そして、実際にログインしようとすると、以下のようにトークンが求められるようになるので、スマホの画面に表示されているトークンを入力しましょう。

```
Verification code:
```

お疲れ様でした。　　
✳︎こちらの記事を参考にしました。
"SSH two-factor authentication: How to enable on your VPS"
https://blog.ssdnodes.com/blog/ssh-two-factor-authentication-vps/
N-gramの作り方

## はじめに
[自然言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)をやるに当たって、N-gramの壁にぶち当たる人もいるかと思うので、簡単にまとめます。

## N-gramとは
[コトバンク](https://kotobank.jp/word/N%E3%82%B0%E3%83%A9%E3%83%A0-1702302)では以下の様になってました。
> 任意の文字列や文書を連続したn個の文字で分割するテキスト分割方法．特に，nが1の場合をユニグラム（uni-gram），2の場合をバイグラム（bi-gram），3の場合をトライグラム（tri-gram）と呼ぶ． 

要するにテキストの分割方法なんですが、いまいちピンと来ない人もいるかと思います。

## 文字単位のN-gramの例
例で考えるとわかりやすいです。
例えば、`今日はいい天気ですね。`という文章をN-gramにしてみます。

### N=1 unigram
1文字取り出すだけなので、

```
'今', '日', 'は', 'い', 'い', '天', '気', 'で', 'す', 'ね', '。'
```

となります。

### N=2 bigram
bigramは2文字単位で取り出すので、

```
'今日', '日は', 'はい', 'いい', 'い天', '天気', '気で', 'です', 'すね', 'ね。'
```

となります。ここで、なるほど！となりました。
基準となる文字を1文字ずつずらしながら2文字で分割するんですね。

### N=3 trigram
ということは、trigramは3文字単位なので、

```
'今日は', '日はい', 'はいい', 'いい天', 'い天気', '天気で', '気です', 'ですね', 'すね。'
```

となるわけです。
（最後は、3文字以上取れなくなったらそこで終わるのか。）

## 単語単位のN-gramの例
単語単位だと形態素解析して、1単語単位でN-gramとして区切るので、

### unigram

```
'今日', 'は', 'いい', '天気', 'です', 'ね', '。'
```

### bigram

```
'今日は', 'はいい', 'いい天気', '天気です', 'ですね', 'ね。'
```

### trigram

```
'今日はいい', 'はいい天気', 'いい天気です', '天気ですね', 'ですね。'
```

となると。

## 長所と短所

### 長所

**辞書が必要ない**

- 形態素解析には辞書が必要だが、辞書がなくても単語の切り出しができる。（文字単位の場合のみ）

### 短所

**検索ノイズ**

- 検索結果に誤りが出てしまう
    - 辞書に載っている単語で区切るわけではないので、それを使用して検索しようとするとどうしてもノイズが入ってしまう

## 自然言語処理100本ノック 04.n-gramのソースコード

```python
def n_gram(target, n):
  # 基準を1文字(単語)ずつ ずらしながらn文字分抜き出す
  return [ target[idx:idx + n] for idx in range(len(target) - n + 1)]

target = "I am an NLPer"
print(n_gram(target, 1))
# > ['I', ' ', 'a', 'm', ' ', 'a', 'n', ' ', 'N', 'L', 'P', 'e', 'r']
print(n_gram(target, 2))
# > ['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
print(n_gram(target, 3))
# > ['I a', ' am', 'am ', 'm a', ' an', 'an ', 'n N', ' NL', 'NLP', 'LPe', 'Per']

words = target.split(' ')
print(n_gram(words, 1))
# > [['I'], ['am'], ['an'], ['NLPer']]
print(n_gram(words, 2))
# > [['I', 'am'], ['am', 'an'], ['an', 'NLPer']]
print(n_gram(words, 3))
# > [['I', 'am', 'an'], ['am', 'an', 'NLPer']]

```

## まとめ

区切り方がわかればこっちのものですね。とりあえずコードには落とせるようになったのではないでしょうか。

## 参考
[N-gramについて書いてみる](https://www.pytry3g.com/entry/N-gram)