OmniAICreator/Qiita-1.07M huggingface dataset:
ONTAPの APIアクセスを確認する

NetAppの Storage OSである ONTAPは API(ZAPI)による操作が以前から可能でしたが、
最近になって(ONTAP 9.6以後) REST APIアクセスが追加されました。

APIを使った Storage自動化の一歩目として
まずは簡単にAPIアクセスが出来るかを確認をする方法についての記事になります。

## 2022/10/06 追記: ZAPIからRESTへの移行について

ONTAP 9.7以後、新機能については全てREST APIのみのサポートになっていてZAPIではサポートされなくなっています。
このこともあり 今後はZAPIからREST APIへの移行を考える必要が出てきますが、移行を助けるためのスクリプトが紹介されていますのでご参考にしてください。

[ONTAP Usage Reporting Tool](https://github.com/NetApp/ontap-rest-python/tree/master/ONTAPI-Usage-Reporting-Tool)

[](https://docs.netapp.com/us-en/ontap-automation/migrate/ontapi_disablement.html)

## ZAPI編

ZAPIは昔からある ONTAPのAPIで Ansible Moduleや OpenStack Cinder/Manila Driver、
Trident等は これを利用して実装しています。

ONTAP9.7以後は REST APIが Primary APIになるので、今後新規に何かする場合、ZAPIはあまり利用する場面は無いかもしれません。
ZAPIの利用は9.7以後も可能ですが、ONTAPに新機能が追加された場合のAPIの拡張は行われないので注意が必要です。

叩き方の基本は

1. APIの要求をXMLにまとめる
2. httpsプロトコルで POSTする
3. 結果をXMLで受け取る

これだけなんですが、API粒度が細かいのと iteratorを利用するiter系APIがあるので、慣れがちょっと必要です。

一番簡単なシステムの Versionを取得する形でAPIが利用可能であることを確認してみます。[^wincmd]

```bash
curl -k --user admin -d "<netapp><system-get-version/></netapp>" https://[ONTAP管理IP]/servlets/netapp.servlets.admin.XMLrequest_filer
```

実行するとシステムバージョンが得られます。

```console
$ curl -k --user admin -d "<netapp><system-get-version/></netapp>" https://[ONTAP管理IP]/servlets/netapp.servlets.admin.XMLrequest_filer
Enter host password for user 'admin': ここでパスワードを入力
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE netapp SYSTEM 'file:/etc/netapp_gx.dtd'>
<netapp version='1.150' xmlns='http://www.netapp.com/filer/admin'>
<results status="passed"><build-timestamp>1544733693</build-timestamp><is-clustered>true</is-clustered><version>NetApp Release 9.5: Thu Dec 13 20:41:33 UTC 2018</version><version-tuple><system-version-tuple><generation>9</generation><major>5</major><minor>0</minor></system-version-tuple></version-tuple></results></netapp>
```

## REST編

ONTAP 9.5から REST APIが一部実装されて9.6で殆どのAPIが実装されました。

一般的なCRUDの操作はHTTPの GET/POST/PUT/DELETE で出来るようになっています。

Cluster Objectを GETしてみます。

```bash
curl -k --user admin https://[ONTAP管理IP]/api/cluster
```

結果は以下の様に。

```console
$ curl -k --user admin https://[ONTAP管理IP]/api/cluster
Enter host password for user 'admin': ここでパスワードを入力
{
  "name": "SE-ST-AFF8080-02",
  "uuid": "2b5a3832-00cd-11e8-a9b4-xxxxxxxxxxxx",
  "version": {
    "full": "NetApp Release 9.5: Thu Dec 13 20:41:33 UTC 2018",
    "generation": 9,
    "major": 5,
    "minor": 0
  },
  "_links": {
    "self": {
      "href": "/api/cluster"
    }
  }
}
```

[^wincmd]: (2020/4/27) XMLを シングルクォートで括ってましたが、Windowsの場合内部の&lt;&gt;がリダイレクトとして認識されてしまうので ダブルクォートに変更しました。
omsプロセス起動停止

CPU使用率が高く、負荷が高いプロセスを見るとomsプロセスが高騰していた為、停止起動で解決した。
手順を残します。

環境変数読み込み

ステータス確認
`emctl status oms`

停止
`emctl stop oms`

起動
`emctl start oms`

※停止できない場合、強制終了
`emctl stop oms –force`
`emctl stop oms -all -force`
【備忘録】UbuntuのライブDVD作成してみた。（Windows）

##はじめに
Ubuntuをインストールする際に使用するライブDVDを、Windows環境にて作成する方法を記載しておきます。
※ライブUSB作成に関しては、試していないので、本記事では触れていません。

##参考
今回は、下記サイトを参考させていただきました。

###Ubuntu18.04 LTS とUbuntu18.04 LTS 日本語Remixの違いに関して
『Ubuntu 18.04 LTS日本語Remixリリース！本家版との違いは？【徹底比較】 | LFI』
https://linuxfan.info/ubuntu-18-04-ja-remix-compare

###インストーラーのダウンロードに関して
『Ubuntu 18.04 LTSインストールガイド【スクリーンショットつき解説】 | LFI』
https://linuxfan.info/ubuntu-18-04-install-guide

###ディスクへの書き込みに関して
『Ubuntu 18.04 その89 - UbuntuのライブDVDを作成するには（Windows編） - kledgeb』
https://kledgeb.blogspot.com/2018/04/ubuntu-1804-89-ubuntudvdwindows.html

##Ubuntu18.04 LTS とUbuntu18.04 LTS 日本語Remixの違いに関して
Ubuntu18.04には、
Ubuntu18.04 LTS本家版とUbuntu18.04 LTS日本語Remixがあります。
どう違うのか、参考サイトより、確認してみると、
大まかな違いとしては、
**・Ubuntu Japanese Teamのパッケージがインストールされる**
**・ISOイメージファイルに収録されているパッケージが異なる**
があるようです。

Ubuntuの使用経験が浅い自分としては、

**・言語の違いによる誤解を避けたい**
**・インストール時は、インターネット接続しない**

という点から、日本語サポートがある、
「**Ubuntu 18.04 LTS日本語Remix**」を選択しました。


##インストーラーのダウンロード
2019年12月時点で最新のUbuntu18.04.3のISOイメージファイルをダウンロードしていきます。
ミラーサイトがいくつかありますが、今回は、富山大学のサイトからダウンロードする事にいたしました。

**富山大学**
http://cdimage-u-toyama.ubuntulinux.jp/releases/18.04.3/

リンク先に3つほど、ダウンロードリンクがありますが、
拡張子がisoの2つ目の
「**ubuntu-ja-18.04.3-desktop-amd64.iso**」をクリックし、ダウンロードします。

##ディスクへの書き込み
ダウンロードをしたISOイメージファイルをディスクに書き込んでいきます。
今回は、家にあった、DVD-Rに書き込んでいく事にします。

1.空のDVD-Rをドライブにセットします。

2.ダウンロードしたISOイメージファイルを右クリックし、「**ディスクイメージの書き込み**」をクリックします。

3.「**Windowsディスクイメージ書き込みツール**」が開くので、ディスクイメージファイルの内容を確認し、「**書き込み用ドライブ**」に、セットした空のDVD-Rを選択します。

4.「**書き込み**」ボタンをクリックします。

5.ライブDVDの作成が開始されます。処理が完了するまで待ちます。

6.「**状態**」に「**ディスクイメージは、ディスクに正常に書き込まれました。**」と表示されたら、「**閉じる**」ボタンをクリックし、完了です。

##まとめ
今回は、Ubuntuをインストールする際に使用する、ライブDVDの作成について、纏めてみました。
ライブDVDを作成しておくと、ライブセッション（ライブUSBやライブDVDから起動した「Ubuntu」）にも
使用出来るので良いなと思います。
ライブUSBに関しては、今回触れていませんが、
ドライブのないPCでライブセッションする時にも使えるので、作成してみたいなと思います。
VSCode で GPU アクセラレーションを無効化する

最近、VSCode を使っていると、いつの間にか Code Helper (GPU) というプロセスが CPU を使っていることが多くなった。つられて Window Server も CPU を消費していて、50% 以上が VSCode に持っていかれている。

ぐぐっていると設定で off にできるようなので、やってみた。今の所快適。

- `Cmd + Shift + P` でコマンドパレットを起動する
- configure runtime arguments を入力し、 `argv.json` の編集画面に移動する
- `"disable-hardware-acceleration": true` を追記する
- VSCode を再起動

参考: https://stackoverflow.com/questions/37334148/launch-vs-code-with-disable-gpu-flag-by-default
RoR｜retry_on で指定した回数でリトライが出来ているかテストする

# はじめに

`retry_on` の `attempts` オプションを使って何回リトライするかを指定することが出来ます。「ほんとうにリトライできている？」と指定した回数でリトライが出来ているかのテストについての記事です。

# やったこと

## パラメータの検証

`retry_on` はクラスメソッドなので呼び出したときに期待する回数が検証できるかな？と思ったんですがクラスの中身がロードされた時点で評価されるので RSpec ではメソッド呼び出しのテストは失敗します :sweat: だってもう呼び出し終わっているもの。

```ruby
expect(GuestsCleanupJob).to receive(:retry_on).with(wait: 2.hours, attempts:3).exactly(3).times
```

## `retry_on` のブロックで指定した内容で検証する

`retry_on` のブロックはジョブがリトライする度に実行するのではなく `attempts` オプションで指定した回数が超えたときに評価するので今回の何回できたか？というのにはマッチしない。

```ruby
class GuestsCleanupJob < ApplicationJob
  retry_on LongWaitError do
    # レコードをつくったりログを出力したり...
  end
end
```

## `assert_performed_jobs` を使う

テストの中で例外を発生するようなスタブを作成する必要がありますが、`assert_performed_jobs` で何回リトライしたかの回数を指定することで検証ができます。

```ruby
RSpec.describe GuestsCleanupJob, type: :job do
  example do
    assert_performed_jobs 9 do
      described_class.perform_later rescue nil
    end
  end
end
```

`assert_performed_jobs` は内部で `perform_enqueued_jobs` を呼んでいるのでブロックを指定せず次のようにも実行できます。

```ruby
RSpec.describe GuestsCleanupJob, type: :job do
  example do
    perform_enqueued_jobs do
      described_class.perform_later rescue nil
    end
    assert_performed_jobs 9
  end
end
```
ローカルブランチを一括削除するコマンド

```bash:ローカルブランチを一括削除する（ただし現在チェックアウト中のブランチは削除されない）
git branch | xargs git branch -D
```

```bash:マージ済みかつブランチ名にfeatureが含まれるブランチを削除する
git branch --merged | grep feature | xargs git branch -d
```

```bash:ブランチ名にfeatureが含まれるブランチを削除する
git branch | grep feature | xargs git branch -d
```
Rails6 のちょい足しな新機能を試す 115（PostgreSQL データベース存在チェック編)

　# はじめに

Rails 6 に追加された新機能を試す第115段。 今回は、`PostgreSQL データベース存在チェック` 編です。
Rails 6 では、PostgreSQLのデータベースを存在するかどうかをチェックする方法が少し変わりました。
データベースが存在しないときに、 `bin/rails db:migrate` を実行した場合、 PostgreSQLのロケールが英語以外でも、 `ActiveRecord::NoDatabaseError` が発生するようになりました。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1 PostgreSQL 12.1 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

```shell
$ rails --version
Rails 6.0.2.1
```

今回は、PostgreSQL を日本語ロケール (`ja_JP.UTF8`) で、Docker環境で起動し、 `bin/rails db:migrate` コマンドを使って Rails 6.0.2.1 と Rails 5.2.4.1 の違いを確認してみます。

日本語ロケールの PostgreSQL の Docker環境の作成については、 [PostgreSQL を Docker 環境で日本語ロケールで動作させる](https://qiita.com/suketa/items/f63ff05284593d40135d) を参照してください。

# PostgreSQL 側で直接、データベースが存在しないことを確認する

psql コマンドでデータベースが存在しないことを確認します。

```shell
$ psql app_development -U postgres
psql: エラー: サーバに接続できませんでした: FATAL:  データベース"app_development"は存在しません
```

# db:migrate を実行する

エラーを確認するために、 `db:create` しないで `db:migrate` を実行すると `ActiveRecord::NoDatabaseError` が発生します。

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  データベース"app_development"は存在しません
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:50:in `rescue in postgresql_connection'
```

ちなみに PostgreSQL のロケールが英語 (`en_US.UTF-8`) の場合も `ActiveRecord::NoDatabaseError` となります。

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "app_development" does not exist
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:50:in `rescue in postgresql_connection'
```

# Rails 5 では

PostgreSQL が `ja_JP.UTF-8` の場合は、 `PG::ConnectionBad` となります。 `en_US.UTF-8` の場合は、 `ActiveRecord::NoDatabaseError` になります。

`ja_JP.UTF-8` の場合：

```shell
$ bin/rails db:migrate
rails aborted!
PG::ConnectionBad: FATAL:  データベース"app_development"は存在しません
/usr/local/bundle/gems/pg-1.1.4/lib/pg.rb:56:in `initialize'
```

`en_US.UTF-8` の場合

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "app_development" does not exist
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/postgresql_adapter.rb:696:in `rescue in connect'`
```

# 何が変わったのか

Rails 5 までは、 `PG::ConnectionBad` が発生したときに、エラーメッセージに `does not exist` が含まれた場合に `ActiveRecord::NoDatabaseError` を発生させていました。
Rails 6 では、 `PG::ConnectionBad` が発生したときに、エラーメッセージにデータベース名 (今回では、 `app_development` ) が含まれた場合に、 `ActiveRecord::NoDatabaseError` を発生させるようにしています。

正確な判定ではないですが、データベース名による判定の方が誤判定が減るだろうという判断のようです。

# 試したソース

https://github.com/suketa/rails_sandbox/tree/try115_postresql_encoding

# 参考情報

* [Make "bin/setup" works when using PostgreSQL with locales other than en locale](https://github.com/rails/rails/pull/36612)
ImportError: cannot import name の解決

整理されてないコードを書いた結果、エラーが出た。

### エラー内容

```
Traceback (most recent call last):
  File "code1.py", line 7, in <module>
    from code2 import my_function1
  File "/home/ubuntu/code2.py", line 9, in <module>
    import code3
  File "/home/ubuntu/code3.py", line 6, in <module>
    from code1 import my_function2
  File "/home/ubuntu/code1.py", line 7, in <module>
    from code2 import my_function1
ImportError: cannot import name 'my_function1'
```

### 原因

importが無限ループしてしまっている。

<img width="681" alt="スクリーンショット 2020-01-08 12.13.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150799/80147682-9125-555b-07b8-a411831fe119.png">

### 解決法

グローバルインポートじゃなくて、ローカルインポートにする。

#### 元のコード

```code1.py
from code2 import my_function1
def main():
    my_function1()
```

#### 是正したコード

```code1.py

def main():
    from code2 import my_function1
    my_function1()
```

これは、対処療法的に思えるので、根本的にはインポートの主従関係を明白にした方が良いと思う。


### 関連記事

[ImportError: cannot import nameを解消する](https://qiita.com/puriketu99/items/a1347bf5200f095e486e)
【Heroku】PG::DatatypeMismatch: ERROR:　の対処法

開発環境SQLite　本番環境PostgreSQLによって起こるheroku run rails db:migrateできない問題に遭遇し、かなりググって時間を使ってしまったので対処法を記載。

***手順1***
エラーが起きている開発環境のmigrationファイルを削除（or変更）

***手順2***

```
heroku pg:reset DATABASE_URL
```

ちなみにここで治ることもあるらしい。

***手順3***

```
git push heroku master
```

開発環境のDBの変更を本番環境に適用するためのpush

***手順4***

```
heroku run rails db:migrate
```

手順がゲシュタルト崩壊しました
ベイズ推定１：ベイズ推定はどのように予測を構成するのか

# はじめに
ベイズ推定を学ぼうとしたとき、各種確率分布の定義から共役事前分布やMCMC、変分ベイズ法など、キーワードが多い上に一つ一つが割と重かったり、全体感が掴めていないまま具体的なモデルでのベイズ推定の導出を読んでも「いま何のために何の分布求めているんだっけ・・」と迷子になった記憶があります。
そこで本記事では具体的な確率分布や近似推論には立ち入らずに**「ベイズ推定はどのように予測を構成するのか」**を解説してみました。

# ベイズ推定
未知の確率分布$q(X)$からの独立同分布な$N$個のサンプル（観測値）を$\\{x_n\\}\_{n=1}^N$として、これらの観測値に基づいて$x_{N+1}$を予測したい状況を考えます。言い換えると観測した$\\{x_n\\}\_{n=1}^N$を根拠として、$X$が従う分布を推定する問題です。
ここでやりたいことは、$\\{x_n\\}\_{n=1}^N$を条件として$X$の予測分布：

```math
p(X|\{x_n\}_{n=1}^N)
```
を構成することです。この予測分布$p(X|\\{x_n\\}\_{n=1}^N)$を構成するために、パラメータ$\theta$により分布形が決まる**パラメトリックモデル$p(X|\theta)$を導入**します。すると、次のように式を展開できます。

```math
\begin{align}
p(X|\{x_n\}_{n=1}^N)
 &= \frac{p(X,\{x_n\}_{n=1}^N)}{p(\{x_n\}_{n=1}^N)} \\
 &= \frac{1}{p(\{x_n\}_{n=1}^N)} \int p(X,\{x_n\}_{n=1}^N,\theta) d\theta \\
 &= \frac{1}{p(\{x_n\}_{n=1}^N)} \int p(X,\{x_n\}_{n=1}^N|\theta) p(\theta) d\theta \\
 &= \frac{1}{p(\{x_n\}_{n=1}^N)} \int p(X|\{x_n\}_{n=1}^N,\theta) p(\{x_n\}_{n=1}^N|\theta) p(\theta) d\theta \\
 &= \int p(X|\theta) \frac{p(\{x_n\}_{n=1}^N|\theta) p(\theta)}{p(\{x_n\}_{n=1}^N)} d\theta \\
 &= \int p(X|\theta) p(\theta|\{x_n\}_{n=1}^N) d\theta \\
\end{align}
```
**これがベイズ推定による予測分布** となります。

１つ目の等号は条件付確率の定義：

```math
P(B|A) = \frac{P(A,B)}{P(A)}
```
２つ目の等号はパラメータの周辺化（積分消去）：

```math
P(A) = \int P(A,B) dB
```
を介した**パラメトリックモデルの導入**です。３つ目と４つ目の等号も条件付確率、５つ目の等号で$p(X|\\{x_n\\}\_{n=1}^N,\theta)=p(X|\theta)$は導入したモデルの定義より、６つ目の等号はベイズの定理（条件付確率の定義）：

```math
P(A|B) = \frac{P(B|A)P(A)}{P(B)}
```
より、です。$p(\theta)$は$\theta$の事前分布で、一方最後の式にある$p(\theta|\\{x_n\\}\_{n=1}^N)$は、観測値$\\{x_n\\}\_{n=1}^N$を根拠とした$\theta$の分布であり、 **事後分布** と呼ばれます。

まとめると観測値$\\{x_n\\}\_{n=1}^N$に基づくベイズ推定による予測分布は

```math
\begin{align}
p(X|\{x_n\}_{n=1}^N)
 &\approx \int p(X|\theta) p(\theta|\{x_n\}_{n=1}^N) d\theta \\
\end{align}
```
であり、言葉で言えば**「ベイズ推定による予測分布は、$p(X|\theta)$の事後分布$p(\theta|\\{x_n\\}\_{n=1}^N)$による期待値」**です。**あくまで導入したモデル$p(X|\theta)$を介した予測であり、モデルが現実に即していなければ予測も現実から乖離してしまうことに注意が必要です。**ベイズ推定では、モデルの当てはまりの良さを測る指標も自然に導出されます。（[ベイズ推定６：周辺尤度](https://qiita.com/msekino/items/1ec907bcd30953414d7b)）
**ベイズ推定「できるかどうか」は事後分布$p(\theta|\\{x_n\\}\_{n=1}^N)$による期待値を計算できるかどうかに依ります。**そのため、事後分布の解析的計算を可能にするために共役事前分布を用いたり、ラプラス近似や変分ベイズ法、MCMC法などの近似手法を用いたりします。やりようはいろいろあるけれど、やることはとにかく事後分布や期待値の計算なところがあります。が、これらは**あくまでモデル$p(X|\theta)$ありきでベイズ推定する「作業である」**ということは、ベイズ推定を学ぶときに一番最初に押さえておくと良いのではないかな、と思います。

次回は[「ベイズ推定２：正規分布のベイズ推定」](https://qiita.com/msekino/items/b4338dfac4d2c6d4d27f)です。
EC2にAnsibleを入れる方法（～巷の方法では上手く入らなかった～）

#序章
EC2、リリースはAmazon Linux AMI release 2016.03
というものを~~未だに~~使っております。

Ansibleのインストール方法を調べると、大体yumコマンドからのインストールで、epel-releaseのリポジトリをいれるだとか、python-develをいれるだとか、、、
結局yumでは入れられませんでした。（yumリポジトリにAnsibleが出てこない）

ガッデム！

ここに私がAnsibleを入れた方法をメモしておきます。

#先に答え
```bash
wget https://bootstrap.pypa.io/get-pip.py　#(1)
sudo python2.7 get-pip.py #(2)
sudo /usr/local/bin/pip install ansible #(3)
```

#前提
Python2.7を先にインストールしております。

#適当に解説
##(1)
pipコマンドをインストールする何かをゲットします。
*pipはyum的な何かと考えてもらえばいいと思っている。

##(2)
pipコマンドをインストールします。

##(3)
pipコマンドを使ってAnsibleをインストールします。
*なぜか```sudo pip xxx```だとcommand not foundになります。フルパス指定してあげましょう。```whereis pip```でパスがでるでしょう。

#まとめ
yumがだめならpipを使えばいいじゃない
[参考](https://ja.wikipedia.org/wiki/%E3%82%B1%E3%83%BC%E3%82%AD%E3%82%92%E9%A3%9F%E3%81%B9%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%98%E3%82%83%E3%81%AA%E3%81%84)


#おまけ
AnsibleからMysqlを操作する必要があったので、以下を追加で入れました。

```bash
sudo /usr/local/bin/pip install PyMySQL
```
　
　
[キーワード]
AWS EC2 Ansible インストール yum pip
2重クリックによるトークンエラーをクライアント側で予防する



#### 問題の事象
フォームの2重送信を防ぐ目的でサーバーサイドではトークンチェックを利用しているが、ユーザー誤操作により2重タップが割と発生していることが判った。

#### 対策
サーバーサイドではトークンチェックが入っているので正常に登録されるが、画面表示上はエラーとなるためユーザーにとっては、「本当に登録されているのか不安」な状況となってしまう。
ユーザービリティの意味でもクライアント側での制御を追加することになった。

```javascript

(function($) {
$.preventDoubleSubmit = function() {
	var loading = false;
    $("form").submit(function(e) {
        var self = $(this);
        if (loading) {
        	e.stopPropagation();
        	return　false;
        }
        loading = true;
        // 10秒後から再送信が可能
        setTimeout(function() {
            loading = false;
        }, 10000);
    });
}
})(jQuery);

```
現役webエンジニアに話しをうかがって

私の通っていた[プログラミング教室](https://www.protosolution.co.jp/codebase/program-school/index.html)の卒業生で大阪で現在エンジニアとして働いている方から話を聞くことができました。

# 趣旨
私が現在webプログラマーとして就活をしようと思っているが、実際に就職して働いている人の生の声を聞きたいと思った。現役エンジニアの話はイベントなどですぐに聞けるが、同じプログラミング教室の卒業生の方が共通項があり、話しやすいと思ったので、ご飯に誘ってお願いした。アドバイスが非常に的確で為になったので、備忘録として残すことにした。

# ポイント
-  独学では限界があるので、早めに就職する方が絶対によい！
    -  結局、就職してからも勉強することには変わりない。むしろ就職してからの方が勉強する。レビューをもらえたり、他の人の意見が参考になる。
    - 　ただ、全く成長要素のないドボン会社もあるので、見極めは非常に大事
- 自社開発と受託開発どちらも良し悪しがある
    - 自社開発は自分の意見も取り入れられることもあるのが特徴。
    - 自社開発は自社のサービスが好きだ！（社会に役立っていることを実感できるということ）と思わないと中々辛い部分がある。
    - 自社開発だと自社で作っているプロダクトのコードをメインで触れることになる。
    - 受託はお客さんの要望にそって作るので、新しい技術などを使っていくことが多い


- 要件定義について
    - 全ては要件定義から始まる

# 特に印象的アドバイスについて
- 最初のうちは、たとえテスト業務であろうとも全てエンジニアは知る必要があるから、仕事の選り好みはするべきでない。
GASでHTTPクライアント処理を実施する（URL Fetch Service）

#このポストの目的
Google Apps Scriptを用いてアプリケーションを開発する際に、外部のWebAPIへアクセスする場合があります。その際に利用する、**URL Fetch Service**の利用方法をまとめます。

もとの情報はGoogleの開発者サイトのリファレンス（[G Suite Developer / URL Fetch Service ]( https://developers.google.com/apps-script/reference/url-fetch)）を参考にしています。
# URL Fetch Service
URL Fetch Serviceは２つのクラスから構成されます。

* UrlFetchApp
  * HTTPクライアント用のクラス。 
* HTTP Respose
  * UrlFetchAppで取得したHTTPレスポンスを管理するためのクラス。 

## UrlFetchApp
HTTPクライアント用のクラスです。今回の例の場合はこのクラスを利用してWebAPIに接続します。

### HTTP GETを行う場合
`fetch`関数にURLを渡します。下記のコードは、OpenBDという書籍APIにアクセスする例です。GETリクエストで、QueryStringにパラメータ（ISBN）を渡した場合の記述方法です。

```JavaScript
var response = UrlFetchApp.fetch('https://api.openbd.jp/v1/get?isbn=' + isbn);
```

### HTTP POSTを行う場合
POST用のボディは、`options`として`fetch`関数に渡します。

```JavaScript
var book = {
  'title': 'すべてがFになる',
  'comment': 'ドキドキして面白かった'
};

var options = {
  'method' : 'post',
  'contentType': 'application/json',
  'payload' : JSON.stringify(book)
};

var response = UrlFetchApp.fetch('https://httpsample.org/book', options);
```



#### 補足：パラメータとボディの作り方

`options` のパラメータにはヘッダ、HTTPメソッドなどがあります。こちらに整理（[Advanced Parameters](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app.html#advanced-parameters)）されています。上の例では、`JSON.stringify` を利用してオブジェクトをJSON形式に変換して、payload（ボディ）に詰めています。

## HTTP Response
`UrlFetchApp.fetch` でレスポンスを無事に取得できたら、その結果はHTTP Responseクラスに格納されます。

### HTTPレスポンスコードを取得する
HTTPリクエストが正常に終わったかを確認するために、HTTPレスポンスコードを取得できます。

```JavaScript
var code = response.getResponseCode();
// responseはfetchの返り値です。以下も同じ。
// codeはIntegerとなる（例：200）
```

### HTTPレスポンスのボディを取得する
ボディは`getContextText()` で取得します。

```JavaScript
var content = response.getContentText();
// contentはStringとなる。
```

### JSONデータをオブジェクトに変換する
単純なStringのままではプログラム中で処理しづらいため、オブジェクトに変換します。

```JavaScript
var o = JSON.parse(response.getContentText());
// oはObjectとなる。もとのJSON構造に合わせてプロパティでアクセスできます。
```

以上です。
git rebase でスカッシュする


Gitで後から履歴が見やすいように、コミットをまとめたいときがあります。
そうしたとき `git rebase` でコミットをまとめられます。

## コミットをまとめる

```sh
# ログを確認
$ git log --oneline
# a23f186 Add piyopiyo <- このコミットと
# 85f004e (origin/develop) Change hogehoge <-このコミットをまとめたいなら
# 18f26a5 Update fugafuga <- このコミットIDをコピー
# ...

# インタラクティブモードで開く
git rebase -i <コピーしたID>
```
`git rebase` は履歴が気に入らないから変更するときのコマンドです。
`i`はインタラクティブモードでコミットを修正できます。
vi で開くので、コミットで必要なメッセージを消したり処理していきます。

```
# git log --oneline と逆順(新しいコミットほど下)で、最新のコミットまで履歴が表示される
pick 85f004e Change hogehoge <- 一番上(古い)のpickはそのまま
pick a23f186 Add piyopiyo <-まとめたいコミットはpickをsに変更
```
まとめたいコミットが多い場合は、 `Shift+v`で範囲選択→`:`→`s/置換対象文字列(pick)/置換後文字列(s)/gc`→`Enter`等で置換すると楽です。

```sh

# GitHubの変更点と比べて問題ないか確認
$ git log -p
```
最後にプッシュして終わりです。

```sh

git push origin foo --force-with-lease
```

## まとめるコミットを間違えた場合
`git reflog`で

```
0c2faef (HEAD -> feature-ar-kit) HEAD@{0}: reset: moving to HEAD@{7}
dca12e6 HEAD@{1}: rebase -i (finish): returning to refs/heads/feature-ar-kit
dca12e6 HEAD@{2}: rebase -i (squash): Update for Android build
73a993f HEAD@{3}: rebase -i (squash): # This is a combination of 3 commits.
54836a8 HEAD@{4}: rebase -i (squash): # This is a combination of 2 commits.
13076fd HEAD@{5}: rebase -i (start): checkout 8690d54
33c3f76 HEAD@{6}: rebase -i (finish): returning to refs/heads/feature-ar-kit
33c3f76 HEAD@{7}: rebase -i (squash): Update to implement eyeball and body angle x z move

```
JSPって何？〜JSPの基礎を知ろう!!〜

#JSPとは
今回はWebアプリケーションを作成するのに欠かせない**「JSP」**について説明していきます。

- JSPとは何か
- JSPの構成要素
- JSPファイルを作成して実行する

以上の3点について順を追って解説していきます。
#JSPとは何か
「JSP(JavaServer Pages)」は、サーブレットと同じ、サーバサイドプログラムの技術です。サーブレットクラスの代わりに**JSPファイル**を使用します。
JSPファイルは、**リクエストされるとサーブレットクラスに変換される**ため、サーブレットクラスでできることはJSPファイルでも行うことができます。
JSPファイルを使うメリットは、**HTMLの出力を非常に楽にすることが可能**です。
JSPファイルは、**HTMLの中にJavaコードを埋め込んで作成**します。
Javaコードを埋め込む？と言われてもよく分からないと思うので、次のJSPの構成要素を見ながらやり方を見ていきましょう。
# JSPの構成要素
JSPファイルは、**HTML**と**Javaコード**で構成されています。
HTMLで書かれた部分を**テンプレート**
Javaコードで書かれた部分を**スクリプト**と呼びます。

ここからは、基本んできなJSPファイルを作成する上で必要な要素である**①「JSPコメント」**,**②「pageディレクティブ」**,**③「スクリプトレット」**,**④「スクリプト式」**について詳しく学んでいきます。
以下のサンプルコードを見てみましょう。

```java:sample
<%--① JSPコメント --%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><%--② pageディレクティブ --%>
    
    
    <%
    String name="ヤマザキ";
    int age=24;
    %><%--③ スクリプトレット--%>
    
<!DOCTYPE html><%-- テンプレート --%>
<html>
<head>
<meta charset="UTF-8">
<title>サンプル</title>
</head>
<body>
私の名前は<%=name %>。年齢は<%=age %>才です。<%--④ スクリプト式--%>
</body>
</html>
    

```
####①「JSPコメント」
<%-- ... --%>

```Java:
<%--① JSPコメント --%>　
```
ただし、スクリプトレット内のコメントを記述する際は、Javaの文法に従います。
*※スクリプトレットは、③を参照*

```Java:
<%--① JSPコメント --%>　
<%
//変数を宣言
%>
```

####②「pageディレクティブ」
<%@page 属性名="値"%>

```java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
```
pageディレクティブを使うと、JSPファイルに関する様々な設定を行うことができます。
よく使用する属性は、contentType属性とimport属性です。

####③「スクリプトレット」
<% Javaコード%>

```java:
 <%
    String name="ヤマザキ";
    int age=24;
    %>
```
スクリプトレットを使用すると、JSPファイルにJavaコードを埋め込むことができます。
####④「スクリプト式」
<%=Javaコード%>

```java:
<body>
私の名前は<%=name %>。年齢は<%=age %>才です。
</body>
```
スクリプト式を使うと、変数やメソッドの戻り値などを出力することができます。

#JSPファイルを作成して実行する
EclipseでJSPファイルを作成する方法はHTMLファイルを作成する動的Webプロジェクトを選択して右クリック→「新規」→「JSPファイル」を選択します。
![jsp_create1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/0d9a2c43-3f8e-9100-0bf1-09bcb4e9bd41.jpeg)

*※JSPファイルがみつからない場合は、パースペクティブが「Java EE」になっていない可能性があります。*

ファイルの保存場所とファイル名を指定し「完了」を押します。保存場所はデフォルトで「WebContent」ディレクトリが選択されています。
![jsp_create2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/55ab55b4-2fb7-069b-2a0e-a614ba0a2b77.jpeg)


以上の方法でJSPファイルを作成すると**pageディレクティブなど必要最低限の内容はEclipseが書いてくれます。**

```java
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
//<%ここにJavaのコード追加%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ここにタイトルを挿入</title>
</head>
<body>
//<p>ここに段落を書きます</p>
</body>
</html>
```
アクティビティにあらかじめ書かれたソースコード

初学者です。個人的な勉強のために書きました。

##アプリ起動時に実行されるメソッド


```HelloSampleActivity.java
package com.websarva.wings.android.hellosample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class HelloSampleActivity extends AppCompatActivity {

	@override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);//--------------１
		setcontentView(R.layout.activity_hello_sample);//--２
	}
}
```


・上記のコードは、あらかじめ記述されているもの

・onCreateメソッドは、Androidアプリが実行されると、まず最初に実行されるメソッドであるため、画面作成やデータの用意など、初期処理として必要なものはこのメソッドに書く必要がある

・①は、親クラスのonCreateメソッドを呼び出し、処理を記述している。Activityクラスは、Activityクラス（またはその子クラス）を継承して作る必要があるため、Activityクラスで定義されているonCreateメソッドをオーバーライドする形で記述する

・②は、このアプリで表示する画面を設定している。上記のコードは、activity_hello_sample.xmlに記述したものを画面として使うので、引数を「R.layout.activity_hello_sample」としている

##Rクラス

・Android開発では、resフォルダ内のファイルや、そのファイル中に記述された**リソース**は、Androidアプリの管理対象として扱う

・効率よくリソースを管理するために、Androidではそのファイル値を識別するための**int型定数**を使用する

・int型定数をまとめたクラスが**Rクラス**で、そこにAndroid studioが自動追記する仕組みになっている。これにより、Rクラス中の定数（**R値**）を使ってリソースをやり取りできる
　※R.javaはapp/buikdgenerated/source/r/debug配下のパッケージ内に作成される
　例えば、「R.layout.activity_hello_sample」という記述は、「res/layout/activity_hello_sample.xml」ファイルを示す定数

・Javaでは、定数は大文字で記述することになっているが、R値に関しては、実際のフォルダ階層や、ファイル名などとの関係をはっきりさせるために、記述されたフォルダ名やファイル名をそのまま使っている
Microsoft Business Applications

# 概要

企業内のサイロ化されたデータを解決し、顧客、製品、従業員、業務をつなげることにより潜在性を最大限に引き出す**Microsoft Business Applications** について。
CRM および ERP が **Microsoft Business Applications** の基礎を構成しています。

# Microsoft Business Applications の構成要素

- オムニチャネル アプリケーション
- インテリジェント サービス
- データ統合クラウド プラットフォーム
- 柔軟なソリューション

## オムニチャネル アプリケーション

オムニチャネルとは？？
> オムニチャネルは、小売業を中心に広まり始めている販売戦略の1つです。企業が消費者に製品を届ける流通経路のことを、マーケティング用語で「チャネル」と呼びます。このチャネルという語に「全て」というニュアンスを表す「オムニ」という接頭語を繋げたのが「オムニチャネル」という言葉です。その名の通り「全てのチャネルを統合連携させた状態で顧客に対してアプローチする」というのがオムニチャネルという戦略の概要となっています。

[引用](https://www.intage.co.jp/gallery/omni-channel/)

つまり、さまざまなチャネルでエージェントが顧客とやり取りできるようにする、カスタマイズ可能で生産性の高い最新のアプリのことで以下が提供予定との事。

- コンテキストに応じた顧客(Customer)識別（顧客の背景や心情を理解し、それにふさわしい情報を提供すると理解しています）
- リアルタイム通知
- 統合コミュニケーション
- エージェントを効果的にするためのサポート情報 (KB) 統合
- 検索、サポート案件作成などのエージェント生産性向上ツール

https://docs.microsoft.com/ja-jp/dynamics365-release-plan/2019wave2/dynamics365-customer-service/omnichannel

参考
[「顧客を理解しコンテキストマーケティングを実現」---SitecoreのPetersen氏に聞く顧客ファースト](https://active.nikkeibp.co.jp/atclact/active/15/081700088/030600039/)

## インテリジェント サービス

優れたビジネスの結果を生み出すための詳細なガイドラインの提供

## データ統合クラウド プラットフォーム

人、プロセス、データを統合統合したプラットフォーム

## 柔軟なソリューション

高可用性でスケーラビリティなソリューションの提供

# CRM

CRM (Customer Relationship Management) 顧客関係管理。
会社が顧客とのやり取りやライフサイクル全体のデータ追跡に使用する、戦略や技術のこと。顧客データを分析し、マーケティングや営業、サービスなどで共有し、Customer Service のリレーションシップを向上させ、売り上げ成長を促進させます。

> リレーションシップは Database や Excel の場合は テーブルや列の関連付けを示しますが、ここではマーケティングとしてのリレーションシップですので、「信頼関係」を示します。

参考
[「リレーションシップ」の意味とは？マーケティング・IT用語を解説](https://biz.trans-suite.jp/26153)


# ERP

ERP (Enterprise Resources Planning) ヒト・モノ・カネ・情報 を有効活用する計画。基幹系情報システム。
一般会計、プロジェクト会計、調達、在庫管理、組み立てなどのさまざまなバックオフィスプロセスを自動化する統合された一連の機能で構成されます。生産データを分析し、プロセスを**合理化**(工程や事務処理過程にある不合理を除き、能率的にする)し、効率を向上させます。

# Microsoft の CRM と ERP

Microsoft の CRMと ERP は以下のサービス内で統合しています。

- Dynamics 365
- Power Platform

全ての Dynamics 365 間でデータを共有できる Power Platform の 4 つのアプリケーション (Power Apps, Power Automate, Power BI , Power Virtual Agents) を提供しています。

これらは先ほどの **Microsoft Business Applications** の 4つの構成要素を最先端の AI や MR、データの統合や分析機能や他の多くの機能で構成しています。ほかの競合サービスとの差別点として、

- モダン
- 統合
- インテリジェント
- 適応性

の4つを主な要因としています。

# まとめ

1. **Microsoft Business Applications** は、次世代のオムニチャネルアプリケーションによって業務の効率化が可能となる
2. **Microsoft Business Applications** は、組み込みのインテリジェンスと手本となるガイダンスにより、静的ではないインテリジェントサービスを提供
3. **Microsoft Business Applications** は、 サイロ化されたデータを解決する
4. **Microsoft Business Applications** は、包括されたビジネスアプリケーションによって、リレーションシップ、プロセス、データの統合を提供
5. **Microsoft Business Applications** は、柔軟性、スケーラビリティ、セキュリティ、および拡張性を提供し、他のテクノロジーとの統合も行え、ビジネス変化に合わせて **成長**することが可能

その 2 に続く予定。
Magento上のフォームでJSバリデーションを駆使する

Webアプリケーションで避けて通れないものといえば「値チェック」。サーバーサイドで行うものはもちろん必要ですが、データを送信する前にJSでチェックするほうがUI/UX的に良いのは当たり前でしょう。
Magentoでは1系ではprototype.jsをベースにしたバリデーションが実装されていました。
2系はjQueryベースになっていますが、概ね同じ方式が使えます。

#MagentoのJSバリデーションが定義されている場所
Magento2系の場合、同じ様な定義が以下の箇所にあります。チェック処理の形式も似ていて、紛らわしいので注意が必要です。

- lib/web/jquery/jquery.validate.js
- lib/web/mage/validation.js
- lib/web/mage/validation/validation.js
- lib/web/mage/backend/validation.js
- lib/web/prototype/validation.js
- vendor/magento/module-ui/view/base/web/js/lib/validation/rules.js

#knockout.jsなフォームの値チェック
Magento2の標準テーマの場合、ベタなHTMLのフォームとUI Componentが描画するフォームの2種類があります。
前者の場合はHTMLに書き込んでしまえば色々できますが、後者はちょっと面倒です。
主にUI Componentが描画するフォームはチェックアウト画面で出てきますが、ここで表示されるフォームの値チェックは、データベースのcustomer_entity_attributeテーブルにある、validation_rules列の値をベースにしています。
要はここにチェックパターンを書いていけばチェックアウト画面での値チェックを強化できます。

ただし、ここの定義はシステム全体で共用するものなので、多言語サイトとして運用する場合には言語別の差をどう吸収するかよく考える必要があります。

#非UI Componentなフォームの値チェック
会員登録フォームや住所編集フォームの場合は、ベタなHTMLが用いられています。
こちらの場合は、各入力要素のタグを見ると下記のようになっています。

```html:telephone.html
<input type="text" name="telephone" id="telephone" value="" title="電話番号" class="input-text required-entry">
```

もとのphtmlでは下記のように定義されています。

```php:telephone.phtml
<input type="text"
       name="telephone"
       id="telephone"
       value="<?= $block->escapeHtmlAttr($block->getTelephone()) ?>"
       title="<?= $block->escapeHtmlAttr(__('Phone Number')) ?>"
       class="input-text <?= $_validationClass ?: '' ?>"
