OmniAICreator/Qiita-1.07M huggingface dataset:
Reactでyarn startができなくなってしまった

# 何の前触れもなく突然`yarn start`ができなくなってしまった

エラーは下記の通り

```ターミナル
yarn run v1.22.17
$ react-scripts start
Could not find a required file.
  Name: index.js
  Searched in: /Users/name/folder/React/react-app/src  // ←←名前載ってしまうので一部書き換えてます
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

# もちろん`build`しても Could not find a required file. と言われる

エントリーポイントであるindex.jsが見つからない？と言われているっぽい・・・（でもパスは書き換えてないし・・・バージョンかな？？）
依存関係を解決しようとバージョンが変えられたのかと思い、`package.json`に書かれているバージョンが過去のものと相違しているかをチェックしたが何も変わっていなかった。


# エラー文の`Searched in:`を見てパスは合っているかを確認してみる
エントリーポイントが記載されている`/node_modules/react-scripts/config/paths.js`を確認してみると
`appIndexJs: resolveModule(resolveApp, 'src/index'),`という記載になっていたが
まさかの`src`配下に`index.js`はなかった。
![スクリーンショット 2022-11-15 10.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/d76e63de-fa0c-c852-a560-6b2c528c1825.png)


`src/js/index.js`にあったのだ。（だが移動させた後もしばらくビルドもスタートもできていたんだが・・・）


# パスを書き換えてみる

`/node_modules/react-scripts/config/paths.js`の
`appIndexJs:`に記載されているパスを`src/js/index.js`に変更してスタートしてみると・・・


## できました！！(警告返されてますがローカルは無事起動できてました笑)
![スクリーンショット 2022-11-15 10.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/52d8c6df-46a6-43a2-0645-833c06c0facd.png)


このようなエラーが返ってきたらパスとバージョンを疑ってみることをまず先決しようかとおもいます。
細やかなご指摘部分でも、あったらぜひご教授ください！m(_ _)m
JenkinsのAmzonLinux2スレーブと接続できなくなったのでJavaを上げた

# ❄️JenkinsがJava8の対応を終了❄️　

- [JenkinsがJava 8の対応を終了し、Java 11が必須に。Java 17の対応も開始](https://www.publickey1.jp/blog/22/jenkinsjava_8java_11java_17.html)
- [Jenkins requires Java 11 or newer](https://www.jenkins.io/blog/2022/06/28/require-java-11/)

# 🚀Java11が必須になりました 🚀

- Jenkins:2.361.x
- [Jenkins LTS ChangeLog](https://www.jenkins.io/changelog-stable/)
- [Upgrading to Jenkins LTS 2.361.x](https://www.jenkins.io/doc/upgrade-guide/2.361/#upgrading-to-jenkins-lts-2-361-x)

## なので、SlaveのJavaも合わせてUpdateしないとMasterと接続できなくなります

ここまでは想定内なのですが
EC2インスタンスをSlaveとして利用しているとSlave登録時、Masterから勝手に`sudo yum install -y java-1.8.0-openjdk-devel.x86_64`が実行されしまい、Slaveと接続できなくなります。。

# 💦Slave接続時のエラーログ💦
``` java -jar /tmp/remoting.jar　-workDir /home/ec2-user```実行時にエラー💦💦💦
```bash
INFO: Launching remoting agent (via Trilead SSH2 Connection):  java  -jar /tmp/remoting.jar -workDir /home/ec2-user
ERROR: unexpected stream termination
java.io.EOFException: unexpected stream termination
	at hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:459)
	at hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:404)
	at hudson.slaves.SlaveComputer.setChannel(SlaveComputer.java:437)
	at hudson.plugins.ec2.ssh.EC2UnixLauncher.launchScript(EC2UnixLauncher.java:283)
	at hudson.plugins.ec2.EC2ComputerLauncher.launch(EC2ComputerLauncher.java:48)
	at hudson.slaves.SlaveComputer.lambda$_connect$0(SlaveComputer.java:298)
	at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:48)
	at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:82)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
```

# ✨Init Script✨でJava11を前もってインストールすれば大丈夫なのです

EC2インスタンスSlave登録時にSlave側にJavaがインストールされていないと、勝手にJava8がインストールされてしまうので`EC2Template`の`✨Init Script✨`でJava11をインストールするコマンドを設定しておけば、JavaバージョンミスマッチによるSlave接続エラーを回避できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11099/a09e7c6b-ed2a-61a8-7cd1-15bf8eb2f149.png)


# AmazonLinux2の場合は

AmazonLinux2ではcorrettoが標準のようです
```bash
sudo yum install -y java-11-amazon-corretto-headless
```

- [参考：Amazon Corretto 11 Amazon Linux2 のインストール手順](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/amazon-linux-install.html)

是が非でもjava-openjdk11を利用したい場合はamazon-linux-extraから取得してください
```bash
sudo amazon-linux-extras install -y java-openjdk11
```

# 検証JenkinsとEC2プラグインのバージョン
- Jenkins:2.361.4
- [EC2プラグイン](https://plugins.jenkins.io/ec2/):2.03

# 参考：2017年の記事
- [Jenkinsのlinuxスレーブが起動しなくなったのでJavaを上げた](https://gozuk16.hatenablog.com/entry/2017/06/29/202730)
オブジェクトをカーソルのまわりで回転させる

# はじめに
オブジェクトを下のようにカーソルのまわりを回転させる方法をまとめた記事が意外と少なかったので、メモ的に残しておきます。``RotateAround()``を使う方法もあるとは思いますが、今回は簡単な数学を使った方法です。
![画面収録-2022-11-15-9.59.15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/ed888e2e-f465-90a8-6628-6ed759a4f36e.gif)

# プログラム解説
```cs:cycleScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cycleScriot : MonoBehaviour
{
    Vector3 mousePos, worldPos;
    public float angle = 0.0f;
    public float radius = 2.0f;

    // Update is called once per frame
    void Update()
    {
        //座標取ってくる部分
        mousePos = Input.mousePosition;
        worldPos = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, 10f));
        //回転させる部分
        transform.position = CycleAround(worldPos, angle, radius);
        angle -= 10.0f;
    }

    static Vector3 CycleAround(Vector3 centerPos, float angle, float radius)
    {
        Vector3 v = centerPos;
        float a = angle * Mathf.Deg2Rad;
        float x = radius * Mathf.Cos(a) + v.x;
        float y = radius * Mathf.Sin(a) + v.y;
        float z = 0.0f;

        return new Vector3(x, y, z);
    }
}
```

マウスカーソルから座標を取ってくる部分は、[こちらの記事](https://tanisugames.com/mouse-move/)を参考にしました。
回転させる部分は、``CycleAround()``です。
この関数の式は、高校数学の三角比あたりを思い出していただければいいのですが、半径と角度がわかっている場合、そこの座標は三角比を使って表現することができます。こんな感じで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/0af4d2ae-3760-bd55-ef2d-9486bdfb0e1d.png)
つまり、角度``angle``と半径``radius``さえ与えてあげれば円形の運動をさせてあげることができます。
今回は、回転し続ける様にしたいので、``Update()``内で``CycleAround()``を呼び出した後、``angle``を変化させて回転する様にしています。z軸に関しては特にこだわりはないので0を代入しています。あとはそれぞれ計算した座標を回転させたいオブジェクトに代入してあげるだけで回転させることができます。ヤッタネ！


高校で学んだ数学がゲーム開発にも活きたと感動した瞬間でした。

# 参考文献
[Unityでマウス座標にキャラクターをついてこさせる方法](https://tanisugames.com/mouse-move/)
Leetcode 222. Count Complete Tree Nodes

# 222. Count Complete Tree Nodes

https://leetcode.com/problems/count-complete-tree-nodes/description/

## アプローチ
### DFS

```java
class Solution {
    public int countNodes(TreeNode root) {
        int size = 1;
        if(root == null){
            return 0;
        }
  
        if(root.left != null){
            size += countNodes(root.left) ;
        }
         if(root.right != null){
            size += countNodes(root.right) ;
        }
        return size ;
    }
}

