OmniAICreator/Qiita-1.07M huggingface dataset:
minikubeにhelmをインストールする

## 概要

[helm](https://helm.sh/)はkubernetesのためのパッケージマネージャです。helmを使うと複雑なkubernetesアプリケーションを作成、管理することができます。この記事ではhelmをminikubeにインストールする方法を説明します。サンプルとしてredisをデプロイします。

![helm-1-small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/84a579c4-0db7-da5e-6a2a-6d7dff54ee8c.jpeg)



## 環境

* minikube: v1.3.1
* kubernetes: 1.15
* macOS: 10.14.4
* helm: v2.14.3

## macOSにbrewでhelmをインストールする

```
brew install kubernetes-helm
```

## [クラスタロール](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole)を作成する

```yml:clusterrole.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
```

### 適用する

```
kubectl create -f clusterrole.yaml
```

## クラスタロールに[サービスアカウント](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/)を紐付ける

```
kubectl create serviceaccount -n kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
```

## tillerを初期化する

```
helm init --service-account tiller
```

## 正しくインストールが完了したか確認する

```
kubectl --namespace kube-system get pods | grep tiller
```

### 出力

```
kubectl --namespace kube-system get pods | grep tiller
  tiller-deploy-2885612843-xrj5m   1/1       Running   0   4d
```

## Redisクラスタをhelmでインストールしてみる

```
helm install stable/redis --set serviceType=NodePort
```

### 正しくRedisクラスタがデプロイされているか確認する

```
kubectl get po | grep redis
```

出力

```
kissing-serval-redis-master-0   1/1     Running   0          8m12s
kissing-serval-redis-slave-0    1/1     Running   0          8m11s
kissing-serval-redis-slave-1    1/1     Running   0          5m6s
```

## 参照

* [minikube](https://minikube.sigs.k8s.io/)
* [helm](https://helm.sh/)
* [kubernetes](https://kubernetes.io/)
* [Get Started with Kubernetes using Minikube](https://docs.bitnami.com/kubernetes/get-started-kubernetes/)
cmdからexplorer.exeを立ち上げる方法まとめ

コマンドプロンプトからエクスプローラーを立ち上げる方法をまとめます。

１. カレントディレクトリで開く

```
>start .
```

２. ひとつ上のディレクトリで開く

```
>start ..
```

※ただし、さらに上のディレクトリに関しては使えない

```
>start ...
```

上記のコマンドは想定とは異なり、カレントディレクトリで開く。

３.ひとつ上のディレクトリに属す他のフォルダで開く。

```
>start ..\directory
``` 

４.開くフォルダをフルパスで指定して開く

```
>start c:\windows\system32
#または
>explorer.exe /e, c:\windows\system32
```

５. 環境変数で指定したフォルダを開く。

```
>start %HOMEDRIVE%
#または
explorer.exe /e, %HOMEDRIVE%
```

６. 番外編
ちなみに、

```
>start
```

上記のコマンドは、新しいウィンドウのコマンドプロンプトを開くコマンドになるので注意してください。
GitHub PagesにDocker+Vue.js+Vuetifyでページを公開

## この記事について
VSCodeのRemoteを使って、Dockerコンテナー内に、Vue.js+Vuetify環境を構築するためのメモです。

## 対象
- VSCodeはある程度使い慣れている
- VSCodeのRemote container拡張機能は使った事がある

## dockerfile作成

EXPOSE 8080でポート指定をする事を忘れないように。
最悪コピペでもOK

```dockerfile:dockerfile

FROM node:lts

WORKDIR /app

RUN npm install -g npm && \
    npm install -g @vue/cli

EXPOSE 8080

CMD ["/bin/sh"]
```

## dockerビルド

VSCode Remote Containerを使用して、ビルドを行う。

## Vue-Cliインストール

```shell:shell
$ npm install -g @vue/cli
```

## Vueプロジェクト作成
カレントディレクトリにvueプロジェクトを作成する

コマンドを叩いた後に、途中で選択肢が出るので、`yes`> `default`>`Use NPM`を選択

```shell:shell
$ vue create .
> Y
> default (babel, eslint)
> Use NPM

```

## VSCode RemoteでPORT設定
Forewd Port from Containerを選択し、`8080`を入力

## Vueの動作確認

```shell:shell
$ npm run serve
```
コマンドを叩いた後に、`localhost`にアクセス
http://localhost:8080/studio

動作確認できたら、`ctrl+c`で一旦終了。

## Vuetify インストール
コマンドを叩いた後に、選択肢があるので`Default (recommended)`を選択

```shell:shell
$ vue add vuetify

> Default (recommended)
```

## ビルドディレクトリ変更
/node_modules/@vue/cli-service/lib/options.js

```js:options.js
<省略>

exports.defaults = () => ({
  // project deployment base
  publicPath: '',
  // for compatibility concern. TODO: remove in v4.
  baseUrl: '',

  // where to output built files
  //  outputDir: 'dist',
  outputDir: 'docs',

  assetsPublicPath: '',

  // where to put static assets (js/css/img/font/...)
  assetsDir: '',

  // filename for index.html (relative to outputDir)
  indexPath: 'index.html',


```

## ビルド
docsディレクトリにビルドされたファイルが格納されるので、そのままGitHub Pagesにデプロイできます。

```shell:shell
$ npm run build
```

## Vue routerを入れる
```shell:shell
$ vue add router
```
Djangoの入力フォームにCSSを適用する方法

# はじめに
Djangoのtemplateで入力フォームを

```
{{ form.username }}
```
のように作る時、入力フォームにCSSを適用する方法が分からず、調べてみたのでまとめておきます。

# 入力フォームにCSSを適用したい
例えば、ユーザー登録をするフォームを作るために、views.pyでUserCreationFormをformという名前でtemplateに渡してフォームの画面を作るとします。
usernameを記入する欄を

```py
{{ form.username }}
```
のように作ると、class名をつけることができず、CSSを適用することができません。

# CSSを適用させる方法
CSSを適用するための方法を解説します。
まず、仮想環境で

```
$ pip install django-widgets-improved
```
というコマンドを実行します。


次に、プロジェクトのsettings.pyで

```
INSTALLED_APPS = [
    ...
    'widget_tweaks',
    ...
]
```
のように追加します。

そして、templateの最初の方に以下を追加します。

```
{% load widget_tweaks %}
```

そしたら、

```
{{ form.username|add_class:'class-name' }}
```
のように書くことでclass名を設定できます。
あとはCSSで自由に装飾してください。
CloudWatch Eventのアラートメールにグラフを添付する

[Amazon CloudWatchスナップショットグラフとアラートで解決までの時間を短縮
](https://aws.amazon.com/jp/blogs/devops/reduce-time-to-resolution-with-amazon-cloudwatch-snapshot-graphs-and-alerts/)をやってみたのでメモ。



#1.EC2#
監視するEC2インスタンスを用意しておく。


#2.IAMロール#
LambdaへアタッチするIAMロールを準備しておく。

`CloudWatchReadOnlyAccess
AmazonSESFullAccess
AmazonSNSReadOnlyAccess
AWSLambdaBasicExecutionRole`


#3.Lambda#

コードは以下のgithubのものを使います。
https://github.com/aws-samples/aws-cloudwatch-snapshot-graphs-alert-context

Githubからサンプルコードをクローンし､npm installしてからZIPを作成します｡

```
git clone https://github.com/aws-samples/aws-cloudwatch-snapshot-graphs-alert-context
cd aws-cloudwatch-snapshot-graphs-alert-context/
npm install
zip -r snapshotgraphsalarmdemo.zip ./*
```

設定は、githubに記載されているとおりに設定します。
・ランタイム：Node.js
・ハンドラ：emailer.myHandler
・タイムアウト：30秒
・環境変数：EMAIL_TO_ADDRESS、EMAIL_FROM_ADDRESS、MAIL_SERVER_REGION

zip圧縮の際は注意！階層が合わないと"Unable to import module '...': No module named ..."などとなる。
参考：[Lambda(Python) を実行すると "Unable to import module '...': No module named ..."](http://cloudmemo.hatenablog.com/entry/2016/12/17/094705)


#4.SNS#

SNSトピックを作成し、Lambdaへサブスクリプションします。


#5.SMS#

[Email Address]で認証しておく。


#6.CloudWatch#

EC2のCPUUtilizationが0以上（ここではテストのため）の場合に通知するように設定します。


#7.テスト#
メールが届いていることと、CloudWatchlogsの実行結果を確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a76ff1e5-7ca5-feb5-f5b7-40e538173f7d.png)
Rubyのsort_byを使って配列を特定の順番に並び替え

# Rubyのsort_byで特定の順番に並び替え

昇順や降順に並び替えるのは、よくありますが、
プロデューサーの意向で特定の順番に並び替えたい時があります。

例えば、人気順に並び替えたい時などです。

id 順ではなく、とにかく指定した順番に並び替えたい :thinking:


例えば、こんな配列があって、

```ruby

@fruites = [
  [ 1, 'apple' ],
  [ 2, 'orange' ],
  [ 3, 'banana' ],
  [ 4, 'melon' ],
  [ 5, 'peach' ],
  [ 6, 'kiwi' ],
  [ 7, 'cherry' ],
]
```

こんな id順で指定されたとします :arrow_down:


```ruby

FRUITS_ORDER = [3, 2, 7, 5, 4, 1, 6]
```


sort_by に、並び替えたいid順におけるindex（位置情報）を渡してあげると、その通りに並び替えられます :relieved:


```ruby

@fruites.sort_by{|fruit| FRUITS_ORDER.index(fruit[0])}
=> [[3, "banana"],
 [2, "orange"],
 [7, "cherry"],
 [5, "peach"],
 [4, "melon"],
 [1, "apple"],
 [6, "kiwi"]]
```
JSで日数カウンター

- 恋人の誕生日は何日後かな？
- このタスクの納期まで、後何日あるのかな？
- 令和になってから何日経過したかな？

等々、今日を基準に、xxは何日後？何日前？と計算する機会は多いと思います。でも月によって日数が違ったりする関係上、計算がやや大変だったりします。そこで、JSでさくっと日数計算をしてみます。

```html:index.html
<!DOCTYPE html>
<meta charset="UTF-8">
<title>日数カウンター</title>

<input type="date" id="myDate">
<div id="myMSG"></div>

<script>
    (function() {

        document.getElementById("myDate").addEventListener('change', function() {

            var today = new Date(),
                myDate = new Date(document.getElementById("myDate").value),
                myCount = today.getTime() - myDate.getTime(),
                result;

            myCount = Math.floor(myCount / (1000 * 60 * 60 * 24));

            if (myCount > 0) {
                result = myCount + "日経過しました。";
            } else {
                result = -(myCount) + "日後です。";
            }

            document.getElementById("myMSG").innerHTML = result;

        }, false);

    }());
</script>
```
Google Maps の UI を消すブックマークレット

Google Maps の UI 、邪魔じゃないですか？特にストリートビューのスクショを撮りたい時とか。
というわけで Google Maps の UI を非表示にしたり表示したりするブックマークレットを作りました。
ちなみに PC ブラウザ版の話で、 API は無関係です。

```javascript
javascript: (() => { [ '.widget-pane-toggle-button-container', '#omnibox-container', '#vasquette', '.top-center-stack', '#titlecard', '#image-header', '.app-viewcard-strip', '.scene-footer-container', '#watermark' ].forEach(query => { const target = document.querySelector(query); target && (target.style['display'] = target.style['display'] === 'none' ? '' : 'none'); }); })(); void 0;
```

## デモ

ストリートビュー - 起動前
<img width="800" alt="スクリーンショット 0001-08-29 14.35.28.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/b64e98ec-060b-eecb-7198-3be81145127b.jpeg">
ストリートビュー - 起動後
<img width="800" alt="スクリーンショット 0001-08-29 14.35.45.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/0feed0c5-7b0f-26a6-ee7d-2e2362423d35.jpeg">
通常マップ - 起動前
<img width="800" alt="スクリーンショット 0001-08-29 14.31.34.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/e433abbc-2d87-1774-d73e-209b6ee8e9e0.jpeg">
通常マップ - 起動後
<img width="800" alt="スクリーンショット 0001-08-29 14.31.47.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/a03f8a5b-177c-2d84-5c6d-7c31a050cc1e.jpeg">

## 使い方

単純に Google Maps 上でブックマークレットを起動してください。 UI の表示状態が切り替わります。
__ただし、左サイドバーだけは消えません。手動で非表示にしてから起動してください。__
<img width="800" alt="スクリーンショット 0001-08-29 14.32.18.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/38f7d7fa-924a-01f3-31bb-2c33fa6393dd.jpeg">
また、すべての UI を消せるかどうかはチェックしていません。適当に修正してケロ。

## 仕組み

これまた単純に対象要素の `display` プロパティを操作しているだけです。
対象要素は `class` や `id` で指定しているため、それらが変更されたら動作しなくなる可能性はありますがまぁいいや。

## おまけ

現在のウェブページをフルスクリーン表示するブックマークレットも置いておきます（ Mac の Chrome 以外では動作しないと思います…）。

```javascript
javascript: (() => { [ 'mozRequestFullScreen', 'webkitRequestFullscreen', 'requestFullscreen' ].some(rf => { if (document.documentElement[rf]) { document.documentElement[rf](); return true; } }); })(); void 0;
```
CodeCeption入門

よく忘れてググるのでメモっとく

# CodeCeption

https://codeception.com/

PHPのテスティングフレームワーク。
単体テスト、機能テスト、受け入れテストを区別しつつ、CodeCeptionで完結できる。

- unit ... 単体テスト
- functional ... 機能テスト
- acceptance ... 受け入れテスト

# テストを作成

```console
> php vendor/bin/codecept generate:cest unit User/Register
```

# テストを実行

## すべてのテストを実行
```
> php vendor/bin/codecept run
```

## 任意の区分のテストを実行
```
> php vendor/bin/codecept run unit
```

## 任意のディレクトリのテストを実行
```
> php vendor/bin/codecept run unit User/
```

## 任意のテストを実行
```
> php vendor/bin/codecept run unit User/RegisterCest
```
Googleスプレッドシート　よく使うショートカットキー

Googleスプレッドシートでよく使うショートカットキーを書いていきます。


【水平方向の配置】
(中央)

 <b>⌘ + Shift + E</b>

<b>Ctrl + Shift + E</b>

(左)
<b>⌘ + Shift + L</b>

<b>Ctrl + Shift + L</b>

(右) 
<b> ⌘ + Shift + R<b>


【シートを検索】

<b>⌘ + Shift + G</b>

<b>Ctrl + Shift + G</b>

【ショートカットキーの一覧を表示】
<b>⌘ + /</b>

<b>Ctrl + /</b>
経由するサーバーに秘密鍵を置かずに本命サーバーに接続する

# やりたいこと
経由するサーバー（以後、踏み台サーバー）から秘密鍵を無くしたい。
そのためにMacから踏み台サーバー、踏み台サーバーから本命のサーバーに入るとき、ローカルの秘密鍵を参照し続けたい。

#### 使う用語説明
humidai...踏み台サーバー
honmei...本命サーバー

# 方法

## 準備 ローカルに秘密鍵を置く。
今まで踏み台に置いちゃってた場合などはやってください。

## 1 ローカルの秘密鍵をssh-agentに登録する　[ローカルでの作業]

```
$ ssh-add -K {鍵のパス (例、~/.ssh/himitsu.pem)}
```
登録できたか確認

```
$ ssh-add -l
2048 SHA256:himitsudayoooooooooooooooooooooooo himitsu.pem (RSA)
```

## 2 踏み台のconfigにForwardAgent yesを追加する [踏み台での作業]
**踏み台サーバーの**configの本命サーバーの部分を書き換えます。

```
$ ssh humidai //以下踏み台サーバーでの作業
[humidai-user@cd1234 ~]$ cd .ssh
[humidai-user@cd1234 ~]$ vi config
```

以下に書き換えてください。

```config
Host honmei-server
  HostName honmei.com
  User honmei-user
  // 追加
  ForwardAgent yes
```

## 3 多段sshする [ローカル⇨踏み台⇨本命]

準備は整ったのでやってみます。

```
$ ssh humidai
[humidai-user@cd1234 ~]$ ssh honmei
[honemi-user@ip9876 ~]$ 
```

できましたね！

# 何をやったか
踏み台に秘密鍵を置かずに本命にsshできました。
セキュリティ的にもこっちの方が嬉しいですね。
ssh-agentというのが常に自分と一緒に踏み台サーバーに入って本命サーバーの鍵を渡してくれるらしいです。

# これらの設定後に他のプロジェクトメンバーが本命に入る場合の導入

方法の準備と１だけをやってもらってください。
あとはいつも通りsshできます。

# 追記
9月5日：macを再起動すると　秘密鍵の登録がリセットされてしまう。
ので、もう一度1の手順を踏む必要あり。

# 引用・参考文献
ほぼこれらの記事を自分流に、シンプルにまとめたものです。
ありがとうございます。

[ssh-agentを利用して、安全にSSH認証を行う](https://qiita.com/naoki_mochizuki/items/93ee2643a4c6ab0a20f5)

[多段sshを行うときに、ローカルの秘密鍵を参照し続ける]
(https://qiita.com/ymd_/items/5eb833ad757bd8b3e6c3)
ローカル(file:///プロトコル)時に毎回マイクやカメラの使用許可をたずねられる問題を回避する

# 結論

Chromeの起動時オプションに
`--use-fake-ui-for-media-stream`
を追加する。

`が次の許可を求めています`を無視する。
permissionが常に許可されるので留意すること。

参考情報のほうにFirefox版の対処方法も書いているのでそちらも
(現状Firefoxで`SpeechRecognition`はできないけれどカメラや普通の音声入出力には使えるはず)

# 症状

HTTPサーバーに公開していた音声認識

```js
var recognition = new SpeechRecognition();
// var recognition = new webkitSpeechRecognition();

recognition.start();
```

をするWebページがあった。
http上では`start()`タイミングで一度だけマイクの使用許可を求められ、
以後何度`recognition.start()`しても再度使用許可を求められることがなかった。

このHTMLをローカル上にダウンロードし、直接ファイルを開いた場合、
`file:///C:/hogehoge`
`recognition.start()`するたびに使用の許可を求めるダイアログが表示されてしまった。

解決方法は結論のとおり、常に許可するオプションで最初の使用許可ダイアログすらスキップする方法を取った。
`recognition.start()`した時点で問答無用で許可されるので、ローカルだが一応カメラとか発言に注意か。
おそらく自動テスト用のオプションに思えるが、用途に合っていたのでOK

# 試したけどだめだったもの

ローカルなら事前に
[MediaDevices.getUserMedia()](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia)
などで許可を取っておかないとダメなのかな？と考えたが、特に関係なし。これも毎回許可を求められらた。

# 参考

* [google chrome - always accept webRTC webcam request - Stack Overflow](https://stackoverflow.com/questions/12160174/always-accept-webrtc-webcam-request/12173423)
* [WebRTCアプリケーションのテストの課題・解決方法について](https://www.slideshare.net/iwashi86/webrtc-58402646)
* [WebRTCなコードをE2Eテストする - console.lealog();](https://lealog.hateblo.jp/entry/2018/03/23/101954)

`SpeechRecognition`に固執していてよい情報が取得できなかった。
「マイク 許可」などであさっていたが、**WebRTC**というキーワードは自発的に出てこなかったので以後気をかけるとよさそう。


***

とりたくなかった方法

* [Googleブラウザで何回も「○○.comが次の許可を求めています」を非表示にする方法 ｜ The Windowsマスター](https://windowsmaster.xyz/google%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E4%BD%95%E5%9B%9E%E3%82%82%E3%80%8C%E2%97%8B%E2%97%8B-com%E3%81%8C%E6%AC%A1%E3%81%AE%E8%A8%B1%E5%8F%AF%E3%82%92%E6%B1%82%E3%82%81%E3%81%A6%E3%81%84-2076)
VBでRazor記法によるusingブロック記述

## 経緯
Asp.NETのMVCをVisual Basicで触る機会があったのだが、
Razor記法はC#でのサンプルが多く、VBの不慣れも相まって書き換えに苦戦したので覚書。

## usingブロック
```c#

@using(Html.BeginForm(new { @class = "myclass"})){
    //タグとか
}
```

```visualbasic

@Using (Html.BeginForm(New With {.class = "クラス名"}))
    @<text>
        'タグとか
    </text>
End Using
```
vbでのUsing使用時のみ、変数宣言以外の記述は @\<text> で囲まないとエラーになる。
本当は正解があるのか、これが正解なのかはわからないが、一応これでいけた。
ホクホクのイモ

初投稿がホクホクのイモなわけないじゃないですか
なんてことは特になく、ふと思い立って1行でホクホクのイモを書いてみただけ
<pre>echo "ホ,ク,イ,モ"|perl -aF',' -lpe '$\_=$F[int(rand(4))].$F[int(rand(4))];$\_.=$\_."の".$F[int(rand(4))].$F[int(rand(4))];'</pre>
当然1行に圧縮した時点でドチャクソ読みづらいので何をしているのか解説するためにも改行してコメント追加
とりあえず出力要件としては”[2文字2回]の[2文字]”とする。文字被りは考慮しない。
<pre>echo "ホ,ク,イ,モ"|    #何はともあれ文字設定。配列に文字入れたりとかが面倒だったのでechoしてperlのaスイッチでawkコマンド的に配列を作成
perl -aF',' -lpe '    #aスイッチと区切り文字、lで入力行末の改行chompしつつpスイッチでprintを省略
$\_=$F[int(rand(4))].$F[int(rand(4))];    #適当にランダム2文字作成
$\_.=$\_."の".$F[int(rand(4))].$F[int(rand(4))];    直前で作った2文字を2連続しつつ出力後半の2文字を作ってそのまま$_にブチ込む。pスイッチのおかげでprintしなくても$\_が勝手に出力される。
'</pre>
改行しようとコメント付けようと読み辛いもんは読み辛かったわメンゴメンゴ

なお反省はしない模様。
多分もっとスマートな書き方とかあるけど気にしない。

2019/11/5
\_をエスケープしないと表示されてなかったのでエスケープを追加
AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」（2

# パフォーマンスに優れたアーキテクチャを定義する
[AWS Innovate オンラインカンファレンス](https://aws.amazon.com/jp/blogs/news/aws-innovate-japan-201904-registration/)
* AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」
* [セッション１：回復性の高いアーキテクチャを設計する](https://qiita.com/yodyman/items/73a0f91b79675f5e80ff)
* [セッション 2：パフォーマンスに優れたアーキテクチャを定義する](https://qiita.com/yodyman/items/8071258b1fe972477674)
* [セッション 3：セキュアなアプリケーションおよびアーキテクチャを規定する](https://qiita.com/yodyman/items/3398f00a57de87347ae8)
* [セッション 4：コスト最適化アーキテクチャを設計する](https://qiita.com/yodyman/items/298ae52c4f84624ef774)
* [セッション 5：運用上の優秀性(オペレーショナルエクセレンス)を備えたアーキテクチャを定義する + クロージング](https://qiita.com/yodyman/items/53dd34d1e4ca99aeed34)

## 高パフォーマンスなストレージおよびデータベースを選択する
* EBSボリュームタイプのパフォーマンス比較

### ソリッドステートドライブ(SSD)

||汎用|プロビジョンド|
|---|---|---|
|ボリュームサイズ|1 GB～16 TB|4 GB～16 TB|
|最大IOPS/ボリューム|16,000|64,000|
|最大スループット/ボリューム|250 MB/秒|1,000 MB/秒|
|ユースケース|ブートボリューム、インタラクティブで低レイテンシーの<br>アプリケーション、開発およびテスト環境|I/O 負荷の高い NoSQL データベースと<br>リレーショナルデータベース|

### ハードディスクドライブ (HDD)

||スループット最適化 HDD (st1)|Cold HDD (sc1)|
|---|---|---|
|ボリュームサイズ|500 GB～16TB|500 GB～16TB|
|最大IOPS/ボリューム|500|250|
|最大スループット/ボリューム|500 MB/秒|250 MB/秒|
|ユースケース|ビッグデータ、データウェアハウス、ログ処理|1 日のスキャン必要回数が少ないコールドデータ|

### マグネティックボリューム
* 旧世代なボリューム。SSD, HDDを推奨

### Amazon S3
* インターネットからアクセス可能なストレージだが、単に格納するだけではありません
* 静的コンテンツをエンドユーザーに配信することが可能
* 完全マネージド型のサービスで高いスケーラビリティを備えている
* バケット作成
  * リージョンを指定
  * バケット毎のアクセス制御が可能
* オブジェクト
  * ファイルをオブジェクトと呼ぶ
  * オブジェクトキー、データ、データのメタデータを含む
* 料金モデル
  * 1か月あたりの使用量（GB）
  * リージョン外へのデータ送信
  * リクエスト回数
  * データ受信は無料
  * 同一リージョン内もしくは CloudFrontへのデータ送信は無料
* ライフサイクルポリシー
  * データのライフサイクルを自動化できる
  * データが格納されてからの経過時間にともないストレージタイプを自動で変更することができる
    * S3標準 -> 30日経過 S3標準低頻度 -> 60日後 Glacier -> 1年後に削除
    * コスト削減につながる
  * オブジェクトごと、バケットごとに設定が可能

### Amazon のデータベース
* 万能なデータベースは存在しない為、要件に応じたものを選択する
* Amazon RDSが最適なケース
  * 複雑なトランザクション・クエリが必要な場合
  * ある程度、高速な書込みが必要な場合
  * データを単一ノードで管理する必要がある場合
  * データの耐久性が重要な場合
* Amazon RDSが最適でないケース
  * 毎秒15万の書込みが発生するなど超高速な書込み・読込みが必要な場合
  * 単一ノードでは処理できずシャーディングが必要な場合
  * シンプルなGET・PUT処理で十分な場合
  * EC2上でRDBMSをカスタマイズする場合
* Amazon DynamoDB
    * 完全マネージド型の NoSQL
    * 一定の低レイテンシーパフォーマンスを維持しながら水平方向にスケールできる
* Amazon Redshift
    * データウェアハウス向け
    * 構造化

## パフォーマンス向上のためキャッシュを使用する

### AmazonCloudFront
* キャッシュとして利用できるサービスのひとつ
* エッジロケーション上で動作するサービス
* エンドユーザーに近い最適なエッジロケーションにルーティングされる

### Amazon ElastiCache
* システム内部でキャッシュしたい場合に利用
* 読込みの多いワークロード
* コンピューティング負荷の高いワークロード
* memcached, redis をマネージドサービスとして利用できる
* Memcached
  * マルチスレッド
  * 永続性は無い
  * 水平スケーリングが容易
  * redis である必要性が無い場合は、memcached
* Redis
  * シングルスレッド
  * 構造化データのサポート
  * 永続性をサポート

# 伸縮性とスケーラビリティに優れたソリューションを設計する

### 垂直スケーリング
* スケールアップ/スケールダウン
* インスタンスのスペックを変更する
* インスタンスのスペックに限界がある
* インスタンスの再起動が必要になる

### 水平スケーリング
* スケールイン/スケールアウト
* インスタンスの数の変更
* 理論上、限界が無い
* インスタンスの再起動が必要にならない

### Amazon Auto Scaling
* EC2インスタンスを増やしたり減らしたりする
* CloudWatchメトリクスと連携してスケーリングが可能
* ELBと統合されており、ひとつ以上のロードバランサーを既存のオートスケーリンググループにアタッチできる
* 影響を受けていないAZに新しいインスタンスが作成される

### Amazon CloudWatch
* 標準メトリクス
* カスタムメトリクス
* CloudWatch Logs
Lookerのグラフからnullを描画対象外にする方法

BIツールを使っていると、時系列データの線グラフを描画した場合、日付に欠損データが存在した場合、その日付けのデータが０になり、見た目がカクカクした感じになる場合があります。

こういった場合、tableauでは時系列データの属性を変更することで、NULLのデータをスルー可能でしたが、Lookerでも同様な機能がありましたので紹介します。

## やりたい事
時系列データに欠損がある場合、グラフの描画対象外にしたい

## データ
株のデータのため、**土日祝日はデータがない状態**

| Date       | bond_cd | close_sum |
|:-----------|--------:|:-----:|
| 2019-03-01 |  9684   | 3340  |
| 2019-03-04 |  9684   | 3325  |
| 2019-03-05 |  9684   | 3270  |
| 2019-03-06 |  9684   | 3350  |
| 2019-03-07 |  9684   | 3265  |
| 2019-03-08 |  9684   | 3215  |
| 2019-03-11 |  9684   | 3270  |
| 2019-03-12 |  9684   | 3285  |

## LookML
```yaml
  dimension_group: Date {
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      quarter,
      year
    ]
    convert_tz: no
    datatype: date
    sql: ${TABLE}.Date ;;
  }

  dimension: bond_cd {
    type: number
    sql: ${TABLE}.bond_cd ;;
  }

  measure: close_sum {
    type: sum
    sql: ${TABLE}.Close ;;
  }
```

Lookerでviewに読み込むと、**日付項目は自動的にNULL設定される仕様**の為、描画すると以下のようになる
![nullを描画対象外1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/8b56607f-81ea-09c4-e98b-8f6eaf79791d.png)

## 対処方法
DATAの項目毎の設定から、**Remove Filled in Dates**を選択して再度DBへアクセスを行う
![nullを描画対象外2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/1045dc27-2a4e-3bb1-a1f8-2e3ee87a2622.png)

![nullを描画対象外3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/42700e5e-a47b-e77b-708f-789f6fd22fd8.png)


## まとめ
土日祝日などでデータが存在しない場合、Lookerでは**日付項目が自動的にNULL設定される仕様**ですので、上記のようにNULLのデータは対象外にする設定を行う必要があります。
ASP.NET MVCでCookieが保存されなくて困った話

## あらまし
ajaxでActionMethodを呼び出して値をCookieに保存
↓
完了後にページ遷移させて、上記Cookieの値を参照
↓
**変更が反映されてない！**

## 原因
AJAXはレスポンスを参照せず、正常終了したか否かしか見てなかった。
なので成功時のActionResultは以下のように返していた。

```c#
return new HttpStatusCodeResult(HttpStatusCode.OK);
```

## 対処方法
ActionResultを以下のように書き換えた。

```C#
return Json("OK");
```

## 考察
検証はしていないが、おそらくクライアントに返却するレスポンスヘッダがnew HttpStatusCodeResult(HttpStatusCode.OK)では正しく生成されておらず、Cookieの書き換えが正常に行われていなかった。
Json("OK")ではレスポンスヘッダがきちんと生成されていてCookieの書き換えが正常に行なわれていたものと思われる。


## 結論
**気軽にActionResultにnew HttpStatusCodeResult(HttpStatusCode.OK)を返してはいけない**
【初心者】pythonで０から Project Euler を解いてみた23

今回はEuler23問目解くわ！！！
問題はここ
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2023
この問題は正直完璧ではないわ（　＾ω＾）・・・
もし、いいコードやアルゴリズムがあるならコメントで教えていただきたいでそうろう
#コード
```python
import sympy
limit = 20161 #28123
exc_num = [] #過剰数
cre_num = []
result_num = []
for i in range(1,limit+1):
    if sum(sympy.divisors(i)[:-1]) > i:
        exc_num.append(i)
for n in range(len(exc_num)-1):
        for m in range(n,len(exc_num)):
                temp = exc_num[n] + exc_num[m]
                if temp < limit:
                        if temp not in cre_num:
                                cre_num.append(temp)

print(exc_num)
print(cre_num)
for i in range(1,limit+1):
        if i not in cre_num:
                result_num.append(i)
print(result_num)
print(len(exc_num))
print(len(cre_num))
print(sum(result_num))
```
<b>問題では上限が28123だったのだけどwikiで過剰数について調べていたら上限が20161と書いてあったのでそれを使いました
あと、20161だと正解するのに28123だと正解しないのがこのプログラムの不完成なところであります</b>
私は、まずexc_numにlimitまでの過剰数をリスト化したわ！！
そしてここで二つの過剰数で出来る数をリスト化したわ

```python
for n in range(len(exc_num)-1):
        for m in range(n,len(exc_num)):
                temp = exc_num[n] + exc_num[m]
                if temp < limit:
                        if temp not in cre_num:
                                cre_num.append(temp)
```
そして最後にないものだけ足したのが答えだわ
もしここが違うやこうしたらうまくいったなどぜひぜひコメントいただきたいです。
webarenaでubuntu その37

#概要

webarenaでubuntu18.04やってみた。
php7.2やってみた。

#splitが無い。

```
explodeで代替
```

#ereg_replaceが無い。

```
preg_replaceで代替
```

#eregiが無い。

```
preg_matchで代替
```

#nowが無い。

```

```
以上。
IntelとAMDのプロセッサを混載したクラスターでMPIは走るか？

![ryzen.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489195/71acd403-71b9-b119-56f2-d7a283264ab4.jpeg)

###IntelとAMDのプロセッサを混載したクラスターでMPIは走るか？

現在、i5-8400を載せたノードが10台、i5-9400Fを載せたノードが3台、Ryzen5-3600を載せたノードが1台あります。
コンパイラはgfortran+openmpiで、OSはUbuntu 18.04です。
(追記：g++とopenmpi, gcc+openmpiでも無事動作しました。）

IntelとAMDのプロセッサを混載したクラスターでMPIは... 問題なく走りました。
i5とRyzen5の性能差も、概ねusersbenchmarkの通りで、コンパイラによる差はなさそうです。

動いてみれば当たり前とも思われますが、記事が見当たらなかったので報告しておきます。

なお、RaspberryPi+Raspbianのノードをメンバーに加えたらクラッシュしました。
[はじめてのRDBOX(4)]rdbox使ってみました：ROS Subscriber編

# はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。（連載記事です）

# 今回の記事の概要
- 以前の記事で定義したメッセージに従い画像ファイルを待ち受け、取得(Subscribe)した画像ファイルを指定ディレクトリに保存する ROS アプリを構築する
- 作成したソースファイルを GitHub に登録する
- 今回の記事に該当するソースファイルは、以下のアドレスから参照可能です
  - https://github.com/higuchi-toshio-intec/example-picam/blob/master/picam_ros/scripts/sub_photo.py

# 構築
## 関連パッケージ
- 画像データ取り扱いに関連して OpenCV を使用している

  ```
  $ sudo apt install -y python-opencv ros-melodic-cv-bridge
  ```

## ROS アプリ作成 : scripts/sub_photo.py
- 今回の記事のアプリソースファイルの作成
  - 画像データ受信（＝Subscribe）する
  - 受信した画像データをファイルに保存する
- 以下(↓)は具体的な手順（下記例では、GitHubよりファイルを取得）

  ```
  $ mkdir -p ${HOME}/ros_ws/src/picam_ros/scripts
  $ cd ${HOME}/ros_ws/src/picam_ros/scripts
  $ curl -s -o sub_photo.py https://raw.githubusercontent.com/higuchi-toshio-intec/example-picam/master/picam_ros/scripts/sub_photo.py
  $ chmod +x sub_photo.py
  ```

### ソースファイルの主要部分説明
- 画像ファイルの待ち受け（Subscriber）
  - トピック名称：example_picam_photo
  - データ型：picam_photo
  - Callback：save_photo
  - 以下(↓)は対応する部分

  ```
  def sub_photo():
      rospy.init_node('sub_photo', anonymous=True)
      rospy.Subscriber('example_picam_photo', picam_photo, save_photo)
      rospy.spin()
  ```

- Callback （メッセージ picam_photo が届いたら呼び出される処理）
  - 引数の数：1
  - データ型：picam_photo
  - 以下(↓)は対応する部分

  ```
  def save_photo(msg):

      print("[INFO] Call : save_photo")
      ### 以降省略 ### 画像ファイル作成などの処理 ###
  ```

## GitHub への登録
- 作成したファイル全てを GitHub に登録
  - clone 済みなので、add/commit/push を実行
  - commit メッセージは、あとでどのような commit であるかわかるようにすると良い
- 以下(↓)は具体的な手順

  ```
  $ cd ${HOME}/ros_ws/src/picam_ros
  $ git add .
  $ git commit -m 'CommitMessage'
  $ git push
  ```
- 念のため、ブラウザで以下のアドレスに接続し GitHub の登録状況を確認する
  - https://github.com/YourGitHubAccount/picam_ros

## アプリ起動
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/ros_ws
$ source /opt/ros/${ROS_DISTRO}/setup.bash
$ source devel/setup.bash
$ rosrun picam_ros sub_photo.py
```

---
# 記事リスト
1. [概要編](https://qiita.com/higuchi-toshio-intec/items/5d5499447d667e339b87)
2. [画像参照アプリの構築編](https://qiita.com/higuchi-toshio-intec/items/1deae0d03a74bafec8af)
3. [ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b)
4. [ROS Subscriber編](https://qiita.com/higuchi-toshio-intec/items/3d62bbfc5e520de9dce1)（← 今回の記事）
5. [ROS Publisher編](https://qiita.com/higuchi-toshio-intec/items/0c136f4d90e70983a8a3)
6. [DockerImage 作成編](https://qiita.com/higuchi-toshio-intec/items/826b4c5407b05372b78c)
7. [RDBOX(k8s) ポート転送編](https://qiita.com/higuchi-toshio-intec/items/b3b79da5ca160ee418b0)
8. [RDBOX(k8s) Subscriber アプリ編](https://qiita.com/higuchi-toshio-intec/items/765d7ef1b6baf85d9f02)
9. [RDBOX(k8s) Publisher アプリ編](https://qiita.com/higuchi-toshio-intec/items/9c43e001d8098a6c7a40)
10. [雑記](https://qiita.com/higuchi-toshio-intec/items/5d80fd647514dfbd2938)
ASP.NET MVC5 でAction名とView名は統一すべき

# タイトルから何が言いたいのかわからん

こういう作り方、すごく気持ち悪いです。
Index2のActionからはIndex2のViewが表示されるべき。

``` SampleController.cs
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index()
        {
            /* なんやかんや処理 */
            return View(nameof(Index2));  // ←ActionがIndexなのにIndex2のViewが表示される
        }

        [HttpPost]
        public ActionResult Index2()
        {
            /* なんやかんや処理 */
            return View(nameof(Index3)); // ←ActionがIndex2なのにIndex3のViewが表示される
        }
```

# Action名とView名の基本

Actionメソッドの作り方としては、以下のようにView名を省略したものが基本となる。

``` SampleController.cs
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }
```

ここから例外処理や処理分岐などで表示するViewが変化することはあっても、基本的には正常時に表示されるのはIndex.cshtmlであるのが綺麗な姿である。
また、画面修正時時にurlから修正対象のViewが一発でわかるためメンテナンス性もよい。

# 課題
入力エラー発生時に前の画面に戻したい場合、urlとViewに差異が発生するため気持ち悪い。

``` SampleController.cs
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index2(SampleViewModel vm)
        {
            if (ModelState.IsValid){
                return View(nameof(Index)); // ←urlがIndex2なのにIndexのViewが表示される
            }

            new SampleModel().Register(vm);
            return View(vm);
        }
```

RedirectToActionを利用すればある程度回避できるが、前のActionがPostだったりすると使えなかったり、GetでもModelStateをTempData経由で持ち回る必要があったりして無理矢理感が拭えない。

``` SampleController.cs
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index2(SampleViewModel vm)
        {
            if (ModelState.IsValid){
                return RedirectToAction(nameof(Index));
            }

            new SampleModel().Register(vm);
            return View(vm);
        }

        [HttpPost]
        public ActionResult Index3(SampleViewModel vm)
        {
            if (ModelState.IsValid){
                TempData["ModelState"] = ModelState;
                return RedirectToAction(nameof(Index2)); // Getで定義されたActionがないのでエラー
            }

            new SampleModel().Register2(vm);
            return View(vm);
        }
```
Growiにシンタックスハイライトの対応言語を追加する

# Growiの標準対応コードシンタックスハイライト
Growiが標準で対応しているコードのシンタックスハイライトはhighlight.jsのcommon、[ここ](https://highlightjs.org/static/demo/)のcommonタブにあるもののみ。
標準ではPowerShellやTeXなどが対応していない。

これは、カスタムHTML HEeaderにCDNを追加することで対応できる。

# Growiにシンタックスハイライトの対応言語を追加する

## 1. 対応したい言語のjsをCDNのhighlight.jsから探す

https://cdnjs.com/libraries/highlight.js/ から探す。
PowerShellの場合`https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/languages/powershell.min.js`だった。

## 2. カスタムHTML Headerに追加する

Growiに管理者権限でログインし、[管理] → [カスタマイズ] → [カスタム HTML Header] へ
ここに、①のURLをソースとするscriptタグを追加する。

```HTML:PowerShellの場合
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.6/languages/powershell.min.js" defer></script>
```
睡眠タイプ診断テストを作ってみた ～ 夜寝れない人要チェックです

僕のポートフォリオ（過去に作った作品）を紹介するコーナーです。


##●睡眠タイプ診断テスト


##https://r4.quicca.com/~douraku/My%20Checker


![睡眠タイプ診断テスト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/a03fdfa5-6b63-4f7f-6437-c093721646a9.png)



###ライオン型　・　クマ型　・　イルカ型　・　オオカミ型


ヒトには、大体４種類の睡眠タイプ（クロノタイプ）があるらしい。
　
#・朝起きるタイミングは、いつがいいの？
#・夜寝る時間のベストは？
#・運動のパフォーマンスが上がる時間帯　etc....
　

この睡眠タイプを知れば、上記のことが、科学的に全て分かっちゃう！
という話を聞きましたが、
それぞれのタイプ判定の方法がなかなかややこしい…。


ならば、
##「自分で診断テストアプリを作るしかねえ！！」
と一念発起。

###僕がプログラミングで最初に作った作品です。
*JavaScript/jQuery* を主に使って作ってます。

最初の作品なので、結構しんどかったですが、
###動いた時はマジで飛び跳ねて喜びましたねえ～！


アプリとしての「質」は置いておいて、
#####【診断結果】に出てくる「タイプ別の行動時間帯」とかは
#####科学的に根拠があるものなので、是非チェックして欲しいです！＾＾
【スロット】アナザーゴッドハーデスのGODを引く確率【確率】

みなさん、GOD引いてますか？
今年の12月でハーデスは撤去ですね、ってことで記事を書きます。
![IMG_2903-1-728x546.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/26fa9f0c-7128-96ec-b175-f919a9d2ca69.jpeg)

#ロジック
GODを引く確率をp(=1/8192)とします。
n回回したときに、g回GODを引く確率は

```math
{}_n C_g(1-p)^{n-g}p^g\\
g \leq n
```

となります。

n回回したときに、少なくとも1回以上GODを引く確率は

```math
1-(1-p)^{n}
```

となります。

n回回したときに、少なくともg(≧1)回以上GODを引く確率は

```math
1-(1-p)^{n}-\sum_{i=1}^{g-1} {}_n C_i(1-p)^{n-i}p^i
```

となります。

例1:
2000回回したときに、1回GODを引く確率

```math
\begin{align}
&{}_{2000} C_1(1-1/8192)^{2000-1}(1/8192)^1\\
&\fallingdotseq0.1912748\\
&=19.12748{\%}
\end{align}
```

例2:
4000回回したときに、3回以上GODを引く確率

```math
\begin{align}
&1-(1-1/8192)^{4000}-\sum_{i=1}^{3-1} {}_{4000} C_i(1-1/8192)^{4000-i}(1/8192)^i
\\
&\fallingdotseq0.0135081\\
&=1.35081{\%}
\end{align}
```
![imagesJQHGPDJN.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/5efb9e95-1eec-2e0d-7932-6cd018919758.jpeg)

#プログラム

プログラムは<a href="https://codepen.io/olj611/pen/rNBwjzj">こちら</a>から動かすことができます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/7e0f8476-b4d6-22b3-4831-c32ae92cca14.png)


```js
$('#calc').click(() => {
  const p = 1 / 8192;
  const n = parseInt($('#trial_number').val());
  const g = parseInt($('#god_number').val());
  if(n < g) {
    $('#probability').text('入力値が不正です');
    return;
  }
  let gp;
  if($('input[name=type]:checked').val() === 'equal') {
    // GODを指定回数引く
    gp = math.combinations(n, g) * Math.pow(p, g) * Math.pow(1 - p, n - g);  
  } else {
    // GODを指定回数以上引く
    if(g === 0) {
      $('#probability').text('入力値が不正です');
      return;
    }
    let mgp = 0.0;
    for(let i = 1; i <= g - 1; i++) {
      mgp += math.combinations(n, i) * Math.pow(p, i) * Math.pow(1 - p, n - i); 
    }
    gp = 1 - Math.pow((1 - p), n) - mgp;
  }
  gp *= 100;
  $('#probability').text(gp.toFixed(5) + '%');
  
});
```

では、楽しいGODライフを!!!
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/8170f37f-8a40-e516-9943-84826c51ae6f.png)
PostgreSQL  JOIN句を使ったUPDATE

## JOINを使用したUPDATE文

MySQL使用時は問題なかった構文がPostgreSQLでが構文エラーになってしまったので、
備忘録。

以下、流したSQL
構文はMySQL時には実行できていた書き方
postgreSQLでは構文エラー

```sql:MySQL
UPDATE
  tbl_a A
SET 
  A.set_rating_status = '1'
JOIN 
  tbl_b B ON B.contents = A.contents
JOIN
  tbl_c C ON C.id = B.id
JOIN
  tbl_d D ON D.name = C.name
WHERE 
  A.cid NOT IN (SELECT cid FROM tbl_e)
AND
  D.delete_flg = '0';
```

以下に成型してエラー解消し、実行できた。
慣れない。。。
ややこしい。。

```sql:postgreSQL
UPDATE
  tbl_a
SET
  set_status = '1'
FROM 
  tbl_b B
JOIN 
  tbl_c C ON C.id = B.id
JOIN
  tbl_d D ON D.name = C.name
WHERE
  B.contents = tbl_a.contents
AND
  tbl_a.cid NOT IN (SELECT cid FROM tbl_e)
AND
  D.delete_flg = '0';
```
Slack の名前を表す項目のまとめ

Slack には `fullname` `displayname` `username` という３種類の名前を表す項目が存在しており、どう使い分けるのがいいかいつもわからなくなるためまとめる。

参考： [Slack でメンバーの名前を管理する – Slack](https://get.slack.help/hc/ja/articles/115004685366)

## 項目ごと
### 氏名 / Full name / `real_name`
**ユーザプロフィールで表示される名前**で、本名を入れるべきっぽい項目。

半角スペースはもちろん入れれるし日本語も使える。
また、ワークスペース内で重複できる。

**入力必須**で、空白にすることはできない。

### 表示名 / Display name / `display_name`
**メンションで表示される名前**で、ニックネームなどを入れるべきっぽい項目。

半角スペースも日本語も使える。
こちらはワークスペース内で重複できないと思われがちだが、実はこちらも重複できる。

氏名と違って入力必須ではない。

### ユーザ名 / username / `name`
**今はもう使われていない名前？**

画面上からは確認できず編集もできないので、普通に使っていたら知ることがない項目。

文字は半角英数記号のみで、アカウント登録時メールアドレスの `@` より前の文字列が自動で設定されているっぽい。

管理画面からユーザ一覧 CSV をダンプしたり Slack API を叩いたりすると確認できるが、ChatBot 開発時などにユーザごとにユニークな文字列が欲しければ `userid` を使ったほうがよさそう。

## 用途ごと

### メッセージに表示される名前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/43d81d34-f748-df76-579b-c8b47595296a.png)

これは設定に応じて「氏名」「表示名」のどちらかが表示される。

ワークスペースのデフォルト設定はワークスペース管理者が設定することができる。
また、Slack アプリの「環境設定」からユーザ自身で設定を切り替えることもできる。

### プロフィールに表示される名前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/2a579a1c-2391-f4c1-5006-e39c315c1176.png)

これは「氏名」が表示される。

### メンションで表示される名前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/af731989-1961-c69c-0c2b-1b7e229078f8.png)

これは「表示名」が表示される。
ただし「表示名」が設定されていないユーザは「氏名」が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/22a434b5-1b34-ec5d-b7cd-c34539e8dd22.png)

入力補完の際は「氏名」「表示名」どちらでも補完される。
正規表現で単語にマッチさせる方法

```
seki 087-7472-3778
hayashiwww 899-3455-2344
hataka 738-3838-2747
```
`hataka`だけにマッチさせたい時は以下のようにする

```
\b\w{6}\b
```
<font color="red">\bは単語の境界を認識するメタ文字である。</font>
Node.jsからElasticSearch検索

#はじめに
曖昧検索、全文検索はElasticSearchのほうがよいと思います。
Node.jsからの利用をする際には、直接ElasticSearchのAPIを呼ぶか、elasticsearchモジュールを利用するかなどの選択肢がありますが、
elasticsearchモジュールを使ったほうが簡単で効率です。

#ElasticSearchインストール
`npm install elasticsearch`

#クライアント生成
```javascript
const elasticsearch = require('elasticsearch');
const client = new elasticsearch.Client({
  host: 'localhost:9200',
  log: 'trace'
});
```

#検索例
```javascript
const response = await client.search({
  index: 'blogs',
  body: {
    query: {
      "multi_match" : {
        "query":    "Node.js",
        "fields": [ "title", "*_tag" ] 
      }
    }
  }
})

 
for (const blog of response.hits.hits) {
  console.log('blog:', blog);
}
```

検索クエリの書き方は下記記事参照：
https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html

AWSのElasticSearchの場合は開発ガイドがあります。
https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html

ElasticSearch新しいJavascriptのクライアントがリリースれました。
https://www.elastic.co/blog/new-elasticsearch-javascript-client-released

以上
[理系大学生応援] モンテカルロ法で円周率を求める


記事更新
2019 Aug. 30: 図を追加

# 理系大学生(勝手に)応援企画

この記事は、自分が日々Pythonスクリプトを書いている際に気づいた備忘録でありつつも、「理系大学生だけれどもプログラミングの知識あまりなくて、課題提出がツライ」などの学生さんをサポートする記事です。

今回はタイトルにある通り「モンテカルロ法を用いて円周率3.141592...を求めなさい」という課題応援です。

# モンテカルロ法とは

**確率を用いてなんらかの値を見積もる方法**(と私は解釈している)。

# 円周率を求める(アルゴリズム)

今の場合、$x \in [0, 1]$, $y \in [0, 1]$の領域に点をランダムに描画していき、それが円の4分の1の中に存在する確率から円周率を求めていきます(下図参照)。

![pi_estimate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/a373c4c2-4476-4d43-11e5-015bed525050.jpeg)

# 円周率を求める(Pythonスクリプト)

```python:pi_estimate.py
#!/usr/bin/env python


import numpy as np


class PiEstimate:
	def __init__(self):
		self.NRAND = 10000

	def pi_estimate(self):
		# set (x, y)
		x = np.random.rand(self.NRAND)
		y = np.random.rand(self.NRAND)
		# compute distance from origin
		dist = x * x + y * y
		# count sum of the number of distance < 1
		under = np.count_nonzero(dist<1)
		# estimate PI
		pi = 4 * under / self.NRAND
		# print result
		print(pi)

	def run(self):
		self.pi_estimate()

if __name__ == '__main__':
	a = PiEstimate()
	a.run()
```

## スクリプト詳細

### \_\_init\_\_

`self.NRAND`でランダムに打つ点の数を指定しています。上述のスクリプトでは10000としていますが、この値を様々に変えて、計算結果がどのように変化するか考察してみるのも面白いでしょう。

### pi_estimate

```python
np.random.rand(self.NRAND)
```
で、0~1のランダムな値が入った要素数self.NRAND個のリストを作成しています。

```python
dist = x * x + y * y
```
で、その点の原点からの距離の2乗を求めています。

```python
np.count_nonzero(dist<1)
```
で、条件`dist < 1`の条件を満たす要素数の合計を計算しています。細かく説明すると`np.count_nonzero`はTrueの要素数を数える関数です。Trueは1, Falseは0として扱われるので、`np.sum`関数を使用しても同様の結果が得られます。

最後に得られる結果`under/self.NRAND`は円の4分の1の面積の中に点が入る確率を表していますので、これを4倍することで円周率を求めることができます。

# 結言

これを応用すれば、様々な積分や物理問題を解くことが可能です。アルゴリズムを理解しいろいろなことに応用していきましょう。何よりこの記事が理系学生のプログラミングの後押しになればこれ幸いです。
gitで幽霊ブランチが手元に残る件

マージするときにブランチを削除しても`git branch -a`で消したはずのブランチが表示されることがある。
この幽霊をローカルに適用するには以下のコマンドを叩く

```zsh:
$ git remote prune origin
```

```zsh:備考
# branchの追跡状況を確認
$ git remote show origin
# → 「stale (use 'git remote prune' to remove)」は削除して良さそう

# fetch, pullするときにまとめて適用しちゃう
$ git pull/fetch --prune
```
#ruby でインタンス変数を削除・未定義状態にする ( remove_instance_variable :@some_variable )

Use #ruby to delete an instance variable and make it undefined (remove_instance_variable: @some_variable)


`remove_instance_variable :@some_variable`

# 例

```
[11] pry(main)> @a = :b
=> :b
[12] pry(main)> defined? @a
=> "instance-variable"
[13] pry(main)> remove_instance_variable :@a
=> :b
[14] pry(main)> defined? @a
=> nil
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2358








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravel 5.8 の環境を構築する。

1. Laradockからのセットアップ

構築方法は、[ここ](https://qiita.com/hrsi_tw/items/9828dc22069cbfb68530)

```
$ docker-compose exec --user=laradock workspace bash
```

２. Laravelインストーラ

```
$ composer global require laravel/installer
```


3.　プロジェクト作成

redQueen：アンブレラ社が開発した最先端かつ高性能の人工知能で、
ハイブ全体を統御するメインコンピューター。

```
$ laravel new redQueen
```


4.　hosts追加

```
$ sudo vim /private/etc/hosts
127.0.0.1       redQueen.local
```

5.　動作確認

![スクリーンショット 2019-08-29 12.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33953/fe4324df-694b-90cc-8131-f50e02f66008.png)

![スクリーンショット 2019-08-29 12.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33953/f08588ac-79a0-f10f-f600-86268f787458.png)
Linuxユーザーがラズパイ起動SDカードを作る最もシンプルな方法

# はじめに

ラズパイ起動方法は公式サイトにも詳しく載っていますし、いろいろな本やWebサイトでたくさん紹介されています。
ところが、最も簡単と言われているNOOBSは実はSDカードとの相性問題があってうまく起動しない場合があったりします。
それならばとSDカードにraspbianの起動イメージを書き込もうと思っても、多くのツールはWindows向けだったり、Linuxでは導入が面倒だったりします。
結局、Linuxユーザーはコマンドラインでやるのが一番確実で早いと感じたので手順をメモしておきます。

# 環境
- ホストPC：Ubuntu 18.04.2
- Raspberry Pi 2 Model B
- Raspbian Buster (Release date:2019-07-10)


# Raspbianを入手

[公式サイト](https://www.raspberrypi.org/downloads/raspbian/)からdesktop and recommended softwareをダウンロード。
その気になればwgetとかのコマンドでできますが、最新バージョンを確認しつつダウンロードするにはブラウザでやったほうが早いので、意地を張らずにブラウザでダウンロードします。

## SHAが一致することを確認
以前、ダウンロード時にデータが狂っていたのが原因でOSが起動しなかったことがありました。
そのときは原因特定に１日かかりました。。。SHA確認大事です。エラーは起きるものです。

```
$ sha256sum 2019-07-10-raspbian-buster-full.zip 
2bd0613ec8739b6fa4274ea186ec859046f79e6aee4b8c6af0acb6d88f3f533a  2019-07-10-raspbian-buster-full.zip
```

# SDカードのデバイス名を確認

ダウンロードしたイメージを書き込むために、ホストPCでSDカードがどのように認識されているかを確認します。
SDカード挿入前と挿入後に`lsbsk`を実行します。挿入後に増えた項目がSDカードのデバイスを指しています。
下記の例でパーティションが別れているのは、このSDカードを以前にもラズパイに使っていたからです。

```
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part /media/***/boot
└─mmcblk0p2 179:2    0  14.4G  0 part /media/***/rootfs
```

パーティションがマウントされている場合は、アンマウントします。

```
$ umount /media/***/boot
$ umount /media/***/rootfs
```

こんな感じになります。

```
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part 
└─mmcblk0p2 179:2    0  14.4G  0 part 
```


# SDカードに書き込む

zipファイル展開とSDカードへの書き込みをまとめて行います。ofオプションに、上で調べたSDカードのデバイス名を指定します。
結構時間かかるので気長に待ちます。

```
$ unzip -p 2019-07-10-raspbian-buster-full.zip | sudo dd of=/dev/mmcblk0 conv=fsync
12566528+0 レコード入力
12566528+0 レコード出力
6434062336 bytes (6.4 GB, 6.0 GiB) copied, 1369.22 s, 4.7 MB/s
```

# まとめ

これでラズパイOSイメージをSDカードに書き込むことができました。あとはSDカードをラズパイに挿して電源を入れ、画面に従ってラズビアンの初期設定をすればOKです。

ラズパイに限らず、初心者でも簡単に扱えるようにいろいろな便利ツールが用意されています。もちろんそれのおかげでとても楽ができることも多いですが、どこかで躓いてしまうと何が原因なのかさっぱりわからなくなってしまいますね。そんな時はエンジニアたるもの初心に戻ってコマンドラインで地道にやるのが、結局は一番の近道になることもありますね。
【メモ】MyBatisの謎の動き、リストオブジェクトの要素にnullを設定して返してくる。

参考までに、
SQLの「Select項目が全部null」で、かつ「returnをList型で受けてる」と、
「sizeが1」で「リスト要素にnullを設定した」すげーこまるリストオブジェクトが返却されるので気を付けてください。
僕は、使わないけど行番号を付けてとりあえず回避しました。

事前に下記の内容をチェックしていると、実行バグを回避可能かと思われる。
1.必須カラムを含んでいる
2.WHERE句で「IS NOT NULL」のチェックしているカラムを含んでいる
Rでわからなかった関数

### numeric
標本平均の標本分布を求める際に、標本抽出を10000回行った。

標本平均 <- numeric(length = 10000)

for (i in 1:10000){ 
	標本 <- rnorm(n=10,mean=50,sd=10) 
	標本平均[i] <- mean(標本) 
}

numeric(length = 10000)は10000回分の推定値を格納する「標本平均」という名前の変数を作るためのものである。
数値の入る引き出しを10000コ作るというイメージを持つとわかりやすい。各引き出しには1から10000までの通し番号がついている。その中に入っている値は、標本平均[1],標本平均[2],・・・・・標本平均[10000]というふうにすることで指定できる。


### coef()

coefficients(obj)   回帰係数 (行列) を抽出．coef(obj) と省略できる．
分子コンペの振り返り（Kaggle）

![thumb76_76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211031/e2811542-3f19-9b90-1478-b17c1bdf5fd7.png)

本日分子コンペがついに終わりましたので、自分の頭の整理を目的にツラツラと書いていきます。

# そもそもKaggleとは？
機械学習分野のコンペサイトです。ざっくり言うとデータセットと評価指標が与えられ、期間内に誰が最も優れたモデルを作成できるかを競うものです。
※コンペによっては期間がないものもあります。
色々な人がKernel（要はソースコード）を公開してくれているので、Kernelを読むだけでも勉強になります。
また他の人のコードをForkして自分なりに改良して結果を提出できるので、「全然何したらいいかわからない！」という人でも簡単にコンペに参加できます。
Kaggleをはじめた時は、そもそも機械学習分野を全く分からなかったので、とりあえずコンペに参加してみてKernelをForkして、
自分で実行しながら何やってるの？をずっと勉強していまいした。
結果を送ると直ぐにPublic Leaderboardにスコアと順位がでます。自分が実施した改良がどのくらい影響があったのかなどもすぐにフィードバックを得ることができます。
何よりこの順位がすぐ出るという点が私は好きで、結構モチベーション維持に役立ってくれています。

# コンペの概要
[本コンペ](https://www.kaggle.com/c/champs-scalar-coupling/overview)は、分子内にある原子間の相互作用を予測することが目標でした。
すでに化学分野ではこの計算する技術はあるものの、とにかく時間がかかる。PDCAを回すのがきついということもあり、より高速で信頼性の高い方法はないか？ということで本コンペが開催されています。
コンペには最終的に2755チームが参加しました。

# 最終的な結果
過去最高の37位で終えることができました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211031/6fafd370-1173-5f2d-00e4-38eae78d3b9a.png)

初めてチームを組みました。
異なるアプローチで出した結果のアンサンブルの有効性や、情報交換は有用だなと感じました。
チームメンバーからアドバイスをもらい、私が作成したLightGBMのモデルのスコアも-2.100（100位くらい）になりました。
もしもチームを組んでなかったら、ギリブロンズメダルに入るか？くらいの順位だったと思います。

# コンペ参加から終わりまでにやったこと
以下は基本時系列にトピックを記載しましたが、厳密にはいくつかの工程を行ったり、戻ったりしながら進めていきました。

**ドメイン知識取得**
- 量子科学を専攻していた後輩に「これ何？」を教えてもらう
- とりあえず量子科学の本を買って軽く読んでみる
- Kaggle内のKernelでデータを色々と見てみる
**特徴量を探索**
- LightGBMのKernelをForkして、特徴量を追加してみる
- 毎日出てくるKernelとDiscussionを毎日眺めて、追加できない特徴量がないか探す
- 特徴量の重要度を出し、上位の200件の特徴量でモデルを作成・結果を出力する
**環境構築**
- 特徴量が増え、データサイズが大きくなりKaggle環境のメモリに入りきらなくなるので、GCPで環境を作る
**チームを組む**
- 最後の3weekごろに、Matiasからダイレクトメッセージが来てチームを組むことになる
**メンバーとの情報交換**
- matiasが使っている特徴量を追加して再度学習する
**Meta featuresの作成**
- どうやらFCを予測したものを追加するとモデルの精度が上がることが分かったので、色々な特徴量の組み合わせでFCを作る
**パラメータチューニング**
- BayesSearchCVでパラメータチューニングする
**新メンバーがチームに加入**
- Annaが新しくチームに追加する
**アンサンブル**
- メンバー個々人の結果を重みづけも含め色々と試行してアンサンブルする

# 自分が作成したモデル
基本Public Kernelに書いてある流れとあまり変わりはないです。
データをKFoldで5に分けて、typeごとにモデルを作成するというもの。
以下に利用した特徴量を記載します。基本的にはPublic KernelやDiscussionにあった特徴量を追加。個人的なEDAで追加したのは原子間の距離とmulliken_chargeの積くらいなと。

**特徴量（実際はもっとあると思いますが、覚えている限り）**
- x,y,zから作成した2原子間の距離
- bond
- 2原子間の距離とmulliken_charge(Open Babelの結果)の積
- 各原子の近傍に存在する原子の情報（距離が最も近い正の原子上位5件、負の原子上位5件）
- meta feature(FC)
- Public Kernelで利用している特徴量（Giba等）
- ポイントとなる特徴量のAggregate
- QM9
- etc...

# 最終的なソリューション
ベースとしては、LightGBM、GNN(Graph Neural Network)、NN(Neural Network)の3つのモデルの結果をアンサンブルしています。
アンサンブルした結果のスコアは-2.426くらいとなっており、単体のモデルで最も強かったのはGNNで-2.3ありました。
最後に参加したAnnnaがGNNはコードを作成しており、[このDiscussion](https://www.kaggle.com/c/champs-scalar-coupling/discussion/93972#latest-602628)を参考にして作ったとのこと。コードを見ましたが全然分からず…
ちなみに私の作成したLightGBMは-2.1くらいでした。
3つのモデルの結果だけでなく最後は結構泥臭い感じでアンサンブルした結果が伸びないかやっていました。
例えば、過去のちょっとスコアが低いものや、random_seedを変えた結果、あとはPublicに出ているKernelの結果など…
ソリューションとしては結構泥臭く、綺麗ではないです。

# 反省と今後
やっぱりGNNが強かったなと。
LightGBMが途中で伸び悩んだ時にGNNにも着手しようかと思ったのですが、「んーわからん！サンプル少ないし…」と思いやめてしまったんですよね。
まだまだ他のKagglerに依存した形でしか動けていないのが現状です。
この1年Kaggleを通して大体何をしなくてはいけないのか？はわかってきました。
現状の依存した状況から脱却するためにも、もっと自分で論文等の1次ソースを読み、実装に反映させていくことに今後取り組みたいと思っています。
phpの開発環境用のdocker-compose

![horizontal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/c8ad8b75-0dd4-e108-4a17-488ba3751fc8.png)
[fattyrabbit/php-fpm](https://cloud.docker.com/u/fattyrabbit/repository/docker/fattyrabbit/php-fpm)を利用したローカル開発環境のdocker-compose

全体ソース：https://bitbucket.org/FattyRabbit/php-dev-docker-compose/src/master/

概要：phpの開発（laravelの開発用）のためにlocal環境を作成する目的で、以下を目指しました。 

- 出来る限り軽い 
- 他のバージョンのPhpを同時に動かす

それで選択したのが「nginx」＋「php-fpm」の構成しました。

# php-fpmのカスタマイズ
元になる[phpのfpm](https://hub.docker.com/_/php)は問題点としてListenポートが「9000」固定で複数のfpmを同時に利用できないところが問題でした。その為に[phpのfpm](https://hub.docker.com/_/php)(まずは7.3)のDockerfileを改善してContainerを実行する際にポートを設定出来るように修正を加えました。

改善したphp-fpmのソース：
https://bitbucket.org/dockerfile_test/php-fpm/src/master/

# nginx
何回かテスト中に問題として出たのが***サーバーの設定ファイルの修正があった場合、Dockerfile内でCOPYを利用すると再Buildしても上手く更新されない***場合がありましたので、サーバーの管理をvolumesで管理するように設定しました。
これでDockerの再起動や中のデモンの再起動でも設定の変更が反映されるようになりました。

```docker-compose.xml
    proxy:
        build: nginx
        container_name: proxy
        build:
          context: .
          dockerfile: docker-nginx/Dockerfile
        volumes:
          - ./etc/logs/nginx:/etc/nginx/logs
          - ./etc/nginx/conf.d:/etc/nginx/conf.d
          - ./etc/nginx/letsencrypt:/etc/letsencrypt
          - ./www:/var/www/
        ports:
          - 80:80
          - 443:443
```

# php-fpm
このではListenのポートを「9001」にしてみました。

```docker-compose.xml
  php-7.3:
    build:
      context: .
      dockerfile: docker-php-7.3/Dockerfile
      args:
        LISTEN_PORT: 9001
    container_name: php-7.3
    volumes:
      - ./www:/var/www/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini
```

# nginxの設定
実際のウェブサーバーでphpを利用する設定です。

```/etc/nginx/conf.d/default.conf
   location ~ \.php$ {
        fastcgi_pass    php-7.3:9001;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
```
WEB関連の用語を分かりやすくまとめてみる②

#はじめに
今回の記事は前回の続きです。[前回の記事](https://qiita.com/renesisu727/items/6da49ca5b77a265ffe5f)も読んで頂ければ幸いです。それではまとめていきます。

##HTML、CSS、JavaScript
なにかと一緒にまとめられることが多いこちらの三つ。

プログラミングの参考書なんかでも三つ一緒に解説してあるところをよく見かけます。

実はこの三つは共通点があって、それは三つともフロントエンドで用いられる、という点です。

エンジニアの仕事は大きく分けて、ユーザーの目に触れるところを操作するフロントエンドエンジニアとユーザーの目に触れないところを操作するバックエンドエンジニアに分けられます。

以下に図解します。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/8b4ba12a-dd18-279a-1ab9-bddc041531be.png)
このように、HTML、CSS、JavaScriptはユーザーの目に触れるところにかかわるものです。それでは各々について解説していきます。
HTMLは[前回の記事](https://qiita.com/renesisu727/items/6da49ca5b77a265ffe5f)でも取り扱いましたが、HyperText Markup Languageの略称で、webの文章であるハイパーテキストを記述する際に用いられるマークアップ言語のひとつです。

他のマークアップ言語として、XMLやXHTMLなどがあります。


CSSはCascadiong Style Sheetsの略称で、HTMLやXMLの体裁を整えるときに用いられる言語です。

元々、HTMLの体裁を整えるときにはfontなどのタグが用いられていましたが、文章の構造と体裁の記述が入り混じったものとなり記述が複雑になったためにCSSとして分割されるようになりました。

HTMLファイルとCSSファイルは必ずしも分ける必要はなく、HTMLファイルの中にCSSを直接書き込むことも可能ですが、複数のHTMLで同じ体裁を用いるためにはCSSを別ファイルとすることが望ましいです。

また、例えば何かのサイトをPCでもスマホでも閲覧するようにするために、スマホ用とPC用のHTMLを作成することはとても面倒くさいですよね。

その時にはPC用のCSSとスマホ用のCSSを作成することで、同一のHTMLファイルを使いまわすことができます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/c1e9b9a7-e56f-87b9-705c-7e4c36ea690d.png)
JavaScriptはクライアントサイドスクリプトとして用いられることが多いです。

クライアントサイドスクリプトは、webブラウザ上で動くプログラミングであり、ブラウザへの処理とHTML、CSSの操作を主に行います。

JavaScriptは最近ではサーバーサイドスクリプトとして用いられることもあるようです。

##DOM
DOMとはDocument Object Modelの略称で、HTMLやXMLを制御・参照するためのAPIです。

プログラムとHTML、XMLの橋渡しに用いられます。現在ではほとんどのWebブラウザがDOMを実装しており、クライアントサイドスクリプトやWebブラウザに実装された機能などからWebページの内容を読み取ったり編集したりすることが可能となっています。![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/245aa020-e122-ddce-3780-a95f88992ba2.png)

##JSON
JSONは構造化したデータを表すためのデータ記述言語の一種です。

JavaScript Object Notationの略称で、書式がJavaScriptに従ったものになっていますが、他の言語でも操作できます。

データ構造はpythonの辞書型に非常によく似たものとなっています。

データを木構造として表すことができ、その点ではXMLに似ていますが、特徴としてはタグなどを用いない非常にシンプルな構造であるため、データサイズがかなり小さいことが挙げられます。

また、JSONをJavaScriptで操作する際はDOMを用いることなくそのまま読み込むことができるため、クライアントサイドスクリプトとしてJavaScriptが用いられることが多いWebの世界においては選択されやすいデータ形式となっています。

##Webアプリケーションの三層構造について
webブラウザで動作するアプリケーションをwebアプリケーションと呼びます。

webアプリケーションは三層構造になっていて、ユーザーとのやり取りを行うユーザーインターフェースである「プレゼンテーション層」、業務処理を行う「アプリケーション層」、データの処理や保管を行う「データ層」に分けられます。

プレゼンテーション層はwebブラウザとwebブラウザにより構成され、アプリケーション層はアプリケーションサーバーにより構成され、データ層はデータベースサーバー、つまりDBサーバーにより構成されています。

クライアントサイドスクリプトはプレゼンテーション層で、サーバーサイドスクリプトはアプリケーション層で動作します。![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/96c532c3-3bf5-9b12-8e89-236f3d6d2e7d.png)

##Web API
webブラウザはユーザーがデータを送信して、それに対してサーバーがデータを返送する、という仕組みで成り立っています。

これを応用して、Webを通じてユーザーではなくプログラムが直接サービスを利用するための窓口がWeb APIと呼ばれます。

クライアントであるプログラムがWeb APIを通じてサーバーにデータを送信し、それを受け取ったwebサーバーがデータを処理し、再びwebを通じてクライアントであるプログラムにデータを返送します。

クライアントはプログラムであるため、人が見やすいデータであるHTMLではなく、XMLやJSONのような構造化されたデータが返送されます。

#終わりに
今回はここまでになります。お付き合い頂きありがとうございました。