OmniAICreator/Qiita-1.07M huggingface dataset:
RedmineではProject.find(<identifier>)でプロジェクトを取得できる

redmineの[プラグインチュートリアル](http://guide.redmine.jp/Plugin_Tutorial/) でも多様されている表現ですが、個人的にはfind()はidのみに使った方が良いと思います。

# なぜできるか？

Redmineのコードで以下のようにオーバーライドしているから。

app/models/project.rb

```ruby
  def self.find(*args)
    if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/)
      project = find_by_identifier(*args)
      raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if project.nil?
      project
    else
      super
    end
  end
```
flutter+firebaseでユーザ認証を実装したときの備忘

---
# :book: Flutterの記事を整理し本にしました :book:
https://zenn.dev/kazutxt/books/flutter_practice_introduction

* <font color="red"><b>本稿の記事を含む様々な記事を体系的に整理し本にまとめました</b></font>
* 今後はこちらを最新化するため、<font color="red"><b>最新情報はこちらをご確認くださ</b>い</font>
* 10万文字を超える超大作になっています(笑)

---

# はじめに
* flutterのandroidアプリに認証機能を作りたくなったので、firebaseを使って実装しました
* 今回は一番シンプルなEmail/Passwordによる認証だけです
* Androidだけを対象にしており、iOSは省略しています
    * GoogleAuthはフィンガープリントだけで比較的実装しやすいようですが、その他(Twitterなど)はAPIを払い出すなどが先に必要です。


# 手順
## Firebase側
* Firebaseでプロジェクトを作成する
* androidのアイコンをクリックし、アプリ登録をする
    * IDはandroid/app/build.gradleにあるdefaultConfig内にあるapplicationIDを使う
*  google-services.jsonをandroid/appにコピーする
* Authentication → Sign-inmethod →メール/パスワードを有効にする

## Flutter側
* 依存関係に以下を追加
    *  firebase_core: ^0.5.0
    *  firebase_auth: ^0.18.0
* トップレベルの方のbuild.gradleのdependenciesに以下を追加
    * classpath 'com.google.gms:google-services:4.2.0'
* appの下のbuild.gradleのdependenciesに以下を追加
    * apply plugin: 'com.google.gms.google-services'
 
``` sample.dart
testEmailAuth() async {
    await Firebase.initializeApp();
    // 登録
    try {
      //1回目はOK.2回目以降は重複エラー
      final User user =
          (await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: "test1@email.com",
        password: "password",
      ))
              .user;
      print("登録OK ${user.uid}");
    } catch (e) {
      print("登録NG $e");
    }
    // 認証
    try {
      //登録済のためOK
      final User user = (await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: "test1@email.com",
        password: "password",
      ))
          .user;
      print("登録OK ${user.uid}");
    } catch (e) {
      print("登録NG $e");
    }
    try {
      //登録していないためNG
      final User user = (await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: "test2@email.com",
        password: "password",
      ))
          .user;
      print("登録OK ${user.uid}");
    } catch (e) {
      print("登録NG $e");
    }
  }
```

* ユーザtest1の登録(登録がないときは成功、登録済のときは失敗を期待)
* ユーザtest1の認証(成功を期待)
* ユーザtest2の認証(失敗を期待)


![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/3563dc5d-e281-c141-2553-49c99d6e52a2.png)

# 参考資料
* https://www.flutter-study.dev/firebase/authentication/
* https://firebase.google.com/docs/android/setup?hl=ja
大人のOC（オープンコンテンツ）活動のススメ

久しぶりのブログで、若干のポエムが付きます。
最近ひょんなことから、「作業中のリポジトリ」を公開しています。

下記の３点がメイン内容です

1.後で見直すマン

2.創作過程が参考になるといいな

3.社会の闇っぽい話があったので

1.後で見直すマン
　ソースコードの実装ではなくて、以下の２点が主です。
　
   1-1.システム構成（テストコード/実行用画面レイアウト/MVCを作った当時の中身
   
   1-2.普段よく使っているアルゴリズムを見直せるように

2.創作過程が参考になるといいな
以下のリポジトリが具体例ですが、毎日の作業で区切りいいところまでで、コメント付きでpushしています

![開発過程_自分リポジトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/363c2418-0dec-d504-7227-41412bbcf88b.png)


もう少し範囲を絞った場合(*'ω'*)

https://github.com/sakuriver/FuelPhpGate/pull/2/commits

「なるほどー、最初に画面を作るのかー(*'ω'*)」

「ふむふむ、ゲームの中身は画面とか動き出たら調整しているんだな(*'ω'*)」

というように読み取ってもらうために一度にカッコよくpushしないようにしていました。

「差分が全てだと辛いしなー(*'ω'*)」

というお話もあります

3.社会の闇っぽい話があったので

自分は9～10年間で遭遇したことはなかったのですが「ソースコードの流用」というのがあるのを今日知りました。

「会社のソースコード持ち出すのは万引きっぽいなぁ。給料もらっているし(*'ω'*)。。。」

とおもったので、今回リポジトリの記事を書こうと決断しました。


問題が発生していた原因として以下のプログラマ界隈的なお話があるということでした。

・どう使ったらいいか分からない
・何の価値があるのか分からない

というお話を聞いて「一理ある(*'ω'*)」と思いました。

そこで、個人的提案として以下がいいかなと考えて進めています

1.すぐに実行できるサンプルコードと動かした後の動画をセットにする

自分が書籍を勉強している場合ですが、章のまとめとして動かしたプログラムのファイルになります。

https://github.com/sakuriver/PerfectRubyStudy/blob/master/For/super_structure.rb

実行した結果の動画は以下

https://www.youtube.com/watch?v=QTukM0qTXTs&t=7s


＊話を聞いていて、思ったのは「基盤プログラム」と「実際に使われている動いているコード」と「動作している動画」がセットでないと、「組み合わせで学習する方」にとっては大変だー(*'ω'*)
となってしまうというお話でした。

OSCやオリキャラ活動をすると以下の快感が得られるようです。
「俺、個人をパクったのか。」
「よかった、会社のソースコードを持ち出さなかったんだね」

加えて、「自分が作業をしている会社さんでソースコードを盗む人」が入社する確率を下げられるので、「セキュリティ」が上がるかなーと思いました
MMU(Memory Management Unit，メモリ管理機構)

AP試験学習記録27年秋 午前10

MMU(Memory Management Unit)の説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/569244bc-244d-0188-00f1-de7f52552f95.png)

１、MMU(Memory Management Unit，メモリ管理機構)は、
主記憶を管理するためのハードウェア機構で、アドレス変換機能やメモリ保護機能、キャッシュ制御機能、及びバス調停機能などを持っています。

このうちアドレス変換機能とは、仮想記憶で扱う論理アドレスと実アドレス(物理アドレス)の対応付けを TLB(Translation Lookaside Buffer)で管理し、CPUからのアクセス要求に応じて2つのアドレスを高速に相互変換する機能です。

２、
・CPUからのページフォールトを受けて，物理ページのスワップを行う。
　→×。MMUはページフォールトをOSに通知する役割を持ちます。

・CPUが指定した仮想アドレスを物理アドレスに対応させる。
　→○。

・OSの一部分であり，キャッシュ制御機能及びバス調整機能を有する。
　→×。MMUはハードウェア部品のためOSの一部ではありません。

・主記憶のデータの一部を保持し，CPUと主記憶の速度差を吸収する。
　→×。キャッシュメモリの説明です。

参照：
https://www.ap-siken.com/kakomon/27_aki/q10.html
[Scala]implicitの備忘録

implicitの基本的なことを忘れていたので、自戒を込めて。


