OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud9とGitHubを連携させる方法（初心者向け）

ネットでおおよそのTipsは出てるのですが、自分の環境だとここが足りない、あれが足りないだったので、備忘録的に書いておきます。
後で暇なときにスクショ入れたりして、もう少し見やすくしたいと思いまう。

# Cloud9でリポジトリを作成する
まずは、GitHubにpushしたいディレクトリに移動しましょう
'$ cd hogehoge'
※hogehogeは自分のディレクトリ名を入れてください

カレントディレクトリをリポジトリに登録します
'$ git init'

カレントディレクトリのすべてのファイルを選択します
'git add -A'

↑をコミットします
'git commit -m "first commit"'


# GitHub上にリモートリポジトリをつるく
一旦Cloud9上での作業は置いておいて、次はGitHub上でリモートリポジトリを作ります。

ダッシュボード画面でStart a Projectをクリック。

ちなみにGitHub初心者あるあるだと思うのですが、ダッシュボードで最初に表示されるガイドを消してしまったり、
プロフィール画面に行ってしまったりすると、このStart a Projectがどれだか分からなくなっちゃうんですよね・・・。
ダッシュボード画面やrepositories画面にある、緑のNewボタンが、Start a Projectボタンに当たります。

Cloud9上のディレクトリ名と同じファイル名（hogehoge）にして、Create repositoryをクリックして作成します。

# Cloud9でSSH認証用の公開鍵を作る
再度、Cloud9に戻り、GitHubとCloud9間でデータの受け渡しをする際の鍵を作ります

下記のコマンドで鍵を作ります
'$cd ~/.ssh
$ ls -ltr'
（処理が流れます）
'$ ssh-keygen'
（処理が流れます）
'$ ls -ltr'

下記のコマンドで公開鍵を表示させます。次の章で使うので、'ssh-rsa'以下をコピーしておいてください。
'$ cat ~/.ssh/id_rsa.pub'
※コピーする際は'ssh-rsa'も含んでね！

# GitHubに公開鍵を設定する
またまたGitHubに戻ります。
右上のプロフィールアイコンからメニューをドリルダウンし、「Settings」を開いてください。
「SSH and GPG keys」をクリックし、「New SSH key」をクリックします。

Titleに「Cloud9」、Keyに先ほどコピーした公開鍵情報を貼り付けます。
「Add SHH key」をクリックして設定完了です。
※本当はTitleはなんでも良いのですが、とりあえずわかりやすくCloud9にしておいた方が無難です

# GitHubで、送り先リポジトリの住所を確認しておく
GitHub上で、先ほど作ったリモートリポジトリに移動し、
Set up in Desktop or HTTPS <SSH>
のSSHをクリックすると、右側に、送り先リポジトリの住所が表示されます。
次の章で使うので、コピーしておいてください。

# Cloud9からGitHubにpushする
再度、Cloud9のコンソールに戻りましょう。

下記のコマンドでプッシュをします。
'$git push 先ほどコピーした住所 master'

自分の場合は
'$ git push git@github.com:higu1988/CARAVAN.git master'

ちなみに、先ほど公開鍵を作ったコンソールに↑のコマンドを入れても、
ファイルが見つからないという文章が返ってきた初心者の方いませんか？
プッシュするには、プッシュしたいブランチに移動する必要があります。
コンソールのタブの右側にある（＋）を押して、New Terminalを開き、
'$ cd hogehoge'
を入れて、プッシュしたいブランチに移動しましょう。


プッシュのコマンドを入れたら、最初にプッシュした時は
'Are you sure you want to continue connecting (yes/no)?'
と聞かれます。
'yes'
と入れてEnterしましょう。

そうすると、処理が走ってプッシュが完了します！

# GitHubでプッシュされているか確認
最後に、GitHubのリポジトリに移動して、データが入っているか確認しましょう

以上です。
何か間違っているところがあれば、ご指摘いただけると嬉しいです！
django-enumfieldを拡張してvalueとlabelのタプルのリストを返すメソッドを実装

# 環境

- Django 2.1.7
- Python 3.6
- django-enumfield 1.5

# 背景

