OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu1804で起動時にコマンドを実行する

# 概要
VMにMinikubeくん🐳を作った。
クラウドの課金をケチるために使わないときは落としたかった。
VMを一度落とすとMinikubeくん🐳が止まるので、起動時に自動的に立ち上げたかった。
Ubuntuさん初めてなんでお手柔らかにお願いします。


# 方法

```
crontab -e
```
初回はテキストエディターを選ぶ画面が表示される。
Ubuntuさんが声高にオススメだとおっしゃるので議論の余地なくnanoを選択。
（vi/vimみたいにi,aをせずにそのままテキスト編集、Ctrl+oで保存、Ctrl+xで終了）。


以下を追加して保存。

```
@reboot sudo minikube start --vm-driver=none
```

修正内容が正しく反映されてるかは以下。

```
crontab -l
```

ちゃんとでてくるので良さそう。

```

root@container-01:~# crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

@reboot sudo minikube start --vm-driver=none

```

再起動してみてMinikubeが立ち上がってればOK。


```
root@container-01:~# minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at <your IP>
```


Ubuntuさん、あざっした。
Minikubeくんもご苦労🐳
ちゃんちゃん。


# 参考
https://www.kompulsa.com/run-a-program-on-startup-console-on-ubuntu-18-04/
1分で分るAWSリザーブドキャッシュノード

[AWS リザーブドキャッシュノード](https://aws.amazon.com/jp/elasticache/reserved-cache-nodes/) を1分で分かるように要約します。


## リザーブドインスタンスとは？
年間契約する代わりに格安でノードを利用できるよ。

## 料金形態は？
「全額前払い」、「前払いなし」、「一部前払い」があるよ。
全額一括払いが一番お得。

## ノードタイプに設定された（軽度、中度、重度使用）って何？
利用形態に応じてよりお得になる制度。
一時的に高負荷な利用には「重要使用」。時たま使うくらいなら「軽度利用」を選択。
ただし、旧世代のノードタイプしか使用度は選択できないので注意。現行のノードタイプは重要使用しかないよ。

## 購入時に決めておくことは？
利用するリージョン、利用するノードタイプ、(旧タイプなら)使用度とノードの数、期間(１年か3年か)。
リージョンとノードタイプは変更できないよ。

## リザーブドとオンデマンドキャッシュノードを併用することは可能？
可能。
リザーブドで購入したノード以上はオンデマンドで請求されるよ。

## 既に運用しているノードをリザーブドキャッシュノードに変更することは可能？
可能。
再起動なしでOK。

## 購入方法は？
AWSコンソールのElasticCacheの「リザーブドノード」から購入可能。

## 購入後、ノードを全く利用していなくても請求されるの？
そう。


### 【参考URL】
・ [AWS再入門2018 素朴な疑問 -リザーブドインスタンス – 編](https://dev.classmethod.jp/cloud/2018-aws-re-entering-simple-question-ri/#toc-ri) 
　クラスメソッドの記事はいつも分かりやすい。

・ [AWS リザーブドキャッシュノード](https://aws.amazon.com/jp/elasticache/reserved-cache-nodes/)

・ [リザーブドノードによるコスト管理](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/reserved-nodes.html)
rubocopを導入してみよう！

kaichan　「あ〜インデント崩れをすぐに検出してくれる神様的な道具ないかな〜」
神　「(rubocopというgemがあるぞよ）」
kaichan　「はっ！！！ rubocopとかいうgemがある気がする！」

以下rubocopの導入方法を記す

まずは、開発環境に
gem 'rubocop-airbnb'
を追加する


```ruby:Gemfile
group :development do
  gem 'rubocop-airbnb'
end
```

```ruby:irb
bundle install
```
ルートディレクトリ(gemfileがある階層)に
.rubocop.yml
.rubocop_airbnb.yml
fileを追加する。

```irb_output
touch .rubocop.yml
touch .rubocop_airbnb.yml
```
※上記コマンドは実行する階層に注意してください。


.rubocop.ymlに

```ruby:.rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml
```

.rubocop_airbnb.ymlに

```ruby:.rubocop_airbnb.yml
require:
  - rubocop-airbnb
```
と記載する。

完成！

```irb_output
bundle exec rubucop
```

を実行することで書いたコードがruby style guidに沿っているかをチェックしてくれます^ ^

ーーーもしも、開発途中でrubocopを導入した場合----


神　「あれれ、上記実行したらめっちゃerror?　怒られたんだけど！！！」
神　「kaichanの説明は合ってるの？？？ぷんぷん」

そんな時は以下のコマンドを実行してください。

```irb_output
bundle exec rubocop --auto-gen-config
```
新たに
.rubocop_todo.yml
fileが作成され、.ruboop.ymlに

```ruby:.rubocop.uml
inherit_from: rubocop-todo.yml
```

と記述されます。
.rubocop_todo.ymlはrubocopを実行した時に検出されたエラーを記述しています。
そして、inherit_from: rubocop-todo.ymlはrubocopにそのエラーは無視してねって伝えます。
このようにすることで、現状のrubocopコマンド実行時に吐き出されるエラーを無視することができます。
（時間がある時に修正するなり、無視するように設定するなりしてくださいね🖤)
質問 centos7 でspyderやjupiter notebook が使えません

centos7上でanacondaから得たspyder やjupyter-notebookを起動しようとしてもエラーが生じます。 spyderでは

Traceback (most recent call last):
  File "/home/rnakano/.pyenv/versions/anaconda3-2019.03/lib/python3.7/site-packages/qtpy/QtWebEngineWidgets.py", line 22, in <module>
    from PyQt5.QtWebEngineWidgets import QWebEnginePage
ImportError: libXss.so.1: cannot open shared object file: No such file or directory

といったエラーが生じます。ここでlibXss.so.1をインストールしようとするとlibXss.so.1が利用できないというエラーが出ます。

jupyter-noteookでは起動はできるのですがプログラムを実行しようとすると表示されないままになります。shift+Enterで実行しようとしても改行されるだけです。

どなたか良いアドバイスがありましたらよろしくお願いします。

開発環境
centos7
python3.7
bash4.2
java1.8
curl7.29
git1.8
Pytorchのnn.DataParallelを使ったモデルを保存するとloadするときにエラーになる問題

PytorchはMultiGPUで学習・推論するときの便利な機能として `torch.nn.DataParallel`というモジュールを準備してくれている。
すごく楽に使えるのですが、一方でこれで学習したモデルを保存・利用する際にちょっと気をつけないと行けない点があるので忘れないうちにメモしておく。

# なぜ起こるのか？
[ここ](https://github.com/pytorch/pytorch/blob/master/torch/nn/parallel/data_parallel.py#L128
)で、 `self.module = module` が入っているので、Model構成のprefixが元のModel Classと変わるため。
ミスると下記のようなエラーが出る。

```
KeyError: 'unexpected key "module.xx.xx.weight" in state_dict'
```

# 解決策1. 保存する前に気をつける

こんな感じで `nn.DataParallel()` のクラスモジュールから元のファイルをもって来て保存する。

```python
torch.save(model.module.state_dict(), output_model_path)
```

# 解決策2. 保存したものを書き換える

もうすでに保存してしまって悲しい思いをしてしまってる方は、諦めて無理やりparameterのkeyを書き換える。

＊下記のリンクを参考
https://discuss.pytorch.org/t/solved-keyerror-unexpected-key-module-encoder-embedding-weight-in-state-dict/1686

```python
def fix_model_state_dict(state_dict):
    new_state_dict = OrderedDict()
    for k, v in state_dict.items():
        name = k
        if name.startswith('module.'):
            name = name[7:]  # remove 'module.' of dataparallel
        new_state_dict[name] = v
    return new_state_dict

# load it
state_dict = torch.load('my_model.pth')
model = MyModel()
model.load_state_dict(fix_model_state_dict(state_dict))
```
Power BI 行レベルセキュリティー (RLS) の応用編

各都道府県に営業所があり、所長、副所長、部長、課長、一般職の役職が在籍している場合以下の要件が求められる場合があります。

1. 所長は自分が所属している営業所の全データを参照したい。
2. 部長は自分が所属している営業所の、部長以下の役職のデータを参照したい。
3. 一般職は自分のデータだけ参照。

このような場合、役職や営業所などで 「階層」 を作成してあげることで、実現が可能です。

# サンプルデータ

|社員ID|アカウント|担当拠点|部署|役職|
|:----|----|----|----|----|---:|
|2001|Asan@contoso.onmicrosoft.com|名古屋|営業部・AA課|課長|
|1002|Bsan@contoso.onmicrosoft.com|名古屋|営業部・AA課|部長|
|1003|Csan@contoso.onmicrosoft.com|関東|営業部・BB課|部長|
|2004|Dsan@contoso.onmicrosoft.com|関東|営業部・BB課|課長|
|3005|Esan@contoso.onmicrosoft.com|関東|営業部・BB課|主任|
※ 社員マスタ

|日付|担当者|顧客|売上(千)|拠点|
|:----|----|----|----|---:|
|2019年5月1日|Csan@contoso.onmicrosoft.com|〇〇株式会社|500|関東|
|2019年5月1日|Asan@contoso.onmicrosoft.com|株式会社ABC|250|名古屋|
|2019年5月2日|Bsan@contoso.onmicrosoft.com|グローバル XYZ|300|名古屋|
|2019年5月3日|Dsan@contoso.onmicrosoft.com|▼▼商店|50|関東|
|2019年5月4日|Bsan@contoso.onmicrosoft.com|Contoso KK|700|名古屋|
|2019年5月5日|Csan@contoso.onmicrosoft.com|DDD 株式会社|400|関東|
|2019年5月6日|Asan@contoso.onmicrosoft.com|〇〇株式会社|300|名古屋|
|2019年5月8日|Csan@contoso.onmicrosoft.com|株式会社ABC|200|関東|
|2019年5月10日|Asan@contoso.onmicrosoft.com|グローバル XYZ|150|名古屋|
|2019年5月11日|Bsan@contoso.onmicrosoft.com|▼▼商店|400|名古屋|
|2019年5月11日|Dsan@contoso.onmicrosoft.com|Contoso KK|350|関東|
|2019年5月12日|Bsan@contoso.onmicrosoft.com|DDD 株式会社|800|名古屋|
|2019年5月13日|Csan@contoso.onmicrosoft.com|▼▼商店|50|関東|
|2019年5月15日|Asan@contoso.onmicrosoft.com|Contoso KK|500|名古屋|
|2019年5月16日|Esan@contoso.onmicrosoft.com|〇〇商店|200|名古屋|
※ 成績マスタ

# 社員マスタの加工
最初の社員マスタのままでは、階層を作成するためのデータが無いため [上司] という列を作成します。
※ 部長が一番上と設定しているので、部長の上司は空白です。
※ 上司は、自分より 1つ上の役職を設定します。

|社員ID|アカウント|担当拠点|部署|役職|上司|
|:----|----|----|----|----|----|---:|
|2001|Asan@contoso.onmicrosoft.com|名古屋|営業部・AA課|課長|1002|
|1002|Bsan@contoso.onmicrosoft.com|名古屋|営業部・AA課|部長||
|1003|Csan@contoso.onmicrosoft.com|関東|営業部・BB課|部長||
|2004|Dsan@contoso.onmicrosoft.com|関東|営業部・BB課|課長|1003|
|3005|Esan@contoso.onmicrosoft.com|関東|営業部・BB課|主任|2004|


#　役職の階層作成

社員マスタに [新しい列] にて、以下の計算式を追加します。
役職階層 = PATH([社員ID],[上司])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/d01de6ad-551b-2347-78cc-25099b6f42e3.png)
主任さんを例にすると、自分の ID が一番後ろに存在する状態です。
部長さんは、一番前且つ、自分のみ。

# ロールの計算式

ロールの管理より、名簿に対し、下記の DAX 式を追加します。

```ruby:ロールの管理
PATHCONTAINS(
'名簿1'[役職階層],
LOOKUPVALUE('名簿'[社員ID],'名簿'[アカウント],USERPRINCIPALNAME()))
```

# 結果

Dsan の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/e959a316-3484-9f1a-b727-44504f648364.png)

Bsan の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/ebdb2169-26c1-05ad-e170-fbb5bdfdd5fb.png)

