OmniAICreator/Qiita-1.07M huggingface dataset:
htmlの基礎

#htmlの基礎
自分用に最低限をまとめました。

##参考文献
[HTML入門](http://www.ink.or.jp/~bigblock/html/index.html
)
[初心者向けHTML入門：書き方の基本とタグの使い方](https://saruwakakun.com/html-css/basic/html)
[HTMLの基本を学ぼう！ | HTML 入門 | レッスン | CreatorQuest](https://creatorquest.jp/lessons/html/html-intro/)

##HTMLとは
Hyper Text Markup Languageの略でWebページの文章などに使われるコンピュータ言語である。ただし、プログラミング言語ではない。Webページ全体の構造を表す。CSSファイルとJavaScriptファイルをつなぐ役割も果たす。

##用語

**タグ（要素）**
カッコのこと

```
<開始タグ名>
</終了タグ名>
```

***

**属性・属性値**
属性はタグ内のスペースの後に書かれているもの
ここではtextはbody要素の属性である
属性値は"で囲まれているもの
ここでは文字色

```
<body text="文字色">
```

***

##基本的な形
VSCodeではhtml:5でインテリジェンスで表示できるため、順序などについては覚える必要はない

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

以下説明

```
<html>~</html>
```

htmlの文章であることを示す
これより外には書かない

```
<head>~</head>
```

大まかなWebページの情報を書く
基本的にここに書いたことは実際には表示されない

```
<title>~</title>
```

ページのタイトルとなる
お気に入りに保存する場合などに表示される
ちなみに、ない場合はURLのままになる。

```
<body>~</body>
```

実際にブラウザの中に表示させる内容を書く


余談
HTMLは大文字で書いても小文字で書いても良い
属性は複数指定でき、その場合はスペースで区切って指定
【Rails】rails db:migrate できない!?   Mysql2::Error: Cannot add foreign key constraint


#　目的
一気にdbに書き込んでマイグレーションを反映させるぞ！
rails db:migrate
をしてもDBに反映されない。。。エラーにハマったので備忘録として。

## エラー文


```
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Cannot add foreign key constraint: CREATE TABLE `oreders` (`id` int AUTO_INCREMENT PRIMARY KEY, `buyer_user_id_id` int NOT NULL, `item_id` int NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL,  INDEX `index_oreders_on_buyer_user_id_id`  (`buyer_user_id_id`),  INDEX `index_oreders_on_item_id`  (`item_id`), CONSTRAINT `fk_rails_3116d56c37`
FOREIGN KEY (`buyer_user_id_id`)
  REFERENCES `buyer_user_ids` (`id`)
, CONSTRAINT `fk_rails_8199fc7446`
FOREIGN KEY (`item_id`)
  REFERENCES `items` (`id`)
) ENGINE=InnoDB

```

## 何が起きているの？
①外部キーを設定しているが、そもそもその参照先がないぞ！言われている
②item_idってなんだ？と言われている

## 解決①
アイテムに紐づくデータなのに、アイテムが無いよということを言われている
しかしちゃんと作ってあるが。。。
問題は**「タイムスタンプの順番」**にあった

つまり上から順番に、DBに反映させていくので
ファイル名の時系列がおかしいとエラーが出る。


↓改善後
<img width="322" alt="スクリーンショット 2020-05-08 17.50.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628336/e79e420a-ae82-cf4b-9c4a-8c87a8885f3d.png">

:point_up:
これならitemsテーブルができた後にordersテーブルを書くのでエラーは起きない。

## 解決②
item_idってなんだ？と言われている
→item　に変えることでエラー解消

##そもそも…外部キーとは
 - 一方のテーブルに加えた変更が自動的に他テーブルにも反映する
 - 外部キーを持つテーブル間に親子関係を定義する

つまり…キーをもとに、二つのテーブルを紐付ける
※参照元, 参照先のキーの型が同じであることも必須　これがエラーの原因になることも



##参考文献
https://kengotakimoto.com/post-2152/#toc13
https://qiita.com/okamoto_ryo/items/8aceacdd81d079e8a120
Pythonでアルゴリズム（ダイクストラ法,Dijkstra）

#はじめに
　今までは貼るだけだったライブラリの中身を少しずつ勉強していきたい所存。この記事を書く理由は、自分の考えの確認とアドバイスなどをいただきたいからなので是非コメントお願いします!(特に高速化、計算量)
#目的
　負のコストの辺がないグラフについて、ある1つの始点からの他の頂点への最短距離を求める。(単一始点最短路)
#原理
　グラフの頂点数が$V$,辺の数が$E$である時を考える。まずは2つのリストを用意する。1つは始点からの最短距離を記録するもの、もう1つは最短路が確定したかどうかを記録するものである。(1つにまとめることもできそうですが、理解する時と同じようにします。)ここで、自身の点への距離は0で確定、他の点への距離はINFとする。
　辺のコストに関して最小値を取り出すための優先度付きキューを用意する。そして、自身の点から伸びている辺を優先度付きキューに入れる。このとき、**コストが最小値である辺の行く先に関して、他の辺を経由してより少ないコストになることはない**。なぜなら、コストは非負であるから遠回りすることになるからだ。
　ということで、コストが最小値となる辺を取り出し、この行先の頂点への最短距離を確定する。さらに、この頂点から伸びる辺についても同様に優先度付きキューに入れていく。距離は**この頂点までの距離+辺のコスト**。ここで、最短距離が確定している行先をもつ辺に関しては最短距離に関わることはないので、入れないようにすると計算量が軽くなる。
　上の作業をすべての最短距離が確定するまで繰り返す。(実装では優先度付きキューが空になるまでにしています)
#実装
```py
import heapq
def dijkstra(s):
    # 始点から各頂点への最短距離
    d = [float('inf')]*n
    d[s] = 0
    # 各頂点が訪問済みかどうか
    used = [False]*n
    used[s] = True
    # 仮の距離を記録するヒープ
    que = []
    for e in g[s]:
        heapq.heappush(que, e)
    while que:
        u, v = heapq.heappop(que)
        if used[v]:
            continue
        d[v] = u
        used[v] = True
        for e in g[v]:
            if not used[e[1]]:
                heapq.heappush(que, [e[0] + d[v], e[1]])
    return d
```
##入力
```py
n = 4
g = [[[1, 1], [4, 2]], [[1, 0], [2, 2], [5, 3]], [[4, 0], [2, 1], [1, 3]], [[1, 2], [5, 1]]] # 隣接リスト
print(dijkstra(0))
```
##出力
```
[0, 1, 3, 4]
```
#計算量解析
　優先度付きキューへの追加は辺の数による$O(E)$。優先度付きキューのサイズは、辺を最短距離にならない場合には入れないことにより、$V$に比例となるので各操作は$O(logV)$。よって、計算量は$O(ElogV)$。
##疑問
　優先度付きキューのサイズが辺の数$E$に比例かなあと思いましたが枝刈りで$V$に比例するところがちょっと抵抗がありました。具体的に書き出してみるとまあ$E$には到底届かないことは分かるのですが何か数式とかで簡単に表せたら教えてほしいです笑。そもそも辺がすべての頂点間に張られているときなどは$E∝V^2$となり他の$O(V^2)$のアルゴリズムより悪化するので考える必要ない気もしますが!
#具体例
　上の例です。到達可能な頂点の中で最小のコストのものを選んで更新していきます。
![94790.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471565/a3c2b2d1-89e9-7f9e-16fc-ee9a75ed8c1e.jpeg)
#おわりに
　今後も備忘録として更新していきたいです。たまに記事を参考文献にしてくれることも増えたのでモチベが上がっています。
#参考文献
[プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89-%E6%8B%93%E5%93%89-ebook/dp/B00CY9256C)
[じゅっぴーさんのブログ](https://juppy.hatenablog.com/entry/2019/02/18/%E8%9F%BB%E6%9C%AC_python_%E3%83%97%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AD%E3%83%A5%E3%83%BC%28heapq%29%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%97%E3%83%AA%E3%83%A0%E6%B3%95)
【正規表現】後読み先読みの解説と見分け方

# はじめに
個人的な理解のためのアウトプット記事になりますので、説明不足やもっと良い理解の仕方があるかもしれませんが、ご理解いただけますと幸いです。

# 読者対象
正規表現の後読み先読みがややこしいと感じている方
後読み先読みってそもそも何ぞ？と感じている方

# 動作環境
本記事の正規表現は以下の環境で動作確認しています。
・Ruby

# 今回扱う4つの正規表現

1. **肯定の後読み**
 `(?<=abc)`

2. **肯定の先読み**
`(?=abc)`

3. **否定の後読み**
`(?<!abc)`

4. **肯定の先読み**
`(?!abc)`

※abcは任意の文字列
※abcの部分に\dなど正規表現を入れることも可能ですが、今回は触れません。

この４つの理解が個人的にややこしかったので、記事にしました。

# それぞれ何を表すか
上の４つの書き方はすべて「**位置**」を表します。

## 肯定の後読み
「肯定の後読み」を例に取りますと、

`(?<=abc)`は「"abc"という文字列と一致する箇所の直後」を表しています。

ピンときたでしょうか？
わたしも初めは何のことかわかりませんでした。

Rubularという正規表現を試すことができるWEBアプリで試してみます。
https://rubular.com/

以下の例文を使います。

```
三国志には正史と演技があります
魏、呉、蜀の三国が出てきます
劉備は三国志の登場人物です。
```

Your regular expression:というところに`(?<=三国志)`を入れてみます。

すると以下のように
三国志という文字列の**直後**に水色の縦棒が来ています。

これは「単語の境界」を表します。
（**アンカー** と呼ぶようです。以後アンカーとします。）

![スクリーンショット 2020-05-08 17.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/f899116a-ee39-50bb-e036-77bf4765d5ff.png)

これで位置がマッチしました。
指定した単語の直後にアンカーがきていますね。

その他先程ご紹介した３つの正規表現も同じく単語に合わせて位置を表します。

## 肯定の先読み
`(?=abc)`で「"abc"という文字列に一致する箇所の**直前**」を表します。
正規表現は`(?<!三国志)`を使って試してみます。

Rubularで確認すると、
お察しの通り指定した単語の前にアンカーが来ます。

![スクリーンショット 2020-05-08 18.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/5bcc2621-8767-bd41-f958-9c1e72cb5aa4.png)

## 否定の後読み
`(?<!abc)`は「"abc"と一致しない文字列の**直後**」を表します。
例文を少し変えて、3行目の三国志の「志」を「試」に変えてやってみます。

```
三国志には正史と演技があります
魏、呉、蜀の三国が出てきます
劉備は三国試の登場人物です
```

正規表現は`(?<!三国志)`を使って試してみます。

![スクリーンショット 2020-05-08 18.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/3ea4a8c3-7839-81ea-00df-d4c53e0ad9d2.png)

「三国志」の文字と一致しない文字列の直後が複数個マッチしています。

## 否定の先読み
`(?!abc)`は「"abc"と一致しない文字列の**直前**」を表します。
例文は先程同様で、正規表現は`(?!三国志)`を使って試してみます。

![スクリーンショット 2020-05-08 18.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/7acdf2ad-8fc8-b004-23ef-517b45f3666d.png)

「三国志」の文字と一致しない文字列の直前が複数個マッチしています。

# それぞれの読み方の特徴
４つのご紹介した正規表現を以下に並べます
①肯定の後読み　`(?<=abc)`
②肯定の先読み　`(?=abc)`
③否定の後読み　`(?<!abc)`
④否定の先読み　`(?!abc)`

それぞれ似た文ですが、
若干の違いがあります。

## 肯定か否定かの見分け方
もうお分かりかもしれませんが、以下のように見分けることができます。

肯定なら`=`を入れる。否定なら`!`を入れる。
後読みの場合は`<`を入れる。先読みなら無し。

このような要領で見分けると理解しやすいと思います。


# 参考
・https://qiita.com/jnchito/items/b0839f4f4651c29da408
deviseを3系→4系へアップデートするとconfirmation_tokenを使ったユーザ検索に失敗する

# 環境、前提
システムの保守（Rubyのバージョンアップ）に連動してdeviseを3.5.1→4.7.1へアップデートしたら、
confirmation_tokenを使って検索する処理が失敗するようになった。

# 原因
confirmation_tokenはdevise3系列ではハッシュ化されていたが、4系列から平文で保持するようになった。
なんなら元々が平文で、３.1系からハッシュ化して持つように変わったものが元に戻った。
影響をうけるのはconfirmation_tokenはのみで、reset_password_tokenについてはハッシュ化されたまま。

# 対策
検索前にtoken_generator.digestを使用してconfirmation_tokenをハッシュ化している処理を削除。

# 参考
- [How To: Override confirmations so users can pick their own passwords as part of confirmation activation](https://github.com/heartcombo/devise/wiki/How-To:-Override-confirmations-so-users-can-pick-their-own-passwords-as-part-of-confirmation-activation)
- [Security regression in Devise 4: plain text confirmation tokens?](https://github.com/heartcombo/devise/issues/4429)
ミスってもやり直せるGitまとめ

# はじめに
gitでの主要な操作とその取り消し方法をまとめてみました。
基本的なコマンドもまとめてあります。
間違えて操作してもこれで問題なし！

# clone
まずはリモートリポジトリからローカルリポジトリへクローンする。

```
$ git clone <リモートリポジトリURL>
```

# branch
作業するブランチを整理する。

#### ブランチを作成(すでにリモートにある場合)
```
$ git branch <ブランチ名> origin/<ブランチ名>
$ git checkout <ブランチ名>

#もしくは
$ git checkout -b <ブランチ名> origin/<ブランチ名>
```
#### ブランチを作成(新たにリモートに作成する場合)

```
$ git checkout -b <ブランチ名>
$ git push -u origin <ブランチ名>
```

#### リモートとローカルを紐付ける
※別々に作成してしまった場合のみ

```
# ブランチが紐付いているか確認
git branch -vv

# 紐付いていない場合は紐付ける
$ git branch -u origin/<リモートブランチ名> <ローカルブランチ名>
```
#### ブランチを確認
```
# ローカルブランチのみ
$ git branch

# リモートブランチも含めて
$ git branch -a
```

#### ブランチを削除
```
# ローカルブランチを削除
$ git branch -D <ブランチ名>

#　リモートブランチを削除
$ git push origin :<ブランチ名>
```

# add
ワーキングツリーの編集内容をインデックスへ。

#### 変更があったファイル全てをaddする
```
$ git add -A
```
※追加したくないものは.gitignoreファイルに記述しておく

( *.txtなど )

#### addを取り消す
```
$ git reset HEAD <ファイル名>
```
※全て取り消す場合はファイル名なし


# commit
インデックスからローカルリポジトリへ。

#### commitする
```
$ git commit -m "<メッセージ>"
```

#### 直前のcommitを修正する
※入れ替えるイメージ

```
$ git commit --amend -m "<メッセージ>"
```

#### commitを取り消す
```
# addの後の状態まで戻る
$ git reset --soft HEAD^

# addの前の状態まで戻る
$ git reset HEAD^

# 直前のcommitの状態まで戻る
$ git reset —-hard HEAD^
```

# pull
リモートリポジトリからローカルリポジトリへ。

#### pullする
```
$ git pull origin <ブランチ名>

# すでにリモートブランチとローカルブランチが紐づいている場合
$ git pull
```
#### pullを取り消す
```
$ git reset —-hard HEAD^
```

# push
ローカルリポジトリからリモートリポジトリへ。
#### pushする
```
$ git push origin <ブランチ名>

# ローカルとリモートが紐づいており、 "push.default = current" の設定をしている場合
$ git push
```
#### pushを取り消す
※打ち消し命令を出すイメージ

```
$ git revert HEAD^
$ git push origin <ブランチ名>

# おすすめはしないが履歴を残さずに取り消す方法
$ git reset --hard HEAD^
$ git push origin +<ブランチ名>
```

# diff
編集した差分を確認する。
※前提として新たに追加したファイルなどは表示されません。
※比較しているのは直前のcommit内容とです。

```
# pullやpushの前に差分確認
$ git diff origin/<ブランチ名>

# addする前に差分確認
$ git diff

# addした後に差分確認
$ git diff —-cached

# commitした後に差分確認
$ git diff HEAD^
```

# その他
#### commit履歴の確認
```
$ git log
```
#### ワーキングツリー ・ インデックス ・ ローカルリポジトリの状態確認
```
$ git status
```
#### configの確認
```
$ git config -l —-global
```
#### configの変更
```
$ git config --global <変更内容>
```
#### ワーキングツリーを直前のcommit状態まで戻す
```
$ git reset —-hard HEAD
```



# ailias
あると便利なailias
※個人的なものなので参考程度に

```
st = status -sb
ad = add -A
cm = commit -m
ch = checkout
cb = checkout -b
b = branch
ba = branch -a
l = log --graph
ll = log --oneline
d = diff
dw = diff —-word-diff
f = fech -—prune
ame = commit —-amend -m
rh = reset —-hard
rs = reset —-soft
cl = config -l —-global
```
aws amplify+nuxt.jsの一から環境構築 in mac

# 概要
今回はMacOS上でaws amplify+nuxt.jsの一から環境構築していこうと思います。
備忘録ということもあり、わかりにくい部分もあるかもしれません。その際はご指摘頂ければと思います。
今回はAWSのアカウントがある前提で進めていきます。

# ①Homebrewのインストール

#### 公式にアクセスし、インストールするコマンドを実行
[Homebrew公式](https://brew.sh/index_ja)

```zsh
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

#### インストール後にソフトウェア・アップデート
<img width="780" alt="スクリーンショット 2020-05-08 15.36.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/b5586c82-304a-c2a6-27de-8961ea684e0d.png">

#### 正常にインストールされてるかの確認

```zsh
% brew --version
Homebrew 2.2.15
Homebrew/homebrew-core (git revision 93a12; last commit 2020-05-08)
```

# ②AWS CLI バージョン 2 のインストールと設定

#### インストール

[公式](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html)を参考にインストールしていきます。
せっかく公式が[インストーラ](https://awscli.amazonaws.com/AWSCLIV2.pkg)を用意してくれてるので、甘えて使っちゃいましょう。
インストーラを起動すると、選択できる項目があると思いますが、今回は全てデフォルトのままインストールします。

```zsh
# インストールの確認
% aws --version
aws-cli/2.0.12 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev16
```

#### 設定
[公式のセキュリティ認証情報](https://console.aws.amazon.com/iam/home?#/security_credentials)へ遷移し、```アクセスキー (アクセスキー ID とシークレットアクセスキー)```を選択します。```新しいアクセスキーの作成```ボタンをクリックし、ポップアップで表示されたアクセスキー IDとシークレットキーをコピーします。

```zsh
# コピーしたアクセスキー IDとシークレットキーを貼り付ける
% aws configure
AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットキー
# リージョンを選択。今回はオハイオ
Default region name [None]: us-east-2
# "text","json","table"のどれかを指定可能ですが、今回はjson
Default output format [None]: json
```
備考：AWSアカウントでセキュリティ向上に伴い、多要素認証（MFA）も設定することをお勧めします。

# ③javaのインストール
※ Amplify Mockingを使うため、OpenJDK 1.8 以降のJavaのランタイムをインストールします。

```zsh
# 最新バージョンがインストールされます
% brew install openjdk

# シンボリックリンクの作成
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

# バージョンの確認
% java --version
openjdk 13.0.2 2020-01-14
OpenJDK Runtime Environment (build 13.0.2+8)
OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
```

# ④Node.jsのインストール
#### Node.js
今回は推奨のNodeバージョンをインストールしたいため、nodebrewをインストールします。
[公式](https://nodejs.org/ja/)にあるLTSバージョンをnodebrewで指定し、インストールします。
公式からインストーラをダウンロードするのもありですが、Nodeのバージョン管理を安易にしたいため、nodebrewを使っていきます。

```zsh
% brew install nodebrew

# nodebrew用のディレクトリを作成
% mkdir -p ~/.nodebrew/src

# 公式で推奨（LTS）されてるバージョンをインストール
% nodebrew install-binary v12.16.3

# バスを追加
# .zshrcファイルがない場合は作成します。
% echo 'export PATH=$HOME/.nodebrew/node/v12.16.3/bin:$PATH' >> .zshrc

# terminalを再起動し、インストールの確認
% node -v; npm -v
v12.16.3
6.14.4
```
# ⑤aws-amplify/cliとnuxt.jsのインストール

```zsh
% npm install -g @aws-amplify/cli create-nuxt-app@latest

# バージョン確認
% amplify --version; create-nuxt-app --version
4.18.1
create-nuxt-app/2.15.0 darwin-x64 node-v12.16.3
```

# ⑥gitのインストール
```zsh
% brew install git

% git --version
git version 2.23.0
```
【Salesforce】Apexが使えない！？プロファイル以外の場合の対処法

Apexクラス作ろ〜

と思ったら、

<img width="1007" alt="スクリーンショット 2020-05-08 18.24.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/189a0766-12c5-43fd-abb2-b08dad58eedf.png">

Apex Class作れない、Anonymous Window開けない、SOQLはタブすら無い

Salesforceに問い合わせてみたところ、トライアル環境だとこのような状態になるそうです。

※調べてもプロファイル関係のことしか出なくて焦った・・・
Vue でヌルッとスクロール 

# 背景
ナビゲーションのメニュー押下時、ヌルッとリンク先に飛びたかった。

# こんな感じ
GIFで載せるとこんなに遅くなるんですね、、本来はもっとスピーディに動いてます。⬇️ 
![smoothscroll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520523/ac310592-90e5-4ad7-7e10-4bbb0aa3d00a.gif)


# 準備

## CLIの力を借りる

```terminal
$ vue create app_name 
```
## ヌルッとするやつをいれる (今回のメイン)

```
$ npm install vue-smoothscroll 
```

## Componentまわりをいじる

初期状態の**HelloWorld**のままなので**Scroll**に修正

```src/App.Vue
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <Scroll />
  </div>
</template>

<script>
import Scroll from './components/Scroll.vue'

export default {
  name: 'App',
  components: {
   Scroll 
  }
}
</script>

<style>
.body{
  margin: 0;
  padding: 0;
}
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

main.jsに追記

```src/main.js
import Vue from 'vue'
import App from './App.vue'
import smoothScroll from 'vue-smoothscroll' //Add code

Vue.use(smoothScroll) // Add code
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')
```

Scrollコンポーネントの作成

```src/components/Scroll.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
    <ul>
      <li v-for="link in links" :key="link">
        <a href="#" @click="Scroll(link)">{{ link }}</a>
      </li>
    </ul>    
    <ul>
      <li class="demo" :id="link" v-for="link in links" :key="link">{{ link }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Scroll',
  data: () =>{
    return {
      msg: "Welcome to Your SmoothScroll App",
      links: [1, 2, 3, 4, 5],
    }
  },
  methods: {
    Scroll (num) {
      event.preventDefault()
      this.$SmoothScroll(
        document.getElementById(num),
        1200,
        null,
        null,
        'y'
      )
    }
  }
}
</script>

<style scoped>
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  font-size: 1.5em;
  color: #42b983;
  text-decoration: none;
}
.demo{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 90vh;
  width: 80vw;
  font-size: 5em;
  margin: 50px auto 0 auto;
  background: #efefff;
  border-radius: 50px;
}
</style>
```

是非、触ってみてください。

# 終わり
今回使った[コード](https://github.com/taiga248/qiita/tree/master/scroll)

Scrollコンポーネント内の**event.preventDefault()** ってなんだ → [Qiita](https://qiita.com/Taiga_Ito/items/c534d798575a67431368)
Zoom接続手順

https://zoom.usにてアカウント取得
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b870d0e7-9f57-9c8a-7224-3181d865cef4.png" width="100%">
ミーティングに参加をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/36ad05d6-eb1c-6fd2-4bab-a7e8036e2455.png" width="60%">
または
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c618db05-5316-dd24-245e-201bdf997f7b.png" width="60%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/1e188672-e201-7031-368c-eb0c88e5cbec.png" width="60%">
ミーティング開催者からID、password取得する
セットして参加するとZoomアプリが起動する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/0cbe4144-9e08-4f3b-75e6-e3e87a61a075.png" width="60%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/d126cb9e-927f-f847-cd87-9ffaa6e271c9.png" width="60%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c140fbb2-d83c-32bf-e98a-6c93a6f59432.png" width="60%">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b14beabf-957a-912b-c3e7-6179afa51560.png" width="60%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/8e3473df-f6e2-ee6a-bc10-b7aedfc84821.png" width="60%">
P5.js 日本語リファレンス(torus)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の torus関数を説明します。

## torus()

### 説明文

指定された半径(トーラスの中心点とチューブの中心点を結ぶ長さ)とチューブ半径でトーラスを描画します

DetailX と detailY は, トーラスのx方向とy方向の分割数を指定します。分割数を増やすとトーラスがより滑らかに見えます。 detailX と detailY のデフォルト値と最大値はそれぞれ24と16です。それらを4や6などの比較的小さな値に設定すると, トーラス以外の新しい形状を作成できます。

### 構文

torus([radius], [tubeRadius], [detailX], [detailY])

### パラメタ

- radius
Number：トーラスの中心点とチューブの中心点を結ぶ長さ(オプション、デフォルト値は50)

- tubeRaduis
Number：チューブの半径(オプション、デフォルト値は10)

- detailX
Integer：x方向の分割数。分割数が大きいほど滑らかにまる。(オプション、デフォルト値は24)

- detailY  
Integer：y方向の分割数。分割数が大きいほど滑らかにまる。(オプション、デフォルト値は16)


### 例1

```javascript
function setup(){
  createCanvas(100, 100, WEBGL);
}

function draw(){
  background(205, 102, 94);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  torus(30, 15); // 半径30、チューブ径15
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/RyfIwVNKL

### 例2

```javascript
//スライダを動かして, x(円周)方向の分割数を変更します
let detailX;
function setup(){
  createCanvas(100, 100, WEBGL);
  // スライダの最低値3、最大値24、デフォルト値3を指定
  detailX = createSlider(3, 24, 3);   detailX.position(10, height + 5);
  detailX.style( 'width',  '80px');
}

function draw(){
  background(205, 102, 94);
  rotateY(millis()/ 1000);
  // 半径30、チューブ径15、x(円周)方向の分割数はスライダ指定値、
  // y方向の分割数は12を設定
  torus(30, 15, detailX.value(), 12);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/NiZfSNycz


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
【備忘録】正規表現一覧

| メタ文字|内容|備考|
|:-----------------:|:------------------:|:------------------:|
|g|一致する文字列をすべて抽出|無い場合は最初の1件が見つかったら検索終了|
|\d|半角数字1文字||
|.|任意の一文字||
|{n,m}|直前の文字が n 個以上、m 個以下| {n}とすればちょうどn文字|
|[AB]|AまたはBのいずれか1文字|[ ]の中の文字数に制限はありません。[ABC] と書けば、「AまたはBまたはCのいずれか1文字」の意味になります。|
|[a-z]|aからzのうち１文字||
|?|～が1文字、または無し||
|+|任意の文字が 1文字以上 |最長のマッチを結果として返す|
|+?|任意の文字が 1文字以上 |最短のマッチを結果として返す|
|*|任意の文字が 0文字以上|最長のマッチを結果として返す|
|*?|任意の文字が 0文字以上|最短のマッチを結果として返す|
|\|直前の文字をエスケープ（メタ文字として取り扱わない）|
|( )|キャプチャする||
|(abc)|文字列abcがあり、または無し|()でグループ化|
|(?:)|グループをキャプチャしない||
|\w|半角英数字とアンダースコア1文字|[a-zA-Z0-9_]と同意|
|[^AB]|AでもなくBでもない任意の1文字|[ ] の最初に ^ が入ると否定の意味（単独では行頭を示す|
|^|行頭を示す||
|$|行末を示す||
|\t|タブ文字||
|\s|空白文字全般|言語によって、含まれる文字が異なる|
| ｜ |または|(|)という形で使われることが多い|
|\b|単語の境界線||
|\A|文字列の先頭|railsの場合(^の場合は行頭のため、複数行の場合、適合する行があればtrueを返してしまう)|
|\z|文字列の末尾|railsの場合($の場合は行末のため、複数行の場合、適合する行があればtrueを返してしまう)|
|\Z|文字列の末尾|ただし文字列の最後の文字が改行ならばそれの手前にマッチします。|
|i|大文字と小文字の区別をなくす|オプション|
[Salesforce Apex]簡単2ステップでデバッグする方法

# Apexでデバッグする方法

手順はざっくり以下の2ステップ
1. [コード上にデバッグコードを記載](#コード上にデバッグコードを記載)
2. [Salesforceの「デバッグログ」で確認](#Salesforceの「デバッグログ」で確認)

## コード上にデバッグコードを記載
```
// コード上に下記を記載
System.debug(確認したい変数);
```

## Salesforceの「デバッグログ」で確認

- Salesforce上で設定 > クイック検索 > デバッグログへ遷移する
- 「ユーザ追跡フラグ」の新規ボダンをクリックして「新しい追跡フラグ」を追加する 

|![スクリーンショット 2020-05-08 14.20.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228773/a3c796f4-c08b-2821-4c5e-ed7a53fb886c.png)|
|:-:|
- 追跡対象エンティティ名に対象のアカウント（例:自分の名前など）を指定
- 開始日、有効期限を設定する
  - 数日程しか指定できないので、当日中を設定するでOK
- デバッグレベルを「SFDC_DevConsole」に設定
  - こちらは初期のモノなので組織によって適切なものを設定でもOK
  - デバッグレベルを管理できます
- 上記設定後「保存」をクリック
- ページの下の方に「デバッグログ」があるので、対象のページなどで操作をして確認する
  - このあたりは普通のweb開発の同じです

以上！
組織毎の違いなどあれば教えてください：）
Deep Learning Specialization (Coursera) 自習記録 (目次)

# はじめに
[Coursera](https://www.coursera.org/) の [Machine Learning](https://www.coursera.org/learn/machine-learning) を受講しました。次のステップとして [Deep Larning Specialization (ディープラーニング専門講座)](https://www.coursera.org/specializations/deep-learning) を勉強しようと思ったのですが，これにはお金がかかります (コストパフォーマンスを考えたら，決して高くはないですが)。

ですが，聴講だけなら無料なので，[YouTube で公開されている Deeplearning.ai の動画] (https://www.youtube.com/channel/UCcIXc5mJsHVYTZR1maL5l9w/)を使って自習することにしました。ここには，自分の備忘と他の方の参考のために，各動画の内容をまとめていきます。

# Course 1 : Neural Network and Deep Learning
- [C1W1](https://qiita.com/satomshr/items/27411fd8ddc152c0bfe8)
- [C1W2](https://qiita.com/satomshr/items/61984ae88189990b960a)
- [C1W3](https://qiita.com/satomshr/items/2a54840c48345650da1c)
- [C1W4](https://qiita.com/satomshr/items/57e85d56b56e9aa019d6)

# Course 2 : Improving Deep Neural Network ; Hyperparameter tuning, Regularization and Optimization
- [C2W1](https://qiita.com/satomshr/items/5c7399fa40640b658b44)
- [C2W2](https://qiita.com/satomshr/items/cf94ae29fe6b01cb6bab)
- [C2W3](https://qiita.com/satomshr/items/dd4b3341923bda3dd2b4)

# Course 3 : Structuring Your Machine Learning Project
- [C3W1](https://qiita.com/satomshr/items/0ba3c34bf35fe524cbff)
- [C3W2](https://qiita.com/satomshr/items/b568adb7b5065e6f0a2f)


# Course 4 : Convolutional Neural Network (CNN)
- [C4W1](https://qiita.com/satomshr/items/d66a8919f5f3b41c0e19)
- [C4W2](https://qiita.com/satomshr/items/f6839c3deff43ed10e63)
- [C4W3](https://qiita.com/satomshr/items/411212849cec94e81669)
- [C4W4](https://qiita.com/satomshr/items/404df3868a9681ebe810)

# Course 5 : Natural Language Processing ; Build Sequence Model
- [RNN W1](https://qiita.com/satomshr/items/e5ca5b083e4dc372ecb9)
- [RNN W2](https://qiita.com/satomshr/items/4c3a676899689aa1fb36)
- [RNN W3](https://qiita.com/satomshr/items/f017783b7c04bdbce1b8)

# 参考
- [deeplearning.ai](https://www.deeplearning.ai/)
- [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) (Coursera)
- [Deeplearning.ai](https://www.youtube.com/channel/UCcIXc5mJsHVYTZR1maL5l9w/) (Youtube)
- [Coursera の Machine Learning を受講して良かったこと・苦労したこと](https://qiita.com/satomshr/items/986c4b77f04080f901df)
Deep Learning Specialization (Coursera) 自習記録 (C1W1)

# はじめに
[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) の Course 1, Week 1 (C1W1) の内容です。

# (C1W1L01) Welcome
## 内容
各コースの説明です。
1. Neural Network and Deep Learning
2. Improving Deep Neural Network ; Hyperparameter tuning, Regularization and Optimization
3. Structuring Your Machine Learning Project
4. Convolutional Neural Network (CNN)
5. Natural Language Processing ; Build Sequence Model

# (C1W1L02) What is a Neural Network
## 内容
ニューラルネットワークの簡単な説明です。家のサイズ，場所 (郵便番号)，周囲の資産状況などから家の価格を予測することを事例にして，説明します。

# (C1W1L03) Supervised Learning with a Neural Network
## 内容
- 教師あり学習 (supervised learning) の簡単な説明
- ニューラルネットワークの種類
  - Standard Neural Network (NN)
  - Convolutional NN → 画像
  - Recurrent NN → 音声データ (時間要素のあるもの)
- データの種類
  - structured data ; データベースを持つ
  - unstructured data ; audio, image, text 

# (C1W1L04) Why is Deep Learning Taking Off
- (ラベル付き) データ量とパフォーマンスの比較
  - traditional learning algorithm は，データ量が増えても，比較的データ量が少ない領域でパフォーマンスがサチる
  - small NN → large NN となると，traditional algorithm でパフォーマンスがサチる領域でも，パフォーマンスを向上させることができる
  - 大量のデータと十分大きな NN がポイント
- シグモイド (sigmoid) 関数から ReLU (Restricted Linear Unit) にすると，収束が早くなる

# (C1W1L05) About This Course
このコースのアウトラインの説明。
1. Introduction
2. Basics of Neural Network Programming
3. One Hidden Layer Neural Network
4. Deep Neural Network

# 参考
- [Deep Learning Specialization (Coursera) 自習記録 (目次)](https://qiita.com/satomshr/items/dc4ae752c558798bbef6)
Github上でバージョン管理しないファイルについて

# はじめに
Gitにおいてファイルなどをバージョン管理する際、
管理が不必要なファイルの存在があることを知りました。
それらのファイルについての対処を備忘録として記載していきたいと思います。


### 環境について
- vagrant(仮想環境)
- VM VirtualBox(仮想機器) 
 - centOS

ホストPCのOSはmacを使用しています。

### 使用言語/フレームワーク
- ruby-2.5.7
- rails 5.2.4.2

# 今回不必要だったファイル
- /.DS_Store
- /.ubuntu-bionic-18.04-cloudimg-console.log

### .DS_Storeとは
MacOSが自動的に生成するシステム情報ファイル。
隠しファイルなので、基本的にFinderなどでは表示されないが、
GitHub上では表示される。
ファイルごとに作成されるみたいなので、複数作られます。

### .ubuntu-bionic-18.04-cloudimg-console.logとは
vagrantのログファイル。
中を見る限り、仮想機器のログが格納されているファイルのようです。

# ファイルの削除
不要なファイルをGitのバージョン管理から削除していきます。

### まずは.DS_Storeファイルから
以下のコマンドを実行して
アプリケーション内の/.DS_Storeファイルを探します。

```console:terminal
 $ find . -name .DS_Store

./app/assets/stylesheets/.DS_Store
```
ここで/.DS_Storeの居場所が表示されます。
居場所がわかったら、以下のコマンドを実行してファイルを削除をします。

```console:terminal
$ git rm ./app/assets/stylesheets/.DS_Store
```
これでファイルを削除することができました。

### 次に.ubuntu-bionic-18.04-cloudimg-console.logファイルのキャッシュを削除します。
ファイルは残してキャッシュのみを削除するようにしました。
そうすることで、ローカルは削除されずリモートリポジトリのみファイルを削除できます。

以下のコマンドを実行します。

```console:terminal
$  git rm --cached ubuntu-bionic-18.04-cloudimg-console.log
```
リモートでマージするとファイルが削除されます。
ローカルではファイルを残せます。

以上で不要なファイルを削除できました。
bladeでhelperのメソッドを使う

#メソッドをview側で使うのはどうやればいいんだっけ？
例えば以下のような場合、コントローラで定義した変数はindex.blade.php内で `{{$msg}}`というように使えるが、testというメソッドをindex.blade.phpで使いたい時はどうすればいいんだっけという疑問。今回はHelper/AppHelper内のメソッドをbladeで呼び出したいという内容の備忘録。

```php:HomeController.php
<?php

namespace App\Http\Controllers;

use App\Restdata;
use Illuminate\Http\Request;

class RestappController extends Controller
{
    public function index()
    {
        $msg = 'hello'
    }
    
    public function test()
    {
        $test = 'hoge'
        retrun $test
    }
```

## やりたいこと→Helper配下のメソッドをblade側で呼び出したい

```php:AppHelper.php
   
   public function getYear()
   {
     $now = Carbon::now(); //Carbonはphpで日付を扱うライブラリ
     return $now;
   }
```

```php:index.blade.php
  
  <div >{{\App\Helpers\AppHelper::getYear()}}</div>

```

`{{\App\Helpers\AppHelper::getYear()}}` このようにすると、AppHelperのgetYearメソッドが使えるようになる。
Kerasでワイン分類

# はじめに　
（注意　著者はこの分野をがっつり専門にしているわけではないので、説明の不足や誤りもあるかもしれません。）
scikit-learnで入手できるワインの種類(3種)とそれぞれの13の特徴量がまとめられたデータセットを機械学習で分類するためのプログラムです。Udemyの以下の講座ではChainer実装ですが、このページではKerasで実装してみました。
【キカガク流】現場で使えるChainerによるディープラーニング入門 
https://www.udemy.com/course/kikagaku-chainer/learn/lecture/11004080#overview
プログラムをしっかり見直したわけではないので、少し変な部分があるかもしれません。その場合はご連絡いただけると幸いです。
今回やることの概略図を以下に示します。ニューラルネットワークは隠れ層一つです。

![wine_abst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282390/3ae1ef7c-8889-2063-31df-8f8138aa160d.png)


また、今回は最後に最適化関数を変えてみてどんな変化があるかもまとめました。

# 損失関数・最適化関数
損失値とはニューラルネットワークが予測した値と正解の誤差であり、その誤差を求める関数が損失関数です。プログラム中のloss='categorical_crossentropy'で損失関数を定義しています。前の記事では回帰だったのでloss='mean_squared_error'としていました。このように問題設定によって損失関数を変更します。

損失関数の値が減少するように重みを変化させるために最適化関数を用います。プログラム中ではopt = keras.optimizers.SGD(lr=0.08)で定義しています。損失関数同様、多数の種類があり、学習がうまくいかない場合には変更してみるといいです。

ニューラルネットの学習では損失値が小さくなるように重みを調整していきます。損失関数・最適化関数の説明については「はじめに」で述べた講座で詳しく解説されています。

# プログラム
GitHubに載せます。
https://github.com/moriitkys/KerasWineClassify

```python:KerasWineClassify.ipynb
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
import matplotlib.pyplot as plt

wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
dataset_mean = df.mean()
#pd.DataFrame(wine.target)

# Centering
df_c = df-df.mean()
# Normalizing
df_norm = (df_c - df_c.mean()) / (df_c.max() - df_c.min())

s = 13
nb_classes = 3

# Split data
from keras.utils import np_utils
train_X, test_X, train_Y, test_Y = train_test_split(df_norm, wine.target[:], test_size = 0.25)

train_Y1 = np_utils.to_categorical(train_Y,nb_classes)
test_Y1 = np_utils.to_categorical(test_Y,nb_classes)

# Build model
from keras.optimizers import Adam, RMSprop, SGD
model = Sequential()
model.add(Dense(128, input_shape=(s, ), use_bias=False, activation='relu'))
#model.add(Dense(128, activation='relu'))
#model.add(Dense(128, activation='relu'))
#model.add(Dense(128, activation='relu'))
model.add(Dense(nb_classes, activation='softmax'))
#opt = keras.optimizers.Adam(lr=0.08)
#opt = keras.optimizers.RMSprop(lr=0.08)
opt = keras.optimizers.SGD(lr=0.08)

model.compile(optimizer=opt,
      loss='categorical_crossentropy',
      metrics=['mae', 'acc'])

# Start training
history = model.fit(train_X, train_Y1, epochs=50, batch_size=20, verbose=1, validation_data=(test_X,test_Y1))

print(model.summary())
open("model", "w").write(model.to_json())
model.save_weights('param.hdf5')

weights = model.get_weights()

# plot val_loss 損失値の推移をプロット
plt.plot(history.history['val_loss'])
plt.plot(history.history['val_acc'])
plt.show()
```

# 結果
![wine_graphs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282390/049c97ed-ae30-e8eb-d5e9-462487461a38.png)


上記のグラフのように、val_accであるオレンジのグラフが1に近づいて行ったことから学習は成功したと思います。特にSGDが最も安定した曲線になっていると思います。
【GAS】スクリプトエディタで実行中の処理を中断する方法

GASのスクリプトエディタでトリガーを使わず処理を実行すると、こんなのが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430401/c3213885-3faf-1694-765a-4314ae881cfb.png)

これの表示が消えた以降に実行中の処理を中断させる方法メモです。

## 手順

1. 画面上部の[表示] > [実行数]を選択
2. 実行した処理一覧が表示されるので、実行中ステータスの項目にカーソルを合わせる
3. 右端に表示される「・・・(縦並び)」をクリック
4. 「終了」をクリック

これで処理が中断できます。
レンダーとリダイレクト

#レンダーとリダイレクトの違い

###レンダー
一覧画面や新規登録画面を表示させる際のように、アクションに続けてビューを表示すること。
**アクションの実行→ビューの表示**


###リダイレクト
登録処理後に一覧画面に遷移する際のようにアクションを処理した直後にビューを表示せず、
**別のURLに案内する**動きのこと。
**アクションの実行→ブラウザがリクエストし直す→アクションの実行→ビューの表示**

###つまり
・render　　　　　：　表示させるviewファイルを指定
・redirect_to　　　：　URL(HTTPリクエストメソッド）を指定

###詳細
[render と redirect の違い](https://qiita.com/january108/items/54143581ab1f03deefa1)
【チーム開発】Masterブランチに最新コードを取込む

# 概要
チーム開発を行う際に、ローカルのMasterブランチを更新させておく方法

# なぜ？
Masterブランチを更新しておかないと、マージする際に以下のような問題に直面します:sweat:
　　-コンフリクトの処理件数が増える
　　-ローカルでは確認できなかったエラーが新たに発生する

 **そのため、チームの誰かが大元のMasterブランチに対してマージした際は、ローカルのMasterブランチも更新させましょう:smile:**
※前提条件があります！（一番下に記載）

# 実施方法
**1.Terminal**

```
$git checkout master
  #masterブランチへ移動
$git pull upstream master
  #大元のMasterの内容をローカルMasterへデータを移し替え
```
**２.Github　Desktop**
 Fetch origin をクリック

上記内容で最新コードを取込めちゃいます♫

**前提条件**
1.originしていない項目がない状態で行いましょう

##参考文献
https://master.tech-camp.in/curriculums/2974
[Microsoft] macOSからMicrosoft 365 (Office 365) を管理する

Microsoft 365 (Office 365) の管理にはPowerShellを使うのが定番です。
PowerShell Core 7.0も出ているし、そろそろmacからもできるかなぁと思いましたが、どうも[まだできない様子](https://qiita.com/sheep_san_white/items/7a662c1b2973cb7c3149)です。

代わりに、[Microsoft Pattern and Practice teamが作っているNodeでできたツール](https://developer.microsoft.com/en-us/office/blogs/getting-started-office365-cli-powershell/)を使ってみます。


# あらかじめ必要なもの

* Nodeまたは Nodenv

# はじめかた

npmを使ってインストールします。

```console
npm install --global @pnp/office365-cli
```

Nodenvを使っている場合は、rehashもします。

```
nodenv rehash
```

`o365`コマンドが使えるようになりました。


# 使い方

`o365 help` とするとヘルプが表示されます。

```shell-session
$ o365 help

  Office 365 CLI v2.9.0
  Manage Microsoft Office 365 and SharePoint Framework projects on any platform

  Commands:

    help [command...]  Provides help for a given command.
    exit|quit          Exits application.
    version            Shows the current version of the CLI
    login [options]    Log in to Office 365
    logout [options]   Log out from Office 365
    status [options]   Shows Office 365 login status

  Command Groups:

    aad *              36 sub-commands.
    accesstoken *      1 sub-command.
    cli *              7 sub-commands.
    consent *          1 sub-command.
    flow *             12 sub-commands.
    graph *            5 sub-commands.
    onedrive *         7 sub-commands.
    outlook *          13 sub-commands.
    pa *               5 sub-commands.
    planner *          1 sub-command.
    skype *            3 sub-commands.
    spfx *             3 sub-commands.
    spo *              216 sub-commands.
    teams *            42 sub-commands.
    tenant *           5 sub-commands.
    util *             1 sub-command.
    yammer *           17 sub-commands.
```

いくつもあるサブコマンドのうち、省略形でわからないものをあげます。

* aad - Azure ActiveDirectory
* pa - Power Automate
* spfx - SharePoint Framework
* spo - SharePoint Online



## ログインする

最初にログインします。

`o365 login`とすると、https://microsoft.com/devicelogin へアクセスし、デバイスコードを入力するように促されます。

別途ブラウザで https://microsoft.com/devicelogin へアクセスし、表示されているデバイスコードを入力します。

アプリケーションへのアクセス許可を求められるので許可します。

## よくある(?)ユースケース

PowerShell でよくやっていたユースケースがo365 CLIでどうなるのか調べてみました。

### テナント(ディレクトリ)の切り替え

できない(?)

### ユーザの追加

できないようです。

### スケジュールのアクセス権変更

できないようです。

 
# 感想

まだこれからのようです。

# リンク

* [Offce365 CLI](https://pnp.github.io/office365-cli/)
* [Twitter @office365cli](https://twitter.com/office365cli)
PythonでABC146-Cを解く

### はじめに
二分探索の問題を解きます。

### [Buy an Integer](https://atcoder.jp/contests/abc146/tasks/abc146_c)

売られている全ての整数を試すとTLEになります。ですので、うまく計算量を落さないといけません、そこで二分探索を使います。二分探索は雑に説明すると、両端から範囲を狭めていって目的の解を探す手法です。[詳しい解説](https://qiita.com/drken/items/97e37dd6143e33a64c8c)。
二分探索の計算量は$O(log N)$なので間に合います。

```python
a,b,x = map(int,input().split())

max_n = 10**9+1 #nの最大値が10**9なので+1
min_n = 0
while max_n - min_n > 1:
    mid_n = (max_n+min_n)//2
    if x < a*(mid_n)+b*len(str(mid_n)):
        max_n = mid_n
    else:
        min_n = mid_n
        
print(min_n)
```

### まとめ
二分探索をうまく使えるようになれば、大きく計算量を落せるのでマスターしたい。ではまた。
MigraDoc(PDFSharp) で二重線(double)を引く方法

MigraDoc(PDFSharp) で二重線を引こうと思って悪戦苦闘してようやく引けたのでメモ。
この方法は表(Table)で二重線を引く方法ですが、同じ要領で水平線を二重に引くこともできるかもしれません。

# 方法

方法は簡単で「空行を追加してフォントサイズを小さくする」です。

フォントサイズがそのままボーダーの間の空白になります。
フォントサイズを小さくしないといくら `row.Height = 1` としてもフォントサイズ分の高さが取られてしまいます。

# サンプル

```c#
var table = new Table();
table.Borders.Visible = true;
table.AddColumn(Unit.FromMillimeter(30));

// 1 行目
var row1 = table.AddRow();
var para = row1.Cells[0].AddParagraph();
para.AddText("test1");

// 2 行目(空行)
var row2 = table.AddRow();
row2.Format.Font = new Font("Arial", 1); // ここで指定するフォントのサイズで二重線の幅を指定します

// 3 行目
var row3 = table.AddRow();
var para = row3.Cells[0].AddParagraph();
para.AddText("test2");
```

# 参考

PDFSharp では標準で出力できる日本語フォントが少ないので、以下を参考にして日本語フォントを使えるようにしています。

* https://gammasoft.jp/blog/pdf-japanese-font-by-csharp/

標準では游フォントは使えるらしい。IPAフォントも使えました。

* https://qiita.com/KazTag/items/a530b180f6f97fdbf5d0
Macのターミナルでsassコマンドを実行できなくなったときの対処法

久しぶりにsassをコンパイルしたら、
以下のようなエラーが表示されてコンパイルに失敗しました。

```
-bash: /usr/local/bin/sass: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
```

## 原因
前回sassを使った時から、OSのバージョンが上がっていることが原因のようです。

## 環境
・macOS Catalina 10.15.4

## 解決方法

### １．Rubyを再インストール
以下のように入力して、Rubyを再インストールします。

```
brew install rbenv ruby-build
```

もし**brewコマンドの実行に失敗してしまう場合**は、以下の対処をしてからRubyの再インストールをします。
・[Macのターミナルでbrewコマンドを実行できなくなったときの対処法](https://qiita.com/art_aco/items/834ebdf4abfb3445fc0c)

インストールに成功したら、`ruby -v`と入力してバージョンを確認します。

```
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]
```

### ２．Sassを再インストール
以下のように入力して、Sassを再インストールします。
パスワードの入力を求められるので、パスワードを入力します。

```
sudo gem install sass -n /usr/local/bin/
```

インストールに成功したら`sass -v`と入力してバージョンを確認します。

```
Ruby Sass 3.7.4
```

これで、Sassをコンパイルできるようになります。
（style.scssが更新されたら、style.scss上層のcssフォルダへstyle.cssを自動で出力）

```
sass --watch style.scss:../css/style.css
```

## 謝辞
執筆にあたり、こちらを参考にさせていただきました。ありがとうございます。
・[CatalinaにアップデートしSassが使えなくなった時の対処法](https://qiita.com/jotasugiyama/items/768f3157f954d772beac)
Google App Engine で複数アプリを動かしたい

GAEでは1つのプロジェクトの下に複数のサービスを持つことができる。
詳しくはこちら
https://cloud.google.com/appengine/docs/standard/java/microservices-on-app-engine?hl=ja


こんな感じで複数作れる
https://console.cloud.google.com/appengine/services?hl=ja&project=marketing-technology-group
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630149/2e23fc14-8b7f-254d-3a01-97aea768a707.png)


具体的にどうするかというと、アプリケーション設定でサービス名を指定する。
指定しないと `default` になる。
`default` にすると デフォルトで `https://<PROJECT-ID>.appspot.com/`に割り当てられる。
サービス名をつけると `https://<SERVICE-NAME>-dot-<PROJECT-ID>.appspot.com/` に割り当てられる。
~~`-dot-`って気持ち悪いよね~~


もちろんそれぞれカスタムドメイン割り当てられる。dispatch.yaml を使えばね。
https://qiita.com/HiroyasuKuraya/items/80658eeea2d5e18daea2
https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed?hl=ja

サービス名の指定の仕方はスタンダード/フレキシブルの違い、その中でも言語によってやり方がちょっと違うので注意。（でもだいたいapp.yamlっぽい。Javaだけ特殊っぽい）

ex)
Java スタンダード環境
https://cloud.google.com/appengine/docs/standard/java/config/appref?hl=ja
module プロパティ
今はserviceと呼ぶことになってるけど設定ファイルはmoduleのまま残ってる。

Go
https://cloud.google.com/appengine/docs/standard/go112/config/appref
service プロパティ

言語のドキュメント配下の構成ファイルとかconfigration file とかそんなメニューの下にある。
【jQuery】文字数をカウントして表示しよう

文字数制限を付けたフォームに入力された文字を
常に表示させる方法についてざっとご紹介。


# 完成形
1000字まで入力可能な入力欄にて、
「 0/1000」 の「0」が入力毎に変わる。

[![Image from Gyazo](https://i.gyazo.com/5c9ec8af95e03bb12c90f142fefec682.gif)](https://gyazo.com/5c9ec8af95e03bb12c90f142fefec682)
html側のでは、text_fieldに「maxlength:"1000"」を追加して
文字数制限をかけています。

## 値をカウントして書き換える

```js:sample.js
$(function(){

  $('.「text_fieldのクラス名」').keyup(function(){
    var count = $(this).val().length;         //文字数を変数[count]に代入する
    $('.「文字数を表示する要素のクラス名」').text(count + "/1000");     //
  });

})
```
**keyupイベント** は、キーボードのボタン押下後、離されたときに発生します。
 **text()メソッド** で、htmlのテキスト(0/1000の要素)の書き換えを行います。

◉ text()メソッドは他にも、テキスト情報を取得・追加・変更することが可能。
___________________________________
以上で終了です。
ご覧いただきありがとうございました。

参考記事
https://www.sejuku.net/blog/40700
アップロードファイルの制限修正【GCP for KUSANAGI Business】

#アップロードファイルの制限を修正する方法
KUSANAGI環境のファイルアップロード制限を変更するには、サーバーにログインしてroot権限にて設定を書き換える必要があります。

##root権限への移行
GCPの管理画面からSSHで入り、Root権限に移行します。

```
[test@test-vm ~]$ sudo su -
[root@test-vm ~]#
```

##PHP 設定ファイルの変更
ドメインディレクトリに移動して PHP 設定ファイルを作成します。
以下の your_provision は KUSANAGI で設定したプロビジョンです。

```
[root@test-vm ~]# cd /home/kusanagi/your_provision/DocumentRoot/
[root@test-vm ~]# vi .user.ini
```

そして、PHP 設定ファイルに必要な容量を以下のように設定します。

```
memory_limit = 900M
post_max_size = 500M
upload_max_filesize = 500M
```

キーボードの「Esc」を押して、コマンドモードに戻ります。
「:wq [Enter]」を押して、保存終了します。

##Nginx のアップロード制限変更

```
[root@test-vm ~]# cd /etc/nginx/conf.d
```
そして、 your_provision_http.conf と your_provision_ssl.conf (SSl時)を、viコマンドで変更します。
※**your_provision** は KUSANAGI で設定したプロビジョンです。

###your_provision_http.conf の変更

```
[root@test-vm ~]# vi your_provision_http.conf
```
編集画面で編集をします。修正する場所を探すために「/client_max_body_size」を入力して、 client_max_body_size を検索します。
そして、以下のように修正します。

修正前（デフォルト設定）:16Mになっているはずです。（ここでは13行目）

```
 12     charset UTF-8;
 13     client_max_body_size 16M;
 14     root  /home/kusanagi/your_provision/DocumentRoot;
 15     index index.php index.html index.htm;
```

修正後:５００Mに設定。（ここでは13行目）

```
 12     charset UTF-8;
 13     client_max_body_size 500M;
 14     root  /home/kusanagi/your_provision/DocumentRoot;
 15     index index.php index.html index.htm;
```

###your_provision_ssl.conf の変更

```
[root@test-vm ~]# vi your_provision_ssl.conf
```
your_provision_http.conf と同じように変更を行います。
編集画面で編集をします。修正する場所を探すために「/client_max_body_size」を入力して、 client_max_body_size を検索します。
そして、以下のように修正します。

修正前（デフォルト設定）:16Mになっているはずです。（ここでは38行目）

```
 37     charset UTF-8;
 38     client_max_body_size 16M;
 39     root  /home/kusanagi/your_provision/DocumentRoot;
 40     index index.php index.html index.htm;
```

修正後:５００Mに設定。（ここでは38行目）

```
 37     charset UTF-8;
 38     client_max_body_size 500M;
 39     root  /home/kusanagi/your_provision/DocumentRoot;
 40     index index.php index.html index.htm;
```

##設定ファイルの動作確認

設定ファイルにエラーがないか確認します。

```
[root@test-vm ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@test-vm ~]#
```
上記のように表示されれば問題ありません。もし、エラーが出た場合はその英語を読んで修正する必要があります。

##再起動

```
[root@test-vm ~]# kusanagi restart
完了しました。
[root@test-vm ~]# 
```

このように正常に終われば、問題ありません。
【超初級編】Java Scriptの超基礎的なルール

前回の記事からの続きです。
https://qiita.com/furukouji/items/9b909b0aa2d40e0f0a18
ぜひこちらも御覧ください。

## 📗 環境
Mac OS
VSCode
Google Chrome

## 📗 Java Scriptのルール
- すべて半角で記載する
- 数字はそのまま半角で記載できる
- 文字は前後に''or""をつける必要がある
- 最後にかならず;(セミコロン)をつける
- コメントアウトは//か複数行の場合は、/* */このようにすることでコメントアウトが可能になります。

```javascript:hello.js
console.log(123); //数字の場合はこれでOK
console.log('文字ですよ'); //文字の場合は''or ""で囲う。
では例えば
コ"メン"ト　←このように文字の中に""が入っていた場合はどうすればいいでしょうか？
'コ"メン"ト' ←正解は、このようにシングルクオーテーションで囲ってあげればOKです。

コメントアウトについて

//コメントアウトされています。

/*　複数行でも
　　コメントアウトが
　　実行されています。 */
```

テクニックとして、command + /で行をコメントアウトできるので是非このショートカットは覚えましょう！戻すときも同じです。

今回は非常に簡単ですが以上となります。

## 📗 次回予告
次はJavaScriptの変数についてお伝えしていこうと思います。
初学者の方一緒に頑張りましょう♪
コントローラとビュー

#コントローラーとビューの関係
どういうコードの流れでWebページが表示されるのか忘れないようにまとめました。

*簡単な語句説明*
**URL**：インターネット上の番地（例：http//~）
**HTTPメソッド**：ブラウザからアプリケーションにアクセルする際の大まかな要求(例：get,postなど)


*大まかな流れ*
1. リクエストを処理するコントローラとアクションは、ブラウザからのリクエストに含まれるURLとHTTPメソッドによって決定される。
2. コントローラのアクションを設計するには、入り口となるURLとHTTPメソッドを併せて考える必要がある。
Swift学習記＃2「繰り返し文について」

#はじめに

今回は`for`、`while`などの繰り返し文についての
アウトプットをやって行きます。

#for 文

まず、`for`文の書式はこんな感じ、、、

```test.Playground

for 変数 in 開始値 ... 終了値 {
  // 処理
}

```
`for`の後ろに繰り返し処理の対象となる変数を設定し、
`in`の後ろに処理を行う範囲を設定します。

実際の使用例はこんの感じ、、、

```test.Playground

// 1 ~ 10を取り出す
for i in 1...10{
    print("i:\(i)")
}

//表出される値
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9
i:10

```
この様に、`開始値 〜 終了値`がすべつ表出されるまで作業を繰り返す。
また、配列から値を取り出すことも可能。

```test.Playground

// 配列内の値を全て取り出す
var list = ["data1":1, "data2":2, "data3":3, "data4":4, "data5":5]

for data in list{
    print("data:\(data)")
}

//表出される値
data:(key: "data1", value: 1)
data:(key: "data3", value: 3)
data:(key: "data2", value: 2)
data:(key: "data4", value: 4)
data:(key: "data5", value: 5)

```

#while 文

`while`文は`for`文とは違い、範囲ではなく、
設定した条件の中で繰り返し処理を行います。
書式はこんの感じ、、、

```test.Playground

while (ループ条件) {
  // 処理
}

```
こんの感じで、`while`の後ろに繰り返しの処理を行う条件式を設定する。

実際の使用例はこんの感じ、、、

```test.Playground

// countが５になったら終了

var count = 0
var total = 0
while count < 5 {
    count += 1
    total += count
}
print("count: \(count) total: \(total)")

//表出される値
count: 5 total: 15

```
こんな感じになります！


#これまで

今回は、`for`、`while`などの繰り返し文についてをやって行きました。
繰り返し分は、様々な応用が効くので是非マスターしてみてください！

次は、`if`文や`switch~case`などの条件分岐のアウトプットを
やっていこうと思います！
【VBA】mciSendString APIを用いた際に音源ファイルの音量がSetAudioで操作できない問題を解消

メモとして残します。

mciSendString APIでwavファイルを**音量小さく再生**したかったのですが、
`setaudio`コマンドが何故か効かない。
オープンした際に`type mpegvideo`がなかったのが原因だった。

#■やり方
```vb
'APIを使えるように宣言
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long


Sub test()
    SoundFile = Chr(34) & "C:\Windows\Media\chord.wav" & Chr(34)
       
    rc = mciSendString("Close MySound", "", 0, 0)
    '重量なのはこいつ↓ エイリアスの次に必ず「type mpegvideo」とつけないと音量が操作できない
    rc = mciSendString("Open " & SoundFile & " alias MySound type mpegvideo", "", 0, 0)
    rc = mciSendString("setaudio MySound volume to 1000", "", 0, 0)
    rc = mciSendString("Play MySound", "", 0, 0)
End Sub

```

#■さいごに
本業はwebエンジニアなので、本当はwebのノウハウを蓄積したいが、WEBに関しては自分がめちゃくちゃ苦戦したことって先駆者が遺産を残しているため、なかなかそれを超えるアウトプットをQiitaでできないのがつらみ。
VBAってノウハウがweb関係と違って圧倒的にノウハウがインターネットになくてきつい(;´･ω･)
必須モジュール gd がインストールされていないか、無効化されています。の対処方法

###WordPressのサイトヘルスになにか出ている…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231874/0c649566-26be-0886-79e6-88c47103b11b.png)

herokuで稼働しているWordPressがどうもおかしい。管理者なら閲覧できるが、一般ユーザーが記事を見ようとするとエラーになってしまう。
これのせいだろうか？？

###原因と対処方法
herokuにデフォルトで入っている拡張ライブラリにgdがないためだそうだ。

対処法としてComposerというのがいるらしいので、[ここ](https://getcomposer.org/download/)からダウンロードした。
特にどこもいじらずそのまま進む。
終わったら`composer -v`して動くのを確かめる。

wordpressのフォルダ直下に`composer.json`を作成。以下のように記載。

```composer.json
{
  "require": {
      "ext-gd": "*"
  }
}
```

`composer update`を実行

あとはコミットして`git push heroku master`すれば適用される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231874/6d4c793f-7d96-c0a6-1e92-832b35034e2d.png)

致命的な問題については解消された。

だが表示については別問題なようだ…やはり表示できず。
いったん参考までに公開します。エラー原因が特定できたら追記、という形で。

[追記]
記事が表示されないのは.htaccessの記述が悪かったためでした。herokuあげてからずっと見れなかった模様。
【Gradle】Javaプラグインのタスクについて

# Javaプラグインのタスクの依存関係

Javaプラグインに含まれるタスクは、そのほどんどが単体で実行できず、依存関係を持つ。
よって、先に実行されているべきタスクというものが存在する。

## タスクの実行順序と処理概要

### compileJava/processResourcesタスク
mainソースセットを対象とする。
Javaソースのコンパイルとリソースのbuildファイルへのコピーを行う。

### classesタスク
compileJavaタスクとprocessResourcesタスクを実行する。

### javadocタスク
classesタスクの実行結果である生成物をもとにJavadocを生成する。

### compileTestJava/processTestResourcesタスク
testソースセットを対象とする。
Javaソースのコンパイルとリソースのbuildファイルへのコピーを行う。

### testClassesタスク
compileTestJavaタスクとprocessTestResourcesタスクを実行する。

### testタスク
testClasses、compileTestJava、processTestResourcesタスクを実行し、
テストの実行結果のレポートをXML形式で生成する。

### checkタスク
testタスクの生成したXMLファイルをもとにビルドの可否を判定する。

### jarタスク
classesタスクの生成物であるクラスファイルやリソース、ライブラリなど
をJARファイルにパッケージングする。

### puloadArchivesタスク
JARファイルなどのアーカイブをリポジトリなどにアップロードする。

### assembleタスク
デフォルト設定ではjarタスクと実行内容は同じ。

### buildタスク
checkタスクとassembleタスクを実行する。

# タスクの概要

## compileJavaタスク／compileTestJavaタスク
JavaCompile型のタスク。javacコマンドによりJavaソースをコンパイルする。
java.srcDirsプロパティで指定したディレクトリ以下の
拡張子が.javaのファイルをコンパイルする。

## processResourcesタスク／processTestResourcesタスク
Copy型のタスク。リソースをクラス出力先へコピーする。
resources.srcDirsプロパティで指定したディレクトリ以下の、拡張子が.java以外のファイルを
ソースセットの出力先(outputプロパティの設定値)へコピーする。

## jarタスク
Jar型のタスク。JARファイルの生成を行う。
mainソースセットのoutputプロパティ(=compileJavaタスクとprocessResourcesタスクの出力)
をアーカイブ対象としてJARファイルを生成する。

## javadocタスク
Javadoc型のタスク。Javadocの生成を行う。

# 参照

この記事は以下の書籍を参考に執筆しています。

参考書籍：[Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築](https://www.shoeisha.co.jp/book/detail/9784798136431)
Haskellerの1週間Rust入門チャレンジ Day 1 #Rust

# 1週間Rust入門チャレンジ

諸事情で1週間でRust入門をしないといけないので、頑張ります。
Haskellぐらいしかまともに書ける言語が無いのは問題だと思っていたので、いい機会だと思ってせいぜい足掻こうかと(Haskellもまともに書けるかと言えば微妙かもしれないけど)。
サボってしまうのを防ぐためにアウトプットを同時に行うことで自分に義務を課すという方針。

目標としては、

- 最低限使えるようになる
- 簡単な競プロ問題を解けるようになる
- Haskellで言うこれはRustならこう書くのかな、ぐらいの脳内変換ができるようになる

まあ、1週間という期間設定がそもそも無理ゲーな気もするけど、とりあえずできる限りのことはします。
こうしたら良いよ、というものがあればコメントを頂ければ泣いて喜びます。
また、超初心者なので書いている事が間違っている可能性がかなり高いです。
正直誰かに教えるために書く記事というわけではなく、授業ノートのような感じだと思っていただければと思います。
もし間違いを見つけたら、コメントやツイート、編集リクエストで指摘していただけたら泣いて(ry

## 使う教材

1年ぐらい積ん読状態だったオライリーのRust本があるので基本的にはそれを。
後はネットの情報を漁りつつ、という感じ？
第何章とか何ページとか書いているとしたら基本的にオライリーRustのことだと思ってください。

## 環境

Fedora x Vimで行きます。
宗教上の理由でEmacsは使えないので。

## Day 1

### 第1章

Rustの何が優れているのか？について
所有権、移動、借用という3つの機構を用いることでメモリ安全性と信頼できる並列性を得られるらしい。

Rustは型安全
プログラムがWell Definedであることを保証してくれるなら、その言語は型安全である
例外は未定義動作ではない
Haskellも型安全

Rustでポインタを使う事もできるが、その場合はunsafeとなる

トレイトとジェネリクス
一連の型に共通する性質を記述し、そのような共通性を利用するための簡潔で柔軟で効率の良い機能
Haskellの型クラスに相当？

### 第2章

Rustのインストール
cargo、rustc、rustdocを使う
cargoはコンパイルマネージャとパッケージマネージャを兼ねる
Haskellのstackやcabalに相当？
rustcはRustのコンパイラ
HaskellのGHCに相当
rustdocはドキュメンテーションツール
恐らくHaskellのHaddockに相当するはず

`cargo new --bin hello`
これでプロジェクトが新規作成できる。
`stack new hello`
みたいなものか

関数定義

```rust
fn gcd(mut n: u64, mut m: u64) -> u64 {
    assert!(n != 0 && m != 0);
    while m != 0 {
        if m < n {
            let t = m;
            m = n;
            n = t;
        }
        m = m % n;
    }
    n
}
```

なんかすごくCっぽいなあ、という印象。
Haskellだとまずこうは書かないだろうなあ。
返る値の型を表す矢印はHaskellと同じなので、そこは少し親近感。

u64はHaskellで言うWord64

mutはミュータブルで、再代入可能変数という意味らしい。
再代入、うっ、頭が......
再代入とか何年やってないだろう？
実際にはほとんどの変数は再度代入されることはない、と書いてあるので、Haskellの癖で再代入を避ける書き方になってもなんとかなりそう？

assertはマクロらしい。
引数が真であることを確認し、偽であれば理解しやすいメッセージを出してプログラムを終了する。
このような突然の終了をパニックと呼ぶ。Rustでは常にアサーションをチェックする。
なるほど。つまり、今回の場合はゼロ除算を避けるためにどちらもゼロではないことをあらかじめ確認した、という事か。

セミコロンが無い式で終わっている場合、その式が関数の返り値となる。
中括弧で囲まれたブロックは式となる。
Rustではreturn文は関数の途中で明示的に早期リターンするときにしか用いない。

これから今日中に勉強する分は随時更新します。