OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでdocker-composeを開くと動いていたものが動かない（Mysql）

# 問題
`Docker-compose up` だとコンテナは起動して、正常にMysqlが動作する。

VSCodeの `Remote containers: Reopen in container` で開くとコンテナは起動しているが、Mysqlが動作していない。

# 原因と解決策

プロジェクトのrootディレクトリに`docker-compose.yml`が存在する状態で、
`Remote containers: Reopen in container`を実行すると、既存のdocker-compose.ymlを読み込む、設定が、.devcontainer/に作成され、Docker-compose upが実行されます。

VSCodeが自動的に作成する、`.devcontainer/docker-compose.yml`
のcommand:の行が悪影響してMysqlが起動していませんでした。
command: の行をコメントアウトすると解決します。
なにか意味があって、command:の行を生成しているのだろうけど、必要性が全く不明。

```
version: '3'
services:
  # Update this to the name of the service you want to work with in your docker-compose.yml file
  db:
    # If you want add a non-root user to your Dockerfile, you can use the "remoteUser"
    # property in devcontainer.json to cause VS Code its sub-processes (terminals, tasks, 
    # debugging) to execute as the user. Uncomment the next line if you want the entire 
    # container to run as this user instead. Note that, on Linux, you may need to 
    # ensure the UID and GID of the container user you create matches your local user. 
    # See https://aka.ms/vscode-remote/containers/non-root for details.
    #
    # user: vscode

    # Uncomment if you want to override the service's Dockerfile to one in the .devcontainer 
    # folder. Note that the path of the Dockerfile and context is relative to the *primary* 
    # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile"
    # array). The sample below assumes your primary file is in the root of your project.
    #
    # build:
    #   context: .
    #   dockerfile: .devcontainer/Dockerfile
    
    volumes:
      # Update this to wherever you want VS Code to mount the folder of your project
      - .:/workspace:cached

      # Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker-compose for details.
      # - /var/run/docker.sock:/var/run/docker.sock 

    # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust.
    # cap_add:
    #   - SYS_PTRACE
    # security_opt:
    #   - seccomp:unconfined

    # Overrides default command so things don't shut down after the process ends.
    command: /bin/sh -c "while sleep 1000; do :; done"
 
```

# ひとりごと

Remote containers使っているほかの人の記事では特に問題になってないのに、なぜ？？
解決するのに半日かかりました。
いろいろ調査している過程で、Remote containersの理解が深まりました。
IntelliJ備忘録

よくIntelliJの設定を忘れるのでメモ
随時更新していく

####ダークカラー（モード）にテーマ変更
`Setting`→`Color Scheme`から`Darcla`に変更する

####改行一括置換
サクラエディタとかと違って一括置換する際に`\n`を記載する必要はなく`New Line`を使用する
![screenshot.76.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/89fab2a6-6460-c183-aaa1-2bf415accb58.jpeg)

![screenshot.77.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/e248627d-3001-0ab3-5a6c-fdee26e2b29f.jpeg)

####IntelliJの動作が重い、予期せぬ動作した場合
・テストコードの動作がおかしい・キャッシュを消したい
・動きが重い・すべての実装がエラー（警告）で表示されるなど
`File`→` invalidate caches`でキャッシュを破棄することで直ることが多いので試してみるといい

####パッケージ、ディレクトリを分割して表示したい
左の歯車マークから`Compact Middle Pakages`のチェックを外すことで分割が可能になる
![screenshot.78.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/e5211867-8d39-8f9c-b56d-6f56e88ec2f4.jpeg)
![screenshot.79.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/b6bd9aa9-2855-c03f-1f20-8f947b7e2f85.jpeg)

####開いているファイルをプロジェクトで自動追跡
歯車マークから`Always Select Opened File`にチェックする
![screenshot.81.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/d08067c8-8ec4-e290-3d94-01e368fe9ca6.jpeg)
![screenshot.82.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619433/786b193a-a7ae-c2d9-00fb-68f4668bb2dc.jpeg)

####エディタータブを閉じないようにする。上限を増やす
`Setting`→`General`→`Editor Tabs`→`Tab limit`で上限増やすことが可能

####コードの折り畳みをさせない(imports文など)
`Setting`→`General`→` Code Folding`→`Fold by default:import`チェックを外す

###おすすめのPlugins
#### MyBatisX
mapper.javaとmapper.xmlを行き来するのに便利

#### CSV Plugin
CSVのカラムに色がついたり、DBみたいに見れるので見やすい

#### Database Navigator
Intellijを無料版で使用している場合はこれをインストールすれば、IntelliJないでDBの閲覧やDB操作が可能になる
【Ruby】数値の任意の位での切り捨て・切り上げ

# 解決したかったこと
数値を扱う時に、
1234 → 1200
のように十の位以下を切り捨てたい。
# 解決方法
floorメソッドで負の整数を指定する。

```ruby
# 切り捨て
1234.floor(-2) 
# => 1200

#切り上げ
1234.ceil(-2)
# => 1300
```
(-2)なら十の位以下、(-3)なら百の位以下という風に任意の桁で処理ができます。

https://docs.ruby-lang.org/ja/latest/method/Float/i/floor.html

https://docs.ruby-lang.org/ja/latest/class/Float.html#I_CEIL
BigQueryで仮想テーブルを作成・活用

## はじめに

今回の記事は、かゆいところに手が届く仮想テーブルの作成方法を紹介します。

直近1年分のテーブル（月ごとに抜け漏れがない状態）が欲しいときなどに重宝します。

## 仮想テーブル作成

```sql:sql1
SELECT
    DATE_SUB( CURRENT_DATE(), INTERVAL n month), MONTH) AS month
FROM
    UNNEST(GENERATE_ARRAY(0, 11)) AS n
ORDER BY
    n
;
```


作成されるテーブル

```
month
2021-04-01
2021-03-01
2021-02-01
2021-01-01
2020-12-01
2020-11-01
2020-10-01
2020-09-01
2020-08-01
2020-07-01
2020-06-01
2020-05-01
```


- **DATE_TRUNC()**は、日付、時刻を指定された時間単位に切り捨てる（今回は、MONTHですので、月の最初の日となります。）

- **DATE_SUB( CURRENT_DATE(), INTERVAL n month)**で現在からnヶ月分、減算する（current_dateが2021-04-01であれば、2021-03-01となります。）

- **UNNEST**は、配列を取得し、配列に含まれる各要素を 1行にしたテーブルを返します



#### UNNEST補足説明

先程、実行したsql1ですと、様々な関数が混ざっていて、少しイメージがしにくかったかもしれません。
**UNNEST**を使用している部分を取り出して、実行してみましょう！

```sql:sql2
SELECT
    n
FROM
    UNNEST(GENERATE_ARRAY(0, 11)) AS n
ORDER BY n
;
```

作成されるテーブル

```
n
0
1
2
3
4
5
6
7
8
9
10
11
```

このようなテーブルが作成されます。sql1は、`DATE_SUB( CURRENT_DATE(), INTERVAL n month), MONTH) AS month`のn部分に値を代入することによって、今月、前月、前々月と値を取得することが出来ます。



## ちょっとしたカスタマイズ

ちょっとしたカスタマイズを共有します。その他、良いカスタマイズがありましたら、共有していただけると幸いです。

DATE_ADD()は、特定の日付のn日後・n日前などの日付を取得できます。

`DATE_ADD(, ~省略~ INTERVAL 14 day)`を使ってみましょう。


```sql:sql3
SELECT
    DATE_ADD(DATE_TRUNC(DATE_SUB( CURRENT_DATE(), INTERVAL n month), MONTH), INTERVAL 14 day) AS month
FROM
    UNNEST(GENERATE_ARRAY(0, 11)) AS n
ORDER BY n
;
```

毎月15日のテーブルが出来ました！

```
month
2021-04-15
2021-03-15
2021-02-15
2021-01-15
2020-12-15
2020-11-15
2020-10-15
2020-09-15
2020-08-15
2020-07-15
2020-06-15
2020-05-15
```

## JOINして活用しよう！

これは注意点ですが、BigQueryには、JOINするときに、イコールで条件を結ぶ決まりがあります。

ですので、関連性がないテーブルには、`1 as dummy,`とダミーテーブルを追記して、JOINして値を抽出しています。


```sql:sql4
SELECT
    month,
    element
FROM
    (
        SELECT
            1 AS dummy,
            DATE_ADD(DATE_TRUNC(DATE_SUB( CURRENT_DATE(), INTERVAL n month), MONTH), INTERVAL 14 day) AS month
        FROM
            UNNEST(GENERATE_ARRAY(0, 4)) AS n
        ORDER BY n
    )   AS t1
    LEFT JOIN
    (
        SELECT
            1 AS dummy,
            element
        FROM UNNEST(['foo', 'bar', 'baz']) AS element
    )   AS t2
    ON t1.dummy = t2.dummy
;
```

以下のテーブルになります。

```

month	　　element
2021-04-15	foo
2021-04-15	bar
2021-04-15	baz
2021-03-15	foo
2021-03-15	bar
2021-03-15	baz
2021-02-15	foo
2021-02-15	bar
2021-02-15	baz
2021-01-15	foo
2021-01-15	bar
2021-01-15	baz
2020-12-15	foo
2020-12-15	bar
2020-12-15	baz
```

今回はelementの中にてきとうな値を入れていますが、日付など様々なカラムを入れて、mouth値の条件に該当するものをカウントするみたいな使い方も出来ます。

以上です。最後まで読んでくださって、ありがとうございます。


## 参考リンク

とても分かりやすい記事をありがとうございます！

https://qiita.com/shiozaki/items/2827e18be40335668902

https://kanchoworldcup.hatenablog.com/entry/2018/09/05/221711

