OmniAICreator/Qiita-1.07M huggingface dataset:
初心者がAdobe animateでアニメを作ってみた

#はじめに

初めまして。4月からデザイナーとして入社したasaです。
今回はアドベントカレンダー用に一度も触ったことのない「Adobe animate」で簡単なアニメを作成しました。

Adobeのanimateで行われているチュートリアルを見て、
「もっと簡単に3つ項目を覚えればできる！」内容を書かせていただきました。
よろしくお願いします。


##イラストの拡大
####1:レイヤーに使いたい画像を配置する
![スクリーンショット 2020-12-13 23.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/470809d5-0934-7ff8-0996-cac69d4e0177.png)

####２：「F5」を押して経過数のマスを増やし、小さくした画像を配置する
![スクリーンショット 2020-12-13 23.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/21f3eb42-9266-0ad1-9a09-3aa290e610ac.png)

####３：「F5」を押して、２で増やした経過数と同じマスを追加し、元の大きさと同じ画像を配置する
![スクリーンショット 2020-12-13 23.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/e84fa2ad-5212-14a0-68de-b4a84bc27d74.png)

###結果：サンタさんがズンズン動く！
![1つめ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/ac4db5ae-0e64-3b12-1f35-42c8f85b887a.gif)

##イラストの回転
####1:レイヤーに使いたい画像を配置する
![スクリーンショット 2020-12-13 23.29.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/c850b081-a930-bf08-01f5-abb9fcf6dcf9.png)

####２：「F5」を押して経過数のマスを増やし、1と同じサイズの画像を少しずつ斜めにして同数マスを増やしていく
![スクリーンショット 2020-12-13 23.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/6cfd5792-4411-ed90-f892-67a8845d03ba.png)
![スクリーンショット 2020-12-13 23.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/5f528544-7041-705b-d04a-31eddf45c984.png)

###結果：くるみ割り人形がグルグル回る！
![2つめ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/8e43bd41-81dd-714a-a9ef-c26b887ba9c1.gif)

##イラストをシンボル化（走らせてみる）
####1:レイヤーに使いたい画像を配置、スタート地点は枠外に配置する
![スクリーンショット 2020-12-13 23.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/e8159c3a-73bc-0305-916e-c823fae76d58.png)
####2:画像を左クリックで「シンボルに変換」する
![スクリーンショット 2020-12-13 23.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/e1e6c43e-a721-7c66-60b3-46cb764c571b.png)
![スクリーンショット 2020-12-13 23.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/ad027d5a-571e-57f3-2529-0e61c33d0ff5.png)
####3:「F5」を押して経過数のマスを増やし、「シンボルに変換」した画像をゴール地点まで動かす
![スクリーンショット 2020-12-13 23.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/842583ee-dba8-8504-8cfa-630cb811c989.png)
####4:レイヤーを右クリックし、「クラシックトゥイーンを作成」する
![スクリーンショット 2020-12-13 23.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/fbd41e99-5c13-e603-073e-00ad11ef1750.png)
###結果：そりに乗ったサンタが通り過ぎた！
![3つめ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/87e713f5-4a79-b835-5a61-c37672c68ab7.gif)

#最後に
![さいご.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851666/70425d4b-69b8-9f15-8518-25cadf78190b.gif)



クリスマスまでのアドベントカレンダー。せっかくなので、ちょっとだけワクワクするクリスマスアニメを作成しました。
作成にかかった時間は20分。初心者でも簡単にアニメを作る事ができました。

これを機会に、もっとanimateを作成し、勉強してみようと思います。
（2021年の目標ができました！）
WSL2にOSを手動で追加する

wsl2でちょっと真っ新な環境から検証したいけど今の環境を壊したくない時とかに、OSを手動で簡単に追加することができます。

#OSイメージをダウンロード
[Ubuntu20.04イメージ](https://cloud-images.ubuntu.com/focal/current/)より
focal-server-cloudimg-amd64-wsl.rootfs.tar.gz
をダウンロードしてwindows上の任意の場所に保存します。

```
C:\wsl_images\focal-server-cloudimg-amd64-wsl.rootfs.tar.gz
```

# OSをインストール
PowerShellを開き、importコマンドでOSをインストールします

`wsl --import 任意のOS名 ディスクイメージ保存先 OSイメージファイル --version 2`

```
> wsl --import ubuntu-test C:\Users\(自分のユーザ名)\AppData\Local\Packages\ubuntu-test C:\wsl_images\focal-server-cloudimg-amd64-wsl.rootfs.tar.gz --version 2
```

ストアからインストールしたUbuntuのディスクイメージは
`C:\Users\(自分のユーザ名)\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79xxxxxx\LocalState`
に格納されているので、同様に`AppData\Local\Packages`配下に任意の名前で指定しておくと良いと思います。

# PowerShell上で確認
完了したら、wslコマンドで一覧を表示すると追加されていることが確認できます。

```
> wsl -l -v

  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  ubuntu-test            Stopped         2
  Ubuntu-20.04           Running         2
```

# OSを起動させる

wslコマンドで起動

```
> wsl -d ubuntu-test
```
もしくはwindows terminalを開きなすと、新規一覧のタブに追加されているので、選択するだけで起動します。

# 初期設定
インストールが完了した状態だとrootユーザでのログインになります。
そのままユーザの追加とデフォルトユーザの設定をしておきます。

### ユーザ追加
```
# adduser test_user

Adding user `test_user' ...
Adding new group `test_user' (1000) ...
Adding new user `test_user' (1000) with group `test_user' ...
Creating home directory `/home/test_user' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for test_user
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

```

### sudoコマンドを使えるように
そのままでは初期インストール時のようにsudoコマンドが使えませんので、追加しておきます

```
# usermod -G sudo test_user
```

### ログイン時のデフォルトユーザに指定
Windows Terminal から開いたときに、rootではなく新しく追加したユーザでスタートするように指定しておきます。

```
# vi /etc/wsl.conf
```

```/etc/wsl.conf
[user]
default=test_user
```

以上で、ストアからダウンロードした時とほぼ同じ状態で追加したOSを使用することができます。

# ※追加したOSが不要になったら
PowerShellからイメージ削除します。

```
一覧で名前を確認
> wsl -l -v
  NAME                   STATE           VERSION
  ubuntu-test            Running         2

実行中なら停止
> wsl --terminate ubuntu-test

登録を解除
> wsl --unregister ubuntu-test
```
これでインストール時に指定したフォルダ`C:\Users\(自分のユーザ名)\AppData\Local\Packages\ubuntu-test`にあったディスクイメージが削除されます
もうdo~endを忘れない拡張機能　〜VSCode〜

#はじめに
　本日は予定があり、プログラミングがあまり進められなかったので、昨日に引き続き、VSCodeのおすすめ拡張機能紹介にします。

##もうendは手動で入力しなくていい！！
`endwise`という拡張機能です。
これは、`end`が必要なメソッドを記述したときに、同時に次の行にendを挿入してくれる。つまり、ifやdefやdoを記述すると、自動でendを記述してくれるので、endの記述忘れがなくなります。
わたしは、特にif文を記述するときにendを忘れてしまうことがあったので、たいへん重宝しています。

##さいごに
　拡張機能って、ちょっとしたことを実現してくれるけど、その効果は絶大だと感じています。
Python 基本操作　第1弾：リスト内包表記

# #Python 基本操作<リスト内包表記>#

##はじめに
自分が不安な部分についてのみ，Pythonの基本操作について復習する．
その第1弾としてリスト内包表記について記述する．


##なぜリスト内包表記が必要なのか？
・処理の高速化
・構造の単純化
主には，これらの利点が得られることがあるためである
ここでは，その記述方法と評価について行う


##記述方法１
#####大括弧[ ]内で処理内容を格納する変数とその処理を並べる
[変数　処理]
例）
```data = [i for i in range (10)]```

##記述方法２
#####大括弧[ ]内で処理内容を格納する変数とその処理及び実行条件を並べる
[変数　処理　条件]
例）
```data = [i for i in range (10) if i%2 == 0]```

##記述方法３
#####if~ else...のように条件を満たさない時の処理が必要な時，条件を間に並べる
[変数　条件　処理]
例）
```data = [i if i%2 == 0 else 0 for i in range (10)]```

##コード

```python:List_Comprehension.py
"""
2020/12/13
@Yuya Shimizu

リスト内包表記
"""
#記述方法１：[変数　処理]
data = [i for i in range(10)]
print(data)

#記述方法２：[変数　処理　条件]
data = [x for x in range(10) if x%2 == 0]
print(data)

#記述方法３：[変数　条件　処理]
data = [y if y%2 == 0 else "xxx" for y in range(10)]
print(data)
```

##本当に高速化できているのか？
確かに，構造としては1行で単純化できていると思う．
しかし，本当に高速化できているのか？
以下では，その検証をtimeモジュールを用いて行う．
繰り返し数が小さいと違いが分かりにくかったため，
繰り返し数1000, 2000, 3000, 4000, 5000の5条件において検証した．

##コード

```python:List_Comprehension.py
"""
2020/12/13
@Yuya Shimizu

リスト内包表記
"""
iteration = 1000 #繰り返し条件{1000,2000,3000,4000,5000}
def func1():
    #[変数　処理]
    data = []
    for i in range(iteration):
        data.append(i)
    print(data)

    #[変数　処理　条件]
    data = []
    for x in range(iteration):
        if x%2 == 0:
            data.append(x)
    print(data)

    #[変数　条件　処理]
    data = []
    for y in range(iteration):
        if y%2 == 0:
            data.append(y)
        else:
            data.append("xxx")
    print(data)

def func2():
    #[変数　処理]
    data = [i for i in range(iteration)]
    print(data)

    #[変数　処理　条件]
    data = [x for x in range(iteration) if x%2 == 0]
    print(data)

    #[変数　条件　処理]
    data = [y if y%2 == 0 else "xxx" for y in range(iteration)]
    print(data)


###### 実行時間計測
import time

start1 = time.time()
func1()
process_time1 = time.time() - start1

start2 = time.time()
func2()
process_time2 = time.time() - start2

print("リスト内包表記(iteration={})----なし：{}秒，あり：{}秒".format(iteration, process_time1, process_time2))

```

##検証結果
|繰り返し数[回]|リスト内包表記のなしの実行時間[s]|リスト内包表記のありの実行時間[s]|
|:-:|:-:|:-:|:-:|
|1000|1.139344|1.121223|
|2000|1.026536|0.578534|
|3000|0.856933|0.884612|
|4000|0.766533|0.579598|
|5000|0.667517|0.605027|

2000回と4000回のときには確かに高速化が見られるが，必ずしも高速化できるというわけではなく，
高速化できる場合があることが分かる．実際に，よく見ると試行回数3000回においては，むしろリスト内包表記を用いた方が遅いという結果となっている．

##感想
検証結果では，必ずしも高速化できるというわけではないが，可能性はあり，遅くなってもわずかであるならば，活用した方がよいのかと思った．それに，構造が単純化できることはデバッグなどの際にも都合がよいのではないかと思う．使える場面があれば，ぜひリスト内包表記を使いたいと思う．

##参考文献
Pythonで始めるアルゴリズム入門　伝統的なアルゴリズムで学ぶ定石と計算量
　　　　　　　　　　　　　　　　　　　　　　　　 増井 敏克　著　　翔泳社
note

#WebHook
GitHubなどPostする仕組み

#OAuth2.0
認可サーバー（Google)で認証情報によりアクセストークンを発行。（このアプリのアクセスを許可しますか？YES）
アクセストークン付きでAPIをコールし、アクセストークンを検証
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be
サービス間で認可情報を受け渡せると，あるサービスがユーザの認可のもとで別のサービスの管理する情報の取得／追加／更新／削除などを行えるようになる
OAuthに対応したサービスでは，ユーザが外部サービスにパスワードを教えることなく，認可情報の委譲が可能なため、Basic認証と比べて柔軟かつセキュアな運用が可能

