OmniAICreator/Qiita-1.07M huggingface dataset:
primary key メモ

再度、理解があっているか確認のためメモ
あと言語化できるように

##primary key とは
DBのキーのこと
DBの**データ(行、レコード)**を**一意(他に同じデータがない)に識別する**
ための項目のこと

【なんのためか】
「主キーの値が○○なデータ」と言えば
「あっ、このデータ(行、レコード)だな」とすぐに判断できるため

「**主キー**」とも呼ばれる

##役割
・テーブル**検索のスピード**を格段に**早く**する
・テーブルデータの**整合性を保証**する

##Rails
・デフォルトでidが追加される仕様
・文字列とかを**主キー**に設定したい場合がある
→「**id: false**」で自動で主キーをIDにする設定を**解除できる**
→主キーに設定したいカラムに対して「**primary_key: true**」を設定します。

```rb:migrationファイル
class Hoge < ActiveRecord::Migration[5.2]
  def change
    # id: falseを追加
    create_table :hogehoge, id: false do |t| 
      # primary_key: trueを追加
      t.integer :user_id, null: false, primary_key: true
      t.string :name
```

メモ
・**複合キー(composite_primary_keys)**
・composite_primary_keysという**Gem**

##参考記事
https://wa3.i-3-i.info/word1991.html
https://www.sejuku.net/blog/52356
http://www.code-magagine.com/?p=12207
https://qiita.com/tanutanu/items/6c53b5290eaa9bf905d3
https://qiita.com/belion_freee/items/8f8f1d1e5333da561fd8
2進数と16進数、2の補数表現

## 1. 整数の表現

### 2進数
**0**と**1**だけ使って数を表現する方法

### 16進数
10以降の数を**A**~**F**のアルファベットを使って数を表現する方法

### ビット(bit)
情報量の最小単位であり、**2進数1桁を1ビット**と呼ぶ  

### バイト(byte)
**8ビット**をひとまとめにして**1バイト**と呼ぶ

<br>
対応表

|10進数|2進数|16進数|
|:----|:----|:----|
|0|0000|0|
|1|0001|1|
|2|0010|2|
|3|0011|3|
|4|0100|4|
|5|0101|5|
|6|0110|6|
|7|0111|7|
|8|1000|8|
|9|1001|9|
|10|1010|A|
|11|1011|B|
|12|1100|C|
|13|1101|D|
|14|1110|E|
|15|1111|F|

## 2. 負数の表現

### 2の補数
先頭のビット(**符号ビット**)が**1**から始まる2進数値を負の数として表現する数

### 符号ビット
符号ビットは、それぞれ**符号付き表現**と**符号なし表現**で表現できる  

それぞれの条件で2進数を10進数に変換↓

|        |符号付き表現|符号なし表現|
|:-------|:---------|:---------|
|11011011|-37|219|
SWR ドキュメント 日本語訳

