OmniAICreator/Qiita-1.07M huggingface dataset:
RailsのWe're sorry, but something went wrong.エラー解決方法！

「1日で基本が身につく！Ruby on Rails」を進めていて日記の詳細(show)ページを開くと”We're sorry, but something went wrong.”のエラーが出た。

<img width="621" alt="スクリーンショット 2018-07-25 13.09.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/362496d9-176c-ba4f-50ff-9cb2802040b9.png">

ググるとlogフォルダ内のdevelopment.logに表示された原因が書かれているとの事です。

<img width="1095" alt="スクリーンショット 2018-07-25 13.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/e12fed8d-ad2b-e333-19f6-bf9e72382b85.png">

"Completed 500 Internal Server Error"と書かれています。
調べてみるとサーバー側の内部エラーとのこと。
http://d.hatena.ne.jp/keyword/Internal%20Server%20Error
しかしいまローカル環境で勉強しています。
引き続きググり続けるも解決方法が出てこない。

"Completed 500 Internal Server Error"表示の上に"Rendering diaries/show.html.erb within layouts/application"と書かれています。

ここがおかしいのかな？
でも書き間違えならいつもの赤いエラー画面が出るはずなんじゃないのかな？
と思いつつ、show.html.erbをチェックしてみました。

<img width="886" alt="スクリーンショット 2018-07-25 13.19.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/1b3d17a2-853a-21a4-f0fc-9ee218da746d.png">

<img width="650" alt="スクリーンショット 2018-07-25 13.20.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/f586c327-30a5-104e-358a-0b6e3fc4fcaf.png">

(confirm: '本当に削除しますか？')の()が{}にしないといけないのを間違えていました！
誤：(confirm: '本当に削除しますか？')　→　正：{confirm: '本当に削除しますか？'}

修正しました、これでエラー表示が消えてくれれば嬉しいですが、、、。
<img width="649" alt="スクリーンショット 2018-07-25 13.23.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/e88590a4-b074-da39-c92c-0ad45dc29c35.png">

エラー表示が消えました！！！
<img width="530" alt="スクリーンショット 2018-07-25 13.24.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/270456/cde71410-ec83-93d3-c242-b7c824f483f8.png">

show.html.erbの単純な書き間違えでサーバーエラーが出ていたんですね。
なんで通常の書き間違えと違うエラー表示になったのかな？
エラーメッセージの続きの’within layouts/applicationの部分が関係してそうです。
この本が終わったら調べてみます。
Twitter のAPIキーの取得方法が変わった

米国時間7月24日TwitterのAPIの取り締まりが行われ、それに伴い
developer.twitter.comにある新しいデベロッパーポータルで開発者アカウントを登録する必要があるそうです。

https://blog.twitter.com/developer/ja_jp/topics/tools/2018/jp-new-developer-requirements-to-protect-our-platform.html


知っていればどうという事はないですが、知らずに新しいアプリを作成しようとすると 
こんな登録必要だっけ、と少し戸惑ったのでAPIキーの取得方法をまとめておきます。

## APIキーの取得について

1.APIキーを取得するアカウントに有効な電話番号とメールアドレスの**両方を**登録します。

