OmniAICreator/Qiita-1.07M huggingface dataset:
Redux/Mobxを使ったときのTypeScriptの型エラーの解決策

## 問題

React/TypeScriptでreduxやmobxを使用した場合、コンポーネントのプロパティに関する型エラーが出ることがあります。例えば、以下のように`mobx`で`Provider`を用いて暗に`messageStore`を注入したとします。

```jsx
import { observable } from "mobx";
import { inject, observer, Provider } from "mobx-react";
import * as React from "react";
import * as ReactDOM from "react-dom";

class MessageStore {
    @observable public message: string = "";
}

@inject("messageStore")
@observer
class App extends React.Component<{ messageStore: MessageStore }> {
    public render() {
        return <div>{this.props.messageStore.message}</div>;
    }
}

const messageStore = new MessageStore();

ReactDOM.render(
    <Provider messageStore={messageStore}><App /></Provider>,
    document.getElementById("root"));
```

上記のコードをコンパイルしようとすると以下のエラーが出ます。

```
Type '{}' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<App> & Readonly<{ children?: ReactNode; }> & Reado...'.
  Type '{}' is not assignable to type 'Readonly<{ messageStore: MessageStore; }>'.
    Property 'messageStore' is missing in type '{}'.
```

これは`<App />`でコンポーネントを使用するときに`messageStore`のプロパティが渡されていないために起こります。しかし、実際には`Provider`によって暗に渡されているためこのコードは正しく動作します。問題はmobxの`inject`デコレータが元のクラス型を上手く加工してくれないことです。因みに、reduxの`connect`関数の使用時にも似たような問題が起こります。

## 解決策

`React.Component`の型引数に`any`を渡したくなりますが、もう少しいい方法があります。`messageStore`をオプショナルにします。この場合でも、いちいち`messageStore`がプロパティに存在するか確認しなくても`this.props.messageStore`で使用できます。

```typescript
class App extends React.Component<{ messageStore?: MessageStore }> {
    ...
}
```

`Partial`型を使うとstoreが複数ある場合に便利です。

```typescript
interface IStore { 
    messageStore: MessageStore;
    anotherStore: AnotherStore;
}

class App extends React.Component<Partial<IStore>> {
    ...
}
```
[Xcode10][Mojave] CreateMLを試す方法

## はじめに

この記事は「CreateMLはどういうふうに使えるか」というよりは、「CreateMLはどうすればimport、実行できるか」というところに焦点を当てた記事です。個人的に嵌ったので書いておきます。

CreateMLでの学習の仕方などはAppleの公式ドキュメントなどを確認してください。

## 必要な環境

現在Beta版のCreateMLですが、これには以下の環境が必要です。

- macOS 10.14以上（2018/06/07現在であればMojave Betaのみ）
- Xcode10以上（2018/06/07現在であればXcode10 Betaのみ）

## 具体的にどうするか

CreateMLを利用できるのはかなり限られた環境です。
~~具体的にはPlaygroundを**macOS向け、SingleView**で作成したときのみ扱えます（iOSやmacOSでもBlankなどを選ぶとMojaveでもimportできないと怒られます...なんでこんな仕様なのかは知りません汗 もしかしたら今後のアップデートで治るかも）~~
どうやらただ安定してないだけらしく、できたり出来なかったりということっぽいです汗

ちなみに実は`import CreateML`やツール群の補完機能は**macOS 10.13以下でも使えます**。
実行してみた時にこのmacOSでは対応していないよとエラーを吐かれるだけなので、もし不安な人はMojaveにしていないメイン機上のXcode10 Betaでとりあえずコードだけ書いて、それをMojaveを入れたMacにうつして実行してみるなんてフローも可能かなと感じました。

## まとめ

以上個人的にはまったCreateMLの利用方法について簡単ですがまとめてみました。
今、`MLBoostedTreeRegressor`などを利用して完全オリジナルなモデル構築ができないかという点にチャレンジしようとしているのでそちらもでき次第まとめたいと思います。

## 参考

https://forums.developer.apple.com/thread/103751
OracleDB フラッシュバック機能

フラッシュバック機能は名前が似た機能が多いので自分で理解するためのまとめ。リカバリの機能はGold試験にも出るので詳しく。
間違ってたら指摘ください。
##機能一覧
|カテゴリ|英語名                     |日本語名称|機能概要|
|:-------|:--------------------------|:------------------------|:------------|
|リカバリ|Flashback Database         |フラッシュバックデータベース|DB全体を過去の時点に戻す|
|〃      |Flashback Table            |フラッシュバックテーブル   |表のデータを過去の時点に戻す|
|〃      |Flashback Drop             |フラッシュバックドロップ   |削除した表を元に戻す|
|開発機能|Flashback Query            |フラッシュバック問い合わせ  |指定時点のデータを表示(select ... as of [timestamp｜scn])|
|〃      |Flashback Version Query    |行履歴フラッシュバック     |指定された2点間での全ての変更データを表示|
|〃      |Flashback Transaction Query|トランザクション履歴フラッシュバック|トランザクションの変更を戻すためのSQL文を表示|
|〃      |Flashback Transaction      |フラッシュバックトランザクション|DBMS_FLASHBACK.TRANSACTION_BACKOUTプロシージャを使いトランザクションのロールバックを実行|
|〃      |Flashback Data Archive     |フラッシュバックデータアーカイブ|表に対するすべてのトランザクションによる変更を追跡および格納|

##リカバリ(マニュアルでは「データベース管理機能」）
###フラッシュバックデータベース
+ FRA領域にフラッシュバックログが作成される(更新量x時間に応じて空きが必要)
+ 必要な設定
    + FRA領域の構成(DB_RECOVERY_FILE_DEST、DB_RECOVERY_FILE_DEST_SIZEを指定)
    + アーカイブログモード
    + 巻き戻し可能時間の設定(ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=最大巻き戻し可能分);
    + 機能有効化(ALTER DATABASE FLASHBACK ON;)
+ 巻き戻しコマンド例
    + FLASHBACK DATABASE TO 時間等;

###フラッシュバックテーブル
+ UNDOを利用して巻き戻すため、保証時間を超えると巻き戻せない場合あり
+ 表の構造を変更するDDL操作が行われた場合は、巻き戻せない
+ TRUNCATE TABLEで削除された場合は巻き戻せない
+ 必要な設定
    + 戻せる表の行移動が有効(デフォルト無効。ALTER TABLE 表 ENABLE ROW MOVEMENT;)
        + 注：行移動が有効な表はROWIDを処理に利用しないこと。
    + 実行ユーザが表のOWNERかFLASHBACK ANY TABLE権限を持つ
+ 推奨設定
    + UNDO管理モードが自動(11g～デフォルト自動。ALTER SYSTEM SET UNDO_MANGEMENT=AUTO;)
    + UNDO保証秒(=巻き戻し保証秒)を変更(デフォルト900秒。ALTER SYSTEM SET UNDO_RETENTION=保証秒;)
+ 巻き戻しコマンド例
    + FLASHBACK TABLE テーブル TO 時間等;

###フラッシュバックドロップ
+ SYSTEM表領域内の表は対象外
+ DROP TABLE 表 PURGE; とした場合はごみ箱に入らないため復元不可
+ 必要な設定
    + ごみ箱が有効(デフォルト有効。ALTER SESSION SET recyclebin = ON;DB再起動)
    + PURGE RECYCLEBIN;でごみ箱が空になる
+ ごみ箱の表示
    + SELECT OBJECT_NAME,ORIGINAL_NAME,DROPTIME FROM USER_RECYCLEBIN ORDER BY DROPTIME DESC;
+ ごみ箱から戻す例
    + FLASHBACK TABLE ごみ箱内の名前 TO BEFOR DROP [RENAME TO 新表];

##開発機能(マニュアルでは「アプリケーション開発機能」)
テスト等で確認のために使うための機能。詳細は下記参照先

##参照
  https://docs.oracle.com/cd/E49329_01/appdev.121/b71295/adfns_flashback.htm
Static binaries on OSX with syscall on Crystal

Static binaries on OSX is a hard issue, but Go achieved by using syscall directly.

There is syscall package on Crystal too. Basic code is as following.

```ruby
...
str = "Hello, World!\n"
syscall(WRITE, 1_u64, str.to_unsafe, str.size.to_u64)
syscall(EXIT)
```

```
% objdump -d hello

hello:  file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:
__text:
    1f60:       48 89 35 99 00 00 00    movq    %rsi, 153(%rip)
    1f67:       c3      retq
    1f68:       0f 1f 84 00 00 00 00 00         nopl    (%rax,%rax)
    1f70:       55      pushq   %rbp
    1f71:       48 89 e5        movq    %rsp, %rbp
    1f74:       48 8d 35 31 00 00 00    leaq    49(%rip), %rsi
    1f7b:       b8 04 00 00 02  movl    $33554436, %eax
    1f80:       bf 01 00 00 00  movl    $1, %edi
    1f85:       ba 0e 00 00 00  movl    $14, %edx
    1f8a:       0f 05   syscall
    1f8c:       b8 01 00 00 02  movl    $33554433, %eax
    1f91:       0f 05   syscall
    1f93:       31 c0   xorl    %eax, %eax
    1f95:       5d      popq    %rbp
    1f96:       c3      retq

```