DjangoモデルのフィールドをEnumで扱えるように拡張してくれる便利な[django-enumfield](https://github.com/5monkeys/django-enumfield)ですが、標準で実装されている```choices()```だと、Enum定義のvalueとnameのタブルリストが返却されます。

**定義例**

```python
from django_enumfield import enum as django_enum
class UserType(django_enum.Enum):
    ADMIN = 1
    USER = 2

    labels = {
        ADMIN : "管理者",
        USER : "ユーザ",
    }
```

**出力例**

```python
In : UserType.choices()
Out: [(1, ADMIN), (2, USER)]
```

せっかくlabel名を指定しているので、valueとlabelで受け取れるように拡張しました。

# 実装

**拡張（choices2を実装）**

```python
class BaseType(django_enum.Enum):

    @classmethod
    def choices2(cls, blank=False):
        choices = sorted([(key, cls.label(key)) for key, value in cls.values.items()], key=lambda x: x[0])
        if blank:
            choices.insert(0, ('', ''))
        return choices

```

拡張したクラスを継承させます。

```python
class UserType(BaseType):
```

**出力例**

```python
In : UserType.choices2()
Out: [(1, '管理者'), (2, 'ユーザ')]

In : UserType.choices2(blank=True)
Out: [('',''),(1, '管理者'), (2, 'ユーザ')]

```

選択リスト(select)の選択肢(option)に使えます。choices2(blank=True)

```html
<select>
  {% for user_type in user_type_list %}
    <option value="{{user_type.0}}">{{user_type.1}}</option>
  {% endfor %}
</select>
```
[Ruby] (巨大な整数でも) 冪剰余を求める

# 概要

[冪剰余](https://ja.wikipedia.org/wiki/%E5%86%AA%E5%89%B0%E4%BD%99) とは冪乗の剰余のことです。

例えば $ 4^{13} \bmod 497 $ を Ruby で計算すると

```rb
4 ** 13 % 497
#=> 445
```

となります。

では $ 4^{1234567890} \bmod 497 $ は？

```rb
4 ** 1_234_567_890
# warning: in a**b, b may be too big
#=> Infinity

4 ** 1_234_567_890 % 497
# warning: in a**b, b may be too big
#=> NaN
```

$ 4^{1234567890} $ が巨大な整数となってしまうため計算できません :sob:

こんなときでもあら不思議、[Integer#pow](https://docs.ruby-lang.org/ja/latest/class/Integer.html#I_--2A--2A) を使うと……

```rb
4.pow(1_234_567_890)
# warning: in a**b, b may be too big
#=> Infinity

4.pow(1_234_567_890, 497)
#=> 190
```

求めることができるのだ :tada:

なお Integer#pow で第 2 引数を与えることで冪剰余が計算できるようになったのは Ruby 2.5.0 からでした。

# 参考

* [Python の組み込み関数 pow()](https://docs.python.org/ja/3/library/functions.html#pow)
  * Python の pow() が巨大な数でも冪剰余を計算できたので Ruby ではどう実現できるかを調べた。
【備忘録】Ubuntu 18.04 にEmacsをインストール。設定まで

学生の頃からEmacs信者なので、新調したPCに早速Emacsをインストールしていきます。

###環境
Ubuntu 18.04日本語Remix

###Emacsのインストール
インストールはコマンドラインからかんたんにできます。

```java:install
$ sudo apt install emacs
```
完了したら確認しておきましょう。

```java:check
$ emacs --version
GNU Emacs 25.2.2
Copyright (C) 2017 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```

以上でインストールは完了です。

###Emacsの設定
続いて、いくつか設定をしていきます。

一度emacsを起動すると、~/.emacs.dが生成されるので、ここに設定ファイルを作成していきましょう。

~/.emacs.el や~/.emacs.d/init.el 等、設置ファイルの方式はいくつかありますが（起動時の探索順序が異なるようです）、今回は~/.emacs.d/init.elを編集していきます。

```java:edit
$ emacs ~/.emacs.d/init.el &
```

書き込む内容は、お好みでどうぞ。
スタートアップメニューの表示を取りやめたり、行番号を表示するようにしたり等、色々できます。

以下の記事に設定の記述方法がまとまっています。
[Emacsのオススメ基本設定まとめ（.emacs.el）](https://qiita.com/yn01/items/b8d3dcb5be9078a6e27f)
(タイトルが.emacs.elとなっていますが、init.elに同様の記述をして問題ないです。)

以上、備忘録でした。
Eclipse起動時に「Java was started but returned exit code=13…」

久しぶりにSTS起動したらエラーメッセージ「Java was started but returned exit code=13…」が出て起動できなくなっていた。

# 原因
JDKとJREに差異があると出るっぽい。

# 解決法
使いたいバージョンで統一する。
1.8が使いたかったので、

- 1.8のJDK・JREを最新にアップデートする。
- 不要なJDK・JREをコンパネからアンインストールする(1.7とかもう使わないので)。
- 以下の設定を先頭に追加(EclipseというかSTSだけど)。

```ini:STS.ini
-vm
C:\Program Files\Java\jdk1.8.0_25\bin\javaw.exe
```

で起動できた。
漢字を画像として出力【備忘録】

# メモ
ついつい、調べてしまうので、備忘録として。(適宜、関数化を推奨)

# 環境
- MacOS 10.14.3 Mojave
- python 3.7.2
- OpenCV 4.0.0 (opencv-python: pip)
- （venv： https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e）

# 目標
- 漢字一文字を描画した画像ファイルが欲しい

## 入力
- 漢字（または 対応する ユニコード： UTF-8）
- フォントファイル
- 文字の色 
- 描画サイズ
- 背景色
- 背景画像サイズ

## 出力
- 画像ファイル名（今回はpng形式とした）

## 実装
```
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image

# 文字の準備
font_path = '/System/Library/Fonts/AquaKana.ttc'
color_char = (255,0,0)    # RGB
size_char = 16

# 背景の準備
spec_canvas = (18,18,3)   # サイズと色数

# 出力ファイル名
o_filename = "kanji_trial.png"


# キャンバスの準備
imageArray = np.zeros(spec_canvas, np.uint8)
imageArray += 255         # 力技。背景を白色に（numpy特有）

pil_image = Image.fromarray(imageArray)  # ImageDrawへの入力を可能な形式に変換
canvas = ImageDraw.Draw(pil_image)       # 描画準備完了

# 文字の準備
## フォントの指定 （ファイル、取扱注意）
font = ImageFont.truetype(font_path, size_char)

## 文字の指定 （直接指定）  ※ ユニコードによる指定の方法は後述 ＊
canvas.text((1,1), u"永", fill=color, font=font)

# 書き出し用に変換
cv_rgb = np.asarray(pil_image)
cv_bgr = cv2.cvtColor(cv_rgb,cv2.COLOR_RGB2BGR)

cv2.imwrite(o_filename, cv_bgr)
```

### UTF-8で指定したい場合
```
# "永" に対応する UTF-8のコード値が "u6C38"
canvas.text((1,1), u’¥u6C38’, fill=(0, 0, 0), font=font)
```

## 出力結果例
![ei_wb.png](https://qiita-image-store.s3.amazonaws.com/0/29245/c3241b27-a553-d5ac-b0cf-ac2cf6082892.png)

やったね！

# 参考
 「常用漢字の画像とか、ないんだろうか」というツイッターをもとに、このエントリを書きました。
ちなみに、常用漢字に対応するUTF-8の一覧は、以下にあったりします：
http://x0213.org/joyo-kanji-code/


--
##### End of This Document: 最後までありがとうございました
DjangoでJavascriptにデータを渡す方法

下記のようなコードをscriptタグ内に
記述すればJavascript内でデータを使えます。
favoriteはviews.pyから引き渡されたデータです。

参考記事はこちら
https://narito.ninja/blog/detail/87/

```django
data = [
          {% for fav in favorite.all %}
            {
              lat:{{ fav.favorite.latitude }},
              lng:{{ fav.favorite.longitude }}
            },
          {% endfor %}
        ]
```
応用情報技術者試験〜まとめ〜

# ヒューマンインターフェースとマルチメディア

## コンピュータグラフィック技術[^1]
[^1]: 平成30−01年度 応用情報技術者試験によく出る問題集【午前】:技術評論社]

* __アンチエイリアシング（anti aliasing:ギザギザに見えない）__
    * 斜め線や曲線などに発生するギザギザ（シャギー）を目立たなくする

![30.gif](https://qiita-image-store.s3.amazonaws.com/0/337110/1fc85364-2ce4-9a20-a1f8-8f941f972e91.gif)

* __テクスチャマッピング(texture mapping:質感を与える)__
    * 物体の表面に柄や模様などを貼り付け、質感を与える

* __シェーディング(shading:影付け)__
    * 物体の表面に影付けをして、立体感を出す

* __レイトレーシング(ray tracing:光源追跡)__
    * 光源からの光線の反射、透過をシミュレート後、物体の形状を描写する

* __クリッピング(clipping:切り取る)__
    * 画像の矩形表示領域を設定し、その部分を残して、その他をトリミングする処理
    
* __モーフィング(morphing:動き＋形態)__
    * ある画像を別の画像に変化させる時、その中間にある画像を補って滑らかに変形させる

* __レンダリング(rendering:描写)__
    * 物体のデータとして与えられた情報を計算によって映像化する

* __ポリゴン(polygon:多角形)__
    * 立体の形状を表現するときに使用する基本的な要素
    * 三角形や四角形がある
    
* __モーションキャプチャ(motion capture:動きをとらえる)__
    * センサやビデオカメラなどを用いて人間や動物の自然な動きを取り込む 

* __メタボール(metaball)__
    * 光の相互反射を利用して物体表面の光のエネルギーを算出することによって、表面の明るさを決定する

* __ラジオシティ(radiosity)__
    * 光源からの光線の経路をすることによって、光の反射や透過などを表現し、物体の形状を描画する
Elm のカスタム型を Java で理解したつもりになりたかった

ジャバおじさんが Elm のカスタム型を理解しようと思って Java で考えたメモです。
チョクワガタとかは詳しくないです。

カスタム型の例として [`Result`](https://package.elm-lang.org/packages/elm/core/latest/Result) を取り上げます：

```elm:ElmのResult定義
type Result error value
    = Ok value
    | Err error
```

上記の `Result` を Java で表現した一例：

```java:Result.java
interface Result {
    class Ok<V> implements Result {
        final V value;
        Ok(V value) { this.value = value; }
    }

    class Err<E> implements Result {
        final E error;
        Err(E error) { this.error = error; }
    }
}
```

- アクセス修飾子周りはサボりました。
- Java でカスタム型を **再現** することが目的ではないのであんまり頑張ってません。
  - ホントはちょっと頑張った (`Result` に `E` と `V` を持たせたり) けど色々面倒くさかったのでやめました。


Java版 `Result` 型を実際に使った例：

```java:Main.java
class Main {
    public static void main(String[] args) {
        show(validate("100"));     // -> Ok: 100
        show(validate("200hoge")); // -> Err: 数値を入力してください
    }

    /**
     * text が数字のみから構成されている文字列か検証する。
     * @param text 検証対象の文字列。
     * @return text が数字のみから構成されている場合、Integer.parseInt(text) の結果を
     *     value フィールドにセットした Result.Ok 。<br>
     *     text に数字以外が含まれている場合、"数値を入力してください" を
     *     error フィールドにセットした Result.Err 。
     */
    static Result validate(String text) { // 「基礎からわかるElm」P.91 の validate 関数が元ネタ
        try {
            var n = Integer.parseInt(text);
            return new Result.Ok<>(n);
        } catch (NumberFormatException e) {
            return new Result.Err<>("数値を入力してください");
        }
    }

    /**
     * result の内容を標準出力に出力する。
     * @param result 出力する値。
     */
    static void show(Result result) {
        if (result instanceof Result.Ok) {
            var ok = (Result.Ok<Integer>) result;
            System.out.println("Ok: " + ok.value);
        } else if (result instanceof Result.Err) {
            var err = (Result.Err<String>) result;
            System.out.println("Err: " + err.error);
        } else {
            throw new RuntimeException("謎の型が指定されています");
        }
    }
}
```

型パラメータに指定している `Integer` や `String` への依存がひどかったり `insutanceof` で分岐してたりとカッコつかないコードですね。
頑張らなかったのでしょうがない。 ~~こんなん雰囲気でええんや。~~

Elm のカスタム型は Java で考えるとこんな感じになるかなーというのが今の認識です。
本来は代数的データ型をちゃんと学ぶべきですが、とりあえず理解は進んだ (気がする) のでヨシ！としてます。
MariaDB 10.1 から 10.3 へのアップグレード (Debian 9)

# 0. データベースと設定をバックアップ

```
$ mysqldump -u root -p --all-databases > ~/backup.sql
$ cp -r /etc/mysql ~/
```

インスタンスのスナップショットを取っておくとなお安心。

# 1. リポジトリを追加する

https://downloads.mariadb.org/mariadb/repositories/
にアクセスし、自分が欲しいバージョンを選択。

`Here are the commands to run to add MariaDB to your system:` の下のコマンドを実行する。
（その次のブロックはまだ）

# 2. 既存のMariaDBを停止する

ついでにWebサーバーも停止[^2]。

```
$ sudo service mysql stop
$ sudo service apache2 stop
```

# 3. リポジトリのアップグレード

古いバージョンのアンインストールは必要ない。

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install mariadb-server
```

`apt-get upgrade` はGCEだとpython3-google-compute-engineみたいなパッケージ[^1]で失敗するのでやらなくても良いかも。

## 設定周り

上書きの必要がある場合は都度聞いてくれるので、適宜diffを見て判断。

あまりカスタマイズしていなかったので、基本は上書きで良かったが、GCEの場合はNTPの設定だけ手動で書き直す手間があった。
一旦新しい設定ファイルで上書きした後、poolを使うようになった部分をコメントアウトして以下に書き換える。

```/etc/ntp.conf
server metadata.google.internal iburst
```

参考→https://cloud.google.com/compute/docs/instances/managing-instances?hl=ja

sshdの設定はポート番号など変えていると上書きで入れなくなる可能性があるので注意。

あと何かインストールしろと言われたら入れる。

# 4. プラグイン設定

バージョンを確認しようとしたら `Plugin 'unix_socket' is not loaded` とか言われるようになるので対応。

```/etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
plugin-load-add = auth_socket.so
```

参考→https://websiteforstudents.com/fix-mariadb-plugin-unix_socket-is-not-loaded-error-on-ubuntu-17-04-17-10/

# 5. 確認

```
$ sudo service mysql start
$ sudo service apache2 start
$ sudo mysql -v
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 46
Server version: 10.3.13-MariaDB-1:10.3.13+maria~stretch mariadb.org binary distribution
```

# 6. 掃除

```
$ sudo apt-get autoremove
$ sudo apt-get clean
$ sudo apt-get autoclean
```

[^1]: 自分で入れたやつではなくて元々入ってるやつの様な気がしていて手を出すに出せない。
[^2]: よわよわスペックのインスタンスだとインストールでCPU使用率200％とかになってしまうので負荷になりそうなものは落とすが吉。そもそもDB無いと接続しても何も見れないサイトなので。
Wifi未搭載のパソコン（Ubuntu 18.04）にUSB無線子機を外付け

Wifi未搭載のパソコン（Ubuntu 18.04）にUSB無線子機を外付けし、ポケットWifiで運用できるようにしました。

#####参考にした記事
[Ubuntu 18.04 で USB Wi-Fi アダプタを認識させる](https://qiita.com/diescake/items/2370dc67a0ed40b089ba)

Elecom　WDC-433DU2HBKを購入して使用。
本家(https://github.com/gnab/rtl8812au/ )のソースコードを利用しましたが、こちらの記事通りの手順で問題なく動作しました。

基本的にcloneしてmakeするだけです。
ただしUbuntu初心者の私はつまずいたので以下メモしておきます。

makeするだけではありますが、そのmakeコマンドもインストールしておく必要があります。
makeコマンドのインストール自体は下記コマンドでかんたんにできます。
（ネット接続が必要です。私は携帯端末のテザリングで対応しました。）

```Java:install
$ sudo apt install build-essential
```

make インストールもオフラインでやりたい場合はここら辺かなあ ... ??
試してないけど調べたので一応書いておきます。

・keryxを利用してパッケージを取得する方法
https://askubuntu.com/questions/974/how-can-i-install-software-or-packages-without-internet-offline

・build-essential のダウンロード先を取得して、別PCでそこにアクセス。その後データを移動してオフラインPCでインストールする方法
https://askubuntu.com/questions/334136/how-do-i-install-build-essential-without-an-internet-connection
簡単なテーブル定義を出力するSQL（postgresql版）

# 

# テーブル定義出力するSQL
~~~ sql
SELECT
    sut.relname as tablename,
    pd.description as table_comment,
    att.attnum AS num,
    att.attname AS columnname,
    com.description AS column_comment,
    typ.typname AS COL_TYPE,
    CASE typ.typname WHEN 'varchar' THEN att.atttypmod - 4 WHEN 'bpchar' THEN
    att.atttypmod - 4 WHEN 'numeric' THEN att.atttypmod / 65536 WHEN 'date'
    THEN att.attlen WHEN 'timestamp' THEN att.attlen END AS COL_LENGTH,
    CASE att.attnotnull WHEN 't' THEN 'NOT NULL' WHEN 'f' THEN 'NULL' END AS
    NOTNULL,
    def.adsrc as default
FROM 
    (((pg_attribute att
    -- pg_descriptionと1回目のLEFT JOIN。各カラムに対応するコメント。
     LEFT JOIN pg_description com ON att.attnum = com.objsubid AND att.attrelid = com.objoid)
    -- pg_attrdef
     LEFT JOIN pg_attrdef def ON att.attrelid= def.adrelid AND att.attnum = def.adnum))
    -- pg_descriptionと2回目のLEFT JOIN。こちらはテーブル用コメント。
     LEFT JOIN pg_description pd on att.attrelid = pd.objoid AND pd.objsubid = 0 ,
    --ユーザーが定義したテーブル
     pg_stat_user_tables sut,
    --pg_type
     pg_type typ
WHERE
    att.attrelid = sut.relid AND 
    att.atttypid = typ.oid AND
    att.attnum > 0 AND
    sut.relname IN (
    SELECT
        c.relname
    FROM
        pg_namespace AS n JOIN pg_class AS c ON (n.oid = c.relnamespace)
    WHERE
        c.relkind = 'r' AND 
        c.relname not like 'pg_%' AND 
        c.relname not like 'sql_%'
        --必要に応じて条件を追記
    )
ORDER BY sut.relname, att.attnum

~~~

# ポイント
## システムカタログを見よう
システムカタログにだいたいのことが書いてあるので、利用バージョンのシステムカタログを読もう。
9.6版のドキュメントは下記。
https://www.postgresql.jp/document/9.6/html/catalogs.html

システムカタログもただのテーブルなので、必要な情報が取れるように結合などしてあげればよい。

## oid（オブジェクト識別子）
システムカタログもただのテーブルだが、結合するときに「oid」という特殊な属性を使うので、この点だけ注意。

また、oid型の列は、reg****** でキャスト可能。
オブジェクト識別子の型の一欄は、下記URL参照。
https://www.postgresql.jp/document/9.6/html/datatype-oid.html

どのoidがどのreg*****型にキャスト可能なのかは、上の表とシステムカタログのドキュメントを見て都度判断。
（読めばだいたい分かる）

キャストすると何が起こるのかは、以下のようなSQLを叩いてみれば大体わかると思う。

~~~ sql
SELECT 
 relnamespace,
 relnamespace::regnamespace as hoge,
 reltype,
 reltype::regtype as piyo,
 relowner,
 relowner::regrole as moge
FROM 
 pg_class
~~~

また、where句の条件などに利用することも可能。

~~~ sql
SELECT 
 *
FROM 
 pg_class 
WHERE 
 relnamespace = 'public'::regnamespace 
~~~

ただ、以下のSQLはエラーになる。
（なんで駄目なのかは追いかけなかった）

~~~ sql
SELECT 
 *
FROM 
 pg_class 
WHERE 
 relnamespace::regnamespace = 'public'
~~~


## デフォルト値
https://www.postgresql.jp/document/9.6/html/catalog-pg-attrdef.html
に記載されている通り、pg_get_exprを使ったadbinフィールドの逆コンパイルをしてる。
文字種を指定したパスワードの生成

# はじめに

Linux環境では、mkpasswdコマンドを使ってパスワードを生成する方が多いと思います。
[総務省が「定期的にパスワードを変更すべき」という方針を撤回した](http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/privacy/01-2.html)というのは記憶に新しいですが、なんだかんだでパスワード変更が必要になるシーンはまだまだ多いと思います。

また、単にパスワードを自動生成しても「大文字のローマ字が含まれていないとルール上NG」「パスワードに記号が入っていると入力しづらい」といったことが起きるため、文字種を指定したパスワードの生成ができるととても便利です。

そこで、mkpasswdコマンドのパラメーターを使って、パスワードの文字種を自由に指定する方法を少し紹介したいと思います。


# 事前準備

* mkpasswdコマンドを使うには、expectというパッケージのインストールが必要になります。
 * CentOSの場合、インストールタイプをBASICに指定するとmkpasswdコマンドを手動でインストールする必要があります。

```shell
[root@akagi ~]# yum install expect -y
```


# mkpasswdコマンドの概要

* パラメーター無しで`mkpasswd`だけ入力して実行すると、ランダムなパスワードが返されます。
 * 英数字と記号が混ざった「9文字のパスワード」となります。
* オプションを指定することで、パスワードの長さや含まれる文字の種類を自在にコントロールすることが可能です。

|オプション|説明|
|---|---|
|-l {数値}|パスワードの文字数|
|-d {数値}|パスワードの含まれる数字の個数（最低数）|
|-c {数値}|パスワードに含まれる小文字のローマ字の個数（最低数）|
|-C {数値}|パスワードに含まれる大文字のローマ字の個数（最低数）|
|-s {数値}|パスワードに含まれる記号の個数（最低数）|

# パスワードの生成の一例

* 上記のパラメーターの説明を見ると分かりますが、数字や小文字のローマ字などは「最低数」を指定するようになっています。
* これを逆手にとると、「パスワードに含まれる文字種」を自由にコントロールすることができます。
* 例えば「パスワードの文字数が8文字」の時、以下のように設定すると「"最低の文字数"を足しただけでパスワードの文字数が飽和する」ため、結果的に大文字のローマ字と記号が入らないパスワードを作ることができます。
 * 数値：最低4文字
 * 小文字のローマ字：最低4文字
 * 大文字のローマ字：最低0文字
 * 記号：最低0文字

## 数字のみのパスワードを作る場合

* `文字数＝数字の数`とした上で、ローマ字や記号の文字数を全て0文字とします。

```shell
[root@akagi ~]# # 数字のみから成る、8文字のパスワードを生成する。
[root@akagi ~]# mkpasswd -l 8 -d 8 -c 0 -C 0 -s 0
07752792
```


## ローマ字と数字のみのパスワードを作る場合

* `文字数＝{数字の数＋ローマ字の数}`とした上で、記号の文字数を0文字とします。

```shell
[root@akagi ~]# # 小文字のローマ字4文字と数字4文字から成る、8文字のパスワードを生成する。
[root@akagi ~]# mkpasswd -l 8 -d 4 -c 4 -C 0 -s 0
8ykwi972

[root@akagi ~]# # ローマ字4文字（大文字：1、小文字：3）と数字4文字から成る、8文字のパスワードを生成する。
[root@akagi ~]# mkpasswd -l 8 -d 4 -c 3 -C 1 -s 0
25hi1Iv0
```

## 記号も含むパスワードを作る場合

* 数字/ローマ字/記号が混ざったパスワードを作りたいだけなら、文字数さえ指定すればOKです。
* 数字/ローマ字/記号の文字数を指定したい時は、`文字数＝{数字の数＋ローマ字の数＋記号の数}`とすれば、パスワード中に含まれる文字の配分を自由に指定することが出来ます。

```shell
[root@akagi ~]# # 数字4文字と小文字のローマ字4文字、記号1文字から成る、9文字のパスワードを生成する。
[root@akagi ~]# mkpasswd -l 9 -d 4 -c 4 -C 0 -s 1
@bi4ag510
```
複数端末からEC2へ同一ユーザでアクセスする

#概要
会社のwindows、自宅のmacと複数端末から同じEC2へsshアクセスする方法です。

#このようにしたい
・秘密鍵(pemファイル)を共有しない
・EC2に新たなユーザを追加しない（ec2-userのみを使用する)

#キーペアを生成する
２台目からはローカルPCでキーペアを生成し、秘密鍵をローカルPCに、公開鍵をEC2上に配置します。このキーペアを生成するためには```ssh-keygen```を使用します。

```
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[username]/.ssh/id_rsa): (enter入力※1)
Enter passphrase (empty for no passphrase): (enter入力※2)
Enter same passphrase again: (enter入力※2)
Your identification has been saved in /Users/[username]/.ssh/id_rsa.
Your public key has been saved in /Users/[username]/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0xxxxx....xxxxxx [username]@[hostname].local
The key's randomart image is:
+---[RSA 2048]----+
|        xxxxxxxxx|
|       xxxxxxxxxx|
|      xxxxxxxxxxx|
|      xxxxxxxxxxx|
|        xxxxxxxx |
|         xxxxxxx |
|          xxxxxxx|
|         xxxxxxxx|
|        xxxxxxxxx|
+----[SHA256]-----+
```
上記のようにssh-keygenを入力した後は全てenterで良いと思います。
*1:保存先、ファイル名を指定できますが、生成後に変更で良いかと
*2:秘密鍵にpassphraseまでつけてしまうと使い勝手が悪いかと。秘密鍵は公開しない、漏洩させないということを意識することが大事かと思います

```~/.ssh/ ```配下に以下の２つのキーが生成されます。

```
id_rsa : 秘密鍵
id_rsa.pub　:　公開鍵
```
秘密鍵は分かりやすい ファイル名.pem に変更しておきます。
公開鍵は後述のようにEC2へ登録します。

#公開鍵をEC2へ登録する

すでにEC2へアクセスできる端末にて、sshでEC2へアクセスし、以下のファイルを開きます(ec2-userでアクセスです）。

```
vi ~/.ssh/authorized_keys
```
※viじゃなくても良いです。

authorized_keysにはすでに登録されている公開鍵が記載されています。
1行が1つの公開鍵となります。
ですので、改行して、作成した公開鍵の内容を追記します。

追記するためには、新しい端末で生成した公開鍵をすでにEC2へアクセスできる端末へコピーする必要があります。公開鍵なので、基本的にはどのような渡し方でも良いと思います。
私はslackで公開鍵の内容を自分宛に送り、不要となったらslackのメッセージを削除するというやり方でコピーしました。

後は新しい端末で秘密鍵を使用し、EC2へsshでアクセスします。もちろん、ec2-userでログインできます。
これで複数端末から同一ユーザでEC2へログインできるようになりました。
CSSで回転(transform rotate)を定義するときにハマったこと

CSSで回転(transform rotate)を定義するときにハマったことがあるので、記録しておきます。

## CSSで回転(transform rotate)を定義するときにハマったこと
`transform: rotate(90deg);`
のように書けばOKです。
これを
`transform: rotate(90)deg;`
のように書いてしまうと正しく解釈されないので注意して下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
はじめてのC++【12日目】

#はじめに
基本はdeleteをつけるコードはしないとのこと。
std::unique_ptrやstd::shared_ptrなどにdelete機能がついているのでこれを使う。

##ロベールのC++
###05-16 new & delete 2 of 3
配列の動的確保は

```cpp
int* array = new int[100]
```
動的配列に似てますね

```New2.cpp
#include <iostream>

void CalcMultiples(int *array, int size, int n)
{
  for(int i = 0; i <size; ++i)
  {
    array[i] = n * (i + 1);
  }
}

void ShowArray(const int* array, int size)
{
  for(int i = 0; i < size; ++i)
  {
    std::cout << array[i] << ' ';
  }
  std::cout << std::endl;
}

int main()
{
  int* array;
  int size;

  std::cout << "どこまで計算しますか? >" << std::flush;
  std::cin >> size;

  array = new int[size];

  CalcMultiples(array, size, 3);
  ShowArray(array, size);

  delete[] array;
}
```
<img width="161" alt="スクリーンショット 2019-03-08 23.38.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/0da856ed-e220-9107-56ce-e1c7dd9209b1.png">

###05-17 new & delete 3 of 3
**メモリの動的確保はどのようなときに使う？**
動的配列を使うときがほとんど

スタックオーバーフローの恐怖
自動変数に置かれるメモリ領域はスタックという場所がおおい。
関数内で巨大な配列変数を作るとスタック領域から飛び出して、スタックオーバーフローが起こる。
スタックオーバーフローになると、エラーが起きたり、エラーが起きずに予期せぬ動作が起こる。
メモリの動的確保をすると、このような心配がなくなる。

動的確保したメモリの寿命はnewしてdeleteするまで
ただし、メモリリークに注意

#終わりに
明日は多分時間あるのでここ最近あまり進んでいなかった文を一気に取り返す
明日からは第6章クラスの基礎にはいります。
あと、明日ABCコンテストあるみたいなので頑張るで
Visual Studio for MacでC# 中括弧の始まりを行末デフォルトに設定する

UnityでC#コード書く時Visual Studioを使用している

特にMacなのでVisual Studio for Macなのだが

どうも中括弧{} などを改行する時に下記のように行頭に移動するのではなく

```cs
if(hogehoge)
{

}
```

　　
下記のように行末に中括弧が来てほしかった
```
if(hogehoge) {

}
```

の設定がわかりにくかったので備忘録がてら記載する

<br>

### ユーザー設定から行っていく

MacだとVisual Studioを選択した状態でメニューバーの

Visual Studio --> ユーザー設定

![screenshot 2019-03-08 23.44.29.png](https://qiita-image-store.s3.amazonaws.com/0/44492/9de9b1c0-19a7-7417-e2a2-86b70ef3e697.png)

ソースコード --> コードのフォーマット --> C#ソースコード --> C#フォーマットの "編集(E)" をクリックで開く


![screenshot 2019-03-08 23.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/44492/ce36c318-828b-f4fc-da44-e219acdfa222.png)


カテゴリ(C) のプルダウンメニューから改行を選ぶ

![screenshot 2019-03-08 23.49.07.png](https://qiita-image-store.s3.amazonaws.com/0/44492/6b638f65-89cd-61ce-143c-4fec85380dae.png)

後は好きなように改行についてチェックを外すなどして変更していく、右側のウィンドウにプレビューが出てくるのでわかりやすい

![screenshot 2019-03-08 23.49.41.png](https://qiita-image-store.s3.amazonaws.com/0/44492/37f97aa4-2bb8-f931-1def-08c45829d02d.png)


以上
Eclipseを使ってGitHubのリモートリポジトリをローカル環境にクローンする方法と、ローカルリポジトリからリモートリポジトリに編集内容をPUSHする方法。

# 勉強会用に作成しました。
知ってる人は読み飛ばしてください。

この記事を試すと次のことが出来るようになります。。

・GitHubにリモートリポジトリを作成出来るようになる。
・GitHubに作成したリモートリポジトリをローカルリポジトリにクローン出来るようになる。
・ローカルリポジトリに作成したファイルを編集して、ステージングしてコミットできるようになる。
・ローカルリポジトリのコミットをリモートリポジトリにPushすることが出来るようになる。

## そもそもリポジトリとは?

リポジトリとは、ファイルやディレクトリの状態を記録する場所のことです。

保存状態は変更履歴として格納されています。

## では、リモートリポジトリとは?

専用のサーバに配置して複数人で共有するためのリポジトリです。

GitHubで作成するリポジトリはこれにあたります。

## じゃあ、ローカルリポジトリとは？

ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリです。

## Git操作に関するチュートリアル

一応操作については過去に私が自分用に記事を書いてます。

ただ、文章は適当なので、キーワードを拾って他の人の記事を検索した方がいいです。

[僕の書き溜めてる記事]: https://qiita.com/ryuutamaehara

## GitHubにリモートリポジトリを作成出来るようになる。

1. GitHubの自分のページにアクセスする。
2. 左上Newボタンをクリックする。
![1552052221766.png](https://qiita-image-store.s3.amazonaws.com/0/360148/50939252-7ad0-f637-4930-e0f255e093be.png)

3. 「Repository Name」に任意のリポジトリ名を入力する。今回は「GitHubSample２」とした。
4. 「Description」に説明を入力する。(任意)
5. 今回作成するリポジトリは公開型なので「Public」を選択する。(任意)
![1552052283320.png](https://qiita-image-store.s3.amazonaws.com/0/360148/5cf0f63c-bf57-e207-75b4-68b191e48fb8.png)

6. Initialize this repository with a READMEにチェックを入れる。手元にあるGitリポジトリをpushする場合はチェックしない。
7. 「Add.gitignore」、「Add a license」は設定しない。
![1552052312292.png](https://qiita-image-store.s3.amazonaws.com/0/360148/80bf5ca2-c91a-9576-1cf4-d41b9e20a701.png)

8. 「Create repository」をクリックする。
9. 作成されたリジトリの画面に移動して、URLバーに表示されているURLをコピーする。
![1552052620687.png](https://qiita-image-store.s3.amazonaws.com/0/360148/18f69ea6-4b07-8bf0-0c26-2c59a5bd63e0.png)


## GitHubに作成したリモートリポジトリをローカルリポジトリにクローンして、プロジェクトとしてインポートする。

1. Eclipseを立ち上げる。
2. ウインドウ⇒パースペクティブ⇒パースペクティブを開く⇒その他をクリックする。
3. Gitを選択⇒開くをクリックする。
4. Ctrl+Vを押下し、リモートリポジトリがURIにセットされていることを確認する。（ユーザIDとパスワードが設定されていない場合はセットする。)
5. 次へ⇒次へ⇒完了をクリックする。
6. Gitリポジトリーに追加したリポジトリが追加されていることを確認する。
7. 追加されたリポジトリの上で右クリック⇒プロジェクトのインポート⇒完了をクリックする。

## ローカルリポジトリからインポートしたファイルを編集して、ステージングして、コミットする。

リポジトリからインポートしたファイルを編集します。

変更前
![1552054219065.png](https://qiita-image-store.s3.amazonaws.com/0/360148/121beca0-3b56-8296-0435-e6a3e72c7d1b.png)

変更後
![1552054306852.png](https://qiita-image-store.s3.amazonaws.com/0/360148/692ffb70-5125-dc58-02b4-a7d3ebedc1df.png)


下側のGitステージングを表示する。すると、編集したファイルが「ステージされていない変更」に表示されるので、++ボタンをクリックする。
![1552054535966.png](https://qiita-image-store.s3.amazonaws.com/0/360148/648cd6e2-a4a7-a2f0-ea03-02e60f2c4df0.png)


ステージされた変更に編集したファイルが移動したのを確認したら、コミットメッセージを入力して、コミットをクリックする。

## ・ローカルリポジトリのコミットをリモートリポジトリにPushする。

1. Gitパースペクティブに移動し、対象のローカルリポジトリをクリック⇒アップストリームへプッシュをクリックする。
2. 構成⇒保存およびプッシュをクリックする。
3. GitHub上のリモートリポジトリで編集内容が反映されている事を確認する。
![1552055543894.png](https://qiita-image-store.s3.amazonaws.com/0/360148/0b20cb8e-bfd3-1cd6-5fad-ecb7cfc90341.png)


以上
[Notch] StandAloneで頑張るために その4

（無駄が多いので、お忙しい方は最後のまとめをご覧ください！）

ガスト ノッチ!!!!!!!! 千田です!!!!

みなさん、HochonoHouse聴きました？

いいですよー。HochonoHouse。
細野さんの新旧が混ざり合った感じといいますか、
もう、グッときちゃいます。電車でニヤニヤしながら聴いちゃいました。

なんだか、そこはかとなくテクノ。そして、なんだか今っぽい音作りをされていたり。
ほんとねぇ、、、いい。ほちょのさん　いいですよ。
ジャケットもそこはかとなくS・F・Xだし。
AppleMusicで聴けるので、ぜひ！！！！！聴くのだぁーーー。

さて本題です。

##StandAloneで頑張るために その4
今回はNotchといいますか、キャプチャボードの話が中心です。
現場でキャプチャボードを使用すると、どうしてもついてくるのが、、、

遅延

そう。遅れるーってやつです。
10年近く遅延と戦ってますが、、、どうやって付き合っていくか。
今日はその辺の話です。

まず、キャプチャボードでどれくらい遅延するのか？？？？
これを調査していきましょう。

遅延計測に当たり、まずは条件を決めます。
・HD-SDIは、最近30Pでもらうことが多いので（場合によってはもちろん59.94iもありますし、24Pなんてこともありますが、、）、30Pを前提とした計測です。

・計測方法は毎フレームカウントアップしていく数字が表示される30FPSの映像を作り、
Notchに取り込みます。
その映像を再生し、画面をHD-SDI回線で撮影したカメラの映像をNotchで表示し、
二つの画像に表示された数字から、計測します。

・なるべくモニタ自体の遅延を省きたいので、ゲーミング仕様の高周波数対応モニタを使用して計測。

この条件から、前々回、または前回紹介したキャプチャーボードや機材の遅延を計りました。

結果は

・Magewell USB Capture SDI USB 3.0 HD Video Capture Dongle 4フレーム
・Datapath VisionLC SDI　3フレーム
・BirdDog Studio NDI　4フレーム

あれ、、、意外とNDI　早いじゃん！！！！
これなら、行けそうかも！！！

さて、そもそも、映像が「遅れる」とは、何に対して遅れるのか？
一般的にはカメラで撮影したものに対しての遅れとなりますが、
広い場所の場合、
聴こえる「音」に対して遅れることを指す場合が多いのではないでしょうか？
（Notchを通らない映像回線に対しても遅れてますので、それを指して遅れているという場合もあります。）


それでは先ほどの結果を秒に直してみましょう。（すべて30FPS換算)

・Magewell USB Capture SDI USB 3.0 HD Video Capture Dongle 0.132秒
・Datapath VisionLC SDI　0.1秒
・BirdDog Studio NDI　0.132秒

1フレーム遅いくらいだと、そんなに気にならないから、、、、
だいたい大丈夫じゃん！！！やったーーーーー！！！！！！

と、ならないのが現場の世界です。
自分のことだけでは何とも収まりません。。。。

カメラから撮影されてスイッチャを通ってくるのであれば1フレーム程度遅れてるかも。
Notchのアウトを他の方へ回線渡すので、SDI変換するなら1から3フレーム。（機材によって変動）
それを配置するプロセッサーで1フレーム、

LEDのプロセッサーで1フレーム程度あるかも。。。。。
などなどなどなど、、、、かかるんです。結構。。。

そうすると、、、、、、
「千田さんのところ通ると、遅れますよね。」という話になります。
大体なります。はい。なります。

だってさぁ、キャプチャして加工して、Vsync待って表示だからさー。フレームバッファするでしょー。
優秀なボード使っても３フレームは切れないよ、、、、
じゃあ思い切ってVsync切るか？？？なんてね。
ぐれたりします。

なので、自分でシステム組めるのであれば、最短距離を狙います。
僕が全部やるときはそうしてます。


今回はNotchの話　あんまり関係ありませんでしたね。。。。
でも、これはメディアサーバでも一緒だもんね！！！！
はい。

それではまとめです。

##本日のまとめ
Notchに映像をキャプチャすると、映像は遅れます。
キャプチャして表示まで

・Magewell USB Capture SDI USB 3.0 HD Video Capture Dongle 0.132秒
・Datapath VisionLC SDI　0.1秒
・BirdDog Studio NDI　0.132秒

現場では自分のとこ以外にも機材があるので、単純にNotchを通った回線が上記分加算して遅延する。
これはどうしようもないので、映像の渡し方でなるべく遅延を軽減する。

以上！！！がんばるのだ！！
CentOSにGUI環境GNOMEのインストールメモ

# はじめに
CentOS環境にGUIが必要になって来たので、デスクトップ環境としてGNOMEをインストールしてみました。  

# 環境

```
[user@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
```

# 手順
## CentOS最新化
- CentOSを最新化してバージョンを確認します。※  
 
 ```
 $ [user@localhost ~]$ sudo -E yum update -y
...
  yum-plugin-fastestmirror.noarch 0:1.1.31-50.el7         zlib.x86_64 0:1.2.7-18.el7

置換:
  grub2.x86_64 1:2.02-0.65.el7.centos.2                                                grub2-tools.x86_64 1:2.02-0.65.el7.centos.2

完了しました!
[user@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
 ```

## GNOMEのインストール
-  GNOMEをインストールするのは、依存関係を含めて１０００個以上のパッケージが必要です。そのため、パッケージグループで一括インストールします。  

  ```
  $ sudo -E yum groups install "GNOME Desktop" -y
  ...
    xorg-x11-server-utils.x86_64 0:7.7-20.el7                                              xorg-x11-xkb-utils.x86_64 0:7.7-14.el7
    yajl.x86_64 0:2.0.4-4.el7                                                              yelp-libs.x86_64 2:3.28.1-1.el7
    yelp-xsl.noarch 0:3.28.0-1.el7                                                         zenity.x86_64 0:3.28.1-1.el7

  完了しました!
  [user@localhost ~]$
  ```

## GUI起動
今回はCentOSの**コンソール**から起動する手順です。 SSHからリモートのCUI環境で起動できません。 

  ```bash
  $ startx
  ```
しばらくすると、下記GUI画面が立ち上がります。  
![001.png](https://qiita-image-store.s3.amazonaws.com/0/193995/4044c866-aa4c-9d1d-1b66-7effd713c990.png)
「日本語」を選択し「次へ」をクリックします。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/193995/22b93497-21cc-b813-a79d-870e59790661.png)
「日本語」を選択し「次へ」をクリックします。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/193995/d9394275-979e-688c-6720-4cea7686b9a2.png)
位置情報を「OFF」して「次へ」を押します。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/193995/8905c7a8-957e-d71a-e997-964213541689.png)
オンラインアカウントへの接続はとりあえず「スキップ」します。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/193995/f1beef21-6421-3e5d-b1f8-3b2e0112611b.png)
「CentOS Linuxを使い始める(S)」を押してインストールを完了します。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/193995/95ccaa0d-cbfa-bc63-b186-2e1d3124922b.png)





※CentOSが最新化しない場合、下記のエラーが発生しインストールが失敗します。 

  ```
  $ sudo -E yum groups install "GNOME Desktop" -y
  …
  (1112/1112): urw-fonts-2.4-16.el7.noarch.rpm               | 3.0 MB   00:19
  --------------------------------------------------------------------------------
  合計                                               5.6 MB/s | 881 MB  02:36
  Running transaction check
  Running transaction test


  Transaction check error:
    file /boot/efi/EFI/centos from install of fwupdate-efi-12-5.el7.centos.x8![001.png](https://qiita-image-store.s3.amazonaws.com/0/193995/ebdc951b-2db6-2652-bda0-5a2118dead7b.png)
6_64 conflicts with file from package grub2-common-1:2.02-0.65.el7.centos.2.noarch

  エラーの要約
  -------------

  [user@localhost ~]$

  ```
参考資料の[CentOS 7 : X ベースの GUI デスクトップ環境インストール](https://server.etutsplus.com/centos-7-x-window-yum-install/)に解決策が記載されますが、試したところでうまくいきませんでした。

# 参考資料
- [CentOS7にWindowsリモートデスクトップ接続する方法](https://qiita.com/SkyLaptor/items/56c9b5f5784f19cac225) 
- [CentOS 7 : X ベースの GUI デスクトップ環境インストール](https://server.etutsplus.com/centos-7-x-window-yum-install/)
EC2 ssh接続用のユーザーを作成してみた

awsでユーザーを作成したので備忘録として残しておく

##新規ユーザ作成
まずは、既存のユーザーでssh接続を行う

```terminal
ssh -i ./.ssh/XXX.pem ec2-user@XX.XXX.XXX.XXX

```

rootユーザになる

```terminal
sudo -s
```

ユーザーとパスワードの作成

```terminal
useradd ユーザ名
passwd ユーザ名 #入力後設定するpassを求められる
```

##ユーザの設定
sudoを行えるように/etc/sudoersファイルに以下を追加する
ファイルは***sudo visudo***で開く

```terminal
# rootに同じ設定があるので、その下の方が良い
ユーザ名  ALL=(ALL)  ALL
```
##鍵の作成

```terminal
#作成したユーザーに移動
sudo su - deploy

cd /home/deploy
#ディレクトリの作成
mkdir .ssh
cd .ssh

#keyの作成
ssh-keygen -t rsa
#ファイル名の変更
mv id_rsa.pub authorized_keys
```
id_rsa  id_rsa.pubの二つが作成されていれば成功。
権限の変更を行う。これを行わないとssh接続ができない

```terminal
chmod 600 authorized_keys
cd ../
chmod 700 .ssh
```

**cat id_rsa**などで秘密鍵の中身を確認し、ローカルに保存しておく。

##接続確認

```terminal
ssh -i ローカルに保存した秘密鍵のパス ユーザ名@XX.XXX.XXX.XXX
```
接続できれば終了


##エラーハンドリング

###接続できなかった場合1
ローカルに保存した鍵の権限の変更

```terminal
chmod 400 秘密鍵のファイル
```

###接続できなかった場合2
aws側のshh接続の設定ミス.
ssh接続の設定が変わってしまっているかもしれないので、確認をする

```terminal
vim /etc/ssh/sshd_config
```

次の記述があることを確認する。もしなければ追加する。
sshd_configAuthorizedKeysFile      .ssh/authorized_keys

##参考記事
EC2にSSH接続用のユーザーを作成する 
 https://qiita.com/nekonoprotocol/items/e1fc5c212bf6a7365f8f

Linuxユーザーの追加 SSH公開鍵で接続する。
http://onga-tec.hatenadiary.jp/entry/2016/11/10/Linux%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0_SSH%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%80%82
Kaggleカーネルの勉強 第1弾(スタッキング)

今年の1月からKaggleに参加し始めたのですが、中々スコアが出ないので色々Kernelから勉強しようと思い、学んだ手法をまとめていこうと思います。
第1弾は[こちら](https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python)をベースにしようと思います。

KaggleのKernel上で作業して、全体に公開します。Kernelは[こちら](https://www.kaggle.com/tazunao/intro-to-ensembling-stacking-in-python-forked)

#今回のKernelの概要
スタッキングをTitanicデータセットを使って学びます。
スタッキングとは、あるモデルのoutputを別のモデルのinputとする手法のことです。
今回は、異なる6つのモデルで予測を行い、各モデルのfeature_importancesをinputとしてさらに別のモデルで予測を行います。
コード全体はKernelに書くとして、ここでは気づきだけをピックアップして書きたいと思います。

#Feature Engineering
・NaNはfloat型なので、floatかどうかを見ればダミー変数化できる。

```
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
```

・NaNはfloat型なので、floatかどうかを見ればダミー変数化できる。

```
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
```

#Ensembling & Stacking models
・クラスとしてSklearnHelperを定義、sklearnのメソッドを使えるようにする

```
class SklearnHelper(object):
(以下省略)
```

・あるモデルのoutputを次のモデルのinputとするための関数の定義

```
def get_oof(clf, x_train, y_train, x_test):
(省略)
#KFoldでval_indexは最終的に全行を網羅するので全てのoof_trainに数値が入る
        oof_train[val_index] = clf.predict(x_va)
#KFoldのiteration毎に予測値を格納し、その平均を取る
        oof_test_skf[i, :] = clf.predict(x_test)
    oof_test[:] = oof_test_skf.mean(axis=0)
#スタッキング用の訓練データ、テストデータを出力
    return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)
```

```
#スタッキングした訓練データを作成
x_train = np.concatenate(( et_oof_train, rf_oof_train, ada_oof_train, gb_oof_train, svc_oof_train, lgb_oof_train), axis=1)
#スタッキングしたテストデータを作成
x_test = np.concatenate(( et_oof_test, rf_oof_test, ada_oof_test, gb_oof_test, svc_oof_test, lgb_oof_test), axis=1)
```


後はこれをXGBoostに突っ込んで予測をしている。
ただ、cross validationなどしておらず、いい結果は出なかった。


#まとめ
・とりあえずいろんなモデルで予測をして、その予測結果をinputとして別のモデルで予測すればStackingになる。
・訓練セットにOverfittingする気がするので、その辺りきちんと知っておきたい。
・クラスを上手く活用出来るようになりたい。
・ヒートマップとペアプロットの見方をもっと勉強したい。イマイチこの活用方法がわからん。。。
・あんまりうまく解説できずすみません、コメントでご指摘頂けると記事に反映します。
UbuntuをMacみたいにトラックパッドを使ってワークスペースを変える

#はじめに
ノートパソコンにUbuntuを入れたけどトラックパッドでワークスペースが切り替えれなくて少し使いにくいと思ったので４つ指で切り替えれるようにした。

#環境
* XPS 13(9380)
* Ubuntu 18.04

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

```
# ユーザーをinput groupに入れる
sudo gpasswd -a $USER input

# ライブラリをインストール
sudo apt install xdotool wmctrl libinput-tools

# クローンとインストール
git clone http://github.com/bulletmark/libinput-gestures

cd libinput-gestures

sudo ./libinput-gestures-setup install
```

PCを再起動する

```
touch ~/.config/libinput-gestures.conf
```

中身は以下のようにした

```~/.config/libinput-gestures.conf
gesture swipe left 4 xdotool key alt+control+Down
gesture swipe right 4 xdotool key alt+control+Up
```

`libinput-gestures-setup restart`を実行して再読込する。
これで４つ指でワークスペースを切り替えることができるようになりました。
PythonでPDFのHTTPレスポンスからサムネイルを生成する

# 概要
wand(ImageMagick)を使ってPDFの1ページ目をもとにサムネイルを生成するプログラムを作りました。

# 実行環境
- Python 3.7.2 64bit
- MacOS Mojave 64bit

# 必要ライブラリ、アプリケーション
[Wand](http://docs.wand-py.org/en/0.5.1/) を使っているので、Wandと[ImageMagick](https://www.imagemagick.org/)をインストールする必要がある。

```
$ brew install GhostScript
$ brew install ImageMagick
# pip install Wand
```

# コード

```Python
from wand.image import Image as wandImage

def genThumb(response, thumb_width, thumb_height):
    data = response.read()

    # 高速化のためにpdf[0]で1ページ目のみ読み込む 
    image = wandImage(blob=data, format="pdf[0]")

    # 解像度を変更し、pngフォーマットに変換する
    image.resize(width=thumb_width, height=thumb_height)
    temp = image.make_blob(format="png")

    return temp
```
CSSめも

# CSSメモ
「お前は何をいっている？」っていまさらメモ。

## 子孫/子/隣接セレクタ(ドキュメントの構造に応じて適用)
[[覚え書き] CSS再入門～セレクタ～](https://qiita.com/oh_rusty_nail/items/e522fe74bc3547b3e826)より

```css
A B { color: red; } /* Aの階層下のすべてのBに適用 */
A > B { color: red; } /* Aの1階層下のBに適用 */
A + B { color: red; } /* Aの階直後のBに適用 */
```

## 選択文字の背景をハイライトにする
どうでもいいことだけど、なんか見つけて気に入ったのでメモ

### codepen
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="result" data-user="fujisystem" data-slug-hash="pYPZpw" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Highlighting selected text in color">
  <span>See the Pen <a href="https://codepen.io/fujisystem/pen/pYPZpw/">
  Highlighting selected text in color</a> by fujisystem (<a href="https://codepen.io/fujisystem">@fujisystem</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## ダークモード
[いまさらながらダークモード対応に入門した](https://qiita.com/blkclct/items/91caffa72f76c12d6531)より

```css
:root{ filter: invert(100%) hue-rotate(180deg); }
```
npmプラグインぽんっと楽に作りたい

表題の通り。自分が関わる案件で、ちょっと込み入った機能があったり、
将来的に再利用しそうな可能性のある機能はなるべくマイクロに組んで再利用できるようにしていきたい。
自分の利用している技術（とか押さえたい機能）としては以下な感じ。

- TypeScriptはマスト（実装＝ほぼapiドキュメントになる事が大好き。不特定多数が関わるプロジェクトでなかろうと、もーほんま大好き。ちゃんとJSのスーパーセットでもあってくれる）
- vueをプライマリなui状態管理のFWに利用している（ReactやAngularは嫌いはないけどvueが最高すぎた）
- Node.js onlyな世界でも時々生きてる
- SSRを意識したプラグイン開発をしておきたい局面が多い（DOMへの依存がないとしても、不意に触ちゃってたりする、、のをプラグインとして公開したくはない。その動作確認も開発中に簡単に行いたい）

、、で、特にユニバーサルな開発の機能確認においてはNuxt一択だった。
だって、tsもnuxt-tsでおっかけてきて、ユニバーサルな足場なら短時間でぽんとできあがる。ほんま脱帽です。。。。

ただ、プラグイン開発においては話は別だった。
nuxtはcli側でゴリゴリwebpackの設定を構築してくれるんだけど、それはプラグインとして公開したいビルド設定とはなんだか一致しない。
というかむしろ、再利用を意識すると、まだ意識としてはrollupに優位性を感じてしまう。（なるべくバンドルサイズを下げたい）

webpackだってこれからも色々工夫するんだろいうけど、今のところ依存性の内部解決がfunctionコールだというオーバーヘッドで躊躇してしまう。（プロダクションでは全然これでいい。むしろ補って余りあるメリットをwebpackには感じる。）

で、以下を見つけた。

https://github.com/kazupon/vue-cli-plugin-p11n

あれ、i18n、、プロダクションでも利用させてもらったナイスな人が、ナイスな事やってる。
と、思い利用させてもらったが、そもそもまだ開発始めたばかりらしく、自分のプロジェクトでは思うようにビルド通せない。というか、vue-cliのSSRプラグインとtypescriptプラグインとを併用するとそれだけど、なんだかうまく動かせないので、かずぽんfighterのプラグインを恩恵を感じきる前に退散（アイデア素晴らしいと思うので今後もチェックします）。

、、ならば、、もうvue cliとか関係ない、npmのcliとしてこういうサービス作ればよくね？
と思って以下を作った。
https://www.npmjs.com/package/dd-plugboy

※注意!! まだほんまプライベートな完成度です。

今日、現在制作中のいわゆるinsta的な無限スクロール（メモリリークやSSRを苦慮）のプロジェクトをやっとビルド通せて、
さぁ旅が始まったぞという次第。
理想としては、自分のプラグイン開発において、とりあえずこれをインストールしって利用すれば公開資材の作成まではストレスなくいけるようにしたい。（このへんでリソースかけちゃうのは、人生もったいない）

というモチベーションと、あぁこういうのって本当大変なんだなぁを吐き出せるのは家族ではなくQiitaだと思った次第でしたでございます。

もーこのパッケージ本当自分好みに育てたろう。
Mattermost Team Edition を minikube 上に構築する

やってみたのでメモ

# 環境
|OS・ミドルウェア|バージョン|
|:-------------|:----------|
| OS           | MacOS Mojave |
| minikube     | v1.6.4       |
| kubernetes   | v1.17.0      |
| helm         | v3.0.2       |

# 手順
1. minikube を起動する

    ```
    $ minikube start --disk-size=40g --memory=8192 --cpus=4 --vm-driver=hyperkit
    ```

2. ingress を有効化する

    ```
    $ minikube addons enable ingress
    ```

3. 日本語ローカライズ設定用の YAML ファイルを作成する

    ```
    $ vi update-locale-ja.yml
    ```
    
    ```update-locale-ja.yml
    configJSON:
        LocalizationSettings:
            DefaultServerLocale: ja
            DefaultClientLocale: ja
    ```

4. Mattermost Team Edition をインストールする

    ```
    helm install -f update-locale-ja.yml \
        --generate-name mattermost/mattermost-team-edition \
        --set mysql.mysqlUser=sampleUser \
        --set mysql.mysqlPassword=samplePassword \
        --set ingress.enabled=true 
    ```

# 参考
pluckとmapはpluckのが４倍速度早い

大規模なRailsアプリケーションを開発した際に処理速度というのは非常に重要になってきます。
pluckはmapに比べて標準的なデータベースの探索のみなら、約4倍程の速度を出せると言われています。

以下はどちらで書いても結果は同じだが、pluckのが早いのでそっち使いたいところ。


```rb

users_name = User.all.map { |user| user.profile.name }
```

####上と下ではどっちでも同じ

```rb

users_name = User.joins(:profile).pluck(:name)
```

*pluckは指定したカラムの配列を取得する
*上記の例はUserとProfileが1対1の関連

#その他、書き方の例
####mapでidが40以上のuserのidを取得する

```
2.4.1 :020 > User.select(:id).where(["id >= ?", 40]).map(&:id)
  User Load (0.4ms)  SELECT `users`.`id` FROM `users` WHERE (id >= 40)
 => [40, 41, 42, 43, 44, 45] 
```

####pluckでidが40以上のuserをのidを取得する

```
2.4.1 :022 > User.where(["id >= ?", 40]).pluck(:id)
   (0.4ms)  SELECT `users`.`id` FROM `users` WHERE (id >= 40)
 => [40, 41, 42, 43, 44, 45] 
```

####性別が1の人のidを取得

```
2.4.1 :047 > User.joins(:profile).where(["sex = ?", 1]).pluck(:sex)
   (0.4ms)  SELECT sex FROM `users` INNER JOIN `profiles` ON `profiles`.`user_id` = `users`.`id` WHERE (sex = 1)
 => [1, 1, 1, 1] 
```

*この場合「=」のみになる。


####1対多の関連の時（Userがhas_manyでPermissionがbelongs_to）
以下の書き方。

```rb

Permission.joins(:user).pluck(:function_label)
```

`【多のモデル】.joins(:1のモデル).pluck(:多のモデルのカラム名)`



参考：[where(["recorded_on < ?", Date.today]).　←このの書き方なに？？](https://qiita.com/ryuuuuuuuuuu/private/a6c22988df06f9c714b8)



https://techacademy.jp/magazine/7692
dhcpcd - a DHCP client 日本語訳

原文: https://roy.marples.name/projects/dhcpcd

> Welcome to the project page for dhcpcd, a DHCP and DHCPv6 client. It's also an IPv4LL (aka ZeroConf) client. In layman's terms, dhcpcd runs on your machine and silently configures your computer to work on the attached networks without trouble and mostly without configuration.

DHCPおよびDHCPv6クライアントであるdhcpcdのプロジェクトページへようこそ。 それはまたIPv4LL（別名ZeroConf）クライアントです。 素人の言葉で言うと、dhcpcdはあなたのマシン上で動作し、問題なくそしてほとんど設定なしであなたのコンピュータを接続されたネットワーク上で動作するように静かに設定します。

> If you're a desktop user then you may also be interested in Network Configurator (dhcpcd-ui) which sits in the notification area and monitors the state of the network via dhcpcd. It also has a nice configuration dialog and the ability to enter a pass phrase for wireless networks.

あなたがデスクトップユーザーなら、通知領域に位置し、dhcpcdを通してネットワークの状態を監視するNetwork Configurator（dhcpcd-ui）にも興味があるかもしれません。 また、素敵な設定ダイアログと無線ネットワーク用のパスフレーズを入力する機能もあります。

> dhcpcd may not be the only daemon running that wants to configure DNS on the host, so it uses openresolv to ensure they can co-exist.

ホスト上でdhcpcd以外にもDNSを構成しようとしているデーモンが存在するかもしれないので、それらが共存できるようにopenresolvを使用します。
django005#staticのHeaderを入れてみよう

#前回
先までTemplateを作ってDynamic的なPageを作りました。でも普通のページがHeaderがあって、Footerがあって…もしあなたのWEBが10ページがあるのなら、10回もそのHeaderとFooterのHTML CODEをCopyしないといけないの？そんなわけがありませんー今回はそれをみていきましょう。

##一気に行きます！
まずFileの構成はこうになります。templates/helloworld/header.html　を追加しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/4b0da90b-5d6b-b69f-33c4-c28aa27f9c93.png)

header.htmlはページがLoadされたとき入れたいのHeaderを追加します。

```
<head>
	{% load static %}
	<link rel='stylesheet' href="{% static "helloworld/w3c.css"%}">
</head>


<h1>header</h1>
  {% block content%}}
  {% endblock%} 
```
次はhome.htmlを修正しますね～先までのCSSをIMPORTとか…全部削除して、そのかわりにextendsを使います。extendsの中にあるのはheader.htmlですね。
次はblock contentを使っていますね。先のheader中には  {% block content%}}  {% endblock%}があるのは覚えてますか？ つまりここBlockの内容はいかになりますよ～と。

```
{% extends "helloworld/header.html" %}

{%block content %}

<h1 class="w3-text-sand">seems like the template is works</h1>

{%for m in mydb %}
	<p class="w3-text-orange">{{ m.title }}</p>
	<p class="w3-text-deep-purple">{{ m.post |safe}}</p>
	<p class="w3-text-lime">{{ m.published}}</p>
{%endfor%}
	
{% endblock %}  
```

これでHeaderの内容ちゃんと見えますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/9cb95580-b993-0e22-dea0-268694300cce.png)
Vue CLI 3.xからの環境変数やモードの扱い

# なぜまとめようと思ったのか?
3.x版にアップデートしたあと、E2E(Nightwatch)を走らせると、開発途中のSNSが本番のAPIサーバと接続してしまい本番環境のDBに書き込みが反映されるといった自体が起きました。
そこで折角なので、3.xになったことによる環境設定周辺をここに簡単ではありますが、できるだけ丁寧にまとめておきたいと思います。

## 環境設定ファイルとモード
Vue CLIが2.xのときはconfigディレクトリ以下にそれぞれ
- dev.env.js
- prod.env.js
- test.env.js
が用意されていました。

3.xからは手動で各自必要な環境設定ファイルを用意します。また場所もconfig以下ではなく各プロジェクトのルートに作成します。そのため

`vue create <アプリ名>` で作成したら `cd <アプリ名>` で移動し各自必要だと思われる環境設定ファイルを `touch` コマンド等で作りましょう。
次に作成することのできるファイルを一覧で下に用意しました。

|ファイル名 |モード名  |ローカルで完結するか　|
|---        |---       |---              |
|.env  |全てのケースで読み込まれる  |×  |
|.env.local  |全てのケースで読み込まれる  |○  |
|.env.development  |開発環境のみ  |×  |
|.env.development.local  |開発環境のみ  |○  |
|.env.production |本番環境と**E2E環境**で読み込まれる  |×  |
|.env.production.local  |本番環境と**E2E環境**で読み込まれる  |○  |
|.env.test  |ユニットテスト環境で読み込まれる  |×  |
|.env.test.local  |ユニットテスト環境で読み込まれる  |○  |

全てを列挙すると上のようになる。
まず `.env` だがこれは開発, テスト, 本番環境全てで使う環境設定がある場合に利用する。また `.env` は優先順位的には下位になるので `.env.development` などモードが指定されている方が優先順位は強い。
`.local` は各自のローカル環境でだけ使いたい環境変数が合った場合のみ利用することになる。そのため全ての開発者が共通して使うものを `.env.development` に設定しそのあとAさんだけが対応するセキュリティ部分があるとした場合 `.env.development.local` に設定するといった使用法が考えられる。また `.local` はプロジェクト立ち上げ時に自動的に `.gitignore` に記述されているためGitHubにあがることはない。
そしてここで気をつけるべきなのがテスト環境の扱いです。E2Eはテスト環境ではなく本番環境として扱われます。2.xの時点と異なっているため扱う処理は気をつけてください。
狙った環境で動作をするには

```:.package.json
{
  "script": {
    "test:e2e": "vue-cli-service test:e2e ----mode development"
  }
}
```

のように狙ってモード指定する必要がある。


#### 補足 : 環境設定ファイルの書き方

```:.env
VUE_APP_HOST=localhost
```

上のように `VUE_APP` をプレフィックス(変数の頭につける)にしてください。こうしないと読み込まれません。
読み込み時では

```
process.env.VUE_APP_HOST
```

とすることで読み込めるようになる。 `process.env` を忘れないようにすること。



### 参考
[Environment Variables and Modes](https://cli.vuejs.org/guide/mode-and-env.html#example-staging-mode)
プログラミング学習　記録　13章 1

#13章 MicropostとUserの関連付け

1. UserとMicropostを関連付ける
2. Twitterを参考にMicropostを改良する
3. Userが破棄されたら関連付けられたMicropostも破棄される


##モデル作成
いつも通り　```rails g model Micropost content:text user:references```としマイクロポストのモデルを作成する

このとき```user:references```という引数は生成されたMicropostモデルの中で自動的に**belongs_to:user**が追加される（今回のキーワード）

```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
end
```

ちなみにこのMicropostは**ApplicationRecord**を継承している

##references型
**references**を利用すると自動的にindexと外部キー参照付きの**user_id**が追加され、UserとMicropostを関連付ける下準備を行ってくれるらしい（よくわからない）

```ruby:db/migrate/[timestamp]_create_microposts.rb
class CreateMicroposts < ActiveRecord::Migration[5.0]
  def change
    create_table :microposts do |t|
      t.text :content
      t.references :user, foreign_key: true

      t.timestamps
    end
    add_index :microposts, [:user_id, :created_at]
  end
end
```
ここに記載されている`add_index :microposts, [:user_id, :created_at]`の`user_id`と`created_at`を付与すると`user_id`に関連付けられたすべてのマイクロポストを作成時刻の**逆順**で取り出しやすくなるらしい。感覚的にわかる

##User/Micropostの関連付け
Twitter民ならわかると思うが、今回のUserとMicropostの関係性は
**MicropostとそのUserは belongs_to (1対1)**,
**UserとそのMicropostは has_many (1対多)**
となる

つまりMicropostには 

```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
end
```
Userには

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
end
```
関連付けられる

###validation
慣習的なのでスキップ

##Micropostを降順にする
今のままでは昇順（古いやつから上）に表示されるので、これを降順（新しいのを上）で表示させる
###
```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end
```
**default_scope -> { order(created_at: :desc) }**で解決

##Dependent: destroy
**ユーザーが削除されたなら関連付けられたMicropostも一緒に削除されなければならない**
これには

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  .
  .
  .
end
```

```dependent: :destroy```で解決
このオプションを使うと、ユーザーが削除されたと同時に紐づいたマイクロポストも削除されるようになる

今回はここまで
WinActorの応答値

さて、最近いつも大変お世話になっているWinActor様
ノードと言われる標準で入っている機能を組み合わせて開発していくのですが...

この標準の機能の応答値が作成者様の気まぐれで異なっているようで、
true/falseが応答されるのですが、とある機能ではTrue/False
あるスクリプトの機能では、注釈では、True/False
スクリプトの中身はtrue/false
実際の応答はTrue/False
何が本物か全くわからない。

一度応答値は全て大文字か小文字に変換した方が良いのかしら
vue単一ファイルコンポーネントをrequireで読み込みたい時

## 背景

すごくマイナー需要そうですが、
諸事情あって環境変数に応じて読み込むvueファイルを分けたい時に、
importはif文の中にかけないし、
両方のファイルをimportするとバンドルファイルが重くなるし・・
で、requireで読み込めば分岐できるじゃん！となったのですが、
一筋縄では行きませんでした。

## ハマった

```js
let renderObj;

if (process.env.NODE_ENV == 'development') {
  renderObj = {
    render: h => h(require("./vue/dev/App.vue"))
  }
} else {
  renderObj = {
    render: h => h(require("./vue/prod/App.vue"))
  }
}

new Vue(renderObj).$mount("#vue-mount");
```

こんなんでいけるでしょう！
と思ったら

```
Failed to mount component: template or render function not defined
```

怒られました。
おそらくrequireあたりが通ってないんだろうなと思いつつよくわからなかったので、
エラー文をググったら答えが出てきました。
https://github.com/vuejs/vue-router/issues/1882

##解決
```js
let renderObj;

if (process.env.NODE_ENV == 'development') {
  renderObj = {
    render: h => h(require("./vue/dev/App.vue").default)
  }
} else {
  renderObj = {
    render: h => h(require("./vue/prod/App.vue").default)
  }
}

new Vue(renderObj).$mount("#vue-mount");
```

requireしたパスのうしろに、defaultをつけるだけ。

どうやらvue単一ファイルコンポーネントではexport defaultが使われているので、
requireするときにもdefaultつける必要があるそうな。

##あとがき
vueでmodule.exportsって使えるのかな・・・？
引数を持ったサブルーチンのシナリオの書き方(提案)

引数を持ったサブルーチンをユーザライブラリとして作成しました。
機能追加の関係で、ユーザライブラリを更新しようとすると、結構な手間がかかるのがWinActor様

なんで、結構な手間かというと
1. そもそもユーザライブラリはシナリオに取り込んで使用するため、旧ライブラリを名称変更
2. 新ライブラリを取り込む
3. サブルーチン呼び出しの呼び出し先のサブルーチンを新ライブラリに変更
とここまでなら、まぁ1.3.が既に面倒ですが、まだ、理解できます。しかし
4. 引数の設定が全部なくなるので、再度設定する。
これが、手間なんです。
特に引数が多ければ多いほどすごく手間
で、ユーザライブラリを呼び出している箇所が多ければ多いほどこれが大変。
ユーザライブラリになっているので、なんども行う処理である可能性も高いのですよね。
仮に引数が５個、呼び出し箇所が５箇所だとすると２５項目の設定が必要なんです。

で、提案
ユーザライブラリのサブルーチンを呼びだす為だけのサブルーチンを用意する。
こうすれば、サブルーチンを呼びだすためのサブルーチンだけ修正すればいいので、５項目の設定ですみます。

ただ、これにももちろんデメリットはあります。
ユーザライブラリの引数が増えて、大元からもその引数を使いた場合には余計に手間がかかるんですよねぇ

既存のシナリオなんで、そんなことは少ないと信じたいです。
(増えた引数に対してはサブルーチンを呼びだすためのサブルーチンで規定値を設定すれば良いだけだと良いですね。)