OmniAICreator/Qiita-1.07M huggingface dataset:
yumemi.vue memo

# アウトプットの重要性

新しいことはメモに
日々なんでもアウトプット
積み重ね


# NuxtでVueライフを快適に

容易に環境を整えたい
Nuxt.js　　Vueを快適に作るため
ルーティングが自動的に設定を生成
Vuex　store をインポート

### シンプル
NuxtでかくとVueのコードがシンプルに
SSRだけでなくVueが快適になるよ！


# Vueでネイティブアプリを　Ionic Vue

Native開発
weex-vue-Render

Ionic -> web技術でネイティブアプリ風に
iOSでネイティブアプリを作るのは割と簡単
- Ionicコンポーネントを基本使おう

# 宣言的UIってなんなの？？

欲しいUIを命令的に書かないで宣言的に書いていくことで可読性が上がる
宣言的に書いた方がすっきりするよね

# vue-nextのソースコードを読み始める

vue-next -> 乱暴にいうとVersion3

- 利用されるツール
istanbul -> テスト時のカバー率を確認できる
consoler -> 色付きでコンソールに表示
rollup -> バンドルするやつ

- ディレクトリ構成
- どこを読むといいのか
packagesに便利な奴がある
vue-nextはディレクトリがわかりやすく

compiler :コンパイル時に使う奴 
run-time :実行時に使う奴

# jQuery使いがVueを使った話

Vueの強み
- タグのようにコンポーネントがかける
- イベントの紐付けをタグとするから見やすい
- 配列要素の描画が簡単

# Vuexで何をするか、何をしないか

Vuex -> 状態管理の方法のパターンを提供(Fluxなどから影響)
単方向フローを強制する
グローバルデータの中央一元管理

安全にグローバルデータを管理したい
Page(View)に提供するもの

##アンチパターン
- emit,propの代わりに使う
再利用性が下がる
テストが難しくなる

- 全てのデータをVuexにおく
- 全てのロジックをVuexにおく
ロジックの単体テストが難しくなる

### 責務以外は全部アンチパターン！
Flaskで躓いた部分の備忘録

# はじめに
この記事は個人的な備忘録です。
自分に向けてのものなのでわかりにくい表現等があります。
参考程度にお願いします。

# エラー
###wtforms
####`'UnboundField' has no attribute ~`
フォームの作成時になんらかのエラーが起こるとこのFieldに化けてしまう。
（例: StringField → UnboundField）
大体formの`__init__`するときに
`super().__init__()`
してない場合

####Submit押しても反応がない
`app.logger.debug(form.errors)`
でvalidateのエラーを見てみる。

####DateTimeLocalFieldがvalidateで弾かれる
formatの指定が間違っている可能性がある。
`format='%Y-%m-%dT%H:%M'`にしてみる。

####`form.errors`で`Not a valid choice`が出る
選択肢が正しく挿入されていない可能性がある。
`/wtforms/fields/core.py`のSelectField関数内の`pre_valid`でloggerでchoicesの中身を見てみる
シェルスクリプト wait コマンド

##### wait コマンドを使うケース
シェルスクリプトでバックグラウンドで別のプロセスを動かしたい（並列処理させたい）。
ただ、シェルスクリプトの終了はバッググラウンドのプロセス終了も待ちたい。
wait コマンドにバックグラウンドのプロセスIDを渡すことで、そのプロセスが終了するまで待つ動きになります。
※もし wait コマンドを使わなければ、たとえバックグラウンドのプロセスがまだ終わってなかったとしても、フォアグラウンドでの処理がすべて終われば、シェルスクリプトは終了します。

##### バッググラウンドのプロセス終了を待つ
1. echo "Start background sleep" が実行されます。
2. サブシェルで sleep 10 コマンド（10秒待つ）をバックグラウンドで実行されますが、バックグラウンドなので、すぐに次の行の echo "Start foreground sleep" が実行されます。
3. フォアグラウンドで sleep 5 コマンド（5秒待つ）を実行されます。
4. 5秒後、sleep 5 コマンドが終了し、echo "End foreground sleep" が実行されます。
5. wait $! コマンドがあるため、直近で実行されたバックグラウンドプロセス（即ちサブシェル）の終了を待ちます。
6. さらに5秒後（スタートから10秒後）にサブシェル内の sleep 10 コマンドが終了します。
7. echo "End background sleep" が実行されます。

```bash:wait-example1.sh
echo "Start background sleep"
(
  sleep 10
) &
echo "Start foreground sleep"
sleep 5
echo "End foreground sleep"
wait $!
echo "End background sleep"
```

##### バッググラウンドのプロセスの終了ステータスを得る
wait \$! の後で $? で取得できる。

```bash:wait-example2.sh
(
  sleep 10
  exit 7
) &
wait $!
echo $? # 7
```

##### 複数のバッググラウンドのプロセスの終了を待つ
wait コマンドに複数のプロセスIDを渡すことで、それらのプロセスがすべて終了するまで待たせることが可能になります。
それでは、以下のように指定した場合、最後の終了ステータス（echo $?の結果）は何になるでしょうか？

```bash:wait-example3.sh
(
  sleep 3
  exit 3
) &
PID1=$!

(
  sleep 9
  exit 9
) &
PID2=$!

(
  sleep 6
  exit 6
) &
PID3=$!

wait $PID1 $PID2 $PID3
echo $?
```

一番最後に終了する 9 と予想したくなりますが、6 が出力されます。
wait コマンドに指定した最後の引数(ここでは $PID3)の結果が保持されます。
GraphQL でカクテル検索サービスを実装してみた


### はじめに
こんにちは。自分は普段 React でフロントを実装しています。最近 GraphQL に興味があって、REST 以外の選択肢を知っていると技術選定の幅が広がると思い、GraphQL で何かサービスを実装してみました。最後に感想を述べていますので、GraphQL への理解を深める参考になれば幸いです。以下に実際に動作する成果物を載せておきます。

### サンプルとコード

demo: https://liquor-react.netlify.com/
client source: https://github.com/yoneda/liquor-react-client
server source: https://github.com/yoneda/liquor-graphql-server

- 2019年12月15日 追記
 - GraphQL サーバーのデプロイ先をGlitch からheroku に移行して表示速度を改善しました。

