OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS 7にMariaDB 5.5をインストール（OS標準）

# はじめに

CentOS6にMariaDBを標準インストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y mariadb-server
... 略
```

### mysql起動/停止

```shell-session
# systemctl start mariadb
# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-10-21 14:07:07 UTC; 26s ago
  Process: 508 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 422 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 507 (mysqld_safe)
   CGroup: /docker/8b752fb5e6e65a4eca06674d46edf07fbf92df7d2d235747a1e0bf79dcce0065/docker/8b752fb5e6e65a4eca06674d46edf07fbf92df7d2d235747a1e0bf79dcce0065/system.slice/mariadb.service
           tq507 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           mq675 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/...
           ? 507 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

Oct 21 14:07:01 8b752fb5e6e6 systemd[1]: Starting MariaDB database server...
Oct 21 14:07:07 8b752fb5e6e6 systemd[1]: Started MariaDB database server.
```

```shell-session
# systemctl stop mariadb
# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Oct 21 14:07:01 8b752fb5e6e6 systemd[1]: Starting MariaDB database server...
Oct 21 14:07:07 8b752fb5e6e6 systemd[1]: Started MariaDB database server.
Oct 21 14:07:50 8b752fb5e6e6 systemd[1]: Stopping MariaDB database server...
Oct 21 14:07:51 8b752fb5e6e6 systemd[1]: Stopped MariaDB database server.
```

### mysql自動起動設定/設定解除

```shell-session
# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
#  systemctl list-unit-files --type=service |grep maria
mariadb.service                        enabled
```

```shell-session
# systemctl disable mariadb
Removed symlink /etc/systemd/system/multi-user.target.wants/mariadb.service.
# systemctl list-unit-files --type=service |grep maria
mariadb.service                        disabled
```

### 各種確認

```shell-session
# systemctl start mariadb
# mysql -u root -e'select version();'
+----------------+
| version()      |
+----------------+
| 5.5.64-MariaDB |
+----------------+
```
UbuntuにRTL8812のドライバを楽して入れる方法

# 必要なもの
インターネット(自分はスマホからインターネット共有しました)

# 手順
```
sudo apt update
sudo ubuntu-drivers list
---
rtl8812au-dkms
---
sudo ubuntu-drivers install
reboot
```

これで行けるはずです
Pythonのimportについて整理

Pythonの `import`の使い方が分かってなかったので整理。

## import
`import module_name`
モジュールを指定して読み込む。

例
`import utils`
↑utilsを読み込む

### モジュールの関数を呼び出し

```
import utils

utils.get_data()
```

公開されているライブラリも同じように読み込む。


###from import

```
import buildhouse

buildhouse.floor.material(wood='hinoki')
```
↑通常のimport。架空のライブラリbuildhouseを読み込んでいます。

```
from buildhouse.floor import material

material(wood='hinoki')
``` 
`from`を使うと、短縮できる。

### import xx as xx
```
import buildhouse as bl

bl.floor.material(wood='hinoki')
```
`as`でモジュール名を省略できる。

##参考サイト
https://docs.python.org/ja/3/reference/import.html
https://ai-inter1.com/python-module_package_library/
https://pg-chain.com/python-from-import#toc9


## 追記
コメント欄で教えて頂いているように、`__import__` 関数を使う書き方もあるそうです。
Qiitaの読み方

JavaScriptを学ぼうということで２０１９年１０月から勉強開始。
プログラムを学びながら得ていった知識を、どのようにまとめていこうか迷っていたところ、こちらのサイトを見つけた。

正確にはこの記事に出会い、「Qiita」を知ることになった。
https://qiita.com/InamuraYuta/items/f76c5923f056edc795e5

「Qitta」はとても良さそうな予感がしたのでさっそく登録。
ところで「Qiita」ってなんて読むのか？

ぐーぐる先生に聞いてみたところ、

「キータ」

だそうです。
「きった」じゃなかった。調べてよかった。

こんな感じで、自分の知識を貯めていく場所としてこちらを使わせていただくことにしたので、よろしくお願いします。
CentOS 6にMySQL 5.7をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS6にMySQL5.7をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)
参考：[Quick Start — Software Collections](https://www.softwarecollections.org/en/docs/)

## サポート

本手法で導入した場合、[Red Hat Software Collections Product Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhscl)より、2019-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# yum install -y centos-release-scl
```

### インストール

```shell-session
cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y rh-mysql57
# scl enable rh-mysql57 bash
... 略
```

### mysql起動/停止

```shell-session
# service rh-mysql57-mysqld start
Initializing MySQL database
Starting rh-mysql57-mysqld:                                [  OK  ]

# service rh-mysql57-mysqld status
rh-mysql57-mysqld (pid  548) is running...
```

```shell-session
# service rh-mysql57-mysqld stop
Stopping rh-mysql57-mysqld:                                [  OK  ]

# service rh-mysql57-mysqld status
rh-mysql57-mysqld is stopped
```

### mysql自動起動設定/設定解除

```shell-session
# chkconfig rh-mysql57-mysqld on
# chkconfig --list rh-mysql57-mysqld
rh-mysql57-mysqld       0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig rh-mysql57-mysqld off
# chkconfig --list rh-mysql57-mysqld
rh-mysql57-mysqld       0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# service rh-mysql57-mysqld start
Starting rh-mysql57-mysqld:                                [  OK  ]

# mysql -u root -e'select version();'
+-----------+
| version() |
+-----------+
| 5.7.24    |
+-----------+
```
年末まで毎日webサイトを作り続ける大学生 〜3日目 文字数カウンターを作る〜


##はじめに
初めまして。
年末まで毎日webサイトを作っている者です。
今日は**文字数カウンター**を作りました。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は3日目。(2019/10/21)
よろしくお願いします。


##サイトURL
https://sin2cos21.github.io/day3.html


##やったこと
テキストのコピペで文字数を数えられるシステムを作りました。
使った言語はJavaScriptです。
昨日やった文字列操作（[空白・改行取り除きシステム](https://qiita.com/70days_js/items/33678a00fba124b677a6)）が面白かったので今日も文字列系で作ってみました。こんな感じです↓
![スクリーンショット 2019-10-21 22.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/366d3ed4-1b3f-632f-9385-de5f09d91f37.png)

##こだわったところ
文字数に空白・改行を入れるか入れないか選べるようにしました。
空白・改行込みで文字数を知りたいなら「空白あり」ボタン
空白・改行なしで文字数だけ知りたいなら「空白なし」ボタンを押します。

html部分は入力欄をform+textarea、出力部分をbutton+divで作りました。

JavaScriptも昨日作ったものを少しアレンジした程度です↓

```html
 <script>
        function text() {
            var text = document.forms.form1.input_text.value;
            var text11 = text.length;
            var target = document.getElementById("output");
            target.innerText = text11;
        }

        function text2() {
            var text2 = document.forms.form1.input_text.value;
            var text22 = text2.replace(/\s+/g, "");
            var target2 = document.getElementById("output2");
            target2.innerText = text22.length;
        }
    </script>
```

空白・改行ありの方は入力情報を受け取ってlengthメソッドで長さを図ります。
空白・改行なしの方は入力情報を受け取って、空白・改行を除いてからlengthメソッドで長さを図りました。

##感想
文字列操作にはまってしまいました。
次はハイライトやったり、もっと驚くようなものを作っていきたいですね。
文字数をカウントするのってもっと難しいと思ってたんですけど実際はとてもシンプルでした。
これもメソッド作ってくれた方のおかげですね。
あと、相変わらずソースツリーを使ってのgit操作がうまくいきません。直接のアップロードはできるのでサイトは見れるものの、モヤモヤする...



##参考
[String - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String)
↑MDNは基礎が分かりやすいのでオススメです。



最後までお読みいただきありがとうございました。
基本情報技術者試験対策(参考程度に)

#はじめに


　2019年10月20日に基本情報技術者試験(以下FE)を受けました。
　来年、再受験することになった際に備え、自分の勉強したことなどをまとめておくことにします。

　落ちたら励ましてください。


##出題形式等
- 試験時間・問題数・問題形式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215276/52329b62-2748-d4f3-c814-75e1cb1ffe23.png)