## ？？？な点
elastic4sライブラリを読んでいて、以下のような実装で「？？？」となった。

```scala

def execute[T, U, F[_]](t: T)(implicit
                                executor: Executor[F],
                                functor: Functor[F],
                                handler: Handler[T, U],
                                typeTag: TypeTag[U],
                                options: CommonRequestOptions): F[Response[U]] = {
}

```

下記コードのように`execute`メソッドを呼び出すのだが、呼び出しもとで、どこにもimplicit valを定義していないのに、コンパイルが通った。

```scala

client.execute{
???
}
```


## 解決
implicit引数を受け取る場合、コンパイラはスコープ内から、implciitで定義された`val` `def`を探し出して、適応させる。
スコープ内とは、呼び出し元のクラス・オブジェクト内や、implicit引数の型のクラス・オブジェクト内のを指す。

なので、今回の上記コードで言うと、`object Executor`や、`class Functor`に定義された`implicit val def`の値を適応させる。

詳細は次項目で解説。

## 簡単な例

### 呼び出しもとで、implicit val defを定義している場合

以下コードの場合は、"aaa"が返る。
なぜなら、executeメソッドの呼び出しもとで、`implicit val`を定義しているから。


```scala

case class Test(name: String)


object Test {
  implicit val default = Test("default")
}


def execute(implicit test: Test) = {
  test.name
}


implicit val aaa = Test("aaa")

execute
// => "aaa"

```


### 呼び出しもとで、implicit val defを定義していない場合

以下コードの場合は、"default"が返る。
なぜなら、implicit valは渡しておらず、コンパイラはスコープ内から、implicit val implicit defを探し出して
execute(implicit test: Test)に適応させるから。


```scala

case class Test(name: String)


object Test {
  implicit val default = Test("default")
}


def execute(implicit test: Test) = {
  test.name
}


execute
// => "default"
```


## まとめ

implicitのスコープをきちんと理解していなかった。
バージョン管理をしたくないファイル　操作

#バージョン管理したくないファイル操作方法

.gitignoreというテキストファイルに特定のファイルを記入する。

####書き方
```
//.gitignoreファイル
abc.txt //ファイル名を記入する
.txt　//特定の拡張子を指定する
!test.txt //例外としてtest.txtは無視されないようにする
/log/ //ルートディレクトリのサブディレクトリのlog以下が無視される
```


####すでにコミットしてあるファイルを無視する方法
追跡を止める→.gitignoreに記入する

SoureTreeの場合
ファイルステータスからドロップダウンボタンからすべてを選択し、無視したいファイルを右クリックで選択し追跡をやめるを押しコミットする。
あとはgitignoreファイルに記入する。
Raspberry Pi 4 と Raspberry Pi OS をヘッドレスでセットアップ

# はじめに

Raspberry Pi 用に microSD に OS 書き込んだ後、予め色々設定しておきたい。
毎回やること一緒なのに毎回調べ直しているのでメモる。

少なくとも以下の環境で確認しています。

- Raspberry Pi 4 Model B (8GB)
- Samsung EVO Plus 128GB microSDXC UHS-I U3
- OS の書き込みは [Raspberry Pi Imager](https://www.raspberrypi.org/downloads/)
  - Raspberry Pi OS Lite

# 64bit kernel 有効化

boot パーティション内の `config.txt` に `arm_64bit=1` を追記する。
追記先は最終行 [all] セクションの中でOK。

# SSH 有効化

boot パーティション内に `ssh` というファイル名（拡張子無し）で空ファイルを配置する。

# IPアドレス固定化

rootfs パーティション（Windowsじゃ開けません）の `/etc/dhcpcd.conf` を書き換える。

## 有線の場合

```
interface eth0
static ip_address=192.168.1.20/24
static routers=192.168.1.254
static domain_name_servers=192.168.1.254 8.8.8.8
```

# ちなみに電源投入後

## SSH接続して初期設定

microSD を差し込んで電源を入れたあとは、PC から PING で疎通確認

```
(PC) $ ping raspberrypi.local
```

して、おもむろに SSH 接続（ ユーザ名: pi / パスワード: raspberry ）

```
(PC) $ ssh pi@raspberrypi.local
```

して、適当に初期設定する。

```
(RPi) $ sudo raspi-config
```

## ロケール設定

[Can't set locale; make sure $LC_* and $LANG are correct!](https://qiita.com/mtkhs/items/fbfac2e50437bda966fe)

## スワップ無効化

```
$ sudo swapoff --all
$ sudo apt remove dphys-swapfile
```

## ファームウェア確認

```
$ sudo rpi-eeprom-update
```

## アップデート

```
$ sudo apt update
$ sudo apt full-upgrade
$ sudo apt-get autoremove
$ sudo apt-get autoclean
```
express-validatorの使い方メモ

#　はじめに
expressを使ってユーザー認証機能を作ったときに使った`express-validator`について使い方をメモ


#　使い方


```router.ts
import express, { Request, Response } from 'express'; // TSなので型もインポート。一応。
import { body } from 'express-validator';

const router = express.Router();

router.post(
  '/api/users/signup',
  [
    body('email')  // req.body.emailがメールかどうかをvalidateしてくれる
      .isEmail()
      .withMessage('Email must be valid'),  // invaludであればメッセージを返す
    body('password')
      .trim()
      .isLength({ min: 4, max: 20 })  // req.body.passwordの文字数を指定
      .withMessage('Password must be between 4 and 20 characters')  // invaludであればメッセージを返す
  ],
  (req: Request, res: Response) => {  // 一応TSなので型を明記
    const { email, password } = req.body;

    if (!email || typeof email !== 'string') {
      res.status(400).send('Provide a valid email');
    }

    // new User({ email, password })
    // ここからユーザーを作成する
  }
);

export { router };

```
ハッシュ表に格納する衝突が起こるキーの組合せ

AP試験学習記録27年秋 午前5


キーが小文字のアルファベット1文字（a, b, …，z のいずれか）であるデータを，大きさが10のハッシュ表に格納する。ハッシュ関数として，アルファベットのASCIIコードを10進表記法で表したときの1の位の数を用いることにする。衝突が起こるキーの組合せはどれか。ASCIIコードでは，昇順に連続した2進数が，アルファベット順にコードとして割り当てられている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/28ac4296-163d-9f58-c5d9-8ba7b54fc408.png)



＜＜ASCII＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ba6d18b2-81fa-fa76-8e8b-49cf6112e06e.png)

a 97
b 98
c 99
d 100 ->１の位の数は１です。

i 105
r 114
l 108
x 120

dとxが衝突ですね。


でも、これは本当ですか？
１の位の数は１のは結構多いですね、衝突がいっぱいがあるでしょう。


たぶん、質問は、下記の意味でしょうね。
間隔が１０の２つアルファベットが衝突になりますね。

例えば
a　⇔　k,u
b　⇔　l,v
c　⇔　m,w
d　⇔　n,x
...

データキー  ハッシュ
a             1
b             2
c             3
d             4
e             5
f             6
g             7
h             8
i             9
j             10
k             1
l             2
m             3
n             4
o             5
p             6
q             7
r             8
s             9
t             10
u             1
v             2
w             3
x             4
y             5
z             6


参照：
https://www.ap-siken.com/kakomon/27_aki/q5.html
FedoraベースでOpenLDAPサーバのDockerコンテナイメージを作った

# これはなに？

OpenLDAPサーバをDockerで立てます。

# やりかた