Esan の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234798/3e802a74-4e47-fe49-25d7-51841a411ef0.png)

# あとがき

細かい設定については、以下リンク先を見ていただければと思います。
[Power BI 勉強帳：行レベルセキュリティ（RLS）](https://qiita.com/y-komuro/items/906331d85618908695d9 "Power BI 勉強帳：行レベルセキュリティ（RLS）")
Android Autoでオーディオ出力先がガイダンス音声になる場合

## 結論

`AudioFocus`まわりをしっかりチェックしましょう。

## この記事を書こうと思った経緯

業務で担当している音楽アプリケーションでAndroid Auto接続時の音声出力先がおかしい不具合があったのですが、ググっても類似の情報が見つからず、けっこう長い間ハマってしまったので。
結論、原因はちょっとした見落としだったのですが。

## 症状

- Android Auto実機で音楽を再生すると、音声の出力先がガイダンス音声になっている
- Android Autoアプリ・SDKのヘッドユニットでは再現しない

## 原因と解決策

`AudioFocus`の設定ミスで、`AUDIOFOCUS_GAIN_TRANSIENT`を指定していたことが原因でした。
もともと`AudioFocus`周りがおかしそう、というのは症状から推測していたのですが、意外と見落としてしまいますね。IDEの補完にまかせてちゃちゃっと書いてしまった場合などは注意したほうがよさそうです。

`AUDIOFOCUS_GAIN`を指定するように修正したら解決。
Glideのリスト表示で地図と連携表示する機能のテストが開始されました(本番リリースされてます)

GGlideのリスト表示で地図と連携表示する機能のテストがアナウンスされました。

[[INSIDERS] New feature: Map - please help us test](https://spectrum.chat/glideapps/general/insiders-new-feature-map-please-help-us-test~d1cf9790-9a12-45ed-8cca-b0de4b64264e)

早速使ってみました。

テストは、これまでと同様にstaging.heyglide.comで行われています。
ここで作成したGlideアプリは、削除される可能性がありますので、リリース用には使えません。

##スプレッドシートの作成
サンプルデータは、地図と連携するので住所が必要です。
近所の松屋の店名と住所を入れます。
![スクリーンショット 2019-06-05 16.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/0a14e459-486b-7913-fcf5-0afde2b7d815.png)
なんで松屋なのかと聞かれたけど、もう1年以上行ってないので、特に理由はないです。
妙なUIの食券機導入とセルフ化して座席配置が餌場的な殺風景になったのでもう行きません。
たまにお世話になる「かつや」にしたほうがよかったかな？

##アプリの作成
staging.heyglide.comを開いて、新規アプリを作成します。
先ほど作ったスプレッドシートを指定します。
スプレッドシートがGlideで自動的に展開されます。

リストレイアウトの中からMapを選びます。
![松屋.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/d29158fc-943a-d556-5f12-c6d2343b4934.png)
あっという間に、項目がピン表示された地図が表示されました。
![１Glide – amazing apps without code 2019-06-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/b1f434f7-2f90-3a4d-f7c1-377aef6d6e6e.png)

##Map画面の使い方
地図上のピンをタップすると、画面下に詳細が表示されます。
![２Glide – amazing apps without code 2019-06-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/f0f7ccd0-726e-4cc9-0d71-547ec0e47d63.png)

右下にリストアイコンが表示されているので、タップするとリスト表示に切り替わります。
![３Glide – amazing apps without code 2019-06-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/6e0e711d-a47a-8fbe-bcfb-e8a6811c2f88.png)

リスト画面は、通常のリストと表示並び順が違います。アイコンが右側にきています。
各項目をタップすると、これまでと同様の詳細画面に移動します。

リスト画面では、右下に地図アイコンが表示されています。
タップすると地図画面に戻ります。

現在の地図機能は、画像を貼ってあるGoogleMapsへのリンクでしたが、リストでのMap機能では地図の拡大縮小ができます。
![４Glide – amazing apps without code 2019-06-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/2ca6a9b7-12cb-c790-cb08-a30861e9902d.png)

これは便利に使えそうな機能です。
正式版への反映が待ち遠しいですね。

デフォルトのマップピンのサイズが小さいので、国道標識にまぎれて見にくいので、デカくするようにリクエスト出してみました。

## 関連ドキュメント
・[流行りのGlideでプログレアプリ(PWA)してみた](https://qiita.com/kinneko/items/548597770d93aa17c6cf)
・[プログレアプリGlideappsにchoice機能が追加されたので使ってみました](https://qiita.com/kinneko/items/99a67faa231226335ba6)
・[Glideappにコメント/チャットのメッセージ追加を通知する機能が付いたので試してみた](https://qiita.com/kinneko/items/654c2a1e6e13d9c9592c)
・[Glideappsでfav機能が評価中なので試してみた(リリースされました)](https://qiita.com/kinneko/items/d4fae3ae26d358b130ba)
・[「5分で作れる！Glideappsではじめる超簡単PWA」セッションで利用する予定のデモ動画とプレゼン資料](https://qiita.com/kinneko/items/2d15a7cb87cb17a483a7)
・[Glideで画像アップロードの機能のテストが開始されました](https://qiita.com/kinneko/items/6831572cf3cf12a4a4e3)
・[Glideのリスト表示で地図と連携表示する機能のテストが開始されました(本番リリースされてます)](https://qiita.com/kinneko/items/79e84181ab7c0bcef88d)
・[Glideで画面のリロードをさせるための対策](https://qiita.com/kinneko/items/dec896995aca30b91ec6)
Rails production 環境で public 配下の 画像 を 表示する

# 事例
public以下に画像を置いてそれをページ上に表示したい。（したい）
例えば、``test.com```というドメインであれば、
``https://test.com/image.png``で画像にアクセスできますよね。
できるはずなんですよね。できないんですよね？

# 設定
できない原因はいたってシンプルなものです。
production.rbのconfig.public_file_server.enabledをtrueにすればいいだけです。

```ruby:config/environments/production.rb
# config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.public_file_server.enabled = true
```

# まとめ
それだけです

ブログで見たい方はこちら
[Rails production 環境で public 配下の 画像 を 表示する](http://nabesys.com/article/2019/06/05686/)
これからのAndroid開発はFragmentでスクリーンを、Navigationで遷移を作るのが良さげ

久しぶりに新規のAndroidアプリを開発するので、テスト手法やアーキテクチャを改めて調べています。

Navigationという画面遷移のためのライブラリがandroidxから提供されており、チュートリアルをやってみた感じActivityを使うかFragmentを使うかという疑問が解消されたので、私見とともに公開します。
[Codelabのチュートリアル](https://codelabs.developers.google.com/codelabs/android-navigation/index.html#0) はかなり出来がよいので、実装方法はここを一通りやれば身につきます。

# 結論: 画面は基本的にFragmentで作っていく
理由はこんな感じ。

- FragmentをActivityにするのは簡単  
  Fragment1つだけ持つActivityを作るだけでよいので、既存のFragmentが再利用できる。
- Fragmentの方がNavigationとの相性がよい  
  navigation xml に activityを追加できるが、そのactivityから先の遷移はそのファイルに定義できないので、あまりactivityの数を増やすと見通しが悪くなりそう
- 遷移の構成の変更が容易  
  BottomNavigationViewからDrawerへの変更など少しの作業で実現できる
docker cp使って簡単永続化

# コンテナ内でいじったファイルを永続化するファイルを用意したい
volumesを使うには、ディレクトリ内に共有化するためのディレクトリを切ってその中にファイルを入れておくのがセオリー。今回は、そのファイルを用意する時に便利なコマンド、docker cpを覚書として記します。

## 今まで必死にコピぺってた
コンテナの中に入って、例えば、php.iniをいじった、httpd.confをいじったなどの大量の設定が書いてあるファイルの一部を変更し、その一部を永続化させたい場合、ファイルを作ってボリュームさせました。その時にコンテナにあるファイルの中身をcatさせるなり、vi使うなりして開いてテキストをコピーして、ボリュームさせるためにファイルを作ってそこにペーストして・・・というなんとも不毛な作業をやっていた。

##おお、開発者よ、docker cpを使いなさい
docker cpを使えば、コンテナ内のファイルをそのままローカルの開発環境の好きな場所へコピーすることができます。間違えやすいのが、このコマンドの最初の引数であるCONTAINER IDです。**間違ってIMAGE IDを引数にしないようにしてください。**Error: No such container:path:というエラーが出てしまいます。docker ps使えないとできないということは、コンテナとして立ち上がっている必要があるということを意味します。

CONTAINER IDはdocker psで見ることができます。

```
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0**7bf48**5f        5***b2dd4**c        "/bin/bash"         8 minutes ago       Up 8 minutes                            sleepy_northcutt
```

みたいに出てきます。これのCONTAINER　IDを引数に使います。

```
$ docker cp CONTAINER ID:コンテナ内のコピーしたいファイルまでのパス/コピーしたいファイル名 コピーしたいローカルのパス

#例
$ docker cp ****059f***24f:/usr/local/etc/php/conf.d/php.ini ./
```
こうやってコピーしたファイルを書き換えて、docker-compose.ymlにボリュームする記述をしてあげれば、

こちら実際にボリュームしたymlの一部です。

```docker-compose.yml
    volumes:
      - "./wp:/var/www/html"
      - "./src:/usr/src/development"
      - "./php-conf:/usr/local/etc/php"
```
これでOK!!

## ボリュームする際は、ボリューム先のディレクトリ構造も真似る(コピーする)
ボリュームするphp_confのディレクトリはボリューム先のコンテナ内のOSのphp_confと同じ階層構造になっていなくてはならないというのは当然なのですが、最初、自分はディレクトリに意識がいきすぎて、このphp_confの下にあるconf.dのディレクトリも別にボリュームしようとしていました。こちらです。

```docker-compose.yml
    volumes:
      - "./wp:/var/www/html"
      - "./src:/usr/src/development"
      - "./php-conf:/usr/local/etc/php"
      - "./conf.d:/usr/local/etc/php/conf.d"
```

これ、エラー出ちゃいます。わざわざローカルにconf.dを作ってその中のファイルを先にボリュームしたphp-confの中に更にボリュームしようと考えたんですね。
これよりも前に書いたphp_confのボリュームが1行になっている書き方が正解なのです。ローカルに用意したボリュームするphp_confディレクトリの中にconf.dも入れてしまってあげるんですね。**つまり、ボリューム先のOSと同じ階層構造になったボリューム用ディレクトリをローカルに用意する**のが大事なのです。
Swift UI リンク集

WWDC１９真っ只中ですね。
あとで調べるときに便利になるようにSwift UIのリンクを集めます。

* [SwiftUI | Apple Developer Documentation](https://developer.apple.com/documentation/swiftui)
* [SwiftUI Tutorials — Tutorials | Apple Developer Documentation](https://developer.apple.com/tutorials/swiftui/tutorials)
* [Creating and Combining Views — SwiftUI Tutorials | Apple Developer Documentation](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)
VirtualHostってなに？

#Virtual Hostとは
> バーチャルホスト(Virtual Host)とは1つのサーバで複数のドメインを運用する技術のことで、Webサーバ、メールサーバなどで利用される。バーチャルホストを利用すると1つのサーバコンピュータで複数のドメインを運用することができ、サーバコンピュータの数を減らし運用のコストを下げることができる。

引用元
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88

バーチャルホストは大きく分けて以下の2種類

##IPベースバーチャルホスト
1サーバーに対して複数のIPアドレスを割り当てる。
サーバーはそれぞれのドメインに紐付くIPアドレスでアプリケーションをを判別する。


##名前ベースバーチャルホスト
1サーバーに対して1IPアドレス。
IPアドレスではアプリケーションを判別できない。
アプリケーションプロトコル(HTTP,SMTP等)にアプリケーションを判別するための情報を付与する必要がある。
第６回　Raspberry Pi で監視カメラを作ろう！　～アプリの録画設定編～

Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成する[シリーズ記事](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)です。
本記事は[リンク情報システム株式会社](https://www.lis.co.jp/)の有志が作成しています。

---
前回の記事で監視カメラ映像を表示できたので、今回は映像を録画する設定について説明します。

#Raspberry Pi上に録画ファイルを保存
まずは、Raspberry Pi上に録画ファイルを保存するフォルダを用意します。
以下のコマンドは、/media/recフォルダを作成するコマンドになります。

```
$ sudo mkdir /media/rec
```

次に、監視カメラ映像配信アプリの録画設定を確認します。
設定ファイルは /etc/redbrick/onvif_setting.json になります。

```json

{
    "IdentificationName" : "raspicam",
    "IdentificationLocation" : "country/Japan",
    "DiscoveryMode" : 1,
    "Interface" : "eth0",
    "OnvifPortNo" : 9000,
    "RtspPortNo" : 8554,
    "SnapShotPortNo" : 8080,
    "RecordingPath" : "/media/rec",
    "RecordingInterval" : 300,
    "RecordingFileNum" : -1,
    "RecordingKeepSize" : 4000,
    "RecordingMode" : 1,
    "SnapShotPath" : "/var/tmp",
    "SnapShotWidth" : 640
}
```

「RecordingPath」に動画ファイルを保存するフォルダを設定します。

「RecordingInterval」に何秒毎の動画ファイルを作成するか設定します。
5分毎に分割した動画ファイルを作成する場合、設定値は 300 となります。

「RecordingMode」にプログラム起動時に録画を自動で開始するか設定します。
1を設定すると自動録画開始が有効になり、0を設定すると無効になります。
監視カメラ映像配信アプリは、Raspberry Piの起動と共に自動起動するようインストール時に設定しているので、自動録画開始を有効にするとRaspberry Piの電源を入れただけで録画が開始されるようになります。

「RecordingFileNum」に動画保存先で指定したフォルダに保存する録画ファイルの上限数を設定します。
保存しているファイル数の上限に達した場合、最も古い録画ファイルが削除されます。
-1を設定すると上限無しになり、可能な限り録画ファイルを保存します。

「RecordingKeepSize」に動画保存先で指定したストレージが維持する空き容量を設定します。
Raspberry Pi上で監視カメラ映像配信アプリ以外のアプリも動作させる等、動画ファイルでストレージを使い切らないよう空き容量を維持したい場合、本設定を変更します。
動画ファイルの合計サイズが維持する空き容量を超えた場合、最も古い録画ファイルが削除されます。
4GB空き容量を維持したい場合、設定値は 4000 となります。

設定を変更できたら、Raspberry Piを再起動します。

```
$ sudo reboot
```

再起動と共に監視カメラ映像配信アプリも自動で起動し、動画保存先で指定したフォルダに録画ファイルが作成されます。
録画ファイルの命名規則は "年月日時分秒.ts" となります。


#Windows PCから録画ファイルを参照
Windows PCからsamba経由で動画保存先で指定したフォルダに参照できるよう、/etc/samba/smb.conf に設定を追加します。

まずは、サーバーの設定として[global]セクションにユーザーレベルのセキュリティを設定します。

```
$ sudo vi /etc/samba/smb.conf
[global]
security = user
```

次に、動画保存先で指定したフォルダのセクションを作成し、設定を追加します。

```
[rec]
comment = Recording Files
path = /media/rec
read only = yes
```

設定を変更できたら、sambaを再起動します。

```
$ sudo service smbd restart
```

これでWindowsのExplorerから \\[IPアドレス]\rec と入力することで、保存した動画ファイルにアクセスできます。

---
[インデックス記事へ](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)
[第５回記事へ](https://qiita.com/lis-hanzomon/items/896342ec1af95d42db26)
[第７回記事へ](https://qiita.com/lis-hanzomon/items/6cf0f0759d7a6120a29d)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)しています！
また、お仕事のご依頼、ビジネスパートナー様も募集しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。
Dockerを使ったSpringboot/KotlinとMySQLの一番シンプルな接続方法

ローカルにあるのSpringboot/KotlinとDockerコンテナ上のMySQLを接続します。

## 環境
Docker: 18.09.2
Springboot: 2.1.5
Kotlin: 1.3.31
MySQL: 5.7.26

# docker-compose.ymlの作成
まずはMySQLのDockerコンテナをサクッと立てます。
ファイルの作成場所はプロジェクトのディレクトリ直下にしましょう。

```:docker-compose.yml
db:
  image: mysql:5.7
  ports:
    - "3306:3306"
  environment:
    MYSQL_DATABASE: sample_sql //今回はsample_sqlというdatabaseを作成します。
    MYSQL_ROOT_USER: root
    MYSQL_ROOT_PASSWORD: root

```

わかりやすくするため、最低限のことしか書いていません。

# applocation.propertiesの編集
`プロジェクト名/src/main/resources`にある`application.properties`を編集します。
作成直後は空だと思いますので、次のコードを入力しましょう。

```:application.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sample_sql
spring.datasource.username=root
spring.datasource.password=root
```

`spring.datasource.url`はどこにあるデータベースと接続するのかを指示するものです。
`jdbc:mysql://127.0.0.1:3306/sample_sql`は127.0.0.1:3306で接続しているDockerコンテナの中の`sample_sql`というデータベースを参照しています。
ここであらかじめ`sample_sql`が作成されていないとエラーが出るので注意しましょう。



## 参考文献
[docker-composeでMySQL5.7を起動して接続してみた](https://qiita.com/Manatee/items/58d0f98a15656ed65136)
[Spring Bootでデータベースに接続する](https://qiita.com/hiroshi_maz/items/b2e916144523614837a6)
[Spring Boot Reference Guide](https://docs.spring.io/spring-boot/docs/1.1.9.RELEASE/reference/htmlsingle/#boot-features-embedded-database-support)
[SpringBootからDockerコンテナのMySQLに接続する方法](https://qiita.com/Tak-Iwamoto/items/0d1e71b80a2b3d8ee7b2)
[Kotlin Webアプリケーション 新しいサーバサイドプログラミング](https://www.amazon.co.jp/Kotlin-Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E6%96%B0%E3%81%97%E3%81%84%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%95%B7%E6%BE%A4-%E5%A4%AA%E9%83%8E/dp/4865940669/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)
秘密鍵はあるのにSSH接続できなくて困った話

過去にAWS CodeCommitからSSHでリポジトリをクローンする際に自分の端末からSSH接続ができなくて困ったことがあったのですが、その理由があまりにもばかばかしかったので同じ過ちを犯さないよう残しておきます。

## 事象
途中から取引先のプロジェクトにアサインされることになったので、CodeCommitのリポジトリをSSHでクローンするよう言われたので秘密鍵をもらい、ポートがオープンになっていることを確認しうえでSSH接続をしようとすると

```
Permission denied (publickey)
```

が表示されてしまった。

## 原因と対応
SSHに関して初心者だったので訳が分からず色々調べてみたが、**どうやらもらった秘密鍵に対して公開鍵が用意されていないのが原因でした**。SSH接続するには公開鍵と秘密鍵が必要で、秘密鍵をクライアント端末に、公開鍵をサーバーに持たせなければいけません。
職場から秘密鍵をもらったのでてっきり公開鍵もサーバーに渡されているだろうと思っていたのだがそんなことはありませんでした。
ということで**もらった秘密鍵をもとに公開鍵を作成し、作成した公開鍵をサーバーにアップロードすることで解決しました**。
備忘録として手順を記載しときます

・.sshディレクトリに秘密鍵を配備する

```
# mv 【秘密鍵ファイル名】 ~/.ssh
```

・秘密鍵から公開鍵を作る

```
# ssh-keygen -y -f 【秘密鍵ファイル名】> ~/.ssh/【秘密鍵ファイル名】.pub
```

・公開鍵をIAMユーザーの認証情報→SSHパブリックキーのアップロードよりアップロードする

・.sshディレクトリにファイル「config」を作成し、configに以下を記述

```
Host git-codecommit.*.amazonaws.com
  User 【IAMユーザーに記載されているSSHキーID】
  IdentityFile 【秘密鍵のパス】(~/.ssh/【秘密鍵ファイル名】)
```

・configおよび秘密鍵の権限を変更する

```
# chmod 600 config, chmod 600 【秘密鍵ファイル名】
```

…これがないと`Permissions 0755 for '/.ssh/glocalist_prod' are too open.`と表示される

・.sshディレクトリの権限を変更する

```
# chmod 700 .ssh
```

・接続テストを行う

```
# ssh git-codecommit.ap-northeast-1.amazonaws.com
```
…成功すれば`You have successfully authenticated over SSH`が表示される
・gitコマンドよりCodeCommit上にあるプロジェクトをクローンする

```
# git clone 【クローン元のURL】 【クローン先のディレクトリ】
```

こうしてめでたくリポジトリをクローンすることができました。
PythonはLISPである

**※ ネタです**

# LISPといえば？
LISPといえばマクロ？eval？ラムダ計算？S式？

私LISP素人から見てLISPといえば`()`をたくさん書く言語だと思います。

# Pythonも`()`がたくさん書ける言語
Pythonにおける`()`はカンマが含まれる場合はタプルと認識されますが、含まれない場合は無視されます。

よって以下のようなことが可能です。

```shell:python
>>> (1,)
(1,)
>>> 1,
(1,)
>>> 1
1
>>> (1)
1
>>> ((1))
1
>>> (((1)))
1
>>> print
<built-in function print>
>>> (print)
<built-in function print>
>>> ((print))
<built-in function print>
>>> (((print)))
<built-in function print>
```

この特性を利用することで`()`をたくさん含んだ難読なプログラムを書くことができます。

```shell:python
>>> ((add)) = (((lambda x, y : ((x)) + (((y))))))
>>> ((((print)((((list)((((range)))(((int)((((add)))((str)(((int))((((True))))), (((str)))((((((int)))))(False)))))))))))))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

改行してあげると多少読みやすくなります（読みにくい）

```python:main.py
((add)) = (((lambda x, y : ((x)) + (((y))))))
((((print)
    ((((list)
        ((((range)))
            (((int)
                ((((add)))
                    ((str)(((int))((((True))))), (((str)))((((((int)))))(False)))))))))))))
```

# つまり...

```shell:python
>>> Python = '()がたくさん書ける'
>>> LISP = '()がたくさん書ける'
>>> Python == LISP
True
```
LineRendererの色が変えれないあなたへ（自分のことです）

### はじめに
* OculusGoのコントローラーにレーザーポインタ付けたら色が全然変えれなくなって慌てたのでメモ。

### 症状
* コントローラー指す方向をわかりやすくするためにレーザーポインタを付けたが、色が全然変えれなかった（マゼンダのまま）
    * 昔は気にしないで変更してたのになぁ、、、
    * LineRendererのColorはちゃんと変更してるんだけどなぁ、、、（コードで直接編集してもダメ）
    * <img width="1525" alt="line-before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44076/b2f665f0-e648-be8c-f905-8d82b8e0b600.png">


### 対応方法
* LineRendererにMaterialを追加してMaterial側で色を変更する
    * <img width="1563" alt="line-after.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44076/895ac9ba-3145-66fe-711d-11b5f37d8bdc.png">

    * 昔は、「色＝マテリアル」でくっつけてたから変わってたｗ

### 補足事項
* LineRendererのパラメータをよく見ると「Materials」の項目が、、、

### まとめ
* これ、しばらくたったらまた忘れる。。。
約数を求める

##約数を求めるコードを書いてみる
Hacker Rankを解いているうちに約数を求めないと解けない問題が出てきました。
そこで、今回はそのコードをメモ程度に載っけておきたいと思います。

```
a=[]
num=30
for i in range(1,num):
    if num%i==0:
        a.append(i)
print(a)
# 実行結果　[1, 2, 3, 5, 6, 10, 15]
```
はい、こんな感じですね。
とても簡単です。
一応説明すると、約数は元の数字を割り切れる数字のことなので、元の数字つまり、ここではnumを割った時にあまりが0になればいいわけです。
そこで

```
for i in range(1,num):
    if num%i==0:
        a.append(i)

```
こいつの登場です。
rangeを用いて今回でいうと1~numの数字をつまり1~30の数字をiに格納していき、ひたすらnum%iという処理を繰り返します。
その中で、答えが0になるものを先に作っておいたaというリストに入れていきます。
そして、最終的にprintで出力しています。


##まとめ
はい、こんな感じで、僕は約数を求めることに成功しました。
まぁ、僕が考えたわけではないですが・・・笑
しかし、この約数を求めるコードはこれからも応用していけそうなので、しっかり覚えておきます！

##参考文献
[約数のコード](https://www.kabegiwablog.com/entry/2018/06/28/100000)
AWS Application Autoscaling の Scheduled Action の cron式は意外とValidationが緩いので注意

[ルールのスケジュール式 \- Amazon CloudWatch Events](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)

本来こう書きたかった

`cron(0 12 * * ? *)`

ところを、こう書いてしまっていました

`cron(0 12 * * * ? *)`

すると、

- **毎日12時**(UTCなので日本時間で21時)

に発火してほしいアクションが

- **毎時12分**

に発火してしまっていました。

つまり

|余り??|分|時|日|月|曜日|年|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|0|12|\*|\*|\*|?|\*|

と解釈されていたと思われます。曜日か日に`?`を入れないとValidationExceptionが発生して登録できないので割としっかり書式のValidationされているのかと思いきや、意外と緩いみたい。

`cron(0 12 * * * ? * *)`

というのも登録できました。

```
aws application-autoscaling describe-scheduled-actions --service-namespace ecs
{
    "ScheduledActions": [
        {
            "ScheduledActionName": "test",
            "ScheduledActionARN": "(snip)",
            "ServiceNamespace": "ecs",
            "Schedule": "cron(0 12 * * * ? * *)",
            "ResourceId": "(snip)",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 1,
                "MaxCapacity": 2
            },
            "CreationTime": 1559715911.616
        }
    ]
}
```

この書式だとどう動くのかは検証していません...
Macのショートカット

## ←↓↑→を素早く入力したい
日本語入力にすると、以下のように入力できます。

```
zh ←
zj ↓
zk ↑
zl →
```

## 絵文字を入力したい
control + command + space を押すと、絵文字パレットが開きます。

## スクリーンショットを撮りたい
command + shift + 3 を押すと、画面全体が撮れます。
command + shift + 4 を押すと、選択した範囲でスクショを撮れます。
なお、保存先を変更するときは、以下のコマンドを使います。この例では、ユーザホーム以下の `ScreenShot` というディレクトリになります。お好みで変更してください。

```
defaults write com.apple.screencapture location ~/ScreenShot/
killall SystemUIServer
```
シェルプログラミングにおけるリダイレクション周辺

#リダイレクション周辺に関して個人的なメモ

CentOS7を用いてシェルスクリプトを書き始めて間もない自分のための記事です。
誰かの手助けになればと思います。メモなので随時忘れそうなことや気づいたことを追加していきたいです


ファイルディスクリプタ
0：標準入力(普通はキーボードからの入力)
1：標準出力(普通は端末画面の出力)
2：標準エラー(普通は端末画面への出力)


・command > /dev/null 2>&1
説明：左から右へ実行される、標準出力をゴミ箱へ、次に標準エラーを標準出力に書き込む。標準エラーもゴミ箱へ向かう。commandが標準エラーなら終了ステータスは2になる。




参考文献
Bruce Blinn　(山下哲典訳) 2016年 入門UNIXシェルプログラミング改訂第2版
pi music boxでgoogle play musicを

raspberry pi 1 B+にPi MusicBox
https://www.pimusicbox.com/
をinstallしてgoogle play musicを流せるようにしてみた。

https://github.com/pimusicbox/pimusicbox/releases
から最新のimgをdownload

最低8GBのmicroSDカードが必要。

macOSなので
https://www.balena.io/etcher/
からEtcherを入手して使用。EtcherでimgをmicroSDカードにflash。

microSDカードでRaspberry Piを起動。
有線接続しておく。

同一networkのweb clientから
http://musicbox.local
でアクセス可能となる。

settingでsshを可能にして
ipを調べてsshでlogin

rootでpasswordはmusicbox

/etc/mopidy/mopidy.conf
が設定ファイル

nanoで編集

# ----------------
# | Google Music |
# ----------------
# https://github.com/hechtus/mopidy-gmusic
# Supply your credentials to enable Google Music
# NOTE: If enabled this may slow down the start of MusicBox. Please be patient
[gmusic]
enabled = true
username = googleのアカウント（メイルアドレス形式）
password = パスワード
deviceid = 1234567890abcdef
bitrate = 320
all_access = true

デバイスidは小文字で適当に16桁のものを入れる
保存して再起動

再びsshでloginして
less /var/log/mopidy/mopidy.log
で確認すると

Invalid device_id 1234567890abcdef.Your valid device IDs are:
という箇所があり

いくつかの有効なdeviceIDが表示されるので、16桁のものを
/etc/mopidy/mopidy.conf
にコピーして保存して再起動。

これで幸せになれるか？！
Web+DB vol.110 の読書メモ

# 特集１　名前付け大全
リーダブルコードや、いろんな書籍で言われていることが書かれているのかな？と思いきや、新しい発見があるよい特集でした。

## みんなにも読んでもらいたいと思ったところ
### 1. 良い名前が持つ資質
- シンプルさ
- 名前の意味と挙動が一致している

### 2. Railsの作者DHHの意見
「完全で長い名前 vs 不完全で完結な名前」に関して、

> 「（過去に書いた）コードに戻ってきて、それが何をやっているのか正確にしれたとき、（長い名前は）バカっぽいという印象は吹き飛ぶ」

完全で長い名前が普及されて欲しいと思います。

## 新しく勉強になったところ
### 1. 対象や役割で、重要な名前のスコープを絞ろう
多くのプロジェクトでありがちだと思うけれど、OperationとかCoordinatorとかUserとか..、特に中心的なクラスになるほど、名前付けの時点で概念が広くなってしまっているクラスはないでしょうか。対策として、 **what** とか **role** で絞ってあげると、名前がよりシャープに洗練されそうです。

例
- 「管理画面の操作」であれば、Operationではなく、AdminOperation
- 「受信するユーザー」であれば、userではなく、recipient

### 2. 誤読を防ぐ冗長化対策
すでにSaveItem() という単数形のメソッドがあったとして、追加するなら後者のようにAllという単語で冗長化し、複数であることを強調して、誤読を防ぐ方法があるそうです。

- SaveItems()
- SaveAllItems()


# 特集２　高速！安全！高信頼！速習gRPC
gRPCは、Googleが長年運用してきたStubbyをOSS化した Remote Protocol Callのフレームワーク。とても便利そう。


- Windows, Linux, Macで動作
- 複数のプログラミング言語をサポート
- protobufを使用し、定義したメソッドの引数や戻り値の型、やりとりするデータおよびデータを構成するフィールドがわかるような静的型付けのデータシリアライズを行ってくれる
- HTTP/2によるストリーミング方式を基礎にしている
- マイクロサービス間の通信にピッタリ
- モバイルアプリとサーバ間の通信でも、バッテリ持ちや、データ転送量の削減などに効果あり
- ブラウザとサーバ間の通信はgrpc-webを利用して通信できる

# Rubyのウラガワ
いままで、object_idってなんだろう？と思っていましたが、ポインタの指し示す位置だということがわかりました。
素数表を使わない約数の列挙

自然数$n$に対する全ての約数を列挙します。

$O(\sqrt{n})$


$1$ から $\sqrt{n}$ をとる $i$ に対して $n := i * x$ が成り立つ $i$ と $x$ を格納します。

また、

 $n = i_k * x_k$ とおくと、 $i_k > \sqrt{n}$ の時、 $i_k$ はすでに  $\exists x_t$ $(0 \leq t < k)$ において探索されているので

 $i \leq \sqrt{n}$ まで探索すればよいことがわかります
 
```Rust:Rust
fn divisors(n: usize) -> Vec<usize> {
    let mut divisors = Vec::new();
    // n := i * x とおくと、 i が i > root(n) の時、　i はすでに ある x に探索されているから
    // i <= root(n) まで探索すればよい
    for i in 1..=(f64::sqrt(n as f64) + 1e-9) as usize {

        // i で n が割り切れた場合
        if n % i == 0 {
            // 約数リストに格納
            divisors.push(i);

            // n := i * x の x を格納。ただし x := i の時は除く
            if i != n / i {
                divisors.push(n / i);
            }
        }
    }
    divisors.sort();
    divisors
}


fn main() {
   assert_eq!(vec![1, 2, 3, 4, 6, 8, 12, 24], divisiors(24));
}

```

# 参考
[Quora](https://www.quora.com/What-is-an-efficient-algorithm-to-find-divisors-of-any-number)
[唯物是真 @Scaled_Wurm](http://sucrose.hatenablog.com/entry/2016/11/06/234635)
FessでBOXを高速に横断検索する

この記事では、[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してBOX内のファイルを横断検索する方法を紹介します。

これはFess上で実際に検索を行っている画面のスクリーンショットです。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/b3130c4d-d59f-f91f-dc56-13dd1ccc6040.png)

# 導入手順

FessでBOXを横断検索するための手順を説明します。

導入の流れは次のようになります。

1. プラグイン追加
1. Fessの起動
1. 認証設定
1. Fessの設定・クローラ実行

## 1. プラグイン追加

Fessの現バージョン(13.1.0)には、デフォルトでは含まれていない機能であるため、自分で追加する必要があります。

[ここ](http://central.maven.org/maven2/org/codelibs/fess/fess-ds-box/)からfess-ds-box-xx.x.x.jarをダウンロードします。
ダウンロードしたjarファイルは`$FESS_HOME/app/WEB-INF/lib/`に配置します。

## 2. Fessの起動

[このページ](https://fess.codelibs.org/ja/13.1/install/run.html)を参考にFessを起動します。

## 3. 認証設定

データを取得するためには、認証情報をパラメータとして与える必要があるので、そのための設定をします。

[JWTアプリケーションの設定](https://ja.developer.box.com/docs/setting-up-a-jwt-app)を参考にアプリケーションの作成と承認を行います。

設定はこんな感じ。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/3afdbe5d-5226-6fbd-a712-295c3adfd634.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/8810ee26-a312-f89c-a489-f0ce55753cd3.png)

入手したconfig.jsonは後で利用します。

## 4. Fessの設定・クローラ実行

Boxをクロールするための設定をします。
公式ドキュメントの[データストアクロール](https://fess.codelibs.org/ja/13.1/admin/dataconfig-guide.html)も参考にしてください。

### 4-1. クローラの設定

Fessの管理画面を開き、`[クローラ] > [データストア]`と移動し、新規作成をします。
新規作成画面では、

* 名前
* ハンドラ
* パラメータ
* スクリプト

の4項目を設定して、作成を完了します。

「名前」には好きな文字列を入力してください。
「ハンドラ」は`Box`を選択してください。
「パラメータ」は次のようなフォーマットで入力してください。

```
client_id=hdf*****************************
client_secret=kMN**************************
public_key_id=4t******
private_key=-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIFDj...=\n-----END ENCRYPTED PRIVATE KEY-----\n
passphrase=7ba*****************************
enterprise_id=19*******
```

キーと値は3. で入手したconfig.jsonのものと対応しています。

「スクリプト」は次のようなフォーマットで入力してください。

```
url=file.url
title=file.name
content=file.contents
mimetype=file.mimetype
filetype=file.filetype
filename=file.name
content_length=file.size
created=file.created_at
last_modified=file.modified_at
```

取得出来る値のキーと値の説明は次のようになります。
ここで言う「File」はBoxの1ファイルを指しています。

| キー | 値 |
| --- | --- |
| file.url | Fileを閲覧するリンク |
| file.contents | Fileの中身（テキスト） |
| file.mimetype | FileのMIMEタイプ |
| file.filetype | Fileの種類 |
| file.name | Fileの名前 |
| file.description | Fileの説明 |
| file.size | Fileのサイズ |
| file.created_at | Fileの作成日時 |
| file.last_modified_at | Fileの最終編集日時 |
| file.download_url | Fileのダウンロード可能なリンク |

他にも、[ファイルオブジェクト](https://ja.developer.box.com/reference#file-object)のフィールドに対応しています。

### 4-2. ジョブスケジューラの作成

4-1. で作成したクロールをクリックすると、クロール設定が開き、そこから「新しいジョブの作成」をします。

後からでも変更はできるので、とりあえず試す場合はそのままの設定で大丈夫です。
詳しい設定については、[スケジューラ](https://fess.codelibs.org/ja/13.1/admin/scheduler-guide.html)を参考にしてください。

### 4-3. クローラの実行

`[システム] > [スケジューラ]`と移動し、4-3で作成したジョブを開きます。
その画面から、「今すぐ開始」をします。

状態が「実行中」から「有効」になるまで待ちます。

### 4-4. 検索のテスト

検索フォームから適当に検索してみます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281037/b3130c4d-d59f-f91f-dc56-13dd1ccc6040.png)
Netlify+pelicanの静的コンテンツのホスティングで、Pythonのバージョンが3.6だとエラーになる。

# 前書き

NetlifyにPelicanで静的コンテンツをホスティングすること自体は、いろいろなブログやQiitaにも書かれていますので、ここでは割愛します。

# 指定できるPythonのバージョンの確認方法

[Netlifyのドキュメント](https://www.netlify.com/docs/build-settings/#python)に、以下のように書かれています。

> ・/runtime.txt may list a Python version to use from the list of versions preinstalled in your site’s selected [build image](https://www.netlify.com/docs/build-settings/#build-image-selection). Note that the syntax for this file is JUST the version number: x.y, with no trailing newline.

これによると、選択したbuild imageにインストールされているバージョンを/rumtime.txtで指定する必要があるようです。次にbuild imageについて調べます。

## build imageについて

build imageはSettingsメニューから、Build & deploy, Continuous Deploymentと辿って開いた画面の真ん中くらいにあるBuild image selectionで指定します。デフォルトではUbuntu Xenial 16.04が選択されているはずです。Ubuntu Trusty 14.04も選択が可能です。

## build imegeにインストールされているバージョン

それぞれのbuild imageにインストールされているバージョンは以下のリンク先にかかれています。

+ [Included Software: Xenial](https://github.com/netlify/build-image/blob/xenial/included_software.md)
+ [Included Software: Trusty](https://github.com/netlify/build-image/blob/trusty/included_software.md)

これによると、デフォルトで選択されているXenialのbuild imageで指定できるPythonのバージョンは以下の3種類で3.6は入っていません。ついでに他の言語を見ると、Pythonとrubyが変更されているだけで、他は変わらないみたいです。

+ 2.7
+ 3.5
+ 3.7

デフォルト、つまり/runtime.txtで指定されていない場合には、2.7が選択されるようです。/runtime.txtを作成しないで試したところ、pelicanで必要なパッケージの一つであるmore-itertoolsが古いバージョンを指定しないとエラーになりました。あきらめて/runtime.txtで3.7を指定したところ、無事にビルドに成功しました。
What's New in Xcode 11

この記事はWWDC 2019、[What's New in Xcode 11](https://developer.apple.com/videos/play/wwdc2019/401/) のセッションを聞いて、新しいXcodeの特徴をざっくりまとめたものです。NDAの関係でXcodeのスクショは載せてません。セッションスライドが公開されたら、補助的にスライドのスクショを貼る予定ではいます。

※Xcode 11 betaを動かすにはmacOS10.14.4以上、すべての機能を試すためにはbeta版Catalinaが必要なようです。

# ツール系ボタンのリニューアル

画面右上にあるボタンが追加、再編成されました。

<img width="800" alt="スクリーンショット 2019-06-23 18.40.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/b57a2c58-4e88-ebe0-3c2e-73351cd947bd.png">

このエリアでは

SwiftUIで組んだレイアウトのプレビューを見る

<img width="800" alt="スクリーンショット 2019-06-23 19.17.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/535e7a4e-ee29-76df-c88a-4d5aac3c59bb.png">

コード画面を横や縦に分割して表示する（≠タブを増やす）

<img width="800" alt="スクリーンショット 2019-06-24 9.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/6b939682-b32d-40a5-62db-9f197e97ba06.png">

minimapを表示する

<img width="818" alt="スクリーンショット 2019-06-24 9.35.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/0d31fefa-40a9-eb79-4244-e8597a82ac2b.png">

などをしたいときに触れることになります。minimapにマウスオーバーすると、メソッド名が表示されます。

# リファクタ

メソッドの引数を増やした時、Add Documentationをクリックすると、ドキュメントコメントにその定義が自動で挿入される（下では引数にduratonを追加）

<img width="800" alt="スクリーンショット 2019-06-24 9.39.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/9ee02679-e3c9-5a66-d9bf-3bbd4ce62e4a.png">
<img width="800" alt="スクリーンショット 2019-06-24 9.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/a5708dd6-b0d7-bc1d-00a4-b97d9a3994d6.png">

変数名をrenameすると、その変数を使っている部分はもちろん、ドキュメントコメント内の変数名もリファクタされる

<img width="800" alt="スクリーンショット 2019-06-24 9.41.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/36f124f3-d2e4-d2ee-cc8b-16953d5efaa3.png">

今までは変更が入ると左に青いバーが表示されるだけだったが、Show changeを選択することで、変更前と変更後が上下に並列して表示される

<img width="800" alt="スクリーンショット 2019-06-24 9.42.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/ecbc73c5-d0ec-5553-4832-256c2f03880d.png">
<img width="800" alt="スクリーンショット 2019-06-24 9.42.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/6c655c85-9661-d09a-a4e2-1791f11d3b14.png">

# Swift Packageサポート

* XcodeのPROJECTにSwift Packagesタブが登場
* Swift Package内に限定して検索を行うことが可

# その他Git関連

* Xcode上でStashができる
* Stashの差分もXcode上で確認可能
* その他History系の機能もパワーアップ

# Storyboard

* （おそらくMac対応のチェックを入れていれば）Storyboard上でプレビューにMacが選べるように
* Dark Modeのプレビューが表示できる
* SFSymbolsの選択を右ペインで設定できる
  * weight, sizeなどもGUIで設定可能
* ローカライズに応じたプレビュー表示が可能
* 例えば右ペインのImage Viewのimage欄は、今まで文字列しかプルダウンされなかったが、そこにサムネイルが表示されるようになる
* ダークモード用の画像を別で設定することができる（画像の1x, 2xのようなイメージ）
* ダークモード用にボタンの色を変えたいという場合も設定可

# デバッグ

* Xcode上のGUIをいじって、リアルタイムにアクセシビリティの設定を変更、その動作確認が行える
* ネットワーク状態、端末の温度状態を設定して動作確認が行える
* シミュレータ上でMetalの動作確認が行える
* インストルメントで把握することができる項目が増えた
気になった深層学習系のメモ

#XAI 
eXplainable Artificial Intelligence の略。
深層学習の内容がブラックボックスなので結果が何となく信頼できない。
ではその結果が出てきた理由を（AI自身が）説明できるようにしよう、という試み。

- DARPAによる概念の説明
https://www.darpa.mil/program/explainable-artificial-intelligence

- AIサービスの継続のためにXAIが使えるという意見
https://ascii.jp/elem/000/001/740/1740615/

- XAIを実現する一手法としてLIMEの実演
入力を変化させながら各層の反応をチェックしていく。
https://staka.jp/wordpress/?p=151

#GAN 
Generative Adversarial Networksの略。敵対的生成ネットワーク。
実在しないアイドルやキャラクターの画像を自動生成する事例が有名。

- iMagazineによる原理の説明
何となく理解ができる
https://www.imagazine.co.jp/gan%EF%BC%9A%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E3%80%80%EF%BD%9E%E3%80%8C%E6%95%99%E5%B8%AB/

- さらなる理解
深いところまで理解してコーディングできるようになろうよという話
https://qiita.com/triwave33/items/1890ccc71fab6cbca87e


- PaintsChainer
代表例その1。線画に自動着色。
https://paintschainer.preferred.tech/index_ja.html

- Crypko
代表例その2。アニメ風キャラクター自動生成。
https://crypko.ai/#/

#気になった理由
ソシャゲイラストの工程や画風を判別し見積もりを出してくれるサービスが話題になった。
[アートディレクターAI](https://www.itmedia.co.jp/news/articles/1904/03/news119.html
)
このサービスでは「なぜこの金額なのか？」を説明してくれる機能が備わっていていいな……と思ったため、近い技術の探索に至った。
Thunderbird のディレクトリ構成を移す方法 (VBS)

社内で Thunderbird に関してディレクトリ構造をそのまま移す必要があったため、スクリプトを作成しました。


## 指針

Thunderbird の POP3 のディレクトリ構成は、 ディレクトリごとにファイルがあります。

まず Inbox のプロパティを見ると、どこに格納されているかが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/59af4482-b1c6-548b-23fe-29f91eef556b.png)

そのフォルダ内に、サブフォルダやファイルがあり、メールフォルダを構成しています。

すごくおおざっぱにいって、拡張子なしのファイルがあればそれがフォルダです。
msf が拡張子のファイルはメールのインデックスファイルです。
最後が .sbd で終わるファイルがあればそれがサブフォルダを格納するフォルダです。

```:概念図
Inbox
|-- Subfolder1   # ファイルが存在する
`-- Subfolder2   # ファイルが存在する、sbdフォルダも存在する
 `-- Subfolder3  # ファイルが存在する
```

このファイル・フォルダ構造を、移したい先のフォルダにコピーしてやれば、同じ構造のフォルダが Thunderbird でも使えるようになります。

### 実際のフォルダの様子

#### Thunderbird

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/7fb1908b-2a9c-55a3-b96e-ec554eb208e0.png)

#### File System

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/bd64e1e0-84aa-2a01-c7ed-c71205e77f14.png)

## プログラム

そのフォルダ構成のみを移すプログラムを作成しました。

コピー元のフォルダとコピー先のフォルダを選択します。
コピー元のフォルダにあるファイル・サブフォルダを再帰的に走査して、同じ構造のファイル・サブフォルダをコピー先のフォルダに作成します。

できたファイル・サブフォルダをそのままフォルダ構造を移したい Thunderbird のフォルダに移してやれば、 Thunderbird のフォルダ構造が移ります。

msf のファイルがなくても Thunderbird が自動で作成するので、 msf ファイル は作成しません。

```vb
Dim shellObject
Dim fileSystemObject
Dim folderFrom
Dim folderTo

Set shellObject = WScript.CreateObject("Shell.Application")
Set fileSystemObject = WScript.CreateObject("Scripting.FileSystemObject")

Set folderFrom = shellObject.BrowseForFolder(0, "Please Select Original Folder", 0, "C:\")
If folderFrom Is Nothing Then
  MsgBox "Interrupted."
  WScript.Quit 1
End If

Set folderTo = shellObject.BrowseForFolder(0, "Please Select Destination Folder", 0, "C:\")
If folderTo Is Nothing Then
  MsgBox "Interrupted."
  WScript.Quit 1
End If

Set folderFrom = fileSystemObject.getFolder(folderFrom.Self.Path)
Set folderTo = fileSystemObject.getFolder(folderTo.Self.Path)

Sub createBlankFile(ByVal path)
    Dim file
    Set file = fileSystemObject.CreateTextFile(path, True)
    file.Write ""
    file.Close
End Sub

Sub copyAllComponent(ByRef folder, ByRef destinationFolder)
  Dim file
  For Each file in folder.files
    If InStr(file.name, ".") = 0 Then
      createBlankFile(destinationFolder.Path + "\" + file.name)
    End If
  Next

  Dim subfolder
  For Each subfolder in folder.subfolders
    If Right(subfolder.name, 4) = ".sbd" Then
      Dim newFolderName
      newFolderName = destinationFolder.Path + "\" + subfolder.name
      Dim newFolder
      fileSystemObject.createFolder(newFolderName)
      Set newFolder = fileSystemObject.getFolder(newFolderName)
      copyAllComponent subfolder, newFolder
    End If
  Next
End Sub

copyAllComponent folderFrom, folderTo

Set folderFrom = Nothing
Set folderTo = Nothing
Set shellObject = Nothing
Set fileSystemObject = Nothing
```
iPadOSのSafariはmacOSのSafariと区別できない可能性が高い

WWDC 2019でiPadOSが発表されました。iPadOSのSafariはdesktop-browsing classのブラウジングを実現すると謳っているのが気になり、ベータ版のiPadOSのUserAgentを確認しました。

iPadOSのSafariのUserAgent

> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

OS部分がMac OS X 10_15となっており、macOSと区別するのが不可能な状況のようです。
危惧していた通り、Apple主導でiPadでのブラウジングをPCと同じようにするとなったら、そうなりますよね・・・。

しかし、外部の会社とiPhone、iPadにはアプリでしかサービス提供しないといった契約しているサービスの場合、これって大問題ですよね。
「iOS」ではなく「iPadOS」なので別契約ですって話になるんでしょうか。
まあ、元々UserAgentの偽装問題はあったと思うので、今さらかもしれませんが・・・

なんらか判別方法をご存じの方はご教授いただきたいです。
CloudFront と ALB 適用済みの WordPress サイトにおいて、IP アドレスによって所定の EC2 インスタンスへリクエストを振り分ける

# ０．はじめに

先日、以下の対応を行なって、

* [CloudFront や ALB 適用済みの WordPress サイトにおいて、新しいバージョンの AMIMOTO AMI \(Amazon Linux\) へのリプレースをしてみる。 \- Qiita](https://qiita.com/kusokamayarou/items/41cc5f994a4efc1d6620)

その後、どういう風に検証すればいいのかなぁ、と思っていたんですが、

調べたところ、ALB で IP アドレス毎にターゲットグループへの振り分けが、(なんとか…)できるみたいだったので、試してみました。

　
こちらの記事が非常に参考になりました。

* [CloudFront→ELB→EC2構成におけるIPアドレスのアクセス制御 \- GeekFactory](https://int128.hatenablog.com/entry/2017/09/13/143702)

ありがとうございました！

🙇‍♂️

# １． 新しいターゲットグループの作成 と 所定の EC2 インスタンスの追加

1.  以下の記事の手順を参考にして、新しいターゲットグループを作成します。
    * [CloudFront 適用済みの WordPress サイトに ALB を適用後、ALB \- WordPress 間を HTTP\(80番\) で通信させてみる \- Qiita](https://qiita.com/kusokamayarou/items/edffa0f1159f60a2ce82#%EF%BC%92http80-%E7%94%A8%E3%81%AE-alb-%E3%81%AE%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
1.  新しいターゲットグループに、所定の EC2 インスタンスをターゲットとして追加します。

# ２． ALB のリスナーのルールの変更

1.  以下のサイトから、自身の端末の IP アドレスを確認します。
    * [あなたの IPv6 をテストしましょう。](https://test-ipv6.com/index.html.ja_JP)
    * ![FireShot Capture 126 - あなたの IPv6 をテストしましょう。 - test-ipv6.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/02c70e6e-b8a8-0822-fa30-7ce85a75a87e.png)
1.  以下の ALB のコンソールへアクセスし、所定の ALB を選択します。
    * [ロードバランサー \| EC2 Management Console](https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers:)
1.  「リスナー」タブを選択し、「ルールの表示/編集」リンクからルールの編集を行います。
<br><br>
1.  以下の設定を参考に、ルールを必要な数分追加します。
    * IF
        * HTTP ヘッダー : 
            * `X-Forwarded-For`
                * `*XXX.XXX.XXX.XXX*` ※ IPv4 の場合
                * `*XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX*` ※ IPv6 の場合
        * ホスト :
            * ※ 所定のホスト ex) ~~~~.com
    * THEN
        * 転送先
            * ※新しく作成したターゲットグループ ex) XXXX-ALB-Routing-HTTP-New
    * ![FireShot Capture 128 - ルール - EC2 Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/919ff69e-1e38-6659-0be3-b7360fc42a02.png)
    * ※ 参考
        * [Application Load Balancer のリスナールール \- Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-update-rules.html)

# ３． 実際にブラウザからアクセスして、想定どおりに振り分けが行われているかの確認

1.  以下の記事を参考にして、nginx のアクセスログで確認します。
    * [ELB経由のnginxでアクセス元IPアドレスをアクセスログの$remote\_addrとして書くようにする \- Qiita](https://qiita.com/toshihirock/items/1de2613bb7c95d486dc1)
    * [remote\_addrとかx\-forwarded\-forとかx\-real\-ipとか \- Carpe Diem](https://christina04.hatenablog.com/entry/2016/10/25/190000)

# ９９．ハマりポイント

* そこまでではないですが…。
<br><br>
* ALB のリスナーのルールの設定で、HTTP ヘッダーの X-Forwarded-For の値の設定がちょっとわからなかったです…。
* 正規表現がどこまで使えるのか？など。
* 実際に、今回の設定は微妙に厳密ではないので、その点ご注意下さい。

# ＸＸ．まとめ

検証とか、どうしようかな…。

と思っていて、

CloudFront とかも含めた、検証環境を構築するのとか、メンドイ…。

と思っていて、

何とか、この方法でブルーグリーン出来そうなので、良かったです。

ご参考になれば♪
Firefox なら、Web ページ全体のスクリーンショットがもっと簡単に取れる

ページ全体のスクリーンショットを導入したのはChromeより、Firefoxのほうが先なはず。


## 開発者ツールを使わない

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63338/14d70885-88fa-e356-70b1-08df3617b7a6.png)


↓

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63338/afa22464-cca8-d0cd-4088-2fe55f6b28e0.png)


## 開発者ツール

右クリックから

<img width="569" alt="スクリーンショット 2019-06-05 14.41.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63338/4242f2e0-a5db-4dd7-922d-13b8acb12992.png">
「下書き→限定公開→Qiitaに投稿」でURLがどう変わるかを見る

ブログをwiki的に使おうと思うと、既存の記事内のキーワードをリンク化してから書きたいという要求が発生する。そこで、下書き記事にリンクを貼る方法を検討してみようと思う。

```
新規作成中のURL
https://qiita.com/drafts/7485b68b20f6c2897821/edit#

下書きのURL
https://qiita.com/drafts/7485b68b20f6c2897821

限定公開のURL
https://qiita.com/shirofune9876/private/7485b68b20f6c2897821

Qiitaに公開のURL
https://qiita.com/shirofune9876/items/7485b68b20f6c2897821

(おまけ)ユーザIDを変更したあとのURL
https://qiita.com/_shirofune9876_/items/7485b68b20f6c2897821
```

URLにユーザIDが入っていたので、ユーザIDの変更でどうなるか？も試してみた。
限定公開とは、URLを知っている人なら見れるという機能で、どのユーザが見れる見れないを決める認可設定はなさそうだった。

## 結論
1. 公開中の記事から下書き中の記事にリンクしたいのであれば、限定公開で公開して、リンクを`[記事名](略/private/略)`と記述する。
2. その後に、公開したら`private`を`items`に書き換えればよい

## 思ったこと
下書き、限定公開、公開記事、このどれもが同じ記事というリソースを指しているつもりであり、その記事のステータスが変更されている感覚であったので、ルーティングが変更になるのは少し驚いた。これはどういう意図があるのだろう？
SSIS メールが届かないとき



## メールのセットアップ

SQL Server Management Studio 
管理 > データベースメール を右クリックして、データベース メールの構成を選択

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/80249259-88d1-5ffe-ffc9-585c810dd3fc.png)


プロファイル名は任意でOK、下の例では SQL Server Agent と入力

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/ec905af9-2503-999d-66a9-99b8a74d3f0d.png)



## メールプロファイルのチェック

SQL Server エージェントを右クリック →　プロパティを表示

警告システムにて、メールプロファイルを有効にする。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/7a2bea3b-dabb-0c2e-43e3-b4ba7a08fedc.png)





## 参考
[SQL Server エージェントのジョブ失敗時に E メールを送信する （Gmail の SMTP 使用） - SQL Server 入門](https://sql55.com/column/send-email-from-sql-server-agent-on-job-failures.php)
elmの開発環境を整備する

# はじめに

elm関連のツールに関してまとまっていないことが多いので備忘録兼ねて紹介します
この記事の対象になりそうなのは以下の人たちです

- elm使い始めの人
- elmをもっと効率よく書きたい人
- 細かい環境設定方法がなくてもドキュメントを読んで設定できる人


# インストールするツール

- [elm](https://elm-lang.org/)
  - elmのランタイム
- [atom](https://atom.io/)
  - エディタです。vscodeではなくatomです。
- [universal ctag](https://github.com/universal-ctags)
  - 関数一覧を表示するのに使用します
- [Node.js](https://nodejs.org/ja/)
  - npmで色々便利なモジュールをインストールするのに使います

# インストールするnpmモジュール

- elm-format
  - コードのスタイルを公式スタイルにしてくれます

```
npm install -g elm-format
```

- elm-test
  - elmのユニットテストを実行できるようにしてくれます

```
npm install -g elm-test
```

- create-elm-app
  - elmのプロジェクトを作ってくれます

```
npm install -g create-elm-app
```

# インストールするatom拡張

- elmjutsu
  - 最強のelm拡張です。これがあるとないとでは大違いです
- language-elm
  - atomの拡張機能からインストールすると古いコード用になってしまうので以下コマンドでインストールします

```
apm install ymtszw/language-elm
```

- elm-format
  - npmのelm-formatを実行できるようにしてくれます
- symbols-tree-view
  - ctagで検出した関数一覧を表示できるようにします

# その他

- [kbsymanz/ctags-elm](https://github.com/kbsymanz/ctags-elm)
  - elm用のctagを生成するための定義ファイルです