OmniAICreator/Qiita-1.07M huggingface dataset:
VuePressで作ったページにalgoliaによる検索機能を追加する

# 概要

VuePressで作ったページの上部に、デフォルトのテーマでは検索用のテキストフィールドがあります。
<img width="370" alt="スクリーンショット 2018-09-09 16.16.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/39261/42834707-8ed7-d3a0-7db6-4d44c8e8fc0a.png">

特に設定しなければ、タイトルとh2/h3のみが検索対象となるようです。
本格的な検索を取り入れたい場合には、algoliaを利用できるようです。
本記事ではalgoliaを導入する手順を説明します。

# algolia登録

以下のURLから、GitHubアカウント等で登録します。

https://www.algolia.com/users/sign_in

ログイン後のダッシュボードで、API Keysから書き込み可能なAPIキーの発行を、Indices > NEW INDEXから新規インデックス作成をしておきます。

# 検索対象ページのインデックス

デプロイ済みのページを主導でインデックスする必要があります。
algoliaが自動で24hおきにやってくれているようですが、よく分からないのでとりあえず手動でやってみました。

GitHubに[algolia公式のツール](https://github.com/algolia/docsearch-scraper)がありますのでそちらを利用します。

```console
$ git clone https://github.com/algolia/docsearch-scraper
$ cd docsearch-scraper
$ ./docsearch docker:build
```

Dockerに加えて、Python3系がおそらく必要です。
途中モジュールが足りない場合は適宜[requirements.txt](https://github.com/algolia/docsearch-scraper/blob/master/requirements.txt)確認しつついれました。

続いて.envファイルにalgoliaのAPP_ID/API_KEYを設定します。
(algoliaログイン後のダッシュボードからAPI Keysで発行できます)

```diff:.env
-APPLICATION_ID=
+APPLICATION_ID=XXXXXXXXXX
-API_KEY=
+API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

スクレイピング設定を記載した、config.jsonを作成します。
INDEX_NAME, START_URL, selectorsは適宜変更してください。
selectorsはどのDOM要素をインデックス対象とするかのselectorです。

```json:config.json
{
    "index_name": "INDEX_NAME",
    "start_urls": [
        "START_URL"
    ],
    "stop_urls": [],
    "selectors": {
        "lvl0": {
            "selector": "p.sidebar-heading.open",
            "global": true,
            "default_value": "Documentation"
        },
        "lvl1": ".content h1",
        "lvl2": ".content h2",
        "lvl3": ".content h3",
        "lvl4": ".content h4",
        "lvl5": ".content h5",
        "text": ".content p, .content li",
        "lang": {
            "selector": "/html/@lang",
            "type": "xpath",
            "global": true
        }
    },
    "custom_settings": {
        "attributesForFaceting": [
            "lang"
        ]
    }
}
```

こうしてようやくインデックスできます。

```console
$ ./docsearch docker:run "$(pwd)/config.json"
```

# VuePress側の設定

以下のようにアプリケーションID(APP_ID)、キー(APP_KEY)、インデックス名(INDEX_NAME)の設定を行ってください。
この設定は静的コンテンツの中に含まれるため、キーには検索専用のものを用いるようにしてください。

```js:.vuepress/config.js
module.exports = {
    ...
        algolia: {
             appId: "APP_ID",
             apiKey: "APP_KEY",
             indexName: "INDEX_NAME"
        }
    }
    ...
}
```

こんな感じに表示されます。

<img width="697" alt="スクリーンショット 2018-09-09 16.43.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/39261/5f9e9621-eb9c-8efa-61f8-004f2059c78f.png">
英語勉強法備忘録

ここ１年くらいで英語がまあまあできるようになってきた（外国人と意思疎通するのに苦労しない、英語のドキュメントを辞書無しで普通に読める程度）ので、備忘録的にどう勉強をしているかを書く。

## 毎日触れる
これが全てと言っても過言ではない。毎日欠かさず英語に触れることで英語そのものにかなり耐性がついた。

## 英語そのものの勉強はあまりしない
好きならやっていいが、大体社会人なんてそこまで暇じゃない。自分は「英語でエンジニアリングを理解する」という行為を通じて自然と英語が身についてきた。

## ReadingとSpeakingは別々に鍛える
英語を勉強しはじめて半年で英語ドキュメントが苦にならないくらいにはなったが、いざ話すとなると全然出なくて驚いた。ReadingとSpeakingで使う脳が違うということのようなので、最近はなるべく自分で英語を書いたり、外国人とコミュニケーションするようにしている。

## 英語とのインターフェース

**twitter**
生きた英語はtwitterから毎日入れる。自分の場合はReactコミュニティのエンジニアをひたすらフォローして、彼らのツイートを追っている。１つのツイートだけではなくて、スレッドを見つけて会話のストロークを見ることで自分がいざ会話するときに活かせる。

**技術ドキュメント**
日々読む。日本語ですぐに出てくるものでも我慢して英語ドキュメントを選ぶ。なれてくると英語でどういう単語をググれば良いものが出てくるか大体わかるようになってきて、普通に効率があがる。

**github**
issueを読んだり、issueを立てたり、PRを送ったりする場。インプットもアウトプットもできる場。

**youtube**
主にリスニング目的。海外のカンファレンスのセッションが大量に上がっていたり、podcast的な配信もある。liveなら質問もできるし、動画のコメントに何か書くくらいの軽いアウトプットもできる。

**udemy**
新しい技術を学ぶときに、udemyの海外製の優れたコースはかなり近道になると思っている。Reactはudemyのコースで勉強した。
個人的Rubyチートシート(随時更新)

個人的なRubyチートシート。
思いついたら随時更新する予定です。

追記:備忘録とかも兼ねているので「こんなん簡単ジャン」みたいなのも混じります。

##一つ上のディレクトリ名を取得
```ruby:
#一つ上のディレクトリ名を取得
puts File.split(File.dirname(__FILE__))[1]
```

##外部ファイルを一行ずつ読み込む
日本語（ShiftJIS）対応。

```ruby:
File.open("./sample.txt","rt:sjis:utf-8") do |file|
    file.each_line{|line|
        puts line
    }
end
```

##ソースコードの変数の値を変更する
例えばこんなソースコードを…
`string sample="sample"   #「sample」を「test」へ変換する`
こんなソースコードへ変換してみる
`string sample="test"   #「sample」を「test」へ変換する`

```ruby:
write_file=""

change_value="test"

File.open("./sample.txt","rt:sjis:utf-8") do |file|
    file.each_line{|line|
        if line.start_with?("string sample")
            target_value=line.split("\"")[1]
            write_file << line.gsub(/\"#{target_value}\"/,"\""+change_value+"\"")
        else
            write_file << line
        end
    }
end

File.open("./sample.txt","w") do |file|
    file.puts(write_file.encode("shift_JIS"))
end
```

##カレントディレクトリの取得
```ruby:
require 'fileutils'
puts FileUtils.pwd

puts Dir::pwd
```

##ファイルを置き換える
```ruby:
require 'fileutils'

#置き換え元
base_file="sample_org.py"
#置き換え対象
replace_file="sample.py"

#カレントディレクトリを取得
current=FileUtils.pwd

#置き換え元が無いのに実行して置き換え対象だけ削除される事故防止
if File.exist?(current+"/"+base_file) then
    FileUtils.rm(current+"/"+replace_file)
    FileUtils.cp(current+"/"+base_file,current+"/"+replace_file)
end
```

##JSONファイルの読み書き
下記のようなjsonファイルを想定

```ruby:test.json
[
    {
        "test": 0
    }
]
```

```ruby:
require "json"

# test.jsonを読み込んでhashに変換
hash = File.open('./test.json') do |file|
    JSON.load(file)
end

# 下記の形で値にアクセスできる
p hash[0]["test"]

# JSONを整形せずに出力 ⇒ [{test:0}]
open('./write.json', 'w') do |file|
    JSON.dump(hash, file)
end

# JSONを整形して出力
pg = JSON.pretty_generate(hash)
open('./write.json', 'w') do |file|
    file.puts(pg)
end
```
Lumen5.6でSQLiteを使う

さくらのレンタルサーバーのライトで契約している趣味のサイトで、やっぱりDB使いたいな……となったので、とりえあず Lumen で SQLite を使えるようにしてみる。自分用メモ。
# 環境
- vagrant
- Lumen5.6
- SQLite
- (PHPStorm)

# 手順

### １）database/database.sqlite を作る
アプリの根っこにある database ディレクトリに、SQLite 用のファイルを作る。

```
$ touch database/database.sqlite
```

### ２）.env で DB の設定
vagrant とローカルの共有ディレクトリ使ってる場合は、vagrant 上での絶対パスを書く。

```
DB_CONNECTION=sqlite
DB_DATABASE=/home/vagrant/common/lumen-sqlite.net/database/database.sqlite
```

### ３）Facade と ORM 使う場合はコメントアウトを外す
公式にも書いてますが、
bootstrap/app.php
を少し変更しないと、Facade と ORM が使えないので、設定変更。

```
# bootstrap/app.php
.
.
.
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

$app->withFacades(); // <- この人と
$app->withEloquent(); // <- この人をコメントインさせる
.
.
.
```

### ３．５）　余談。
ORM使いたいのに↑をコメントインしていないと、
![スクリーンショット 2018-09-09 16.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/152333/fef27677-0a41-0294-b1aa-058d7c11adbe.png)

```
 (1/1) Error
Call to a member function connection() on null
```
と言って怒られる。


### ４）DB 作成
```
$ php artisan make:migration create_users_table --create=users

---(中身)---
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

---(中身ここまで)---

$ php artisan migrate
```

### ５）中身確認
いろんなツールあるようなので、自分に合ったものを使うとよいかと。
私は PHPStorm 使ってましたので、公式にある方法で PHPStorm 内で SQLite の DB 見られるようにしました。

▼PhpStorm2018.2 公式ヘルプ
　https://pleiades.io/help/phpstorm/connecting-to-a-database.html#sqlite


# 参考
▼Lumen本家 Database Basic Usage
　https://lumen.laravel.com/docs/5.2/database#basic-usage
Rails5でhamlを導入する

# hamlとhaml-rails

Rails5にhamlを導入する方法は、hamlとhaml-railsがあります。
haml-railsはhamlをrailsで使いやすくしており、hamlに依存してます。
**erbをhamlに変換する等を考慮すると、haml-railsがおすすめです。**

# 導入
```rb:Gemfile
gem 'haml-rails'
```

# erbをhamlに変換

app/views/以下の.erbを.hamlに変換します。

```shell-session
$ rake haml:erb2haml
```

# 参考
[haml/haml](https://github.com/haml/haml)
[indirect/haml-rails](https://github.com/indirect/haml-rails)
VueとFirebaseの公式ドキュメントを読みながらアプリをつくる（データベースの利用）

[前回](https://qiita.com/kobori_akira/items/4f39de2eb5905a456ede)のつづき。
<https://firebase.google.com/docs/firestore/quickstart>を見ながら。

データベースは"Realtime Database"と"Cloud Firestore"があって、後者が最新なのだろう。
よってCloud Firestoreを利用する。

## Firestoreデータベースの作成、初期化

Firebaseコンソールより、DatabaseからCloud Firestoreの「データベースの作成」を選択。
セキュリティルールは「テストモードで開始」を選んだ。

この時点では「コレクションを追加」とあるだけで、とくにテーブルやデータのようなものは作成されていない。

Firestoreのインスタンスを生成（初期化）するには、apiKey, authDomain, projectIdが必要なよう。
これらはすでにconfigに定義しているので、下記のソースをpublic/index.htmlにするだけで初期化はOK。

```
var db = firebase.firestore();
```

## データの追加

スタートガイドによると、Firestoreの仕様は次の通り。NoSQLに明るい人であれば簡単なのかな。
RDB脳の自分にはサッパリだけれど、まずは「コレクション」が「ドキュメント」たちを持ち、「ドキュメント」がデータたちを持つ、と考えればよさそう。

> Cloud Firestore はデータをドキュメントに保存します。ドキュメントはコレクションに保存されます。データを初めてドキュメントに追加すると、Cloud Firestore によってコレクションとドキュメントが暗黙的に作成されます。コレクションやドキュメントを明示的に作成する必要はありません。

なおドキュメントはコレクション（サブコレクション）を持つことができて、サブコレクション内のドキュメントがまたサブコレクションを持つことができる。

応用はさておき、まずは使ってみよう。
サンプルコードをさきほどのソースの下に挿入する。

```
db.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});
```

この時点で`firebase serve`してアクセスすると、上記の処理がはたらく。
つまりusersコレクションにドキュメントが生成される。
実際にFirebaseコンソールのDatabaseを見てみると、usersコレクションとドキュメントが（暗黙的に）作成されていることがわかる。

同じように、もう一方のサンプルコードを挿入する。

```
db.collection("users").add({
    first: "Alan",
    middle: "Mathison",
    last: "Turing",
    born: 1912
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});
```

これでindex.htmlにアクセスすると、今度は上記のデータの入ったドキュメントがusersコレクションに追加される。

※
なお一つ前に登録されたデータ（ドキュメント）も新規追加されているはず。
これはドキュメント自体の名前（ドキュメントID）を指定していないので、同じデータでも別のドキュメントIDが採番されているため。

## データの読み込み

同様にサンプルコードを更に挿入してみる。

```
db.collection("users").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});
```

これを確認してブラウザの開発者モードでコンソールを見てみると、実際にログが書き出されていることがわかる。

「データの追加の管理」の[データモデル](https://firebase.google.com/docs/firestore/data-model?authuser=0)や「データのクエリ」の[データを取得する](https://firebase.google.com/docs/firestore/query-data/get-data?authuser=0)の説明を読むと、ドキュメントIDを指定して読む方法も書いてあった。

```
var docRef = db.collection('users').doc('{自動生成されたドキュメントID}');
docRef.get().then(function(doc) {
  if (doc.exists) {
    console.log("Document data: " + doc.data());
  } else {
    console.log("No such document!");
  }
}).catch(function(error) {
  console.log("Error getting document:", error);
})
```

あとはスタートガイドにある動画を視聴したりすれば、簡単な読み書きはできるようになりそう。
Rails DBにPostgresを設定

##結論
`rails db:migrate`をやる前に、以下のコマンドを実行。

```
rails db:create RAILS_ENV=development
```
でないと以下のエラーが出る。

```terminal
ActiveRecord::AdapterNotSpecified: 'development' database is not configured
```

##はじめにDBを設定

```terminal
rails new Profile -d postgresql
```
オプションに `-d`をつけてDBを指定

##通常通りアプリを作成

```terminal
rails g model post content:text
rails g controller posts
```

##database.ymlファイルの記述を追加

```yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: JohnDo # 設定したPostgreSQL Accountと同一のもの
  # password:  # 設定したPostgreSQL Accountと同一のもの
  host: localhost
```

##そのままrails db:migrateするとエラー

```terminal
ActiveRecord::AdapterNotSpecified: 'development' database is not configured
```
が発生するので結論に記述した

```terminal
rails db:create RAILS_ENV=development
```
を実行することでパス。
初期設定を忘れてしまっていたので備忘録として。
VuePressでPlantUMLを使う

VuePressのMarkdownに、PlantUMLで書いた図を挿入します。
VuePressはmarkdown-itを使っているので、markdown-it用のプラグインが自由に使えるようです。

markdown-itには、[PlantUMLのプラグイン](https://www.npmjs.com/package/markdown-it-plantuml)があります。
そちらをVuePressに組み込みます。

まず依存を追加。

```console
$ yarn add -D markdown-it-plantuml
```

続いてVuePressに組み込み。

```js:config.js
module.exports = {
    ...
    markdown: {
        config: md => {
            md.use(require('markdown-it-plantuml'))
        }
    }
}
```

Markdown中で以下のように使えます。

```
@startuml
actor User
component hello
User -> hello: USERNAME
@enduml
```

<img width="247" alt="スクリーンショット 2018-09-09 16.09.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/39261/89f07a7f-8018-ca93-6121-466d41df5e36.png">

導入にあたって行った変更は以下:

https://github.com/uphy/vuepress-example/commit/c1445934cdceb1ec611f73091ddcdcac6c9bc0b7
[git] rebaseが完了できない現象（"--continue"を飛ばしてしまったため）の解消手順

rebaseでハマりました。
自力でなんとか解消できたのですが、ネットで情報を探せずに苦労したのでシェアします。
認識違いがありましたらコメントください。:bow_tone1:

# 現象

rebaseでコンフリクトが発生して、手作業で解消して、`git rebase --continue`を実行したら、以下のようなレスポンスが…

```
$ git rebase --continue
Applying: {コメント}
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
```

`git status`を実行すると以下のようなレスポンスで、にっちもさっちも行かない状態になってしまいました。

```
$ git status
On branch {作業ブランチ}
You are currently rebasing branch '{作業ブランチ}' on '{sha1値}'.
  (all conflicts fixed: run "git rebase --continue")

nothing to commit, working tree clean
```

正しくは、

【正解】
$ git rebase {ベースブランチ}
（コンフリクトを解消）
$ git add {パラメータ}
**$ git rebase --continue**
$ git commit {パラメータ}
という手順でコマンドを実行すべきところ、

【誤り】
$ git rebase {ベースブランチ}
（コンフリクトを解消）
$ git add {パラメータ}
**$ git commit {パラメータ}**
$ git rebase --continue

という流れで実行してしまったことが原因のようです。

# 解消手順

`git rebase -help`を実行してオプションを調べてみたところ、

```
--quit                abort but keep HEAD where it is
```

--quitというオプションで、rebaseを中断しつつ、HEADは維持するとのこと。

ということで、

`git rebase --quit`を実行してみたら、コンフリクト解消の作業状態を維持しつつ、rebaseはキャンセルできました！

この後、一連のコマンドを実行し直して、無事にrebaseが完了しました。

なお、--abortオプションを指定してしまうと、コンフリクト解消の作業状態はなくなってしまいます。
Node.jsでセキュアな乱数を生成したい！（0.0 ~ 1.0）

## やりたいこと

0.0~1.0の間で小数の乱数をセキュアに生成したいです

[以下のMDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random)によると`Math.random()`はセキュアじゃないです。

> Math.random() の提供する乱数は、暗号に使用可能な安全性を備えていません。セキュリティに関連する目的では使用しないで下さい。代わりにWeb Crypto API（より正確にはwindow.crypto.getRandomValues()メソッド）を使用して下さい。

なので、`Math.random()`のセキュア版を作りたいです。

## セキュアな乱数生成

以下の`secureRandom()`がセキュアな`Math.random()`のつもりです。

```js
// cryptoをインポート
const crypto = require('crypto');

// crypto.randomBytes()で生成するときのバイト数
const nBytes   = 4;
// nBytesの整数の最大値
const maxValue = 4294967295

// [0.0, 1.0]区間でセキュアな乱数を生成する
function secureRandom() {
  // nBytesバイトのランダムなバッファを生成する
  const randomBytes = crypto.randomBytes(nBytes);
  // ランダムなバッファを整数値に変換する
  const r = randomBytes.readUIntBE(0, nBytes);
  // 最大値で割ることで、[0.0, 1.0]にする
  return r / maxValue;
}
```

## 動かしてみる

以下で動作確認できます（[run▶]を押してください）
<https://repl.it/@nwtgck/secure-random-number>

## `maxValue`の算出について

`maxValue`は`nBytes`を使えば生成できるはずなのです。JavaScriptで`maxValue == (1 << 8*nBytes) - 1`なはずなので、ビット演算をしてみたのですが、うまく行かなかったので、ハードコーディングしています。長くなりますが、以下のように書くと、うまく`nBytes`から`maxValue`を算出できました（なにかいい案があったら教えてもらえると嬉しいです）。

```js
// (計算できるけど、ちょっと長い)
const maxValue = new Buffer(Array(nBytes).fill(0xff)).readUIntBE(0, nBytes); 
```


## `Math.random()`との違い

`Math.random()`は「[0, 1)（0以上、1未満)」らしいですが、`secureRandom()`は[0, 1]なので、そこが違うところだと思います。


## 参考

* [Node.js でセキュアランダムな16進数の文字列が欲しい時のワンライナー - Qiita](https://qiita.com/sifue/items/06032a373a1168e5b6e0)
* [node.js - JavaScript: reading 3 bytes Buffer as an integer - Stack Overflow](https://stackoverflow.com/a/30911922/2885946)
【iOS】デバッグビルドのときだけApplication.presistentDataPathのデータをPCと共有したい

`Application.persistentDataPath` はiOSの場合に、Documentsディレクトリを指すため、Info.plistの`UIFileSharingEnabled`を`true`にしてあげれば良い。

```MyPostprocessBuild.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;

// クラス名、ファイル名は適宜変更してください
public class MyPostprocessBuild
{
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget target, string path)
    {
        if (target == BuildTarget.iOS)
        {
            var plistPath = Path.Combine(pathToBuiltProject, "Info.plist");
            var plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            // Application supports iTunes file sharing
            plist.root.SetBoolean("UIFileSharingEnabled", Debug.isDebugBuild);

            plist.WriteToFile(plistPath);
        }
    }
}
```
Serverspecのカスタマイズ

# 前書き
Serverspecを実務で使うとなると、標準のResource TypeとMatcherだけでは足りず、どうしてもカスタマイズ（拡張）を避けられないと思います。
"command"リソースタイプと、Matcherで正規表現を使えば、ほとんどの場合対応可能でしょうが、どういう時にResource Typeを追加するかは少し悩ましいかもしれません。[ここのテスト](https://qiita.com/ttjhykw2/items/d016ac822036d9e26280)で使ったResource Typeの追加方法を記載します。参考にしたのは、本家のこの本です。
[宮下 剛輔 (著) Serverspec](https://www.amazon.co.jp/dp/4873117097)
この本に書かれていますが、フロントエンドのServerspec側の対応と、テスト対象ホストに対して実際にコマンドを発行するSpecinfra側の対応が必要になります。

# Serverspec 側の拡張

### Resource Typeの追加 

配列 "types" に "locale" と "timezone" を追記

```ruby:serverspec/helper/type.rb
module Serverspec
  module Helper
    module Type
      types = %w(
        base bridge bond cgroup command cron default_gateway file fstab
        group host iis_website iis_app_pool interface ipfilter ipnat
        iptables ip6tables json_file kernel_module kvm linux_kernel_parameter lxc
        mail_alias mysql_config package php_config port ppa process
        routing_table selinux selinux_module service user yumrepo
        windows_feature windows_hot_fix windows_registry_key
        windows_scheduled_task zfs docker_base docker_image
        docker_container x509_certificate x509_private_key
        linux_audit_system hadoop_config php_extension windows_firewall
　　　　　locale timezone
      )

      types.each {|type| require "serverspec/type/#{type}" }

      types.each do |type|
        define_method type do |*args|
          eval "Serverspec::Type::#{type.to_camel_case}.new(*args)"
        end
      end
    end
  end
end
```

以下のファイルを作成

```ruby:serverspec/type/locale.rb
module Serverspec::Type
  class Locale < Base
    def value
      str = "#{name}".split.last
      ret = @runner.run_command("/bin/localectl status | grep #{str}")
      val = ret.stdout.split(':').last.strip
    end
  end
end
```

```ruby:serverspec/type/timezone.rb
module Serverspec::Type
  class Timezone < Base
    def value
      ret = @runner.run_command("/bin/timedatectl status | grep 'zone' ")
      val = ret.stdout.split(':').last.strip
      val = val.split(' ').first
    end
  end
end
```

今回、Matcherの追加は行いませんでした。


# Specinfra 側の拡張

以下のファイルを作成

```ruby:specinfra/command/base/locale.rb
class Specinfra::Command::Base::Locale < Specinfra::Command::Base
end
```

```ruby:specinfra/command/base/timezone.rb
class Specinfra::Command::Base::Timezone < Specinfra::Command::Base
end
```

以上
EclipsePDT で class_alias が認識できない？

## CakePHPのプロジェクトをEclipseにインポートしたらなんかエラー
CakePHPのプロジェクトを作成、EclipsePDTにインポートしてみると以下のようなエラーが出てしまいました。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/286138/f951d5fe-5c42-6650-25f0-4354939a7a29.png)
でもEclipseはエラーを吐くがxamppで動かすと普通に動く。

Cake\Network\Exception\NotFoundException が見つからないそうですが。
vendor/cakephp/cakephp/src/Network/Exception には存在してます。
但しNotFoundException.phpの中身はこんな感じで、

```php
<?php
// @deprecated 3.6.0 Backward compatibility alias
class_alias('Cake\Http\Exception\NotFoundException', 'Cake\Network\Exception\NotFoundException');
deprecationWarning('Use Cake\Http\Exception\NotFoundException instead of Cake\Network\Exception\NotFoundException.');
```

定義自体は存在しないでclass_aliasでCake\Http\Exception\NotFoundExceptionの方を参照してるんですね。

~~「Eclipseだしなぁ」という諦めの気持ちで~~ エラーの以下の部分を、

```php
use Cake\Network\Exception\NotFoundException;
```

以下のように書き換えたら、

```php
use Cake\Http\Exception\NotFoundException;
```
エラーが解消されました。

## 一応解消
取り敢えず問題はないようなあるような。
case_aliasが使われてるのは互換性維持が目的のパターンが多いと思うので自分で使う分は気を付けてれば問題ないかな。

## 関連
class_alias が認識できないみたいなんだけどどーよ、みたいな報告が過去に上がってるみたいですけど、今どうなってるんでしょ。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=522550

## 環境
|||
|:-:|:-:|
|EclipsePDT  |[Eclipse 4.8 Photon](http://mergedoc.osdn.jp/#pleiades.html) (EclipsePDT 6.0.0)|
|[XAMPP](https://www.apachefriends.org/jp/index.html)|7.2.9|
|PHP|7.2.9|
|CakePHP|3.6|
|Composer|4.8|
|OS|Windows7|
Flow on VSCode

※ (flowをdisるつもりは) ないです。

ちょっと前から、E2E自動テストを組むためにNodeを使っています。
最近はJavaだろうがPythonだろうがRubyだろうが、なんでもかんでもVSCodeで書いています。もちろん今回のJSだって例外ではありません。
もともとこのツールを書いていた現場プロパーはVimmerで、どうせ (入力済み文字列の補完の方だけで十分だから) 使いやしないけど、と適当にflowだけ入れていたそうなのですが……

# あの、flowさん？
flowは公式でVSCode向けに拡張機能を供給しています。

端的に言いましょう。**使ってはいけません**。
あるいはよっぽどマシンパワーがあるならそこまで問題でもないかもしれませんが。

どういうわけか、VSCode向けのflowは (Javaの言語サーバよかよっぽどマシではありますが) 高負荷です。
どうやら無闇矢鱈とflowのプロセスを濫造する上、稀ですがキルに失敗してリーク (厳密にそう言うべきかは微妙ですが) を引き起こすこともあります。

おまけに (これはいわゆる "おま環" 案件であってほしいものですが) 型推論周りがよろしくないのか、CLIから叩いたものと結果が違うのは序の口。型ヒント付きの引数を引っ張り込んだものの型を認識してくれないことすらある始末です。

もう一度言います。**VSCodeで、flow公式が供給する拡張機能を使ってはいけません**。
あ、公式でない方のは大丈夫でした。一体何がそこまで違うのか……
Dockerコンテナ上でCronを動かしたい

Dockerコンテナ上でCronを使いたい時に、下記の様な事が気になります。

・cronが起動するタスクでは、Dockerコンテナ起動時の環境変数が引き継がれない
・ログは標準出力に書き出してdocker logsでログを拾える様にしたい

調べて見ると,いちいち環境変数を読み込み直して...みたいな感じでもいいものの,こういう時は[busybox](https://busybox.net/) に含まれるcrondを使うと楽なようです。

参考:
[DockerでcronしたいときはBusyBox crondが便利](https://shimoju.org/2017/10/09/busybox-crond/)
[debian ベースの Docker コンテナで busybox の cron を実行](https://ngyuki.hatenablog.com/entry/2017/04/18/195254)

以降は参考にした記事に記載されている内容と同一ですが、自分の環境でも試してみたのでその手順を残しておきます。

インストール(Debian系)
※AlpineLinuxの場合はcrondでそのまま使えます

```
apt-get install -y busybox-static
```

## 試してみる
Dockerfileはこんな感じ(ベースイメージはDebian系ならなんでもOK)

```Dockerfile
FROM openjdk:8-jre
MAINTAINER TOMOHIRO YOSHIE

# インストール
RUN apt-get update && apt-get install -y \
  busybox-static \
  && apt-get clean

# タイムゾーン設定
ENV TZ=Asia/Tokyo

# crontabファイルをコピー
COPY crontab /var/spool/cron/crontabs/root

# busybox crond -f -L /dev/stderr
CMD ["busybox", "crond", "-f", "-L", "/dev/stderr"]
```

crontabファイルはこんな感じ.

```
* * * * * echo '=== environment variables ===' && env
```

コンテナを起動すると,cronが動いて環境変数を引き継げていることが確認できた.

```
[~/work/docker/tmp]# docker build . -t test/crond
[~/work/docker/tmp]# docker run -e FOO=BAR --rm test/crond
crond: crond (busybox 1.22.1) started, log level 8
crond: USER root pid   5 cmd echo '=== environment variables ===' && env
=== environment variables ===
USER=root
HOSTNAME=00de830b4ede
HOME=/root
JAVA_VERSION=8u151
CA_CERTIFICATES_JAVA_VERSION=20170531+nmu1
JAVA_DEBIAN_VERSION=8u151-b12-1~deb9u1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
FOO=BAR
LANG=C.UTF-8
SHELL=/bin/sh
JAVA_HOME=/docker-java-home/jre
PWD=/root
TZ=Asia/Tokyo
```
XMLHttpRequest で リクエストメソッドが  GET なのに OPTIONS リクエストが送信される

# 概要
`XMLHttpRequest` で `GET メソッド` を指定しているのに `OPTIONS メソッド` が送信される事がありました。 

`XMLHttpRequest` でパラメータなどは正しいのに、正しくリソースが取得できないときに役に立つかもしれません。

# XMLHttpRequest の実装
`GET メソッド` を指定しているのに `OPTIONS リクエスト` が送信されるコードは下記のようなものでした。 
単純に `GET メソッド` で指定した URL にリクエストを送信するものです。

```js
var request = new XMLHttpRequest();
request.open('GET', 'https://hoge');

request.onload = function() {
  if (this.status >= 200 && this.status < 400) {
    var data = JSON.parse(this.response);
  }
};

request.send();
```

しかし、上記のようなリクエストを送ると、 `GET メソッド` ではなく `OPTIONS メソッド` が送信されます。
これは、 `プリフライトリクエスト` を行う条件を満たしているためです。

## プリフライトリクエスト
プリフライトリクエストは `OPTIONS メソッド` をサーバへ送信して、本来送信したいリクエストが安全かどうかを確かめるものです。
プリフライトリクエストの流れは下記のようなものです。

1. `OPTIONS メソッド` をサーバへ送信
2. サーバは許可しているリクエストメソッドやリクエストヘッダなどをクライアントへ返信
3. 本来のリクエストを送信

### プリフライトリクエストが送られる条件
下記の条件を満たすリクエストは最初にプリフライトリクエストを行います[^1]。

[^1]: [オリジン間リソース共有 (CORS) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control) から抜粋

* リクエストが以下のメソッドのいずれかを使用した場合。
  * PUT
  * DELETE
  * CONNECT
  * OPTIONS
  * TRACE
  * PATCH
* または、ユーザーエージェントによって自動的に設定されたヘッダー (たとえば Connection, User-Agent, または Fetch 仕様書で "forbidden header name" として定義されている名前のヘッダー) を除いて、 Fetch 仕様書で "CORS-safelisted request-header" として定義されている以下のヘッダー以外のヘッダーがリクエストに含まれている場合。
  * Accept
  * Accept-Language
  * Content-Language
  * Content-Type (但し、下記の要件を満たすもの)
  * DPR
  * Downlink
  * Save-Data
  * Viewport-Width
  * Width
* または、 Content-Type ヘッダーが以下の値以外の場合。
  * application/x-www-form-urlencoded
  * multipart/form-data
  * text/plain
* または、リクエストに使用される XMLHttpRequestUpload オブジェクトに1つ以上のイベントリスナーが登録されている場合。
* または、 ReadableStream オブジェクトがリクエストで使用されている場合。

今回は、 `Content-Type` を指定していないために 
>Content-Type ヘッダーが以下の値以外の場合。

を満たしているので `OPTIONS メソッド` で送信されていました。

# まとめ
仕事で `GET メソッド` でリソースを取得して表示するときに、サーバからエラーが帰ってきて詰まったので書きました 。
その時は、下記のことが原因でリソースを取得できませんでした。

* サーバが `OPTIONS メソッド` を許可していなかった。
* リクエスト内容が `プリフライトリクエスト` を送信する条件を満たしていた。

みなさんも上記のようなときは、リクエスト内容やサーバの設定を確認してみてください。

# 参考
[オリジン間リソース共有 (CORS) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control)
http://takapi86.hatenablog.com/entry/2017/09/18/172846
AIにCartPoleゲームを遊んでもらった

# AIにCartPoleゲームを遊んでもらった

## 背景

FAQボットに関して、「役に立ったか？」の質問で、皆さんのYes/Noの回答によって、より回答の精度を上げたい。

強化学習は上記を対応できそう。現在はその中の一つの手法（Deep Q-learning）を勉強中。

入門編は、CartPoleと言うゲームをAIが学習して遊ぶ。

参考コードをDLして色々弄ってみた。

![animation.gif](https://qiita-image-store.s3.amazonaws.com/0/153042/f9c6a279-0d59-b505-72ea-7d602bb3c80d.gif)


### どんなゲーム

<http://fluxml.ai/experiments/cartPole/>

### AIの学習の様子

デモ

```
$ python3 dqn.py
```

## 実現の仕方

![dqn-image.png](https://qiita-image-store.s3.amazonaws.com/0/153042/71b4f217-f0c2-21e7-60ba-a6693a13ca90.png)


### 擬似コード

```

ゲーム状態初期化(state)

	冒険か・推測かを決める
	
	アクション(action)を選択する
	
	報酬(reward)及び次の状態(new_state)を入手
	
	上記の経験を記憶する
	
	状態を更新（state = new_state）
	
	記憶した経験から訓練用データを抽出
	
	学習（推測精度を高めるようパラメータ更新）
	
	繰り返し（アクション）
	
繰り返し（ゲーム）

```

## 今後の発展

* FAQボットの改善
* ゲームの自動プレー？？

### Usage

```
$ python3 dqn.py
```


## 参考

[1] <http://fluxml.ai/experiments/cartPole/>

[2] <https://medium.freecodecamp.org/an-introduction-to-reinforcement-learning-4339519de419>

[3] <https://keon.io/deep-q-learning/>
【Netlify】ドラッグ＆ドロップでWEBサイトを公開する

# Netlifyとは

WEBサイトのホスティングサービス
https://www.netlify.com/

![netlify.png](https://qiita-image-store.s3.amazonaws.com/0/141934/36200c1e-9c92-8376-964d-7113cf0ef524.png)

# Netlifyに関する投稿
- [Netlify / GithubPages / Heroku の速度比較](https://qiita.com/NaokiIshimura/items/0b6c4ff5da437081866b)
- ドラッグ＆ドロップでWEBサイトを公開する ←今回の投稿
- [Github連携でWEBサイトを公開する](https://qiita.com/NaokiIshimura/items/9f12805af85c9be22814)
- [カスタムドメインを設定する](https://qiita.com/NaokiIshimura/items/64e060ccc244e38d0c15)
- [Forms機能を利用して問い合わせフォームを作成する](https://qiita.com/NaokiIshimura/items/bce2f0b865ec1bc16a53)

---

# サイト作成

管理コンソール下部の破線で囲まれた部分にソースが含まれたフォルダをドラッグ＆ドロップするだけでサイトが作成される

![dd01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/dc6482eb-373a-7ac3-086a-fff29ee95f0e.png)
![dd02-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/687a713b-4e98-ab5a-a602-efeb9c9be211.png)
![dd03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5574a83c-efde-cdbe-4a95-c88c0db43863.png)
![dd04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/d13ba4d8-8c8f-6f0a-6a34-69409cd49e9a.png)

# アクセス確認

サイトが作成されるとURLが払い出されるのでブラウザでアクセスする

![dd05-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/af3b4e8d-ea56-b21c-4353-5157bcb1b286.png)
![dd06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/2051c5a4-357a-b7fd-bdb5-2dd64d5b8de9.png)

# サイト更新

サイトの更新もフォルダをドラッグ＆ドロップするだけで行える。

![dd11-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5c94f319-231e-90a1-e704-186ee3a064cc.png)
![dd12-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/72d81279-856d-2b61-8021-b6724d637011.png)
![dd13.png](https://qiita-image-store.s3.amazonaws.com/0/141934/f10365d0-d4aa-d965-c90d-2243a8736792.png)
![dd14-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ea39fed7-38d0-98a2-d8fc-110981574907.png)
CoreOSなどに latest な docker-compose を入れるスクリプト

2019/01/30 追記
/opt/bin ディレクトリが無いみたいなので、作るように修正しました。

=======

## 結果

最終的には、これ

``` bash
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
OUTPUT_PATH="/opt/bin"
sudo mkdir -p ${OUTPUT_PATH}
sudo curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o ${OUTPUT_PATH}/docker-compose
sudo chmod +x ${OUTPUT_PATH}/docker-compose
docker-compose -v
```
CoreOS以外、curlが無いやつでも使えるように、wget版↓

``` bash
COMPOSE_VERSION=$(wget -q https://api.github.com/repos/docker/compose/releases/latest -O - | grep 'tag_name' | cut -d\" -f4)
OUTPUT_PATH="/opt/bin"
sudo mkdir -p /opt/bin
sudo wget -L -q "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -O ${OUTPUT_PATH}/docker-compose
sudo chmod +x ${OUTPUT_PATH}/docker-compose
docker-compose -v
```

バージョンが表示されたらオッケー

## 経緯

docker-compose の公式にも特定バージョンを指定した curl しか載ってなかった・・・
latest を追い求める自分()としてはイケテナイです

### curl する url を洗い出す

https://gist.github.com/deviantony/2b5078fe1675a5fedabf1de3d1f2652a
ここを参考にしました

↓引用

``` bash
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
```

githubのlatestページからtag_nameをgrepして、tag情報だけ切りきり...
なるへそ

### 配置場所を決める

echo $PATH してみる

``` bash
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/bin
```

/usr 配下は ReadOnly みたい・・・
/opt/bin に決定
Ubuntu18.04にVagrantをインストールする

## vagrantのインストール

```bash
> sudo apt-get install virtualbox
> sudo apt-get install virtualbox-ext-pack
> sudo apt-get install vagrant
```

## ubuntuイメージの作成

```bash
> mkdir -p ~/Vagrant/ubuntu18
> cd Vagrant/ubuntu18
> vagrant init ubuntu/bionic64
```

- ~/Vagrant下にイメージファイルを作成することにしました
- 今回はVagrantファイルは特に編集せず

## 起動

```bash
> vagrant up --provider virtualbox
```

- 初回はイメージのダウンロードに30分くらいかかった

## 作成したイメージへのアクセス

```bash
> vagrant ssh
```

  - id:vagrant, pass:vagrant
  - ssh時は自動で作った鍵を使ってアクセスする

## 停止

```bash
> vagrant halt
```

## 参考

- http://www.linuxbuzz.com/install-virtualbox-ubuntu-18-04-lts/
- http://www.codebind.com/linux-tutorials/install-vagrant-ubuntu-18-04-lts-linux/
値段を予測するAIを作ってみた

# 値段を予測するAIを作ってみた

## 背景

メルカリが値段をAIでサジェストしてくれる記事を見た。

実際Kaggle上にデータと参考のソースコードがあるため、自分でも作ってみた。

こんな感じ

![price01.png](https://qiita-image-store.s3.amazonaws.com/0/153042/a8048dca-ffcf-0d18-b992-39c33bf0136f.png)

デモ

平均の誤差(RMSLE)は0.69で、1400位くらい。
平均の値段の誤差は16ドルくらい。


1位は0.37。


[github ソース](https://github.com/thunderz99/price-recommend)

### Usage

```
$ python3 web.py

$ open http://localhost:5000

```


## 実現の仕方

### データを見る

![price02.png](https://qiita-image-store.s3.amazonaws.com/0/153042/491058cf-2d5b-bc95-f467-a6855e74caa7.png)


### データを加工する

* 名前・カテゴリ・説明をVector化 (tf/idf)

```
"MLB Cincinati Reds T Shirt Size XL"
↓
[0.1, 0.12, 4.2, 6.1, 1.5, 3.5, 4.8]
```

* ブランド・コンディション・送料オプションをOne-hot Vector化

```
"Apple", "Sony", "Samsung", "Missing"
↓
[1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]
```

### 違うフィーチャーをつなぐ
[0, 0, 0, 1, 0.1, 0.12, 4.2, 6.1, 1.5, 3.5, 4.8]


### モデル

* 勾配ブースティング木(Gradient Boosting Decision Tree)
  * マイクロソフトのLightGBMライブラリを使用
  
![price03.png](https://qiita-image-store.s3.amazonaws.com/0/153042/6a1b3618-a5ba-9ab1-aaed-815e265b8710.png)

#### 勾配ブースティング木の強み
* 表形式データに向いている
* モデルは簡単
* 訓練・推測は早い
* 推測ロジックは説明しやすい

#### ニューラルネットワークの強み

![price04.jpeg](https://qiita-image-store.s3.amazonaws.com/0/153042/29969252-272d-6a9b-810a-7a1c26060b0a.jpeg)

* 画像・音声・ビデオ・自然言語処理（認識・生成）
* モデルはたくさんのバリエーションがある
* 大量データの時より精度向上

## 今後の発展

* いろんなフォームデータから、結果を推測・分類するタスクに活用できそう
  * 与信判断？ プロジェクト健康度判断？ 
* Word2VecでテキストのVectorを強化
* CNN/RNNで精度向上？


## 参考

[1] <https://towardsdatascience.com/machine-learning-for-retail-price-suggestion-with-python-64531e64186d>

[2] <https://www.kaggle.com/c/mercari-price-suggestion-challenge>

[3] <https://qiita.com/TomokIshii/items/3729c1b9c658cc48b5cb>

[4] <https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf>

[5] <https://www.quora.com/Why-is-xgboost-given-so-much-less-attention-than-deep-learning-despite-its-ubiquity-in-winning-Kaggle-solutions#>
GOOGLE CLOUD CERTIFIED Professional Cloud Architect取得しました

# はじめに
GOOGLE CLOUD CERTIFIED Professional Cloud Architectを取得しました。
どのように勉強したか、問題の傾向等を記載します。
今後受験する人の参考になればと思います。

受験料が$200もするし、落ちたくはないですもんねｗ

<img width="833" alt="スクリーンショット 2018-09-09 12.50.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/467974b9-b703-9615-52a2-30f31b23520c.png">


## 筆者のスペック
* インフラ担当
* 業務でGCP,AWSを使っている
* 3年前にCP300(ComputeEngine,CloudStorage,CloudSQLの3科目)を取得した

## 勉強方法

### 試験の概要を知る
https://cloud.google.com/certification/cloud-architect

50問 / 2時間 だが、私の場合は大体１時間くらいで終わって出てきた。
基本的に知ってるか知らないかの問題が多く、考えて答えが出るわけでもない。

試験ガイドは以下に書いてあるが、どれを見れば良いのかがよく分からないと思う。
深い知識ではなく、浅く広い知識を問われる。
https://cloud.google.com/certification/guides/cloud-architect/#certificate-exam-guide

### 模擬試験を受ける
**無料**で何度でも受けられる模擬試験があるので、これを何回もやって問題のレベル感と自分のレベルや苦手分野を知る。
https://cloud.google.com/certification/practice-exam/cloud-architect 

私の場合は、業務でDatastoreやBigtableやDataProcを使ってなかったので、この辺の知識が弱かったことがわかった。
逆にComputeEngineやNetworkやKubernetesEngineやCloudStorageなどは大体イケることも分かった。
また、機械学習やIoTなど最近の技術も知っていないと太刀打ちができないということも分かった。


### ケーススタディを読み込む
問題の多くはこのケーススタディから出てくる。
https://cloud.google.com/certification/guides/cloud-architect/#sample-case-study

そのため、このケーススタディの場合はどのようなサービスを使って要件を満たせばいいかを自分なりに考えて、各ケーススタディのアーキテクチャの図を書く。
(まぁ、このケーススタディのアーキテクチャの図を書くために下記の公式ドキュメントを読むことになる)

### 公式ドキュメントを読む
公式ドキュメントを読むのが大事。
とは言うものの、AWSほどではないけどGCPの公式ドキュメントもなかなかのボリュームになっているから全部読むことは無理(というか辛い)。
そして、CP300みたいな細かい仕様の問題はあまり出てこない。

なので、各プロダクトの公式ドキュメントの`概念(Concepts)`部分は必ず読む。
ドキュメント内に、DatastoreとBigtableはどう使い分ければいいの？とか、CloudStorageのストレージクラスの違いとかがあるのでそこは抑えておいたほうがいい。

あと、ソリューション系を読んでおいたほうがいい。
例えば以下のようなやつ

* [PCI-DSS 準拠の環境の作成](https://cloud.google.com/solutions/securing-gcp-account-security-keys?hl=ja)
* [専用ゲームサーバーの移行ガイド](https://cloud.google.com/solutions/gaming/dedicated-game-server-migration-guide?hl=ja)


## 試験後
試験後に合否がすぐに出てくるが、`暫定 合格`と出てくる。
多少不安にはなるものの、こういうもんらしい。

翌日に正式な合否が書いてあるメールが来るので、それで一安心。

この4アイテムから欲しいものを選んでねって書いてあるからチョイス。
私はNorthFaceだし、作りが良さそうだと思ってPulloverにした。
![スクリーンショット 2018-09-08 11.00.19.png](https://qiita-image-store.s3.amazonaws.com/0/33101/c79eb144-fd80-0f23-1e1f-885478f026a3.png)
Go get でインストールしたパッケージをきれいに削除する方法

go get コマンドでインストールした外部ライブラリの削除方法がイマイチ分からなかったので、自分のメモ用として残します。
だれかのお役に立てれば幸いです。

# 外部ライブラリの削除
具体例があるとわかりやすいと思い、以下のケースを想定してみます。
## 例） gocodeの削除
ここでは `gocode` の入れ替えを想定してみます。

これまで gocode は `github.com/nsf/gocode` で管理されていたのですが、2018/5/2時点で `github.com/mdempsky/gocode` に移行されました。

そこで、上記の移行を行うために既存の外部ライブラリを削除してみたいと思います。

```
go clean -i -n github.com/nsf/gocode
```

以下の内容が表示されるので、削除内容を確認します。

```
  cd $GOPATH/src/github.com/nsf/gocode
  rm -f gocode gocode.exe...(略)
```

以下のコマンドを実行することで、前述のコマンド群が実行されます。

```
go clean -i github.com/nsf/gocode
```

最後に、src以下に残っているものを削除します。

```
ls $GOPATH/src/github.com/nsf
rm -rf $GOPATH/src/github.com/nsf 
```

# 結び
`go clean -i` を利用することで、パッケージの削除が容易にできます。 
ただし、go clean コマンドではsrc以下は削除されないので rm コマンド等で削除してあげる必要があります。
AIにりんごを描いてもらった

# AIにりんごを描いてもらった

## こんな感じ

### 生成結果(64x64 png)

![apple_500.png](https://qiita-image-store.s3.amazonaws.com/0/153042/f86acb10-982b-1dc6-1549-dd75f1a8192b.png)  ![banana_500.png](https://qiita-image-store.s3.amazonaws.com/0/153042/d809e3c7-f05e-8332-fe71-d2e987918c53.png)


### 途中結果

![apple_000.png](https://qiita-image-store.s3.amazonaws.com/0/153042/f7333892-7d03-5457-8a84-c4681053edbc.png) ite0


![apple_020.png](https://qiita-image-store.s3.amazonaws.com/0/153042/f3a00333-9d71-f715-523e-2981f2a725c9.png) ite20

![apple_100.png](https://qiita-image-store.s3.amazonaws.com/0/153042/476263ee-2dc1-3b93-e876-596a90e61457.png) ite100

![apple_200.png](https://qiita-image-store.s3.amazonaws.com/0/153042/e15f6a95-4a11-12bc-acb9-09a3d63d42eb.png) ite200

![apple_300.png](https://qiita-image-store.s3.amazonaws.com/0/153042/677f7e90-10f3-060e-eb15-60c93927bfef.png) ite300

![apple_400.png](https://qiita-image-store.s3.amazonaws.com/0/153042/60eefbd7-bef9-0cfc-42a5-76e5248958a9.png) ite400

![apple_500.png](https://qiita-image-store.s3.amazonaws.com/0/153042/f86acb10-982b-1dc6-1549-dd75f1a8192b.png) ite500


## 背景

最近GAN（Generative Adversarial Network）で、いろんな画像を自動生成したり、ポスターも生成するなどの記事はたくさん目に入る。

どこまで出来るかを試してみたかった。


## 実現の仕方

![gan.png](https://qiita-image-store.s3.amazonaws.com/0/153042/a1cd09d8-2da4-e275-c94e-d2e9e64b597b.png)

こちら数字画像生成のgithubソースを参考し、改造した。 [2]

![digits.png](https://qiita-image-store.s3.amazonaws.com/0/153042/6ee2dc28-997f-b48f-ac4e-bcf095bcee35.png)

## わかったこと

* Convolution Networkの方は、Full Connected Networkより、生成した画像がスムーズ。 Full Connected Networkの場合は、どうしても雑音が入る。

* 通常のGANはハイパーパラメータに敏感。収束しないことがある。より安定性のあるDRAGANなどは今後試すべき。


## Usage

[github source](https://github.com/thunderz99/keras-fruit-gan)


```
$ python3 origin-dcgan.py
```


## 参考

[1] <https://oshearesearch.com/index.php/2016/07/01/mnist-generative-adversarial-model-in-keras/>

[2] <https://github.com/osh/KerasGAN>

[3] <https://medium.com/towards-data-science/gan-by-example-using-keras-on-tensorflow-backend-1a6d515a60d0>
Ruby on Railsで外部のcssを読み込む方法

## Ruby on Rails自分用備忘録

Ruby on Railsの既存プロジェクトを引き継いだ。そもそもRubyもRailsも触ったことがなかったけど、フルスタックフレームワークって何ぞやってことは、概ねDjangoで理解してたし、Rubyみたいなモダン言語は別に勉強しなくても、まあなんとなく雰囲気でいけるんじゃん。言語よりフレームワークの使用を覚えるのが面倒臭かった。ほら、フルスタックフレームワークって設計者の癖がより色濃く出るじゃんね。んで、早速「ん？」ってなった箇所があったので、書き留めておこうと思う。なんでもかんでも、できることなら正確に理解した今日この頃。

## どうやってcssを読み込めばいいんだろう

`slim`から`css`を個別に読み込んでる感じ？とか思ったけど違った。`slim`から`css`を呼び出してない。なのに`css`が反映されている。なんじゃこりゃ。んで、勉強して知った。Railsでは、というか、どうやら少なくともこのプロジェクトでは、`View`の`Layout`の`application.html.slim`というところがあり、そこはいつも書くコードを自動化するためにあるらしくて、そこに下記のように書くと ...

```rb
= stylesheet_link_tag 'application', media: 'all'
```

アプリ全体で共有する`css`になるらしい。これはRailsの組み込み関数で、`stylesheet_link_tag` (詳細はRails APIを参照) を使って、`application.css.sass`をすべてのファイルで読み込んでいる。それで、`application.css.sass`で、こんな風に、自分で独自のcssを追加した。

```sass
@import 'modules/invoice'
@import 'modules/slider-pro'

//独自に追加した
@import 'test_css/testcss'
```

んで、上記のように書いたら、独自に作ったcssが、全部のページに適応された。下記のように書けば、アプリ全体でボディの背景色が緑色になった。

```sass
body
  background: green
```

でも、こういうやり方って普通なんだろうか。これじゃ、名前衝突が起きないのだろうか？名前衝突が起きないためには、普通は`stylesheet_link_tag`をもう少しなんとか使って、`application.css.sass`に、全部のcssを書いて、全てのcssを全てのファイルでシェアするのは、良いことなんだろうか。わからない、わからない、わからない。
git で特定のブランチだけ複数のリモートリポジトリに push する

# 経緯
普段プライベートリポジトリで開発しているものを，master ブランチだけ公開したくなりました．

# 編集
もっとスマートな方法があるのかもしれませんが，以下のように `.git/config` を編集したらできました．
`[remote "public"]` を定義し，push 先の URL を複数指定しています．

## Before
```config:.git/config
...
[remote "origin"]
	url = https://github.com/<private repository>/hoge.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[branch "develop"]
	remote = origin
	merge = refs/heads/develop
...
```

## After
```diff:.git/config
 ...
 [remote "origin"]
	 url = https://github.com/<private repository>/hoge.git
	 fetch = +refs/heads/*:refs/remotes/origin/*
+[remote "public"]
+	 url = https://github.com/<private repository>/hoge.git
+	 url = https://github.com/<public repository>/hoge.git
+	 fetch = +refs/heads/*:refs/remotes/origin/*
 [branch "master"]
-	 remote = origin
+	 remote = public
	 merge = refs/heads/master
 [branch "develop"]
	 remote = origin
	 merge = refs/heads/develop
 ...
```

# まとめ
`.git/config` を編集すると，複数リポジトリに push することができます．
これ以外にもブランチごとに様々な設定ができそうです．
好みのエディタで日報を書く仕組み(zsh)

# 前提

* 以下環境で使うことを前提にしているので誰しも恩恵を受けられる話ではないかも知れない
    * Mac (というか open コマンドに依存した記述になっている)
    * zsh
    * GNU screen

* 以下は他のソフトウェアであっても十分代替可能なのではないか
    * Typora
    * GNU Core Utilities関連のコマンド

# やりたいこと
* 日報を書きたいよね
* 毎日自然と、半ば強制的に当該日ファイルが開かれると書き込めるまで腰の重さがなくていいよね
* アプリ切り替えのショートカットでフォーカスが切り替えられるほうがいいよね
    * ブラウザだとやだよね、ということ

# 考えたこと

## 以下を実現することはとても容易い

* markdownで日報を書きたい
    * 書けば良い
* 好きなEditorで書きたい(開きたい)
    * 開けば良い(Macには `open` がある)

## 使い勝手を考え以下を考慮するとちょっとめんどい

* 当該日ファイルが存在しないならばファイルを作成する
* すでに指定エディタで当該日ファイルを編集状態であれば何もしない
* 当該日ファイルが編集状態でなければ指定エディタでファイルを開く

# markdown生成および上記を考慮したやつ

* 雑なスクリプト(おなじことをそれぞれ別のやり方でやっているように見えるが気にしないで……)
  * ディレクトリ作る
  * ファイル作る
  * 指定エディタでファイルを開いていなければ `open` で開く
* なおDropboxの下に作ってるので、あなたがそうでなければ読み替えされたい

```bash:${HOME}/Dropbox/paht/to/hoge.sh
#!/bin/bash

function date_or_gdate()
{
  which gdate >/dev/null 2>&1 && echo "gdate" || echo "date"
}

DATE=$(date_or_gdate)
PREFIX="${HOME}/Dropbox/LogDiary"
TODAY_DIR="$(${DATE} \+'%Y/%m')"
TODAY_MARKDOWN="$(${DATE} \+'%Y-%m-%d.md')"
TODAY_TITLE="$(${DATE} \+'%Y/%m/%d')"
MARKDOWN_EDITOR_PROC="Typora"

ls -d ${PREFIX}/${TODAY_DIR} >/dev/null 2>&1
res=${?}
if [ ! "${res}x" = "0x" ]; then
  mkdir -p ${PREFIX}/${TODAY_DIR}
  echo "Genarated Dir."
fi

ls -f ${PREFIX}/${TODAY_DIR}/${TODAY_MARKDOWN} >/dev/null 2>&1
res=${?}
if [ ! "${res}x" = "0x" ]; then
  echo -e "# ${TODAY_TITLE}\n" >> ${PREFIX}/${TODAY_DIR}/${TODAY_MARKDOWN}
  echo "Genarated Markdown."
  open ${PREFIX}/${TODAY_DIR}/${TODAY_MARKDOWN}
fi

pgrep ${MARKDOWN_EDITOR_PROC} >/dev/null 2>&1 || open ${PREFIX}/${TODAY_DIR}/${TODAY_MARKDOWN}
echo ${PREFIX}/${TODAY_DIR}/${TODAY_MARKDOWN}

```

# `~/.zshrc`　にhoge.shを実行するよう記述

```~/.zshrc
# LifeLog
genlifelog="${HOME}/Dropbox/path/to/hoge.sh"
bash ${genlifelog}
```

上記記述を追加することで
screenで新しいWindowを生成するごとに `hoge.sh` が実行されることになる。
`pgrep` でprocess状況を確認しているので、すでに編集状態なら何もしないのでうれしい。

# と思ったが

:thinking: .oO(これたとえばTyporaで他のファイル編集してたら open 日報ファイル.md しないのでは……)
kotlin ラムダ備忘録

kotlin でラムダを使っている時にはまったポイントを備忘録として残す

#1. スコープのつもりで、{}で囲むと挙動しない.(lambdaの中での{}はlambda)

```kotlin:オリジナルコード
    fun lambdas() {

        val testDigit = hashSetOf("A", "B", "C")
        System.out.println("-- NG")
        testDigit.forEach { it -> { System.out.println(it) } }

        System.out.println("-- OK")
        testDigit.forEach { it -> run { System.out.println(it) } }

        System.out.println("-- OK")
        testDigit.forEach { it -> System.out.println(it) }

    }
```

```kotlin:結果

-- NG
何もなし

-- OK
A
B
C
-- OK
A
B
C

```


### decompileした

特に lambdaの中で、{} を切っているので、lambdaとして扱われているということで。

```java:Decompile
   public final void lambdas() {
      HashSet testDigit = SetsKt.hashSetOf(new String[]{"A", "B", "C"});
      System.out.println("-- NG");
      Iterable $receiver$iv = (Iterable)testDigit;
      Iterator var3 = $receiver$iv.iterator();

      Object element$iv;
      String it;
      while(var3.hasNext()) {
         element$iv = var3.next();
         it = (String)element$iv;
         new streamsTest$lambdas$1$1(it);
      }

      System.out.println("-- OK");
      $receiver$iv = (Iterable)testDigit;
      var3 = $receiver$iv.iterator();

      while(var3.hasNext()) {
         element$iv = var3.next();
         it = (String)element$iv;
         streamsTest $receiver = (streamsTest)this;
         System.out.println(it);
      }

      System.out.println("-- OK");
      $receiver$iv = (Iterable)testDigit;
      var3 = $receiver$iv.iterator();

      while(var3.hasNext()) {
         element$iv = var3.next();
         it = (String)element$iv;
         System.out.println(it);
      }

   }


　<snip>...

final class streamsTest$lambdas$1$1 extends Lambda implements Function0 {
   // $FF: synthetic field
   final String $it;

   // $FF: synthetic method
   // $FF: bridge method
   public Object invoke() {
      this.invoke();
      return Unit.INSTANCE;
   }

   public final void invoke() {
      System.out.println(this.$it);
   }

   streamsTest$lambdas$1$1(String var1) {
      super(0);
      this.$it = var1;
   }
}

```
phalcon ﾘｸｴｽﾄ 覚書

頭のぶぶん

```php
<?php
	use Phalcon\Mvc\Controller;
	use Phalcon\Mvc\Model\Criteria;
	use Phalcon\Http\Response;
	use Phalcon\Http\Request;
	class HogeController extends \Phalcon\Mvc\Controller
	{
```

* getﾘｸｴｽﾄ

```php

public function getAction()
{
	$req=$this->request->get();
}
```

* postﾘｸｴｽﾄ

```php
public function postAction()
{
  	$req=$this->request->getPost();
}
```

* putﾘｸｴｽﾄ

```php
public function putAction()
{
	$req=$this->request->getPut();
}
```

deleteリクエストだけコントローラ側で受け取る関数が見当たらない(*deleteリクエストか否かの判別 ``$this->request->isDelete();``はある)のだけども...
``$this->request->getRawBody();``で生のリクエスト文から扱いたい値を``substr();``とかで抽出するしかないのかしら?
それってとてもﾒﾝﾄﾞｸｻｲﾏﾝ
脳みそ貧弱なｵｼﾞｻﾝにわかるように教えてくさい


例によって例の如く,この記事で何かしらの問題が発生しても当局は一切関与しない。
なおこのメッセージは5秒前に消滅する
Kotlinのシーケンスについて処理速度の考察

Kotlinにおけるコレクション遅延操作の仕組みである**シーケンス**のパフォーマンスについて調査しました。
実際にサンプルコードを動かしてみた時の処理速度を元に、使うべきケースについて考察しました。

調査に使ったソースコードはこちら
https://gist.github.com/asksaito/4e3259179509a94ce4e092b40dc33f69

# Sequenceの特徴
シーケンスに対する操作は中間操作と終端操作という2つに分かれています。
中間操作は遅延実行され、終端操作が実行されたときになって初めて処理がされるという特徴があります。
これにより、不要な操作を大幅にカットすることが出来る場合があり、処理速度の面で利点があります。

書籍Kotlinイン・アクションでは、シーケンスを使うべきケースにおいて以下の指標が記載してありました。
「原則として、**大きな**コレクションに対してチェインした操作を行うときには、シーケンスを使用します。」(p.158)

## 拡張関数asSequenceにはそれなりにコストが掛かる
Iterable<T>の拡張関数であるasSequence()の実行にはそれなりにコストが掛かるので、小さいコレクションへの操作の場合は逆に遅くなるかと思ったら、影響はそれ程でも無かったです。
ですが、変換にコストが掛かることは一応頭の片隅にでも置いておいた方が良さそうです。
大きなコレクションに対しての操作の際は、多くの場合シーケンスに変換してから処理した方が問題なく高速になるようです。
また、チェインの段数が増える程シーケンスの方が有利になります。(一時的なリストを作らないで処理できるため)

## 特定の中間操作の場合は速度が劇的に速くなる
kotlin.sequencesのリファレンス
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/index.html

上記の関数の中で戻り値がSequence<T>になっているものが、中間操作ですね。(多分)
シーケンスを使ったほうが良さそうなものを挙げてみます。

### 必須
コレクションをすべて走査しなくても処理が終わるもの

- take

など

### 推奨
コレクションの要素の数を減らせるもの

- distinct
- filter
- filterNot
- drop

など

# まとめ
大きなコレクションに対して多段のチェイン操作をする場合には、気軽にasSequenceでシーケンスにしてから処理しても良さそうでした。
多くの場合で速度面のデメリットは少なそうです。

また、シーケンスが速くなる場合の例としてtakeを使用する場合というのがよく挙げられますが、他に劇的に速くなる関数はあるんですかね？
原理的には、すべての要素を走査する前にバサッと処理を終わらせられる関数であれば、takeと同様の効果があると思いますがイマイチ良さそうなものを見つけられませんでした。

### おまけ
色々調べたら、Kotlin公式ブログにもシーケンス速度考察の記事がありました。。
後で読んで見よう・・
https://blog.kotlin-academy.com/effective-kotlin-use-sequence-for-bigger-collections-with-more-than-one-processing-step-649a15bb4bf
PhpstormでTinkerスクリプトをデバッグする

## 追記
一部記載ミスがあり補足 & 修正済みです。すみません・・

## はじめに
laravelのREPLであるTinkerですが、呼び出す際に下記のようにphpスクリプトを渡してあげると
そいつを実行してくれます。

```
php artisan script.php
```

これが色々な処理を手軽に実行できて便利なのですが、
実行時のデバッグがphpstormで簡単にできるので共有します。
（もちろんIntelliJでもできます）

## 前提
- ローカルのPHPでxdebugが設定済みであること

## やり方
- `Preference > Language & Frameworks > PHP` から、ローカルのPHPを指定し、xdebugが有効になっている必要があります。
<img width="1147" alt="CLI_Interpreters_と_Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/180075/af8936c2-7963-e879-48ca-fbf5019be4e8.png">


- Phpstormのメニューバー上部のあたりから `Edit Configurations...` を押し、  
 `Run/Debug Configuration` を開きます

<img width="289" alt="openlogi-api____Develop_work_openlogi-api__-___Library_Preferences_PhpStorm2018_2_scratches_tinker_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/180075/5fc02bfe-fcb5-44d4-41e2-482a9d9de338.png">

- `PHP Script` を選択し、下記のように設定します
  - `File`: プロジェクトのartisanファイルのパス
  - `Arguments`: PHPファイルのパス
  - Custom workin directory: `tinker <プロジェクトのパス>`

<img width="627" alt="Run_Debug_Configurations.png" src="https://qiita-image-store.s3.amazonaws.com/0/180075/62ff5809-9f96-b272-b571-3f478bb3c8f7.png">



- あとはPHPファイルにブレークポイントを貼って、上部メニューからゴキマークを押してあげればOKです

<img width="263" alt="openlogi-api____Develop_work_openlogi-api__-___Library_Preferences_PhpStorm2018_2_scratches_tinker_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/180075/14de27a0-2b7b-d82d-4df2-bbe3643879b0.png">

実行時はこんな感じ
<img width="538" alt="openlogi-api____Develop_work_openlogi-api__-___Library_Preferences_PhpStorm2018_2_scratches_tinker_php.png" src="https://qiita-image-store.s3.amazonaws.com/0/180075/a7e6807f-bc6b-3e07-ea0a-8f0d433262f9.png">

tinkerを叩いているだけなのでEloquentの操作とか色々試せて便利ですよ
ポート変更したESXiにVMRC経由でつなぐ

# 問題
ESXiのポート変更したらVMRCでコンソールが開けなくなった。

# 原因
VMRCから接続するときにポート番号が含まれていない。
設定ミス？

# VMRCを手動で作る
vmidを調べる
https://example.com:8080/ui/#/host/vms/3 ← この番号がvmid

VMRCでアクセス
vmrc://example.com:8080/?moid=3 ← vmidを指定