https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays?hl=ja

https://qiita.com/ryoichi-u/items/91e16ee53ccfad010ff7

https://qiita.com/ryoichi-u/items/5929d5851ffbebaed3f1
browserify中にソースコードを文字列置換で書き換えるbrowserify-sed

node.js 向けのファイルを束ねてブラウザで実行できるようにする `browserify` で、node.js 用の通常コードとブラウザ用コードで一部の記述を変えたいときに使えるプラグイン `browserify-sed` を書いてみたので紹介します。

https://www.npmjs.com/package/browserify-sed

私は軽量に `make` でビルドする派なので CLI では以下のように使います。

```sh
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/__VERSION__/1.2.3/g" ] 
```

↑の例では、ソースコード中の `__VERSION__` という文字列をすべて `1.2.3` に置き換えています。

以前は `perl -i -pe` や `sed -i` でソースコード書き換えをしていたので、それと同じ `sed` 書式になっています。`perl` で慣れてる人には読みやすいはず。既存 `Makefile` もコピペで切替えできた。

なお `perl` や `sed` は行単位のストリーミング置換なのに対して、
`browserify-sed` はファイル全体をマッチさせる仕組みなので、
複数行に渡る置換もできます。
逆に、行単位で、行頭・行末でマッチさせたいときは `mg` フラグを付けて下さい。

```sh
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s#^(exports.*? = void 0)#// $1#mg" ]
```

↑は TypeScript が関数とかを `exports` するときに定義前にいちど `void 0` で先行初期化するコードを吐くのを削除するものです。たいてい要らない。
複数の置換を行うときは、`;` で並べます。

```sh
# ; で並べる
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g; s/bar/BAR/g;" ] 

# たぶん下記でも OK
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g" "s/bar/BAR/g" ] 

browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g" ] 
    -t [ browserify-sed "s/bar/BAR/g;" ] 
```

事前に `browserify` 本体と `browserify-sed` を準備して下さい。

```sh
npm install browserify browserify-sed
```