```
目線は高く！誰よりも高く！

仕事をする上で大事なのが、目線の高さ。経営者は特に目線の高さが非常に大切だし、エンジニアもビジネスマンです。
常に目線の高さを持つことが求められます。

何故、大事なのでしょうか？

# １．一つ目は、全体最適化のため。

視点を高く持たないと、自分の部署とか、自分の周りばっかり考えて、全体最適化を全く考えなくなってしまう。

でも、それで。良いのか？自分が良ければそれで良いのか。

Totalであなたが、あなたの会社が勝つために全体最適化を考えてジャッジしないと。考えないとね。

もちろん、全体最適化をベースに何かを変え様とする場合、ほとんどの確立でどこか弊害が出たりします。
あっち立てれば、こちらが立たずです。

しかし、一人では仕事はできません。社会、世の中は沢山の人で成り立ってます。
自己の利益と全体の利益で悩んだ時も、思い切って全体最適化のジャッジをして下さい。

# ２．二つ目は、目線を高くもたないと。今の現状しか考えられないから。

日々、皆、忙しいです。仕事のできる人は特に忙しいです。

そうすると、毎日に追われて一日、一日が過ぎて、一ヶ月、一年が過ぎてしまいます。

目線を常高くもって、理想の会社。理想のサービス。理想の部署。理想の自分を考える。

自分ができない事も全社、グループ会社、他企業とのアライアンス。
沢山の可能性があります。

身近な所では、Vueが好きでVueばかり勉強するのは良い事ですが、Reactの事も見て勉強し、お互いの良さをチェックし本当に使うべき所に採用できる様にすべき。
もっと言えば、フロントテクノロジーだけではなく、サーバーサイドテクノロジーとの最適化も考えていく必要があります。目線高く全体のテクノロジーを見渡す必要があります。

現状に捕らわれず理想を考えてみる癖をつけてみましょう。

# ３．三つ目は、目線を高くしないとライバルが見えなくなってしまうから。

目先ばかりを考えると、いつか企業が衰退してしまいます。

鉄道会社がライバルを鉄道会社だけに絞るのと、デリバリービジネスと考えてライバルを航空会社まで広げて考える必要があるのは、有名な話です。

そういう意味で、現状だけでなく広い視野で事業ドメインを捉えるのは、非常に大事。

ビジネスサイド以外のテクノロジーサイドでも同様の事が言えます。
テクノロジーを俯瞰的にとらえて、どのテクノロジーを採用するのか、他社、ライバル企業はどのテクノロジーを採用しているのか。

# 最後に
目線を高くしよう。
と言われると難しそうに感じるかもしれませんが、難しいですｗ
日々忙しく過ごしていると現状の事で頭のリソースが取られてしまいます。
最低でも月に１度、目線を高くする日、時間を取って色々と妄想してみるのをオススメします。
目線を高くするポイントは、時間を作る事です。テクニックは必要ありません。
自分が神様、ビル・ゲイツ、イーロン・マスクになったつもりで考えて見て下さい。
シングルトンパターンについて

# シングルトンパターンとは？
- 多くの記事でシングルトンパターンとは、「インスタンスが1個しか生成されないことを保証したい時に使います。」と記載されていますが、実際には別にデフォルトシングルトンパターンが存在することを知らなかったので、ここにメモを残す。
- まずシングルトンとは基本的には「インスタンスが1個しか生成されないことを保証したい時に使います。」で正しい。
- どんな時に使うかというと通知をハンドリングするためのデリゲートクラスの呼び出しや、メモリを管理するためのクラス呼び出し時などです。シングルトンとは以下のようなものです。

```Swift
public final class ExampleClass {
    static let shared = ExampleClass()

    private init() {
    /// 適当な処理を記載する。
    }
}
```
- このように記述することで、そのクラスのインスタンスが1個しかプログラム内に生成されないことを保証してくれます。

# しかし！
- 時と場合によっては、そのクラスのインスタンスが複数個作られても、問題ない場合がある。
- 簡単にいうと、見せかけのシングルトンだ。
- 例えば、最もわかりやすい例をあげると、UserDefaultsなどがそうである。
```Swift
UserDefaults.standard.set~
```
- UserDefaultsを利用する際はこのように記述すると思うが、この`standard`はまさにシングルトンである。しかし、UserDefaults自体は情報をプロジェクト内のどこかのファイルに書き込むため、毎回initしても問題はない。
- このような形式的なシングルトンを`デフォルトシングルトンパターン`と呼ぶ。
- その他にも意図的にこのようなクラスを作成できる。
```Swift
final public class ExampleClass {
    static let `default` = ExampleClass()

