OmniAICreator/Qiita-1.07M huggingface dataset:
【UiPath】RPA実行中にユーザーからのパソコン操作を無効にする方法

![unnamed (1).png](https://qiita-image-store.s3.amazonaws.com/0/378130/94eadda1-c92e-dc06-b2e9-1ee2ee267383.png)

## 基本、RPAでは動作中PCいじるの禁止
RPAの基本的なルールに**「RPA実行中／動作中にパソコンをいじらない」**という大原則があります。

これは、RPAでクリック動作やキーボード入力操作をしているにもかかわらず、マニュアル操作が行われることで、ロボットがエラーを起こしたり、予期せぬ動作をしたりするためです。



**インシデントの原因として非常によく上がるヒューマンエラー**となります。

通常、運用中のルールとして「RPA稼働中にPCをいじるな」と徹底することで運用回避することが多くなっています。



しかし、これを絶対的に回避する策はないでしょうか。


## 専用の公式アクティビティが登場！
一つのソリューションとして、UiPathには**「ユーザー入力をブロック（BlockUserInput）」**アクティビティが存在します。



このアクティビティはExcelアプリケーションスコープ（Excel Application Scope）などと同様の範囲アクティビティとなっており、
このアクティビティスコープ内でのみマウスやキーボードの操作を無効化します。



なお「プロパティ－入力－ブロック」には「All / Keyboard / Mouse」の選択肢があり、
それぞれ「すべての操作 / キーボードのみ / マウスのみ」操作を無効化することができます。


## ただし、注意点もアリ！
このアクティビティには実装するうえで**重大な注意点**があります。

それは、**メッセージボックス（Message Box）アクティビティなど、タイムアウトしないアクティビティを利用すると永遠に操作不能に陥る可能性がある**ことです。



そもそも、このアクティビティの終了条件は、「ブロック解除のショートカットキーを入力する」または「ブロックがタイムアウトする」または「ブロック範囲内のアクティビティがすべて完了する」ことのみです。

しかし、上記のようなアクティビティにはタイムアウトがありません。

従って、表示されているメッセージなども全く操作できないし、誰かがショートカットキーを入力するまで永遠に操作を受け付けない状態となってしまいます。

![unnamed (2).png](https://qiita-image-store.s3.amazonaws.com/0/378130/d9444745-639b-170d-4418-829b6873cef4.png)

このシナリオを見てください。

「ユーザー入力をブロックアクティビティ」内でメッセージボックスを出しています。

これを実行すると、Alt + F10を押すまでの間、以下のメッセージボックスが出たまま何の操作もできない状態が永遠に続きます。

![unnamed (3).png](https://qiita-image-store.s3.amazonaws.com/0/378130/e9447181-a7d0-b4bc-6a8b-e603c42f7fba.png)

ユーザーがショートカットキーを知らなかったら……考えると恐ろしいですね。

また、動作の考え方を分かりやすくするため、以下のシナリオもご覧ください。

![unnamed (4).png](https://qiita-image-store.s3.amazonaws.com/0/378130/48966ae9-7e52-b58b-8168-a2449e996c3c.png)

先にも述べた通り、「ユーザー入力をブロックアクティビティ」はそのスコープ内でのみ有効となります。

従って、このシナリオを実行すると、ログに「1」「2」と表示される間、全く操作ができません。

その後、**設定した「ユーザー入力をブロックアクティビティ」のタイムアウト時間を待つことなく**操作が可能となった状態で待機し、「3」と表示されることなります。



想定される使い道として、絶対にマニュアル操作で誤作動をさせたくない場面（送金などの業務を扱う場面など）でごく一部に限り使用できるかもしれませんが、
実務的にはあまり頻繁に使いたくはないアクティビティであるように思えました。



なお、本アクティビティはUiPath 2018.3バージョンから導入されたばかりのアクティビティであり、
それ以前のバージョンでは利用できませんのでご注意ください。

## 参考リンク
RPAコンサルティング合同会社 - 【UiPath】ユーザー入力ブロックについて
https://www.rpacons.com/blog/tech/BlockUserInput

UiPath Activitiesガイド
https://activities.uipath.com/lang-ja/docs/block-user-input
Django チュートリアル: 地域図書館ウェブサイト　（その３）

こちらで作成したページの続きです。
[Django チュートリアル: 地域図書館ウェブサイト　（その２）](https://qiita.com/ekzemplaro/items/bdb06eb48524455ea5f9)

作者の一覧と、作者の詳細ページを作成します。

1) catalog/urls.py の編集

```py:catalog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
    path('book/<int:pk>', views.BookDetailView.as_view(), name='book-detail'),
    path('authors/', views.AuthorListView.as_view(), name='authors'), # 追加
    path('author/<int:pk>', views.AuthorDetailView.as_view(), name='author-detai
l'), # 追加
]
```

2) catalog/views.py の追加

```py:catalog/views.py
（省略）
class AuthorListView(generic.ListView):
    model = Author

class AuthorDetailView(generic.DetailView):
    model = Author
```

3) html の作成

```html:catalog/templates/catalog/author_list.html
{% extends "catalog/base_generic.html" %}

{% block content %}
  <h1>Author List</h1>
  {% if author_list %}
  <ul>
    {% for author in author_list %}
      <li>
        <a href="{{ author.get_absolute_url }}">
	{{ author.last_name }} {{author.first_name}}</a>
      </li>
    {% endfor %}
  </ul>
  {% else %}
    <p>There are no authors in the library.</p>
  {% endif %}       
{% endblock %}
```

```html:catalog/templates/catalog/author_detail.html
{% extends "catalog/base_generic.html" %}

{% block content %}
  <h1>Title: {{ author.last_name }} {{ author.first_name }}</h1>
<!--
  <p><strong>Author:</strong> <a href="">{{ book.author }}</a></p> <!-- author detail link not yet defined -->
  <p><strong>Summary:</strong> {{ book.summary }}</p>
-->
  <p><strong>Last Name:</strong> {{ author.last_name }}</p> 
  <p><strong>First Name:</strong> {{ author.first_name }}</p>  
  <p>生年月日: {{ author.date_of_birth }}</p> 
  <p>没年月日: {{ author.date_of_death }}</p> 

  <div style="margin-left:20px;margin-top:20px">

  </div>
{% endblock %}
```

4) catalog/templates/catalog/base_generic.html の修正

```html:catalog/templates/catalog/base_generic.html
（省略）
        <ul class="sidebar-nav">
          <li><a href="{% url 'index' %}">Home</a></li>
          <li><a href="{% url 'books' %}">All books</a></li>
          <li><a href="{% url 'authors' %}"">All authors</a></li>
        </ul>
（省略）
```

5) catalog/templates/catalog/book_detail.html の修正

```html:catalog/templates/catalog/book_detail.html
{% extends "catalog/base_generic.html" %}

{% block content %}
  <h1>Title: {{ book.title }}</h1>

  <p><strong>Author:</strong> <a href="{% url 'author-detail' book.author.pk %}"
>{{ book.author }}</a></p>
（省略）
```

6) 開発サーバーを動かして http://127.0.0.1:8000/ にアクセス