>
```

この例は電話番号入力欄の例ですが、$_validateionClassの値を元にJSバリデーションがかかることを意味しています。
電話番号の場合はrequired-entryが入っている、ということになります。
この定義は、eav_attributeテーブルのis_requred列にあり、ここの値が1の場合はrequired-entryとして扱われます。

##非UI ComponentでもUI Component版と同じバリデーションをするには
とはいえチェックアウト画面とその他の画面でチェックパターンが異なると困ります。
非UI Componentなフォーム入力要素の場合は、

```php:telephone2.phtml
<input type="text"
       name="telephone"
       id="telephone"
       value="<?= $block->escapeHtmlAttr($block->getTelephone()) ?>"
       title="<?= $block->escapeHtmlAttr(__('Phone Number')) ?>"
       class="input-text <?= $_validationClass ?: '' ?>"
       data-validate="{'required':true,'validate-digits':true,'maxlength':14,'minlength':9}"
>
```

というように、タグ上にdata-validate属性を追加し、JSON形式でチェックパターンを書けば動きます。
なお、チェックパターンは前から順番に適用されていくので注意しましょう。

##data-validateの場合はどの定義を見ているか
data-validateで値チェックをする場合、JSの処理は

- lib/web/mage/validation.js

をみています。ここに定義されているパターンを使うことになるので、存在しないパターンを使わないように注意しましょう。
UI Component版は

- vendor/magento/module-ui/view/base/web/js/lib/validation/rules.js

を見るので一部パターンが異なる点にも注意が必要です。

#独自にチェックパターンを追加したい場合
独自にチェックパターンを追加したい場合は、

- lib/web/mage/validation.js

に対してmixinを宣言します。
[日本語化エクステンションの実装](https://github.com/magento/magento2-jp/blob/2.3-develop/JapaneseName/view/frontend/web/js/validation.js)がわかりやすいと思うのでそちらを参照していただくと良いでしょう。
eb deploy するときに勝手にmigration と cache clear をしてくれるようにする（Laravelアプリケーション）


## これは何
Laravelを使ったアプリケーションにおいて、AWS ElasticBeanstalk において、コードデプロイのタイミングで migration と cache clear をやってくれるようにする方法です。

## やり方

.ebextensions/ 以下の ファイルに以下の記述を追加します。

```.ebextensions/migrate_and_cache_clear.config
container_commands:
  01-migration:
    command: "php artisan migrate --force"
    leader_only: true
  02-cache-clear:
    command: "php artisan cache:clear"
    leader_only: true
