OmniAICreator/Qiita-1.07M huggingface dataset:
LanScope Cat v8.4.2.0⇒v9.2.0.0

#LanScope Cat v8.4.2.0⇒v9.2.0.0

##画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/82563e12-26eb-8dea-3cc6-e93ca48c89b9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/5f76da4a-f11a-2d70-8230-b070d303286d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/d534f307-36cf-c404-b039-066386ccfa09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/f53cd35b-b472-8a71-9257-81675948a714.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7238e836-3b4a-24f5-9037-0bc49d76bb99.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/19ef6f4a-5e13-588f-e379-62de5fd05ce3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/30e28843-4a5a-ec70-ab5b-7fcf27981b7e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/b429687c-1f58-4e08-1efe-ad608b546dc7.png)
9.2．0.0なったよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/bf3482a3-e8c0-64c4-4397-1cf00a930ac1.png)




#バージョンアップ後にやること（クライアントのアップデート）
###MR　※DAも同様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/fff5be8e-1968-5562-ba5e-05eab3c6ea98.png)
MRの管理→バージョンアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/be7c30d8-c727-7370-06bf-fc897298104f.png)
下の方にあるバージョンアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/2b760924-9443-0baf-2e03-d8c3f8491ef3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/15348aad-03e1-278e-ba76-9f1486b68b15.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9a4ecbe5-6346-6869-89d0-87a17dce4cf5.png)
成功ってなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/20d53c2c-da3e-dc8f-8c5a-bca1a1375085.png)
あとはクライアントを再起動すればバージョンが上がって見えてくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/6d25ebaf-e963-0bab-90d5-c696503a5f85.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/03feb035-b1eb-0702-2aa0-126626f39083.png)



#バージョンアップ後にやること（DA、MRインストーラーの作成）
画面はインストールのURL参照
Pythonのマルチコア並列処理でクローリングを高速化

複数のサイトから情報収集する用事があり、簡単なクローラーを書いていたのだがサイトが増えると遅くてしょうがない。そこでmultiprocessingで並列処理してみたらコア数の分だけ高速化できた気がするので公開。

```py
from multiprocessing import Pool
from multiprocessing import Process

import feedparser
import time

keyword = ''
feed_urls = [
    'https://www.theverge.com/rss/index.xml',
    'https://gizmodo.com/rss',
    'https://www.cnet.com/rss/all/',
    'https://techcrunch.com/feed/',
    'https://news.ycombinator.com/rss',
    'http://feeds.arstechnica.com/arstechnica/index/',
    'http://feeds.mashable.com/Mashable',
    'https://hub.packtpub.com/feed/'
]

def function(n):
    count = 0
    feed_result = feedparser.parse(feed_urls[n])
    for entry in feed_result.entries:
        flag = False
        try:
            if keyword in entry.title.lower():
                flag = True
            if keyword in entry.content.lower():
                flag = True
            if keyword in entry.description.lower():
                flag = True
        except:
            pass
        if flag == True:
            print(entry.title)
            print(entry.link)
            print()
            count = count + 1
    return count

def multi(n):
    p = Pool(4) #最大プロセス数
    result = p.map(function, range(n))
    return result

def main():
    global keyword
    print("input keyword:",end='')
    keyword = input().rstrip().lower()

    start = time.time()
    hit_count = 0
    data = multi(len(feed_urls))
    for i in data:
        hit_count = hit_count + i
    print(hit_count)
    print(time.time() - start)

main()
```

こちらを参考にしました。

https://qiita.com/yotayokuto/items/23798d5fc75017d5a8b3
RubyでOpenWeatherMapを使って天気を取得してみた

# はじめに
Rubyを使って何かできないか考え、ふと天気が取得できたらいいなと思ったのがきっかけです。

# 環境
macOS Mojave(10.14.4)
Ruby 2.6.3

# OpenWeatherMapについて
現在の天気と天気予報を行ってくれるサイトです。
またAPIを利用することで、以下機能を無料で実行できます。

 - 20万以上の都市を含む、あらゆる場所の現在の天気データにアクセス
 - 4万以上の気象観測所からのデータと、グローバルモデルに基づいて天気を頻繁に更新
 - JSON、XML、HTMLフォーマットでデータを取得可能
 - ３時間毎の天気を5日後まで取得可能

# API Key取得