    public init () {
    // 処理を記述
    }
}
```
- この場合、シングルトンのように見えるかもしれないが、実際initをpublicにしているため、別のクラスから初期化も可能となっている。これも`デフォルトシングルトンパターン`である。
Linuxのアウトプット

自分用のLinuxアウトプットです。勉強し次第更新します。1月5日更新。

勉強に使ったサイト
https://envader.plus/course


### cd
change directory

### ls [option]
-l:実行権限を確認することができる
-a:隠しフォルダを含め表示できる

### cat

### 絶対パス
root(根元)からの道順でファイルやディレクトリの場所を示すパス

### 相対パス
カレントディレクトリから目的のファイルやディクトリの場所を示すパス

cdやlsなどのコマンドは既にパスを通しているので、短いコマンドで実行することができる。パスを通してない場合、絶対パスでファイルを指定して実行する必要がある。whichでコマンドのパスを確認できる

### pwd
print working directory
現在いる場所の絶対パスを表示する

### rm [オプション]　ファイル名
オプション-rは全てのディレクトリやファイルを削除する。

### mkdir
ディレクトリを作る

### mv [option] [移動したいファイル名]　[移動先]
移動

### cp [option] [コピーしたいファイル名]　[コピー後のファイル名]
-rでディレクトリごとコピーできる

### sudo [コマンド]
ルートユーザーの権限を一時的に借りるコマンド

### touch
ファイルの作成: touch [作成したいファイル名]
ファイルの更新： touch [更新したいファイル名]
ファイルを指定した日時で更新したことにする: touch -t YYYYMMDDHHMMSS [既存のファイル名]

### file
ファイルの種類や情報を確認できる

### echo [option]
出力したい内容を出力できる。
定義した変数を出力する場合は頭に＄をつける：echo $変数名
-e 「\\n」で区切られたところを改行する

### ,>, >>
リダイレクトと呼ばれるもの。ファイルに文字を追記できる。
,>はファイルを上書き。>>は新たな行に文字列を挿入する。
echo abc > [ファイル名]

### |
パイプ。コマンドを複数繋げて実行する場合に利用。
コマンド１ | コマンド２
ボ卿のお面の縦の部分

### xargs
|と共に使う。コマンドで入手した結果をxargsに入れて利用することができる。
cat data.txt | xargs touch
⇨catの結果をxargsに渡してtouchコマンドでtextデータの中身の文字通りのファイルを作成している。

### ファイル名　[数字]> /dev/null
エラー出力などを捨てることができる
0:標準入力
1:標準出力
2:標準エラー出力
ファイルを実行して出てくる結果が何かおかしい場合、エラーの入力などが一緒に表示されている場合があるので、このようなコマンドを使う。

### ps [option]
メモリ上で動いているプロセスを表示する。
option:auxで全てのプロセスを詳細に表示する。

### kill [PID番号]
プロセスを止める

### コマンド　&
バックグラウンドでプロセスを進める
sleep 1000 &など

### echo $PATH
環境変数であるPATHに登録されているパスを一覧表示する

### export
PATHに新しくパスを登録する。
export PATH=$PATH:/home/sample

### env
環境変数を確認できる

### chmod [変更対象 変更方法 変更内容] 対象ファイル
実行権限の変更
変更対象：u=ユーザ,g=グループ,o=その他,a=全員
変更方法：「=」は指定した範囲のみ,-は権限剥奪,+は権限追加
変更内容:r読み取り,w書き込み,x実行
例） chmod g+w run1
また、別のファイルの権限方法として数字を使うものがある。
読む＝４、書く＝２、実行＝１とし、数字の和で権限を指定できる。
例）chmod 740 ファイル名
7はファイル所有者に対して全ての権限、4はファイルの所属しているグループに対して読むと実行の権限、0はその他グループに対して権限を与えない

### chown [option] 新しい所有者 ファイル名
ファイルの所有者を変更。グループも一緒に変更する場合は「chown 新しい所有者:新しい所有グループ ファイル名」

### useradd [オプション] ユーザー名
ユーザー追加のコマンド
Linuxでは１つのPCに複数のユーザーを作ることができる。

### userdel [オプション] ユーザー名
ユーザの削除

### unset 
設定しているシェル変数を削除する。設定する際にはsetを使う、または「変数名=値」でもできる。

### find 検索場所 検索ファイル名 [option]
（例）find /opt *.py -atime 0
*はワイルドカード。今日アクセスされた.pyが拡張子のファイルをoptフォルダ内で検索するという意味。

-empty:空のファイルを検索できる
-atime [数字]:"0"が今日、"１"が昨日、"＋１"が1日より前にアクセスされたファイルを検索するために使う。

### grep [検索したい文字列] [検索するファイル]
grep -E '正規表現' secrets.txt
・|と一緒に使うこともできる。
・ファイル内のテキストから検索できる。
・正規表現を使って文字列を検索。

### sort [option] ファイル名
-k [数字]:空白で区切られた部分を１つのブロックとし、数字で指定したブロックでソートを行う。

### uniq [option] [ファイル名]
-u:重複した行を表示しない。

### diff [ファイル１]　[ファイル２]
ファイル１とファイル２の差分を抽出。

### tr [option] [文字列１] [文字列２]
-s：連続している文字を１つにまとめる
-d：文字列１を削除する

### sed スクリプトコマンド　ファイル名
基本的な書き方：sed -e 's/置換前/置換後/g' ファイル名
sやgはサブコマンドと呼ばれるもの

### cut [option] [ファイル名]
-c [数字-数字]:切り出す文字の長さを指定1-3の場合は１から3文字目を切り出す。
-d　"[記号]" -f [数字]:指定した記号で文章を分割する。fオプションで列数を指定する。

### ifconfig [option]
使用中のPCのインターネット状況（IPアドレス(ネットワークアドレスとホストアドレスから構成される、インターネット上の住所のようなもの)など）を表示する

### nc [option] [IPアドレス] [ポート番号]
通信規格を指定してサーバーと通信することができるコマンド
-t:TCPでサーバーに接続できる
-u:UDPでサーバーに接続できる
-l:自らをサーバーとして通信を受信できる

### ssh
暗号化された通信方法でサーバーを遠隔操作する仕組みのこと。
・「ssh ユーザー名@IPアドレス」＝sshでサーバーにアクセスする
・「ssh-keygen -f ファイルを保存したい場所とファイル名を記述したもの」＝公開鍵と暗号鍵を作成する。
Hubspotのトラッキンングコードで別ドメインページが認識されなかった時の原因

Hubspotとは、CRMツールであり、
またHubspot発行のトラッキングのコードをサイト内に埋め込むことで
各ユーザのサイト内回遊を取得したりできます（本家説明：[こちら](https://knowledge.hubspot.com/ja/reports/install-the-hubspot-tracking-code)）


# 背景
サービスサイトとメディアサイトがドメインが別になっていることってよくあると思うんですが、
**サービスサイト←→メディアサイトの行き来をHubspot上で感知できたらいいなー**という要件があり
調べてみると、サブドメインを追加することができるとのことで対応した
([HubSpotでサイトトラッキングをセットアップする：サイトドメインを追加する](https://knowledge.hubspot.com/ja/reports/set-up-sources-tracking#add-site-domains))

## サブドメイン側のアクティビティが落ちない問題
トラッキングの埋め込みや設定の対応したのに**サブドメイン側への回遊ログが落ちない。**
トラッキングコードは、メインのドメイン、サブドメイン両方において設置してある状態で
コード自体も200のステータスを返している。
自分でも試してみても一向にログが落ちないのでサポートに問い合わせた。


# サブドメイン側でログを取得するには条件があった
サポートに問い合わせたところ、返答としては、
**”サブドメイン側のcookieがコンタクト(顧客データ)に紐づいてないからログ落ちしていない”**
ということだった

前提として、コンタクト(顧客データ)生成の条件は、フォーム入力 (会員登録)すること。
トラッキングコードは、その入力を察知して固有のCookieを付与する。
という仕組みだ。

## 状況
メインドメイン側(サービスサイト)において、会員登録フォームがあり、
コンタクト(顧客データ)生成と固有のCookieの付与が行われている。

対して、サブドメイン。

サブドメイン側(メディアサイト)は、会員登録というシステム自体がない。
なので、コンタクト(顧客データ)生成と固有のCookieの付与がされない。
(が、固有ではないcookie付与はされている)

つまり、同じトラッキングコードを使っていても、
**発行されるcookieが違うんじゃコンタクトに紐づけれない**し
ログが落とせないよという話。


## サブドメイン側とメインドメイン側それぞれのcookieを１つのコンタクトを紐づけるには？
サイト回遊ログを確認したければ、コンタクトに紐づけなければならないが、どうしたらいいか。

サポートの方によると、下の2つの条件をandで満たさなければならないとのことでした

1.サブドメイン側で同じメールアドレス使用してフォームの入力または、マーケティングEメールに記載されているサブドメインサイトのリンクをクリック
2.サブドメイン側にHubSpotのトラッキングコードがインストールされており、サイト内のリンクをクリックしている

今回だと、１の条件が満たせていなかったという話でした

# 結局どうなった
> 1.サブドメイン側で同じメールアドレス使用してフォームの入力または、マーケティングEメールに記載されているサブドメインサイトのリンクをクリック

上を満たせば、WEB回遊のログ取得が叶うとはいえ、
メディアサイトだから会員登録のシステムも必要ないし、
やったとして、メール内にメディアサイトのリンクおいて踏んでくれたらラッキーくらいしか対応できないなーとなりました

皆様も、Hubspotのトラッキングコード導入の際にはこういった制約条件があるのでお気をつけください。

# 最後に
弊社では、一緒に働いてくれるエンジニアを募集しています。
↓最新技術や自社開発に興味のある方はこちらから↓
[Wantedly - スタジオアンビルト株式会社](https://www.wantedly.com/companies/studiounbuilt)

こんなWebサービスを作っています。
・[マドリー](https://madree.jp/)
・[Studio Unbuilt](https://www.studiounbuilt.com/)
エラーバーを表示する(SPSS Modeler データ加工逆引き10-1)

# エラーバーを表示する（新グラフ）

![スクリーンショット 2022-11-11 14.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b31a31a8-abf6-cd89-5618-faad3dde2088.png)

## 1.想定される利用目的

・ばらつきのあるグループの比較

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/error_bar.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-11 14.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e817fa67-6ec9-8691-c7a4-9f71f08681df.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-11 14.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c9e04f7-0461-0653-8512-27857d66bd4b.png)

[置換]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

エラーバーを選択します。
![スクリーンショット 2022-11-11 14.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ca48b6ac-053f-50ad-47dc-56a6bebaa7d0.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-11 14.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f897302d-1db2-07a2-1f41-2d55f535790a.png)

![スクリーンショット 2022-11-11 14.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0fcd1ee9-07f1-3ebc-c7a4-20b9ff34d772.png)


#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
開発小ネタ集

## 何を書くか
普段業務などで色々使うショートカットや便利機能、アプリなどを紹介しようと思います。
既に知っているものが多いと思いますが、一つでも知らないものがあり「へぇ〜」となれば幸いです。

では書いていきます...


## ショートカットなど


## ページ全体のスクリーンショットを撮る 
`開発者ツール上で　　command+Shift+P　　→ full`

5スクロールするぐらいの記事やサイトでも一枚の画像として保存できます。


## jsonをフォーマットかけたい
`VSCでかけたい部分を選択し　command+K　→ command+F`

オプション出してフォーマットクリックしないでも、これで行けます。ログとかで持ってきた時によく自分は使ってます。


## ブラウザのグループ機能
`ブラウザのタブで右クリ　→　タブをグループに追加　→ 新しいグループ`

複数タスクを同時にやってるとタブをいっぱい開いちゃってどれが、何を調べているか分からなくなったりする時に使えます。
グループでまとめられるので、タブがすっきりします。
![スクリーンショット 2022-11-14 23.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953340/8920df9a-6647-e923-3214-a5adda1d6af3.png)
![スクリーンショット 2022-11-14 23.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953340/9fc36e9a-4a91-ac08-ca9a-3196635ce398.png)




## スーパーリロード
`command+Shift+R`

キャッシュを消して最新状態に出来る。よくキャッシュに悪さをされるので重宝してます。これでもダメな時はもう設定からキャッシュ１週間ぐらい消してます。



## スニペット
`Slackのメッセージの　+　のところを押して、スニペットで検索　　→  コードなどを貼っつける`

slackのコードで送ると形式とか壊れたり、長すぎて見ずらいとかあるので、ログだったりコードはこれで送ったりしてます。


## アプリ切り替え
`command + tab   →  ↓`

こんなの書くなよと言われそうですが、自分はいまだに使いこなせず3本の指でスクロールしているので戒めも込めて....


## Finder homeに移動
`command + Shift + H`

ホームディレクトリに移動できる...。よく使う項目にhome置くやり方が分からなかった頃、多用していました。






# アプリ

## Clipy
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953340/6fa5b66a-4d12-4163-4b08-e1c1cc43584b.png)

クリップボードにたくさん保存しておける。
スニペットとして固定のものも保存しておける。

おそらく皆んな使っている？すごい便利、これなかったら多分イライラすること多かった気がする。
記憶してもらえないターミナルで打つようのパスワードとかコマンドとか持たせて置いて使ってます。


## RunCat
![スクリーンショット 2022-11-14 23.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953340/183fa695-8696-07b9-4a23-64c78bb6efa5.png)

可愛い。cpuとかメモリとか色々測ってくれて見れる。リソースめっちゃ使ってる時、とんでもない速さで走ってる。
日々のストレスがだいぶこの子で癒されてる。


## Bandwidth+
![スクリーンショット 2022-11-14 23.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953340/8b05c279-0db6-818b-eaf5-7ed443efdfc2.png)


可愛いくはない。ネットの通信量（上り下りなど）見れる。
便利というか何かの不調の時に、原因として把握しておきたい程度。これも犬とかが走ればいいのに。

---
### 以上です。
特に技術面で提供できるものがなかったのでこういう形の内容にさせて頂きました。

RunCatみたいな便利だけどゆるさがあるの大好きです。
再帰関数のよくある例がひどすぎる件について

# 再帰関数
再帰は**非常にシンプルでありながら、非常に強力な概念**です。一度理解してしまえば、それなりに簡単な概念なのですが、残念ながら、その理解を得るためには、それなりの努力が必要です。

再帰関数を理解するために必要な例は、**再帰の原理を明確に示しながら、その威力をほのめかし**、その結果、再帰がなぜ魅力的な概念であるのかを示してくれるものです。しかしながら、今日の世の中では、そのような理想的な例とは、かけ離れた例がよく見かけられます。

# 最悪: 階乗計算😇
```c
int factorial (int n)
{
    if (n <= 1)
        return 1;
    else
        return n * factorial(n-1);
}
```
単純な関数であり、何を行っているのか明白です。初学者にとって、再帰関数がどのようなものか把握するのにうってつけでしょう。
しかし、再帰関数にするメリットが全く見つかりません。少し考えれば、for文で同じことが出来ることに気が付きます。この例を出されてしまうと、**再帰関数のコンセプト(ある意味)の理解がしづらい**と考えます。


# まあまあ: フィボナッチ数列🧐
```c
int fibonacci (int n)
{
    if (n <= 1)
        return n;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}
```
> フィボナッチ数列は、`1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...`のように、前の2つの数の和を次の数としていく数列です。

```
f(1) = f(2) = 1
f(n) = f(n-1) + f(n-2) [n>2]
```
という数式で表されるため、上記のような再帰的なプログラムで表現できるのは当然といえば当然です。しかし、この関数は**大変非効率的**であり、`fibonacci(20)`で呼び出すと答えを導くまでに、21891回の再帰的呼び出しを行ってしまいます。

<details>
<summary>計算プログラム</summary>

```python
count = 0

def fibonacci(n):
    global count
    count += 1
    if n == 0 or n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(20))
print(count)
```

```sh
10946
21891
```
</details>

フィボナッチ数列を求める再帰関数は、[こちらの記事](https://qiita.com/cohey0727/items/117b55cf73c7784359c0)を参考にすると**より良いアルゴリズムに改善可能**です。つまり、フィボナッチ数列を再帰関数で求める例も、**再帰関数の威力を理解するのには不向き**です。
とは言っても、初学者にとって理解しやすいこのコードは、再帰関数の導入としては十分に最適だと考えます。

# 最適: ハノイの塔😊
```c
/* hanoi - use recursion to solve towers of hanoi */
void hanoi (int height, int first, int temp, int final)
{
    if (height <= 0) return;
    hanoi (height-1, first, final, temp);
    printf ("Move disk %d from %d to %d.",
        height, first, final);
    hanoi (height-1, temp, first, final);
}