```

## 補足

##### `container_commands` について

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html

> コンテナコマンドは、アプリケーションおよびウェブサーバーが設定され、アプリケーションバージョンアーカイブが抽出された後、アプリケーションバージョンがデプロイされる前に実行されます。

要するに、デプロイ直前に実行されます。

「アプリケーションバージョンがデプロイされる前」 においてアプリケーションはサーバ内の`/var/app/ondeck/`に配置されます。
これは eb-activity.log において `AppDeployStage0/AppDeployPreHook/01_unzip.sh` のステップを見ると知ることができます。
ただしこれを知らなくても、cwdオプションのデフォルトの設定は以下のようになっているので、これを気にする必要はありません。

> cwd
> （オプション）作業ディレクトリです。デフォルトでは、これは解凍されたアプリケーションのステージングディレクトリです。

##### leader_only オプションについて

> (オプション) Elastic Beanstalk によって選択された単一のインスタンスでコマンドを実行するのみです。

eb で複数台構成で運用している場合にはこのオプションを指定しておくことで、そのデプロイにおいては1回だけコマンドを実行することができます。

##### migrate コマンドの --force オプションについて
`ENV=production` の環境においては、migrateコマンドは本当に本番だけどデプロイしていいのか確認を取るようになっています。
`--force` をつけておくとその確認を飛ばすことができるので、自動化するときには便利です。
seedを使わずにdb:migrateで初期データ投入

# `rails db:seed`はマスターデータ投入でちょっと面倒だった

マスターデータは初回投入後もちょいちょい追加することがある。
`rails db:seed`は差分更新みたいなことはできないらしい。(seed_fuとか使わない限り)
`rails db:migrate:reset`で全削除=>再登録はやりたくない。

# `rails db:migrate`を使えばいい


[Railsの初期データを投入する方法](https://qiita.com/mHadate/items/bc698ce5c126c932487e)を参考にさせてもらった。

`rails db:rollback`でやり直したかったので、`up`と`down`で実装してみた。
`change`だとロールバック時にデータ削除ではなく、もう一度挿入されてしまう。

```rb:db/migrate/xxxxxxxxx_insert_hoge.rb
class InsertHoge < ActiveRecord::Migration[6.0]
  def insert_data
    [
      { name: 'ウルトラマン', voice: 'duwa' },
      { name: 'バルタン星人', voice: 'fowfowfow' },
    ]
  end

  def up
    insert_data.each do |d|
      Tsuburaya::Character.create(d)
    end
  end

  def down
    insert_data.each do |d|
      Tsuburaya::Character.find_by(name: d[:name]).delete
    end
  end