例）
コンシューマがアプリ/ssoにアクセス
アプリが認可へリダイレクト（state付き）、このアプリにemailを渡してもいいですか？YES
Googleがアプリ/callbackへリダイレクト
アプリがstate検証後、トークンから共通鍵でJSONへ復元しemailを取得し、DB認証
state:CSRFを防ぐ

Webアプリの場合、client_secretをもてる。

Googleの場合は、共通鍵方式、client_idとclient_secretがサービスに必要

内包型とは、認可サーバーへの問い合わせが不要。
https://qiita.com/TakahikoKawasaki/items/970548727761f9e02bcd

＃JWT
<ヘッダー>.<ペイロード>.<署名>
BASE64でJSONからトークンへ変換
{
  "typ": "JWT",
  "alg": "HS256"
}
{
  "admin": true,
  "name": "John Doe",
  "sub": "1234567890"
}
署名パートは、エンコード済みヘッダー、ピリオド（"."）、エンコード済みペイロードを連結したものを入力値として"alg"の署名アルゴリズムで署名し、Base64urlエンコードすることにより作成されます。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
こちらの文字列をヘッダーで指定されたアルゴリズムで署名検証することにより、ID Tokenの正当性を評価できます。https://techblog.yahoo.co.jp/advent-calendar-2017/jwt/
オレオレ短縮URLアプリ

