OmniAICreator/Qiita-1.07M huggingface dataset:
dotnet コマンドでクラスライブラリとテストプロジェクトを作る

チートシート的なメモ。

# ソリューションフォルダの作成

```bash
mkdir sample
cd sample
```

## git のリポジトリの初期化

```bash
git init
```

.gitignore ファイルは以下

```
obj/
bin/
```

# ソリューションファイルの作成

フォルダ名と同じ名前の`.sln`ファイルが作成される。名前を変えるなら`-n`オプション。

```bash
dotnet new sln
```

# ライブラリプロジェクトの作成

```bash
dotnet new classlib -o Sample
dotnet sln add ./Sample/Sample.csproj
```

# クラスの作成

ファイル名は`.cs`ならなんでも。

```cs
using System;

namespace Sample
{
    public class SampleClass
    {
        public bool IsEven(int num)
        {
            return num % 2 == 0;
        }
    }
}
```

# テストプロジェクト(xUnit)の作成と参照の追加

```bash
dotnet new xunit -o Sample.Tests
dotnet sln add ./Sample.Tests/Sample.Tests.csproj
dotnet add ./Sample.Tests/Sample.Tests.csproj reference ./Sample/Sample.csproj
```

# テストクラスの作成

ファイル名は`.cs`ならなんでも。

```cs
using System;
using Xunit;

namespace Sample.Tests
{
    public class SampleClass_IsEven
    {
        [Fact]
        public void ReturnFalseGivenValueOf1()
        {
            var _sample = new SampleClass();
            var result = _sample.IsEven(1);

            Assert.False(result, "1 should not be even");
        }
    }
}
```

# テストの実行

パスは指定してもしなくてもよい。

```bash
dotnet test ./Sample.Tests/Sample.Tests.csproj
```

# （おまけ）nuget パッケージの追加

パッケージのページの.NET CLI の方のコマンドを追加したいプロジェクトあるディレクトリでコピペ実行すれば OK。
コマンドは以下の通り。

```
dotnet add <PROJECT> package [options] <PACKAGE_NAME>
```
Elaschsearch 6.5 レプリカを無くす

# Elasticsearch のレプリカを無くすには

テスト用途などで使う場合、シングルノードになるので、レプリカできません。
そういう場合、レプリカを無くす必要があります。
以前は、`elasticsearch.yml` に定義すればよかったのですが、現在(6.5)は違います。

## レプリカをゼロに設定する

```
> curl -XPUT http://localhost:9200/_settings -H 'Content-Type: application/json' -d '
{
   "index" : {
      "number_of_replicas" : 0
   }
}'
```

※indices の数が多かったりすると、時間がかかります。

ところで、これって再起動すると number_of_shards:5 / number_of_replicas:1 に戻ってしまうのはどうにかならんですかね・・・

### 参照

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html
Electronを使った開発中に「このモジュール、バージョン合ってねえ！」って怒られたときの対処

# 起きたこと

```shell
App threw an error during load
Error: The module '/Users/******/node_modules/serialport/build/Release/serialport.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
NODE_MODULE_VERSION 64. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:740:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:166:20)
    at Module.load (internal/modules/cjs/loader.js:620:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:559:12)
    at Function.Module._load (internal/modules/cjs/loader.js:551:3)
    at Module.require (internal/modules/cjs/loader.js:658:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at bindings (/Users/skawashima/Works/Research/arduino/test-j5/node_modules/bindings/bindings.js:81:44)
    at Object.<anonymous> (/Users/skawashima/Works/Research/arduino/test-j5/node_modules/serialport/lib/bindings/darwin.js:2:36)
```

注目すべきは、

```shell
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
```

このへん。
「このモジュール、バージョン合ってねえ！」ってことですね。