```
Azure Backup 番外編

こんにちは、kc-dreamです。
今回は、Azure Backup 番外編ということで、スナップショット取得時の挙動について簡単ではありますが、まとめたいと思います。

#スナップショット/復元ポイントの動作について
Azure Backup のインスタントリストアでは、まずVMディスクのスナップショットを作成し、
ディスクと同じストレージアカウント上に保存します。その後、増分データがRecovery Servicesコンテナーに送られ、保存されます。
このスナップショットは、バックアップポリシーの "インスタント回復スナップショットの保持期間" で決められた日数保持され、その後自動的に削除されます。
 
スナップショット/復元ポイントの動作については、上記が前提となっております。


- コンテナーへのデータ転送の終了を待たずに、復旧に利用できるバックアップジョブの一環として取得されるスナップショットを使用できます。 これにより、復元をトリガーする前にスナップショットをコンテナーにコピーする待機時間が短縮されます。
- スナップショットを既定で2日間ローカルに保持することで、バックアップと復元の時間が短縮されます。 この既定のスナップショット リテンション期間の値は、1 から5日の間の任意の値に構成できます。
- 最大32TBのディスク サイズがサポートされます。Azure Backupでは、ディスクのサイズ変更は推奨されません。
- Standard HDDディスクおよび Premium SSDディスクと共にStandard SSDディスクがサポートされます。
- 復元時に、(ディスクごとの) アンマネージド VM の元のストレージ アカウントを使用できます。この機能は、ストレージアカウント間に分散しているディスクが VM にある場合でも使用できます。さまざまなVM構成で復元操作が速くなります。
- インスタントリストアでPremium Storageを使用している VM のバックアップについては、割り当てられた合計ストレージ領域の50% の空き領域 (最初のバックアップにのみ必要) を割り当てることをお勧めします。最初のバックアップが完了すると、バックアップに50% の空き領域は不要になります。


###復元時間について
スナップショットが削除された復元ポイントからの復元では、Recovery Servicesコンテナーから
バックアップデータの転送に伴い復元に時間がかかります。
※復元対象のデータ容量により変わります。

[Azure Backup のインスタント リストア機能を使用してバックアップと復元のパフォーマンスを改善する](https://docs.microsoft.com/ja-jp/azure/backup/backup-instant-restore-capability)
 
###復元ポイントについて
復元ポイントは保持期間に従って自動的に管理され、個別に手動で削除することはできません。
復元ポイントおよびバックアップデータを削除するには、VM のバックアップを停止する必要がございます。
 
[VM の保護を停止する - Azure VM のバックアップを管理する](https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-manage-vms#stop-protecting-a-vm)

###復元可能タイミング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/72e34944-16d1-0f02-1720-aa1313a8c14e.png)
- 上図にあるように①のTake snapshotジョブが完了した時点でBackup自体は完了しているので、VMの復元が可能です。
- ②については、Recovery ServicesコンテナーへBackupデータを転送するため時間（24時間以内完了）がかかります。

#おわりに
番外編ということでスナップショット取得時の挙動についてご紹介しました。
【Python】辞書型変数（dictionary）

#辞書型変数とは
辞書型変数は、複数の値をもつリストのような変数である。
リストではindexによってリスト内の要素を参照することができる。
一方で、辞書型変数ではkeyによってvalue(値)を参照することができる。
以下の例でリストと辞書型変数の違いを確認して頂きたい。

```python:dict.py
list={"apple","banana","chocolate"}
print(list[0])
>>>apple
dict={ "a":"apple" , "b":"banana" , "c":"chocolate" }
print(dict["a"])
>>>apple
```
上例で、変数名=dictが辞書型変数である。
a→apple
b→banana
c→chocolateに対応する。
a , b , c のことをkeyといい、
apple , banana , chocolate のことをvalueという。

#辞書型変数の宣言の仕方（dict関数,zip関数）
辞書型変数は**dict関数、zip関数**を使っても宣言できる。
書きやすいと感じる方法で宣言して頂ければと思う。

**★dict関数**
変数名=dict(key1=value1 , key2=value2 , ・・・)
で宣言することが出来る。

```python:dict_f.py
dict1=dict(a="apple" , b="banana" , c="chocolate")
print(dict1["a"])
>>>apple
```
これと**zip関数を併用することでkeyとvalueを明確にした記述**で宣言することが出来る。

```python:dict_zip_f.py
key=["a","b","c"]
value=["apple","banana","chocolate"]
dict1=dict(zip(key,value))
print(dict1["a"])
>>>apple
```

# key , value の取り出し方
辞書型変数に含まれるkeyを参照する方法は.keys()メソッド、
valueを参照する方法は.values()メソッドを使う。

```python:dict_zip_f.py
key=["a","b","c"]
value=["apple","banana","chocolate"]
dict1=dict(zip(key,value))
print(dict1.keys())
>>>dict_keys(['a', 'b', 'c'])
print(dict1.values())
>>>dict_values(['apple', 'banana', 'chocolate'])
```
for文を使って**一つずつ要素を取り出す**こともできる。

```python:dict_zip_f.py
key=["a","b","c"]
value=["apple","banana","chocolate"]
dict1=dict(zip(key,value))
for m in dict1.keys():
    print(m)