- 出題範囲

※次回試験より、出題範囲や配点が変わる(見直し後になる)ため注意が必要！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215276/4c7b9eb5-e8c5-b34c-dc9f-320ffe2e97fc.png)

　合格点は午前・午後の両方とも60点以上で合格。

引用
IPA 情報処理推進機構ホームページより　https://www.jitec.ipa.go.jp/
同上　出題範囲について　https://www.ipa.go.jp/about/press/20190124.html




- 所感

　午前と午後に分かれており、午後の方が難易度が高く感じた。
　午後の問題はソースコードを読んだり、データベース処理の仕様を理解するためにも、
長文の問題を読みつつ、状況整理をする必要がある。
　午前で80問解いた後に行うため、そこそこの疲労の中で行われます。
　そのため、一回通して解いてみることをお勧めします。
　


##午前対策
　もともと知識がある程度あるのであれば、過去問を解くことがおすすめ。
　ただ、分野が広いため、どうしても苦手分野が出てくるので、テキストが一冊あるといい。
　テキストを買うなら、範囲を網羅しているものにした方がいいかも。
　自分はこの本(2018年度版かも)を使っていました。

　あと、IT雑学王選手権みたいな問題が数問でるけど、それは運が悪かったと割り切って。





　ニュースペックテキスト 基本情報技術者 2019年度 (情報処理技術者試験) 
　[Amazon](https://www.amazon.co.jp/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-2019%E5%B9%B4%E5%BA%A6-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-TAC%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E8%AC%9B%E5%BA%A7/dp/4813279058/ref=sr_1_1?qid=1571662358&s=books&sr=1-1)

　勉強する時間が取れなかったので、隙間時間にアプリで勉強していました。

【令和元年秋対応】基本情報技術者試験 午前問題集
　[iOS](https://apps.apple.com/jp/app/%E4%BB%A4%E5%92%8C%E5%85%83%E5%B9%B4%E7%A7%8B%E5%AF%BE%E5%BF%9C-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E5%8D%88%E5%89%8D%E5%95%8F%E9%A1%8C%E9%9B%86/id716625312)
　androidは使ってないから、リンクわからなかった・・・

　
　
　
##午後対策
　午後は過去問を解き漁った方がいい。
　選択問題は一通り解いてみて、自分の得意な分野で挑めるようにしよう。
　ただ、次回から必修問題の配点が上がっているため、そこで点を落とさないようにしよう。

　最初は問題文を読むだけでも嫌になるが、過去3,4年分を解くと何となく傾向が見えてくるのと問題文を読み慣れる（これ重要）ので、辛くても頑張ろう！
　過去問は公開されているので公式でもいいし、解説があるサイトもあるので、そちらをみるか過去問を買うかするのが望ましい。
　自分は過去問を買わなかったので、前日に以下のサイトの過去問を解きまくっていた。

　[基本情報技術者試験ドットコム](https://www.fe-siken.com/index_pm.html)

##直前に山を張った場所

### 共通鍵暗号方式と公開鍵暗号方式の認証の仕組み(例としてVPNルータの認証方法)

 
[問題リンク](https://www.fe-siken.com/kakomon/25_aki/pm04.html)

一部抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215276/e72ef216-c8e1-db2d-17b1-73360894d2ab.png)



着目点

- 共通鍵暗号方式と公開鍵暗号方式の違い
- ハッシュ値を使う理由
- ディジタル著名で何を防げるのか




### プロセススケジューリング

[問題リンク](https://www.fe-siken.com/kakomon/30_aki/pm02.html)

一部抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215276/eb10f1d4-df8d-9ea7-4366-bf7d3b32fb20.png)

着目点

- 処理からそれぞれの状態をきちんと追えるか
- どういうときに状態遷移するか
- 複数処理をまとめて行うときの優先順位は？
URLに『#（ハッシュ記号）』がつかないようにしたい

# 事象

画像の様にURLに『#（ハッシュ記号）』がついてしまう。
<img width="196" alt="スクリーンショット 2019-10-21 22.19.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99046/b6e6a2cf-9924-53f4-9184-143b79be6ea8.png">

# 環境

- Rails: 5.2.3
- vue: 3.10.0
- vue-router: 3.1.3"

# 補足

VueRouterの生成時にmode:'history'を指定する方法や下記記事の方法が自分の環境では働かなかった。
[Laravel + vue-routerでハッシュ記号(シャープ記号)をなくしてちゃんと動くようにする方法](https://qiita.com/JDM/items/79dca026684c62425e7c "Laravel + vue-routerでハッシュ記号(シャープ記号)をなくしてちゃんと動くようにする方法")

# 解決策

下記のとおり、VueRouter生成時にmodeとhashとroutesの最後にpathのリダイレクトを追加する。

```js

export default new VueRouter({
   mode: 'history',
   hash: false,
  routes: [
    {
      path: '/hoge',
      name: 'hoge',
      component: Hoge
    },
    （中略）
     { 
       path: '*', 
       redirect: '/' 
     }
  ],
})

```
JavaScriptメモ

<h1>.test</h1>

`regexp.test(str)`

regexp: 正規表現、str:チェックしたい文字列

与えられた文字列を検索し、その結果はtrue/falseで返す

<h1>const required = val => !!val.trim()</h1>
以下と同じ意味

```
const required = function (val) {
   return !!val.trim() //trim()はvalの前後の空白を取り除く
}
```
<h1>Object.keys</h1>

オブジェクトのキーだけを配列で取得

```
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
```

<h1>.find</h1>

提供されたテスト関数を満たす配列内の最初の値を返す。

```
var array1 = [5, 12, 8, 130, 44];

var found = array1.find(function(element) {
  return element > 10;
});

console.log(found);
// expected output: 12
```
自分用VisualStudioCode使用カスタマイズメモ

■インストール
・VisualStudioCode
・Soucetree - Githubと連携しておくと構成管理とバージョン管理が楽


■VisualStudioCodeの拡張機能インストール方法
1.VisualStudioCodeを起動
2.「ファイル」⇒「基本設定」⇒「拡張機能」をクリック
3.検索欄に追加したい拡張機能を入力し、インストール
4.VisualStudioCodeの再起動


■オススメ拡張機能
・Terraform
 tfファイルの視認性が向上する
・Docker
　dockerファイルの視認性が向上する
・vscode-icons
　フォルダやファイルの視認性が向上する
・Japanese Language Pack for Visual Studio Code
　日本語化
・Bracket Pair Colorizer 2
　括弧に自動的に色付けし、視認性を向上する
・indent-rainbow
　インデント部分を色付けし、コードの視認性を向上する
・zenkaku
　全角スペースの視認性を向上する
・Jumpy
　Shift+Enter→位置2文字入力 でファイルの好きなところへ飛べるがやや処理が重い
・PlantUML
　PlantUMLのWYSIWYG編集機能をVSCodeに追加する。
導入は https://qiita.com/couzie/items/9dedb834c5aff09ea7b2
PlantUMLの文法は http://plantuml.com/ja/
・GitLens
　カレント行のcommit logを表示する
・vscode-fluentd
　td-agent設定ファイルの視認性が向上する
・WhiteSpace+
　制御コードなどの視認性が向上する。
使い方は http://kawaken.hateblo.jp/entry/2018/04/02/234339
https://qiita.com/satokaz/items/cb45d82f6f8f1e24c0d6


その他Tips
■VSCodeでのtfファイル自動フォーマット
Download Terraform - Terraform by HashiCorp からTerraformのバイナリをダウンロードして C:\HashiCorp\Terraform\terraform.exe へ配置しておく。
VSCodeメニューから ファイル→基本設定→設定 と辿って設定画面を表示する。
右上の方にある { } (設定(JSON)を開く) をクリックする。
JSONが開くので以下を挿入し、保存する。元々ある設定は残しておくこと。 "editor.formatOnSave": true" が被ってたら挿入しなくてよい。

"editor.formatOnSave": true,
"terraform.path": "C:\\HashiCorp\\Terraform\\terraform.exe",

念の為VSCodeを再起動する。この後tfファイルを修正・保存してみて、フォーマッタが効くことを確認しておく。


■VSCodeでのtfファイル自動lint(静的解析によるシンタックスエラー検知)
Releases · wata727/tflint からtflintのバイナリをダウンロードして C:\HashiCorp\Terraform\tflint.exe へ配置しておく。
VSCodeメニューから ファイル→基本設定→設定 と辿って設定画面を表示する。
右上の方にある { } (設定(JSON)を開く) をクリックする。
JSONが開くので以下を挿入し、保存する。元々ある設定は残しておくこと。

"terraform.lintPath": "C:\\HashiCorp\\Terraform\\tflint.exe",
念の為VSCodeを再起動する。起動後、 Ctrl+Shift+M を入力して、「問題」ウィンドウを表示しておくと使いやすい。

この後tfファイルをエラーとなるよう修正・保存してみて、エラー検出が効くことを確認しておく。
ingress-nginxのCanary機能の根本的課題の解決案

前回の記事（[ingress-nginxでのCanary機能と根本的課題](https://qiita.com/s-shirayama/items/afc6a3afa0eb41b804d3)）では、ingress-nginxのメンテナーが『根本的な課題』と語るCanary機能の問題点について説明した。この記事では、どのような解決方針がありそうか検討したい。

# 根本原因は何か？

現在のingress-nginxのリクエストの処理フローとしては、

1. nginx.confの定義に従って（Hostname+Pathに応じて）、Backendを決定。
2. LuaモジュールのBalancer処理で、Backendを変更（Canary機能）

と、2段階でBackendの決定を行っているおり、ここに諸々の問題の原因が関連している。

## 根本原因①：ingress.yamlでの定義情報と内部的な紐付け情報の不整合

Ingressのyamlでは`Hostname`(+`Path`)に対して設定されるCanaryの定義情報が、ingress-nginxの内部では`Backend`(≒`Service`+`Port`)に対して紐付いてしまっている。そのため、先程の２のBalancerでの`Backend`の切り替え時に`Hostname`＋`Path`の情報を一切考慮しないため、特定のHostnameや特定のPathに対してCanaryを指定した場合に、意図しない動きをしてしまうことになる。

## 根本原因②：`Backend`切替時の考慮漏れ

Canary機能により`Backend`が切り替わった際に、合わせて変更しなければいけない情報（ログに出力する値など）が考慮されていない。別の捉え方をすると、先程の２の処理で`Backend`が切り替わった際にこれらを考慮しなければいけない作りになっている。

# 根本原因①の解決案

**定義情報**と**内部実装**がずれてしまっているのが問題なので、それを合わせてみる。
Canaryに関するデータとしては以下の２つがあるので、これらのデータを現在関連が張られている`Backend`から、`Location`に移してみる。

- `AlternativeBackends`
    - ルーティング先の`Backend`
- `TrafficShapingPolicy`
    - Canaryのルール

![ingress-nginx_uml_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315538/df1b9755-980b-1fdc-e8d6-63e150e62cb7.png)

Luaモジュールへのこれらの情報の連携はどうなるだろうか。
現状の実装では、

- `Configuration.Backends[]` → LuaのConfigurationモジュールを経由して、Luaモジュールに連携
- `Location.***` → `nginx.conf`に`set`で値をセットして、`ngx.var.***`としてLuaモジュールから参照されている

ので、

`Location.CanaryBackend(string)`や`Location.TrafficShapingPolicy`、は、`ngx.var.***`として連携すれば問題なさそうだ。

これで、特定のHostnameや特定のPathに対していCanaryを設定した場合にも問題なくCanary機能を提供できそうだ。

# 根本原因②の解決案

Canary機能による`Backend`の切り替えの実装をLuaモジュールではなく、nginx.confのみで実現できれば、根本解決になりそうだが、実際問題かなり難しそうだ。。

そもそも、LuaモジュールでのBalancer処理の際に接続先`Backend`を決定しているのは、ヘッダーやクッキーの値によって接続先を切り替えるといった高機能なCanary機能を提供するためである。

Issueの議論の中では、nginx自体の機能であるsplit_clientsを利用して、Luaモジュールでの処理ではなく、nginxそのものの処理の中（先程の１の処理の中）でCanary機能を実装できないかという提案も出されていたが、前述した高機能なCanary機能をsplit_clientsのみで提供するのは難しそうなのだ。。

なので、ここは愚直に、CanaryでBackendが切り替わった際に変更すべき値を愚直にLuaモジュール内で切り替えれるようにしていく方針がよさげ。

ということですでにIssueで上がっているログ情報の不整合について、修正案を考えてみたい。

### CanaryでのBackend切り替えに伴うログ情報の修正

考慮すべきは、

```lua:monitor.lua
    ingress = ngx.var.ingress_name or "-",
    service = ngx.var.service_name or "-",
```

の部分。

CanaryのBackendが切り替えられた場合は、

```lua
    ingress = ngx.var.canary_ingress_name,
    service = backend.service.metadata.name,
```

みたいな感じにする。
最終的にはこんな感じ。

![ingress-nginx_uml_new3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315538/22c4b32f-2792-85f5-6e0f-8e92263cd277.png)

```nginx:nginx.conf
       location {{ $path }} {
            {{ $ing := (getIngressInformation $location.Ingress $server.Hostname $location.Path) }}
            set $ingress_name          {{ $ing.Rule | quote }};
            set $canary_ingress_name   {{ $location.CanaryIngressName | quote }}; // <- Added
```

# 最後に

半ばメモみたいな感じで解決案を考えてみたが、今度はこの内容で[KEP(Kubernetes Enhancement Proposals)](https://github.com/kubernetes/ingress-nginx/tree/master/docs/enhancements) を書いてみようと思う。
CentOS 6にMySQL 5.1をインストール（OS標準）

# はじめに

CentOS6にMySQLを標準インストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y mysql-server
... 略
```

### mysql起動/停止

初回起動時には初期設定関係のメッセージが表示される。

```shell-session
# service mysqld start
Initializing MySQL database:  Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h 57db8f7c1234 password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/bin/mysqlbug script!

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

# service mysqld status
mysqld (pid  284) is running...
```

```shell-session
# service mysqld stop
Stopping mysqld:                                           [  OK  ]

# service mysqld status
mysqld is stopped
```

### mysql自動起動設定/設定解除

```shell-session
# chkconfig mysqld on
# chkconfig --list mysqld
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig mysqld off
# chkconfig --list mysqld
mysqld          0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# service mysqld start
Starting mysqld:                                           [  OK  ]

# mysql -u root -e'select version();'
+-----------+
| version() |
+-----------+
| 5.1.73    |
+-----------+
```
ネットワーク設計についてまとめてみた

# はじめに
ネットワーク設計についてまとめてみた

# インフラの設計とは
インフラ設計の基本は単一障害点（SPOF）を取り除くこと

スイッチ間の接続はLink Aggregation（802.3ad）を使います。複数本のLANケーブルを束ねて1本のリンクとして使います。本数の分だけ帯域は大きくなります。


https://int128.hatenablog.com/entry/20110107/1294402397

# 物理層
## イーサネットとは
* OSI参照モデルの下位2つの層である物理層とデータリンク層に関して規定している
* L１では伝送媒体に流せるようにする規格を定めている。信号に変更方法など。
* IEEE802.3には別名10BASE5の別名がついており、だいたい別名を使用される
* 有線LANではツイストペアケーブルと光ケーブルが使用される

## ツイストペアケーブル
* カテゴリが大きいほど早い規格(イーサネットの規格)に対応している
* 注意するのはスピードとデュプレックスを隣の機器と合わせる
* 設定は必ずどちらも自動設定(オートネゴシエーション)を適用する
* 100mまでで、それ以上は光ファイバケーブルを使用する。機器を増やして延長もできるけど管理台数が増えるのであまり実用的ではない

## ストレートケーブルとクロスケーブル
Auto MDI/MDI-x機能を有効にしている場合はkにする必要がない

# 物理設計
どのような機器(負荷に応じて)を、どのように配置(機器の配置構成)して、どのように接続(使うケーブル)するか




# 冗長化
すべてのレイヤ、すべてのポイントでくまなく冗長化を図る必要がある。

## 物理的な冗長化
* 電源
  - 電源ユニットの冗長化
  - 異なる電源の系統と接続する
* 物理ポート　
  - リングアグリゲーション(LAG)
* 物理NIC
  - チーミング
* 物理機器(スイッチなど)
  - スタック
  - VSS
  - VRRPやHSRP

## 経路の冗長化
* STP
  - スイッチを冗長化する場合、複数のスイッチをLANケーブルで接続する。ただ、それだとループ構成になってしまうため、STP（Spanning Tree Protocol）などの対策機能を使ってループ接続によるブロードキャストストームを回避する
  - 物理的な冗長化をすると機器の経路がループ上になったりするのでそれを防ぐプロトコル
* BGP
  - ISPへの冗長化

https://tech.nikkeibp.co.jp/it/atcl/column/17/122200591/122200003/

## FWの冗長化はちょっと特殊
* TCPコネクション情報をもとにフィルタリングルールを作っているので、コネクションが切れてまた作り直さないといけないので、コネクションを同期する

# 冗長化の機器配置設計
同じ機種の危機を並列配置して、それらをL2スイッチでつなぎ合わせる




## 物理層の冗長化
* `複数の物理要素をひとつの論理要素にまとめる`形で実現している。
* `リンク`、`機器`、`NIC`


### リンクアグリゲーション(LAG)
スイッチの物理ポートのいくつかを論理ポートとしてグループ化して別のスイッチの論理ポートと接続することで論理リンクを作成する

* `スイッチのリンクの冗長化技術`
* 複数の物理リンクを一つの論理リンクにまとめること
* シスコ用語で`イーサチャネル`、ヒューレッドパッカードでは`トランク`など
* リンク領域(物理層とリンク層)の`帯域拡張と冗長化`を同時に実現
* NICをアクティブ/スタンバイにするとスイッチには設定必要なし
* NICをアクティブ/アクティブにすると`スイッチにリンクアグリゲーションの設定必要`


### チーミング、ボンディング(Linux)
* `サーバーのリンクの冗長化技術`
* ボンディング
  - カーネルのボンディングモジュールを使用したLinuxでの言葉
* チーミング
  - Windows環境で複数のポートを束ねて扱うこと
* 複数の物理NICをひとつの論理NICにまとめる。サーバーのソフトウェアで設定
* 物理NICの接続先は異なるスイッチに接続させる
* NICの帯域拡張や冗長化
* AFT
  - 片方だけアクティブ。障害が起きたらスタンバイNICに切り替わる
  - トラブルシューティングがしやすい
* ALB
  - アクティブ/アクティブ
* リングアグリゲーション
  - NICバージョン。スイッチにも
* 仮想環境のチーミング
  - VMwareの場合ハイパーバイザ上の仮想スイッチ(vSwitch)で行う。負荷分散をしたり。

### チーミングの種類
* ロードバランシング
  - トラフィックの負荷に応じて，通信を複数のNICに振り分ける機能のことを指します。それぞれのトラフィックは，通信セッションごとに物理NICに振り分けられる
* リンクアグリゲーション
  - 複数の物理NICを同時に使用して，使用可能な帯域幅を増加させる方法です。この方法では論理的にひとつのリンクのように振る舞います。どちらかのNICやケーブルに障害が生じても，もう一方の物理NICを使って通信を継続できます。
* フォールトトレランス
  - 一つをアクティブ、一つをスタンバイ



## スイッチのスタック技術(StackWiseテクノロジー)
* スイッチの冗長化技術。論理的には1台のスイッチに見える
* マスタスイッチとメンバスイッチ
* スイッチの背面にあるスタックポートを特別なスタックケーブルで接続する

* メリット
  - ループフリー構成となりSTPを使用しなくて良くなる
  - Configも1台となり、設計がシンプル化
* デメリット
  - すべてのスタックメンバーでバージョンを合わせるため、ファームウェアにバグがあった場合に両系に影響

http://hy0.hatenablog.com/entry/2018/01/25/212456


## 経路の冗長化

https://www.jstage.jst.go.jp/article/ieiej/35/3/35_179/_pdf/-char/en
プロキシのせいで Docker Desktop でサインインできない

# Docker Desktop で Sign in ができない

Docker Desktop をWindowsPCにインストールしました。

インストール手順は以下をご覧ください。
[Chocolatey で Docker Desktop のプレリリース版をインストールする](https://qiita.com/segur/items/68acf50a1b762866d13c)

Docker Desktopを起動して、右上の `Sign in` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/98a91df6-44ca-f427-18f6-64b613c3638d.png)

すると、以下のようなダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/20b621e1-2013-b6bb-e853-3362ef33a062.png)

DockerアカウントのIDとパスワードを入力すればよいはずなのですが、いくら正確に入力してもサインインできません！



# 原因はプロキシと予想

認証プロキシ環境下のPCだったので、それが妨害していると予想しました。

以下のように `PROXIES` で正しいプロキシを設定してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/eec07a00-0a4a-ded8-4af3-b13808cb6b9d.png)

これでいけると思いきや、、、これでもダメでした！



# Fiddlerでプロキシを超える

こういう時は、Fiddlerを使います。

Fiddlerを使えば、Docker DesktopのHTTP通信のリクエストヘッダに認証プロキシ情報を付加することができるようになります。

詳しくは、別の記事にまとめましたので、こちらをご覧ください。
[Fiddlerを利用してHTTPリクエストヘッダにプロキシの認証情報を追加する](https://qiita.com/segur/items/f1cc6902427a0397c2f7)


Fiddlerを起動した状態で、再度サインインを試してみたところ、、、

**今度はサインインできました！**



# さいごに

無事に成功してよかったです。
Mosquitto - Brew パッケージの不具合 

# 概要
## mosquittoのbrewパッケージにバグがあります

# この投稿の読者
- OSXでmosquittoを動かす方
- brewでmosquittoをインストールした方
- mosquittoをシステムサービスと稼働したい方
- Subscriber/Publisherから```connection refused```と怒られてしまい困っている方

# 結論（対策）
mosquittoインストール後、次の様にディレクトリを作成してください

```
$ sudo mkdir /usr/local/var/mosquitto
$ sudo chmod 775 /usr/local/var/mosquitto
```

# 現象
#### (1) コマンドラインから指定すれば動作
これなら動きます

```
$ /usr/local/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
 1571663276: mosquitto version 1.6.7 starting
 1571663276: Config loaded from /usr/local/etc/mosquitto/mosquitto.conf.
 1571663276: Opening ipv6 listen socket on port 1883.
 1571663276: Opening ipv4 listen socket on port 1883.
...
$ mosquitto_sub -d -t orz
 Client mosq-PteU0oBSzkCWYl8edo sending CONNECT
 Client mosq-PteU0oBSzkCWYl8edo received CONNACK (0)
 Client mosq-PteU0oBSzkCWYl8edo sending SUBSCRIBE (Mid: 1, Topic: orz, QoS: 0, Options: 0x00)
 Client mosq-PteU0oBSzkCWYl8edo received SUBACK

```

#### (2) サービスとしては起動失敗
下記の様にサービスとしてmosquittoを起動すると失敗。subscriber等からアクセスできません。

```
$ brew services start mosquitto
 ==> Successfully started `mosquitto` (label: homebrew.mxcl.mosquitto)
...
$ mosquitto_sub -d -t orz
 Error: Connection refused
...


# launchctlでも同じ
$ launchctl load /usr/local/Cellar/mosquitto/1.6.7/homebrew.mxcl.mosquitto.plist
...
$ mosquitto_sub -d -t orz
 Error: Connection refused
...
```


# バグ
#### (1)原因
plistファイルで指定される_WorkingDirectory_が存在しないため

#### (2)解説
- サービスとして動作を記述するplistファイルで指定される実行ディレクトが存在しない。
- サービス起動時に_エラーも吐かず_「成功メッセージ」がでます。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>homebrew.mxcl.mosquitto</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mosquitto/sbin/mosquitto</string>
    <string>-c</string>
    <string>/usr/local/etc/mosquitto/mosquitto.conf</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <false/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var/mosquitto</string>    <===== ココ
</dict>
</plist>
``` 

#### (3)対応
上記の「結論（対策）」を実行してください

```
$ sudo mkdir /usr/local/var/mosquitto
$ sudo chmod 775 /usr/local/var/mosquitto
```

# 感想
パッケージャのミスで、早々に治るかと思いましたが、思いの外情報がなく、
brewに投稿するより、こちらの方が苦しむ方が減るかと思い。
Mavenの初期構築エラー（未解決）

#エラーの発生まで
元々はMavenは直接インストールしておらず、Eclipseで使えるものを使っていたが、コマンドラインからでも使えるように、インストールとEclipseへの設定を行った際にエラー

以下手順で行った（詳細は割愛）
１．ダウンロード（https://maven.apache.org/download.cgi）
　※当時はMaven 3.6.2
２．インストール
３．システムパスの設定
４．インストール確認（mvn -version）
５．ローカルリポジトリの設定（settings.xml）　
　※プロキシは不要だった
６．EclipseでMavenプラグインのインストール
７．EclipseでMavenプラグインの設定

最後の設定で以下のエラーが表示

#エラー内容
Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of its dependencies could not be resolved

#対応
StackOverFlowなどを確認しながら、以下のようなことを行った

①settings.xmlにプロキシを設定
　→特に変わらず

②Mavenの無効化、プロジェクトのクリーン、Mavenの有効化の順で実行
　→特に変わらず

③Maven、Eclipseの再インストール
　→効果なし

#結果
Eclipseが自動生成するsettings.xmlを確認。
このファイルでは「５．ローカルリポジトリの設定（settings.xml）」が行われていなかったため、ローカルリポジトリの設定を外した。
　→エラー解消

　なおローカルリポジトリは「C:\Users\ユーザー名\.m2\repository」となった

#疑問点
ローカルリポジトリは自由に設定できないのだろうか。。。

以下のようにsettings.xmlに定義していた

```
<localRepository>
C:/ProgramLibrary/apache-maven-3.6.2/repository
</localRepository>
```

#おまけ

以下のコマンドを入力してエラー

```
mvn archetype:create -DgroupId=com.example -DartifactId=sample
```
エラーメッセージ

```
Could not find goal 'create' in plugin
```

修正

```
mvn archetype:generate -DgroupId=com.example -DartifactId=sample
```
無事エラーは解消できた。
（昔はCreateだった？）
BigQueryでスキーマの自動検出をする

# 概要
データパイプライン用のファイルのストレージをGoogle Cloudに構築するケース。JSONファイルをサポートする必要があって、JSONファイルのスキーマが変更される可能性があり、集計実行用の ANSI SQL クエリを使用する場合は、スキーマの自動検出を行うとよい（らしい）。

# 仕組み
サンプルを抽出し、そこから推定を行っている。
> 自動検出を有効にすると、BigQuery はデータソース内でランダムにファイルを選択します。ファイルの最大 100 行をスキャンして代表的なサンプルとして使用し、推定プロセスを開始します。BigQuery は、各フィールドを検証し、そのサンプル内の値に基づいてそのフィールドにデータ型を割り当てようとします。

# 設定
新旧UIで設定項目が異なる。
>GCP Console: [スキーマ] セクションの [自動検出] で、[スキーマと入力パラメータ] オプションをオンにします。
従来の BigQuery ウェブ UI: [Schema] セクションで、[Automatically detect] オプションをオンにします。

# 懸念
ファイルをランダムに選択するのと、ファイルの最大100行のスキャンなので、実際に業務で利用する場合はこれに頼らず、明示的に指定するか、スキーマのデータが確実にそのデータ型の場合のみ自動検出を使ったほうがよさそう。

# 参考
スキーマの自動検出の使用
https://cloud.google.com/bigquery/docs/schema-detect?hl=ja
「キーボード種類変更」を毎回選ぶのがしんどい自分への備忘録

# 職場と自宅でキーボード種類変更がしんどい

自宅では英語キーボードを利用し、職場ではMBPデフォルトの日本語キーボードを利用している私です。
キャプが手抜きで申し訳ないですが（備忘録なので）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30329/048ea986-9125-cb50-5ae9-9ca453a457b7.png)
⬇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30329/ab8d9b39-d400-2443-1ed7-f98281dbb0c1.png)
⬇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30329/1ac489e6-f4ae-0228-8c27-305e1a837719.png)
⬇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30329/a10e1a13-a8c5-7c0f-9842-dd1c899a2a87.png)

という感じで「キーボードの種類を変更...」に移動していました。
この生活もけっこう長く続いていたのですが時短することにしました。

本当は、英語キーボードをつなげた時に勝手に認識してくれよ。
なのですが、どうしてもそうならない私のMBP。

## キーボード種類変更アプリはどこにある？

キーボード種類変更で起動するアプリの正式名称は「KeyboardSetupAssistant.app」というらしく。
macの以下に格納されています。

起動すると立ち上がるこいつです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30329/48afc85d-bc3f-3234-00f5-4b18bbd547c2.png" width=700px/>

## コマンドでアプリを起動する方法

```sh
/System/Library/CoreServices/
```

なので、コマンドプロントからならこちらを実行するとこちらです。
aliasなんかしてサクッと起動もいいかもしれません。

```sh
$ open /System/Library/CoreServices/KeyboardSetupAssistant.app
```

## Dockに登録してからの起動方法

ターミナルから/System/Library/CoreServicesを開いて「KeyboardSetupAssistant.app」をドラックしてDockに登録する。

```sh
$ open /System/Library/CoreServices
```

こちらも案外いいてかもしれません。私はそうしました。
もしかしたら皆さんいい手を知っているかもしれませんので良き方法あれば教えてください。
Swift勉強の始まり

とりあえず電卓のUIを作ってみたいと思う

１。Xcodeを起動する
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/1ad1bd9f-9308-495e-3c49-1544948f7df3.png">

２。Create a new Xcode projectを選ぶ
<img width="433" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/da4f71bf-e9cb-f711-b882-b23a069ab409.png">

３。Single View Appを選ぶ
<img width="724" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/07275034-5270-8f61-f540-27106e557d81.png">

４。基本情報欄で適当に入力し、Nextを押す。
<img width="723" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/25d1f780-2f92-3f1b-234a-c01e6b579531.png">

５。保存先を選ぶ前に、Source Controlのチェックを外す。Createを押す
<img width="510" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/673ad471-0e05-9bcf-4b2e-78eba27c416e.png">

６。ここの　xxxx.storyboardをクリックする
<img width="546" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/7e54dc49-3972-0bac-33a2-ad9c1ca06fb3.png">


７。真ん中の画面でスマホ画面の位置を適切に調整する
<img width="604" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/5bdbb007-cde4-4006-57fd-730ddfc733bd.png">

８。右上の＋ボタンを押すと、Objectの一覧表がポップアップされる。
何度も調節したら。。
<img width="559" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/7735fc05-b853-3e1f-003c-c97e58c92fb4.png">

９。三角を押せばいい
<img width="40" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506673/f0b6b2e8-a1ff-1206-5886-122d51efbaac.png">
JUnitでの例外発生の確認

# 概要と目的
JUnitを書く上で、想定通りに例外が発生することを確認することがあると思います
その際の確認方法を記載します

# 確認方法
## 検証対象メソッド　
~~~ java
    public void checkInt(String intStr){
        try {
            Integer.parseInt(intStr);
        }catch (NumberFormatException e){
            throw new IllegalArgumentException("引数が数値ではありません " + intStr);
        }
    }
~~~

## シンプルな記載方法
発生する例外を記載して、想定した型の例外が発生することを確認
`@Test`に追加で、発生する例外クラスを指定する

~~~ java
    @Test(expected = IllegalArgumentException.class)
    public void 例外が発生することを確認(){
        new TestTarget().checkInt("a");
    }
~~~

この場合、想定する例外が出なかったらテストとしてはエラーとなる

## 例外の中身を確認する方法
* 上記シンプルな記載方法に加えて以下実装を追加
* 想定例外をキャッチして、例外の中身を精査
* 精査後キャッチした例外を投げる
    * わざわざ`fail()`を記載しなくてもこれで十分

~~~ java
    @Test(expected = IllegalArgumentException.class)
    public void 例外中身を確認() {
        try {
            new TestTarget().checkInt("a");
        } catch (IllegalArgumentException e) {
            assertEquals("引数が数値ではありません a",e.getMessage());
            throw e;
        }
    }
~~~
共通のヘッダを持つファイルを結合する小技

#やりたいこと

```1.dat
head1 head2 head3
1 2 3
4 5 6
```

```2.dat
head1 head2 head3
7 8 9
10 11 12
```

```3.dat
head1 head2 head3
13 14 15
16 17 18
```

↑こういったファイル群を

↓こうする

```merged.dat
head1 head2 head3
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
```

#方法

```shell-session
$ awk 'NR==1 || FNR!=1' [1-3].dat > merged.dat
# 処理しているファイル全体における最初の行(ここでは"1.dat"のヘッダ) or 各ファイルの最初の行以外を出力する。
```
（おまけ）Yolo v3+Windows 10でデスクトップのアイコンを動的に識別してみる

#はじめに

[前回](https://qiita.com/yasunari_matsuo/items/78695e9f53bc6b589daa)の記事で、Yolo v3でWindowsのデスクトップアイコンを識別するよう学習させてみました。
https://qiita.com/yasunari_matsuo/items/78695e9f53bc6b589daa

その学習済みモデルを使用して、デスクトップアイコンを動的に認識させる実験をしてみました。

#さっそく動かす
デスクトップでアイコンを動かす動画を`Desktop 2019.10.21 - 21.11.05.01.mp4`というファイル名で保存し、下記のコマンドを実行しました。

```text
darknet.exe detector demo data\desktop.data cfg\yolov3-voc.cfg data\backup\yolov3-voc_last.weights "D:\Data\Videos\.gallery\Desktop\Desktop 2019.10.21 - 21.11.05.01.mp4"
```
静的な画像を指定したときとは、`demo`という部分の指定と、最後の動画ファイルの指定が異なるだけです。


#結果
下記がその結果です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Yolo v3でデスクトップアイコンを識別するAIを作って動画でリアルタイムに認識させてみた <a href="https://t.co/62dNJvz6Of">https://t.co/62dNJvz6Of</a> via <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; teamm (@teamm89201677) <a href="https://twitter.com/teamm89201677/status/1186258550202368000?ref_src=twsrc%5Etfw">October 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Youtube
https://youtu.be/_I-t0mSKS7s

アイコンを選択したときを学習させていないので、選択時は認識しなくなってしまっていますが、ほかの場合は、移動中でもきちんと認識してくれています。Yolo v3はかなり優秀ですね。

#つづく
次は、[前回](https://qiita.com/yasunari_matsuo/items/78695e9f53bc6b589daa)の考察＋選択したときのアイコンも含めて学習し、認識率を高めたいと思います。

次の記事
「YOLOv3をWindowsでpythonから呼び出してみる（デスクトップアイコン識別）」
https://qiita.com/yasunari_matsuo/items/ebdb704ffff5db21f466
【Swift】オプショナル型の使い方

#オプショナル型とは？
オプショナル型はSwiftの特徴の一つであり、値がnilの可能性がある時に用いられる型です。
このオプショナル型はその値がnilである可能性を示してくれるため非常に便利な型なのですが、扱い方を間違えるとコンパイルエラーになったりバグの要因になります。

今回はそんなオプショナル型の使い方について考えていきます。

##Optional < Wrapped >型を用いる時
まず下記のコードを見てください。このコードはRPGに出てくる武器の構造体です。定数として名前（name）、攻撃力(offensivePower)、追加効果(additionalEffect)が定義されています。
ここで注目すべき点はadditionalEffectのかたがString?となっている点です。この?がオプショナル型を表していて、この定数がnilの可能性があることを示しています。
このように値が定かではない値にはオプショナル型を定義していきましょう。

```
struct Weapon {
  let name: String
  let offensivePower: Int
  let additionalEffect: String?
}
```

##暗黙的にアンラップされたOptional<Wrapped>型
下記のコードを見ると変数の定義時に!を指定することでアンラップが暗黙的に行われています。
しかし初期化されていない値に対してアクセスしたため実行時エラーになっています。
このように暗黙的なアンラップは危険な面があります。しかし、初期化時に値が決まっていなくても、初期化以降に必ず値が設定される場合は用いたほうが、可読性も上がり効率的です。


```
class Sample {
  var value: String!
}

let sample = Sample()
sample.value //実行時エラー
```
以下が利用した方が良い例です。
このコードはStoryboard上に配置した要素から自動的に生成されるコードで、Storyboard上の要素と@IBOutlet属性とともに宣言されたプロパティと紐づけています。
このsomeLabelプロパティはインスタンス化される際には空ですが、その後にStoryboardから生成された値が設定されるので、暗黙的にアンラップして大丈夫です。
もしここでアンラップしなければオプショナルバインディングを別で行わなければならないため、そちらはコードを冗長にしないためにも止めておきましょう。

```
@IBOutlet weak var someLabel: UILabel!
```
Linux コマンド勉強

Linuxコマンド勉強

参考になるサイト
http://hydrocul.github.io/wiki/commands/find.html

```shell
#1.cat
cat -n ファイル名称
#2.more
more オプション ファイル名称
#3.head
head -n 20 ファイル名称
#4.tail
tail -n 20 ファイル名
tail -f ファイル名
#5.tr 
tr [元の文字] [変換後の文字]
#小文字を全部大文字に変換
cat test.txt | tr [a-z] [A-Z]
#6.wc
#バイト数だけを表示する
wc -c ファイル名
#行数だけを表示する
wc -l ファイル名
#単語数だけを表示する
wc -w ファイル名
#7.stat
stat ファイル名
-----------------------------------------------
  File: test.txt
  Size: 48              Blocks: 0          IO Block: 4096   regular file
Device: 2h/2d   Inode: 1407374883989969  Links: 1
Access: (0700/-rwx------)  Uid: ( 1000/   dm946)   Gid: ( 1000/   dm946)
Access: 2019-10-13 12:39:37.583846100 +0900
Modify: 2019-10-21 21:49:05.248230800 +0900
Change: 2019-10-21 21:49:05.248230800 +0900
 Birth: -
-----------------------------------------------
#8.cut　オプション　ファイル名
#-d:は「:」で列分割
#-f1は分割後の1列名
cut -d: -f1 /etc/passwd
#9.diff
#A.txtとB.txtファイルが同じであるかどうかを比較する
diff --brief A.txt B.txt
#２つのファイルの具体的な違いを表示する
diff -c A.txt B.txt
#9.touch
touch オプション　ファイル名
#-a　読み込み時間を修正 atime
#-m  修正時間を修正　　mtime
#-d  読み込み時間と修正時間を同時に修正
#空白のファイルfilenameを作成する
touch filename
#A.txtのファイルの読み込み時間と修正時間を"2019-10-22 22:30"に修正
touch -d "2019-10-22 22:30" A.txt
#10.mkdir
mkdir folder1
mkdir -p a/b/c
#11.cp 
#cp オプション　ファイル１　ファイル２
#-p:元のファイルの属性を保持
#-d:リンクファイルならものの属性を保持
#-r:フォルダのなかもコピー
#-i:ファイルが存在する場合、上書きするかを確認する
#-a:-pdrと同じ
#12.mv
mv オプション　ソースファイル　フォルダ|ファイル名
#13.rm
rm -f ファイル名
rm -rf フォルダ名
#14.dd
#if:Inputファイル名
#of:Outputファイル名
#bf:ブロックサイズを設定
#count:ブロックの個数を設定
dd if=/dev/zero of=560_file count=1 bs=560M
#15.file
#ファイルの種類を調べる
file ファイル名　
#16.tar
tar オプション　ファイル名
#-c:圧縮ファイルを作成
#-x:ファイルを解凍する
#-t:圧縮ファイルの中身を表示する
#-z:gzipで圧縮か解凍
#-j:bzip2で圧縮か解凍
#-v:圧縮か解凍の過程を表示する
#-f:ターゲットファイル名
#-p:元のファイルの権限と属性を保持
#-P:絶対パスを使って圧縮する
#-C:解凍先のパスを指定する
tar -czvf パッケージ.tar.gz フォルダ
tar -cvf 2019102101.tar *
tar -xvf 2019102101.tar
tar -cxvf 2019102101.tar.gz *
tar -zxvf 2019102101.tar.gz
tar -czvf etc.tar.gz /etc
mkdir /test/etc
tar xzvf etc.tar.gz -C /test/etc
#17.grep
grep オプション ファイル名
#-b:バイナリーファイルをテキストファイルとしてスキャン
#-c:スキャンできた行数だけを表示
#-i:大文字小文字を区別しない
#-n:行番号だけを表示する
#-v:反対方向で検索し、検索対象がない行だけを表示する
 grep /sbin/nologin /etc/passwd
#18.find
find パス 検索条件 操作
-name:名称
-perm:権限
-user:所有者
-group:グループ
-mtime -n +n:修正時間（-nはn日以内、+nはn日以前）
-atime -n +n:アクセス時間（-nはn日以内、+nはn日以前）
-ctime -n +n:ファイル権限修正時間 （-nはn日以内、+nはn日以前）
-nouser:所有者がないファイル
-nogroup:グループがないファイル
-newer f1 !f2:ファイルf1より新しいがf2より古いファイル
--type b/d/c/p/l/f:ブロック設備、ディレクトリ、...
-size:ファイルのサイズ
-prune:無視するディレクトリ
-exec ..... {}\;:検索結果を処理する命令
#/homeの配下から*.txtファイルを検索し、削除コマンドを作成してからrm.shに出力する
find /home -name "*.txt" -exec echo "rm -f "{} >> rm.sh \;

```

```sh
getconf ARG_MAX

#1つのコマンドでパスワードを修正
echo "linuxprobe" | passwd --stdin root

#! /bin/bash
echo "ファイル名前:$0"
echo "全部で$#のパラメータがあります。それぞれは$*です"
echo "1つめの引数は$1, 5つ目の引数は$5です"

[ -d /home1 ] && echo $?
[ -d /home1 ] || echo $?
[ ! $USER = root ] && echo "user" || echo "root"

#指定日付の180前の日付を計算
date -d "20191024 10:39:00 180 days ago" "+%Y-%m-%d %T"
#指定したフォルダの180より前の*.gzのファイルを検索する
find /home/my/ -type f -mtime +180 -name "*.gz"


FreeMem=`free -m | grep Mem: | awk '{print $4}'`
echo $FreeMem


```
hugo+highlightjsがはみ出る場合の対処法(javascript disable)

hugoでは、highlightのオプションがあります。

```toml:config.toml
PygmentsCodeFences = true
pygmentsstyle = "monokai"
```

highlightjsは、以下の形で有効にできます。

```index.html
<link rel="stylesheet" href="/bower_components/highlightjs/styles/monokai.css" />
<script src=/bower_components/highlightjs/highlight.pack.min.js></script><link rel=stylesheet href=/bower_components/highlightjs/styles/monokai.css><script>hljs.initHighlightingOnLoad();</script>
```

しかし、javascriptをdisableにしていると、bodyをはみ出してしまいます。これは、cssで調整できます。具体的には、`overflow`を使います。

```css:style.css
pre {
    overflow:auto;
}
```
UITableViewをUIScrollView + UIStackViewに置き換える

UITableViewにCustomCellゴテゴテで実装された画面を、UIScrollViewに置き換える機会がありましたので共有します。
主にUIStackViewへの追加で制約が入らなくてつまりました。

※UITableViewCellをそのまま使う前提で書いてます。
普通にViewを置く場合はもっと簡単にできると思います。

## 前説

> まずUITableViewCellってコードから生成できるの…？

というところから始まりました。
途中、
**制約全然効いてくれない！！
セルの高さが全部同じになっちゃう！！
横幅がおかしくなる！！！**
とか色々やりながら、結果生まれたのが以下のコードです。

その結果生まれたのが以下のコードです。

## コードとストーリーボードの例

```Swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var stack: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let row = 20
        for i in 0...row {
            let cell = Cell.init(style: .default, reuseIdentifier: "Cell", widht: self.stack.frame.width)
            cell.heightAnchor.constraint(equalToConstant: cell.frame.height).isActive = true
            cell.hogeLabel.text = "\(i)"
            print("add to stack:\(cell)")
            self.stack.addArrangedSubview(cell)
        }
    }
}
```

```Swift:Cell.swift
import UIKit

class Cell:UITableViewCell {
    // セルにはラベル1つだけおいてある
    @IBOutlet weak var hogeLabel: UILabel!
    
    // ストーリーボードで配置した時の初期化処理※ストーリーボードからの初期化は想定してません
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.nibInit(width: 0.0)
    }
    
    // 横幅を受け取って初期化する(制約がうまく効かなかったので)
    init(style: UITableViewCell.CellStyle, reuseIdentifier: String?, widht:CGFloat) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.nibInit(width: widht)
    }
    
    // viewの初期化
    fileprivate func nibInit(width: CGFloat) {
        guard let view = UINib(nibName: "Cell", bundle: nil)
            .instantiate(withOwner: self, options: nil)
            .first as? UIView else { return }
        
        //セルの高さはセル側でランダムに決める※使うときはちゃんとConstとか作って高さ設定してね
        let height = Bool.random() ? 50:100
        
        view.frame = CGRect(x: 0, y: 0, width: width, height: CGFloat(height))
        self.frame = CGRect(x: 0, y: 0, width: width, height: CGFloat(height))
        self.addSubview(view)
    }
}
```

ストーリーボードは特に特別な設定はしておりません。
普通にScrollViewをおいて中にStackViewを配置するだけです。
![スクリーンショット 2019-10-21 21.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208118/a8c1f81f-56c2-1b18-d771-4dabb2b73666.png)

スクロールビューについては[(多分)いちばんシンプルなUIScrollViewの実装](https://qiita.com/akaneburyo/items/a65f94c285fec14dc897)を見てみてください。

--- 
**もっとこんな方法あるよ！！**や、
**ここちょっとやばいよ！！**などございましたらお教えいただけますと幸いです。

ありがとうございました。
Ruby on Rails [render]について

#Ruby on Rails [render]について
Ruby on Rails学習中、renderメソッドに関して、色々調べたので備忘録の意味も含め、まとめました。

##renderメソッドとは
renderメソッド：コントローラーファイル内定義したアクションにて、呼び出すViewファイルを指定するメソッド
特定のビューを複数回使い回す場合、eachメソッドを用いるよりも、部分テンプレートをrenderした方が動作が高速になるため、そのような時にrenderメソッドを使用します。
*この時使用するテンプレートファイル名は「_」から記載します。


###renderメソッドの使い方
下記を仮置きとして設定します。

```rb:controller
def index
  @tweets = Tweet.all.order("created_at DESC")
end
```
テンプレートファイル名
_tweet.html.erb

###1. 一回だけテンプレートファイルを使う時

パターンA

```rb:view
<%= render partial:'tweet', locals:{tweet(部分テンプレート内で使用する変数),tweet} %>
```


パターンB＊超特例

```rb:view
<%= render @tweet %>
```

*条件（下記の時のみ使用可能）
複数形のインスタンス変数を部分テンプレートに渡す時、インスタンス変数の名前を単数形にしたものと、部分テンプレートの名前が同じであれば、使用可能。
上記の場合、インスタンス変数：tweets 部分テンプレート名：tweetなので使用可能です。

###2.複数回テンプレートファイルを使う時
パターンA

```rb:view
<% @tweets(コントローラ内インスタンス変数）.each do |tweet| %>
<%= render partial:'tweet', locals:{tweet(部分テンプレート内で使用する変数),tweet} %>
<% end %>
```
*locals: { 部分テンプレート内で使いたい変数: 持っていきたい値 }

パターンB

```rb:view
 <%= render partial:'tweet', collection @tweets %>
```
*パターンAの短縮系

パターンC＊超特例

```rb:view
 <%= render @tweets %>
```
*条件（下記の時のみ使用可能）
インスタンス変数 = 部分テンプレート内で使いたい変数

####ちなみに。。
変数を複数設定する場合は、locals:{},{},{}...という記載で追記します。

```rb:view
<%= render partial:'tweet', locals:{},{},{} %>
```

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

#参照
忘れがちなrenderメソッドの使い方まとめ [Rails]
https://qiita.com/hayashino/items/c2a4e7d3edbdcce3cd2a
Eclipse - Springboot

# 環境
- Elipcse 2018-09(4.9)
  ※Pleiades All in oneを使用
- Java 8

# EclipseにSTSを入れる
Spring Tools 4をインストール

- EclipseマーケットでSTS4を探してインストールを押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/4a45cfa9-ad81-f100-db0d-5046557c5b5a.png)
- 確認を押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/f94599f6-b142-08df-24dd-ea1792e62679.png)
- 「使用条件の条項に同意します」を選択して完了を押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/0814beef-de0b-0db6-5329-f963ffe32003.png)
- 今すぐ再起動を押してEclipseを再起動する<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/02570098-9be6-0d85-f829-147bfcd63949.png)

# Eclipseのパースペクティブを表示する

- メニュから「ウインドウ→パースペクティブ→パースペクティブを開く→その他」を選択する<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/53887fce-ede9-c7be-1c92-c2fa5562cc49.png)
- Springを選択して開くを押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/52fe22ef-341e-fddc-8b80-b2239e04fab8.png)
- パースペクティブのSpringを選択する<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/7fb4eee3-edb8-9d62-c427-f86b4210e779.png)