/* Print a solution for the towers with five disks */
int main()
{
    hanoi (5, 1, 2, 3);
}
```
> ハノイの塔は、以下のルールに従ってすべての円盤を右端の杭に移動させられれば完成。
> - 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤から構成される。
> - 最初はすべての円盤が左端の杭に小さいものが上になるように順に積み重ねられている。
> - 円盤を一回に一枚ずつどれかの杭に移動させることができるが、小さな円盤の上に大きな円盤を乗せることはできない

> 解は、次のように再帰的に考えることができる。塔を「一番下にある円盤」と「残りの円盤群」というように分けてみる。そして、まず「残りの円盤群」を移動させ、次に「一番下にある円盤」を移動し、その上にまた「残りの円盤群」を動かせばよい。


cf. [ハノイの塔 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94)

ハノイの塔の解法において、非再帰的な解法はプログラムがより複雑になり、本当に正しい解法が表示されているかどうかを確認するのに非常に多くの労力を要することがわかるでしょう。そのため、**ハノイの塔の再帰的解法は、再帰の原理を明確に示しながら、その威力をほのめかしている最適な例**だと言えると考えます。

# まとめ
初学者にいきなり再帰関数の最適な例として、ハノイの塔を紹介しても、かなり難しい問題なため理解できず、プログラミングへの苦手意識が高まってしまうでしょう。そこで、フィボナッチ数列などが再帰関数の例としてあげられることは問題だとは思いません。しかし、それだけで再帰関数を終わらせてしまうのは、再帰関数の威力・魅力があまり伝わらないためもったいないと考えます。そのため、**ぜひとも、CSの教師や教材作成者には、ハノイの塔の話も織り交ぜて再帰関数の説明をしていただきたい**です。

# 謝辞
この記事は、筆者Peter Raynhamさんの許可を得た上で、[Examples of Recursion: The Good, the Bad, and the Silly](https://sleeplessafternoon.wordpress.com/2013/03/26/examples-of-recursion-the-good-the-bad-and-the-silly/)を参考に執筆しました。
Thank you for the interesting article and permission to translate.
pakage.jsonの^ (キャレット) と~ (チルダ)の違い

# 背景
特定のパッケージをインストールしてから`pakage.json`を見ると、以下のように表記されていることがわかる。
```shell
$ npm install --save react
```
```json
"dependencies": {
  "react": "^15.3.2"
}
```
`15.3.2`と最新のバージョンだけ記載されれば良いのに、なぜか`^`のマークが前についている。
これの意味を以下でメモする。

# ^ (キャレット)
パッケージのバージョン番号のうち、一番左のゼロではない値を変更しない範囲でアップデートを許容する、という意味。
具体的にいうと、以下のように整理できる。

- ##### インストールされたバージョンが ^1.2.3 の場合
 →1.2.3以上2.0.0未満までのアップデートはOKにする。

- ##### インストールされたバージョンが ^0.2.3 の場合
 →0.2.3以上0.3.0未満までのアップデートはOKにする。

- ##### インストールされたバージョンが ^0.0.3 の場合
 →0.0.3以上0.0.4未満までのアップデートはOKにする。

インストールされたパッケージは、時間が経つと新しく更新され、バージョンが変更されるケースがある。つまり、`pakage.json`で複数の人が時間差をもってインストールすると、それぞれ違うバージョンのパッケージをインストールする可能性があるということである。
そのために必要なのが`pakage-lock.json`である。

`pakage-lock.json`に　ついて知りたい方は以下のリンク参考にしてください。
[npm i とnpm ciの違い](https://qiita.com/phoby20/items/0cce4bf81333fe7d4358)


# ~ (チルダ)
`minor version`が明記されていれば、`patch version`のアップデートを許容するが、明記されていなければ、`minor version`のアップデートを許容。
具体的にいうと、以下のように整理できる。

- ##### インストールされたバージョンが ~1.2.3 の場合
 →1.2.3以上1.3.0未満までのアップデートはOKにする。

- ##### インストールされたバージョンが ~1.2 の場合
 →1.2以上1.3.0未満までのアップデートはOKにする。

- ##### インストールされたバージョンが ~1 の場合
 →1.0.0以上2.0.0未満までのアップデートはOKにする。
【Azure】AzureのPaaSサービスを活用したWebシステムの稼働環境の構築について（設計編）

# はじめに
* 自社ではAzureのPaaSサービスを活用したWebシステム開発に向けての実装スキルを目指しています。
* その取り組みの一環で仮想のWebシステム開発を題材とした取り組みを行っています。
* 今回はその仮想のWebシステム開発案件におけるAzure基盤の設計について整理をおこないました。


# AzureのPaaSを活用するメリット
* 一般的なPaaSを活用するメリットとなりますが、インフラ部分の管理・運用についてサービス提供者側（Azureの場合はマイクロソフト社）に任せることができます。
* マイクロソフト社からは様々なPaaSサービスが提供されているため、組み合わせることでサービスの実行基盤を整えることができます。（開発期間の短縮等に繋がっていく）
* 現在の自チーム内のメンバー全員がインフラの知識を有していません。AzureのPaaSサービスを活用することでインフラスキルの敷居を下げることが可能となると考えます。



# 設計時に参考にした情報

マイクロソフト社やIPAから各種参考となる情報が公開されていますので、そちらの内容等を参考に今回のアーキテクトや非機能要件を検討しました。

### Microsoft Azure Well-Architected Framework

### Azureアーキテクチャーセンター
* マイクロソフト社からはAzureでのアプリケーションを構築するためのベストプラクティスとパターンとして「Azureアーキテクチャセンター」で情報が提供されています。
* 今回は下記のような要件を想定してアーキテクトを検討しました。
    * WebAppsやAzure SQLDatabase、Azure Cache for Redisなどの各PaaS系サービスの利用を想定
    * 一旦は冗長構成での構成はおこなわない（構築後に冗長構成へ変更する可能性はあり）
    * 各サービスの監視やログの取得等はセキュリティ担保・運用に必要な機能は実装をする

https://learn.microsoft.com/ja-jp/azure/architecture/

https://learn.microsoft.com/ja-jp/azure/architecture/guide/architecture-styles/web-queue-worker

https://learn.microsoft.com/ja-jp/azure/architecture/reference-architectures/app-service-web-app/basic-web-app?tabs=cli

### IPAの非機能要求グレード
* 非機能要件を検討するにあたっては、IPAから公開されている「非機能要求グレード」を参考にしました。
* 「非機能要求グレード」自体はオンプレでの構成も想定した一覧になりますが、Azureでの構築時に必要となる部分のみを抜き出しました。この辺りは考え方にもよりますが、足らないところを足すより、間引く方が漏れなく作れると思います。

https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html



# システムアーキテクト図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100890/7db18dd8-a0bb-baaf-f290-36ebdb0b74ac.png)



# 補足

* ベストプラクティス（実案件）では、ユーザーからのアクセスはApplicationGatewayを経由させるべきですが、今回の仮想のWeb開発プロジェクトとしては直接WebAppsへアクセスする形を取りました。

* Azure SQL Database、Azure Cache for Redis、BlobstorageなどはPrivateLinkやVNET統合などを使って、インターネットからアクセスできないように制限を掛けています。


# 所感

* AzureのPaaSサービスを活用した構成の場合、利用するリソースが多くなるため、最初のとっつきにくさはありますが、一つ一つの機能や役割を理解していくことで、よりイメージがつくようになるかと思いました。

* ネットワークやセキュリティ回りの知識がまだ不足していると実感したので、その辺りは引き続き勉強を続けていきたいと思います。

* 非機能要件周りではAzure SQL DatabaseやWebAppsなどは自動でのバックアップ機能などを有しており、その辺りはPaaSサービスにお任せできるのは運用面でも楽だなと思いました。
serverless FWの細かい設定　stageとcustomを使った外部ファイルでの環境変数設定

## はじめに
serverlessアプリケーションを開発する上で便利な[serverless](https://www.serverless.com/)における、ちょっとしたTipsを備忘録として残しておこうと思う。

※今後も随時追記していく予定。

## serverless の細かい設定

### stage  

環境を分けるためにある機能  
以下のように`opt:stage`（CLI のオプションで渡ってきた値（ex) `--stage dev`））、`self:custom.defaultStage`（yaml の custom に定義している defaultStage の値）などを利用して設定可能

```yaml:serverless.yaml
provider:
  stage: ${opt:stage, self:custom.defaultStage}

custom:
  defaultStage: local

functions:
  hello:
    name: hello-lambda-${self:provider.stage}
```

また、[Referencing Serverless Core Variables](https://www.serverless.com/framework/docs/providers/aws/guide/variables#referencing-serverless-core-variables)に書かれている通り、以下のように`${sls:stage}`というのも利用でき、これは`${opt:stage, self:provider.stage, "dev"}`の省略記法になる。

```yaml:serverless.yaml
provider:
  stage: local

functions:
  hello:
    name: hello-lambda-${sls:stage}
```

上記のように設定した場合、CLIのオプションで`--stage sandbox`のように指定されたら、Lambda関数の名前は`opt:stage`が適用され、`hello-lambda-sandbox`になる。
もし何も指定しなければ、`opt:stage`がないので次の`self:provider.stage`が適用され、Lambda関数の名前は`hello-lambda-local`になる。
仮に`provider.stage`がserverless.yamlに未定義の場合には、最後の項目である`dev`が適用され、Lambda関数の名前は`hello-lambda-dev`になる。

ソースコード全体は以下。

https://github.com/yuta-katayama-23/learn-serverless/commit/5001fbdc0a48f7c957ff1239fb027f6f6ccd2b98

### custom

[Reference Properties In serverless.yml](https://www.serverless.com/framework/docs/providers/aws/guide/variables#reference-properties-in-serverlessyml)に書かれているように、`custom`はserverless.yaml内で独自に使用したい値を定義できる項目になる。このcustomを利用して、各stageごとに環境変数の設定を変えるなんて事もできる。

例えば以下のようにserverless.yamlを記述すると、stage名に対になるように作成されているjsonファイルのキーを設定する事で、Lambda関数に環境変数を設定できる。

```yaml:serverless.yaml
# 省略
provider:
  stage: ${opt:stage, self:custom.defaultStage}
  # 省略