この記事は、[上智大学エレクトロニクス研究部Advent Calendar](https://qiita.com/advent-calendar/2020/sophia_ele_lab)第15日目の記事です。

## 背景

短縮URLアプリといえば、[bit.ly](https://bit.ly) が有名ですね。当初はこのアプリの無料プランで十分だと思っていたのですが、何度も繰り返し短縮URLを生成するに連れて満足できなくなってきました。特にVS Codeのliveshareのリンクをbit.lyで短縮する際に、毎回別のリンクを生成されてしまうのが不満でした。同じ目的ならば同じリンクになるべきだと考え、固定リンクを使ってみたいと思ったのですが、[月額29ドルもかかってしまいます](https://bitly.com/pages/pricing/v2)。個人として使うのには(そしてこの目的だけのために使うのには)高すぎると思い、自分で短縮リンクアプリを作ってみることにしました。

## 使った技術スタック

- AWS Lambda(API Gateway)
- AWS DyanmoDB
- TypeSciprt
- GitHub Actions

## 実装

[GitHubに載せました](https://github.com/Tsutomu-Ikeda/link-shortener)。この記事ではその中で一番重要なリダイレクトの部分だけ解説します。

### リダイレクト処理の実装について

[関数定義(GitHub)](https://github.com/Tsutomu-Ikeda/link-shortener/blob/3c2958f244e0878ca5bfe8a44a2d8ab1a10ac58d/handler.ts#L81)

```typescript
if (result.Item.public || (await verifySession(sessionId))) {
  const location = result.Item.originalUrl.toString();

  if (xhr) {
    return {
      statusCode: 200,
      body: JSON.stringify({location}),
      headers: httpUtils.toKebabCase({contentType})
    };
  } else {
    return {
      statusCode: 302,
      body: null,
      headers: httpUtils.toKebabCase({location, contentType})
    };
  }
} else {
  if (xhr) {
    const session = await checkSessionId(dynamodb, sessionId, linkId);
    const setCookie = `session=${session}; Path=/; Max-Age=${maxAge}; HttpOnly${isDev(event) ? "" : "; Secure"}`
    return {
      statusCode: 403,
      body: null,
      headers: httpUtils.toKebabCase({contentType, setCookie})
    };
  } else {
    const location = `/link?id=${event.pathParameters.id}`;
    return {
      statusCode: 302,
      body: null,
      headers: httpUtils.toKebabCase({location, contentType})
    };
  }
}
```

色々書いてありますが、やっていることは、公開リンクならそのままリダイレクトを行う、非公開リンクなら管理者の許可があるまでリダイレクトを行わないということです。
非公開リンクのときに誰に許可を行うのかという判断をするために、 `Set-Cookie` を行っています。Cookieの値はDyanmoDBで管理され、 `approved` が `true` になると管理者の許可が得られたと判断されます。
AWS MLS資格に合格しました

# はじめに
今日（12/13）に「AWS Certified Machine Learning - Specialty」資格（以降MLS）に受かりました。
機械学習はずっと前から流行っていて、この業界にいる関係上世間一般よりは知っているつもりでしたが、試験勉強をする中で「これまではぼんやりとしかわかっていなかったんやな」というのがよくわかりました。
誰かの役に立てば幸いです。

※過去の記事
[AWS SAAに受かった話](https://qiita.com/kkino1985/items/85bcfa50686fcfe69c56)
[AWS SOAに受かった話](https://qiita.com/kkino1985/items/295509d3d94c726ae56a)
[AWS DVA(とCLP)に受かった話](https://qiita.com/kkino1985/items/8f3db5e102876cca47b1)
[AWS SAPに受かった話](https://qiita.com/kkino1985/items/7ad6bcdde44a2b4e4916)
[AWS SCSに受かった話](https://qiita.com/kkino1985/items/7182ada488b60d196ec5)
[AWS ANSに受かった話](https://qiita.com/kkino1985/items/1976c5a55f4047dc5385)
[AWS DBSに受かった話](https://qiita.com/kkino1985/items/25e9e19e6a83b6f0161f)
[AWS DASに受かった話](https://qiita.com/kkino1985/items/37fb7c7396c23f9f0f7c)
[AWS AXSに受かった話](https://qiita.com/kkino1985/items/309b64115d255032ccaf)

# 獲得スコア
|受験日|スコア/合格点/満点|結果|
|:--|:--|:--|:--|
|2020/12/13|785/750/1000|合格|

普通だな！（震え声）

# 勉強に使った教材
※いつものようにBlackbeltとWhizlabsは省略

## 認定資格対策トレーニング
日本人のトレーナーによる、認定資格の内容やサンプル問題の解説をやってくれるトレーニングです。
この動画を見たら試験に受かる、という類のものではないですが、「何から勉強したら良いかわからない」という人はReadiness Examやその他諸々のトレーニングへのリンクもあるので参考になると思います。

AWS 認定 - 専門知識を攻略しよう機械学習（MLS-C01）
https://pages.awscloud.com/AWS_Certification_ML_jp_confirmation.html

## AWS Summit 2020/2019資料
今回の試験は「とにかく機械学習の言葉に馴染む」のが大事だと思っていたので、過去のセッションは参考になる・ならない関わらず一通り観ました。

[AWS Summit 2020セッション一覧](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand)
[AWS Summit 2019セッション一覧](https://aws.amazon.com/jp/summits/tokyo-osaka-2019-report/)

## 書籍
「機械学習入門 ボルツマン機械学習から深層学習まで」
https://www.amazon.co.jp/gp/product/B06Y41YGNW
　→機械学習事始めとしては良い本でした。
 
 「深層学習教科書 ディープラーニング G検定（ジェネラリスト） 公式テキスト」
 https://www.amazon.co.jp/gp/product/B07H2ZR6M2
 　→本格的に試験勉強を始めるならここから。一応問題集も買ったのでG検定は受けるかもしれません。

あとは本格的に機械学習のプログラムをやりたい人は下記がおすすめらしいです（自分は何故か3年前に買っていました。今回の試験対策としては使いませんでしたが）
「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 」 https://www.amazon.co.jp/dp/4873117585

# 試験の所感
- 資格の位置付けとしては「機械学習のエントリー資格」という印象
    - テキストを読んだ限りだと、G検定よりは難しい
- DataAnalyticsの分野（Glue、Kinesis、EMRなど）も試験範囲なので、先にDAS資格を取っていると楽になる（そこまで深くは聞かれない模様）
- 基本的には「機械学習に関連する言葉をどれだけ知っているか」が問われる試験
    - 言葉を知っている上で、そのアルゴリズムがどういう仕組みで、何に使われるかが重要
    - 逆に言うと、そこが一通りわかっていればそんなに難しい問題はない（理屈上は）
    - Sagemakerのビルドインアルゴリズムは最低でも覚えておく
        - https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/algos.html
- 機械学習は過学習（オーバーフィッティング）との戦いなので、それをどうやって軽減するか、という問題が多かった
- テストデータのサンプル数に偏りがある場合の手法
- モデルを評価するための指標は計算できるようにしておく
    - リコールとか精度とか正確性とか
    - サンプル問題か、下記ドキュメントがわかりやすい
    - https://docs.aws.amazon.com/ja_jp/machine-learning/latest/dg/binary-model-insights.html
- AWSの話はSagemakerが多い
    - そこまで深いことは問われないので、BlackBeltとAWS Summit程度の知識があれば十分
- AWSのAIサービスも地味ながら出てくる
Grove - Buzzer をNervesで鳴らす

この記事は[Seeed UG Advent Calendar 2020](https://qiita.com/advent-calendar/2020/seeed_ug) 14日目です。
前日は、「[Grove Base HAT for RasPiは真っ直ぐグイっとさす](https://qiita.com/torifukukaiou/items/81f2a75bee0f919224ad)」でした。

---

# はじめに
- [Grove - Buzzer](https://www.seeedstudio.com/Grove-Buzzer.html)を[Nerves](https://www.nerves-project.org/)から鳴らしてみようとおもいます
- さっそくいろいろなものをつなげてやってみるの実践です
- `D16`に挿してみました

![IMG_20201213_233816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/57011d77-7e12-119b-c636-e4d41d23bdd9.jpeg)


# 準備とかいろいろ
- 前回の「[Grove Base HAT for RasPiは真っ直ぐグイっとさす -- Nerves](https://qiita.com/torifukukaiou/items/81f2a75bee0f919224ad#nerves)」をご参照ください

# Run
- 今回もとりあえずssh接続して`IEx`(Elixir's interactive shell)でやってみます

```
$ ssh nerves.local 
```

```elixir
Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info.
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:

  RingLogger.attach

or print the next messages in the log:

  RingLogger.next

iex(1)> {:ok, gpio} = Circuits.GPIO.open(16, :output)
{:ok, #Reference<0.1045830398.268566543.199724>}
iex(2)> Circuits.GPIO.write(gpio, 1)
:ok
```

- けっこう大きい音がします
- 「**<font color="purple">フ、ピェ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜</font>**」ってずーっと鳴ります :speaker: 
- 止めるには

```elixir
iex(3)> Circuits.GPIO.write(gpio, 0)
:ok
```

- 子供のときに夜中にフエをふくと :snake: がでるからやめなさい[^1]と注意されたことをおもいだしました

[^1]: いまこれを書いているの 23:31 :sleeping: で、記事にするからには本当に鳴るよねって確かめるために、静かな田舎の集合住宅でちょいちょい鳴らしています。ごめんなさい :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5: 

# Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree: 
- 手先が不器用な私でも工作できる！
    - 目覚ましアラームでボタン押すまで鳴らし続けるとかにつかえそう
        - 他にはCI失敗だとか、サービスの監視で異常検知時にとか
    - ただ、たいがいの時間で止めないと家に不在のときにそこそこ近所迷惑になりそう
    - そのくらい音がけっこうでかい :speaker: っちいうことですね
    - 小っちゃなボディだけど音がパワフル :punch::punch_tone1::punch_tone2::punch_tone3::punch_tone4::punch_tone5:
- [GrovePi+ Starter Kit for Raspberry Pi A+,B,B+&2,3,4 (CE certified)](https://www.seeedstudio.com/GrovePi-Starter-Kit-for-Raspberry-Pi-A-B-B-2-3-CE-certified.html)
    - いろいろ入っていて楽しめそう！！！
- Enjoy [Elixir](https://elixir-lang.org/) !!! :rocket::rocket::rocket: 
- (って、アドベントカレンダーこんなんでいいですよね！ :relaxed:)


次回は、@mongonta0716さんで「[初心者向けWioTerminalの始め方【VisualStudioCode+PlatformIO編】](https://raspberrypi.mongonta.com/howto-start-wioterminal-with-vscode/)」です。
引き続きお楽しみください。
ESXi Arm Edition v1.1 で物理 NIC の追加してみた

ESXi Arm Edition ではオンボードのデバイス以外を追加するには、ドライバー周りを含めていろいろと考えなければならないことも多いのですが、NIC が 1本しか取れないのは致命的。そして、増設するのも USB3.0 が2つでちょっと物足りないということで、いろいろと追加してみました。

# ESXi Arm Edition でデバイスを追加するには
Raspberry Pi 4 はいろいろと拡張したりして遊べるので、いくつかの方法を考えてみました。

## GPIO
まず思いつくのが GPIO 接続での追加。40ピンのピンにデバイスを指して・・・・・・と思うのですが、そこをコントロールすることが ESXi Arm Edition でできるかというと否。仕様もなにもわからないのに作れるわけがない。ということで、これは却下。

## USB A ポート
4ポートありますが USB2.0 × 2と USB 3.0 × 2、キーボードに USB2.0 一つ使うので、残りは3つ。Boot 用 USB メモリーに 2.0 の残りのポートを使うので、残りは USB3.0 × 2。ここは vSAN 用の USB メモリー挿しているので・・・・実質 USB Aポートは使えません。

## USB C ポート
電源引き込みに使っている USB C ポート、これに USB PD の HUB をつなげば行けるんじゃない？と思って、結局これを使ってみることにしました。

# 増設後の姿
USB C の LAN そのほかいろいろと付いている 7 in 1 とか 8 in 1 とかの HUB をいろいろと購入して、とりあえずつないで検証してみました。その中で、具合がよさそうかなというのを見つけたのでそれを使うことに。ほとんどの製品が USB HUB として機能するのですが、その中で使われているチップと ESXi Arm Edition が持っているドライバの関係からか、Realtek のコントローラーを使っている NIC は ESXi Arm Edition から認識されるということがわかり、Anker の[Anker PowerExpand+ 7-in-1 USB-C PD イーサネット ハブ](https://www.ankerjapan.com/item/A8352.html)や[Anker PowerExpand 8-in-1 USB-C PD メディア ハブ](https://www.ankerjapan.com/item/A8380.html)が使えることが分かったので、とりあえずつないでテストしてみました。

![IMG_1936.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/566d25a8-dcdd-2aa0-06b5-388b8fb3ec94.jpeg)

# 1G の NIC なのに 100M だ！
認識されることがわかり、喜び勇んで Host Client から vSwitch のアップリンクとして登録。そしてはたと気づく。100M になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/0f9c8593-aad6-8b42-6f0d-1ea8e98cab5c.png)

物理デバイスとして認識され、アップリンクとしても使えることが分かったのですが、どうやら Realtek のドライバは 100M のものだけのようです。手動設定しようとしても 100M しか出ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/052d9cf0-9839-f659-a516-e1f764d95fda.png)

ドライバは標準の cdce driver が適用されているので 100M のようです。とりあえず無いよりはましなので、今後どうやっていけば良いのかを考えながら、今はアップリンクに登録しただけにして放置を決めました。

# 他のデバイスの接続
実はこの USB C の HUB をつないだことで USB 3.0 のポートが増えることになり、そちらに前回 vSAN 用に増設した USB 3.0 メモリーを移動させて、本体直結の USB 3.0 A ポートには M.2 SSD を、SD と Micro SD ポートにもそれぞれメモリーカードを入れてみました。結果としては SD および Micro SD は認識できていませんが、2つ増設した M.2 SSD は問題なくキャパシティとして認識されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/df746909-dbb3-4d55-e4d3-ba02e2325604.png)

ここまでくれば、あとは vSAN に取り込むだけです。USB C HUB を使うだけでここまで広がるとは思っていませんでしたが、良い結果になったと思います。

# ディスプレイ
動き始めればディスク例は不要なのですが、でも、とりあえず「起動しているかな」と心配になることがあるので、我が家の家ラボ Raspberry Pi にはみんなディスプレイを載せています。ESXi Arm Edition 用の Raspberry Pi 4 にも同様にディスプレイを載せていますが、直付で接続アダプタもついていてドライバーも不要なこの製品が一番便利でした。Amazon のリンクを貼りたくはないのですが、OSOYO のサイトに製品の紹介が無いので我慢して amazon のページを紹介します。[OSOYOO HDMI 3.5インチLCDディスプレイ モニター タッチスクリーン Raspberry Pi 4 3 2 Model B に対応 (3.5" HDMI LCD)](https://www.amazon.co.jp/dp/B01N5HW3BP/ref=dp_prsubs_1)
[マニュアル](http://osoyoo.com/driver/3.5%E3%82%A4%E3%83%B3%E3%83%81_HDMI_%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E5%8F%96%E6%89%B1%E8%AA%AC%E6%98%8E%E6%9B%B8.pdf)
実際には文字が小さすぎて読み取ることはまず不可能です。でも、雰囲気で起動しているかいないかがわかるのと、ディスプレイについているスイッチでディスプレイの電源を切ることができるので、使わないときは表示を消しています。Raspberry Pi 4 は HDMI 2ポート出ているので、もう一つは KVM 経由で大きいディスプレイとキーボードにつなげばよいだけなので問題なしです。

いろいろと楽しみながら家ラボを充実させていくのって、楽しいですよね。
アドベントカレンダー11日目：SREを読んでみた「分散システムのモニタリング」編①

今回の内容は、モニタリングの話になります。
モニタリングと言われると、システムがどのような状態であるかを知るために行うというイメージがありますが、その考えは正しいのでしょうか？
まずは、モニタリングを行うその必要性について、見ていきます。

## モニタリングの必要性
モニタリングを行う理由として、以下のようなものがあります。

* 長期的なトレンドの分析
* 時間や、実験グループ間での比較
* ダッシュボードの構築
* アドホックな振り返り分析の進行（デバッキングなど）
* アラート

モニタリングを行うのは、ビジネスの需要を予測したり、システムの問題を抽出したり、システムの状態を把握ことなどが主な目的であるとわかります。
また、モニタリングした結果に問題がある場合は、それを人間に通知しなければなりません。特に今回は、このアラートについて考えます。
この通知（アラート）は問題が起きたときには、すべてを通知すべきなのでしょうか？もちろん、重大な問題であれば、それを通知することは必要です。しかし、「単に何か少しおかしい」程度では、通知すべきではないです。
仮にそのようなものを通知するようにした場合、その通知は、睡眠中や休日にも割り込むことになります。割り込みタスクが多すぎると、人は、それを表面的に見るだけになったりしてしまいます。慢性化すると、本当に重大な問題を見逃すかもしれません。
そのため、効率的なアラートとは、質の高いシグナルを送り、あまり重要でないもの（ノイズ）を抑えたものである必要があります。
では、モニタリングで通知を行う際に設定する値はどのようなものが妥当なものなのでしょうか？

## モニタリングにおける妥当な期待値の設定
モニタリングの結果により、ユーザーが問題の根本原因に素早くたどり着くことが重要です。なので、モニタリングシステム自体の複雑さによって、ユーザーを混乱させてしまうことは避けるべきです。
Googleでは、シンプルで高速なモニタリングシステムを指向しているそうです。
シンプルとは、例えば閾値を学習したりや因果関係を自動的に検出するようなシステムを避け、単純なルールに基づいて、問題の検出を行うということです。
それにより、特定の明白で重大な異常を高速に検出することになります。

##まとめ
今回は、短いですが、ここまでになります。
次回は、問題の切り分けを行う際の基本的な考え方やその実際の方法について、見ていきます。

#### 雑記
* 質の高いシグナルを出す必要がある。
* 通知を出すルールは明白であるべき。
* 書籍の中でちょくちょく人間を客観視した視点でかかれている箇所があるが、ミスしがちな点や癖を考慮して、仕組み作りをした方が自然なものが出来上がる気がします。

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　57-60
AWSのEC2にログインするための秘密鍵を無くしたときの対処法

# AWSのEC2にログインするための秘密鍵を無くしたときの対処法

## 本記事の概要
本記事では、AWSのEC2にログインするための秘密鍵を無くしたときの対処法を記述する。

## 結論
インスタンスを複製して新しく作成したキーと紐付ける。

## 手順
1. [秘密鍵を無くしたEC2インスタンスのAMIを取得](#anchor1)
2. [新しいキーペアを作成](#anchor2)
3. [1で取得したAMIからインスタンスを起動し、2で作成したキーと紐付ける](#anchor3)

<a id="anchor1"></a>
### 1. 秘密鍵を無くしたEC2インスタンスのAMIを取得
AWS マネジメントコンソール -> EC2 -> インスタンス -> Image and templates -> イメージを作成 -> `イメージ名`を入力 -> `イメージを作成`をクリック

<a id="anchor2"></a>
### 2. 新しいキーペアを作成
AWS マネジメントコンソール -> EC2 -> キーペア -> `キーペアを作成`をクリック -> キーペア名を入力 -> `キーペアを作成`をクリック

<a id="anchor3"></a>
### 3. 1で取得したAMIからインスタンスを起動し、2で作成したキーと紐付ける
AWS マネジメントコンソール -> EC2 -> AMIを選択 -> `起動`をクリック -> `確認と作成`をクリック -> `起動`をクリック -> `キーペアの選択`より、2で作成したキー名を選択 -> 下のチェック欄にチェックを入れる -> `インスタンスの作成`をクリック

## メモ
### AMI(Amazon Machine Image)とは
- インスタンスの起動に必要な情報（OSなど）を含んだもの。
- インスタンスを立ち上げる際は、AMIを指定する必要がある。（AWSが用意しているAMIはたくさんある）

## 参考
- [Qiita - AWS EC2ログイン用の秘密鍵を無くした](https://qiita.com/nntsugu/items/1bcb9810c8a2cc6985b3)
- [Amazon EC2編 AMIの利用① ～インスタンスからの作成編～](https://recipe.kc-cloud.jp/archives/10045)
NotionでKPTボードを作る

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 13日目のエントリです。
12日目は[Notionでデータベースのプロパティを非表示にする](https://qiita.com/pictiny/items/5f01671f968030e36d57)でした。

# KPT
振り返りとして、Keep（よかったこと、続けること）、Problem（課題に感じたこと）、Try（試してみること）をそれぞれ挙げるKPTという手法ががあります。
KPTは付箋を使って書き出すことが多いかと思いますが、付箋の代わりにNotionを使うことができます。

## KPTボード
Notionの[データベース](https://qiita.com/pictiny/items/dba21dd5d226ac5b6849)を使って、以下のようなKPTボードを作ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/5bee1d2f-71da-6f3e-6fa6-1a2fbbe63fb8.png)

[プロパティタイプ](https://qiita.com/pictiny/items/bd890aa23fad729ed800#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%BF%E3%82%A4%E3%83%97) `Select` でStatusプロパティを作り `Keep` `Problem` `Try` に分類します。
Board View で `Group by Status` としておくことで、見やすく書き出しやすいKPTボードが作れます。

Statusの他に、書き出した人がわかるように `Created by` のプロパティを付けておくとよいです。
ボードでCreated byプロパティを表示することで、起票した人のアイコンを表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/4bff4305-7aac-6a6d-1663-108805ef47f0.png)

## +1プロパティ
KPTでは類似する内容が重複して書き出されることがよくあります。
KPTボードを上から順番に読み上げていくときにカードが多いと時間がかかりますし、重複した内容を読み上げる前に整理するのは手間がかかります。

そこでKPTボードには[プロパティタイプ](https://qiita.com/pictiny/items/bd890aa23fad729ed800#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%BF%E3%82%A4%E3%83%97) `Person` で+1プロパティを用意するようになりました。
思い付いたKPTをすでに誰かが書いていた場合、+1プロパティに自分を追加するだけで済みます。

# まとめ
Notionで作ったKPTボードはとても便利なので、一度試してみてください。
[git]本家リポジトリを取り込んで最新のリポジトリをrebaseする方法

##はじめに
最新の本家リポジトリを自分自身の環境に取り込んで、rebaseする方法を備忘録としてまとめる

前提として、本家リポジトリをforkして自分の開発環境に用意してください。



##方法
ターミナルで下記のコマンドを実行する

```
git branch -a
```


⇩のような感じの表示がされるはず

```
master
remotes/origin/master
```
 

次にupstreamを登録する

```
git remote add upstream git://github.com/リポジトリURL
```
 
git branch -a を再度実行し、upstreamが表示されていることを確認する

⇩的な感じで表示されるはず

```
master
remotes/origin/master
remotes/upstream/master
```

表示されない場合は下記を実行

```
git fetch upstream
```
 

これで登録完了

 

本家リポジトリの変更を取り込む場合

```
git fetch upstream
```

コンフリクトが起きている場合はターミナルに表示されている手順に沿って修正する

```
git rebase upstream/master
```

 

##参考

https://qiita.com/xtetsuji/items/555a1ef19ed21ee42873
Eagleテクニックまとめ

仕事でEagleを使うことがあるので、覚えたことをまとめておく。
Eagleの使い方が書かれている本って全くないのが現状である。
僕は同僚に教えてもらう＆ネットで漁りつつ少しずつ覚えているが非常に苦労している。
ネット記事をかいて少しでも貢献していきたい。

## まとめ
### 電源、GNDをベタパターンにする
ベタパターンとは、信号の通っていない空き部分をベタ塗りして、GNDや電源にすること。
大量のGNDをすべて信号線で繋ぐのは骨が折れるので、brdデータを作成する際は最初にやっている。

①[sch]GNDと接続するような回路を作成する
②[brd]Polygonで基板の周りに線を引いた後、ポップアップが出るので「GND」と命名する
③[brd]勝手にベタにされる

参考サイト
https://tool-lab.com/autodesk-eagle-board-plane-creation-tips/
	
### gridのサイズ変更
デフォルトだとなぜかinchで取られていたりするので、グリッドのサイズを変更する
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/c8ffc988-92b6-fded-3c66-b32d5d839c91.png)
Display：グリッドの表示/非表示
Style：グリッドの点/線
Size：デバイスをドラッグしたときの移動単位
Multiple：倍率
Alt：altを押してドラッグしたときの最小移動単位

### ラインの太さの変更
信号線を引く際、デフォルトだと細すぎるので調整する。
Lineを選択すると上にバーが出てくるので、Width：0.5mmとかにしておけば無難。

また、途中で線の太さを変更したくなった際、すべての線をクリックしてpropertiesを押すのは面倒くさすぎる。
そういうときは、以下のマークをクリックして、Width>0.05 のように選択する。
![test.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/0a65afae-417f-e3b3-6d51-9e3868dac9a0.png)
あとは、線をひたすら押していけば、押したそばから設定が適用される。
Heroku上のNode.js Expressでファイルアップロードを実装したときのError: ENOENT: no such file or directory

Heroku上にデプロイした、Node.js Expressのmulterを使用したファイルアップロードで、エラーが出てアップロードできなかった話を共有します。

# Logs

```
[Error: ENOENT: no such file or directory, open '/app/uploads/{filename}.jpg'] {
   errno: -2,
   code: 'ENOENT',
   syscall: 'open',
   path: '/app/uploads/{filename}.jpg',
   storageErrors: []
 }
```
# Source
### uploader.js

```
'use strict'
const express = require('express');
const router = express.Router();
const multer = require('multer');

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, filename)
  }
})

const upload = multer({ storage: storage })

router.post('/', upload.single('file'), function (req, res, next) {
…  
(略)
…
});
module.exports = router;
```

# 対処法
Herokuでは /tmp/ 以下にしかファイルを保存できないらしい。
clusterサーバーサイドにおける技術選定について

そういえば [AWS Summit Online 2020](https://aws.amazon.com/jp/summits/2020/) というのもあったなぁとというのを思いだしたので．

clusterのサービス内容，システム構成などは [このへん](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-industry-3-12034) から見ていただくとして，どういう思想で構成を考えているかなどをまとめてみたいと思います．

## マネージドサービスについて
### なるべくマネージドサービスを活用すること
新サービスを立ちあげることになったり，新機能を開発することになったり，機能を追加しようとなったり，理由は様々ですが，新しい「何か」が必要になる場合があります．

何が必要なのか？にもよりますが，まずはマネージドサービスを利用できないかを考えます．
逆に，マネージドサービスがあるからこういう機能を作りましょう／設計にしましょう，という話をすることもあるかもしれません．
何にしても，第一に選択すべきはマネージドサービスだと思います．

### マネージドサービスを組み合せすぎないこと
先に書いたこととやや矛盾するのですが，組み合せ**すぎない**ほうが良いです．
何をもって組み合せ**すぎている**のかは諸説ある，というかサービスや開発者の技量などにもよるので一概には言えないです．

- DynamoDB Streams→Lambda
- Kinesis Streams→Kinesis Firehose
- S3→(SNS/SQS)→Lambda

など，効果的というか，もはやパターンとなっている組み合わせも存在します．
ただし，これらのパターンに安易にのっかると，すぐに長大なマネージドサービスの連鎖ができあがってしまいます．

ほとんどの場合うまく動きます．しかし，マネージドサービスは自分たちで面倒を見なくていいだけであって，障害が起きないサービス**ではない**，というのを忘れがちです．(実際2020年，SQSやLambdaの障害が発生していました．

組み合せるものが増えれば増えるほど，そのなかの一部で障害が発生する可能性は上がっていきます．
マネージドサービスをたくさん並べて，矢印いっぱいの構成図を書くのは正直楽しいですし，イケてるものを作ってる気分にはなりますが，ほんとにそうする必要があるのかは自問したほうが良いです．

### データを保存するサービスは慎重に
データやファイルを長期間置いておきたい場合は，どのように保存されるのか／取りだせるのか まで慎重に考える必要があります．

とくにデータストアを移動する場合は，すでにたまっているデータをどうするのかを考えないといけません．(破棄できるなら楽ですが，それができない場合も多い


## 構成管理について
Terraformなどの構成管理ツールを使うことはもはや常識となってきています．新規プロジェクトならほぼ間違いなく使うのではないでしょうか？

弊社でもTerraformを使っているので，Terraformを例にとって書きます．

### 基本的にはすべて実施すべき
使い捨てだから手で作ってしまったほうが早い，とくに慣れてくるとそう考えてしまうことが多々あります．
しかしその誘惑に負けずに書くべきです．(自分が全部書けているとは言ってない😔めんどくさい

たしかに手でポチポチやればできるものをコード化してplan→applyはけっこう面倒です．でも，使い捨てるつもりということは，いつかは消すはず．そのときにtfstateがあると安全性 (まちがって別のリソースを消してしまうことがない／何かが残ってしまって余計な料金が発生する可能性も減る) が増します．
むしろ使い捨てるつもりだからこそ書いたほうが良い，とも言えます．

### Terraformで対応してないサービスを使いたい場合どうすべきか
これはけっこう難しいです．

#### そもそもTerraformが対応していない
ニッチなサービスだとそういうこともあります

どうしても必要であれば，pluginを書くか，何か別の管理方法を考えて使うしかありません (が，あとでTerraform対応できるよう独立性を持たせる

一部だけCloudFormationを使うとかはありなんでしょうか？

- CloudFormationでも全部対応されてるとは限らなかったりする．
- 面倒を見なければいけないツールは増えてしまう
- 境界線が曖昧になってしまう (後日Terraformの対応が追加されたら書き直すのか

あたりを考えるとなかなか難しい気はしている．

#### 新機能／新設定がTerraformでは書けない 
時間が解決することもあります．バージョンアップしたらサポートされてる，など．

どうしてもすぐ使う必要があるなら，pluginを書くか？
手で設定変更して，後日Terraformが対応したときに謎の差分として発生してしまう場合もあるので，そのあたりをどう解消できるかにもよりそうです．

- 設定変更だけで解消できる
- 削除→再作成になってしまう

あたり．(ただし，設定変更だけだとしてもダウンタイムが発生しうるかは検討しなければなりません

## まとめ
書き散らかした感じになってしまった．

あらためて書こうとしてみたけど，わりとふわふわした理由で選定してたりするので，もうちょっと明確に選べるようになりたいなぁと思った2020年でした．
AtCoder 生活103日目

[前回](https://qiita.com/flandrescarlet237/items/95b796e1c462225ef76d)

#103日目
今日はC問題一問とABC185に参加してきました。

![スクリーンショット 2020-12-13 22.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/256331ea-cdb2-7dd8-d05a-3e5e60f329ca.png)


##[ABC185](https://atcoder.jp/contests/abc185)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int a,b,c,d;
    cin >> a >> b >> c >> d;
    cout << min({a,b,c,d}) << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,m,t;
    cin >> n >> m >> t;
    int s = n;
    vector<pii> d(m+1);
    d[0].second = 0;
    rep(i,m){
        int a,b;
        cin >> a >> b;
        d[i+1].first = a;
        d[i+1].second = b;
    }
    rep(i,m){
        n -= (d[i+1].first - d[i].second);
        if(n <= 0){
            cout << "No" << endl;
            return 0;
        }
        n = min(s,(n + d[i+1].second - d[i+1].first));
    }
    n -= t - d[m].second;
    if(n <= 0)cout << "No" << endl;
    else cout << "Yes" << endl;
}

```

##[ABC135_C](https://atcoder.jp/contests/abc135/tasks/abc135_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    vector<ll> a(n+1);
    vector<ll> b(n);
    rep(i,(n+1)) cin >> a[i];
    rep(i,n) cin >> b[i];
    ll ans = 0LL;
    rep(i,n){
        ans += min(a[i],b[i]);
        b[i] = max((b[i] - a[i]),0LL);
        ans += min(a[i+1],b[i]);
        a[i+1] = max((a[i+1] - b[i]),0LL);
    }
    cout << ans << endl;
}

```

解くのにかかった時間：9分17秒

###最後に
C問題はなんか高校行ってたときに見たことある気がする…
春分・秋分の日を大雑把に求める

# 計算方法

求める年の範囲を絞って、次の大雑把な式

　　春分 ＝ 経過年数 × 太陽年 ＋ 過去の春分
　　秋分 ＝ 経過年数 × 太陽年 ＋ 過去の秋分

を用います。

**注意：目安の算出なので、国立天文台が発表する正式な日付を確認してください。**

# 太陽年

手元にある、天文年艦 2020 (天文基礎データ) によると

　　$365日5^h48^m45^s.142$

とあります。これは

　　$365 + \frac{20925.142}{86400.000} = 365.242189143\dot{5}1\dot{8}$

ですが、浮動小数点演算は使いたくないので、日単位の小数部を 16bit として

　　$20925.142 \div 86400 \times 2^{16} \fallingdotseq 15872$
　　$15872 \div 2^{16} = 0.2421875$

この値で妥協します。

# 春分と秋分

手元にある、理科年表 2017 (暦部、二十四節気)によると

　　春分 3月20日19時29分
　　秋分 9月23日05時20分

とあります。これを基点にして、2030年まで計算してみます。

# サンプル プログラム

通日の処理では「[メモ：年月日と通日を自前で変換](https://qiita.com/ikiuo/items/e6c787125899c7c98e87)」を使っています。

```C:C
/*
 * 太陽年の小数部: 15872 = 0.2421875 * (1<<16)
 */

static unsigned int base_vernal_days = 0; /* 基点となる「春分の日」の通日 */
static unsigned int base_vernal_frac = 0; /* 基点となる「春分の日」の小数部 */
unsigned int vernal_equinox(unsigned int nY)
{
    return ((nY * 365 + base_vernal_days) +
            ((nY * 15872 + base_vernal_frac) >> 16));
}

static unsigned int base_autumn_days = 0; /* 基点となる「秋分の日」の通日 */
static unsigned int base_autumn_frac = 0; /* 基点となる「秋分の日」の小数部 */
unsigned int autumn_equinox(unsigned int nY)
{
    return ((nY * 365 + base_autumn_days) +
            ((nY * 15872 + base_autumn_frac) >> 16));
}

int main()
{
    unsigned int vY, vM, vD, vT;
    unsigned int aY, aM, aD, aT;
    unsigned int n;

    /* 春分の基点を求める */
    base_vernal_days = ymd2t(2017, 3, 20);
    base_vernal_frac = (19*60+29)*65536/(24*60);

    /* 秋分の基点を求める */
    base_autumn_days = ymd2t(2017, 9, 23);
    base_autumn_frac = ( 5*60+20)*65536/(24*60);

    /* n = 経過年 */
    for (n = 0; n <= 13; n++)
    {
        vT = vernal_equinox(n);
        t2ymd(&vY, &vM, &vD, vT);

        aT = autumn_equinox(n);
        t2ymd(&aY, &aM, &aD, aT);

        printf("%04d/%02d/%02d, %04d/%02d/%02d\n", vY, vM, vD, aY, aM, aD);
    }

    return 0;
}
```

実行結果

```console:
2017/03/20, 2017/09/23
2018/03/21, 2018/09/23
2019/03/21, 2019/09/23
2020/03/20, 2020/09/22
2021/03/20, 2021/09/23
2022/03/21, 2022/09/23
2023/03/21, 2023/09/23
2024/03/20, 2024/09/22
2025/03/20, 2025/09/23
2026/03/20, 2026/09/23
2027/03/21, 2027/09/23
2028/03/20, 2028/09/22
2029/03/20, 2029/09/23
2030/03/20, 2030/09/23
```

「国立天文台：[質問3-1）何年後かの春分の日・秋分の日はわかるの？](https://www.nao.ac.jp/faq/a0301.html)」と同じ結果を得られました。しかし、国立天文台の計算は、こちらのサンプル プログラムのような雑な計算ではないでしょう。
GitHubでプロジェクトを検索する方法

<font size="10">プロジェクトを開発する時、よくGithubで自弁が作りたいものを検索します。どうして自弁が検索したものを見つかるのは検索する文法をご説明します。</font>


1.ある値より大きいまたは小さい値のクエリ
---

*>、>=、<、<= などを使って、他の値に対する値の大なり、大なりイコール、小なり、または、小なりイコールでの検索を行えます*

* >n	android stars:>1000　1000 を超える Star のある、「android」という単語があるリポジトリにマッチします。（検索する時よく使う）
* >=n	android topics:>=5 　トピックが5つ以上ある、「android」という単語のあるリポジトリにマッチします。
* <*n*	android size:<10000 　10KBより小さいファイルで、「android」という単語があるコードにマッチします。
* <=*n*	android stars:<=50 　50以下の Star があり、「cats」という単語のあるリポジトリにマッチします。

 *一定範囲にある値のクエリ*

 + *n*..*n* android stars:10..50 は、Star が 10 から 50 までの間の数の、「android」という単語のあるリポジトリにマッチします。(普段は使わない)  

2. 一定の検索結果の除外
---
*NOT 構文を使うことで、一定の単語を含む検索結果を除外できます。 NOT 演算子は、文字列型キーワードに限って使うことができます。 数や日付では機能しません。*

+ NOT &nbsp; &nbsp; Android NOT javaは、「java」という単語がなく、「Android」という単語のあるリポジトリにマッチします。  

*検索結果を絞り込む他の方法としては、一定のサブセットを除外することです。 - のプリフィックスを修飾子に付けることで、その修飾子にマッチする全ての結果を除外できます。*

+ -QUALIFIER  &nbsp; &nbsp; Android stars:>10 -language:java は、Javaで書かれていない、Star が 10 を上回る、「Android」という単語のあるリポジトリにマッチします。      

*空白のあるクエリに引用符を使う*

* 検索クエリに空白がある場合は引用符で囲む必要があります。 例:  
 Android NOT "hello world" は、「hello world」という単語がなく、「Android」という単語のあるリポジトリにマッチします。  

3. 高級検索  
---   
*リポジトリの名、説明文、ファイルの内容に検索 
in修飾子を通じてリポジトリ名、リポジトリの説明、readmeファイルの内容、またはこれらの任意の組合せに検索できる。*

* in:name &nbsp; &nbsp;	Android in:name 「Android」というnameのあるリポジトリにマッチします。    
* in:description &nbsp; &nbsp; Android in:description 「Android」というdescriptionのあるリポジトリにマッチします。
* in:readme&nbsp; &nbsp; Android in:readme　「Android」というreadmeのあるリポジトリにマッチします。
* repo:owner/name&nbsp; &nbsp; 	repo:zhanghangcode/MigrationHelper 　　zhanghangcodeというownerとMigrationHelperというnameのあるリポジトリにマッチします。
* in:name,description,readme &nbsp;&nbsp;  Android in:name,description,readme　「Android」というname,description,readmeのあるリポジトリにマッチします。  

４. 総合検索  
--- 
例えば、
星が4000以上
言語はKotlin　　
Androidを含めているreadmeファイルとプロジェクトのdescription
検索文法：
in:description,readme Android language:kotlin Android stars:>4000

いろいろな条件がついてるサイト
https://github.com/search/advanced?q=in%3Adescription+python+language%3Apython++python+stars%3A%3E4000%2C
Linuxでお試しNeosVR

この記事は「[NeosVR Advent Calendar 2020](https://qiita.com/advent-calendar/2020/neosvr_reso)」の14日目です

昨日は、[@spoil](https://qiita.com/spoil) さんの「[【NeosVR】VR空間で行う共同作業について](https://qiita.com/spoil/items/829145c4c676eaba820d)」でした

2022/08/04
NeosVRのシステム要件を事前に確認できる凄いやつだよ
https://sysrqmts.com/ja/games/neos-vr

## 本記事の概要
NeosVR用のPC買う前に
軽くデスクトップモード試したいけどLinuxマシンしか無かったので
Linuxで頑張った記録
NeosVRの画像はありません。NeosVRの画像はありません。
(大事なことなので2回書きました)
PCでVR使うと無茶苦茶熱が出るので
買うならノートじゃなくてデスクトップ型がオススメ・・・。

```
　　　　　　　　　　┌─────────── 
　　　　　　　　　　│モーニングやってます♪ 
　　　　　　　　　　└──────────── 
　　　∧＿∧　やあ 
　　 （´・ω・｀)　　　　　　 /　　　ようこそ、バーボンハウスへ。 
　　／∇y:::::::＼　　　[￣￣]　このテキーラはサービスだから、まず飲んで落ち着いて欲しい。 
　　|:::⊃:|:::::::::::::|　　　|──| 
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|　うん、「また」なんだ。済まない。 
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|￣￣　仏の顔もって言うしね、謝って許してもらおうとも思っていない。 
￣￣￣￣￣￣￣￣￣￣￣￣￣￣／| 
　　　　∇　∇　∇　∇　　　　　　／.／|　でも、このスレタイを見たとき、君は、きっと言葉では言い表せない 
　　　　┴　┴　┴　┴　　　　 ／ ／　.|　「ときめき」みたいなものを感じてくれたと思う。 
￣￣￣￣￣￣￣￣￣￣￣￣|／　　 |　　　殺伐とした世の中で、そういう気持ちを忘れないで欲しい 
￣￣￣￣￣￣￣￣￣￣￣￣　　　　 |　　　そう思って、このスレを立てたんだ。 
　　　(⊆⊇)　(⊆⊇)　(⊆⊇)　　　　　 | 
　　　　 ||　　　　||　　　　.||　　　　　　　|　　　じゃあ、注文を聞こうか。 
```

## マシンスペック
CPU インテル® Core™ i7-4712MQ プロセッサー（HTテクノロジー対応）2.30GHz
GPU メインメモリと共用、最大1792MB
RAM 8GB
Windows8が出た頃の標準的なスペック？

## Steamを使うのだからSteamOSでは？

```
　 ,j;;;;;j,. ---一､ ｀ 　―--‐､_ l;;;;;;
　｛;;;;;;ゝ T辷iﾌ i 　 　f'辷jァ　 !i;;;;;
　 ヾ;;;ﾊ　　　　ﾉ　　　　　　　.::!lﾘ;;rﾞ
　　 `Z;i　　　〈.,_..,.　　　　　　ﾉ;;;;;;;;>
　 　,;ぇﾊ、　､_,.ｰ-､_',. 　 　,ｆﾞ: Y;;f 　　 そんなふうに考えていた時期が
　　 ~''戈ヽ 　 ｀二´ 　　 r'´:::.　`!　　　俺にもありました
```

上記マシンスペック+SteamOSだとNeosVRが起動しませんorz

## 困った時のUbuntu

公式ページから最新版DLしてインストールしたら何とかなった。

### Steamの設定

そのままでは起動しないのでNeosVRをSteamからダウンロードしたら
ライブラリからNeosVRのプロパティを開いて
Proton(Steamが調整したwine？)で起動するように設定

### 動作

10FPS前後、動くことは動くレベル。
他人のワールドに入る時は30分くらいでPCフリーズするかもって覚悟を決める(｀・ω・´)ｼｬｷｰﾝ

## あとがき

本格的にNeosVR始めるならこのくらいのマシンが良いです。
Windows10 Pro(Homeだとwindowsupdateからの再起動を回避できない)
デスクトップ型
CPUとにかく良いやつ
RAM32GB以上
LANカードとネット回線とにかく良いやつ

改めてAdvent Calendarの記事見てると他の皆さん
ｽｺﾞｲﾜｧ*･゜ﾟ･*:.｡..｡.:*･゜(n‘∀‘)ηﾟ･*:.｡. .｡.:*･゜ﾟ･*!!!!
電子書籍の存在感を出すためのツール

１．考え始めた経緯
============
先日アナログとデジタル書籍についてNoteに記載しました。
https://note.com/takaband/n/n45dbb4161d53
>2-1スマホやタブレットの壁紙/スクリーンセーバーを本の背表紙もしくはその本の名言抜粋で埋め尽くし、ランダムに変える。

要はアナログは本に物理的存在感があるので、あると読みたくなる。
デジタルでも本の存在感をだすために下記をやりたくなって、検討してみました。
２．やりたい事
============
上記だけだとイメージつかないと思うので、イメージはこんな感じです。
ディスプレイの壁紙を下記のような感じにする。
(もちろんもっとおしゃれに。。。)
のちのちは使用してないディスプレイにも表示させる。
![amazon壁紙.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448643/b40aa242-28d9-9641-f88e-e1cfae8f91c6.png)
３．アルゴリズム構成案
============
####３-１.Kindle蔵書一覧を取得
https://qiita.com/taka_hira/items/8a9181c0733de2c9f8ee
あたりを参考に。
####３-２.Amazonの各本の画像やコメント欄一個目を表示
本当はkindle開いてる時の、「○○人がハイライト」をつかいたい。
####３-３.画像にし、表示させる。
４．落とし穴
============
amazonはスクレイピング禁止との事でした。
https://qiita.com/n_oshiumi/items/b4efd1f40ec0a1b77376
せっかく考えはじめたのにー。
５．振り出しに戻る
============
Amazon-sanからぜひこんなデジタル本棚リリースしてくれる事を期待してます！
もし既にそのようなサービスあればどなたか教えてください。
これが出来たらデジタルとディスプレイ空間の使い方とか変わるのに。
Android Studio / XcodeのLogを便利にする

#はじめに
Android Studio / Xcodeでのログ出力がちょっとした工夫で便利になるので紹介いたします。

具体的には

* ログにクラス名、関数名、タグ等を自動で挿入して出力する
* コード記述を簡単にする（補完してくれる）

ことを目指します。

#環境

* macOS 10.15.6
* Android Studio 3.6.3
* Xcode 12.2

#Android Studio

環境設定からLive Templatesを開き、右側の＋ボタンから`AndroidLog`の中に新たにテンプレートを定義します。

`Abbreviation`にはテンプレートを呼び出す文字列、`Description`にはテンプレートの説明、`Template Text`には実際に出力される文字列が入ります。
その下の`Define`からどのタイミングでこのLive Templateを有効にするかを設定します。とりあえず`Java -> Statement`だけチェックしておけば大丈夫でしょう。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922324/4157db92-448d-e759-69dc-3948289f0766.png)

さて、`Template Text`に入力する内容ですが、$で囲むことで変数を定義できます。定義した変数は`Edit variables`から編集可能なので、以下のようにクラス名等が自動で挿入されるようにします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922324/341a9302-4c5f-c03a-b321-b058a950c291.png)

以上で`ld`とだけ入力すればクラス名や関数名等が挿入された状態で`Log.d()`を記述できるようになりました！



#Xcode

まずログ出力用のクラスを定義して、クラス名等が自動で挿入されるようにします。
変数`file`は`/Users/[username]/Desktop/hoge/huga/ViewController.swift`のような形になるのでファイル名だけを切り取っています。

```swift:MyUtility.swift
class MyUtility {
    class func logD(tag: String, file: String, function: String, log: String) {
        NSLog("D/\(tag): \(URL(string: file)!.deletingPathExtension().lastPathComponent)#\(function): \(log)")
    }
}
```

次に入力を自動で行うためにCode Snippetを使います。
ウィンドウ右上の＋ボタンからSnippets一覧を開き、以下のように設定します。

`#file`や`#function`にはファイル名や関数名が自動で入るので、これを先程のログ出力用の関数に代入しています。
`TAG`や`Log`などの可変部分は`<#TAG#>`としてプレースホルダ化すると良いですね。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922324/855cd0d1-2b1c-0148-e7d3-4db8b40f4871.png)

これでAndroid Studioと同様に`ld`とだけ入力すればクラス名や関数名等が挿入されたログの出力を記述できるようになりました！


#参考リンク
* [AndroidStudioでコードスニペット(LiveTemplates)を利用する](https://qiita.com/glp/items/18aa4e8b9af8a55169f7)
* [IntelliJ IDEA - ライブテンプレート変数](https://pleiades.io/help/idea/template-variables.html)
* [【Swift】URLでパスを扱うときに便利なプロパティとメソッド](https://qiita.com/toshi586014/items/52b87c034e411681ca7b)
* [コードテンプレートを瞬時に展開可能なCode SnippetとLive Templateの設定・使用・共有方法](https://qiita.com/imaizume/items/741da37c811aadd60fb2)
* [Swiftでクラス名や関数名等をログ出力する](https://qiita.com/shtnkgm/items/de9cf3d85ccd0cef0a81)
AtCoder ABC185　解答・解説

初めてAtCoderのBeginner Contestに参加しました．
がんばった跡を残してモチベーションにするためにQiitaに投稿します．
過去問では２～３問くらい解ければ十分かなという実力ですが，運よく6問中4問正解でした．

# A
Aは瞬殺していきたい．1分ほどでした．

```abc185_a.py
A = list(map(int, input().split()))
print(min(A))
```

# B
けっこう泥沼にはまり，Bなのに解けない！となりました．
何か難しいロジックがあったわけではなく，ひとつひとつの積み重ねのどこかで小さくミスしていた感じです．Cの方が簡単でしたので，Cから解けばよかったなと思いました．

```abc185_b.py
N, M, T = map(int, input().split())

AB = [map(int, input().split()) for _ in range(M)]
A, B = [list(i) for i in zip(*AB)]
mx = N


for i in range(M):
    if i == 0:
        N -= (A[i])
    else:
        N -= (A[i]-B[i-1])
    if N <= 0:
        print("No")
        exit()
    N += (B[i]-A[i])
    if N > mx:
        N = mx
N -= (T-B[M-1])
if N<= 0:
    print("No")
    exit()
else:
    print("Yes")
```

# C
ただの組み合わせの問題．プログラミングコンテストの神髄は数学にあるんだなぁと過去問を解きながらしみじみ感じていましたが，まさに．これは1分でした．

```abc185_c.py
import math
L = int(input())
 
def combinations_count(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
 
print(combinations_count(L-1, 11))
```

# D
Bと似たような印象の問題．ロジックの地道な積み重ね，という感じがしました．とくに詰まるところはないので，改善点としてはスピードなのかなと思います．標準入力の受け取り方だったり，組み合わせのやり方，divmodの使い方などを忘れるので，ちゃんと復習してすぐに使えるようにしておきたいですね．

```abc185_d.py
N, M = map(int, input().split())
if M == 0:
    print(1)
    exit()

A = list(map(int, input().split()))
A = sorted(A)
# print(A)

min = N
L = []

for i in range(M+1):
    if i ==0:
        dif = A[i]-1
        if dif > 0:
            L.append(dif)
            if min > dif:
                min = dif
                
    elif i == M:
        dif = N-A[i-1]
        if dif > 0:
            L.append(dif)
            if min > dif:
                min = dif
                
    else:
        dif = A[i]-A[i-1]-1
        if dif > 0:
            L.append(dif)
            if min > dif:
                min = dif
                

k = min
# print(L)
c = 0

for l in L:
    q, mod = divmod(l, k)
    if mod == 0:
        c += q
    else:
        c += (q+1)

print(c)
```
all-rubyがghcr.io/ruby/all-rubyでも使えるようになった

全バージョンの ruby の動作を比較するのに便利な [all-ruby](https://github.com/akr/all-ruby) というものがあります。
そのイメージが docker hub だけではなく ghcr.io からも pull できるようになったという話です。

## docker hub からのイメージでの実行例

従来はその docker image として docker hub の `rubylang/all-ruby` を使って、以下のように使っていました。(実行例の内容は `require` が不要になったライブラリです。)

```shell-session
$ docker run -it --rm rubylang/all-ruby env ALL_RUBY_SINCE=ruby-2.0 ./all-ruby -e 'p $".reject{|s|s.include?("/")}'
ruby-2.0.0-p0       ["enumerator.so"]
...
ruby-2.0.0-p648     ["enumerator.so"]
ruby-2.1.0-preview1 ["enumerator.so", "thread.rb"]
...
ruby-2.1.10         ["enumerator.so", "thread.rb"]
ruby-2.2.0-preview1 ["enumerator.so", "rational.so", "complex.so", "thread.rb"]
...
ruby-2.2.10         ["enumerator.so", "rational.so", "complex.so", "thread.rb"]
ruby-2.3.0-preview1 ["enumerator.so", "thread.rb", "rational.so", "complex.so"]
...
ruby-2.7.0-preview2 ["enumerator.so", "thread.rb", "rational.so", "complex.so"]
ruby-2.7.0-preview3 ["enumerator.so", "thread.rb", "rational.so", "complex.so", "ruby2_keywords.rb"]
...
ruby-3.0.0-preview1 ["enumerator.so", "thread.rb", "rational.so", "complex.so", "ruby2_keywords.rb"]
```

## ghcr.io からのイメージでの実行例

今年から docker hub の制限が厳しくなった影響を受けて、 GitHub Container Registry(ghcr.io) にも `docker push` されるようになり、 [ghcr.io/ruby/all-ruby](https://ghcr.io/ruby/all-ruby) でも使えるようになりました。

上の実行例は 3.0.0-preview1 のリリース前に `docker pull` したものだったので、 preview1 までになっていますが、以下の実行例は 3.0.0-preview2 以降で初めて実行した時の出力です。

```shell-session
$ docker run -it --rm ghcr.io/ruby/all-ruby env ALL_RUBY_SINCE=ruby-2.0 ./all-ruby -e 'p $".reject{|s|s.include?("/")}'
Unable to find image 'ghcr.io/ruby/all-ruby:latest' locally
latest: Pulling from ruby/all-ruby
852e50cd189d: Pull complete
3d2287ec382d: Pull complete
8532674f7cc9: Pull complete
c2b6a97405ca: Pull complete
Digest: sha256:8c48ad2185525c7a8b5c19fe31f286971b64b7dd41a06be7bee0bd6ba8646943
Status: Downloaded newer image for ghcr.io/ruby/all-ruby:latest
ruby-2.0.0-p0       ["enumerator.so"]
...
ruby-2.0.0-p648     ["enumerator.so"]
ruby-2.1.0-preview1 ["enumerator.so", "thread.rb"]
...
ruby-2.1.10         ["enumerator.so", "thread.rb"]
ruby-2.2.0-preview1 ["enumerator.so", "rational.so", "complex.so", "thread.rb"]
...
ruby-2.2.10         ["enumerator.so", "rational.so", "complex.so", "thread.rb"]
ruby-2.3.0-preview1 ["enumerator.so", "thread.rb", "rational.so", "complex.so"]
...
ruby-2.7.0-preview2 ["enumerator.so", "thread.rb", "rational.so", "complex.so"]
ruby-2.7.0-preview3 ["enumerator.so", "thread.rb", "rational.so", "complex.so", "ruby2_keywords.rb"]
...
ruby-3.0.0-preview2 ["enumerator.so", "thread.rb", "rational.so", "complex.so", "ruby2_keywords.rb"]
```

## まとめ

docker hub は `docker pull` の制限も厳しくなってしまったので、これからは `ghcr.io` からも `docker pull` できるということを知っておくと便利です。

## 余談

余談ですが、<https://hub.docker.com/r/rubylang/ruby> も `ghcr.io/ruby/ruby` で使えるようになる予定のようです。こちらを実際に使うのは公式なアナウンスをお待ちください。

## ブログ紹介

[個人ブログ](https://blog.n-z.jp/blog/2020-12-16-ghcr-io-ruby-all-ruby.html)の方にも同じ記事を転載しています。
RedmineサーバーをAWS EC2で立てる

Railsチュートリアルの息抜きにRedmineの環境構築で遊ぼうと思います。
####ローカルPCの環境
MacBookPro
OS:Catalina
シェル：bash
####EC2の環境
Red Hat Enterprise Linux release 8.3 (Ootpa)
その他無料枠で使えるものを指定

インスタンスができたら、
「パブリックDNS」をコピーしておく

### 1. ssh接続

まず、PCから、EC2のインスタンスへssh接続します。

インスタンス作る時に指定したプライベートキー(〜.pem)を指定して、

```
ssh -i Downloads/example_keypair.pem ec2-user@<パブリックDNS>
```

接続できたら

環境構築していきましょう

### 2. 関連パッケージのインストール

rootになりたい人はこちら

```
$ sudo su -
```

下記はrootで進めます。

```
# dnf update -y 
# dnf -y groupinstall "Development Tools"
# dnf install -y openssl-devel readline-devel zlib-devel curl-devel libffi-devel subversion wget
# dnf install -y sqlite sqlite-devel 
# sudo dnf install -y httpd httpd-devel
```

ここでは軽さに定評のあるSQLiteを使う。
複数ユーザーで使用する時は他のDBを使う方が良いかと。

### 3. Rubyのインストール
安定版（2020年12月13日現在）
https://www.ruby-lang.org/ja/downloads/
Ruby2.6.6のソースビルド

```
# cd /opt
# wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.6.tar.gz

# tar xvf ruby-2.6.6.tar.gz
# cd ruby-2.6.6
# ./configure
# make && make install
```

バージョンの確認

```
# ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
```

### 4. Redmineのインストール
今回は安定版４.1.1をインストールします。
2020年12月13日現在安定版は次の2つ
4.1.1 (2020-04-06)
4.0.7 (2020-04-06)

公式ではsvnを使っていますが、ここでは使わず進めます。

```
# cd /opt
# wget https://www.redmine.org/releases/redmine-4.1.1.tar.gz
# tar xvf redmine-4.1.1.tar.gz
# mkdir /var/lib/redmine
# mv ./redmine-4.1.1 /var/lib/redmine
```

### 5. Bundlerのインストール
依存関係を管理する為にBundlerをインストール

```
# gem install bundler
```

#####※SQLite以外はここでデータベースを作成する

### 6. DB関連の設定
```
# cd /var/lib/redmine/redmine-4.1.1
# cp config/database.yml.example 
# config/database.yml
自分が使うデータベースの箇所のコメントアウトを外します。使わないやつはコメントアウト
# vi config/database.yml
```

### 7. Redmineのなんやかんや

```
# bundle init
# bundle install --without development test rmagick
セッション保護用の秘密鍵の生成
# bundle exec rake generate_secret_token
データベーステーブル作成
# RAILS_ENV=production bundle exec rake db:migrate
デフォルトデータ
# RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
```

### 8. Webサーバーの起動

ApacheとPassengerで構築したかったのですが
モジュールのインストール中に
####「It looks like something went wrong」
どうやら、無料枠インスタンスが低スペックすぎてダメらしい
メモリが逼迫してました。

まあ、実運用するわけじゃないし、
AWSはタダで使いたいので諦めて、

```
# bundle exec rails server webrick -e production
```

この画面が表示されればOK
![Redmine](https://user-images.githubusercontent.com/59049463/102008856-c5dd9300-3d76-11eb-902e-1ae89bf4c6ac.png
 "Redmine")

ログインは
ログインID：admin
パスワード：admin

###その他

SQLiteとwebtrickは実運用には向かないので、
スペックに余裕のある方は
下記を使うように。

- PostgreSQL, MySQLとか

- passenger + Apache



#####参考サイト
http://guide.redmine.jp/RedmineInstall/
https://serverbuild.net/2020/03/12/centos8-redmine-howtoinstall/
http://blog.redmine.jp/articles/4_1/install/ubuntu/
Dockerのインストールと構築（メモ）

#環境
Windows10 Pro 64bit

Dockerで以下の環境を構築。メモとして記録
#構築
Ubuntu（Linux）
Anaconda

Ubuntuを立てて、そこにAnacondaをインストールします。
JupyterLabを立ち上げます。
Docker for Windowsをインストール。
WSL2はインストールしないで、Docker Toolboxをインストール。
##Docker Toolbox
インストール
問題なくインストールが完了したら、ターミナルやコマンドプロンプトを開き、
「docker run hello-world」というコマンドを実行。
「Hello from Docker!」と表示されたら成功です。 
デスクトップに「MyDocker」というフォルダを作成
そのフォルダにDockerfileを作成

##Docker for Windows
Docker for Windows」をダウンロードします。
インストールする時にWSL2をインストールチェックボックスを外す。
インストールすると以下のエラーが表示される。

```Dos:qiita.dos
Error with pre-create check: "This computer is running Hyper-V. VirtualBox won't boot a 64bits VM when Hyper-V is activated. Either use Hyper-V as a driver, or disable the Hyper-V hypervisor. (To skip this check, use --virtualbox-no-vtx-check)"
```
Hyper-Vを有効にしないと出てくるエラー
Windowsの「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」からHyper-Vを有効にして
WSL2をインストールする。
しかし、WSL2を使用しないので、無効にしておく。
これを無効にしないと、Docker Toolboxも起動しなくなる。

インストールが完了したら、ターミナルやコマンドプロンプトを開き、
「docker run hello-world」というコマンドを実行。
「Hello from Docker!」と表示されたらOK