# プロジェクト作成

- メニュー「ファイル→新規作成→Springスタータープロジェクト」を選択する
- 次へを押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/869d021b-d1fb-e060-43fc-104a0b20e3ba.png)
- 依存関係を追加指定し完了を押す<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/d49d7d2e-2c4f-ee76-030c-e224115d1e47.png)
- 依存関係のインポートを待つ<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/6fb31654-dc6f-e4a1-5c52-fc8d07b60757.png)
- pom.xmlの１行目で不明なエラーが出たらmaven pluginのバージョン指定を追加する

```xml:pom.xml
	<properties>
            <java.version>1.8</java.version> 
            <!-- 下の１行を追加する -->  
            <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
	</properties>

```

# 動作確認

Controllerを作成する<br>

``` java:HelloController.java

package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloContoller {

	@RequestMapping("/")
	public String hello() {
		return "hello";
	}
}
```

HTMLを作成する<br>

``` HTML:hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring demo</title>
</head>
<body>
  <h1>Hello</h1>
</body>
</html>
```

ツールバー実行から「実行→Spring bootアプリケーション」を選択して「http://localhost:8080」にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202844/04fdee1b-6484-bb08-e308-cf4e6840e442.png)
Azure SQL における SQL Serverリソースと管理者アカウントについて