[20行くらいの短いコード](https://github.com/kawanet/browserify-sed/blob/main/browserify-sed.js) なので、特定のファイルのみを置換対象に絞るとかの細かなオプションは、実装していません。

macOS の `sed` は GNU でないので `-i` に対応していなかったり、
Alpine など Docker の軽量イメージでは `perl` が入っていなかったり、
ときどき面倒なことがあった。
`browserify-sed` を使えば `node` だけでビルドが完結できて便利になりそう。

なお `s/foo/bar/` の文字列置換処理（置換関数へのコンパイル）の実装は別モジュール [sed-lite.ts](https://github.com/kawanet/sed-lite/blob/master/lib/sed-lite.ts) です。

![browserify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12419/69638425-bd14-4b27-a962-23c80dea6814.png)
MacでDart SDKをバージョン指定してインストールする

## 動機

依存ライブラリのバージョンによって、最新バージョンのDart SDKを使えない場合がある。
[公式](https://dart.dev/get-dart)の手順だと、`$ brew switch`でバージョンを変更する方法が紹介されているが、入れたいバージョンのSDKが公開されていなかったため、手作業をインストールすることになった。

## 手順

### (1) ZIP形式でSDKをダウンロードする

好きなバージョンのSDKをZIPでダウンロードします。
https://dart.dev/tools/sdk/archive

### (2) 任意のディレクトリに配置し、パスを通す

ZIPを解凍して、適当なディレクトリに置いてパスを通します。
今回は`/opt`に配備します。

```
$ mv ~/Downloads/dart-sdk /opt/dart-sdk
$ echo export PATH='/opt/dart-sdk/bin:$PATH' >> ~/.zshrc
```

### (3) ※任意 webdevのインストール

ここまでの手順で任意バージョンのSDKはインストールできましたが、ついでにwebdevも入れましょう。
`pub`コマンドで好きなバージョンのwebdevを入れられます。

```
$ pub global activate webdev 2.6.2
```
Gitコマンド一覧

## Linuxの基本コマンド一覧表

自身の備忘録の為に、Linuxコマンドの一覧表を作成しておきます。

環境：Git CMD

現在のパスを表示

```
pwd
```

ファイルのテキストを記載する

```
echo "記載内容" > ファイル名
```

```
//GitHubの設定
//メールが登録されているか確認する
$git config --global user.email

//Githubにメールアドレスを追加する
$git config --global user.email "email@excample.com"

```

```
//ローカルリポジトリを作成するためのコマンド
$ git init
Initialized empty Git repository in /Desktop/works/.git/

//指定したディレクトリにローカルリポジトリを作成
$ git init Desktop/works

//ディレクトリやインデックスの状態を確認するコマンド(ファイルがどのエリアに存在するのかを確認する。)
$ git status

//git status下記内容が表示される場合
//
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)

//GitHubにあるリポジトリをリモートリポジトリとして設定
$ git remote add origin https://github.com/M(自分のアカウント名)/（自分のプロジェクト名）

//コミットログの確認
$ git log

//リモートリポジトリをローカル(自分のPC)へクローンする
$ git clone https://github.com/masaki/example.git

//ファイルをステージングエリアに登録する
$ git add

//gitディレクトリに登録する
$git commit

//変更した内容を他のリポジトリに反映させる(2020/10以前はmain ⇒ master)。
$git push origin main

//ブランチ名を確認
$git branch

```
React の環境構築で躓いたときに読む記事

環境構築時に手こずった内容を記録する。

## Nodistの使用
Nodeのバージョンを切り替えれるツール（PythonのPyenvのようなツール）
v0.9.1で開発が停止？しており、最新のNodeに対応していないため、環境構築時にエラーが頻発する。
複数バージョンを扱う場合は、WSL2かDockerの使用を推奨。
筆者はホストPCとのデータ受け渡しが楽なWSL2+VSCODE(RemoteWSL)環境を使っている。

## docker起動時オプション(firebaseを使用する場合)
`npm start`と`firebase init`でポートにアクセスする必要があるので、下記の様に複数ポートフォワーディングしてコンテナを起動する。

```
docker run -v ホストのソースコードディレクトリ絶対パス:マウント先ディレクトリ -p 3000:3000 -p 9005:9005 -w コンテナ起動時のカレントディレクトリ -it コンテナ名 /bin/bash
```
ポート3000番：テスト用サーバー
ポート9005番：Googleログイン認証
JS基礎文法~if文~

#概要
if文での条件分岐についての記事です。
if文とは、入力の値によって処理を変えて適切な結果を表示します。
プログラムでは、条件分岐の構文を使って処理の流れを変えます。

#if文

```index.js
let score = 50;
const num = 80;

if (score > num) {
   console.log("すごい！");
}else{
   console.log("頑張りましょう");
} 
```

基本的なif文は以下のようになります。
定数numの80よりもscoreがtrueの処理とfalseの処理を記述します。

```index.js
score > num ? console.log("すごい！") :  console.log("頑張りましょう");
```

短縮すると上記のようになります。

```index.js
 let score = 10;

 if (score < 60) {
   console.log("頑張りましょう");
 }else if(score >　60 ){
    console.log("さすが");
 }else {
    console.log("前進あるのみ");
 }
```

上記のプログラムだと数字以外が変数に代入された場合に前進あるのみと処理されます。

#論理演算子

```index.js
let name = "あ";
const job = "医者"

if(name === "なお" && job ===　"医者" ) {
  console.log("ご本人です");
} else {
  console.log("他人です");
}
```

A　&&　B ▶両方がtrueであればtrue
A || B ▶どちらか一方がtrueであればtrue
#obniz のブロックプログラムで 2台のデバイスを連動させる【 #GWアドベントカレンダー 2021/4/29 】

以下の [自分用の #GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2021/103) 4/29 の分の記事も兼ねたメモです。

●2021年はマイペースに（ @youtoy ） | GWアドベントカレンダー
　https://gw-advent.9wick.com/calendars/2021/103

## 概要
今回の内容はタイトルの通り、obniz のブロックプログラムで 2台のデバイスを連動させる、というものです。今回の記事の中で用いたデバイスについて、 一方は obniz Board 1Y を使いましたが、もう一方は obnizOS が入った M5StickC を使ってやってみました。

先に、今回作った内容の動画を掲載してみます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/ehoWZwMQUkY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 詳細
今回の内容の元になった記事があり、ここでその @wicket さんの記事を紹介します。

●ブロックプログラムで遠隔地IoTを行う - Qiita
　https://qiita.com/wicket/items/0c69b308c8b582d1e086

ブロックプログラム上で obniz との接続を行うブロックを 2つ配置し、それらの ID を異なる 2台分のものにすると、それら別々のデバイスを制御するプログラムを 1箇所で書くことができる、というものです。
さらに、一方のデバイスにつながったセンサー等から得られる値をもとに、他方のデバイスの制御を行うようなことも容易に実現できる、というものでした。

そこで今回、「一方のデバイスの加速度センサーの値を元に、他方のデバイスにつないだサーボモーターの角度を変化させる」という内容にして、上記の仕組みを自分でも試してみました。

### 作ったプログラム
作ったプログラムは、以下のような内容です。

![2台を連動させるブロックのプログラム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1c5879d9-cecb-a918-aad2-99f12c77472f.jpeg)

一部、内容を補足すると、以下のような対応を行っています。

- 角度は 0〜180 まで設定できるようだったので、それを45度ずつの 5つの範囲に分割
- M5StickC のディスプレイを真上にした状態からディスプレイが真横になる角度まで回転させた時、おおよそ -1〜1 の値をとったので、その区間を不均等に 5分割
   - センサーの値の判定で小数が使えなかったので、センサーの値は 10倍にしてから変数で保持するようにした
- 上記の分割した範囲をプログラム中で紐付け
- 角度の変化の支持出しのタイミングを適当に 500ミリ秒間隔似設定

それと、動画を見ていただくと分かるのですが、自分が使ったサーボモーターが動く範囲が 180以上動くもので、ブロックプログラムで設定した値よりも大きな角度のところまで動いています（ブロック中の角度指定と、実際の角度が不一致）。もし、実際に動く角度が重要な作品を作る場合は、これらの値の違いをうまくマッピングして吸収してやる必要がありそうです。

## まとめ
当初、2台の obniz を連携させる話を考えた時に、ちょっと前に書いた以下の記事の内容と、HTTPリクエスト（GET）のブロックを組み合わせる方法が思い浮かんだものの、それだと短い時間間隔で連動させるのは難しいな、と思っていました。

●#obniz のブロックプログラムで作った仕組みを外部からの Webhook をトリガーにして動かす（アプリのインストールを利用） - Qiita
　https://qiita.com/youtoy/items/668ffd93f6dea3d7a2de
![HTTP_GET.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/06c90560-ea29-3c0a-86a5-73d398e0a301.jpeg)

そして JavaScript でプログラムを書いてしまえば、とも思いつつ情報を調べていたら、上記の「概要」のところで書いた記事の内容に行き当たり、今回の記事で実装した仕組みを実現することができました。

自分が何かを作る話なら JavaScript で書いてしまえば良い話ではあったのですが、自分以外で作品を作りたいという方が JavaScript が得意でない等といった場合に、今回の方法を提示できたりして便利だったりするので、試せて良かったです。
VSCodeでVue.jsの import '@/xxxx'がコンパイルエラーになる

以前も起こったがどう解決したか忘れてしまっていたのでメモ

## 開発環境

| エディタ | VSCode |
| -- | -- |
| フレームワーク | Vue2 |
| 言語 | Typescript |

## 現象
![スクリーンショット 2021-04-29 13.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946622/a44ec941-1aad-9bb1-bd55-8c38a8647875.png)

- `import A from '@/A.vue';`の形式でコンポーネントをインポートしようとすると、コンパイルエラーになる
- エラーは出ているが、この状態で`npm run serve`しても問題なく動作する

## 原因
VSCodeで開くフォルダが原因
`ts.config.json`が直下に存在するフォルダを開く必要がある

```
plactice  ← エラーが出ているときはこのフォルダを開いていた
├── vue-typescript
    ├── sample
        ├── vue-ts-plactice  ← VSCodeの「フォルダを開く」からこのフォルダを開く必要がある
            |── node_modules
            |── public
            |── src
            |── package.json
            └── ts.config.json
```
JS基礎③

#概要
プログラミングで使われる変数と定数についての記事です。
JSでは変数をlet,定数をconstで宣言します。
変数は、宣言してから再代入可能です。それに対して、定数は再代入ができません。

```index.js
let 変数名 = 〇〇;
const 定数名 = 〇〇;
```

#定数
定数は、代入した後に再代入することはできません。値を変えたくないときなどに使用します。
またもし値が変わった場合、代入の値を変えるだけで済むのでメンテナンスが楽になります。
定数は宣言したときに値を必ず代入しなくてはなりません。変数のように宣言後に再代入することはできません。

では以下のようなコードを修正していきます。

```index.js
console.log(800 + 600);
console.log(800 + 500);
```

```index.js
const price = 800;
    
console.log(price + 600); //1400
console.log(price + 500); //300
```

#変数
変数とは値をいれて使用する箱のような役割を果たします。
下記の例では、最初に変数priceに800を代入。この時点でpriceという箱に800が保存されています。
こうすることで、値を再代入することで処理を使い回すことができます。


```index.js
let price = 800;
    
console.log(price + 600); //1400
console.log(price + 500); //300

price = 500;

console.log(price);

console.log(price + 600); //1100
console.log(price + 500); //1000
```

更に変数は再代入することができます。
price = 500;とあります。これは、priceに500を再代入しています。ここで、consoleで確認します。コンソールで500と確認することができました。

変数名定数名ともに、$マークや大小の大文字小文字、アンダースコアなどが使えます。しかし、JSの予約語は使えません。

#ブロックスコープ

```index.js
   let fruit = "りんご";

   if (fruit === "りんご") {
     let food = "ケーキ"; //ケーキ
     console.log(food);
     if (fruit === "りんご") {
　　　　console.log(fruit); //りんご
       console.log(food); //ケーキ
     }
     console.log(food);　//ケーキ
   }
   console.log(fruit); //りんご
   console.log(food);  //定義されていませせん

```
変数フルーツはグローバル変数といいます。同じページ内からであれば呼び出すことができます。
if文で宣言されたfoodには、ケーキが保存されています。変数foodはローカル変数といいます。
変数foodはif文のスコープ内であれば呼び出すことができます。
ただし、スコープの外では無効になります。
*スコープとは、{処理}の範囲になります。


#再宣言

変数は再宣言することができますが、同じスコープ内では再宣言することはできません。

```index.js
if (fruit === "りんご") {
    let food;
    console.log(food);
    let food;
 }
```

```index.js
   let fruit = "りんご";

   if (fruit === "りんご") {
     let food = "ケーキ";
     console.log(food);
     if (fruit === "りんご") {
       let food = "カレー";
       console.log(fruit);
       console.log(food);　//カレー
       let food = "シチュー"; //error
     }
     console.log(food);
   }
  console.log(fruit);
  console.log(food);
```

#関数スコープ

変数foodのりんごは関数名フルーツ内でのみ呼び出すことができます。

```index.js
function fruit () {
  let food = "りんご";
  console.log(food);
}

function buy () {
  console.log(food);
}

fruit(); //りんご
buy(); //error
```
Ubuntu 20.04にCockpitのインストール手順

# 概要
Cockpitを利用してサーバ及びVMを管理するためのインストール／セットアップ手順です。
Cockpitで管理するサーバにはCockpitをインストールしてcockpit.socketを起動させる必要があります。
Cockpitは標準でポート9090を利用しますがGitLabを利用されている場合はポート9090は既に利用されているため別のポートを利用する必要があります。


# Cockpitサーバのセットアップ手順
## Cockpitのインストール
aptを利用してCockpitをUbuntu20.04にインストールできます。
1. sudo apt update
1. cockpitをインストール。<br/>sudo apt -y install cockpit
1. Cockpitを起動する。<br/>sudo systemctl start cockpit
1. 確認する。<br/>sudo systemctl status cockpit
1. OSを再起動した場合でも起動するようにする。<br/>sudo systemctl enable cockpit

## ファイアウォールの設定
Cockpitはデフォルトでポート9090を利用します。ファイアウォールが有効な場合はポート9090を開放します。
1. ファイアウォールが有効か確認。<br/>sudo ufw status
1. 無効な場合はこのファイアウォールの手順はスキップ
1. ポート9090を開放。<br/>sudo ufw allow 9090
1. 設定を確認。<br/>sudo ufw status

## Cockpitページの表示
Webブラウザから次ぎのURLを開くとCockpitのページが表示します。Cockpitはデフォルトでポート9090を利用します。
http://<CockpitをインストールしたサーバのIPアドレス>:9090

# Cockpitで管理するサーバにCockpitのインストール手順
1. sudo apt update
1. cockpitと関連パッケージをインストール。<br/>sudo apt -y install cockpit cockpit-packagekit
1. sudo mkdir -p /usr/lib/x86_64-linux-gnu/udisks2/modules
1. Cockpitを起動する。<br/>sudo systemctl start cockpit.socket
1. 確認する。<br/>sudo systemctl status cockpit.socket
1. OSを再起動した場合でも起動するようにする。<br/>sudo systemctl enable cockpit.socket

## Cockpitが利用するポートの変更
1. 利用されているポート一覧を表示<br/>sudo lsof -i -P -n | grep LISTEN<br/>特定ポートが利用されているか確認<br/>sudo lsof -i:9090
1. ポート9090が利用されている場合は別のポートを利用するように設定する
    1. Cockpitソケット設定用のディレクトリを作成。<br/>sudo mkdir /etc/systemd/system/cockpit.socket.d/
    1. ディレクトリに移動。<br/>cd /etc/systemd/system/cockpit.socket.d/
    1. 設定ファイルを作成。<br/>sudo vi listen.conf
    1. 次のように内容を追加。ポートを変更する場合は最初に「ListenStream=」が必要です。<br/>[Socket]<br/>ListenStream=<br/>ListenStream=<利用するポート番号>
    1. デーモンを再ロード<br/>sudo systemctl daemon-reload
    1. Cockpitを再起動<br/>sudo systemctl restart cockpit.socket
1. ファイルウォールで指定したポートを開放<br/>上記の「ファイアウォールの設定」を参照

以上
Djangoを触ってみる

pythonの基礎を身に着けたので何かフレームワークを触りたいなと思い、Djangoを触ってみることにしました。

#環境構築
pythonを入れる

こちらのチュートリアルの通りに進める
https://docs.djangoproject.com/ja/3.1/intro/tutorial01/

こんな感じでコマンドを叩くとプロジェクトが作成できる

```
django-admin startproject myapp
```

こんな感じでコマンドを叩くとサーバーが起動できる

```
python manage.py runserver
```

 http://127.0.0.1:8000/ 
にアクセスしてスタートページを起動




#アプリの作成
下記コマンドでポーリングアプリなるものが作成できる。pollsディレクトリが作成される。

```
python manage.py startapp polls
```

とりあえずビューを作る

```python:polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

```polls/urls.py 
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

```myapp/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```

http://127.0.0.1:8000/polls/
にアクセスしてページが表示できることを確認する。

#Database の設定
settings.pyを開く。

データベースの設定について、今回は試すだけなのでデフォルトのSQLiteを使用する。
TIME_ZONEを設定するらしいので
TIME_ZONE = 'UTC'→TIME_ZONE = 'Asia/Tokyo'に変更する。


以下のコマンドを実行するとテーブルが作成されるらしい

```
python manage.py migrate
```

#githubにアップロードしてみる
プロジェクトを作ったディレクトリで下記コマンドを実行する。

```
git init
```

```
git add -A
```

```
git commit -m "new"
```

```
git push origin 作ったリポジトリ名
```
↑エラーがでたため、下のコマンドを実行

```
git remote add origin 作ったリポジトリ名
```

```
git push origin master
```


今回はここまで、続きはまた今度
プログラマ3年目のあなたに、AWS認定試験の受験をオススメしたい

# 要約
AWSの試験を受けると
より多くの技術が自分ごとになるよ
おまけで資格がついてくるよ

# AWSの認定試験とはなんですか
パブリッククラウド上でのアプリケーションの開発・運用基盤を提供する
クラウドサービスの最大手 [AWS](https://aws.amazon.com/jp/what-is-aws/ "Amazon Web Service") が実施する資格試験のこと

AWSの提供するサービスについての理解度を試験を通して確認・証明するためのしくみですが
後述のとおり「AWSの知識証明」にとどまらない受験メリットもあるよ


# AWS認定試験はこんな人にオススメ
* 社会人になってからプログラミングを始めた
* 要件をみたすプログラムを自力で書ける程度の力がついてきた
* 開発者としてのキャリアパスにいまひとつ自信がない、悩んでいる

このあたりに当てはまるなら、
AWSの認定試験を受けてみることは、ポジティブな結果を期待できるかも

# おもなオススメ理由
1. 「クラウド」の利点をより深く理解できる
2. 問題をアーキテクチャで解決する思考訓練になる
3. ネットワーク技術知識のキャッチアップになる

### 1. 「クラウド」の利点をより深く理解できる
クラウドサービスの代表的な利点のひとつは、物理的なハードウェアの導入・保守コスト(運搬、配線工事、災害対策など)を放棄しながら
ハードウェアの**機能**のみを、**物理的制約を超えてより柔軟に享受**できることにあります。
(ネットワークつなぐのにLAN線要らず、Webの管理画面上の接続操作で作業完結、とか)

資格試験は、このクラウドの利点を軸に『非クラウドの運用上の問題を、クラウドで解決するためにはどうする？』という観点がしばしば含まれます。

**クラウドじゃないとこんだけ困る！**
**クラウドだったらこうなる！**

…という組で理解していくことになるので、クラウドの利点を、具体的な事例をもって理解に落としこめます。

各社サービスで機能差はあれど、主要なメリットは等しくカバーされるでしょうから、
クラウドサービス一般に通用する納得感が(運用経験なしに)得られるのは、資格受験の強みであるように思えます。


###２．問題をアーキテクチャで解決する思考訓練になる
認定試験においては、アプリケーションの動作基盤であるインフラの**信頼性**(極力ダウンしない、復旧が早い など)を確保する方法についての問題が多く出題されます[^1]。

インフラにおける信頼性は、おもに(機能自体の実装というよりは)機能どうしをどういう構成で配置するか、という**アーキテクチャ**によって実現されます。

アーキテクチャによって信頼性を担保するという発想は、プログラムの記述においても非常に重要です。
プログラムが**拡張性**や**トラブル耐性**(不具合が出たときの影響範囲の限定能力とか)といった要素を獲得するためには『ソースコードをどうまとめ、まとまりをどう組み立てるか』という**アーキテクチャ思考**の寄与するところが大きいためです。

プログラムの話はプログラム向けの書籍を読む、が手っ取り早いかもしれませんが、
AWSの試験は前述のとおりケーススタディが多いという点で理屈をつかみやすく、考え方をとらえる良い題材になりえるように思えます。


###３．ネットワーク技術知識のキャッチアップになる
１．に近い観点で、主にWeb系のかた向け。

たとえばかけだしWebエンジニアなら、多くの場合、ネットワークプロトコルを理解しなくても業務を遂行できる状況にあるでしょう。
一方で、これらの知識はWebアプリケーションにとっては大前提ですから、たとえば技術選定などのフェーズにおいては、これらの知識は選定基準の裏付けになりえます。

仕様から固める、技術を選ぶ、といったフェーズに職務範囲を広げたい方には避けがたい領域…と考えると
**嫌でもネットワーク周辺の知識に触れる**ことになるAWSの認定試験は、勉強のいい口実になってくれるでしょう。


# おわりに
たまたま機会があったので[AWS SAA](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/ "AWS Solution Architect Associate")の試験を受けたのですが、
調べることを後回しにしてきたこと/まったく知らなかったこと、どちらも学ぶいい機会になったと感じたので、**過去の自分**に書くような気持ちで書きました。

AWSの資格取得はあくまで選択肢のひとつですが、
・実施のハードルが低め( 一人でできる、出版物多い、難度選べる )
・履歴書に書けるおまけつき
...という点で、実現性と実用性にすぐれるように思えます。

将来のために何をすればいいかわからない、とっかかりがほしいと望んでいるエンジニア(とくにWeb系)の方は、やらないよりは大方ハッピーな結果になると思います。ご検討ください:thinking_face:

※AWS からお金をもらって書いたわけではありません お金ください
　[GCP](https://cloud.google.com/certification/?hl=ja "Google Cloud Platform")や[Azure](https://docs.microsoft.com/ja-jp/learn/certifications/browse/ "Microsoftのやつ")にも同じような資格制度があります。興味があるものを受けるといいと思います

[^1]: 私が受けたSolution Architect Asociateの試験はこれが主要なトピックのひとつでした。ほかの資格タイプだと、あまり問われないかもしれません。Solution Architect(SA)がいちばん領域的には広く扱うようなので、資格種に悩むなら、サービス全体を鳥瞰できるSA受験がいいのかなと個人的に思っています。
[AWS_03]請求金額のアラート設定

##無料枠を超えたときのアラート設定
1. ルートユーザーでログインする。
1. `自分のユーザー名　＞　マイ請求ダッシュボード　＞　請求設定`をクリックする。
1. `無料利用枠の使用アラートを受信する`と`請求アラートを受け取る`にチェックを入れ、受け取るメールアドレスを入力して、設定を保存する。

##指定金額を超過したときのアラート設定
1. マネジメントコンソールから`cloudwatchを検索する。`
1. 請求アラートは`米国東部 (バージニア北部)us-east-1`リージョンのみ設定可能らしいので、リージョンをバージニアにする。
1. `アラーム　＞　請求　＞　アラームの作成`をクリックする。
1. 条件の`...よりも`のフォームに指定金額を入力して、次へ。今回は10USD。
1. SNSトピックの選択で新しいトピックを追加する。トピック名は[Billing-Alarm]とか適当。通知を受け取るメールアドレスを入力して、通知の追加をクリックして次へ。
1. アラーム名と内容を適当に決めて次へ。
1. アラームを通知するメールアドレスへ確認のメールが届くので、そのメールを確認して設定完了。
1. 最後に`cloudwatch　＞　アラーム　＞　請求`でアラームが作成されていることを確認する。
AWS ground station 使ってみた（い）が無理そう

# 0.はじめに

https://aws.amazon.com/jp/ground-station/

>AWS ground stationは、衛星通信のコントロール、衛星データの処理、衛星運営のスケーリングを可能にする完全マネージド型サービスです。

？？？？？？？？

何ができるのかよく分からない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661133/3fb29b4c-79f3-0aa7-4135-a784e6c2a284.png)

>衛星は、天気予報、地表画像撮影、通信、放送など、幅広いユースケースで使用されています。

？？？？？

>Ground stations は、グローバルな衛星ネットワークの中心を形成しています。  AWS Ground Station では、AWS のサービス、ならびに、低レイテンシーのグローバルファイバーネットワークを含む AWS のグローバルインフラストラクチャへの、直接的なアクセスが提供されます。


**つまり何ができるんだろう。**


# 1.コスト

まずは、利用コストについてのお話です。
お高いんでしょう…？？？

と思いきや、なんとなんと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661133/858062dd-6c48-9e0e-0488-8fad0bb4d6d3.png)

**1分あたり3 USD～22 USD**

1時間辺り日本円で2万円から15万円くらいでしょうか。

**…めちゃくちゃ高い。**

# 2.使用までの流れ

まず大前提として、アメリカのアマチュア無線的なライセンスが必要らしいです。

上記のORAD IDとFCCライセンスを登録後、AWSコンソールから、衛星のスケジュールを予約します。

https://ja.wikipedia.org/wiki/%E9%80%A3%E9%82%A6%E9%80%9A%E4%BF%A1%E5%A7%94%E5%93%A1%E4%BC%9A

Federal Communications CommissionでFCC、連邦通信委員会のライセンスらしいです。

https://ja.wikipedia.org/wiki/%E5%8C%97%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E8%88%AA%E7%A9%BA%E5%AE%87%E5%AE%99%E9%98%B2%E8%A1%9B%E5%8F%B8%E4%BB%A4%E9%83%A8

NORAD IDは北アメリカ航空宇宙防衛司令部の衛星の管理番号だとか。。。

そしてスケジュールの時間が来たら、衛星と通信し、データを取得して、AWSの様々なサービスに連携して活用する事が可能です。

**全然分からない...**


# 3.何に使えるのか

結構幅広い分野での使用が期待されているようです。

例えば、独自で衛星写真を入手したいとき。

災害情報などを即時に察知する。

グローバルなデータ通信を行いたい。

AWSの各データ分析サービスとの連携が可能なようなので、
入手したデータは、Amazon Kinesisなどでリアルタイムストリーミングで処理して、S3に保存したり、

AWS SageMakerでそのまま分析を行ったり...

う～ん、、、何に使えばいいんだろう。

実際に使ってみようと思ったら、先ほどのライセンスが登録されないとスケジュールすら建てられないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661133/31fb194d-f997-daa3-a78e-219660fd1e9b.png)


# 4.まとめ

雑なまとめですが、日本国内企業が使うのは結構ハードルが高いのではないでしょうか。

http://www.phase-sa.com/fcclicence.html

FCCライセンス自体は、国内からでも取得可能なようなのですが、

「ground station 使ってみた」で、日本国内の事例、個人の利用が全然見受けられないので、


これから共同利用などでもっと敷居が下がって、GoogleEarthのような感覚で、

衛星画像をリアルタイムで受信する事が出来るようになる日が来るのではないでしょうか。
【Docker】docker-compose を最新版にアップグレードする

久しぶりにdockerを触ろうとした時にdocker-composeのバージョンが古いことが判明。
docker-composeのバージョンのアップグレードが必要でした。
アップグレード手順について覚書として簡単にまとめます。
(注: curlコマンドでインストールしていた場合の手順です。インストール状況などによって下記手順は異なります。)

## docker-compose インストール場所を確認する

公式に記載のcurlコマンドでインストール実施している場合はここにインストールされているはずです。

```terminal
ls -l /usr/local/bin/docker-compose
```

## 古いバージョンを削除する

```terminal
sudo rm -rf docker-compose
```

## 最新バージョンをインストールする

```terminal
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

**「1.29.1」の部分を最新バージョンに置き換えてください。**

※最新バージョンの確認はgithubの公式リポジトリのReleasesを参照する
[github | docker-compose](https://github.com/docker/compose/releases/)



## 実行可能権限をバイナリに適用する

```terminal
sudo chmod +x /usr/local/bin/docker-compose
```

## バージョンを確認する

```terminal
docker-compose -v
```

最新のバージョンが確認できたらアップグレード成功です！


参考:
[Docker 公式サイト](https://docs.docker.jp/compose/install.html#linux-compose)
オンライン授業を1秒で起動する

#ZOOMを起動するのって面倒くさい
オンライン授業になってからはや一年が経とうとしています。
ここ一年間、毎日4〜5回、異なるZoomリンクを踏むために Moodleにログイン→授業のページ→ZOOMリンクを踏む→勝手に開くタブを閉じる、という作業をしてきたわけですが、正直面倒くさい。
##なのでAlfredで自動的に開ける様にしました。
自分は以前から授業の予定をすべてiCalにまとめていました。そこにZOOMのリンクを貼ってるんですけど、これをAlfredからその時間にあるミーティングを開けたらなぁと思っていました。なので、シェルスクリプトを書いて、それをAlfredからキーワードで呼べるようにしました。
##必要なもの
###[icalBuddy](https://hasseg.org/icalBuddy/)
`brew install ical-buddy`でインストールしてください。iCalをターミナルで見るためのCLIです。
###[Alfred Powerpack](https://www.alfredapp.com/shop/)
£50しますけど、これがないと生きていけないと思います。
##Workflow自体
[Packal](http://www.packal.org/workflow/ical-zoom-launcher)からダウンロードできます。
##主なコード
```zsh:zoom.sh
tenMinutesAgo=$(date -v-10M)
tenMinutesFromNow=$(date -v+10M)

# this is for intel Macs where homebrew will install under /usr/local/bin
[[ -a /usr/local/bin/icalbuddy ]] && url=$(/usr/local/bin/icalbuddy -ic 'School' eventsFrom:$tenMinutesAgo to:$tenMinutesFromNow | egrep -o 'https:\/\/.*')

# this is for M1 Macs where homebrew will install under /opt/homebrew/bin
[[ -a /opt/homebrew/bin/icalbuddy ]] && url=$(/opt/homebrew/bin/icalbuddy -ic 'School' eventsFrom:$tenMinutesAgo to:$tenMinutesFromNow | egrep -o 'https:\/\/.*')

zoom="zoom"
discord="discord"

if [[ $url =~ $zoom ]]; then
  open -a "zoom.us" $url
elif [[ $url =~ $discord ]]; then
  open -a "Discord" $url
else
  echo 'No Valid URL'
fi
```
私は授業をZoomでやる先生と、Discordを使う先生がいるので、リンク別に起動するアプリを変えています。もしほかのアプリを使っていれば、最後の分岐で足して上げてください。
また、icalbuddyの `-ic` というオプションを使ってカレンダーを絞り込んでいます。ここを自分のものに合うように設定してください。
firebaseのデータ削除方法

# 初めに

* 参考にしたサイトは[こちら](https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja)
* firebaseのデータベースの削除方法で苦労したのでアウトプットとしてこの記事を書きました。

### データベースの削除
指定したドキュメント(id)を削除するは

```
db.collection('').doc(id).delete()
```

上記のコードでできたのですが、コレクション全体を一括削除する時に

```
db.collection('').delete()
```
上記のコードで出来ると思ったのですがエラーになってしましました。<br>
エラーの原因は、コレクションを直接削除しようとしたところと判明しました。<br>
コレクションを削除するにはコレクション内のすべてのドキュメントを取得して削除しないといけなかったみたいです。<br>
→[参考サイト](https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja)

解決方法としてbatchメソッドを活用しました。<br>
[引用先](https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja)
>オペレーション セットでドキュメントを読み取る必要がない場合は、複数の書き込みオペレーションを 1 つのバッチとして実行できます。このバッチには、set()、update()、delete() オペレーションを自由に組み合わせて含めることができます。書き込みのバッチはアトミックに実行され、また複数のドキュメントに対する書き込みを実行できます。

```
 const Ref=db.collection('');
    const batch = db.batch();
    for(const product of products){
      batch.delete(
        Ref.doc(product.id)
      )
    }
    batch.commit()
    .then(()=>{
      console.log("成功")
    })
```

（productsには対象のコレクションのドキュメントの情報がすべて入っていると仮定します。）<br>

上記のコードでbatchメソッドを実行し一括削除することに成功しました。
Microsoft Access帳票フォームでの重複入力チェック

Accessテーブルと紐づく帳票フォームで、キーではない項目の重複入力チェックをやるにあたって。
なぜかネットではしっくりくる結果が得られなかったので、いろいろやった結果のメモ。

#### 1.レコードの重複チェック⇒DCount関数を使う
ネットで「Access 重複チェック」とググったら、ほぼこれ一辺倒。
あと「重複クエリ」云々なんてのもありました。

いや、でもね。
例えば帳票フォームで10レコードくらいしかなく、目チェックが早いレベルとして。
その裏にベースのテーブルが数十万レコードあったら（しかもインデックスなし）、どうすんよ？:frowning2:
***
#### 2.そやったら
人間の動きをシミュレーションしてやってみては？
フォームに表示したレコードのみで処理するから、DCountより速いのでは？

``` VB
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset
Dim i As Long, 検索条件 As String
Set rs1 = Me.RecordsetClone
Set rs2 = rs1.Clone           ' フォームのRecordsetCloneの、さらにCloneを作成

rs1.MoveFirst
i = 1
Do While (Not rs1.EOF)        ' 帳票フォームの先頭からチェック
    検索条件 = "[条件1] = " & rs1![条件1]
    With rs2
        .FindFirst 検索条件    ' 調べてるキーで最初から検索⇒ここで、おそらくrs1のカレントレコードがヒット
        .FindNext 検索条件     ' 同一キーで次を検索⇒キー重複がなければここでNoMatchのはず
        If Not .NoMatch Then  ' さらにマッチした＝重複あり
            MsgBox i & "行目と" & (.AbsolutePosition + 1) & "行目のデータが重複しています。", vbExclamation
            Exit Do
        End If
    End With
    rs1.MoveNext
    i = i + 1
Loop
```

これやと、具体的な重複行を指摘できて親切かも。
***
#### 3.で、パフォーマンスはどうなん？
DCountと比べ、どちらがどのくらい速いかを実験。

【環境】
・Windows10 Pro/Intel Xeon Gold 6126(2.6GHz×2)/8MB RAM/Access2013（VDI環境）
・ベースのレコードはインデックスなしの10,000件
・フィルターでフォームの表示件数を変えながら、最後＆最後から１件前が重複するケースを５回計測

【結果（平均：秒）】

| 画面表示 | DCount | Find検索 |
|:-----------|------------:|:------------:|
| 10,000件 | 228.29 | 123.81 |
| 1,000件 | 22.81 | 1.14 |
| 100件 | 1.95 | 0.01 |

当然ではありますが、フォーム表示件数が少ないほど、Find検索の速さが際立ちますね・・・
Researchmap に Google Analytics を連携させる

Researchmap のブログを書くときに閲覧者数とか見れたらいいなと思ったのですが、 Researchmap 自体にはアクセス数を見る機能はないみたいです

ただ調べたらこちらの記事であるように Google Analytics を使って閲覧者数を見ることは可能みたいです

http://neko-to-hirune.blog.jp/archives/51922776.html

公式でも 2020年の2月にGoogle Analytics を有効化した、という発表があったので、せっかくなのでそのやり方を qiita で共有したいと思います

### Google Analytics の設定
基本的なやり方は以下の記事の通りなのですが、１点だけ注意する点があります

https://web-kanji.com/posts/google-analytics-setting

それはプロパティ作成時に「詳細オプション」を指定して「ユニバーサルアナリティクスプロパティの作成」を有効化することです

![スクリーンショット 2021-04-29 11.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/ed3b7c95-ab85-cf13-52f0-9062c6bd6dba.png)


~~最新の Google Analytics ではこの設定はデフォルトでオフになっていますが、Researchmap 側の仕様が少し古いため、このオプションを指定し、従来型のトラッキングIDを作成する必要があります~~

2023年6月からGA-4に対応したようです
ユニバーサルアナリティクスプロパティのみを作成してもG-から始まるトラッキングIDが取得できれば問題ありません

### Researchmap 側の設定
Researchmap 側の設定は簡単です
発行したウェブプロパティIDを「設定」→「研究者情報」→「研究者番号、ORCID ID等のID項目」の Google Analytics ID に貼り付けるだけです

![スクリーンショット 2021-04-29 11.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/8439650a-a29c-d7aa-8c5d-8bd94dd3a909.png)

これで Researchmap の閲覧状況が Google Analytics で見られるようになります！
pytorch lightingでCould not find a version that satisfies the requirement pytorch-lighting と言われる時

[公式のissueより](https://github.com/PyTorchLightning/pytorch-lightning/issues?q=Could+not+find+a+version+that+satisfies+the+requirement+pytorch-lighting)
自分の場合はGTX3090+cuda11.1+torchの1.7以上を入れた時に発生しました。以下のコマンドを実行し、gitから直接入れてやることで入ります。

```bash
pip install git+https://github.com/williamFalcon/pytorch-lightning
```
[AWS_02]2段階認証の設定

##認証設定
1. chromeの拡張機能[Authenticator]を追加。（スマホアプリでも可）
1. `AWSマネジメントコンソール　＞　ユーザー　＞　{認証を割り当てるユーザー}　＞　認証情報のタグ`を選択する。
1. `MFAデバイスの割り当て`の管理をクリックして、仮想MFAデバイスのラジオボタンを選択して`続行`をクリックする。
1. QRコードが表示されたら、chromeの拡張機能のAuthenticatorを使って、MFAコードを2つコピペして設定完了。
1. 最後に認証設定をしたユーザーでログインした時に認証を求められ、ログインができるか確認する。
Datasaber 課題：Viz作成-02

## Datasaber 課題：Viz作成-02

### ■ この文書は何か：
Datasaber 課題で、なんでもいいからデータを用いて Viz を作成して公開せよ！！
っていうフリースタイルな課題があったため、``やったこと``と``学んだこと``をめちゃくちゃラフにまとめる。第二弾

### ■ 結論：
- やったこと；
    - City からジオコーディングして、State ごとに目撃情報の数を可視化
    - 地域ごとに目撃情報の時系列変化や、形状に特色があるかを調べた
        - 時系列の増加傾向だったり、形状には地域差はなかったが、一貫して7~10月で目撃情報は最大値
- 成果物；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194994/6f9d48a6-62b8-02d2-a16f-0d77f198b50f.png)

### ■ 以下、作業 log.

#### 1. データセットの用意と、目標設定
今回は、「世界の UFO 目撃報告」に関する csv データを使うことにした。使えそうなデータは以下。

| Column | Data 例 |
| --- | --- |
| City（都市） | Dallas |
| State（州） | TX |
| Datetaime（目撃時間） | 1998/10/29 19:00:00 |
| shape（形） | disk |
ここから何をビジュアライズするか考えて、目標設定する。
- 位置情報があるから、マップを使って何かしらを表現したい...
- 地域ごとの目撃情報の数から、どの地域で UFO 目撃頻度が高いか分かるかも...
- UFO の形状を地域ごとに分析して、地域差があるか調べられるかも（NY は殆ど disk 型！とか）

#### 2. ジオコーディング（Tableau 関係ない・・・）
- 今回も data.world からデータを拝借。UFO の目撃情報に関するデータをゲット
（Special thx:tada:：https://data.world/timothyrenner/ufo-sightings）
- 地図上に目撃情報を mapping したいから、City → 緯度/経度情報に変換したほうが使い勝手が良さそう。
    - ジオコーディングというらしい。無料の一括変換 Web があったから使った（https://data.world/timothyrenner/ufo-sightings）

#### 3. あとは Tableau で可視化するだけ
- 工夫点としては、ディメンションで plot するとグッチャグチャだから、
```メジャーに変換して、カウント値でサイズを変化させるポイントを State ごとに plot した```

| Before（脳死） | After（ちょっと考えた） |
| --- | --- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194994/98f49c34-e59f-77f0-efce-dc1a4fc11ea3.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194994/a83ccc93-e44b-20f8-a267-1f48522b63d7.png) |

- タイムスタンプだったり、形状情報があったため、州ごとにおける傾向を可視化できるダッシュボードを作成（簡単）

#### 4. 考察
- 東アメリカに目撃情報が偏ってる傾向が見られる。が、目撃情報が最大となる地域は西海岸のカリフォルニア
- 基本的に地域に寄らず、2014年に目撃情報が最大値を取っていて、1年間傾向を見ると 7月 - 10月に目撃数増大
- 形状も一貫して「light」型の目撃情報が一番多い。（disk 型じゃないんや）
- ```!!! 過去のトレンドから NY に 7 月に行けば、細長い UFO が見れる可能性が高いよ !!!```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194994/2900a567-6583-c12b-fbdc-70362446fcf5.png)
ia16-elf-asを使ってみた

8086のMachine codeを参照したかったので、IA16用binutilsに含まれるia16-elf-asを使ってみました。

# インストール
ubuntuを使っているならパッケージがありましたので、これを使いました。

```
$ sudo add-apt-repository ppa:tkchia/build-ia16
$ sudo apt-get update
$ sudo apt-get install binutils-ia16-elf
```

詳しい手順はオフィシャルのドキュメントを見てください。

* https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/

インストール先は/usr/binです。

```
$ dpkg -L binutils-ia16-elf
/.
/usr
/usr/bin
/usr/bin/ia16-elf-addr2line
/usr/bin/ia16-elf-ar
/usr/bin/ia16-elf-as
...
```

# 使い方

ソースコード例
IA16用のコードを生成するためには.code16という記述が必要みたいです。

```
        .code16
        mov    %ax,    %bx
```

gccの出力をみるともうちょっと記述がありました。

```
         .arch i8086,jumps
         .code16
         .att_syntax prefix
         .text
          mov    %ax,    %bx
```


これをasでアセンブルします。

```
$ ia16-elf-as -o hoge.o hoge.s
```

hoge.oはELF形式です。これをobjdumpで逆アセンブルしてみます。

```
 $ ia16-elf-objdump -d hoge.o
 hoge.o:     file format elf32-i386
 Disassembly of section .text:
 00000000 <.text>:
    0:   89 c3                   mov    %eax,%ebx
```

objcopyでelfをバイナリに変換します。hexdumpで見るとアセンブル結果のみのバイナリになっています。

```
 $ ia16-elf-objcopy -O binary hoge.o hoge.bin
 $ hexdump -C  hoge.bin
 00000000  89 c3                                             |..|
 00000002
```

objdumpでバイナリを逆アセンブルする場合はオプション指定が必要です。

```
$ ia16-elf-objdump -D -b binary -m i8086 hoge.bin
hoge.bin:     file format binary
Disassembly of section .data:
00000000 <.data>:
   0:   89 c3                   mov    %ax,%bx
```

#参考

* https://github.com/tkchia/gcc-ia16
* [FreeDOSとi8086版GCC](https://note.com/dr_nishida/n/ne0d1f9e9f5e1)
Docomo 5Gを使ってみて思ったこと

# Docomoの5Gへの機種変更
ひょんなことから、Docomo回線をXi(4G)から5G回線へ更新することになった。理由は以下。
+ 一人暮らしでレオパレスに引っ越しをしたが、レオネットが最悪。
+ 更新時期を過ぎていたので、docomoでの機種変更手数料が無料だった。
+ 5G回線が実質使い放題プランで使い放題プランの契約が継続できそうであった。

これらの理由からDocomo回線を5Gにしてみた。そのメリットとデメリットを以下に述べる。

# メリット
## 使い放題である
Docomo以外にも5Gの使い放題をうたっている回線はあるが、どれもテザリングが不可である。（PCを接続させる必要があるため、テザリングでの制限が加わっているのは論外である。）
また、IMEI制限を加えている会社も存在しているので、SIMの入れ替えによる他社端末およびSIMロックフリー端末へのSIMの挿入を想定されていなかった。
しかし、docomoの回線に関してはIMEIも完全フリーですし、完全に容量フリーで通信ができる。

ちなみに、筆者は3月に300GBほど月間で通信したが、全く制限がかからなかった。（土日に関しては1日30GBは最低使っていたし、Ubuntuのisoイメージファイルのダウンロードも数回行った。）

## ほとんどの4G端末でも使用が可能
Docomoでは、5Gの通信回線契約のあるSIMカードを4G端末に入れた場合、通信できるかどうかの保証をしていない。一部端末に関しては通信が出来なかったなどの報告があったりするが、私の所有しているiPhone SE 2などでは5G回線のSIMカードを使っても問題なく通信はできている。（デメリットで記述するが、問題点はある。）

# デメリット
## 3G回線の使用ができない
5Gの通信回線契約をするときに、5G端末ではDocomoの3G(FOMAプラスがメイン）を取ることができないことに関する説明が全くなかった。筆者はその辺をあらかじめ調べておいたので、全然問題にならないかと思っていたのだが、地下鉄の電波がこの辺の制限にひっかかるっぽく、地下街などで圏外になることが多発した。他のdocomo端末でチェックすると、3G表示になっていたりしたので、ちょっとがっかりな点である。4Gの電波でこの辺のカバーをしてほしい。

## 端末の代金が高い
まだ、黎明期状態の通信回線なので、仕方ないことではあるが、端末の代金が軒並み高い。それに分割契約をすると、今は36ヶ月分割で24ヶ月でdocomoへ買取（返却）が主流となってしまっているので、まだ少しは軽減されるが、同じ端末を36ヶ月間使用するとなると、バッテリーの持ちが気になるところ。

## ISPにmoperaを選択することができない
Xi(4G)の契約までに関してだが、ISPにSPモードでなく、moperaを選択することができた。moperaからspモードになってできなくなったことは以下。
+ APNに制限なしのアドレスが付与されていたが、SPモードにはなく、なんかしらのフィルターが設定されている。
+ グローバルIPアドレスが付与されない。
+ 固定IPの付与もない
上記のような条件をクリアできるのであれば、別に問題はないのだが、それを大体のdocomoの代理店では説明なしに契約させられる。（そもそもmoperaのISPが選択できることすらしらない営業が多すぎる。）

# 結局メリットとデメリットのどっちが大きい?
個人的にはメリットのほうが大きいと感じる。個人所有の端末がいろいろとあるし、3Gの電波取得できる端末およびSIMカードもあるので、全然困らないし、3Gを取得するSIMカードのプランを安くすることができた。（おまえ通信費にいくら使用しているんだという突っ込みはなしの方向で）。

# 余談

## 余談1)一人暮らしの人にはお勧め
一人暮らしでネットをちょこちょこする人にはお勧めなDocomoの5Gかもしれない。これで、自宅の回線もいいという人に取っては。

## 余談2)ゲームはできるの？
なにそれおいしいの？遅延しまくりなんですが。

## 余談3)諸外国では
日本よりも5Gの普及している海外ではもはや5Gが当たり前の世界になりつつもある。
家庭用の光回線を引かなくてもいい時代ももうすぐそこまで来ている？

## ミリ波に対応した端末が極端に少ない
DoCoMoの5G唯一の利点であったミリ波の5G周波数帯に関しての取得であるが、ほとんどの端末で受信ができない。なんで、ミリ波に対応したという個人的な感想はさておき、最新の端末でもミリ波の対応は難しいのであろうか。
CsvHelper ver 27 リリース

2021年4月22日に、CsvHelper version 27.0.0 がリリースされました。
主な新機能、変更は次の通りです。

新機能

- デリミタを自動判別できるようになりました。デフォルトはOffです。
- 登録されているすべての型に型コンバーターを適用する機能が追加されました。
- 登録されているすべてのタイプにタイプコンバータオプションを適用する機能が追加されました。
- IAsyncEnumerableをWriteRecordsに渡す機能が追加されました。
- 変換に失敗したときにデフォルト値を使用するオプションが追加されました。

仕様変更

- IParserConfiguration.DetectDelimiterが追加されました。
- IParserConfiguration.DetectDelimiterValuesが追加されました。
- IWriter.WriteRecordsAsync <T>（IAsyncEnumerable <T>レコード、CancellationToken cancelToken =デフォルト）を追加しました。
- デフォルトとしてCsvConfiguration.WhiteSpaceCharactersから「\t」を削除しました。

公式ページはこちら。

https://joshclose.github.io/CsvHelper/

ソースコードを見たい方はこちらからどうぞ。

https://github.com/JoshClose/CsvHelper/tree/27.0.0
「Oracle University Webサービス」の受験チケット購入画面で詰みかけた。

「Oracle University Webサービス」の受験チケット購入画面で詰みかけた。
https://education.oracle.com/
また購入する時にやらかしそうなので、自分用に書き留めておきます。

①申込の流れを見たいならこのURLから確認しよう。
https://www.oracle.com/jp/education/guide/index-172719-ja.html

②受験チケットを購入したい場合はこのURLから飛ぶと早い。
https://www.oracle.com/jp/education/certification/evoucher-172585-ja.html#purchase

③購入画面で詰んだ場合は、下記URLのお知らせを参照するといい。
https://www.oracle.com/jp/education/maintenance-172118-ja.html

>お知らせ
Web からのご注文/購入時に、エラーが発生した場合は下記手順を行った後、再度お申込みをお願い致します。

>オラクルユニバーシティ・サイトでログイン（Oracleプロファイルにて）
ショッピングカートに入っている商品を削除
ブラウザーのキャッシュを削除
（ブラウザーはFireFoxまたはChromeを推奨）
※カートにはなるべく商品を残したままにされないよう、お願いいたします。
問題が解決しなかった場合は、恐れ入りますが、コールセンター(0120-155-092)までお申込みいただけますようお願いいたします。

***
以降は徒然なるままに書いておく。

「受験チケット購入」画面の「①申込責任者詳細」タブで、顧客番号以外の入力項目をすべて埋めたのにも関わらず、未入力エラーが発生した。

入力項目の言語は「日本語」、国は「日本」、都道府県は「お住いの都道府県名（※東京なら東京都でいい）」、電話番号も（なぜか入力中に項目選択が解除されることがあったが）諦めずに入力する。
感覚的な話でアレだけど、深夜は避けた方がいい気がする。

購入完了画面に切り替わるまで、クレジット決済されない。
（やり直しをするので、何回もクレジット情報を入力する事になった。フィッシングサイトに引っ掛かってるのではないかと心配にもなった。人生でこんなにクレジット番号を打ち込む日は中々ないんじゃないか。）
お知らせの内容通りに何度か試している内に、購入完了画面に切り替わった。

取り合えず、受験チケットが取れてよかった。
これで安心して試験勉強ができる。

できるけど、ちょっと疲れた。

***
まず、受験を決めたら直ぐに申し込んだ方がいい。
Web申し込み後、直ぐに受験チケットは届かないし、申込だけで四苦八苦する。
受験チケットの有効期限は6か月なので余裕もある。
受験料はバカ高いし、苦労して受験チケットを取ったんだぞ。
合格しなきゃやってられないって気持ちにもなりますわ。
[AWS_01]ユーザー作成

##環境
MacBook Pro

##知識・お作法
*基本的にルートユーザーは使わない
　→代わりに管理者権限を持つAdministratorユーザーを作成する。
　　今回作成するのはこのユーザー。
*請求金額を確認するときはルートユーザーでないと見れない。

##ユーザー作成
1. マネジメントコンソールで`IAM`と検索。
1. `アクセス管理　＞　ユーザー ＞ユーザーを追加`をクリック。
1. 作成するユーザー名を入力する。今回は [Administrator]
1. `AWS マネジメントコンソールへのアクセス`にチェックを入れて、次のステップへ。
1. `既存のポリシーを直接アタッチ　＞　AdministratorAccess`にチェックを入れて、次のステップへ。
1. タグは今回は作成せずに次のステップへ。
1. アクセス権限の概要に`AdministratorAccess`,`IAMUserChangePassword`が入っていることを確認してユーザーを作成する。
【サクラエディタ】Markdownにクリップボードから画像を貼り付ける

# オンライン勉強会が増えてきた

コロナ禍でオンラインでの勉強会が増えてきました。
現在の職場が全面的にリモートワークに移行したこともあり、平日の定時後でも勉強会に参加しやすくなってきました。

# 登壇資料の画像を貼り付けたい

愛用のサクラエディタで勉強会のメモをとっているのですが、登壇資料などのスクリーンショットを保存するときにいつも手間取っていました。

- ペイントをいちいち開いて画像保存するか？
- Excelか何かを開いておいて、そこを画像置き場にするか？
- そもそも画像を貼り付けたいなら別のツールでメモを取る方がいいのでは？

など、試行錯誤していたのですがばっちりハマる解決策がなかなか見つからず。。。

# VSCodeに乗り換えるか？

VSCodeの拡張の拡張機能として、編集中のMarkdownに画像（のリンク）を貼り付けられる「Paste Image」というものがあります。

[vscode-paste-image](https://github.com/mushanshitiancai/vscode-paste-image)

Markdownビューアーもあるし、そろそろ本格的にVSCodeに乗り換えるべきかとも思いましたが、Paste Imageの基本機能は、

> - Image will be saved in the folder that contains current editing file
> - The relative path will be paste to current editing file

とのことで、これだったらサクラエディタのマクロとかプラグインでどうにかなるのでは、と思い探し始めました。

# マクロで作ってみた

結局探しても見つからなかったので自分で作ります。

サクラエディタのマクロではVBScriptが使えるので、クリップボードや画像ファイルの操作は普通にできるだろうと思っていたのですが、クリップボードから画像を直接読み出す方法がないんですね。
結局、VBScriptからPowerShellを呼び出して無理くり処理する方法を採用することにしました。

```
Dim exec_script
Dim filename

filename = Replace(Replace(Replace(Now(), "/", ""), ":", ""), " ", "")

exec_script = "powershell.exe -sta -WindowStyle Hidden -Command Add-Type -Assembly System.Windows.Forms;" _
& " if (!([Windows.Forms.Clipboard]::ContainsImage())) {exit} ;" _
& " [System.Windows.Forms.Clipboard]::GetImage().Save('./" & filename & ".png');" _
& " Echo '![./" & filename & ".png](./" & filename & ".png)'"

Set exec = CreateObject("WScript.Shell").Exec(exec_script)
Editor.InsText(exec.StdOut.ReadAll)
```

``[System.Windows.Forms.Clipboard]::GetImage()``で画像ファイルのオブジェクトが取れます。
``CreateObject("WScript.Shell").Exec()``の引数にコマンド文字列を渡すとPowerShellで処理してくれます。

PowerShellを非表示にして実行するやり方がわからなかったので、実行するとPowerShellのウィンドウが開いてしまいますが、とりあえず目的は果たせたのでここまで。

※``Exec()``の代わりに``Run()``を使うなども見つけたのですが、``Echo``の結果が取れなかったり、何かもうひと工夫が必要そうだったので断念しました。

上記のスクリプトをサクラエディタのマクロとして登録して実行すると、編集中のファイルに``![./yyyyMMddhhss.png](./yyyyMMddhhss.png)``というリンクが挿入されます。
画像ファイルは同じフォルダに保存されます。
クリップボードに画像が格納されていない場合は何もしません。

# GitHub

以下で公開しています。
ファイル名とか、保存先のフォルダとか、直した方がいいこともまだまだあるので、気が向いたら修正しようと思います。

投稿直前に気づいたけど、ファイル名の時刻部分がゼロ埋めできてないな。。。

[sakura-editor_paste-img](https://github.com/hamata0222/sakura-editor_paste-img)

# 参考資料

- [PowerShellでクリップボードの画像をファイルに保存する](https://qiita.com/saggie/items/44cb8b317fe0effa5891)
- [クリップボードのテキストを取り出して、VBScriptで扱う](https://qiita.com/int_main_void/items/27c5d250f24cbc6ca025)
- [マークダウンで画像のコピペ – VSCode + Paste Image](https://www.premium-tsubu-hero.net/technology/it/visual-studio-code/howto-vscode-markdown-pasteimage/)
【SQL Server 2019】 Developer と Express の違い

仕事でSQL Serverを使っているので、自分のPCにも入れようとしたのだけど
無料のエディションが2つあり迷いました。

迷っている人への参考になれば幸いです。

#結論#
**Express：公開するサービスのサーバーとして使うならこれ一択。最もローエンドのエディション。
Developer：本番環境には使えないけど、最上位エディションと同等の機能。**

個人がちょっとテストで使う程度ならどちらでも良いと思います。
ハードウェアへの制限がないので、私はDeveloperを選択

#無料のエディション#
https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/3e1621a2-bd32-f26e-6736-bc1bee6a5ebe.png)

無料で使えるエディションが2つあるみたいだけど、何が違うんだ？( ´ﾟωﾟ)

Developerの方は、「非運用環境用の全機能を備えた無料エディション」と言っているので
全機能使えるけど商用環境はダメよ　って話な気がしますが、これだけだとイマイチ分からないですね

#ドキュメントを見てみる#
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-editions-and-components-2019?view=sql-server-ver15
ちゃんと解説してるドキュメントがありました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/6edc3ae9-8d3d-85fa-aade-3f60fe0f6da0.png)

だいだいこんな感じです

Developer：全機能使っていいけど、テスト用としてのみライセンスを認めるよ

Express：1番ローエンドなやつだけど、本番環境もふくめて自由に使って良いよ

##物理スペックの制限##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/7910ac22-9058-17c5-e820-88edff646a51.png)
Expressの方はなんだかショボいですね 笑

とはいえ個人開発で使う分には不自由は無さそうなスペックです。

Expressで足りないレベルとなると、それなりのアクセスが有るサービスか
それほどアクセスがないなら設計に問題があるでしょう。

#可用性に関して#
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-editions-and-components-2019?view=sql-server-ver15#rdbms-high-availability
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/a7a6aec2-188e-f103-f7c1-4e11831183e8.png)

イマイチ分からない項目が多いですが
Enterpriseだとサーバー止めずにインデックス、スキーマが変えられるのでしょうか。

Always On フェールオーバー クラスター インスタンス　あたりは大規模なサービスで使うには良さそうですね
https://docs.microsoft.com/ja-jp/sql/sql-server/failover-clusters/windows/always-on-failover-cluster-instances-sql-server?view=sql-server-ver15

#最後に#
雑に比較しましたが、詳しい部分に興味がある人はドキュメントを読んでみてください。

ここまで読んでくださった方はありがとうございます。
USB type-c ケーブルの違いに関して考察してみる

# USB規格
USBには1.0から3.2までの規格が2021年4月現在存在する。（市場に存在する規格では。）
それに加え、USBの端子の大きさによって、普通の（なにも接頭語のない）usb,mini usb,micro usb,usb type-cなどの規格が存在する。
この記事では、usb type-c 関連の事柄に関して考察しようと思う。（最近はスマートフォンにもタブレットにもノートPCにもタブレットPCにも、いろいろな端末にしようされている。）

# USB type-c ケーブルの違い
## 充電しかできないもの、データ通信ができるもの
USB type-c ケーブルに関しては単に充電しかできないものと、PCと接続することで充電だけでなく、通信もできるものの2種類が存在する。最近では、スマートフォンすらPCとデータ通信をせずにクラウド上でデータのやりとりをする場合のほうが多い。

# 安物のusb type-c ケーブルは使い物にならないのか
安物のusb type-c ケーブルは全く使い物にならないかといわれれば、別に使えるとはいえる。ただし、転送できる電力が少ない場合があるので、そこら辺を許容できる人なら問題ないだろう。また、身近なコンビニなどで手に入れやすいという点でもメリットがある。

# 高いケーブルを使う意味
逆にものすごく高いケーブルも存在する。実際にノートパソコンに標準で付属しているケーブルなどは同じものを買おうとすると値段をみてうげーとなることもある。しかし、ノートパソコン純正ケーブルの場合、ほとんどの機器で使用できたりする。例えば、ノートパソコンの充電にもスマートフォンの充電もできる便利グッツだったりする。

# 結局どのケーブルを買えばいいの？
結論：使用用途と用法を守りましょう。
React環境構築 勉強用

環境構築
-
Homebrewのインストール
-
```react
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
---
Homebrewのバージョン確認
-
```react
brew --version
```
---

nodebrewのインストール
-
nodeのバージョンを管理

```react
brew install nodebrew
```
---
nodebrewのバージョンをインストール
-
stable ←安定版をインストール

```react
nodebrew install stable
```
---
インストールしたバージョンを使う
-
nodebrew use 「インストールしたバージョン」

```react
nodebrew use v14.15.3
```
---
nodeのバージョンの一覧表示
-
nodebrewで入れているnodeのバージョンの一覧表示
(例) current: v14.15.3 ←今使っているバージョン

```react
nodebrew ls
```
---

Node.jsのバージョン確認
-
```react
node -v
```
---

npmのバージョン確認
-
```react
npm -v
```
---
【Vue.js】未経験独学エンジニアのポートフォリオ【概要・気づき編】

### 概要・気づき編
# ポートフォリオ

__Log__: https://portfolio-studyapp.web.app/

## アプリ概要
### 用途
自分が取り組んだことを記録して視覚化

### 使い方

1. 取り組み時間、場所、集中力、内容を記録
2. 記録した内容をユーザーごとに管理
3. カレンダーとデータを同期
4. 場所ごとにグラフを用いて集中力を視覚化  

### 特徴

* __SPA__（シングルページアプリケーション）
* __Firebase__(BaaS)を使用したフロントエンドのみの実装
* [ニューモーフィズム](https://note.com/12011991/n/nb9eed44a9bba)を取り入れた最新のデザイン

## 作成理由と意図
### 理由

1. ポートフォリオ
1. VueとFirebaseを使ったバックエンドレスなフロントエンド開発
1. ユーザー毎のデータ管理の実装

### 意図

#### 作成決定までのフロー
作りたいものがない→何を基準に作りたいものを決定するべきか→自分の__一番身近なもの__に目を向けよう→プログラミングの勉強→解決すべき__課題は？__→計画を立てるのが苦手でいつも挫折している→勉強した後に記録をするようにして__見える化を図り逆説的に計画が立てれるようにならないか__

## 意識したこと

* 新しい知識はほどほどにして__学んだ内容をフルに__活用する
* Vueの機能を網羅的に使い__webアプリケーションの最低限の機能__を備える


### 作ってみて感じたこと

* 教材をやるより__楽しい__
* 非同期処理の理解が深まる
* 次作るものへの__意欲が湧く__
* __成功体験__を得ることができる
* 追加機能を付けてみたくなる
* CSSのbox-shadowは結構__コピペ__
* Vueの__CSS設計__について学ぶことができる
* 教材を使って勉強するより圧倒的に__身に付く__
* Vueの__ライフサイクル__について深く勉強できる
* __実体験を通じたGit__の勉強をすることができる
* 一つのコードを書く上でも__計画を立てること__の重要さを知る
* Array型はかなり便利だと知る（頼り過ぎていいものか模索中）
* vuetifyの__一部導入__は結構めんどくさい（やるなら全てマテリアルデザインにしたほうがいい）

### 抜粋

#### 追加機能を付けてみたくなる
アプリケーションとは最低限の機能を実装した上で、__プラスアルファによって進化していくもの__だと感じた。完成形を先に決める必要はなく、__今後どのように展開させていくのか考えること__こそが重要で、作ってみないとこの考えには至らなかったと痛感している。今後追加してみたい機能は後述する。

#### 実体験を通じたGitの勉強をすることができる
今までなんとなくGitを使用していたが重要さについては理解できていなかった。教材をやるときは流れが全て決まっているため履歴を管理する必要がなかったからだ。今回全ての工程を自分で管理してみて履歴管理とブランチを作ることの重要さを痛感した。
例えばDBとの通信をaxiosからFirebaseのメソッドに変える時、色々なコンポーネントやファイルを書き換える必要があったため挙動がうまくいかない可能性がある。その時ブランチを切ることで__リスクを回避__することができた。

#### VueのCSS設計について
教材でやるときはあらかじめクラスが振られているため考える必要がなかったが、今回自分でコンポーネントの管理をする必要があったためCSS設計について初めて疑問を持つことができた。親コンポーネントにscopedが振られてない時の挙動や子コンポーネントでのクラスの付け方、レスポンシブ対応の時にどのようにファイルを分けるのか考えるきっかけになった。

## 次回
技術選択編