>>>a
>>>b
>>>c
```

#要素の追加
辞書型変数の宣言後に、新たに要素を追加したい場合は
**変数名[追加したいkey]=追加したいkeyに対するvalue**
で追加することが出来る。

```python:dict_zip_f.py
key=["a","b","c"]
value=["apple","banana","chocolate"]
dict1=dict(zip(key,value))
print(dict1)
>>>{'a': 'apple', 'b': 'banana', 'c': 'chocolate'}
dict1["d"]="dessert" #ここで新しいkeyとvalueを追加
print(dict1)
>>>{'a': 'apple', 'b': 'banana', 'c': 'chocolate' , 'd': 'dessert'}
```
辞書型変数に別の辞書型変数を組み合わせたいときは、
**組み合わせ先dict.update(取り込みたいdict)**
で二つの辞書から一つの辞書を生成することが出来る。

```python:dict_zip_f.py
key1=["a","b","c"]
value1=["apple","banana","chocolate"]
dict1=dict(zip(key1,value1))

key2=["y","n"]
value2=["yes","no"]
dict2=dict(zip(key2,value2))

dict1.update(dict2)
print(dict1)
>>>{'a': 'apple', 'b': 'banana', 'c': 'chocolate' , 'y': 'yes' , 'n' ,'no'}
```

#要素の削除
要素の削除はdel文、clearメソッドの二つがある。
**★del文**
いくつかの要素を削除することが出来る。
**del 変数名[削除したいkey1] , 変数名[削除したいkey2] , ...**

```python:dict_zip_f.py
key1=["a","b","c"]
value1=["apple","banana","chocolate"]
dict1=dict(zip(key1,value1))
del dict1["a"] , dict1["c"]
print(dict1)
>>>{'b': 'banana'}
```

**★clearメソッド**
全ての要素を削除する。
**変数名.clear()**


```python:dict_zip_f.py
key1=["a","b","c"]
value1=["apple","banana","chocolate"]
dict1=dict(zip(key1,value1))
dict1.clear()
print(dict1)
>>>{}
```
VSCodeでRubyのデバッグをする際にエンコーディングエラーが発生する

[Visual Studio CodeによるRubyのデバッグ](https://dev.classmethod.jp/tool/visual-studio-code-ruby-debug/)

Mac環境でこちらの記事などを参考にVSCodeでRubyのデバッグをしようとすると以下のエラーが発生しました。

```
CSV::MalformedCSVError: Invalid byte sequence in US-ASCII in line 1.
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv/parser.rb:313:in `rescue in parse'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv/parser.rb:296:in `parse'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv.rb:1236:in `each'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv.rb:1236:in `each'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv.rb:510:in `block in foreach'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv.rb:657:in `open'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/2.6.0/csv.rb:509:in `foreach'
  /Users/hoge/Development/test/main.rb:7:in `<top (required)>'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/ruby-debug-ide-0.7.0/lib/ruby-debug-ide.rb:100:in `debug_load'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/ruby-debug-ide-0.7.0/lib/ruby-debug-ide.rb:100:in `debug_program'
  /Users/hoge/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/ruby-debug-ide-0.7.0/bin/rdebug-ide:187:in `<top (required)>'
  /Users/hoge/.rbenv/versions/2.6.5/bin/rdebug-ide:23:in `load'
  /Users/hoge/.rbenv/versions/2.6.5/bin/rdebug-ide:23:in `<top (required)>'