#はじめに
AzureでSQLリソースを作るときにSQL Serverって何？と聞かれることがあるので整理。


※Azure SQL サービスにはSQL Database と SQL Data Warehouse がありますが双方をまとめてAzure SQLと記載します。


#参考リンク
https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-servers

#SQL Serverリソースと管理者アカウント
##Azure SQL作成時のサーバーについて
Azure SQL作成時には以下のようにサーバーの選択or新規作成を求められるように、Azure SQL自体のリソースとは別に、「SQL Server」というリソースが必要です。
作成時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/992e709f-ef24-ca70-5a7b-9612787567c8.png)

作成後
実際に二つのリソースが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6ad1b5f9-819b-bee2-bb6c-4d9d81ac53c8.png)


###SQL Database サーバーとは
[ドキュメント](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-servers)の記述では下記のように記載されています。要するにDatabaseを集中管理する論理リソースとしてSQL Databaseサーバー(=上記のSQL Server)があるという位置づけです。
>SQL Database サーバーは、複数の単一データベースまたはプールされたデータベース、ログイン、ファイアウォール規則、監査規則、脅威検出ポリシー、フェールオーバー グループの中央管理ポイントとして機能する論理構築物です。

SQL Database サーバー配下には複数のAzure SQLを作成可能です。
作成時のリージョンはSQL Databaseサーバーに準じます。