2.https://apps.twitter.com/ へアクセスし、「Apply for a developer account」ボタンを押してDeveloper画面へ遷移
![twitter.png](https://qiita-image-store.s3.amazonaws.com/0/263832/1fe8c00e-c6eb-74c8-23bb-0edb62037269.png)

  
3.「continue」ボタンを押して「法人利用」「個人利用」を選択する。（画像は個人利用を選択）
アカウント名と国を選択
![twitter2.png](https://qiita-image-store.s3.amazonaws.com/0/263832/c03c60b4-f1ec-fda0-704b-d009fa6608a6.png)

4.利用目的、サービスの詳細を英語で説明（**300文字以上**)、twitter社の情報収集への協力を選択
![twitter3.png](https://qiita-image-store.s3.amazonaws.com/0/263832/e735db5b-664a-4cf2-2d9f-2e4e5500ac60.png)

5.利用規約への同意、メール配信を選択します。
![twitter4.png](https://qiita-image-store.s3.amazonaws.com/0/263832/29644592-cb69-3905-06af-87fcdacf4397.png)

6.メール認証が行われるので登録メールから「Confirm your email」を選択し、認証ページへ飛びます。
![twitter5.png](https://qiita-image-store.s3.amazonaws.com/0/263832/a1c5bc07-23b9-2c70-fc1e-126a96ca50c8.png)


登録が終わると右上メニューの「Apps」より今までと同様のアプリ作成が行えます。
LaravelのScaffoldのインストール問題

本稿はLaravelの導入を理解している前提で話をします。

とは言っても、あれなのでシンプルに説明します。
composerを入れてください。

```composer global require "laravel/installer"```

このコマンドでLaravelを入れてください。
```.bash_profile```や```.bash_rc```のPATHに```$HOME/.composer/vendor/bin```を追加してください。

```laravel new xxx```と入力して、ファイルを作ってください。
※xxxは任意のサービス名称を入れてください。
MysqlやmariaDB、Postgresqlなど、Sqlite以外のDBを使いたい場合は```.env```に設定したDBを入れてください。Sqliteの場合は特に必要ありません。

## 何が起こるか
LaravelはRailsと違ってscaffoldは初期状態では実装されていません。
そこで、インストールする必要があります。

```composer require 'laralib/l5scaffold' --dev```

その後

```config/app.php
'providers' => [
        ...
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
        Laralib\L5scaffold\GeneratorsServiceProvider::class,
```
をいれます。

インストールされたかを調べるために
```php artisan```
と入れます。そうすると、エラーが出るので、以下のファイルを修正します。

vendor/laralib/l5scaffold/src/Makes/MakeController.phpの4行目と21行目を修正します。

###5行目

```vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php
use Illuminate\Console\AppNamespaceDetectorTrait;
```
↓

```vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php
use Illuminate\Console\DetectsApplicationNamespace;
```

###21行目

```vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php
 class ScaffoldMakeCommand extends Command
  {
    use AppNamespaceDetectorTrait, MakerTrait;
```
↓

```vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php
 class ScaffoldMakeCommand extends Command
  {
    use DetectsApplicationNamespace, MakerTrait;
```
また、最後に追加します。

```vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php
        return $names[$config];


    }

    public function handle() { return $this->fire(); }
```

合わせて

###4行目

```vendor/laralib/l5scaffold/src/Makes/MakeController.php
use Illuminate\Console\AppNamespaceDetectorTrait;
```
↓

```vendor/laralib/l5scaffold/src/Makes/MakeController.php
use Illuminate\Console\DetectsApplicationNamespace;
```

###13行目

```vendor/laralib/l5scaffold/src/Makes/MakeController.php
 class MakeController
  {
    use AppNamespaceDetectorTrait, MakerTrait;
```
↓

```vendor/laralib/l5scaffold/src/Makes/MakeController.php
 class MakeController
  {
    use DetectsApplicationNamespace, MakerTrait;
```

とここまで修正して保存します。

そうして、もう一度
```php artisan```
と入力するとうまくいくと思います。
ここまで来たら、

```
php artisan make:scaffold XXXX --schema="title:string:default('XXXX'), body:text"
```
などと入れて、サイトを作ってください。

こっからが本番ですが、ここで躓いたのでまとめました。
VSCodeでShift_JISの自動判定エンコードでの注意


# VSCodeでShift_JISの自動判定エンコードでの注意

## Visual Studio Code で自動エンコードするときの設定

``` settings.json
"files.autoGuessEncoding": true
```

これデフォルトだとfalseになっていますがtrueにすると便利ですよね

## Grep検索で注意
しかし
Grep検索（Ctrl + Shift + F）を行うときは`files.encoding`のエンコード設定を使います。
**自動エンコードは適用されません。**
つまり特にユーザーによる指定がない場合は

```
  // ファイルの読み取り/書き込みで使用する既定の文字セット エンコーディング。言語ごとに構成することも可能です。
  "files.encoding": "utf8"
```
こちらが適用されるわけです。

したがってUTF-8ファイル以外を扱うときにGrep検索では注意が必要です。

VSCodeでは異なるエンコード間での自動エンコードによるGrep検索はできないようです。
エンコードが予めわかっているなら個別に指定するのが無難です。


## Shift_JISのファイルでの注意
`"files.autoGuessEncoding": true`を設定することの最大の利点ってこれだと思うのですが
Shift_JISのファイルを開くと自動で
ISO-8859-2エンコードだと思われて文字化けすることがあります
当然日本語文字列が検索で引っかからなくなるので注意

やはり異なるエンコードのファイルを扱うときは
ワークスペースの設定で個別に

``` settings.json
{
	"files.autoGuessEncoding": false,
	"files.encoding": "shiftjis",
}
```
としておくのが良さそうです。

## 実は言語ごとに設定ができる
言語ごとにエンコードが異なる場合
ユーザー設定で言語ごとに設定できます。

``` settings.json
"[php]":{
	"files.encoding": "utf8"
	},
"[html]": {
	"files.encoding": "shiftjis"
	},
```
この方法はおすすめですがやはりGrep検索のときはデフォルト設定になってしまうので
Grepするときだけは個別に指定しましょう
LaravelでDB::statementを実行するとエラーが出る

# 事象

```php
DB::statement('SELECT * FROM users');
```

を実行すると、以下のエラーが出る。

```shell
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: SELECT * FROM users;)
```

# 解決方法

[PHP PDOを利用している場合](https://docs.memsql.com/concepts/v6.0/prepared-statements/)はPDO::ATTR_EMULATE_PREPARES=TRUEを設定するといい。
Laravelだと、

```php:config/database.php
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
            'options' => [
                PDO::ATTR_EMULATE_PREPARES => true
            ],
        ],
```

というふうにoptionsを付け加えると動く。
centos7 既にあるmysqlで外部接続

#【経緯】
bitnamiでredmineの構築してるサーバがあって、そこで使用しているmysqlを外部からも別ユーザで使いたい。

#【前提】
・MySQLが既にインストール済みである事

#【やること】
1.MySQLでアクセス権限を持ったユーザを作成
外部からアクセスできる専用ユーザを作成

```
grant all privileges on [DB名].* to [ユーザ名]@"%" identified by '[パスワード]' with grant option;
```

※特定のIPのみから接続させたい場合は「@"%"」の%を変更。

2.MySQLのIP制限を外す
MySQLの設定『mysqld.cnf』から、IP制限をコメントアウト

```
# bind-addressをコメントアウト
bind-address = 127.0.0.1
```

※自分の環境（bitnami経由redmine）では、『my.cnf』だった。

3.MySQL設定反映の為、再起動

```
mysql restart
```

※自分の環境（bitnami経由redmine）では、『ctlscript.sh restart mysql』だった。

4.制限外れたか確認

```
netstat -ant

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN
```

※上記ならOK。

5.CentOSのファイヤーウォールにmysqlの外部アクセスを許可する

```
# firewallにmysqlを追加
firewall-cmd --add-service=mysql --zone=public --permanent

# 内容確認（mysqlが表示されていればOK）
firewall-cmd --list-services --zone=public  --permanent
dhcpv6-client ssh mysql

# firewallをリロードして設定を有効化
firewall-cmd --reload
```

6.クライアントから接続確認

```
mysql -h  [IPアドレス] -u [ユーザID] -p
```

【終わりに】
本当は接続元のIP制限を行ったほうがセキュリティ的に良いのだが、
今回は学習用のデータを置く事が目的だったので、IDとパスワードさえわかればアクセスできるようにしました。
※ファイヤーウォール設定のコマンドに-が足りなくて詰まったのは秘密だヨ！
Cloud Storage にアップロードされたZIPファイルを自動展開する for Firebase

#概要

Firebaseにおいて、Cloud StorageへZIPファイルがアップロードされたとき、それを自動展開するための方法です。

複数のファイルをまとめてアップロードしたいけど参照は個別にできたほうがうれしい…といった場合などに。
ちょっとした処理なのですが意外とスニペットが見付からなかったので記事にしました。

#手順

Cloud FunctionsのCloud Storageトリガーを利用します。
Cloud Functionsの設定と初期化、デプロイなどの基本的な手順についてはスタートガイドを参照してください。
https://firebase.google.com/docs/functions/get-started?hl=ja

プロジェクトの初期化後、 `index.js` を次のように書き換えます。

```javascript:index.js
'use strict'

const functions = require('firebase-functions')
const mkdirp = require('mkdirp-promise')
const gcs = require('@google-cloud/storage')({keyFilename: 'service-account-credentials.json'})
const unzipper = require('unzipper')

const path = require('path')
const os = require('os')
const fs = require('fs')

/**
 * バケットで新しいオブジェクト（または既存オブジェクトの新しい世代）が正常に作成された場合に送信されます。
 * 既存のオブジェクトをコピーまたは再作成した場合にも送信されます。
 * アップロードが失敗した場合、このイベントはトリガーされません。
 */
exports.extractZip = functions.storage.object().onFinalize((object) => {

  // ZIPファイル以外は対象外
  if (!object.name.endsWith('.zip') || !object.contentType.includes('zip')) {
    console.log(`処理対象外のファイルです。name=${object.name},contentType=${object.contentType}`)
    return null
  }

  const baseName = path.basename(object.name, path.extname(object.name))
  const srcFile = gcs.bucket(object.bucket).file(object.name)
  const tmpDir = path.join(os.tmpdir(), baseName)
  const tmpFile = path.join(os.tmpdir(), path.basename(object.name))
  const dstBucket = gcs.bucket('gs://example') // 展開先のバケット名
  const dstDir = path.join('extract', baseName) // 展開先のディレクトリパス

  return mkdirp(path.dirname(tmpFile))
  .then(() => {
    return srcFile.download({destination: tmpFile})

  }).then(() => {
    console.log('Cloud StorageからローカルへZIPファイルをダウンロードしました。', tmpFile)

    return fs.createReadStream(tmpFile)
      .pipe(unzipper.Extract({path: tmpDir}))
      .on('close', () => {console.log('ZIPファイルを次のディレクトリへ展開しました。', tmpDir)})
      .promise()

  }).then(() => {
    let uploads = []
    fs.readdirSync(tmpDir).forEach(file => {
      uploads.push(
        dstBucket.upload(path.join(tmpDir, file), {destination: path.join(dstDir, file)})
      )
    })
    return Promise.all(uploads)

  }).then(() => {
    console.log('ローカルからCloud Storageへ展開後ファイル群をアップロードしました。', dstBucket.name)
    
    fs.unlinkSync(tmpFile)
    fs.readdirSync(tmpDir).forEach(file => {
      fs.unlinkSync(path.join(tmpDir, file))
    })
    fs.rmdirSync(tmpDir)
    console.log('ローカルの一時ファイルを削除しました。')
    return null
    
  }).then(() => {
    // TODO: 後続処理のキックなど
    return null
  })
})
```

必要となるパッケージを `npm` で追加します。次がdependenciesの例です。

```json:package.json
...
"dependencies": {
  "@google-cloud/storage": "^1.7.0",
  "firebase-admin": "~5.12.1",
  "firebase-functions": "^1.0.3",
  "mkdirp": "^0.5.1",
  "mkdirp-promise": "^5.0.1",
  "unzipper": "^0.9.2"
},
...
```

また、デプロイの前に、Cloud Storageへのアクセス権限を持つ認証情報ファイルを `index.js` と同じ `functions` ディレクトリへ格納してください。
上の例ではファイル名を `service-account-credentials.json` としています。

Firebaseサービスアカウントをそのまま用いる場合、管理コンソールの **設定 > サービス アカウント > 新しい秘密鍵の生成** より認証情報ファイルをダウンロードできます。

:warning: ガイドに記載されている通り、Cloud Functions for Firebaseは2018年7月現在ベータ版での提供のため、SLAの対象になりません。ご利用の際は十分ご注意ください。
Flutterで外部ブラウザに遷移する

アプリの利用規約で外部ブラウザを開く実装をしたのでメモとして残しておきます。

## Pluginの導入

外部ブラウザに遷移するためのプラグインが用意されています。

https://pub.dartlang.org/packages/url_launcher#-example-tab-

まずはこちらを導入をしましょう。

`Installing` タブの通りにやると簡単に導入できます。


## 実装

実装はこんな感じ

```dart
_launchURL() async {
    const url = "http://https://www.google.co.jp/";
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not Launch $url';
    }
  }
```

## 挙動

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/139360/372904a0-f4d9-443c-fab2-6ede36cb8b66.gif)

実際にiOSの外部ブラウザ遷移が動いてます。
試してないですが、Androidもちゃんと動くはずです。

誰かの力になれば。
PHPとRubyは比較して覚えよう

##書きたいと思ったきっかけ
仕事では、もっぱらPHPなのですが、Rubyが気になり、勉強がてら比較した記録を書いてみました。
ネット・ツイッター見てるとRuby使いの方々多く、ミーハーな私は使いたくなってしまいます。

##この記事の用途
用途としては、PHPとRubyの雰囲気(重要)をおおざっぱに掴んで、各言語の学習のきっかけになれば幸いです。
各言語の雰囲気を楽しんでください。

##~~いいわけ~~使用上の注意
Ruby初心者です。
PHP同様おそらくRubyにもいろいろな書き方があり、こういう書き方があるよとか抜けているよとか違っているよとかあるかもしれませんが、どうか温かい目で見てみてください。

##感想
Rubyの情報は新旧合わせ、たくさんあり、ひとつ絞りづらく取捨選択が大変なので新しい本を一冊買って写経しようかなと思いました。

---

###コメント

```php:php

// comment

```

```ruby:ruby

# comment

```

###変数定義

```php:php

$hoge = 1;

```

```ruby:ruby

hoge = 1

```

###変数出力

```php:php

echo $hoge;

```

```ruby:ruby
puts hoge
```

###配列定義

```php:php

$array = ['hoge', 'fuga', 'piyo'];

```

```ruby:ruby

array = ['hoge', 'fuga', 'piyo']

```

###phpでいうと連想配列定義(Rubyでいうとハッシュ)

```php

$array = [
	'hoge' => 'hoge',
	'fuga' => 'fuga',
	'piyo' => 'piyo'
];

```

```ruby

hash = {
	'hoge' => 'hoge',
	'fuga' => 'fuga',
	'piyo' => 'piyo'	
}

```

###配列操作

```php:php

foreach ($array as $value) {
	echo $value;
}

```

```ruby:ruby

array.each do |value|
	puts value
end

```

###if文

```php

if (true) {
	echo 'true';
} else {
	echo 'false';
}

```

```ruby

if true
	puts 'true'
else
	puts 'false'
end

```

###クラス・メソッド

```php:php

class Hoge
{
	public $hoge = 'hoge';

	public function displayHoge () {
		echo $this->hoge;
	}
}

```

```ruby:ruby

class Hoge

	def initialize
		@hoge = 'hoge'
	end

	def displayHoge
		puts @hoge
	end

```



参考サイト

[PHP マニュアル]
(http://php.net/manual/ja/)

[オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル]
(https://docs.ruby-lang.org/ja/latest/doc/index.html)

[TASK NOTES 【Ruby】条件分岐について (if, unless, case, 三項演算子)]
(http://www.task-notes.com/entry/20141116/1416106800)

[[PHP, Ruby] ハッシュに対するいろいろなMap]
(https://qiita.com/mpyw/items/d165413142a542f92d55)

[PHPのアレはRubyで書くとコレ]
(https://qiita.com/taka0125/items/7e34ba7b383838bfe126)

[ChefTips: RubyのArray(配列)とHash(連想配列)入門]
(https://qiita.com/kentarok/items/5d38c3f7df37a7396ef9)
Visual Studio Code (VSCode)でサジェストされるimportパスが相対パスになる問題の対処法

2018/08/19追記

VSCodeのバージョンアップによって、バンドルされるTypescriptが3.0.1にあがったため、この不具合は解消されました。

# 環境

OS: macOS High Sierra 10.13.5
VSCode: 1.25.1

# 現象

VSCodeには、importしていないクラスであったりを参照しようとすると、「ここからインポートできるで！」と教えてくれる便利機能があります。
今更自力でimport文を書くなんて考えられない、それくらいこの機能はとても便利なので愛用しています。

↓電球アイコンが出てきて、importされていないものを使っていることを教えてくれる
![スクリーンショット 2018-07-25 11.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/75063/1a5d0069-84df-44b1-d064-27780f4f0dcd.png)

それがある日、いつもどおりこの便利な機能を使おうとしたとき、異変が起きたのでした……。

![スクリーンショット 2018-07-25 11.44.56.png](https://qiita-image-store.s3.amazonaws.com/0/75063/bf553b69-7573-a8a8-b8a6-a38a78f3c411.png)

……？

![スクリーンショット 2018-07-25 11.45.08.png](https://qiita-image-store.s3.amazonaws.com/0/75063/95069dd1-6796-3fcd-edea-1321ca05b1e7.png)

？？？？

インポートパスがやたら長い、というかなぜか相対パスになっている……おかしい……。
当然、今までであれば、インストールしたnpmパッケージであれば、相対パスではなく、パッケージ名を指定したimportパスをサジェストしてくれていました。

画像の例であればサジェスト＆補完されるパスは`import { OnInit } from "@angular/core"`となるはずでした。

この現象はインストールしている拡張機能を切ってみたり、再起動してみても解消しませんでした。
当然インターネットを駆使して情報も探しましたが、同様の現象が発生したとする日本語のページは見つからず、
英語で検索しようにも、英語のテストで高校3年間赤点を取り続けた私には、よい検索ワードすら浮かばないという状況でした。

私は一生このサジェストにより補完されたパスから、相対パスを消すという無駄な作業をすることになるのか…、そう思っていた時期もありました。

# 解決方法

なぜか急に英語の検索ワードが降ってきて、検索するとVSCodeに関するひとつのissueを見つけました。

https://github.com/Microsoft/vscode/issues/52089

このissueによると、どうやら`typescript@2.9.2`のバグであるようでした。

現在はこの不具合は[修正](https://github.com/Microsoft/TypeScript/pull/25364)されているのですが、この修正を含んだリリースはまだ行われておらず「なんとかしたければ`2.9.2`以外のバージョンを使え」とのこと。

バージョンを戻してもいいのですが、新しいもの好きとしては、この不具合の修正も含んだ`typescript@next`バージョンをインストールし、ちょこっと設定変更することで解決することにしました。

以下は解決手順です。

## typescript@nextをインストール

まず`typescript@next`をインストールします。

```bash
npm install -g typescript@next
```

## VSCodeの設定変更

調べてないので憶測ですが、VSCodeにはTypeScriptがバンドルされていて、そのTypeScriptのバージョンは`next`ではない最新のバージョンを使うようになっているんだと思います。（執筆時点の最新は、問題の2.9.2）
これを特定のTypeScriptを使うように変更してやる必要があります。

まず設定を開きます。
![スクリーンショット 2018-07-25 11.52.25.png](https://qiita-image-store.s3.amazonaws.com/0/75063/944171e7-b2ee-6877-1a0c-0644ee56e75e.png)

`typescript.tsdk`という名前の設定があるので、先程インストールした`typescript@next`のパスを指定します。
私と同じ環境であれば`"typescript.tsdk": "/usr/local/lib/node_modules/typescript/lib"`になるはずです。
Windowsはわかりません、調べてください……。

![スクリーンショット 2018-07-25 12.25.27.png](https://qiita-image-store.s3.amazonaws.com/0/75063/3738aec6-fd56-6297-ffe6-eca1b11cf973.png)

以上で設定完了です。

VSCodeを再起動すると、importパスのサジェストが直っているのが確認できました！！！

![スクリーンショット 2018-07-25 12.29.04.png](https://qiita-image-store.s3.amazonaws.com/0/75063/53497a8d-55ec-3786-4e4f-15816ab73ea6.png)

![スクリーンショット 2018-07-25 12.29.12.png](https://qiita-image-store.s3.amazonaws.com/0/75063/b463f0bf-ad1c-62ee-f62d-76d27ef607aa.png)
2017新卒が１年半を振り返った話

# まえがき
情報系短大出て新卒で中小のSierに入社し1年半経ちました。
世間知らずの面倒くさがりですがなんとか頑張ることができました。
学んだことの備忘録と自戒をこめて拙いですが記事を書いてみようと思った次第です。（ポエム的になってしまいすいません…）

# 周りを見ること
現場配属されてから成果を出せるか戦々恐々としつつOJTをこなしていましたが、正直1年目の新人でそこまで期待されることはないかと思います。（バリバリできるレアキャラもいるようですが）  

頑張り過ぎないようにしましょう。そして成果が出せないことがまだ許される新人のうちに先輩たちの働き方を見て覚えましょう。　　

ただ、先輩にも得意不得意があります。先輩が得意な面を吸収しましょう。指摘し合えるなら幸せですが、人と環境によります。

# アンテナを張ること
便利なツール、適切な開発手法、現場で確立された業務効率化、管理方法。いろいろ便利な物がありますがそもそも存在を知らなければどうにもなりません。  
情報収集は積極的に行いましょう。
たとえば先輩が知らないツールを使っていたら聞いてみるとか、ネットでもいいです。それこそQiitaに情報はごまんとあります。
使うブラウザ1つとっても効率は違うと思います。 Vivaldiはいいぞ。  

知ったものを深追いするかは判断しましょう。　　

余談：うちの研修内容に入っていませんでしたが、開発やらせるならソース管理と静的解析は教えたほうがいいんじゃないかな…

# 勉強のこと
自分のやってる業務アプリ開発がメインとかだと、正直勉強しなくても仕事は回ります。
実際昨年僕が１人常駐、１人プロジェクトになったときも普通に回ってました（Web系はわかんないです）  

ただ、目的があるならしっかり勉強したほうがいいと思います。スキルアップ、業務効率化、転職準備Etc…

学習方法はQiitaに有識者がまとめてくださっているので参考にしましょう。自分はProgateから入り、書籍読みつつ実際に環境を構築してといろいろ組み合わせてます。  

あとpaizaはスキルチェックで暇つぶせるし世の中には色んなIT企業があるんだなって思えたのでよかったです。

# あとがき
世間知らずだったため軽い気持ちでSIerに入りましたが、どんなものかわかったため転職を考えてます。気持ちとしてはコード書きたいですが、最近お仕事ではずっとExcel触ってるので…  

世の中には実態は人材派遣業だけど、開発会社として新卒を集めて１ヶ月雑に教育したら現場に突っ込むみたいな会社はあります。そして現場と担当者によってはかなりひどい目にあいます（知り合いが泣きを見ました。僕はまだ幸運だった）

こんな風にならないために就活生はちゃんと情報収集しような！
Matplotlib基礎

[「ゼロから作るDeep Learning ― pythonで学ぶディープラーニングの理論と実装」](http://amzn.asia/4KBg78L)の
Matplotlibの説明を読みつつ、まとめました。

## 環境
* Windows10 Pro
* VS Code
* Anaconda
* Python 3.6.5
* JupyterNotebook

## 使い方
```python

import numpy as np
import matplotlib.pyplot as plt
```

## グラフ描画
* 単純に y = sin(x) を表示させる

```python

x = np.arange(0, 6, 0.1) # 0から6まで0.1刻みでグラフを生成
y = np.sin(x)

plt.plot(x, y)
plt.show()
# y = sin(x) を表示させているだけ
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/52392/9270bbbc-43a0-a91b-ebbf-d8933eaf6b77.png)

* 式は同様だが、x=-5 から x=5 までを、1刻みで表示させる

```python

x = np.arange(-5, 5, 1) # -5から5まで1刻みでグラフを生成
y = np.sin(x)

plt.plot(x, y)
plt.show()
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/52392/c2cda3d3-4077-c1c3-038f-cc092400b185.png)

## グラフに情報を付加する

```python

x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label = "sin") # 実線のグラフ
plt.plot(x, y2, linestyle = "--", label="cos") # 破線のグラフ
plt.xlabel("x") # x軸の下のラベル
plt.ylabel("y") # y軸の下のラベル
plt.title("sin & cos") # 表の上のタイトル
plt.legend() # 左下のラベル(ーsin　---cos)
plt.show() # 表示
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/52392/9488dba4-92f3-eb3d-926b-1347068ad71f.png)

## グラフではなく画像を表示する
```python

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread("Capture/test.png")
plt.imshow(img)

plt.show()
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/52392/863e6bee-9e77-f4a4-3b47-bffd8e56eb16.png)

…うーん、使いどころが…
Flaskで簡単につくる、画像処理した結果を見るだけのWebサービス

# 概要
タイトル通り

# どういうときに使うの?
とりあえず作った画像処理プログラムをGUIで動かせるようにしたい時とか

# どんなものができるの?

画像を送信するとサーバ内で任意の画像処理がされて、処理された画像の一覧が表示されていく。
(サーバ内のimagesディレクトリ内に処理された画像が保存されていく)

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/91558/65329549-5272-45b1-bd35-696e7e5baf62.gif)

# 必要なもの
Flask, OpenCV(画像処理に使う場合) 

# コード

```python server.py```で起動する。

```python:server.py
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import numpy as np
import cv2
from image_process import canny
from datetime import datetime
import os
import string
import random

SAVE_DIR = "./images"
if not os.path.isdir(SAVE_DIR):
    os.mkdir(SAVE_DIR)

app = Flask(__name__, static_url_path="")

def random_str(n):
    return ''.join([random.choice(string.ascii_letters + string.digits) for i in range(n)])

@app.route('/')
def index():
    return render_template('index.html', images=os.listdir(SAVE_DIR)[::-1])

@app.route('/images/<path:path>')
def send_js(path):
    return send_from_directory(SAVE_DIR, path)

# 参考: https://qiita.com/yuuuu3/items/6e4206fdc8c83747544b
@app.route('/upload', methods=['POST'])
def upload():
    if request.files['image']:
        # 画像として読み込み
        stream = request.files['image'].stream
        img_array = np.asarray(bytearray(stream.read()), dtype=np.uint8)
        img = cv2.imdecode(img_array, 1)

        # 変換
        img = canny(img)

        # 保存
        dt_now = datetime.now().strftime("%Y_%m_%d%_H_%M_%S_") + random_str(5)
        save_path = os.path.join(SAVE_DIR, dt_now + ".png")
        cv2.imwrite(save_path, img)

        print("save", save_path)

        return redirect('/')

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8888)
```

画像処理のサンプル
想定するユースケースではここに自分の画像処理プログラムを用いる。

```python:image_process.py
import cv2

def canny(image):
    return cv2.Canny(image, 100, 200)
```

以下ウェブのソース(templatesディレクトリ内に格納する必要があります)

```html:templates/layout.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>API Sample</title>
  </head>
  <body>
    {% block content %}{% endblock %}
  </body>
</html>
```

```html:templates/index.html
{% extends "layout.html" %}
{% block content %}

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="image" accept="image/png, image/jpeg">
  <button type="submit">submit</button>
</form>

{% if images %}
  {% for path in images %}
    <div>
      <img src="images/{{ path }}" style="margin-top: 10px; vertical-align: bottom; width: 200px;">
      {{ path }}
    </div>
  {% endfor %}
{% endif %}

{% endblock %}
```

# 参考資料

以下の資料を一部参考にさせていただきました。

- [Flaskでアップロードされた画像ファイルをOpenCVで読み込む方法 - Qiita](https://qiita.com/yuuuu3/items/6e4206fdc8c83747544b)
Watson Assistant(旧Conversation)でJump toの挙動の違い

# はじめに
Watson Assistantでチャットボットを作成しているのですが、
Dialogで細かい挙動を設定している際に気付いた挙動の違いについてメモ。

# やろうとしたこと
(Watson Assistant)
①親ノード(Jump先のノード)滞在時にユーザーが入力
↓
(サーバー)
②入力チェック
　続行不可(やり直し)となった場合、context変数**A**に値をセット
↓
(Watson Assistant)
③context変数**A**の値を条件に子ノード(Jump元のノード)が捕捉
↓
(Watson Assistant)
④子ノード(Jump元のノード)がcontext変数**A**の値をクリア
↓
(Watson Assistant)
⑤子ノード(Jump元のノード)が親ノード(Jump先のノード)にJump
　**Jump to(Evaluate condition)**

なぜこのようにしているかというと、
入力チェックに引っかかった場合、先に進ませずに再度入力させるためです。

# 事象
以下のような挙動の差がありました。

Jump先のノードの条件による挙動の差

|true以外|true|
|:--|:--|
|④が実行される|④が実行されない|

# 原因と対応
### 原因
よくわかりませんが、trueは特別なのでしょうか。
子ノードが処理されてからJump toするものだと持っていましたが、
trueの場合、スルーされてしまうのか？？

### 対応
④で実施しているcontext変数**A**の値をクリアする処理を
親ノード(Jump先のノード)で実施するようにしました。

# さいごに
発端はtrue以外に設定しているノードでちゃんと動いていたので、
同じようにtrueに設定しているノードに設定したら動かなかったのです。
処理は同じなのに設定が違うのは混乱の素なので、
同じ設定で統一するために、元々の設定を直す形となりました。

自分の知識不足で何か間違っているような気がしなくもないですが、
もし何か知っている方いたら教えて下さい。
金額や数値をカンマ区切りにしたい場合、JPYしか扱わないなら to_s(:delimited)  を使うと楽

### `ActiveSupport::NumberHelper#number_to_currency` もあるけど、すこし不便

- [modelで使う場合 include する必要がある](https://stackoverflow.com/questions/5176718/how-to-use-the-number-to-currency-helper-method-in-the-model-rather-than-view/5867154)
- [i18nを適切に設定しないと、いろいろおかしいことになる](https://qiita.com/awakia/items/d29fdbf0cab0b27da48f)

### `ActiveSupport::NumericWithFormat#to_s(:delimited)`ならシンプル

数値を(デフォルトでは)カンマ区切りにしてくれる

```.ruby
1000000.to_s(:delimited) # => "1,000,000"
```

日本円をカンマ区切りにしたいならば、以下のようにすれば良い

```.ruby
1000000.to_s(:delimited) + '円' # => "1,000,000円"
```

JPYしか扱わないなら、こっちのほうがシンプル
HerokuでRailsをデプロイしたら、Devise.secret_key was not set

最新のRails5.2でherokuデプロイした場合に引っかかったので書きました。

## 結論
- herokuのデフォルトで入ってる環境変数。`SECRET_KEY_BASE`を使うといいよ。

## 解説
- 要はデプロイした時に取得できる値じゃないといけないので、だったら最初から登録されているものを使いましょうというお話。

```rb
# config/devise.rb
config.secret_key = ENV['SECRET_KEY_BASE']
```

以上
Linuxで git clone パスワードを保存させる

# 設定
以下のコマンドを実行する。
一回クローンした後は、パスワードが保存される。

```sh
git config --global credential.helper store
```

# 確認

```sh
#保存されたユーザー＆パスワードを確認する。
cat ~/.git-credentials
#上記のファイルに、以下の形式で情報が保存される
#https://username:password@example.com
```
TensorFlow内部構造解析

TensorFlowはGoogleが開発した機械学習/深層学習のライブラリで、GitHubにオープンソースソフトウェアとして公開されています。TensorFlowという名は、機械学習/深層学習にメインに携わっている人でなくても、その名前知っている方は多いかと思います。

TensorFlowはドキュメントやサンプルが充実していることから、TensorFlowを使うだけであれば、情報不足により困ることはほとんどありません。しかし、TensorFlowの内部構造を説明した資料は非常に少なく、TensorFlowの内部を理解するためにはソースコードを読む必要があります。

そこで、TensorFlowの内部構造を説明する記事を、連載で書きたいと思います。
現状書こうと考えている記事は以下の通りですが、執筆を進める中で構成の変更や記事の追加も考えたいと思います。

1. データ構造
  1. [Protocol Buffers形式のデータ構造](https://qiita.com/AtuNuka/items/8b6a9d632641fbc787d4)
2. Python API
  1. [グラフ構築](https://qiita.com/AtuNuka/items/20aaacb1f6215ba8aa59)
  2. Session立ち上げ
  3. Python APIからC APIの呼び出し（SWIG）
  4. Operation自動生成
3. C API
  1. C-C++への接続
4. コア処理
  1. Session
  2. グラフ構築（GraphConstructor）
  3. デバイス割り当て（Placer）
  4. [計算グラフ最適化処理1 Grappler](https://qiita.com/AtuNuka/items/f1b0fe9c820e4d5f80cc)
  5. グラフ分割処理（Partition）
  6. [計算グラフ最適化処理2 GraphOptimizationPass](https://qiita.com/nuka/items/808fbec073f97be8b872)
  7. [計算グラフ最適化処理3 GraphOptimizer](https://qiita.com/AtuNuka/items/1936ad509cd4e68d2fad)
  8. ノードと演算の対応（Node、OpKernel間の関係）
  9. グラフ実行制御（Executor、スレッド割り当て）
  10. 各演算の実行（OpKernelContext、OpKernel）
  11. 各演算処理（OpKernel）
  12. デバイスの登録
  13. Tensorメモリの確保
5. OpKernelの実装
  1. ConstantOp
  2. VariableOp
  3. PlaceHolderOp
6. その他
  1. TensorFlowのデータ型
  2. Profiler機能
特定のresourceだけ terraform {plan|apply} したい

Terraformを運用していると特定のリソースだけplanしたりapplyしたいことってあると思います。

そのような場合、 `terraform plan -target={resource}` `terraform apply -target={resource}` とすればOKです。

詳細は以下のTerraformドキュメントを参照してください。

- [Command: plan #target-resource](https://www.terraform.io/docs/commands/plan.html#target-resource)
- [Command: apply #target-resource](https://www.terraform.io/docs/commands/apply.html#target-resource)

`resource` の指定の仕方は以下のドキュメントを参考にすると良いです。

- [Command: plan #resource-targeting](https://www.terraform.io/docs/commands/plan.html#resource-targeting)
- [Resource Addressing](https://www.terraform.io/docs/internals/resource-addressing.html)

公式ドキュメントへのリンクをまとめただけになってしまった・・。まぁいいか、自分用メモということで。

ところで特定のresourceだけdestroyしたい、という場合はresourceをtfファイルから削除すればOKだと思います。
windows10へChainer(2.0.2)のインストール

最新版だとうまくいかないので少し古いバージョンです。

#環境構築手順 

1. Visual Studio2015をインストール（無料版）

1. CUDA8.0をインストール
以下のURLからダウンロード可能
https://developer.nvidia.com/cuda-toolkit-archive

1. cuDNNをインストール
以下のURLからダウンロード可能
https://developer.nvidia.com/rdp/cudnn-download

#インストール方法

##cuDNN
1. cuDNNを解凍して、CUDAフォルダ内の「bin」「include」「lib」を
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\　以下に貼り付け（上書き）

1. 環境変数の設定
    1. 環境変数「PATH」に以下のパスを追加する（先頭に追加すること）
        - C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
    1. 環境変数「INCLUDE」に以下のパスを追加する
        - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
        - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt

##anaconda
1. anacondaをインストール(anaconda4.3.1)
anacondaにpython3.5環境を構築

1. 環境作成
管理者権限でanaconda promptを起動
```conda create -n py35 python=3.5 anaconda```

1. 環境の切り替え
```activate py35```

1. Chainerインストール
anaconda promptで以下のコマンドを実行
```pip install chainer==2.0.2```

1. cupyインストール
anaconda promptで以下のコマンドを実行
```pip install cupy==1.0.2```

1. 動作確認のためサンプル(mnist)を実行
以下をgit cloneまたはzipで取得する。
https://github.com/pfnet/chainer
anaconda promptでexample/mnistへディレクトリ移動
以下で実行（CPUのみ使用したMNISTのサンプル）
```python train_mnist.py```
以下で実行（GPUを使用MNISTのサンプル）
```python train_mnist.py --gpu 0```

1. OpenCVのインストール(必要な人のみ)
```conda install -c https://conda.anaconda.org/menpo opencv3```

#注意事項 
- visual studio 2015以外のバージョンがインストールされていてはいけない
- cupyインストール時に複数バージョンのvisual studioが入っているとエラーになる。
- anacondaを使う
CPLEXのインストール

#インストール方法


1. CPLEXをインストール
	- `cd /Users/takaaki/Downloads`
	- `chmod 777 cplex_studio12.7.1.osx.bin`
	- `./cplex_studio12.7.1.osx.bin`
1. パスを通す
	- `export PATH=$PATH:/Users/takaaki/Applications/IBM/ILOG/CPLEX_Studio1271/cplex/bin/x86-64_osx`
1. setup.pyを実行
	- `cd /Users/takaaki/Applications/IBM/ILOG/CPLEX_Studio1271/cplex/python/2.7/x86-64_osx`
	- `python setup.py install`
③Raspberry Pi3でdh11とDBを連携する

# sqliteインストール

```
$ sudo apt-get install sqlite3
```

バージョン確認

```
$ sqlite3 -version
```


# db、テーブル作成

DB作成

```
$ sqlite3 test.db
```

sqlite接続

```
$ sqlite3 test.sqlite3
```

テーブル作成

```
$ CREATE TABLE sensor1 (timestamp [timestamp], temp [integer], humid [integer]);
```

# DHT11のデータをSQLiteに保存するスクリプト

```dh11_sqlite.py
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import sqlite3
import dht11
import time
import datetime
 
# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
 
# read data using pin 14
instance = dht11.DHT11(pin=14)
 
while True:
    result = instance.read()
    if result.is_valid():
        TIME = str(datetime.datetime.now())
        TEMP = result.temperature
        HUMID =  result.humidity
        #以下のプリントは無くても良い。
        print("Last valid input: " + TIME)
        print("Temperature: %d C" % TEMP)
        print("Humidity: %d %%" % HUMID)
        #データが取れたのでブレイクしてSQLiteに保存
        break;
 
# SQLiteのデータベースの名前と保管場所を指定。
#このコードはdht11.pyと同じ場所に置く必要があります。DBも同じ場所にしてみました。
dbname = '/home/pi/Python-Script/DHT11_Python/dht11_1.db'
# データベース内のテーブルの名前
dbtable = 'sensor1'
# SQLiteへの接続
conn = sqlite3.connect(dbname)
c = conn.cursor()

# SQLiteにテーブルがあるかどうか確認するクエリ
checkdb = conn.execute("SELECT * FROM sqlite_master WHERE type='table' and name='%s'" % dbtable)
# もしテーブルがなかったら新規でテーブルを作成する
if checkdb.fetchone() == None:
    # ID、タイムスタンプ、温度、湿度の4列のテーブルを作成するクエリを作成。IDは自動附番。
    create_table = '''create table ''' + dbtable + '''(id integer primary key autoincrement, timestamp varchar(20),
                  temp real, humid real)'''
    # クエリを実行
    c.execute(create_table)
    # 変更を保存する
    conn.commit()
 
# SQL文に値をセットする場合は，Pythonのformatメソッドなどは使わずに，
# セットしたい場所に?を記述し，executeメソッドの第2引数に?に当てはめる値を
# タプルで渡す．
# 温度、湿度、タイムスタンプを保存。
sql = 'insert into sensor1 (timestamp, temp, humid) values (?,?,?)'
data= (TIME, TEMP, HUMID)
c.execute(sql, data)
conn.commit()
 
#接続を切る
conn.close()
```

# スクリプト実行

```
sudo python dh11_sqlite.py


```

# DB確認

```
sqlite3 dht11_1.db
sqlite> select * from sensor1
2018-07-19 04:10:00.944870|28|74
```
ActiveAdminでカスタム一括処理を入れる

この記事は
===

* Railsの便利なDB管理ツールActiveAdminで独自の一括処理を入れるメモです

やりたいこと
===

* ActiveAdminではデフォルトで一覧画面からレコードの一括削除が実施できます
* 削除ではなく、あるカラムを一括更新したかったです

やり方
===

* まずindexアクションをオーバーライドしている場合は```selectable_column```を明記して列の１番左側にチェックボックスを配置します
* indexをオーバーライドしていなければ自動で出るので対処は不要です

```rb
index do
  selectable_column
  id_column
  column 'ユーザーID', :user_id
...
end
```

* 独自更新の処理を下記のように書きます
* すると「今日の日付を入れる」というのが一覧画面の一括操作のプルダウンに表示されます

```rb
  batch_action '今日の日付を入れる' do |ids|
    batch_action_collection.find(ids).each do |record|
      record.some_date_column = Time.now
      record.save!
    end
    redirect_to collection_path, alert: "今日の日付に更新しました"
  end
```

終わりに
===

* ActiveAdmin便利だなー
NumPyの基礎的な使い方を学ぶ

[「ゼロから作るDeep Learning ― pythonで学ぶディープラーニングの理論と実装」](http://amzn.asia/4KBg78L)の
NumPyの説明を読みつつ、まとめました。

## 環境
* Windows10 Pro
* VS Code
* Anaconda
* Python 3.6.5
* JupyterNotebook!


## 使い方
```python

import numpy as np
```

## NumPy配列
NumPyの配列というものが存在するらしい。
listと相互変換が可能らしい。

```python

x = np.array([1.0, 2.0, 3.0])

print(x)
type(x)
# [1. 2. 3.]
# numpy.ndarray
```

## 算術計算

```python

x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])

print(x + y) # 四
# [3. 6. 9.]
print(x - y) # 則
# [-1. -2. -3.]
print(x * y) # 演
# [ 2.  8. 18.]
print(x / y) # 算
# [0.5 0.5 0.5]
print(x / 2.0) # 配列の各要素 * 単一数値(スカラ値)
# [0.5 1.  1.5]
```

## 多次元配列

```python

A = np.array([[1,2], [3,4]])

print(A)
# [[1 2]
#  [3 4]]
print(A.shape) # 配列の形状が見れる
# (2, 2)
print(A.dtype) # 配列の要素のデータ型が見れる
# int32
```


## 多次元配列の算術演算
考え方は配列での算術演算と変わらない。

```python

A = np.array([[1,2], [3,4]])
B = np.array([[3,0], [0,6]])

print(A + B)
# [[ 4  2]
#  [ 3 10]]
print(A * B)
# [[ 3  0]
#  [ 0 24]]
print(A * 10)
# [[10 20]
#  [30 40]]
```


## 要素を取り出す

```python

A = np.array([[1,2], [3,4]])

for row in A :
    print(row)
# [1 2] (1回目のループ)
# [3 4] (2回目のループ)

print(A[0][1])
# 2

A = A.flatten() # 多次元配列を1次元配列へ

print(A)
# [1 2 3 4]

print(A[np.array([0, 2, 3])]) # A[要素番号の配列]
# [1 3 4]

print(A > 2) # 各要素が2よりも大きいか
# [False False  True  True]

print(A[A > 2]) # Trueに対応する要素を取り出す
# [3 4]

```
Vue CLIでのプロジェクト生成ができなかった問題

Vue CLIをインストールして、プロジェクトを作ろうとすると途中で止まるという現象が続いていました。

- [npm v5.6.0 にしたら npm install でフリーズする件の対処法 - Corredor](http://neos21.hatenablog.com/entry/2018/03/31/080000)
- [npm install時に止まってしまう件 - Qiita](https://qiita.com/Yuta_Yamamoto/items/7c93c1a400b2f1278622)
- [npm ERR! Unexpected end of JSON input while parsing near '...nd-index-1.0.2.tgz" · Issue #990 · vuejs-templates/webpack](https://github.com/vuejs-templates/webpack/issues/990)

とか読んだけど解決せず。

結局のところ、 `~/.vuerc` の `useTaobaoRegistry` を falseにすると解決するという…。

```json
{
  "useTaobaoRegistry": false,
  "packageManager": "npm"
}
```

via [Simple project create fails · Issue #1523 · vuejs/vue-cli](https://github.com/vuejs/vue-cli/issues/1523)
diameter

# diameter Queue

　diameterプロトコルはtcp であり、ネットワークリソースの接続、切断、タイムアウトに係るステートマシンをtcpレイヤに任せることができ、ビッグパケットにも対応することができる。

　diameterプトロコル設計単体で考えた場合、シンプルに実装設計することが可能である。しかし、シンプルになることによるデメリットもある、永続tcpなので、例えばudpサーバのようにRSSパケット受信＋CPUコア占有処理のように、並列スケールアップさせる実装設計はdiameterプロトコルでは難しい

# motivation

　先に述べた通りプロトコルがシンプルであるがために「diameter over tcp」はスケールアウト、スケールアップに弱い。アプライアンスメーカーの意図するように、ユーザ増加に伴ってそのライセンスを追加購入・配置するのは芳しくない。そこで「優先度付 分散キュー」と、「mysql-bin-log」を採用することによって1筐体（40 core割当）で、2Mtps(１グループパフォーマンス：500Ktps x 4グループ）：１秒間に200万リクエストに応答できる diameterサーバを設計・実装した

# モジュール配置図

<img width="641" alt="doc_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/165490/2b7fb6a7-065a-7313-56cd-7e39c6796a0a.png">

※実装評価では、10core:1グループ、500K tps（１秒間に50万リクエスト）までを確認
※4グループへのスケールアウトは、設計・論理上可能

### 優先度付 分散キュー

<img width="618" alt="doc_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/165490/82722555-823c-408d-3ae3-9f3bbd208c81.png">




# seagull@diameter との接続評価

seagull@diameter は、１コア（シングルスレッド）で動作するdiameterクライアントシミュレータである、今回評価では以下のようにネットワーク接続設定した


<img width="615" alt="doc_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/165490/81f9c935-2cb9-58ed-b332-cf16d318033b.png">


seagull@diameter クライアントと、xdiameterを接続し以下について評価した

+ キューイング処理で並列度が上がるか？
+ 1プロセス・500Kpps程度のスループット
  + キュー目詰まりとスレッド（CPU）間コンテキストスウィッチ増加の副作用は？
+ tcpリソースが充分か？

## 結果
+ seagullクライアントツールの送信・受信限界が想定よりもだいぶ低く、1プロセスあたり、20Kpps 程度が限界であったが、このクライアントを４並列（別プロセス）させて80Kppsまでスケールアウトできることを確認
+ この時、サーバ側負荷は非常に低く想定では、tcpサーバ：単体負荷評価時の500Kpps近いスループットを実現できると考えられる
  + 80Kpps x 平均322 Byte(CCR:466, CCA:178) = 200Mbps までは実測確認

<img width="598" alt="doc_43.png" src="https://qiita-image-store.s3.amazonaws.com/0/165490/981ef587-8ae7-8cbd-b129-cfefbef70463.png">


　左側：グリーン端末でseagullシミュレータをオペレートし、右側：ブルー端末はXdiameter サーバの起動・ログ表示・パケット確認に使用した

本パフォーマンス・スケール実動作の通りクライアント側はそれぞれのモジュールが理想的に分散スケールアウトできている。また、サーバ側はクライアント４CPUが100%CPUビジー状況時にも十二分な余裕を持っていることがわかる


パケットキャプチャイメージを以下に示す。

<img width="556" alt="doc_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/165490/62eca651-8960-45ee-6d70-1a8c45c3f7d1.png">


このパケット送受信シーケンスが示す通り、readとsend は必ずしも交互に処理されていない、xdiameterのパケット受信　-> キューイング処理をバッチ処理としており、最大一度のバッチで16パケットまで連続処理している
cut コマンドは区切れない場合、渡された文字列をそのまま返す

```.bash
$ echo "aaa/bbb/ccc" | cut -d"/" -f3
ccc
```

👆わかる

```.bash
$ echo "aaabbbccc" | cut -d"/" -f3
aaabbbccc
```

👆!!!

空文字を返すものだと思いこんでいたよ...

### 対策

`-s` オプションを使う

```.bash
$ echo "aaabbbccc" | cut -d"/" -f3 -s

```
ActiveAdminで2回以上のrelationを挟むカラムのfilterの仕方

モデルの構成は以下のようにする
 
```ruby:website.rb
class Website < ApplicationRecord
 belongs_to :category
end
```

```ruby:category.rb
class Category < ApplicationRecord
  has_many :websites
  belongs_to :article
end
```

```ruby:article.rb
class Article < AppricationRecord
  has_many :articles
end
```

会社でactive_adminで階層構造のfilterをかける時一瞬手が止まったので、メモ
website一覧で、articleごとのwebsite一覧を検索する場合

```ruby:admin/website.rb
...

filter :category_article_id, label: I18n.t('activerecord.models.article'), as: :select, collection: proc {Article.all.map{|a| [a.title, a.id]}}

...
```
上記のようにかけば良い

active_admin管理画面としてはピカイチ

Thank you for reading!
[Rails] first(1)と書くべからず

railsを学び始めてはや2か月。

作業中にfirstメソッドの使い方で詰まった点があったので書いてみます。

```rb
User.first(3)
````

とすればusersテーブルの最初の3件を取得できるわけですが、**最初の1件だけ**を取得したい場合は

```rb
User.first
```

だけでOKです。:thumbsup:

```rb
User.first(1)
```
と書いてしまうと、一見同じレコードを取得したように見えますが、別物のように扱われます。:tired_face:
どうやらfirstの後に（）を付けると複数個のレコードを取得したとみなされるようです。

---
余談ですが、first(1)と書いた場合でも、要は複数個扱いされているのを解消すればいいので

```rb
User.first(1).each do |f|
  f.email
end
```

のような感じで、（１件しかないけど）eachで形式上ばらしてあげれば、動くは動きます。
無駄に書く量が増えるだけにしか思えませんが……
【flow】packageがmodule not found【monorepo】

monorepo環境にflowを導入した場合、
packagesをrequireで参照したときに`module not found.`が発生する

```jsx
import { hoge } from 'package-name/sample';
```

## 対処方法
```bash
flow-typed create-stub {package-name}
```

（`flow-typed`がない人は `yarn global add flow-typed`）


> [CLI Commands and Flags - create-stub](https://github.com/flow-typed/flow-typed/wiki/CLI-Commands-and-Flags#create-stub)

上記コマンドにて、packageの型定義ファイルが生成されるので、flowはその定義ファイルを参照してくれるようになる。
nuxt.js(v2)でIE11対応をする（JS編）

■動作確認済みバージョン

- nuxt.js(2.11.0)
- create-nuxt-app(v2.12.0)

■更新履歴

- 2020/2/5 最新のバージョンに合わせてリライトしました。
  - .browserslistrcファイルが使えるようになりました。
  - お勧めのpolyfill設定方法を追記しました。

---

特に設置の必要はありません（cool!）。以下に、確認・変更のポイントを記載します。



## 対応ブラウザの確認方法

対応ブラウザは「[browserslist](https://www.npmjs.com/package/browserslist)パッケージ」で確認します。ターミナルで`% npx browserslist`を実行してください。

```terminal:terminal
% npx browserslist

ディフォルト設置の対応ブラウザ
↓
and_chr 79
and_ff 68
and_qq 1.2
and_uc 12.12
android 76
baidu 7.12
chrome 79
chrome 78
chrome 49
edge 18
edge 17
firefox 72
firefox 71
firefox 70
firefox 68
ie 11
ios_saf 13.3
ios_saf 13.2
ios_saf 13.0-13.1
ios_saf 12.2-12.4
kaios 2.5
op_mini all
op_mob 46
opera 64
opera 63
safari 13
safari 12.1
safari 5.1
samsung 10.1
samsung 9.2
```

Tips:browserslistパッケージはNuxt.js導入時にインストール済みです。`% npm ls browserslist`を実行しても見つからない場合は、`% npm i -D browserslist`を実行してインストールしてください。

## 対応ブラウザを変更

ルート(package.jsonと同階層)に「.browserslistrc」ファイルを作成し、ディフォルト(defaults)、他必要な設定を追加してください。設定方法は[公式ドキュメント](https://github.com/browserslist/browserslist#full-list)を参照してください。

```text:.browserslistrc
defaults
android>=4.4
not IE 11
```

Tips:ディフォルト（defaults）の設定は、`> 0.5%, last 2 versions, Firefox ESR, not dead`です。

Tips:Nuxt.jsのバージョンが古いなどの理由により、.browserslistrcファイルが無効になる場合があります。package.jsonの利用も検討してください。

#### package.json版の記載例

```json:package.json
{
  ...
  "browserslist": [
    "defaults",
    "android >= 4.4",
    "not IE 11"
  ],
  ...
}
```

## polyfill.ioからpolyfillを読み込む

[polyfill.io](https://polyfill.io/v3/url-builder/)で生成したURLを、nuxt.config.jsのheadプロパティーから読み込みます。

↓

```javascript:nuxt.config.js
export default {
  head: {
    script: [
      { src: '//polyfill.io/v2/polyfill.min.js?features=WebAnimations,IntersectionObserver' }
    ],
  },
...
```

Tips:追加で必要になった場合は`?features=`の後にコンマ区切りで追記します。
Tips:polyfill.ioは、ブラウザに適したpolyfillのみを返します（cool!）。


## 動作確認

ディフォルトのままで、arrow関数がIE11で動作するか確認します。

```text:.browserslistrc
defaults
```

#### エビデンス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217743/274adc55-a394-1fee-d2bd-753e99592472.png)

## おまけ

Nuxt.jsのバージョンが上がり、気がついたら「.browserslistrc」ファイルが動作するようになってました。また、polyfill.ioがこんなに便利だったとは知らなかった。汗

より、シンプルに生きられるようになりました。
EUC-JP の sqlite2 を UTF-8 の sqlite3 に変換

元の sqlite2 データベースを、sqdb00.db とし、
変換後の　データベースを sqdb00.db3 とします。

```bash
sqlite sqdb00.db .dump | iconv -f EUC-JP -t UTF-8 | sqlite3 sqdb00.db3
```

使ったバージョンは次の通り
>SQLite version 2.8.17
>SQLite version 3.24.0 2018-06-04 19:24:41
>iconv (GNU libc) 2.27
CodeDeployが動かない時にチェックするポイント

AWSが提供するデプロイサービスのCodeDeploy。とっても便利です。
便利ですが、導入するにあたってハマったポイントがあったので書き留めておきます。

## 前提
AWSのEC2環境へのデプロイをターゲットとし、リビジョンファイルはS3から取ってくることを前提としています。
動作確認環境のOSはAmazon Linuxです。
また、「動かない」の定義として、下記スクリーショットのような**イベント自体が実行されていない**状態を「動かない」としています。

![スクリーンショット 2018-07-24 19.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/149365/52f616b0-1416-25c1-6451-1e89bdcfe318.png)

## 確認ポイント
### CodeDeployのサービスロール
CodeDeployのデプロイグループに付与されているIAMロールを確認します。
ロールにアタッチされているポリシーにAWSが用意している `AWSCodeDeployRole` が付与されていれば問題ないですが、それを参考にして独自でポリシーを書いている場合、Actionが十分か、ResourceでEC2インスタンスやAutoScalingGroupを制限してないかなど確認します。
#### 信頼関係もチェック
IAMロールの信頼関係の設定でPrincipalでリージョンを制限していたり、アカウントを制限していたりしていないか確認します。

### CodeDeployエージェントがEC2にインストールされていない
CodeDeployを実行するインスタンスにCodeDeployエージェントがインストールされているか確認します。
インストール方法は[AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)に記載されています。
#### インストールできなくてハマる・・・
手順通りに `wget` 叩いたけどCodeDeployエージェントがダウンロードできないよ!という場合はCodeDeployエージェントがアップロードされているS3バケットを許可するようなIAMロールをEC2に付与します。
[ここの手順6の注記の下参照](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/instances-ec2-configure.html)

それでもダウンロードできない場合、対象のEC2インスタンスが属するsubnetに対してS3エンドポイント(VPCの設定)でS3へのアクセスを制限されている可能性もあるのでそこも確認します。

### CodeDeployエージェントが起動していない
無事CodeDeployエージェントをインストールしたけどCodeDeployが動かない場合、CodeDeployエージェントが起動しているか確認します。
`/etc/init.d/codedeploy-agent status`
結果として
`The AWS CodeDeploy agent is running as PID xxxx`
が返ってくれば動いています。

また、CodeDeployエージェントのログは
`/var/log/aws/codedeploy-agent/codedeploy-agent.log`
に出力されます。

### EC2にIAMロールが付与されていない
上の **CodeDeployエージェントがEC2にインストールされていない** をパスすればあまりここではハマらないと思いますが、EC2インスタンスに付与されているIAMロールでS3のGETとLISTが付与されているか確認します。
また、リビジョンファイルがアップロードされているバケットが許可されているかも確認します。

### リビジョンファイルがアップロードされているS3エンドポイントの設定が正しくない
上で書いていますが、EC2インスタンスが属するsubnetに対してS3エンドポイントが設定されている場合、対象のS3バケットが許可されているかも確認します。

---
とりあえず、ここまで来れば一旦CodeDeployでデプロイが実行されるかと思います。
この後は `appspec.yml` とかhookスクリプトでハマる可能性大ですが、それはまた(時間があれば)別の記事で。
nuxt.js(v2)でpug/stylusを利用する

pugやstylusなどのインデント記法は、見やすく、そして、誰が書いても綺麗になる(整形ツールいらない)ので好き。
nuxtでは、NPMパッケージをインストールするだけで使える。素晴らしい。

nuxt.js(v2)は設定済みの想定
↓
[nuxt.js(v2)の導入方法](https://qiita.com/amishiro/private/82359cf8a298f9e6f0f1)

## 1.NPMパッケージをインストール

本体とコンパイルするためのlodaerをインストール
※nuxt.js(v2)から、`pug-plain-loader`が必要になっている。忘れずに。

```console
// pug
$ npm i pug pug-loader pug-plain-loader

// stylus
$ npm i stylus stylus-loader
```

## 2.動作確認用の記述

pages/index.vueに動作確認用の記述をする。

```vue
<template lang="pug">
.container
  h1.red Hello {{ name }}!
</template>

<script>
export default {
  data () {
    return {
      name: '名前'
    }
  }
}
</script>

<style lang="stylus">
.container
    background-color red
    height 100vh
    display flex
    align-items center
    justify-content center
.red
    color #fff
</style>

```

## 3.動作確認

`$ npm run dev`

---

以上…なんだこの簡単さは。すごいぞnuxt!

おまけ
scssを利用したい場合は、

```console
// pug
$ npm i pug pug-loader pug-plain-loader

// scss
$ npm i node-sass sass-loader
```

```vue
<template lang="pug">
.container
  h1.red Hello {{ name }}!
</template>

<script>
export default {
  data () {
    return {
      name: '名前'
    }
  }
}
</script>

<style lang="scss">
.container {
  background-color: red;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.red {
  color: #fff;
}
</style>
```

でインストール。



# Link

以下、公開中のnuxt.js(v2)関連の記事一覧

## 技術よりの記事

0. [nuxt.js(v2)のインストール〜ESLint設定まで](https://qiita.com/amishiro/items/9cd8007d46f91c8b5da2)
0. [nuxt.js(v2)の作業ディレクトリを整理](https://qiita.com/amishiro/items/9c31a3a9424de27efe28)
0. [nuxt.js(v2)のベースURLをターミナルからコントロール](https://qiita.com/amishiro/items/7c7af250368083216d8e)
0. [nuxt.js(v2)でpug/stylusを利用する](https://qiita.com/amishiro/items/38fe1b102d7e91a93ada)
0. [nuxt.js(v2)でIE11対応をする（CSS編）](https://qiita.com/amishiro/items/84b14108c749a0a0c966)
0. [nuxt.js(v2)でIE11対応をする（JS編）](https://qiita.com/amishiro/items/db37c6a56ddf7e214144)
0. [nuxt.js(v2)で絶対パス(https~)を取得する方法](https://qiita.com/amishiro/items/9d7ca6b239f604a40424) 
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)を入れたい](https://qiita.com/amishiro/items/b7260116b282d2cf2756)
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)で入力漏れの事故をなくす](https://qiita.com/amishiro/items/77e3c2546fa63cc69a62)

## よく使うプラグインのお話

0. [nuxt.js(v2)で便利なvue-mqを使ってみるがSSRモードでコンソールエラーがでるので確認してみた。](https://qiita.com/amishiro/items/f2e302fedf03c3d0f79e)
0. [nuxt-linkでスムーズスクロールするならvue-scrolltoが便利で気が利いている…と思う。](https://qiita.com/amishiro/items/f70aca4797cd57bc51b5)
0. [nuxt.jsでパララックスをするならvue-parallax-jsがお手軽。Cool!](https://qiita.com/amishiro/items/ccca406a9bda1863ab01)

## まとめ系

0. [nuxt.js(v2)でgenerate納品する前にやっておきたい設定](https://qiita.com/amishiro/items/11bd642728f6b5838189)
0. [nuxt.jsにおける「components」ディレクトリの規約（案）](https://qiita.com/amishiro/items/c7493f5e9375a0609bdc)
KotlinでStringの中に特定の文字がいくつ含まれているか数える

多分どの言語でも同じだと思うのですが初心者なのでハマりました。

公式ドキュメント
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html


AtCoderの練習問題をしているとString型の文字列の中に指定された文字がいくつ含まれているか確認しなければならない問題がありました。
https://beta.atcoder.jp/contests/abs/tasks/abc081_a

~~Strig型から直接countメソッドで数えられると思ってたのですが無理でした。~~
追記:KotlinはシングルクォートでChar型として認識するので最初に考えた形で実装できました！(コメントありがとうございます！！)
![2018-07-25-085830_512x194_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/229617/5c77a86b-83e0-f52f-eb94-4f7f539fc8a0.png)

というわけで今回は文字列に１が含まれているか知りたいのでゴリ押しで書いたコード

```kotlin:sample.kt
    val a = readLine()!!
    val b = "1".toCharArray().map { num1 -> a.count {lineChar -> lineChar == num1} }.last()
    println(b)
// input 101
// output 2
```
#もっときれいなやり方
これ書いてる途中にchankedメソッドを見つけました。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/chunked.html#kotlin.text$chunked(kotlin.CharSequence,%20kotlin.Int)/size

文字列を指定された長さのString型で切り出し、配列で返してくれます。

```kotlin
    val a = readLine()!!
    val b = a.chunked(1).filter { it == "1" }
    println(b.size)
// input 101
// output 2
```

言語について知ることもっと大事ですね。
追記: chunkedメソッドはkotlin1.0に対応してなかったのでatcoderのコンパイルは通りませんでした。(泣)対応してほしい〜
nuxt.js(v2)のベースディレクトリをターミナルから変更する

nuxt.jsでgenerateした静的サイトを`/yourDir/`配下で配信したい場合は、nuxt.config.jsにてrouter.baseを設定する。

```javascript:nuxt.config.js
module.exports = {
  router: {
    base: 'yourDir',
  },
  ...
}
```

ただ…テスト毎に配信ディレクトリを変えたいとき、毎回nuxt.config.jsファイルを修正するのは~~非常にめんどくさい~~ミスの基。なので、`$ npm run generate`する時に、環境変数経由で変更できるように設定しておく。

また、`cross-env`を活用することで、winowsにも対応にしておく。環境変数の扱い方はmacとwinだと違うのだ。

## NPMパッケージをインストール…はしなくてOK

nuxt.js(v2)では、はじめから`cross-env`がインストール済み。素晴らしい。

## 環境変数を宣言してrouter.baseを設定

nuxt.config.jsに環境変数を宣言しつつ、router.baseを設定する。

```javascript:nuxt.config.js
const baseDir = process.env.BASE_DIR || '/'

module.exports = {
  router: {
    base: baseDir,
  },
  //...
}
```

## 動作確認

#### MAC

```terminal:terminal
BASE_DIR=/yourDir/ npm run generate
```

#### WINDOWS対応版

```terminal:terminal
npx cross-env BASE_DIR=/yourDir/ nuxt generate
```

生成されたdist内のデーターを`/yourDir/`ディレクトリにUPして確認。OK。

---

参考：https://nuxtjs.org/api/configuration-router

# Link

以下、公開中のnuxt.js(v2)関連の記事一覧

## 技術よりの記事

0. [nuxt.js(v2)のインストール〜ESLint設定まで](https://qiita.com/amishiro/items/9cd8007d46f91c8b5da2)
0. [nuxt.js(v2)の作業ディレクトリを整理](https://qiita.com/amishiro/items/9c31a3a9424de27efe28)
0. [nuxt.js(v2)のベースURLをターミナルからコントロール](https://qiita.com/amishiro/items/7c7af250368083216d8e)
0. [nuxt.js(v2)でpug/stylusを利用する](https://qiita.com/amishiro/items/38fe1b102d7e91a93ada)
0. [nuxt.js(v2)でIE11対応をする（CSS編）](https://qiita.com/amishiro/items/84b14108c749a0a0c966)
0. [nuxt.js(v2)でIE11対応をする（JS編）](https://qiita.com/amishiro/items/db37c6a56ddf7e214144)
0. [nuxt.js(v2)で絶対パス(https~)を取得する方法](https://qiita.com/amishiro/items/9d7ca6b239f604a40424) 
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)を入れたい](https://qiita.com/amishiro/items/b7260116b282d2cf2756)
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)で入力漏れの事故をなくす](https://qiita.com/amishiro/items/77e3c2546fa63cc69a62)

## よく使うプラグインのお話

0. [nuxt.js(v2)で便利なvue-mqを使ってみるがSSRモードでコンソールエラーがでるので確認してみた。](https://qiita.com/amishiro/items/f2e302fedf03c3d0f79e)
0. [nuxt-linkでスムーズスクロールするならvue-scrolltoが便利で気が利いている…と思う。](https://qiita.com/amishiro/items/f70aca4797cd57bc51b5)
0. [nuxt.jsでパララックスをするならvue-parallax-jsがお手軽。Cool!](https://qiita.com/amishiro/items/ccca406a9bda1863ab01)

## まとめ系

0. [nuxt.js(v2)でgenerate納品する前にやっておきたい設定](https://qiita.com/amishiro/items/11bd642728f6b5838189)
0. [nuxt.jsにおける「components」ディレクトリの規約（案）](https://qiita.com/amishiro/items/c7493f5e9375a0609bdc)