## 追記: 2021年6月8日
[SWR公式日本語訳ページ](https://swr.vercel.app/ja)が追加されたので、そちらをご覧ください

# 全ページの目次
- [はじめに - Introduction](https://qiita.com/tk1024/items/bab4dd730197066d13c1)
- [入門 - Getting Started](https://qiita.com/tk1024/items/1956a7101585694aafa1)
- ドキュメンテーション - Documentation
    - [オプション - Options](https://qiita.com/tk1024/items/35afe470c6f322ff5dc8)
    - [グローバル設定 - Global Configuration](https://qiita.com/tk1024/items/3e4556db98d3bd410826)
    - [データフェッチ - Data Fetching](https://qiita.com/tk1024/items/fcff84eef1c10be5d52b)
    - [エラーハンドリング - Error Handling](https://qiita.com/tk1024/items/1d16da13a025a6900663)
    - [自動再検証 - Auto Revalidation](https://qiita.com/tk1024/items/b045b05aca74277089db)
    - [条件付きのデータフェッチ - Conditional Data Fetching](https://qiita.com/tk1024/items/83522a4d5743cd686df0)
    - [引数 - Arguments](https://qiita.com/tk1024/items/66df360cbb1b7a7baf77)
    - [ミューテーション - Mutation](https://qiita.com/tk1024/items/6f09916c49fc83d3b763)
    - [ページネーション - Pagination](https://qiita.com/tk1024/items/9baa1d9a33dd31ba0bac)
    - [プリフェッチ - Prefetching](https://qiita.com/tk1024/items/6c48e0a1a54beee21511)
    - [Next.jsと一緒に使用する - Usage with Next.js](https://qiita.com/tk1024/items/5a7c0171fb0f09c43f13)
    - [サスペンス - Suspense](https://qiita.com/tk1024/items/d1ee34b70c0ec3a180ae)
- 発展 - Advanced
    - [パフォーマンス - Performance](https://qiita.com/tk1024/items/a899b31d8c60b5518384)
- 例 - Examples
    - [基本的な使用法 - Basic Usage](https://swr.vercel.app/examples/basic)
    - [認証 - Authentication](https://swr.vercel.app/examples/basic)
    - [インフィニティローディング - Infinite Loading](https://swr.vercel.app/examples/infinite-loading)
    - [エラーハンドリング - Error Handling](https://swr.vercel.app/examples/error-handling)
- [変更履歴 - Change Log](https://swr.vercel.app/change-log)

このページはSWRドキュメントの翻訳ではなく、翻訳についての目次・経緯・目的・構成・注意事項に関するページになります

# 経緯と目的
Webクライアントで Next.js が流行ると共に、同じ開発元のSWRも名前がでてきたように思います。いくつかの記事で紹介されていましたが、日本語のいくつかの記事を見るだけで機能の全容を把握するのは難しいように思いました。

そこで英語のドキュメントをざっくりと読み、基本的な使い方を理解し実際のアプリケーションに組み込んでいきました。開発しながらドキュメントの詳細を読んでいくごとに見落としていた機能やオプションを見つけたので、一度全ての機能を把握しようとドキュメント全てを読むようにしました。この際、私のように英語が苦手で日本語で網羅的にSWRの機能を把握したい人がいるのではないかと思ったのでドキュメントを全て翻訳することにしました。機能の把握や理解の助けになれば幸いです。

# 構成
本家のドキュメントのページは全てで20ページ程度ありますが、例(Examples)と変更履歴(Change Log)に関しての翻訳はなく本家のドキュメントにリンクしています。

翻訳記事内のリンクに関しては、ドキュメント内のリンクは翻訳記事のリンクに置き換え、その他は原文と同じリンクになっています。ただし、React・MDNのドキュメントにリンクされている箇所で日本語版が存在している箇所のみ日本語版に置き換えいます。

# 注意事項
翻訳に関して本家ドキュメントとズレがないよう出来るだけ直訳していますが、一部表現が変更されている箇所等あるかと思います。あくまで、SWRの機能を網羅的把握することを補助する目的なので実際の開発の際などは最新の本家ドキュメントを参照ください。(更新リクエストなどは歓迎です！)

公式ドキュメント: [SWR公式サイト](https://swr.vercel.app/)
Github: [vercel/swr](https://github.com/vercel/swr)
ESXi Arm Edition をシリアルコンソール化

ESXi Arm Edition でクラスタ構成をしていると、複数の Raspberry Pi 4 のコンソールの扱いが結構大変。そこでヘッドレスシステム化して、シリアルコンソール経由で管理ができるようにしてみました。
いつもの個人ブログに記事は書いているので、そこのリンクだけ。

[ESXi Arm Edition をシリアルコンソール化](https://imaisato.hatenablog.jp/entry/2021/01/04/044800)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/c99f7e44-0f89-64b2-b4b4-4f1d99148655.png)

ご興味あればご覧ください。
感想文：エンジニアが著書「ライト、ついてますか」から学んだ、良い問題発見の思考法

エンジニアの仕事とは、問題の発見・定義・解決の繰り返しなのかもしれません。

読者の皆さんにも以下のような要望を依頼者からもらうことはないでしょうか？

- コンテンツをさらに増やしつつ、表示スピードも向上させたい
- 新しい技術も導入させつつ、依頼した開発も早くやってほしい
- 売り上げ管理を見える化して、さらに高速にPDCAを回せる仕組みを作りたい
- 売り上げに繋がるユーザーにだけサービスを訴求したい

これらの問題を闇雲に解決していたら、時間がいくらあってもたりません。

良い問題を設定しない限り、何度解決しても、いいアウトプットにはなりません。

そこらへんのことは著書「[ISSUEからはじめよ](http://www.eijipress.co.jp/book/book.php?epcode=2085)」に書いてあります。

例えば、Webサービスという商品を開発（保守・運用）していても、それを使うユーザーの課題の本質理解が無いかぎり、解決策のほとんどは無駄、徒労に終わってしまいます（もちろん、本質をついて当たるケースもあります）。

それは非常にもったいないですね。。書籍「ISSUEからはじめよ」にて、安宅氏が言う「犬の道を通るな」ってやつですね。

なので、この著書（ライトのやつ）を通じて、「いい問題設定とはなにか」を学ぶことにしました。

（余談ですが、問題解決の本はとっても多いのに対して、問題発見の本ってとっても少ないですよね。。）

良い問題発見の思考法として参考になったものを実例を含めて以下に紹介します。（翻訳がわかりにくいと感じたので、意訳してます。）

学びになったのは以下の4点

- そもそも問題とは何か？を知ること
- 誰かの解決方法を鵜呑みにして開発するな
- 問題を解決する前に考えること（方法論）
- 最適な問題発見に終わりはない（思考に終わりはない）

紹介していきます。

## そもそも問題とは何か？を知ること

> **「問題とは、望まれた事柄と認識された事柄の間の相違である」**

（P.15）

ちなみに原本では

> **A problem is a difference between things as desired and things as perceived**

とありました、要は

目標（理想）と現実の差異（ギャップが課題・問題）ってやつですね。

ってことは、理想そのものを変えてしまえば、問題は問題でなくなるってことです。

例えば、表示速度の遅いページがあるとします。エンジニアは技術を駆使してそれを早くするとします。

でもこれって、見方を変えて 処理に時間がかかってもいいと考えたらどうでしょうか？

例えば、行列ができるラーメン屋。並んで食べるまでに30分かかるとしたら、商品がユーザーに届くまでのパフォーマンスは最悪ではないでしょうか？

でも、人気は絶えないラーメンはありますよね？

つまり、理想って「多少待っても得たい！と思えるほどの商品（コンテンツ）にする！」に変えれば表示スピードは問題でなくなる、と言うことです。

極論だけど、多くのWebサービスに言えることだと思っています。

## 誰かの解決方法を鵜呑みにして開発するな

日本語版だと、P36の部分です。

> Don’t take their solution method for a problem definition

意訳：誰かの解決方法をそのまま鵜呑みにするな。

これは、僕も未熟なのでよくやってしまいます。

実例よりも、「[顧客が本当に必要だったもの](http://ntd.way-nifty.com/blog/2005/05/post_80fd.html)」の例が最適ではないでしょうか。

## 問題を解決する前に考えること（方法論）

正しい問題を設定できれば解決することはそれほど難しくはないそうです。

（本書で言われる、以下から推論するに）

> 問題を認識することが一番難しい

(P.53)

正しい問題を設定するために、以下の方法論を試すことは大事だそうです。

- 誰の問題か？（P.83）
    - 本当に、自分や、自分のチームがとくべき問題か
- なぜこの問題が起きたのか（P.104）
- 自分の第一印象は無視するな（P.46）
    - 生物学専攻だったので、この手の話は「DNAの2重らせん構造の発見エピソード」の方が好例ではないでしょうか？
        - ワトソンの直感を、クリックが理論でモデルを構築した[あの話](https://www.jstage.jst.go.jp/article/kobunshi1952/56/1/56_1_22/_pdf)です。

なるほど、とは思ったものの、自分の経験則にまだ無いので、腹落ちはしてません。

## 最適な問題発見に終わりはない（思考に終わりはない）

齊藤先生ではありませんが、要は[思考中毒になれ！](https://www.amazon.co.jp/dp/B08CXPHZFP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)と言うことですね。

どう言うことかと言うと、以下

> Each solution is the source of the next problem

意訳：ある解決策は別の問題を生む（P.65）からですね。

飛沫感染を恐れて、マスクしたらメイク落ちやすくなった。的なやつです。

エンジニアとして例えるなら、新技術を導入して解決される問題もあれば、新たに生まれる問題も必ずあると言うことでしょうか。

また、なぜ、最適な問題発見に終わりはないかと言うと、**「究極の解答」は存在しないから**らしいです。（P.46）

Web業界でもテスト駆動開発（TDD）がスタンダードですが、プログラムの正しさを検証する方法としてのテストコードが最適解では無いと言えるでしょう。

もし仮に、エディタが超優秀になってコードの矛盾点に全て気づければTDDスタンダードな状況も変わってくると思います。

（ましなテストコード書いてから言えよ。と、突っ込まれそう）

最後にまとめ

> The really important thing in dealing with problems is to know that the question is never answered, but that it doesn’t matter, as long as you keep asking

意訳：大事なことは、課題解決に終わりなし。と知ることです。なので、思考中毒になりましょう！と言うことですね。

ありがとうございました！
OpenCVで効率よくトリミングをしてみた

機械学習をするときにはまず教師データの前処理が大事だと言われています。
そして画像処理で物体認識をするときには学習したい物体だけトリミングして無駄を無くしたいですよね？
でもわざわざ画像編集ソフトを使ってトリミングして保存するのも手間です。
というわけで今回はOpenCVを使って効率よく手作業でトリミングをする方法を紹介します。

# 今回やること
ディレクトリ内の画像を一括で読み込んで、以下のように一枚ずつ学習したい領域をトリミングできるようにします。
トリミングした画像は保存用ディレクトリに格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/41472896-a894-ca7c-9553-00d557b82707.png)

# 切り取る領域の選択
まずはドラック＆ドロップで画像上の選択領域の原点になるx軸、y軸、高さ、幅の情報を取るには`cv2.selectROI`を使うと領域選択する画面が簡単に立ちがります。
切り出す領域を選択したらEnterキーを押すと選択領域の座標情報をタプルで取得できます。
(Cキーを押すとキャンセルされて、`(0. 0. 0, 0)`が返されます)

```python
selected = cv2.selectROI(img)
```

選択領域の座標情報を取得したら画像データを切り出すことができます。

```python
imCrop = img[int(selected[1]):int(selected[1]+selected[3]),
                         int(selected[0]):int(selected[0]+selected[2])]
```

あとは切り出した画像データを保存するだけです。

```python
cv2.imwrite(file_dir, imCrop)
```


# 完成したコード
ファイルのパス操作に関するコードも合わせた完成形はこちらです。
WindowsとUNIX系でも使えるようにパスの書式を統一しています。

```python:trim_image.py

import cv2
import os
import sys

if __name__ == '__main__':
    args = sys.argv
    data_dir = args[1].replace('\\', '/')
    annotated_dir = data_dir + 'trimed'
    os.mkdir(annotated_dir)
    files = os.listdir(data_dir)
    img_files = [
        f for f in files if '.jpeg' in f or '.jpg' in f or '.png' in f]
    print(img_files)
    for img_file in img_files:
        # Read image
        img_dir = data_dir + img_file
        img = cv2.imread(img_dir)

        # Select ROI
        selected = cv2.selectROI(img)
        if sum(selected):
            # Crop image
            imCrop = img[int(selected[1]):int(selected[1]+selected[3]),
                         int(selected[0]):int(selected[0]+selected[2])]
            # write annotated img
            file_dir = annotated_dir + '/' + img_file
            cv2.imwrite(file_dir, imCrop)
            print('saved!')
```

以下のコマンドで画像データが保存されたディレクトリのパスを指定してディレクトリ内の画像を一括でトリミングできるようになります。
トリミングした画像データはディレクトリ内に作成した`trimed`ディレクトリ内に保存されます。

```shell
python trim_image.py path/to/img_dir
```
alpineイメージのコンテナにbashではいることができないとき

```
docker run -it elixir:1.11.2-alpine /bin/bash
```
たとえば上記を実行するとbashがないと怒られる。

```
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown.
```

## 対応

```
docker run -it elixir:1.11.2-alpine /bin/ash
```

alpineはシェルにはashが使われている。
JavaScriptのMapオブジェクトでmap関数やfilter関数を使いたい

## 概要
ES6からJavaScriptではMapオブジェクトと呼ばれる、キーと値の組み合わせを保持することができるオブジェクトが使用できます。詳しい仕様については、@chihiroさんの[JavaScript　Mapオブジェクト](https://qiita.com/chihiro/items/9965cd7eca0380cf288c)にまとめられています。
この、Mapオブジェクトについて反復処理を行いたい場合は、forEachやfor文で値を取り出していくのですが、ではmap関数やfilter関数を使いたい場合どうすれば良いのかというのを今回記事にまとめました。



## 対応
[Convert ES6 Iterable to Array](https://stackoverflow.com/questions/27612713/convert-es6-iterable-to-array)の記事にある通り、`Array.from()`関数ではMapオブジェクトやIterableオブジェクトを配列に変換できます。ので対象のオブジェクトを一度配列に変換した後に、map関数やfilter関数を使用するのが対応の一つとして考えられます。

## 実装サンプル

### 【Mapオブジェクトでmap関数を使用】
Mapオブジェクトを`Array.from()`にかけた場合は、keyとvalueがセットになった配列をmap関数内で取得できます。実装サンプルは以下です。

```javascript:sampleMap.js
const sampleMap = new Map([["key1", 1000], ["key2", 1001], ["key3", 1003]]);
const sampleMap2 = Array.from(sampleMap).map((s) => {
  return {
    afterMapKey: s[0],
    afterMapValue: s[1],
  };
});
```
＜結果＞

```json
[
  {afterMapKey: "key1", afterMapValue: 1000},
  {afterMapKey: "key2", afterMapValue: 1001},
  {afterMapKey: "key3", afterMapValue: 1003}
]
```

### 【Mapオブジェクトのkeys()でmap関数を使用】
Mapオブジェクトの`keys()`の結果を`Array.from()`にかけた場合は、単純にkeyの文字列の配列がmap関数内で取得できます。

```javascript:sampleMapKeys.js
const sampleMap = new Map([["key1", 1000], ["key2", 1001], ["key3", 1003]]);
const sampleMapKeys = Array.from(sampleMap.keys()).map((s) => {
  return {
    afterMapKey: s,
  };
});
```

＜結果＞

```json
[
  {afterMapKey: "key1"},
  {afterMapKey: "key2"},
  {afterMapKey: "key3"}
]
```
SASS版Bootstrapのナビバーにてスマホ幅時でもスマホ用表示に切り替えさせない

Bootstrapのナビバーにて中の要素としてアイコンが2つだけしかないような場合、スマホでもハンバーガーメニューに切り替えるのは微妙なのでPCと同じ表示にしたい
今回はsass版で実装

```sass

// ナビバー以外のコンポーネント読み込み
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";
@import "node_modules/bootstrap/scss/reboot";
@import "node_modules/bootstrap/scss/type";
@import "node_modules/bootstrap/scss/grid";
@import "node_modules/bootstrap/scss/nav";


// ブレイクポイントの変数を一時コピーして保存
$tmp-grid-breakpoints: $grid-breakpoints;
// ブレイクポイントを一時全部無効に
$grid-breakpoints: (
        xs: 0,
        sm: 0,
        md: 0,
        lg: 0,
        xl: 0
);
// navbarのスタイルを出力
@import "node_modules/bootstrap/scss/navbar";
// 変数戻す
$grid-breakpoints: $tmp-grid-breakpoints;
```

ブレイクポイントをナビバーのときだけ無効にしてスタイルを吐き出させてる感じですね。
CDNで導入されたようなCSS版Bootstrapでやろうとすると結構面倒な案件なんですがsassなら手軽に実現できました。

今回は4系のナビバーですが多分5系の方やナビバー以外のコンポーネントでも同じようなことができると思います。
AtCoder ARC014 C - 魂の還る場所 先読みしたシミュレーション

https://atcoder.jp/contests/arc014/tasks/arc014_3
先読みと書いていますが、単に１手先を読むだけです。

結論は、キューには最適に詰めていった場合r,g,bを2文字以上存在できません。つまり、偶数個の文字はすべて消しきれるため、r,g,bそれぞれについて%2した和が答えになります。

# 概要
- 双方向から文字を入れられるキューがあります。(以下、左右から入れられるとします)
- あるR,G,Bという文字からなる文字列を決められた順番に詰めていきます。左右どちらに入れてもよいです。必ず詰めなければならず、スキップしてはいけません。
- この文字は２つ隣接すると消えます
- 最後に残る文字の最小を答えなさい

#用語
- addL: 左に字を入れる
- addR: 右に字を入れる
- L,R: キューに入っている左と右の1文字
- cur, next: それぞれ今追加しようとする文字、と次に追加する文字(つまり1文字先読み)

#考え方
以下のようにして`このキューには各文字が最大でも1文字までしか残らないように配置ができる`ような詰める順番を考えます。

- キューの文字が2文字に満たない場合、適当に追加する(例えばaddL(cur)する)
- addLかaddRをして消せる場合、curはその処理を行い文字を消す
- これで消せていないということはL,Rではない文字であるが、もし、cur == nextなら適当に追加する(この場合、addL, addLと処理すれば確実にその文字は消せるため)
- cur != nextの場合、nextは必ずLかRのどちらかと一致する。そのため、curをそれとは逆に入れる。この場合、nextを(次のターンのcurとして)その逆に入れれば必ず消せる。

#実装
上記を愚直にシミュレーションすればよい。ただし、

- キューに文字は各文字が最大でも1文字までしか残らないように配置ができる。(つまり、２文字以上残さないように配置できる)
- 題意から、各文字が奇数である場合、その文字の残りが0にならないことは明らかである。(2文字ずつしか消せないのだから)

ことを考えると、

```Python
n,s=input(),input()
print(s.count("R")%2+s.count("G")%2+s.count("B")%2)
```
でもよい。
<b>解をわかりやすく表示するために、ものすごく無駄が多いです</b>

```Python
# printのcomment outをすると解法が出る
from collections import deque
n, s = int(input()), input()
q = deque([])
step = [0]
### ここからキューのシミュレーション
def addL(ch): # 左に入れようとする。同じ色なら消す
    step[0] += 1
    #print("step[", step[0], "]: Left  ", ch, "current :", q)
    if len(q) == 0:
        q.append(ch)
        return
    nch = q.popleft()
    if nch != ch:
        q.appendleft(nch)
        q.appendleft(ch)
        return
def addR(ch): # 右に入れようとする。同じ色なら消す
    step[0] += 1
    #print("step[", step[0], "]: Right ", ch, "current :", q)
    if len(q) == 0:
        q.append(ch)
        return
    nch = q.pop()
    if nch != ch:
        q.append(nch)
        q.append(ch)
        return
### ここまでキューのシミュレーション
for i in range(min(2, n)): # 1,2文字目は適当に突っ込む
    addL(s[i])
# 文字列の最後に番兵を突っ込んでおく
n += 1
s += "_"
for i in range(2, n - 1):
    curCh, nCh = s[i : i+2]
    if curCh == "_": break # 番兵
    if len(q) < 2: # 今のキューが0 or 1文字の時は適当でいい(とにかく２文字貯める)
        addL(s[i])
        continue
    qL, qR = q[0], q[-1]
    if qL == curCh:# 左で消せるなら左で消す
        addL(curCh)
        continue
    if qR == curCh: # 右の子で消せるなら右に
        addR(curCh)
        continue
    # この場合、今の文字は、qL, qRと異なる何か
    # だが、次(=nch)が、今(=curChar)と同じなら、どうせ次で消せるのでなんでもいい(左に入れてみる)
    if curCh == nCh:
        addL(curCh)
        continue
    # それができない場合は、nCh(さらに次に入れるもの)は絶対にqLかqRで消せる。だから、今の文字は逆に入れる
    # そうすると、nChは絶対に消せる(番兵は除く)
    if nCh == qL:
        addR(curCh)
        continue
    if nCh == qR:
        addL(curCh)
        continue
    addL(curCh) # 最後の文字で消せないときはなんでもいい
print(len(q))
```

https://atcoder.jp/contests/arc014/submissions/19185809
アドベントカレンダー29日目：SREを読んでみた「時系列データからの実践的なアラート」編④

時系列データからの実践的なアラートの最後になります。

## ブラックボックスモニタリング
Borgmanは、ホワイトボックスモニタリングになります。この方式によりサービス内部の状態を把握することができます。そのため、サービス内部に起きている問題に対しては、強力な方法です。
しかし、ホワイトボックスモニタリングでは、システムの全体像について知ることはできません。
DNSのエラーで到達しなかったクエリやサーバーのクラッシュにより失ったクエリにアラートを発すことはできません。

この網羅できない問題に対して、GoogleはProberで解決を行いました。

Proberにより、HTTPレスポンスの検証を行います。その結果をBorgmanへ渡し、アラートを出すことができます。また、レスポンスのペイロードの検証し、その内容を確認することができます。
また、ロードバランサーの背後にProberを配置し、ロードバランスされたwww.google.comとデータセンター内のwebサーバー双方をモニタリングすることもできます。
これにより、データセンターの障害時、トラフィックの状態を知ることができます。エッジに問題が生じたときは、そのエッジをトラフィックフローのグラフから分離することができます。

## 設定のメンテナンス
Borgmanの設定はルールの定義をモニタリングの対象から分離します。
これにより、同じルールセットを複数のターゲットへ一斉に適用できるようになります。
また、ルール言語のテンプレートがサポートされています。それによりルールライブラリを構築することもできます。
これは複雑さを生み出すことがあります。そのため、ルールが期待通りに動作することを保証するために時系列データを合成し、広範囲のユニットテストと回帰テストを構築する方法も提供されています。
そして、このようなテストスイートの実行、設定のパッケージング、プロダクション環境のBorgmanへの設定のプッシュを行うCIも運用されています。設定が配布されると、Borgmanは内容を検証し、受け入れます。

そうして共通テンプレートライブラリが作成される中、2種類のモニタリング設定が急速に増えていきました。
1種類目は、エクスポートした変数で同じライブラリを使う場合は、テンプレートを再利用できるようにしただけのライブラリ。
2種類目は、単一のサーバー上のタスクからグローバルなサービスになるにつれて、生まれました。
エクスポートされた変数の汎用集計ルールを含むライブラリです。これにより、サービスのトポロジをモデル化することができます。
モデル化により、問題のデバックの際にサブコンポーネントをシステムの他の部分から分離できるようになります。この分割はラベルの付け方によって可能になっており、ターゲットのインスタンス名やシャード、データセンターなどにラベルを付けることができます。

## まとめ
* モニタリングシステムはサーバーのスケールにメンテナンスコストが影響しないようにする。

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　126-129
Raspberry PIにて日本のシステム時間を設定

#概要
Raspberry PIにOSをインストールした場合、システムの時間が日本の時間になっていないので、その時間を設定するコマンドをお知らせします。
既に画面から設定したかもしれないですが、今回はコマンドから設定する方法です。

#設定コマンド
次のコマンドをコンソール画面で実行します。

~~~bash
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
~~~

#実行結果
~~~bash
pi@RPI4-DEV:~ $ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
pi@RPI4-DEV:~ $ date
Mon  4 Jan 00:20:33 JST 2021
~~~

#終わりに
これでRaspberry PIに日本の時間が正しく設定ができました。
簡単ですね。^^;;
画面から設定が面倒だと思いまして自分のQiitaにメモして置きました。
【Android開発】GitHubActionsでCIやってみたい時の参考になる記事まとめ【ktlintとか】

## まずは最強の記事
[Github ActionsでマルチモジュールAndroidプロジェクトのCI環境を整えよう(ビルド/Slack通知/Danger/ktlint) - Qiita](https://qiita.com/hohohoris/items/f934beb4ea0b432af488)
この記事が今のところ最高です！
この記事を読んでわからない、動かないって時にはしたの記事を読みましょう！

## Danger？なにそれ美味しいのって時に読んでね
[Danger 導入した - Qiita](https://qiita.com/takakuda/items/2c796346323c7eb9242f)
Dangerの入門記事、これを読んでから公式ドキュメントにあたるとはやいですよ！

## ktlintをプラグインで使いたい時に参考にどうぞ
[【Gradle】ビルド時にktlint（に限らずタスク類）を走らせる【Kotlin】 - Qiita](https://qiita.com/wrongwrong/items/86dfda0cdad5de57e619)
ktlint ってそもそもなんだよとか、Gradleで動かすのめんどいとか、プラグインで使う方法わからん
時に読んでね！

### ktlintがなんかうまく行かない時、たぶんこれでしょ
[ktlintCheck always successful · Issue #291 · JLLeitschuh/ktlint-gradle](https://github.com/JLLeitschuh/ktlint-gradle/issues/291)
ktlintがなんか全部チェックすり抜けちゃう時に読みましょう
プロジェクトで実行するように設定できてないだけでは？

## Bitriseが好みの方はこちら
[GitHub のプルリクエストを Bitrise x Danger x ktlint で自動レビューする - Qiita](https://qiita.com/hkusu/items/32d29d90bf6e7a698c21)
GithubActionsじゃなくてBitriseが好きなiOSエンジニア出身の方はこっちでも！

# まとめ
GitHubActionsで無料でCIをはじめましょう！
【Unity】StartCoroutine()で起動したコルーチンを止める場合はIDisposableにキャストしてDispose()を呼ぶべき

# はじめに
* [[C#,Unity]usingステートメントを使っても必ずDisposeされるとは限らない](https://qiita.com/yaegaki/items/227f026344a8729fbd43)

この記事を読んで、UniRxの `Observable.FromCoroutine()` でコルーチンを起動した場合は大丈夫だったような気がしたので調べました。

# `Observable.FromCoroutine()` でコルーチンを起動した場合はちゃんと破棄される
[`Observable.Unity.cs`](https://github.com/neuecc/UniRx/blob/master/Assets/Plugins/UniRx/Scripts/UnityEngineBridge/Observable.Unity.cs#L330-L431) のソースコードを読んだら `IEnumerator` を `IDisposable` にキャストして `Dispose()` を呼んでいました。

以下ソースコード抜粋：

```Observable.Unity.cs
..

var d = enumerator as IDisposable;
if (d != null)
{
    d.Dispose();
}

..
```

念のため次のようなコンポーネントで実験してみましたが、コルーチンが終わる前に `GameObject` を消すとちゃんと `disposed` とログが出ました。

```CoroutineTest.cs
using System.Collections;
using UniRx;
using UnityEngine;

public class CoroutineTest : MonoBehaviour
{
    private IEnumerator _enumerator;

    void Start()
    {
        Observable.FromCoroutine(this.Coroutine).Subscribe().AddTo(this);
    }

    private IEnumerator Coroutine()
    {
        Debug.Log("Coroutine start");

        using (Disposable.Create(() => Debug.Log("disposed")))
        {
            yield return new WaitForSeconds(3f);
        }

        Debug.Log("Coroutine end");
    }
}
```

# `IEnumerator` は必ず `IDisposable` を実装している？
[`IEnumerator<T>`](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.ienumerator-1?view=net-5.0) は

>public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator

なので必ず `IDisposable` なのですが、 [`IEnumerator`](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.ienumerator?view=net-5.0) は

>public interface IEnumerator

なので `IDisposable` であるとは限りません。

その点は[ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/classes#enumerator-objects)によると

>列挙子オブジェクトには、次の特性があります。
>・IEnumerator と IEnumerator<T>を実装します。 T は反復子の yield 型です。
>・このクラスは、System.IDisposable を実装します。

とのことで、イテレータブロックで生成された `IEnumerator` は必ず `IDisposable` を実装しているようです。

# `StartCoroutine()` を安全に使うには
`StopCoroutine()` は `IEnumerator` を `IDisposable` にキャストして `Dispose()` を呼ぶとか気の利いたことはしてくれないので、自分でやります。

```CoroutineTest.cs
using System;
using System.Collections;
using UniRx;
using UnityEngine;

public class CoroutineTest : MonoBehaviour
{
    private IEnumerator _enumerator;

    void Start()
    {
        _enumerator = this.Coroutine();
        this.StartCoroutine(_enumerator);
    }

    void OnDestroy()
    {
        (_enumerator as IDisposable)?.Dispose();
        this.StopCoroutine(_enumerator);
    }

    // コルーチンは好きなように書く
    private IEnumerator Coroutine()
    {
        ...
    }
}
```

# 感想
`IEnumerator` をフィールドに保存・止めるときにキャストして `Dispose()` を呼ぶ手間を考えると `Observable.FromCoroutine()` で起動したほうが楽そう。
ネットワークの基礎（３）【プロトコル(TCP/IPモデル)】

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。


TCP/IPモデル
-
TCP/IPとは、現在のインターネット通信およびイントラネット通信において最も利用されている
通信プロトコルです。TCP/IPは、複数のプロトコルから構成されていますが、
中心的な役割を果たすのが、TCP（Transmission Control Protocol)と
IP(Internet Protocol)であることから TCP/IP と呼ばれるようになりました。
<br>

- TCP/IPの階層モデルとその役割

|レイヤ　　　|階層　　|OSI参照モデル|
|:---|:---|:---|
|4　　　　　　　|アプリケーション層|アプリケーション層、プレゼンテーション層、セッション層に相当|
|3|トランスポート層|トランスポート層に相当|
|2|インターネット層|ネットワーク層に相当|
|1|リンク層（ネットワークインターフェース層）|データリンク層と物理層に相当|

<br>

・アプリケーション層
Webサイトや電子メールなど、インターネットで上で提供されている各種サービスと、
アプリケーション間でデータのやり取りをする階層。
この層ではHTTP（Webサイトの閲覧の際に利用）、 FTP（ファイル転送の際に利用）、
SMTP（メール送信の際に利用）、 IMAP（メールの受信の際に利用）などのヘッダが付加され、
通信アプリケーションの機能が実現されます。
<br>

・トランスポート層
アプリケーションにデータを渡す為、プロトコル間での通信を制御する階層。
この層では、TCP、UDPヘッダが付加され、
TCPを使用する場合、信頼性の高い通信を実現して、
UDPを使用する場合、信頼性ではなく通信速度を重視することになります。
また、TCPヘッダが付加されたものを、<b>セグメント</b>といいます。

そして、TCPを利用するアプリケーション層のプロトコルには、HTTP、 FTP、 SMTPなどが
あり、TCPで扱うデータを<b>TCPセグメント</b>をいいます。

UDPは、通信の途中で多少データが欠落しても遅れを生じさせずにデータを送る必要性がある
音声や画像などのリアルタイムアプリケーション（RTP）や、
複数の相手にデータを送信する必要があるDHCP、
IPアドレスやホスト名を問い合わせするDNSなどがあり、
UDPで扱うデータを<b>UDPデータグラム</b>といいます。


<br>

・インターネット層
ネットワーク間のエンドツーエンドの通信を制御するための規定。
この層では、IPヘッダが付加され、
IPヘッダが付加されたデータを<b>パケット</b>いいます(IPデータグラムともいう)
また、IPヘッダを付加したデータを<b>IPパケット</b>といいます。

※IPアドレスとは、ネットワーク上で、PCやルータなどの機器の場所を特定する為に
利用されるインターネット層の識別子です。また、IPアドレスの事を、<b>論理アドレス</b>とも
呼びます。
一方、<font color="Red">MACアドレス</font>とは、ネットワークインターフェースカードで割り振られているリンク層で、
使用される固有の識別子のこと。
また、MACアドレスの事を、<b>物理アドレス</b>とも呼びます。

※ネットワークインターフェースカードとは、LANケーブルを挿す穴がくっついている、
パソコンに合体させる部品のこと

<br>

・リンク層
直接的に接続されたノード同士の通信を制御するための階層。
この層では、宛先と送信先のMACアドレスなどが含まれてる<font color="Red">イーサネットヘッダ</font>と、
<font color="Red">トレーラ</font>と呼ばれる誤り検出する為の情報を後ろに付加します。
また、この付加されたデータを、<b>フレーム</b>いい、フレームを０と１の電気信号に変換し
ケーブル上に流します。

※イーサネットとは、LANのリンク層で利用されているプロトコルで、
扱うデータの形式や物理ケーブルの仕様などを規定しています。
<br>

- TCP/IPモデルにおけるカプセル化と非カプセル化

OSI参照モデルの場合と同様の考え方で、
コンピュータ間で通信する場合、送信側のコンピュータでは「アプリケーション層」 ⇒ 「トランスポート層」
⇒ 「インターネット層」 ⇒ 「ネットワークインターフェース層」 ⇒ の順番でカプセル化を行いデータが
送出され、受信側のコンピュータでは「ネットワークインターフェース層」　⇒ 「インターネット層」 ⇒ 
「トランスポート層」 ⇒ 「アプリケーション層」の順番で非カプセル化を行って
送信側で付加したヘッダを取り除いていきます。
※カプセル化 ⇨ ヘッダを付加して下位層に渡すこと
<br>

過去投稿記事
-
[ネットワークの基礎（１）【接続形態と通信方法】](https://qiita.com/k-yasuhiro/items/38d643ec262a0309db06)
[ネットワークの基礎（２）【プロトコル(OSI参照モデル)】](https://qiita.com/k-yasuhiro/items/0e5accf951223e2332e4)
Notionでもショートカットを使って、効率爆上がりを目指す

#はじめに
　記念すべき100回目の投稿は、今年特に力を入れて活用していきたいNotionについてです。`/`を打ったり、右クリックで表示を選択することが出来ますが、他のソフト同様にショートカットがあるので、紹介します。紹介するものは、特によく使うものです。他にもショートカットはありますし、同じ機能でも別のショートカットがあります。ややこしいので、厳選しました。

##Notionでも使えるマークダウンでのショートカット

###見出し

```
# Heading1
## Heading2
### Heading3
```

###リスト

`-`(ハイフン)
Tabで少し右に移動
Shift + Tabで左に移動

###番号付きリスト

`1.`(数字 + ドット)

###引用
`|`

以上のコマンドは、どれも使い方としては、それぞれを打った後に、半角スペースを入力することで認識されます。

---
以下の3つは、そのコマンドを入力するだけで、認識されます。

###ToDoリスト

`[]`

###平行線

`---`

###コードブロック

```
バッククオート(Shift + @)を３つ
↑すみません、これをここで入力すると、コードブロックが作成されてしまうので言葉での説明で…
```


##最後に
　マークダウンをマークダウンの形式で説明するの、難しい…
Couldn't open /etc/securetty

当方のUbuntuは20.04.1です。
sshでアクセスすると`/var/log/auth.log`に変なログが。

```
Dec 31 18:37:55 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません
Dec 31 18:37:57 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません
Jan  1 15:25:36 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません
Jan  1 15:25:40 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません
Jan  1 15:25:41 groove sudo: pam_unix(sudo:auth): Couldn't open /etc/securetty: そのようなファイルやディレクトリはありません
```

https://askubuntu.com/questions/1239503/ubuntu-20-04-and-20-10-etc-securetty-no-such-file-or-directory

```
sudo cp /usr/share/doc/util-linux/examples/securetty /etc/securetty
```

コピーしないといかんのはどうかと思う。
【Python】Anacondaの環境構築（インストール、起動、仮想環境、パッケージ管理）Mac環境

<!-- wp:paragraph -->
<p>こんにちは、かをるです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>今回は、Anacondaの環境構築の方法を紹介していきます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>PyCharm同様にGUIインストーラを使って進めていきますので、比較的簡単に進めることができます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Anacondaはデータサイエンティスト向けのPythonパッケージになっておりますので、データサイエンティストを目指される方は使い慣れておくのがいいかと思います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>インストール自体は簡単に行えますが、色んな事を自動的に行なってくれるので、【<span class="marker-under-red">中身がどの様に行われているのかわからない</span>】というデメリットもありますのでご注意ください。</p>
<!-- /wp:paragraph -->

ブログ記載しました。
https://kaworublog.com/anaconda-install-python/
【ギリ初心者向け】Laravel Docker AWS(EC2) Webアプリ（PHP)を0から簡単にデプロイする方法（無料）①　ー全体像編ー


#できるようになること
Webアプリ（PHP）をDockerで作成し、AWSでデプロイする工程をわかりやすく書いていく！！
プログラミングはできるようになったけど作ったものを世の中に出したいけどわからん！となった人向けです

#※内容はこちらのサイトに移動しました！

https://sg-report.com/laravel-docker-awsec2-web1/
モジュールとMixin メモ

調べながらメモする

##モジュールとは
Rubyの基本概念は、**クラス**があり**オブジェクト**がある
ある一連の振る舞いを一箇所にまとめたものが**モジュール(Module)**

しかし、クラスとは違いオブジェクトを生成することはできない

モジュールは、あくまで
**一連の振る舞い(メソッドの集まり)**、または**処理をまとめたもの**

それをクラスで読み込んで使用する

基本形は、ほぼクラスと同じ
メソッドだけでなく、定数やクラスを宣言することも可能

##使いかた
使用したいクラスにて、**取り込む**(**include**する)
そうすると、作成したオブジェクトからメソッドを読み込むことができる

色々なクラスにて同じ振る舞いのメソッドを
簡単に追加することができる

同じ名前をつけても衝突しない
それぞれの世界を**名前空間**といい
名前空間が異なれば、同じ名前でも良い

##Mixin
クラスにモジュールを取り込むことを**Mixin**と呼ぶ

###多重継承もどき
Rubyは、Javaなどと同じように多重継承を許していない言語
つまり2つの**親クラスを同時に継承できない**

よって、
1つのクラスを継承してしまった後、
変更を加えるには**子クラスに手を加える**しかない

ところが
Mix-inを使うと、あたかも親クラスのように振る舞うことができる

また1度モジュールを定義すれば、他のクラスでも使えるのでとても便利

##まとめ
・クラス→オブジェクトを生成することができる
・モジュール→オブジェクトを生成することができない
・モジュールはいわば**メソッドの集まりのようなもの**で
**様々なクラス**にて読み込むことで使用することができる
・**複数**のモジュールを読み込んで**使用することも可能**
・クラスにモジュールを取り込むことを**Mixin**と呼ぶ
・Mixinすることで、**多重継承のような動き**に見せることができる

##参考記事
現場Rails
https://style.potepan.com/articles/7667.html

動作確認の際に参考にしようと思う記事
https://qiita.com/tanaka-t/items/32a3329fbc1eb0840ea0
https://qiita.com/pink_bangbi/items/2c2f17516cd3a7b4eeac
https://medium.com/@jiraffestaff/ruby-mixin%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%A9%E3%81%93%E3%82%8D-%E8%A8%AD%E8%A8%88%E7%9A%84%E3%81%AA%E8%80%83%E3%81%88%E6%96%B9-9b8d2e529669
[Rails] pry-rails の導入〜  binding.pryのデバック用法

# はじめに
この記事は下記を参考させていただきました。
https://pikawaka.com/rails/pry

Pryとは、Rubyのirbのようにrailsのコンソールでメソッドなどを使えることができるようになる機能です。

pry-railsの導入
=============================
pry-railsはコンソールを立ち上げたとき、**irbでなくpryを起動させることができるgem**です。
デフォルトでは、rails cコマンドでコンソールモードにした際、irbが起動します。
下記のようにgemを追加しbundle installを実行することで、pryを使えるようになります。


```言語:Gemfile
# 省略

gem 'pry-rails`
```

# binding.pry
記述した箇所で処理を止めることができます。
自分はデバックとテストに用いています。
デバッグとは、任意でない処理（バグ）を見つけることです。

```books_controller.rb
 def create
    @book = BookOrder.new(bookorder_params)
    binding.pry
    if @book.save
      redirect_to root_path
    else
      render :index
    end
  end
```
---
binding.pryで処理を止めると、ターミナルが下記のようになりました。
コンソールが起動し、入力待ちの状態です。
ここで「params」「@book」と入力し、中身を確認することができます。
[![Image from Gyazo](https://i.gyazo.com/b53573fc022fc38e89508feadf26f5f0.png)](https://gyazo.com/b53573fc022fc38e89508feadf26f5f0)

---
下記はbinding.pry実行中に使えるコマンドの一例です。
良かったら公式も見てみてください。
https://github.com/rweng/pry-rails

コマンド	       |内容
---------------|--------------------------------
step	       |ステップイン
next	       |ステップオーバー
finish	       |ステップアウト
continue       |デバッグを終了する（中断していた処理を続行）
[変数名]	       |変数の中身を出力
$ [メソッド名]    |メソッドの定義をみる
show-stack     |スタックとレースをみる（要 pry-stack-explorer）
!!!	       |プロセスを終了する。 その後に何個 binding.pry があっても抜けられるが rails s などは終了する
show-routes    |現在のルーティングを確認
show-models    |現在のモデルを確認
show-source    |クラスやモジュール、メソッドの定義を確認
show-doc       |クラスやモジュール、メソッドのドキュメントを確認

# おわりに
Railsでは、「MVCの流れ」と、「今自分は何の為に何をやっているのか」を常に把握しておくことが伸びるコツだなあと日々感じております。
初学者ならではの辛さもあるかと思いますが、プログラミングは楽しいし、
未来の自分にとって最高級の投資だと思いますので、
学びを楽しんでいきましょう！
taichiのトリセツ⓪ 目次

## このシリーズについて
[taichi](https://github.com/taichi-dev/taichi)というpythonで使えるグラフィックのライブラリに最近ハマっているので、使い方をまとめていきます。

## 目次
1 [mp4とgifで出力](https://qiita.com/Hiroaki-K4/items/7607b54fbcfaea171215)
2 [初期化](https://qiita.com/Hiroaki-K4/items/4a3ccf4347c58ac20ee4)
SuperCollider スパコちゃん2021 その3

※この記事では音響合成プログラミング環境＆言語のSuperColliderについて書いています。
※この記事ではMacOS版のSCを使っています。
※文中SuperColliderをSCまたはスパコと略しています。
※マークダウン？なにそれおいしいの？とにかく投稿します！！！

３ IDEのステータスバーと隠された機能

SC IDEの右下にはアルファベットと数値が小さく横に並んでいます。これはインタプリタとサーバーの状態を表しているステータスバーです。

Interpreter : Active または Inactive
Server：各パラメータの数値

インタプリタは、SC IDEを開いたときに自動に起動するので、Interpreterの文字の横には「Active」が緑色で表示されている必要があります。「Inactive」になっている場合は、何らかの問題がありSCをコンパイルできていない可能性があります。クラスの拡張ファイルのインストールに失敗しているなど、postウィンドウに表示されているエラーメッセージを読み、そしてググり問題を解決してください。もし解決できない場合は、SCの公式メーリングリストやFacebookのグループ（どちらも英語）、またはSuperCollider名古屋勉強会のメンバーに尋ねてみましょう。

サーバーのパラメータは、左から、使用しているCPUのピーク(%) 、平均値(%)、サーバーのユニットジェネレータ(u)、シンス(s)、グループ(g)、SynthDef(d)の数です。ループ処理や使用済みの不要なシンスを削除していない場合にこれらの値が増え続け、最終的にクラッシュしてしまう場合がありますので、値を確認しながら作業をすると良いでしょう。
サーバーの状態はパラメータの色で判断します。

白色：サーバーが起動していない状態
緑色：サーバーが起動している状態
黄色：サーバーからの応答がないなど、エラーの状態


隠された便利な機能

それぞれのパラメータが表示されている部分をクリックすると、インタプリタやサーバーについての便利なコマンドを表示することができます。インタプリタを再起動したり、サーバー内のノードの状態を取得したり、レベルメータの表示、出力音声の録音、ミュート、またマスター音量の変更ができます。詳しい使い方はここでは説明しませんが、覚えておくと役立つときがくるでしょう。
Serverless Frameworkの使い方

Serverless Frameworkの使い方をまとめました。
今後何かいいTipsがあれば更新していこうかと思います。


# 基本コマンド
## インストール
事前にnodejsをインストールしておくこと

```
npm install -g serverless
```

## バージョン確認
```
sls --version
```

## ログイン
```
sls login
```

## AWSの認証情報の設定
```
sls config credentials --provider aws --key YOUR_KEY --secret YOUR_SECRET
```

更新のときは -o オプションを加える
-o はオーバーライトの意味

が、実際これは別にやらなくてもよい

## テンプレート作成
node.jsのテンプレートを使用

```
sls create --template aws-nodejs
```

別フォルダにあるテンプレートを使用

```
sls create --template-path path/to/my/template/folder -p path/to/my/service -n my-new-service
```

Githubとかにあるテンプレートを使用

```
serverless install -u https://github.com/foo-bar.....
```


## 削除
```
sls remove
```

## デプロイ
```
sls deploy -v
```

-v でプロセスを確認できる
作成も更新もこのコマンドで実行する

```
sls deploy --aws-profile devProfile
```

AWSの認証情報を指定してデプロイ

```
sls deploy function -f myFuncName
```

Lambda関数の更新には関数名を指定する場合
名前を指定する

```
sls deploy --config ./tmp/sample.yml
```

ファイル名を指定する場合

注意点として、**実行したディレクトリの場所からテンプレートファイルの指示通りにファイルを探索する**ので、テンプレートファイルで別のファイルから読み取りを行っている場合、実行場所によってはパスの修正が必要となる。


【参考】
https://www.serverless.com/blog/quick-tips-for-faster-serverless-development

## dry run
```
sls deploy --noDeploy
```

~~構文に誤りがないかチェック~~

**追記**

こちらのオプションは削除されました。

今後は package コマンドで確認するようです。

https://github.com/serverless/serverless/issues/3510

# 応用
## 外部ファイルを参照する

```yaml:serverless.yml
resources:
  - ${file(./resources/s3.yml)}
```

【参考】
https://www.serverless.com/framework/docs/providers/aws/guide/variables/#multiple-configuration-files

## コードチェック

※事前にPythonをインストール

```
pip install cfn-lint
```

以下のコマンドで確認

```
cfn-lint sample.yml
```

これでCloudFormationの構文に誤りがないかチェックができる

詳細はこちら
https://github.com/aws-cloudformation/cfn-python-lint

# トラブルシューティング
## バケットポリシーのバージョン表記
```yaml
Version: 2012-10-17
```

シングルクォーテーションなしの場合
slsが読み違えて時刻に変換してしまうので、
以下のように変更する

```yaml
Version: '2012-10-17'
```

## resourcesフォルダ内のファイルを参照できない

ファイルパスが間違っている
変数を利用している場合、うまく参照できていない可能性がある

## 外部ファイルを読み込めない

各CloudFormationのファイルは、
Resourcesではじまるように記述しないといけない、以下例

```yaml
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
```

## Lambdaに不要なファイルがある

Serverless Framework用のフォルダ内に例えばREADME.mdがある状態でデプロイを行うと、README.mdも一緒にLambdaにアップロードされてしまいます。

それを回避するため、serverless.yml内に以下のような記述をする。

```yaml
package:
  individually: true
  exclude:
     - README.md
```

---------------------------------------

Serverless Frameworkがわからなくなったら
立ち寄りたい、、、

そんな記事になれればと思います。


**Thanks.**
Githubおもしろリポジトリ⓪ 目次

## このシリーズについて
githubのトレンドリポジトリから情報を[定期通知する機能](https://qiita.com/Hiroaki-K4/items/61b357fa69c90fd9bbfd)を作ったのですが、それを通じて発見した面白そうなリポジトリを紹介するシリーズです。

## 目次
1. [面白そうなグラフィック系のリポジトリを発見したので試してみた](https://qiita.com/Hiroaki-K4/items/e8cdb8c4e79c0d1a6670)

2. [家中をどこからでもコントロール](https://qiita.com/Hiroaki-K4/items/08a2feffbc477691ca5f)

3. [ループ中も飽きない?新しいプログレスバー](https://qiita.com/Hiroaki-K4/items/1239b7bab9ab02c9c381)
2020年UiPathでやったことまとめ

2020年4月からUiPathを使って仕事をする中でやったことをまとめる

UiPathStudioのインストール、アンインストール、ライセンス適用などの環境設定



###作ってるツール
- Uipath Studio（Ver2018.4）
- Orchestrator

###作ったワークフロー
細かいことを除いてざっくり言うと以下の事をするワークフローを作成
最初に１のAttended版をUnattended版に作り替えることから始まった
主に１を作ることが多く、秋ごろから2,3を作るようになった
　1. Webサイトにログインしてファイルをダウンロードする
　2. Excelファイルの表データを読み込んで別ファイルに追加する
　3. Excelでアドオン機能を操作し、取得したデータを別ファイルに転記する

### 使ったアクティビティ一覧
- シーケンス(Sequence)
- フローチャート(Flowchart)
- メッセージボックス(MessageBox)
- 1行書き込み(WriteLine)
- プロセスを強制終了(KillProcess)
- 代入(Assign)
- パスの存在を確認(PathExists)
- フォルダを作成(CreateDirectory)
- ファイルを作成(CreateFile)
- ファイルをコピー(CopyFile)
- 条件分岐(Statements.If)
- フロー条件分岐(FlowDecision)
- 削除(Delete)
- 待機(Delay)
- トライキャッチ(TryCatch)
- ワークフロー ファイルを呼び出し(InvokeWorkflowFile)
- プロセスを開始(StartProcess)
- 繰り返し(各行)(ForEachRow)
- スイッチ(Switch)
- フロースイッチ(FlowSwitch)
- ブラウザを開く(OpenBrowser)
- ウィンドウを最大化(MaximizeWindow)
- アクティベート(Activate)
- クリック(Click)
- チェック(Check)
- 画像をクリック(ClickImage)
- ブラウザにアタッチ(BrowserScope)
- 文字を入力(TypeInto)
- SecureStringで文字を入力(TypeSecureText)
- 要素の存在を確認(UiElementExists)
- 要素を探す(WaitUiElementAppear)
- 画像の存在を確認(ImageFound)
- タブを閉じる(CloseTab)
- アプリケーションを閉じる(CloseApplication)
- スロー(Throw)
- ホットキーを押下(SendHotkey)
- テキストを取得(GetValue)
- ウィンドウにアタッチ(WindowScope)
- Excel アプリケーション スコープ(ExcelApplicationScope)
- セルを読み込み(ExcelReadCell)
- 範囲を読み込み(ExcelReadRange)
- 範囲を読み込み(ReadRange)
- 範囲を追加(ExcelAppendRange)
- セルに書き込み(ExcelWriteCell)
- 範囲に書き込み(ExcelWriteRange)
- 範囲に書き込み(WriteRange)
- CSV に書き込み(WriteCsvFile)
- 構造化データを抽出(ExtractData)
- データ テーブルを検索(LookupDataTable)
- データ テーブルをフィルター(FilterDataTable)
- データ テーブルを並べ替え(SortDateTable)
- データ テーブルを構築(BuildDataTable)
- 繰り返し (コレクションの各要素)(ForEach<System.Object>)
- 繰り返し (前判定)(InterruptibleWhile)
- 繰り返し (各行)(ForEachRow)
- 繰り返しをブレーク(Break)
- データ行を追加(AddDataRow)
- ピボット テーブルを作成(ExcelCreatePivotTable)
- ピボット テーブルを更新(ExcelReflashPivotTable)
- 項目を選択(SelectItem)
- 複数の項目を選択(SelectMultipleItems)
- SMTP メール メッセージを送信(SendMail)


###使った.NETの記述
#### .Directory.GetFiles
    System.IO.Directory.GetFiles("フォルダのファイルパス",".xlsx")
特定のフォルダからExcelファイルのパスを取得したい時に使用
ファイル形式を絞らない場合は`,".xlsx"`は省略可
これを配列型String変数に代入して繰り返し(コレクションの各要素)でループして特定のファイルを探し処理するという使い方をした
ちなみにこの書き方だとサブフォルダのファイルは取得できない
全部取得したい場合は以下らしい(試してないから未来の私用のメモ)

    System.IO.Directory.GetFiles("フォルダのファイルパス","*",System.IO.SearchOption.AllDirectories)


#### String.IsNullOrEmpty

    String.IsNullOrEmpty(変数)

指定した変数に文字列があるかないかで使用。戻り値はTrue,False
条件分岐で使用した


### ごめん、つづきは今後更新する
そのほかにも日付取得とか文字列をさがしたり分割したり
データテーブルに新しい行を追加したりもあるけど追々追加する
あとアクティビティ一覧の方も実際の使い方をリンク付けていきたいと思っている

こうして書いてみると今までいろんな人が書いた記事にお世話になっているけど、書く方は大変だね
記述が誤ってないか調べなおしたり、誤字が無いか何回も読んだり
それでも間違っているところがあると思うのでその時は都度更新する・・
未来の自分のためと、これから使う人に少しでも役に立てればという気持ちで投稿していきます
（そして記事書いてくれている人たち本当にありがとう！在宅で気軽に人に聞けなくても調べて開発できる）

2021年末にこれを見て、ここからどれほど新しいことを覚えたかを確認するのが楽しみだ
何も成長していませんでした！というのはなるべく避けたいなぁ・・
westonでネットブラウジングと日本語入力

娘もはや中学生となり学校の宿題で「しらべものがくしゅう」など課せられ広大なネットワークを自力で泳がなくてはならない昨今、やはり専用の端末も必要だよねということで古い古いパソコンをいまどきに仕立て上げて渡すことにした。いまどきなのでXではなくWaylandである。

## 諸元
TOSHIBA dynabook T552/47FK (2012 summer)

* BIOS: legacy bios
* CPU: core i5-3210M (ivy Bridge)
* MEM: 16G (増設済み)
* Storage: SSD 250 GiB (換装済み)

## 目標
* ネットができるー
* 日本語でメモが残せるー（Google keepにかければ良い）

## インストール手順
[本家参照](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)
以下では諸元で示した構成に必要な指定の抜粋を記載する。

### ベースシステムインストール
日本語キーボードなのでキーマップを一時的に変更する。

```sh
loadkeys jp106
```

base システムインストールでは固有のファームウェアもインストールする

```sh
pacstrap /mnt base linux linux-firmware intel-ucode ipw2200-fw
```

### ブートローダ
ローダーにはGrubを使用した。legacy bios なので `target` を指定する。

```sh
pacman -S grub
grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
```

### network
再起動後、ネットワークのDHCP設定を行う（ここではnetworkdを使っている）。

```sh
vim /etc/systemd/network/enp1s0.network
```


```conf:enp1s0.network
[Match]
Name=en*

[Network]
DHCP=ipv4
```

```sh
systemctl enable systemd-networkd systemd-resolved
```


### wifi
DHCP指定は有線設定と同様。

```sh
vim /etc/systemd/network/wlp2s0.network
```

```conf:wlp2s0.network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4
```

WPA（PSK）の設定には`wpa_supplicant`を使用する。

```sh
pacman -S wpa_sppulicant
```

```sh
vim /etc/wpa_supplicant/wpa_supplicant-wlp2s0.conf
```

```conf:wpa_supplicant-wlp2s0.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
	ssid="あなたの使用するSSID"
	psk=あなたの使用するパスフレーズハッシュ
}
```

`psk` はダブルクォートで囲むとパスフレーズを直書きできるけど、よいこはやってはいけない。いいね。

```sh
systemctl enable wpa_supplicant@wlp2s0
```

### user
そろそろrootを卒業。`sudo` も入れておく（下記では`sudo`は省略）。

```sh
useradd -m -g wheel あなたのなまえ
pacman -S sudo
EDITOR=vim visudo
```

### キーマップ変更
まずは仮想コンソールのキーマップを変更しておく。
これは後述の `weston` には全く反映されない。

```sh
vim /etc/vconsole.conf
```

```conf:/etc/vconsole.conf
KEYMAP=jp106
```

### font
とりあえず標準でインストール可能なIPAとnoto。

```sh
pacman -S otf-ipafont otf-ipaexfont
pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji
```

### browser
娘はchromeユーザーなので `weston`に`chromium` を入れてあげる。wayland向けのXラッパーである`xwayland`が必要。

```sh
pacman -S weston xorg-xwayland chromium
```

### 日本語入力
まぁどれでもお好きなものを。
今回は `uim + anthy` にしたよ。

```sh
pacman -S anthy uim
```

`chromium` で `uim` 使うときに必要な環境変数は下記でした。

```environment
LC_ALL=ja_JP.UTF-8
GTK_IM_MODULE="uim"
```

### ラップトップ向け
あとはラップトップ用にいくつか省エネ設定とバッテリー確認アプリを。

```
pacman -S tlp
systemctl enable tlp
systemctl start tlp
pacman -S upower
```

### weston設定
タッチパッドでタップやスクロール可能に。かつ日本語キーボードの設定など。


```config:~/.config/weston.ini
[core]
xwayland=true

[libinput]
enable-tap=true
natural-scroll=true
scroll-method=two-finger

[keyboard]
keymap_model=jp106
keymap_layout=jp
```

娘よ、それではよい計算機経験を！
[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)

#「基本的なAngularアプリをはじめる」をやってみる

Reactのチュートリアルをやってみたので、次はAngularのチュートリアルをやってみようと思っています。

##準備

###日本語版Angular公式ページ

[基本的なAngularアプリをはじめる](https://angular.jp/start "基本的なAngularアプリをはじめる")

Angular公式の日本語版のチュートリアルは、本日時点で上のリンクかと思います。
StackBlitzというもので、チュートリアルを進めていく形になっています。

ですが、このページの中にある「既製のサンプルプロジェクトをStackBlitzで生成」をクリックすると、残念ながらなぜかエラーになってしまいました。

（※ StackBlitzは、ブラウザベースの開発環境）

###英語版Angular公式ページ

[Getting started with Angular](https://angular.io/start "Getting started with Angular")

なので、本家の英語版の該当のページ（上のリンク）の「generate the ready-made sample project in StackBlitz.」をクリックしてチュートリアルを始めることにしました。

英語版のページだとサンプルプロジェクトを生成できました。
Railsのパンくずリストで2種類以上のトップページを実装する方法

こんばんは
アロハな男、やすのりです！

今日はポートフォリオで使用しているパンくずリスト用Gem`gretel`を導入時に少し躓いた、**『トップページを2種類以上実装する方法』**を説明していきたいと思います！

もし僕と同じことを実装したい方がいらっしゃったら参考にしてください！！

#結論
2種類以上のトップページを実装する場合は、

```ruby:config/breadcrumbs.rb
crumb :root do
  link "Home", root_path
end
```
という初期設定を

```ruby:config/breadcrumbs.rb
crumb :top_page do
  link "トップページ", root_path
end

crumb :mypage_top do |user|
  link "マイページトップ", user_path(user.id)
end

```
という様な記述に修正し、`root`という設定を無くす！！

#なぜトップページが2種類以上必要？
まずそもそもなぜ通常だと1つでいいトップページが2種類以上必要なのかについてですが、これは私のポートフォリオの作り方で『その方が見栄えが良さそうだったから』です。

...ここに関しては理論立てた説明はありません

例えば、ポートフォリオでの`検索結果ページ`や`詳細ページ`に遷移した際はもちろんトップページからの遷移歴が表示されます。
[![Image from Gyazo](https://i.gyazo.com/d91f52135e5950a4d9496ac2f5f2447e.png)](https://gyazo.com/d91f52135e5950a4d9496ac2f5f2447e)

しかし、`マイページ`内の`ユーザー情報編集ページ`に遷移した場合の遷移歴は、
[![Image from Gyazo](https://i.gyazo.com/345f82490a09136fe10e9a19de5895a8.png)](https://gyazo.com/345f82490a09136fe10e9a19de5895a8)
この様に、`トップページ`へのリンクはなく、`マイページトップ`へのリンクしかありません。

これがもし遷移歴に`トップページ`も表示させる様にすると、
[![Image from Gyazo](https://i.gyazo.com/6d96df3ce42e77ec1ae0b56c5d83dc4a.png)](https://gyazo.com/6d96df3ce42e77ec1ae0b56c5d83dc4a)
となってしまい、少し表示が多く見づらくなってしまうなと思いました。
※トップページへのリンクはヘッダー部分に設置してあるため、マイページから出られなくなる等といったことはありません。

#トップページを2種類用意するには？
`gretel`を使用する際に基本は`遷移先のリンクと表示用文字列`だけを記述し、親ページを設定したい時は別途設定を記述します。

```ruby:config/breadcrumbs.rb
crumb :root do
  link "トップページ", root_path
end

crumb :mypage_top do |user|
  link 'マイページトップ', user_path(user.id)
end

crumb :mypage_edit do |user|
  link '会員情報の確認・変更', edit_user_registration_path
  #ユーザー情報編集ページがマイページトップの中に位置する様に設定している。
  parent :mypage_top, user
end
```

ただし、何も設定をしていない場合でも`root`の設定と紐づいてしまいます。
そのため`ユーザー情報編集ページ`までの遷移歴を表示する際に紐づいている`トップページ`まで表示されてしまっているわけです。

『なら、`root`との紐付けを切り離すために、名前を変えちゃえばいいんだ！！』
ということで冒頭でお見せしたコードの出番ですが、

```ruby:config/breadcrumbs.rb
crumb :top_page do
  link "トップページ", root_path
end

crumb :mypage_top do |user|
  link "マイページトップ", user_path(user.id)
end

crumb :mypage_edit do |user|
  link '会員情報の確認・変更', edit_user_registration_path
  #ユーザー情報編集ページがマイページトップの中に位置する様に設定している。
  parent :mypage_top, user
end
```
というコード構成になります。
このコード構成にして再度`ユーザー情報編集ページ`を表示させることで、紐づいていない`トップページ`の表示が消えて`マイページトップ`からの遷移歴になるわけです。

#注意点
この実装方法をした場合に、1つ注意しなければならないことがあります。

それは、**『`検索結果ページ`に親ページを設定する必要がある』**ということです。

```ruby:config/breadcrumbs.rb
crumb :root do
  link "トップページ", root_path
end

crumb :search_word do |search_word|
  link "'#{search_word}' の検索結果", search_path
end
```
元々は`検索結果ページ`に何も設定しなくても`root`に紐づいていたので自動的に`トップページ`を表示してくれていましたが、名前を変更(今回であれば`top_page`)に変更してしまっているので、紐付けが解除され親ページが存在しない状態になってしまっています。

なので、

```ruby:config/breadcrumbs.rb
crumb :top_page do
  link "トップページ", root_path
end

crumb :search_word do |search_word|
  link "'#{search_word}' の検索結果", search_path
  #新たに設定したtop_pageというページを親ページとして設定する。
  parent :top_page
end
```
とコードを修正することで、元通りのパンくずリスト表示にすることができます。

#最後に
トップページを2種類以上実装するということ自体そんなに頻繁にすることではないと思いますが、もし実装する際にこの記事が参考になれば幸いです！

この件に関するご指摘・アドバイスはどんどんいただきたいと思っていますので、コメントお待ちしています！！
クイズ形式で学ぶPythonの変数の値の交換や多重代入の注意点

## クイズ

次のプログラムの出力結果を答えよ。

### 問1

```python:1
nums = [1, 2, 3]
i = 0
nums[i], i = i, nums[i]

print(nums)
```

<details>
<summary>答えを見る</summary>
[0, 2, 3]
</details>

### 問2

```python:2
nums = [1, 2, 3]
i = 0
i, nums[i] = nums[i], i

print(nums)
```

<details>
<summary>答えを見る</summary>
[1, 0, 3]
</details>

## 多重代入の実行順序

Pythonでは1行で複数の変数に値を代入することができます。

```python
x, y = 0, 1

print(x)  # 0
print(y)  # 1
```

また、これを利用して、変数の値を交換することができます。

```python
x = 0
y = 1

x, y = y, x

print(x)  # 1
print(y)  # 0
```

以下のように多重代入を使用せずに値を交換する場合と比べ、新たな変数もいらず、行数も短く済むので便利です。

```python
x = 0
y = 1

temp = x
x = y
y = temp

print(x)  # 1
print(y)  # 0
```

ただ、今回のクイズのように、単純な交換ではない場合は、実行順序に注意する必要があります。

代入文の右辺の変数の値は、代入文の実行前の値で確定しているのに対し、左辺の変数の値は、左から順に更新されていきます。

問1はこのようなコードでした。

```python:1
nums = [1, 2, 3]
i = 0
nums[i], i = i, nums[i]

print(nums)  # [0, 2, 3]
```

多重代入の右辺の`i`の値は0であり、右辺の`nums[i]`、つまり`nums[0]`の値は１です。

左辺の変数の値は左から順に更新されていくため、問１は以下のコードと同じことになります。

```python:1'
nums = [1, 2, 3]
i = 0

#    nums[i], i = i, nums[i]
# => nums[i], i = 0, nums[0]
# => nums[i], i = 0, 1
nums[i] = 0  # => nums[0] = 0
i = 1

print(nums)  # [0, 2, 3]
```
問2はこのようなコードでした。

```python:2
nums = [1, 2, 3]
i = 0
i, nums[i] = nums[i], i

print(nums)  # [1, 0, 3]
```

問2は以下のコードと同じことになります。

```python:2'
nums = [1, 2, 3]
i = 0

#    i, nums[i] = nums[i], i
# => i, nums[i] = nums[0], 0
# => i, nums[i] = 1, 0
i = 1
nums[i] = 0  # => nums[1] = 0

print(nums)  # [1, 0, 3]
```

## 参考

- [7.2. 代入文 (assignment statement) — 7. 単純文 (simple statement) — Python 3.9.1 ドキュメント](https://docs.python.org/ja/3/reference/simple_stmts.html#assignment-statements)
Python数学シリーズ⓪ 目次

## このシリーズについて
線形代数の理解を深めるためにpythonで実装しながら、理解を進めてます。気が向いたら、他の分野もやるかもしれません。

## 線形代数
① [転置](https://qiita.com/Hiroaki-K4/items/e34f3ee699c9caa1c87f)
② [行列の掛け算](https://qiita.com/Hiroaki-K4/items/036f8a25904284cfa71b)
③ [行列式(置換)](https://qiita.com/Hiroaki-K4/items/5f4d2a630d1800ebfea5)
macOS Big SurでESP8266の書き込みができなくなったときの対処方法

ESPr Developer（ESP8266）を使っているのですが、プログラムの書き込みができなくて困りました。
調べたところ、Big Surだとそうなるらしいです。以下のサイトを参考にして、対処しました。
https://forum.arduino.cc/index.php?topic=702144.0

# 対処方法

1. ~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools/list_ports_osx.py を開く
1. 29行目と30行目をコメントアウトし、以下に示すように変更する。

```python

#iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
#cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
iokit = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/IOKit.framework/IOKit')
cf = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')
```

これで、書き込みができるようになった！
condaの更新が終わらない。


Anaconda prompt で condaの更新がいっこうに終わらない。

```
conda update -n base conda 
``` 

Solving Environment: |
のメッセージが出て | がグルグルずっと回っている。1時間以上ずっと回っている。
プロセス表示したら、どうやらPythonがCPU使ってるのでちゃんと何かをしているよう。

不安になるのでdebugオプションつけたら

```
conda update -n base conda  --debug 
``` 
こんな感じで依存性解決をずーっとやっているようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130481/416325e4-b088-1bf9-e7aa-39c1646305ec.png)

最後の一行がおかしい。SATの問題。8千万の節があるっていっている。

```
DEBUG conda.common._logic:_run_sat(607): Invoking SAT with clause count: 83289605
```

メモリ見たら案の定。メモリが足りん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130481/099a7d55-d5ea-e400-4867-ddb71fb0ef34.png)


これどうしたらいいの？
[Node.js] 新規アプリケーションの製作方法

#環境構築をする
1. nodebrewをインストールする
2. Node.jsをインストールする

詳しくは以下でまとめています。
https://qiita.com/momo1010/items/dab9c70bfe84a78f23e2

#好きな場所にアプリケーション用のディレクトリを作成する
アプリケーション用のディレクトリの作成と移動のコマンドを実行します。

```
$ mkdir sample
$ cd sample
```

#エディタを起動して先程作成したフォルダを開く
今回エディタは `Visual Studio Code` を使用します。
`Open Folder...` から先程作成したフォルダを選択します。

#パッケージをインストールする
以下のコマンドを実行すると、 `npm` の設定ファイルである `package.json` が生成されます。`package.json` には、 npmパッケージの設定情報などが書き込まれています。

```
$ npm init --yes
```

次に、npmパッケージのインストールをします。今回は、 `express` と `ejs` をインストールします。

```
$ npm install express ejs
```

##nodemonをインストールする
jsファイルの変更を反映するには、毎回サーバーを再起動する必要があります。その作業を省くために `nodemon` という、ファイル更新時に自動でサーバーが再起動するようになるnpmパッケージをインストールします。

```
$ npm install -g nodemon
```

#サーバーを起動してページを表示する
`Visual Studio Code` で必要なファイルを作成します。
`node_modules` フォルダと `package-lock.json` `package.json` ファイルがnpmパッケージのインストールをしたときに既に生成されています。

## `app.js` ファイルを作成する
追加で `app.js` ファイルを作成します。 `app.js` ファイルに以下のコードをコピーして、貼り付けてください。

```
const express = require('express');
const app = express();

//CSSや画像ファイルを置くフォルダ（public）を指定するコード
app.use(express.static('public'));

app.get('/', (req, res) => {
  res.render('hello.ejs');
});

app.listen(3000);
```

## `views` フォルダを作成する
`views` フォルダを作成し、　`hello.ejs` ファイルに以下のコードをコピーして、貼り付けてください。

```
<h1>Hello World</h1>
```

## `public` フォルダを作成する
`public` フォルダの中に `css` フォルダや `images` フォルダを作成します。

##サーバーを起動する
nodemonを使ってサーバーを起動していきます。

```
$ npx nodemon app.js
```

ブラウザを開いて `localhost:3000` というURLにアクセスして `Hello World` と表示されれば成功です。