拙作ではありますが、Docker Hubにある[イメージ](https://hub.docker.com/repository/docker/sengokyu/openldap)をご利用ください。

```console:
docker pull sengokyu/openldap
```

ベースとなるDNを指定して起動します。今回は`dc=example,dc=com`にしています。

```console:
docker run -d -p 389:389 -e SUFFIX=dc=example,dc=com sengokyu/openldap
```


# Apache Directory Studioから接続

Apache Directory Studioを起動します。


LDAP > New Connection... メニューを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/0bfc598e-013e-cbc4-9eaa-4e7e2a2c3bb3.png)

Hostnameにlocalhostと入力して、Nextをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/6dfb9ead-5ee5-4860-dfae-919ea3b46c14.png)


Bind DN or userとパスワードを入力して、Finishをクリックします。

Bind DNにはRoot DNを入力します。
Root DNとパスワードが未指定の場合、以下の値で起動するようにしています。

<dt> DN
<dd>cn=root,(指定したSUFFIX)
（上の例では、`cn=root,dc=example,dc=com`になります）
</dd>
<dt>パスワード
<dd>slappasswd
</dd>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/5c1c7769-71bc-312b-1ae9-168b8140dca2.png)

接続できました。


# Dockerイメージについて

Fedoraをベースに作成してます。

2020年10月時点では、以下のバージョンになります。

* Fedora release 32
* OpenLDAP 2.4.47
Ruby クラスとインスタンス

# はじめに
これは学習用のメモになります。

Rubyでは、「オブジェクト」や「変数」などたくさん用語が出てきて大変なので、少しずつでも理解を早めるために自分なりにアウトプットしていきたいと思います。
もし、違うところがあればコメントしていただけると幸いです。

# クラスとインスタンスとは？
クラスとインスタンスを理解するためには「オブジェクト」と「メソッド」という言葉を理解する必要があります。

説明は以下...
## オブジェクト
オブジェクトとは`「Rubyにおける全てのデータ」`のことです。

例えば「おはよう」といったような文字は「文字列オブジェクト」、「１２３」といった数字は「数値オブジェクト」と呼ばれています。

## メソッド
`オブジェクトが持つ「処理」`のことをメソッドと言います。
Rubyのオブジェクトは全て「メソッド」を持っています。
例えばこんな感じで、

・文字列オブジェクト　→　lengthメソッド　→　文字数を数える
・数値オブジェクト　→　to_sメソッド　→　整数に変換する

といったようにオブジェクトの種類ごとに持っているメソッドが違います。
例えると、人はそれぞれ性格が違うよねってことです。


## クラス
クラスとは`「共通のプロパティとメソッドをまとめたもの」`のことで、今回は、「クルマの設計図」を例として考えます。
クルマを作る時には設計図が必要ですが、どのクルマにも共通する部分があるわけです（ハンドル・ブレーキで「加速する」など）。その「共通した部分を設計図にしてまとめよう」ってことです。

つまり、クラス（設計図）を作って、他のクルマを作る時でも使えるようにできる仕組みです。

## インスタンス
インスタンスは`「クラスから属性や処理を受け継いでできたオブジェクト」`のことです。

クラス（設計図）をベースに作られたオブジェクト（クルマ）といえばわかりやすいでしょうか。必要最低限の部分を引き継いでいるので、「ハンドルがあって〜」一からなどど設計図を作らなくて済むのがメリットになります。
Vue+Quasarを一週間触ってみて