### 全体の構成
フリーで使えるデータを探していたところ、[RapidAPI](https://rapidapi.com/) というサービスが見つかりました。そこで酒やカクテルを検索できる Cocktail DB API が見つかったので今回はこちらを使用しました。クライアントは React、サーバーは GraphQL で実装しました。GraphQL は、DB だけでなく、他の REST API だったり、または他の GraphQL も接続できるということでした。GraphQLはDBと接続されることが多いと思いますが、今回はREST形式のRapidAPI と接続しました。GraphQL は BFF のような働きをします。図にすると以下のような感じです。

![graphql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134076/a9e4f6bf-a11c-94e0-42df-ad037a764288.png)


### 使用技術
今回使った技術は以下の通りです。
クライアント: react, apollo-client, react-scripts, reach-router
サーバー: express, express-apollo-server, superagent, nodemon

### サーバーサイド

サーバーサイドは Express + ApolloServer で実装しました。ApolloServer ではスキーマを定義してそれに対応するリゾルバを実装していきます。RapidAPI から返されたJSON を見ながらスキーマを定義します。カクテルのリストを返すqueryは以下のようにしました。

``` graphql
  enum DrinkCategory{
    COCKTAIL
    COFFEE
    BEER
    OTHER
  }
  type Query{
    allDrinks(category: DrinkCategory): [Drink!]!
  }
  type Drink{
    id: ID!
    name: String!
    url: String!
    category: DrinkCategory
  }
```

### クライアント
クライアントは React + ApolloCLient で実装しました。React で GraphQL のクエリを発行するのはシンプルでした。コンポーネントのルートで GraphQL の URI を設定する、useQuery の Hooks でデータをフェッチする、この2つだけでサーバーと接続可能です。

### 実装した感想
#### Apollo Client の強力なキャッシュ機能が便利
Apollo Clientは、サーバーからのフェッチ結果をどこでもローカルにキャッシュします。Aコンポーネントでブログ記事を取得した後、Bコンポーネントから同じものをフェッチしようとしたときは、再度サーバーにリクエストを送らず、ApolloClinet がキャッシュしているデータにアクセスするので高速に表示されます。こういった実装はこれまでは Redux によって行われていました(AコンポーネントとBコンポーネントがアクセス可能な Redux の値を用意する。Aコンポーネントでブログ記事を取得した結果を Redux に入れておいて、Bコンポーネントがフェッチしようとしたときは代わりにRedux の値にアクセスするようにする)。Redux によってAction や Reducer を書いて、ほぼ自前で実装してたキャッシュの機能が、ApolloClient では最初から用意されています。コードを書く量が減ると思います。
#### バリデーションの手間が減る
サーバーサイドを Node.js で実装していて、バリデーションしたいときは別途ミドルウェアを組み込む必要がありました。ここでいうバリデーションとは、Request のパラメータ値の型をチェックしたり、その値が必須かどうかなどをチェックするような工程です。GraphQL でクライアント-サーバー間で型が保証されているというのは、開発者を安心させます。
#### GraphQL はリクエスト回数が少なくてすむ
REST と GraphQL の特徴を比較したときに、どちらが効率的にデータを取得できるかというと、自分は GraphQL の方が優れていると思います。特に、あるデータとその関連データを取得するような場面では、GraphQL の良さを発揮できるようでしょう。例えば、ブログ記事とその記事についたコメントを取得するAPIを実装してみるとします。

```
GET /articles/:id
GET /articles/:id/comments
```
REST では、上記のようにと2回リクエストを送るように実装するのが自然です。(もちろん、ブログ記事とそのコメントを同時に取得するような実装も可能です。1つのリソースに GET / POST / PUT / DELETE を割り当てて設計していく REST の思想に忠実に従うと、上記のような設計のほうが自然ではないかと思います。)

```
query{
  article(id: $id){
    title
    body
    postedComments{
      comment
      user
    }
  }
}
```
GraphQLでは、1回のリクエストで取得できます。さらに、必要なフィールドだけ指定して取得できます。無駄なフィールドは取得せず効率的です。GraphQLはデータを効率的に取得できるような設計になっていると感じました。

### 次回(予定)
今回はqueryだけだったので、次回はmutationやユーザ認証まで実装したいと思ってます。実装でき次第、この記事に追記するか、新しい記事として投稿する予定です！
Resilience4jドキュメントの日本語訳（非公式）を公開しました

# Resilience4jとは
Resilience4jは、Javaで実装されたサーキットブレイカーライブラリです。サーキットブレイカーとして有名なNetflixの[Hystrix](https://github.com/Netflix/Hystrix)は既に開発がメンテナンスモードに入っていて、積極的には開発がされていません。Resilience4jはその代替となるライブラリとして期待されています。

リポジトリ → https://github.com/resilience4j/resilience4j

公式ドキュメント（英語） → https://resilience4j.readme.io

ざっくりと理解したい場合は、僕がPivotal SpringOne Platform 2019でLTしたときのスライドをどうぞ↓

[From Hystrix To Resilience4j](https://speakerdeck.com/masatoshitada/from-hystrix-to-resilience4j)

# ドキュメントの日本語訳
今回僕は、Resilience4j開発者である[Robert Winklerさん](https://twitter.com/rbrtwnklr)から許可をいただき、ドキュメントを日本語訳して公開しました。ライセンスは本家と同様のApache License 2.0になります。全部ではないのですが、主要な部分は翻訳済みです。

日本語訳 → https://github.com/resilience4j-docs-ja/resilience4j-docs-ja/blob/master/README.md

タイトルにある通り、このドキュメントは非公式なものです。すなわち、Resilience4j開発チームとは一切関係がありません。日本語訳に正しくない部分があれば、それは僕を始めとした翻訳メンバーの責任です。

もし翻訳に間違いがあった場合は、GitHubのIssueなどで教えていただければありがたいです。もちろん、翻訳メンバーとして入ってくださることも歓迎します！

この日本語訳が、これからResilience4jを使う人の役に立てば嬉しいです。

# 2019-12-19 追記
何となんと、[Resilience4jのGitHubリポジトリ](https://github.com/resilience4j/resilience4j)に、日本語訳へのリンクが追加されました！

<img width="1186" alt="スクリーンショット 2019-12-19 23.00.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/19e0061b-5e71-b02b-1491-cdd4cf821717.png">
PHPカンファレンスレポート：オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法

# 前提
PHPカンファレンスに参加してきたので、
セッションを聞いた感想というかレポート記事になります。
その他の記事は  [ここ](https://qiita.com/sh_tomato/items/8029ea6cb5db570223e1)にあります。

この記事はオニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法について記載します。


# このセッションの概要
オニギリペイという架空のバーコード決済サービスのセキュリティ事故事例から、
安全なサービスの構築法をお話しいただきました。

###オニギリペイで発生した試練
1.21%キャンペーンで景品表示法違反に引っかかった
2.ログインIDを発番したが、不正ログインが多発した
3.二段階認証を強制したのに不正ログインが止まらない
4.ヘルプデスクへのパスワード再発行で変更後のパスワードを電話口で伝えてしまった
5.開発ベンダーがパスワードを平文で設置していた
6.iOS版にAndroidの情報が含まれていたため、App storeから削除された
7.OSコマンドインジェクションで不正アクセスされた
8.WAFを導入した結果SSRF脆弱性が発生していた

※各詳細はスライドがありますので以下からご確認ください。
 [オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 ](https://fortee.jp/phpcon-2019/proposal/45c01559-3266-42a2-817e-8074b0a8a9be)


### 各プロセスでの検討内容とインシデント例
| プロセス | 検討内容 | インシデント例 |
|:-:|:-:|:-:|
| サービス企画  | 法律、各種ガイドライン、業界慣行への準拠  |  試練1 |
| プラットフォーム設計  | プラットフォーム固有の問題  |  試練8 |
| 業務設計  |  業務上の脆弱性 |  試練4 |
| 機能仕様  |  機能上の脆弱性、デベロッパー規約 |  試練2、試練6 |
| 実装設計  |  実装設計上の脆弱性 |  試練3、試練5 |
| プログラミング  |  プログラミング上の脆弱性 | 試練7  |

自分はWebアプリケーションの運用・保守をメインで行っているため、
サービス企画や業務設計の部分でのインシデント例はあまり考えたことがなかったです。
ただ、新規サービスに携わりたいと考えてもいるため、
上記のことも考慮する必要があるのだと気付かされました。

とはいえ、何を考えればいいのかがわからないのですが、
以下の書籍が参考になるとのことでした。

 [起業の法務](https://www.amazon.co.jp/%E8%B5%B7%E6%A5%AD%E3%81%AE%E6%B3%95%E5%8B%99%E2%80%95%E2%80%95%E6%96%B0%E8%A6%8F%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E8%A8%AD%E8%A8%88%E3%81%AE%E3%82%B1%E3%83%BC%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-TMI%E7%B7%8F%E5%90%88%E6%B3%95%E5%BE%8B%E4%BA%8B%E5%8B%99%E6%89%80/dp/4785727403)

### リスクアセスメントの方法

リスクアセスメントについて[Wiki](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%AF%E3%82%A2%E3%82%BB%E3%82%B9%E3%83%A1%E3%83%B3%E3%83%88)より。
>リスクアセスメント（英: Risk assessment）とは、リスク特定、リスク分析、リスク評価を網羅するプロセス全体を指す [1] [2] [3] [4] [5] 。
リスク特定 (risk identification) - リスクを発見し、認識し、記述するプロセス
リスク分析 (risk analysis) - リスクの特質を理解し、リスクレベルを決定するプロセス
リスク評価 (risk evaluation) - リスク（とその大きさ）が受容可能か（許容可能か）を決定するためにリスク分析の結果をリスク基準と比較するプロセス

徳丸さんいわく上記の方法論について以下の方法論があるとのこと。
1.ベースラインアプローチ
　既存の標準や基準を元にベースライン（自組織の対策基準）を策定し、チェックしていく。
　徳丸本を基準にするなど。
2.非形式的アプローチ
　コンサルタントまたは組織や担当者の経験、判断により実施
3.詳細リスク分析
　情報試算に対し「資産価値」「脅威」「脆弱性」「セキュリティ要件」を識別し、リスクを評価
4.組み合わせアプローチ
　上記いずれか複数のアプローチを併用する。

また、その他の具体的な方法としては、
概要レベルの業務フローチャートを記載し、各箇所に「ツッコミ」を入れていく。
その「ツッコミ」をもとに業務レベルの脅威分析表としてまとめるなど。


### 発注がセキュリティを左右する
インシデント例でいう実装設計にあたりますが、
ベンダーを選定する際は発注がセキュリティを左右します。
RFP（提案仕様書）がシステムの大枠・概略予算となるため、RFPの段階ではセキュリティが明確になっている必要があります。
また、発注者が提案書の内容に関与できるのはRFPだけでもあります。

例えば脆弱性に関しては、
○○などと記載するのではなく、
別紙で一覧を設けるといった方法を取る必要がある。

### 分析を具体的にすすめるには？
IPAのIot開発におけるセキュリティ設計の手引がよくまとまっているので、
参考になる。
 [Iot開発におけるセキュリティ設計の手引](https://www.ipa.go.jp/files/000052459.pdf)


# おわり
抽象論だけではなく、
具体的な方法論にまで落とし込まれていて大変わかりやすかったです。

改めてセキュリティ周りに関しては考慮すべきことが膨大すぎるなと思うのですが、
そう考えるのは自分だけでなく、
ある程度体系的にまとめられたものもあるので、
そういったものを参考に進めるのが一旦はいいのかなと感じました。

ベースラインだけですべてをまかなえるわけはないので、
自分でも知識をつけることは重要ですね。
徳丸本読み切れてないけど、
徳丸試験（Webセキュリティ試験）受けるのもありですね。
Pytorch×MNIST手書き数字認識 PNG画像を入力に予測してみる

pytorchで画像認識のモデルを作って。テストデータを評価する、って記事はたくさんありましたが、JPEGとかPNGとかの画像を実際に読み込んで予測してみた記事があんまりない気がしたので、まとめてみました。

# 今回のゴール
PNG画像をPyTorchで作った学習モデルに通して予測してみます。
モデルはMNISTの手書き数字認識を使います。

# 学習モデルの構築
[Google ColaboratoryでPyTorchでMNISTを学習したモデルを保存し、それを読み出して使う簡単サンプル - 人工知能プログラミングやってくブログ](https://uchidama.hatenablog.com/entry/2019/08/20/185153)
この記事を参考に学習モデルを作ります。
動かすと1,725,616バイトのmnist_cnn.ptができました。


# 機械学習モデルを使って予測する
[PyTorch 1.1 Tutorials : 画像 : PyTorch を使用した画風変換 – PyTorch]( http://torch.classcat.com/2019/07/16/pytorch-1-1-tutorials-image-neural-style-transfer/)
この記事を参考にコードを書きました。
mnist_cnn.ptと手書き数字の画像ファイルを準備したら以下のコードを実行します。

## モデルの定義・ロード
まずはモデルを定義してロードする

```python
# 必要なモジュールを読み込む
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import datasets, transforms
from PIL import Image, ImageOps

# モデルの定義
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4*4*50, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)
        x = x.view(-1, 4*4*50)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

device = torch.device("cpu")
model = 0
model = Net().to(device)
# 学習モデルをロードする
model.load_state_dict(torch.load("/適当なPath/mnist_cnn.pt", map_location=lambda storage, loc: storage))
model = model.eval()
```

## 画像の読み込み
次に画像を読み込みます。JPEGでもPNGでも大丈夫なはず。

```python
# 画像ファイルを読み込む
image = Image.open("/適当なPath/mnist_9_70x70.png")
# convert('L')でグレースケールに変換する。
# そして画像のサイズを28ピクセル四方にリサイズします。
# さらにinvertで白黒変換する。画像は文字部分が0(黒)、背景が白(1)で学習元のデータと反対のため。
image = ImageOps.invert(image.convert('L')).resize((28,28))
# データの前処理の定義
# transforms.Normalize((0.1307,), (0.3081,)は学習元データと同様の正規化を行ってる。
# 0.1307を平均、0.3081を標準偏差に指定しています
transform=transforms.Compose([
                           transforms.ToTensor(),
                           transforms.Normalize((0.1307,), (0.3081,))
                       ])
# 元のモデルに合わせて次元を追加
image = transform(image).unsqueeze(0)
```

## 予測
最後に予測（Predict）します

```python
# 予測を実施
output = model(image)
_, prediction = torch.max(output, 1)
# 結果を出力
print("result=" + str(prediction[0].item()))
```
実行するとこのように結果が表示されます。

入力画像
![mnist_9_70x70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69163/244b0c24-e88d-4c3e-0231-2618de6a14ab.png)

結果

```
result=9
```

# まとめ
Chainerを触ったことあるけど、PyTorchは使い始めて２日の初心者ですが、ググって調べながら画像認識のコードを書いて動かすことができました。
スマートでないことしてるかもしれないので、指摘いただければうれしいです。

ちなみに、Flaskのアドベントカレンダーで画像認識アプリのネタを書こうと思ってPyTorchの部分のコード書いてたら一記事分くらいの量になったのでPyTorchのアドベントカレンダーにも登録してみました。

次はYOLOを動かしてみたい！
気象通報式に関する記事まとめ

通報式とは、WMO（世界気象機関）が [GTS （全球気象通信網）](https://qiita.com/e_toyoda/items/9893b4386084528f2af5#gts%E3%81%A8%E3%81%AF)で使うために開発したデータ形式です。
ものすごくたくさんあるので解説記事が増えすぎることが予想されるのでまとめから作ります。

# TAC（伝統的文字形式通報式）

TAC = Traditional Alphanumeric Codes. [テキスト電文](https://qiita.com/e_toyoda/items/9893b4386084528f2af5#%E9%9B%BB%E5%A0%B1%E3%81%A8%E3%81%AF)を使ってデータを送るために作られたものです。データの種類ごとに多数の形式がありました。

- FM12 SYNOP （地上気象観測）
- FM13 SHIP （船舶観測）
- FM15 METAR （飛行場での地上観測）
- FM32 PILOT （風の鉛直プロファイルの観測、パイロットバルーンやウィンドプロファイラなど）
- FM35 TEMP （風と気温の鉛直プロファイルの観測、ラジオゾンデなど）

まだ記事とくに書いていないので、とりあえず、日本国内公式ドキュメントは[気象庁の通報式ページ](https://www.jma.go.jp/jma/kishou/books/tsuhoshiki/tsuhoshiki.html)に置かれている国際気象通報式（現時点最新は[第８版第２３号](http://warp.da.ndl.go.jp/info:ndljp/pid/11376635/www.jma.go.jp/jma/kishou/books/tsuhoshiki/kokusai/kokusai8_23.pdf)）です。

通報式の文書もまた独特なので、せめてその読み方くらい説明せんといかんですね。

# TDCF（表参照通報式）

TDCF = Table-Driven Code Forms.　通報式内にデータ構造を記述する機構を設けて、観測や予報の種類によらず一定の枠組みでデータを記述できるようになっています。データ構造の記述が、あらかじめ定められた表の番号を記載する形でなされるので、表参照の名前があります。

- [GRIB （格子点データ用）](https://qiita.com/e_toyoda/items/ce7497e1a633b16f1ff1)
- [BUFR （非格子構造データ用）](https://github.com/etoyoda/bufrconv/blob/master/BUFR.md) ... github に置きました
- CREX （テキストによる非格子構造データ用代替形式）

これも日本国内公式ドキュメントは[気象庁の通報式ページ](https://www.jma.go.jp/jma/kishou/books/tsuhoshiki/tsuhoshiki.html)に置かれている国際気象通報式別冊（現時点最新は[第２９号](http://warp.da.ndl.go.jp/info:ndljp/pid/11376635/www.jma.go.jp/jma/kishou/books/tsuhoshiki/kokusaibet/kokusaibet_29.pdf)）です。

# Model-Driven Code Forms

MDCF という略語はあまり見かけません。
航空気象分野で使われる XML ベース（GML ベース）のデータ形式です。
とりあえずリンク https://github.com/wmo-im/iwxxm
C#でトランプを表現する。

# 初めに

更新の頻度を聞かれると微妙ではありますが、MSのチュートリアルって勉強になるなと感じているので紹介します。
テーマは表題通り、トランプの実装です。
https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/working-with-linq

# トランプの生成

まず、トランプを生成する元となる列挙型的な物の準備から。

題材となるコードはチュートリアルに乗っ取るため、各々突っ込みどころはあると思いますが(Enumを使わないから適切な条件分岐書けなそう・Rankは数字で持ちたい等)、一旦LINQの使い方を学ぶという事で置いておきましょう。

```csharp:KindOfCard.cs

        static IEnumerable<string> Suits()
        {
            yield return "clubs";
            yield return "diamonds";
            yield return "hearts";
            yield return "spades";
        }

        static IEnumerable<string> Ranks()
        {
            yield return "two";
            yield return "three";
            yield return "four";
            yield return "five";
            yield return "six";
            yield return "seven";
            yield return "eight";
            yield return "nine";
            yield return "ten";
            yield return "jack";
            yield return "queen";
            yield return "king";
            yield return "ace";
        }

```

yield returnの挙動が分からない場合は、公式より以下の記事の様な個人ブログの方が馴染みやすいのでおすすめです。
https://tyheeeee.hateblo.jp/entry/2013/08/07/C%23%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Byield_return%E3%81%AE%E6%8C%99%E5%8B%95#fn-3dffedb5

この二つを利用して、トランプを生成してくださいと言われたら、あなたならどう書きますか？
LINQを使わない例がこちら。
※Trumpクラスの実装は割愛します。

```csharp:NoLINQ.cs
var startingDeckNoLINQ = new List<Trump>();

foreach(var suit in Suits())
{
    foreach(var rank in Ranks())
    {
        startingDeckNoLINQ.Add(new Trump() { Suit = suit,Rank = rank});
    }
}
```

単純な二重for文です。ここにLINQを使う場合はどう書けば良いでしょうか？
LINQを覚えたての人向けの書き方がこちら。

```csharp:HalfLINQ.cs
var startingDeckHalfLINQ = new List<Trump>();

foreach(var suit in Suits())
{
    startingDeckHalfLINQ.AddRange(
        Ranks().Select(rank => new Trump() { Suit = suit,Rank = rank})
    );
}
```
トランプのマークだけFor文で回して、数字をSelectで回すパターン。
これであれば、デバッグする時にマーク毎に実行されるので追いやすいですね。

最後に、for文なしの書き方です。

```csharp:AllLINQ.cs
var startingDeckAllLINQ = Suits().SelectMany(suit => Ranks()
    .Select(rank => new Trump(){ Suit = suit, Rank = rank }));
```

慣れるまで頭が混乱してしまいますが、SelectManyを利用すれば複数の列挙データを組み合わせたデータを一度に作成する事が出来ます!!
SelectManyについて詳しく知りたい方は以下などを参考にしてください。
https://ufcpp.net/study/csharp/sp3_stdquery.html

今回の内容は以上です。
次回はシャッフルの実装についてまとめます。
お手軽！英語の序数をつける最も簡単な判定法！？

# まえがき
メリークリスマス！そしてハッピーバースデー私！自称やめ太郎先生の大ファンSeitenです！
今回は、使う機会があるようでないようでありそうなテクニック、"英語の序数をつける"コードを紹介します！

## 英語の序数のルール
1. 下1桁が1の時はst、2の時はnd、3の時はrd、それ以外はthをつける。
2. 十の位が1の時は1のルールを無視し、thをつける。

このルールに沿って、お手軽に英語の序数をつけた文字列を返す関数を実装してみます。

```ordinal.cpp
std::string GetOrdinalNumber(unsigned long long num)
{
    std::string res = std::to_string(num);

    if (num / 10 % 10 == 1) res += "th"
    else
    {
        switch (num % 10)
        {
        case 1:
            res += "st";
            break;

        case 2:
            res += "nd";
            break;

        case 3:
            res += "rd";
            break;

        default:
            res += "th";
            break;
        }
    }

    return res;
} 
```

```ordinal.js
function GetOrdinalNumber(num)
{
    if (IsNaN(num) || !IsFinite(num) || num < 0) return "";

    let res = num.toString(10);

    if (num / 10 % 10 === 1) res += "th";
    else
    {
         switch (num % 10)
         {
         case 1:
             res += "st";
             break;

         case 2:
             res += "nd";
             break;

         case 3:
             res += "rd";
             break;

         default:
             res += "th";
             break;
         }
    }

    return res;
}
```

```ordinal.cs
public string GetOrdinalNumber(ulong num)
{
    string res = num.ToString();

    if (num / 10 % 10 == 1) res += "th";
    else
    {
        switch (num % 10)
        {
            case 1:
                res += "st";
                break;

            case 2:
                res += "nd";
                break;

            case 3:
                res += "rd";
                break;

            default:
                res += "th";
                break;
        }
    }

    return res;
}
```

```ordinal.vb
Public Function GetOrdinalNumber(ByVal num As ULong) As String
    Dim res As String = num.ToString

    If ((num \ 10) Mod 10) = 1 Then
        res &= "th"
    Else
        Select Case num Mod 10
            Case 1
                res &= "st"
            Case 2
                res &= "nd"
            Case 3
                res &= "rd"
            Case Else
                res &= "th"
        End Select
    End If

    Return res
End Function
```

```ordinal.java
public String GetOrdinalNumber(long num)
{
    if (num < 0) return ""

    String res = Long.toString(num);

    if (num / 10 % 10 == 1) res += "th";
    else
    {
        switch (num % 10)
        {
            case 1:
                res += "st";
                break;

            case 2:
                res += "nd";
                break;

            case 3:
                res += "rd";
                break;

            default:
                res += "th";
                break;
        }
    }

    return res;
}
```

## ……で、何に使うの？
**わかりません！**
ただし、筆者は音楽ゲームでステージ表示するのに使いました。

## ライセンス
Apache License 2.0にします。
作者名は「Seiten Minagawa」でお願いします。
Vagrantを使ってCentOS7の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成

# Vagrantを使ってCentOS7の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成

Vagrantを使ってCentOSの環境を立ち上げるのは簡単ですが、
- タイムゾーンがデフォルトだとUTCに設定されているため、これをAsia/Tokyoに変更したり
- localが`LANG=en_US.UTF-8`になっているので`LANG=ja_JP.UTF-8`に変更したり
- 各種ソフトウェアのUpdateをやったり
- 開発環境として利用するのにfirewalldが邪魔だったり
- vimの環境が欲しかったり。。。

と色々と立ち上げたあとにゴニョゴニョすることが多いので、プロビジョニングによって`vagrant up`したらいきなり準備OKの状態にしたいと思い、ここにメモを残します。

## 環境情報

2019/12/11時点

- Vagrant 2.2.6
- CentOS 7.5.1804

## ローカルのディレクトリ構成

```shell-session
.
├── Vagrantfile
└── provision.sh
```

## 各ファイルの中身

### Vagrantfile

```shell
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  config.vm.provision :shell, :path => "./provision.sh", :privileged => true
end
```

### provision.sh


```shell
#!/bin/sh

systemctl stop firewalld
systemctl disable firewalld

timedatectl set-timezone Asia/Tokyo
localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf

yum install -y vim
yum -y update
```

## vagrant upして色々確認してみる

起動後にvagrant sshで接続し、状態を確認してプロビジョニングが適用されていることが確認できました。

```shell-session
$ vagrant up
$ vagrant ssh

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

$ timedatectl status
      Local time: 水 2019-12-11 19:42:30 JST
  Universal time: 水 2019-12-11 10:42:30 UTC
        RTC time: 水 2019-12-11 10:42:27
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: us
      X11 Layout: n/a
```
hostsファイルとは

通常/etcにhostsファイルというものが、LinuxやMacにある。
`IPアドレス ドメイン名`
という形式でドメイン名と、通常LAN内のIPアドレスの関係が記述されている。
例:
`127.0.0.1 localhost`
ブラウザなどでこのリストにあるドメイン名が入力された際、このファイルを参照してIPアドレスを判別し、そこにアクセスする。

一方、インターネット上のWebページなどのドメイン情報はどうなっているかというと、DNS(Domain Name System)サーバーというオンライン上のサーバーにアクセスし、入力されたWebページのドメイン名から目的のWebサーバーへのIPアドレスを判別する。ざっくりいうと、オンライン版のhostsファイルだ。
VSCode + Storybook for Vueでインラインテンプレートをシンタックスハイライトする方法

「Storybook」最近やっと使い始めました。

「Storybook for Vue」も使わせてもらってるんですが、インラインテンプレート（文字列テンプレート？）のシンタックスハイライトが効かず、やりづらさを感じていました。

```javascript:example.story.js
export default { title: "example story" }

export const example `<example-component some-prop="value"></example-component>`
```

調べたら、拡張機能ありました。VueのインラインテンプレートをSyntax Highlightしてくれます。

- [Vue Inline Template](https://marketplace.visualstudio.com/items?itemName=faisalhakim47.vue-inline-template)

**が**、実は依存関係としてこちらの拡張機能のインストールも必要です。

- [lit-html](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html)

こちらは、`lit-html`というライブラリで使われる`html`というテンプレートリテラルのタグに対して、HTMLのシンタックスハイライト等を効かせてくれるライブラリなのですが、こちらに相乗りした形のようです。

2つともインストールして、`html`タグを使うと、ちゃんとシンタックスハイライトが効きます。

```javascript:example.story.js
export default { title: "example story" }

// vscodeで見ると、シンタックスハイライト効いているはずです
export const example html`<example-component some-prop="value"></example-component>`
```

このままだと`html`タグなんて存在せずエラーになるので、受け取った文字列をそのまま返すタグを定義します。

```javascript:example.story.js
// 受け取った文字列をそのまま返すタグ
const html = String.raw;

export default { title: "example story" }

export const example html`<example-component some-prop="value"></example-component>`
```

紹介させて頂いた[Vue Inline Template](https://marketplace.visualstudio.com/items?itemName=faisalhakim47.vue-inline-template)ですが、TODOのところにインテリセンスのサポートもほのめかしていますので、期待しておきましょう。

以上、小ネタでした。
Xcodeのstoryboardで画面遷移の設定をする方法

僕のXcodeでは、画面遷移がデフォルトで下のような挙動になってしまい、
「普通にフルスクリーンで表示させたいんだけどな、、、」
と一瞬詰まったのでメモします。
![coverVertical.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298379/fd0a21b1-1111-659e-20d6-5c955a58af91.gif)
**※Xcodeのバージョンは11.2.1でした。**

かなり初心者向けの内容です。

#解決方法
<img width="1440" alt="Xcode_storyboard画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298379/89c58925-3768-ebfd-46e0-f3dab14a95ba.png">

（0. 右のInspectorのメニュー画面を出していなかったら、⓪を押して表示）
　1. ①を押してView Controllerの設定を表示
　2. ②を押してAttributes Inspectorを表示
　3. ③のPresentationを、「Automatic」→「Full Screen」に変更

これでフルスクリーンで画面遷移ができるようになります。

#おまけ
上の画像の③のPresentationの上にあるTransition Styleを変更することで、画面遷移のアニメーションを変更することができます。

- Cover Vertical（デフォルト）：次の画面が下から上にスライドしてくる
- Flip Horizontal：回転して画面が入れ替わる。前の画面の裏に次の画面があるような挙動
- Cross Dissolve：クロスディゾルブ。前の画面がフェードアウト、次の画面がフェードインしてくる
- Partial Curl：紙を下からめくるようなアニメーション


アニメーション無しで画面遷移させたい場合は下記のように設定します。
<img width="1440" alt="Xcode_storyboard画面2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298379/8d7de562-7e0e-a6b8-56dc-fee5fbf6e3eb.png">

（0. 右のInspectorのメニュー画面を出していなかったら、⓪を押して表示）
　1. ①を押してSegueの設定を表示
　2. ②を押してAttributes Inspectorを表示
　3. ③のAnimatesのチェックを外す

これでアニメーション無しで画面遷移できるようになります。
DBANブートUSBメモリを作成してHDD破壊王

エンタメ系企業の社内のいろいろを担当しているakibinです。

いま（2019年12月）タイムリーなHDD廃棄について、USBメモリにDBANをインストールしてHDD上書きまくった話です。

# タイムリーなこと
師走の忙しいこのごろ、今年の汚れ今年のうちによろしく、古くなったり使えなくなった端末を今年中に廃棄しよう！と意気込んでいた所、**[かの事件](https://ja.wikipedia.org/wiki/2019%E5%B9%B4%E7%A5%9E%E5%A5%88%E5%B7%9D%E7%9C%8CHDD%E8%BB%A2%E5%A3%B2%E3%83%BB%E6%83%85%E5%A0%B1%E6%B5%81%E5%87%BA%E4%BA%8B%E4%BB%B6)**が世間をにぎわしました。
弊社で依頼しようとしている業者さんもだいぶ評判いいですが、やはり最後に信じられるのは己のみ・・・ということで、レッツHDD破壊王！！

# DBANとは
Darik's Boot and Nuke (DBAN)はオープンソースのHDDのデータ削除ツールで、消去アルゴリズムとして米国国防総省準拠のものが選択できるなど、無料ながらも高機能を有しています。
かの国のすごいところと同じレベルなら間違いないっしょ！これで3回ぐらい上書き消去して廃棄に出せば大丈夫っしょ！！

# DBANのブートUSBメモリ作成
基本[こちら](https://mag.osdn.jp/09/10/07/0859247)の記事を参照させてもらいましたが、[DBANのダウンロードページ](https://ja.osdn.net/projects/sfnet_dban/releases/)に.exeファイルがアップされていないので、ISOファイルをダウンロードして、Rufusを使用してブートUSBメモリを作成しました。

1.[DBANのダウンロードページ](https://ja.osdn.net/projects/sfnet_dban/releases/)から2019年12月時点で一番新しいISOファイル［dban-2.3.0_i586.iso］をダウンロード
2.[Rufusダウンロードページ](https://rufus.ie)からRufusの実行ファイル［rufus-3.8.exe］をダウンロード
3.フォーマット済みのUSBメモリをPCに挿し、［rufus-3.8.exe］を実行
4.［デバイス］で挿入したUSBを確認、［ブートの種類］の［選択］から［dban-2.3.0_i586.iso］を選択して［スタート］をクリック
<img width="312" alt="Rufs実行前.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/e48e1694-08c4-ff6c-4bd9-0e65241ad115.png">
5.問題なくUSBメモリが作成されると［準備完了］と表示される
<img width="312" alt="Rufs実行後.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/c6097bde-f106-770c-a8b9-449b11e0bd1c.png">

# DBANを使用してHDD上書き消去
USBメモリからブートして、あとは[こちら](https://mag.osdn.jp/09/10/07/0859247)の［DBANでハードディスクを完全削除する］以降を参考にして実行しました。詳細に使い方書いてあるので、非常に助かりました！
さーて、どれぐらいかかるかなと思って256GBのHDDを以下設定で実行したところ・・・

- 乱数生成アルゴリズム（Pキーから変更）：MesenneTwister(mt19937ar-cok
- 消去アルゴリズム（Mキーから変更）：GutmannWipe（より完全な消去）
- ベリファイ（Vキーから変更）：Last Pass（最終試行のときのみ）
- 試行回数（Rキーから変更）：3回

16：00〜26：00と**10時間**ほどかかりました・・・なげー。ここまでやらなくてもなので、ちょい設定を調整します！

というわけで、皆さんどしどしHDD消去して、安眠を手に入れましょう！！

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
◆ Twitterアカウント
@AkibinMusic

◆ Youtubeチャンネル
https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg
re:Invent2019で個人的に面白かったセッション その①

これは[Media Doアドベントカレンダー](https://qiita.com/advent-calendar/2019/mediado)の記事です。

先日開催されたAWS re:Invent2019で個人的に面白かったセッションをまとめていきたいと思います。
動画や資料があるセッションについては、リンクもまとめていきます。(サムネをクリックするとYoutubeに飛びます)


## Keynote with Andy Jassy

[![Keynote with Andy Jassy](http://img.youtube.com/vi/7-31KgImGgU/0.jpg)](https://www.youtube.com/watch?v=7-31KgImGgU)
https://www.youtube.com/watch?v=7-31KgImGgU

やはりAWS CEOによる基調講演はしっかりチェックしておきたいところです。

ところどころでバンドの演奏が入ったり、AWSユーザー企業のトップによる事例紹介が入ったりと構成がしっかり練られていているなと感じました。

この講演では以下のようなサービスが発表され、発表のたびに会場から拍手と歓声が起こっていたのが印象的でした。

- **コンピューティング**
    - EC2のインスタンスタイプ追加(M6g/R6g/C6g/Inf1)
    - Amazon Fargate for Amazon EKS
- **DB・ストレージ**
    - Amazon S3 Access Points
    - Amazon Managed Cassandra Service
    - Amazon UltraWarm
- **ML**
    - Amazon SageMaker Studio
    - Amazon SageMaker Notebook
    - Amazon SageMaker Experiments
    - Amazon SageMaker Debugger
    - Amazon SageMaker Autopilot
    - Amazon CodeGru
    - Amazon Kendra
    - Amazon Fraud Detector
    - Contact Lens for Amazon Connect
- **その他**
    - AWS Outposts
    - AWS Local Zones
    - AWS Wavelength


## Innovation at Speed
[![Innovation at Speed](http://img.youtube.com/vi/8ona5ZTu4_E/0.jpg)](https://www.youtube.com/watch?v=8ona5ZTu4_E)
https://www.youtube.com/watch?v=8ona5ZTu4_E

- 文化
- スキル
- 組織構造
- リスク

という4つの観点から、どうすれば組織がイノベーションを起こせるのか？についてのベストプラクティスとアンチパターンを紹介するセッションです。スピーカーは、元Netflixのアーキテクトで今はAWSのクラウド戦略部門VPをしている方でした。

印象的だったのは、「Project to Product(単発のプロジェクトではなく、長期的視点に立ち良いプロダクトを作っていく)」、「Time to value(機能を作ってそれがユーザーに価値をもたらすまでの時間の短さがイノベーションの指標である)」という2つの考え方です。


## A Day In The Life Of A Netflix Engineer
[![A Day In The Life Of A Netflix Engineer](http://img.youtube.com/vi/0QS1TWLooo0/0.jpg)](https://www.youtube.com/watch?v=0QS1TWLooo0)

https://www.youtube.com/watch?v=0QS1TWLooo0


## Migrating the live Pokémon database to Aurora PostgreSQL
[![Migrating the live Pokémon database to Aurora PostgreSQL](http://img.youtube.com/vi/2eEKuK5eOC4/0.jpg)](https://www.youtube.com/watch?v=2eEKuK5eOC4)
https://www.youtube.com/watch?v=2eEKuK5eOC4


## 最後に
引き続き、明日はカオスエンジニアリング、機械学習、サーバーレス周りのセッションで面白かったものをまとめます。
NMF(非負値行列因子分解）の初期値問題

この記事は古川研究室 Advent_calendar 11日目の記事です。
本記事は古川研究室の学生が学習の一環として書いたものです。内容が曖昧であったり表現が多少異なったりする場合があります。
#はじめに
[前回の記事](https://qiita.com/K_Noguchi/items/d03b03a05dac415ee89c)はNMFとは何なのか？などNMFを初めて勉強する方への記事でした。本記事ではsklearnのNMFライブラリーを実装し初期値による誤差の違いを見ていきます。

#NMFの初期値問題
NMFでは学習を始める前に$W,H$の初期値を設定する必要があります。下の図は学習１回目の初期値をランダムにした場合です。$W,H$にランダムな値を当てはめて学習1回目の推定値$\hat{Y}$を計算します。その後元データ$Y$との誤差を計算し、$||Y-\hat{Y}||$が小さくなるように$W,H$を更新していきます。このランダム初期値の場合、学習後の推定値$\hat{Y}$がランダム値によって異なります。つまりランダム値により毎回違う推定値$\hat{Y}$が出てきてしまうという問題があります。NMFの初期値問題を解決する方法は多々あるのですが、一定の推定値$\hat{Y}$を得るためにsklearnのNMFライブラリーではランダム初期化以外にnndsvd,nndsvda,nndsvdarを選択でき、これらの手法で初期化すると一定の推定値を求めることが出来ます。nndsvdについては参考論文[1]こちらをご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448503/7836f2d9-8685-d198-21d0-0649312e4808.png)




#sklearn.decomposition.NMF
sklearnのNMFでは初期化方法に5種類選択できます。
今回はカスタム初期値以外の4種類（nndsvd,nndsvda,nndsvdar,random)の手法を比較します。
誤差はフロベニウスを用いています。比較結果が以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448503/5b927fa5-9141-29b6-5684-d81ece1c59ad.png)

randomは10回の平均誤差を表示しています。100回学習するとランダム初期値よりも他の手法の誤差が小さくなっています。またnndsvd,nndsvdarは学習初期段階での誤差がランダムより小さいことが分かります。よってこのデータに関しては初期値にnndsvdを用いた方がよさそうです。

#Python code
```python
from sklearn.decomposition import NMF
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
X = np.random.rand(100, 10)
x_plot=np.arange(1,11,1)
time=100
x_plot_t = np.arange(1, time+1, 1)

loss_t = np.ones(time)
loss_t1 = np.empty((time,100))
loss_t2 = np.empty(time)
loss_t3 = np.empty(time)


for j in range(time):



    model_t = NMF(n_components= 10, init='nndsvd', random_state=1, max_iter=j+1, beta_loss=2,solver='cd')# ,l1_ratio=1,alpha=0.7)
    Wt = model_t.fit_transform(X)
    Ht = model_t.components_
    loss_t[j] = model_t.reconstruction_err_


    model_t2 = NMF(n_components=10, init='nndsvda', random_state=1, max_iter=j + 1, beta_loss=2,solver='cd' )#,l1_ratio=1,alpha=0.7)
    Wt2 = model_t2.fit_transform(X)
    Ht2 = model_t2.components_
    loss_t2[j] = model_t2.reconstruction_err_

    model_t3 = NMF(n_components=10, init='nndsvdar', random_state=1, max_iter=j + 1, beta_loss=2,solver='cd')# ,l1_ratio=1,alpha=0.7)
    Wt3 = model_t3.fit_transform(X)
    Ht3 = model_t3.components_
    loss_t3[j] = model_t3.reconstruction_err_
    
for j in range(100):
    
    for r in range(10):
        model_t1 = NMF(n_components=10, init='random', random_state=r, max_iter=j+1, beta_loss=2,solver='cd')#, l1_ratio=1, alpha=0.7)
        Wt1 = model_t1.fit_transform(X)
        Ht1 = model_t1.components_
        loss_t1[j,r] = model_t1.reconstruction_err_
    
    
    
    
loss_t1 = np.sum(loss_t1, axis=1) * 0.1
plt.plot(x_plot_t,loss_t,label="nndsvd",color='b')
plt.plot(x_plot_t, loss_t1,color='red',label="random")
plt.plot(x_plot_t, loss_t2,label="nndsvda",color='orange')
plt.plot(x_plot_t, loss_t3,label="nndsvdar",color='g')


plt.xlabel("epoch")
plt.ylabel("error")
plt.legend()
plt.show()
```

#参考文献
[1] http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/HPCLAB020107.pdf
[2] https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html
DB飛ばした話

##背景
・約6年前に運用していた予約登録系システムの話
・予約登録系システムは外向けのサーバーと管理用のサーバーで分かれていた
・そのうち、やらかしたのは管理用のサーバー
・APはColdfusion
・DBはSQL Server

##経緯
予約登録の管理画面には何処にもリンクの張られていない、ある特定の人だけの実績が見れる画面があった。
ある日、実績画面の修正依頼が来たので、確認するために実績画面にアクセスした。
長い待ち時間の後、表示されたのは何も移っていない真っ白な画面だった。
暫くするとサポートに電話がなった。
内容は、管理画面が表示されない・登録した予約が入っていない等の問合せだった。

##原因
自分がアクセスした実績画面だと思ったURLは、実はリリース時に使用した（と思われる）
DBを初期化するプログラムであった。
全てのテーブルがドロップされ、まっさらなテーブルが作成されていた。

##対応
通常であればバックアップから復元すれば良いだけの話であるが、
SQL Serverの復旧レベルが「単純」であったため、発生直後に戻せず定例バックアップが行われる当日の深夜の状態までであった。
外から来た予約については外向けのサーバーにもDBを持っているため、手入力にて復旧を行ったが、
管理画面から登録した予約については諦めざるを負えないため、完全復旧とはならなかった。

##何故惨劇は行われたか
・前任者が退職していたため、プログラムの存在を誰も知らなかった。
・過去にも対応したことがあると高を括り、良く確認もせずにアクセスしてしまった。
・そもそも誰でもアクセスできる場所に設置されていた。
・SQL Serverを使用するシステムを一律で「単純」に設定していた。

##惨劇後の対応
・プログラムの撤去
・SQL Serverの復旧レベルの設定を「完全」にし、障害発生時に戻せるように変更
・チーム内へ注意喚起

##振り返り
今はもう無くなったシステムですが、似たような惨劇を聞くたびに思い出しては震えています。
ヒューマンエラーが重なったことにより起きましたが、慎重にことを進め、後片付けも大事だと改めて気付かされた事件でした。
phpでcsvファイルを読込み配列に格納するまでの速度

file()を使用する場合とfgetcsv()を使用する場合で速度を比較した。
レコードは数値のみの想定。今回試したレコード数は10240件。

```:csvファイル
11.11,11.11
22.22,22.22
…
```


# file()を使用した場合
かかった時間：0.0099518299102783

```php:file()
$time_start = microtime(true);

$data = array();
$cnt = 0;
$lines = file('timetest.csv');
foreach($lines as $line){
    $arr = explode(',' , $line);
    $data[$cnt]['hoge'] = $arr[0];
    $data[$cnt]['fuga'] = $arr[1];
    $cnt++;
}
$time = microtime(true) - $time_start;
echo "{$time} 秒";
```

# fgetcsv()を使用した場合
かかった時間：0.031763076782227

```php:fgetcsv()
<?php
$time_start = microtime(true);

$data = array();
$cnt = 0;
$fp = fopen('timetest.csv', 'r');
while(($line = fgetcsv($fp)) !== FALSE){
    $data[$cnt]['hoge'] = $line[0];
    $data[$cnt]['fuga'] = $line[1];
    $cnt++;
}
fclose($fp);

$time = microtime(true) - $time_start;
echo "{$time} 秒";
```

# 参考
- PHPでCSVファイルの読み込みを行う方法 : file() , fgetcsv()  
https://uxmilk.jp/15018
- PHPの処理速度を計算  
https://qiita.com/ao_love/items/a2d8b8566d0426195002
curlにてGet MethodでJSONデータをrequestする

## 概要
タイトルの通り、curlコマンドでGET methodのリクエストにJSONデータを付与して送信する方法が意外となかったので、メモ書き程度に残す

## 方法
ヘッダーに"accept: application/json"をつける

```
curl -H "accept: application/json" \
     -H "Content-Type: application/json" \
     -d '{"date": XXXX}'
     -XGET http://localhost:8000/articles
```

以上
pandasの時系列プロットの時間軸を、matplotlibでフォーマットし直す

df.plot()後にset_major_formatter()すると、xtickの年や月の表記が壊れる問題に悩まされていたが、解決したのでメモ。

# 前提
pandas：0.24.2
matplotlib：3.1.0

# データの準備

```
import pandas as pd
import numpy as np

N = 100
x = np.random.rand(N)
y = x**2

df = pd.DataFrame(
    index=pd.date_range('2020-01-01', periods=N, freq='D'),
    data=dict(x=x, y=y)
)
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132673/7bfd8dc4-55af-422a-6e67-360b698ed54d.png)

# 問題ないケース
```
# pandasのプロット機能を使用
df.plot()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132673/1e90d781-05bd-0cb7-523c-cb4cbcfcd3f6.png)
DataFrameのindexがDatetimeIndexの場合、自動的にtickをフォーマットしてくれる。
このフォーマットでOKなら、それでよし。

# 問題になるケース
```
import matplotlib.dates as mdates

# pandasのプロット機能を使用
ax = df.plot()

# フォーマットし直す
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132673/5cfacf58-be6e-697c-78c7-80d55a91a942.png)

%Yに対する表示がおかしい。0051年て何・・・。
下記サイトによれば、pandasとmatplotlibのdatetimeユーティリティは互換性がないことが原因らしい。
https://code-examples.net/ja/q/2a2a615

# 解決策
```
import matplotlib.dates as mdates

# x_compatオプションを渡す。これでtickの自動調整が抑制される。
ax = df.plot(x_compat=True)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132673/058ea66b-949d-b488-7866-0c15373adeaf.png)

%Yが正しく2020年になった！
※この例だと「pandasのフォーマットのほうがよくない？」となってしまいますが、そこはご容赦を・・

x_compatはx_compatibilityの略？
公式ドキュメントによれば、x_compatはtickの自動調整を抑制するパラメータとのこと。
https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html#suppressing-tick-resolution-adjustment

もっとスマートなやり方がありましたら、ご教授いただければ幸いです。
TypeScript 引数に分割代入を使った時の型定義

デフォルト値のある分割代入をした時に書き方がわからなくて詰まったのでメモ

はじめは分割代入の型を必須`{ hoge: number }`として書いていたせいでプロパティがない！って言われていたけど
オプション`{ hoge?: number }`にしてあげればよし
よく考えれば当たり前だった

```
class MyClass {
  hoge: number

  public constructor({ hoge = 1 }: { hoge?: number } = {}) {
    this.hoge = hoge
  }
}

const m1 = MyClass()
const m2 = MyClass({hoge: 1})
```
PHPカンファレンスレポート：PHPerのためのテストコード入門

# 前提
PHPカンファレンスに参加してきたので、
セッションを聞いた感想というかレポート記事になります。
その他の記事は  [ここ](https://qiita.com/sh_tomato/items/8029ea6cb5db570223e1)にあります。

この記事はPHPerのためのテストコード入門について記載します。

# はじめに
テストコードの具体的な導入方法などではなく、
そもそもなんでテストコードって必要なんだっけと言った
そもそもの話をしていただきました。

# テストの目的
そもそものテストの目的です。
・品質を可視化すること
・ソフトウェアのどの品質を高めるか、判断するための材料を提供すること
の２つ。

### 品質を可視化すること
品質という言葉はあいまいで見えずらい。
品質が守られているかどうかをテストを持って可視化することができます。

ただし、ソフトウェアテストだけでは品質を高められない。
品質を高めるためにはバグの修正が必要だからです。
そのため、あくまで品質の保証です。

### ソフトウェアのどの品質を高めるか、判断するための材料を提供すること
バグの発見数とバグの内容から、次に品質を高めるべき箇所を判断したり、
リリース判定においてバグの発見数からをリリース可否の判断を行うなど。

# テストコードの目的
品質と開発スピードを両立することです。

 [テストの７原則](https://webrage.jp/techblog/7_principles_of_software_testing/)
ソフトウェアテストには７つの原則があります。
1.テストは「欠陥がある」ことしか示せない
2.全数テストは不可能
3.初期テスト
4.欠陥の偏在
5.殺虫剤のパラドックス
6.テストは条件次第
7.「バグゼロ」の落とし穴

上記のうち、
初期テストにもあるとおり、
バグは早期発見できればできるほど影響範囲が少なくなります。
リリース後であれば、関係部門への連絡・緊急リリース・恒久対応といった対応が必要となりますが、
同じミスが単体テスト時に発見できれば、コードを1行直すだけで済むかもしれません。
上記を考慮し、テスト工程を前倒すことをシフトレフトといいます。

では、シフトレフトはテストコードというだけで実現可能なのかという点で、
手動テストとテストコードを比較してみます。

### 手動テストとテストコード

|  | 手動 | テストコード |
|:-----------------:|:------------------:|:------------------:|
| タイミング | 実装が終わったタイミングでみんなでテスト | コマンド一発で終わるので、手動テストよりも早いタイミングで実行できる |
| 正確さ | ヒューマンエラーが起きる可能性 | コードさえあっていれば何度実行しても同じ結果が実行できる |

比べるまでもないですが、
バグの修正工数を減らしながら確実にテストを行うことができる。
よって品質と開発スピードを両立することが可能。

ただし、テストコードでは導入・メンテナンスコストが発生するので、
必ずしもテストコードが圧勝というわけではない。（手動テストでしかチェックできないテストもある）


# 様々なテストコードを知る
#### ユニットテスト
1つの関数やメソッドに対して、
I/Oを通して使用通りの挙動をしているか検証する。
※PHPUnitなどを使用

テストコードを使って、
入力値とそれに伴う出力値が期待値と比べてどうなのかをテストすることになります。


#### 結合、統合テスト
featureテスト、APIテスト。
特定のリクエストを投げて、レスポンスされた内容が正しいかどうかを検証する。
※PHPUnitなどを使用

#### UIテスト
E2Eテスト。

ブラウザ上でclassやidを指定して自動操作をし、期待通りの動作をしているか検証する。
※PHPUnitやPHP-WebDriver、Seleniumなど

ユニットテストに近いほうが、
テストをしている範囲が狭く、原因の特定もしやすい。
そのため、できる限りユニットテストでカバーしていくことが合理的である。
どのテストをどれくらい書くかはテストピラミッドを参考にすべし。

# おわり
テストコードを書いたことがないため、
学習コストから敬遠気味でしたが、
品質の可視化というのはまったくもってそのとおりだなと感じました。

プルリク前に本当に大丈夫だよなーとか何度も確認して、
結局どっかがミスってるとかの無駄な時間を削減できると考えて重い腰を上げる必要がありそうです。
また、まずは人が書いたコードでテストをやってみるというところから初めて、
エラーが出たらなぜ出たのかということから学んでいこうと思います。
Webサイトデザインはデザイナーの仕事？いや、そうは思わない。

#Web制作におけるデザインの仕事とは
本記事では「Webサイトのデザイン」＝「見た目と使い勝手を考えること」という感じで定義します。まさしくWebデザイナーの仕事です。
が、、、果たしてそれはWebデザイナーだけの仕事なのでしょうか？

#Web制作側と発注側という異なる視点
Web制作において、よく弊害となるのがこの節のタイトル。
発注側（制作側からみたお客さま）には発注側のポリシーや作りたいサイトという”強い思い”。があります。
同様に制作側も”強い思い”があり、それらがぶつかり合って予算、スケジュールなど加味して折り合いをつけて納得し合ってデザインしていくのがWeb制作となります。
基本的には発注側と制作側の担当者が意見を出し合って、出来上がっていくものと思います。

#と、思いきや「発注側（お客さま）」の中には、、、
・「制作側と話し合う担当者」
・「お金を出している経営者」
という登場人物がいます。
制作側としては「担当者」の意見をお客さまの総意とするわけですが、
発注側としては結局のところ**「お金を出している経営者」**の意見が一番強くなるわけです。
お客さまの中での「担当者」と「経営者」のコミュニケーションが取れていない場合、
「担当者」との話し合いで決めたデザインで、そろそろ実装完了！という頃に
「経営者」が、どれどれ、どんなものが出来上がっているんだ・・・といった感じで確認が入ると、恐らくダメ出し入ります。
そうなると作ったものが全て作り直し。という最悪なルーティーンに入ってしまう可能性が高いです。
なので、制作側としては「担当者」だけを相手にするのではなく、発注側で「一番の実権を持っている人格」も巻き込みながらデザインしていくことが重要と言えるでしょう。

#Web制作側にもそれはある
登場人物はWeb制作側にも複数います。
・「発注側と話し合うデザイナー」
・「デザインを実装するプログラマー」
です。
ここでもコミュニケーションが取れていないときは必ず一悶着あります。
例えば、見積り時とは大きく異なる（プログラム観点から予算とスケジュールが確実にオーバーする）デザインが上がった場合、
プログラマー->「この機能を実装するには1か月スケジュール延ばさないと無理」
デザイナー　->「折角、お客さんと合意したデザインなのに作れないなんて。なんてお客さんに言えばよいんだよ」
というやり取りが発生するでしょう。
そうならないためにも、デザイン工程でプログラマーの意見を取り入れながら制作していくこともかなり大事なWeb制作のやり方と言えるでしょう。

#デザインの仕事は誰の担当か
デザインはデザイナーだけの仕事ではありません。基本的な仕事はデザイナーの仕事ではありますが、
発注側の登場人物
　・制作側と話し合う担当者
　・お金を出している経営者
　・運用担当者、情報システム部、商品開発(仕入れ)者など様々…
制作側の登場人物
　・お客さまと話し合うデザイナー
　・デザインを実装するプログラマー
　・他にもディレクター、インフラ担当者、PMOなど様々…
Webサイトの**土台となるデザイン**に関してはWebサイト制作に関わる全ての人たちの仕事(責任)としてしまうことが、後々困ることがない制作過程を進むことができるでしょう。
具体的には、要件定義のメンバーとして参加させたり、WBSにレビュータスクを入れて、関係者をレビュワーとしてアサインしてしまってもよいと思います。

自分が責任者となって進んでいくプロジェクトにおいてでも、誰もが、、、**知らないところで勝手に作られていくことはあまりいい気はしない。**ということを念頭に入れておくことは大事なことです。
責任＝自分一人で作る責任感。ではありません。
責任＝最終的な成果物に対する責任　です。
TrelloAPIを使ってラベルの色とタイトルを一括変更するためのGoogleAppsScriptコード

Trelloのラベルの色とタイトルを変えたかったが
30個くらいあって面倒だったから一気に更新するために書いたスクリプト。

```gas_sample.js
API_KEY = 'hogehoge'
API_TOKEN = 'fugafuga'
BOARD_ID = 'piyopiyo'


function getLabels(){
  var url = "https://trello.com/1/boards/" + BOARD_ID + "/labels?fields=name&key=" + API_KEY + "&token=" + API_TOKEN;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText("UTF-8"));
  
  return json
}

function putLabels(){
  var labels = getLabels()
  var len = labels.length
  
  for(var i = 0; i < len; i++){
    var url = "https://trello.com/1/labels/" + labels[i].id +"?key=" + API_KEY + "&token=" + API_TOKEN
    var payload = {
      'name'       : '2019: ' + labels[i].name, //名前をちょっとだけ更新したかった
      'color'        : '' //色をnullにしたかった
    }
  
  var options = {
    'method' : 'put',
    'muteHttpExceptions' : true,
    'payload' : payload
  }
    
    Logger.log(UrlFetchApp.fetch(url, options));
  }
}
```
Railsチュートリアル 第12章 パスワードの再設定 - 「ログイン画面に、パスワード再設定用のリンクが存在すること」に対するテストを実装する

# テストコード

変更対象となるテストコードは`test/integration/users_login_test.rb`です。

```diff:test/integration/users_login_test.rb
  class UsersLoginTest < ActionDispatch::IntegrationTest
    ...略

    test "login with invalid information" do
      get login_path
      assert_template 'sessions/new'
+     assert_select "a[href=?]", new_password_reset_path
      post login_path, params: { session: { email: "", password: ""} }
      assert_template 'sessions/new'
      assert_not flash.empty?
      assert_select 'div.alert-danger'
      get root_path
      assert flash.empty?
    end

    ...略
  end
```

# テストを実行してみる

この時点でテストは成功します。

```
# rails test
Running via Spring preloader in process 14842
Started with run options --seed 21965

  46/46: [=================================] 100% Time: 00:00:04, Time: 00:00:04

Finished in 4.81443s
46 tests, 198 assertions, 0 failures, 0 errors, 0 skips
```

# このテストは、どうすれば失敗するようになるのか

例えば以下のように`app/views/sessions/new.html.erb`を変更すると…

```diff:app/views/sessions/new.html.erb
  <% provide(:title, "Log in") %>
  <h1>Log in</h1>

  <div class="row">
    <div class="col-md-6 col-md-offset-3">
      <%= form_for(:session, url: login_path) do |f| %>

        <%= f.label :email %>
        <%= f.email_field :email, class: 'form-control' %>

        <%= f.label :password %>
-       <%= link_to "(forgot password)", new_password_reset_path %>
+       <%# <%= link_to "(forgot password)", new_password_reset_path %> %>
        <%= f.password_field :password, class: 'form-control' %>

        <%= f.label :remember_me, class: "checkbox inline" do %>
          <%= f.check_box :remember_me %>
          <span>Remember me on this computer</span>
        <% end %>

        <%= f.submit "Log in", class: "btn btn-primary" %>
      <% end %>

      <p>New user? <%= link_to "Sign up now!", signup_path %></p>
    </div>
  </div>
```

以下のようにテストが失敗します。

```
# rails test test/integration/users_login_test.rb:12
Running via Spring preloader in process 14868
Started with run options --seed 5918

 FAIL["test_login_with_invalid_information", UsersLoginTest, 2.484278399962932]
 test_login_with_invalid_information#UsersLoginTest (2.48s)
        Expected at least 1 element matching "a[href="/password_resets/new"]", found 0..
        Expected 0 to be >= 1.
        test/integration/users_login_test.rb:12:in `block in <class:UsersLoginTest>'

  4/4: [===================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.48610s
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
```

「/password_resets/new へのリンクが1つも描画されていない」という趣旨のメッセージですね。想定したテストが正しく実装されていると言えそうです。
Export Collection to BigQueryを使ってみる


Firestoreは素晴らしいサービスですが、集計系は弱いのでBigQueryと連携するのは定石の１つです。
今までは連携を目的に合わせて手動で行う必要がありましたが、連携を自動化してくるextensionが出たので試してみます。

基本的な利用方法は[こちら](https://qiita.com/wata01/items/e9210c19b3915ab1b0d5)の記事が非常に参考になりますので、補足的なことや、個人的な関心事について書いてみます。


## Export Collection to BigQueryとは？

その名の通り、コレクション単位でデータをBigQueryにExportするためのextensionで、実態は、firestoreのwriteをトリガーに動作するFunctionsです。

## 復数のCollectionに対応できるのか

以前テストしたときから気になっていたのが１つのExtensionで１つのCollectionしか指定できない仕様だったので、復数の同一Extensionを登録できるのかが気になっていました（同じプロジェクトで復数のコレクションを出力したい）。

結論から言えば下記のように登録できました。
ExportしたいCollectionの数だけ登録して利用することになるようです。

![スクリーンショット 2019-12-11 17.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/03fe8115-73af-5df2-9a1e-e058e98238b0.png "スクリーンショット 2019-12-11 17.50.03.png")

## 拡張機能の構成

構成の要素としていじれるのは下記のパラメータのみです。

* Functionをデプロイするリージョン（データセットとは違う）
* コレクション名（Firestore側）
* データセット名（BigQuery側）
* テーブル名（BigQuery側）

このうち、Functionsのリージョン以外は後からでも変更できるようです。


![スクリーンショット 2019-12-11 14.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/10fa2a64-8374-7aef-d805-06cef3690459.png "スクリーンショット 2019-12-11 14.07.46.png")


データセットは標準ではUSに作られてしまうので、日本にしたい場合は予め作成しておいてデータセットにマッピングする必要があります。

インストールが終わると

* [table_name]_raw_changelog
* [table_name]_raw_latest

の２つのテーブルとビューができるようです。クエリはビューの方に行うといいでしょう。

![スクリーンショット 2019-12-11 17.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/8626aa76-21aa-29ea-d14c-de5c59eeb2ac.png "スクリーンショット 2019-12-11 17.56.35.png")

>上記は復数のextensionを登録した後の状態です。

latestの方には最新の状態のデータが格納されており、changelogの方はその名の通り、全ての操作ログが保存されています。

![スクリーンショット 2019-12-11 18.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/2305a36d-66b4-c7a8-8834-d9504dea046d.png "スクリーンショット 2019-12-11 18.24.41.png")


上記の例では、１つのドキュメントがcreateされ、updateされ、deleteされたすべての記録が残っています。


## データ構造

上記のスキーマをみていただくといいのですが、dataというところにjson形式でデータが格納されます。
dataに下記のようなJSONが入ってます。

```json
[
	{name:'foo', point:10, tel:'0312345678'}
]
```

## いくつかクエリを実行してみる

### JSONにクエリをかける

JSONにクエリをかけるには下記の２つの標準関数があります。

* json_extract()
* json_extract_scalar()

json_extract()だと"name"というような""が付いた形式で取得されます。
scalar()だとname自体が取得されます。

取得はjson_extract_scalar(column_name,'$.param_name')という感じで行います。

### Selectしてみる


```
select
  json_extract_scalar(data,'$.name') as name,
  json_extract_scalar(data,'$.email') as email
 from firestore_export.members_raw_latest
```

### Whereしてみる

asで指定したAlias名はwhereじゃつかえないみたい。

```
select
  json_extract_scalar(data,'$.name') as name,
  json_extract_scalar(data,'$.email') as email
 from firestore_export.members_raw_latest
 where json_extract_scalar(data,'$.name') like '%8%'
```


### Sumしてみる

もちろんsumもできる。

```
select
  sum(cast(json_extract_scalar(data,'$.point') as int64) ) as point_sum
 from firestore_export.users_raw_latest
```

### Deleteしてみる

deleteもできるようになった。

```
delete from firestore_export.members_raw_changelog where true
```

## その他

InsertはStream Insertにより行われているので、データがbufferにあるうちはデータを削除できない。。。あと、もちろん費用も考える（1GB $0.05）。

>30分くらいという噂があるが、明確なソースがわからない。
HTML・CSSでよく使う記述

# 初めに
よく使う記述で、毎度調べたりするのが面倒なので、ここに書き溜めていきます。

## HTML編
### HTML空の記述

```HTML
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title></title>
</head>
<body>
  
</body>
</html>
```
### CSSの読み込み
```HTML
<!-- cssの読み込み -->
<link rel="stylesheet" href="./css/xxx.css">

<!-- メディアクエリーで条件付きのcssの読み込み -->
<link rel="stylesheet" href="./css/xxx.css" media="screen and (min-width: 640px)">
```
### JavaScriptの読み込み
```HTML
<!-- JavaScriptの読み込み -->
<script src="./js/xxx.js"></script>
```
全部head要素内に入れてることが多い。
jQueryなどのライブラリを先に読み込んで、他の外部ファイルに関しては、追加順で記述することが多い
（処理によっては前後させる）
## CSS編
### メディアクエリ

```CSS
@media screen and (min-width: 640px) {
  /* 横幅640pxより大きくなると適応 */
}
```

### 親要素をはみ出す
```CSS
.body {
  width: 640px;
  margin: 0 auto;
}
.title {
  margin-left: calc(((100vw - 100%) / 2) * -1);
  margin-right: calc(((100vw - 100%) / 2) * -1);
  background: #ccc;
}
.title span {
  width: 640px;
}
```
↓↓こういうやつ↓↓
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/01ebba8d-b542-106b-2817-eb7982864bfd.png)
対応ブラウザ https://caniuse.com/#search=calc
対応ブラウザ https://caniuse.com/#feat=viewport-units


以上