```

`ruby main.rb`などでコンソール上での実行では問題なく動くのですが、CSVの読み込みの際にエンコーディングのエラーが発生しました。
[こちら](https://github.com/rubyide/vscode-ruby/issues/43)で解決しました。

```:launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Local File",
            "type": "Ruby",
            "request": "launch",
            "program": "${workspaceRoot}/main.rb",
            "useBundler": true,
            "env": {
                "LANG": "en_US.UTF-8",
                "LC_COLLATE": "en_US.UTF-8",
                "LC_CTYPE": "en_US.UTF-8",
                "LC_MESSAGES": "en_US.UTF-8",
                "LC_MONETARY": "en_US.UTF-8",
                "LC_NUMERIC": "en_US.UTF-8",
                "LC_TIME": "en_US.UTF-8",
                "LC_ALL": "en_US.UTF-8"
            }
        }
    ]
}
```
Exploiting BERT for End-to-End Aspect-based Sentiment Analysisの内容が読んでも分かりません

授業でまとめるのですが、Exploiting BERT for End-to-End Aspect-based Sentiment Analysisの内容が分かりません
分かりやすくまとめる。また、まとまったサイトがあれば教えてください。
Azure Backupの復元方法について

こんにちは、kc-dreamです。
今回はAzure Backupの復元方法についてご紹介したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/fb09358e-c249-5d2f-84fd-76b6e08f0c0c.png)

#Azure Backupとは
Azure Backup サービスでは、Microsoft Azure クラウドにデータをバックアップします。 オンプレミスのマシンとワークロード、および Azure 仮想マシン(VM) をバックアップできます。

下記から抜粋
[Azure Backup とは](https://docs.microsoft.com/ja-jp/azure/backup/backup-overview)

##Azure Backupを使用した復元方法
Azure Backupには大きく３種類の復元方法が用意されています。
本記事では3種類の復元方法について簡単ではありますが、ご紹介していきたいと思います。


###1,VM の新規作成
Azure VM が新規作成され、復元されたディスクがアタッチされます。
このオプションでは、容易にVMを作成いただける反面、細かな構成の変更を自身で実施する必要があります。

- バックアップされた VM が静的 IP アドレスを持っていた場合、復元された VM は競合を回避するために動的 IP アドレスを持つことになる。
- Ubuntu など cloud-init ベースの Linux ディストリビューションを使用している場合、セキュリティ上の理由から、復元後にパスワードがブロックされます。 復元した VM で VMAccess 拡張機能を使用して、[パスワードをリセット](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/reset-password)してください。
-  VM でドメイン コントローラーとの関係が破損しているために復元された VM にアクセスできない場合は、下記リンクの手順に従って VM を起動します。
- 復元された VM には可用性セットがありません。 
ディスクの復元オプションを使用する場合、提供されているテンプレートまたは PowerShell を
使用してディスクから VM を作成するときに可用性セットを指定することができます。

[復元後の手順 - Azure VM の復元](https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-arm-restore-vms#post-restore-steps)

###2,ディスクの復元
こちらのオプションでは、ディスクのみが復元されます。
復元されたディスクを利用して、自由な構成のVMを後から作成することができます。
 
例えば、PowerShell を使用して Azure VM を作成する方法として、
以下の公開情報に記載のような手順を実施いただくことができます。
 
[既存の VHD を管理ディスク (Managed Disk) に変換し、VM をデプロイする](https://blogs.technet.microsoft.com/jpaztech/2017/05/01/convertvhdtomanageddiskdeployvm/)
※バックアップ対象が管理ディスクの場合にも、手順 2 に記載のサンプルコードをお役立ていただけるかと存じます。
 

###3,ディスクの置き換えについて
ディスクの置き換えオプションでは、既存の VM のディスクのみが付け替えられます。
このため、VM の設定をすべて引き継ぐことができる、最も簡単な復元方法となります。
 
VMにアタッチされていたディスクはすべてディタッチされた状態で残り、
新たに復元され作成されたディスクがアタッチされ、VM が起動します。
 
ディスクの置き換えオプションは現在管理ディスクでのみサポートされております。
その他の制限事項については以下のリンク参照願います。
 
[復元オプション - Azure VM の復元](https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-arm-restore-vms#restore-options)
*既存ディスクの置き換えは、暗号化されていないマネージド VM でサポートされています。 
非管理ディスク、汎用化された VM、またはカスタム イメージを使用して作成された VM では、サポートされていません。 

##おわりに
簡単ではありますが、Azure Backupの復元方法についてまとめたので参考にしていただければ幸いです。
![2020-01-08_11h02_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/8d44ecab-af8f-61ee-e110-89335ef3a24a.png)
`xcode-select: note: install requested for command line developer tools`あるいは`xcode-select: error: command line tools are already installed, use “Software Update” to install updates`の対処法

# TAをしていて,git clone が動かない方がいたので動かない場合の対処法を書きます.
この場合は,xcodeのせいでした.
# 環境
macos catalina 10.15
xcode 11.4


# 原因
xcode command line toolsをインストールしてもうまくいかず,xcodeのcommand line toolsのパスがおかしいことが原因でした.

# 対処法

## command line toolsをインストールする

1. 自分のmacにxcodeがない場合,インストールする(必要ないが,念の為)
2. ターミナルで“xcode-select --install”をする
3. “xcode-select: note: install requested for command line developer tools”とエラーが返る場合は,[公式サイト](https://developer.apple.com/download/more/) から自分のmacos,xcodeのバージョンに合ったcommand line toolsをダウンロードし,解凍,インストーラにしたがってインストールする


## ダウンロードしたのに変わらない場合,パスがおかしいかもしれない
“xcode-select --install”を実行したときに
“xcode-select: error: command line tools are already installed, use “Software Update” to install updates”と表示される場合,xcodeとcommand line toolsのパスがおかしい可能性があります.

## パスを確認する方法があります.
1. “xcode-select -p”を実行してみます.
2. “/Applications/Xcode.app/Contents/Developer”と表示されるとパスがこの場合よくないと考えられます.(developerツール使う場合はあるけれど)
3. “sudo xcode-select -switch /Library/Developer/CommandLineTools”を実行します.
4. 再度xcode-select -pを実行し､“/Library/Developer/CommandLineTools”と出力されれば,git cloneはできるはずです.

# 終わりに
command line tools が動かないと,brew とかgitとかコマンドラインから使うツールがいつかえなくなるようです.

# 参考資料
パスの参考にしたサイトhttps://techracho.bpsinc.jp/hachi8833/2016_09_09/25454
2021年ビッグデータ応用シーン8つまとめ

 
![luke-chesser-JKUTrJ4vK00-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/1e93f39e-1e1a-f248-1c88-5d2eef58fc99.jpeg)


 

ビッグデータによって、サービスの必要性に応じて合理的な分析レポートを実行することができます。 生成されたデータには、非構造化データ、半構造化データ、および構造化データが含まれます。これらのデータは、他の構造化データを処理するために使用されます。 利益を獲得し、将来の利益を予測するのに役立ちます。また、将来の利益を予測するのに役立ちます。ではそれらのデータはどんなシーンで応用されているのでしょうか。今回はこの記事で簡単に紹介します。

 

#1.顧客行動分析に基づく製品推奨

製品推奨は、取引顧客行動データに基づくクロスセリングです。

クロスセリングはいわゆるお客様が購入を検討している製品、またはすでに利用しているサービスに加え、別の商品やサービスも同時に買ってもらうことで顧客単価を上げるテクニックです。

製品推奨は基本的に顧客情報、取引履歴、購入プロセス、同じ製品を訪問または購入した後の行動などのデータに基づいて実行します。顧客取引行動分析によって、顧客の好みを予測し、それに相応しい製品を提案することで顧客と強い絆を結ぶことができます。

 

また製品推奨は、顧客の社会的行動分析に基づくコミュニティマーケティングです。「コミュニティマーケティング」とは、コミュニティを積極的に活用するマーケティング施策のことです。

同じブランド・製品に共通の感心を持つ人達を集めて、その特徴、趣味や好みなどのデータを分析することで、類似した行動をとるユーザーを顧客になってほしい人向けにマーケティングすることです。

顧客行動データの分析を通じて、製品推奨はより正確でカスタマイズすることができます。従来型企業は、製品推奨を実現するために以上の2つのマーケティング手段を利用することができます。例えば、大規模なeコマース企業の製品推奨システムとコミュニティネットワーク、または社内の顧客取引データ、自社のeコマースWebサイトなどの直接販売チャネル、企業コミュニティに依存して顧客行動データを収集する方法があります。

#2.顧客口コミに基づくプロダクトデザイン

顧客口コミデータには非常に大きな潜在価値があり、企業にとってプロダクトデザイン、価格設定、運用効率、顧客サービスなどを改善するための価値のデータであります。またプロダクト・イノベーションを達成するための重要なポイントでもあります。  顧客の口コミには、製品の満足度、物流効率、顧客サービスの品質などに関する有益な改善意見だけでなく、製品の外観、機能、およびパフォーマンスに関する顧客の経験と期待も含まれます。企業が製品、運用、およびサービスを改善し、顧客中心の製品革新を構築できるようにします。

#3.データ分析に基づくDSP広告

DSPは、広告出稿の費用対効果を高めたい広告主のためのサービスです。。たとえば、データプラットフォームに依存して過去に製品の購入や資料を請求したユーザーと類似した行動をとるユーザーをターゲティングして、広告配信することが出来る機能があります。広告がクリックされたポイント、回数や時間などによってリアルタイムの変更と最適化によってこれは有益なクリックを得ることができます。後ほどのパフォーマンスデータの分析、および広告のクリック期間の分析に従って、広告計画がターゲットにされます。

 

#4.コミュニティのホットスポットに基づくトレンド予測とバイラルマーケティング

コミュニティのホットトピックと検索エンジンのホットスポット分析は、人気のある傾向の予測になります。同時に、コミュニティの広範かつ急速な広がりにより、Xiaomiのバイラルマーケティングプランなど、バイラルマーケティングを通じて企業の注目を集めるのにも役立ちます。

 

#5.データ分析に基づく製品の価格設定

製品価格設定の合理性は、データのテストと分析を必要とします。主に、製品価格設定に対する顧客の感度を把握し、それを分類し、製品価格の変化に対する異なる価格感度を持つ製品グループの直接応答と許容値を測定します。これらのデータ実験を通じて、製品の価格設定の決定基準を提供できます。

 

#6.顧客行動に基づく顧客の解約予測

顧客データの分析では、顧客からの苦情が多く、顧客評価での否定的な感情があり、顧客の購入が大幅に減少していることがわかりました。

 

#7.市場動向データに基づく外部状況の分析

市場の競合他社の製品とプロモーションからのデータ、ソーシャルメディアの人々の感情（幸福）など、企業が環境の変化に対処するのを支援する外部状況の進化を予測し、市場同行の変化についていきます。

 

#8.IoTデータ分析に基づく製品ライフサイクル管理

バーコード、2次元コード、RFIDなどは製品を一意に識別でき、センサー、ウェアラブルデバイス、インテリジェントセンシング、ビデオキャプチャ、拡張現実、およびその他の技術は、製品ライフサイクル情報をリアルタイムで収集および分析できます。製品の各リンクは、製品のライフサイクル管理を実現するために、製品の使用情報を追跡および収集します。

 

ビッグデータは以上の8つの他、多くの応用シーン場面に活用されています。ビッグデータがさらに進化しつつ、ビジネス場面においてはデータ分析がますます必要となってきました。ただし、特定のWebサイトをクロールして目的のデータを取得することについて、全員が十分な知識を持っているわけではありません。このセクションでは、便利で強力なWebクロールツールを紹介して、このツールを使いこなせるようにします。

Webクロールが初めてでコーディングの知識がない場合は、強力な[**Webクロールツール**](https://www.octoparse.jp/)であるOctoparseを紹介します。

Octoparseは、さまざまなWebサイトからWebデータをすばやく収集できます。コーディングをしなくても、非常に簡単な手順でWebページを構造化されたスプレッドシートに変換できます。データ収集の需要がありましたら、ぜひ使ってみてください。

 

 

**参考記事：**

[**顧客単価を上げるアップセリング、クロスセリングとは？**](https://squareup.com/jp/ja/townsquare/what-is-up-selling-and-cross-selling)
[**今流行りのコミュニティマーケティングとは？ファンを作ってマーケティングを加速させよう！**](https://squareup.com/jp/ja/townsquare/what-is-up-selling-and-cross-selling)
Raspberry Pi3にOpenCV4をインストールする

OpenCV4.2.0をインストールする。

■環境
　- Raspberry Pi 3
　　- g++ 4.9.2
　　- Python3.4.2

■前提条件
以下をインストール済み
　- Git
　- cmake
　- GNU Make

■手順
１．メモリ確保に失敗しないようにswap領域を増やす

```Source
$ sudo nano /etc/dphys-swapfile
```

　```CONF_SWAPSIZE```を```100```から```1024```に変更する。


```Source:/etc/dphys-swapfile
CONF_SWAPSIZE=1024
```

　変更を反映する。

```Source
$ sudo /etc/init.d/dphys-swapfile restart
```

２．依存ファイルをインストールする

```Source
$ sudo apt update
$ sudo apt install build-essential cmake git pkg-config libgtk-3-dev "libcanberra-gtk*"
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
$ sudo apt install libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev opencl-headers
```

３．opencvのソースファイルをダウンロードする

```Source
$ git clone --branch 4.2.0 https://github.com/opencv/opencv.git
$ git clone --branch 4.2.0 https://github.com/opencv/opencv_contrib.git
```

４．ビルド用ディレクトリを作成する

```Source
$ mkdir <path-to-opencv>/opencv/build
$ cd <path-to-opencv>/opencv/build
```

５．設定ファイルを作成する

```Source
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D ENABLE_NEON=ON \
    -D OPENCV_EXTRA_EXE_LINKER_FLAGS=-latomic \
    -D ENABLE_VFPV3=ON \
    -D BUILD_TESTS=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D OPENCV_EXTRA_MODULES_PATH=/<path-to-opencv>/opencv_contrib/modules \
    -D BUILD_EXAMPLES=OFF ..