```
% ./hello
Hello, World!
```

```
% otool -L hello  
hello:
% 
```
Dockerのzombieプロセスで困ったら

# 1コンテナに1プロセス
Dockerは1コンテナに1プロセスが基本です。
そのためコマンドで起動したプロセスから別プロセスを起動しない方がよいのは前提です。

# Dockerのzombieのメカニズム
こちらに詳しいです。
http://blog.kechako.com/entry/2015/05/27/210459
initプロセスに相当するものが要因と理解しました。

# Dockerのinit
こちらのコメントに良い情報がありました。
https://qiita.com/mumoshu/items/064cd93ce116d8e04169#comment-b530f8d6fbce1ed62d9f

# Docker --initオプション
docker-composeの場合は2.2以降で

```
init: true
```
で設定できます。
3系では未対応のようです。

# ps -ef
--initオプションを設定すると

```shell
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:02 ?        00:00:00 /dev/init -- bash -c xxxxxx
```
/dev/init でコマンドが実行されて、
コマンドで起動したプロセスのサブプロセスを回収してくれます。
Composer packageを開発する時に知っておくとよい事

# この記事で分かる事
表題の通りです。

# 記事の作成方針

既にネット上には良質な情報がたくさん上がっていますので、積極的に他記事へのリンクを貼っています。

この記事で新たに分かる事はあまりないと思いますが、体系的にまとまっている記事が少なかったので、この記事が他の良質な情報へのindex的な役割を果たすと良いと思っています。

この記事の公開後、有益な情報を見つけた場合はこの記事に追記を行っていきます。

# 開発〜公開までの流れ

