OmniAICreator/Qiita-1.07M huggingface dataset:
サービスコンテナ

#フレームワークのキモ、サービスコンテナの仕組みを学ぶ

フレームワークは様々な機能を持つ数多くのクラスで構成されている。
これらのクラスのインスタンスを管理するのがサービスコンテナです。

##サービスコンテナとは
複数のクラスが同じ機能を利用する際、利用するクラスに応じてインスタンスが生成される。これはコードの複雑化に繋がり効率、処理漏れの部分でも不具合を招く可能性が高い。これに対し、インスタンス管理の役割を担っているのがサービスコンテナです。
サービスコンテナに対してインスタンスを「要求」するだけです。
また、クラス内で必要となる機能クラスのインスタンスを、コンストラクタやメソッドの引数などを使って外部から渡す**DI/依存性の注入**パターンを利用する場合も、注入するインスタンスの生成やクラスへの注入をサービスコンテナが担います。



##バインドと解決
サービスコンテナにインスタンスの生成方法を登録する処理は「バインド(bind)」と呼ばれ、指定されたインスタンスをサービスコンテナが生成して返すことを「解決(resolve)」と呼ぶ。

##サービスコンテナどこにあんの
Illuminate\Container\Containerクラスにサービスコンテナの機能の多くが実装されている。
しかし、実態はIlluminate\Foundation\Applicationクラスで定義されており、継承して使用している。

##バインドについて
バインドにはいくつかの方法があります。
1.bindメソッド
2.bindfメソッド
3.singletonメソッド
4.whenメソッド

###bindメソッド
もっとも利用される。第一引数に文字列、第二引数にインスタンスの生成処理をクロージャで指定します。
例)

```php5
app()->bind(Number::class,function(){
return new Number();
});
```


##解決について
解決したインスタンスを取得する方法は以下の通りです。

1.makeメソッド
2.appヘルパ関数

###makeメソッド
makeメソッドは引数に対象の文字列を指定します。メソッドを実行すると、指定された文字列にバインドされた処理を実行して、その戻り値を返します。

```php5
app()->bind(Number::class, functiuon(){
   return new Number();
});

$number1 = app()->make(Number:class);

```

##DI(依存性の注入)って何？

例文で説明していきます。

下記はクラスが別クラスと依存関係にあるコードです。

```php5
<?php

class UserServices{
    public function notice($to, $message){
        $mailsender = new Mailsender();
        $meilsender -> send($to, $message);
    }
}

class MailSender{
    public function send($to, $message){
        // send mail・・・
    }
}
?>
```

noticeメソッドでMailSenderクラスのインスタンスを生成して利用します。
noticeメソッド、UserServicesの動作にはMailSenderクラスが必要です。
これが、UserServiceクラスはMailSenderクラスに依存している状態です。


###何がダメなの？

アプリケーションの変更や拡張柔軟に対応するためには、拡張可能なプログラミング設計が不可欠です。
昨日やクラス同士が密接に依存する設計になっている場合、たった１つのクラスの差し替えがプログラミングに広範囲な影響を及ぼし、多くの修正やテストが必要になります。
**ダメではないが、面倒極まりないし間違え易いということです。**

###どうすればいい？その１

noticeメソッドの引数としてMailSenderクラスのインスタンスを渡すように修正します。
コードで確認しましょう。

```php5
class UserServices{
    public function notice(MailSender $mailsender, $to, $message){
        $meilsender -> send($to, $message);
    }
}
```

引数でインスタンスを与えました。
noticeメソッドではMailSenderクラスだけではなく、その継承クラスも使用できるようになり、特定のクラスとの依存関係を排除できます。このようにクラスやメソッド内で利用する機能を外部から渡す設計パターンがDI(依存性の注入)です。


###どうすればいい？その２

抽象クラス(インターフェース)に依存させることで、クラス間の関係はさらに疎結合となり、DIの恩恵をより受けることが可能になる。

```php5
class UserService{
    public function notice(NotifierInterface $notidier, $to, $message){
        $notifier -> send($to, $message);
    }
}

interface NotifierInterface{
    public function send($to, $message);
}

class MailSender implements NotifierInterface{
    public function send($to, $message){
           //send mail
    }
}

class PushSender implements NotifierInterface{  
    public function send($to, $message){
           //send push notdication
    }
}

```
「通知する」役割を担うNotifierInterfaceインターフェースを定義し、UserServiceクラスのnoticeメソッドの引数は、Notifierインターフェースへ依存するように変更しています。メール送信を行うMailSenderクラスとプッシュ通知を行うPushSenderクラスに対して、このインターフェースを実装しています。
この変更で、noticeメソッドに対してmNotifierInterfaceを実装したクラスであればなんでも引数として渡すことができます。

具象クラスではなく抽象クラス(インターフェース)に依存させることで、クラス間の関係はさらに疎結合となりDIの恩恵をより受けることが可能になります。




##コンストラクタインジェクション

クラスのコンストラクタの引数でインスタンスを注入する方法を、コンストラクタインジェクションと呼びます。



##メソッドインジェクション

#難しいので後でかく
【Watson Studioメモ】Watson Studioで追加ユーザーの招待をする

# はじめに
Watson Studioでユーザー追加の手順を知りたいとの問い合わせがあったので、その手順を記載します。
ユーザー登録は、インスタンスでなくプロジェクト単位で行います。Watson Studio固有の話としてここで追加するユーザーは、IBM Cloud側のWatson Studioインスタンスに対するアクセス権は不要です。
以下の手順の前提は、招待先のユーザーがIBM Cloudにアカウント登録済みであることです。もしこれもまだの場合は、IBM Cloudからも招待メールが届き、ユーザーは２段階のアクティベーションをかける必要があります。

(2020-04-25 手順修正)

# 手順1