# 省略

custom:
  defaultStage: local
  environment:
    local: ${file(./env/local.json)}
    development: ${file(./env/development.json)}
    staging: ${file(./env/staging.json)}
    production: ${file(./env/production.json)}
  # 省略

functions:
  hello:
    # 省略
    environment:
      ENV: ${self:custom.environment.${self:provider.stage}.ENV}

```
```console
study@localhost:~/workspace/learn-serverless (main *)
$ tree -I node_modules
.
...
├── env
│   ├── development.json
│   ├── local.json
│   ├── production.json
│   └── staging.json
...
├── serverless.yml
...
```

ファイルの読み込みに関しては[Recursively reference properties](https://www.serverless.com/framework/docs/providers/aws/guide/variables#recursively-reference-properties)などの章が参考になる。上記のように設定する事で、stageの値に応じて各jsonの中に定義されているENVというキーの値を、Lambda関数のenvironmentとして設定する事ができる。

※serverless.yamlの書き方に関しては好みの問題になるかもしれないが、[Recursively reference properties](https://www.serverless.com/framework/docs/providers/aws/guide/variables#recursively-reference-properties)にある書き方を真似するのであれば、以下のように書く事もできるだろう。

```yaml:serverless.yaml
functions:
  hello:
    # 省略
    environment:
      ENV: ${file(./env/${self:provider.stage}.json):ENV}
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/learn-serverless/commit/132582be01b8f09213fde0824434c623fe90e2e3

## まとめとして

今回取り上げたstageやcustomを使った外部ファイルからの環境変数設定はちょっとしたTipsだが、実際にアプリケーションを開発・運用していく上では有益な機能に思える。
npm i とnpm ci の違い

# npm i（npm install）
プロジェクトにパッケージをインストールするためのコマンド。
npm iは大きく２つの方法で動作する。

### 1. 特定のパッケージをインストールする際に使用
```shell
$ npm i 'package-name'
```
特定のパッケージの名前を直接入れてインストールする。

### 2. `package.json`に明示されているすべてのパッケージをインストールする際に使用
```shell
$ npm i
```
特定のパッケージ名を指定しなかった場合は、`package.json`に明示されているすべてのパッケージをインストールし、`node_modules`に保存しておく。

### 上記の方法の共通点
上記の方法の両方とも、`package-lock.json`の存在をまず確認し、依存しているパッケージ情報を把握してから`node-modules`にインストールする。
また、`node-modules`や`package.json`に変化があれば、`package-lock.json`を更新する。


# npm ci（npm clean install）
```shell
$ npm ci
```
`npm ci`は、`package-lock.json`に明示されているパッケージ情報をもとに、より正確なバージョンのパッケージをインストールする。
これにより、一つのプロジェクトを複数の開発者が開発する際に、同じバージョンのパッケージをインストールすることができる。
つまり、インストールする際には`package-lock.json`が必要であり、`npm i`とは違って、`package-lock.json`を修正することはしない。

また、`npm ci`は、`node-modules`が存在している場合、既存の`node-modules`を削除してインストールする。
その際に`package-lock.json`と`package-lock.json`のバージョンがマッチングされないと、エラーが出る。

# 使用方法
### 新しいパッケージをインストールする時
`$ npm i 'package-name'`を使用して必要なパッケージをインストールする。

### レポジトリのプロジェクトをローカルで設定する時
他の開発者と同じ開発環境を構築するため、`npm ci`をもって`package-lock.json`をベースにパッケージをインストールする。

### CI/CD環境構築の時
`package-lock.json`を修正せず、ビルドをおこなうため、`npm ci`を使用する。
エンジニアは、女子高生よりも流行ワードが大好き

# ＩＴ技術の世界は、常に新しいワードが流行しています。

何故か、流行のワードのほとんどは、海外から遣って来ます。且つ、凄いスピードでやってきます。

何故でしょうか？

僕は、新しいワードを作る事によって、従来の物との違いを明確にするために作為的に作られていると思っています。

アナリストやコンサルタント達は、常に、「今まではこうだったが、これからはこういう形にする必要がある」というのを求められています。

特に日本のアナリスト、コンサルタント達は、そういった状況の中、海外で発生した新しいワードにすぐに食いついて、その新しいワードを用いる事によって、分かり易く現状を否定しているのでは無いでしょうか？

**その流行ワードにつられて、エンジニアは、女子高生よりも流行ワードが大好きになってます。**

そんなに簡単に世の中のテクノロジーが変わる事は、ありません。アナリストに騙されてはいけません。

かと言って、流行のワードをキャッチアップしないのも、ダメです。

**流行のワードの本質を理解して、自分なりの解釈をする必要があるからです。**

中には、本質的に重要なワードもあります。Web3.0というワードも本質的に重要なワードです。

しかし、ただ単純にブロックチェーンが凄い、DAOが凄いというのは、全くナンセンスです。
技術の周りで何が新しくなっていて、それによってユーザーが変化し、ビジネスモデルの変化が起きている事を理解する必要があります。

又、その変化は何故起きたのか？既存のテクノロジーだと実現できないのか？もっと良いテクノロジーは無いのか？等を理解していく必要があります。

**流行に惑わされずにテクノロジーの本質を理解して、自分達のビジネスの繋げれるかがとても、重要なのです。**
Cloud Spannerにnode.jsでアクセスしてみる


