OmniAICreator/Qiita-1.07M huggingface dataset:
Railsのモデル機能について

#Rails1のモデルについて

Railsのモデルのメモです

Railsにおけるモデルとは、データベースや外部サービスとのやり取りをする機能のことです。

Railsでは、[ORマッパー](https://qiita.com/yk-nakamura/items/acd071f16cda844579b9)を使用するので、リレーショナルデータベースを、オブジェクトのように扱うことが出来ます。


データベースの接続の設定をするのに、configファイル配下にある、database.ymlというファイルを使用します。
データベースはsqlite3を使用しています。

```database.yml
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

```

ここでは、edvelpoment(開発)、test(テスト)、production(本番)環境が用意されていることがわかりますね。


##モデルの作成

モデルは、以下のコマンドで作成することが出来ます。

```
$ rails g model モデル名 field:type[...] [options]
```

モデル名の後に、テーブルにフィールドタイプを順次指定していきます。

![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/d6387c4c-dcdf-f0a8-5662-c4a7860bf28f.png)

続々とファイルができましたね。

これだけでは、肝心のデータベースの作成がまだされていません。
Railsでは、テーブルの作成や変更時に、マイグレーションという機能を使用します。

```
$ rails db:migrate
```
のコマンドで実行することが出来ます。

![スクリーンショット (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/b61f1fdf-30f7-baa3-e8e9-a00083861c96.png)

成功すれば、こんな結果になるはずです。

#取得したデータの画面への表示

コードを記述する前に、こちらのmodelフォルダ配下のコードを確認しましょう。
私は、bookという名前でモデルをさくせいしました。

```book.rb
class Book < ApplicationRecord
end
```

このBookにオブジェクト配列でデータが入っているようです。

Bookを画面に表示させるには、コントローラ機能と、ビュー機能を使用しましたね^^

```--controller.rb
class HelloController < ApplicationController
  def list
    @books = Book.all
  end
end
```
作成したコントローラに上記のコードを追加します。
@books = Book.allで、配列の中のデータを@bookに格納し、ビュー機能でも使用できるようにします。

```list.html.erb
<% @books.each do |book| %>
<tr>
    <td><%= book.title -%></td>
</tr>
<% end %>
```
では、@booksオブジェクトの中から、タイトルに関わるものだけ抜き出してみます。

次は、ルートの定義をします。

routes.rbに以下のコードを追加します。

```
get 'アプリ名/list'
```

そして、対象のURLへアクセスすると、、

![スクリーンショット (37)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/49a7767a-e4d4-e78f-3c93-3cb199601d4d.jpeg)

ちゃんと出ていますね！！

コマプロを見てみると、、

![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/58be9c65-7a73-d7f8-a390-a3406e938234.png)

BookからGETしている！！！

楽しくなってきます笑

ではまた！
pythonのpymatgenの使い方を頑張ってまとめてみる②

# はじめに
今回も前回に引き続き、pymatgenの使い方をまとめていきたいと思います。それでは始めていきましょう。

***
### structureオブジェクトの色々な使い方
今回は、ICSDのデータを使用していきます。

```.py
import pymatgen as mg

structure = mg.Structure.from_file('data_1-ICSD.cif')
print(structure.species)
print(structure.species_and_occu)
```

>[Specie Cr3+, Specie Cr3+, Specie Cr3+, Specie Cr3....]
>[Comp: Cr1, Comp: Cr1, Comp: Cr1, Comp: Cr1,....]

今回使用したcifファイルの中身はCr2Te4O11 となっています。まず、Structure.from_fileでcifファイルをstructureオブジェクトに変換しています。structureオブジェクトのspecisとspecies_and_occuには、上記のような原子の種類や位置のデータが格納されています。また以下のように使うこともできます。

```.py
structure = mg.Structure.from_file('data_1-ICSD.cif')
for x in structure.species_and_occu:
    print(x.num_atoms)
```

>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>1.0
>…

このように、原子の各サイトの占有率を調べることができます。欠陥がなければ、すべて１になります。
また、以下のようにstructureオブジェクトをjson形式で保存することもできます。

```.py
structure = mg.Structure.from_file('data_1-ICSD.cif')
with open('structure.json', 'w') as f:
    json.dump(structure.as_dict(), f)
```

structureオブジェクトのas_dictメソッドを用いることでstructureメソッドの情報を辞書型に変換し、jsonモジュールのdumpメソッドを用いることでjson形式で保存することができます。このように作成したjson形式のファイルは、Structure.from_file()を用いることで再びstructureオブジェクトに変換することができます。また、以下のようにjsonファイルをロードした後に、Structure.from_dictを用いることでstrucutureオブジェクトに変換することも可能です。

```.py
with open('structure.json', 'r')as f:
    d = json.load(f)
    structure = mg.Structure.from_dict(d)
```

###structureオブジェクトのパラメーター
structureオブジェクトの様々なパラメーターをみていきましょう。

```.py
print(structure.atomic_numbers)
print(structure.cart_coords)
print(structure.composition)
```

>[24, 24, 24, 24, 52, 52, 52, 52, 52, 52, ...
>[[ 2.20755584  7.5306645   8.22454971]
 [ 4.70834591  3.7581645   5.18653584]....]
>Cr3+4 Te4+8 O2-22

atomic_numbersには各々のサイトの原子番号が、cart_coordsには各々の原子の位置が、compositionには原子の価数と数が格納されています。

```.py
print(structure.charge)
print(structure.density)
print(structure.formula)
```

>0.0
>5.171142245525924 g cm^-3
>Cr4 Te8 O22


chargeには分子全体の電荷が、densityには分子の密度が、formulaには分子の中の原子の種類と数が格納されています。

```.py
print(structure.lattice)
print(structure.frac_coords)
print(structure.volume)
```

>6.915902 0.000000 -1.180914
>0.000000 7.545000 0.000000
>0.000000 0.000000 9.728000

>[[0.3192 0.9981 0.8842]
>[0.6808 0.4981 0.6158]...]

>507.6116970440605

latticeには分子の単位格子のベクトルが格納されています。frac_coordsには分子中の原子の位置を単位格子のベクトルに対しての相対的な位置で表したものが格納されています。つまり、各原子位置のベクトルを単位格子のベクトルで除したものなので、必ず0と1の間になります。volumeには分子の体積が格納されています。
***

今回はここまでとなります。さらに細かいpymatgenの使い方を次回で解説します。お疲れさまでした。
[pythonのpymatgenの使い方を頑張ってまとめてみる①](https://qiita.com/renesisu727/items/bd7b0526784c26fa0f88)
[pythonのpymatgenの使い方を頑張ってまとめてみる③](https://qiita.com/renesisu727/items/8fdf1af8eec2f23f78e0)
Ubuntu rootパスの再設定について

#Ubuntuのrootパスの再設定方法について

参考にしたサイトは以下の二つです。
基本的には公式のサイト(https://linuxconfig.org/how-to-reset-kali-linux-root-password )通りにやってみて、よくわからなければQiitaで見つけたこちらの記事(https://qiita.com/koyudoon/items/556ba331d0b2bf8f5714 )を参考にしてもらえればと思います。


上記記事を参考にしてもなぜかハマってしまいうまくいかなかったので、
そのときの現象とよくわからないけど解決してしまった手順を残しておきます。


Oracle VM VirtualBox, Ubuntu を使用を使用しました。

記事通りにro→rwと変更して起動させるも通常のCUIログイン画面になり困惑。しばらく考えても初心者のためよくわからず、そのままユーザでログインしました。ここでpasswdコマンドを思い出したのでプロンプトに以下を実行したらパスワードを再設定することができました。

＄sudo passwd
＄（ユーザパスワード）
　　　↓
（新規rootパス）
　　　↓
（再入力）
　　　↓
＄（終わり）

原因などよくわかりませんでしたがexitしてrootで入れました。再起動後も新規rootパスで入れました。

参考になれば(?)と思います。
「TypeError: Router.use() requires a middleware function but got a Object」というエラーが出たときの対応

Nonde.js express でサイトを実装中に出たエラーに対する備忘録。


## エラー内容
`TypeError: Router.use() requires a middleware function but got a Object`

```
server    | [nodemon] app crashed - waiting for file changes before starting...
server    | [nodemon] restarting due to changes...
server    | [nodemon] starting `node src/index.js`
server    | /app/node_modules/express/lib/router/index.js:458
server    |       throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
server    |       ^
server    | 
server    | TypeError: Router.use() requires a middleware function but got a Object
server    |     at Function.use (/app/node_modules/express/lib/router/index.js:458:13)
server    |     at Function.<anonymous> (/app/node_modules/express/lib/application.js:220:21)
server    |     at Array.forEach (<anonymous>)
server    |     at Function.use (/app/node_modules/express/lib/application.js:217:7)
server    |     at Object.<anonymous> (/app/src/index.js:16:5)
server    |     at Module._compile (internal/modules/cjs/loader.js:774:30)
server    |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:785:10)
server    |     at Module.load (internal/modules/cjs/loader.js:641:32)
server    |     at Function.Module._load (internal/modules/cjs/loader.js:556:12)
server    |     at Function.Module.runMain (internal/modules/cjs/loader.js:837:10)
server    |     at internal/main/run_main_module.js:17:11
```

## 解決方法

app/server/src/routes 内に新規作成したlogin.jsファイルの文末で`moduleをexportしていない`ことが原因でエラーが生じていたようです。

```js:login.js
module.exports = router;
```

これで通りました！！
server側にjsファイルを作成した際は注意してみてください。
KaggleのKernelにChromeの日本語翻訳をかける


#記事内画像引用元
記事中の画像はこちらのKernelを撮影して使用させていただきました。
https://www.kaggle.com/dansbecker/selecting-and-filtering-in-pandas

#iframe内のページへ移動する
kaggleのKernelはiframeで埋め込まれているためchromeで右クリック→日本語に翻訳を押しても翻訳されません。なのでiframeで埋め込まれているページに移動する必要があります。

以下のコードをF12→Consoleタブで実行してiframe内のページへ遷移します。

```javascript

window.location.href = document.querySelector("#rendered-kernel-content").getAttribute("src")
```

もしくは、KernelのページでF12→Elementsタブを表示→Ctrf+Fで「iframe」で検索します。
見つけたiframeタグのsrcをダブルクリックで選択、URLにコピペして遷移します。

![SnapCrab_NoName_2019-6-12_15-1-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137079/3b2e8602-e675-07fc-7ac6-391c46e605f3.png)

#ページ内スクロールの無効化を無効にする・コードセルとコードの出力セルは翻訳しない
Kernelに翻訳をかけられるようになりましたが、このページはCSSでスクロールが無効化されています。
またこの状態で翻訳を実行するとコードセルとコードの出力セルも日本語に翻訳されます。
なのでjavascriptでスクロールの無効化の解除とコードセルとコードの出力セルの出力に`class="notranslate"`を追加して翻訳させないようにします。

以下のコードをF12→Consoleタブで実行します。その後に翻訳を実行します。

```javascript

// スクロールの無効化解除
document.querySelector("body").style.overflowY="visible"

// コードセルのclassに.notranslateを追加
document.querySelectorAll(".input").forEach((element) => {
  element.classList.add("notranslate")
})

// コードの出力セルのclassに.notranslateを追加
document.querySelectorAll(".output_wrapper").forEach((element) => {
  element.classList.add("notranslate")
})
```

毎回自動で実行する場合はChrome拡張のtampermonkeyの使用を推奨します。
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja

翻訳実行前


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137079/49cc7f65-dd11-df44-e333-4bbdfe78b7b8.jpeg)

翻訳実行後

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137079/77890f52-ccbc-82a8-9577-5f332e5882af.jpeg)
rake db:migrateで実際のところどんなSQLが実行されているのか確認する

こんなrake taskを用意しておいて

```ruby
task :migrate_with_logging do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
  Rake::Task['db:migrate'].invoke
end
```

`rake migrate_with_logging` でmigrateを実行する.
Docker for Windows でコンテナがRemoval In Progressで削除できなくなった場合の対処方法

# 概要

Docker for Windows を利用していてコンテナの削除を行った際、稀に `Removal In Progress` のままコンテナが永久に削除されないことがあります。こうなると Docker for Windows を再起動しても解消されず、コンテナの開始や停止など何もできない状態のコンテナとなってしまいます。

本記事では `Removal In Progress` によって削除ができなくなってしまったコンテナの削除方法を紹介します。

# 削除方法

## 1. コンテナID の確認
まずは `docker ps -a` コマンドで削除できないコンテナのコンテナIDを確認します。

```
> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                PORTS               NAMES
9002c2b39673        b62                 "cmd"               About a minute ago   Removal In Progress                       naughty_lehmann
```

## 2. 設定ファイルの変更

コンテナIDを確認したら、エクスプローラーから以下のフォルダーを開きます。

```
C:\ProgramData\Docker\containers\(コンテナID)
```

フォルダー内に `config.v2.json` というファイルがあるのでテキストエディターで開きます。

```
{"StreamConfig":{},"State":{"Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"RemovalInProgress":true,"Dead":false,"Pid":1908, ...}
```

`RemovalInProgress` が `true` となっているので `false` に変更して上書き保存します。

保存後は Docker for Windows を再起動しておきます。

## 3. コンテナの削除

Removal In Progress で削除できなかったコンテナを改めて削除します。

`docker rm (コンテナID)` コマンドを実行します。

```
> docker rm 900
```
【Trello】社内のタスク管理をTrello + Slackで効率化した時にやったこと

#概要
社内のタスク管理をTrelloとSlackで効率化した時のメモ

###できるようになること
- SlackからTrello内にカードを作成できる
- TrelloのカードをSlackに送信できる

#手順
1. Trelloのタスク管理用のボード作成
2. SlackにTrelloアプリ追加
3. Slackからタスク管理ボードにアクセスできるようにする
4. タスク管理ボードからSlackにカードを投げれるようにする

#1. Trelloのタスク管理用のボード作成
![スクリーンショット 2019-06-12 14.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/1b9bc86d-48d0-17af-4104-26c8ee5de482.png)

#2. SlackにTrelloアプリ追加
<img width="797" alt="スクリーンショット 2019-06-12 14.46.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/b2991917-eebe-4b6e-0ac4-be5bd317e960.png">

#3. Slackからタスク管理ボードにアクセスできるようにする

###SlackにアクセスしたいチャンネルにTrelloを招待する
`/invite @trello`
###招待したTrelloにボードを紐付ける
`/trello link ボードURL`
###タスク管理ボードにカードを追加してみる
`/trello add カード名`

![スクリーンショット 2019-06-12 15.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/60acf6b0-be04-85b8-72e3-729e6f9dc87d.png)

#4. タスク管理ボードからSlackにカードを投げれるようにする
###カードのPower-Upを入手からSlackを追加
<img width="767" alt="スクリーンショット 2019-06-12 15.06.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/7037b904-0cb5-8044-c064-36d7e82bb791.png">

<img width="1376" alt="スクリーンショット 2019-06-12 15.05.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/3f798837-7166-b76b-1799-fdff0876a79d.png">

###カードをSlackチャンネルに送信できるようになる
<img width="893" alt="スクリーンショット 2019-06-12 15.11.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/2668f827-9fde-0fcc-9cda-ff2236289d21.png">


#Happy Hacking :sunglasses: !
【Uipath】 XLSTARTに設定したマクロを別ファイルから呼び出せない

# XLSTARTに設定したマクロを別ファイルから呼び出せない


### 今回の記事を書くに至った経緯
ある案件で**「エクセルマクロの実行を自動化してくれ！」**と言われ、別の案件で既にマクロを実行するロボットは作成した経験はあったので、簡単だなと思いながら作成を始めたわけです。

### 状況
デスクトップに保存されている**A**というエクセル通常ファイルを起動し、「XLSTART」に保存されている**B**のマクロファイル内にあるマクロを実行するという内容。
※XLSTARTについては下記を参照してください。
[Excel の起動方法をカスタマイズする](https://support.office.com/ja-jp/article/excel-%E3%81%AE%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B-6509b9af-2cc8-4fb6-9ef5-cf5f1d292c19)


ロボとしてはAをExcel Application scopeで開き、Execute macroアクティビティでBの関数「B.xlsm!マクロ」を実行してみました。
ですがこのようなエラーが出て実行できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414558/5b105d9d-d6cc-4853-a7b3-542b93f14b6b.png)

手作業で実行して時は何もエラーが出なかったのに、ロボで動かすとこの様なエラーが出る。

### 試した事
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414558/f779d08c-b807-27f7-dd46-87549e36611e.png)

こんな感じでマクロ実行までに10秒の間隔を置いたがダメ。

他にもマクロのセキュリティの設定や、Start Application で起動してからマクロ実行をしようとしたが、そもそもAエクセルが2回開いてしまうのでダメ。


### 原因
そもそも手作業でAを開くと裏側でBマクロファイルも起動しているように見えるのに、ロボだとBが起動していないように見えました。
ここが原因かなと思い、一度手作業でBマクロファイルを立ち上げた状態でロボットでAを立ち上げてマクロ実行をしてみたところ問題なく実行されました。

このような事からおそらくロボットでエクセルを実行した時には「XLSTART」での自動実行が正常に機能しないと判断しました。

### 解決策
BマクロファイルをStart applicationで起動したあと、Aエクセルを起動してマクロを実行する手順も考えたのですが、エクセルが2個開かれるのでスコープなどがずれたらエラーが起きやすそうだなと思い却下。

結果として解決方法はUipath側の工夫ではないですが、Bのマクロの内容を見たところ特にそのファイルで実行される理由は見受けられないので、Aファイルにモジュールをインポートして、Bマクロを使わずA単体でマクロを実行するよう業務も変更してもらいました。

結果として管理するファイルが減るのし、何年後かに「XLSTART」？？なんじゃそりゃとなるのも怖いので。
【CSS】リスト, li要素のマーカーを疑似要素で組んだ時の、インデントの調整方法。

## こんなときに
* リストのマーカーを自作したい
* 自作したものの、テキストの折返しを以下画像のように揃えたい
 
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235781/5cfb77d3-5782-fd94-100f-5469a8a159c4.jpeg)


## コード
※今回は、olの数字を擬似要素で置いた場合とする。

### html (pug)
```pug
ol
	li あああああああああああああああ
	li いいいいいいい
	li うううううううううう
	li えええええええええええええええええええええええええ
```


### css (scss)
```scss
ol {
  list-style: none;
  padding-left: 1.2em;
  li {
    counter-increment: cnt;
    text-indent: -1.2em;
    
    &::before {
      content: counter(cnt)'.'; 
      margin-right: 5px;
    }
  }
}
```


## 解説
### マーカーをはみ出させる
折返しの位置を揃えるには、デフォルト状態でリスト内に含まれてしまっているマーカー部分、「1.」の部分をリストからはみ出させてあげれば良い。
text-indentは、テキストの頭をインデント、字下げするためにあるプロパティ。
これを利用する。

```scss
li {
	//略
	text-indent: -1.2em;
}
```

番号部分 +  番号の横にとったmargin-rightの分、 `li`要素でtext-indentをマイナスする。これは各々、マーカーの大きさによって確認しながら調整する。
`li`は指定された分だけ、頭文字、つまりマーカーが外に飛び出る理屈だ。

※ 今回は番号をテキストとして追加しているため、フォントサイズが都度変更になることを考慮して、`em`で指定している。
※ 大きさが変更にならないマーカーはpx指定でよい。

### はみ出したマーカーを要素内に戻す
```scss
ul {
	//略
	padding-left: 1.2em;
}
```

その後、`ul`要素において、padding-left あるいは margin-left で引いた分の余白を与えてあげることで、要素外に飛び出したマーカーを要素範囲内に戻すことができる。

![fadsfa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235781/2e04dee6-7b44-7f00-8e23-70f5a684a3e5.jpeg)


これは `li`要素に対してかけてもいいし、`ul`に対して背景やボーダーを
つけてなければ、さらに外側のdivでも可能。
要は位置を調節してるだけなので、数字が飛び出してもいい場合は必要ない。


## 実装サンプル
[codepen](https://codepen.io/dorara_css/pen/PromrG)


## 参考
[li要素のテキストを折り返した時に頭文字の余白を揃えるやり方](https://bl6.jp/web/css/li-text-arrange/)
Jest, Frisby.js をTypeScriptで使う

# 環境

- typescript 3.5.1
- jest 24.8.0
- ts-jest 24.0.2
- frisby 2.1.1

# 手順

## Jestプロジェクト作成

https://jestjs.io/docs/ja/getting-started

```
$ yarn add --dev jest
```

```package.json
{
・・・
  "scripts": {
    "test": "jest"
  },
・・・
}
```

## JestのTypeScript対応

https://github.com/kulshekhar/ts-jest

```
$ yarn add --dev typescript
$ yarn add --dev ts-jest @types/jest
$ yarn ts-jest config:init
```

これでjest.config.jsonがつくられる

## Frisby.jsのTypeScript対応

https://www.npmjs.com/package/@types/frisby

```
$ yarn add --dev frisby @types/frisby
```

```my.test.ts
import * as frisby from 'frisby';

it ('should be a teapot', () => {
  return frisby.get('http://httpbin.org/status/418').expect('status', 418);
});
```

## テスト実行

```
$ yarn test
  yarn run v1.16.0
  $ jest
   PASS  ./my.test.ts
    ✓ should be a teapot (622ms)

  Test Suites: 1 passed, 1 total
  Tests:       1 passed, 1 total
  Snapshots:   0 total
  Time:        1.354s, estimated 3s
  Ran all test suites.
  ✨  Done in 2.16s.
```
Kubernetesの新規ノード追加時にError execution phase kubelet-start: configmaps "kubelet-config-1.14" is forbidden: User "system:bootstrap:g651e8" cannot get resource "configmaps" in API group "" in the namespace "kube-system" と怒られる

#お約束
```
実行内容
```

`出力結果`

```
[root@master ~]# cat /etc/redhat-release 
```
`CentOS Linux release 7.6.1810 (Core) `
Kubeadm,Kubectl,Kubeletを使用。



#事象
###Master PC
ノード追加のトークンを再生成する

```
 [root@master ~]#  kubeadm token create --print-join-command 
```

実行結果
`kubeadm join 192.168.1.2:6443 --token ffx82v.saaefe32df23 --di
scovery-token-ca-cert-hash sha256:fddskdnj3n5kjhu9ln9de9
41fgjf83asbgdeffg8fgse332m1 `


出力されたコマンドを追加したいNodeで実行する

###Node PC
ノード追加実行

```A
[root@node ~]# kubeadm join 192.168.1.2:6443 --token ffx82v.saaefe32df23 --di
scovery-token-ca-cert-hash sha256:fddskdnj3n5kjhu9ln9de9
41fgjf83asbgdeffg8fgse332m1 
```

すると
`Error execution phase kubelet-start: configmaps "kubelet-config-1.14" is forbidden: User "system:bootstrap:g651e8" cannot get resource "configmaps" in API group "" in the namespace "kube-system" `

#原因と解決方法
###原因
MasterとNodeのKubernetesのバージョンが一致していない(離れすぎ？)

###Master
```
[root@master ~]# kubelet --version 
```
`Kubernetes v1.13.3`

```
[root@master ~]# kubeadm version
```

`kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", `

```
[root@master ~]# kubectl version
```

`Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", 
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", 
`
(出力結果一部省略)

###Node
```
[root@master ~]# kubelet --version
```
`Kubernetes v1.14.1`

```
[root@master ~]# kubeadm version
```
`kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.14.1", `

```
[root@master ~]# kubectl version
```
`Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.14.1", 
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.14.1", `

###解決方法
NodeのKubernetesを再インストール

ますはアンインストール(Replaceでもよい)

```
[root@node ~]# yum remove kubelet, kubeadm, kubectl
```

パッケージ名を検索

```
[root@node ~]# yum --showduplicates search kubectl
```
`kubeadm-1.13.3-0.x86_64`
(1.13.3のみ抜粋)

```
[root@node ~]# yum install -y kubeadm-1.13.3-0.x86_64
```
これをKubelet,kubectlにも行う

その後再びNodeで

```
[root@node ~]# kubeadm join 192.168.1.2:6443 --token ffx82v.saaefe32df23 --di
scovery-token-ca-cert-hash sha256:fddskdnj3n5kjhu9ln9de9
41fgjf83asbgdeffg8fgse332m1
```

`[discovery] Successfully established connection with API 
Server "192.168.1.2:6443"`

確認のため、Masterにて

```
[root@master ~]# kubectl get nodes
```

`NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   1m   v1.13.3
node1    Ready    <none>   1m   v1.13.3
node2    Ready    <none>   1m   v1.13.3`

#参考
https://www.devops.buzz/public/kubeadm/known-errors-and-solutions
Railsでボタンを押したらSlack通知されるようにする

ボタン押したらSlack通知されれば便利だなーって思ったのでやってみました。

gemは```slack-ruby-client```を使っております。
##slack-ruby-client
https://github.com/slack-ruby/slack-ruby-client

まずはGemを追加します。

```ruby:Gemfile
gem "slack-ruby-client"
```


そして次に```config/initializers/```に設定を追加します。

```ruby:slack_api.rb
require "slack"

Slack.configure do |config|
  config.token = Settings.slack_token
end

Slack:Web:Client.config do |config|
  config.user_agent = 'Slack Ruby Client/1.0'
end
```

そして、slack_tokenを```config/```に入れます。

```yml:settings.yml
slack_token: token_name
```

そしてファイルを適当に作ってそこに処理を書いていきます。


```ruby
def slack_api_clint
  @client = Slack::Web::Client.new
end
```

こんな感じでslackとの連携を行っていきます。
連携については僕よりも詳しく書いている人がいるのでこちらなどを参考にするといいかもしれません。
https://qiita.com/_miki/items/d79ebae12227106a148c


次にいよいよボタンでのslack通知を実装していきます。
***
まず初めに、ボタンを押すためのルーティングを設定します。

```ruby:routes.rb
resources :users do
  get :user_notice, on: :member
end 
```

次に、slack通知すべき物のcontrollerに処理を書いていきます。

```ruby:users.controller.rb
def user_notice
  SlackNotice.notice_slack_user(@user)
  render json: { user_name: @user.name }
end
```

ここでは、notice_slack_userメソッドに処理を書くものとしそこに通知する値を入れています。
通知するものはそれぞれ違うと思うのでこちらの処理は各々やります。チャンネルやメンションなどもできるのでいろいろ試してみると面白いですね。
そして次の行では、Ajax処理のための値を入れています。

次はフロントの実装です。
bootstrapを使ったので次のようにしました。

```html:user.html
<button class="btn btn-primary slack-notice" type="button">Slack通知</button>
```

こちらで```slack-notice```というクラス名をつけておきます。
そしてラストにJSで動くようにしていきます。
JSではAjaxの部分を載せておきます。

```javascript:user.js
$(".slack-notice").on("click",function(e){
  var user_id = document.getElementById("user_id").value;
  var val = $(this).val();
  var slack_user_path = "/users/" + user_id + "/user_notice";
  $ajax({
    url: slack_user_path,
    async: true,
    type: "GET",
    data: {user: val},
    dataType: "json"
  }).success(function(data){
  //成功時の処理
  })error(function(data){
  //失敗時の処理
  });
});
```

成功時にはモーダルで表示させるのがいいかもしれません。
ここではajaxの非同期通信により発火させてます。

###おわりに
こんな感じでボタンによるslack通知ができるようになります。
ですがslack連携の部分がまだ書き足りないので追記していきます。
[Vue]行動予定表のサンプルを作ってみた。

# 概要
前回、「[blurイベントで特定のボタンだけでイベントをキャンセルするのに、event.relatedTargetが使えなかったとき。](https://qiita.com/loopsketch/items/453f5c62baaee651901b)」 という記事で作ったものの動くサンプルをcodepenで晒してみよう。作っていたものは、ホワイトボード製で良くある行動予定表です。

# 環境
* [CODEPEN](https://codepen.io)で書きなおしました。前回記事とメソッド名などに若干違いがあるかも。
* 外のサーバには繋いでいませんのでリロードするとデータが消えますが、怒らないでください。

# 仕様
* この会社には、幾つか支店があるとする。
* 支店ごとに社員名、予定が表示される。
* 名前か予定をクリック(タップ)すると予定を編集できる。
* 編集時に簡単に入力できるボタンを設ける。とりあえず「Meeting」がボタンで入力できる。
* UIに大きく変化はないが、PCでもモバイルでもなんとなく入力はできるようにする。

# 使い勝手を改善する
前回の記事で、モバイルから使った時のボタンのイベントが飛ばない、で悩みましたが、この対応をしたことで、編集状態からTABでフォーカスアウトするとボタンに移るので、blurイベントがキャンセルされてしまいます。そこで、TABによるフォーカス移動自体をキャンセルしてみることにしました。

```vuejs:code1.js
<v-text-field v-model="user.task" @keyup.enter="updateTask($event,user)" @keydown.tab="updateTask(null,user)" @blur="updateTask($event,user)" :ref="'edit' + user.id" :placeholder="user.name + 'さんの予定を入力'" single-line outline hide-details />
```
上記のように、@keydown.tabを追加し、@touchstart後の処理と同じような動きにして、TABしたら強制的に編集終了にしました。

# コード
* こちらになります。
* モバイルでは[フル](https://codepen.io/loopsketch/full/MMgjjy)で触った方が想定通り動くかも。

<p class="codepen" data-height="300" data-theme-id="0" data-default-tab="js,result" data-user="loopsketch" data-slug-hash="MMgjjy" style="height: 308px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="destination-board">
  <span>See the Pen <a href="https://codepen.io/loopsketch/pen/MMgjjy/">
  destination-board</a> by loopsketch (<a href="https://codepen.io/loopsketch">@loopsketch</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 最後に
* 何か誤りがあったら教えてください。出来る範囲で直します。
* Vue.jsもVuetifyも、ちゃっちゃとプロトタイプを作るのにいいですね。
* CODEPENも便利だなー。
* サーバ側も無料で使えるものがありそうなので、機会があったら晒してみますか。

# 参考
[blurイベントで特定のボタンだけでイベントをキャンセルするのに、event.relatedTargetが使えなかったとき。](https://qiita.com/loopsketch/items/453f5c62baaee651901b)
UiPathのコードのほうのメモ

## ここは

CSVを読み込んで集計して出力するタイプの処理を作っていると、コピペしたいコードが出てくるので、まとめておこうと思いました。

随時追加修正されます。

## DataTable.Selectの結果がなくても大丈夫
If分岐でよく使います。
Length > o のTrueでデータがあるから処理する。Falseだったらスルーされるのでエラーも出ない。
エラーは、データがないのに処理しようとすると怒られるエラー。

```
datatable.Select("年 = 2019").Length > 0
datatable.Select("姓名 = '" + member("姓名").ToString + "'").Length > 0
```

## 文字列の改行を消したい
ブラウザ上のテーブルのマス内が改行されていてデータスクレイピングしたら、改行が入りまくって困ったときに使った。

```
System.Text.RegularExpressions.Regex.Replace(strings,"[\n]","")
```
2019-06-12 Windows 10 > ホストOSにv1903適用後、VMWareが使い物にならなくなる > v1809に戻す > 2019-07-08: VMware 15 Pro + v1903適用 > 不具合は見られない

```txt:動作環境
ホストOS: Windows 10 Pro v1809
VMware(R) Workstation 14 Pro (14.1.7 build-12989993)
ゲストOS: Windows 10 Pro v1809
```

### 症状: v1903適用後、VMWareが使い物にならなくなる

v1903で動作に問題がないという報告を受けて適用した (ホストOS)。
適用したのは 「2019年6月10日に配信されたv1903」。

その結果、以下の事象が起きるようになった。

- A. ゲストOSにてUSBデバイス接続時にフリーズ
- B. そのOS再起動時、起動しなくなる
    - 二度目の起動で起動したりしなかったり

### 対処: v1809へ戻す

v1903のまま対策を講じたが、成功しなかった。
10日以内であればv1809に戻すことができるとのことで戻した。

- [Windows10 - 以前のバージョン（ビルド）に戻す](https://pc-karuma.net/windows-10-restore-previous-version/) by PC設定のカルマさん

情報感謝です。

### 所感

- Windows Updateはすぐに適用するな
    - 最近のUpdateはトラブルが多い
- Update適用後、問題があれば「以前のビルド」に戻すこと
    - 他の作業をしても時間の無駄
- 可能であれば、テスト用のPCを用意し、そちらでテストしてからWindows Updateを適用する
    - 他の人の「問題ない」は信用できない

### 注意

「以前のビルドへ戻す」が成功しない場合もあるので、適用時には注意を。

### 関連

- [Windows 10 > **トラブル**> Windows Updateを適用後、OSが起動しなくなった (VScodeは無実 => ホストOSが壊れた)](https://qiita.com/7of9/items/a6bb32366b92c577e8e2)
    - VScodeの問題かと思ったが、v1903の問題だったようだ

### 再発
(追記: 2019-06-13)

別の人が上記と同じようにv1903に更新をし、同じ症状が発生することを確認した。
v1809に戻して対応。



### v1903適用
(追記: 2019-07-08)

以下を実施した。

A. VMWare Workstationを15 Proに変更
B. Windows Update v1903を適用

上記の問題は今のところ見られない。

```txt:動作環境
ホストOS: Windows 10 Pro v1903 (OSビルド: 18362.207)
VMware(R) Workstation 15 Pro (15.1.0 build-13591040)
ゲストOS: Windows 10 Pro v1903
```
SFDC:ステータス変更時の時間を取得する方法

進捗状況（新規、対応中、完了）のステータス変更時に開始日や完了日を取得する方法です。開始日と完了日は日付と時間を表示しています。

#ステップ
1.開始日、完了日という項目（日付/時間型）を作成
2.プロセスビルダーでステータス変更時の時間を更新

#詳細
・条件
進捗状況が変更されステータスが対応中のとき
<img width="867" alt="01.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425866/d0ef8592-6010-1066-f6b5-e9fe7a498886.png">

・アクション
今の時間を挿入
<img width="927" alt="02.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425866/f1ceb92c-9354-c5bf-a81b-662ddbe859f6.png">

#注意点
開始日、完了日をテキスト型にしTEXT(NOW())を挿入したところ、時刻が想定していたものと違い焦りました。日付/時間型にしたところうまくいったので今後はこれを使いたいと思います。

他にもっと良い方法があればコメントください。
PowerShell のスクリプトが実行できない場合の対処方法

# 概要

PowerShell でスクリプトを書いて実行したとき、以下のエラーが表示されてスクリプトが実行できない場合があります。

```
c:\work>PowerShell .\test.ps1
.\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\work\test.ps1 を読み込むことができませ
ん。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\test.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

本記事ではエラーを回避してスクリプトを実行するための手順について記載します。

# エラーの原因

Windows の初期設定では PowerShell のスクリプトの実行が実行ポリシーによって許可されていないことが原因です。

次のコマンドを実行することで PowerShell のスクリプトの実行ポリシーについて確認できます。

```
c:\work>PowerShell Get-ExecutionPolicy
Restricted
```

初期設定では Restricted の実行ポリシーとなっています。
このポリシーではすべてのスクリプトの実行が制限されています。

ちなみに、実行ポリシーとしては以下の種類があります。

|実行ポリシー|署名あり|署名なし/ローカル|署名なし/非ローカル|説明|
|:---|:---|:---|:---|:---|
|Restricted|x|x|x|すべてのスクリプトの実行を制限 (初期設定)|
|AllSigned|o|x|x|署名のあるスクリプトのみ実行可能|
|RemoteSigned|o|o|x|ローカル上のスクリプトと非ローカル上の署名のあるスクリプトのみ実行可能|
|Unrestricted|o|o|△|すべてのスクリプトが実行可能だが非ローカル上のスクリプトは実行時に許可が必要|
|Bypass|o|o|o|すべてのスクリプトが実行可能|

# 対処方法

対処方法としては以下の2つがあります。

## (1) ExecutionPolicy オプションによる実行ポリシーの変更

PowerShell のスクリプトの実行時に引数へ `ExecutionPolicy` を指定して実行します。

```
c:\work>PowerShell -ExecutionPolicy RemoteSigned .\test.ps1
test
```

実行するスクリプトに対してのみ指定した実行ポリシーが適用されます。

## (2) Set-ExecutionPolicy による実行ポリシーの変更 (恒久的)

実行ポリシーを恒久的に変更します。
この操作はシステム全体に影響を与えるため、管理者権限が必要となります。

```
c:\work>PowerShell Set-ExecutionPolicy RemoteSigned
c:\work>PowerShell .\test.ps1
test
```

以降は指定した実行ポリシーが適用されます。
【Unity】非同期のシーン切り替え、だけどちょっと待ちたい

# Unityで非同期のシーン切り替え、だけどちょっと待ちたい時

## シーンのロード
シーンをロードする際、非同期でロードしたい場合がありますよね。
ロード中画面を表示しつつ、裏でロードしておきたい。
ロード中画面には、画面が固まってしまっていないことを示すために
進捗バーを出すとか、砂時計を出すとかしたい。

そんな時は、SceneManager.LoadScene()ではなく
**SceneManager.LoadSceneAsync()**を使用するのがお約束ですよね。

## ロードが早すぎて、せっかくの進捗バーが見えない
なーんてことも、あり得ます。せっかくの進捗バーなのに。
非同期でロードするけど、ある程度は時間をかけたい。
なんてわがままなんだ・・・。

## allowSceneActivationを使おう
そんな~~わがままな~~要求にも、答えてくれるのがUnityさんです。さすが！！

**AsyncOperation.allowSceneActivation**
シーンが準備完了となったタイミングですぐにシーンが有効化されることを許可します。
(Unity公式ページより引用)

つまり、準備ができていても一定時間経過するまではallowSceneActivation=falseとしておけば
シーンが切り替わるのを待ってくれる、ということになります。

実装はこんな感じ。

```C#
    private IEnumerator LoadScene() {
        var async = SceneManager.LoadSceneAsync("NextScene");

        async.allowSceneActivation = false;
        yield return new WaitForSeconds(1);
        async.allowSceneActivation = true;
    }
```

こうすることで、指定時間（↑では1秒）待ってからシーンを切り替えることができます。

## 結論

**Unity、すごい！！！痒いところに手が届く！！！**
ディープラーニングメモ（自分用）

・poolingレイヤの出力サイズ
　H = (H - PH) / S + 1  
  W = (H -PW) / S + 1

・単語埋め込みベクトルについて
https://qiita.com/Hironsan/items/8f7d35f0a36e0f99752c

・出力が確率の場合、損失関数はbinary_crossentropy（2値のクロスエントロピー）関数を使う。

・pandasがまとまった記事
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a
プロキシサーバー下でAnacondaを使用する際の備忘録

プロキシサーバー下でAnacondaを使用するにあたって，いろいろと詰まったところがあったので備忘録としてまとめておきます．

# 環境
・Windows10 64bit
・Python3.7.3
・Anaconda

# Anacondaとは？
Pythonのディストリビュータの一種です．
必要なライブラリを一気に導入することができ，初心者がPythonを導入するハードルを一気に下げてくれます．

# プロキシ認証
プロシキ設定していないと新しいライブラリをインストールする時の

```
conda install [ライブラリ名]
```

がはじかれます．
また，ライブラリを直接DLして，Local環境に入れ込む手法がありますが，めちゃめちゃ面倒くさい＆開発スピードが落ちる問題点があるので，ちゃんとプロシキ設定した方がいいと思います．（僕は長らくこの方法でやってました．）

## Anacondaのプロシキ設定
ここで本題のAnacondaにプロシキ設定をしていきます．
ネットで調べたら，いろいろと出てきますが代表的なものはAnacondaのrootフォルダに「.condarc」を作成する方法です．
(.condarcの作成方法はネットにいくらでも落ちているので調べてください．)
「.condarc」の中身は以下のように記述します．

```
proxy_servers:
 http: http://ユーザー名：パスワード@プロキシURL:ポート番号
 https: https://ユーザー名：パスワード@プロキシURL:ポート番号
```
これで

```
conda install [ライブラリ名]
```
は問題なく通るはずです．

注意点としては
・インシデントはTabではなく，スペースです！(Pythonだから！)
・自分はパスワードの末尾に@を使っていてはじかれていました...（1年くらい）
　%04を変換する手法などがあるみたいですが，パスワードを変更した方が早いです...

# 最後に
パスワードに@は使わない（方がいい）
テスト記事(最初の投稿なので記事の書き方おさらい)

## テスト用投稿記事

### 記法の確認
- リストの書き方
- リスト
    - 小見出し 

1. 番号付き
    1. 番号小見出し

**重要な文字**
~~よく見かけるやつ~~
`一行コード(コードのインラインって書いてあった)`

これすごい

```index.php
$txt = 'hello wold';
print($txt);
```

コマンドのやつも同じ感じで

```
>vagrant up
```

### 感想
- 右上の:grey_question:マークのところ参照すればだいたい書けそう。
- 記事を書くことによってmarkdown記法覚える良い練習になりそう。
- 右にプレビューが出てくれるので書きやすい。
- もっと初心者殺しかと思ったけど投稿しやすい。
- ```使って黒いので囲っとけばそれっぽく書ける。
英語記事を書く時、スペルミスを指摘してほしい

# 英語で記事を書くのは、難しい
Qiitaで記事投稿をしていると、この情報を海外に発信したらもっと反応があるのではないかと？と思うときがあります。
そうなると、英語記事のメジャーなプラットフォームとして`Medium`が上がってきます。
https://medium.com
しかし、いざ投稿しようと思うと、自分の文章が果たして文法上おかしくないのかという疑問が常に上がります。

# Grammarly for Chromeが便利
Chromeの拡張機能で`Grammarly for Chrome`があります。
基本無料で使用できます。
使い方は簡単で、まずはchoromeの拡張機能に追加します。
（著者は既にインストール済みですので、新規の方と表示が違うかと思います。）
![Screen Shot 2019-06-12 at 11.37.27 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/3ab58c3a-cea9-d8d7-ab02-f21651e182ee.png)

その後、下記の`Check Grammar and Spelling on`をonにする。
![Screen Shot 2019-06-12 at 11.40.25 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/dc0a6c38-f1e0-4cdd-11f1-c3e55dabfa84.png)

スペルチェック機能が有効になり、例えば`source`を`soucre`と記述した場合、下記のように指摘してくれます。
![Screen Shot 2019-06-12 at 11.43.50 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/c9a4face-51cd-f9df-dfaf-eeae2c20b823.png)
ロードバランサまとめ

#### １．「DNSラウンドロビン」とロードバランサ
　**1）DNSラウンドロビン**
　　・すべてのリクエストを平等に扱い、各サーバへ順番に割り当てていく方法。
　　・単純で実装が簡単
　　・サーバの処理負荷がリクエスト毎に異なるため特定のサーバが高負荷になる。
　　・割当先サーバが故障していても検知しない
　　・サーバの追加等を行った場合でも設定変更の反映に時間がかかり、古い設定情報
　　　に基づいてアクセスが行われる危険性がある。

　　**2）ロードバランサ**
　　　・サーバの負荷状況やサーバの能力別など、複数の方法で割り当てを変更する
　　　　ことができる。
　　　・高価である。
#### ２．ロードバランシングの機能
　**1）ロードバランシング（負荷分散）**
　　「ラウンドロビン」
   　　・事前に登録された複数のサーバに対して、順番にリクエストを割り当てていく
　　　アルゴリズム。

　　「加重ラウンドロビン（重み付けラウンドロビン）」
　　　・サーバの処理能力に応じて、重み付けをしたうえでリクエストを割り当てて
　　　　いくアルゴリズム。

　　「最小接続」
  　　 ・接続しているコネクション数が少ない順にリクエストを割り当てを行う。

　　「最小レスポンス」
　　　・応答速度が短い順にリクエストの割り当てを行う。

　**2）SSLオフロード**
　　　複数のWebサーバを運用する際に、SSL証明書は各サーバ単位で必要となり、
　　煩雑な作業が発生するがそれをロードバランサ上で集中管理が可能となる。
　　　また、SSLの復号作業はWebサーバに負荷を発生させる。その作業をロード
　　バランサ上で集中することでWebサーバの負荷を軽減するころができる。

　**3）パーシステンス（セッション維持）**
 　　・ロードバランサでは、Webアプリケーションのセッションを維持するために、
　　　　同一のクライアントからのリクエストを同一サーバに振り分ける機能を
　　　　パーシステンスと呼ぶ。

　　　・パーシステンスの方法には下記の方法がある。
 　　　 「Source address affinity persistence」
    　　　　送信元IPアドレスをチェックして、転送先のサーバを決定する。
  　　　「Cookie persistence」
   　　　　 Cookie情報をもとに、転送先のサーバを決定する。
  　　　「SSL persistence」
 　　　　SSLセッションIDをもとに転送先のサーバを決定する。
   　　　※そのほかレイヤー7によるクライアント識別などがある。

　　**4）ヘルスチェック（監視）**
　　　・ロードバランサがサーバの稼働状況をチェックする。
　　　・ロードバランサは外部クライアントからのリクエストを受け、内部ネット
　　　　ワークの複数サーバに振り分ける。
　　　・そこでダウンしているサーバにリクエストを振り分けないよう、サーバが
　　　　ダウンしていないか常に確認を行っている。
　　　・チェック方法には「アクティブ型」と「パッシブ型」の2通りがある。
　　　　「アクティブ型」

　　　　　L3チェック
　　　　　　ICMP echoリクエストを送信し、echoリプライが返ってくるかどうか
　　　　　　確認する。

　　　　　L4チェック
　　　　　　TCPのハンドシェイクを行い、サーバの動作を確認する。

　　　　　L7チェック
　　　　　　　HTTP等のアプリケーションレイヤで疑似的なリクエストを出し、
　　　　　　　サーバのレスポンスを確認する。

　　　　「パッシブ型」
    　　　　　　クライアントからのリクエストに対するサーバのレスポンスを監視し、
　　　　　　エラー応答等が発生したときに、他のサーバにリクエストを再送する
　　　　　　という処理を行う。

【参考サイト】
「f5ネットワークス」
　https://f5.com/Portals/1/PDF/JAPAN/download/LB_Basic_20150209.pdf
　https://www.f5.com/ja_jp/services/resources/glossary
　https://f5.com/glossary/glossary105-21587
メモ: jekyllを使ってみた

* https://jekyllrb-ja.github.io/


```sh
sudo gem install jekyll

jekyll new my-awesome-site
cd my-awesome-site

jekyll serve
```

* http://localhost:4000 を確認。

## 記事の追加の仕方

* my-awesome-site/_posts/ に `2019-06-12-subject.md` のような形で記述する。

* タイトルを変更のたびにファイル名が変わるのが面倒なので、以下のようにヘッダーで指定すると良い。

```markdown
---
layout: post
title:  "おなかすいた"
---
本文
```

* layout指定をしないとテーマが反映されない。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/673621e6-3ae1-e58d-c864-ca23d3489c19.png)
WordPressで本文が抜粋されない

# 概要
the_excerpt(); にも関わらず本文がだらだら表示されてしまうケースに遭遇した場合は管理画面の言語を変更してみましょう(ex 英語→日本語)

# 抜粋表示されないことに気づく
テーマをカスタムした後にテスト投稿してみると見事に本文がだらしなく全表示されてしまっていました
※Readmore的なものを押せばp要素が効いた意図する表示にはなる

# 確認箇所
- functions.phpとかエントリー関係の入ったPHP<br>
→ the_content();ではなくthe_excerpt();になっているか  

```php:functions.phpやらcontent.php
<div class="post-entry">
<?php the_excerpt(); ?>
```

- プラグイン
→ WP Multibyte Patch系が入っているか
直接FTP等で/wp-content/plugin 配下に突っ込んでから有効化するんすね

- 管理画面の言語
→ インスコした時の言語になっているか ★

# そして犯人発覚へ
犯人はまさかの自分でした。。
インスコは日本語で実施していました
カテゴリから記事を参照すると「カテゴリ：xx」と日本語表示になるのが嫌で一時的に管理画面を英語化していたことが原因です
~~再インスコするのが非常に面倒なのでもうこのまま日本語で頑張るマン~~
function.phpにフィルターフックし、そもそも嫌だった「カテゴリ：」を消しました

5.2.2ではマルチバイト系がよりよくなるといいですね...



# 参考リンク
ありがとうございました！
[WordPressで抜粋が効かない問題](http://brain-and-the-universe.com/wordpress-except/ "WordPressで抜粋が効かない問題")
[the_archive_titleの「カテゴリー:」や「タグ:」を削除する方法](https://naoyu.net/archive-title-hook/ "the_archive_titleの「カテゴリー:」や「タグ:」を削除する方法")
Raspberry pi Wi-Fiでインターネット、EtherでDHCPサーバ

ハンズオンなどのイベントでRaspberry Piを活用することは多いと思います。その時、Wi-Fiの設定のためだけにモニタやキーボードが必要になったりしてしまうのですが、今回のイメージファイルをスタート地点にすれば、イーサネットでPCをRaspberry Piに接続するだけでなんでもできるようになります。

やりたかったことはこれです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136933/e88e95f6-4630-77d2-d789-9fa3c2a13fde.png)

以下の内容を追加

# 必要なソフトウエアのインストール
```
sudo apt-get install isc-dhcp-server
```

# ネットワークインタフェースの設定
```:/etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet static
	address 10.9.20.1
	network 10.9.20.0
	broadcast 10.9.20.255
	netmask 255.255.255.0

allow-hotplug wlan0
iface wlan0 inet dhcp
	wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

# DHCPサーバーの設定

```:/etc/dhcp/dhcpd.conf
# コメントを外す
authoritative;

# 最後に追加
subnet 10.9.20.0 netmask 255.255.255.0 {
	range 10.9.20.2 10.9.20.254;
	option routers 10.9.20.1;
	option broadcast-address 10.9.20.255;
	option subnet-mask 255.255.255.0;
        option domain-name "raspberrypi.local";
        option domain-name-servers 8.8.8.8, 8.8.4.4;
        #option domain-name-servers 10.9.20.1;
}

```
この行にeth0を追記

```:/etc/default/dhcpd.conf
INTERFACESv4="eth0"
```

# 起動時の設定

rc.localの最後に追加する


```:/etc/rc.local
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

ifup eth0
sleep 10
systemctl start isc-dhcp-server

```

# Wi-Fiの設定

```:/etc/wpa_supplicant/wpa_supplicant.conf
network={
	ssid="SSID名"
	psk="パスフェーズ"
	key_mgmt=WPA-PSK
}
```

これでRaspberry Piに10.9.20.1にイーサネットでアクセスすることが出来るので、諸々の設定変更をVNCやSSHを介して設定できるようになりました。


VNCでRaspberry Piを見ると、Wi-Fiの接続部分がXXになっていますが、ifconfigで確認をすると正しくネットワークが接続できているのが解ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136933/2eb98932-5db1-0661-2e23-b45501724e3c.png)
visual studio codeでjava.homeの設定ができない。

vscodeでjavaの開発をしたいのですが、セッティングがうまくいきません。
https://solutionware.jp/blog/2018/06/01/java%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92visual-studio-code-%E3%81%A7%E6%95%B4%E3%81%88%E3%82%8B/
このサイトでやっています。
java.homeの所からが違います。
その下の画像通り二つのレイアウト？じゃないです。
ctrl，を押してjava.homeと入力すると画像みた![DSC_0002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411349/8903d8d2-9947-4faf-0a90-f151be21e88b.jpeg)
くなります。
PowerShellでWindowsイベントログを取得する

#### １．最新ログを指定行数分、取得してくる

```powershell

　Get-EventLog -LogName イベントログ -Newest 行数
```
　例：Applicationログを新しいものから10行抜き出して表示する

```powershell
　　　Get-EventLog -LogName Application -Newest 10
```


#### ２．指定した期間内のログを取得してくる

```powershell
　Get-EventLog -LogName  イベントログ -Source イベントソース -After 開始日時 -Before 終了日時
```

　例：昨日の1日のApplicationログを抜き出す

```powershell
        $Start=Get-Date (Get-Date).AddDays(-1) -format "yyyy/MM/dd 00:00:00"
        $End=Get-Date (Get-Date).AddDays(-1) -format "yyyy/MM/dd 23:59:59"

　　Get-EventLog -LogName Application -source * -After $Start -Before $End
```

#### ３．Index番号を指定して実行

```Powershell
　　Get-EventLog -Logname イベントログ -Index インデックス番号
```

　例：Applicationログのインデックス番号 190656のログを表示する

```powerSHell
　　 Get-EventLog -LogName Application -index 190656
```

　例2：Applicationログのインデックス番号 190656のログの詳細を表示する

```powershell
　　(Get-EventLog -LogName Application -index 190656).Message
```
#### ４．注意事項
　オプションで「-computer」を使用すると、指定したサーバのイベントログも取得することはできるが、場合によっては取得に時間がかかる場合がある。
pythonのpymatgenの使い方を頑張ってまとめてみる①

# はじめに
こんにちは。今回は材料研究で非常よく用いられるpymatgenの使い方について、公式ドキュメント等を参考にしてまとめていきたいと思います。

pymatgenを使いこなそうと思ったときに、現状は公式ドキュメントを読むしかありません。そこで今回は、pymatgenの公式ドキュメントを読まなくても大丈夫なように、使い方を事細かに解説していこうと思います。
まあでも、公式ドキュメントをきちんと読むという行為は非常に重要な行為でもあるのですが。
それでは頑張ってまとめていきます。長編になりそうなので、何回か分割していきますね。
## 想定読者
- 材料研究でpymatgenを使いたいけど、使い方がよくわからない人
- pymatgenの使い方を結構知ってるけどたまに復習したい人

# 簡単な使い方

```.py
import pymatgen as mg
fe = mg.Element('Fe')
print(fe.atomic_mass)
print(fe.melting_point)
```

>55.845 amu
>1811.0 K

このように、pymatgenのElementメソッドを用いると、原子の大きさや融点の情報を得ることができます。

```.py
comp = mg.Composition('Fe2O3')
print(comp.weight)
print(comp['O'])
print(comp.get_atomic_fraction('O'))

```

>159.6882 amu
>3.0
>0.6

このように、pymatgenのcompメソッドを用いると、化合物の情報を得ることができます。weightには化合物の物質量が、元素を指定するとその原子の数が、get_atomic_fractionを用いると指定した原子の化合物中の割合が表示されます。
### Structureオブジェクトの作成

```.py
lattice = mg.Lattice.cubic(4.2)
structure = mg.Structure(lattice, ["Cs", "Cl"],[[0, 0, 0], [0.5, 0.5, 0.5]])
```

このようにしてstructureオブジェクトを生成できます。しかし、基本的にこのようにして作ることは稀で、普通はcifファイルを読み込んで作ります。Structureメソッドの引数は（格子定数、原子の種類、原子位置）という感じになっています。この場合はLatticeメソッドを用いて立方晶(cubic)の空間格子を作成していますね。pymatgenはstructureオブジェクトに対する操作が非常に多いので、structureメソッドの作り方はしっかりと押さえておきましょう。

### structureオブジェクトから空間群
```.py
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
finder = SpacegroupAnalyzer(structure)
print(finder.get_space_group_symbol())
```

> Pm-3m 


このようにpymatgen.wymmetry.analyzer のSpecegroupAnalyzerを用いれば、空間群を得ることができます。

### structureオブジェクトの変換

```.py
structure.to(filename='POSCAR', fmt="poscar")
structure.to(filename='test.cif', fmt="cif")
```

structureオブジェクトのtoメソッドを用いれば、structureオブジェクトをcifファイルやposcarファイルに変換することができます。poscar形式は第一原理計算をする際に用いる形式です。

### cifファイルからstructureオブジェクトを作成

```.py
structure = mg.Structure.from_str(open("CsCl.cif").read(), fmt="cif")
structure = mg.Structure.from_file("CsCl.cif")
```

今回はカレントディレクトリにCsCl.cifという名前のファイルが存在することを想定しています。from_strメソッドを用いれば、引数に文字列となったposcarやcifなどの情報を入れることでstructureオブジェクトを作成できます。from_fileメソッドを用いれば、cifやposcarなどのファイルをそのまま引数にとることでstructureオブジェクトを作成できます。
***

今回はここまでにします。次回はstructureオブジェクトの操作について、もっと詳しく触れていきたいと思います。
[pythonのpymatgenの使い方を頑張ってまとめてみる②](
https://qiita.com/renesisu727/items/b520f6def3a53b6be088)
[pythonのpymatgenの使い方を頑張ってまとめてみる③](https://qiita.com/renesisu727/items/8fdf1af8eec2f23f78e0)
Lambda で動かしている Nuxt のバージョンを 2.5 に上げたときに "Cannot GET /" が返るときの対処法

若干ハマったので共有です。

シンプルですが、公式のマイグレーションガイドを読んだら解決しました。結論、以下の処理が足りていませんでした。

```diff
   const nuxt = new Nuxt(config)
++ await nuxt.ready()
```

自分が動かしている環境では [mya-ake/nuxt-on-lambda](https://github.com/mya-ake/nuxt-on-lambda) を参考にした構成をとっていたので、`app.use(nuxt.render);` としてる部分を以下のように修正すると解決しました。

```js
app.use(async (req, res, next) => {
  await nuxt.ready();
  nuxt.render(req, res, next);
});
```

## 参考
- [Release v2\.5\.0 · nuxt/nuxt\.js](https://github.com/nuxt/nuxt.js/releases/tag/v2.5.0)
- [Nuxt\.js on AWS Lambda with Serverless Framework \- mya\-ake com](https://mya-ake.com/posts/nuxtjs-on-aws-lambda/)
初投稿

htmlについて
①タグでかこむことによって　ページを作っていく。
②タグの種類
　・h・・・heading（みだし）
　・p・・・paragraph(段落)
　・!--・・・コメント
　・a ・・・リンクを作ることができる。a href="url"
  ・img・・・画像の表示ができる。img src="url"
  ・ul,li・・・リストを作ることができる。
　・class・・・階級を指定することができる。
　・meta charset=""文字コードを指定することができる
　・title・・・タブ上に表示される。
　・link rel="stylesheet" href=""で読み込むCSSファイルを指定
　・div・・・division(要素のグループ化に用いる)
cssについて
①文字などの指定について
　・color
　・font-size
　・font-family
　・background-color
　・width
　・height
　以上が主にこれまでに学んだことです。基礎知識をもっと増やし、自由に使いこなせるようになっていきたいと思います。
あなたに届け!GASを使って自動でメールを送ろう!

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[りく](https://qiita.com/rikukaikuu)です。

この前**Google Apps Script**(以下GAS)の能力を紹介されてすごいおもしろいなと思ったので、自分でも簡単にGASを扱ってみます。

# GASってなんですの？

GASは、Googleが提供するサーバーサイドのスクリプト環境で、Googleのサービスに影響を与えるものです。

基本的に言語としては**JavaScript**とほぼ同じと考えて良いかと思います。

# メールを自動で送る

```js:mail.gs

function myFunction() {
  MailApp.sendEmail('???', 'おにいちゃん！', 'おはよー！！起きてー！！カンカンカンカン！！カンカンカンカンカン！！朝だよ！！外明るい！！ねえねえ！！見て見て！！すごい！！外！！明るい！！！！カンカンカンカンカンカンカンカン！！カンカンカンカン！！起きてー！！カンカンカン！！');
}
```

私におにいちゃんと呼ばれたい願望はありませんが、きっと誰かは求めているはずです。

「???」のところに送りたいメールアドレスを打ち込んで、**「編集」**の中の**現在のプロジェクトのトリガー**を押します。

![2019-06-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369905/b6310d47-22d1-6d72-8de8-d46b9669a4f2.jpeg)


すると別のページが開かれるので、下にある**トリガーを追加**を押してみるといくつか選択肢がでてきます。

おまえらの妹はお兄ちゃん想いなので、昼夜逆転生活を変えるべく朝6時から7時の間に起こそうとしてきます。

なので、**時間ベースのトリガーのタイプを選択**で日付ベースのタイマーを設定して、**時刻を選択**から*午前6時~7時*を選択しましょう。

保存したら、**公開**の中の**ウェブ アプリケーションとして導入**を押して*導入*を押したら時間になったら実行されて自動で送られます。

あ、分ベースに設定すると君の妹がヤンデレと化すかの如く頻繁に送ってくるので注意してください。~~もうおまえに夜はこない、毎分起きろ~~

ちなみに、他のおまえらに同じようにしてほしいとせがまれたら、

```js:mail.gs
function myFunction() {
  var to = ['???','???','???'];
  MailApp.sendEmail(to, 'おにいちゃん！', 'おはよー！！起きてー！！カンカンカンカン！！カンカンカンカンカン！！朝だよ！！外明るい！！ねえねえ！！見て見て！！すごい！！外！！明るい！！！！カンカンカンカンカンカンカンカン！！カンカンカンカン！！起きてー！！カンカンカン！！');
}
```


と配列リテラルを使いましょう。(配列リテラル以外にもできる)

~~これを妹用Googleアカウントで作れば完璧ですね!~~

# まとめ

完全に悪用する方法を元に紹介してしまいました…テロ等準備罪とか言わないでくださいね…

こんな使い方以外にも、こういうのができたらリマインドとかにも役立ちますね!(Googleカレンダー使えばいいけど…)

何にしてもGASに魅力を感じたのは紛れもない事実なので、これから理解を深めていきたいですね!

よろしければ、他に何ができるか教えてください!!
雑にgoをかじってスクレイピングした記録

goをかじるために、試しにYahoo!ニュースのタイトルをスクレイピングするコードを描いてみました

- 勉強会を企画してくださった @takkota さんありがとうございました!


# 環境

Mac OS 10.14.5

# インストール

```
brew install go
```

# 使用したライブラリ

- [PuerkitoBio/goquery: A little like that j-thing, only in Go.](https://github.com/PuerkitoBio/goquery)

### ライブラリのインストール

```
$ go get github.com/PuerkitoBio/goquery
```


# コード


```.go
package main

// fmtパッケージをインポートする
import "fmt"
import "github.com/PuerkitoBio/goquery"

// main関数
func main() {
  doc, err := goquery.NewDocument("https://news.yahoo.co.jp/list/")
  if err != nil {
      panic(err)
  }
  doc.Find("div.listArea dl.title dt").Each(func(i int, s *goquery.Selection) {
    fmt.Println(s.Text())
  })
}
```

# 実行結果

```
$ go run main.go
大谷 マエケンから7号ソロ
女医殺害 山形大生の男逮捕
香港でデモ 若者らが道路占拠
iKONのB.Iが薬物使用か 報道
日産社長再任 2社が反対推奨
犬猫チップ義務化 改正法成立
PCエンジン 32年越しの復活
ワークマンプラス 続く快進撃
日本で代理購入 中国人の役割
ビートたけしが離婚
木村拓哉 鬼教官役で正念場
本田「監督」がW杯2次予選へ
福岡事故 逆走の数十秒に何が
都 HPで虐待「推進」と誤植
尾木ママ・72歳 免許自主返納
NHKクロ現 田中泉アナが退職
ミサイル警戒衛星の保有検討
一気飲みで死亡 介抱の責任は
携帯違約金 大手3社の危機感
政府 特区審査開催を非公開に
```

# 感想

- class無いんですね
- 引数にポインタを明示的に渡せるの個人的には便利
- 他の言語だとwarn止まりになりそうなことでコンパイルが止まるのむしろ良いと思った
- import 先の文字列をそのままブラウザにコピペすれば、githubに到着するの便利

# 疑問

- パッケージマネージャーやバージョンマネージャーはあるのかな?(無いことはないだろうけど

# 参考リンク

- [Goとgoqueryでスクレイピング - Qiita](https://qiita.com/Yaruki00/items/b50e346551690b158a79)
terraform も ansible も MFA&AssumeRole で実行する(執筆中)

## はじめに
```
工事中
```

## インストール方法

### Linux(僕はubuntuでやりました)
```
工事中
```

### mac
```console
$ brew cask install aws-vault
```
## 設定方法(踏み台アカウント)
踏み台として使用するAWSアカウントのアクセスキーを登録します。
ここでは`default`というプロファイル名で登録してみます。
<font color="Red">※アクセスキーのローテーションをした場合は再登録する必要があるので注意。忘れがちです…</font>

```shell
$ aws-vault add default
Enter Access Key ID: xxxxxxxxxxxxxxxxxxxxx
Enter Secret Access Key: 
```

`~/.aws/config`にdefaultプロファイルの情報を記載します。

```shell

[default]
output = json
region = ap-northeast-1
```
aws-vaultを利用するので`~/.aws/credentials`にAccessKeyを設定する必要はありません。


登録したプロフィールを確認します。

```shell
$ aws-vault ls
Profile                  Credentials              Sessions
=======                  ===========              ========
default                  default
```

これでとりあえずの設定は完了です。

試しにaws-vaultを経由してawsコマンドを叩いてみます。

```shell
$ aws-vault exec default -- aws s3 ls
Enter passphrase to unlock /home/User/.awsvault/keys/:
2019-04-12 17:39:33 sample-bucket-name1
2019-04-12 13:36:22 sample-bucket-name2
2019-04-12 15:37:08 sample-bucket-name3
```
踏み台AWSアカウントのS3バケット一覧が表示されると思います。



## 設定方法(AssumeRole先のアカウント)

AssumeRole先のアカウントを`hoge`として、`~/.aws/config`にプロファイルの情報を記載します。

```shell
[default]
output = json
region = ap-northeast-1

[profile hoge]
output = json
region = ap-northeast-1
mfa_serial=arn:aws:iam::${踏み台AWSアカウントID}:mfa/${踏み台AWSアカウントIDの個人IAMユーザー名}
role_arn=arn:aws:iam::${AssumeRole先のAWSアカウントID}:role/${AssumeRole先AWSアカウントのAssumeRole名}
source_profile=default
```

登録したプロファイル確認してみます。

```shell
$ aws-vault ls
Profile                  Credentials              Sessions
=======                  ===========              ========
default                  default
hoge                     default
```

これでとりあえずの設定は完了です。
試しにaws-vaultを経由してAssumeRole先AWSアカウントに対して、awsコマンドを叩いてみます。

```shell
$ aws-vault exec hoge -- aws s3 ls
Enter passphrase to unlock /home/User/.awsvault/keys/:
2019-04-12 17:39:33 hoge-bucket-name1
2019-04-12 13:36:22 hoge-bucket-name2
2019-04-12 15:37:08 hoge-bucket-name3
```

AssumeRole先AWSアカウントのS3バケット一覧が表示されると思います。

## あどばんす

### 長時間プロセスの実行

`aws s3 ls` のように短時間で終了するプロセスは問題ないのですが、`terraform` や `ansible` のように
長時間動作し続けるプロセスを aws-vault 経由で動作させたいこともあります。
`aws-vault exec` は一時的なアクセスキーを取得してプロセスへ渡すため、長時間動作し続けるプロセスの場合には途中でアクセスキーの期限が切れることがあります。

対策として、以下のようなオプションを付与することでアクセスキーの期限切れを防ぐことができます。

```shell
$ aws-vault exec --session-ttl=1h --assume-role-ttl=1h hoge -- aws s3 ls
```

僕はこのオプションをいちいち打つのが面倒なので、 `~/.bashrc` に alias に書くことで簡略化しています。

```shell
alias ave='aws-vault exec --session-ttl=1h --assume-role-ttl=1h'
```

```shell
# 真面目にコマンドを打つ場合
$ aws-vault exec --session-ttl=1h --assume-role-ttl=1h hoge -- aws s3 ls

# aliasで簡略可した場合
$ ave hoge -- aws s3 ls
```
[GCP]01.（今更ながら）WSLとCentOSでGCP（Cloud SDK）を使えるようにする

# はじめに
GCPを使うことになったので、今更ながら設定をメモっていく
すでに様々な方がUpされているが、敢えて自分用に。
全ては [Google Cloud SDK のドキュメント](https://cloud.google.com/sdk/docs/?hl=ja) とか [Debian と Ubuntu 用のクイックスタート](https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja) のあたり読めばOK

# WSL(Ubuntu18.04)の場合
#### 環境変数設定
```bash
$ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
$ echo $CLOUD_SDK_REPO
cloud-sdk-bionic
```

#### 配布URIをパッケージソースとして追加
```bash
$ echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
```

#### Google Cloud の公開鍵をインポート
```bash
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
```

#### Cloud SDK をインストール
```bash
$ sudo apt-get update && sudo apt-get install google-cloud-sdk
```

#### Kubectlとpythonコンポーネントをインストール
```bash
$ sudo apt-get install kubectl google-cloud-sdk-app-engine-python google-cloud-sdk-app-engine-python-extras
```

#### gcloud init実行し、初期化
```bash
$ gcloud init      # アカウント認証実施
```
- Googleアカウントにアクセスし、認証キーを発行して貼り付ける

# Centos7の場合
#### yum repositoryを作成
```bash
$ sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
> [google-cloud-sdk]
> name=Google Cloud SDK
> baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
> enabled=1
> gpgcheck=1
> repo_gpgcheck=1
> gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
>        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
> EOM
```

#### SDKインストール
```bash
$ yum install -y google-cloud-sdk
```

#### Kubectlとpythonコンポーネントをインストール
```bash
$ yum install -y kubectl google-cloud-sdk-app-engine-python google-cloud-sdk-app-engine-python-extras
```

#### gcloud init実行し、初期化
```bash
$ gcloud init      # アカウント認証実施
```
- Googleアカウントにアクセスし、認証キーを発行して貼り付ける

# インストール後の確認とか
以下のコマンドを使ってちょこちょこ確認とか

- 認証情報が保存されているアカウントのリスト

```bash
$ gcloud auth list
```

- 有効なSDK構成のリスト

```bash
$ gcloud config list
```
- CLoud SDK情報

```bash
$ gcloud info
```
- ヘルプ

```bash
$ gcloud help
```