![step1.png](https://qiita-image-store.s3.amazonaws.com/0/206130/83844abd-a4e0-1839-83aa-9a4abf7d8d03.png)

プロジェクト管理の画面で、右から2つめの「Acccess Control」のタブをクリックします。
続いて「Add Collaborators」のボタンをクリックして下さい。

# 手順2

![スクリーンショット 2020-04-25 13.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/91c5cfc9-1d29-63ab-5598-8b9db8725845.png)

画面上部のテキストボックスに招待したい人のメールアドレスを入力してエンターキーを押します。

# 手順3

![スクリーンショット 2020-04-25 13.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1b2d9d83-c58c-c7fe-c51b-5d61ec8ea0d3.png)

上の画面になるので、必要であれば、RoleをAdminなどに変更します。Editorのままでいい場合は、特に変更の必要はありません。

![スクリーンショット 2020-04-25 13.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/70c29253-6619-98b7-c785-3eebce15adc5.png)


# 手順4

![スクリーンショット 2020-04-25 13.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/56623ba7-70cd-74ed-84d3-01db08cd5a21.png)

画面右下の「**Invite**」ボタンをクリックします。
これで、追加ユーザーの招待は完了です。

# 備考
招待先のユーザーがIBM idにも未登録な場合、対応手順がやや複雑になります。具体的な手順は別記事[【Watson Studioメモ】IBM idの登録がないユーザーがWatson Studioの招待を受けた場合の対応手順](https://qiita.com/makaishi2/items/f37023bad9c825b6fa2d)に記載しましたので、こちらを参照して下さい。
Ploneでpdbを使う

pythonにはデバッガあります。
特に何かインストールしたわけではありません。

```python
import pdb; pdb.set_trace()
import pprint
pp = pprint.PrettyPrinter(indent=4)
print 'abc'
```

調べたいファイル *.py の最初に下記一行をコピペ
import pdb; pdb.set_trace()

Plone をデバッグモードで起動し
./bin/instance fg

Webブラウザで 該当のURLへ

ターミナルに次のように表示されます。入力待ちです
((Pdb))

####デバッガのコマンド

((Pdb)) help
ヘルプが表示されます

((Pdb)) l
現在地の前後５行のソースコードを表示。合計11行が表示されます

((Pdb)) help l
l のヘルプが見られます

((Pdb)) b 12
ソースコードの12行目にブレイクポイントを仕込みます

((Pdb)) s
呼び出した関数にはいります。 step into です

((Pdb)) list 22
((Pdb)) l 22
ソースコードを指定された行を含む11行を表示します

((Pdb)) list 22,22
((Pdb)) l 22,22
ソースコードを指定した行番号から２つ目の行番号までの行を表示します。

#### 参考
* https://docs.plone.org/develop/debugging/pdb.html
* http://www.python.jp/Zope/Zope/articles/tips/pdb-howto-2
* http://docs.plone.org/manage/deploying/testing_tuning/testing_and_debugging/pdb.html
MarkdownのリストをチェックリストにするCLIコマンドを作った

仕事をしているときにMarkdownの大量のリストをチェックリストに変換したくなったのでそのためのツールを作りました。"list to todo-list"の略で"litto"。

GitHubリポジトリは[sosukesuzuki/litto](https://github.com/sosukesuzuki/litto)です。

## 使い方

npmを使ってインストールできます。

```sh
$ npm install -g litto
```

ファイル名を指定して使うことができます。下のようなファイルを`./hoge.md`として作成します。

```hoge.md
# ./hoge.md

- item1
- item2
```

ファイル名を指定してコマンドを叩くと結果が表示されます。

```
$ litto ./hoge.md
# ./hoge.md

-   [ ] item1
-   [ ] item2
```

なんかちょっと汚いのでPrettierで整形するためのオプションを用意しました。`--format`オプションをつけるとフォーマットした結果が表示されます。

```
$ litto --write --format ./hoge.md
# ./hoge.md

- [ ] item1
- [ ] item2
```

`--write`コマンドをつけるとファイルを上書きします。

```
$ litto --write ./hoeg.md
./hoge.md
Done.
```

## 仕組み

[unified](https://github.com/unifiedjs/unified)と[remark](https://github.com/remarkjs/remark)というライブラリを使っています。これらのライブラリを使ってMarkdownをパースしてASTに変換します。詳しい使い方はそれぞれのドキュメントを読んでください。

これらのライブラリを使って生成されるASTは[mdast](https://github.com/syntax-tree/mdast)に準拠しています。そして[ListItem](https://github.com/syntax-tree/mdast#listitem)は`checked`というプロパティの有無でリストかチェックリストかの判別をしているので、ASTを再帰的に走査してListItemの`checked`を(初期値の)`false`にすることで変換を実装しています。

CLIコマンドとしてそれなりの出来にするために[commander](https://github.com/tj/commander.js/)を使っています。

## 感想

誰も使わなさそうですが、JavaScriptからもちゃんと叩けるようにしたいですね。
PHPの変数って難しい

新人のとき、ほぼ新人のみで作成したWebアプリケーションに対して要望が投げられたため対応していたところ、目を疑うものを見つけてしまった。 

```php:びっくりだよ

foreach ($postData as $key => $item) {
  $arr['email'] = $this->session->userdata('email');
  //何行かの処理...
  $arr = array(
    'name' => $item['name'],
    'email' => $arr['email'],
    'text' => $item['text'],
  );
  //いろいろ処理...
}
``` 

いやこれ動くんかい。まじかい。自分が作ったとこじゃないから知らんかったぞ。 
でも考えてみれば文末来るまでは変数宣言終わってませんもんね……そりゃまあうまくはいきますか……。 
いやでも変数初期化しよ…？そもそも名前変えよ……？ 
社内でしか使われていないのでこっそり…こっそり修正します……。 
こうみると新人の頃のコード本当にひどいなと……いっそ笑けるのでおっけいです（ダメ）。
Gitでいろいろ取り消したい

Gitでいろいろミスすることってありますよね。
そのミスを解決するネタ的な記事です。

# Gitの全体図
Gitの構成として、「**リポジトリ**」でファイルを管理していきます。そのリポジトリにファイルをもってくるためには「登録(add)」と「コミット(commit)」が必要になってきます。この処理ができた段階で、最後にリモート上にあるリポジトリにプッシュ(push)していきます。プッシュするとリモートに反映されてforkやpullをして、ローカルリポジトリに追記した内容等が反映されます。

[参考：https://backlog.com/ja/git-tutorial/intro/intro1_4.html](https://backlog.com/ja/git-tutorial/intro/intro1_4.html)

# ローカルの取り消し
そもそも、ローカル上の変更の取り消しをしたい場合は、`checkout`で十分です。

```
$ git checkout .
```
ただし、新規ファイルの作成で作成したファイル等は削除されませんので、そこは注意（下記コマンドで可能）。

```
$ git clean -df .
```
# addの取り消し
```
$ git reset HEAD .
```
このコマンドによりgit のステージングから取り除かれ、add前の状態になります。
add する前の状態に戻すということなので、コミットした場合の状態は戻していません。

# commitの取り消し
```
$ git reset --hard HEAD~
```
上記は直前のコミット履歴を消し去る方法です。
他にも、コミットを変更するうえで「`revert`」と「`--amend`」があります。

### `revert`
```
git revert コミットのハッシュ値
```
指定したコミット時点の状態にまで戻し、コミットを行います。（履歴は消えません。）
### `--amend`
```
git commit --amend
```
`--amend`は直前のコミットに上書きするときに使用します。

使用方法は様々ですが、下記の場合でよく用いられます。

- コミットメッセージを変更したい時
- `git rebase`失敗した時、コンフリクトを避けるためにコミットを上書きしたい時

# pushの取り消し
```
$ git revert [<commit>]
$ git push
```
pushに関しては特に変わった操作はなく、コミット履歴で変わったもの（`git revert [<commit>]`）をpushしましょう。
# mergeの取り消し
```
$ git reset --hard HEAD^
```
addやcommit同様にresetで取り消し可能です。
`HEAD^`でひとつ前に指定し、`--hard`で強制的に戻すという意味です。

ハッシュ指定でもOKです（下記コマンド）。

```
$ git reset --hard aaaa(ハッシュ)
```
# pull requestの取り消し
```
git push --delete origin [ブランチ名]
```
pull requestを送ったブランチ名を指定して--deleteオプションつきでpush

```
$ git push --delete origin [ブランチ名]
```
# git tag取り消し
- git tag -d タグ
    - ローカルのタグを取り消し

```
$ git tag -d タグ
```
- git push origin :refs/tags/タグ
    - リモートのタグを取り消し

```
$ git push origin :refs/tags/v1.0.6
```

# まとめ
Gitの扱いは慎重に。
Slack_botを使って読書習慣をつけることにした話

# 作ろうと思った経緯
なんか最近読書を怠っているなーと感じて習慣をつけようと思っていたこの頃。
どうせならSlack_botの勉強もかねて作ろうと奮起して開発することにしました。

# 作る機能

* 自分が読みたい本リストの取得
* 自分が読みたい本リストの追加
* こちらから読み終わったわよの報告をしたら、botから応援(?)レスポンス。

これらの機能は`@slack_bot <command> option`みたいな感じで色々やろうと思います。

# 概要はこんな感じ
<img width="582" alt="スクリーンショット 2019-04-03 12.55.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/8b9661ce-c5d6-04c9-3927-aa3eb2e8e0d8.png">

とりあえず研究室に放置されていたMac mini（化石）を使ってSlack_botを動かそうと思います。

本とメッセージのリストはこんな感じのjsonファイルで管理しようと思います。

```json:sample.json
{
  "book": {
    "0": {
      "name": "スラムダンク1巻",
      "value": "2"
    },
    "1": {
      "name": "スラムダンク2巻",
      "value": "2"
    },
    "2": {
      "name": "スラムダンク3巻",
      "value": "2"
    },
    "3": {
      "name": "スラムダンク4巻",
      "value": "1"
    },
    "4": {
      "name": "スラムダンク5巻",
      "value": "0"
    },
    "5": {
      "name": "スラムダンク6巻",
      "value": "0"
    }
  },
  "message": {
    "0": "あきらめたら、そこで終了ですよ...?",
    "1": "全国制覇を成し遂げたいのならもはや何が起きようと揺らぐことのない--断固たる決意が必要なんだ!!",
    "2": "全国制覇とは、口だけの目標かね"
  }
}

```
bookが本の一覧で、nameが本の名前になります。valueの0がまだ読んでない本、1がいまの課題図書、2が読み終わった本となります。messageが読み終わった際にbotからくるレスポンスのリストとなります。


# できたもの
できたものはこちらです。

## コマンドはこんな感じ
<img width="349" alt="スクリーンショット 2019-04-03 15.59.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/5a5b7358-f8c9-8ba5-597c-f05ac82ca5be.png">
少し生意気なbotにしました。

## 本リストの取得はこんな感じ
<img width="264" alt="スクリーンショット 2019-04-03 16.15.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/3ee1cbab-6541-7864-17f7-0b5ab0f4328e.png">
このように本のvalueごとで出力するようになっています。

## 本リストの追加はこんな感じ
<img width="523" alt="スクリーンショット 2019-04-03 16.28.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/7c062794-b788-fefe-1fbd-2e8239f60c3c.png">
追加されていますね。

## 終わったよ報告はこんな感じ
<img width="473" alt="スクリーンショット 2019-04-03 16.34.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/73c710b9-d93c-b810-ee8c-d0c7b0c669cd.png">

メッセージのあとすぐ次の本を提示してきます。鬼軍曹。


# 感想
やっぱり思いたったことを作ってみるのは楽しいですし、それが学びにつながっていくなーと思いました。いまは研究室に余っているPCを使って動かしていますが、これからはクラウドとかも勉強がてら使っていきたいです。

# 参考

* [PythonのslackbotライブラリでSlackボットを作る](https://qiita.com/sukesuke/items/1ac92251def87357fdf6)
PHPのSeleniumでタブの切り替えを行う方法

PHPのSeleniumで２つのタブの切り替えを行う方法。

```php
$url = "https://www.google.com/"
$main = $driver->getWindowHandle();
$sub = null;

$driver->executeScript("window.open(\". $url . "\", null, null)");

foreach ( $driver->getWindowHandles() as $handle ) { 
  if ( $handle != $main ) {
    $sub = $handle;
  }
}

$driver->switchTo()->window($sub);

/* やりたい処理 */

$driver->close();

$driver->switchTo()->window($main);
```

# 自分のためのめも

* `$driver->executeScript( ~~ );`で新しいタブを開く
* `foreach ( ~~ )`では全ウィンドウハンドルを取得して、新しいタブのウィンドウハンドルを`$sub`に格納
* `$driver->switchTo()->window($sub);`で`$sub`（新しいタブ）に切り替え
* `$driver->close();`で新しいタブを閉じる
* `$driver->switchTo()->window($main);`で元のタブに切り替える
[Swift] Double(Float)型の数値を整数部と小数部で分けて取り出す

`10.125`を`10`と`0.125`に分けて取り出したい。

```swift
let value = 10.125
let integer = Int(value)
let fraction = value.truncatingRemainder(dividingBy: 1)

print(integer)  // 10
print(fraction) // 0.125
```

`value.truncatingRemainder(dividingBy: 1)`は`value % 1`と同じで1で割った余りの数を計算する。
Qiitaとは

# Qiita とは

- プログラムの技術や知識を共有しあうWebサービス
- 「わかる人」と「わからない人」がユーザーとして共存している
- 「見える人」と「見えない人」がユーザーとして共存している
- 正しいことと間違ったことが共存している
- 古いことと新しいことが共存している
- 正確な情報が欲しければ、ネットリテラシーを高める必要がある

# Qiita に記事を書くには

- Markdown（マークダウン）と呼ばれる記法で文字を書く
- 専用のエディタを使って絵文字や画像を挿入できる:grinning:
- プログラムの技術を踏まえた記事である必要がある
- 本トピックは Markdown を練習しているという体で要件を無理やり満たしている

# Qiita の記事を中断するには

- とりあえず投稿しておく
- 公開したくない場合には「下書き保存」が行える
- ブラウザに入力している内容はセッション毎で保存されるようだが、念のためお好みのテキストエディタ（メモ帳、VS code、vim　等）で下書きを行ったほうが事故が少なくてよい
- 編集の途中でやり直したくなった場合のキャンセル(破棄)やアンドゥ(元に戻す)といった機能は見当たらない。Qiita の投稿トピック自体を手動ないし自動でバージョン管理するほうが望ましい。

# Qiita の記事の編集を再開、または投稿済みの記事に追記するには

- 記事内の「編集する」ボタンで再度編集モードに入ることができる
- 更新時、追記時にも「下書き保存」を行うことができる
- もし別のタブ、別のブラウザで編集中のものがあった場合、保存順序によっては最新のテキストを別のタブの古いテキストで上書きしてしまう可能性がある。もし手順を誤って古いテキストで更新をかけてしまったら編集ページの「差分」から自力で復旧を試みる

# こんな信憑性のない独自研究のクソ記事ではなく Qiita の公式な解説を見るには

- Qiita:Support [https://help.qiita.com/]

# 本トピックを全く同じ記法で再現するには

```

# Qiita とは

- プログラムの技術や知識を共有しあうWebサービス
- 「わかる人」と「わからない人」がユーザーとして共存している
- 「見える人」と「見えない人」がユーザーとして共存している
- 正しいことと間違ったことが共存している
- 古いことと新しいことが共存している
- 正確な情報が欲しければ、ネットリテラシーを高める必要がある

# Qiita に記事を書くには

- Markdown（マークダウン）と呼ばれる記法で文字を書く
- 専用のエディタを使って絵文字や画像を挿入できる:grinning:
- プログラムの技術を踏まえた記事である必要がある
- 本トピックは Markdown を練習しているという体で要件を無理やり満たしている

# Qiita の記事を中断するには

- とりあえず投稿しておく
- 公開したくない場合には「下書き保存」が行える
- ブラウザに入力している内容はセッション毎で保存されるようだが、念のためお好みのテキストエディタ（メモ帳、VS code、vim　等）で下書きを行ったほうが事故が少なくてよい
- 編集の途中でやり直したくなった場合のキャンセル(破棄)やアンドゥ(元に戻す)といった機能は見当たらない。Qiita の投稿トピック自体を手動ないし自動でバージョン管理するほうが望ましい。

# Qiita の記事の編集を再開、または投稿済みの記事に追記するには

- 記事内の「編集する」ボタンで再度編集モードに入ることができる
- 更新時、追記時にも「下書き保存」を行うことができる
- もし別のタブ、別のブラウザで編集中のものがあった場合、保存順序によっては最新のテキストを別のタブの古いテキストで上書きしてしまう可能性がある。もし手順を誤って古いテキストで更新をかけてしまったら編集ページの「差分」から自力で復旧を試みる

# こんな信憑性のない独自研究のクソ記事ではなく Qiita の公式な解説を見るには

- Qiita:Support [https://help.qiita.com/]

# 本トピックを全く同じ記法で再現するには

!ERROR! See one or more of the circulation has occurred.

```
Raspberry Pi zero W から WiFi 経由で AgriBus-NAVI に NMEA を流す方法

# 概要
最近出た u-blox ZED-F9P と Raspberry Pi Zero W を組み合わせて GNSS 受信機を作っているのだが、AgriBus-NAVI に WiFi 経由で NMEA を送れるようになったのでメモ。
# 確認環境
#### GNSS 受信機
- u-blox ZED-F9P
- Raspberry Pi zero W
- str2str (RTKLIB 2.4.3 b31 のユーティリティ)
 
#### AgriBus-NAVI 実行環境
- AgriBus-NAVI Version 3.6.2
- Amazon Fire HD 8(第8世代)

# 手順
1. GNSS 受信機と AgriBus-NAVI を同じ WiFi ネットワークに接続

2. AgriBus-NAVI 設定
　- [GNSS位置情報取得元]で[内部ポート通信]を選択し[OK]を押す
　- [TCPホスト＆ポート設定]で[TCPホスト(IP)]に '0.0.0.0' を入力。ポート番号は任意([ただし、1025 未満を入力すると、強制的に 1025 にされてしまう](https://www.facebook.com/groups/agribusnavi/permalink/2248721732011860/?comment_id=2255110688039631&reply_comment_id=2264685580415475&comment_tracking=%7B%22tn%22%3A%22R%22%7D))。

3. GNSS 受信機側設定
　- F9P の UART1 を RaspPiZeroW のシリアルポートに接続
　- F9P の UART1 の出力を NMEA だけに設定
　- RaspPiZero のターミナルを開いて、コマンドラインから以下のコマンドを実行
　`str2str -in serial://[F9PをつないだUART]:[UARTの転送速度] -out tcpcli://[AgriBus-NAVIの動くスマホのアドレス]:[上で設定したポート番号]`

これで AgriBus-NAVI 右上のインジケータが反応するはず。

反応しないときは[GNSS位置情報取得元]で一度[Bluetooth接続型GNSSを使用]を選択して[OK]を押した後、再度[内部ポート通信]を選択し[OK]を押すと使えるようになることあり。

追記
　ちなみに Amazon Fire(第7世代)では、同様の設定で割と頻繁に[NO GNSS]になったが、Fire HD 8(第8世代)では、ほとんど[NO GNSS]にならない。CPU の処理能力の差か？([Fire(第7世代)は Cortex-A7、Fire HD 8(第8世代)は Cortex-A53](https://developer.amazon.com/ja/docs/fire-tablets/ft-device-and-feature-specifications.html#))
Railsで画像スライドのためのslickを使う。（hamlで記述）

#　Railsでslickを使う。
画像のスライドをしようと思った時に便利なslick。
それをRailsで使ったので備忘録。
まずslickを使うにはjqueryのgemをインストールする必要がある。
Gemfileに

```ruby
gem 'jquery-rails'
```
と記述してbundle installすればOK。
そしてassets/javascripts/application.jsに

```ruby
//= require jquery
//= require jquery_ujs
```
と記述する。
turbolinksが入った状態だとうまく動作しない可能性があるので

```ruby
//= require turbolinks
```
の記述は削除しておく。

そしてslickのサイトにアクセスしてget it now。
CDN用のCSSとJSをコピーする。
http://kenwheeler.github.io/slick/

CSS

```html

<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
```

JS

```html
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
```

それをapplication.html.hamlに記述する。記述する順番を間違えるとうまく動作しないことがある。


```ruby
!!!
%html
  %head
    %title Something
    %meta{charset: "utf-8"}
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', data:{ turbolinks:{ track: true }}
    %link{ rel: "stylesheet", type: "text/css", href: "//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"}
    = javascript_include_tag 'application', data: { turbolinks: { track: true }}
    %script{ type: "text/javascript", src: "//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"}


  %body
    = yield
```

%linkや%scriptの{}の中身はハッシュロケット（=>）を使わずにシンボル（:）を使って記述した方がいいっぽい。

まあこのままでも一応使えるっぽいけど念の為にslickのサイトからファイルをダウンロードしておいたほうがいいかも。
（画像スライドの際のドットやアローなどのスタイルが記述されている）
get it nowのDownload　Nowからダウンロード可能。
その中で必要そうなファイルだけをRailsの中に移した。
僕はslick-theme.cssだけstylesheetsの中に移行した。

そしてビューファイルでslickを使う。

```ruby
%ul.slider
  %li
     = image_tag 
  %li
     = image_tag 
  %li
     = image_tag 
```

のように親要素にsliderというクラスをつける。
そしてJSファイルに

```javascript
$(function() {
  $('.slider').slick();
});
```

と記述すればとりあえずslickが機能していると思う。

# 使用したオプション
・ドット
・アローをfontawesomeのものに変更
・自動スライド
・ドットをhoverするだけで画像スライド

```javascript
$(function() {
  $('.slider').slick({
      prevArrow:'<i class="fa fa-angle-left arrow arrow-left"></i>',
      nextArrow:'<i class="fa fa-angle-right arrow arrow-right"></i>',
      dots: true,
      autoplay: true,
      autoplaySpeed: 4000,
      speed: 800
  });

  $('.slick-dots li').on('mouseover', function() {
    $('.slider').slick('goTo', $(this).index());
  });
});
```

```css
.slick-dots {
        position: absolute !important;
        bottom: 20px !important;
        li {
          font-size: 20px !important;
          button:before {
            content: "●" !important;
            font-size: 14px !important;
            color: rgb(60, 60, 60) !important;
          }
        }
      }
```
ドットを設定するとslick-dotsというクラスのついたulが生成され、その中のliの中のbuttonにドットが入っている。
slickの元から設定されているスタイルに対抗するために!importantを使っている。

slickのオプションをもっと知りたければたくさん載っている記事があるのでそちらを参照ください。
（こちらの記事など）
https://qiita.com/katsunory/items/25b385aae0f07b41e611
https://qiita.com/ymeeto/items/7fc56eea4bd44487cdb7

僕が使用したのはこのぐらい。

至らぬ点があればぜひコメントで教えてください。
Nordic BLE の Disconnect Reason を取得する

アオノドンの開発でのトラブルシューティング。

Nordic の nRF52840 を搭載したアオノドン2019。特定のバージョンでconnectしてもすぐdisconnnectするようになった。

以下はデバッグのためにDisconnect Reasonを取得する方法。

テストプログラムは ble_app_uart に手を加えたものであるが、その中の ble_evt_handlar に2行追加して以下のようにした。

```

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    uint32_t err_code;
    uint8_t reason;             // 追加
    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
            NRF_LOG_INFO("Connected");
            err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
            APP_ERROR_CHECK(err_code);
            m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
            err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GAP_EVT_DISCONNECTED:

            reason=p_ble_evt->evt.gap_evt.params.disconnected.reason;  // 追加
            NRF_LOG_INFO("Disconnected");
            // LED indication will be changed when advertising starts.
            m_conn_handle = BLE_CONN_HANDLE_INVALID;
            break;

        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
        {
            NRF_LOG_DEBUG("PHY update request.");
            ble_gap_phys_t const phys =
            {
                .rx_phys = BLE_GAP_PHY_AUTO,
                .tx_phys = BLE_GAP_PHY_AUTO,

```

ここで、追加した以下の行でブレークポイントを設置して Breakpoint  をつける。
 

```

            reason=p_ble_evt->evt.gap_evt.params.disconnected.reason;  // 追加
```

これで、得られた reason は 0x08 であった。

「Bluetooth status codes」
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s132.api.v3.0.0%2Fgroup___b_l_e___h_c_i___s_t_a_t_u_s___c_o_d_e_s.html&anchor=ga1bb212e3f0e4f2ef6bd02afa644b92fb

こちらで確認すると 0x08 は  BLE_HCI_CONNECTION_TIMEOUT ということらしい。
切断ボタンのショートなどで発生している事象ではないことがわかる。

ということで、トラブルシューティング中・・・
SQLのデータ型について！

# はじめに〜書こうと思った理由について〜

SQLの学習を継続的にやっているのですが、
まだ理解していない部分を理解して、アウトプットしておこうと思い、
記事を書きました。

# 対象とする人
・SQLの学習をしはじめて間もない人
・SQLのデータ型についてイマイチ分かっていない人

# この記事の流れ
・データ型について
・固定長？可変長？
・固定長（CHAR型）
・可変長(VARCHAR型）
・まとめ

# データ型について

データベースのテーブルって、列ごとに格納できる「データの種類」というのが決められているんですよね。
そのデータの種類をあらわすものを「__データ型__」と呼びます。


代表的なデータ型は下記となります。

|データ種別|区分|代表的なデータ型名前|
|:--|:--|:--|
|文字列|固定長|CHAR型|
|文字列|可変長|VARCHAR型|
|数値|整数値|INTEGER型|
|数値|小数|DEMICAL型,REAL型|
|日付と時刻|--|DATETIME型,DATE型,TIME型|



#固定長？可変長？

上に書かれた表を見て、
整数値
小数
日付と時刻
は意味が分かるけど、
固定長、可変長ってなに？？聞いたこと無い・・・。

と思った人がいるかと思いますので、解説します。

#固定長（CHAR型）
固定長とは、一言で言うと、「__入るデータの長さが決まっている__」、という意味です。
また、CHAR型というのは、固定長の文字列データを扱うデータ型のことです。

例えば、CHAR（10）とかかれていたら、

「10バイトまで文字をきちんと入れてねー」

ということになります。
そして、もし、格納しようとしている文字列が10バイトではなく8バイトだとします。

8バイトだと10バイトに満たないですよね。
その場合だと、文字列の右側に__空白__が2バイト追加されます。
そして、10バイトぴったりに調整された後、格納されます。

CHAR型は社員番号や郵便番号といった、格納するデータの桁数が決まっているものに対して使われるデータ型です。

#可変長(VARCHAR型）
可変長（VARCHAR型）とは、一言で言うと、「__中に入るデータの長さが決まっていない__」という意味です。
また、VARCHAR型というのは、可変長の文字列データを扱うデータ型のことです。


VARCHAR型では、もし格納する文字列の長さが足りていなくても、右側に空白を追加する、といった調整はありません。

例えば、VARCHAR（10)とかかれていたら、

「10バイトまで文字を入れてねー、10バイトまで８バイトでも3バイトでも大丈夫だよー」
ということになります。

格納しようとしている文字列が8バイトでも3バイトでも、そのままの長さで格納することが可能です。

そのため、


VARCHAR型は氏名や書籍名といった、格納するデータの桁数が変動するものに対して使われるデータ型です。

#まとめ

固定長（CHAR型）とは、「__入るデータの長さが決まっている__」ということ。
例として、社員番号や郵便番号の文字列を格納する時に使われる。

可変長（VARCHAR型）とは、「__中に入るデータの長さが決まっていない__」ということ。
例として、氏名や書籍名といった文字列を格納する時に使われる。

# というわけで・・・
お読みいただきありがとうございました。
間違い等ございましたら、ご指摘いただけると嬉しいです！


参考図書 : [スッキリわかるSQL入門](http://amzn.asia/d/diFEu7A)
ERC721xやってみた（truffle編）

ERC721によるオークションシステム作成も終わり、次はERC721xかぁ~、という事で、
早速本家ページを確認してトライしてみました。

# ERC721x.org

なんというかLOOMな感じのサイトですね（個人的には大好きです）。
https://erc721x.org/

ERC721と比較すると、721x系APIの違いが見えてくるのでお勧めです。
http://erc721.org/

## 3分でERC721xを試す・準備編

今回は、[ERC721xサイト](http://erc721x.org/)公式の右下にある「Quick Start / Test the reference implementation」を実行してみます。
![Quick_Start_Test_The.png](https://qiita-image-store.s3.amazonaws.com/0/280104/ebf1acb5-601b-bc36-a07f-cfd32287d009.png)

事前に下記インストールが必要なので、準備しておいて下さい。
・node.js
・yarn
・truffle
・Ganache (GUI)

## 3分でERC721xを試す・実践編
では実践編です（ここから３分です:grin:）

まず、作業用フォルダを作成し、git cloneを行いましょう。

```
git clone https://github.com/loomnetwork/erc721x.git
```

すると、フォルダ「erc721x」が生成されるので、カレントパスを変更しましょう。

```
cd erc721x
```

次に、yarnで必要なパッケージをインストールします。

```
yarn install
```

さらに、HD Wallet のパッケージも追加しましょう。

```
npm install truffle-hdwallet-provider
```

さて、ここまでで実行準備は完了です。
あとはtruffleコマンドを使って好きにいぢればOKですが、
（truffle compile、truffle migrate、等々）
ここは手順にのっとって、テストコマンドを実行してみましょう。

まず、テスト用のデプロイ先として、「Ganache (GUI)」を起動します。
![ganache_1.png](https://qiita-image-store.s3.amazonaws.com/0/280104/f21daca9-b364-619b-8eb3-24b41de88b5a.png)
※ここで、IPアドレスが、デフォルトの「http://127.0.0.1:7545」になっている事を確認して下さい。
※Ganache設定「AUTOMINE」を「ON」にすると、テストがスムーズに進むので便利です。

次に、テストコマンドを実行します。

```
truffle test
```

すると自動的にコンパイル・マイグレート・テストが実行されます。
![truffle_test.png](https://qiita-image-store.s3.amazonaws.com/0/280104/0fed8271-4493-097b-899e-f041c04bbadb.png)
上記画面が表示されれば成功です。
21個のテストに合格している事が分かります。

テスト後にGanacheを確認すると、466のトランザクションが発生している事が分かります。
（「AUTOMINE ON」で実施したので、１トランザクション発生毎に１ブロック生成される為）
![ganache_2.png](https://qiita-image-store.s3.amazonaws.com/0/280104/00356938-f314-1068-c3b2-805020579e86.png)

truffleのtestフォルダを見ればテストコードが記載してあるので、ERC721xに期待する挙動が分かりやすいと思います。
このサンプルをベースにすれば、簡単にERC721xコントラクトを構築できそうですね。
サーバー起動しようとしたらもう使われてるって言われたら

#サーバー起動できないときの対処
##エラー
```
$ php -S 192.168.33.10:8000
 Failed to listen on 192.168.33.10:8000 (reason: Address already in use)
```

phpサーバー起動しようとしたらこんなエラーが。
サーバー起動するのに失敗。理由はもう使われてるアドレスだから。

##やってみたこと
```
$ lsof -i:8000
```

####解説
lsofコマンドはプロセスが開いているファイルを表示する。
これでは意味がよくわからなかったが、-i:8000とすることでポート番号8000のプロセスを調べることができるらしい。

lsofコマンドが使えなかったのでインストールされているか調べる。

```
which -a lsof
```

whichは指定したコマンドのフルパスを表示する。
-aはオプションで、指定したコマンドが実行可能なパスをすべて表示する。

インストールされていなかったのでインストール

```
sudo yum install lsof
```

再度

```
$ lsof -i:8000
```

しかし、これはなにも表示されなかったので失敗。

##結果
二つ目の策としてpxコマンドを使おうとして、その前に一度サーバー起動に挑戦したら起動できた。
なぜだ。
[Amazon Connect] CloudWatch メトリクスを使ったモニタリング

## 1 はじめに

Amazon Connect（以下、Connect）を使用する場合、監視はどうするの？という疑問が発生してくると思います。
今回は Amazon CloudWatch メトリクスを使って Amazon Connect のモニタリングを試してみたいと思います。

## 2 アラームの精査

今回は以下のメトリクスに対するアラートを設定したいと思います。

・ContactFlowFatalErrors — システムエラーが原因で問い合わせフローが実行に失敗した回数

## 3 AWS CLIのインストール

現在、AWSの CloudWatch コンソール上に表示されるメトリクスは、データが記録されたもののみとなっています。
データが記録されていないメトリクスはコンソール上に表示されないので、AWS CLIを用いて設定します。

AWS CLIのインストールはこちらを参照して実施してください。

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

## 4 アラーム設定

AWS CLIのインストールが完了したらアクセスキーを払い出してもらってアクセスしてみましょう。

![AWSCLI2.png](https://qiita-image-store.s3.amazonaws.com/0/367936/04fc2ada-48f7-72c7-51f3-6ad324fa0c9b.png)

アクセス出来たらコマンドを実行してアラームを作成しましょう。
以下のコマンドは、ContactFlowFatalErrorsに対するアラームの設定例となります。

```
$ aws cloudwatch put-metric-alarm \
 --alarm-name "<アラーム名>" \
 --namespace AWS/Connect \
 --metric-name ContactFlowFatalErrors \
 --dimensions Name=InstanceId,Value=<インスタンス ID> Name=MetricGroup,Value=ContactFlow Name=ContactFlowName,Value="<問い合わせフロー名>" \
 --period 300 \
 --statistic Maximum \
 --comparison-operator GreaterThanOrEqualToThreshold \
 --alarm-actions <アラームアクションの ARN> \
 --evaluation-periods 1 \
 --threshold 1 \
 --treat-missing-data notBreaching
```

ちなみに、アラームごとに CloudWatch が欠落データポイントを次のいずれかとして処理するように指定できます。デフォルトの動作は missing です。
・missing - このアラームは、状態を変更するかどうかを評価する際に、欠落データポイントを考慮に入れません。
・notBreaching - 欠落データポイントはしきい値内として扱われます。
・breaching - 欠落データポイントはしきい値超過として扱われます。
・ignore - 現在のアラーム状態が維持される

## 5 CloudWatch コンソールで確認

設定した内容がCloudWatchコンソールに表示されていることを確認しました。
これでエラーが発生した場合もメールが飛ぶので安心です。

![CloudWatch.png](https://qiita-image-store.s3.amazonaws.com/0/367936/c6428427-4a14-2182-7a9c-0a125027aa0b.png)

## 6 最後に

今回は、Amazon CloudWatch メトリクスにおける Amazon Connect のモニタリングを設定してみました。
メトリクスはたくさんあるので、運用しながら精査して追加していきたいと思います。

## 7 参考にさせていただいたリンク

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html
https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/monitoring-cloudwatch.html
http://blog.serverworks.co.jp/tech/2018/05/08/ops-connect/
https://dev.classmethod.jp/cloud/tips-connect-cloudwatch-alarm/
関数を再帰法で引数が配列のときにも対応させる

例:2乗を出力する関数(square)
#配列に対応していない版

```python:square_1.py
# coding:utf-8

#関数本体
def square(x):
    #シンプルに2乗を計算する
    return x ** 2

#関数を呼び出す
ans = square(2)
print(ans)
```

#配列(リスト)に対応させた版

```python:square_2.py
# coding:utf-8

#関数本体
def square(x):
    if type(x) is list:  #引数がリスト配列のとき
        lsRet = []  #返り値はリスト型配列
        for cnt in range(len(x)):
            #配列の中身を再帰的に関数に渡して、返り値のリストに追加する
            lsRet.append(square(x[cnt]))
        return lsRet
    #引数がリスト配列ではないときはシンプルに計算
    else:
        return x ** 2

#関数を呼び出す
ans1 = square(2)  #引数が数値のとき
print(ans1)  #返り値は数値
#>>4

ans2 = square([2,3,4])  #引数がリスト配列のとき(1次元)
print(ans2)  #返り値は配列となる
#>>[4, 9, 16]

ans3 = square([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])  #引数が3次元のリスト配列でも対応
print(ans3)
#>>[[[1, 4, 9], [4, 9, 16]], [[9, 16, 25], [16, 25, 36]]]
```
#リストとタプルに対応させた版

```python:square_3.py
# coding:utf-8

#関数本体
def square(x):
    if type(x) in [list,tuple]:  #引数がリストかタプルのとき
        lsRet = []  #返り値はとりあえずリスト配列
        for cnt in range(len(x)):
            lsRet.append(square(x[cnt]))
        return type(x)(lsRet)  #配列の型を維持する
    else:
        return x ** 2

#関数を呼び出す
ans1 = square((2,3,4))  #引数がタプル配列のとき(1次元)
print(ans1)  #返り値はタプルとなる
#>>(4, 9, 16)

ans2 = square([([1,2,3],[2,3,4]),([3,4,5],[4,5,6])])  #リストのタプルのリストの...とかでも対応
print(ans2)
#>>[([1, 4, 9], [4, 9, 16]), ([9, 16, 25], [16, 25, 36])]
```

#まとめ
Pythonらしく書くならイテレータを使った方がいいのかな?
こういう再帰関数の使い方ってありなのかな？
御意見やアドバイスがあればコメントしてください！
Rails + Mongoid で MongoDBのバージョンを3.4→3.6に上げる時の注意点

公式の手順に沿って上げるだけと思いきや、意外とつまづいたのでここに記します。
マニアックな問題なので、該当する人は少ないかと思います。

#前提
### Rails
```ruby:Gemfile
gem 'rails', '~> 5.2.1'
gem "mongoid", "~> 7.0"
gem 'mongo', '~> 2.8'
```

```yaml:mongoid.yml一部抜粋
production:
  clients:
    default:
      database: production
      hosts:
        - [PrimaryのIP]
        - [SecondaryのIP]
      options:
        read:
          mode: :primary
```

###Mongodb
レプリカセット
Primary,Secondary,Arbiterの3台構成
OS: Ubuntu18
aptでインストール

```shell:バージョン
$ mongo --version
MongoDB shell version v3.4.19
```

#バージョンアップ手順
MongoDBのバージョンアップ自体は簡単です。
こちらの手順に従って更新します。
https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/

aptでインストールしている場合、各サーバで行うことは、source.listを更新してapt upgradeするだけです。

```shell
$ sudo rm /etc/apt/sources.list.d/mongodb-org-3.4.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
$ sudo systemctl stop mongod
$ sudo apt update
$ sudo apt upgrade
$ sudo systemctl start mongod
```
```shell:バージョン
$ mongo --version
MongoDB shell version v4.0.8
```
バージョンアップできました。

#Mongoidのエラー
Mongoid側は基本的には特に変更なく、普通に使えました。
しかし、このように個別のクエリーでSecondaryをreadすると

```ruby
User.read(mode: :secondary_preferred).first
```

下記のエラーが。

```
not master and slaveOk=false (13435)
```

ログを見てみると、Secondaryに対して、何故かmode: primaryでクエリを投げています。
これではエラーになります。

```
MONGODB | [SecondaryのIP]:27017 〜 $readPreference"=>{"mode"=>"primary"}
```


どうやら、mongoのFeatureCompatibilityVersionが3.6の状態だと発生し、3.4だと発生しないようです。
FeatureCompatibilityVersionの変更方法はこちら。

```
db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )
```

#解決策
mongoid.ymlを変更することで一応解決しました。
下記の部分を外します。
readのmodeはデフォルトがprimaryなので特に変わりはありません。

```yml
      options:
        read:
          mode: :primary
```

そうすると、FeatureCompatibilityVersionが3.6でも指定したmodeになり、エラーは発生しなくなりました。

```
MONGODB | [SecondaryのIP]:27017 〜 $readPreference"=>{"mode"=>"secondaryPreferred"}
```

どうもmongoid.ymlの設定を優先してしまっているようです。
mongo-ruby-driverのバグ？仕様変更？
現状原因不明です。

#参考
https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/
https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/
[servo] Exception: Your system's gstreamer libraries are out of date (we need at least 1.12). でこける場合の対処法

エラーログは以下

```
Exception: Your system's gstreamer libraries are out of date (we need at least 1.12). If you're unable to install them, let us know by filing a bug!

  File "/Users/ykonomi/servo/python/servo/build_commands.py", line 286, in build
    env = self.build_env(target=target, is_build=True)
  File "/Users/ykonomi/servo/python/servo/command_base.py", line 612, in build_env
    if self.needs_gstreamer_env(target):
  File "/Users/ykonomi/servo/python/servo/command_base.py", line 560, in needs_gstreamer_env
    install them, let us know by filing a bug!")
```

原因の箇所. check_gstreamer_lib では, ```subprocess.call(["pkg-config", "--atleast-version=1.14", "gstreamer-1.0"], stdout=PIPE, stderr=PIPE) == 0```
が実行される。どうやら、pkg-configの実行が原因でエラーになっている模様。

```
    def needs_gstreamer_env(self, target):
        try:
            if check_gstreamer_lib():
                return False
        except:
            # Some systems don't have pkg-config; we can't probe in this case
            # and must hope for the best
            return False
        effective_target = target or host_triple()
        if "x86_64" not in effective_target or "android" in effective_target:
            # We don't build gstreamer for non-x86_64 / android yet
            return False
        if sys.platform == "linux2":
            if path.isdir(self.get_gstreamer_path()):
                return True
            else:
                raise Exception("Your system's gstreamer libraries are out of date \
(we need at least 1.12). Please run ./mach bootstrap-gstreamer")
        else:
                raise Exception("Your system's gstreamer libraries are out of date \
(we need at least 1.12). If you're unable to \
install them, let us know by filing a bug!")
        return False
```

```pkg-config gstreamer-1.0 --debug``` を実行したところ libffi がインストール
されていないと出力されたため、改めて入れ直した。すると、以下のログが出力された。どうやら、```/usr/local``` へのシンボリックリンクが生成されていないため、エラーになっていた模様。

```
==> Reinstalling libffi
==> Downloading https://homebrew.bintray.com/bottles/libffi-3.2.1.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libffi-3.2.1.high_sierra.bottle.tar.gz
==> Caveats
libffi is keg-only, which means it was not symlinked into /usr/local,
because some formulae require a newer version of libffi.

For compilers to find libffi you may need to set:
  export LDFLAGS="-L/usr/local/opt/libffi/lib"

For pkg-config to find libffi you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/libffi/3.2.1: 16 files, 297.0KB
```

素直に、```export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"```
を実行して解決した。
<script>の中をコメントアウトするやつ、なんなん？

掘り出し物大市。

# TL;DR
ガラケーとIE3対応がなければ不要。
まずその前にスクリプトはhtmlから.jsに切り分ける。

# 経緯
XHTMLの管理画面を触っていて、ふとこんなのを見かける。

```XHTML
<script type="text/javascript">
<!--
// 省略
// --> </script>
```
この`<!--`と`// -->`でjavascriptを囲むのが一体何者なのか気になり、調べてみた。

## コメントアウトの目的
scriptタグ内が表示（レンダリング）されてしまわないようにする、のは知っていたが、
一体、何に対しての配慮なのかは見当がつかない。

teratailで丁寧に回答されている方が居た。
https://teratail.com/questions/28215#reply-44118
拙い知識で時系列順にまとめると、

- [HTML3.2](http://www.doraneko.org/webauth/html32/19970114/Overview.html#script)  
scriptタグの中は将来的にスクリプトに使用し、ブラウザでは**非表示にする**旨の記述
- [HTML4.01](http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/scripts.html#h-18.3.2)  
scriptタグを理解しないブラウザのための、**コメントアウト方法**について勧告  
（ここで上記のコメントアウト方法が出たんですね。）
- [XHTML](http://www.doraneko.org/webauth/xhtml10/20000126/Overview.html#h-4.8)  
scriptタグ内で`<![CDATA[`と`]]>`で囲う
- [HTML5](http://momdo.github.io/html5/scripting-1.html#restrictions-for-contents-of-script-elements)  
そもそも認識の仕方が違うので、**コメントは不要**

というところか。

つまり、HTML4.01時代であれば必要だったこともあったが、**HTML5で書き始めたら、コメントアウトは不要**である。
XHTMLなら`<![CDATA[`と`]]>`で囲うということで、あのコメントアウトは何の意味も為していなかった...。

# 結論
いま自分の書いているコードに疑問を持とう。
俺でもわかるansibleのextra-varsでdict型の指定する

an死bleが好きすぎて夜も寝れない俺ですこんにちは

dict型のvarはこんなかんじで指定します。

```
ansible-playbook -i <inventory_file> <playbook_name> --extra-vars="{'aaaa':{'bbbb': 'cccc'}}"
```

よい安死ブルライフを!
npm@6.9.0でnpm installしたら出来なかった

## 現象

タイトル通り、Macで`npm@6.9.0`で`npm install`しようとしたら以下のようなエラーが出ました。

```
npm WARN tar EISDIR: illegal operation on a directory, open '/Users/username/workspace/node_modules/.staging/@emotion/memoize-08ad4918/dist'
```

## 解決策

調べたところ、どうも6.5以降にすると起きるようなのでダウングレードするか、
以下の様にディレクトリの所有権を自分に変更してから`npm install`すると出来るようです。

```
sudo chown -R $(whoami) ~/.npm
sudo chown -R $(whoami) /usr/local/lib
sudo chown -R $(whoami) /usr/local/bin
```

詳しくは以下に書かれています。

- https://npm.community/t/global-installs-sudo-npm-i-g-fail-on-mac-after-6-5-upgrade-works-fine-after-6-4-1-downgrade/4082/10
Dartで Hello, World! したいひと

> Dartとは、Googleによって開発された・・・

そんなのはどうでもいい、WebとかFlutterとかじゃなくて、
俺はDartで **Hello, World!** したいんだ！！

## インストール

`$ brew tap dart-lang/dart`
`$ brew install dart`


`$ dart --version`
`Dart VM version: 2.2.0 (Tue Feb 26 15:04:32 2019 +0100) on "macos_x64"`


## プログラミング

`$ vi hello.dart`

```dart:hello.dart
main() {
  print('Hello, World!');
}
```

## 実行

`$ dart hello.dart`
`Hello, World!`

**いじょ**
wicketのAjax機能を使ってみる

Wicketで作成されているWebアプリケーションで、画面の動的更新がしたいとなったとき
jQuery使おうとしたけど、WicketにAjax機能があることを知ったので試してみた。

今回は、テキストエリアのフォーカスが外れた時に入力値をチェックするAjax処理を実装。

## 実装例
* Java

```
public class BasePage extends WebPage {

  public maintProcedureCellOpenCloseForvCenterUpdate() throws Exception {
  
    // 入力項目定義
    Form<Void> form = new Form<Void>("form");
    add(form);

    final TextField<String> text = new TextField<String>("text", new PropertyModel<String>(this, "text"));
    form.add(text);

    // ajaxで表示を変更するlabel定義
    final MultiLineLabel label = new MultiLineLabel("label", "label");
    label.setOutputMarkupId(true);
    add(label);

    text.add(new AjaxFormComponentUpdatingBehavior("onblur") {

        @Override
        protected void onUpdate(AjaxRequestTarget target) {

        // TODO: 任意のバリデーション処理実装
        
        label.setDefaultModelObject("バリデーション結果を設定");
        
        // 画面を更新
        target.addComponent(label);
        }
    });
  }
}
```

動的に更新する要素に対して、 `setOutputMarkupId(true)` を設定する必要がある
設定しない場合、画面更新時にエラーになる

* HTML

```
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
<head>
    <meta http-equiv="Content-Type" content="text/html charset=UTF-8">
</head>
<body>
    <wicket:extend>

    <pre wicket:id="label">内容</pre>
    <form wicket:id="form" method="post">
      <input type="text" wicket:id="text" />
    </form>

    </wicket:extend>
</body>
</html>
```
WEBページの文字を直接編集してみるブックマークボタン


## まえおき
以前、こんな記事を書きました

**HTMLデザイン検収に、WEBページを直接WYSIWYGできる「jQuery Console」を利用する**
https://qiita.com/RAWSEQ/items/8cb265318d1339940f66

```
これ、ワンタッチでできたらよくね。
```
とツッコミをいただきました。

**「開発ツールで該当の場所探して編集する」**という手間は省けたとしても
編集する為には**ウィンドウを開かなければいけない。**
クールじゃないですよね。

そこで 👇👇👇

## 本題

**EDIT PAGE -「WEBページの見た目（文字）を変えてみることができるブックマークツール」**
https://ltside.com/jqc/edit.html

ブックマークをクリックするだけで編集可能になります。
これで、HTMLデザインの幅チェックとか、文言変えた感じのチェックやデモンストレーションがクールにできます。

![editpageout.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/5dcc89f1-53c0-86e1-6eed-b421e5022081.gif)

実際はまあ、こんなことしてるだけですが・・

```javascript:javascript
document.querySelectorAll('*').forEach((e)=>{e.setAttribute('contenteditable',true)});
```

開発ツールのスニペット等が使い慣れている方は上記１行実行するだけでテキスト編集可能になります。

その他、相性よさそうなWYSIWYGツールがあれば組み合わせてみたいです。
「もうあるよ」って方も是非教えてください！
pythonのpickleはserializeのこと

Conflict resolution doesn't need to read new pickle data from the database #38
https://github.com/zodb/relstorage/issues/38

Python: オブジェクトを漬物 (Pickle) にする
https://blog.amedama.jp/entry/2015/12/05/132520

> Python の標準ライブラリにある pickle モジュールは Python のオブジェクトを直列化・非直列化するための機能を提供している。
エンジニア未経験だった俺が26ヶ月でRESTfulな神社のAPIを作ってみた話

バズるタイトルにしたかったのですが内容がそもそもそんな内容ではないよぉ〜と思ったので速度感の逆をついたタイトルにしました！
(ちなみに26ヶ月というのはエンジニアになってからの期間です…実際の作成期間は3ヶ月の間くらいです。)


# 背景
ちょっと趣味でいい感じの神社を検出してみたいと思い、まずは全国の神社データを扱うAPIを作成しましたッ
Qiita初投稿なのでお手柔らかにお願いします…


# やったこと
神社APIを作りました
使い方は二種類で

- 緯度経度渡すと周辺の神社検索できます
- また、郵便番号でも周辺の神社検索できます

# つくったもの
- [API定義書](https://swagger-shrine-api.herokuapp.com/docs)
- サンプルのAPIのURL
 - http://dev.oh-yeah-sea-kit2.work/shrine/master?lat=35.64827&lon=140.3472427&rad=10000



# なにつかってつくったのー？
- OS
    - CentOS7
- サーバ
    - nginx
- 言語
    - Python3
    - Ruby
- フレームワーク
    - flask
- データベース
    - Riak KV

API実装はPython3で作成しました
データをRiak KVへインポートする際にRubyを使用しました


# 利用したサービス
- ConoHaVPS
- GitHub(プライベートリポジトリ）

API定義のドキュメントで使いました！
- heroku
- swagger


#### 無料ドメイン
freenom（[https://my.freenom.com/clientarea.php](https://my.freenom.com/clientarea.php)）

####利用API
- Google MAP
- Yahoo!API

神社のデータを整形する際にお世話になりました


# 苦労したこと

デプロイ自体が初めてだったのでNginxの設定でJsonが途切れるとかあった。（正確にはサーバを動かすユーザの問題だったけど。。。）
その時、参考にしたページ[https://qiita.com/SuguruOoki/items/456ff7f6d1cfca017c3a](https://qiita.com/SuguruOoki/items/456ff7f6d1cfca017c3a)

ドメインの取得がよくわからなかったがググったらなんとなく出来た。
反映に時間があるとあったため出来たかどうか判別に時間がかかる。。。


## 反省点
GitHubにGoogleのシークレットキーをPushしてしまったので対策として今後は環境変数でそのあたりは保持するように実装。
キー関係は環境変数で扱うようにしないとパプリックにした時にヤバイ…


## 今後

今後は、APIから周辺の神社の所在地を表示するWebシステムを作る予定…
現在はとりあえずReactで画面の地図にピンを刺すところまで完了してる（人にやってもらってしまったけれど）

以上そんな感じ！


# 追記
## APIをhttps対応させました！(2020/03/08)
ついでにドメインをfreenomからお名前ドットコムに変更しました。

### 利用サービス
- Cloudflare
- お名前ドットコム

### URL
- https://dev.oh-yeah-sea-kit2.work/shrine/master?lat=35.64827&lon=140.3472427&rad=10000
    
### 参考URL

- [【完全無料】Herokuで独自ドメイン + HTTPSに対応する【Rails】](https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d)
C#でビルド時にCS0006 メタデータが見つかりませんでしたエラーが出たときの対処

# はじめに
* とあるC#のソリューションを、別PCから持ってきてリビルドしようとするとエラーとなった
* 対処方法を備忘用に記録

# エラーの内容
* リビルド時のエラーメッセージは以下のもの
* dllの参照設定は実施しなおしたが、エラーは継続して発生するので、どこかに古い設定が残ってしまっているのかも

```
CS0006 メタデータが見つかりませんでした 引越し前PCのローカルパス\参照しているdll
```

# 古い設定の場所
* 確認してみるとcsprojファイルに以下設定が存在していた

```xml
<ItemGroup>
  <Analyzer Include="引越し前PCのローカルパス\参照しているdll"/>
</ItemGroup>
```

# 対応方法
* Analyzer Includeの設定が不要なので、テキストエディタで適当に削除
* 削除後に改めてリビルドすると、正常に実行できた

# まとめ
* csprojファイルの古い設定に気をつけよう
[iOS] Named colors do not work prior to iOS 11.0

Tipsです
ググっても出てこなかったので


事象：
最低バージョンiOS12で作っているのに、"Named colors do not work prior to iOS 11.0"というビルドエラーが出る。

原因：
StoryboardのBuildTargetが低い

<img width="260" alt="スクリーンショット 2019-04-03 15.11.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/c4a04a64-f89d-de3f-763f-62c022ca7896.png">

いじったつもりはないんですが、何かの拍子に下がったんですかね？
Jupyter Notebook から Q# を動かす

公式リリースの通り、Q# のコードが Jupyter Notebook から利用できるようになったので備忘のためメモ。公式ブログの紹介はこちら。[Quantum Development Kit Update brings Q# to Jupyter Notebooks - Microsoft Quantum](https://cloudblogs.microsoft.com/quantum/2019/03/27/quantum-development-kit-update-brings-q-to-jupyter-notebooks/)

### 利用手順

1. [Installing the Jupyter Notebook](https://jupyter.org/install) に従って Jupyter をインストール。公式の推奨通り Anaconda を利用した。
2. SDK を最新にアップデート。 (注 [Quantum Development Kit preview release notes](https://docs.microsoft.com/en-us/quantum/relnotes/?view=qsharp-preview) にある通り、Jupyter での動作は Version 0.5.1903 以降でしかサポートされない)
3. [Getting Started with the Microsoft Quantum Development Kit](https://docs.microsoft.com/en-us/quantum/install-guide/?view=qsharp-preview) に従って IQsharp をインストール

    ```
    dotnet tool install -g Microsoft.Quantum.IQSharp
    ```

4. [Getting Started with Jupyter Notebooks and Q#](https://docs.microsoft.com/en-us/quantum/install-guide/jupyter?view=qsharp-preview) に従って、iqsharp のインストール

    ```
    dotnet iqsharp install
    ```

5. 起動

    ```
    jupyter notebook
    ```

6. Q# を選んで実行すると結果が得られる。今回はアダマールで処理するだけのサンプルを実行。

```cs
open Microsoft.Quantum.Extensions.Diagnostics;
operation HelloQ() : Unit {
    mutable result = Zero;
    using(q = Qubit()) {
        H(q);
        DumpMachine();
        set result = M(q);
        Reset(q);
    }
    Message($"Result: {result}.");
}
```

実行時の Gif は以下。

![GIF2.gif](https://qiita-image-store.s3.amazonaws.com/0/59544/1d530dff-934e-4190-84aa-c28fabd6fea1.gif)

ちゃんと `DumpMachine` で量子ビットの状態も出力できました。Q# のお勉強がはかどりそうですね。

### 参考情報

- [Quantum/Notebook.ipynb at master · Microsoft/Quantum](https://github.com/Microsoft/Quantum/blob/master/Samples/src/IntroToIQSharp/Notebook.ipynb)
- [Quantum/Notebook.ipynb at master · Microsoft/Quantum](https://github.com/Microsoft/Quantum/blob/master/Samples/src/Teleportation/Notebook.ipynb)
RailsでHTMLCollection/NodeListを使うとき。（JavaScript)


<h1>RailsでHTMLCollection・NodeListを使う</h1>

今回、getElementByClassNameやquerySelectorAllで要素を取得してイベントを登録する際に引っかかったっ点を備忘録として記述しておく。

まず、要素を取得する時点からミスっていたのでその原因の究明から先に行った。

まず、Railsから要素が取得できていなかったので次のようなコードを書いた。


```javascript
var menuSeconds = document.getElementsByClassName('menu__second');
var profiles    = document.querySelectorAll('.profile-lists li a');
console.log(menuSeconds);
console.log(profiles);
```

getElementsByClassNameでは戻り値がHTMLCollection、querySelectorAllでは戻り値はNodoListsとなる。

<img width="713" alt="スクリーンショット 2019-04-03 14.20.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/278066/3337df07-7b79-2deb-68c5-d78e0da990ff.png">

ちなみに矢印をクリックすると中の要素が表示されるがHTMLCollectionの中身は全て表示され、lengthも表示される。NodeListsは中身もなく、lengthも0と表示される。
しかし、HTMLCollectionで取得できた要素ですら、いざ使用しようと思うとなぜかできない。
念の為、console.logでそれぞれのlengthを出してみよう。

```javascript
console.log(menuSeconds.length);
console.log(profiles.length);
```

<img width="713" alt="スクリーンショット 2019-04-03 14.28.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/278066/2165692a-01ac-7950-8544-907a9d5dffd7.png">


するとどちらの要素もlengthが0で何も取得できていないことがわかる。

なぜか。簡潔に言うとこれはJavaSctiptがDOMがrenderされる前に走っているから。つまりHTMLのbodyが読み込まれる前にスクリプトが読み込まれているから。<strong>Rails上で先にjsファイルが読み込まれていた。</strong>

解決策は
1.HTMLのbodyの最後にscriptタグで囲んで書く。
2.下記のようにDOMが読み込まれるのを待つ記述をする。

```javascript
(function() {
  'use strict';
   document.addEventListener('DOMContentLoaded', function(e) {
     var menuSeconds = document.getElementsByClassName('menu__second');
     var profiles    = document.querySelectorAll('.profile-lists li a');
     console.log(menuSeconds.length);
     console.log(profiles.length);
   });
 })();
```

のように書くと、
<img width="713" alt="スクリーンショット 2019-04-03 14.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/278066/1bd04279-48ce-0c97-8ae6-27f291a05924.png">

上のようにちゃんと取得される。

また、NodeListsから一つの要素を取り出す際は、profile[0]のように配列と同じでいいが、HTMLCollectionから取り出す際は、menuSeconds.item[0]と、itemをつける必要がある。


<h1>イベントリスナーを登録したい</h1>

取得した要素にイベントリスナーを登録したいときの処理も備忘録のため。

まず前提としてHTMLCollectiondにはforEachは使えない。よってfor文を使おう。

```javascript
for (var i = 0; i < menuSeconds.length; i++) {
  menuSeconds.item[i].addEventListener('mouseover', function() {
```

のように書き始めていた。が、

これだとクロージャが生成されずカウンター変数が保持されないためどこから参照してもlengthの値しかカウントされないらしい。

よって中で即時関数を定義することで解決できる。

```javascript
for (var i = 0; i < menuSeconds.length; i++) { function(n) {
  menuSeconds.item[n].addEventListener('mouseover', function() {
  .
  .
  .
  }, false);
 })(i);
```
これでちゃんとイベントが登録されているはず。

NodeListsはforEachが使えるので、

```javascript
profiles.forEach( pf => {
  pf.addEventListener('mouseover', function() {
  .
  .
  .
```

などとかけば登録できる。

まだまだ未熟者なので至らない箇所があればぜひコメントください。
もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜どんどんエラーを解いてみよう！〜

#エラーを克服せよ

エラー解決の数をこなしていくうちに、プログラミングスキルが徐々に覚醒しつつある もそ。
前はあまりにエラーが解決できず奇声を発しそうになっていたのですが、だんだんと考え方のコツをつかんで落ち着きを取り戻した今、波紋の呼吸を修得しつつあります。
プログラミングだし、スタンド名はOKコンピューターとかがいいかな〜

![無題1180.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/1bdf1043-a6e8-1e8a-ae83-a9d4a67ae59b.jpeg)


...さっそく話がそれてしまいました。
今回も引き続き、エラーを解決していこうと思います。

##エラー発生！名探偵もそ、出動！

まずはエラー画面を見てみましょう。

<img width="1075" alt="0403.png" src="https://qiita-image-store.s3.amazonaws.com/0/372174/f64f5e2b-b224-148d-7f55-7811a2b0f5db.png">

精神を乱さず、まずは冷静に英文を読みます。

１行目を読んでみると「NoMethodError in Tweets#index」と表示されていますよね。
これは、

**「tweetsコントローラのindexアクションを読み込んだ時に、メソッドがなかったよ〜」**

という内容です。
さらに２行目を見てみると、「部分テンプレートファイルの6行目に記述している`tweet__path`の部分でメソッドが定義されていない」と出ています。


##仮説を立ててみる

これまでの経験と勘から、”NoMethodError”と出ているので**メソッドの名前とコントローラのアクションが一致していないのでは？**と考えました。

そこで改めて部分テンプレートファイルの記述を確認してみます。
でも、詳細ページを表示するためのHTTPメソッドはgetで合っているはず。


う〜〜む、これは難題な予感です。

![無題1178.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/a878e63a-d175-bac7-23da-1e3bf9fe1633.jpeg)

##名探偵もそ、ターミナルを捜査（操作）

ここでエラーの原因箇所がビューファイルにない可能性も考え、ターミナルに**rake routesコマンド**を実行しました。
rake routesすることで**ルーティング名やルートパス、コントローラとアクションに対応するHTTPメソッドを確認**することができます。

ここで実際のrake routes結果を見てみましょう。
<img width="1126" alt="0403-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/372174/1949bcd4-b166-9acb-9482-10a758ef0749.png">


表示されている内容についてカンタンに説明します。
薄きみどり色（もそカラーをイメージして設定してみました）の１列目の表記ですが、

・Prefix...ルーティング名
・Verb...HTTPメソッド
・URI Pattern...ルートパス名
・Controller#Action...コントローラ名#アクション名

を表しています。

画像内の下の方、ブルーボックスで中途半端に選択してしまっている

`tweets　 GET  　   /tweets(.:format)                                                                       　tweets#index`

この部分が今回エラーを起こした処理になります。
思ったとおり、HTTPメソッドはやはり間違っていないようです。
原因はどこにあるのか...ターミナルの実行画面を見ていると、もそはハッと気がつきました。

**「あれ？ほかのtweetsコントローラ全然表示されてなくない？？」**

本来であれば、tweetsコントローラのファイルで定義した各アクションが並ぶはずです。
でも実行結果をよく見ると、**tweetsコントローラのindexアクションしか表示されていません**。


##エラー解決編

この結果を踏まえて、**原因はルーティングにあると断定**しました。

コントローラファイルの記述がごっそり抜けている可能性もなくはないのですが、この部分は30弱の記述があります。
この部分がまるっと無くなっていたらさすがに気がつくだろうと考え、今回は先にルーティングを検証することにしました。


さっそくルーティングファイルを開き、記述を確認してみます。

```error_routing.rb
Rails.application.routes.draw do
  devise_for :users
  root  "tweets#index" do

resources :tweets 
  resources :comments, only: [:create]
end
  resources :users, only: [:show]
end
```

よ〜〜く見てみましょう。

...
...！！！
**３行目のdoの記述位置、間違ってるやん！！**

resourcesメソッドはコントローラとアクションの設定をかんたんに行ってくれる便利なメソッドで、基本となるコントローラの7つのアクション名に対して、ルーティングを自動で生成してくれます。
詳しくは[こちらの記事へ](https://qiita.com/moso/private/ab977ef481de308cd82c)。

記述の仕方はこんな感じです。↓

```rb
resources :コントローラ名 do
```


さらにここでは、resourcesメソッドを**ネスト**という入れ子構造にしています。
そんなわけで、正しい記述はこちら↓

```routing.rb
Rails.application.routes.draw do
  devise_for :users
  root  "tweets#index" 

resources :tweets do
  resources :comments, only: [:create]
end
  resources :users, only: [:show]
end
```

なかなかの難題でしたが、名探偵もそ、見事に解決しました！

![無題1185.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/8f3aaa61-4e78-6f14-0dcf-707cad4cd9bd.jpeg)


--
エラー解決は難しいですが、解けるとなるほど面白い！もっと頑張ろう！と前向きな気持になれます。
次の目標も決まってきたので（※スタンド発動ではありません）、復習をしつつエラーに挑戦していこうと思います。
...続く。
Windows 10 ProでWindowsサンドボックス導入方法（2019/04/03現在）

Windows Server2016のゲストにWindows10をインストールし、WIndowsサンドボックスを導入しました。

#導入方法
・Windows Updateをおこない、最新の状態にしておく。

・https://insider.windows.com/ja-jp/getting-started/#register
上記からMSアカウントで開発者登録をおこなう。

・Windows 10 ProのWindowsの設定の更新とセキュリティのWindows Insider Programを選択

・開発者登録をしたMSアカウントでログインし、Insiderの設定をファストを選択後、Windows Updateを行う。

・Windows 10 Proがバージョン1903になる。

・「ここに入力して検索」欄から「コントロールパネル」を検索し選択

・表示方法を小さいアイコンに変更

・プログラムと機能選択

・Windows の機能の有効化または無効化選択

・Windows サンドボックスにチェックを入れてOKボタン
<img width="311" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/92797/eca3c1f9-749f-cf70-a285-6fe6ddf6c5da.png">

・「必要な変更が完了しました」とメッセージが出たら再起動する。

・再起動後はアプリ内にWindows Sandboxが追加されている。