基本的には[こちら](https://cloud.google.com/spanner/docs/getting-started/nodejs?hl=ja)の記事通りにいろいろやればいい。

## 前提

[こちら](https://qiita.com/zaburo/items/8af75280465d05621a92)の記事の続き。

* Emulator環境
* テーブル作成済み
* データInsert済み


## 準備

### 作業場の作成

まあどこでもいいのですが、以下のようにしました。

```bash
cd
mkdir spanner-node-test
cd spanner-node-test

touch index.js
```

### モジュールのインストール

spannerにアクセスするためには@google-cloud/spannerをインストールするようです。

```bash
npm install @google-cloud/spanner
```

## 実装

### コードを書く

いろいろな書き方ができるみたいですが、一旦SQLを使った方法を試してみます。


```js:index.js
const { Spanner } = require("@google-cloud/spanner");

(async () => {

    //定数設定（環境依存）
    const projectId = "dev-test";
    const instanceId = "test-instance";
    const databaseId = "testdb";

    const spanner = new Spanner({
        projectId: projectId,
    });

    const instance = spanner.instance(instanceId);
    const database = instance.database(databaseId);

    const query = {
        sql: 'select * from members',
    }

    try {
        const [rows] = await database.run(query);
        rows.forEach(async row => {
            const json = await row.toJSON();
            console.log(`id:${json.id} name:${json.name} age:${json.age}`);
        });

    } catch (err) {
        console.error("ERROR", err);
    } finally {
        database.close();
    }

})();
```

### 実行

実行してみます。動いたようです。

```bash
node index.js

id:1 name:hoge age:10
```

### メモ

以下のようにcredential系のエラーがでた場合は、

```bash
ERROR Error: Could not load the default credentials.
```

下記のように環境変数を設定すればOK。

```bash
export SPANNER_EMULATOR_HOST=localhost:9010
```
量子コンピュータとAIはどこに行くのか

# 量子を巡る混乱について

量子力学は特に日本では未だにダブルスリットフシギダナー、とか、なんか多世界だし遅延選択実験したら過去に戻ってるかも、みたいな話になる。物理の学生がそんな話をしてる。

波か粒子かとかいまだにやってるし、ちっとも進まない印象なんだけど。

その割には量子コンピュータは出来たんだか出来てないんだか、計算能力は高いんだか低いんだか。

最近は量子もつれはいよいよ否定できないというか、もう分からない中でも普通に使ってはいる状態になって来ている。ノーベル賞も出たし。

[2022年ノーベル物理学賞：量子もつれ光子を用いたベルの不等式の破れの実験と量子情報科学の先駆的研究で欧米の3氏に](https://www.nikkei-science.com/?p=68175)


という事はこの世界はいよいよ非局所的であるし、量子もつれは時空を創発するとか、いや誤り訂正で既に時空が創発してるとか、波だ粒子だと言ってる間にこの世界の根源的な部分に触れてしまいそうな事態にまで至っていると。引き継ぐのは超弦理論なのか？いずれにせよもはや訳わからん、そこは考えてはいけないみたいなシュレジンガー猫的な量子論的な逃げｗｗもいよいよ許されなくなってきてる。

量子コンピュータ自体はまだ超越性はあまり何も実証できない中だし、もはやバブルは弾ける寸前だと言う人々も増えてきた。

つまりは量子力学やその概念、応用までいよいよ大混乱という感じになっている。

# AIを巡る混乱について

一方、AI業界はDALE-Eやmidjourney、そしてstablediffusion、NovelAIなどに繋がってきたAIによるお絵描き、いやArtがクリエイティブな世界を震撼させている。

こっちはなんだか分からないが絵ができる。なんでも描いてくれる。自分も既に1万枚ぐらいは色々書かせて見たし、もう納品物も作ってる。

いや、訳が分からないのではなく、原理的には極めて明確出しかも今まで積み重なったAIの歴史的アルゴリズムが多数利用されていて、ちゃんとした最新技術であり、今後どこかで言うけど、脳のクリエイティブの構造に極めて近い可能性が高い。

![onesan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/f7c7c42b-77e2-bece-0a8f-5ff87f18792d.png)

【仕事の合間に錬成してみたお姉さんたちｗ】

これで言ってしまうと、人間の脳を超える算段はもう付いてきてると思ってる。認識は人間を超え、ゲームも人間を超え、そしてクリエイティブもほとんどの人間を既に超えた。もう全部集めれば人間超える（少なくても機能的には）のはすごく近そうだ。

しかしそうなってきて、実はますます危険なところに踏み込んでも行かざるを得ない。それはいわゆる茂木健一郎氏が得意なｗ「クオリア」「意識」の問題だし、意識より何より「存在」「実在」としての人間との区別を人工のAIとどうつけるか、いよいよ誰にも分からなくなってきてる。意識はもうあるんだ、それっぽい処理してれば出来てるんだ、という人々も増えてきたし、いや、違う！何か足りない、いやとんでもない、という人々もいて議論してもまだ何も分からない。

その意味ではAIの世界も可能性にはある意味底が抜けてどこまで行くかが未来が見通せない上に、哲学的にも大混乱を始めている。

# このブログの行先は？

自分はコンピュータやシステムについては35年以上開発してきて言語はアセンブラからプロセッサ開発でVHDLからC、C++、C#、PHPやら最近のpythonやらでARやらAIやらが仕事だし、他の諸々もまあ大体分かってはいるし使ってるが、趣味的には昔から基礎物理や量子力学、超弦理論、脳科学とかで、コンピュータは生きていくすべではあるし大事な領域なんだけど、それはそれ。むしろ歳をとる事にそっちよりは上記のような話を考える事が増えてきている。

なので、ここではその辺についての私見を記事に書いていこうかなと思ってる。

自分なりの考えは「ある」。そんなに変な話でなくても、今既に出てきてる話を上手く組み合わせるだけでかなり本当の所に迫れる気がしている（気がしているｗ）。

もちろん精査されてないし、極力科学的に明確な知見からしか考えないつもりだけど、変な所にハマってしまうリスクも当然ある。

まあその上哲学的な話題なのでqiitaに向いてんの？って言われるとうーん、だけど、ただ上のようにタグで言えば量子コンピュータだし、AI処理の話の先のシンギュラリティ絡みの話でもあるから、大きく怒られることもないだろう(だといいな)

今回はごく軽く今後の記事の方針の表明でした。
若手社員に向けて 目標設定について

# わたしの自己紹介
1社目：テストをする人　350万円
2社目：SE　430万円
3社目：AWSに関わる人　600万円

:::note info
3社目で大きく**年収**が上がりました。
:::
趣味：節約（風呂なし4万5000円、半額弁当生活）
資格：AWS SAA、TOEIC 700点オーバー

# 目標設定について
サラリーマンとして働いている以上、同僚がいて上司がいて責任者がいて
自分自身の半年間の頑張りを評価されボーナスという形でその頑張りが我々従業員に還元されます。
評価軸のポイントに目標設定があると思います。
目標が達成できたかどうか100%なのか80%なのか120％なのかといったものです。


## 目標がない若きエンジニアへ
わたしは26歳のとき、SRE部門に配属となりました。
部署移動願いを出してSREに異動となりました。
専門性が高い仕事を行いたいという理由で希望を出しました。
が、働いてみると特に何がやりたいという訳でもなかったため、
年に1度決める目標設定の場は本当に辛かったです。

### 目標設定のポイント①大したことないことを大したことあるように言う

わたしの目標は年間費用を2000万円下げるという目標でした。
2000万円と聞くと難しいような気がしますが、実際はボタンを数クリック押すだけの仕事です。

:::note info
実際に、転職の面談でも
「それってプログラミング能力はなくて数クリック押すだけですよね」
って言われて微妙な空気になるくらいの話です。
:::
が、クラウドに詳しくない方やインフラに対して興味がない方からするとすごくインパクトがあります。

### 目標設定のポイント②お金を減らす目標にする
会社はお金を使う施策については
稟議をあげ、予算を確保し、承認を取り、発注をとり、運用に乗せる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/93bee135-542f-9000-d13d-7dea10725626.png)

と非常に大変です。が一方で
お金を減らす施策については

:::note info
稟議を上げる必要もなく、承認や発注を取る必要も全くなく、むしろ予算を余らせるため各方面から感謝もされます。
:::

わたしの過去の目標では、
「脆弱性診断ツールを導入し、商用サービスの問題を見える化する」
脆弱性診断ツールの説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/4ca20a2f-3a23-c06f-5bdc-14aa8fdb1ca6.png)

という目標を立てました。もちろん上司及び責任者には許可を得て活動に邁進しておりましたが、
役員にプレゼンを行った際に
「そのお金はどうするのか、実際に見える化した後に脆弱性を修正する人は誰がするのか」
などマイナスの指摘をされて頓挫となりました。
が、2000万円削減の施策に関しては
上に承認を求める必要が全くないため、非常にスムーズです。


### 目標設定のポイント③常に転職を意識する
自分が立てる目標はつまり、その1年間で働く実績とリンクします。
ということは、自分の市場価値を上げる目標でなければやる意味がありません。

会社内の出世<<<<<<年収レンジが高い会社への転職
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/7d7bbec1-51bb-73bd-0627-9a1367bdccdc.png)

の方がすぐに年収が上がるからです。
転職をして年収を上げることができるのは年齢やその会社のレベルにもよりますが常に意識すべきです。
会社がどのようなことを自分に求めているのかは理解する必要がありますが、
操り人形になる必要は全くありません。

### 目標設定のポイント④相手が喜ぶ施策を打ち出す
先ほどの例ですが、私が脆弱性診断ツールを仮に導入した場合、
開発会社は余計なことに対して時間をかけなければなりません。
元々やることがあり時間内に終わっていた仕事が脆弱性診断を行った場合残業をしなくてはいけないことになります。
なので、当然難色を示すでしょう。
が、わたしが作った目標では、各サービス担当には極力負担をかけずに利用料を下げるというプランを用意しました。
お金を扱う親会社の社員に対してプレゼンをするだけですんなり許可をもらえました。

### 目標設定のポイント⑤分析を行う
事前に分析を行い、2億円から2000万円下がります。
2000万円の根拠は〜で、全体の75%許可をもらえることで達成します。
というように分析を十分に行うことで難易度の共有と実現性を理解してもらい
仕事を行うことができます。
Cloud Spanner Emulatorをインストールしてspanner-cliでアクセスしてみる