[OpenWeatherMap](https://openweathermap.org/)にアクセスします。
![スクリーンショット 2019-05-02 21.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406773/79c42b2e-0727-14e3-fef1-e1df50a5ede1.png)

Sign upをクリックし、アカウントを作成します。
![CreateAccount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406773/dfd2b4f6-7765-b3b5-fec2-67f66ad0b720.png)

アカウントを作成すると、登録したメールアドレス宛にメールが届きます。
その中にAPI KEYがあります。

# 取得処理
こちらの記事を参考にさせていただきました。
[無料天気予報APIのOpenWeatherMapを使ってみる](https://qiita.com/nownabe/items/aeac1ce0977be963a740)

調べたい場所は東京を指定しました。

```ruby
response = open(URL + "?q=Tokyo,jp&APPID=#{API_KEY}")
puts JSON.pretty_generate(JSON.parse(response.read))
```
# 取得結果
5/2 22時過ぎごろに実行したときの取得結果です。

```
{
  "cod": "200",
  "message": 0.008,
  "cnt": 40,
  "list": [
 ・・・略・・・
    {
      "dt": 1556841600,
      "main": {
        "temp": 291.03,
        "temp_min": 291.03,
        "temp_max": 292.081,
        "pressure": 1015.3,
        "sea_level": 1015.3,
        "grnd_level": 1012.9,
        "humidity": 40,
        "temp_kf": -1.05
      },
      "weather": [
        {
          "id": 803,
          "main": "Clouds",
          "description": "broken clouds",
          "icon": "04d"
        }
      ],
      "clouds": {
        "all": 83
      },
      "wind": {
        "speed": 1.19,
        "deg": 84.806
      },
      "sys": {
        "pod": "d"
      },
      "dt_txt": "2019-05-03 00:00:00"
    },
  ・・・略・・・
  "city": {
    "id": 1850147,
    "name": "Tokyo",
    "coord": {
      "lat": 35.6828,
      "lon": 139.759
    },
    "country": "JP",
    "population": 8336599
  }
```

5/2 24時ごろは曇りのようですね。
broken cloudsが83％となっているので、ちぎれ雲のようなものが空のほとんどを占めているようです。

比較のためにヤフー天気を見てみました。
![スクリーンショット 2019-05-02 22.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406773/105b873d-b12a-6305-b692-1fb542c6ed5b.png)
雲ひとつないですね、全く逆ですね。。。

# まとめ
予報は外れているものの、APIを使用した取得は面白かったです。
他にも天気予報のAPIを公開しているところがあるようなので、OpenWeatherMapと他を組み合わせながら出力すると面白いと思います。

またOpenWeatherMapは都市のIDや、郵便番号や緯度経度も指定できるようなのでそちらも試してみます。

その際には天気のアイコンも出したいですね。
Node-RED系の記事のまとめ

# まとめ
Node-RED系の記事をまとめました。

## 本質系?
* [Node-REDの本質を1枚のイメージにしてみた](https://qiita.com/kazutxt/items/220fc0f6435f6683a718)

##　基本編
* [Node-REDでできること part1 (基本機能編)](https://qiita.com/kazutxt/items/e13026dd33c8b4b95560)
* [Node-REDでできること part2 (応用編)](https://qiita.com/kazutxt/items/99a6c660b3af53f7af3c)
* [Node-REDでできること part3 (ライブラリ編)](https://qiita.com/kazutxt/items/4aba57a44a6a0a5e0970)
* [Node-REDでできること part4 (自作ノード編)](https://qiita.com/kazutxt/items/acf4f62dd0c4470d43a0)
* [Node-REDでできること part5 (ダッシュボード編)](https://qiita.com/kazutxt/items/b088d0577521ec06c3b3)
* [Node-REDでできること part6 (TIPS編)](https://qiita.com/kazutxt/items/72701bee1783edaacaa6)

## 実践編
* [Node-REDを使ってブラウザに喋った内容を各SNSに通知する](https://qiita.com/kazutxt/items/19cd4bca52da73ffaf62)
* [Node-REDを使ってブラウザに喋って複数の動画を制御する](https://qiita.com/kazutxt/items/c6b8500c97a41c42c6b0)
* [Node-REDとWatsonAssistantを使ってLineBotを作る](https://qiita.com/kazutxt/items/088191ab656d91bbd72a)
* [スキルを開発しないでNode-REDとAmazonEchoをつなぐ](https://qiita.com/kazutxt/items/d8dda820ab253f553e80)
* [Nature RemoとNode-REDでテレビを操作する] (https://qiita.com/kazutxt/items/e7ca6c062eff0f279455)
* [Node-RED+RaspberryPiの基本(ボタンを押してLEDをつける)](https://qiita.com/kazutxt/items/56cfdb94b5bc2973b70b)
* [複数のNode-REDを連携させる] (https://qiita.com/kazutxt/items/1f4290cbe587551f4e84)
* [Google Next HubとNode-REDを連携させる] (https://qiita.com/kazutxt/items/9951fcca415be500b33c)
* [GoogleNestHubとNode-REDで強制英語リスニング環境を作る](https://qiita.com/kazutxt/items/06aeb991a08d5e7bc256)
Clovaで「抵抗値換算」のスキルを作ってみる（３）

# はじめに
[前回](https://qiita.com/ufoo68/items/5158bb3fb78f4d91ced6)の続きです。~~今回も~~今回は技術的にたいしたことやってないのですが、スキルに「カラーコードの覚え方」を教えるインテントをつくりました。

# 実装
以下のような連想配列を用意しました。DataBaseを使おうと思いましたが、使うほどの内容ではないので~~逃げました~~使わないという判断をしました。  

```js
const howToMemorize = {
    橙 : "橙はミカン",
    灰 : "ハイヤー",
    白 : "四苦八苦",
    紫 : "紫しち部",
    緑 : "さつきみどり",
    茶 : "茶を一杯",
    赤 : "赤いニンジン",
    青 : "青虫",
    黄 : "四季の色",
    黒 : "黒い礼服"
};
```

覚え方は[このサイト](https://www.jarl.org/Japanese/7_Technical/lib1/teikou.htm)と自分が過去に使った覚え方を参考にしました。
テストはこんな感じで動きました。
![テスト６.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/d2c44c90-1f3e-44ea-8042-960248fe2434.jpeg)


# 残った課題
とりあえず簡単な機能の実装ができました。
今回はClovaのスキル作りの練習のつもりだったのでとりあえず完成させることを目標にしましたが、個人的にこれが課題だなと思っていることが２つあります。
1. カラーコードのパターンを一々「スロット」に登録しなければならないこと
2. スロット中の「キロ」や「メガ」の単位の処理
この`1.`については[この記事](https://qiita.com/imajoriri/items/6e84cd0ff8fad28b3fe9)の`sessionAttributes`を使えばできそうだと思うのですが、呼出し（リクエスト）の回数を記憶する方法を調べる必要がありそうですね。
次の`2.`についてはビルトインスロットの`CLOVA.UNIT`を使えば簡単にできそうだと思ったのですが、[この記事](https://qiita.com/daisukeArk/items/0af7a83d9f4e3abcf736)を見る限り「キロ」などの単位は切り捨てられた形でスロットを受け取るっぽいので、この場合は「キロ」の数値のみを受け取るという前提で（そもそもメガΩの抵抗なんて電子工作初心者が使うことは多分無い）処理をするという方向が実用上は問題ないかなと考えましたが、そのためにはスロットのタイプが`CLOVA.NUMBER`か`CLOVA.UNIT`かを判定する必要があるのでその辺を調べないといけないですね。

# さいごに
そろそろ別のLINE開発（liffとか）を勉強したいので。「抵抗値換算」スキルの記事を書くのはここまでにして審査の方に進もうかなと思います。
まだ課題は残っていますが、ボチボチバージョンアップしていこうかなと考えてます。とりあえず[このイベント](https://engineering.linecorp.com/ja/blog/clova-skillawards-201904/)があるので早めに審査に進みたいです。
句読点を「、。」→「，．」と変換する .vimrc

普段，句読点を「，．」を標準としています．
でも，世の中の多くの文章は「、。」で，コピペしたときにいちいち変換するのが面倒だったので，`.vimrc`に設定を書きました．

## 設定

こんな感じです．

```vim:.vimrc
" convert punctuation marks
nnoremap <Leader>cp :%s/、/，/ge<CR>:%s/。/．/ge<CR>
vnoremap <Leader>cp :s/、/，/ge<CR>gv:s/。/．/ge<CR>
```

## 変換例

ノーマルモードで`<Leader>cp`と打つとバッファ全体について変換します．

```:何も選択せずに実行
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない。
これは世間を憚はばかる遠慮というよりも、その方が私にとって自然だからである。
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
```

↓

```
私わたくしはその人を常に先生と呼んでいた．
だからここでもただ先生と書くだけで本名は打ち明けない．
これは世間を憚はばかる遠慮というよりも，その方が私にとって自然だからである．
私はその人の記憶を呼び起すごとに，すぐ「先生」といいたくなる．
筆を執とっても心持は同じ事である．
よそよそしい頭文字かしらもじなどはとても使う気にならない．
```

ビジュアルモードで行選択して`<Leader>cp`と打つと，選択範囲だけ変換します．

```:2-3行目を選択した状態で実行
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない。
これは世間を憚はばかる遠慮というよりも、その方が私にとって自然だからである。
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
```

↓

```
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない．
これは世間を憚はばかる遠慮というよりも，その方が私にとって自然だからである．
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
```

## 参照

* [Vimの一括置換時に '継続' 表示で処理を止めない方法 - エンジニアなプログラマ](http://y-ishida.hatenablog.com/entry/2014/04/28/094528)
* [vim 文字列置換 基本的な事 - Qiita](https://qiita.com/shirochan/items/a16487d0739f455b5e8a)
ウイルスバスター コーポレートエディション 11⇒SP1適用

#ウイルスバスター コーポレートエディション 11⇒SP1適用

##画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7c62dd53-c5d5-fb69-f5e1-9387e42dc074.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7fc7f4d0-479d-517d-6c9a-1d20f2c260a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/489ebc47-af74-09ed-425c-39ee74909050.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7a0d0235-8753-f0c7-e2fe-56275fe8db2f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/ebf32a92-f490-ead0-4596-47ecd906f4f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7d512940-5c43-71bd-8811-97db926baa5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/3d591f40-6172-cac1-0689-609b7f971d00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/ea2a413d-961d-f24c-bf92-0f3ac884ab1b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/418de0df-80cd-9f8e-88de-e2e34356e9f0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/57813b4e-6105-58f3-1417-dd35cd85949a.png)
～再起動～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/cb47590d-817e-611b-e0bf-1312a0d209e4.png)


###クライアント側からの見た目
SP前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/f9a9302a-8bb8-0262-667e-e3209137d455.png)

SP後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7965e65c-7b56-dca2-37f9-25b1c7db1520.png)
スキルを開発しないでNode-REDとAmazonEchoをつなぐ

# はじめに
## やりたいこと
* AmazonEchoに喋ったことをNode-REDで取得したい
* 基本的な使い方は関連記事を参照してください。

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)


## 動作環境
* IBM bluemix Node-RED : v0.20.5

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください

# 本編

## 全体の流れ
1. Node-RED Alexa Home Skill Bridgeにアカウントを作成しデバイスを登録する
2. Amazon AlexaアプリでAlexaスキル「Node-Red」スキルを追加する
3. Node-REDにnode-red-contrib-alexa-home-skillをインストールする
4. ノードを配置し、アカウント情報を入力する
5. echoに向かってしゃべる

## Node-RED Alexa Home Skill Bridge
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/1d217469-dbf0-f28b-10bb-17ed5e16ec19.png)

* アカウントを作って、いろいろと登録する
* 日本語も使えるので全然大丈夫
* 最後にデバイスの検出をしないと反映されないので注意

## スマホでの確認
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/7250c430-0172-0533-6130-e45f475965d9.png)

## フロー
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/6a95cf2c-43d2-6a2a-523d-31220993577d.png)

* 絶対に駄目というでは、`msg.payload = false` を入れています
* 詳しくは公式ドキュメントを参照ください
    * https://alexa-node-red.bm.hardill.me.uk/docs

## 補足
* スキルの開発は一切なし
* 自由に話すことはできない。。。
    * たとえば、デバイス名をコード。気温と紐づけておいて、`コード10を実行` のようなことをすれば、工夫次第でいろいろと応用できると思います。
* レスポンスも少しだけいじれる
    * 開始がSkillBridgeである必要がある
    * auto Acknowledgeをオフにして、6秒以内に回答する必要がある
初心者がVue.jsのVeeValidateでハマったこと

##送信ボタンを押してもバリデートがかからない。

という問題。

フォーム自体にはリアルタイムでちゃんとバリデーションがかかる。

でも送信ボタンを押したらバリデーションスルーして進んじゃう。

なんでだ…。

VueやVeeValidateのインストールは割愛しますが、CDNで読み込んでいます。

```
new Vue({
  el: '#valid',
  methods: {
    validate() {
      this.$validator.validateAll()
       .then((result) => {

　　//ここにifとかでtureの場合falseの場合の処理を書かないといけなかった！ 
		if(result=== true)
		{
		trueの時の処理	}  
		else{　　falseの時の処理   }
    
      });
    }
  }
});
```
なぜか巷の情報の多くではこの分岐させる処理がなくて、バリデーションスルーして次のページに行ってしまっていたので、一応そこでつまっている方のために残しておきます。


（もしかしたらCDN版特有でnpmとかなら必要ない処理なのかな…？　そんなわけないか。）
Alexaスキル開発  対話型ゲームのシナリオ作成ツール  Twine

テンプレートの[アドベンチャーゲーム](https://github.com/alexa/skill-sample-nodejs-adventure-game)を日本語化した際に得た知見を記載します。

# テンプレート_アドベンチャーゲームの概要

Alexaからの質問に答えながら、ストーリーを進めていく対話型のゲーム。
オフィスの一室から出口を目指す脱出ゲーム(Escape the Office)で、今回はそれを日本語化しました。

# Twine 2 online editor

Escape the Officeのシナリオを日本語かするにあたり[Twine 2 online editor](http://twinery.org/2/)というオンラインツールを利用しました。
テンプレートの[アドベンチャーゲーム](https://github.com/toctoc0352/skill-sample-nodejs-adventure-game)のlambda/custom/Escape the Office.htmlをTwineにインポートするとダッシュボードにEscape the Officeが表示され、クリックすると以下のような修正画面が表示されます(※図は画面の中央に表示されるため、ブラウザをスクロースする必要があります。)各四角形のブロックの中にシナリオが英語で書かれてあるのでそれを日本語に置き換えます。

<img width="1231" alt="スクリーンショット 2019-05-02 22.26.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406177/32cd532c-ca96-190b-e87f-cdcf67a786e3.png">

また、各ブロックをクリックしたときに以下のようなポップアップが表示されるのですが、
[[]]で囲われいる箇所は次の遷移先先のブロックを表しており、[[表示文字列|遷移先ブロック名]]という書式になっています。

<img width="693" alt="スクリーンショット 2019-05-02 22.35.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406177/83c63b2b-eeba-edeb-8a4b-7442e7ac972d.png">


# リポジトリ

Escape the Officeを日本語化した"オフィスからの脱出"を以下のリポジトリにアップしたので参考までに。
https://github.com/toctoc0352/skill-sample-nodejs-adventure-game/tree/master/lambda/custom
ウイルスバスター コーポレートエディション 11　クライアントインストール

#クライアント側画面（１）
ブラウザでマネージャーにHTTPして、「こちらから」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/01c148dc-3a50-6f43-03c3-340df3335925.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/2343695d-a108-691a-17ef-ff58faef0db5.png)
こんな感じでやってもOK

#クライアント側画面（２）
（１）の部分で「インストールしない」にして、下に進むとパッケージもあるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/baea662e-7b3b-5025-fb74-c3bb97b6afbe.png)
サイズ感は、こんなもん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/c40ea55e-dd07-7c7e-56cf-942de55389fe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/5dabc705-b6d9-a830-4fac-98b3144baa88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/63a0e428-d5ee-d5a6-b85c-1afd2359a599.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/d982370f-4ade-6e59-3c31-0d96b81f00ea.png)
問答無用！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9d96602a-8167-0506-d5d2-7e54276fa440.png)



#マネージャー側画面
1台見えてきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/dedc9fe8-948f-892c-96c9-83f187ffae98.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/c4d9c6a9-a592-2309-d22a-17f92d6551fa.png)
バージョンはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/10a9d408-914f-dd5c-0c0c-d3c4414e153c.png)
うちゅういちかんたんなポートフォリオのつくりかた

<img width="678" alt="スクリーンショット 2019-04-19 6.49.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/3cd386f6-d1fc-bd2f-6b3b-6edcd590ea07.png">

GitHubを使って以下のようなポートフォリオを作る方法です。
 [@suikasu123 PORTFOLIO](https://suikasu1.github.io/)

###1.Git/GitHubにアカウント登録をします。
　Gitは、[Gitの使い方はサルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)、
　GitHubの使い方は[GitHub 入門 ～アカウントを作成する方法～](http://proengineer.internous.co.jp/content/columnfeature/7103)、
　テキストで統括的に進めたければ、[わかばちゃんと学ぶ Git使い方入門](https://amzn.to/2vrCMcj)がおすすめです。
　また、ターミナルではなく視覚的に使いたいということであれば、SourceTreeをインストールします。
　[SourceTreeのダウンロードとインストール方法](http://proengineer.internous.co.jp/content/columnfeature/6983)
  　[はじめてのSourceTree（使い方編）](https://qiita.com/naoki85/items/c7660d70347e9e70b201)

###2.テキストエディタをインストールします。
　Windows：デフォルトの「メモ帳」でOKです。（インストール不要）
　Mac:「Brackets」（無料）がおすすめです。
　　　 デフォルトのメモ帳は使わないことをお勧めします。（拡張子が変更できないため。）

###3.以下のサイトから、テンプレートをダウンロードします。
　[ポートフォリオHTMLテンプレート](https://webdesigner-go.com/template/portfolio/)

###4.各種アイコンをダウンロードします。
　テンプレ内に、「SKILL」「CONTACT」という項目があります。そちらは、自分でアイコンを用意する必要があります。
　「SKILL]は、自分のスキル（RubyやSwift)に適したアイコンを下記からダウンロードします。
　[Devicons](http://vorillaz.github.io/devicons/#/main)
　「CONTACT」は、自分で設定したい連絡先（メールやTwitter）に適したアイコンを下記からダウンロードします。
　[icooon-mono](http://icooon-mono.com/)

###5.自分の制作物のキャプチャやセルフィーなどの掲載したい画像を、「img」直下の各フォルダに移動します。
　（ローカルフォルダ）
　latestworks-自分の直近の成果物の画面キャプチャ
　works-自分の今までの成果物の画面キャプチャ
　profile-自分のセルフィーやイメージ画像
　skill-自分のスキルのアイコン（手順５でダウンロードしたもの）
　contact-自分の連絡先のアイコン（手順５でダウンロードしたもの）
　img直下-アイキャッチ画像（SNSでシェアした時に表示される画像）

###6.ポートフォリオの中身を作成します。
　デスクトップに「portfolio-template」フォルダが作成されています。
　その中にある「index.html」をテキストエディタで開きます。
  テンプレートが開かれるので、デフォルトのデータを自分のものに書き換え、保存します。
　また、各項目の画像を自分のものに差し替えます。
　デフォルトの画像が差し込まれているところに、自分の画像の名前を入力するだけでOKです。
　例）「goal.png」という名前の画像を挿入したい場合
　<img width="359" alt="スクリーンショット 2019-04-30 7.06.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/228ab9dc-ad38-9b9e-75c9-41064b53251a.png">

###7.GitHubで新しいリポジトリを作成します。
　「Repository name」は「○○○○.github.io」とします。
　　例：suikasu1.github.io
　それ以外は、通常のGitHubの使い方と一緒です。

###8.手順7までで作成したテキストデータや画像等を、ローカル→SourceTree→GitHubへ連携させます。
　以下の手順を参考にしてください。
  　[SourceTreeのダウンロードとインストール方法](http://proengineer.internous.co.jp/content/columnfeature/6983)
  　  [はじめてのSourceTree（使い方編）](https://qiita.com/naoki85/items/c7660d70347e9e70b201)

###9.GitHubへプッシュ後、ポートフォリオを見てみましょう。
　手順9でポートフォリオが完成していますので、早速見てみましょう！
　リンクは「https://○○○○.github.io/」という形式で見れます。Twitterなどでぜひシェアしましょう！

手作りじゃなくていいから手っ取り早く作りたいなぁという人は、[RESUME（レジュメ）](https://www.resume.id/)というサービスもおすすめ。
こちらはコーディングの知識がなく簡単に作成できます。
私のページは[こちら](https://www.resume.id/suikasu123)
「Cannot add task 'wrapper' as a task with that name already exists.」が出た


## 原因

使用しているGradleのバージョンが5.X(5系)の場合、以下の「task wrapper」の記述は使えない。

```
task wrapper(type: Wrapper) {
    gradleVersion = '4.4'
    distributionUrl = distributionUrl.replace("bin", "all")
}
```

## 対応

「task wrapper」 → 「wapper」に記述を修正したら正常に動いた。
↓こんな感じ。

```
wrapper {
    gradleVersion = '4.4'
    distributionUrl = distributionUrl.replace("bin", "all")
}
```
SOQL発行後のList型空チェック

select文のクエリを発行しました。
結果がゼロ件じゃなかったらなにか処理をしたいです。
そんなとき、書き方が人によってまちまちなことに気づいたのでマジメに検証してみました。有耶無耶にするのは良くないことです。
ちなみに以下に結論は載っています。
https://salesforce.stackexchange.com/questions/77173/list-isempty-vs-list-size-0-vs-list-null
https://qiita.com/s_hayashida/items/15e2fcadd2140702aa96

```
List<Account> accList = new List<Account>();
List<Account> dummyList = new List<Account>();
String fakeId = 'xxxxxxxxxx';
accList = [select id,name from Account where id = :fakeId];
System.assertEquals(accList, dummyList);
if(accList == dummyList){
    system.debug('等しい');
}
if(accList.isEmpty()){
    system.debug('クエリ発行の結果が空かどうか判定するならこれだけでOK');
}
```

これをOpen Execute Anonymous Windowに貼り付けて動かせば一目瞭然です。
結果がゼロ件でもList型はnullにはならないので安心して`!accList.isEmpty()`を使えます。`accList.size() > 0`でもいいですね。どっちかに限定すると論争が起きるのではないでしょうか。私は`isEmpty()`派です。

気になっていたのはこんな書き方でした。

```
if(accList != null && !accList.isEmpty()){
    system.debug('確かに空じゃないときだけ処理されるけど...');
}
```

初学者が初めて変数の空チェックを書いたときにString型のnullチェックと混合して書いていたのが癖になってしまったように見えます。「ようわからんけどエラー怖いし条件2つ付けとこ...」といったノリです。私がそうでした。

List型の宣言にはこんな方法もありますが、いずれも結果はnullではなく空です。念のため。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_list.htm

```
List<String> strList = new List<String>();
List<String> copiedList = new List<String>(strList);
system.debug(copiedList);
```
```
Set<String> strSet = new Set<String>();
List<String> copiedList = new List<String>(strSet);
system.debug(copiedList);
```

Listがnullになるのは`=null`で明示的にnullを代入したときだけなので、nullチェック自体がナンセンスということですね。
検証漏れてるよって場合は指摘お願いします。
コメントの書き方【コメントアウトのショートカット】

こんにちは、アキトです。

本日は、コメントアウトの仕方をお伝えします。

ソースコード中の文字をコメントにすることをコメントアウトと言います。

コメントアウトした文字は、コメントなのでプログラムとして実行されません。

メモみたいなイメージですね。

下記の画像のようにコメントアウトしたいコードの前に「#」をつけることでコメントアウトできます。
<img width="694" alt="スクリーンショット 2019-05-02 22.21.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/67931b0c-dd93-7f4b-04a5-7d42f61ace84.png">

ショートカットキーは、コメントアウトしたい文字列を選択して「command + /」です。
<img width="662" alt="スクリーンショット 2019-05-02 22.24.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/7f635921-8288-208c-4883-e35ced8bee49.png">
LanScope Cat v8 install

#LanScope Catインストール(v8)

##環境
LanScope Cat　8.4.2.0
SQL Server 2008 Express

##画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/789a6638-79d5-ca6f-32fb-025a03527b15.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/c9422a34-9aa7-2f4e-a105-278d22400369.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/2b74262e-25e2-94d9-489f-c80314927bb7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/5802bf5f-efab-0a97-7ba6-fc58997d305e.png)
注意！.net framework3.5をインストールしていないとエラーが出るので入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/a1cc5ad3-7f97-3a09-d0d7-fcf15528f37e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/ba632ac5-68c9-9e2e-9366-e9ea5c0064f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/21f0a915-9a33-8c9a-42a3-c0224aebd1eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/e9e0ebb6-9007-0efa-7c04-600210f5f61b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/0060d6b9-ec50-e5c3-19a7-0671c54084ed.png)
→.netをインストールして再実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7b44aef2-ffe0-acc7-c51a-1b005e51d66b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/cbd90e54-77fd-7f06-34a1-77c041793447.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/457f3801-95a9-4922-fdd2-c26ad93a16d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/fc3c4235-9fe9-2ae6-d80f-2efce1d36238.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/fb569b3c-6d1c-758e-1acc-498a3ebe0a4e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/f6f1386d-3868-d97e-ac5d-baaa3744fe30.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/8287d78f-da5f-12ee-d764-f24c718c8efd.png)
できあがり


##.net framework インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/c7cddd01-5b75-42b7-7788-7d2c980cda92.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/158ef318-7f3c-8c36-690c-32f726d32daf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/fbc24851-2c49-252d-4d8c-e98941217f68.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/e9b00e9a-5147-0015-a096-d6d71dba1c98.png)
何も選択せず次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/d57e7cfb-54c6-2c50-782e-91460b0e34b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7cf40893-56d8-78f0-e217-2eff139a23f3.png)
代替ソースパスを指定（大抵はOSのCDに入ってる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/5023aa7c-c92e-5414-8a18-d3fdfd3e1c20.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/836b50a6-fcea-c585-b035-2627779226f7.png)
長い道のり(The Long Road)について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/431158d1-720f-34ce-65d7-c8d8eb67c723.png)

こちらの本を読んでパターンを1つずつまとめ
個人的に実践可能そうなものから

## アプレンティスシップ・パターンとは
アプレンティスシップとは徒弟制度のことで、よく起きる問題への共通の解決策に実際なっているものをパターン化したもの

### アプレンティスであるということは
**今まで行ったことや今やっていることをより良く、さらに賢く、もっと速く行う方法が常にあるという態度を基本的に持つこと**

## 前提
- あなたの曖昧で暗黙の知識を他の人々が共有できると、安易に思い込まない事
- パターン同士は結びついているので、あるパターンを既に知っているという事は未知のパターンを辿る事ができる
- 優れたプログラマになる方法を教えるのではなく、優れたプログラマになるための学び方を教える

## 長い道のり(The Long Road)とは
長期視点でキャリアパスを描きましょうということ

## 傾向
素早い結果といったものに価値を置く文化の中に私達は暮らしている
世代間の知識の伝承は意外とされていない

## 問題
あなたの熱意と人々があなたに期待していることは対立する時がある
給与や昇進とスキルの構築スピードがトレードオフになる


## 解決方法
周囲から少し変だと思われるかもしれないことを受け入れる
長期的な成長の機会に価値を置く

## ポイント
- 技術から永久に離れることも選択できる正当で有益な道であり、誰もが1つの道を歩むべきということではない
- ソフトウェア開発は複雑で奥深く、元来継続的に変化する道であり、特定の技術を乗り越えて問題の本質に切り込むことを可能にする
- キャリア全体を技芸に費やすことで、扉を閉ざすようなビジネスや技術領域は存在しない

## 行動
- 未来のあなたが担える奇妙な役割を想像する
- どのような経験に挑戦したいか考える
- 思考実験を通してキャリア選択を計画する

## 関連パターン
- 別の道(A Different Road)
- 自分の地図を描く(Draw Your Own Map)

## 書籍情報
Dave H. Hoover (著), Adewale Oshineye (著), 柴田 芳樹 (翻訳), アプレンティスシップ・パターン
https://amzn.to/2UCKF9D

## 雑感
エンジニアリングに限らず大事な考え方とは思う
メルカリのメルペイ還元の最適値を計算するシートを作成

# メルカリのメルペイで還元イベントをやってますが毎日の使用ポイントがいくらなのかを割り出します。

金額合計計算プログラムはExcelが得意とする分野の一つだと思います。

残り日数は5/3,4,5,6の4回で毎日70%還元ポイントを使い切る条件です。
5/3日に使う額を基準値にします。
残り2500Pの場合のExcelシートは以下の通り

|  | A | B | C |
|:--|:--|:--|:---|
| 1 | 日付 | 使うP | 深夜１時の還元P |
| 2 | 5/3 | 1400 | =0.7*B2 |
| 3 | 5/4 | =C2 | =0.7*B3 |
| 4 | 5/5 | =C3 | =0.7*B4 |
| 5 | 5/6 | =C4 | =0.7*B5 |
| 6 | 還元P |   | =SUM(C2:C5) |

これを実際の数値にすると

|  | A | B | C |
|:--|:--|:--|:---|
| 1 | 日付 | 使うP | 深夜１時の還元P |
| 2 | 5/3 | 1400 | 980 |
| 3 | 5/4 | 980 | 686 |
| 4 | 5/5 | 686 | 480.2 |
| 5 | 5/6 | 480.2 | 336.14 |
| 6 | 還元P |  | 2482.34 |

初回1400円チャージして5/7の1時に336P残ります。
2482.34Pバックされたのでかなりお得です。
残った分336Pも購買に利用できます。
計算して日割りで数値化できると財布のシステム改善になるとおもいます。
B2セルを1410円にすると2500Pを超えます。
B2セルの値を変えるといくらで2500Pに達するか割り出せます
既に1500P使ってしまった場合はC6が1000PになるようにB2の値を決めます。
50%の場合は割引率0.7を0.5にすると割り出せます。
50%と70%を混在させた場合も実績データを反映させて毎日調整すればできそうです。

テストは無料のiPhone用Excelを使って行いました。
iPhoneでもExcelが動きます。
シグマ計算はExcelでやると視覚的にわかりやすくて便利だと思います。
【WebGL】texImage2DでArrayBufferViewを使う

WebGLでテクスチャを作成するときに、`texImage2D`の`pixels`引数にArrayBufferViewを渡せるようなので試してみました。具体的に使用できるArrayBufferViewの型や`type`引数の組み合わせは[MDNのドキュメント](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D)を参考にしてください。

以下のサンプルコードでは、512x512のテクスチャを作成しています。一つのピクセルにRGBAの4要素を格納するので、`Uint8Array`の大きさは`texWidth*texHeight*4`になっています。x要素が大きいほど赤色に、y要素が大きいほど緑色が強くなるようにしています。`Uint8Array`を使用しているので`type`引数には`gl.UNSIGNED_BYTE`を使用しています。

```js
const texWidth = 512;
const texHeight = 512;
const pixels = new Uint8Array(texWidth * texHeight * 4);
for (let y = 0; y < texHeight; y++) {
  for (let x = 0; x < texWidth; x++) {
    const offset = 4 * (x + texWidth * y);
    pixels[offset + 0] = 255 * (x / texWidth);
    pixels[offset + 1] = 255 * (y / texHeight);
    pixels[offset + 2] = 255;
    pixels[offset + 3] = 255;
  }
}

const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texWidth, texHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.bindTexture(gl.TEXTURE_2D, null);
```

サンプルのソースコード全体は以下に置いておきました。
https://gist.github.com/aadebdeb/e65b88d6efe421a734038dbc654d5208

作成したテクスチャを四角形のメッシュに張り付けると以下のようになり、意図通りの色になっています。
![arraybufferview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/2e415b62-6221-87d8-58f9-36336cf7012a.png)
ArrayBufferViewを使うと任意の値を書き込んだテクスチャをCPU側で作成することができます。メッシュの表面に張るテクスチャを作成する以外に、シェーダーには定義できる定数に限りがあるので大量の定数がシェーダー側で必要な場合にも使用できるのではないでしょうか。
laravel 備忘録

#composerのインストール
```
ninja@localhost:~$ curl https://getcomposer.org/installer | php
ninja@localhost:~$ sudo mv composer.phar /usr/local/bin/composer
```
#unzipのインストール(laravelでプロジェクト作成時に怒られるので)
```
sudo apt-get install unzip
```

#laravelでプロジェクト作成
```
ninja@localhost:~$ composer create-project --prefer-dist laravel/laravel website
ninja@localhost:~$ sudo chmod -R 755 website/storage/
```

#nginxのroot変更
``` /etc/nginx/sites-available/default.
ninja@localhost:~$ sudo vi /etc/nginx/sites-available/default

root /home/ninja/website/public;

nginxを再起動
ninja@localhost:~$ sudo service nginx restart
```

ブラウザからアクセスする。
http://xxx.xxx.xxx.xxx
Zabbix最新版をインストールする

# はじめに
zabbixの最新版（現時点で4.2.1）をインストールしたので備忘録。

以下のページを参考にしています。

https://qiita.com/canonkissx4/items/11623b27b98cb175ffe2

[公式マニュアル](https://www.zabbix.com/documentation/4.2/manual/installation/install_from_packages/rhel_centos)


# 環境

- OS: CentOS 7.6
- Zabbix
  - Version: 4.2.1
  - WEB: apache
  - DB: mariadb

なお、`firewalld`と`SELinux`はどちらもdisable。



# インストール

今回は`yum`にてインストール。
[Zabbix Official Repository](http://repo.zabbix.com/)からダウンロード。

```bash
rpm -ivh http://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm

yum install -y zabbix-server-mysql zabbix-web-mysql
yum install -y zabbix-agent
yum install -y mariadb mariadb-server
yum install -y httpd httpd-devel
```

### 指摘があったので追記(2019/7/6)
日本語のUIも使用する場合は以下もインストール。

```bash
yum install -y zabbix-web-japanese
```

# ユーザ追加

zabbix用のユーザを登録する。

```bash
groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
```

# DBの設定

mariadbを起動

```
systemctl enable mariadb.service
systemctl start mariadb.service
```

zabbix用のデータベースを作成。（パスワードはzabbix）

```
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
quit;
```

サーバーの初期スキーマとデータをインポート。

```bash
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
```


# zabbix_server.confの編集

`/etc/zabbix/zabbix_server.conf`の84行目あたりからDBの設定が記載されているため、自身の環境に合わせて編集。
(DBPasswordはコメントアウトされているため、追記。)

```:zabbix_server.conf
DBHost = localhost
DBName = <DB_name>
DBUser = <DB_user>
DBPassword = <DB_password>
```

# WebUIの設定

WebUI用のApache設定ファイル（`/etc/httpd/conf.d/zabbix.conf`）を編集する。
タイムゾーンの設定がコメントアウトされているため、`Asia/Tokyo`に設定する。

```:zabbix.conf
# php_value date.timezone Europe/Riga
↓
php_value date.timezone Asia/Tokyo
```

# zabbix-serverの起動

自動起動を有効化し、zabbix-serverを起動する。

```bash
systemctl enable zabbix-server
systemctl start zabbix-server
systemctl start httpd
```


# Installation

zabbixを起動後にブラウザからzabbixサーバのURL（`http://<server_ip_address>/zabbix/`）へアクセスすると、以下のような画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311994/b68ba044-c0df-e75b-a6cb-9a0a524d28ea.png)

2つ目の"Check of pre-requisites"の"Next step"をクリックしても次の画面に遷移しなかったため、以下を参考にして、設定を追加。

http://www.zabbix.jp/node/2942

`/etc/zabbix/web/zabbix.conf.php`というファイルを作成し、以下の内容を記載。


```php:zabbix.conf.php
<?php
// Zabbix GUI configuration file
global $DB;

$DB['TYPE']     = 'MYSQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '0';
$DB['DATABASE'] = '<DB_name>';
$DB['USER']     = '<DB_user>';
$DB['PASSWORD'] = '<DB_password>';

// SCHEMA is relevant only for IBM_DB2 database
$DB['SCHEMA'] = '';

$ZBX_SERVER      = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = '';

$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
?>
```

再度zabbixサーバのURLにアクセスすることでログイン画面が表示される。


# あとがき

ここが間違っている。とかあればコメントもらえるとありがたいです。

これをAnsibleで自動化することが今後の課題。。。
ExchangeServer on Azure メール送受信注意点メモ

ExchangeServer2013をAzure上で構築し、O365との送受信で苦労したため、メモ

1.Port25問題
・Azure上はポート25で外部向けの通信がNGである。
Sendgridのような3rd partyアプリを活用するとポート25以外から送信できる
2019/5現在、Azureのポータル上からSengGridは追加できる。（一番安いプランは無料）
2.スマートホストの設定
・スマートホストにAzureで作成したsendgridのID/PWを正しく入力する。
・スマートホストを指定する場合グローバルIPはNGなため、プライベートIPを入力すること
3.コネクタのTLS設定
・Sendgridに限らずだがTLSの設定を送受信ホスト間で合わせること。送受信側のTLS利用有無が一致していないと送受信できない。
4.Azure仮想マシンのDNS設定
・ExchangeServerのマシンを正しいDNSを参照させる。OS上ではなく、AzurePortal上から設定すること。
5.仮想マシンのNSG
・メール送受信で利用するポートはInboud/Outbound双方で開放すること。
Docker コマンド チートシート

# はじめに
本ページでは、コンテナ型仮想化環境 Docker について、
初めて触るという方のために 主要なコマンド を掲載しています。

Docker コマンドの **チートシート** としてお使いいただくこともできますし、
掲載しているコマンドを上から順にお試しいただくことで、
Docker の動作を確認できる **ハンズオン** としてお使いいただくこともできます。

## 前提条件
* Docker がインストールされていること  
※未インストールの場合は、[こちら](https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e) を参考にインストールを実施してください。

## DockerHub
https://hub.docker.com/
Dockerコンテナを公開可能なインターネット上の共有リポジトリです。
世界中から、Dockerコンテナを取得・公開・共有することができます。

---
# Docker コマンド
上から順にコマンドを追うことで、ハンズオンとしてもお使いいただけます。

## Docker イメージ関連のコマンド

### DockerHubからDockerイメージを検索
```
$ docker search <IMAGE>

--------------------------------------------------
[ex] 'nginx' で検索
$ docker search nginx
```

### Dockerイメージの取得（Pull）
```
$ docker pull <IMAGE>[:TAG]

--------------------------------------------------
[ex] 'nginx:1.12' のDockerイメージを取得
$ docker pull nginx:1.12
```
tag指定を省略した場合、デフォルトで `latest` が指定される。

### 取得した Dockerイメージ 一覧を表示
```
$ docker images
```

### Dockerイメージの削除
```
$ docker rmi <IMAGE>[:TAG]

--------------------------------------------------
[ex] 'nginx:1.12' のDockerイメージを削除
$ docker rmi nginx:1.12
```

## Dockerコンテナ操作関連のコマンド

### Dockerコンテナを作成、起動
```
$ docker run -d -it --name <CONTAINER_NAME> -p <ホストのポート>:<コンテナのポート> <IMAGE>[:tag]

[ex] 'nginx:1.12' のDockerイメージから、'test-nginx'という名前のコンテナを作成。
　　　 コンテナの80ポートを、ホストの8080ポートでポートフォワーディング。
$ docker run -d -it --name test-nginx -p 8080:80 nginx:1.12
```
ローカルにDockerイメージが存在すれば、そのイメージを用いて起動。
Dockerイメージが存在しなければ、自動的にDockerHubからpullを行ってから起動。

#####nginx接続確認
ブラウザを起動し、`http://<ホストのIPアドレス>:8080` にアクセス。

#####起動オプション
- `-d`：コンテナをバックグラウンドで実行
- `-it`：コンテナの標準入力、およびtty（端末デバイス）の提供
- `--name`：識別しやすいようにコンテナにユーザ指定の名称を付与
- `-p`：ホストのIPをコンテナのIPとマッピング

### Dockerコンテナ 一覧を確認
```
$ docker ps -a
```
`-a` オプションをつけると、停止中のコンテナを含め全てのコンテナを表示

### Dockerコンテナ に接続
```
$ docker exec -it <CONTAINER> /bin/bash

[ex] test-nginx コンテナに接続
$ docker exec -it test-nginx /bin/bash
```

### Dockerコンテナ からログアウト
```
$ exit
```

### Dockerコンテナ と ホスト間で、ファイルやフォルダのコピー
```
### コンテナからホストへコピー
$ docker cp <CONTAINER>:<コンテナのパス> <保存するホストのパス>

### ホストからコンテナへコピー
$ docker cp <ホストのパス> <CONTAINER>:<保存するコンテナのパス>
```

### Dockerコンテナ情報を確認
```
$ docker inspect <CONTAINER>

[ex] test-nginx コンテナ情報を確認
$ docker inspect test-nginx
```

### Dockerコンテナログを取得
```
$ docker logs <CONTAINER>

[ex] test-nginx コンテナのログを取得
$ docker logs test-nginx
```
`--tail=10`：末尾から10行表示
`-f`：出力を表示しつづける

### Dockerコンテナ 停止
```
$ docker stop <CONTAINER>

[ex] test-nginx コンテナを停止
$ docker stop test-nginx
```

### Dockerコンテナ 再起動
```
$ docker start <CONTAINER>

[ex] test-nginx コンテナを再起動
$ docker start test-nginx
```

### Dockerコンテナ 削除
```
$ docker rm <CONTAINER>

[ex] test-nginx コンテナを削除（コンテナを停止させてから実行）
$ docker stop test-nginx
$ docker rm test-nginx
```

## 後片付け
ハンズオンとしてコマンドを上から順にお試しいただいた方は、
最後に Dockerイメージを削除すれば元どおりの状態になります。

```
$ docker rmi nginx:1.12
```
以上です。お疲れ様でした。
JP1の強制終了、再実行手順

JP1の強制終了と、再実行手順をここに記載します。
マニュアルから抜粋してきただけの内容です。

##停止
####JP1実行中のジョブネットやジョブを強制終了
http://itdoc.hitachi.co.jp/manuals/3020/30203S0932/AJSV0080.HTM
1.［ステータス監視］をクリック
2. ツリーエリアで，実行を強制終了したいジョブネットまたはジョブを管理するジョブグループをクリックする。
3.操作対象のジョブネット，または操作対象のジョブを管理するジョブネットをクリックし，［表示］－［デイリースケジュール］－［階層表示］を選択する。
4.ツリーエリアで，操作対象のジョブネットまたはジョブをクリックする。
5.手順4で選択したジョブネットまたはジョブについて，スケジュールエリアで，実行を強制終了したい四角をクリックする。または，実行結果リストで，実行を強制終了したい行をクリックする。
6.［操作］－［強制終了］を選択する。
7.［はい］ボタンをクリックする。


####起動条件監視中のジョブネットの停止
http://itdoc.hitachi.co.jp/manuals/3020/30203S0733/AJSJ0112.HTM
1.［デイリースケジュール］ウィンドウ，または［マンスリースケジュール］ウィンドウ表示
2.「監視中」状態の監視世代を選択し，［操作］－［強制終了］を選択
3.実行中」状態または「起動条件待ち」状態の実行世代が残っている場合は，実行結果リストに表示されている「実行中」状態の実行世代を選択し，［操作］－［強制終了］を選択
4.「実行中」状態のすべての実行世代が「強制終了」状態に変わるまで，手順3を繰り返す。
5.［JP1/AJS3 - View］ウィンドウのリストエリアに表示されている，実行登録を解除したいジョブネットを選択し，［操作］－［登録解除］を選択する。

##登録解除
実行登録の登録解除
http://itdoc.hitachi.co.jp/manuals/3020/30203S0932/AJSV0058.HTM
1.［登録解除］をクリック
2.実行登録を解除したいジョブネットを管理するジョブグループをクリック
3.操作対象のルートジョブネットをクリックし，［操作］－［登録解除］を選択
4.［解除方法］を選択する。
5.OK］ボタンをクリックする


##再実行
####実行予定があるジョブネットをすぐに実行する
http://itdoc.hitachi.co.jp/manuals/3020/30203K2443/AJSV0075.HTM
1.ジョブグループ（即時実行したいジョブネットを管理するジョブグループ）をクリックする。
2.操作対象のジョブネットのルートジョブネットをクリックし，［表示］－［デイリースケジュール］－［階層表示］を選択する。
3.ツリーエリアで，操作対象のジョブネットをクリックする。
4.手順3で選択したジョブネットについて，スケジュールエリアで，即時実行したい四角をクリックする。または，実行結果リストで，即時実行したい行をクリックする。
5.操作］－［計画一時変更］－［即時実行］を選択する。または，ポップアップメニューから［計画一時変更］－［即時実行］を選択する。
6.ジョブネットを即時実行する場合の，ネストジョブネットの扱いなどを指定する。
7.［OK］ボタンをクリックする。


####ジョブネットの再実行
http://itdoc.hitachi.co.jp/manuals/3020/30203S0133/AJSZ0073.HTM#A0077
1.［ステータス監視］が選択されていることを確認する。
2.ジョブネットを選択する。
3.［操作］－［再実行］を選択する。
4.［対象世代選択］ダイアログボックスで［結果］を選択する。
5.［再実行］ダイアログボックスが表示される。
6.［再実行方法］の［先頭から］を選択する。
7.［OK］をクリックする。これで、ジョブネットが再実行されます。
8.正常終了したことが確認する。
Scala入門_環境構築編

## 背景
今までJava、PHPをメイン言語としてきたが、次のアサイン先がScalaとなるため、
今回のタイミングで自分が学んできたことや経験してきたことを少しでもOUTPUTを
していければと思い、初めて行けたらなと思い記事を書いていこうとチャレンジ精神で
やっていければと思っています。
また、こういった記事は記載したことがないため、少しずつ記事の書き方等々を学びつつ
記事をかけていけたらと思う次第でございます。
## 環境構築
### 構築環境
OS：Mac
IDE：IntelliJ Ultimate(セールのときに購入)
言語：Scala(2.12.8)
ビルド：sbt
### IntelliJ 環境構築
- https://www.jetbrains.com/idea/download/#section=mac
にアクセスし、「.DMG」を選択。
「macOS,JBR 11(.dmg)」を選択し、ダウンロードが開始される。
![スクリーンショット 2019-05-02 21.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/30b624a2-ecea-25da-e4ca-2f0ab1e11515.png)

- ダウンロード完了後、アイコンをダブルクリックし「Application」ディレクトリに移動。
そうすると、イントールが始まるため案内に通りに進めていく。
![スクリーンショット 2019-05-02 21.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/adb65be7-7a83-e1c2-1200-670147217171.png)

- IntelliJ起動後、「command+,」->plugins->pluginの検索窓で「scala」と検索し、「Install」を押下。インストールされるため念の為、IntelliJを再起動
![スクリーンショット 2019-05-02 22.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/d40bbe29-d1ed-8bfb-4ea8-f59fdfc5a511.png)


- インストール完了後、英語が苦手なので日本語化
http://mergedoc.osdn.jp/#pleiades.html#PLUGIN

- IntelliJ再起動後、「新規プロジェクト」作成で、Scala->sbtを指定
![スクリーンショット 2019-05-02 21.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/292c7472-52f3-0087-fd49-5df72b76fc5d.png)
![スクリーンショット 2019-05-02 21.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/ab78d7cb-222d-aa20-d91f-d9fbc98d2657.png)
![スクリーンショット 2019-05-02 21.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409429/f6cec8de-a52f-5ae9-e047-c4bf63c502d8.png)

- 新規でIntelliJを入れた人は、そのままScalaクラスまで作成できたかもしれませんが、私の場合は前にKotlinで遊んでいたので、それが影響して？かKotlinをビルドするような構成にIntelliJがなってしまっていたので、少し解決に時間がかかりました。
その場合は、「command+;」->「ライブラリー」->「＋」->「Scala SDK」を指定すると、その後、「プロジェクト->src->main->scala」で「command+n」でScalaクラスが現れるかと思います。


## 終わりに
一旦ここまでで簡単に環境構築ができたかと思います！（結構荒いですが。。）
詳細については、今後更新していこうかと思います！
カプセル化とアクセス権について解説！   

# はじめに
- カプセル化とアクセス権について本やネットの情報から調べて理解したことをまとめました。
- もし、書いていることに何か間違いがある場合はご指摘いただけると嬉しいです。

# カプセル化とは
- プロパティの値を変更されてしまわないように、他のクラスからのアクセスを制限すること。
- プロパティをカプセルで覆うことで、触れられないようにするようなイメージ。

# アクセス権とは
- プロパティとメソッドへアクセスできる範囲を制限すること
- public、protected、privateをアクセス修飾子という

## アクセス修飾子の種類

|  アクセス修飾子  |  アクセスできる範囲  |
| ---- | ---- |
|  public  |  どこからでもアクセス可能  |
|  protected  |  そのクラス自身、継承したクラス、親クラスからのみアクセス可能  |
|  private  |  そのクラスからのみアクセス可能  |

# アクセス権のあるプロパティを操作するメソッド
- `getter（ゲッター）メソッド`と`setter（セッター）メソッド`を使うことで、アクセス権があるプロパティを操作することができる。

## getter（ゲッター）
- アクセス権があるプロパティの値にクラスの外から取得するメソッド
- 「getプロパティ名」のように書く。

### コード例

```php
<?php

class Products
{
	private $name = "パソコン";
	
	public function getName(){
		return $this->name;
	}
}

$product = new Products();

echo $product->getName();

?>
```

```php:実行結果
パソコン
```

## setter（セッター）
- アクセス権があるプロパティの値にクラスの外からセット（設定）するメソッド
- 「setプロパティ名」のように書く。

### コード例
```php
<?php

class Products{

	private $name;

	public function getName(){
		return $this->name;
	}

	public function setName($name){
		$this->name = $name;
	}
}

$product = new Products();

$product->setName("パソコン");

echo $product->getName();

?>
```
```php:実行結果
パソコン
```
Node-REDとWatsonAssistantを使ってLineBotを作る

# はじめに
## やりたいこと
* チャットボットを気軽に作りたい。Node-REDを活用する方向で!!
* 基本的な使い方は関連記事を参照してください。

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)


## 動作環境
* IBM bluemix Node-RED : v0.20.5

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください

# 本編
## 画面
![Screenshot_20190502-204816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/3af15f7f-4512-bd57-48c8-f3b415a563fb.png)

## IBM Watson Assistant
やりとりする会話の流れをskillとして定義しておく
ここではサンプルとして、自分が読んだ本のタイトル->目次->メモと辿れるようにしてあります。

![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/328abe8e-dd8e-3146-79c0-28d74f9906b0.png)


## 処理の流れ
1. 予めLineDevelopersのMessagingAPIを使い、Lineとやり取りできるようにしておく
2. スマホ/PCで該当のボットにつなぐ
3. Lineから文字列がくるとNode-REDのURLにデータが送られてくる
4. ユーザ入力部分をとりだし、IBM Assistantに送る(マルチユーザに対応できるようにユーザIDも移し替える)
5. 結果を受け取り、LineBotにPOST通信で送る

## フロー

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/884ff217-4a16-75d4-5437-27a963657c5a.png)

シンプルですし、かなり満足していますが、フリープランだとしばらく使わないと寝てしまうので少しだけこまりますね。。。
DNSサーバ(bind)を仮想マシンとして作成／＃１：VM作成

# 内部（自宅内）用に、DNSサーバを動かす
- DNS単機能なVMを起動させる、他サーバと同居しない。
- 単機能なので、VMのリソースは必要最小限にチューニングする。
- NW機器をモニタするソフトは入れる
- 問合せは内部のみ許可、外部からの問合せは拒否
- 再帰問合せはせず、内部のホスト名解決のみ行う

## VMの構築
| 項目 | 設定内容 |
| :--- | :--- |
| ■OS | CentOS7 |
| ■インストールタイプ | 最小インストール<br>必要最小限を追加 |
| ■DISK配置 | |
| /dev/sda | 16G以上、シンプロ |
| パーティション、ファイルシステム | LVMにて論理DISKを作成し、論理DISKはxfsでﾌｧｲﾙシステムを作成する(CentOS7デフォルト) |
| /boot | 1014M(インストーラのデフォルト) |
| / | 8GB(経験値から) |
| /var | 5.4G /dev/sdaの残り<br>拡張時は、別DISKへ移設※1 |
| SWAP | 1719M(インストーラのデフォルト) |
| ■メモリ | 1GB |
| ■NIC | 1枚(必要により追加) |
※1:CentOSは、syslogをjournaldで管理するように変更されている。journaldで作成されるジャーナルファイルは、一定量でローテートされ削除・追加されるがVM管理上(datastore)では、サイズが単純増加となる。ファイルの単純増加や、作成・削除が頻繁となるディレクトリ（/varなど）は、別の論理DISKへ切出しする。

## インストールするパッケージ
| Package | 用途 |
| :---- | :---- |
| bind,bind-utils,net-tools | DNSサーバ、DNS関連ツール(dig,nslookupなど) |
| coreutils,binutils,diffutils | Linuxの基本コマンド |
| net-utils,traceroute,tcpdump,wireshark,wget | NW系コマンド |
| net-snmp,net-snmp-utils | snmpd,snmp関連コマンド |
| vim,rsync,less,screen | 操作性向上 |
| httpd,php | 作業改善 |
| samba | ファイル共有 |
COURSERA ML MacOS X:10.14.1 Octaveの環境設定

私は今、courseraの'Machine Learning Stanford University'コースを受講してます。
MacOSでの環境設定に謎につまずいてしまいましたので、大したものではありませんがメモします。

#環境
- macOS:バーション10.14.1
- Homebrew:バーション2.1.1


#homebrewでインストール
色んな記事を見てOctaveの4.00がどうやらsubmitの関数を呼び出す際、エラーになるようなことが書いていましたが、4.01からは直るみたいなので適当にコンソールで

```
brew install octave
```

と実行して講座を受けて行きました。
そうすると途中でsubmit関数を実際に実行してみようみたいな部分があり、実行してみると、、、

なんとエラーが出ました！！

これはやばいと思い調べてみるとどうやらバージョンがそれ以上だとうまくいかないパターンがあるみたいです。
パッチが出てるみたいなのでそのパッチをあててみたのですが直らずorz
で、自分のOctaveのバージョンを調べてみると、、、なんと5.10でした笑(細かくは忘れましたけど5は超えてたっぽい)
いやー、最新版過ぎだなと思って調べてみたらどうやらここまでバージョンをあげるとパッチは効かないみたいなのがcourseraのフォーラムで書かれてました。
(スレッド探したけどメモってなくてどれかわからなくなったorzすみません)

そのためアンインストールして公式の指示通りGUI版みたいなOctaveをインストールしてみます。


#Octave cilをダウンロード
多分、2weekのはじめの方にOS別で環境設定の説明がいっぱいあります。
その中のMacOS向けの欄がありますので説明通りインストールをするとアプリでOctave cilって奴をダウンロードしてくれます！
これを使うとなんとかエラーなしで動きました！


#図がplotされない
それで解決したからよかったと思いきや今度はex1の図のplotがうまくいかなくなりました。

な、なぬーーー！

なんかgnuplotがうまく動いていないっぽい感じ？だったのでgnuplot自体をアンインストールして入れ直しました。
この時のコマンド忘れてしまってちょっと記事に書けないんですけど調べてて出てきたら付け足して書きます。
ほんとグダグダな記事ですみませんm(_ _)m

###追加
エラー文を履歴で探したら出てきました

```
WARNING: Plotting with an 'unknown' terminal.
```
確かこんな奴だったはず、、、
調べてみたら色々解決策が検索できたのでそちらの方を見られるといいと思います。


#最後に
courseraは頑張って最後までやります。そして忘却する前にこれからは記事にします泣
Android Architecture Blueprints の Clean Architecture 実装サンプルを読む

[Android Architecture Blueprints](https://github.com/googlesamples/android-architecture) には、GoogleによってMVVMやMVPなどの様々なアーキテクチャ実装や、ライブラリ利用のサンプルが公開されています。 
本記事は、その中でも **Clean Architecture** の実装サンプルである [todo\-mvp\-clean](https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/) を読むことにより、書籍『[Clean Architecture　達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/B07FSBHS2V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)』の内容をより実践的に理解することを目的としています。

## todo-mvp-cleanの位置付け
MVP実装のサンプルである [todo\-mvp](https://github.com/googlesamples/android-architecture/tree/todo-mvp) からの変更点として、**Presentation Layer**と**Data Layer**の間に**Domain Layer**が追加されています。**Use case**がクラスとして切り出されている点が、Clean Architectureのわかりやすい特徴と言えそうです。
![alt](https://github.com/googlesamples/android-architecture/wiki/images/mvp-clean.png)


## SOLID原則の目的のひとつは「変更に強くすること」
Clean Architectureの観点では、「**データベースは詳細** 」[^1]であり、ビジネスルールに影響を与えません。
このTODOアプリは、[@969581f](https://github.com/googlesamples/android-architecture/commit/969581fccfbb3b7d5098dbb35ab173d5019d3e81) にて DBライブラリを**SQLiteOpenHelper**から**Room**に変更しています。
永続化されたTODO情報へのアクセス方法は、 [TasksDataSource] (https://github.com/googlesamples/android-architecture/blob/todo-mvp-clean/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/TasksDataSource.java) インターフェースに定義されています。そして、DBの具象実装は [TasksLocalDataSource](https://github.com/googlesamples/android-architecture/blob/todo-mvp-clean/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local/TasksLocalDataSource.java) となります。
**SOLID原則** に乗っ取ってモジュール[^2]が分離されているので、DBが変わってもインターフェースの変更なしで具象実装を変更していることが確認できます。

## SOLID原則とは
「第三部　設計の原則」にて、５章にわたって解説されています。
SOLID原則の目的は以下の３つであるとされています。

- 変更に強いこと
- 理解しやすいこと
- コンポーネントの基盤として、多くのソフトウェアシステムで利用できること

以下の５つの原則の頭文字をとって、**SOLID原則**と呼ばれます。

1. クラスはたったひとつのアクターに対して責務を負うべき（**S**imple Responsibility Principle）
- 振る舞いの変更は、コードの修正より追加で実現 (**O**pen-Closed Principle) 
- 個々のパーツが交換可能となるような契約に従う (**L**iscov Substitution Principle)
- 使ってないものへの依存はインターフェース分離で回避すべき (**I**nterface Segregation Principle)
- 上位レベルの方針実装コードが下位レベルの詳細に依存せず、逆方向に依存すべき（**D**ependency Inversation Principle）

## Clean Architectureで実装するとはどういうことか
**SOLID原則**はClean Architecture固有の概念ではありませんし、TasksDataSourceは**Repositoryパターン**で実装されているとも言えそうです。次の記事ではUsecaseの周辺を読み解いていき、さらにClean Architectureについての理解を深めていこうと思います。

## 備考：公式以外のClean Architecture実装サンプル
1. [android10/Android\-CleanArchitecture](https://github.com/android10/Android-CleanArchitecture) ★1万超の有名リポジトリ。
- [android10/Android\-CleanArchitecture\-Kotlin](https://github.com/android10/Android-CleanArchitecture-Kotlin) 1のKotlinリニューアル版。
- [bufferapp/clean\-architecture\-components\-boilerplate](https://github.com/bufferapp/clean-architecture-components-boilerplate) AACを導入したClean Architectureサンプル。

[^1]: 「Clean Architecture 達人に学ぶソフトウェアの構造と設計」 第30章
[^2]: Android開発の「module」ではなく、Clean Architectureにおける「モジュール」のこと。
Live2DでVRコンテンツを作りたい

## はじめに
Live2DでVTuberをやっている方も多いと思いますのでLive2D × VRでコンテンツが作れないかと思い調べてみました。

## Live2D SDKのダウンロード
https://live2d.github.io/
こちらのページからLive2DSDKをダウンロードできます。

SDKにはサンプルモデルがいくつか入っていますが、自分のオリジナルのモデルを使用するのも非常に簡単です。


## Unityにインポート
ダウンロードしたunitypackageを実行しunityに導入します。

![1556789862672 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/d3fdf221-31b4-ebc7-3f9c-3579712489b0.jpeg)

![com.Company.live2d-20190502-195110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/6c32d53c-47e7-86b3-6070-d5da49919ffe.jpeg)

Roomのアセットは下記を使用させて頂きました。
https://assetstore.unity.com/packages/3d/environments/free-medieval-room-131004
モデルにはLive2DSDKのSampleに入っているkohakuちゃんを使用させて頂きました。

ヒエラルキーにモデル等を配置してHMDにBuildすれば360度見渡すことができます。

## ライブ配信
facebookの360-Capture-SDKを使用すればそのままライブ配信もできそうです。
https://github.com/facebook/360-Capture-SDK/releases

## 終わりに
Live2DとFaceRigで手軽にVTuberを始めることができますが3Dと比べて自由度に限界があるのでVRと組み合わせてなにか面白いことできないかな～と思って調べてみました。