#実務で使うために学んだこと
**[Quasar](https://quasar.dev/)とは**![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475069/2c6e6354-7f19-ab84-102b-b20d78fd717c.png)
>VueベースのFramework
便利な備え付けコンポーネントがいっぱい
StyleやLayoutも簡単にできる
レスポンシブデザインも簡単に実装できる
簡単なbuild process(quasar CLIを使えば脳死でビルドできる)
SPA/PWA/SSR/Mobile App/Desktop appなどを高速で始められる
MobileはCordova
DesktopはElectron
いわゆるマルチプラットフォームなアプリケーションをVueと備え付けのコンポーネントで爆速で作れるフレームワークというわけです。(しかも全て同じコードで)
お隣さんはIonic FrameworkやFramework7など

## キャッチアップするためにしたこと

**ドキュメントを読み込む**
https://quasar.dev/start/pick-quasar-flavour

**動画でアプリを作りながら手を動かす**
Todoアプリ
https://www.youtube.com/watch?v=GV-D85D9KJQ&t=2118s
写真共有アプリ？
https://www.youtube.com/watch?v=Ud8jS3VlVHw

## Grid Gutter の使い方
https://quasar.dev/layout/grid/gutter
基本的に　.row クラスにつける　.q-col-gutter-md 等　コンポーネントに均等にpaddingで余白をつけれる

```Javascript:index.vue
<div class="row q-col-gutter-md"></div>
```

## name属性をつけて　Vue Devtoolで見たときにどのファイルかわかる様にする
 scriptタグの中に書く

```Javascript:MyLayout.vue
<script>
name:"MyLayout" //Vue DevtoolでMyLayoutと表示される
export default {
//
}
</script>
```

## $qというものがQuasarで用意されていて {{ $q }} で色々なプロパティが参照できる
```Javascript:index.vue
<template>
  <q-page>
    {{ $q }}
  </q-page>
</template>
```

### Vueファイルでのレスポンシブでのクラスの付け替え
https://quasar.dev/style/breakpoints

```Javascript:index.vue
<template>
  <div class="row" :class="{'q-mb-md' : $q.screen.lt.sm }" >
</template>
// コードの読み下し
// スクリーン幅がスモール( 1023px ) 以下がtrueであれば、クラス'q-mb-md'を追加する
```


### computedプロパティを使用したスタイルの追加

```Javascript:index.vue
<template>
  <span :style="testStyle">test</span>
</template>

<script>
export default {
computed: {
  testStyle() {
      return this.$q.screen.xs ? { color: 'red' } : { color: 'blue' };
    }
  };
}
</script>
// コードの読み下し
// スクリーン幅がxs( 599px )以下の場合 color: redを違う場合はcolor:blueを適用する
```



#### よくするミス①

```javascript
<span :style="testStyle">test</span>
// :styleの :を忘れてスタイルが効かない :style= 正　style= 偽
```
#### よくするミス②

```javascript
computed: { 
  testStyle() {  
    return this.$q.screen.xs ? {color: 'red'} : { color: 'blue' } ; 
  }
};
// の{ color: '' }このシングルクォートが無くて　スタイルが効かない　 {color: 'red'} 正　{color: red} 偽
// 数字の場合は良い　line-height 1.5とか　文字列は''が必要
// {line-height: 1.5} 正　{color: red } 偽
    }
```
peco を使ってブランチのチェックアウトを行う (リモートブランチ と ローカルブランチ)

# peco を使ってブランチのチェックアウトを行う (リモートブランチ と ローカルブランチ)

https://qiita.com/m-tmatma/items/6bb6b7c8a515a5424843 の改良版。

## gist

https://gist.github.com/m-tmatma/05b9573ad64ef67eb3662d62bb6d0a20

## リモートブランチ

### スクリプト

```
coremote () {
    remotename=`echo $1 | sed -r "s#([^/]+)/.*#\1#"`
    branchname=`echo $1 | sed -r "s#[^/]+/##"`
    
    git branch | grep "..$branchname$"
    if [ $? = 0 ]; then
         git checkout    $branchname
    else
         git checkout -b $branchname $remotename/$branchname
    fi
}
alias cor='export -f coremote; coremote $(git branch -r | grep -v "/HEAD" | peco)'
```

### 改善ポイント

* リモートブランチに対応するローカルブランチが存在したら、新たにブランチは作らずに既存ブランチをチェックアウトする。
* `origin/HEAD` の行を除外する。
* xargs をやめて $(コマンド) にした

初版は以下のようにしていた。

```
alias cor='export -f coremote; git branch -r | grep -v "/HEAD" | peco | xargs -I{} bash -c "coremote {}"'
```


### 使い方

```
$ cor
```

上下キーあるいは検索文字列を入力してチェックアウトしたいリモートブランチを指定する。
もしローカルに同一名のブランチが存在したらそのローカルブランチをチェックアウトする。
もしローカルに同一名のブランチが存在しなかったリモートブランチを同一名のローカルブランチを作成してチェックアウトする。


## ローカルブランチ

### スクリプト

```
colocal () {
    branchname=`echo $1 | sed -r "s#^../##"`
    git checkout    $branchname
}
alias col='export -f colocal; colocal $(git branch | peco)'
```

### 改善ポイント

* xargs をやめて $(コマンド) にした

初版は以下のようにしていた。

```
alias col='export -f colocal; git branch | peco | xargs -I{} bash -c "colocal {}"'
```

### 使い方

```
$ col
```

上下キーあるいは検索文字列を入力してチェックアウトしたいローカルブランチを指定する。
nodebrewでNode.jsを最新化してnpm install -gし直すルーティンをスクリプトにした

[nodebrew](https://github.com/hokaccha/nodebrew) を使って Node.js のバージョン管理をしている場合、 npm のグローバルパッケージを移動させるのがしんどいです。

## ふだんの手順

#### 1. グローバルインストールされている npm のパッケージ一覧をメモする

こんなことしますよね。

```shell-session
$ npm ls -g --depth 0
/Users/kulikala/.nodebrew/node/v14.13.1/lib
├── @aws-amplify/cli@4.29.6
├── @vue/cli@4.5.7
├── aws-cdk@1.67.0
├── firebase-tools@8.12.1
├── nativescript@7.0.10
├── npm@6.14.8
└── npm-check-updates@9.0.4
```

コピペしてメモを残したりします。 

#### 2. nodebrew で最新の Node.js のバージョンをインストールする

```shell-session
$ nodebrew install latest
$ nodebrew use latest
```

#### 3. 控えておいた npm パッケージたちを再インストールする

```shell-session
$ npm i -g @aws-amplify/cli @vue/cli aws-cdk firebase-tools nativescript npm-check-updates
```

nodebrew には、 `migrate-package` というちょうど良さそうなコマンドがありますが、シンボリックリンクで処理してしまうので、ちょっと都合が悪かったりします。
クリーンに新規インストールした方が `node_modules` フォルダがキレイになるので、自分はいつもこの方法です。

```
nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
```

#### 4. 古い Node.js のバージョンをサヨナラする

```shell-session
$ nodebrew uninstall <古いversion>
$ nodebrew clean all
```

# ルーティンをスクリプトにした

Bash 使いなので Bash で書きました。
`.bash_profile` に次の内容を転記しておくと、 `update_node` コマンドで全てルーティンをやってくれます。

```bash:.bash_profile
update_node () {
  check_env () {
    if ! command_exists nodebrew; then
      echo 'This script updates node via nodebrew.' 1>&2
      echo '    Please install nodebrew.' 1>&2
      echo '    https://github.com/hokaccha/nodebrew' 1>&2
      return 1
    fi

    if ! command_exists jq; then
      echo 'This script uses jq as JSON parser.' 1>&2
      echo '    Please install jq.' 1>&2
      echo '    https://stedolan.github.io/jq/' 1>&2
      return 1
    fi
  }

  command_exists () {
    command -v "$@" > /dev/null 2>&1
  }

  get_node_ver () {
    nodebrew ls \
      | grep current: \
      | cut -d ' ' -f 2
  }

  npm_ls_global () {
    npm ls -g --depth 0 --json \
      | jq --raw-output '.dependencies [].from | select(. != null)'
  }

  if ! check_env; then
    return 1
  fi

  echo 'Updating node...'

  local NODE_CURRENT="$(get_node_ver)"

  echo "Current node: ${NODE_CURRENT}"

  local NPM_GLOBAL="$(npm_ls_global)"

  nodebrew install latest
  nodebrew use latest

  local NODE_LATEST="$(get_node_ver)"

  if [ "${NODE_CURRENT}" = "${NODE_LATEST}" ]; then
    echo 'Already up to date.'
    return 0
  fi

  npm i -g ${NPM_GLOBAL}

  nodebrew uninstall "${NODE_CURRENT}"
  nodebrew clean all

  echo
  echo "Node is updated to: ${NODE_LATEST}"
}
```

# nodebrew について

[node.jsのversionを管理するためにnodebrewを利用する](https://qiita.com/sinmetal/items/154e81823f386279b33c)
確率の乗法定理

AP試験学習記録27年秋 午前3

3台の機械A，B，Cが良品を製造する確率は，それぞれ60%，70%，80%である。機械A，B，Cが製品を一つずつ製造したとき，いずれか二つの製品が良品で残り一つが不良品になる確率は何%か。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/611d6d37-0760-c743-a56b-b363b2ac0fd0.png)


１、確率の乗法定理
各々が独立した事象Aと事象Bがあり、起こる確率がそれぞれP(A)，P(B)であるとき、事象A，Bが同時に起こる確率は次の式で求められます(確率の乗法定理)。

　P(A∩B)＝P(A)×P(B)

また、事象Aが起こらない確率P(A)は 1－P(A) で表します。

２、
設問にある二つの製品が良品で残り一つが不良品になるケースには以下の3通りがあります。

[Aが不良品、B，Cが良品の確率]
(1－0.6)×0.7×0.8＝0.224

[Bが不良品、A，Cが良品の確率]
0.6×(1－0.7)×0.8＝0.144

[Cが不良品、A，Bが良品の確率]
0.6×0.7×(1－0.8)＝0.084

それぞれの事象は排反事象であるため、二つの製品が良品で残り一つが不良品になる確率は、
0.224＋0.144＋0.084＝45.2%です。

・排反事象とは
「同時に起こらない」事象のことです。 

参照：
https://www.ap-siken.com/kakomon/27_aki/q3.html
AWSにEC2上にdockerを使用したlaravelをデプロイ④（gitクローン〜デプロイ、マイグレーション）

##概要##

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

##EC2インスタンス内にGitをクローン##
Gitのリモートレポジトリにある任意のlaravelプロジェクトをEC2インスタンス内にクローンします。

```
root@ip:/home/ubuntu# git clone [任意のレポジトリURL]
```

##Dockerコンテナの立ち上げ##
cloneした自分のフォルダ(docker-compose.ymlのある)へ移動し、コンテナを立ち上げます。

```
root@ip:/home/ubuntu/awstest# docker-compose up -d
root@ip:/home/ubuntu/awstest# docker-compose ps
    Name                   Command               State           Ports        
------------------------------------------------------------------------------
awstest_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp             
awstest_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp  
awstest_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:10080->80/tcp
```
この様に立ち上がればOKです。

**苦戦した箇所**
docker-compose.ymlのバージョンエラーが出てエラー内容通り

```
root@ip-172-31-35-36:/home/ubuntu/awstest# vi docker-compose.yml
version: "3.3" ←3.8から3.3に変更
  
```
とversionを変更しました。
さらにgitへのpushが間違っていた為docker関連のファイルが無く立ち上がりませんでした。
こんなミスするヤツ自分以外いないと思いますが万が一同じ人がいたらファイルの確認をしてみて下さい。

##Laravel環境設定##
Laravelが使えるように環境設定をしていきます。
appコンテナに入ります。

```
root@ip:/home/ubuntu/awstest# docker-compose exec app bash
```
Laravelプロジェクト内の環境設定を行う.envファイルは.gitignoreにて指定されているため、Gitリポジトリにプッシュされません。
なので再度作成します。

```
root@:/work# cp .env.example .env
```

.envを作成したらcomposer install、そしてAPP_KEYも発行します。

```
root@:/work# composer install

root@:/work# php artisan key:generate
```

##プロジェクト内の権限変更##
プロジェクト内のファイルに対する権限を変更します。

通常では storage/logs と vendor の権限を変更すればOKみたいです。

ここでもエラーが起き少し苦戦しました。

file_put_contentsエラーでViewが開かない

```
root@:/work# chmod 777 storage/logs vendor
root@:/work# chmod 777 storage/framework/views
root@:/work# chmod 777 storage/framework/sessions
```
ここまでやってようやくTOPページが開ました。

http://[設定したElastic IPアドレス]:10080にブラウザからアクセスします。

![スクリーンショット 2020-10-11 13.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/778706/b7e7c97b-4c47-4fa0-49d1-9d05b623ee7f.png)

この様に表示されればOKです。

##マイグレーションを実行する##

```
root@:/work# php artisan migrate
root@:/work# php aritsan db:seed
```

ここまでやればローカルで作成したアプリが動くと思います。

以上で「AWSにEC2上にdockerを使用したlaravelをデプロイ」を終了させていただきます。
ありがとうございました。

**前回の記事**
[AWSにEC2上にdockerを使用したlaravelをデプロイ③](https://qiita.com/JXnj8uVrUkiBh90/items/374868750adc36179148)

＊＊間違い等ございましたらご指摘お願い致します＊＊
ESLint 7.11.0

前 [v7.10.0](https://qiita.com/mysticatea/items/099c7559e6c9e5e6769a) | 次 [v7.12.0](https://qiita.com/mysticatea/items/919b15bef14b9d6f553a)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.11.0 has been released:<a href="https://t.co/znenTYhIQT">https://t.co/znenTYhIQT</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1314669509979013121?ref_src=twsrc%5Etfw">October 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.11.0` がリリースされました。機能追加は行われていませんが、[ESLint の semver ポリシー](https://github.com/eslint/eslint#semantic-versioning-policy) (指摘が増えるかもしれないバグ修正はマイナーバージョンで行う) に従ってマイナーバージョンが上がっています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

特になし
ESLint 7.10.0

前 [v7.9.0](https://qiita.com/mysticatea/items/e3f6cc2725e420e29824) | 次 [v7.11.0](https://qiita.com/mysticatea/items/856e2605f82eb6bb3e01)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.10.0 has been released:<a href="https://t.co/yfWn9gmynR">https://t.co/yfWn9gmynR</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1309979954008993793?ref_src=twsrc%5Etfw">September 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.10.0` がリリースされました。小さな機能追加とバグ修正が行われました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

## [no-inline-comments](https://eslint.org/docs/rules/no-inline-comments) `ignorePattern`

🔖 [#13029](https://github.com/eslint/eslint/pull/13029)

正規表現で許可するインラインコメントを指定できるようになりました。

```js
/*eslint no-inline-comments: [error, { ignorePattern: "^\\s*webpackChunkName:.+$" }]*/

//✓ GOOD
import(/* webpackChunkName: "my-chunk-name" */ './locale/en');
```
> [Open Online Demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgbm8taW5saW5lLWNvbW1lbnRzOiBbZXJyb3IsIHsgaWdub3JlUGF0dGVybjogXCJeXFxcXHMqd2VicGFja0NodW5rTmFtZTouKyRcIiB9XSovXG5cbi8v4pyTIEdPT0RcbmltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcIm15LWNodW5rLW5hbWVcIiAqLyAnLi9sb2NhbGUvZW4nKTsiLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjExLCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)
ESLint 7.9.0

前 [v7.8.0](https://qiita.com/mysticatea/items/61cedf1c1da30dc04ad4) | 次 [v7.10.0](https://qiita.com/mysticatea/items/099c7559e6c9e5e6769a)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.9.0 has been released: <a href="https://t.co/yCHnnVmEdg">https://t.co/yCHnnVmEdg</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1304854882575409154?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.9.0` がリリースされました。機能追加は行われていませんが、[ESLint の semver ポリシー](https://github.com/eslint/eslint#semantic-versioning-policy) (指摘が増えるかもしれないバグ修正はマイナーバージョンで行う) に従ってマイナーバージョンが上がっています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

特になし
ESLint 7.7.0

前 [v7.6.0](https://qiita.com/mysticatea/items/41695f384b70806933bf) | 次 [v7.8.0](https://qiita.com/mysticatea/items/61cedf1c1da30dc04ad4)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.7.0 has been released!<a href="https://t.co/ResBl1KtCo">https://t.co/ResBl1KtCo</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1294392539164938242?ref_src=twsrc%5Etfw">August 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.7.0` がリリースされました。小さな機能追加とバグ修正が行われました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

## [no-underscore-dangle](https://eslint.org/docs/rules/no-underscore-dangle) `allowFunctionParams`

🔖 [#13545](https://github.com/eslint/eslint/issues/13545)

仮引数のアンダーバーで始まる名前を許可するためのオプションが追加されました。

これまで、このルールは仮引数を見逃していたため、破壊的変更を避けるためにデフォルト値は `true` になっています。次のメジャーバージョンで `false` になる予定です。

```js
/*eslint no-underscore-dangle: [error, { allowFunctionParams: true }]*/

//✓ GOOD
function f(_a) {}
```
> [Open Online Demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFtlcnJvciwgeyBhbGxvd0Z1bmN0aW9uUGFyYW1zOiB0cnVlIH1dKi9cblxuLy/inJMgR09PRFxuZnVuY3Rpb24gZihfYSkge31cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

```js
/*eslint no-underscore-dangle: [error, { allowFunctionParams: false }]*/

//✘ BAD
function f(_a) {}
```
> [Open Online Demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFtlcnJvciwgeyBhbGxvd0Z1bmN0aW9uUGFyYW1zOiBmYWxzZSB9XSovXG5cbi8v4pyYIEJBRFxuZnVuY3Rpb24gZihfYSkge31cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)
ESLint 7.6.0

前 [v7.5.0](https://qiita.com/mysticatea/items/b61e0b453f16e7dd08de) | 次 [v7.7.0](https://qiita.com/mysticatea/items/86491a32e6018260c27b)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.6.0 has been released!<a href="https://t.co/eb6Rf10fx4">https://t.co/eb6Rf10fx4</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1289349482216394752?ref_src=twsrc%5Etfw">July 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.6.0` がリリースされました。機能追加は行われていませんが、[ESLint の semver ポリシー](https://github.com/eslint/eslint#semantic-versioning-policy) (指摘が増えるかもしれないバグ修正はマイナーバージョンで行う) に従ってマイナーバージョンが上がっています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

特になし

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

特になし
Androidアプリ開発の準備

#概要
20代後半の現SEです。
SIerに所属していますが、業務内容が技術とは離れているため、スキルアップのために自己学習を行っています。
今までも、PHPやPython等を勉強してきまいしたが、効率的なスキルアップにはインプットだけでなく、アウトプットも大事ということで、Qiitaに投稿しようと思いました。

何故Androidアプリかというと、以下の理由です。
　①自分が持っているスマホがAndroidのため
　②所持しているOSがWindowsのため(iPhoneアプリはMacが必要)
　③現時点でポピュラーなJavaを習得できる
　④広告収入をつければ儲けの仕組みを併用で勉強できる(儲けは考慮しない)

本当は今までやっているWeb系でもよかったのですが、どうせなら新しいことを学びたいと思いAndroidアプリを選びました。

#Androidアプリについて
###言語
 - Java
 - Kotlin
 - C言語
 - Ruby

Androidアプリの開発ではJavaとKotlinが有名なようですが、Javaを選択しました。

###IDE
JavaではEclipseが使われていますが、Android専用の「Android Studio」というIDEがあるため、こちらを使用します。

###OS
Windows 10

#Android Studioのダウンロード
Android Studioは下記のサイトからダウンロードできます。
[Android Studio](https://developer.android.com/studio?hl=ja)
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/5c0e3d1d-e5fa-3432-6748-1bd47a0b12ac.png)
「DOUNLOAD ANDROID STUDIO」をクリック

#Android Stuidoのインストール
ダウンロードしたEXEファイルを開きます
→android-studio-ide-193.6626763-windows.exe

表示されるウィンドウに沿って、進めていきます


![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/ce40e53a-8589-ec9f-235a-e630bb33ca09.png)
Nextを選択します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/7c19d3b4-bc17-1d2f-bc1a-b9ac411138a1.png)
デフォルトのままNextを選択します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/ce792a2e-ab55-da24-2700-934b4b8735f2.png)
インストールフォルダの選択です。
人によって指定したいフォルダを選択すればよいと思います。
私はデフォルトで進めました。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/25cc4208-8900-1b83-8e44-ad9e10503409.png)
スタートメニューのどのフォルダに表示するか、ですね。
これもデフォルトでよいと思います。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/3b3b7aa7-abd2-a4e5-54f8-598becdbbca1.png)
Installが完了し、Finishを選択します。

#Android Studioの初回起動
Android Studioを起動すると、デザイン等の選択が選べます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/41101c30-b0f6-ca65-5233-786c088362be.png)
慣れてくれば色々改造してもいいと思いますが、Standardでいきます。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/d0a569bc-0a4f-d7a0-d6f1-75843507b085.png)
ソースコードの表示ですね。
黒でもよいとは思いますが、何となく白にしました。
多分後からでも変えられると思います。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/597ced1c-3b25-719d-2c00-cba53a143a8c.png)
現在のインストールされている内容の確認ですね。
Finishを選択します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/ff8a44a7-110a-8052-590e-3bf7570a68a0.png)
Finishを選択します。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514630/46e5c983-4f7b-4086-fe53-467e195b266a.png)
これで初回起動の設定が完了となります。

次回からはプロジェクトの立ち上げをして、HelloWorldとか電卓とかの簡単なアプリを作っていこうと思います。
設定よりも規約(あるいは守破離)

大学の授業を受けて感じるのは，その学問の大きさではないでしょうか．こいつを制覇するのは無理そうって．高校の時は範囲が文科省によって限られているので，なんとかなりそうですが，大学は無理．あるいは一人の教授から教えてもらった内容がどこまで通用するのかしらと不安になります．大学で扱われるような，あやふやな知識をどうやって **「学ぶ」** か，途方に暮れてしまうかもしれません．

コンピュータを動かすために必要となるソフトウェア開発の中で，最新の手法にCoCという考え方があります．これは **Conventions over Configurations(設定よりも規約)** の略です．どういうことかというと，

> Conventions over Configurations(設定よりも規約):複雑なWEBソフトを開発するときに，古い手法の **「設定優先」** では，いろいろと好き勝手に設定できる自由度を優先していました．そうすると何処に何が置いてあるのかは開発プロジェクトごとにまったく違っていて，プログラマや管理者は設定ファイルを見ていちいち確認する必要がありました．新しい手法の **「規約優先」** では，デフォルト設定を標準にしてしまったのです．この規約優先はファイルの名前や関数の名前にまでおよんでいて，細かい関数は自動で作られて，開発効率が格段にあがることが実証されています．

もう少し身近な例で説明すると**食品売り場** はほとんど同じ構成になっているのをご存知？　細かい順序は変わるけど野菜・果物->魚->肉->加工食品->飲み物->冷凍食品->乾きもの->調味料．．．買い物客が規約に従ってどこにあるかをある程度予測できるから探せるわけで，店が全く勝手に設定したら買い物客は何処へ行ったらいいかわからなくなり，買い物がしづらく感じ，そのうち客足は遠のきます．食品売り場の発想をCoCはファイルの置き場所に当てはめたわけ．

「規約優先」というのは，学習を始めるときにとても有効です．これは能や，武道，茶道の教えにある

-   **守:** 型や技など，師の教えを忠実に守る
-   **破:** 自分の考えによって，型を破る
-   **離:** 独自のものを作り，型から離れる

にも通じています．皆さんはすぐに独自のものを作りたがる，あるいはそれが推奨されているように感じてしまいます．でも，これは天才のすること．普通の人には，どのような芸の修得にもしっかりとした技能の基礎を身につける守の段階があって，これができて初めてより上位の技能となる破や離ができると考えられています．学問も同じです．



------
 - **source** ~/git_hub/semi_lattice/docs/coc.org
Ruby on Rails で Slim 使用時、form_with で "undefined local variable or method `f' for "と表示される

## 開発環境
Ruby: v2.5.7
Rails: v5.2.4.4
gem slim: v4.1.0

##エラー内容
```slim
= form_with model:@team, local:true do |f|

= render 'layouts/error_message', model: f.object

.input
  = f.label :name
  = f.text_field :name

.input
  = f.label :introduction
  = f.text_area :introduction

  = f.submit
```

今回、Ruby on RailsのGemのひとつである`slim`を導入したのですが早速エラーに引っかかりました。
内容は、![スクリーンショット 2020-10-11 12.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613376/1675190f-a192-b820-8887-b51b14351f45.png)
`NameError`と
`undefined local variable or method f' for #<#<Class:0x00007fef406b53c8>:0x00007fef35880668>`

指定している f が定義されていないとの事です。
form_withに記述したブロック変数で fとあるのに...
もしや、slim独特のform_withの書き方があるのでは??と思い、色々と調べていたのですが
結果、以下のように修正したら解決しました。

```slim
= form_with model: @team, local: true do |f|

/ それぞれ 1段落インデントをずらしました
  = render 'layouts/error_message', model: f.object

  .input
    = f.label :name
    = f.text_field :name

  .input
    = f.label :introduction
    = f.text_area :introduction

    = f.submit
```
インデント調整でした...分かってみると単純...

`end`や`()`が必要ないので、form_withの適用範囲をどうやって見極めてるのかなと頭によぎったんですが、インデントで識別しているんですね。なるほど...
このエラーを通して気付きました。笑

単純なことですが、ハマりかけましたので投稿します。

それにしても慣れは必要ですが、少ない記述とカッコがいらないだけでもかなり記述が簡略化されてコードが書きやすいですし、見やすいです。加えて、レンダリングも少し速いそうなので良いところばっかりですね、slim。
Autheliaメモ

オープンソースでKeycloakの代用になりそうなMFAを実現できそうなものを探していたら[Authelia](https://github.com/authelia/authelia)というものがありました。

[Authelia](https://github.com/authelia/authelia)
[docs](https://www.authelia.com/docs/)

ドキュメント（[シーケンス](https://www.authelia.com/docs/home/architecture.html#sequence-diagram)）見ていたら、アプリ側に認証を実装しなくて良さそうな気がして便利そうでした。

* [アプリ側でユーザーを判定する方法](https://www.authelia.com/docs/deployment/supported-proxies/#how-can-the-backend-be-aware-of-the-authenticated-users)
* [複数ドメインにはまだ対応していないみたい](https://github.com/authelia/authelia/issues/1198)


試す際に参考になりそうな記事

[Authelia Tutorial – Protect your Docker Traefik stack with Private MFA](https://www.smarthomebeginner.com/docker-authelia-tutorial/)
Motor Bench and Hardware In the Loop Simulator

航空宇宙関係ではHardware In the Loop Simulator(HILS)をよく聞く。関連シミュレータとの接続について勉強中。

自動車関係ではHILSと、Motor Bench, 自動車運転シミュレータ、自動車走行シミュレータ、自動運転シミュレータなどの連携の現状と課題を整理中。

 ＜この記事は書きかけです。順次追記します。＞
# 技術
## 数式処理または数値計算
## 過渡現象、過渡解析
## コンパイラ
Matlabの基礎技術の一つにCompilerがある。
UNIXのPortable C Compilerの技術者がMathworksに参加している。
# 模擬試験・設計
## CPU
Athrill
https://www.toppers.jp/athrill.html
## 連続模型
### 電源
ノイズシミュレータ (em test)
http://www.tsjcorp.co.jp/product/noise.html
インパルスノイズ試験器
https://www.toppers.jp/athrill.html
コンビネーション波形／サージジェネレータ
https://www.emtest.com/ja/products/productGroups/Surge_generators.php

Industrial Power Corruptor
https://www.powerstandards.com/product/ipc/highlights/
# 電動機
## 事例
HILS組み込み型モータベンチ耐環境性能評価試験（MSH）
http://shizuoka-shinseicho.jp/products/view/22

モデルベースモータ制御アプリ開発 ~解析・設計から実装・試験まで~
https://www.mathworks.com/content/dam/mathworks/mathworks-dot-com/solutions/automotive/files/jp-expo-2015/model-based-motor-control-application.pdf

モータHILS
https://www.aandd.co.jp/products/dsp-tech/dsp-xils/dsp-xils-detail/motor-hils/

NI FlexRIO​で​ハイブリッド​車​向け​の​モーター​HILS​を​構築
https://www.ni.com/ja-jp/innovations/case-studies/19/advancing-subaru-hybrid-vehicle-testing-through-hardware-in-the-loop-simulation.html

EV/HEV開発向け　最新HILSソリューション【dSPACE】
http://guide.jsae.or.jp/first_column/2682/

インバータを接続してモータの力行、回生状態を模擬できるJMAGと連携可能なモータシミュレータ
https://www.hodaka.co.jp/product_topics/entry2335

モータHILSとハイブリット自動車
http://www.neat21.co.jp/mbd/realtime/automotive_sys/motor_hils/motorhils_inv/index.html

実エンジンを用いたハイブリッド重量車モデルの評価を可能とする HILS の検討
小林 雅行　奥井 伸宜　自動車技術総合機構
https://www.jstage.jst.go.jp/article/jsaeronbun/47/5/47_20164550/_pdf

HILS（Hardware In the Loop Simulation）とは
https://www.myway.co.jp/products/hil/whatis_hil.html

電気自動車(EV)モータ単体評価 ベンチシステム　明電時報 
https://www.meidensha.co.jp/rd/rd_01/rd_01_02/rd_01_02_22/rd_01_02_17_01/__icsFiles/afieldfile/2020/04/07/No367_10_web_200406.pdf

# 参考資料
DSPを応用したデジタル制御POL
電源技術の研究
https://kutarr.kochi-tech.ac.jp/?action=repository_action_common_download&item_id=489&item_no=1&attribute_id=19&file_no=1&usg=AOvVaw3-KsOV4nNgT5xkJwleOSCr

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01初稿　20211025
ver. 0.02 ありがとう追記　20230527
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
javascriptで簡単CSV解析

関数1つでCSVを二次元配列に変換します。

- ES3対応。
- 区切り文字を変えればタブ区切りテキストでもOK。
- 末尾に改行がなくてもOK。途中に改行だけの行があれば無視します。
- `"` で囲ってあれば、改行や区切り文字が含まれていてもOK。
- `"` を含めるならば `""` を入れる。
- バグがあったら教えてください。

```js
// CSVをパース
function parseCsv(csvStr, delimiter) {
    var rowRegex = /(?:(?:"[^"]*")*[^\r\n"]*)+/g,
        colRegex = new RegExp('(?:(?:"[^"]*")*[^' + delimiter + '"]*)+', 'g'),
        rows = [],
        row, cells, cell, rowMaches, colMaches;
    //行を切り出す
    while ((rowMaches = rowRegex.exec(csvStr)) !== null) {
        if (rowMaches[0] !== '') {
            cells = [];
            row = rowMaches[0];
            //セルを切り出す
            while ((colMaches = colRegex.exec(row)) !== null) {
                cell = colMaches[0].replace(/^\s+|\s+$/g, '');
                if (cell.charAt(0) == '"' && cell.charAt(cell.length - 1) == '"') {
                    cell = cell.slice(1, -1);
                }
                cell = cell.replace(/""/g, '"');
                cells.push(cell);
                colRegex.lastIndex++; //一歩前へ！
            }
            rows.push(cells);
        }
        rowRegex.lastIndex++; //一歩前へ！
    }
    return rows;
}

// カンマ区切り
var str1 = "連番,氏名,氏名（カタカナ）,性別,電話番号,生年月日\n" +
    "1,小平勝美,コダイラ カツミ,女,\"0993298298\",1987/07/12\n" +
    "2,沢井慶太,サワイ ケイタ,男,\"0881257342\",1986/10/25\n" +
    "3,神崎勝男,カンザキ カツオ,男,\"087946508\",1985/09/30\n" +
    "4,島津源治,シマヅ ゲンジ,男,\"0173059125\",1971/06/06\n" +
    "5,岩谷由姫,イワタニ ユキ,女,\"0970852069\",1999/09/07";

var data1 = parseCsv(str1, ",");
console.log(JSON.stringify(data1, null, '  '));

// タブ区切り
var str2 = "連番\t氏名\t氏名（カタカナ）\t性別\t電話番号\t生年月日\n" +
    "6\t合田郁美\tアイダ イクミ\t女\t\"025775007\"\t1989/06/17\n" +
    "7\t梅原侑歩\tウメハラ ユウホ\t男\t\"089975035\"\t1995/08/22\n" +
    "8\t吉野有香\tヨシノ ユカ\t女\t\"0244902616\"\t1975/09/02\n" +
    "9\t松野時雄\tマツノ トキオ\t男\t\"0982714767\"\t1978/06/15\n" +
    "10\t依田永遠\tイダ トワ\t男\t\"0522081957\"\t1996/10/14";

var data2 = parseCsv(str2, "\t");
console.log(JSON.stringify(data2, null, '  '));
```
Pari gp containerを使ってみた


##はじめに
PARI/GPについては
https://pari.math.u-bordeaux.fr/pub/pari/manuals/2.3.5/users.pdf
の```1.1 Introduction```が参考になります。
ここではDockerでPARI/GPを利用する方法について書きます。


##Dockerコンテナを起動

オプション-itでコンテナに入ることができます。
以下のように```gp```をつけることで、コンテナ起動直後にPARI/GPを起動します。

```
docker run -it pascalmolin/parigp-small gp
```

また```pascalmolin/parigp-full```もありますが、今回は```small```です。
以下のようにPARI/GPが起動します。
試しに1 + 1を計算しています。

```
                  GP/PARI CALCULATOR Version 2.11.4 (released)
          amd64 running linux (x86-64/GMP-6.2.0 kernel) 64-bit version
            compiled: Jul  8 2020, gcc version 9.3.0 (Alpine 9.3.0)
                            threading engine: single
               (readline v8.0 enabled, extended help not enabled)

                     Copyright (C) 2000-2018 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes
WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?17 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000
? 1 + 1
%1 = 2
```

停止したいときは```\q```コマンドを入力します。

```
? 1 + 1
%1 = 2
? \q
Goodbye!
```

再度コンテナに入るには、まず起動したいCONTAINER IDを見つけます。
```docker ps -a```は停止しているコンテナも含めて、一覧を表示します。

```
docker ps -a
```

以下のように一覧が表示されます。

```
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS                          PORTS               NAMES
1831fe3cb55f        pascalmolin/parigp-small   "gp"                3 minutes ago       Exited (0) About a minute ago
```

コンテナを再起動します。

```
docker restart 1831fe3cb55f
```

コンテナに入ります。

```
docker exec -it 1831fe3cb55f sh
```

##ファイル読み込み、書き込み

tmpディレクトリに移動し、そこにファイルを作ってみます。

```
/ # cd tmp
```

以下のような```test.gp```を作成しました。

```
/tmp # cat test.gp
forprime(p = 1, 20, write("output.txt", p))
```

以下のように```gp```コマンドでPARI/GPを起動します。

```
/tmp # gp
```

ファイルを実行します。

```
? \r test.gp
```

PARI/GPを停止し、作成された```output.txt```を見てみます。

```
/tmp # cat output.txt
2
3
5
7
11
13
17
19
```

##参考記事
- Git hub  
https://github.com/mastermic/pari-docker
- PARI/GP user's guide  
https://pari.math.u-bordeaux.fr/pub/pari/manuals/2.3.5/users.pdf
AWSにEC2上にdockerを使用したlaravelをデプロイ③（SSH接続〜Docke-composeインストール）

##概要##
・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
[AWSにdockerを使用したlaravelをデプロイ②](https://qiita.com/JXnj8uVrUkiBh90/items/0cdac8045965e2bfffa6)

##EC2インスタンスにSSHでアクセスする##
**1:EC2ダッシュボード作成したインスタンスに入りの右上の「接続」をクリック**
![スクリーンショット 2020-10-10 22.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/778706/d54e4d38-f7eb-f229-73a9-d6e8b0800da8.png)

**2:インスタンスに接続コード確認**
「SSH クライアント」をクリック
![スクリーンショット 2020-10-10 22.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/778706/3a7d65fa-2d30-cbe5-b606-0f423d16801c.png)

**3:EC2インスタンスにSSHでアクセス**
ターミナルを起動し

```
chmod 400 test-docker.pem
ssh -i "test-docker.pem" ubuntu@ec2-52-198-43-4.ap-northeast1.compute.amazonaws.com
```
test-docker.pemの部分はダウンロードし格納したディレクトリを指定して下さい。

##Gitのインストール##
EC2内への変更にはスーパーユーザーで行わないといけないので「sudo」を打つか

```
ubuntu@ip:~$ sudo su
root@ip:/home/ubuntu# 
```
行頭にある「$（ドル）」が一般ユーザーを表し、「#（シャープ）」がrootユーザーを表します。

**1:aptの更新**

```
root@ip:/home/ubuntu# apt-get update
```

**2:Gitのインストール**
Gitのインストールと初期設定を行います。

```
#gitインストール
root@ip:/home/ubuntu# apt-get install git

#git初期設定
root@ip:/home/ubuntu# git config --global user.name [任意のユーザー名]
root@ip:/home/ubuntu# git config --global user.email [任意のemailアドレス]
```

##Docker,Docker-composeのインストール##
ubuntu用の手順を[Docker公式ページ](https://docs.docker.com/engine/install/ubuntu/)に従います。
Docker,Docker-composeのインストールを行います。

```
root@ip:/home/ubuntu＃　apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

root@ip:/home/ubuntu＃ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

root@ip:/home/ubuntu＃ apt-key fingerprint 0EBFCD88

root@ip:/home/ubuntu＃ add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"

root@ip:/home/ubuntu＃ apt-get install docker-ce docker-ce-cli containerd.io

#docker-composeのインストール
root@ip:/home/ubuntu# apt install docker-compose
```
**前回の記事**
[AWSにEC2上にdockerを使用したlaravelをデプロイ②](https://qiita.com/JXnj8uVrUkiBh90/items/0cdac8045965e2bfffa6)

**続きはこちら**
[AWSにdockerを使用したlaravelをデプロイ④]
(https://qiita.com/JXnj8uVrUkiBh90/items/65f55ad1f79f32f26547)

＊＊間違い等ございましたらご指摘お願い致します＊＊
flutter for web 導入時に beta channel へスイッチできない

**※注意！：2020/10/11 時点の確認**

一度 flutter ディレクトリを全削除して、以下の通り再度 clone したら解決した。

```bash
$ git clone https://github.com/flutter/flutter.git -b stable --depth 1 --no-single-branch
```

---

- 環境
    - Flutter 1.22.1 • channel beta • https://github.com/flutter/flutter.git
Framework • revision f30b7f4db9 (2 days ago) • 2020-10-08 10:06:30 -0700
Engine • revision 75bef9f6c8
    - Tools • Dart 2.10.1
- 参考 URL
    - [Chrome; debugging a web app requires the Chrome browser\.
](https://flutter.dev/docs/get-started/web#set-up)
    - [NOT ABLE TO ACCESS THE MASTER BRANCH , NEITHER THE BETA BRANCH · Issue \#53231 · flutter/flutter](https://github.com/flutter/flutter/issues/53231)

## メモ: CLI でプロジェクト生成時にハイフンを受け付けない
- `flutter create my-app` が実行不可
- プロジェクト名は、ハイフンを受け付けない様子
JavaScriptで円周率の有効桁数をユーザーに指定してもらう方法

```html

<main>
<div class="container">
<section>
    <p>これが有効桁数<span id="digit"></span>円周率<span id='pi'></span>です</p>
    
</section>
</div><!-- /.container -->
</main>
<footer>
<div class="container">
<p>JavaScript Samples</p>
</div><!-- /.container -->
</footer>
<script>
'use strict';
const digits=parseInt(window.prompt('有効桁数を数字で入力してね'));
const DIGIT=digits-1;
 function point(num,digits){
     const mover =10**digits;
     return Math.floor(num*mover)/mover;

 }
document.getElementById('digit').textContent=digits;
document.getElementById('pi').textContent=point(Math.PI,DIGIT)

</script>
</body>
</html>
```
参考文献:JavaScript超入門書P１７４

(説明）
まず、window.prompt('')でユーザーに有効桁数を入力してもらう。
そのデータが文字列（string）なので、parseInt()メソッドで数値、整数（integer）に変換する。
その値を、定数digitsに代入。
円周率(Math.PI)の指定した小数点以下を切り捨てる関数を作る。function point(num,digits)
しかし、3.14159265358979を10**digitsした後に小数点以下を切り捨てても、もともと小数点の前（一の桁）にある3も有効桁数に入るので、このままだとユーザーが入力した桁数より１桁多くなる
（ex:ユーザーの有効桁数「３」
3.141592x10**3=3141.592
この数字の小数点以下を切り捨てると3141
これをまた元の数字に戻すと
3141/10**3=3.141
つまり有効数字４桁になってしまう。）
よって、私は
const DIGIT=digits-1;
document.getElementById('pi').textContent=point(Math.PI,DIGIT)
この二つのコードを工夫して、出力をユーザーが求める有効桁数にした。
関数を呼び出すときの引数にpoint(Math.PI,DIGIT)をして、円周率とユーザーが入力した有効桁数−１で帳尻を合わせた。