OmniAICreator/Qiita-1.07M huggingface dataset:
NHC サイト移転

[GeoCitiesが2019年3月末に閉鎖しました](http://www.geocities.co.jp/)。影響のないネットの出来事、よくあることの一つだと思っていました。仮想環境まわりでよくお世話になっている[NHC](http://www.geocities.co.jp/SiliconValley/2994/tool/nhc.html)がGeoCitiesにあったことに気づくまでは。

ネット検索しても出てこない。これはまずいと。

[Internet Archive](https://archive.org/web/)で[3月末時点のサイト状況](https://web.archive.org/web/20190330184459/http://www.geocities.co.jp/SiliconValley/2994/tool/nhc.html)を呼び出し、無事[移転先](http://euee.web.fc2.com/tool/nhc.html)に辿り着きました。

NHCはこれで一安心。

# NHCとは

[公式](http://euee.web.fc2.com/tool/nhc.html)に書かれているように、仮想イメージの変換を行うツールです。

VirtualBoxイメージ(vhd)とVMWareイメージ(vmdk)の相互変換によく使っています。とはいえ、VirtualBoxからはvmdkを直接扱えるし、VirtualBox公式ツール"VBoxManage"で変換する手もあるので、使っていない人も多いかもしれません。

以前FreeBSDをメインで使っていたころは、VMWareイメージの2GB分割化にもよく使っていました。その頃はFreeBSDのNTFSサポートがまだまだでした。そのため、FAT32を共用スペースとして、2GB分割したVMWareイメージの仮想端末をWindowsとFreeBSDで共通に使っていました。

実ディスクのイメージ化、イメージから実ディスクへの書き込みもできます。こちらはほとんどやったことがありません。過去に二、三回やったことがある程度です。

# 移転先なし

ブックマークに含まれていたGeoCitiesのサイトを見てみました。Qiita視点で有用かもしれないと思うサイトで移転先が見つからないものを、Archiveリンク付きで挙げておきます。

- [About WMI](https://web.archive.org/web/20190331001632/http://www.geocities.jp/maru3128/wmi.html)
Vue.jsをRails環境下で動かすための環境構築手順

# 参考サイト
https://qiita.com/jnchito/items/30ab14ebf29b945559f6
https://qiita.com/cohki0305/items/582c0f5ed0750e60c951
説明が丁寧でわかりやすい。

# 開発環境
ruby 2.6.2
Rails 5.2.3

# ゴール
ローカル環境下でRuby on RailsにVue.jsを動かす環境を構築する。

# 手順
通常のプロジェクトを作成
※DBMSにはpostgesqlを指定


```
$ rails new vue_app -d postgresql
```

```ruby:Gemfile
gem 'webpacker', github: 'rails/webpacker'
```
gemを入れたら、必ずbundle install

webpackerに関する参考サイト
https://blog.tai2.net/webpacker3.html
https://qiita.com/chimame/items/8d3d6f4afea675cffa7d

```command
$ yarn -v
```
上のコマンドでもしyarnのインストールをしていなかったら、インストールをする。

```command
$ rails webpacker:install
```
ここでwebpackerをインストール
***

このコマンドだけで、Vue.jsをインストールできる！

```command
$ rails webpacker:install:vue
```
***
# hello_vue.jsを使い、Rails上で動作させるための準備
```command
$ rails g controller homes index
```
適当に、コントローラー・アクション・ビューをコマンドで生成

```app/views/layouts/application.html.erb
<%= yield %>
    <%= javascript_pack_tag 'hello_vue' %> 
</body>
```
このタグを挿入する。
当たり前だが、CDNのインポートは必要ない↓

```
このタグの挿入は必要ない！！！！！！！！！！！
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
```

```html:app/views/homes/index.html.erb
<div id="app">
</div>
```

```js:app/javascript/packs/hello_vue.js
import Vue from 'vue/dist/vue.esm'

const vm = new Vue({
})
```
※app/javascript/app_vueのコード、ファイルは削除しても構わない。
***

これで、Rails上でVue.jsを動かす準備は完了。
競プロのテストを「go test」でやりたかったので先人の知恵をお借りした

# 先人の知恵

知恵お借りします。ありがとうございます。
[競プロのテストを「go test」でやりたかったので作った](https://qiita.com/0Delta/items/4f8bd7aba343f4d2f9e4)

# いきさつ

Go習得に向けてPaizaでもやろうと思ったが、元記事と同じように標準入出力のテストを簡単にやりたかった。

Paizaの場合、複数行の入力と複数行の出力の問題があるので、それに対応するように自分向けに修正をしてみた。

というお話。

# リポジトリ

下記修正したのもの
[GolangSkeletonForSpeedrun](https://github.com/mizumizue/GolangSkeletonForSpeedrun)

# イメージ

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187703/b0c941a3-5d0f-8416-7f28-33ef98fcd35f.png)

# 修正点

## 複数行対応

テストケース用の構造体のプロパティ型が入力、出力想定ともに 一行だけ受け取る想定になっていたので、 複数行受け取れるように `string` から `[]strings` に変更しました。

それに伴い `getLine` も修正。複数引数の場合、`getLine` にて、 `os.Args[1]` で一番最初の引数を受け取って、受け取った分は引数から消すという処理にすることで複数引数を受け取れるようにしました。

>何故最後なのかというと、go testの後に続くフラグの数がわからないから。入力が一行だけなのであれば、コレで十分です。(つまり複数行には非対応)

後ろのフラグ消しちゃって大丈夫かな？という懸念はあったものの、特に問題なさそうだったので、毎回テストケース毎に `os.Args = nil` で初期化&テストケース毎の想定結果(複数行)を突っ込むことにしました。

`os.Args[0]`には引数の長さを突っ込んでますが、これは引数から入力を取得するのか、標準入力から取得するのかが分岐できなくなってしまうので、便宜上突っ込んでるだけで別にあんまり意味はないです。

```go
os.Args = append(os.Args,strconv.Itoa(len(tc.args)))
for _, arg := range tc.args {
    os.Args = append(os.Args, arg)
}
```

## 出力結果に改行コードを含むか否か

paizaの場合、解答の出力に改行を含むことが前提になっているので、flagパッケージを利用して、フラグ `newline` がある場合は出力結果に改行を含むのが正解となるようにしました。

# 終わり

そんな感じで入出力の複数行対応、正解の改行対応を行って、paizaがちょっと捗るようになりましたとさ。

以上、お目通しどうもありがとうございました。
Craft CMS でファジー検索を有効にする

Craft CMS でエントリなどを検索する場合、管理画面やテンプレートを問わず、デフォルトでは完全一致するデータしかヒットしない。

前後に他のテキストを含むなど、ファジー検索を有効にするためには `config/general.php` に `defaultSearchTermOptions` を追記する。

```php:config/general.php
<?php

return [
    // Global settings
    '*' => [
        // ファジー検索を有効化
        'defaultSearchTermOptions' => array(
            'subLeft' => true,
            'subRight' => true,
        ),
    ],

    // Dev environment settings
    'dev' => [
        // （中略）
    ],
];
```

この例では `*` の配列に定義しているため、 `dev` `staging` `production` など `.env` で指定する環境を問わず有効になる。

## 参考

**Enabling Fuzzy Search by Default | Craft CMS**
https://craftcms.com/guides/enabling-fuzzy-search-by-default
discord.pyでできること(ver0.16.10)

#discord.pyとは
discordAPIのpythonラッパーです 簡単に言うとdiscordでbotを作って色々できます
利用するにはdiscordのデベロッパー登録をしてトークンを入手する必要があります
discord.pyで検索すると山ほどトークン入手からbot作成まで解説されてるので、この記事では省きます　すみません面倒くさがりなんです
##バージョンの違い
discord.pyには現在、rewrite版(ver1.0.0)と旧バージョン(ver0.16.10)があります
この記事は旧バージョンの解説なので注意してください
主な違いは
https://discordpy.readthedocs.io/en/latest/migrating.html
に書いてあるので必要なら見てください
ver0.16.10のリファレンス https://discordpy.readthedocs.io/en/async/api.html
#botの基本形
基本的には以下のコードに実装したい機能をつらつらと書き足していくだけです

```python
import discord

client = discord.Client()
@client.event
async def イベント名():
    #ここに書く
client.run("入手したトークン")
```
注意点として、`async def イベント名():`の1行前に@client.eventを入れることです
##使いやすいイベント
全部ではないですけど、使えそうなイベントを解説していきます
全部見たい人はリファレンスのイベント欄を見てください(https://discordpy.readthedocs.io/en/async/api.html#event-reference)
###on_ready()
botを起動したときに呼び出されます botの名前やidの確認に使えます
###on_message(message)
誰かがチャットをしたときに呼び出されます
`if message.content.startswith("!command"):`
と組み合わせると、誰かが!commandと発言したときになにかすることができます
また、引数のmessageから発言したチャンネル、発言者ID等の情報を入手できます
###on_message_delete(message)
誰かがチャットを消したときに呼び出されます
messageに消されたチャットの情報が入ってると思います(やったことないので知らない)(ごめんなさい)
###on_member_join(member) on_member_remove(member)
サーバーにメンバーが入ってきたとき/抜けたときに呼び出されます　memberにもmesssage同様ID等情報が入ってます
##例プログラム
イベントとclientクラスのメソッドを組み合わせることで様々なbotを作ることができます　ここでは例プログラムをいくつか紹介します
###おはように反応しておはようを返すbot
```python
import discord

client = discord.Client()
@client.event
async def on_message(message):
    if message.content.startswith("おはよう"):#おはように反応
        if client.user != message.author:#自身には反応しない
            text = message.author.mention+"さんおはよう"#message.author.mentionでメンション
            await client.send_message(message.channel, text)#チャットされたチャンネルでチャットする
client.run("入手したトークン")
```
###サーバーに入った人に役職を付与
```python
import discord

client = discord.Client()
@client.event
async def on_member_join(member):
    for role in member.server.roles:#サーバーの役職を1個づつroleに代入(for in文を参照)
        if role.name == "役職":#もしroleの名前が"役職"なら
            await client.add_roles(member,role)#入ったメンバーに役職を付与
client.run("入手したトークン")
```
###botを強制終了
discordAPIは常にループしているので、コマンドラインからは`ctrl+c`でしか強制終了できないのでon_messageから終了できるようにします
`client.logout()`だけではすぐに終わらないので`sys.exit()`も併用しています
この方法以外の方法を知っている人はコメントで教えてください

```python
import discord
import sys

client = discord.Client()
@client.event
async def on_message(message): 
    if message.content.startswith('!SHUTDOWN_BOT'):#!SHUTDOWN_BOTが入力されたら強制終了
        await client.logout()
        await sys.exit()
client.run("入手したトークン")
```
##感想
この記事はver0.16.10で書いているんですが、rewrite版を知らずにbotを作ってたのでrewrite版の記事も書けたら書きたいです
今年の言語はRust その１０


# 今年の言語はRust その１０

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 6. Enumとパターンマッチング

### 6.2 matchフロー制御演算子

```rust
enum Coin{
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}


fn value_in_cents(coin: Coin) -> u32{
    
    match coin{
        Coin::Penny => {
          println!("Lucky penny!");
          1
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}
```

```rust
#[derive(Debug)]
enum UsState{
    Alabama,
    Alaska,
}


enum Coin{
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}


fn value_in_cents(coin: Coin) -> u32{
    
    match coin{
        Coin::Penny => {
          println!("Lucky penny!");
          1
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        },
    }
}

fn main(){
    
    let coin = Coin::Penny;
    
    let v = value_in_cents(coin);
    
    let s = Coin::Quarter(UsState::Alaska);
    
    let v = value_in_cents(s);
    
}
```

#### Option<T>とのマッチ

```rust

fn plus_one(x: Option<i32>) -> Option<i32>{
    
    match x {
        None => None,
        Some(i) => Some(i+1),
    }
}


fn main(){
    
    let five = Some(5);
    let six = plus_one(five);
    let non = plus_one(None);
    
}
```

```rust

fn Error(){
    let err = plus_one(5);

}

error[E0308]: mismatched types
  --> src/main.rs:17:24
   |
17 |     let err = plus_one(5);
   |                        ^
   |                        |
   |                        expected enum `std::option::Option`, found integer
   |                        help: try using a variant of the expected type: `Some(5)`
   |
   = note: expected type `std::option::Option<i32>`
              found type `{integer}`
```



#### なんとｍatchは包括的

どういうことかというと、Option<T>型をmatchする場合には、
Noneの扱いを忘れている場合はコンパイラがエラーを伝えてくれる。
つまり、すべてのパターンをmatchしようぜという心意気が言語使用に含まれている

素敵!


```Rust


fn plus_one(x: Option<i32>) -> Option<i32>{
    
    match x {
    	// None => None,
        Some(i) => Some(i+1),
    }
}

===
 --> src/main.rs:4:11
  |
4 |     match x {
  |           ^ pattern `None` not covered

```



感動した！

次回！


イエス！
Spresense SDKをBash on Ubuntu on Windowsで動かす

# インストール備忘録
## kconfig-frontendsをmakeするとライブラリのバージョンが違ってインストール出来ないとき
$ sudo apt-get install libtool を実行する

## シリアルポート
WindowsでCOM3の場合は/dev/ttyS3を使用する
WEB周りの知識　（メモ用）

#モデルオブジェクトとは(rails)
railsでいう、モデルとは、データーベースとやりとりするクラスの事。
そのクラスの中に入っているデーターの塊をテーブルと呼ぶ。
、テーブルはカラム（横列）とレコード（縦列）に分かれる。

違いは図の通り

<img width="402" alt="スクリーンショット 2019-04-13 16.31.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/dcfe2600-3f7f-31ba-796e-717cdd812da4.png">


本題のモデルオブジェクトとは、この１行のデーター（青軸）部分をさす。
行のIDを指定すると、必要なモデルオブジェクトが引っ張れる。

<参考>
https://udemy.benesse.co.jp/development/web/rails-model.html

#必要になった理由
ここで単語の意味を理解しないと分からないと思ったから
http://railsdoc.com/references/form_for

#絶対パスと相対パスについて
相対パスー現在いるディレクトリを基準に
絶対パスー指定したURLに直接飛ぶこと


違いは図の通り



本題のモデルオブジェクトとは、この１行のデーター（青軸）部分をさす。
行のIDを指定すると、必要なモデルオブジェクトが引っ張れる。

<参考>
https://udemy.benesse.co.jp/development/web/rails-model.html

#必要になった理由
ここで単語の意味を理解しないと分からないと思ったから
http://railsdoc.com/references/form_for


#部分テンプレートとは

ビューを作成する際に同じようなレイアウトの部分が複数存在する場合があります。例えば、Twitterを思い浮かべてください。

Twitterでは複数のツイートが表示されていますが、これらのHTML構造は全て同じです。このような場合に同じHTML構造の部分を共通化することによって、無駄なくビューファイルを作成することが出来ます。この共通化された部分を、 部分テンプレートといいます。 部分テンプレートを使用した場合、そのHTML構造を他のビューでも使いまわすことができるという利点も存在します。

```ruby:
<% @tweets.each do |tweet| %>
  <%= render partial: "tweet", locals: { tweet: tweet } %>
<% end %>
```
Vue.jsってどうやって動いてるんだろう？ - Vue.jsを読み込むロジック

最近、Vue.jsを利用する機会が増えてきました。概念もなんとなく理解してきましたが、「じゃあ実際どうやって動いているの？」と聞かれるとわからないですよね。

ということで、Vue.jsのファイルを読み解いてみようと思います。

今回は、CDNで提供されている、下記のソースを使います。

```html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
```

# 即時関数だ！

今回は全体の構造を眺めていきましょう。
スクリプトの出だしはこのようになっています。

```javascript:vue.js
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = global || self, global.Vue = factory());
}(this, function () { 'use strict';
  // ...(省略)
}))
```

うお、長え！と思うかもしれませんが、単純化するとこうなっています。


```javascript:単純化してみた
(function (global, factory){ 
  a===b && c!==d ? E : f===g && h ? I : (j=k || l, m=o)
}(this, function () {
   // ...(省略)
}))
```

```javascript
(function(a, b){ 
  //  関数の中身 
})(c, d)
```
という形は即時関数の形式です。
http://analogic.jp/immediate-function/

vue.jsが読み込まれた際に `function(a, b)` が実行されます。そして、引数 `a`, `b` には`c`, `d`がそれぞれ代入されます。

今回の場合、`global`に`this`、そして`factory`に1万行を超えるvue.jsの関数がそれぞれ代入されるわけですね！

ちなみに、`this`にはブラウザで実行した場合、`Window`オブジェクトが入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241647/b573bec8-702a-04d8-23eb-794766060eae.png)

# 条件分岐がたくさん

さて、では`global`, `factory`はそれぞれどのような処理がされるのでしょうか？

それが、次の三項演算子パラダイスの即時関数の中身です。

```javascript
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.Vue = factory());
```
 
ここで、三項演算子を簡単におさらいしましょう。

```javascript
(true or false) ? 'trueだった場合の処理' : 'falseだった場合の処理'
```

これに基づいて、分類をしてみます。

```javascript
1 typeof exports === 'object' && typeof module !== 'undefined' 
2   ? module.exports = factory() 
3   : typeof define === 'function' && define.amd 
4      ? define(factory) 
5      : (global = global || self, global.Vue = factory());
```

1行目は丸々条件式です。
`true` になる条件は「 `exports` がオブジェクト型で、かつ `module` が存在する」です。

`true` だった場合、module.exports に `factory()`がセットされます。
つまり、Node上だったらモジュールとして機能する、ということですね！

`false`だった場合、さらに条件分岐が続きます。

3行目がtrueになる条件は「`define`が関数で、かつ`define.amd`が存在するとき」です。

`true` だった場合、`define`に`factory`がぶち込まれます。
これは、AMD(Asynchronous Module Definition)を使う際の処理です。

`false`だった場合、
`global` には `global`, もしくは `self`が代入されます。

この論理演算子 `||` についてはこちらを参照のこと。
https://qiita.com/Imamotty/items/bc659569239379dded55

`global`は`this`, つまり `window`オブジェクトのことでしたね。
そして最後に、その`global`の`Vue`に`factory()`を突っ込んでいる、というわけです。

つまり、ここでの処理は、AMDかNodeJSかそれ以外(ブラウザ)かによって、`factory()`(Vueの本体)を読み込ませる処理の方法を分岐させていたんですね！

ちなみに、`global`, `factory`を引数にもつ即時関数を用意し、内部でそれぞれの環境に応じて処理を分岐させる手法は、 **UMD (Universal Module Definition)** と呼ばれています！

ここら辺のリンクに詳細があります。
https://www.davidbcalhoun.com/2014/what-is-amd-commonjs-and-umd/
https://qiita.com/chuck0523/items/1868a4c04ab4d8cdfb23

---

今回はここまでにします。
メソッド単位でちょこちょこ記事が書けたらいいな、と思っています！
今更だけどブロックチェーンの勉強始めました　#本「Mastering Bitcoin Open Edition」 #1

#はじめ

###方向性
ブロックチェーンの超初心者が技術を追っていきます。
最初の方は、ほとんどWikipedia博士やGoogle大先生に聞いたほうが良いかもしれないですね。
基本的には特定通貨に偏りの無い様にしていきますが、今回はBitcoinに焦点を当てます。
できるだけ、通貨名称やサービス名とブロックチェーン自体の技術は分けて考えていけたらと思います。

###メモ

・価値の保有と輸送がbitcoinという名の通貨単位で行われる
・ユーザー間の通信は主に「Bitcoinプロトコル」
・物理的なコインは存在せず、デジタルコイン自体は存在しない。
　コインは「送信者から受信者へある一定量の額面を移動させる」という取引(トランザクション)の中で示されるもの。
・bitcoinの総発行量は2100万bitcoinを超えないように規定。
　bitcoinの流通数は予想可能で2140年に2100万に到達するカーブを描く。
　長期的にbitcoinの発行レートが減少していくため、bitcoin通貨はデフレーション傾向。
・予期された通貨発行レートよりも多く通貨が"発行"されることがないため、
　インフレーション状態になることはない。
・Bitcoinはプロトコル名/ネットワーク名/分散コンピューティングのイノベーションの名称。
・通貨としてのbitcoinはこのイノベーションの最初の応用
・Bitcoinを通貨のインターネット、つまり分散コンピューティングによって価値やデジタル資産の所有権のセキュアなやりとりを行うためのネットワーク基盤
・紙幣の発行者は、紙製造技術と印刷技術をより高度にすることで偽造問題に対処。
　物理的なお金は、同じものが2か所に存在することもないため二重支払問題と
・二重支払問題
　2回同じコインを使って支払いをすること
・1980年代後半に暗号技術の理解が進みより広く利用されるようになった際、多くの研究者が暗号技術を
利用したデジタル通貨の開発を試みた。これらの初期のデジタル通貨プロジェクトは国の通貨やゴ
ールドのような貴金属を裏付けにデジタルマネーが発行される
・初期のデジタル通貨は機能したもが中央管理されたものであり、政府やハッカー達に容易に攻撃された。
　これらの通貨は伝統的な銀行システムと同様に、中央手形交換所を導入し定期的に取引を決済する仕組み。
　このような黎明期のデジタル通貨は、政府による訴訟の末ほとんどの場合で廃止。

• 分散化されたpeer-to-peerネットワーク(Bitcoinプロトコル)
• 公開取引元帳(ブロックチェーン)
• 数学的かつ決定論的な通貨発行(分散マイニング)
• 分散取引検証システム(トランザクションscript)

・moneyやハッシュキャッシュといった先行の発明を組み合わせることで、完全に分散され、いかなる中央機
関を持たずに取引の合意と検証を行える電子通貨システム
・最も重要なイノベーションは、
　分散ネットワークの中で取引状態の合意を形成するために10分毎にグローバルな"選出"を実行していく"Proof of Work"と呼ばれる分散計算システムを取り入れたこと
　これにより、これまで中央手形交換所を通じて決済する方法でしか解決できなかった、
　一つのお金を2か所で使用するというデジタル通貨の弱点である二重支払問題が巧みに解決。

・フルクライアント、軽量クライアント、ウェブクライアント
- フルクライアント/フルノード
　全てのユーザの全ての取引を保持。ユーザのウォレットの管理も行う。
　フルノードだけでBitcoinネットワーク上のトランザクションを直接開始可能。
　スタンドアロン。
- 軽量クライアント
　ユーザのウォレットの管理。
　ネットワークへのアクセスは他のサーバを介して行う。
　全トランザクションは保持しない。正当性の認証はサーバーを信用し、それに依存。
　クライアント。
- webクライアント
　ウォレットにアクセス可能なクライアント。
AWS Cloud9でRustをビルドする


AWS Cloud9でRustをビルド/ランする


## 前提条件

事前にcargoが入っておりパスもとっていることとします。

つまり

```sh
$ cargo run
```

とすれば、ビルドされる状態であることとします。

※ 環境構築は[別記事](https://qiita.com/peace098beat/items/1a6557462244ee7adaee)参照ください


## .runファイルを作成する

![SnapCrab_NoName_2019-4-13_16-7-42_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/a0977f62-a8f3-8cea-cf87-d3ef42e0ed2d.png)



Run -> Run With -> New Runnerを選択

```js
{
    "cmd": ["cargo", "run", "$file", "$args"],
    "selector": "source.rs",
    "info": "Rust is running :)"
}
```

そしてこれをrust.runとして指定される場所の

.c9/runners/rust.run

として保存します。

![SnapCrab_NoName_2019-4-13_16-10-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/0ac7bb4b-ce8e-2fd4-c7b5-9306a5150cc3.png)


## 使用方法

使用する場合は、rustファイルを開いて

Run -> Run With -> Rust

とすれば、ビルドコンソールが開きます。



![SnapCrab_NoName_2019-4-13_16-7-29_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/3ef8ff77-f369-4887-679e-9a1e82a4a6db.png)



# おまけ ビルドだけする場合


![SnapCrab_NoName_2019-4-13_16-32-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/b2dcb563-b63e-571f-8880-8346c15561df.png)

Run -> Build System -> New Build System

を選択し、runと同様の処理をします

rust.build
```js
{
    "cmd" : ["cargo", "build"],
    "selector": "source.rs"
}
```

ショートカット
```s
Ctrl + B
```




以上
コンストラクタインジェクションされたクラスのprivate メソッドでもテストファーストしたい

テストファーストで開発するなら手を動かしながら軽い気持ちで書きたい。
例えそのクラスがprivateメソッドで依存関係があっても。

### 実装
例えば文字列を加工する処理のテストをTestクラスで実装する。

```ServiceTest.php
    // テストしたいメソッド
    private function convertWord(string $keyword): string
    {
        $cv_word = trim($keyword);
        $cv_word = mb_convert_kana($cv_word,'Kas');
        return $cv_word;
    }

    public function testConvertWord()
    {
        // トリム処理 半角カナ->全角カナ(K)
        $word = ' 全角ｶﾀｶﾅ ';
        $result = $this->convertWord($word);
        $this->assertSame('全角カタカナ', $result);
        // 全角英数字->半角英数字(a) 全角スペース->半角スペース(s)
        $word = 'Ａｉｕｅｏ１２３　';
        $result = $this->convertWord($word);
        $this->assertSame('Aiueo123 ', $result);
    }

```

### 移動方法
しかしこのメソッドは別のクラスで使うために書いてるので、メソッドを移動させる。

```Service.php
    private $repository;
    public function __construct(RepositoryInterface $repository)
    {
        $this->repository = $repository;
    }

    private function convertWord(string $keyword): string
    {
        $cv_word = trim($keyword);
        $cv_word = mb_convert_kana($cv_word,'Kas');
        return $cv_word;
    }
```

移動させたらprivateメソッドなのでReflectionクラスを使ってprivateメソッドにアクセスできるようにして、
コンストラクタを起動せずにインスタンスを作成する。

```ServiceTest.php
    public function testConvertWord()
    {
        $reflection = new \ReflectionClass(Service::class);
        $method = $reflection->getMethod('convertWord');
        $method->setAccessible(true);
        $not_construct_service = $reflection->newInstanceWithoutConstructor();

        // トリム処理 半角カナ->全角カナ(K)
        $word = ' 全角ｶﾀｶﾅ ';
        // $result = $this->convertWord($word);
        $result = $method->invoke($not_construct_service, $word);
        $this->assertSame('全角カタカナ', $result);
        // 全角英数字->半角英数字(a) 全角スペース->半角スペース(s)
        $word = 'Ａｉｕｅｏ１２３　';
        $result = $method->invoke($not_construct_service, $word);
        $this->assertSame('Aiueo123 ', $result);
    }

```

移動できたことを確認するためにphpunitを起動。

```
Time: 757 ms, Memory: 8.00 MB

OK (1 test, 2 assertions)

Process finished with exit code 0
```

### まとめ
privateメソッドをテストするのは、クラス設計が悪い、別クラスやヘルパーとして切り出せとか賛否両論あるかもだけど、スコープを抑えたいとかどうしても設計を変更できない場合などもあると思うので知識として知っておいて良いと思う。まあ他言語だとReflectionクラスが無いとかあるし、後に設計変更したいと思っても、テストがあることで安全に変更できるので、まずは動くものとテストを書きたい。

(参考)
https://qiita.com/suin/items/a1c3d96050cb7e51424d
https://qiita.com/mpyw/items/b3d974c073e6484d51a4
Xperiaの"FACTORY START UP SERVICES, PLEASE WAIT FOR POWER OFF BUTTON" 問題の解決例

# 背景
Android 6.0のXperia Xを購入し、ダウンロードとリセットを繰り返し、7.0、8.0とアップデートしていきました。
最新版になったところで、少し触っていたら、FACTORY START UP SERVICESの「PLEASE WAIT FOR POWER OFF BUTTON」とポップアップが出て数分後に「POWER OFF」と全画面に出て電源を切る以外操作ができなくなりました。
Googleで調べたところ、Xperiaのよくある問題のようで幾つか対策が提示されていました。

# 対策例

1. サービスを停止させる<br>
設定 > アプリ情報 でシステムアプリを表示させ、“com.sonyericssonstartupflagservice”を強制停止させる。<br>
これでその場では起こらないが、再起動すると再発してしまう。
2. flashtoolで最初のfirmwareに戻して、一度POWER OFFする<br>
bootloaderのロックが外れて、非セキュアな状態になるとか。<br>
その回避策もあるらしいが、失敗する可能性もあるので未実施。
3. Xperia Companion で修復する<br>
「ソフトウェアの修復」を手順通り行うも、再起動後に現象が発生。

# 解決できた手順

具体的に何をしたから解決できたのかは不明ですが、何故か再発しなくなりました。
何かの参考になるかも知れないので、手順を記しておきます。

1. 適当なSIMを刺しておく
2. Xperia Companion で修復する
3. "PLEASE WAIT FOR POWER OFF BUTTON"が出るのでボタンをタップし電源を落とす
4. バッテリにつないで100%になるまで充電する
5. PCにつなぎなおしてXperia Companionで再度修復する

この後、何回か再起動しても現象は派生しなくなりました。

この現象で悩んでいる人の参考になれば幸いです。
RSpecのrequest specでパラメータが正しく認識されない問題の対処法

RSpec 3.8 のRequest Specを使っていると、時おりリクエストパラメータが正しくRailsに届いてくれない問題に遭遇することがあったので、対策を書き残しておきます。

## 環境
- Rails 5.2.2.1
- RSpec 3.8
  - rspec-core 3.8.0
  - rspec-expectations 3.8.2
  - rspec-mocks 3.8.0
  - rspec-rails 3.8.2
  - rspec-support 3.8.0

## 問題
### booleanや数値が文字列に変換されてしまう

```ruby
# RSpec側
post xxxx_path, params: { foo: 1, bar: true }

# Rails側
# => <ActionController::Parameters {"foo"=>"1", "bar"=>"true", "controller"=>"xxx", "action"=>"xxx"} permitted: false>
```

### 空の配列になぜか空の文字列が含まれてしまう

```ruby
# RSpec側
post xxxx_path, params: { foo: [] }

# Rails側
# => <ActionController::Parameters {"foo"=>[""], "controller"=>"xxx", "action"=>"xxx"} permitted: false>
```

## 対処法
- headers に `{ "Content-Type" => "application/json" }` を追加した上で、パラメータのハッシュを `to_json` で文字列に変換してから送信する。

```ruby
# RSpec側
post xxxx_path, params: { foo: 1, bar: true, hoge: [] }.to_json, headers: { "Content-Type" => "application/json" }

# Rails側
# => <ActionController::Parameters {"foo"=>1, "bar"=>true, "hoge"=>[], "controller"=>"xxx", "action"=>"xxx"} permitted: false>
```

## ちなみに
- 空の配列に空文字が含まれてしまう問題だけについて言えば、Gemfileで `rack-test` のバージョンを `< 0.7.0` に指定すれば解消できる。
- 参考: [stackoverflow](https://stackoverflow.com/questions/51396194/rspec-request-spec-post-an-empty-array)
Rspec を使ったrailsアプリケーションの自動テスト

## Rspecのgemを使ったRailsの自動テストについて

積極的にアウトプット！

ということで今回はRspecのgemを使った自動テストについて学習をしましたので、
それについてのアウトプットをしていきます。

## はじめに
Rspecでは単体で動くプログラムが正常に動くのか、複数のプログラムが連動して正常に動くかということを自動でテストしてくれる機能になります。
Railsではgemを使って、実装し使っていくことになります。

今回はRailsで　rspec-rails　というgemを使ってテストしていきます。


## Setting

まずはgemのインストール、bundle installを済ませましょう。

```
gem 'rspec-rails'
```

```
bundle install
```

次にRspecに必要な設定ファイルを用意します。
ターミナルで以下のコマンドを入力。

```
bundle exec rails g rspec:install
```

そうすると以下のようなフォルダ・ファイルが作成されます。
app/spec
app/spec/rails_helper.rb
app/spec/spec_helper.rb
.rspec

今後はこのspecのディレクトリ内にテストコードやそれを入れておくフォルダを作成していきます。

#### 各ファイルの役割
上記コマンドで生成されたファイルの役割です。
> rails_helper.rb　
テストコードを書いたファイルに対して共通して使いたい設定やメソッドをここに記入します。
呼び出すときは、各々のファイルで　require 'rails_helper' のように記載する。

> spec_helper.rb
共通する設定やメソッドを書いておくというところは同じであるが、こちらはrailsを使用しないという違いがある。
railsの特殊な書き方はせず、Rspecの全体的な設定をかけるようです。


#### テスト結果の形式設定
次に.rspecファイルにテスト結果で返ってくる答えがどういう形式で返ってくるかを設定します。

記入の仕方は　

```
--format progress
```
のように記載します。

この progress　というところが指定する形式名になります。
種類として、
・ progress
・ documentation
・ html
・ json
があるようです。

何も設定として記載しなかった場合は、progressがデフォルトとして設定されています。

それぞれどのように返ってくるかは、詳しくまとめられている方がいらっしゃったので、
参考としてリンク貼っておきます。
http://samurai.ataglance.jp/rspec_format/

今回はdocumentationで指定していきます。

## Test

では早速テストを行っていきます。
今回はモデルの一つのファイルに対して、単体テストを行いました。
テストを行う際はテストを行うそれぞれのフォルダを作成し、その中にテストコードを書くspecファイルを設置します。
コントローラーであれば、spec/controller

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374908/9e66f3bf-bb6a-a507-638c-987aee31dd50.png)

テストコードを書くspecファイルの命名には慣習があるようです。

#### 対応するクラス名_spec.rb

今回はuserモデルのファイルでテストを起こっていくので画像のように作成しています。

``` spec/models/user_spec.rb
require 'rails_helper'
describe User do
  describe '#create' do
    it "is invalid without a nickname" do
      user = User.new(nickname: "", email: "", password: "00000000", password_confirmation: "00000000")
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end
  end
end
```
上記のように記載をしました。
これはニックネームカラムにデータが入っていなかったとき、ちゃんとエラーが出るかどうか
バリデーションが機能しているかどうかを確認するテストコードになっています。

require 'rails_helper'　rails_helperで設定した共通設定を呼び出します。

```
describe 詳細名　do
 ・・・
end
```
テストのまとまりをグループ化します。
基本的に・・・の部分に処理を書いていきます。

上の例で行くと、userモデルの中のcreateというアクションに対するテストということになります。

```
it "testの説明" do
・・・
end
```
it doは一つのテストのかたまり(example)を表します。
一つのテストの処理をこの中に書いていきます。

```
expect(X).to eq(Y)
```
基本的なテストコードの書き方です。
エクスペクテーションという。
意味は、XとYが等しければテスト成功　という意味です。

一度試しに X 1+1 Y 1+1 の値はお互いに等しいかということをテスト実行してみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374908/204104ff-5391-a901-43c5-95a7f4b1c2f3.png)

のように返ってくる。
これはexample が１つ　、失敗は０　という内容です。

また、eqの部分はマッチャといい他にも種類がある。
include() 　　()内の値を含む場合、テスト成功。など

□他使用メソッド
valid? 　バリデーションによりデータが保存できない状態かを確認する　true false で返す
errors　上記のようなメソッドを利用したインスタンスに対して原因がわかるようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374908/a36ceeba-931b-24a4-0d69-d120032d90dc.png)



##### 最後に　テストを実行するときは
#### ターミナルで　bundle exec rspec


以上
localStorage object hook

-localStorageのアクセスを監視して、関数名とデータをチェックする。

```js
;(function(root){
 'use strict'
 ;
 function entry(obj,caller){
  var is={}
  is.function = function(obj){return toString.call(obj) === '[object Function]'}
  ;
  var o =obj,keys=Object.keys(o.__proto__).concat(Object.keys(o)).filter(d=>is.function(o[d]))
  console.log('hook object=>',o);console.log('hook funcitons=>',keys)
  ;
  keys.map(key=>{
   var dump= o[key]
   o[key]=function(){
    var args=Array.from(arguments)
    caller.apply(o,[key].concat(args))
    return dump.apply(o,args)
   }
  })
 }
 ;
 root.objectHook=entry
 ;
 /*usage
var obj=localStorage//console
objectHook(obj,function(){
 var type=arguments[0]
 var args=Array.from(arguments).slice(1)
 let x=document.createElement('pre');
 x.textContent=type+':'+JSON.stringify(args,null,'\t');
 document.body.appendChild(x)
 //
})
localStorage.setItem('xyz','bbbb')
 */
})(this);

```

-そのオブジェクトがフック可能か

```js
is.function = function(obj){return toString.call(obj) === '[object Function]'}

keys=Object.keys(o.__proto__).concat(Object.keys(o)).filter(d=>is.function(o[d]))
```

-同じ手法でオブジェクトの関数をダミーに置き換える。

```js
;(function(root){
  function entry(obj){
   var is={}
   is.function = function(obj){return toString.call(obj) === '[object Function]'}
   ;
   var o=obj
   ,dummy=function(){ /**/ }
   ,keys=Object.keys(o.__proto__).concat(Object.keys(o)).filter(d=>is.function(o[d]))
   keys.map(key=>o[key]=dummy)
   ;
  }
  ;
  root.objectEraser =entry
})(this);

objectEraser(console)
console.log('aaoeeeeeeaaaaaaaaaaaaeeeea')
console.warn('eeeee')
```
Next.jsでgetInitialProps内でCookieベースの認証を行う方法

下記のような感じでreq.headers.cookieを利用すれば良い

```ts

public static async getInitialProps({ req }) {
  await axios.get('http://hogehoge.com/admin_users/sessions', { headers: req ? { cookie: req.headers.cookie }: null })
}
```

参考文献
* [How to use getInitialProps to get cookies?](https://github.com/zeit/next.js/issues/2364)
kubernetesにローカルフォルダをマウントする

# 概要
ローカル開発環境を完全にkubernetesへ行こうしようとしていたのですが、
ローカルでの開発なのでローカルにあるアプリケーションをそのままマウントして使おうとしたのですが、
なかなか開発できる状態に到達するまで骨が折れたので、その過程を共有しようと思います。

開発環境
- macOS Mojave 10.14.4
- minikube v1.0.0
- kubernetes v1.14.1
- kubectl v1.14.1

# 1. --vm-driver=virtualboxの場合
VMドライバにVirtualBoxをしようしている場合は、下記の表のように`/Users`がminikubeのノード上の`/Users`にマウントされるため、以下のようにローカルと同じ絶対パスをボリュームとして割り当てれば良い。

```yaml:sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  labels:
    app: sample
spec:
  containers:
  - name: sample
    image: sample
    command:
    - tail
    - -f
    - /dev/null
    volumeMounts:
    - name: app
      mountPath: /app
  volumes:
  - name: app
    hostPath:
    # ここは現在のディレクトリに変える
      path: /Users/user/path/to/app
      type: Directory
```

- [Mounted Host Folders](https://kubernetes.io/docs/setup/minikube/#mounted-host-folders)

|Driver|OS|HostFolder|VM|
|:--|:--|:--|:--|
|VirtualBox|Linux|/home|/hosthome|
|VirtualBox|macOS|/Users|/Users|
|VirtualBox|Windows|C://Users|/c/Users|
|VMware Fusion|macOS|/Users|/Users|
|Xhyve|macOS|/Users|/Users|

# 2. --vm-driver=hyperkitの場合
Docker Desktop for Macを入れた時に、VirtualBoxよりHyperKitの方が軽いと聞いたので、
せっかくHyperKitが使えるのであれば、HyperKitを使った方がいいんじゃないかと思い、
VirtualBoxからHyperKitにVMドライバを変更しました。

`minikube mount`を使ったり`minikube start --mount-string <source>:<dist>`を使ったりしたのですがうまくいかず、
結局下記の方法で解決しました。

```shell
minikube start --vm-driver hyperkit --nfs-share /Users
```

`--nfs-share <directory>`オプションをつけることでminikubeのノードの`/nfsshares`にディレクトリをマウントすることができます。
したがって、下記のようにボリュームとして参照することができます。

```yaml:sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  labels:
    app: sample
spec:
  containers:
  - name: sample
    image: sample
    command:
    - tail
    - -f
    - /dev/null
    volumeMounts:
    - name: app
      mountPath: /app
  volumes:
  - name: app
    hostPath:
    # ここは現在のディレクトリに変える
      path: /nfsshares/Users/user/path/to/app
      type: Directory
```

# 補足
なぜかわからないのですが、`--nfs-share <directory>`で`/Users/home/dir`のように`Users`以下のディレクトリを指定したらうまくいきませんでした。
また、`/etc/exports`は下記のようにminikube側で書き換えてくれるので、大丈夫だとは思うのですが、
もしダメだった場合は、下記コマンドを実行して設定を追記してください。

```:/etc/exports
# BEGIN: minikube-hyperkit minikube-/Users
/Users 192.168.64.10 -alldirs -mapall=_katomasa
# END: minikube-hyperkit minikube-/Users
```

```shell
"/Users -network 192.168.99.0 -mask 255.255.255.0 -alldirs -maproot="$(id -u)":"$(id -g)" | sudo tee -a /etc/exports && sudo nfsd restart
```

# あとがき
眠いのに目が冴えてる状態でやっていたため、かなり試行錯誤しており、何が正しかったのかダメだったのか把握できてません。
もし、おかしい点がありましたらご指摘よろしくお願いいたします。

あと、ローカルファイルの変更を検知して、ビルドし直してくれたりとかしないため、
ReplicaSet作ってPod消すことでPodを再生成して変更を反映している現状です。
kubernetesの思想とは違うとはわかっているのですが、変更検知してビルドし直してくれる方法を知っている方は教えてください......
自分で検知するシステム作るしかないのかなあ......

## 追記（2019.04.14）
nfsのPersistentVolumeを作成してマウントして、webpack-dev-serverのwatchOptionを`poll: true`にしたらできました。
ただNFSを使うとwebpack-dev-serverが変更を検知してくれない場合があるようです。
もしかしたら上記も同じ原因なのかもしれないです。

## 追記（2019.04.18）
やはり、NFSを使うとwebpack-dev-serverが同期が遅いためか変更を検知してくれないことが問題のようです。
PersistentVolumeかminikubeのNFS共有フォルダをhostPathでマウントするかによらず、
watchOptionのpollを設定したらファイル変更を監視してくれました。
Swift5のError型のちょっと便利になった点について

Swift5でResult型が公式にサポートされました:tada:

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes/swift_5_release_notes_for_xcode_10_2

処理の結果をSuccess, FailureとしてパターンマッチングできるEnumです。

**定義**

``` swift
enum Result<Success, Failure> where Failure : Error
```

**使い方**

``` swift
switch result {
case .success(let someValue):
  // someValueを使った処理
case .failure(let error):
    print(error.message)
}
```

今までライブラリや似たような自作のEnumで同じことをやっていたので、何が嬉しいのか？と思ったのですが、リリースノートにこんな一文がありました。

![D2jktT1U0AIQZE-.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30423/5ae1c55b-f5c7-3b35-d4d6-839a2cbc8ec6.jpeg)
> As part of this addition, the Error protocol now conforms to itself, which makes working with errors in a generic context easier. (SE-0235) (21200405)

### Errorがそれ自身に準拠した型としてサポートされた:tada:

**いままで**

今まではErrorはただの存在型としてのProtocolであるため、それ自身を型として利用できずコンパイルエラーになります。
そのためただログ出力したり、Crashlyticsに通知するために扱うだけでもErrorに準拠した型を別途用意せねばならず面倒でした

``` swift
(Result<Bool, Error>) -> Void
// Using 'Error' as a concrete type conforming to protocol 'Error' is not supported
```

**これから**

Resultが公式サポートされた一環として、Error型がそのまま使えるので地味に便利になりました。

### どうやって実現しているのか
言語レベルの特別措置として実現しているようです

PR
https://github.com/apple/swift/pull/21073/commits/7fea4b845b1de824d675372df2341472f4e41c34

合わせて読みたい
[Swiftのprotocolの存在型がそれ自身のprotocolに準拠しない理由](https://qiita.com/omochimetaru/items/06c7c9ed34695b94247e#error%E5%9E%8B%E3%81%AE%E8%87%AA%E5%B7%B1%E6%BA%96%E6%8B%A0)
今年の言語はRust その９


# 今年の言語はRust その９

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 6. Enumとパターンマッチング

### 6.1 Enumを定義

```rust

enum IpAddrKind{
    V4,
    V6,
}


struct IpAddr{
    kind: IpAddrKind,
    address: String,
}


fn main(){
    
    let home = IpAddr{
      kind: IpAddrKind::V4,
      address: String::from("192.168.0.1"),
    };
    
    let loopback = IpAddr{
      kind: IpAddrKind::V6,
      address: String::from("::1"),
    };
}



```

異なる列挙子を含むenumを作れる

```rust

enum Message{
    Quit,
    Move { x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}
```

```rust
struct QuiteMessage; // ユニット構造体
struct MoveMessage{x: i32, y: i32}
struct WriteMessage(String); // タプル構造体
struct ChangeColorMessage(i32, i32, i32) // タプル構造体
```

c言語とあまり変わらない使い方。


enumもメソッドを含めれる

```rust
#[derive(Debug)]

enum Message{
    Quit,
    Move { x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}


impl Message{
    
    fn call(&self){
        
    }
}


fn main(){

	// enum型
    let m = Message::Write(String::from("hello"));

    m.call();
    
}
```

Rustにはnullを許容できる型とそうでない型がある。

もし、nullが入る可能性のある変数にはOption<T>を利用するひつようがある。


>不正確にnullでない値を想定する心配をしなくてもよいということは、コード内でより自信を持てることになります。 nullになる可能性のある値を保持するには、その値の型をOption<T>にすることで明示的に同意しなければなりません。 それからその値を使用する際には、値がnullである場合を明示的に処理する必要があります。 値がOption<T>以外の型であるとこ全てにおいて、値がnullでないと安全に想定することができます。 これは、Rustにとって、意図的な設計上の決定であり、nullの普遍性を制限し、Rustコードの安全性を向上させます。

つまり通常の型<T>はnullは許容されない。


```rust

enum Option<T>{
	Some(T),
	None,
}

fn main(){

    let x: i8 = 5;
    let y: Option<i8> = Some(5);
    
    let sum = x + y;

}

error[E0277]: cannot add `std::option::Option<i8>` to `i8`
 --> src/main.rs:8:17
  |
8 |     let sum = x + y;
  |                 ^ no implementation for `i8 + std::option::Option<i8>`
  |
  = help: the trait `std::ops::Add<std::option::Option<i8>>` is not implemented for `i8`

```



理解した！

次回！


イエス！
docker-composeの覚えていた方がよさそうなコマンド

docker が使えるようになると、Windows / Mac / Linux とかあまり気にしなくなってきますね

docker run するのではなく、docker-compose や dockerfile を使って「インフラのコード化」をしておけば、
ローカルPCだけでは無く、オンプレ環境やクラウド上（AWS・GCP・Azureなど）にも比較的簡単に移行できます

docker-compose ファイルを自ら作成しない人でも、コマンドはある程度知っていてもいいと思います
※Kubernetes 関連がもう少し簡単になれば docker-compose コマンド自体も使わなくなるかもしれませんが…

# docker-composeの覚えていた方がよさそうなコマンド

前提
---
docker-compose.yaml
があるフォルダに移動します。

---
#### プロセス確認

    docker-compose ps

作業前に必ず確認するようにするといいと思います。

---
#### 実行

    docker-compose up

で起動します（初回起動時はイメージのダウンロードやビルドも自動で開始します）

止める場合は

    Ctrl+C

を押下します

docker-compose.yaml
ファイルを編集した後に設定を反映させる場合も

    docker-compose up

を実行します

問題なさそうであれば

    Ctrl+C

で止めた後

    docker-compose start

でバックグラウンドで実行されます

ログの確認が元からいらないのであれば、バックグラウンドで実行の-dをつけて起動することもできます

    docker-compose up -d

「docker-compose up -d」の後にログを監視する場合

    docker-compose logs -f

---
#### イメージ内のコマンドラインに入る

    docker-compose exec サービス名 bash

または

    docker-compose exec サービス名 sh


---
ログ確認

    docker-compose logs [サービス名] -t 

時間指定で確認したい場合は
※docker-composeのlogsにsinceオプションがない？のでdockerコマンド

    docker logs コンテナ名 -t --since "2019-04-13 03:55:00Z"

---
#### その他コマンド
開始

    docker-compose start

停止

    docker-compose stop

再起動

    docker-compose restart

削除

    docker-compose rm

停止+削除

    docker-compose down

ビルド

    docker-compose build
---

#### docker コマンド
イメージの一覧

    docker images

イメージを削除したい場合

    docker rmi イメージ名

未使用イメージを一括で削除したい場合

    docker rmi $(docker images -q)

イメージを別の名前でも保存したい場合

    docker tag 元イメージ名 イメージ名

イメージをダウンロードしたい場合

    docker pull イメージ名

イメージをdockerhubなどに追加する場合

    docker push イメージ名

イメージをファイルにセーブ

    docker save イメージ名 ファイル名

セーブしたファイルをイメージとしてロード

    docker loard ファイル名

コンテナ内⇔動作元間でファイルをコピーする

    docker cp コンテナ名:ファイル名 ファイル名

動作中のコンテナをイメージ化

    docker commit コンテナ名 イメージ名

プロキシ環境でのビルド

    docker build --build-arg http_proxy=http://proxy-url --build-arg https_proxy=http://proxy-url -t aaa/container-name:latest .


---
JavaScriptで変数のコンテキストを指定してevalする

JavaScriptには[eval関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval)という、文字列をJavaScriptの式として評価することのできる便利なものがある。

その式の中で変数を参照することは可能だが、通常はソースコード上で定義された変数しか用いることができない。

```javascript
const x = 1
const y = 2
console.log(eval('x + y'))
```

だが、その変数の名称や値をコードに直書きするのではなく、プログラム上で動的に設定したい場合がある。
この記事では、その場合のコードの書き方を説明する。

ちなみに、[大昔のFirefoxのeval関数にはそのような機能があったが非標準の機能として削除されてしまったようだ。](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval#Gecko-specific_notes)

# 方法1: with文を使う

変数名と変数値を保持するハッシュを作成し、[with文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/with)と組み合わせてハッシュのメンバーをトップレベルの変数として扱えるようにする。

```javascript
const context = {
  x: 1,
  y: 2
}
with (context) {
  console.log(eval('x + y'))
}
```

これで万事解決…と言いたいところだが、残念ながらwith構文はstrict modeでは使えない。
たとえば以下のコードはエラーとなる。

```javascript
'use strict'
const context = {
  x: 1,
  y: 2
}
with (context) {
  console.log(eval('x + y'))
}
```

#方法2: Functionコンストラクタを使う

[Functionコンストラクタ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function)を使うことで、with構文を使わなくても同様のことができる。
こちらの方法はstrict modeでも使うことができる。

Functionコンストラクタは複数の引数を受け取ることができる。最後の引数には関数の本体のコード、それ以外の引数には関数の引数の名称を指定する。コード内では引数の名称を変数として参照することができる。
以下に例を示す。

```javascript
new Function('x', 'y', 'return x + y')
```

これを利用して、with文を使わなくても方法1と同様の処理を記述することができる。
変数名と変数値を保持するハッシュを用意するのは同じ。
Functionコンストラクタに、ハッシュのキーの配列の末尾に評価したいコードを連結した配列を渡して関数を生成する。実行環境を選ぶが「...」による記法やObject.keysを使えば楽に書ける。
生成された関数を呼び出し、引数としてハッシュの値の配列を渡す。こちらも同じく「...」による記法やObject.valuesを使えば楽だ。
注意点として、Functionコンストラクタに指定するコードは方法1と異なり「return ～」の形にする必要がある。

```javascript
'use strict'
const context = {
  x: 1,
  y: 2
}
const func = new Function(...Object.keys(context), 'return x + y')
console.log(func(...Object.values(context)))
```
バグにハマったときに来るページ

## とりあえず落ち着こう
- 深呼吸しよう
- エラーを見て「間違った」とか焦らなくて良いよ
- トイレに行く
- コンビニに行ってみる
- 他の人に聞く前に下記確認してみよう
- 聞く時は下記情報をもとに聞いてみよう

## 問題の切り分けはした？
- 問題はどの領域で起きている？
- 問題発生している領域がわからない時はナローイング（絞り込み）してみよう
- 正常に動いているコードとの差分は？
    - 差分抽出ツールを使ってみよう
- 目の前の問題を単純化してみよう
- 複数問題がある場合はひとつひとつ原因をつぶしていこう。（一度に対応しようとしない）
- むやみに手を動かす前に、問題解決の戦略、手順をつくってみよう
- 漠然とデバッグ、を一番避けよう
- 思考が9割、コーディングは1割

## 推測するな 計測せよ
- エラー文はどんなのが表示されてる？
- エラー文でググったらどんなサイトが出てくる？
- エラーの種類は？
- エラーの発生した時のタイムスタンプは？
- エラーが発生しているファイルとその行数は？
- エラーが発生するまでの経路は？
- エラー文を公式ドキュメントで参照してみよう


- logは確認した？
- logが出ない時はその前の経路はどうなっている？
- logでググったらどんなサイトが出てくる？

## ハマってる時は全体を把握できていない時
- 全体像は把握できている？ 細部ばかり見ていない？
- コードリーディングはしている？自分が書いたコードだけ見てない？
- 図を書いてみよう
    - シーケンス図
    - クラス図
    - ER図
- 図のなかで問題が起きているのはどこ？
- 使用している技術に理解していない部分はある？
- 前提知識がないと根本的な解決はできない
- 急がば回れ、前提知識を身につけよう

## 変数の中は確認した？
- `console.log` `binding.pry`  `var_dump` `print`
- 変数の中身はなんだった？
- 返り値はなに？
- 返り値のクラスは？
- つかってる関数、メソッドはどんなの？
- 引数はなに？
- レシーバーはなに？
- 副作用はある？


## 問題解決の手段は一つではないよ
- 実現したいことはなに？
- そもそもそれはなぜ実現したい？目的は？
- 目的実現のためにはどんな手段がある？
- 今やろうとしていたこととの違いは？

## その他
- 誤字脱字はない？
- 読んでるファイルが間違ってない？
- 見てるurlが間違ってない？
- 見てる環境が違ってない？

# 補遺
自ら問題解決ができるようになっていくには構造化していく能力が必要
→ 図にすることができる、言語化して説明ができる

・なぜなのか
・原理はなにか
・自分が「わかった気になっていること」をなくす
・全体のつながり、構成を意識できる

**問題を構造化できないと陥る問題**
「何が問題なのかわからない」
「調べられない」
「聞けない」
「同じ問題を繰り返す」
「状況が変わると対応できない」

- ドキュメントを正しく読む
・自分の抱えている課題は、大枠でとらえると、◯◯という項目の中のはずだ。
・◯◯の項目は、◯◯という機能の章に含まれているのではないか。
・では、自分の求めている事柄は、ドキュメントのこのあたりに書いてあるはずだ。

- 「作業の目的」から離れない
自分がやっている作業が、プロジェクト全体のどこに位置しているのか？
×「とりあえず自分が今やっていること」だけにフォーカスが行ってしまい、それ以外のことは忘れてしまう
○全体から細部を落とし込む

- 知識を構造化しよう
「暗記」にとどまっている知識を、「理解」へ
「理解」を定義しよう
→　1から10まで言語化して説明出来ること
用語を正しく使って説明しよう

**基本は奥義**
応用は基本の組み合わせ
Windows 7 を Virtual Box に入れる

自分用メモ。

- `brew cask install virtualbox`
- ここから Windows 7 の IE11 on Win7 をダウンロード https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
- ダウンロードした ZIP ファイルを解凍する
- Virtualbox を入れて、出てきた `IE11 - Win7.ova` を開く 
- 適当に設定して、起動
- 3ヶ月くらいで使えなくなるので、3ヶ月経過したら作成したVMインスタンスを破棄して、また ova ファイルを開けばOK
Cloud9 コマンドライン　一覧

#AWSCloud9 コマンド一覧 備忘録


```
   Herokuにログインできない時、強制的にログインする
  ※herokuをインストールした後使える（開発環境AWScloud9）
# Heroku強制ログイン

$ heroku login --interactive

# Heroku データベースマイグレーション
$ heroku run rake db:migrate



```
ローカルネットワークからjson-serverにアクセスする

#1 はじめに

json-serverを以下のようにデフォルトで立ち上げるとローカルホストのみ通信できる状態になる。
`json-server db.json`

ローカルネットーワーク内にjson-serverを立ち上げ、立ち上げているPCとは別の端末からアクセスしたい場合は、以下２点を設定する必要がある。
・ホスト名の指定
・ファイアーウォールの通過設定

#2 ホスト名の指定

ホスト名を指定する場合は、以下のオプションをつける。このオプションを付けないとローカルホストで立ち上がってしまい、外部からアクセスできない。
`--host <IPアドレス or ドメイン名>`
ドメイン名の場合は、合わせてDNSサーバーにドメイン名を登録しておく。これにより、ローカルネットワーク内の端末からサーバーを見つけられるようになる。

#3 ファイアーウォールの通過設定
まず、デフォルトではポート番号が3000となっているが、任意のポートに指定したい場合は以下のオプションをつける。
`--p <port番号>`

そのポートで通信できるようにファイアーウォールの受信規則に上記ポートを受信できるようにする。ファイヤーウォールに上記ポートを通過設定しておかないと、サーバーが立ち上がっていても、外部からの通信をファイヤーウォールが遮断してしまうため外部からアクセスできない。

#4 Node.jsで動かす場合
Node.jsで動かす場合は、以下のようにポートとIPアドレス or ドメイン名を指定する。

`server.listen(<port>, '<IPアドレス or ドメイン名>');`

```server.js
const jsonServer = require('json-server');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();

server.use(middlewares);
server.use(router);

server.listen(80, '192.168.11.20', () => {
  console.log('run');
});
```

#4 結果
以下のような環境で実行した結果を示す。結果の通り、ローカルネットーワーク内のjson-serverに対し、json-serverを立ち上げているPCとは別の端末からアクセスできた。
MacPC(clinet)---router--WindowsPC(json-server)

・WindowsPCがjson-serverを立ち上げた結果
![json-server1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242136/5a05ff20-029f-c6a2-c3b7-d59dac1d720b.png)

・MacPC(clinet)がサーバへリクエストした結果

![スクリーンショット 2019-04-13 14.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242136/f1b5c644-ec00-589e-2e16-79d37b05eba7.png)
今年の言語はRust その８


# 今年の言語はRust その８

Rustを学びます

勉強ページは日本語ドキュメント

[プログラミング言語Rust](https://doc.rust-jp.rs/)

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル
https://doc.rust-lang.org/book/



## 5. 構造体

### 5.2 構造体を使用したプログラミング例

```rust
#[derive(Debug)]
struct Rectangle{
    width: u32,
    height: u32,
}


fn main(){
    let rect1 = Rectangle{ width:32, height:50};
    
    println!("{}", area(&rect1));
    println!("{:#?}", rect1);
}

fn area(rect: &Rectangle) -> u32{
    rect.width * rect.height
}

==成形される
Rectangle {
    width: 32,
    height: 50
}
```

### 5.3 メソッド記法

```rust
#[derive(Debug)]
struct Rectangle{
    width: u32,
    height: u32,
}


impl Rectangle{

    fn area(&self) -> u32{
        self.width * self.height
    }
    
    fn can_hold(&self, other: &Rectangle) -> bool{
        
        self.width > other.width && self.height > other.height
    }
}



fn main(){

    let rect1 = Rectangle{ width:30, height:50};
    let rect2 = Rectangle{ width:10, height:40};
    let rect3 = Rectangle{ width:60, height:45};
    

    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));

}


```

implは複数に分けてもOK.
関連関数としてstatic関数のように扱ってもoK

```rust
impl Rectangle{
    
    fn square(size: u32) -> Rectangle{
        Rectangle{
            width:size,
            height:size
        }
    }
}

fn main(){

    let square = Rectangle::square(30);

    println!("Can rect1 hold rect3? {:#?}", square);

}

```



理解した！

次回！


イエス！
Excel VBAコース第2回内容

全12回 Excel VBAコースの第2回の内容です。

#変数
・変数の宣言
・変数の型（すべて覚えなくてもOK）

|型指定文字|保存できるデータ|
|:--|:--|
|Boolean|True, False|
|Byte|0~255の整数|
|Integer|-32,768~32,767の整数|
|Long|-2,147,483,648~2,147,483,647の整数|
|Currency|-922,337,203,685,477.5808 ~922,337,203,685,477.5807の固定小数点数|
|Single|負の値：約-3.4×10(38乗)~-1.4×10(-45乗)正の値：約1.4×10(-45乗)～1.8×10(38乗)|
|Double|負の値：約-1.8×10(308乗)～-4.0×10(-324乗)正の値：約4.9×10(-324乗)～1.8×10(308乗)|
|Date|日付：西暦100年1月1日～西暦9999年12月31日時刻：0:00:00 ～ 23:59:59|
|Object|オブジェクト|
|Variant|すべてのデータ|

#繰り返し
・For ～ Next
（Do while ～ Loop）

下記のコードでは、メッセージボックスにiの値(0~9)が表示されます。

```
Sub 繰り返し()

  Dim i As Long

  For i = 0 To 9
    MsgBox(i)
  Next i

End Sub
```

#デバッグ②
・実行とステップ実行
・変数の中身の見方
・ローカルウィンドウ
Ubuntu Server 18.04 でGUIをインストールして遠隔操作する

Mission: Ubuntu Server を GNOME をインストールして、家で遠隔操作する。

Server:
Ubuntu Server 18.04LTS + Ubuntu Desktop

Method:
(1) Setup a VNC Server -> 一番簡単だ、他の軽量X WINDOWS使えばこの方法は良いかもしれないが、本物のGNOMEはFRAMERATEが酷すぎで使えない。

(2) Install xrdp, Connect by Window Remote Desktop -> こちらは速度がそこそこ、ストレスなく使えます。手順はこれを参考すればOK。
[ubuntu 18.04 インストール(10) リモートデスクトップ]
(http://verifiedby.me/adiary/0126)

(3) Ubuntu Desktop 内置の画面共有機能でVNC連接、こちらは速度が最高！なんか自分のパソコンでのVM機械より反応速い！

しかし、(3)を利用にはGNOME設定が必要です。
まずは(2)を方法でリモートデスクトップを連接しろう。
こちらはある問題が発覚、
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/f8b40fd0-a5c1-6054-dc67-829666b5e293.jpeg)
**ネットワークの設定はグレーで使えない**のだ。
このままじゃONには出来ない。
原因はNetplan、GUIがないUbuntu ServerのネットワークはNETWORK MANAGERを経由ではなく、yamlで設定した。DESKTOPをインストールしてもネットワークの設定はグレーで使えない！

解決方：Network Managerを使う
[Ubuntu Server 18.04でNetwork Managerを使う](https://ytooyama.hatenadiary.jp/entry/2018/07/20/002249)
を参考したが、実はこちらは/etc/netplanの中のyaml、
全部名前をXX-network-manager-all.yamlに改名、
内容renderer: NetworkManagerにすれば良い、
**固定IP設定などそのままで構わない**！
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/6f10ce71-de44-edf5-807a-73d7643a5b57.jpeg)
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/3ba14452-c70f-88d0-6335-19e2c10924b9.jpeg)
REBOOTも非必要、
`sudo netplan apply`
`sudo service network-manager restart`
基本のネットワーク配置はこれだけで大丈夫だ。
私のようなBOND設定は`nmcli`か`nm-connection-editor`
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/34779e82-0dee-ab3c-ba75-8f197a59dac5.jpeg)
こしたら、画面共有機能利用出来るようになった。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/81a79b65-80a6-3877-01a5-3374b1e2cf01.jpeg)
WindowsやMacから接続する場合暗号化をOFFにする必要がある。
`gsettings set org.gnome.Vino require-encryption false`

完成！リモートデスクトップからVNCへ～
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397757/c8eff47d-cf7f-d6f6-e2f2-5cc007ba5963.jpeg)
Python/NLP/機械学習のためのDocker環境構築

Docker上でPython+自然言語処理+基本的な機械学習を行うための環境構築方法について説明します．
また，Dockerについての基本的な知識があることを前提としています．
#導入するもの

- ベース
    - Alpine Linux 3.9
- Python
    - Python 3.7.3
    - numpy
    - scipy
    - scikit-learn
    - gensim
- 自然言語処理
    - mecab
    - cabocha

#実行環境
- Ubuntu 18.04 LTS
- Docker 18.09.5

#Alpine Linux
[Alpine Linux](https://alpinelinux.org)は, 軽量なLinuxディストリビューションです．
Dockerイメージを簡単に軽量化できることから，ベースイメージとして多く採用されています．

ただし，Alpineはデフォルトではかなり機能が制限されています．
そのため，追加で色々なツールやパッケージをインストールしていく必要があります．

#各種ファイルの作成
###Dockerfile
```Dockerfile:Dockerfile
# ベースイメージ
FROM python:3.7.3-alpine3.9

# 環境変数
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo
ENV PYTHONUNBUFFERED 1

# 各種パッケージのインストール
RUN apk add --update bash git curl build-base swig gfortran linux-headers

# Mecab
RUN cd /tmp \
    && git clone https://github.com/taku910/mecab.git \
    && cd mecab/mecab/ \
    && ./configure --enable-utf8-only --with-charset=utf8 \
    && make \
    && make install \
    && cd ../mecab-ipadic \
    && ./configure --with-charset=utf8 \
    && make \
    && make install

# CRF++ (Cabochaで必要)
RUN wget -O /tmp/CRF++-0.58.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ' \
    && cd /tmp/ \
    && tar zxf CRF++-0.58.tar.gz \
    && cd CRF++-0.58 \
    && ./configure \
    && make \
    && make install

# Cabocha
RUN cd /tmp \
    && DOWNLOAD_URL="https://drive.google.com`curl -c cookies.txt \
       'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7SDd1Q1dUQkZQaUU' \
       | sed -r 's/"/\n/g' |grep id=0B4y35FiV1wh7SDd1Q1dUQkZQaUU |grep confirm |sed 's/&amp;/\&/g'`" \
    && curl -L -b cookies.txt -o /tmp/cabocha-0.69.tar.bz2 "$DOWNLOAD_URL" \
    && tar jxf cabocha-0.69.tar.bz2 \
    && cd cabocha-0.69 \
    && ./configure --with-mecab-config=`which mecab-config` --with-charset=utf8 \
    && make \
    && make install \
    && cd python \
    && python setup.py build \
    && python setup.py install \

# LAPACK/BLAS (scikit-learnで必要)
RUN cd /tmp \
    && wget http://www.netlib.org/lapack/lapack-3.8.0.tar.gz \
    && tar zxf lapack-3.8.0.tar.gz \
    && cd lapack-3.8.0/ \
    && cp make.inc.example make.inc \
    && make blaslib \
    && make lapacklib \
    && cp librefblas.a /usr/lib/libblas.a \
    && cp liblapack.a /usr/lib/liblapack.a \
    && cd / \
    && rm -rf /tmp/*

# pip
COPY requirements.txt /home
WORKDIR /home
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
```
###requirements.txt
pipでインストールするパッケージを記載します．
バージョンを指定したい場合は `numpy==1.16.2` のようにしてください．
今回は必要最低限なものしかインストールしません．

```text:requirements.txt
mecab-python3
numpy
scipy
scikit-learn
gensim
```

#Dockerイメージを作成
Dockerfileとrequirements.txtを同じディレクトリに置きます．
以下のコマンドでDockerビルド（Dockerイメージを作成するコマンド）を実行します．

※Cabochaのダウンロードに失敗してビルドができないことがあります．
少し時間をおきながら何度か再実行してみて下さい．

```bash:
$ cd <Dockerfileが存在するディレクトリ>
$ docker build -t nlp-ml:1 .
　(docker build -t <Dockerイメージ名> <Dockerfileが存在するディレクトリ>)

$ docker images
REPOSITORY  TAG   IMAGE ID       CREATED         SIZE
nlp-ml      1     4b7930388f08   3 minutes ago   93.5MB
```
これでDockerイメージが作成できました．
このDockerイメージを使用して，コンテナを起動します．

```bash:
$ docker run -it --name hoge nlp-ml:1 bash
```