Spannerのエミューレータが出たのはいいのですが、標準ではgcloudやプログラミング言語からの操作になってしまい身近な感じがしないのでCLIツールである[spanner-cli](https://github.com/cloudspannerecosystem/spanner-cli)を利用してアクセスしてみます。

>本当はPostgreSQL Interfaceを利用したかったのですが[Emulatorは対応してない](https://cloud.google.com/spanner/docs/emulator?hl=ja)そうです（本当はpsqlでアクセスしたかった）。

## 前提

* Mac
* gcloudがインストールされている
* Dockerがインストールされている

## Spanner Emulatorの起動と設定

### 起動

Dockerがインストールされていれば以下のコマンドで簡単に起動できるようです。

```bash
gcloud emulators spanner start
```

>標準ではforgroundで起動するみたい（Emulatorはインメモリで終了後は全てのデータは揮発する仕様のようです）。

### 設定

gcloudコマンドがローカルのEmulatorを見るように設定を行います。

```bash
# Emulator用のconfiを作成
gcloud config configurations create emulator
# 認証をOFF
gcloud config set auth/disable_credentials true
# projectを指定（必須です）
gcloud config set project dev-test
# Endpointをローカルに
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
```

なお、configを切り替えるのは以下のコマンドできるみたいです。

```bash
gcloud config configurations activate [emulator | default]
```

>gcloud config listで内容、現在Activeなconfigを確認できます。

## Spannerを利用する

### インスタンスの作成

まずはインスタンスを作成します。

```bash
gcloud spanner instances create test-instance --config=emulator-config --description="Test Instance" --nodes=1
```

インスタンスは以下のコマンドで確認できるみたいです。

```bash
gcloud spanner instances list
```
### datbaseの作成

データベースを作っておきます。

>spanner-cliではログイン時にDBの指定が必須になります。

```bash
gcloud spanner databases create testdb --instance=test-instance
```

なお、PostgreSQL Interfaceで操作可能なDBは以下のコマンドで作れるみたいですが、冒頭に記述した通り現時点ではEmulatorはPostgeSQL Interfaceに非対応とのこと。

```bash
gcloud spanner databases create testdb --instance=my-instance-id --database-dialect=POSTGRESQL
```

## spanner-cliでアクセスしてみる

ではspanner-cliでアクセスしてみます。

## 準備

### Goのインストール

spanner-cliはGoに依存しているのでGoをインストールします。Macなら以下でOK。

```bash
brew install go
```

ただし、正常に実行するには環境変数設定が必要みたいです。

（ずっと使うなら）.zshrcに以下を追加。

```bash
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```

また、spanner-cliを含めた言語経由でのアクセスのためには以下の環境変数設定が必要みたいです。

```bash
export SPANNER_EMULATOR_HOST=localhost:9010
```

>.zshrcに書くかはお好みで。

### spanner-cliのインストール

インストール。

```bash
go install github.com/cloudspannerecosystem/spanner-cli@latest
```

動作確認。バージョンコマンド見当たらないので-hで代用。

```bash
spanner-cli -h
```

### アクセス

では、Spannerにアクセスしてみます。

```bash
spanner-cli -p dev-test -i test-instance -d testdb
```

>DB一覧は gcloud spanner databases list --instance=test-instance で確認可能。


### 利用

ここからは基本SQLの世界（なので最低限）。

#### CREATE TABLE

```bash
create table members(
	id INT64 NOT NULL,
	name STRING(32),
	age INT64
) primary key (id);
```

```bash
show tables;
```

#### INSERT, SELECT

```bash
insert into members(id,name,age) values(1,"hoge",10);

select * from members;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1  | hoge | 10  |
+----+------+-----+
1 rows in set (262.052us)
```

```bash
exit;
```

## 後片付け

### DBを消す

```bash
gcloud spanner databases delete testdb --instance=test-instance
```

### Instanceを消す

```bash
gcloud spanner instances delete test-instance
```
unity初心者がチーム制作に挑戦してみた

# 自己紹介
こんにちは。専門学校生のLikuというものです。
これから気まぐれに投稿していこうと思います。よろしくお願いします！
# パックマン制作に挑戦した
記念すべき初投稿の内容は、unity初心者がパックマン制作に挑戦した話です。
パックマンの模倣を目標に、私と友人の二人で開発をはじめました。
そのときに感じたことについて記載していこうと思います。
# 1.GitHubが難しい
チーム制作なのでソースコードを共有するため初めてGitHubを使用しました。
初めて使ってみた結果、何故かエラーが発生したり、できたと思ったらデータが消えてしまっていたりとうまくいきませんでした。ﾄﾎﾎ…
結局、ソースコードの中身を直接教えあって制作していました。
データが消えてしまったことがあったので、コミットするときになにか手順を間違えたのだと思います。
# 2.パックマンなめていた
パックマンを選んだ理由として、アニメーションや画面の切り替わりが少ないので作ることはできるでしょと思っていました。
実際は違いました。正直、なめていました。
ゴースト（敵）の行動パターンが4種類あり、初心者である私たちではプログラムを組むことは難しかったです。
そこで最低限動くようにしようと思い、あらがじめ通るルートを決めてそのルートで動かすことにしました。
![pacman_WayPoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2972844/f2a3859d-a837-399d-1b29-feef7d8aa96a.png)

（色の付いているマークをたどって動くようにしました）（マークが重なっているところもあります）
その他にもパワーエサやイジケ状態など難しい実装が多く存在していました。

# 結果
結果としてできたのは、パックマンの見た目をした動きがしょぼいゲームになってしまいました。

# 学んだこと
制作は失敗していまいましたが、昔のゲームでもしっかりとギミックが作り込まれていて実装が難しいこと、GitHubの重要性、そしてunityの基礎の基礎の部分を理解することができたので最低限の成果は得られたのかなと思います。そして、パックマンやゴーストなどの自分がコードを書いたものが実際に動いているのを見るととても嬉しかったです。次のチーム制作までにはもっと努力してコードがガシガシ書けるようになろうと思います！

# 最後に
ここまで読んでくれてありがとうございます。
初めてのブログだったので感想文みたいになってしまいました。
これからもコツコツとブログを続けて、プログラマらしい記事がかけるよう努力していきます。
2022/11/15主にITとかセキュリティの記事

「IBM InfoSphere Information Server」にCSVインジェクションの脆弱性
https://www.security-next.com/141392

サイバー攻撃一段と巧妙化　「侵入前提」の対策導入進む(11/13)
https://www.nikkei.com/article/DGXZQOCD080880Y2A101C2000000/

サイバー攻撃　官民連携で防護体制を強めよ(11/13)
https://www.yomiuri.co.jp/editorial/20221112-OYT1T50250/

医療機関に「サイバー攻撃」...電子カルテが起動せず 英語で金銭要求するメッセージ /今週の静岡(11/13)
https://gunosy.com/articles/eZ9PR

検出と削除が困難なルートキット、防御する方法とは？(11/13)
https://news.mynavi.jp/techplus/article/20221113-2508945/

PINロックしたSIMでAndroidのスクリーンロックをバイパス可能な脆弱性(11/13)
https://www.zaikei.co.jp/article/20221113/697134.html

約8万件のフィッシング詐欺、その9割が12のブランドを騙っていた(11/13)
https://ascii.jp/elem/000/004/112/4112872/?rss

ウィルス感染被害によるシステム障害発生のお知らせ 社会医療法人生長会・ベルキッチン(11/7)
https://www.seichokai.or.jp/system/upload/bellkitchen/news/1667807474_003299000.pdf

スマートフォンなどを利用した犯罪被害を防げ　延岡市でサイバーセキュリティキャンペーン(11/12)
https://news.yahoo.co.jp/articles/badbcce42449759901905a9f2b2f587c7f2ef760

サイバー保険、中小で広がる 4～9月、販売5割増の損保も(11/13)
https://www.nikkei.com/article/DGKKZO65948300S2A111C2EA5000/

10万ドルと引き換えに中退した天才が開発。ブロックチェーンが金融に与える影響(11/13)
https://news.nicovideo.jp/watch/nw11688700

女性情シスリーダーが熱い！　各社でDXを推進する「Enterprise IT Women」を訪問中(11/13)
https://enterprisezine.jp/blog/detail/16803

定番技術バイブル「インサイドWindows」、第7版の変更点は？
ついに完結した「インサイドWindows」第7版の要点［1］(11/14)
https://xtech.nikkei.com/atcl/nxt/column/18/01687/00225/

オススメのWebブラウザーはどれ？Microsoft Edgeが人気の理由(11/14)
https://xtech.nikkei.com/atcl/nxt/column/18/02255/111000001/

なぜエッジにWebAssemblyを採用したか、米FastlyのマクマレンCTOが語った理由(11/14)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07364/

多要素認証疲労攻撃にどう立ち向かう？　CISAが推奨する2つの実装方式(11/2)
https://www.itmedia.co.jp/enterprise/articles/2211/02/news041.html

[Project Description] Software Supply Chain and DevOps Security Practices: Implementing a Risk-Based Approach to DevSecOps(11/9)
https://csrc.nist.gov/publications/detail/white-paper/2022/11/09/implementing-a-risk-based-approach-to-devsecops/final
[Docker Compose] インストール時のエラー解決法

# エラー状況
この記事は以下のようなエラーが出た方を対象としています。
```
// 実行したコマンド
# sudo curl -L "https://github.com/docker/compose/releases/download/2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# docker-compose -v

// エラー出力
/usr/local/bin/docker-compose: line 1: Not: command not found
```

# 原因
実行したcurlコマンドのバージョンを指定する句に`v`が抜けているためです。
バージョンを指定する句は、以下の`2.2.2`の部分です。
```
# sudo curl -L "https://github.com/docker/compose/releases/download/2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

# 解決方法
単純に`v`を付けてバージョンを指定しましょう。`/v2.12.2/`という書式で記述すれば問題ありません。
以下のコマンドは実際の例です。
```
# sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

# 確認
コマンドが実行できたら、docker-composeがインストールできているか確認しましょう。
以下のようにバージョンが出力されたら成功です。
```
# docker-compose -v
Docker Compose version v2.12.2
```

### おまけ
なぜこのようなミスが起こるのか考えてみました。
おそらく、docker-composeのバージョン1系だと`v`を付けずにダウンロードを行うためだと考えられます。
1系の頃の記事で作業を進め、バージョンの句だけを`/2.2.2/`などに変えて実行すると、このような状況に陥ります。
この限りではないですが、この原因が最も考えられるのではないでしょうか。
チーム開発で失敗した話とその時に学んだこと

<h1>【はじめに】</h1>
　こんばんは。奈切しのです。<br>
　最近、チーム開発を行っていたのですが、結論から言って失敗しました。
なぜ失敗したのか、私なりに考え、こういう人が失敗するという失敗談として記載していこうと思います。<br>
　また、このような場合の対策として行うべきこと、そして最後に少々、今回開発をするにあたって学んだ技術についてまとめてありますので、どうぞお時間の許す限り最後までご覧ください。

<h2>【目次】</h2>
・実際に作っていたものの詳細<br>・どのように失敗したか<br>・同じケースを予防するには<br>
・おまけ「今回新たに習得した技術」<br>・さいごに

<h2>【実際に作っていたものの詳細】</h2>
    　こちらに関しては、著作権侵害防止のため、名前は伏せさせていただきますが、ファミリーコンピュータのゲームを再現しようという内容でした。作品名は挙げられませんが、内容としては、<b>　「ブロックを破壊しながら上に登るタイムを競うゲーム」</b> です。なんとなく感づいている方もいるのではないでしょうか。「そのようなゲームをUnityを用いて模倣する」という内容でした。何を作ったか知りたい方は以下のリンクからどうぞ。ここでは名前を伏せさせていただきます。<br>

【参考文献】[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%BC )

<h2>【どのように失敗したか】</h2>
　そして、ここからが本題の、「なぜ失敗したのか？」「何をどう失敗したのか？」について記載していきます。
<br><br>
　まず、Unityでチーム制作をするにあたり、ソース管理システムを利用すると思いますが、その際、GitHubとSourceTreeを利用したのですが、ペアの方がリポジトリを落としてくることができずに、連携が取れませんでした。当然ながら、その状況ではプッシュもプルもできず、コミットすらできない状況で、私のパソコンのみで制作を進めることになりました。
<br><br>
　そこまではまだよかったのですが、それからというもの、テクスチャの切り抜き作業を終え、燃え尽きてしまったのかスクリプトを書かず、私の作業量が膨大な量となってしまいました。担当の先生にペア関係を切って頂きました。どのようにしたら、ペア関係を解消せずに済んだのでしょうか。

<h2>【同じケースを予防するには】</h2>

<b>１．プロジェクト始動時に適切な役割分担をする</b><br>
　意外とできていると思っていても、いざ始まった時に何をしたらいいかわからなくなる等がありました。その原因として考えられるのは、しっかり役割分担した"<font color = red>つもり</font>"になっていたのだとあらためて考えた際、思いました。
<br>　どういうことなのかというと、<b>「適材適所の分担にできていない」</b>ということです。
<br>　これは、「自分がやった方が速いのに...」と思った時点で破綻しているのです。私も実際そう感じた場面が多々ありました。「ペンタブ持ってるから私の方が速いのに...」という風になりました（笑）。
<br>
<b>２．メンバーとの熱量を可能な限り近づける</b>
<br>　これは非常に大事だと痛感しました。なぜかというと、誰かが一人で頑張っても誰かがやらなかったら100％のパフォーマンスにならないからです。私はどこかで<b>「チーム開発は掛け算である」</b>という言葉を聞いた覚えがあります。
<br>例えば、4人のチームで、3人の生産性が１だとします。しかし、1人の生産性は0.8でした。1人のやる気がないだけで、１ｘ１ｘ１ｘ０．８ ＝０．８となってしまいます。
もし本当にチーム開発が掛け算なのであれば、納得してしまいます。ですので、<b>如何に士気を高めるか、高めあえる人たちと開発できるかがカギになる</b>と私は思います。
    ※あくまでも個人的な意見です。<br>

<h2>【今回新たに習得した技術】</h2>
　では最後におまけで、今回の開発を通して学んだマネジメント以外での技術について記しておきます。<br>
今回しっかり触る機能はたくさんありました。<br>　例えば、
    <br>・OnCollisionEnter2D<br>・OnTriggerEnter2D<br>・GetCompornent<br>・Raycast<br>
　主に上記の４つが大きな学びとなりました。

![スクリーンショット (108).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732621/e42b56c9-b32d-b3a0-1743-1e6b814b13b6.png)
　まず、スクリプトを大量に書いたことで、C＃の基本的な使い方がある程度わかってきました。<br>例えば、On～Enter系の関数は当たった時に自動で返ってくる等です。しかし、今回最も勉強になったのが「<b>Physics2D.Raycast</b>」です。<br>　そして、onGroundFlag = !onGroundFlag;にするとフラグを反転できると知り、新たな知識を得ることでプログラムを頑張る意欲になりました。
<br>　Rayは一直線に当たり判定の光線を伸ばし続ける機能で、この光線の長さを調整して、自分の求めたい範囲に変え、様々な当たり判定に利用するというのが今回私が行った使い方です。今回は、頭とブロック、足とブロックの当たり判定が別々だったので、Rayを二つ利用して、判定を分けることができました。
<br>　ただ、判定を調整しないと永遠に上にRayが伸びたり下に伸びたりするので、そこの調整が大変でした。
このRaycastに関しては、友人に教えてもらったのですが、その後自分でも調べてみたのでそのリンクを以下に貼っておきます。
【参考文献】[UnityDocumentation](https://docs.unity3d.com/ja/2020.3/ScriptReference/Physics.Raycast.html)
<h2>【さいごに】</h2>
　前半が失敗談、後半はほとんど技術のことに関してになりました。
<br>　私自身もチーム開発の経験が乏しく、以前ゲームジャムに参加した際、私は何もできずに終わってしまいました。それこそ今回のペアの方のような振る舞いになってしまいました。なので、その反省を生かして、自分から行動、そしてわからないことはすぐに有識者に聞いたり、ネットで調べたりと様々なことができたかと思います。

<br>　また、前回の失敗は今回で取り返せましたが、今回は今回でまた失敗したことがいくつかあるので、それを次、必ず繰り返さないように頭の片隅に常に置いておこうと思います。
<br>　そして、チームで大切なことは感謝を伝えることだと思いました。任せっきりになってしまったら、
相手に「ありがとう」、そう伝えて、自分ができることを常に探していくのが大切だと再認識しました。
<br>　最後まで長々とお付き合いいただきありがとうございました。それでは、また。
Googleカレンダーで共有されたカレンダーをAppleのカレンダーに表示する

豆知識程度の内容です。
調べてもあんまり情報なかったから備忘録として。

# Googleカレンダーの共有

共有されてるGoogleカレンダーを拾ってきます。

例: AtCoderカレンダー(非公式)
https://fuwa.dev/posts/atcoder_calendar で公開されてるので、カレンダーの右下あたりにある+ボタンをクリックすれば自分のGoogleカレンダー上に表示できます。

もし表示されない場合、左側メニューの↓このあたり↓のチェックボックスをいじってみてください。
![チェックボックス画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677057/b465037a-daf9-f37b-c350-83ebea58350a.png)


# Appleカレンダーで表示されない!

Googleアカウントと繋げていても、なぜか共有でリンクしたカレンダーは同期されません。

↓このリンク↓から共有するように設定することで、普通に表示されるようになります。
https://calendar.google.com/calendar/u/0/iphoneselect

(Googleのサイトって時々昔からデザイン変わってないページありますよね...大丈夫かな...)

# 以上

なんでデフォルトじゃないんだろ?
Promiseとasyncとawaitをできるだけ短く解説してみる

Promise…そうそれは
簡単そうに思えてややこしく、困難そうに思えて容易い、そんなラララ (by Mr.Chldren)

前回の記事 [JavaScriptをもうちょっと理解する54のトピック](https://qiita.com/komlabo/items/3f14c8990a2f94fb5323) で軽く触れたPromiseについてです。

次回、Promiseについて本気出して考えてみた記事を書く予定ですが、前哨戦としてなるべく短くかみ砕いた記事を書きます。asyncとawaitに触れるにはPromiseを避けられないので、Promiseはわずかばかり丁寧に。

## Promise

### Promiseの発生

Promiseは自分で作るか、関数の戻り値で発生します。

- Promiseを返す主な関数は `fetch` とか `fs.readFile` あたりだよ
- `new Promise(関数)` で生成することもできるよ

### Promiseがもつ3つの状態

`Promise` の状態は3つ。処理中の `pending` 、成功したときの `fulfilled` 、失敗の `rejected` のいずれかです。

- 例えばfetch関数なら実行した瞬間は `pending` 。完了すると `fulfilled` か `rejected` になるよ
- 状態が fullfilledとrejectedのPromiseは何らかの `値` を持っているよ
- rejectedの持つ値は基本的には `Error` だよ

### 続きの処理は .then か .catch で書ける

状態が `fulfilled` か `rejected` なら続きの処理を実行できます。

- fulfilledなら `プロミス.then(処理)` で。 `処理` の第1引数には `値` が入っているよ
- rejectedなら `プロミス.catch(処理)` で。 `処理` の第1引数には `値(基本はError)` が入っているよ

### .then や .catch の戻り値も Promise

.thenや.catchの戻り値はPromiseです。Promiseということは、さらに.thenで続けられます。

- Promiseをreturnすれば、`returnしたPromiseがそのまま` 返るよ（例: fetchをreturnするなど）
- Promise以外の値をreturnすれば、`状態がfullfilledで、returnした値を持つPromise` が返るよ

## async

通常の（普通の）functionで値をreturnするとその値が返りますが、 `async function` で値をreturnすると、 `状態がfullfilledで、returnした値を持つPromise` が返ります。

- functionの中に `await` を書きたい時に `async function` にするよ
- functionの前(左)に `async` を付けるだけだよ

## await

Promiseでは、.thenで続きの処理を実行できると書きましたが、それをもっとシンプルに書けます。

- `状態がfulfilledなPromise`の左に `await` をつけると、Promiseそのものではなく `Promiseが持っている値` が返るよ
    - 状態がpendingの場合は、 `fulfilledかrejectedになるまで待つ` よ
    - `rejected`になった場合はエラーが発生するので、普通のtry catchでエラー処理できるよ
- `await` は async functionの中でだけ書くことができるよ

※ Top-Level-Awaitのことはこの記事では考えません

## 最後に全体のイメージをコメントで解説

```js
// fetchのところでawaitを使いたいのでfunctionの左にasyncをつける
async function fetchArticle() {
    try {
        // awaitでfetchの完了を待つ＆値の取り出し
        const response = await fetch('Articleを取得するAPIのURL');
    
        // .json()の戻りもPromiseだが、awaitにより値として返る
        const articleJson = await response.json();

        // Promiseでない値を返すが、async functionなのでこの値を持ったPromiseで返る
        return articleJson;

    } catch (error) {
        // もしどこかでawaitの右側がrejectedになったらここに来る
        console.error(error);
    }
}

/**
 * 使う側の例その1
 * asyncなfunction(fetchArticle)がPromiseを返すので、状態がfulfilledになり次第.thenで処理する
 */
fetchArticle().then(articleJson => 処理);

/**
 * 使う側の例その2
 * asyncなfunctionの中から呼び出してawaitで処理
 */
async function hoge() {
    // asyncなfunction(fetchArticle)が返すPromiseを、awaitで待つ＆値の取り出し
    const articleJson = await fetchArticle();

    // 何らかの処理～～（略）
}
```

お気づきでしょうか。使う側の例その2、これを呼び出す側は `async+await` か `.then` のどちらかで呼び出すということに。

無限ループのようですが、非同期処理であるPromiseは結局どこかで `.then(=終わり次第)` で処理しなければならないのです。

## まとめ

なるべく短く解説してみましたが、どうでしょう、ちゃんと短く書けたでしょうか？（そこ）

Promise、どちらかというと奥が深いようで意外にシンプルなものだと思うんですが、非同期処理に慣れないとややこしく感じると思います。この記事が少しでも何かのヒントになれば幸いです。

次回、「Promiseについて本気だして考えてみた」でお会いしましょう～（予定）

## おまけ

よければF12を押して開発者ツールを開いて、Consoleで下のコードなどを試してみてください。
asyncの有無で何が変わるか確認できますよ！

```js
function onlyFunc() {
    return 1;
}

async function asyncFunc() {
    return 1;
}

console.log('onlyFunc', onlyFunc());
console.log('asyncFunc', asyncFunc());
```