# 対処法
とあるGitHub issueにて、[ありがたいコメント](https://github.com/atom/node-keytar/issues/77#issuecomment-385841834)が有りました。

① `electron-rebuild`をインストール

```shell
$ yarn add electron-rebuild
# npm userであれば
$ npm install electron-rebuild
```

② `electron-rebuild`を実行

```shell
$ yarn electron-rebuild
# npm userであれば
# $ npx electron-rebuild
# (だっけ？)
```

これだけで、Electronとバージョンが合ってないモジュールを自動でリコンパイルしてくれました。

やったぜ。
Conformance test #1 について (前振り編)

# 全体の構成
- 前振り編 (いまここ)
    - #1 でテストされる入力ファイルおよび期待される出力の説明
- [実行コマンド生成編](https://qiita.com/tm_tn/items/d0cb50bf8ec3abe5d87d)
    - #1 で実行されるコマンドを CWL ファイルから生成する方法の解説
- [Docker & 出力パラメータ編](https://qiita.com/tm_tn/items/a32064f01769bb05f45d)
    - 実行コマンド生成編では取り扱わなかった、Docker 上でコマンドを動かす場合の解説および、出力パラメータの補足方法の解説

また、[ダイジェスト版の説明スライド](https://speakerdeck.com/ttanjo/how-to-pass-the-conformance-test-number-1)(英語)もあります。

# 注意！
この記事は CWL に対応したワークフローエンジンを実装する人向けの記事です！
CWL を書いて利用する一般の方は、お茶でも飲みながら軽い気持ちで読んでいただければ幸いです。

# はじめに
昨日の記事では「僕の考えた最強のワークフローエンジン」の準拠度を確認する conformance test の実行方法を解説しました。

本日は、エンジン実装者の最初の(そして初見殺しの)壁である conformance test #1 の突破に必要な言語仕様について解説する…前に、#1 がどんなテストなのかを簡単に示します。

# Conformance test #1 って？
雑に説明すると、指定された Python のスクリプトを動かして、出力ファイルを取得する(**ように見える**)単体のコマンドラインツールのテストです。

以下が CWL ファイルと入力パラメータです。

```yaml:v1.0/bwa-mem-tool.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: CommandLineTool

hints:
  - class: ResourceRequirement
    coresMin: 2
  - class: DockerRequirement
    dockerPull: python:2-slim

inputs:
  - id: reference
    type: File
    inputBinding: { position: 2 }

  - id: reads
    type:
      type: array
      items: File
    inputBinding: { position: 3 }

  - id: minimum_seed_length
    type: int
    inputBinding: { position: 1, prefix: -m }

  - id: min_std_max_min
    type: { type: array, items: int }
    inputBinding:
      position: 1
      prefix: -I
      itemSeparator: ","

  - id: args.py
    type: File
    default:
      class: File
      location: args.py
    inputBinding:
      position: -1

outputs:
  - id: sam
    type: ["null", File]
    outputBinding: { glob: output.sam }
  - id: args
    type:
      type: array
      items: string

baseCommand: python

arguments:
  - bwa
  - mem
  - valueFrom: $(runtime.cores)
    position: 1
    prefix: -t

stdout: output.sam
```

```json:v1.0/bwa-mem-job.json
{
    "reference": {
        "class": "File",
        "location": "chr20.fa",
        "size": 123,
        "checksum": "sha1$hash"
    },
    "reads": [
        {
            "class": "File",
            "location": "example_human_Illumina.pe_1.fastq"
        },
        {
            "class": "File",
            "location": "example_human_Illumina.pe_2.fastq"
        }
    ],
    "min_std_max_min": [
        1,
        2,
        3,
        4
    ],
    "minimum_seed_length": 3
}
```

```python:v1.0/args.py
#!/usr/bin/env python
import sys
import json
import os
args = [os.path.basename(a) for a in sys.argv[1:]]
with open("cwl.output.json", "w") as f:
    json.dump({"args": args}, f)
```


以下が cwltool による実行例です。

```console
$ git clone git@github.com:common-workflow-language/common-workflow-language.git
$ cd common-workflow-language/v1.0
$ cwltool --quiet v1.0/bwa-mem-tool.cwl v1.0/bwa-mem-job.json
{
    "args": [
        "bwa",
        "mem",
        "-t",
        "2",
        "-I",
        "1,2,3,4",
        "-m",
        "3",
        "chr20.fa",
        "example_human_Illumina.pe_1.fastq",
        "example_human_Illumina.pe_2.fastq"
    ]
}
```

# 解説の前に
ぱっと見ただけで、全力でエンジン実装者の心を折る気なのがわかりますね。
[次回](https://qiita.com/tm_tn/items/d0cb50bf8ec3abe5d87d)は、このテストの突破に必要な仕様の解説を行います。
pugでyaml読み込む

# やりたいこと

データや文言などがちょっと差し変わるだけの静的なページを量産したいときなど、pugで作ったテンプレートに文言をざくざく流し込めばいいんじゃね？ という気分になります。
世の中ね、そんな泥臭い仕事まっだまだたくさんあるのですのよ。

```event.pug
-
  // このデータを差し替えて使いまわしたい
  var data = {
    eventName: '第13回 芋煮会',
    eventDate: '2018/12/24'
  }
-

h1.event-name!= data.eventName
time.event-date!= data.eventDate
```

これくらいならいいんですが、せっかくなのでもっと簡単に書いて別ファイルにして読み込みなどすればもっと生産性が上がるのではないか。
自分以外の人に書いてもらうにしても取り回しが全然楽であるし。

```data.yaml
eventName: 第13回 芋煮会
eventDate: 2018/12/24
```

こういうのを読み込みたい。誰かに書いてもらって読み込むだけの簡単なお仕事にしたい。

# pugにyamlを読み込むには

pugからhtmlへの変換にはgulpとgulp-pugを使っています。

```gulpfile.js
var gulp = require('gulp');
var pug = require('gulp-pug');

...

gulp.task('html', function() {
  return gulp.src('event.pug')
  .pipe(pug({
    pretty: true,
    locals: {
      fs: require('fs'),
      path: require('path'),
      jsyaml: require('js-yaml')
    }
  })).pipe(gulp.dest('event'));
});
```

[js-yaml](https://github.com/nodeca/js-yaml)はあらかじめインストールしておいてください。

pugファイルはこのように。

```event.pug
- var data = jsyaml.load(fs.readFileSync(path.resolve('path/data.yaml')))

h1.event-name!= data.eventName
time.event-date!= data.eventDate
```

これでpugのなかでyamlの取り回しができるようになります。

# おまけ。

せっかく中のデータを書い（てもらっ）たのに、日付の書式変えて、とかいとも簡単に言われたりした時に。
ベタですが、私は[moment.js](https://momentjs.com/)を使っています。

moment.jsをインストールして、先ほどの `gulpfile.js` にちょっと追加。

```gulpfile.js
gulp.task('html', function() {
  return gulp.src('event.pug')
  .pipe(pug({
    pretty: true,
    locals: {
      fs: require('fs'),
      path: require('path'),
      jsyaml: require('js-yaml'),
      moment: require('moment')
    }
  })).pipe(gulp.dest('event'));
});
```

```event.pug
- var data = jsyaml.load(fs.readFileSync(path.resolve('path/data.yaml')))
- var date = moment(data.eventDate, 'YYYY/M/D')
// ここでロケールを指定すると曜日の出力形式も調整できます
- moment.locale('ja')

h1.event-name!= data.eventName
time.event-date!= date.format('YYYY年MM月DD日(ddd)')
```

このように、出力フォーマットを変更することができます。
Conformance test について

# はじめに
CWL では[仕様が公開されている](https://www.commonwl.org/v1.0/)ため、自分で CWL 準拠のワークフローエンジン(e.g.,「僕の考えた最強のワークフローエンジン」)を作成することも可能です。
また[Github のリポジトリ](https://github.com/common-workflow-language/common-workflow-language)で準拠度を計るためのテスト集 (以下では conformance test と呼びます) も公開されているため、自作したエンジンの準拠度を調べることも簡単に行なえます。

この記事ではワークフローエンジンの準拠度を確認できる conformance test の実行方法を解説します。

# 注意！
この記事は CWL に対応したワークフローエンジンを実装する人向けの記事です！
CWL を書いて利用する一般の方は、お茶でも飲みながら軽い気持ちで読んでいただければ幸いです。

# conformance test の実行方法
## 事前準備
```console
$ git clone git@github.com:common-workflow-language/common-workflow-language.git
$ cd common-workflow-language
$ pip install cwltest
```

## どう使うの
困ったときは `--help` で使用方法が出てきます。

```console
$ ./run_test.sh --help
run_test.sh: Run common workflow tool description language conformance tests.

Syntax:
 ...
```

## とにかく全部テストしたい
```console
$ ./run_test.sh
```
デフォルトでは cwl-runner (通常はリファレンス実装である [cwltool](https://pypi.org/project/cwltool/)) の準拠度テストを、[v1.0/conformance_test_v1.0.yaml](https://github.com/common-workflow-language/common-workflow-language/blob/master/v1.0/conformance_test_v1.0.yaml) に書かれたテストを用いて行います。

出力は以下の形式になります。

```console
$ ./run_test.sh
...
153 tests passed, 13 failures, 29 unsupported features

1 tool tests failed
```
この例は、195個のテスト中153個はパス、13個は失敗、29個のテストは処理系が未サポートの機能を含むためスキップされたことを示しています。

## 特定のテストだけ実行したい
```
$ ./run_test.sh -n=1
```
上記では、一番最初のテストのみ実行します。`-n` には `1-3` や `2,4,6` などの記法で、複数のテストの実行を指定することもできます。

## 自作のワークフローエンジンのテストをしたい
```console
$ ./run_test.sh RUNNER=/path/to/your-own-engine
```
`RUNNER` 変数で指定したワークフローエンジンの準拠度テストを行います。`run_test.sh` は `RUNNER` に `--quiet` オプションと入力の CWL ファイル、パラメータが書かれた YAML (or JSON) ファイルを与えて実行します。

## テストの実行が遅い
```console
$ ./run_test.sh -j=32
```
`-j` オプションを使うことで、並列にテストを行うことができます。
しかし、各テスト時のエラー表示も混ざって出てきてしまうため、標準出力で確認する場合には使いにくいです。`--junit-xml=foobar.xml` を使うことで、Junit 形式の出力を `v1.0/foorbar.xml` に出力してくれるため、こちらと併用するのが良さそうです。

# エンジン実装上の注意
未サポートの機能に対しては `33` をリターンコードとして返すことで、`run_test.sh` がそれを認識して `unsupported features` に振り分けてくれます[^1]。

[^1]: v1.1 から、[CWL の処理系のツール定義](https://github.com/common-workflow-language/cwl-v1.1/blob/master/cwl-runner.cwl)が提供されています。v1.0 でも インターフェースは同じなので、この CWL ファイルで動くように処理系を作成するといいでしょう。
UiPath RDP(リモートデスクトップ)先での動作

## リモートデスクトップ接続先PCでUiPathを動作させる
UiPathがインストール済み環境にリモートデスクトップ接続して、UiPathを実行できるか？

## 結論
できる

## 注意点
- ロボット起動後にRDP接続を切ったりして、ロック状態にしないようにする。

※ロック状態でも動作するためには、すべての動作を"BackgroundAutomation"対応させる
https://www.uipath.com/kb-articles/background-automation-method

- クリップボードの共有は切っておいたほうがベター
Common Workflow  Language 関連リンク集

# はじめに

Common Workflow Language Advent Calendar へようこそ！

[Common Workflow Language](https://www.commonwl.org) (CWL) はワークフローやツールの定義を行うための記述言語で、ワークフローエンジン間のポータビリティを向上させるために作られたオープン規格です。

CWL でワークフローやツール定義を書いておくことで、他の人とワークフローを共有するのが容易になります。

詳細については関連リンクをご覧ください。


# 関連リンク
- 公式サイト: https://www.commonwl.org
    - 対応エンジンや関連ツールへのリンクもあります。
- Common Workflow Language User Guide: https://www.commonwl.org/user_guide/
    - とりあえず使い方を知りたい方はこちら。
- CWL Recommended Practices: http://www.commonwl.org/user_guide/rec-practices/
    - CWL でツール定義やワークフロー定義を書く方はこちらをどうぞ。
- CWL Start Guide JP (日本語): https://github.com/pitagora-galaxy/cwl/wiki/CWL-Start-Guide-JP
    - 日本語で概要を知りたい方向け。
- 2017年 CWL Advent Calendar: https://qiita.com/advent-calendar/2017/cwl
Werckerでapt-get updateするとInReleaseファイルの有効期限が切れていると怒られる

# 概要

- Wercker上で `apt-get update` する設定をしていたら、あるとき突然エラーを吐くようになりました。。
- そのとき調べたことを忘れないようにメモしておきます。(大した内容じゃないけどね)

# 設定内容

- Wercker上でテストコードを実行するためにpostgresql-clientをインストールする必要があり、以下のような感じでリポジトリを登録する処理を行っていました。

```yaml

    - script:
        name: add repository
        code: |
          echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -sc)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
          wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
          sudo apt-get update
```

# エラー内容

- 上記の設定で問題なく実行されていたのがあるときエラーを吐くように。。

```
Reading package lists...
E: Release file for http://security.debian.org/debian-security/dists/stretch/updates/InRelease is expired (invalid since 3d 4h 46min 32s). Updates for this repository will not be applied.
E: Release file for http://deb.debian.org/debian/dists/stretch-updates/InRelease is expired (invalid since 6d 6h 49min 58s). Updates for this repository will not be applied.
```

- `expired` ってあるのでInReleaseファイルを確認しましたが、Valid-Untilは有効期限内でした。
- サーバタイムがおかしいのか？と思いdateコマンドで出力するように確認しましたが、正しい時刻でした。

# とりあえず対応

- 面倒だったのでとりあえず以下のようにオプション指定して対応しちゃいました。

```
sudo apt-get -o Acquire::Check-Valid-Until=false update
```

- これでちゃんと動くようになります。

# 気になったのでちゃんと確認した

- そもそもちゃんと動いていたものが突然動かなくなるのは？。。。 **キャッシュ**？
   - はい。そうでした。。。

# Wercker上のCache

- 以下に記載がありますが、インストール時間短縮などの目的でダウンロードしたファイルなどをWercker側でキャッシュしているようです。(１４日間もしくは1GBを超えない範囲で)
    - [The Wercker Cache](https://devcenter.wercker.com/development/pipelines/wercker-cache/)
- WerckerのOptions画面からクリア出来ます。
    - [Application Page](https://devcenter.wercker.com/overview-and-core-concepts/wercker-tools/web-interface/application-settings/#options)
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/81ec5e55-82a9-e7aa-8f8f-61d182da9d7d.png)
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/b2e5f960-c643-5506-7266-e2136d64511b.png)

# まとめ

- 上記のようなエラーが出たらcacheをクリアしましょう。
- Werckerのページにあるようにキャッシュされていたら削除するとかスクリプトで実装しても良いかもですが、それならいっそ `Check-Valid-Until=false` の設定で良いかもしれない。。
- 単純に勉強不足でした。。
- (そろそろWerckerやめたいなー。。)

# 参考

- こちらにもすでに同じ内容の情報があがっていました。
  - http://nyangryy.hatenablog.com/entry/2015/08/06/120950
  - https://qiita.com/jtakahashi64/items/75e5d494fb3c07bad12f
SlackにFileMakerから通知を送信する

FileMakerでデータの更新があったときに何らかの通知があればいいなあと思うことがよくあります
Slackに通知を送信することができれば、そのほかのサービスでも応用が利くのではないかと考え、テスト作成してみました

#準備
Slackのアカウントはある前提
FileMaker17でテストしました
Slackの**"Incoming Webhook"**というアプリケーションを追加しておきます
![スクリーンショット 2018-11-27 12.49.08.png](https://qiita-image-store.s3.amazonaws.com/0/181254/73f2fd8c-c742-2913-3b8e-38903b98afde.png)

#Slackの設定
Incoming Webhookを追加
チャネルとしてテスト用に **#filemaker_notify** というチャネルを追加しました
アプリの設定画面から**Webhook URL**をコピーしておきます

#FileMakerの設定
<img width="843" alt="スクリーンショット 2018-11-27 13.11.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/869f1f31-d47b-bc1d-21b3-7aaf370f5c05.png">
こんな感じのテスト用のファイルを作成しました

送信スクリプトは以下の通り
webhook_url はそれぞれで異なっているはずです

```FileMaker:Script
# ------------------------------
# Slackに通知を流す
# SlackにIncoming webhook を追加しておくこと
# ------------------------------
# 
# ------------------------------
# IncomingWebhook を設定した際に提供されるURL
変数を設定 [ $webhook_url ; 値: "https://hooks.slack.com/{TOKEN}" ] 
# ------------------------------
# 
# ------------------------------
# 送信するデータ
変数を設定 [ $text ; 値: //送信するテキスト JSON送信テスト::text ] 
変数を設定 [ $username ; 値: //Slackに表示させるユーザ名 JSON送信テスト::username ] 
変数を設定 [ $channel ; 値: //送信するチャネル JSON送信テスト::channel ] 
# ------------------------------
# 
# ------------------------------
# JSONSetElementでJSONの型にはめる
変数を設定 [ $JSON ; 値: JSONSetElement ( $JSON ; ["text"; $text ; JSONString]; ["channel"; $channel ; JSONString]; ["username"; $username ; JSONString] ) ] 
# ------------------------------
# 
# ------------------------------
URL から挿入 [ 選択 ; ダイアログあり: オフ ; $$Results ; $webhook_url ; cURL オプション: "curl -X POST -d " & $JSON ] 
# ------------------------------
```
問題なく送信されると、$$Resultはokを格納します、エラーが起きるとエラーメッセージを格納します

#送信テスト
<img width="496" alt="スクリーンショット 2018-11-27 13.23.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/4809c1ba-8495-bbd4-b1df-4bebec02564a.png">
・改行はそのまま有効になります
・URLもそのまま書いたら有効になりました
<img width="627" alt="スクリーンショット 2018-11-27 13.25.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/a6ca76a5-b293-4d4b-aa49-c945c52b9e99.png">

##今後は
スクリプトトリガと連携させて通知を自動化することで、できることは広がりそうな予感がします
[Lightning Network] 日本語のLapps コミュニティを作りました

https://lapps.green/communicate
↑こちらから参加可能です。

ライトニングネットワーク関係のコミュニティは、英語がほとんであって、日本人には馴染みにくいものでした。そこで私を含めたいくつかの人が日本語コミュニティを作っています。

既存のライトニング系日本語コミュニティは[オフチェーンアカデミー](https://lightning-academy.connpass.com/)があります。しかし、こちらは開発者向けであって、（2018年11月現在は）Lappsよりはライトニングネットワークそのものの技術の話題が多いです。

そこで、非エンジニアやブロックチェーン初学者、そしてアプリ開発者がより気軽に情報交換や質問ができるコミュニティも作りました。[こちら](https://lapps.green/communicate)からSlackコミュニティに参加できますので、どなたでもお気軽に参加してください。
[Lightning Network] Lappsの情報サイトを部屋作りました

ライトニングネットワーク自体の情報はネットにちょこちょこあるけど、それを用いたアプリ、いわゆるLapps の情報は全然転がっていません。ということで簡単な[情報サイトを作りました](https://lapps.green/)。技術者向け・非技術者向け両方の情報を扱っていますので、どなたでもお気軽に訪問してください。
【Jenkins】初期設定

#Jenkinsを起動
・Windowsの管理ツールのWindowsサービスでJenkinsを起動
・[http://localhost:8080/](http://localhost:8080/)にアクセス

#初期パスワードを入力
インストールしたディレクトリの中にsecretsというディレクトリがあり、その中にinitialAdminPasswordというファイルがあるので、テキストエディタで開き、内容をコピーして下の画面に入力します。

![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/230436/c2b66460-e26c-9576-2d12-697289beff37.jpeg)

#プラグインのインストール
推奨設定／任意設定を選択できます。
![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/230436/a87a5558-b930-29db-903e-e9ef0e47b9b7.jpeg)
インストールが始まります。
![03.JPG](https://qiita-image-store.s3.amazonaws.com/0/230436/f5d8f022-db27-57cb-0126-a7b42e784266.jpeg)

#管理者ユーザを作成
![04.JPG](https://qiita-image-store.s3.amazonaws.com/0/230436/09988950-9f36-0d1e-a65f-182360434cae.jpeg)

#初期設定完了
![06.JPG](https://qiita-image-store.s3.amazonaws.com/0/230436/eead30be-b139-9d33-531d-aeffbd2e3c6a.jpeg)
📔 システムエンジニアならバッファをなくす爆速仕事術

# 連絡共有コミュニケーションのバッファをなくす

- 必要になったら爆速連絡。
- 間違ったら爆速で訂正すれば良い
- 心理的安全性はそうやって作るものですよ

# アウトプットのバッファをなくす

- 下書き機能とか使ってる場合じゃない
- 書きたい記事を書かないでもう何年が過ぎただろう
- 箇条書きで良いからアイディアレベルでもアウトプット！

# 脳のバッファをなくす

- あのツールこのツールが良い悪いじゃなくて、爆速でバッファを無くせる環境を作る
- アナログのホワイトボード、GithubのPR、Pivotalのストーリー、付箋紙などを使ってバッファを最小化していこう
- 人に話すことで他の人が覚えておいてくれるかもしれない、短気で傲慢なエンジニアならそうするね
- 何でも必要最低限にするからクラス設計とかもうまくいく模様でしょう

# Next?

[爆速 yumainaura - Google Search](https://www.google.co.jp/search?q=%E7%88%86%E9%80%9F+yumainaura&oq=%E7%88%86%E9%80%9F+yumainaura&aqs=chrome..69i57j69i60l3j0l2.2325j0j9&sourceid=chrome&ie=UTF-8)










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Lightning Network] 日本語版Wikipediaを翻訳しました

[こちら](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%88%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)から見られます。訳に間違いなどがあったら、訂正していただけると助かります。

これを読めばだいたいライトニングの歴史と技術はわかります。より詳しく学びたい人は[原論文](http://lightning.network/docs/)を読むといいでしょう。
【Jenkins】Windows7マシンへのインストール

#ダウンロード＆インストール
[Jenkinsの公式サイト](https://jenkins.io/)からWindows版のインストーラをダウンロードし、インストール。

#ポート変更（任意）
インストールしたディレクトリの直下にあるjenkins.xmlを変更

```xml:jenkins.xml
  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>
```
`--httpPort=8080`を`--httpPort=任意のポート`に変更

変更後はJenkinsを再起動。
1.`Ctrl`+`Shift`+`Esc`でタスクマネージャを起動して、[サービス]タブを選択
2.右下の`サービス`をクリック
3.Jenkinsを再起動
※Windowsタスクマネージャのサービスタブからは起動できず、サービスを起動する
ズンドコキヨシ：Pythonで簡単に実装篇

# はじめに
やりたいことが特に思いつかなかったのですが、無性にプログラミングがしたくなったところ、友人にズンドコキヨシやってみたらと言われたのでやってみました。
めっちゃ簡単に実装してます。
ワンライナーとか挑戦してみたかったのですが、自分の頭じゃ思いつかなかったので。

# 実装
```python:zunndoko.py
# -*- coding: utf-8 -*-
import random

zundoko = list(map(str, range(5)))
while ''.join(zundoko) != 'ズンズンズンズンドコ':
    del zundoko[0]
    zun = random.choice(['ズン','ドコ'])
    print(zun, end='')
    zundoko.append(zun)

print('キ・ヨ・シ！')
```

# 出力
```
ズンズンドコズンズンズンズンドコキ・ヨ・シ！
```
[html] [css] [ios] ページ全体のスクロールを無効にする

画面ぴったりのアプリケーションを作ってると、スクロールが邪魔になる。
そこでページ全体のスクロールを無効にする方法を調べてみた。
真っ先に出てきたのがこれ。

```scss
body, html {
  overflow: hidden;
}
```

しかし iphone で確認すると、ページが動いてしまう。
https://qiita.com/mimoe/items/f5f668cebb697d073553
すると大丈夫らしいが、 css だけで出来た。

```scss
body {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
```

これでおｋ。
[エラー]'RNSVGLinearGradient' was not found in the UIManager [React Native]

# 'RNSVGLinearGradient' was not found in the UIManager の解決方法

類似のエラーについての記事はいくつかあったが、英語だったり中国語だったりしたので日本語でも書いておきます。
[参考記事]
https://github.com/indiespirit/react-native-chart-kit/issues/26
https://www.cnblogs.com/shaoting/p/8085136.html

##　結論
手動でライブラリをリンクすればよい

## 具体的な方法

1. xcodeでプロジェクトを開く
2. Libraries -> Add Files to [プロジェクト名]
<img width="308" alt="スクリーンショット 2018-11-27 11.56.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/316082/2282b629-b017-998d-3d00-c92ac6f36fab.png">
3. node_modules / react-native-svg / ios / RNSVG.xcodeprojを追加
4. プロジェクト名をクリックして、Generalの中〜下段にある 
Linked Frameworks and Libraries に libRNSVG.aを追加
Glide4.8 Glide - You must not call setTag() on a view Glide is targeting

# 原因 Glideがtag使ってるから

```java
for(int i=0; i < max; i++)
{
    imageView.setTag( items.get(i) ); // ←ここで例外が上がってしまう。
    Glide.with(this)
    // (略)
        .into(imageView);
}
```

## 対策 失敗編
- [Error “You must not call setTag() on a view Glide is targeting” when use Glide](https://stackoverflow.com/questions/34833627/error-you-must-not-call-settag-on-a-view-glide-is-targeting-when-use-glide)

を参考にしてみる

```java
public class App extends Application {
    @Override public void onCreate() {
        super.onCreate();
        ViewTarget.setTagId(R.id.glide_tag);
    }
}
```
src/main/values/ids.xml

```xml
<resources>
    <item type="id" name="glide_tag" />
</resources>
```

![glide-1.png](https://qiita-image-store.s3.amazonaws.com/0/71525/b7fb5a43-a001-c765-8dbd-01a69b389bc8.png)

![glide-2.png](https://qiita-image-store.s3.amazonaws.com/0/71525/f89243cd-98c5-793a-0ed9-c5bb72d0e2cd.png)

あ～この情報は古かった。

- [Glide v4 Targets](https://bumptech.github.io/glide/doc/targets.html#targets)
を見てみた。わからん XD


## 対策 成功への道

- [Tag alternative when using Glide](https://stackoverflow.com/questions/53469914/tag-alternative-when-using-glide)

```java
myButton.setTag(100 /* or any other integer key except 0 */, someValue);
```

なるほど～

これですね。

```java
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
    public void setTag(int key, final Object tag) 
    public Object getTag(int key) 
```

やってみよう。

```java
    imageView.setOnClickListener(imageViewLister);
    for(int i=0; i < max; i++)
    {
        imageView.setTag(i, items.get(i) );
    }
```

これだと keyのi が定数じゃないよって怒られた ;(
こんなので定数切りたくない...(´・ω・`)

## 対策 成功編

### ( ✧Д✧) 自分のIDという定数あるじゃん!!

一件落着

```java
    imageView.setOnClickListener(imageViewLister);
    for(int i=0; i < max; i++)
    {
        imageView.setTag(imageView.getId(), items.get(i) );
    }

    private View.OnClickListener imageViewLister =  new View.OnClickListener() {
        @Override
        public void onClick(View view)
        {
            Item item = view.getTag(view.getId());
        }
    };

```
Golangて何？

# Golang

Goプログラミング言語は　Googleが主催するオープンソースのプログラミング言語です。
2009年に初めて発表されて以来、人気を博しました。GoはGo自身で書かれてまして2011年初の安定版リリースしました。
現在、世界中の多くの企業がさまざまなアプリケーションで使用されています。 例：Dropbox、Google、SoundCloud、CloudFlare、Docker、Cloud FoundryはGoプログラミングユーザーの一部です。
<a href="http://programmerhelper.net/wp-content/uploads/2018/11/go_03.jpg"><img src="http://programmerhelper.net/wp-content/uploads/2018/11/go_03.jpg" alt="" width="150" height="106" class="alignnone size-full wp-image-632" /></a>

## Go言語 (golang)の良い点

+ コンパイルが速い
+ セキュアなメモリ管理
+ 妥当で現実的なレベルの型安全性
+ 実行時パフォーマンスが良さ
+ 標準ライブラリが整備されている
+ シンプルでバランスの取れた言語仕様
+ 非知的なプログラマのためにデザインされている
+ スレッドモデルによる並行プログラミング
+ Dockerなどの素晴らしい大規模プロジェクトでの実績がある
+ Googleによる開発
+ サードパーティ製のライブラリの豊富さと実績

Golangへの態度は何ですか？
学習する価値がありますか？
Goのメリットとデメリットは何だと思いますか？
いろいろ疑問がありますが、　
じゃ、　始めてみましょう。。。

## オンライン開発環境

1. [Codeanywhere](https://programmerhelper.net/ja/2018/11/13/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/)でサインアップとログインします。
2. 次に、「コンテナ」を作成します。
<a href="http://programmerhelper.net/wp-content/uploads/2018/11/go_01-2.png"><img src="http://programmerhelper.net/wp-content/uploads/2018/11/go_01-2.png" alt="" width="604" height="372" class="alignnone size-full wp-image-625" /></a>
3. 数分待ってから　SSH Terminal　でアクセスしてください。
<a href="http://programmerhelper.net/wp-content/uploads/2018/11/go_02.png"><img src="http://programmerhelper.net/wp-content/uploads/2018/11/go_02.png" alt="" width="505" height="474" class="alignnone size-full wp-image-627" /></a>

## Webサーバーの作成

今から　Go　が実行出来ますの簡単にWebサーバー作って見ましょう。。。

+ `web.go`　ファイルを作成します。
+  次は以下のコードを書きます。

```
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello Go User %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
```

+  `go run web.go` を実行します。
+  後はブラウザで確認します。
+  `http://port-8080.Go--xxxxx.codeanyapp.com` このリンクで確認出来ます。

## 自分のURLを確認

+ `Info`　から自分のURLを確認出来ます。

<a href="http://programmerhelper.net/wp-content/uploads/2018/12/go_info.png"><img src="http://programmerhelper.net/wp-content/uploads/2018/12/go_info.png" alt="" width="648" height="250"></a>

+  ブラウザで確認すると見えるのはこいう感じです。

<a href="http://programmerhelper.net/wp-content/uploads/2018/12/go-info_2.png"><img src="http://programmerhelper.net/wp-content/uploads/2018/12/go-info_2-1024x106.png" alt="" width="648" height="67" class="alignnone size-large wp-image-661" /></a>

続きは　[Go入門　] (https://qiita.com/kyawphyonaing/items/72d55ffed157feeaa7be)で学習が出来ます。
CBLAS 使ってみた

# CBLAS とは

- BLAS を C 言語から呼び出すためのライブラリ
- ベクトルと行列に関する基本的な演算ができる
- 行優先か列優先か選択できる

## ビルド

- [LAPACK/BLAS の設定メモ （mac）](https://qiita.com/nek0log/items/5733b8b886b9ad93ae11)
- [LAPACK/BLAS の設定メモ （Ubuntu）](https://qiita.com/nek0log/items/e6077b18898d7f449cc4)

# サンプルコード

## 内積

$x^T y$

```C:dot.c
#include <stdio.h>
#include <math.h>
#include <cblas.h>

int main(void){
    double X[] = {1.0,2.0,3.0,4.0,5.0};
    double Y[] = {6.0,7.0,8.0,9.0,0.0};
    int N = 5;

    printf("inner product: %f\n", cblas_ddot(N,X,1,Y,1));
    
    return 0;
}
```

### 出力結果

```
$ gcc -o dot dot.c -lcblas -lblas -lm
$ ./dot
inner product: 80.000000
```

## ノルム


$l_1$ノルム： $||x||_1$

$l_2$ノルム： $||x||_2$

```C:nrm.c
#include <stdio.h>
#include <math.h>
#include <cblas.h>

int main(void){
    double x[] = {1.0,2.0,3.0,4.0,5.0};
    int N = 5;

    printf("1-norm,2-norm: %f,%f\n",
    cblas_dasum(N,x,1),cblas_dnrm2(N,x,1));

    return 0;
}
```

### 出力結果

```
$ gcc -o nrm nrm.c -lcblas -lblas -lm
$ ./nrm
1-norm,2-norm: 15.000000,7.416198
```

## ベクトルと行列の演算

$y := \alpha Ax + \beta y$

```C:gemv.c
#include <stdio.h>
#include <math.h>
#include <cblas.h>

void print_vec(double *v,int v_dim){
    for (int i = 0; i < v_dim; ++i){
        if (i == v_dim-1)
            printf("%.3f\n",v[i]);
        else
            printf("%.3f ",v[i]);
    }
}

int main(void){
    double A[] = {1.0,2.0,3.0,4.0,  5.0,6.0,7.0,8.0,  9.0,10.0,11.0,12.0};
    double x[] = {10.0,20.0,30.0,40.0};
    double y[] = {50.0,60.0,70.0};
    int M = 3, N = 4, lda = N;
    double alpha = 2.0, beta = 3.0;

    cblas_dgemv(CblasRowMajor, CblasNoTrans, M, N, alpha, A, N, 
    x, 1, beta, y, 1);

    print_vec(y, M);

    return 0;
}
```

### 出力結果

```
$ gcc -o gemv gemv.c -lcblas -lblas -lm
$ ./gemv
750.000 1580.000 2410.000
```

## ２つの行列の演算

$C := \alpha AB + \beta C$

```C:gemm.c
#include <stdio.h>
#include <math.h>
#include <cblas.h>

void print_matrix(double *data,int row,int col){
    int i,j;

    for (i = 0; i < row; ++i){
        for (j = 0; j < col; ++j){
            printf("%.3f ", data[i*col + j]);
        }
        printf("\n");
    }
}

int main(void){
    double A[6] = {1.0,2.0,  3.0,4.0,  5.0,6.0};
    double B[8] = {1.0,2.0,3.0,4.0,  5.0,6.0,7.0,8.0};
    double C[12];
    int M = 3, N = 4, K = 2;
    double alpha = 1.0, beta = 0.0;

    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K,
    alpha,A,K,B,N,beta,C,N);

    print_matrix(C,M,N);

    return 0;
}
```

### 出力結果

```
$ gcc -o gemm gemm.c -lcblas -lblas -lm
$ ./gemm
11.000 14.000 17.000 20.000
23.000 30.000 37.000 44.000
35.000 46.000 57.000 68.000
```
Pro microを使った画面ロックボタン作成

この記事は[リンク情報システム](https://www.lis.co.jp/)の2018年アドベントカレンダーのリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://www.facebook.com/lis.co.jp/)から）

#はじめに
私は職場で「Realforce106」というキーボードを使っています。
このキーボードは打ち心地がサイコーで基本的に不満がないのですが、
一つだけ困っていることがあります。

それは「Windowsキー」がないことです。

職場のPCは離席時に画面ロックをしないといけないのですが、
画面ロックのショートカットキーが「Windowsキー + l」なので
「Windowsキー」がないとショートカットすることができないのです。

またPCはセキュリティの関係でネットワークに接続せずに使用しているので
キー配置変更ソフトをダウンロードして使うこともできません。

そこでないなら作ってしまえということで、
スイッチサイエンスの「Pro micro」を使用して画面ロックボタンを作成します。

#作成
##使用したもの
・Pro micro(スイッチサイエンス版)
・抵抗(10KΩ)
・スイッチ(モーメンタリ)
※オルタネイトだとキーが押しっぱなしになってしまうので必ずモーメンタリにしてください
・ケース
・USB TypeBコネクタ
＆その他細々とした部品

##開発環境
・Arduino IDE 1.8.6
※書き込み時にはボード選択をArduino Leonardoにしてください

##コード
```C:
#include "Keyboard.h"

const int Button = 4;

void setup()
{
  pinMode(Button, INPUT);
  Keyboard.begin();
}

void loop() {
  if (digitalRead(Button) == LOW)
  {
    Keyboard.press(KEY_LEFT_GUI); 
    Keyboard.press('l'); 
    Keyboard.releaseAll();
  }
}
```
##回路図
ただのプルアップ回路なので書かない予定です。
もし要望があれば書きます。

##外装
ケースに穴を開けて、スイッチとUSB TypeBのコネクタをつけてます。
内部ではUSB TypeBからUSB microBにコネクタを変換してPro microに接続しています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/81f44b9f-a11c-1de5-4cab-c2a3cf43a24b.jpeg" width=50%>


#動作
![IMB_kduuIT.GIF](https://qiita-image-store.s3.amazonaws.com/0/286312/fd93fc52-0831-2bbb-0f64-df12202deb21.gif)


#まとめ
ボタンひとつで画面ロックができるようになりました。

が、賢明なみなさまはもうお気づきかと思います。

それは会社のPCには勝手にUSB機器を接続しちゃいけないということです。
申請をすればOKかもしれませんが、ボタンを作る以上に面倒なので却下です。

別の手段を考えないといけないですね。

また今回は画面ロック用に作りましたが、コードを書き換えれば他のショートカットキーも
実装することができるので、それをやってみるのもよいかもしれません。

#注意
入力デバイスを作成するので、回路やコードが正しく作成できているか必ずチェックしてください。
間違えたピン番号を指定すると、誤作動の原因となります。

#参考
[Arduino キー定義](https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/)
脆弱性情報収集について調べてみた👀✍

# はじめに
[WebブラウザとWebアプリケーションのセキュリティについて考えてみたメモ](https://qiita.com/hot_study_man/items/6fd0d2708e69c1d5a71d)の続き。脆弱性情報の用語のまとめと、どこから脆弱性情報を収集すればよいの？についてまとめてみました。

# 参考
[共通脆弱性識別子CVE概説](https://www.ipa.go.jp/security/vuln/CVE.html)
[脆弱性情報データベース](https://ja.wikipedia.org/wiki/%E8%84%86%E5%BC%B1%E6%80%A7%E6%83%85%E5%A0%B1%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)

# 用語
# 脆弱性について
## 脆弱性とは
悪用できるバグである

# 脆弱性管理
* 米MITRE社(後述)が情報を収集して各脆弱性に対してCVE-IDを採番して管理

## CVEとは
* 米MITRE社が提供している脆弱性情報データベース
* 脆弱性にユニークな識別番号 「CVE-ID」（CVE-登録時の西暦-通し番号の形式）がついている

# 海外
## 米MITRE（マイター）社
* サイバーセキュリティを専門とする政府系研究開発センターを運営し、米国政府への技術支援などを行っている非営利組織
* CERT/CCやHP、IBM、OSVDB、Red Hat、Symantecなど80を超える主要な脆弱性情報サイトと連携して、脆弱性情報の収集と、重複のない**CVE-IDを採番、管理**している
* **日本もJVNで公表する脆弱性に対するCVEの割り当てを申請している**ので日本の情報も含まれているという認識
* https://cve.mitre.org/

## NVD
* NIST(アメリカ国立標準技術研究所)が管理している脆弱性情報データベース。NISTはMITREのスポンサー。
* CVEで命名された脆弱性情報の**詳細情報**をNVDで提供
* Common Vulnerability Scoring System（通称CVSS）による危険度の採点している
* https://nvd.nist.gov/

# 日本
## JVN
* JPCERT/CCと情報処理推進機構（IPA）が共同で管理している脆弱性情報データベース。[Webサイト](https://jvn.jp/)で公開している
* CVEの管理団体が米国であるために日本での脆弱性情報が網羅されているわけではなく、そのような事情に鑑みて日本の脆弱性情報に焦点を置いたものとなっている
  - JVNのサイトを見るとCVEの採番されていないものもあり、それは日本特有のものなのだと思う。**JVNでは日本特有の脆弱性情報も網羅**している
* **日本もJVNで公表する脆弱性に対するCVEの割り当てを申請している**


## JVNiPedia
* JVN iPediaはJVNよりもさらに日本向け情報に特化
* [Webサイト](https://jvndb.jvn.jp/)

## IPA(セキュリティ)
コンピュータウイルス・不正アクセス・脆弱性について、発見および被害の届出を受け付けている。被害状況の把握だけでなく、啓発情報の発信、暗号技術の調査と評価、システムの情報セキュリティ評価・認証、情報セキュリティを高めるための技術開発・調査研究なども行っている。

## JPCERT/CC
脆弱性情報に関して日本国内のサイトに関する報告の受け付け、対応の支援、発生状況の把握、手口の分析、再発防止のための対策の検討や助言などを、技術的な立場から行なっている

# まとめ
## どこから脆弱性情報収集するのか？
* 各ベンダ
  - MITREよりもはやい？
* NVD(海外)
  - NVDはMIRTEの詳細バージョンなのでNVDをチェックする
  - https://nvd.nist.gov/
* JVN(日本)
  - https://jvn.jp/
* JVNiPedia(日本)
  - https://jvndb.jvn.jp/

JVNとJVNiPediaをみる。JVNiPediaは海外から(NVD)も情報を収集しているので、この２つをみることで日本、海外の脆弱性情報を網羅できるはず。


自動化する仕組みが必要。そのあたりについてはまた今度。Vulsかな？

# CentOSサーバーでの脆弱性対応
https://dev.classmethod.jp/security/linux-vulnerability/
🔧 まだ生産性で消耗してるの？ エンジニアが頭に叩き込むべき時間とエネルギーの相関図



![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0fb4d4b1-a6ba-73a1-e247-551004c3d9b2.png)

# 左. 時間の迷信

- 時間に生産性が比例する。
- 工業化時代の遺物。
- いつの時代ですか？

# 中. エネルギー管理の時代

- 生産にはエネルギーが必要
- エネルギーが空になったら補充が必要
- emptyのまま走り続けるなよ

# 右. 注意力をすり減らす全てをぶん投げろ

- 悪いUIを持つツール
- 人や自分の注意力を奪うノロノロとした報連相
- 爆速基準でないものの全てたち










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bashでscpするシェルスクリプト

やりたいこと
各サーバーのログファイルを定期的に取得し保存する。保存元のサーバーでシェルスクリプトを書いてみました。

- 保存したログファイルは保持期間が過ぎていれば削除する
- webとapiのログファイルは当日日付、batchは前日日付
- bashのバージョンはGNU bash, version 4.2.46

```bash
#!/bin/bash -eu

# sshログイン
SSH_LOGIN="-i ~/.ssh/id_rsa [username]@"

# ファイル保持期間
PERIOD=5

# 前日日付
PRE_Y="$(date '-d 1 day ago' +%Y)"
PRE_M="$(date '-d 1 day ago' +%m)"
PRE_D="$(date '-d 1 day ago' +%d)"
PRE_YMD=${PRE_Y}${PRE_M}${PRE_D}

# 当日日付
TO_YMD="$(date +%Y%m%d)"

# エラーメッセージ
error_msg=""

# 各サーバーのコピー元ファイルとコピー先ディレクトリのハッシュ
declare -A WEB
WEB["/var/log/nginx/www.hoge.jp/*.log-${TO_YMD}.gz"]="/server_logs_backup/web@/var/log/nginx/"

declare -A API
API["/var/log/nginx/api.hoge.jp/*.log-${TO_YMD}.gz"]="/server_logs_backup/api@/nginx/"

declare -A BATCH
BATCH["/home/hoge/app/logs/${PRE_YMD}.php.gz"]="/server_logs_backup/batch@/app/logs/"

# 各ホストのIPとサーバーのハッシュ
declare -A HOST
HOST["IP address"]="WEB"
HOST["IP address"]="API"
HOST["IP address"]="BATCH"

# サーバーとコピー元ファイルのハッシュ
declare -A SERVER
SERVER["WEB"]=${!WEB[@]}
SERVER["API"]=${!API[@]}
SERVER["BATCH"]=${!BATCH[@]}

# コピー先を取得する
function get_dest {
  eval echo '$'{$1[$2]/@/$3}
}

# エラー時のメール送信
function send_alert {
  echo "Subject: [ERROR] log backup fails
To: [宛先のアドレス]
From: [送信者のアドレス]

${1}" | /usr/sbin/sendmail -t
}

# HOSTのキーからipを取得
for ip in ${!HOST[@]}; do

  # ipからサーバーを取得
  for server in ${HOST[$ip][@]}; do

    # サーバーからコピー元ファイルを取得
    for src in ${SERVER[$server][@]}; do
      # コピー先を取得
      dest=`get_dest ${server} ${src} ${ip##*.}`

      # 保持期間がすぎているファイルを削除
      find ${dest} -mtime +${PERIOD} -type f | xargs rm -rf

      # コピー元ファイルが存在するか確認
      if [ $(ssh ${SSH_LOGIN}${ip} "ls $src >& /dev/null;" echo \$?) -eq 0 ]; then

        # 存在すればコピー先にscpする
        /usr/bin/scp ${SSH_LOGIN}${ip}:${src} ${dest}

        # scpコマンドでエラーが出た場合はerror_msgを貯める
        if [ $? -ne 0 ]; then
          BODY="[ERROR] ${ip} ${server} ${src} ${dest}"
          echo ${BODY} >> "${log_file}"
          error_msg+="${BODY}
"
        fi

      fi

    done

  done

done

# error_msgが空でなければメール送信
if [ -n "${error_msg}" ]; then
  send_alert "${error_msg}"
fi

exit 0
【iOS】RealmBrowserでデータベースの中身を確認する

4回目の投稿です。新卒iOSエンジニアです。
Realmを利用しているプロジェクトで、実行中にデータベースの中身を確認したいことがあります。
そういう時、[RealmBrowser](https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12)を使えば簡単です。利用方法のメモ書きです。

実行環境：
MacOS Mojave バージョン10.14
xcode10.1 
Realm Browser version 3.0.1



# (アン):RealmBrowserを手に入れる
App Storeで「Realm Browser」を検索してインストールしてきましょう

# (ドゥ):Realmファイルを探す
Realmファイルがしまわれている場所を普通に探すのは難しいです。（ここが今回のメモ書きの肝）
以下の方法でRealmファイルの保存場所を特定します。

### シミュレータで動かす場合
コード上で、Realmの初期化の後に
`print(Realm.Configuration.defaultConfiguration.fileURL!)`
を記述しましょう。
プロジェクトを実行すると、xcodeのデバッグコンソールに
`/Users/<username>/Library/Developer/CoreSimulator/Devices/<simulator-uuid>/data/Containers/Data/Application/<application-uuid>/Documents/default.realm`
て感じで、Realmファイルのパスが吐き出されます。

### 実機で動かす場合
プロジェクト実行後、
Xcodeのメニューから`Window > Device and simulator`と選択すると
![スクリーンショット 2018-11-26 16.13.00.png](https://qiita-image-store.s3.amazonaws.com/0/277638/d790fd9f-f671-4bf8-13ff-11b734612efc.png)
こんな感じで接続中のデバイスの一覧ウィンドウが表示されます。
デバイスを選択し、INSTALLED APPS の中から該当アプリを選択。
そして`歯車ボタン > Download Container...`で、.xcappdて拡張子のついたファイルがダウンロードされます。ここにアプリのデータが入っています。

`右クリック > パッケージの内容を表示` で.xcappdの中身がみれます。
`AppData > Documents`に探し求めていた.realmファイルがあるはずです。
<img width="770" alt="スクリーンショット 2018-11-27 11.13.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/277638/8407fc55-41eb-01cd-93fb-6581ad110dc5.png">



# (トゥロワ):RealmBrowserでデータベースの中身を見る
Realmファイルを直接ダブルクリックしましょう。
または、ターミナルを開き、
`$ open -a "Realm Browser" さっき特定したRealmファイルのパス`
でRealmBrowserが起動します。
<img width="801" alt="スクリーンショット 2018-11-26 18.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/277638/913d85d7-6528-ec44-7b55-b670ba77583e.png">
表示されたウィンドウのAllowボタンをクリックしたら、データベースの中身がみれるようになります。

# 結
以上です。
補足がありましたら、コメントよろしくお願いします。
Mojaveはまだ使わない方がいい理由

## 結論
まだアップグレードしない方がよい

## 日付
```
2018年11月27日
```
  
## 検証環境
```
Macbook Pro(touchbar) 

MacOS 10.14.1
```

## 駄目な理由
- スリープさせて、また起動する時にうまく起動できない、強制的シャットダウン、起動するようにしてますが、めちゃくちゃ面倒！
- Excelが激的に反応が遅くなった！
- ~~スクリーンショットが激的に反応が遅くなった！~~
    - 気付きませんでした。iPhoneのようにスクリーンショットを取ったら、画面の右下にサムネイルが出て、そのまま編集できて、その後保存されます。なので、以前よりデスクトップにファイルが出るまで時間がかかる
- Majaveにサポートしてないアプリがある
    - Sequel Proを使えますが、一つのコネクションを閉じると、アプリがクラッシュしてしまう。ムカつく！
- bundle installができない

<img width="1560" alt="Screen Shot 2018-12-06 at 17.03.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/5c3af681-bdb2-988c-bddf-b96f1545669a.png">

久しぶり`bundle install`しようとしたら、↑のエラーが起きた。いろいろ調べて、以下のように直したが、２時間かかってしまった。

```shell
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

# ↑だけは治れなかったので、rubyまだ入れ直したら、直った！
rbenv uninstall 2.3.3
rbenv install 2.3.3
```

## クラッシュ
- 一回目
  - 2018.11.28 突然クラッシュした

## 参照
- [sudo installer \-pkg /Library/Developer/CommandLineTools/Packages/macOS\_SDK\_headers\_for\_macOS\_10\.14\.pkg \-target /](https://stackoverflow.com/questions/52514791/after-upgrading-to-macos-mojave-gem-update-is-failing?rq=1)
コマンドプロンプトでjavaは通るが，javacが通らない

オブジェクト指向言語の勉強をしたくてWindowsにJavaを入れようとした．
しかし，javaは通るが，javacが通らない状況になった．

```
$ javac
'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

java.exeがインストールされているフォルダを調べてみると
"jre"と書かれていた．

```
C:\Program Files (x86)\Java\jre1.8.0_191\bin
```

そこで，以下のサイトを参考に，jreについて調べてみた．
https://furien.jp/columns/227/

このサイトによると，
jre ("Java Runtime Environment") はjavaを実行するためのものなので，
プログラムを書くことができないとわかった．

一方で，
jdk ("Java Development Kit")というものをインストールすれば 
javaを開発できることが分かった．

そこで，以下の記事に従ってjdkをインストールし直した．
https://eng-entrance.com/java-install-jdk-windows


試しにhello.javaをコンパイルし，実行してみる．

```java:hello.java
public class hello{
  public static void main(String[] args){
    System.out.print("Hello");
  }
}
```
コマンドプロンプトで次を入力した．

```
$ javac hello.java
$ java hello
Hello
```
結果，正常に実行された．めでたしめでたし．
（短いですが，なんかすんません）
Vimの選択範囲置換

選択範囲の置換をプラグイン等を入れずにさくっとやりたい時のメモ
サーバー毎にVimのdein環境が違うのでこうしたデフォルトのやり方を覚えるのは大事ですね

1. `Shift + v` で VISUAL LINE モードへ
2. 選択したい範囲を `h or k` で指定
3. コロンをタイプ `:`
4. コマンドラインに `:'<,'>` のように表示されるので、続けて置換コマンドである `s` をタイプ
5. 置換文字列をスラッシュで区切り入力 `/検索対象文字列/置換後文字列/`
6. 確認を挟むための `gc` をタイプ
7. `Enter` をタイプ
8. 確認して置換してよいものであれば `Enter or y` をタイプ
9. 置換したくないものであれば `n` をタイプして次の置換文字列へ
10. 途中終了する場合は `Esc` をタイプ
11. 全て置換が完了すれば終わり

6番でコマンドラインで表示されるサンプルとしては、以下となる

```
# 例：undefined を false に置換したい場合

:'<,'>s/undefined/false/gc
```
CGエンジニア検定で高得点を取るための勉強法

2018年度後期のCGエンジニア検定エキスパートの試験を受けてきたので，どのような勉強法をとったら高得点が取れそうか，ということの感想をまとめていきたいと思います。
今後CGエンジニア検定を受ける人が満点レベルを取るための参考になる情報をつたえることができたら幸いです。

### CGエンジニア検定で高得点をとるメリット
- CG-ARTS検定では満点を取ることで，文部科学省から大臣賞というものをもらうことができます。
画像処理部門，CGエンジニア部門など，それぞれの部門ごとに判定があるので，例えば画像処理部門とCGエンジニア部門の二つで満点をとったら，それぞれの大臣賞をもらうことができます。

- CG関連の知識を偏りなく身に付けることができる。
高得点を取るというのは，特に満点を目指して勉強するということは，知識の偏りをなくさなければ実現できません。「パラメトリック曲線・曲面についてはあんまわからないけどいっか〜」みたいなことがないので，全く知らない分野がある，ということを避けることができます。
これに対して個人的に考えているメリットとしては，CGで表現したいある事柄がある場合，その実現のために取れる手法を知っている知識の分だけ候補をあげることができる，ということだと考えています。


### 高得点をとるための効率的な勉強法
以下に高得点を取るための勉強方法を述べていきますが，注意点としてCGエンジニア検定では一定以上の数学的知識が必要な部分があるので，高校数学と大学１年レベルの数学にある程度触れている人でないと効率的な勉強をすることができないので注意です。

- CGエンジニア検定の教科書の黒字の意味をまずはすべて説明できるようにする。

- 座標変換などの数学的な基礎事項を教科書を読んで軽くおさえて,第2問の座標変換問題，第3問の立体表現の思考系問題，第6問あたりのアニメーションの数学的な思考系の問題,他には画像処理の空間フィルタリングの分類の仕方をおさえて空間フィルタリングに関するパターン問題を，過去問や問題集を実際に解いて満点を取れるようにする。
特にこの思考系の問題は数学的な基礎力がある人であれば満点を取れる部分なので，ケアレスミスのないよう注意深く解いて満点をとりましょう。

- 著作権に関する表とその説明をよく読んで，かつ過去問で問題の傾向をつかむ。
著作権に関する問題は僕は最初まったく解けなかったのですが，教科書掲載の説明と表，およびよくわからなかった権利についてはググるなどしたことで，その後はすべて正解できるようになりました。著作物の種類，例えばプログラム，ゲーム，映画，音楽，絵画，などによって，著作権の扱い方が異なることに注意して勉強するといいと思いました。


ここからは細かいことになりますが，満点を取るためにすべきだと思った勉強法です。
CGエンジニア検定では，僕が過去問を解いてきた感想として1問程度は「こんなの難しすぎるでしょ！」みたいな問題が含まれています。それに対応するための勉強法として考えたことです。

- 用語に数学的定義が含まれているものは，その数学的な意味を考えておくこと。

- 教科書に掲載されている画像が，どのような処理をしてえたものなのかどうか説明できるようにする。

- 教科書の単語とその説明が書かれている表をよく読んで，単語との対応関係を完全に覚える。


unityに触れていたり，blenderで実際にモデルを作っていたり，写真の画像編集をしたりしている人にとっては吸収が早い部分がすごい多いので，それによっても勉強量は変わってくると思います。

# 参考書籍
- CGエンジニア検定エキスパート対応書籍 「コンピュータグラフィックス」
PhpStormの.ideaをgitで共有する

公式ドキュメント[How to manage projects under Version Control Systems – IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems)によれば、PhpStormの.ideaディレクトリをチームで共有するなら、次のファイルをGitで管理すると良い。

* .ideaディレクトリ配下のすべてのファイル。ただし、ユーザ固有の設定を含むworkspace.xmlとusage.statistics.xml、tasks.xmlは除外する。
* すべての.imlモジュールファイル。

[gitignore/JetBrains.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore)を参考にgitignoreを設定すれば良さそう。
UE4で開発者毎に固有のマクロ定義を宣言する(俺マクロ)

#俺マクロ
UE4ってDevelopビルドで開発中もユーザーコードが最適化されているので
いざデバッガが使いたいような問題にあたったり例外が出た時に変数などが省略されてて
困ることがありますよね。
※ディスアセンブルを読めば良いんですが、苦手な人もいますよね。
そこで自分がデバッグしたいコードの一部分の最適化を`#pragma optimize`を使って解除しておくとデバッグが簡単になります。

ただしチーム開発している時に他の開発者に影響を与えるのは困りものですし
CIで生成したパッケージに影響を与えるのはもっと困ります。
そこで開発者毎のマクロを宣言して使うようにすると自分だけに影響を及ぼすコードを記述できます。

UEはUBTというビルドツールがビルド全般を担うのでBuild.csファイルにちょっと追記することで実現可能です。

##Build.CS
```Mygame.Build.cs
public class MyGame : ModuleRules
{
    public MyGame(ReadOnlyTargetRules Target) : base(Target)
    {
        string DevUserDefine = "DEVUSER_" + System.Environment.GetEnvironmentVariable("USERNAME").ToUpper();
        DevUserDefine = DevUserDefine.Replace(".", "_");
        DevUserDefine = DevUserDefine.Replace("-", "_");
        DevUserDefine = DevUserDefine.Replace("$", "_");
        PublicDefinitions.Add( DevUserDefine );
 ```

##使ってみる

optimize/off したあとは、後方で optimize/onしておくのがよろしいです。
(unitybuildとかで他のソースに影響を与えたりしちゃうかも)

```MyClass.cpp
#if defined(DEVUSER_TAKASHI_SUZUKI)
#pragma optimize("",off)
#endif //DEVUSER_TAKASHI_SUZUKI

void MyClass::MyFunction()
{
... // debuggable!!
}

#if defined(DEVUSER_TAKASHI_SUZUKI)
#pragma optimize("",on)
#endif //DEVUSER_TAKASHI_SUZUKI
```

iniに書けばいいじゃん・・・と思うかもしれませんがConsoleVariableに適用するのも楽ちんなので結構好きです。

```MyClass.cpp
static TAutoConsoleVariable<int32> CVarMyVariable(
	TEXT("MyGame.MyVariable"),
#if defined(DEVUSER_TAKASHI_SUZUKI)
	1,
#else
	0,
#endif //defined(DEVUSER_TAKASHI_SUZUKI)
	TEXT("0 - anta")
	TEXT("1 - wai"));
```

以上！
システム運用業務改善への第一歩

## はじめに
* 私が商用Webシステム基盤のインフラチームリーダーを担当していた時に検討した内容です。
* 当時、KPIとして設定している中で「品質目標」が未達の状況が続いていました。
* また、チーム全体で20名いたのですが、「属人化」に陥りまして、凝り固まった運用から脱却するために運用業務の改善を計画しました。
* 私の所感や過去の経験から「業務をより良くするためにできることは何か？」の整理から着手しました。

## 対応したこと
* 所感をマインドマップ（Whyツリー）で深掘りしていき、現状分析を実施。
    * GoodとBadに分けて、良いところは伸ばす、良く無いところは改善する、という双方向のアプローチを実現
* 特記事項や打ち手（案）として思いついたものを赤字で記載。
    * 実際に作成したものを添付（拡大してご確認をお願いします）
   
![DevOps検討.png](https://qiita-image-store.s3.amazonaws.com/0/320001/2234dc0b-de5c-e071-b23a-e8a9a7922164.png)

## サマリ
### 検討内容から導き出されたキーワード
1. 可視化・モニタリング
2. 標準化
3. 情報共有
    * このキーワードを軸に現状の業務を評価する
    * 「業務上のリスクに直結するもの」「アジリティ向上に寄与するもの」を優先度：高と扱い、打ち手を導出して行く

### ２歩目に向けたアクション
* AsIs - ToBeの整理
* FIt ＆ Gapの整理と対策検討
* 現実的な「あるべき姿」の定義と最適化

### タスク（案）
* 過去事例やノウハウ、ベストプラクティスと比較し、”今の立ち位置”の整理
    * AsIsの整理
* 「DevOps」の着地点（ベストプラクティス）の明確化
    * ToBeの整理
* Fit＆Gap整理および対応すべきタスクの可視化
    * 優先度付けは別途対応する（やる、やらない含めた判断が必要なので）
【Vim】どうしても、どうしてもコメント文の色を変えたかった


# 概要

Vimでコメント文が<font color="DarkSlateBlue">濃い青色</font>でした。
黒背景にしてると何も見えません、、、

そこで変えたかったのですが、苦労したのでメモです。


# 普通の場合

```vim:.vimrc
hi Comment ctermfg=lightyellow
```

しかしこれでは、一瞬黄色になっても元に戻ってしまいました。


# 上でダメな場合

autocmdを使って、カラースキーマの読み込み後に再設定するようなやり方があるようです。

https://teratail.com/questions/29844

ちなみに自分はダメでした。泣きました。
.vimrcに色々書きすぎてるから……？😭


# 原因を探る

Vimで好きなファイルを開いてから、

```vim:
:verbose highlight Statement
```

このVimコマンドで読み込んでいるhighlightの設定ファイルが分かるようです。

ちなみに自分は ```/usr/share/vim/vim74/syntax/syncolor.vim``` というものが出てきました。


# 編集してしまう

上で出てきたファイルをもう編集してしまいました。
絶対に本来触るべき所じゃないような感じしますし、自己責任で。
そもそも書き込み制限かかってましたし。

root権限になってから、以下を編集。

```bash:
su -
vim /usr/share/vim/vim74/syntax/syncolor.vim
``` 

なんとなく色々設定してある後に上書きした方が良いだろうと、最後尾付近のdelcommandの上に追加

```vim:syncolor.vim
(略)

" オリジナル設定
hi Comment ctermfg=lightyellow

delcommand SynColor
delcommand SynLink
``` 


以上です。
これでなんとかコメント色の変更が出来ました。


## おまけ

https://qiita.com/necojackarc/items/1f997481764ed42023a7

この方法で出来たらスマートだなぁとやってみましたが出来ませんでした……。うーん
EgretEngineが百度のSmartGameに対応

2018/11/26に公式サイトにて、『[Egret EngineはBaiduスマートゲームをサポートしました](https://mp.weixin.qq.com/s/SgoNr5KWiIG7mf6svJyreA)』と発表されました

百度のSmartGamesはβアクセスを終了して近々リリースされるのにあわせてEgret Engineでは百度に対応したようです。

今日(2018/11/27)から対応版のEgretEngineを配信する予定のようです

# 必須環境

1. Egret Launcher 1.0.61以上
2. Egret Engine 5.2.13以上
3, Baidu small game [公式サイト](https://smartprogram.baidu.com/docs/introduction/register/ )でアカウント登録をしてアプリIDを発行する
4. Baidu Developer Toolsの最新版([こちら](https://smartprogram.baidu.com/docs/develop/tutorial/index_first/)から)
React NativeでViewの中央にViewを配置する方法

Flutterにはまってますが、最近は業務でReact Nativeやりはじめました。
これからは学習も兼ねてReact Nativeの記事も書いていきます。

今回はこのように画面やあるビュー内の中央にビューを配置する方法を紹介します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18273/612ba00b-8dc9-568d-8489-01637d82fd69.png" width="300px">

```jsx
  render () {
    return <View style={{
      flex: 1,
      flexDirection: 'column',
      justifyContent: 'center',
      alignItems: 'center',
    }}>
      <View style={{height: 50, width: 50, backgroundColor: 'aqua'}}/>
    </View>
  }
```

`flex:1` で親ビュー内で最大の領域を確保します。 `flexDirection: 'column'` で複数要素がある場合は縦並びを指定しています。これはデフォルトの設定値なので省略可能です。
`justifyContent` で `flexDirection` 設定ないでの均等揃えの方法を設定しています。`center`を指定したので中央に配置されます。 `alighItems:'center'` で 'flexDirextion' の方向でない方の配置方法を指定します。今回の例ではこれは水平方向の中央に配置することになります。

flexBoxを使ってこのように中央揃えを実現することができました。

この方法をつかって以下のように円の内側にテキストを配置するということも簡単に実現できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18273/3241b8c2-2788-7040-2f1c-f96c0f36a523.png)
Ruby で季節のような循環する概念を表したい

# 例

春, 夏, 秋, 冬, 春, 夏, ... のように循環する概念を Ruby で表したい。具体的には

```rb
Season.new('春').next #=> #<Season @name="夏">
Season.new('夏').next #=> #<Season @name="秋">
Season.new('秋').next #=> #<Season @name="冬">
Season.new('冬').next #=> #<Season @name="春">

Season.new('春').prev #=> #<Season @name="冬">
Season.new('夏').prev #=> #<Season @name="春">
Season.new('秋').prev #=> #<Season @name="夏">
Season.new('冬').prev #=> #<Season @name="秋">
```

となるような Season クラスを実装したい。

# 方法

剰余を使う。

```rb
class Season
  attr_reader :name

  NAMES = %w[春 夏 秋 冬].freeze

  def initialize(name)
    raise(ArgumentError) unless NAMES.include?(name)
    @name = name
  end

  def next
    self.class.new(NAMES[(index + 1) % NAMES.length])
  end

  def prev
    self.class.new(NAMES[(index - 1) % NAMES.length])
  end

  private

  def index
    NAMES.index(name)
  end
end
```

# 方法 (ボツ)

循環するイテレータを使う。難しく考えすぎていたのでボツ。

```rb
class Season
  attr_reader :name

  NAMES = %w[春 夏 秋 冬].freeze

  def initialize(name)
    raise(ArgumentError) unless NAMES.include?(name)
    @name = name
  end

  def next
    seasons = NAMES.cycle
    until seasons.next == name do; end
    self.class.new(seasons.peek)
  end

  def prev
    seasons = NAMES.cycle
    tmp = nil
    loop do
      tmp = seasons.next
      break if seasons.peek == name
    end
    self.class.new(tmp)
  end
end
```
Autoprefixer doesn’t support Node v4.8.2. Update it 

```
Autoprefixer doesn’t support Node v4.8.2. Update it
```

というエラーに出くわした。
stackoverfolwに対処法が乗っていた。
https://stackoverflow.com/questions/52708521/autoprefixer-doesn-t-support-node-v4-8-2-update-it

こちらによればまずnodeを削除し、

```
# Using apt on Debian or Ubuntu based Linux distributions
sudo apt remove nodejs
```

入れ直せとかいている。

```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
```

なお``apt``の部分はパッケージソフトによっては``yum``などにかわる。

[mini-racerというgem](https://github.com/discourse/mini_racer)を追加してなおる場合もあるみたい

もしdockerのrubyを使っている場合、こちらの[issue](https://github.com/docker-library/ruby/issues/226)によれば、

```dockerfile
FROM ruby:2.6-rc

# https://github.com/nodesource/distributions#installation-instructions
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

# ...
```

というふうに``setup``を``curl``しておく。

dockerで構築した環境でbootstrap入れたら急にこんなエラー出てびびった。