[自作ライブラリをComposer化＆Packagistの登録方法](http://vdeep.net/composer-packagist) という記事が非常に参考になりました。

公開までの流れはこの記事を読んでもらえればほぼ理解出来るかと思います。

また記事の中で GitHubにtagをpushすると [Packagist](https://packagist.org/) 側で自動更新する方法が記載されているので設定しておくと非常に便利です。

# 継続的インテグレーション

以下のサービスを利用します。

- [Travis CI](https://travis-ci.org)（CIツール）
- [Coveralls](https://coveralls.io)（カバレッジを計測）

`.travis.yml` の書き方に関しては [Building a PHP project](https://docs.travis-ci.com/user/languages/php) を見れば大体は理解出来ます。

カバレッジを集計する為には [Coveralls](https://coveralls.io) を利用するのですが、その際に [php-coveralls](https://github.com/php-coveralls/php-coveralls) を利用すると便利です。

[私が公開しているpackage php-json-logger](https://github.com/nekonomokochan/php-json-logger) にも設定が記載されているので参考になれば幸いです。

またテストを通過していないPRがマージされる事を防ぐ為にも、テストを通過していないPRはマージ出来ないように設定しておく事をオススメします。

（参考）[GitHub のブランチ保護を使用してリスキーなマージを防止する](https://qiita.com/yo1000/items/8ffe225716ba3b064697)

# READMEにBadgeを貼る

[Packagist](https://packagist.org/) へ公開後であれば下記のサービスでBadgeを色々入手出来ます。

https://poser.pugx.org/

必要な物を選択しREADMEに追記しましょう。

# 実際に公開したpackage
- [nekonomokochan/php-json-logger](https://packagist.org/packages/nekonomokochan/php-json-logger)
npm packageを開発する時に知っておくとよい事

# この記事で分かる事

表題の通りです。

# 記事の作成方針

既にネット上には良質な情報がたくさん上がっていますので、積極的に他記事へのリンクを貼っています。

この記事で新たに分かる事はあまりないと思いますが、体系的にまとまっている記事が少なかったので、この記事が他の良質な情報へのindex的な役割を果たすと良いと思っています。

この記事の公開後、有益な情報を見つけた場合はこの記事に追記を行っていきます。

# 開発〜公開までの流れ

[初めてのnpm パッケージ公開](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2) という記事が非常によくまとまっていて良いと思います。

ここを見れば基本的なコードの書き方や公開の流れは掴めると思います。

私は最近ではTypeScriptでのコーディングがメインになっているので公開したpackageはTypeScriptでも利用出来るようにしたいので、npm package自体もTypeScriptで開発しています。

その際は下記の記事も参考になります。

- [TypeScriptで書いたcliのnpm packageをリリースする方法](http://selmertsx.hatenablog.com/entry/2018/01/11/200217)
- [TypeScriptでnpmパッケージを記述する(最小構成）](https://qiita.com/kohashi/items/736bfb4a6db5bed2ad73)

## `npm` や `package.json` の仕様を把握する

多少間違った記述があっても動作しますが、packageを公開するのであれば `npm` 自体の仕様や`package.json` の書き方をある程度知っておく必要があります。

公式サイトを見るのが最も確実です。

- [公式サイト](https://docs.npmjs.com/getting-started/what-is-npm)

`package.json` の書き方に関しては日本語翻訳版もあります。

- [公式の日本語翻訳](http://liberty-technology.biz/PublicItems/npm/package.json.html)

## Scoped Packagesについて

[公式ドキュメント](https://docs.npmjs.com/getting-started/scoped-packages) にも記載がありますが、基本的にpackage名が被ると公開出来ないので、Scoped Packages（package名にユーザー名が含まれる手法）を使う事をオススメします。

一点注意点があります。

Scoped Packagesはpublicなpackageでないと利用出来ない点です。（課金すればprivateでも利用可能）

その為、package公開時には `npm publish --access=public` を明示的に実行する必要があります。

## ローカルでの動作確認について

手前味噌ですが [自作したnpm packageをローカルでテストする方法](https://qiita.com/keitakn/items/7114b47cfd9429cfe474) という記事を書きました。

この記事にも書いてるのですが、基本的には `npm link` を使うのが最も簡単です。

# 継続的インテグレーション

バグの発生確率を少しでも減らす為にもCIツールによる継続的インテグレーションを設定しておく事をオススメします。

個人的にはOSSであれば無料で利用出来る [Travis CI](https://travis-ci.org) の利用をオススメします。

（参考）[GitHubと連携できる継続的インテグレーションツール「Travis CI」入門](https://knowledge.sakura.ad.jp/3754/)

またカバレッジ結果の集計も行いたいので [Coveralls](https://coveralls.io) も利用すると良いでしょう。

以下の記事が参考になります。

- [npm ライブラリを travis-ci でテストして Coveralls でカバレッジを計測する](https://qiita.com/star__hoshi/items/321007bf967e148c7ea6)

またテストを通過していないPRがマージされる事を防ぐ為にも、テストを通過していないPRはマージ出来ないように設定しておく事をオススメします。

（参考）[GitHub のブランチ保護を使用してリスキーなマージを防止する](https://qiita.com/yo1000/items/8ffe225716ba3b064697)

# READMEにBadgeを貼る

OSSのライブラリ等でよく見る下記のようなBadgeです。

<img width="558" alt="Badge.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/b3fb0d66-40ca-529e-e22b-8c442b4a9821.png">

最低でもpackage version、build、coverage、Licenseくらいは貼っておくと良いでしょう。

[Travis CI](https://travis-ci.org) と [Coveralls](https://coveralls.io) を設定すれば build、coverage のBadgeは生成出来ます。

- https://badge.fury.io/
- [npm ライブラリの README にバッジをたくさんつける](https://starhoshi.hatenablog.com/entry/2018/02/12/021614)

# 実際に公開したpackage
- [@nekonomokochan/aws-lambda-node-logger](https://www.npmjs.com/package/@nekonomokochan/aws-lambda-node-logger)
受け取った日時文字列が許容時間の範囲内かどうかをチェックする

#やりたいこと
クライアントから日時が文字列で渡されてくる。
ただし秒数の指定はない。

サーバと時刻がずれているかどうかをチェックしたい。
ただし、設定で指定した分数だけ許容分を設ける。

#前提条件
- 渡されてくる文字列のフォーマットは「yyyyMMddHHmm」とする
- 文字列が所定のフォーマットに当てはまらない場合はNGを返す
- 秒数考慮はせず、分までの値が一致していればOKとする
  - 例えば、10時15分(1015)が渡ってきて、許容分数が2であれば、10:13:00.000～10:17:99.999までの期間はOKとする
- 許容分設定が0の場合もある

#やってみよう


```C#
private bool isValid(string clientTime, long permitMinutes)
{
    // 日付パースできなければNG
    DateTime inputTime;
    if (!DateTime.TryParseExact(clientTime,"yyyyMMddHHmm", 
        System.Globalization.CultureInfo.InvariantCulture, 
        System.Globalization.DateTimeStyles.None,
        out inputTime))
    {
        return false;
    }

    // 現在日付 > 渡された日付の場合
    var now = DateTime.Now;
    if (now.Subtract(inputTime).Minutes > permitMinutes) { return false; }

    // 現在日付 < 渡された日付の場合
    var inputTimeMax = inputTime.AddSeconds(59).AddMilliseconds(999);
    if (inputTimeMax.Subtract(now).Minutes > permitMinutes) { return false; }

    return true;
}
```

現在日付 < 渡された日付の場合　に、59.999秒の猶予範囲を考慮してやらないと、現在時刻の秒数が減算されて1少ない数で判定されてしまう。

単純に差分の絶対値で判定するとうまくいかない。

#雑記
初めてQiitaに書いてみましたが、エディタの書きやすさに感動しています。
当たり前のような内容でも公開するとなると色々調べることになり、勉強になりますね。

# _6/8追記_
上記判定だとミリ秒未満の考慮ができていない。
より直観的な判定処理をコメントいただきましたのでそちらもご参照ください。
libreoffice zip での操作

Libreoffice Base のバグ修正のために、libreoffice base のＸＭＬを直接編集したときのメモです。

Database 接続のときに、パスワード不要のオプションがあるのですが、一度必要にすると、不要になりません。

そこで、アーカイブを展開し、content.xml の required-password を false にして保存して、また、zip で保存します。保存するときは、content.xmlが、ディレクトリ直下にあるようにつくります。フォルダの中にいれて、zip にするとフォルダ以下になってしまうので、libreoffice からあけることができなくなります。
【コマンドプロンプト】日時文字列をYYYYMMDD_hhmmss形式で取得する

```sh
>set TIME2=%TIME: =0% & set datetimestr=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME2:~0,2%%TIME2:~3,2%%TIME2:~6,2%

>echo %datetimestr%
20180607_093010
```

あとは`%datetimestr%`を煮るなり焼くなり好きにしてくだされ。

参考：[Windowsのバッチファイル中で日付をファイル名に使用する (1/2)：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html)
【Laravel】モデルファクトリをつかってテスト用データを一度にたくさん生成する

Laravelのシーダーでテスト用のデータを作成するときに、それっぽいテスト用データを自動的に生成してくれるモデルファクトリが利用できます。
これで「ああああ太郎」とか「テストテストテストテストテスト」だらけのテストデータとおさらばできます。

# 前提
例えば `topics`　というテーブルがあるとします。
構造はこんな感じ

**テーブル名：　topics**

| フィールド | 中身
|:---|:---
| title | 記事のタイトル
| content | 記事の内容

的なテーブルがあるとします。
Eloquent（モデル）: `Topic` まで作成済みの前提。

# シーダーの作成

```
$ php artisan make:seeder TopicsTableSeeder
```
database/seeds/TopicsTableSeeder.php
が作成されます

とりあえず、シーダーファイルはそのままにして、ファクトリをつくります。


# モデルファクトリを作成

```
$ php artisan make:factory TopicFactory --model=Topic
```
database/factories/TopicFactory.php
が作成されます

ファクトリを記述

```php:database/factories/TopicFactory.php
use Faker\Generator as Faker;

$factory->define(App\Topic::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence(rand(1,4)), // 1〜4つの単語で文章
        'content' => $faker->realText(512), // 512文字の文章
    ];
});
```
titleには、1〜4の単語でできた文章
contentには、512文字のテキスト
と定義します。

## Fakerについて

この定義内容は何かと言うと
[Faker](https://github.com/fzaninotto/Faker)
というテスト用データを作成してくれるPHPライブラリの機能になります。

詳しくは
https://github.com/fzaninotto/Faker
こちらにあります。

よく使いそうなのは

```php

$faker->word() // 単語
$faker->sentence(n) //単語数指定した文章
$faker->text($max) //$max文字数までの文章
$faker->name() //名前 （日本語）
$faker->realText() //文字数指定した文章　デフォルトは200（日本語）
$faker->phoneNumber() //電話番号（日本語）
$faker->address() //住所（日本語）
$fake->company() //会社名（日本語）
```

などなど、

## 日本語対応

Fakerは、そのままだと英語っぽい単語などがでてきちゃいますが、設定により日本語対応可能です。
config/app.phpに追記

```php:config/app.php
'faker_locale' => env('APP_FAKER_LOCALE', 'ja_JP'),
```
.envに追記することで、環境ごとにわけたりもできます。

```.env
APP_FAKER_LOCALE=ja_JP
```

全部が日本語対応しているわけじゃないですが、上記で紹介した（日本語）と書いてある項目は対応していました。


# シーダーの実行

というわけであとはシーダーの実行です。

```php:database/seeds/TopicsTableSeeder.php
public function run()
{
    factory(App\Topic::class, 20)->create(); // 20件のデータを作成
}
```
20のところを変えれば何件でも作成可能です。

## 実行
```
$ php artisan db:seed --class=TopicsTableSeeder
```

以上で、簡単に大量のテスト用データを作成することができました。

名前とか、ほんとにそれっぽいのを生成してくれるので、手間が省略されて作業が捗ります。

関係ないけど、Seederってシーダーなのかシーダなのか迷いますね。

# 参考
https://readouble.com/laravel/5.5/ja/seeding.html
https://github.com/fzaninotto/Faker
https://qiita.com/kazuhei/items/5d33eedb9ebdd62e0bfb
Hyper-VにさくっとCoreOSをインストールする

# 概要

Windows 10 proのHyper-VにCoreOSをインストールする手順です
CoreOSの勉強を始めたい方にはすぐに構築できる環境になります

# 事前準備

「アプリと機能」でHyper-Vを有効化しましょう！

# 手順

1. [CoreOS公式サイトからISO](https://coreos.com/os/docs/latest/booting-with-iso.html)をダウンロード
2. Hyper-Vマネージャーで「仮想スイッチマネージャ」-「新しい仮想ネットワークスイッチ」-「外部」を作成  
![switch-manager.png](https://qiita-image-store.s3.amazonaws.com/0/30522/0969f8a4-fa2f-17ce-e6e5-e7195c2f56cd.png)
![new-switch.png](https://qiita-image-store.s3.amazonaws.com/0/30522/4ba0ec33-d883-4942-d258-e0adb5abde72.png)
3. 「外部ネットワーク」で外部と通信できるNICを選択(**すでに選択済みのNICはエラーになります**)  
![config-switch.png](https://qiita-image-store.s3.amazonaws.com/0/30522/56b99822-20af-0569-d2b4-8a8feede9f46.png)  
4. 新規仮想マシンを作成  
![new-machine-1.png](https://qiita-image-store.s3.amazonaws.com/0/30522/230af911-6cfc-1ba4-68e6-0bf8307d6b35.png)
5. 仮想マシンの世代選択（**第2世代はサポートされていない**）  
![new-machine-2.png](https://qiita-image-store.s3.amazonaws.com/0/30522/ac4dba8b-c1ac-545b-ccb2-6fe16388801a.png)
6. メモリの割り当て（**最少2GB**）  
![new-machine-3.png](https://qiita-image-store.s3.amazonaws.com/0/30522/b9c71132-7c75-402a-5940-d6af83629c15.png)
7. ネットワークの構成（**前述で作成した外部ネットワークスイッチを選択**）
![new-machine-4.png](https://qiita-image-store.s3.amazonaws.com/0/30522/c9a792bb-9470-d224-a8f1-b8e464718c5f.png)
8. 仮想ハードディスクの接続（適宜に変更）
9. インストールオプション（前述でダウンロードしたISOファイルを選択）
![new-machine-5.png](https://qiita-image-store.s3.amazonaws.com/0/30522/6dcf19ec-b813-0793-fd0f-e5b6ffbaedda.png)
10. 仮想マシンの設定が完了し、起動してください  
    ※ライブCDとして起動している？ため、この時点でローカルディスクにCoreOSがインストールされているわけではない
11. 仮想マシン起動後、sshログイン用に(core)ユーザパスワードを設定します（勉強用なのでとりあえずパスワードログイン）

    ```
    > sudo passwd core
    ```
※Hyper-Vマネージャーのコンソール画面は使いづらいので、TeraTermなどのターミナルでログインすると楽です
12. ユーザパスワードのハッシュ値を取得
    前述で設定したパスワードを再入力するとハッシュ値が表示されるので、それを控えてください

    ```
    > openssl passwd -1
      Password:
      Verifying - Password:
      $1xxxxxxxxxxxxxxxxxxxxx
    ```
13. cloud-config.ymlを作成
cloud-configはインスタンスの初期構成定義ファイルである
    - 先頭行の**#cloud-config**は必須
    - passwdには前述のパスワードハッシュ値を記載
    - write_filesはファイルに書き込みを行ってくれます

    ```yaml:cloud-config.yml
    
    #cloud-config
    hostname: "coreos"

    coreos:
      units:
        - name: etcd.service
          command: start

    users:
      - name: core
        passwd: $1xxxxxxxxxxxxxxxxxxxxxxx

    write_files:
      - path: /etc/resolv.conf
        content: |
            nameserver 8.8.8.8
    ```
    - 各種設定値は[こちら](https://github.com/coreos/coreos-cloudinit/blob/master/Documentation/cloud-config.md#coreos-parameters)を参照ください
    - [各種サンプル](http://cloudinit.readthedocs.io/en/latest/topics/examples.html)

14. ローカルディスクにCoreOSをインストール（[インストールオプション](https://coreos.com/os/docs/latest/installing-to-disk.html)）

    ```
    > sudo coreos-install -d /dev/sda -V current -c ./cloud-config.yml
    ```
15. インストール完了後、仮想マシンを一度シャットダウンし、ISOのマウントを解除して、仮想マシンを再起動してください
16. 問題なく起動でき、ログインができる場合は成功です！Dockerコマンドが使えるので、思う存分に使ってください
utf-8 の encode / decode

# decode
```c
int decode() {
  const unsigned char mask[4] = {0x7f, 0x1f, 0x0f, 0x07};
  unsigned char c = 0;
  scanf("%c", &c);
  int type = 0;
  for (; type < 4 && c >= 0xff - mask[type]; type++) ;
  int result = (c & mask[type]) << type * 6;
  for (int i = 1; i <= type; i++) {
    scanf("%c", &c);
    result += (c & 0x3f) << (6 * (type - i));
  }
  return result;
}
```

# encode
```c
void encode(int x) {
  unsigned char str[6] = {};
  if (x < 0x80) str[0] = x;
  else {
    int n = 3;
    char mask1 = 0xfd, mask2 = 0x01;
    if (x < 0x800) {
      n = 1; mask1 = 0xd0; mask2 = 0x1f;
    } else if (x < 0x10000) {
      n = 2; mask1 = 0xe0; mask2 = 0x0f;
    } 
    str[0] = mask1 | ((x >> (6 * n)) & mask2);
    for (int i = 1; i <= n; i++) 
      str[i] = 0x80 | ((x >> 6 * (n - i)) & 0x3f);    
  }
  printf("%s", str);
}
```
意外とwikipedia( https://ja.wikipedia.org/wiki/UTF-8 ) がわかりやすくて便利だった
AngularでGuardの導入

## Guardについて

Routerでページ遷移前にログインされたユーザーなのかのチェックを行いたい時になどに使います。


## 生成コマンド

AuthGuardという名前で生成します。

```
$ ng g guard guard/auth
```


src/app/guard/auth.guard.ts が生成されます。
いつも通り、app.module.tsのprovidersに追加します。


## ログインチェック

認証系処理などが書いてあるAuthServiceがあるとします。
そこにログインしているかどうかのチェックする処理を書きます。
今回はトークンベースの認証の場合として、LocalStorageにあるトークンがあるかどうかでチェックします。
（本当はトークンの有効期限があるかのチェックも必要かも）

```ts
@Injectable()
export class AuthService {
  .
  .
  .
  
  isAuthenticated(): boolean {
    const token = localStorage.getItem('token');
    return token != null;
  }
}
```

## AuthGuardの処理

```ts
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthService } from '../services/auth.service';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(
    private authService: AuthService,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    if (!this.authService.isAuthenticated()) {
      this.router.navigate(['login']);
      return false;
    }
    return true;
  }
}

```

Routeの設定ファイルに処理を挟みたいパスに対してAuthGuardを追加します。

```ts
import { AuthGuard } from './guard/auth.guard';

const routes: Routes = [
  { path: '', component: HomeComponent, canActivate: [AuthGuard] },
  { path: 'login', component: LoginComponent }
];
```

これで完成です。
Docker Toolbox をProxy環境下で利用する。


Virtual Boxを利用している既存の環境と共存するため、「Docker for Windows」を利用せず、「Docker Toolbox」を利用することにしましたが、
Proxy環境可だと結構苦戦したので、メモしておきます。

## 環境
Windows10
Docker toolbox

## 既存のdocker-machineを削除する

```
$ docker-machine rm -f default
About to remove default
WARNING: This action will delete both local reference and remote instance.
Successfully removed default
``` 

## Windowsで以下になるように環境変数を設定する。

```
HTTP_PROXY=http://{proxy-server}:{port}/
HTTPS_PROXY=http://{proxy-server}:{port}/
```
proxy-serverとportは環境に合わせて適宜設定してください。

## 実行
Docker- Quickstart Terminalを実行してみましょう。

```bash
Running pre-create checks...
```

のようなメッセージがでて自動的に再設定してくれる模様です。

```bash
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.102
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell
```

はい。無事いつもの画面が表示されました。

## 確認
で、Hello world

```bash
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
```

はい。無事完了しました。
ApacheのSSL設定をする

ローカル向けに自己証明書で設定する。
たまにやる時に忘れてるのでメモ

## SSLモジュールのインストール

```
sudo yum install mod_ssl
```

2.4系で上記で入らない場合は下記

```
sudo yum install mod24_ssl
```

## 自己証明書の作成と配置

```
$ openssl genrsa > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -req -signkey server.key < server.csr > server.crt
$ mkdir /etc/httpd/conf/ssl.key
$ mkdir /etc/httpd/conf/ssl.crt
$ mv server.key /etc/httpd/conf/ssl.key/
$ mv server.crt /etc/httpd/conf/ssl.crt/
```

## SSL設定の変更

```
vi /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
```

## Apache再起動

```
$ service httpd restart
```
カレンダー

既出多数だが、スキルアップのため作成。

date関数ではなく、「momentjs」を利用。
momentjsは、破壊的のため、「date-fns」に変更。
使用感、変化なし。

###メモ
今月の日付表示の空白を埋める、先月、次月の日付は、
「先読み日付」prefetchDateと命名。

###完了事項
2018/06/08
次月、前月への移動を可能にする。
空白の場所に、前次の月の日付を埋めるようにする。
2018/06/10
祝日を表示「みどりの日、憲法記念日など」（今年分まで）(mapにset次第で増減可)
・「12月へ移動時の来年の1月、1月へ移動時の去年の12月、そのような月の「祝日」もしっかり表示されるようにする。」
来年の1月、去年の12月の判定条件を追記し、完成。
まあ、祝日表示には、直接影響ないが、(1,12月は、先読み日付内に年数によって変わる祝日がないので)、予定機能の追加で使用する所になるね。
・過日の予定に付いては、薄い背景色で示している。（上記事項、解決次第、行う）
dateFns.isPastで対応

###todo
・予定を書き込めるようにする。（難しい）
・年単位の移動も可能にする。（デザイン変更の必要あり）
jsfiddle
http://jsfiddle.net/ghost7492/rLjQx/53944/
更新(2018/06/10)
http://jsfiddle.net/ghost7492/rLjQx/54037/

###感想
(2018/06/10)
積極的に関数で分けることを意識。小さくしたほうが、エラー時などの対応が早くなる気がした。
これからも、できるだけ小さくを心がけていこうと思いました。
変数名に関して、数字の時は、語尾にnumをつけようと思いました。長くなっても、見分けがつけやすいと感じました。
後は、「すぐ書く」より「すぐ読めることの方が大切」。1日経ってみると、その大事さを改めて理解。
AWS Certified Security - Specialtyを受けてきた 

AWS Certified Security - Specialtyを受けてきました。
取得を考えている方の参考になれば幸いです。

# 試験概要
https://aws.amazon.com/jp/certification/certified-security-specialty/

- 時間：170分
- 問題数：65問[^1]

[^1]: 試験ガイドに記載が無いので、問題数は変わるかもしれません

# 事前準備
- サンプル問題を解く
    - [サンプル問題](https://d1.awsstatic.com/training-and-certification/docs-security-spec/AWS_Certified_SC-S_Sample%20Questions_v1.0_FINAL.pdf)
- AWSの無料オンライントレーニングを受講する
    - [AWS Security Fundamentals　自分のペースで進められる 3 時間のオンラインコース(英語)](https://aws.amazon.com/jp/training/course-descriptions/security-fundamentals/)

# 結果
幸い合格でした。
5 営業日以内に、スコアレポートがダウンロードできるようになります。

受験者スコア: 833
>The AWS Certified Security - Specialty (SCS-C01)の試験結果は、100から1000
>の間の値で示されます。合格に必要な最低スコアは750です。

# 受験者のスペック
参考になるかわかりませんが。。。

- AWS歴：4年
- クラウド関連の保有資格
    - AWS: アソシエイト×３＋プロフェッショナル×２＋Big Data
    - Azure: MCSA Cloud Platform(532+533)
    - IBM: IBM Certified Application Developer - Cloud Platform v1
    - GCP: クラウドアーキテクト＋データエンジニア
- 外観：メガネぼーず

# 難易度について
主観になりますが、難易度は下のような感じです。
　アソシエイト系　＜　Security = Big Data　＜　プロフェッショナル系

# 感想
80問あると思って時間配分していたので、時間はかなり余りました。
1問1問丁寧に解いていっても、十分時間は余ると思います。
AtCoder Beginner Contest 096 解説備忘録

#前書き
AtCoder Beginner Contest 096 を解いてみた．解けなかった問題の備忘録．

#C問題
[[問題はこちら]](https://abc096.contest.atcoder.jp/tasks/abc096_c)

・`vector<int> dx{1,-1,0,0};`，`vector<int> dy{0,0,1,-1};`でfor文を回せばまだ速かったかも．

#D問題
[[問題はこちら]](https://abc096.contest.atcoder.jp/tasks/abc096_d)

・一の位が1である素数を取り出せば良い，そうすればどの5つを取っても，その和の一の位は絶対5になるため，合成数(5の倍数)となる(気づかん)．

以下ACのコード：

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

bool IsPrime(int num)
{
    if (num < 2) return false;
    else if (num == 2) return true;
    else if (num % 2 == 0) return false; // 偶数はあらかじめ除く
    
    double sqrtNum = sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {// 素数ではない
            return false;
        }
    }
    // 素数である
    return true;
}

int main() {
    
    int n;
    cin >> n;
    
    vector<int> ans(n,0);
    int i=1,j=0;
    while(ans[n-1]==0){
        int a;
        a = 1 + 10*i;
        if(IsPrime(a)){
            ans[j] = a;
            j++;
        }
        i++;
    }
    
    FOR(i, 0, n){
        cout << ans[i] << endl;
    }
    
    return 0;
}

```

# あとがき
比較的簡単な回だった...？
精進します．
Raspberry PiをポートフォワーディングでLAN外から操作する

#ポートフォワーディング -Rオプション

##やりたいこと
　ポートフォワーディングでトンネルを掘り、
　お家の外（LAN外）からでもRaspberry Piにアクセスできるようにする。
　例：LAN外pc　→　（サーバー）　→　Raspberry Pi

##環境
 - このはのVPS
  - Centos 7.5
  - 公開鍵認証設定済み（秘密鍵はローカルにDLする）

 - Raspberry Pi 3 Bモデル

##Raspberry Piとサーバーの公開鍵認証の設定
　ラズパイ側で鍵を生成して、公開鍵をサーバーのauthenticated_keysにscpでコピーする
　（秘密鍵は、ローカルとラズパイで2種類生成されている。）

##サーバーで10022番ポートを開放する
```
$ vi /etc/ssh/sshd_config
```

```
#Port 22
Port 10022 ← 書き加える
```

```
$ systemctl restart sshd.service
```
**忘れずにsshdの再起動を行う。**

##ポートフォワーディングを行う
Raspberry Pi上で

```
 $ ssh (ユーザー@サーバーのIPアドレス) -R 10022:192.168.xx.xx(ラズパイのlocalIPアドレス):22 
```
**ユーザーはroot以外で行う。**
**Raspberry PiのローカルIPの前に、pi@など付けない。**

##LAN外pcからsshでサーバーのlocalhost 10022番ポートに接続する。
サーバーのターミナルで

```
$ ssh (ラズパイのユーザー)@localhost -p 10022 
```
すると、
(ラズパイのユーザー)@localhostのパスワードが求められるが、
ラズパイにそのユーザーで入るときのパスワードを入力すればよい。

最終的に、

```
 $ ssh (ラズパイのユーザー)@localhost -p 10022 
```
を入力したターミナルが、ラズパイのターミナルに繋がる。
Xcode 10でXCTestを並列実行する

## はじめに
Xcode 10のβ版が公開されたので早速触ってみました。
Xcode 10からXCTestを並列実行できるようになったようなので試してみました。

## 開発環境
環境は、以下の通りです。

|Category|Version|
|:-----:|:-----:|
|OS|10.13.5|
|Xcode|10.0 beta (10L176w)|

## Schemeの設定

Edit Scheme...を選択します。
![スクリーンショット 2018-06-07 4.13.58.png](https://qiita-image-store.s3.amazonaws.com/0/103695/b885531f-ed42-1702-a034-2b1df48dfec7.png)

Test > Info > 「Options...」を選択し、
「Execute in parallel on Simulator」にチェックをつけます。

![](https://qiita-image-store.s3.amazonaws.com/0/103695/1aa7c3e5-48bb-22d9-fdef-b4536b88bfd6.png)

## UITestを並列実行してみる。

UITestを並列実行してみました。
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/103695/737b0809-4363-56a1-a18e-3d3c486e7f47.gif)

## おまけ
Xcode 10からStoryboardの画面構成が変わっていました。
画面右上の「Library」からUIパーツを選択することができます。

![](https://qiita-image-store.s3.amazonaws.com/0/103695/aa4b9146-57cb-2eae-4fec-d9e2eacc42fd.png)

![](https://qiita-image-store.s3.amazonaws.com/0/103695/3662874a-cb13-32bc-ad05-aeef99d4f154.png)

![](https://qiita-image-store.s3.amazonaws.com/0/103695/9564fc6f-9d91-7b73-28be-d91c71aaa6fb.png)

## さいごに
XCTestを並列実行できるようになったおかげで従来よりUTの時間を短縮できそうですね。

Xcode 10は、他にも便利な機能が増えているので少しずつ触っていこうと思います。
毎日じゃないけど1週間に1度はリリースするGitのフロー

## はじめに
ぐるなびさんが１日ごとにリリースを行う場合はGitflowを使わないという記事を書いていたので、１週間に１度リリースをしている僕の会社のGitフローについて書いてみようと思います。
[「GitFlowは使わない！シンプルな「GitFeatureFlow」を紹介します」](http://developers.gnavi.co.jp/entry/GitFeatureFlow/koyama)

## 開発の流れ

図が汚くて申し訳ございません。
![PNGイメージ-8B62B4BBB6D7-1.png](https://qiita-image-store.s3.amazonaws.com/0/105394/2d0c8fa3-a76c-90e2-08b3-a8b81754b6ba.png)


* featureブランチはreleaseブランチから作ります。

* featureブランチで開発中のものはいつでもdevelopブランチにpushできます。

* featureブランチで開発を終えたらreleaseブランチにプルリクエストします。同時にdevelopブランチにもpushします。

* その週のリリース物が集まったらstagingにマージしてE2Eテストをします。

* 問題なければmasterにマージします。 

* developブランチはチームに一声かければいつでも削除して新しくreleaseブランチから作ります。



### 特徴

 * developのブランチの役割がGitflowやGitHubFlowなどとは異なります。  
 実験的な変更を試したり、フィードバックを貰うための環境を作ったり、プルリクエストで簡単な動作チェックなどをするためにdevelopブランチを使っています。
 * リリース物を集約するreleaseブランチが存在します。  
 GitLabFlowの考えに近いものですが、フローが複雑になるのが嫌なのでstableのリビジョンは省いてます。
 * pre-productionの位置付けのstagingが存在します。  
 E2Eテストを行います。品質確保の要です。

## 前提
僕の会社ではスクラム開発を行っていています。
原則、1スプリント1週間、1スプリント1リリースのサイクルです。

 - 水曜日：（午前）リリース、（午後）スプリントプランニング
 - 木曜日：スプリント
 - 金曜日：スプリント
 - 月曜日：スプリント
 - 火曜日：（午前）スプリントレビュー・レトロスペクティブ、（午後）リリース準備、自主学習

また、ソフトウェアが動く環境として下記の環境を用意しています。
 - 本番環境(Production)
 - ステージング環境(Staging)
 - 開発環境(Develop)

環境はすべて異なるサーバー、DB、ネットワーク構成で構築しています。
master/staging/developのブランチにプッシュすると、自動的にテストとデプロイが行われます。

## GitFeatureFlowとの比較

ぐるなびさんの表を元にうちのフローを評価してみました。

| 比較する項目 | GitFeatureFlow | うちのFlow |
|:----------|:----------:|:----------:|
| 複数案件対応| ◎ | ◎ | 
| 大規模開発向き| ◎ | ◎ | 
| 小規模開発向き| ◎ | ◎ | 
| シンプルなフロー| ○ | × | 
| リリース時期の調整| ◎ | △ | 
| リリース日の変更| ◎ | △ | 
| コンフリクト関連| △ | ○ | 

あれ？GitFeatureFlowより劣っている？🤔
うちの場合はリリース日が固定なので、あまりリリース時期を調整するとか変更するとかで悩んだ事なかったよね・・・。
例外として、緊急リリースしなければならない場合はHotfix的なブランチを作成してすぐにリリースしてしまいます。
代わりにうちは下記のようなものを重要項目としてしています。

| 比較する項目 | うちのFlow |
|:----------|:----------:|:----------:|
| 開発環境で思う存分実験できる | ◎ | 
| リリース計画に沿った開発物を集約できる | ◎ | 
| ステージング環境で品質を確保 | ◎ | 
| ステージングと同じものが本番で動いている安心感 | ◎ |

## おわりに
会社ごとにいろいろなGitの使い方があるんだと知りました。うちの会社に入ってきた人は、あまりのフローの複雑さに戸惑う人も多いので、もっと簡単にしたい気持ちもあったりします。
参考になればと思います。
「RStudioで始めるRプログラム入門」のメモ（１，２章）

[RStudioではじめるRプログラミング入門/Garrett Grolemund他]( https://www.amazon.co.jp/dp/4873117151/ref=cm_sw_r_tw_dp_U_x_q2-fBbTC95WX5)を読み始めました。詰まったところや、気になったところをメモしていきます。

次回：[「RStudioで始めるRプログラム入門」のメモ（3,4章）](https://qiita.com/ladder80/items/d527309081727ae4b29c)

#1章：基本中の基本
##Rは大文字と小文字を区別する
わかってればあたりまえのことかもしれない。
例えば2つのサイコロを転がすプログラムで

```r
die <- 1:6
sample(die, 2, TRUE)
```

と書けばエラーを吐かずに正しく実行できるが、TRUEを小文字で書く、つまり

```r
die <- 1:6
sample(die, 2, true)
```
と書くと

```:実行結果
 sample.int(length(x), size, replace, prob) でエラー: 
   オブジェクト 'true' がありません 
```
というエラーが返ってくる。

##その他細かいこと
・対話モードで入力中にESCを押せばその行に書いたスクリプトを全部消せる

・ペインとは
pain、枠や区画という意味
PC用語としては、ウィンドウの中にある区画のことを指すらしい。この本を読むまで知らなかった…（無知）

#2章：パッケージとヘルプページ
##ベクトルの生成
P29で数値のベクトルを生成するとき、c関数を用いて

```r
x <- c(-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1)
```
と書かれているが、ちょっとめんどくさいので、同じことができる関数を探したところ

```r
seq(a, b, by=c)
##aからbまでcの間隔でベクトルを生成
```
を用いれば良いことがわかった。つまり今回の場合は

```r
x <- seq(-1,1,by=0.2)
```

```:実行結果
> x
 [1] -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8  1.0
```
上記のようにできる。


##ベクトル（リスト）のプロット
ベクトル（pythonでいうところのリスト）をプロットするとき、対応する数を用意せずにプロットを実行しようとすると、Pythonの場合は、リストに収納されている要素の値と、値が何番目に入っているかという対応をプロットしていた。つまり以下のように

```python:test_plot.py
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5,6]

plt.plot(x)
plt.show()
```
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/259774/f50db8ef-dfd5-3436-54ad-9b9d94e21f39.png)
と表示される。

しかしRの場合はヒストグラムを返す。
つまり

```r
> library("ggplot2")
> x <- c(0, 1, 2, 3, 4, 5, 6)
> qplot(x)
```

![R_qplot.png](https://qiita-image-store.s3.amazonaws.com/0/259774/e51b91ad-3e08-f2c3-b967-cf6d8bb12884.png)

上記のようになる。これは少し新鮮だった。

###追記
どうやらプロットの方法は二種類あるらしい。教科書ではqplotを使っていたが、plotを使えば、以下のようにPythonと同じ挙動をする。

```r
> library("ggplot2")
> x <- c(0, 1, 2, 3, 4, 5, 6)
> plot(x)
```
![R_plot.png](https://qiita-image-store.s3.amazonaws.com/0/259774/46427c83-9757-9f67-9025-09ca18b931d8.png)


##”詐欺”には成功しているか？
何故か教科書は2個のサイコロの値の和で確率の偏りを評価しているが、もっと愚直にやってみた。
教科書のとおりに偏らせた6面サイコロを一1個振って、どの目がどれくらい出たか800000回の試行からヒストグラムを出す。これくらいやれば収束するはず。

```r
> roll <- function(){
+ die <- 1:6
+ dice <- sample(die, 1, TRUE, prob = c(1/8, 1/8, 1/8, 1/8, 1/8 ,3/8))
+ dice}
> y <- replicate(800000, roll())
> qplot(y)
```
![ikasama.png](https://qiita-image-store.s3.amazonaws.com/0/259774/fd884cce-fb97-a76f-0596-4e04e87bbaa2.png)

ちゃんと6の目が他の目より3倍出やすくなっている。これはちゃんと詐欺に使えそうだ。

##追記：Plotされたグラフ
グラフをプロットすると右下のペインに表示され、プロットを実行するたびにグラフが上書きされているように見えるが、実は全て一時的に保管されていて、ペインの右上にある"◀"と"▶"で前のグラフや次のグラフを見ることができる。箒のボタン（?）を押すと一時的に保管されているグラフがすべて消える。定期的にチェックしないと結構な容量になってしまいそう。

次回：[「RStudioで始めるRプログラム入門」のメモ（3,4章）](https://qiita.com/ladder80/items/d527309081727ae4b29c)
アンドロイドのスマホを許可する　Linux adb

# デバッキングモードを許可して、スマホとパソコンをつなげる
まずはスマホをデバッキングモードつまり開発者権限を与えて、それいがいにパソコンでも同様に開発者として許可させるように設定する必要ある。
これは解決しないと行けない問題だと思う

## adbをパソコンにインストールすればいいことがわかった。
以下のページを作成したので[こちら](https://qiita.com/sheenbanach/items/4237e82bbf563df237e0)を参照にしてください。
スマホをウェブカメラにしてみよう

#スマホをウェブカメラとして活用してみよう。
この企画はパソコンにカメラがついていない場合やまたは内蔵カメラの画質が低い場合の一つの対処方法である。すぐに候補があがるのはDroidcam だと思う。
この検索結果を得るためには次の英語表現がちょうどいいかと思います。
>how to turn your smartphone as a web camera in linux

ここで得られた検索結果を元にこちらの[サイト](http://ubuntuhandbook.org/index.php/2015/01/use-android-phone-as-wireless-webcam/)が見つかりました。


## Droidcamの使い方
ちょうどぜんぶのコードがかいてあったのでそれを共有します。

```
sudo apt-get install linux-headers-$(uname -r) build-essential

sudo add-apt-repository -y ppa:paolorotolo/droidcam

sudo apt-get update

sudo apt-get install droidcam
```

このコードにもあるようにppaを入れたらアップデートしておかないと反映されないはず　つまり

>cannot to be located 

が出る可能性がある。
それでRepositoryとppaのセットアップが終わったら、あとはインストールをしていくだけです。
しかし、これではうまく行きません。おそらく問題は１６．０４にあるはずです。
この問題を解決する可能性があるのは直接ダウンロードして、入れる方法でしょう。[こちら](http://ubuntuhandbook.org/index.php/2016/12/install-droidcam-ubuntu-16-04/)が参考になります。
##　まずはダウンロード
ポイント　ここから　スタートしたいと思っている場合はそのフォルダで右クリックして、open terminalでうまく処理が回ります。

##最後にチーズを入れてテストをする
これでチーズをいれてうまく行くことを確かめる
ワイファイ環境に依存するモードよりもUSBモードのほうが早い可能性があります。


###今後の調査
不要なリポジトリーはどうやって消すのか調査
アイコンの設定
ダウンロードをコマンドする方法

以上ココらへんを更に調査していこうかと思っています。
インデントをしてほしい叫び

#インデントをしてくださいm(__)m
${\boldsymbol インデント}$、**インデント**、${\large インデント}$、${\rm\Large インデント!!!!!}$

インデントをしていない人は先生怒らないから正直に言いなさい(#^ω^)

##インデントをしていないクソなコード例

```swift:
func youMustIndent(_ code: String) -> String {
var sentences: [String] = code.components(separatedBy: "\n")
var tab: String = ""
for n in (0 ..< sentences.count - 1) {
if let first = sentences[n].first, first == "}", tab.count > 1 {
tab = String(tab.prefix(tab.count - 1))
}
sentences[n] = tab + sentences[n]
if let last = sentences[n].last, last == "{" {
tab += "\t"
}
sentences[n] += "\n"
}
return sentences.joined()
}
```

##インデントしてある良いコード例
```swift:
func youMustIndent(_ code: String) -> String {
    var sentences: [String] = code.components(separatedBy: "\n")
    var tab: String = ""
    for n in (0 ..< sentences.count - 1) {
        if let first = sentences[n].first, first == "}", tab.count > 1 {
            tab = String(tab.prefix(tab.count - 1))
        }
        sentences[n] = tab + sentences[n]
        if let last = sentences[n].last, last == "{" {
            tab += "\t"
        }
        sentences[n] += "\n"
    }
    return sentences.joined()
}
```

ちなみに、こちらは引数にとったワンラインコードをインデントをさせる関数

##インデントのメリット
他人が見ても、ブロックやスコープが解りやすい。全体の構造が把握しやすい。

##インデントはどうやってやる？
最近の大抵のエディタやIDEは改行すると勝手にいい感じにインデントしてくれる。
そういうのがない環境の場合は、改行後tabを押してください。
もっと言えば、作業の区切りごとに全体を選択してオートインデントをしてください。

${\boldsymbol インデント}$、**インデント**、${\large インデント}$、${\rm\Large インデント!!!!!}$
LINE Messaging APIとHerokuでBOTを作成

# LINE Messaging APIとHerokuでBOTを作成
![IMG_2468.jpg](https://qiita-image-store.s3.amazonaws.com/0/199441/a3548516-6af0-145b-281b-66437166cdc8.jpeg)

## 実装したアプリ
LINEユーザーが投稿したテキストを、そのままオウム返しするアプリ
この投稿は、そのアプリを実装した時のメモ書き

## 開発環境
`PC`
MacBook Air
macOS HighSierra

`Smart Phone`
iPhone7
iOS11.4

`LINE App`
iOS

## 前提条件
① Herokuの利用ができる
② LINE Developersに登録している

## 実装方法
下記リンク（LINE Developers）を読めば、簡単に実装できます。
https://developers.line.me/ja/docs/messaging-api/building-sample-bot-with-heroku/

## 実際に投稿してみよう
iPhoneでQRコードを読み取り友だちを追加すると、トークルームに移動。

**友だちに追加する場面**
![IMG_2466.jpg](https://qiita-image-store.s3.amazonaws.com/0/199441/fc50949e-d148-2e57-b378-d9f373c6072d.jpeg)


**トークルーム**
![IMG_2464.jpg](https://qiita-image-store.s3.amazonaws.com/0/199441/b0bb7876-8271-227c-2cf0-cb7ac0636ab2.jpeg)

ユーザーが`Sample`と投稿すると、
BOTが`Sample`と返答することがわかる。

画像の通りスタンプを投稿しても、
BOTは反応しないことがわかる。

## 応用
設定を変えると、友だちとして追加した際のメッセージを変えられる。
（この記事のトップ画像）

## 実装するときに詰まったところ
**Webhook URLの接続確認**
Herokuで設定したアプリ名が`sampleapp-linebot`　ならば、Webhook URLは`https://sampleapp-linebot.herokuapp.com/callback.php`　に設定すること

## 今後挑戦したいこと
① ユーザーの投稿に応じて、返答内容を変える
APIの詳細を読んでいないけど、RubyとかJavaで設定すれば実装できそう。

② 緊急地震速報の配信（`IFTTT`というものを使えば実装できそうな予感）
→ 気象庁から発表された情報と地上波テレビ放送の時間差を解消できるかもしれない。

③ 人工知能と連携したアプリ（リクルートの`パン田一郎`みたいなもの）
→ 単純な質問内容ならば人工知能に返答させて、サービス業の人手不足を解消できる（かも）。

## 備考
今回実装したアプリのアイコンは、**iPad + ApplePencil　+ Adobe Scketch** で描いたディーンフジオカの似顔絵です。

ディーンフジオカに設定した理由は特にありません。


## 参考資料
上記で紹介した内容は、LINEの公式HPに載っています。

LINE Developers
https://developers.line.me/ja/
javascriptのみでhtmlとcss実装してみた hover編

煩雑さはご愛嬌です

var ul = document.createElement("ul");
nav.appendChild(ul);
var li = new Array(3);
var a = new Array(3);
for(var i=0; i<=3; i++){
          li[i] = document.createElement("li");
          ul.appendChild(li[i]);
          a[i] = document.createElement("a");
          a[i].attribute = "href";
          a[i].setAttribute("href","");
          li[i].appendChild(a[i]);
          //hover
          li[i].attribute="onmouseover";
          li[i].setAttribute("onmouseover", "this.style.backgroundColor='#996633',firstChild.style.color='white'");
          li[i].attribute="onmouseout";
          li[i].setAttribute("onmouseout", "this.style.backgroundColor='white',firstChild.style.color='#996633'");
     }
Vue.jsで自動カナ入力する。 autokanaの導入で奮闘してみた。

# 2019/01/26 追記

当初は、これで満足をしていましたが、iPhoneでの入力に問題があることがわかりました。
[フォームのふりがなを自動入力する vanilla-autokana](https://qiita.com/ryo511/items/d83e1d80830e36d183e0)ですと、iPhoneでも入力不具合がでませんでしたので、活用させていただいています。

#はじめに

アカウントの登録画面を作っていると、名前とふりがなの入力欄がでてきます。
スマホ全盛の時代なので、ふりがななんて入力が面倒なので省かれたりもします。

しかし、偉大なる先人が作られた
jQuery.autokana　～　https://github.com/harisenbon/autokana
があるので、

「ふりがな」は自動で入るでしょ！

って要望も多くいただきます。


さて、jQueryで作っていたときは、そのままサクッと使わせていただいていました。
ほんとに感謝です。


しかし、Vue.jsで作るようになって、困りました。。。。汗

そして検索しまくってたどり着いたのがこちら。。。
http://sui.hateblo.jp/entry/2015/03/30/082621

React向けの記事ですが、ReactもVue.jsも大きく見れば一緒でしょ！
ってことで使ってみました(笑)


# せっかちな人向け

簡単なデモとサンプルは以下にありますので、ソースを見てもらればすぐわかると思います。

デモ画面： https://idani.github.io/vue-autokana/
ソース： https://github.com/idani/vue-autokana-sample

![2018-06-07_01h27_19.gif](https://qiita-image-store.s3.amazonaws.com/0/133291/aeb80e6d-4791-0b0e-7dda-c9c1bc8bd268.gif)


# ソース解説？

## Vueプロジェクトのテンプレ作成
```bash
# vue init webpack xxxxx
````

## historykanaの導入

```bash
# npm i historykana --save
```

## vueファイル
ソースをまんま貼り付けますが、こんな感じです。

```helloworld.vue
<template>
  <div class="hello">
    漢字：<input type="text" v-model="name" v-on:input="update_furigana">
    ふりがな：<input type="text" v-model="furigana">
  </div>
</template>

<script>
import historykana from 'historykana'
export default {
  name: 'HelloWorld',
  data () {
    return {
      name: '',
      furigana: '',
      history: []
    }
  },
  methods: {
    update_furigana (input) {
      this.history.push(input.target.value)
      this.furigana = historykana(this.history)
    }
  }
}
</script>
```
hisotrykanaに渡すための入力ヒストリ配列として、「history」があります。
「漢字」と書いてあるInput欄に入力イベントが発生するたびに、v-onで定義した、「update_furigana」メソッドが呼び出されます。

「update_furigana」メソッドの引数の「input」は、v-on側には書いていませんが、$event(イベントオブジェクト)が来ています。

Vue.jsの特性なのか、「update_furigana」メソッドは入力中の確定前も呼び出されますが、v-modelで設定している「this.name」には、確定前の文字が入ってきません。

このためinputと定義しているイベントオブジェクトから入力確定前の文字を取得して、historyに入れています。

そして、historykanaを使ってフリガナを抽出しています。

# まとめ

こんな感じで、Vue.jsでも簡単にフリガナの自動入力ができるようになりました。
先人のソースに感謝です。

# 参考URL

* https://github.com/harisenbon/autokana
* https://qiita.com/u-chida/items/6c07d558b3f06c9ed8d8
* http://sui.hateblo.jp/entry/2015/03/30/082621
* https://qiita.com/ryo511/items/d83e1d80830e36d183e0
* https://github.com/wilf312/vue-autokana
RaspberryPiにfish shellを導入するメモ

# はじめに
RaspberrPiにfish shellを導入した時に戸惑ったのでメモ
### raspbian のOS Debianのバージョン
8.0
### 導入するfishのバージョン
version 2.1.0


# 導入手順
## 公式を確認
こちらのページに従って導入する
[shells:fish:release:2 プロジェクト提供の fish](https://software.opensuse.org/download.html?project=shells%3Afish%3Arelease%3A2&package=fish)

### rootに移動

```
$su
```

でエンターを押すと下記のようにpw入力に切り替わる

```
パスワード:
```

これを行うとrootユーザーになる

### fish導入

```
$ echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/2/Debian_9.0/ /' > /etc/apt/sources.list.d/shells:fish:release:2.list
``

```
$ apt-get update
```

上記のコマンドを叩くと下記のようなエラーがでてきた
```
W: GPG エラー: http://download.opensuse.org Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 2CE2AC08D880C8E4
```

公式ドキュメントによると下記とのことなので

```
リポジトリの鍵を apt に登録することもできます。鍵を apt に登録すると、その鍵の所有者が配布する更新やパッケージ、リポジトリなどについても、それらを信頼することになります (詳しくはこちらをお読みください) 。鍵を追加するには、下記のように実行します:
```

これを実行

```
$ wget -nv https://download.opensuse.org/repositories/shells:fish:release:2/Debian_9.0/Release.key -O Release.key
```

```
$ apt-key add - < Release.key
```

```
$ apt-get update
```

```
$apt-get install fish
```

ここまででfishが使えるように

```
$fish -v
fish, version 2.1.0
```
一応 `/etc/shells`の中身を確認
```
$ sudo vi /etc/shells
```

このようにfishが入ってることを確認できる

```
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/fish
```

## fishに切り替え

```
$ chsh
パスワード:
nakagawa のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	ログインシェル [/usr/bin/fish]:
```

ここで
```
/usr/bin/fish
```
と入力するとfishに切り替わる
ChefでattributeをRuby DSL形式で書く場合に、要素を追加するArrayの初期化

node.default['foo']['bar']の様なRuby DSL形式でattributeを書くことは、Excelなどで元データを作る事が容易なのでよく使う。
元がExcelの表なので、各行に対応する式をExcelに作らせる。

あるとき、表の各列が持つ値を要素とするArrayのノードオブジェクトを作ろうとしたが、データの追加先がArrayでないとして失敗した。
#元の表

| key1|key2|値|
|:---:|:---:|:----:|
| foo | bar | val1 |
| foo | bar | val2 |
| foo | bar | val3 |




#失敗するアトリビュートの作成の例

```ruby:attributes/default.rb
default['foo']['bar'] << 'val1'
default['foo']['bar'] << 'val2'
default['foo']['bar'] << 'val3'

```
最初の要素追加時に、追加先がArrayでないとして失敗。

#対応1: 事前にArrayで初期化してから追記
事前に[]かArray.newを代入してArrayとしておく

```ruby:attributes/default.rb
default['foo']['bar'] = []
default['foo']['bar'] << 'val1'
default['foo']['bar'] << 'val2'
default['foo']['bar'] << 'val3'

```

ただ、['foo']['baz']など、キーが変わると、その都度、初期化が必要となる。
初期化部分をExcelに作らせるのも、キーがどこで変わったのを検出しなければいけないので大変。そもそも行がキーでソートされていなかったら。。。





#対応1': 事前にArray「に」初期化してから追記
事前にArrayでなければArrayとしておく

```ruby:attributes/default.rb
default['foo']['bar'] = default['foo']['bar'].to_a
default['foo']['bar'] << 'val1'
default['foo']['bar'] << 'val2'
default['foo']['bar'] << 'val3'

```

['foo']['baz']など、キーが変わると、その都度、初期化が必要となることは変わらない。
しかし、案1と異なりデータ入力後に初期化してもデータが消されないので、気軽に初期化を入れられる。



#対応2: .to_aメソッドにてArrayにしてから追加

```ruby:attributes/default.rb
default['foo']['bar'] = default['foo']['bar'].to_a << 'val1'
default['foo']['bar'] = default['foo']['bar'].to_a << 'val2'
default['foo']['bar'] = default['foo']['bar'].to_a << 'val3'

```
これで、初期化タイミングを考える必要がなくなる。
最初の行だけでなく、全ての行をこの様にしておくことで、行によってキーが変わっても、行の順序を入れ替えても問題は発生しない。

式そのものは長くなったが、式はExcelに作らせるのでとりあえずは大きな問題はない。長いが。。。

と言う訳で、良い方法を知っている方はご教授ください。m(_ _)m


#対応3: 追加分Arrayを作っておいて、最後に.to_aメソッドにてArrayにしてから追加

```ruby:attributes/default.rb
a = []
a << 'val1'
a << 'val2'
a << 'val3'
default['foo']['bar'] = default['foo']['bar'].to_a + a

```
対応1と同様にキーの変更には対応できないので、キー変更の度にaの初期化、default['foo']['baz']などへの代入が必要。
しかし、default['foo']['bar']の初期化タイミングを考える必要はなくなり、かつ全体の文字量が削減され見通しは良い。


#暫定結論
扱いやすさの対応2
見通しの良さの対応1'
isomorphic-git でブラウザから GitHub に git push する

## tl;dr

isomorphic-git の README には、 GitHub の push は cors を認めていないのでブラウザから git push できないとある。サーバー経由でcorsを迂回した。できた。

## やり方

- cors-buster を使って無理矢理 cors を迂回する https://cors-buster-tbgktfqyku.now.sh/
- git プロトコルではなく https を使う

remote に cors-buster 経由の github のhttps アドレスを登録する。

こんな感じ

```:.git/config
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
[remote "origin"]
  url = https://github.com/mizchi-sandbox/igit-playground.git
  fetch = +refs/heads/*:refs/remotes/origin/*

[remote "origin-proxied"]
  url = https://cors-buster-tbgktfqyku.now.sh/github.com/mizchi-sandbox/igit-playground
  fetch = +refs/heads/*:refs/remotes/origin/*
```

origin がいつもの。 origin-proxied が今回使う URL

```js:main.js
const git = require("isomorphic-git");
const path = require("path");
const fs = require("fs");

const repo = {
  dir: ".",
  fs
};

const main = async () => {
  console.log("start");
  let pushResponse = await git.push({
    ...repo,
    remote: "origin-proxied",
    ref: "master",
    authUsername: process.env.GITHUB_TOKEN,
    authPassword: process.env.GITHUB_TOKEN
  });
  console.log(pushResponse);
  console.log("done");
};

main();
```

GitHubの Personal Access Token を取ってくる。ググれば出るので略。

GITHUB_TOKEN を与えて実行する

```
> ~/s/igit-playground on master  env GITHUB_TOKEN=<your-toke> node main.js
start
{ ok: [ 'unpack', 'refs/heads/master' ] }
done
```

できた。

実際に push されたリポジトリがこちら https://github.com/mizchi-sandbox/igit-playground
ruby self @ 違い


次のページを見ていて、自分なりのテストプログラムを書きたくなったので、投稿します。
Markdown: [Qiita](https://qiita.com/sutonea/items/d1b3c62e9aabc6dd801e "Qiita")
テーマは、rubyでのselfと@の違い
動作環境は、cloud9
クラス内の変数hogeにselfと@をつけたり、付けなかったりして、エラーの有無を調べました。
中級者以上の人は見ただけで予想がつくのでしょうが、初心者は実験をしないとエラーがでるかどうか
わからんのですよ。


```ruby:rubyでのselfと@の違い
#ruby self @ の違いとアクセサの有無によるエラーの有無を総当たりで動作チェック
#コメントアウトされている行はエラーとなるので、コメントインして文法エラー確認が可能


class TestClass
  attr_accessor :hoge1, :hoge3

  def initialize(arg)
    @hoge1 = arg        # @hoge　はアクセサがある
    @hoge2 = arg        # @hoge2 はアクセサがない
    self.hoge3 = arg    # @の代わりにselfを使った場合、アクセサあり
    #self.hoge4 = arg   # @の代わりにselfを使った場合、アクセサなし、これはエラーになるので、コメントアウト
  end

  def func
    puts "========hoge1をインスタンスメソッド内で使った場合========"
    puts hoge1 + "1"
    puts @hoge1 + "2"
    puts self.hoge1 + "3"
    puts "========hoge2をインスタンスメソッド内で使った場合========"
    #puts hoge2 + "4"       # hoge2 はローカル変数となり、この行で初登場なので値なしエラー
    puts @hoge2 + "5"       #@hoge2 はインスタンス変数なので、インスタンス関数から利用できるのでOK
    #puts self.hoge2 + "6"  # hoge2 のアクセサを用意してないので、エラー(selfはアクセサを呼び出す呪文)
    puts "========hoge3をインスタンスメソッド内で使った場合========"
    puts hoge3 + "7"
    puts @hoge3 + "8"
    puts self.hoge3 + "9"
  end
end

obj = TestClass.new("テスト")
obj.func

puts "========hoge1をインスタンス変数として使った場合(hoge1はアクセサあり)========"
puts obj.hoge1 + "11"
#puts obj.@hoge1 + "12"       #文法エラー .の後に@はおかしい
#puts obj.self.hoge1 + "13"   #selfはインスタンスメソッドではないので、文法エラー
puts "========hoge2をインスタンス変数として使った場合(hoge2はアクセサなしなので全滅)========"
#puts obj.hoge2 + "14"       #hoge2にはアクセサがないので、インスタンス変数として利用するとエラー
#puts obj.@hoge2 + "15"      #文法エラー .の後に@はおかしい
#puts obj.self.hoge2 + "16"   #selfはインスタンスメソッドではないので、文法エラー
puts "========hoge3をインスタンス変数として使った場合(hoge3はアクセサあり)========"
puts obj.hoge3 + "17"
#puts obj.@hoge3 + "18"       #文法エラー .の後に@はおかしい
#puts obj.self.hoge3 + "19"   #selfはインスタンスメソッドではないので、文法エラー
```
Windowsのnode.jsでCannot find module が出た

# 環境
- Windows 10
- node.js 8.11.2

# Cannot find module が出た！
[Node.js 超入門](http://www.shuwasystem.co.jp/products/7980html/5092.html)の通りに進めていたら、初めてejsを使う場面で、Cannot find module 'ejs' が出て起動できずに困った。

次のページを見るとコラムがあって、このエラーが出たら、プロジェクトディレクトリ下で以下コマンドを叩けという。

```
npm init
npm install --save ejs
```
でもこれ、結局プロジェクト内にモジュールをローカルインストールしてるだけじゃん、と思い、ちょっと解決方法とは違うんじゃないかなーと思って調べた。

# 原因を調べる
まずはnpmのグローバルオブジェクトがインストールされるディレクトリを調べる。

```
npm bin -g
```

C:\Users\ユーザー名\AppData\Roaming\npm みたいなディレクトリが出てくる。
そこにエクスプローラーでアクセスしてみると、node_modulesっていうディレクトリがある。
どうやらここがグローバルオブジェクトのインストール先らしい。

因みにC:\Users\ユーザー名\AppData\Roamingまでは、%AppData%という環境変数が切られている。

node.jsをインストールしただけでは、ここにパスが通っていない。

# 解決する
1. 環境変数に追加してパスを通す。

    | 変数名 | 変数値 |
    |:-------:|:--------:|
    | NODE_PATH | %AppData%\npm\node_modules |

2. コマンドプロンプトが起動しているなら、一度落として、再度開きなおしてから実行コマンドを実行する。

    ```
    node app.js
    ```

# 結論
教本では、環境変数を知らない人にこれを説明するのが面倒だったんだろうなぁ～。