OmniAICreator/Qiita-1.07M huggingface dataset:
TerraformerのためのTerraformer

Terraformerというツールを最近見つけて、
「えぇ！！めちゃ便利やん！！」と少々感動したのでご紹介します。

# Terraformer
現存しているリソースの`.tf`ファイルと`tfstate`を自動作成してくれるCLIツールです[^1]。
レポジトリは[こちら](https://github.com/GoogleCloudPlatform/terraformer)。

# インストール
Homebrewでインストールできます。
`brew install terraformer`
その他のインストール方法は[こちら](https://github.com/GoogleCloudPlatform/terraformer#Installation)。

利用する前にディレクトリ(`~/.terraform.d/plugins/{darwin,linux}_amd64/`)を作成し、ここにプロバイダをインストールしておく必要があります。

```shell

$ pwd
/Users/<user-name>/.terraform.d/plugins/darwin_amd64
$ wget https://releases.hashicorp.com/terraform-provider-google/2.10.0/terraform-provider-google_2.10.0_darwin_amd64.zip
$ unzip terraform-provider-google_2.10.0_darwin_amd64.zip
```

# 使い方

以下プロバイダとしてGCPを利用した例です。
AWSなど他のプロバイダについても似たような感じだと思います（未検証)。

## 指定したリソースのファイルを作る
コマンド一つで楽ちん。`--resources`オプションで、`.tf`ファイルと`tfstate`を作成したいリソースの指定します。

```shell

terraformer import google --resources=cloudFunctions --zone=asia-northeast1-a --projects=<your-project-id>
```

複数選択することで、一気に作れます。プロジェクトも複数選択できます。

```shell

terraformer import google --resources=cloudFunctions,gke,gcs,instances --zone=asia-northeast1-a --projects=<project-A>,<project-B>
```

作成された`.tf`ファイルと`tfstate`は`./generated/<provider>/<project-name>/<resources>`にあります。

## ローカルにファイルを作成する前に確認したい
`import`の代わりに`plan`を使います。

```shell

terraformer plan google --resources=cloudFunctions --zone=asia-northeast1-a --projects=<your-project-id>
```

すると`./generated/<provider>/<project-name>/terraformer`に`plan.json`というJSONファイルが作成されるので、ここから確認ができます。

必要であればJSONファイルを変更して、`.tf`ファイルを作成します。

```shell

terraformer import plan ./generated/<provider>/<project-name>/terraformer/plan.json
```

# メリット/デメリット
個人の感想です。ツッコミがあればコメントをいただきたいです。

## メリット

### コードを書かなくていい
自動作成されるので、無論書く必要がないです。

### フォーマットが一定なので見やすい
人が書くコードでは、デフォルトの設定として書かれないような設定も書いてくれるので、
リソース単位でコードを読む分には読みやすいと感じました。

## デメリット

### 生成されるコードが0.12に対応していない
`terraform 0.12upgrade`でほとんど対応できると思いますし、これから置き換えられるような気がします([issue](https://github.com/GoogleCloudPlatform/terraformer/issues/117))。

### リソースごとなので、依存を意識してリソースを立てる必要がある
`.tf`ファイルが作成された後の話です。ここでようやく頭を使うので、許容範囲かとも思います。

# 終わりに
issueを見てみると、IAMやAWSのリソースについても開発が進んでいるようで、これからもっと便利になりそうです。

# 参考

* https://github.com/GoogleCloudPlatform/terraformer

[^1]: *reverse Terraform*というらしい。この言葉、使っていきたい。
Redmineのローカル環境をDockerで簡単に構築する

# Docker for Macをインストール
[Docker for Macのダウンロードページ](https://hub.docker.com/editions/community/docker-ce-desktop-mac)からdmgをダウンロードします。
※Docker IDを作る必要があります。
![スクリーンショット 2019-07-10 22.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/dce1d596-a0ef-ef88-a993-4376e08d6af3.png)
ドラッグ&ドロップでmacにインストールします。
![スクリーンショット 2019-07-10 22.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/606f100d-0507-10c4-946a-a258e977b24f.png)

アプリケーションをダブルクリックで起動して画像のようなウインドウが出ればOKです。
![スクリーンショット 2019-07-10 22.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/1bd3b424-76f2-15c9-6019-19edce7cf36c.png)

メニューバーにくじらのアイコンが出て、画像のように緑色の丸と一緒に「Docker Desktop is Running」と出ていればDockerが起動しています。
![スクリーンショット 2019-07-10 22.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/74e6aa68-4dd5-e667-6720-aeb157426e12.png)

# RedmineをDocker経由で持ってくる
[Docker Hubのredmine公式イメージ](https://hub.docker.com/_/redmine?tab=description)からコマンドをコピーし、CUIで実行
![スクリーンショット 2019-07-10 22.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/c5007dff-d130-615d-a94d-861d5187addd.png)

コピーしたコマンドを実行します

```shell:
$ docker pull redmine
```


下記のようになればOKです。

```shell:
Using default tag: latest
latest: Pulling from library/redmine
fc7181108d40: Pull complete 
d5e459c0e2e8: Pull complete 
9d72610672ed: Pull complete 
8021817cc2b5: Pull complete 
11df209a1902: Pull complete 
22d9ea80dda2: Pull complete 
44657032d49c: Pull complete 
52667b1ef3e5: Pull complete 
ecbc5377aa1e: Pull complete 
91c3a7d560ed: Pull complete 
7023fe92c4a0: Pull complete 
4b79f7046904: Pull complete 
443f0769b46f: Pull complete 
Digest: sha256:bbf8fa56934342c33e415ead52a75ca9e052818bd1bead59b0395c67e1fed626
Status: Downloaded newer image for redmine:latest
```

# Redmineのローカル環境構築
redmineのDockerイメージがあるか、「docker images」で確認します。

```shell:
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redmine             latest              3f1c9319f54c        6 days ago          579MB
```

Dockerイメージを確認できたら、「docker run」でコンテナを立ち上げます。

```shell:
$ docker run -d --name redmine -p 8080:3000 redmine 
```
- -d(--detach):バックグラウンドで起動する
- -p:ポートフォワード **ローカルのポート : Dockerコンテナのポート**で指定する


[http://localhost:8080/](http://localhost:8080)にアクセスするとredmineのローカル環境が構築されています。
![スクリーンショット 2019-07-10 23.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/3c2f4186-ab81-0a99-19af-6a844c395365.png)
最長共通部分列(Common Longest Subsequence)

# 最長共通部分列(Common Longest Subsequence)

最長共通部分列とは列X、Yが与えられた時に共通する部分列の数である。共通文字列の順番は同じでなければいけないが、**文字列が連続している必要はない。**
例えば、`myabcuuu`と`abcjju`という2つの文字列が与えられた時、最長部分列は`abcu`となる。

これは典型的なDPで解くことが可能。

以下の配列DPにおいて、DPの要素DP[i][j]は、Xを左からi文字文切り出した部分文字列とYを左からj文字文切り出した部分文字列の共通部分列長である。



```python
X = 'myabcuuu'
Y = 'abcjju'
dp = [[0 for i in range(len(X)+1)] for j in range(len(Y)+1)] #0で初期化

for i in range(len(Y)):
    for j in range(len(X)):
        if X[j] == Y[i]:
            dp[i+1][j+1] = dp[i][j] + 1
        else:
            dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1])


```

```python
[[0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 1, 2, 2, 2, 2, 2],
 [0, 0, 0, 1, 2, 3, 3, 3, 3],
 [0, 0, 0, 1, 2, 3, 3, 3, 3],
 [0, 0, 0, 1, 2, 3, 3, 3, 3],
 [0, 0, 0, 1, 2, 3, 4, 4, 4]]

```
【Rails】ユーザ作成

##Railsのユーザ作成について

Railsでログイン機能を実装する場合に、ユーザ作成を行うと思います。
今回は、その、ユーザ作成機能について説明していきます。

###使用するコントローラ
toppagesコントローラ(サインアップページへ移行するurlがある)
-index

usersコントローラ
-index,show,new,create


の二つです。toppages,usersのように、語尾に「s」を付けているのは、あとあと便利になってくるからです。

###使用するモデル

Userモデル
-name:string email:string password_digest:string

ユーザ名、メールアドレス、パスワードを入力とします。

Gemファイルに
```
gem 'bcrypt', '~>　　　'
```
のような記述がありますが、railsに提供されている認証機能です。
この行のコメントアウトを消し、
```
$ bundle install
```

を実行し、railsのサーバを再起動させましょう。

また、railsで「bcrypt」を使用する際は、モデル作成時に、
```
password_digest:string
```
の記述が必須となります。この記述が無ければ認証ができなくなるので注意しましょう。


##コントローラ

topppagesコントローラは、ページの表示だけなので、usersコントローラのみを記述します。

```users.rb
class UsersController < ApplicationController
  def index
    @users = User.all.page(params[:page])
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = 'ユーザを登録しました。'
      redirect_to @user
    else
      flash.now[:danger] = 'ユーザの登録に失敗しました'
      render :new
    end
  
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
```

特筆すべきなのはcreateアクションのuser_paramsのところです。
ストロングパラメータの、password_confirmationは、確認用のパスワードのことです。
password_confirmationが記述されることで、パスワードの確認をプログラムがいい感じにやってのけてくれます。

##モデル

ユーザモデルに、has_secure_passwordと記述することでbcryptの認証機能を呼び出すことが出来ます。

```user.rb
class User < ApplicationRecord
    has_secure_password
end
```

##ユーザ作成画面
CSSも適用してない最低限の画面です。


```new.html.erb
<h1>Sign up</h1>
<p>
<%= form_for(@user) do |f| %>
<p>
<div class="form-group">
    <%= f.label :name, 'Name' %>
    <%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group">
    <%= f.label :email, 'Email' %>
    <%= f.email_field :email, class: 'form-control' %>
</div>
<div class="form-group">
    <%= f.label :password, 'Password' %>
    <%= f.password_field :password, class: 'form-control' %>
</div>
<div class="form-group">
    <%= f.label :password_confirmation, 'Confirmation' %>
    <%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
<P>
<%= f.submit 'Sign up', class: 'btn btn-primary btn-block' %>

<% end %>
```



```show.html.erb
<h3 class="panel-title"><%= @user.name %></h3>
```

これでユーザ作成に必要な主要な部分は完成しました！
Gitについて

##【Gitについて】

**ファイルのバージョン管理を行うツールの１つ**

- Gitで管理することで、自動で「編集者」「編集日時」が保存される為、ファイルが**「いつ」** **「誰によって」** **「どこに修正があったのか」** がすぐに把握できる事が出来る

- このGitを使用することによって、変更履歴をさかのぼってコードを元の状態に戻す事もでき、**複数人での共同開発が可能となる**

##【Gitの基本的な用語】
**・リポジトリ**
→Gitで管理する対象になるディレクトリやファイルの事をさす

**・ローカルリポジトリ**
→自身のPC内にあるリポジトリ

**・リモートリポジトリ**
→リモートのサーバー内にて、管理や共有する為のリポジトリ(GitHubなど)

**・ワークツリー**
→リポジトリ配下のファイルを編集して自動的に保存される場所**（コミット対象ではない、できない）**

**・インデックス**
→編集したファイルをコミットする前の仮確定して置いておく場所**（コミット対象）**

**・コミット**
→リポジトリに編集内容を記録する事

##【Git基本コマンド】
**`git init`**
→ローカルリポジトリを作成するコマンド

**`git  add`**
→ワークツリーにあるファイルをインデックスに移動させるコマンド
`git add .` ファイル全て 
`git add ファイル名`  指定ファイルのみ

**`git reset`**
→インデックスに追加したファイルをワークツリーに戻すコマンド

**`git commit（git commit -m”メッセージ”）`**
→ローカルリポジトリの変更内容を保存。コミットメッセージを入力

**`git log`**
→コミットログを確認するコマンド

**`git status`**
→ワークツリーとインデックスにあるファイルの状態を確認するコマンド

**`git branch`**
→ローカルリポジトリにあるブランチの一覧と現在選択中のブランチを確認

・ブランチのリスト表示  **`git branch`**
・ブランチの新規作成  **`git branch ブランチ名`**
・ブランチの削除 **`git branch -d ブランチ名`**


**`git  checkout ブランチ名`**
→ブランチの切り替えコマンド
→ワークツリーのファイルの状態を元に戻す 
**git addした状態（インデックスに移動した状態）では戻せない**

**`git checkout -b ブランチ名`**
→ブランチの作成とチェックアウトを同時に行うコマンド

**`git clone  URL`**
→リモートリポジトリをローカルリポジトリにクローンする
C++/Stimulus/SvelteでWebフレームワークっぽいものを作った

# はじめに

[cpp-httplib](https://github.com/yhirose/cpp-httplib)を使ってWeb開発してたけど、普段使っている`Rails`ライクに`CLI`からサクッとアプリが作りたくてWebフレームワークっぽいものを作ってみた話です

# 作ったもの

[S-H-GAMELINKS/sol](https://github.com/S-H-GAMELINKS/sol)
 

実際のデモはこちら

![sol.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191521/8ca095f0-ae24-3164-a085-e56596e5be05.gif)



# サンプルなど

[SPAサンプル](https://github.com/S-H-GAMELINKS/sol_simple_spa_example)

[Bootstrapを使ったサンプル](https://github.com/S-H-GAMELINKS/sol_bootstrap_example)

[カウンターアプリのサンプル](https://github.com/S-H-GAMELINKS/sol_counter_example)

[StimulusとSvelteの併用サンプル](https://github.com/S-H-GAMELINKS/sol_stimulus_svelte_exsample)

[ORマッパーを使ったサンプル](https://github.com/S-H-GAMELINKS/sol_orm_sample)
 
# やったこと
[CLI11](https://github.com/CLIUtils/CLI11)というコマンド入力をよしなにしてくれるライブラリを使って、sol new などの必要そうなコマンドを作成。

入力されたコマンドをパースさせて、作成したテンプレートを`C++17`で追加された`std::filesystem`使ってコピーできるようにした

コマンド体系は普段使っている`Rails`ライクに`sol server`や`sol build`などの開発用のコマンドなども追加しました。

基本的には`Webpack`を使い、[Svelte](https://github.com/sveltejs/svelte)と[Stimulus](https://github.com/stimulusjs/stimulus)を組み合わせてWeb開発をするフレームワークっぽいものとなっています。

また、[fnc12/sqlite_orm](https://github.com/fnc12/sqlite_orm)を使い、ORマッパーも使えるようにしています。

# インストール方法

```shell
# Solをclone
git clone --recursive https://github.com/S-H-GAMELINKS/sol.git ~/.sol

# パスを通す
echo 'export PATH="$HOME/.sol/bin:$PATH"' >> ~/.bashrc && exec bash
```

# 今後

僕自身が使いたくて作ったものなので、のんびりテキトーに今後も作っていこうかと思います。
 
# 参考

[cpp-httplib](https://github.com/yhirose/cpp-httplib)
[CLI11](https://github.com/CLIUtils/CLI11) 
[fnc12/sqlite_orm](https://github.com/fnc12/sqlite_orm)
[Svelte](https://github.com/sveltejs/svelte)
[Stimulus](https://github.com/stimulusjs/stimulus)
Vue template内でのthisのスコープについて


## 問題：v-bindの代入の仕方で:name=this.idとするとradioの挙動がおかしくなる
radioのコンポーネントを作っていたのですが、template内で、v-bindの代入でthis.変数名で記述すると、正常に動かないという現象が起きました。下記がコードです。

```components/MyRadios.vue
<template>
  <div>
    <p>:name=this.id</p>
    <label v-for="item in myoptions" :key="item.id">
        <input type="radio" :name="this.id" :value="item.id">
        {{ item.name }}
    </label>
    <p>:name=id</p>
    <label v-for="item in myoptions" :key="item.id">
      <input type="radio" :name="id" :value="item.id">
      {{ item.name }}
    </label>
  </div>
</template>

<script>
export default {
  props: {
    id: {
      type: String,
      required: true
    },
    myoptions: {
      type: Array,
      required: true
    },
  }
};
</script>

```

結果が下記のスクリーンショットなのですが、なぜか :name=this.id とすると、radioボタンを両方選べるようになってしまいました。。

![radio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/d73e48db-5512-d21c-a92d-fea711ba618d.png)


## template内ではthisを使ってはいけない
https://stackoverflow.com/questions/43188317/use-this-in-vue-template

template内のthisを使ったときに挙動が変わるということらしく、Vue.jsのtemplate内ではthisを使わないほうがいいとの回答でした。（どなたか「なぜtemplate内ではthisを使ってはいけないのか」理由をご存知の方がいらっしゃいましたら良かったら教えてください。。。。）



## 前提条件
```package.json
{
  "name": "codesandbox",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "vue": "^2.5.22"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "3.6.0",
    "@vue/cli-plugin-eslint": "3.6.0",
    "@vue/cli-service": "3.6.0",
    "babel-eslint": "^10.0.1",
    "eslint": "^5.8.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-template-compiler": "^2.5.21"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": ["plugin:vue/essential", "eslint:recommended"],
    "rules": {},
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}

```

以上です。
raspberrypi3にdockerをインストール

***追記
下記の手順でインストールはできたが、
実行時に下記のエラーが発生して、
実行できなかった。

docker: Error response from daemon: unable to find "net_prio" in controller set: unknown.

docker側の対応待ちのよう

https://github.com/docker/for-linux/issues/545
***




まずは、下記のサイト通り、
下記のコマンドを実行。

```bash

curl -sSL https://get.docker.com | sh
```

エラーメッセージが表示されて、
インストールできなかった。

・エラーメッセージ
E: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'testing' to 'stable'

下記のコマンドを実行したらいいとあったので、
実行する。

```bash
sudo apt-get update --allow-releaseinfo-change
```

やっぱりエラーが出力される。

・エラーメッセージ
E: リポジトリ https://download.docker.com/linux/raspbian 10 Release には Release ファイルがありません。
https://www.nekochango.com/entry/linux/trouble/apt-get_bionic_release_nothing

とりあえず、
dockerのインストールコマンドを実行してみる。

```bash
sudo apt-get install -y docker.io
```

正常にインストールされた。

```bash
sudo docker --version
```
Vimプラグイン導入（Vendle）

###はじめに
5TkmAkd5u82G0yCzmIjnyQnFBUPs1Os8PocfEa5lE4Oaaa
vimとはLinux/Unixにはじめから入っているデフォルトのテキストエディタ。詳しいことは以下を参照。
https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d

Vendleでvimプラグインを管理するようにしたのでその忘備録です。
Vendleのリポジトリはこちら。
https://github.com/VundleVim/Vundle.vim

###環境
MacOS Mojave
Vim version 8.0.1283
ターミナル iTerm2

###準備
ディレクトリを作成

```
mkdir -p ~/.vim/bundle
```
githubからvendleのリポジトリをクローン


```
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
```
クローン実行画面
<img width="892" alt="スクリーンショット 2019-07-10 21.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402891/de532dfe-f367-efdb-4ecb-051f2ed7ce1a.png">

.vimrcを編集する

```
vi ~/.vimrc
```

vimからgitの操作が可能になるプラグインを入れてみる。
17~26行目がvendleの設定。
23行目が今回導入するgit操作が可能になるプラグイン。


```
set encoding=utf-8
  2 scriptencoding utf-8
  3 set expandtab " タブ入力を複数の空白入力に置き換える
  4 set number " 行数表示
  5 set softtabstop=4 "連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
  6 set tabstop=4 " 画面上でタブ文字が占める幅
  7 set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
  8 set shiftwidth=4 " smartindentで増減する幅
  9 set showmatch " 括弧の対応関係を一瞬表示する
 10 set wildmenu " コマンドモードの補完
 11 hi LineNr ctermbg=0 ctermfg=7
 12 syntax on
 13
 14 "
 15 " 以下はvendleによるプラグイン設定
 16 "
 17 set nocompatible
 18 filetype off
 19 set rtp+=~/.vim/bundle/Vundle.vim
 20 call vundle#begin()
 21
 22 Plugin 'VundleVim/Vundle.vim'
 23 Plugin 'tpope/vim-fugitive'
 24 
 25 call vundle#end()
 26 filetype plugin indent on
```

###インストール
vimを起動してプラグインのインストールを行う。以下のコマンドを実行する。

```
:PluginInstall
```

<img width="712" alt="スクリーンショット 2019-07-10 22.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402891/fb130cf5-ff39-3bc3-3c91-1323a1dfa183.png">


###実行

適当なgitリポジトリ直下でvimを起動してみる。
右画面にてコマンドモードで「:Glog」(git log)をうつ。
gitのログや差分まで確認することができる。すごくいい。

<img width="1440" alt="スクリーンショット 2019-07-10 22.28.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402891/4176e011-704e-0651-5f04-2bd9c73aa49e.png">
Zabbixとgrafana連携 初期設定

# 環境
CentOS7
# インストール
- ファイル入手、展開  
  `wget https://dl.grafana.com/oss/release/grafana-6.2.1-1.x86_64.rpm`  
  `sudo yum localinstall grafana-6.2.1-1.x86_64.rpm`  
 ※ 最新版はここで確認できる https://grafana.com/grafana/download 
- Zabbix 用のプラグインをインストール  
  `sudo grafana-cli plugins install alexanderzobnin-zabbix-app`
- サービス有効化、再起動  
  `sudo systemctl enable grafana-server`  
  `sudo systemctl restart grafana-server`  

# 設定  
- grafana にアクセス 
  ブラウザからアクセス http://『サーバのIP』:3000/
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/d0b2aead-4894-e588-c815-991e6c07b09a.jpeg)
- ログイン  
  初期ログインは admin/admin
- パスワード変更  
  強制的にパスワード変更画面になるので変更する
- データソースにZabbixを追加
    + Zabbixのアイコンをクリック
 ![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/f883dcd2-24dc-e468-ee7d-6302a2459c49.jpeg)
    + 表示された画面でenableボタンをクリック。
- データソースの設定
    + 設定画面を開く
     ![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/aaf4a2bf-81e2-1029-47d0-74ff5b65d8c1.jpeg)
    + Zabbix を選択
    ![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/a4c5e8e1-2a4d-2a14-083b-23d3f3abcb08.jpeg)
    + 設定入力  
      記載の無いものはデフォルトでよい。
        + Name: `設定名なので自由に`
        + HTTP - URL: `http://『ZabbixのIP』/zabbix/api_jsonrpc.php`
        + Zabbix API details - Username : `Zabbix上に存在する表示したいデータを参照できるユーザ。どこまで権限が必要かは未確認。`
        + Zabbix API details - Password : `上記ユーザのパスワード`
    + 設定確認、保存
        + Save & Testを押す
    ![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/9a89b8ca-5152-a077-20fc-9d293e68dfd6.jpeg)
        + 以下のように表示されればOK。
![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/e4c0466b-7724-a545-be5c-eb947d1fdbc9.jpeg)
- デフォルトダッシュボードの追加
    + Dashbordsをクリック。
![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/ce17c1e1-12f0-05de-914d-e238e7219a54.jpeg)
    + テンプレートのimport ボタンをクリック。
    ![WS000017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/dd310182-294f-587f-823c-d33bfbde35b6.jpeg)
    + 一度トップに戻る
    ![WS000021.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/f660a3e5-9b96-86b0-33a2-6994eafa7cb7.jpeg)
    + テンプレートの選択
![WS000024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/67af56f2-b962-bf2d-eac3-197f8ae67cf6.jpeg)
![WS000025.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/22051540-ceb5-d1ac-6e2f-ce667a6c0822.jpeg)
    + 画面表示  
    以下のように表示されればOK。
![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443775/058a2e67-ce69-6a04-823e-88ac5964f327.jpeg)
HTML の リスト を 横並び にする　～CSS float: left;～

# 目的
- HTMLファイルのリストで箇条書きにされた内容を縦ではなく横並びに表示する方法をまとめる。

# 押さえるポイント
- 横並びに表示したいliタグかliタグに与えたクラス名を指定してCSSで設定する。
- CSSではfloatプロパティを使用する。
- 画面の左に寄せて横並びにしたいときはfloatプロパティでleftを指定する。
- 画面の右に寄せて横並びにしたいときはfloatプロパティでrightを指定する。

# 書き方の例
- 下記にHTMLファイルの内容を記載する。

``` html
<ul>
  <li>おはようございます。</li>
  <li>こんにちは。</li>
  <li>こんばんは。</li>
</ul>
```

- floatプロパティでleft(左)を指定する。
※画面右側に表示したいときはrightを指定する。
- 下記にCSSファイルの内容を記載する。

``` css
li {
    float: left;
}
```

※今回は書き方の例より具体的な例が思い浮かばなかったため、具体的な例は記載しない。
HTML の リスト の 黒点 を 表示しないようにする ～CSS list-style: none;～

# 目的
- HTMLファイルのリストで箇条書きされた内容の最初に自動で付与される黒点を表示しないようにする方法をまとめる。

# 押さえるポイント
- 黒点を表示したくないliタグかliタグに与えたクラス名を指定してCSSで設定する。
- CSSでは、list-styleプロパティを使用する。


#  書き方の例
- 下記にHTMLファイルの内容を記載する。

``` html
<ul>
  <li>おはようございます。</li>
  <li>こんにちは。</li>
  <li>こんばんは。</li>
</ul>
```

- list-styleプロパティでnoneを指定する。
- 下記にHTMLファイルの内容を記載する。

``` css
li {
    list-style: none;
}
```

※今回は書き方の例より具体的な例が思い浮かばなかったため、具体的な例は記載しない。
Ansibleもくもく会 （サーバ編 & NW編）参加感想

# Ansibleもくもく会に行ってきた感想
昨日、Ansibleのもくもく会に行ってきたので、どんなことをしたか、感想などを書いていきます。

## Ansibleもくもく会とは
レッドハット株式会社がサポートしている勉強会です。私が今回が初参加ですが、どうやら毎月やっているようです。私が参加したのは[こちら](https://ansible-users.connpass.com/event/135575/)
2時間ほどのもくもく会と5分程度で3人程が進捗発表して終わりという流れでした。

## Ansibleとは
pythonさえ入っていれば、エージェント側で準備するものは特になし！
で、クライアント側から用意した命令文（プレイブック）を対象サーバを記述したファイル（インベントリ）に実行していくというツールです。ざっくり言うとこんな感じ。

## どんな雰囲気だったか
基本みなさん静かにもくもくしてました。（私語禁止とかでは無いですが）
アルコールとナッツ系のお菓子とansibleのアメニティが真ん中に置いてあって自由に取ってもくもく出来ます。

メンターの人にアルコールしか無いか確認したら紙コップと1.5Lのオレンジジュース出してくれました。有り難いと同時に申し訳ない…

## 実施内容

用意されたawsサーバに各々ログインしてgithubに上がってるレッスン？内容を試していくって形でした。
サーバー系かネットワーク系か選べるんですが、私は業務で使ってるのでサーバー系にしました。

## 感想
環境がバッチリ作られているのですぐもくもく出来ました。とにかくAnsible動かしてみたいって初心者の人にオススメ出来ます。

私は少し使用経験ありますが、レッスンごとのテンポが良いので楽しめました。解説も丁寧に書いてくれてるので理解しやすかったです。全レッスン内容を確認できた訳ではないですが、進むごとにレベルは上がっていく印象を受けたので、Ansible歴が長い人が行っても新しい発見はあると思います。

個人的には今回の一番の収穫はメンターの人に「ansible-playbookでインベントリ指定しないで何故動くか」とか「Ansibleのパフォーマンス向上させる方法」とか聞けたのが一番の収穫というか勉強になりました。次回はもくもく会後のAnsible飯に参加したい。


## 最後に
メンターの人に聞いた上記2点については今週から来週にかけて記事にする予定なので良ければ見てください。チューニングの話は、普段数百台のサーバを対象にAnsible使っている、かつ、チューニングを意識したことが無い人ならタメになると思います！
iOS13ではStoryboardでもDIができる件について

# はじめに

これまでのiOS13未満のUIKitのAPIでは、**Storyboardで定義したUIViewControllerではinitializerでのDI（Dependency Injection｜依存性の注入）ができない**という課題がありました。

※initializerでのDIはコンストラクタインジェクションとも呼ばれますが、Swiftでは慣習的にコンストラクタという用語はあまり使わないので、本記事では「initializerでのDI」とします。

UIViewControllerの実装方法とinitializerでのDIの可否をまとめると以下のようになります。
※黒魔術的なライブラリなどを利用しない前提

|レイアウト実装方法|initializer DI可否（〜iOS12）|initializer DI可否（iOS13〜）|
|:---|:--:|:--:|
|コードベース|○|○|
|XIB|○|○|
|Storyboard|×|○|

iOS13未満での実装方法の詳細については以下の記事で説明しています。
[Qiita - iOSとコードベースレイアウト](https://qiita.com/shtnkgm/items/e2f393fd97e34bc90dc6)

勿論、プロパティインジェクションならばiOS12以下でもStoryboardで定義したUIViewControllerで可能ですが、initializerでのDIをする設計にすることで以下の恩恵が得られます。

 - DIする値をプロパティで保持する場合に、**varでなくletで定義できる**のでより安全
 - DIする値をプロパティで保持する場合に、**Optional型でなく非Optional型で定義できる**ので無駄なUnwrapが不要
 - UIViewControllerの生成を行うために、**必ずDIが必要になるので、プロパティインジェクションのように設定忘れが起こり得ない**

# iOS13でStoryboardでイニシャライザでDIする

iOS13では地味にこんなAPIが加わっています。

[instantiateInitialViewController(creator:)](https://developer.apple.com/documentation/uikit/uistoryboard/3213988-instantiateinitialviewcontroller)

```swift
func instantiateInitialViewController<ViewController>(creator: ((NSCoder) -> ViewController?)? = nil) 
-> ViewController? where ViewController : UIViewController
```

このAPIでは、creatorというクロージャーを引数として渡すことで、**これまで隠蔽されていたStoryboardからのUIViewControllerの生成過程に介入**することができます。

以下のようにUIViewControllerの継承クラスで以下のようにNSCoderを引数にとるinitializerを実装します。

```swift
class ViewController: UIViewController {
    @IBOutlet fileprivate weak var textView: UITextView!
    
    private let dependency: Int
    
    // DI用のinitializer
    init?(coder: NSCoder, dependency: Int) {
        self.dependency = dependency
        super.init(coder: coder)
    }
    
    // 独自のinitializerを実装するときにrequiredとして実装が要求されるinitializer
    // 利用しないので、fatalError()として実装を省略する 
    required init?(coder: NSCoder) {
        fatalError()
    }
}
```

上記のように定義したinitializerをcreatorのクロージャーで利用します。

```swift
let storyboard = UIStoryboard(name: "ViewController", bundle: nil)
let viewController = storyboard.instantiateInitialViewController { coder in
    ViewController(coder: coder, dependency: 10)
}
```

以上のようにすることで、Storyboardで定義したUIViewControllerでもinitializerでのDIが可能です。
0.1ぐらいから始めるProjectEuler@python　Problem 2

どもども、今日髪を切りに行ったら切られすぎてしまったとある学生です。
というわけで、2問目書いていきます。
まぁまぁ今回も簡単ですかね。

```python:Problem_2.py
#フィボナッチ数列の項は前の2つの項の和である. 
#最初の2項を 1, 2 とすれば, 最初#の10項は以下の通りである.
#1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
#数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
a=0
b=1
c=a+b
d=0
MAX=4000000
while c<=MAX:
    c=(a+b)
    a=b
    b=c
    if c>MAX:
        break
    elif c % 2 ==0:
        d+=c
print(d)
```
解　4613732
はい、私はこう書きました。
####解き方の解説をしていきます。
グローバル関数のa,bが数列の最初の数ですね。cがそれらを足したやつ。
dは、数値を入れておくための箱です。
後は、whileでa,bを足し続け、2で割って余りが0だったら、dに足していき、最後にcが4百万になったら止めるって感じです。

こんな感じですかね？もしわからないやアドバイス等あればコメントしていただければと思います（答えるとは言っていない）
というわけで気が向いたら次のも見てってください。よろしくお願いします。
uri code and character

| code| character|
|--:|:--|
| %20 | SPACE |
| %21 | ! |
| %22 | "|
|%23|	#|
|%24|	$|
|%25|	%|
|%26|	&|
|%27|	'|
|%28|	(|
|%29|	)|
|%2A|	*|
|%2B|	+|
|%2C|	,|
|%2F|	/|
|%3A|	:|
|%3B|	;|
|%3C|	<|
|%3D|	=|
|%3E|	>|
|%3F|	?|
|%40|	@|
|%5B|	[|
|%5D|	]|
|%5E|	^|
|%60|	`|
|%7B|	{|
|%7C|	縦棒 |
|%7D|	}|
|%7E|	~ |

#参考資料(reference)
ASCII文字とURLエンコードの対応表
https://www.seil.jp/doc/index.html#tool/url-encode.html

文字化け
https://qiita.com/kaizen_nagoya/items/d9319df1e1bb8ce6f7b8

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
測色計の測定結果をRGBに変換してPC上に色を再現する

### 目的
* 色測定（Lab出力）の結果を感覚的に分かるように保管したかった

### 結果

* 実物と比較すると違和感が拭えないが、、、まあいいか!
* おそらく、測定器、変換式、モニタ再現性、表面の質感データが失われていることが要因なのでこれで手打ちとする

### コード
```python

LAB_data = (23.0, 19.2, 30.5)
im = np.full((100,100,3), (int(LAB_data[0] * 255 / 100), int(LAB_data[1]*127/60+128), int(LAB_data[2]*127/60 + 128)), dtype='uint8')

im_cnvrt = cv2.cvtColor(im, cv2.COLOR_LAB2RGB)
plt.imshow(im_cnvrt)


print('Lab測定結果', LAB_data,'-->  Labデータのuint8変換', im[50,50],'　-->　RGB変換', im_cnvrt[50,50])

```

![sample.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312064/f2e46c9a-2db7-aa8e-e8bb-98698ea49ba8.png)



```python

# LAB data
L = 15
r=2
num = 7

LAB_data_list = [(L, r * np.sin(np.pi/num * i), r * np.cos(np.pi/num * i)) for i in range(num + 1)]


#%%
# plot_base

black_patch = np.full((100,100,3), (0, 0, 0), dtype='uint8')
white_patch = np.full((100,100,3), (255, 255, 255), dtype='uint8')


#%%
fig, ax = plt.subplots(5, num+1, dpi=600)
ax = ax.flatten()


def Lab2RBG(LAB_row_data):
    im = np.full((100,100,3), (int(LAB_row_data[0] * 255 / 100), int(LAB_row_data[1]*127/60+128), int(LAB_row_data[2]*127/60 + 128)), dtype='uint8')
    return cv2.cvtColor(im, cv2.COLOR_LAB2RGB)



for k in range(5):
    for i in range(num+1):
        if k == 0:
            temp_img = np.concatenate([black_patch, white_patch, Lab2RBG(LAB_data_list[i])], axis=1)

        elif k == 1:
            temp_img = np.concatenate([white_patch[:,:50], black_patch, Lab2RBG(LAB_data_list[i]), white_patch[:,51:]], axis=1)

        else:
            temp_img = np.concatenate([black_patch, np.full((100, 15 * k -1 ,3), 255, dtype='uint8'), Lab2RBG(LAB_data_list[i])], axis=1)

            for m in range(1, 15 * (k)):
                temp_img[:, 99 + m] = Lab2RBG(LAB_data_list[i])[50,50] / (15 * k) * m

        ax[k * (num+1) + i].imshow(temp_img)
        ax[k * (num+1) + i].set_xticks([])
        ax[k * (num+1) + i].set_yticks([])


```
確率・情報・エントロピー　有本卓　参考文献　書き掛け

確率・情報・エントロピー　有本卓, 森北出版, 1999, (1980, ver.1)
![41QZJPF1QSL._SX326_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/0abbaf9c-643b-2f1f-10a8-c8e1eb964c69.jpeg)
https://www.amazon.co.jp/dp/4627820496/

#第1章

1-1 伊藤清, 確率論の基礎, 岩波書店, 1959
1-2 伊藤清, 確率論, 岩波書店, 1953
1-3 河田竜夫, 確率と統計, 朝倉書店, 1961
1-4 グネジュンコヒーチン, 確率論入門, 東京図書, 1969
1-5 赤 攝也　確率論入門
https://www.amazon.co.jp/dp/4480096280/
1-6 Doob, J.L. Stochastic Processes, Wiley, 1953
https://science.sciencemag.org/content/118/3074/659
関連文献
J. L. DOOB:
FOUNDATIONS OF STOCHASTIC PROCESSES AND PROBABILISTIC POTENTIAL THEORYBy Ronald Getoor
https://arxiv.org/pdf/0909.4213.pdf

1-7, Feller, W., An intdoction to Probability Theory and Its Applications I, Wiley, 1950
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwiG_J22sarjAhWay4sBHVY7CloQFjAAegQIAhAC&url=https%3A%2F%2Fwww.researchgate.net%2Fprofile%2FWilliam_Balthes%2Fpost%2FStronger_limit_Theorems_then_the_strong_law_of_large_numbers%2Fattachment%2F59d6256e6cda7b8083a21880%2FAS%253A445697653776384%25401483274010393%2Fdownload%2FWilliam%2BFeller-An%2BIntroduction%2BTo%2BProbability%2BTheory%2BAnd%2BIts%2BApplications.%2BVol%2BII.pdf&usg=AOvVaw1o8Dcz2AiylwrJbWzQNj-l

https://www.researchgate.net/profile/William_Balthes/post/Stronger_limit_Theorems_then_the_strong_law_of_large_numbers/attachment/59d6256e6cda7b8083a21880/AS%253A445697653776384%25401483274010393/download/William%2BFeller-An%2BIntroduction%2BTo%2BProbability%2BTheory%2BAnd%2BIts%2BApplications.%2BVol%2BII.pdf

確率論とその応用、上下、紀伊国屋書店, 1960
fitbitアプリでできることを調べてみた

[fitbit APIリファレンス](https://dev.fitbit.com/build/reference/)より、Device APIをひととおり調べてみた。
APIバージョンは3.1。

### Accelerometer
加速度

### Barometer 
気圧計

### Body-presence
fitbitを装着しているかどうか

### Clock 
時計機能
時・分・秒単位でtickイベントをとることも

### Device 
fitbitデバイスのモデルやバージョン、スクリーンサイズなどを取得

### Display 
ディスプレイの状態、ON/OFFや明るさなどを取得・制御できる

### Document 
画面のいろいろなイベントの取得、SVG制御など

### Exercise 
エクササイズ情報へのアクセスや、状態の制御
ランニング、サイクリング、水泳など

### Geolocation 
位置情報

### Gyroscope 
ジャイロ情報。fitbitの姿勢（角度）

### Haptics 
バイブ制御

### Heart-rate
心拍数を取得

### Messaging 
スマホ側のコンパニオンアプリと通信

### Orientation 
地磁気センサーによる向きの取得

### Power
バッテリー情報（残量や充電状況）の取得

### System 
システム情報取得のほか、他のアプリの起動もできそう

### User-activity
活動時間、消費カロリー、移動距離、上った階数、歩数それぞれの現在値と、1日の目標値を取得

### User-profile
登録されているユーザープロフィールの取得（身長・体重・年齢なども）
VSCode Wokrspaceのファイルを全て開いて任意のコマンドを実行する拡張機能

## 何がしたかったか

VSCodeの「Markdown Preview Enhanced」は素晴らしい拡張機能です。
最近これを使って色々とドキュメントをPlantUML付きで書いているのですが、
PlantUML付きのMarkdownをレンダリングしてくれる環境が無い人達の為には、PDFやHTMLに変換して配布する必要があります。
差別にうるさい令和の時代に、エディタを強制するのはマッチしません。
一方で、素晴らしき「Markdown Preview Enhanced」には、何故かPDFやHTMLでの出力を実行するコマンドはありません。
(Preview表示画面でのクリック操作では可能ですが)
以下の文をMarkdown内に記載しておけば、HTMLでのPreview時には自動でファイルとしても保存されますが、
ちょっとした変更の場合はPreviewを表示しない場合もあると思います。

```markdown
---
export_on_save:
  html: true
---
```

そこで、やや強引ですが、Workspaceの全指定拡張子のファイルを開いて任意のコマンド(複数個)を実行する拡張機能を作成しました。
VSCodeのコマンドをマクロのように任意に組み立てることができます。
これで、自動でWorkspace内の全mdファイルをMarkdown Preview EnhancedでPreviewして、最新のHTMLファイルを取得できます。
ちなみに、呼び出すコマンドは引数指定ができません。。。

## 拡張機能

[Link](https://marketplace.visualstudio.com/items?itemName=dNk.allfileopen)からインストールできます。
設定は以下の2項目です。

| Setting | Default | Note |
|:----|:------------|:----|
| `"allfileopen.extensionFileSearch"` | `"txt"` | 対象ファイルの拡張子 |
| `"allfileopen.runcommands"` | `[""]` | 実行するVSCodeのコマンド |

開いたファイルは自動では閉じないので、ファイル数が多い場合には操作後にファイルを閉じるのが無難です。
ちなみに、Markdown Preview Enhancedでの自動HTML変換の為にはPreviewを開いた後にファイルを保存する必要があります。

と、言うわけで主目的を達成するためのJSONファイルの設定は以下です。
ファイルを開いた後に、
`"markdown-preview-enhanced.openPreviewToTheSide"`サイドViewに表示した上で、
`"workbench.action.files.save"`ファイルを保存してHTMLファイルを出力して
`"workbench.action.revertAndCloseActiveEditor"`ファイルを閉じます

```
	"settings": {
		"allfileopen.extentionFileSearch" : "md",
		"allfileopen.runcommands" : ["markdown-preview-enhanced.openPreviewToTheSide",
			"workbench.action.files.save",
			"workbench.action.revertAndCloseActiveEditor"],
	},
```

なお、使用したいコマンドの名称は、VSCode上で以下の手順により確認できます。

- `Preferences: Open Keyboard Shortcuts`(デフォルトショートカットは`Ctrl+K Ctrl+S`です)
- 使用したいコマンドを右クリックして、`Copy Command`をクリック
- 貼り付け


設定したいコマンドは、専用のJSONファイルで引数も含めて指定できたほうがいいかもしれません。
VSCode自体を開いて、本拡張機能のコマンドを実行するのはRPAツールが必要ですが、
VSCode拡張機能で実現しているWorkflowがある場合には有効かな、と考えています。

# 余談
自分は普段(foreach文があるモダンな言語としては)C#を使うのですが、TypeScript(JavaScript)のforeachではasync/awaitが使えないことを知らずにハマりました。
かなり近い構文/文法の為、方言くらいの違いと思っていたら痛い目にあいました。
今回は、1ファイルずつ処理をしたかった(ファイルオープン->コマンド実行)ので、for-of文に変更しました。
[参考](https://qiita.com/woowig/items/16f2880d74028c33dbe2)
【OpenCV】平滑化フィルタまとめ【Python】

#　概要
　OpenCV（Python）で利用できる画像の平滑化を行うフィルタをまとめました。

#　ブラーフィルタ
　ブラーフィルタは1ピクセルごとに周辺のピクセルの平均値を求め画像をぼかすフィルタのことです。

https://cvcvcv.hateblo.jp/entry/2019/06/12/214956

#　ガウシアンフィルタ
　ガウシアンフィルタは正規分布に従ったフィルタを用いて畳み込み処理を行っています。

https://cvcvcv.hateblo.jp/entry/2019/06/17/202652

#　メディアンフィルタ
　フィルタで畳み込みを行った領域の中央値を対象のピクセルに代入することで平滑化を行っています。

　白飛び、黒飛びの多い画像では最も有効なフィルタです。

https://cvcvcv.hateblo.jp/entry/2019/06/17/203939

#　バイラテラルフィルタ
　バイラテラルフィルタはエッジを保持したまま画像をぼかすことができます。画素値の差が小さい近傍ピクセルに大きい重みを持つガウシアンフィルタだと思えばよいです。

https://cvcvcv.hateblo.jp/entry/2019/06/18/213422
GitHub の Pull Request が便利になったよ！

株式会社オズビジョンのユッコ (@terra_yucco) です。
お休みから復帰後、GitHvb Review がやりやすくなっていたのでその感動を共有。

# チェックリストが出来た

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/77b4cfcc-dfe2-b821-067e-11aa766a19a2.png)

## レビューした後【viewed】をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/e9d04a03-8277-91a0-c9d4-e67f92d1e2fe.png)

## 開いていたファイルがクローズされ、チェックリストが増える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/b5a5f4f0-7967-ba72-53a3-6cefc825a7ed.png)

# 思うこと

Pull Request は小さい単位で依頼しましょう、というのがあったかと思いますが、この機能ができたということは大量ファイルの Review が GitHub 全体で増えてきたのかな？

# めも

ちなみに、全部チェックしても色が変わったりとかはしません。
物理学最前線8 スピングラスとは何か 小口武彦 参考文献（書きかけ）

物理学最前線8 スピングラスとは何か 小口武
https://www.amazon.co.jp/dp/4320031903/

#参考文献

#1
W. Heisenberg, Z. Phys., 38, 1926, 411;
W. Heisenberg, Z. Phys., 49,1928, 619

#2 
F. Bitter, Phys. Rev., 38, 1931, 1903
#3
H.J. Williams, R. M. Bozorth & W. Shockley, Phys. Rev., 75,1949,155
#4
L. Landau & E. Lifshitz, Phys. Z. Sowjetununion, 8, 1935, 153
#5
W. Heitler & F. London, Z. Phys., 44, 1927, 455
#6
P.A.M. Dirac, Proc. Roy. Soc., A112, 1926, 611
#7
P.W. Anderson, Phys. Rev., 79, 1950, 350
P.W. Anderson, Phys. Rev., 115, 1959,2
#8
F.Frohlich & F.R.N. Navarro, Proc. Roy. Soc., A175, 1940, 382
#9
C. Zener, Phys. Rev., 81, 1951, 440
C. Zener, Phys. Rev., 83, 1951, 299
#10
M.A. Ruderman & C. Kittel, Phys. Rev., 96, 1954, 99
AWS Developer Associate 合格しました(2019/6)

# AWS 3冠になりました:v:

この度晴れて、アソシエイトの資格全てに合格することができました！

受験期間としては3月末〜6月末の約3ヶ月間です。
間で業務のためRailsにはまっていた時期もあったので実質3ヶ月かからないくらいだと思っています。

## AWS Developerアソシエイト試験に関して

その中でも今回はSysopsの反省を生かして一発で合格できたDeveloperアソシエイトに関してまとめようと思います。


一言でまとめると、、、

### めっちゃ難しかった！！！

につきます。

Sysopsもかなり理解を問われる問題もありますが、問題改定を終えて肌感覚的な意見ですが3つで一番難しかったです。。

最後の最後まで不安なまま試験を終える形になってしまいました:joy:

アソシエイトの新試験の難易度は

### Developer > Sysops > Solution Architect

の順になっているといっても過言ではありません。

得意分野は人それぞれなので一概には言えませんが、参考にしていただけたらと思います。


## その中でDeveloperの勉強で行ったこと

今回も前回を踏襲して問題集を解きながら、Black Beltを三回づつくらい読みました。

問題集は自分に合うものでいいかと思いますが、私は英語の同じものを5回分を最低三回ずつは解いて95%以上取れるようになるまでやりました。


### BlackBeltで特に読んだ方が良い資料

やはり開発者向けなので、基本こちらになります。他二つの知識はある前提です。

・ Codebuild ←特に重要
・ CodePipeline
・ CodeDeploy ←特に重要
・ CodeCommit
・ ElasticBeanstalk
・ Lambda ←特に重要
・ API Gateway ←特に重要
・ ElastiCache
・ DynamoDB ←特に重要
・ SQS
・ KMS
・ ECS
・ X-Ray ←特に重要
・ Step Functions

上記は必須の知識になるかと思いますが、
これに加えて基本的なサービスの理解は必ず必要になります。

基本的にほとんどの問題が複合された問題なので、丸覚えだと当たり前ですがほとんど模試の問題も出ないので理解しておくことが大切です。

:point_up:わからない用語は調べて理解する
:v: なぜそうなるのがAWSのベストプラクティスに則っているのか、常に自分に問いかけながら学習する

これを忘れなければきっとみなさまも合格できると思います！！

次はプロフェッショナルの取得(8月,9月)に向けて頑張ります:raised_hands:
Linux（CentOS7）にJava（jdk1.8）を手動でインストールする手順

2017/06/03に作成した資料をアップします。

Linux（CentOS7）にJavaをインストールする簡単な方法として、yumコマンドやrpmコマンドでインストールする方法があるが、ここでは手動でインストールする方法を紹介する。

### 1. CentOS7にログインし、rootユーザーにスイッチする。
```
$ su -
#
```
### 2. Oracleのウェブページから「jdk-8u131-linux-x64.tar.gz」をダウンロードする。
```
# curl -OL --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz"
```
（リンク先のURLは変わっているかも？）
（コマンドではなく、ブラウザからダウンロードしても良い。）
### 3. 「jdk-8u131-linux-x64.tar.gz」を解凍する。
```
# tar xvzf ./jdk-8u131-linux-x64.tar.gz
```
（「jdk1.8.0_131」が作成される。）
### 4. 「jdk1.8.0_131」を/opt」配下にコピー（移動）
```
# mv ./jdk1.8.0_131 /opt
```
### 5. jdkの今後のバージョンアップによるパス変更を吸収するため、シンボリックリンクを作成する。
```
# ln -s /opt/jdk1.8.0_131 /opt/java
```
### 6. rootユーザーを抜け、ログインしたユーザーに戻る。
```
# exit
$
```
### 7. Java環境ファイルを「.java.env」を作成する。
```shell:.java.env
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.
```
### 8. 作成したjava環境ファイルを読み込む。
```
$ source .java.env
```
### 9. Javaコマンドでインストールされたjdkのバージョンを確認する。
```
$ java –version
（以下が表示される。）
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
```
### 10. ログイン時に環境変数が設定されるようにユーザーのホームディレクトリの「.bash_profile」に、以下を追加しておく。
```shell:.bash_profile
・・・・・・・・
source .java.env　　　　←この行を追加
```
### 【環境変数について】
今回は「.java.env」を作成し、sourceコマンドで環境を設定したが、「/etc/profile.d」ディレクトリ配下に、以下のファイルを配置するとログイン時に環境変数が設定される。

```shell:./etc/profile.d/java.sh
#!/bin/sh
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.
```

以上
BootstrapVueをRailsに導入してみる

初投稿です

RailsでBootstrapとVue.jsを使う方法を調べると、
Vue.jsを`rails new project --webpack=vue`で入れてきて、
BootstrapはGemfileに`gem 'bootstrap'`を書いてbundle installしてjsやscssをいじって、、、
というのがオーソドックスなやり方のよう

ちょっと面倒なのと、なぜかvueファイルのtemplateに書いたtooltipがちゃんと効いてくれなかったので、Bootstrapをgemで入れないようにして、yarnでBootstrapVueを入れるようにしてみた

# BootstrapVue
おなじみBootstrapとVue.jsが合体したもの
[公式サイト](https://bootstrap-vue.js.org/)

# やったこと
プロジェクト作成（webpackでvueもインストール）

```bash
$ rails new bootstrapvue_rails --webpack=vue
```

yarnでBootstrapVueをインストール

```bash
$ cd bootstrapvue_rails
$ yarn add bootstrap-vue
```

画面を用意して、ルーティングしてあげる

```bash
$ rails g controller Home index
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

画面のjsファイルを作る

```javascript:app/javascript/packs/home.js
import Vue from 'vue/dist/vue.esm'
import BootstrapVue from 'bootstrap-vue'
import App from '../app.vue'

import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

Vue.use(BootstrapVue)

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    el: '#hello',
     data: {
      message: "Can you say hello?"
    },
    components: { App }
  })
})
```

vueファイルを作る

```vuejs:app/javascript/app.vue
<template>
  <div id="app">
    <p>{{ message }}</p>
    <div class="text-center my-3">
      <b-button v-b-tooltip.hover title="Tooltip content">Hover Me</b-button>
    </div>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      message: "Hello Vue!"
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>
```

viewで読み込む

```erb:app/views/home/index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<div id='hello'>
  {{message}}
  <app></app>
</div>

<%= javascript_pack_tag 'home' %>
```

サーバーを立ち上げたらtooltipが効いてくれてる

```bash
$ ./bin/webpack-dev-server
$ rails s
```

![スクリーンショット 2019-07-10 21.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167542/b0bb9f2a-b886-1a4d-649e-6fc470edc84e.png)
TECH ~Day15~

中間試験

これまで２週間学習をしてきた知識を活かしてこの日は中間試験を行いました。
現時点で自分がどれだけ知識を覚えられているのかというのがよくわかりました。

ちなみに結果としては百点満点中の7点でした。。。。。
正直この点数も実際かなり個人的に甘くつけた点数なので正直かなりショックは大きかったです。
しかし後からメンターの方から聞いた話だと、この中間試験の今までの平均点は０〜14点という話でした。これを聞いた時は最初のショックも少しは無くなりました。

現時点ではまだまだ社会で通用する力はかけらも備わっていないということがわかりました。
これからもさらに気を緩めずに学習に力を入れていかなければいけないというように改めて思いました。
HTML の ブロック要素 の 高さ と 幅 を 設定する ～CSS height: ピクセル数;とwidth: ピクセル数;～

# 目的
- HTMLファイルのブロック要素の高さと幅を設定する方法をまとめる

# 押さえるポイント
- 高さや幅を変更したいブロック要素をCSSで指定してサイズを設定する。
- 高さの指定にはheightプロパティを使用する。
- 幅の指定にはwidthプロパティを使用する。
- 高さと幅はピクセル数を用いて設定する。

# 高さの設定の書き方の例(CSS)

``` css
ブロック要素の名前かブロック要素のクラス名{
    height: ピクセル数;
}
```

# 幅の設定の書き方の例(CSS)

``` css
ブロック要素の名前かブロック要素のクラス名{
    width: ピクセル数;
}
```

# より具体的な例
h1要素の高さを100px、幅を500pxに設定する。

〜サンプルコード〜

- 下記にHTMLファイルの内容を記載する。

``` html
<h1>おはようございます。</h1>
```

- CSSで上記のHTMLファイルのh1要素のフォントをAvenir Nextにする設定を行う。
- 下記にCSSファイルの内容を記載する。

``` css
h1 {
    height: 100px;
    width: 500px:
}
```
連鎖行列積アルゴリズム

連鎖行列においてもっとも効率の良い計算順序をもとめるアルゴリズム

- DPの一つ

# 実行例

$$
S = A_1 A_2 A_3 A_4 A_5 A_6
$$

```math
A_1: 12 \times 10 \\
A_2: 10 \times 6  \\
A_3: 6 \times 2   \\
A_4: 2 \times 4   \\
A_5: 4 \times 8   \\
A_6: 8 \times 10 
```

で与えられた時

```math
p_0 = 12 \\
p_1 = 10 \\
p_2 = 6  \\
p_3 = 2  \\
p_4 = 4  \\
p_5 = 8  \\
p_6 = 10
```

となるので

連鎖行列アルゴリズム実行後

```math
s[1, 6] = 3 \\
s[1, 3] = 1 \\
s[4, 6] = 5
```

より

$$
S = A_1 (A_2 A_3)(A_4 A_5) A_6
$$

がもっとも効率がよくなります。

```Rust
fn matrix_chain_order(n: usize, p: Vec<i64>) {
    let mut m = vec![vec![0; n+1]; n+1];
    let mut s = vec![vec![0; n+1]; n+1];
    for l in 2..=n {
        for i in 1..=n-l+1 {
            let j = i + l - 1;
            let mut min_m = i64::max_value() / 2;
            let mut nk = 0;
            for k in i..j {
                if min_m > m[i][k] + m[k+1][j] + p[(i as i64-1) as usize] * p[k] * p[j] {
                    min_m = m[i][k] + m[k+1][j] + p[(i as i64-1) as usize] * p[k] * p[j];
                    nk = k;
                }
            }
            s[i][j] = nk;
            m[i][j] = min_m;
        }
        for i in 1..n+1 {
            for j in 1..n+1 {
                print!("{:>6}", m[i][j] % 100000);
            }
            println!();
        }
        println!();
        for i in 1..n+1 {
            for j in 1..n+1 {
                print!("{:>6}", s[i][j] % 100000);
            }
            println!();
        }
        println!();
    }
}

fn main() {
    let p = vec![12, 10, 6, 2, 4, 8, 10];
    matrix_chain_order(p.len()-1, p);
}
```



# 参考
[wiki](https://en.wikipedia.org/wiki/Matrix_chain_multiplication)
HTML の リスト の 一部だけ 文字の色を 変更する

# 目的
- HTMLファイルのリストで箇条書きされた内容の一行のみ文字の色を変更する方法をまとめる

# 押さえるポイント
- 変更したい行のliタグにクラスを与えてCSSにて文字の色を設定する。

# 書き方の例
- 下記にHTMLファイルの内容を記載する

``` html
<ul>
  <li>おはようございます。</li>
  <li class="selected">こんにちは。</li>
  <li>こんばんは。</li>
</ul>
```

- 下記にCSSファイルの内容を記載する。

``` css
.selected {
    color: カラーコード;
}
```

# より具体的な例
箇条書きされたリストの｢おはようございます。｣の文字を赤色に設定する。

〜サンプルコード〜
- 下記にHTMLファイルの内容を記載する。

``` html
<ul>
  <li>おはようございます。</li>
  <li class="style">こんにちは。</li>
  <li>こんばんは。</li>
</ul>
```

- CSSで上記のHTMLファイルのstyleクラスに対して文字を赤色に設定する。
- 下記にCSSファイルの内容を記載する。

``` css
.style{
  color: red;
}
```
LeetCode / Roman to Integer

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/10/203937)からの転載）

https://leetcode.com/problems/roman-to-integer/

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

その名の通り、ローマ数字を数値に変換するという問題です。
"IV"なら4、"VI"なら6と、ローマ数字中の文字のある場所によって数値が変わるのがポイントですね。

#### 回答・解説

##### 解法1
どの解法でもポイントになるのは、ローマ数字に対してループを回したとき、<b>今の桁の数が次の桁の数よりも小さかったら、今の桁の数の分だけ値を引く</b>点です。
つまり、"VI"のように"I"の前に"V"とより大きな値が来た時はそのまま5+1=6と足せば良いが、"IV"のように"V"の前に"I"とより小さな値が来た時は5-1=4と引く必要があります。
これをコードに反映します。

```python
class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
        z = 0
        for i in range(0, len(s) - 1):
            if d[s[i]] < d[s[i+1]]:
                z -= d[s[i]]
            else:
                z += d[s[i]]
        return z + d[s[-1]]
```

d[s[i]] < d[s[i+1]]の場合はzからd[s[i]]を引くことで、上記ポイントを反映します。<br>
最後の桁は次の桁との比較ができないので、ループの外でd[s[-1]]を足して、最終的な答えとします。

##### 解法2

基本的な考えは解法1と同じですが、より短く・早くを志向します。
例えば以下のようなコードが考えられます。

```python
class Solution:
    def romanToInt(self, s):
        d = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}
        z, p = 0, 'I'
        for c in s[::-1]:
            z, p = z - d[c] if d[c] < d[p] else z + d[c], c
        return z
```

ループを回す際、変数pに前の桁の数が入るようにして、次の桁の数である変数cに対して、d[c]とd[p]を比較しています。<br>
d[c] < d[p]の場合にzからd[c]を引くというのは解法1と全く同じロジックですね。
Cloud Functions for Firebaseの導入で躓いたこと

# 注意
自分用のメモとしての意味合いが強いので、簡単に記載しています。
前提として、Firebase CLIなどのインストールは済んでいるものとします。

# 事象

## `firebase init functions`が`HTTP Error: 401, Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential.`で失敗する
https://stackoverflow.com/a/52891586 を参考に、一度`firebase logout`でログアウトしてから`firebase login`でログインし直したところ解決しました。

## `firebase deploy --only functions`が`Error: An unexpected error has occurred.`と表示されて失敗する
https://stackoverflow.com/a/56885970 を参考に`npm install -g npm@6.9.2`を実行することで解決しました。

## `firebase deploy --only functions`が成功してもFirebaseコンソールに反映されない
最初に生成されたサンプルコードをそのままデプロイしていたのが原因でした。

```javascript:index.js
const functions = require('firebase-functions');

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });
```

コメントアウトを外したら反映されました。

```javascript:index.js
const functions = require('firebase-functions');

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.helloWorld = functions.https.onRequest((request, response) => {
  response.send("Hello from Firebase!");
});
```
Windows上のVagrantでRails環境構築する際の共有フォルダの注意点【メモ】

## gemを共有フォルダ以下にインストールするとエラーになる

解決策：gemを共有フォルダ以外にインストールする。

```console
> bundle install --path 共有フォルダ以外へのpath
```

## sqlite3のデータベースファイルを共有フォルダ以下に置くとエラーになる

解決策1：マイグレーションについては以下のように対処できる。

```config/database.yml
...

test:
  <<: *default
  database: db/test.sqlite3 # ←pathを共有フォルダ以外に変更

production:
  <<: *default
  database: db/production.sqlite3 # ←pathを共有フォルダ以外に変更
```
解決策2：PostgreSQL, MySQLなどの他のDBを使う。


## 筆者の環境
Host OS: Windows 10 Home (バージョン 1809(OSビルド 17763.557))
Vagrant 2.2.4
Virtual Box 6.0.8
Vagrant Box(Guest OS): CentOS/7
📊 maftoolsでoncoplotを作ってみた

小ネタです。
アウトプットしないと何も覚えないので書いてます。R初心者のため低クオリティです。


TCGAの論文とかに出てくる、がんのゲノム変異の一覧みたいな図をOncoPlotと言うそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a4beb799-f9ce-2df7-fa2d-ba77dfc7d4a7.png)


これを作ってくれるRのパッケージが`maftools`です。bioconductorからインストールします。
https://bioconductor.org/packages/release/bioc/html/maftools.html

maftoolsは、mafファイルを必要とします。VCFファイルから、[vcf2maf](https://github.com/mskcc/vcf2maf)という使いにくそうなツールを使って生成するようですが、TCGAのサイトからmafファイルをダウンロードする方法もあります。そのためのパッケージが`TCGAbiolinks`です。

それでは、[TCGAbiolinksのチュートリアル](http://bioconductor.org/packages/release/bioc/vignettes/TCGAbiolinks/inst/doc/mutation.html)と全く同じネタですが、胆管がんのOncoplotを作成してみす。

```R
library(TCGAbiolinks)
library(maftools)
library(dplyr)
maf <- GDCquery_Maf("CHOL", pipelines = "varscan2") %>% read.maf
```

Rユーザーにとっては常識の類だと思われますが、%>% はmagrittrの提供する機能だそうです。よくわかりませんがコマンドラインの`|`に似ている機能だと想像します。

```R
mode(maf)
```
とやると、`[1] "S4"`と表示されます。このmafの中味はS4クラスというやつなのだろうと思われます。
脱線しましたが、oncoplotを描きます。

```R
oncoplot(maf = maf)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/191644f0-2077-674d-5f80-8d706cf8fc99.png)

簡単ですね。

臨床のデータと組み合わせるときは、

```R
library(TCGAbiolinks)
library(maftools)

tcgacode = "CHOL"

barcode2simple <- function(x) {
   ar = strsplit(x , "-")
   paste(ar[[1]][1:3], collapse = "-")
 }

maf = GDCquery_Maf(tcgacode, pipelines = "varscan2")
maf["Tumor_Sample_Barcode"] = apply(maf["Tumor_Sample_Barcode"], 1, barcode2simple)

clinicalData = GDCquery_clinic(project = paste("TCGA", tcgacode, sep="-"), type='clinical')
names(clinicalData)[names(clinicalData)=="submitter_id"] = "Tumor_Sample_Barcode"
clinicalData["Tumor_Sample_Barcode"] = apply(clinicalData["Tumor_Sample_Barcode"], 1, barcode2simple)

head(clinicalData)
maf = read.maf(maf = maf, clinicalData = clinicalData)

oncoplot(maf = maf,
    clinicalFeatures = c('gender','tumor_stage'),
    additionalFeature = c("Tumor_Seq_Allele2", "C"),
    draw_titv = TRUE,
    top = 30)
```
みたいな感じにするとできるようです。（Rの初心者なので、上のコードは何やら非効率なことをやっている可能性が高いです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f576f41e-1ff0-eda1-2d8f-00bebf42cba7.png)

この記事は以上です。
（Vue.js）methodsの処理の中でdataを参照できないエラーの解決法

## 問題: methodsの処理で、dataの参照に失敗する
button押下時に発生するgatherResultでdataの参照に失敗するエラーが出てしまいました。

```App.vue
<template>
  <div id="app">
    <form v-on:submit.prevent>
      <input type="text" id="username" value="aaa"/>
      <button @click="gatherResult">send</button>
    </form>
    <div v-if=" this.result.length !== 0 ">{{ result }}</div>
  </div>
</template>

<script>
export default {
  name: "App",
  data: () => {
    return {
      result: []
    };
  },
  methods: {
    gatherResult: () => {
      this.result.push(document.getElementById("username").value);
    }
  },
};
</script>

```


```エラー内容.txt
[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'result' of undefined"


found in


---> <App> at /src/App.vue

       <Root>

TypeError: Cannot read property 'result' of undefined
    at VueComponent.gatherResult 
```
最初はdataの定義の仕方が悪いのかと思ったり、いろいろ調べていると、gatherResult の定義の仕方の問題であることがわかりました。


## 原因: arrow関数で定義したmethodsの処理内でthisが参照できないため
https://stackoverflow.com/questions/49417410/how-to-save-reference-to-this-in-vue-component
Vueのmethods の処理にarrow関数をなんとなく使っていたのですが、arrow関数の中ではthisが参照できないので、dataにもアクセスが出来ないようでした。

## 解決方: 通常の関数として定義する

通常の関数として定義すればthisを参照できるようです。

```App.vue
<template>
  <div id="app">
    <form v-on:submit.prevent>
      <input type="text" id="username" value="aaa"/>
      <button @click="gatherResult">send</button>
    </form>
    <div v-if=" this.result.length !== 0 ">{{ result }}</div>
  </div>
</template>

<script>
export default {
  name: "App",
  data: () => {
    return {
      result: []
    };
  },
  methods: {
    gatherResult(){
　　　　this.result.push(document.getElementById("username").value);
    }
  },
};
</script>

```

これで、button押下時のエラーはなくなりました。
以上です。