##SQL Database サーバーの管理者アカウント
さて、サーバ作成時にはサーバー管理者ログイン設定も必要なわけですが、これがサーバー管理者と呼ばれる管理者アカウントを作成している箇所になっています。

Azure SQL では「サーバー管理者」と「Azure Active Directory の管理者」の二つの管理者アカウントがあり、それぞれ認証方式が下記のように異なります。[ドキュメント](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-manage-logins#unrestricted-administrative-accounts)


 - サーバー管理者=SQL Server認証
 - Azure Active Directory の管理者=AD認証

作成時においては「サーバー管理者」が存在し、「Azure Active Directory の管理者」は任意で設定する形になります。



###[補足]Azure SQL での認証の種類について
- SQL Server認証
    - ID,パスワードでSQL Databaseサーバー側で認証させる方式。ID,パスワード管理はSQL Databaseサーバー側。
- AD認証
    - AD認証方式。AD側での管理。[ベストプラクティス](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/database-best-practices#azure-active-directory-ad-authentication)ではこちらを利用することが推奨されています。

#関連記事
[Azure SQLでのSQL Server認証の無効化について【備忘録】](https://qiita.com/ryoma-nagata/items/7c7b8f881814269c8eca)
初心者によるプログラミング学習ログ 132日目

# 100日チャレンジの132日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

132日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>132日目<br><br>UdemyでVue.js学習<br><br>でも寝落ちしたのであまりすすまず<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/vuejs?src=hash&amp;ref_src=twsrc%5Etfw">#vuejs</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1184579779200241664?ref_src=twsrc%5Etfw">October 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 学習したことの一部

オブジェクトと配列構文

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="main.css">
    <title>Document</title>
   
</head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <div id="app">
    <h1 style="color: red; background-color: blue;">hello</h1><!--スタイル属性、css-->
    <h1 :style="{color: textColor, 'background-color': bgColor}">hello</h1><!--バインド、オブジェクトで囲う-->
    <h1 :style="stlyeObject">hello</h1>
    <h1 :style="[stlyeObject,baseStyle]">hello</h1><!--スタイルオブジェクトたくさん、配列構文で対処-->
  </div>

 <script>
   new Vue ({
     el: '#app',
     data: {
          textColor: 'red',
          bgColor: 'blue',

    　　stlyeObject: {
           color: 'red',
          'background-color': 'blue'
         },
         baseStyle: {
           fontSize: '60px'
         }
       } 
   })
  </script>
 </body>
</html>


```