```

　```Configuring done```と```Generating done```と表示され、処理が正常に終了したことを確認する。

６．コンパイルする

```Source
$ make -j4
```

７．コンパイルしたファイルをinstallする

```Source
$ sudo make install
```

８．正常にインストールされたことを確認する

 - C++

```
$ pkg-config --modversion opencv4
```

```Source:Output
4.2.0
```

 - Python3

```
$ python3 -c "import cv2; print(cv2.__version__)"
```

```Source:Output
4.2.0
```


■参考リンク
How to Install OpenCV on Raspberry Pi 3
https://linuxize.com/post/how-to-install-opencv-on-raspberry-pi/
よく使う Mac Setting Command


展示用PCのセットアップによく使うコマンド集

### システム設定を閉じる

    echo "close SystemPreferences"
    killall System\ Preferences

### 隠しファイルを表示する

    echo "show HiddenFiles"
    defaults write com.apple.finder AppleShowAllFiles -boolean true

### メニューバーを自動的に隠す

    echo "hide MenuBar"
    defaults write -globalDomain _HIHideMenuBar -bool true

### Finder再起動

    killall Finder

### Dockを自動的に隠す

    echo "hide Dock"
    defaults write com.apple.dock autohide -bool true

### Dock に標準で入っている全てのアプリを消す

    echo "erase Dock's App"
	defaults write com.apple.dock persistent-apps -array

### Dock再起動

    echo "reboot Dock"
    killall Dock

### スクリーンセーバーを開始しない

    echo "do not start the screen saver"
    defaults -currentHost write com.apple.screensaver idleTime -int 0


### 壁紙変更

    echo "change the wallpaper to Solid Gray Dark.png"
    osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Solid Colors/Solid Gray Dark.png"'
    osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Solid Colors/Stone.png"'
	// High Sierra以降はパスが変わってて動かない可能性あり

### ウィンドウ復元無効化

    echo "window restoration disabled"
    defaults write -g ApplePersistenceIgnoreState YES

### スリープ無効

    echo "sleep disabled"
    sudo pmset -a displaysleep 0
    sudo pmset -a disksleep 0
    sudo pmset -a sleep 0

### 自動終了（スクリプトからだと、起動・終了どちらか一つしか設定できなかった）

    echo "set shutdown time"
    sudo pmset repeat shutdown MTWRFSU 20:00:00

### 日ごとにスケジュールを設定したい場合（こちらは複数設定可能）
    // sudo pmset schedule wake "12/30/17 12:00:00"
    // sudo pmset schedule wake "12/31/17 12:00:00"

### 起動時間・終了時間の確認

    echo "get poweron & shutdown time"
    sudo pmset -g sched


### homebrewのインストール

    echo "install homebrew"
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

### wgetのインストール

    echo "install wget"
    brew install wget

### nodebrewのインストール

    echo "install nodebrew"
    brew install nodebrew

    mkdir ~/.nodebrew
    mkdir ~/.nodebrew/src

### nodeのインストール

    echo "install node.js"
    nodebrew install-binary 6.3.0

### 通知センターを停止

	launchctl unload -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist


### アスキーアートStar Wars
	telnet towel.blinkenlights.nl