作者の一覧
![author_aa.png](https://qiita-image-store.s3.amazonaws.com/0/179446/11ac9ecd-7a0c-a0cd-c818-2690719c53fa.png)

作者の詳細
![author_bb.png](https://qiita-image-store.s3.amazonaws.com/0/179446/a22f3ec8-29e6-50d4-3c10-370b91180709.png)

本の詳細のページから、作者の詳細にリンク
![author_cc.png](https://qiita-image-store.s3.amazonaws.com/0/179446/145b793c-0bc2-3a59-9f8f-9a991f12a48c.png)
Let's Encryptをマルチドメインで導入したWindows Server 2008 R2を再起動したらSSLでアクセスが出来なくなった話

# 概要
自社内で公開しているサーバに対してLet's EncryptでマルチドメインのSSLをかけて公開していました。
先日、野暮用でサーバを再起動したところ、SSLでアクセスすると `サーバに接続できませんでした` と表示が出て、全くアクセスできなくなって困ったので、その際の対応メモ。

# 前提条件
- Windows Server 2008 R2
- IIS 7.5
- Let's Encrypt（win-acme v1.9.12.0）
- SSLはSAN（マルチドメイン証明書）

# 試したこと
1. 特に設定は変えず、Let's Encryptで証明書を更新　…　上手く行かず
2. 一度全てのバインドを外して、証明書を更新　…　コレもダメ（というかバインドされない…）
3. バインドコマンドを流してみる　…　何故かバインドコマンドがおかしいと怒られる
    1. バインドコマンド　→　`appcmd set site /site.name:"Default Web Site" /+bingings:'https://example.com:443'`
4. `applicationHost.config` を探して、バインド設定をいじり、IISを再起動
    1. &lt;configuration&gt; / &lt;system.applicationHost&gt;　/ &lt;sites&gt; / &lt;bindings&gt; タグ内にバインド設定を追加
    2. 追加するタグは　→　`<binding protocol="https" bindingInformation="xxx.xxx.xxx.xxx:443:example.com" />`
    3. SSLを追加するサイト分バインドを追加したら、IISを再起動
    4. 上手く表示された！

# そもそも、なぜこんな事が起きた？
原因は特定できておらず、イベントログを見てもそれらしきログは皆無でした。
IIS自体、エラーログは全てイベントログに吐き出されるから見づらいったらありゃしない（アクセスログはファイルなのに…）。

もし同様の事で解決したことがある方がいらっしゃれば、お知恵をお貸しいただけると幸いです。
AWS WAFのログをKinesis Firehoseを使ってS3に保存するときの注意点

AWS WAFのブロックしたログは、直近のものであればAWSのコンソール上からでも確認できるが、直近のログしか表示されない上に件数も限られているため、何らか調査の必要がある場合等には向かない。
全件のログを取得するには、あらかじめロギングの設定をしておく必要がある。
これには、Kinesis Firehoseを利用してS3バケットにログを貯めておくのが一般的。

この時にいくつかハマったポイント。

## Firehoseのストリーム名は"aws-waf-logs-"で始まっている必要がある
ロギングの設定は、AWS WAFの設定画面の"Logging"のタブから行えるが、設定するFirehoseを選択する画面にはストリーム名が"aws-waf-logs-"から始まるものしか選択肢に出てこない。設定画面にも注意書きがある。

# FirehoseはWAFが設定されているリージョンと同一のリージョンで設定する
WAFをグローバルで設定している場合は、Firehoseはバージニア北部のリージョンで設定すること。東京リージョン等でFirehoseを設定してもWAFの設定画面で選択肢に現れない。
studiooneで作った曲をmidi保存して、musescoreに入れる

備忘、

studiooneで曲を作った

midiとして出力：「名前を付けて保存」→拡張子を変更
なんかmidiではないトラック（外部音源を取り込んだトラック）は自動的に無視される

musescore起動

「開く」→さっきのmidiファイルを開く

ドラムのトラックだけ、下のほうのインポートのチェックを外して、適用→保存

次にドラムのトラックだけチェックを入れて適用→ctrl+A→ctrl+C

次にドラムのトラックだけチェックを外して、「編集」→「楽器」でドラムの行を追加する

そこにペースト

他の楽器についてもそうしたいならそうすべきなのかもしれない
Elixir: 再帰の末尾呼び出し最適化について

gumi TECH Blog「[Elixir入門 09: 再帰](https://dev.to/gumi/elixir-09--1a0p)」は、Elixirの再帰によるループについて解説しています。本稿は、[再帰の末尾呼び出し最適化](https://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0#%E6%9C%AB%E5%B0%BE%E5%91%BC%E5%87%BA%E3%81%97%E6%9C%80%E9%81%A9%E5%8C%96)について補います。


# 再帰呼び出しのコード例
前出「Elixir入門 09」の「reduceとmapのアルゴリズム」の項には、リスト要素をすべて2乗するつぎのようなコード例が示されています。再帰呼び出しの組み立てを知るには、わかりやすい例です。

```elixir
defmodule Sum do
  def square([]), do: []
  def square([head | tail]), do:
    [head * head | square(tail)]
end
```

```elixir
iex> Sum.square([1, 2, 3, 4])
[1, 4, 9, 16]
```

ただ、このコードには無駄があります。最後に再帰呼び出しした関数から戻り値を受け取るまで、リストがつくれないことです。上の例では、処理がつぎのように進みます。

```elixir
Sum.square([1, 2, 3, 4])
[1 * 1 | Sum.square([2, 3, 4])]
[1 | [2 * 2 | Sum.square([3, 4])]]
[1 | [4 | [3 * 3 | Sum.square([4])]]]
[1 | [4 | [9 | [4 * 4 | Sum.square([])]]]]
```

最後の戻り値を得て、ようやくリストが確定するわけです。

```elixir
[1 | [4 | [9 | [16 | []]]]]
[1 | [4 | [9 | [16]]]]
[1 | [4 | [9 , 16]]]
[1 | [4 , 9 , 16]]
[1, 4 , 9 , 16]
```


# 再帰の末尾呼出しを最適化する
関数の最後の処理で再帰呼び出しすることは「[末尾再帰](https://ja.wikipedia.org/wiki/末尾再帰)」と呼ばれます。その戻り値を待たずに済めば、処理が最適化できるでしょう。そのためには、処理をあとの関数に任せてしまえばよいのです。

つぎのように、表立つ関数(`Sum.square/1`)を起き、内部的(`defp`)には引数(`accumulator`)をひとつ増やします。このリストに自分までの処理を加えて、再帰呼び出しする関数に渡してしまうのです。

```elixir
defmodule Sum do
  def square(list), do: square(list, [])
  defp square([], accumulator), do: accumulator
  defp square([head | tail], accumulator), do:
    square(tail, [head * head | accumulator])
end
```

こうすれば、戻り値を待つことなく、リストは逐次組み立てられます。再帰呼び出しの関数に渡される引数の変化は、つぎのとおりです。

```elixir
Sum.square([1, 2, 3, 4])
[2 , 3 , 4], [1 * 1 | []]
[3 , 4], [2 * 2 | [1]]
[4], [3 * 3 | [4, 1]]
[], [4 * 4 | [9, 4, 1]]
[16, 9, 4, 1]
```

ただし、お気づきのように順序が逆です。最後に、[`Enum.reverse/1`](https://hexdocs.pm/elixir/Enum.html#reverse/1)でもとに戻しましょう。

```elixir
defmodule Sum do
  def square(list), do: Enum.reverse(square(list, []))
  defp square([], accumulator), do: accumulator
  defp square([head | tail], accumulator), do:
    square(tail, [head * head | accumulator])
end
```

[追記] 戻り値を呼び出しもとが待つ場合には、スタックに戻り先の情報をもちます。再帰が深くなりすぎてしまうと、スタックオーバーフローになりかねません。待たずに済むようにすれば、仮想マシンは現在のスタックフレームをすみやかに削除してくれます。これは、コンパイラによって行われる最適化です。

また、[`Enum.reverse/1`](https://hexdocs.pm/elixir/Enum.html#reverse/1)が呼び出すErlangの[`lists:reverse/2`](http://erlang.org/doc/man/lists.html#reverse-2)は、組み込み関数([BIF](http://erlang.org/doc/reference_manual/functions.html#built-in-functions--bifs-))としてCで書かれている処理の速い関数です。


#### 参考
「[Myth: Tail-Recursive Functions are Much Faster Than Recursive Functions](http://erlang.org/doc/efficiency_guide/myths.html#myth--tail-recursive-functions-are-much-faster-----than-recursive-functions)」
「[Memory Usage in Recursion](http://erlang.org/doc/efficiency_guide/functions.html#memory-usage-in-recursion)」
「[[erlang-questions] Tail call optimization](http://erlang.org/pipermail/erlang-questions/2016-October/090663.html)」
【Linux】コマンドラインからデスクトップへ通知させる

ターミナルにて実行

```
osascript -e 'display notification "お知らせです" with title "タイトル" subtitle "サブタイトル"'
```

# こんなかんじ
<img width="458" alt="macbook_notice.png" src="https://qiita-image-store.s3.amazonaws.com/0/377231/fa505090-9554-d221-0542-4819ed46406e.png">

# 環境
・Mac
OAuth2.0 Scopeの本質について

![スクリーンショット 2019-03-15 15.05.16.png](https://qiita-image-store.s3.amazonaws.com/0/189613/9938713c-fbe2-9998-c01b-0b4f8965a447.png)


Scopeは委任の場合のみ役割を果たし、ユーザーに代わってアプリができることを制限するので、Scopeはユーザーができること以上のことをアプリケーションができるようにはしません。Scopeを使用可能な範囲以上に拡張することはできますが、どこにでもいる無邪気な語り口で説得しようとする説明に反して、簡単でも普通でもありません。
(つづく)

##この続きは、以下のAuth0ブログで解説しております。
[Auth0ブログ：OAuth 2.0 Scopeの本質について](https://auth0.com/blog/jp-on-the-nature-of-oauth2-scopes/)



# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したOAuth 2.0 Scope以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
homebrewでインストールしたパッケージの確認

自分用の備忘録
#lsコマンド
ターミナルで

```
ls /usr/local/Cellar/
```
#listコマンド
homebrewのlistコマンドを使った方法もある.自分の環境では出力結果はlsと同じになった.

```
brew list
```
勤怠打刻をmacアドレス検知方式に変えた話

##概要
今働いている会社では勤怠管理システムに自社開発製のrailsアプリケーションを使っています。
出入り口にfelicaにて打刻可能なPC端末を置いているので社員はそれにカードを出退勤の時間にピッとやります。
そこで取得した出退勤データを定期的に勤怠管理システムへ投げてるわけですが、打刻可能なPC端末が壊れました( ´ ▽ ` )

一応ブラウザからなら勤怠管理システムから打刻できますが、さすがにめんどくさいし、不満がめちゃ出たので何かしら対策が必要ということで、別の方法を提案。

###ローカルネットワークのMacアドレス検知する。

社内にある何かしらの端末で下記で作成したシェルをバッチで実行し、同一ローカルネットワークのmacアドレスと最初の接続時刻と最終接続時刻をCSVに書き込んでいきます。

 - attendance_list$DATE.csv　・・・　出力結果を保存するCSV
 - member_list.csv　・・・　メンバーID,name,マックアドレスが入ったCSV

```member_list.csv
id,name,mac_address
0,Aさん,00:cc:47:aa:7f:ff
1,Bさん,2c:bb:a1:cc:41:aa
2,Cさん,38:bb:2c:cc:3c:aa
3,Dさん,00:bb:fe:cc:20:aa
4,Eさん,08:e6:89:cc:de:aa
```

ここではmember_listに記載してあるMacアドレスだけを読み取ってますが、member_list作らずとりあえず全て読み取って、サーバ側で名寄せした方がいいと思います。
日の区切りに関しては会社ごとに違うと思いますので、考慮してCSVファイルを分けて作ると良いと思います。

```
#!/bin/sh
echo "START check_mac_address connecting wi-fi"
cd /app/dir
TIME=`date "+%H%M"`
DATE=`date "+%Y%m%d"`
EXPORT_CSV="./attendance_list$DATE.csv"
MEMBER_LIST_CSV='./member_list.csv'
ADDRESS_SCANS=`echo 'PASSWORD' | sudo -S /usr/local/bin/arp-scan -l --interface en0`
if [ -f ./$EXPORT_CSV ] ;then
    echo 'There is a test file.'
else
    touch $EXPORT_CSV
fi
RECORD_SCANS=`cat $EXPORT_CSV`
while read row; do
    USER_ID=`echo ${row} | cut -d , -f 1`
    USER_NAME=`echo ${row} | cut -d , -f 2`
    MAC_ADDRESS=`echo ${row} | cut -d , -f 3`
    if echo $ADDRESS_SCANS | grep $MAC_ADDRESS >/dev/null ; then
        if ! echo $RECORD_SCANS | grep $MAC_ADDRESS >/dev/null ; then ##初めて認識した時刻
            echo "出勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME" >> $EXPORT_CSV
            echo "退勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME" >> $EXPORT_CSV
        elif echo $RECORD_SCANS | grep "退勤:$MAC_ADDRESS" >/dev/null ; then ##二回目以降の時刻:随時上書きしていく
            sed -i -e "s/.*退勤:$MAC_ADDRESS.*/退勤:$MAC_ADDRESS:$TIME:$USER_ID:$USER_NAME/" $EXPORT_CSV
        fi
    fi
done < $MEMBER_LIST_CSV
echo "END check_mac_address connecting wi-fi"
```

###Macアドレスと社員を紐づける。
・勤怠サーバのメンバーテーブルにmacアドレスのカラムを追加して、管理者のみその項目を編集可能にする。
・上記のattendance_list.csvを勤怠サーバが取得して、社員とmacアドレスの紐付けを行い、勤怠時間を取得します。


###打刻された時刻を通知する。
・勤怠システムにアクセスすれば誰でも閲覧できるが、打刻時刻を通知して欲しいという要望があるならばchat系のAPIを使って通知したり、メールを送信してもよいでしょう。今回は要望なかったのでやりませんでした。


###直行や直帰や休憩の取り扱い
直行直帰の手動申請機能が勤怠サーバある場合、多くは問題ないでしょう。
手動申請によって上書きできない仕様なのであれば注意が必要ですね。
休憩に関しては最終時刻を取得してるので関係なし。

##まとめ
これのメリットは
打刻の手間がなくなり、いつまでも無駄話して会社にいるような居残りが減ること。
結構簡単でしたので、皆さんも上長へ提案してみてくださいね。
初心者が学習するSQL（DMLの構文）#pert3

# データの操作（DML）


#### データの登録

- INSERT文

```ruby:ターミナル
INSERT INTO テーブル名 VALUES（値１,値２,値３）; #全てのカラムに値を入れる場合。

INSERT INTO テーブル名（カラム１,カラム２) VALUES（値１,値２）; #特定のカラムに値を入れる場合。
```

#### データの更新

- UPDATE文

```ruby:ターミナル
UPDATE テーブル名 SET 変更内容 WHERE 条件;
#例えば UPDATE comments SET text = "hello!" WHERE id = 2;
#これでid=2のtextカラムがhello!に変更される。
```

#### データの削除

- DELETE文

```ruby:ターミナル
DELETE FROM テーブル名 WHERE 条件; 
#例えば DELETE FROM goods WHERE id = 2;
#id=2のレコードが削除される。
```


# 基本的な検索の構文


#### 検索するテーブルを指定する。
- FROM句

```ruby:ターミナル
FROM テーブル名; #テーブルの指定。
```

#### 取得するカラムを指定する。
- SELECT句

※SELECT句にはワイルドカード(*)というのがある。
※ワイルドカードとはメソッドのようなもので文字の代わりとして使うことができる記号。
※アスタリスク(*)の意味は全て取得という意味。

```ruby:ターミナル
SELECT カラム名; #取得するカラム名の指定。
SELECT *; #全てのカラムを取得。
```
SELECT句はカラムの指定のため、テーブルもセットで指定しておかなければいけない。
よって、SELECT句とFROM句は一緒に記述する。


#### 取得するレコードを制限する。
- WHERE句
 
※WHERE句では比較演算子や論理演算子を使用することができる。
※WHERE句は単体では使用できないのでSELECT句やFROM句と一緒に使用する。

```ruby:ターミナル
SELECT * FROM テーブル名 WHERE 条件;
#例えば SELECT * FROM goods WHERE name = "ペン";
#nameカラムにペンとデータが入っているものを取得する。
```

#### 論理演算子を使用して検索
- AND演算子

AND演算子は複数の条件を指定することができ、その条件が全て正であるとき式は正となる。

```ruby:ターミナル
SELECT * FROM users WHERE age <= 22 AND prefecture = "神奈川県";
#これでusersテーブルの中の２２歳以下で、出身が神奈川県のユーザーが取得できる。
```

- OR演算子

OR演算子は複数の条件を指定することができ、その条件のいずれかが正であるとき式は正となる。

```ruby:ターミナル
SELECT * FROM users WHERE age = 20 OR prefecture = "東京都";
#usersテーブルの２０歳もしくは東京都出身のユーザーを取得できる。
```

- NOT演算子

NOT演算子は一つの条件を指定して式を作り、条件が誤となる(当てはまらない)ものを取得する。

```ruby:ターミナル
SELECT * FROM users WHERE NOT prefecture = "神奈川県";
#出身が神奈川県でないユーザーを全て取得する。
```



## 他の便利な検索条件の指定方法
### 単一カラムの範囲検索 

```ruby:ターミナル
SELECT * FROM users WHERE age <= 22 AND age >= 20;
#ageカラムのデータが２０歳以上２２歳以下のユーザーを取得する。
```

上記でageを２回書いてしまっているので、冗長。
これを解決するには.......

- BETWEEN演算子

BETWEEN演算子は一つのカラムに対し上限下限を指定して式を作り、カラムの値がその範囲に含まれる時に取得することができる。

```ruby:ターミナル
SELECT * FROM users WHERE カラム名 BETWEEN 下限 AND 上限;
```

### 単一カラムのリスト検索

- IN演算子


```ruby:ターミナル
SELECT * FROM users WHERE カラム名 IN(値１,値２,...);
#これで指定したカラムの値が両方取得できる。
```
Juliaでt検定

[Rをはじめよう 生命科学のためのRStudio入門](https://www.yodosha.co.jp/yodobook/book/9784758120951/index.html)のデータセット（[ここ](http://r4all.org/books/datasets/)にある）を使って､ｔ検定をやるJuliaコード。データを読み込み､図で結論を予想し、検定し､図を仕上げる。コードや出力の説明などは[技術書典６](https://techbookfest.org/event/tbf06)(2019/04/14)で頒布予定。

```compensation.jl
using CSV, Gadfly, DataFrames, DataFramesMeta, Statistics, HypothesisTests, Fontconfig, Cairo

# データの読み込みと形式の確認、要約統計量の表示、箱ヒゲ図のプロット
dat = CSV.read("datasets/compensation.csv", allowmissing=:none)
describe(dat)
draw(PDF("fig/compensation_1.pdf", 10cm, 8cm),
     hstack(plot(dat, x = :Grazing, y = :Fruit, Geom.boxplot),
            plot(dat, x = :Grazing, y = :Root,  Geom.boxplot)))

# データ点も入れた箱ヒゲ図
# 後に置いた layer から絵が描かれるようなので、Geom.boxplot を先に置くと
# Geom.point が箱に隠れて見えなくなる
draw(PDF("fig/compensation_2.pdf", 10cm, 8cm),
     hstack(plot(dat, layer(x = "Grazing", y = "Fruit", Geom.point),
                      layer(x = "Grazing", y = "Fruit", Geom.boxplot,
                           Theme(default_color=colorant"red"))),
           plot(dat, layer(x = "Grazing", y = "Root", Geom.point),
                     layer(x = "Grazing", y = "Root", Geom.boxplot,
                           Theme(default_color=colorant"red")))))

# ｔ検定のために、Grazing の値によって dat を二つに分ける
datG = @linq dat |> where(:Grazing .== "Grazed") |>
                    select(:Root, :Fruit, :Grazing)
datU = @linq dat |> where(:Grazing .== "Ungrazed") |>
                    select(:Root, :Fruit, :Grazing)
describe(datG)
describe(datU)

# 全体の散布図
draw(PDF("fig/compensation_3.pdf", 10cm, 8cm),
     plot(dat, x="Root", y="Fruit", color="Grazing", Geom.point))

# 要約統計量
# Grazing の内容ごとに群に分け、各変数で平均と分散を計算する
# ３群ｘ２変数ｘ平均と分散が表示される
by(dat, :Grazing, :Root => mean, :Root => var, :Fruit => mean, :Fruit => var)


# パラメトリック検定をやってよさそうかどうか、ヒストグラムで見てみる
draw(PDF("fig/compensation_4.pdf", 10cm, 8cm),
     plot(dat, ygroup = :Grazing, x = :Fruit,
          Geom.subplot_grid(Geom.histogram(bincount = 15))))

# Grazed と Ungrazed の平均値の差を検定、等分散と非等分散、収穫量と台木直径
EqualVarianceTTest(datG[:, :Fruit], datU[:, :Fruit])
UnequalVarianceTTest(datG[:, :Fruit], datU[:, :Fruit])

# 散布図その２ https://qiita.com/Nabetani/items/ab8601f02176d63bc9e2
# 、プロットの色を選んで、ラベルも日本語にする
# 対話的に操作している時はラベルに日本語が使えるが、スクリプトを直接読み込ませて
# 実行すると、日本語の部分でエラーになる
draw(PDF("fig/compensation_5.pdf", 10cm, 8cm),
     plot(dat, x = :Root, y = :Fruit, color = :Grazing,
          Guide.title("リンゴの幹の太さと収穫量"),
          Guide.xlabel("台木直径"), Guide.ylabel("収穫量")))
```
CentOSでvimを7→8にバージョンアップする


# したかったこと
vimのバージョンが7くらいだった
`:terminal` が使ってみたかったのでvimをバージョンアップする

# したこと

## 必要なもののインストール
```
$ sudo yum update -y
```
ますyumのアップデート
今回は最新だったからコマンド打っても何も起きなかった

```
$ sudo yum install yum-utils
```

これいるのかなぁ（他サイトからひぱってきてよくわからずに打った）

```
$ sudo yum-builddep vim
```

これもよくわかんない

```
$ sudo yum install -y git gcc ncurses-devel
```

これは必要らしくていれた

## githubから最新vimのソースファイル取得
```
$ git clone https://github.com/vim/vim.git
```

全然応答返ってこない！
とおもったら、会社のPCからだったのでプロキシで引っかかっていた模様。

プロキシの情報を社内の情シスから聞いて、

```
HTTP_PROXY=http://プロキシ名:ポート番号
export HTTP_PROXY
HTTPS_PROXY=https://プロキシ名:ポート番号
export HTTPS_PROXY
```

上記をたたいて、もう一回git cloneしたらいけた！

## vimをビルド＆インストール

```
$ cd ~/vim
$ make
$ sudo make install
```

すんなり

## バージョン確認
```
$ vim --version
```

ちゃんと8系になってた！わーい

# 留意点
* vimを一回消して、もう一回入れる方法もある
* が、vimが消えると依存関係のあるsudoが使えない
* 依存関係問題難しそうだから、あんまり削除する方法はよくなさそう
Juliaでカイ二乗検定

[Rをはじめよう 生命科学のためのRStudio入門](https://www.yodosha.co.jp/yodobook/book/9784758120951/index.html)のデータセット（[ここ](http://r4all.org/books/datasets/)にある）を使って､カイ二乗検定をやるJuliaコード。データを読み込み､図で結論を予想し、検定し､図を仕上げる。コードの説明などは[技術書典６](https://techbookfest.org/event/tbf06)(2019/04/14)で頒布予定。

```Julia:ladybird.jl
using CSV, Gadfly, DataFrames, DataFramesMeta, Statistics, HypothesisTests, Cairo, Fontconfig

# データを読み込んで、表の形式を確認
dat = CSV.read("datasets/ladybirds_morph_colour.csv")

describe(dat) # 要約統計量
by(dat, :Habitat, :number => mean) # 平均値、地域ごと
by(dat, [:Habitat, :morph_colour], lady = :number => sum) # 個体数
by(dat, [:Habitat, :morph_colour], lady = :number => mean) # 平均値、地域、色別
by(dat, [:Habitat, :morph_colour], lady = :number => var) # 分散

# データの様子を図で見てみる
draw(PDF("fig/ladybird_1.pdf", 10cm, 8cm),
     plot(dat, y = :number, Geom.bar))
draw(PDF("fig/ladybird_2.pdf", 10cm, 8cm),
     plot(dat, x = :morph_colour, y = :number, Geom.bar))

# グループごとにまとめた棒グラフ
draw(PDF("fig/ladybird_3.pdf", 10cm, 8cm),
     plot(dat, xgroup = :Habitat, x = :morph_colour, y = :number,
               color = :morph_colour,
               Scale.y_continuous(minvalue = 0),
               Geom.subplot_grid(Geom.bar())))

# 2x2分割表：Habitat x morph_colour = 2x2 で４通りの組み合わせに
# ついててんとう虫の個体数を合計し、合計値のカラム名は lady にする
# ここでは表（行列の形式）にはせず、４次元のベクトルのまま
cont = by(dat, [:Habitat, :morph_colour], lady = :number => sum)

# カイ二乗検定：ベクトルのまま渡すと違う計算が行われてｐ値も変わるので
# reshape() で行列の形にして ChisqTest() に渡す
res = ChisqTest(reshape(cont[:, :lady], 2, 2))

# きれいでわかりやすいプロットを作る
# きれいでわかりやすいプロットを作る
draw(PDF("fig/ladybird_4.pdf", 10cm, 9cm),
     plot(dat, xgroup = :Habitat, x = :morph_colour, y = :number,
               color = :morph_colour,
               Scale.color_discrete_manual("black", "red"),
               Scale.y_continuous(minvalue = 0),
               Guide.ylabel("観測された個体数"),
               Guide.title("住むところ別の各色の天道虫の数"),
               Geom.subplot_grid(Geom.bar())))
```
Power BI アイコン変わっちゃった事件

##20190308遅ればせながら2月Updateをインストールしてみた。
なんだかバタバタしていて、2月のUpdateのインストールが遅れてしまった・・・・。
そろそろせねばと思い、いつものように、
https://powerbi.microsoft.com/ja-jp/
にアクセスし、
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/221359/650b458b-f1d0-8d8e-828b-2f2f1c76ce0a.png)
「Power BI Desktop」をクリックして、黄色い「無料ダウンロード」をクリック。

いつもならインストールファイルがDLされるのだが、何故かストアが開く。
変わったんだな・・・と思ってそのままインストール。

なかなか新機能をお試ししたりする時間が取れないのだけど、とりあえず最新バージョンをインストールしておくことに意義がある！
ITからはバージョン固定とか腐ったこと言われているけど(※)そんなん知ったことか！

インストールが完了した瞬間、**デスクトップに置いていたpbixファイルのアイコンが一気に変わった感じ**がした。前のアイコンはうろ覚えだけど、とにかく変わったのだ。

「なんかアイコン変わった！！」
と思い、とあるユーザーグループに「アイコン変わりませんでした？？」とポストしてみたのだけど、「変わった変わった！！」みたいな反応は特になし・・・・。もしかしたら空目かも・・・。



※うちの会社でPower BIを導入した際に導入PJで作成したレポートは、作成したバージョン(2017年6月バージョン)でないとサポートしないということになっているのです・・・・

##20190312OracleDBへの接続ができない
夕方ごろにとあるレポートを修正しようと思って、pbixファイルを開いて「クエリを編集」をポチっとなしたら、OracleDBに接続しているクエリが、呪いのようにすべて黄色い三角になっている。（あんまりあわあわしすぎてスクショとか全然とったりする余裕なし）
エラーメッセージは**「オブジェクト参照がオブジェクト インスタンスに設定されていません。」**げげ、こんなの見たことない。

最初、自分のPCのOracleのクライアント設定がおかしくなったのかと思って、ITに見てもらったけど、問題ない。「なんか入れた？？」「いやいや何も。」しらばっくれるわたし。

ただこの時点では、新規ファイルからなら接続可能だったので、最悪詳細エディターからクエリとコピペして作り直せばいいかと思っていた。

##20190314ホワイトデー、そして一気に解決へ
休みを挟んでpbixファイルを新規から作り直そうとしたら、なんと症状は進んでいて、今度は新規からもOracleDBに接続できない！！
やばい、やばすぎる！

もしかしてもしかしてもしかすると、Power BI Desktopの最新バージョンと、ゲートウェイのバージョンが合わないのでは？？
ゲートウェイはグローバルITの管理下なのでどうにもできないし、バージョン固定と言われているから口が裂けてもバージョンUpしてくれとか言えない・・・・
そうすると今後一切レポートの修正ができないばかりか、新規レポートが作成できない・・・・どうしようどうしようどうしよう・・・・。

悶々と自分の進退まで覚悟していると、とあるユーザー会のわたしがポストした「アイコン変わった」投稿に、
「アイコンが変わったかどうか確認したら、アイコンは変わってないけど、自分のPCのアイコンが古いものに差し変わってた」というリプライが。

旧![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/221359/11be293d-7f3d-51d1-d29f-61f50ae4919c.png)　新![キャプチャ.3PNG.PNG](https://qiita-image-store.s3.amazonaws.com/0/221359/7168f2a2-bac4-6f77-f3b7-97858c9c6ce6.png)

***ああああああ！！***

わたしのもだ！アイコン新しくなったと思ったら、古いのに先祖返りしてたのか！
「再インストールしたら直りました」
とのことだったので、早速現実逃避してわたしも再インストール。

先週と同じように
https://powerbi.microsoft.com/ja-jp/desktop/
このページの黄色い「無料でダウンロード」をクリックすると、ストアが開いて無情にも「インストール済みです」の表示。
なので、黄色い「無料でダウンロード」の下の「高度なダウンロードオプション」をクリックしてみると、インストーラーDLできた！

インストーラーを起動すると、「既存のPower BI Desktopを削除しますか？」的なメッセージが。そうそう、削除してちょうだい。次へ、次へ、完了。

・・・・・アイコン元に戻らず。

フーム。
それならば完全にアンインストールして、再起動してからインストールしてみよう。
コントロールパネルからアンインストールの上、再起動。デスクトップのpbixのアイコンはまっしろおばけちゃん。よしよし。
この状態でインストーラーを起動、次へ次へで完了すると・・・・・**戻った、戻ったよ！！！**

そして、なんだか虫の知らせがしたような気がして、くだんのpbixファイルを開いてみると・・・・**呪われた黄色い三角が消えてる！！！！**


##事件まとめ
というわけで、ほとんどの方にはまったく「だから何」的な話かと思うのですが、もしかしてもしかして、同じ悩みを抱えている方がいらっしゃったら・・・・

・アイコンが古いものに変わったら、それは呪いの予兆・・・

・一度Power BI Desktopをコントロールパネルからアンインストールして、再起動

・ストア経由ではなく、インストーラーをDLしてインストールしてみよう。もしかしたら呪いが消えてくれるかも。


もしかしたら、あなたのアイコンもいつの間にか古くなっているかも・・・・
Server-Sent Events でリアルタイムWebアプリケーションを作成する

![スクリーンショット 2019-03-15 14.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/189613/6a78723f-6e0c-857a-f7c5-1bf40e2564b1.png)

Server-Sent Events (SSE) は Web サーバーがリアルタイムのデータをクライアントにプッシュするできるようにする標準技術です。このブログでは、 React と Node.js でフライト時間表示アプリケーションを構築して、この標準をどのように使用するかについて学んでいきます。ただし、ここで学ぶチュートリアルのコンセプトは、どんなプログラミング言語やテクノロジにも適用が可能です。この [GitHub レポジトリ] (https://github.com/andychiare/server-sent-events)でアプリケーションの最新コードを見つけることもできます。

(つづく)

##この続きは、以下のAuth0ブログで解説しております。
[Server-Sent EventsでリアルタイムWebアプリケーションを作成する](https://auth0.com/blog/jp-developing-real-time-web-applications-with-server-sent-events/)



# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したNode.jsやReact以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
【PL/SQL】SELECT結果でUPDATEする(UPDATE SELECT)

#SELECT結果でUPDATEする(UPDATE SELECT)
##やりたいこと
SELECT結果をUPDATE文に使用します。
UPDATE文の基本的な構成は以下のように、
**[更新対象列名]=[値]**
となりますが、この値にSELECT結果を使用するイメージとなります。
データの新規登録の場合は下記を参照してください。
[【PL/SQL】SELECT結果でINSERTする(INSERT SELECT)](https://qiita.com/t-kikuchi/items/4a6eb4dc453d3f427557)

```SQL:
UPDATE {テーブル}
SET {列1} = 値1
   ,{列2} = 値2
WHERE {条件};
```

##コード
以下の例ではSELECT結果を2つの項目にUPDATEしています。
組み合わせによっては、様々な情報を取得してUPDATEに使用できます。

```SQL
--SELECTした結果でUPDATEする
UPDATE emp_mst
SET (address,add_no) = 
    (SELECT address,add_no 
     FROM addno 
     WHERE add_no = '111-1111')
WHERE emp_cd = 'A001';
```
情報処理安全確保支援士 平成30年度春 午後2問2

#設問1
**(1) 攻撃に使われる文字列がPOSTデータ内に含まれている場合**
表1No.2に脆弱性Kの存在、攻撃手法Kのことが記載してあります。
この文からわかることは攻撃手法KはHTTPリクエストを用いた攻撃であることです。
その攻撃によるアクセスはサーバXが標準設定の場合ログに残らないとも記載があります。
ログが残らない攻撃として平成30年度春 午後2問1でもDOM型XSSが問題として上がりましたが、今回は攻撃者自身がHTTPリクエストを送信しているため違いそうです。
考えられるのはPOSTを利用した通信です。
GETの場合リクエストをURLの末尾に追記します。(ID、パスワードの入力なら、id=username&password=passのように)
そのため、URLのパラメータを黙視できます。Cookieも例外ではないため、セッションハイジャックの攻撃に繋がります。
しかし、POSTを利用したリクエストの場合、ボディ部(Cookieはhiddenフィールド)にリクエストを格納するため、URLを見ただけでは確認できず、ログにも残りません。
ログに残るのはアクセスしたURLのみです。

設問に関係ないですが注意したいのがPOSTを利用すると完全にデータが見えなくなるわけでは無い点。
通信の盗聴を行えば、普通に内容は見えます。

**(2) WebサイトYの全ファイルとの比較**
WebサイトXと同じシステム構成であるWebサイトYは表1No.5を確認すると外部からのアクセスは無く、改ざん痕跡もなかったとあるため、改ざんがあったかどうかはWebサイトYと比較すればよさそうです。


**(3) 公開鍵認証方式**
teratermでsshをするときはチャレンジレスポンス認証等もあるが、IPA的に？はSSHではパスワード認証方式と公開鍵認証方式の2種類がある、と認識しておけば良いのでしょうか。
基本情報技術者試験 平成26年度午後問1でも明言されている。

#設問2
**・Webサイトで利用しているOS、ミドルウェア及びWFの名称並びにそれぞれのバージョン情報**
効率的に脆弱性情報の収集を行うため、Webサイト担当者に何を提供させるのか。
それはシステム情報です。組織が利用していないOSやミドルウェアの脆弱性情報を収集しても意味がなく、無駄ですよね。
それよりもサイトごとで利用しているOSやミドルウェアを管理しておけば、それに関する脆弱性情報をすることは効率的であると言えます。

#設問3
**c：ディレクトリ d：クロスサイト e：HTTP g：ジャッキング**
・ディレクトリトラバーサル
「../]などを利用して、ユーザには公開されていないディレクトリにアクセスする攻撃。
対策はサーバでのアクセス権限の見直しや、「/」や「../」等の文字列が含まれていないかチェックし、エラー処理を行う設定にする。

・クロスサイトリクエストフォージュリ
利用者の意図しないリクエストがWebブラウザからWebサーバに送信され、ログイン中の利用者を装い、Webサイトの機能が勝手に実行されたりする攻撃
対策は長くなるので関連知識で紹介します。

・HTTPヘッダインジェクション
以下のサイトが非常に参考になりました。
[HTTPヘッダ・インジェクションの対策まとめ](https://www.shadan-kun.com/blog/measure/2674/)

・クリックジャッキング
Webページのコンテンツ上に透明化した標的サイトのコンテンツを配置し、利用者が気づかないうちに標的サイト上で不正操作を実行する攻撃で、視覚的に利用者をだます。
対策はHTTPレスポンスヘッダにX-FRAME-OPTIONヘッダを出力すること。

#設問4
**(1) g：30 h：0** 
これはSQLインジェクションでどのような攻撃構文がわからない方でもわかった問題だと思います。(筆者もわかりません)
表4No.3のkeywordの値はbagで、該当商品数は30になっています。
bagしか指定されていないため、bagの出品合計数は30個で想像がつきます。
表4No.1の「g」はkeywordが**bag**であり(and)、**1が1('1'='1')**だった場合という条件ですが、条件的には揃っており、表4No.3と変わらないため、**30**です。
また、「h」はkeywordが**bag**であり(and)、**1が2('1'='2')**だった場合という条件になり、条件が揃わないため表示結果は0件になります。
SQLインジェクションの対策はエスケープ処理またはプレースホルダです。
・エスケープ処理：利用者の入力した値がプログラムとして意味を持つ文字列な場合、意味の無い文字列に変換する
・プレースホルダ：利用者の入力した値がプログラムとして意味を持つ文字列な場合、ただの文字列として処理する

**(2) i：イ**
飛ばします。

**(3) j：(う)の操作を実行するときに、codeの値を限定商品の値に書き替える**
(ウ)の脆弱性は、一般会員が有料会員限定の商品を購入できてしまうことです。
設問に「画面遷移を指定して」とあるため、(あ)~(え)のどれかを使用します。
まず、表3(ウ)の検出箇所は「商品画面一覧からの遷移」とあり、限定商品一覧も含め(う)か(え)に絞れます。
しかし、今回は一般会員が有料会員限定の商品を購入できるという脆弱性であるため、一般会員の見ている商品画面一覧である(う)だとわかります。
次に表2の(う)と(え)を確認すると、画面遷移のURLはどちらとも同じで、POSTデータで送信しているcodeだけが異なります。
そのため、codeを限定商品に書き換えさえしてしまえば一般会員でも限定商品が購入できてしまいます。

**(4) k：権限が異なる複数の**
**　　l：許可されている操作の違い**
「k」の直前に「アクセス制御の不備や認可制御の欠落を確認する」とあり、様々な権限をもったアカウントで、その権限通りの操作しかできないかを確認します。

#設問5
**・作業の妥当性を確認できる詳細なレビュー記録を委託先が提出していること**
セキュリティガイドラインに沿って開発が行われているか確認するため、各工程でレビューを行っています。
これを確認するにはレビューで使用した資料や議事録等を提出してもらえればその妥当性というのは、わかると思います。

#設問6
**・脆弱性の作り込み原因を調査して、注意すべきポイントを追加する。**
問題が漠然としています。
しかし、今回A社は問題が発生した都度、セキュリティガイドラインを更新しています。
(今回ガイドラインを更新することになった問題点は、ガイドライン第1版が抽象的でわかりづらいこと、P社の確認不足)
そのため、脆弱性が発見された都度、その原因の調査を行いセキュリティガイドラインへ追加、更新していけばいいと考えることもできます。
DOMOでデータを集約してデータセットを作ってみたら早かった

#概要と経緯
BIツールのDOMOでデータセットを作成する際、データが億単位まで達すると生成するのに多くの時間(1億レコードで3〜４時間)を要する上、カードを作ってもフィルターをかけたり、表示期間を変更すると表示が非常に遅くなります。そこで現在はレコード数が大きいデータに関してはクエリで集約してデータセットを作るようにしています。

##集約するとしないのを比較検証
集約なしクエリ

```sql
SELECT
"jst_date"
,"user_id"
FROM
"access_hist"
```

集約ありクエリ

```sql
SELECT
"jst_date"
,COUNT("user_id") as user_cnt
FROM
"access_hist"
GROUP BY
"jst_date"
```

##結果
<img width="1210" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/369945/d5a11303-adbd-8288-cf49-94addc68a46e.png">

###集約すると処理時間はおよそ半分になりました！！
よく見るとData Outputで97万レコードと169レコードで大きな差があります。
Data Outputを少なくすることでDOMOの処理時間を大幅に減らせることがわかりました。

実際普段の仕事で使っているデータセットは２億レコードくらいあり、
集約をする前は処理に３時間かかっていたところ、集約をすると１時間ちょいで完了することができました。
Django チュートリアル: 地域図書館ウェブサイト　（その２）

こちらで作成したページの続きです。
[Django チュートリアル: 地域図書館ウェブサイト](https://qiita.com/ekzemplaro/items/f6ee7339ea3af8868d4e)
蔵書の一覧と、本の詳細ページを作成します。
[Django Tutorial Part 6: Generic list and detail views](https://developer.mozilla.org/ja/docs/Learn/Server-side/Django/Generic_views) の操作です。

1) catalog/urls.py の編集

```py:catalog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'), # 追加
    path('book/<int:pk>', views.BookDetailView.as_view(), name='book-detail'), # 追加
]
```

2) catalog/views.py の追加

```py:catalog/views.py
from django.views import generic

class BookListView(generic.ListView):
    model = Book

class BookDetailView(generic.DetailView):
    model = Book
```

3) html の作成

```html:catalog/templates/catalog/book_list.html
{% extends "catalog/base_generic.html" %}

{% block content %}
  <h1>Book List</h1>
  {% if book_list %}
  <ul>
    {% for book in book_list %}
      <li>
        <a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
      </li>
    {% endfor %}
  </ul>
  {% else %}
    <p>There are no books in the library.</p>
  {% endif %}       
{% endblock %}
```

```html:catalog/templates/catalog/book_detail.html 
{% extends "catalog/base_generic.html" %}

{% block content %}
  <h1>Title: {{ book.title }}</h1>

  <p><strong>Author:</strong> <a href="">{{ book.author }}</a></p> <!-- author detail link not yet defined -->
  <p><strong>Summary:</strong> {{ book.summary }}</p>
  <p><strong>ISBN:</strong> {{ book.isbn }}</p> 
  <p><strong>Language:</strong> {{ book.language }}</p>  
  <p><strong>Genre:</strong> {% for genre in book.genre.all %} {{ genre }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>  

  <div style="margin-left:20px;margin-top:20px">
    <h4>Copies</h4>

    {% for copy in book.bookinstance_set.all %}
      <hr>
      <p class="{% if copy.status == 'a' %}text-success{% elif copy.status == 'm' %}text-danger{% else %}text-warning{% endif %}">{{ copy.get_status_display }}</p>
      {% if copy.status != 'a' %}
        <p><strong>Due to be returned:</strong> {{copy.due_back}}</p>
      {% endif %}
      <p><strong>Imprint:</strong> {{copy.imprint}}</p>
      <p class="text-muted"><strong>Id:</strong> {{copy.id}}</p>
    {% endfor %}
  </div>
{% endblock %}
```

4) catalog/templates/catalog/base_generic.html の修正

```html:catalog/templates/catalog/base_generic.html
（省略）
<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="{% url 'books' %}">All books</a></li>
<li><a href="">All authors</a></li>
（省略）
```

5) 開発サーバーを動かして  http://127.0.0.1:8000/ にアクセス

一覧ページ
![books_aa.png](https://qiita-image-store.s3.amazonaws.com/0/179446/7b6b4822-ffe9-05f0-fd25-d4c90afa8097.png)

詳細ページ
![books_bb.png](https://qiita-image-store.s3.amazonaws.com/0/179446/a027542e-ad5f-f757-a772-532ab899486f.png)
AE　特定のスピードで任意の文字列を順に表示していく。

#今回やりたかったこと

①テキスト「012345678A0123456789ABCDEF」を順番に表示していく。
②テキスト開始の文字はランダム
③変化するタイミングは同じ速度だが、開始時間は微妙に違うようにする。

#完成したものはこれ
カーニング問題はとりあえず置いておいて(笑)
多分カーニングはどうにもならないから一文字づつやるのが良さそう。
![コンポ 1.gif](https://qiita-image-store.s3.amazonaws.com/0/178061/b326fbd5-f580-4ae1-e2d7-7ef7a35d497e.gif)

#今回作成した内容のエクスプレッション
テキストレイヤーのソーステキストに下記のエクスプレッション

```jsx
fix  = "";
seedRandom(0,true);

function cr(a){
text = "012345678A0123456789ABCDEF";
t = time+(a*text.length);
kankaku = 0.2; //mmsec
a = Math.ceil(t/kankaku) ;
result = a%text.length;
return text[result];
}

for (var i = 0 ; i < 10 ; i++ ){
fix = cr(random())+ fix;
}
```
Angularでzipしました

## Angularで画像ファイルとテキストファイルをzip圧縮しました。

### 使ったライブラリ
https://stuk.github.io/jszip/

### インストール
```
npm install jszip
```

### Angularに読み込ませる
```angular.json
...
            "scripts": [
              "node_modules/jszip/dist/jszip.min.js"
            ],
...
```

### 使用する準備

```foo.component.ts
declare var JSZip: any; // 宣言する

@Component({
  selector: 'app-foo',
  templateUrl: './foo.component.html',
  styleUrls: ['./foo.component.scss']
})
export class FooComponent {

  zipFile() {
    const zip = new JSZip(); // new

  }

}
```

### 圧縮して、それをダウンロードしてみる
```foo.component.ts
  zipFile() {
    const zip = new JSZip();

    // 自サイトの画像をURLから読み込む
    this.toDataUrl('/assets/img/foo.png', base64image => {
      // fooカテゴリの中に画像を保存
      // formatは、data_urlからMIME情報を削除したBase64
      const base64image2  = base64image.replace(/^data:image\/(png|jpeg);base64,/, '');
      const filenameMatch = base64image.match(/^data:image\/(png|jpeg);base64,/);
      zip.folder('foo').file(`bar.${filenameMatch[1]}`, base64image2, {base64: true});

      // Textをfooカテゴリに保存
      zip.folder('foo').file('baz.txt', 'test text\n');

      // Zipを作成
      zip.generateAsync({type: 'base64'}).then(base64 => {

        // Zipを確かめるためにダウンロードしてみる
        const a = document.createElement('a');
        a.href = `data:application/zip;base64,${base64}`;
        a.download = 'foo.zip';

        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      });
    });
  }
```
KotlinでRESTful APIを開発する

![スクリーンショット 2019-03-15 14.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/189613/3152b0ba-e97f-6b7b-3eac-490534de6b5b.png)

このブログでは、Javaエンジニアから注目されており、成長中のプログラミング言語、Kotlin で RESTful API を開発する方法を学んでいきます。CRUD 操作を処理する小規模な Spring Boot RESTful API を作成することから始めます。その後、Auth0 でこの API をセキュア にし、それによって 多要素認証、ソーシャルプロバイダーとの統合などたくさんのセキュリティ機能を提供します。最終的には、JWT を自分たちで管理する方法も学び、独自のトークンを発行する社内ソリューションをAuth0に置き換える方法を学びます。

#Kotlinとは何か
Kotlin は JetBrains が開発したプログラミング言語で、Java 仮想マシン(JVM)で実行し、JavaScript にもコンパイルされます。このプログラミング言語は静的型付けされ、変数、関数、式はコンパイル時間の確認ができるタイプの事前定義された値セットを使用します。

その主要目的のひとつは Java に伴って起きる問題を解決することです。例えば、Java と比較して Kotlin で書かれたソフトウェアはコード行がおよそ 40% 少ないと想定されていますが、Java に使用できる充実したライブラリのセットと相互運用できます。

#Kotlin と Java はどのように違うか
まず最初に、構文です。Kotlin の構文は Java のものと若干似ていますが、違いもたくさんあります。JetBrains は、Java 開発者が Kotlin に移動するときになめらかな学習曲線になると説明しています。これは真実ですが、Kotlin 開発者になることや、新しい言語で慣用的コードを書くことはそんなに容易ではありません。

Kotlin の特化について学習すれば、Kotlin は独自のグロッサリがある高度なプログラミング言語であることに気づかれると思います。例えば、Kotlin には データクラス、シールクラス、インライン関数、その他多数の機能があります。これら機能のほとんどは Java でミラー化できますが、かなり詳細なコードを書かずにはできませんから、真に慣用的な Kotlin ソースコードは JetBrains が言うように簡単ではありません。

しかし、ご安心ください。JetBrains は開発者が Java ソースコードを Kotlin に移動できるようなツールを開発しました。Kotlin の Web サイト には Java から変換 というボタンがあります。このボタンは、Java コードを貼り付けして Kotlin のバージョンにすることができます。そのほかに、IntelliJ IDEA にも開発者がこれら変換を実行する機能があります。
(つづく)

##この続きは、以下のAuth0ブログで解説しております。
[KotlinでRESTful APIを開発する](https://auth0.com/blog/jp-developing-restful-apis-with-kotlin/)



# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したKotlinやSpring Boot以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
Laravel 日本語化

#背景
Laravelの日本語化（localization）について、記事がいっぱいあったのですが、
なぜか、凄く基本のメインページの”Register”を日本語化する記事がなくて困ったので、記事にしておきます。

#動作確認環境
- PHP 7.1
- Laravel 5.7

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

- PHP 7.2
- Laravel 6.0
でも動確済み（※）

※updateの際のTIPSを末尾に記載しておきます。

#設定
##Laravel全体の環境変数を日本語に変える
config/app.php ファイル内の変数値を変更

```php:config/app.php
'locale' => 'ja',
```

##エラーメッセージの変更
この説明の記事はいっぱいある。
resources/lang/enの各ファイルを
resources/lang/jaフォルダを作って、そこにコピーし、翻訳していきましょう。

※更にGitHubとかに翻訳されたファイルを公開してくれている優しい方々がいるので、探すと効率的に作業ができます。

![laravel_dire_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/319957/29116177-8fc9-2270-e3ae-ebd724c9e267.jpeg)


###なぜだ？？
![regi.jpg](https://qiita-image-store.s3.amazonaws.com/0/319957/bc80a6cb-27a7-3238-1089-45af5fc01e8e.jpeg)
ここまできて、右上に鎮座し、一番目立って、気になる"Register"を直したいのにできない。
色々調べてやっと分かったので、こちらに記載しておきます。

##Registerの日本語化
resources/langにja.jsonファイルをjson-baseで作ればいいのでした。
![laravel_dire_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/319957/ea8e43ef-9d78-39bc-8221-f2db71deefbd.jpeg)

ファイルの中身はこんな感じです。

```json:ja.json
{
    "Register":"登録",
    "Login":"ログイン"
}
```

###Laravelトラップ
Laravelの5.7で

```
php artisan make:auth
```

をして、認証周りを使うと思いますが、このとき、作られるnavbarとなる
views/layouts/app.blade.phpファイルはきちんとDouble Underscore (__) Helper Functionを使って記載してくれていますが、

```php:views/layouts/app.blade.php
@if (Route::has('register'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                                </li>
                            @endif
```


views/welcome.blade.phpページは、なんと

```php:views/welcome.blade.php
@if (Route::has('register'))
    <a href="{{ route('register') }}">Register</a>
@endif
```

となっていますので、気を付けてください。
ここは、設定では、変わらないので、__()に書き換えてからください。

```php:views/welcome.blade.php
@if (Route::has('register'))
    <a href="{{ route('register') }}">{{ __('Register') }}</a>
@endif
```

#laravel 6.0へのUpdateの際のTips
日本語対応していると`Lang::getFromJson()`関数を使っている（はず）。
これが、バージョンアップの際に、影響を受ける（※1）ので、プログラムコード自体の変更が必要になります(※2)。

※1　[Laravel 6.x アップグレードガイド](https://readouble.com/laravel/6.x/ja/upgrade.html#get-from-json)
※2　上記で記載したプログラムコードにおいては変更はない。

詳しくは、
https://qiita.com/shikigamix/items/438104f62f29b9876faa
を参照してください。
私も参考にさせて頂きました（ありがとうございます）。
Fragment の Android-KTX が AAC ViewModel の取得に便利だ

Android Architecture Components の `ViewModel` を
`Fragment` で取得するときは こう書くと思います:

```kotlin:MainFragment.kt
import android.support.v4.app.Fragment
import androidx.lifecycle.ViewModelProviders

class MainFragment : Fragment() {
    private lateinit var viewModel : MainViewModel

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    }
}
```

## Fragment KTX を使うと

Property Delegate を使ってこうかけます:

```kotlin:MainFragment.kt
import android.support.v4.app.Fragment
import androidx.fragment.app.viewModels

class MainFragment : Fragment() {
    private val viewModel: MainViewModel by viewModels()
}
```

`lateinit var` が `val` になったので
なんとなく安心感が出てきましたね。

あるいは `Activity` のスコープの `ViewModel` をつかうときは
`by activityViewModels` がつかえます:

```kotlin:MainFragment.kt
import android.support.v4.app.Fragment
import androidx.fragment.app.activityViewModels

class MainFragment : Fragment() {
    private val viewModel : MainViewModel by activityViewModels()
}
```

## 導入法

アプリ (モジュール) 以下の gradle に
Fragment KTX の依存を追加します:

```gradle:app/build.gradle
dependencies {
    implementation 'androidx.fragment:fragment-ktx:1.1.0-alpha04'
}
```

KTX について詳しくはこちら:
https://developer.android.com/kotlin/ktx

## パターン

この Property Delegate は 2 つの引数をとりますが、
それぞれデフォルト引数が設定されてるのでなしでもいけますし、
指定してもいけるっていう便利な感じになってます。

```kotlin
inline fun <reified VM : ViewModel> Fragment.viewModels(
    noinline ownerProducer: () -> ViewModelStoreOwner = { this },
    noinline factoryProducer: (() -> Factory)? = null
)
```
https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/fragment/ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt#55

これを踏まえてよく使うパターンが紹介されてます

https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary?hl=ja#viewmodels

### 1. 引数なし: `by viewmodels()`

1 つめは `by viewmodels()` で引数なしで移譲するパターンです:

```kotlin
private val viewModel: MainViewModel by viewModels()
```

> Returns a property delegate to access ViewModel by default scoped to this Fragment

このパターンでは、この `ViewModel` のスコープが
このプロパティを定義した `Fragment` ( `=== this` ) になります。

### 2. `by viewmodels({ViewModelStoreOwner})`

2 つめは `by viewmodels ({requireParentFragment()})` のように
親の `Fragment` を与えたりして、
別の `Fragment` を `ViewModel` のスコープとして与えることができます。

### 3. `by viewmodels { ViewModelProvider.Factory }`

3 つめは `by viewmodels { myFactory }` として
`ViewModel` を作成するようなファクトリのインスタンスを与えるパターンです。

これは Dagger で `ViewModelProvider.Factory` を `@Inject` するケースで使えますね。

---

両方の引数を与えたときはどちらも考慮される感じです:
https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt#54

べんり！
ECCube3をApache2.4系で動かすときにハマった.htaccess

# ECCube3のソースをダウンロードしてドキュメントルートに置く
表題の通り、ECCube3をApache2.4系（実際はdockerのphp:7.1-apache）で動かそうとしたら
何かしらんが動かない。

Forbidden
You don't have permission to access / on this server.

ログを見てみると

AH01797: client denied by server configuration: /var/www/html/

# なんじゃらほい。

なんじゃらほいと思ったらECCube3のパッケージにもともと入っている.htaccessが

```
order allow,deny
deny from all
```

となっており、これApache2.4じゃアカーン書き方です。

```
Require all granted
#order allow,deny
#deny from all
```
と書き直してそっ閉じしましょう。
おしまい。
AWS が壊滅した時、あなたの業務は継続できるか？

コンテナ勉強会の資料をアップしました。
よかったら見て下さい。

https://www.slideshare.net/ssusera45aed/if-aws-is-destroyed-can-you-continue-work

私は、業務継続できます！
（だいぶ泣ける状態になりますが、、、）
パスワードをハッシュ化する: 不可逆性なセキュリティアルゴリズム

![スクリーンショット 2019-03-15 13.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/189613/9de4f1d5-de0c-cf05-6812-ad11887f0a8e.png)

ネットワークを介してサービスにアクセスする際に、本人確認をするための手段としてパスワードは広く使用されています。もしサービスを提供している組織から顧客のパスワードが漏洩してしまうと非常に大きな問題になってしま歌め、パスワードをセキュアに保護する必要があります。堅牢なパスワード格納戦略はどんな組織の評判をも危険にさらしてしまう、データ侵害を軽減するために非常に重要となります。ハッシュアルゴリズムはパスワードを保護するための重要なテクノロジーです。

認証の主旨はアプリケーションにアクセスしたいときはいつでも正しい資格情報を提供することを検証することが可能なユーザー名やパスワードなどの資格情報セットをユーザーに提供することです。
そのため、将来検証するときのためにこれら資格情報をデータベースに格納する方法が必要です。しかし、認証のためにパスワードをサーバーに格納することは難しい作業です。パスワードを安全に、そしてより簡単に格納するメカニズムのひとつ、ハッシュを見てみましょう。
(つづく)

##この続きは、以下のAuth0ブログで解説しております。
[パスワードをハッシュする：セキュリティへの一方通行](https://auth0.com/blog/jp-hashing-passwords-one-way-road-to-security/)

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したハッシュアルゴリズ以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
BFF

ナレッジ吐き出し用の投稿

## Backends for Frontends


### 5つの便利なユースケース
- API Gateway
- Server Side Rendering
- Session Management
- File Upload
- WebSocket、Server Sent Events、Long Polling


## 参考
- http://blog.keepdata.jp/entry/2018/06/06/103000
- http://www.atmarkit.co.jp/ait/articles/1805/18/news022.html
Docker

ナレッジ吐き出し用の投稿
## Docker
コンテナ型の仮想化環境を提供するオープンソースソフトウェア ↔ Vmwareはホスト型の仮想化環境
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/bba6786b-bc3a-7377-210b-ff0cd7438861.png)


本番環境を再現するためにDockerのような仮想化技術が使用される → ローカル環境, テスト環境, 本番環境をdockerのコンテナで制御（切り替え等）できるイメージかな（イメージという表現はややこしいか...）
イメージとは一般的な画像データ（jpeg,pngなど）ではなく、イメージファイル（CD-R等に記録されるそのままのデータのこと）を指す。
コンテナというものはイメージが変換されて生成される → イメージがあれば同じものが生成できる、メタデータの塊のような感覚かな
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/cd3812ab-f325-370e-0765-aecbebd10eb3.png)


## Docker compose
複数コンテナの一元管理
他のミドルウェアを利用するかもしれない、かつコンテナを簡単に管理したいとき使用
 Docker Composeは、Docker For Macを入れていれば自動的にインストールはされている

### docker-compese.ymlの作成
volumes

[ホストマシンのパス]:[Dockerコンテナ内のパス]　→ ホストマシンとDockerコンテナ内のファイルをSyncすることができる
tty
Dockerコンテナを起動してもtrueをつけることで永続化できます。


```shell

docker-compose build


docker-compose up -d


docker-compose exec web sh
```
## dockerのコンテナ思想が解決してくれること（図解）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/3bc8487a-9377-21f3-cdd7-5186d0dff91f.png)


## オーケストレーション
負荷の変動が大きいシステムでは、負荷の状況に応じて動的にサーバーの数を増減させる（スケールイン/スケールアウト）

仮想化ではサーバーの起動や終了にある程度時間がかかりますので、スムーズなスケールアウト／スケールインを行いにくい

これらを解決する、多数のコンテナを管理するソフト「オーケストレーションツール」(Orchestration Tool)がある


#### まだ知れそうな奴ら
- Dockerが動く仕組み, Linuxカーネルの理解
- Dockerfile, インフラ設定のコード化
- Dockerのネットワーク設定, hostsの設定とか
- オーケストレーションや運用, AWSでの運用など


## 参考

docker
- https://inside.dmm.com/entry/2018/03/08/docker_bigginer
docker x AWS
- https://www.slideshare.net/AmazonWebServicesJapan/awsdocker

docker, nuxt.js
- https://goodforthree.com/nuxt-docker/
- https://forum.vuejs.org/t/nuxt-ssr-docker/34279

docker-compose
- https://knowledge.sakura.ad.jp/16862/
- https://qiita.com/L_e_k_o/items/986196a15b08bbb14384
- https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce

docker-compose x gitlab, redmine, jenkins
- https://qiita.com/nexkeh/items/02a4d6c33d884bda1b23
LINE Notifyでコマンドラインからメッセージを送る

# 手順
[ここ](https://engineering.linecorp.com/ja/blog/detail/88)でLINE Notifyを利用するのに必要となるトークンを発行します．

あとは以下のように記述すればOKです．

自分は，処理に時間のかかるプログラムを回してて，終わったらお知らせが欲しい時にこの通知機能をつけてます．
LINEなら携帯（出先）でも受け取ることができるので便利です．

```shell:line_notify.sh

#!/bin/bash

curl -X POST -H 'Authorization: Bearer ここにLINEから発行されるトークンを入れます' -F 'message=せどり終わったよ〜( ^ω^ )，はよ確認して〜♬' https://notify-api.line.me/api/notify

echo "\n\nLINEへの通知に成功しました\n"
```



# 実行例
<img width="391" alt="example.png" src="https://qiita-image-store.s3.amazonaws.com/0/377231/3e8275d6-254a-e884-29e3-224da5f5a015.png">