OmniAICreator/Qiita-1.07M huggingface dataset:
Unityスコア加算

#スコア加算

スコア加算する方法についてご紹介します。
まず、GameObjectを作ります。
SystemMainと名前つけました。
SystemMainと言うC#スクリプトを作成。
私はブロック崩しを作っていて消えたらスコア加算にしたいので、Blockスクリプト。
書いていくのはこの２つです。

```C#:SystemMain
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //UIを使用しているため、忘れずに記入

public class SystemMain : MonoBehaviour
{
    public int Score;  //Score変数を定義
    //スクリプトをアタッチした時にスコア加算したいTextと紐づける
    public Text ScoreText;  

    void Start()
    {
        Score = 0;  //スタート時の表示
    }

    // Update is called once per frame
    void Update()
    {
        ScoreText.text = string.Format("{0}", Score);  //Textのフォーマット
    }
}
```

```C#:Block
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Block : MonoBehaviour
{
    public SystemMain Sm;  //ヒエラルキーのSystemMainと紐づける
    private int Status;  //準備ができたかどうかを判断する変数

    void OnCollisionEnter(Collision collision)
    {
        if (Status == 0)
        {
                Sm.Score += 100;  //スコア加算していく数字
                Destroy(this.gameObject);  //オブジェクトが消えた時にスコア加算
        }
    }
    void Start()
    {
        //SyatemMainを探す
        Sm = GameObject.Find("SystemMain").GetComponent<SystemMain>();  
        Status = 0;  //0だったらCllisionのif文が実行される
    }
}
```

ここまで出来たら
SystemMainはSyatemMainオブジェクトへアタッチ。
Blockは消えてスコア加算されたいオブジェクトへアタッチ。
アタッチ出来たらアタッチしたInspector上のスクリプトに注目。
SystemMainにはScoreText
BlockにはSmに何かを入れれます。
これは

```C#:SystemMain
    public Text ScoreText; 
```

```C#:Block
    public SystemMain Sm;
```
を記載したからです。
これでヒエラルキーと紐づけます。

SystemMainのScoreTextにはスコア表示したいTextをドラッグ&ドロップ
BlockのSmにはSyatemMainをドラッグ&ドロップします。

ちなみに

```C#:SyatemMain
    public int Score;
```
はスコア加算がInspector上にも表示されます。

これで無事、スコア加算が出来ました！
このやり方は調べてもあんまり情報を得ることが出来なかったのでお役に立てると幸いです。
【第1作目】Webアプリ①Spring Boot プロジェクト作成


# 初めに
Qiita 初投稿者のBlubonです。仕事の関係で、Spring Bootを使用したWebアプリケーションを作成し始めました。メモ間隔で記述してますので、客観的にみると分かりにくい記事です。
ご了承ください。

# 環境

| 環境 | |
| --- | --- |
| 統合開発環境 | Eclipse |
| 実行環境 | Windows10 |
| ブラウザ | Chrome |

# Spring スタータープロジェクトの作成

手順
- STS4 の [ファイル] - [新規] - [Springスターター・プロジェクト] をクリック。
- [名前], [グループ], [成果物], [説明], [パッケージ]を入力する。
- 型 : Maven, パッケージング : Java, Javaバージョン : 15, 言語 : Javaにする。

# 依存関係設定

以下を追加する。

- Lombok
- Spring Boot DevTools 
- Spring Web
- Thymeleaf

# 作成したプロジェクト

### src/main/java フォルダ
- Java のソースファイル用。

### src/main/resources フォルダ
- Java 以外のソースファイル用。HTMLファイルやCSSファイルなど。

# Lombok

Object クラスが持つメソッドのオーバーライドで、コードを簡素化することができる。

# ビュー(html)とコントローラー(java)の作成
- ビューの作成

src/main/resources/templetes に hello.html を作成する。

```html:hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>こんにちは</title>
</head>
<body>
	Hello World!
</body>
</html>
```

src/main/java に controller パッケージを作成する。
controller パッケージに SampleController.java を作成する。

```java:SampleController.java
package blubon.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SampleController {
	
	@RequestMapping("/")
	public String hello() {
		return "hello";
	}

}

```

# プロジェクト実行方法

- src/main/java の Blubon パッケージの BlubonWebApplication.java を右クリック
- [実行]-[3 Spring Boot アプリケーション]をクリック。
- ブラウザで http://localhost:8080 にアクセス!

# 次回 JPAを使う予定
RFCってなに？

## 勉強前イメージ

プロトコルとかITの決まり事が書いてあるやつ？

## 調査

### RFCとは

Request for Comments の略で、インターネットとなるARPANETの時に生まれた、
インターネットコミュニティで共有するべき事柄を集めたものになります。
始まった当初の目的は情報交換を行うためだったが、
今では定まった内容を公表する場になっている。

### RFCの分類

RFCには以下のように分類があります。

- 1. インターネットの標準化に関わるもの
	- 1-1. 標準化への提唱 : 標準化への最初の段階
	- 1-2. 標準化への草案 : 仕様が固まっており、実装され運用がされている
	- 1-3. 標準化 : 標準プロトコルとしての意味
- 2. その他
	- 2-1. 情報 : 広く周知するべき内容
	- 2-2. 実験 : 実験された結果のうち、公開すべきと思われる事柄
	- 2-3. 歴史 : 標準から使われなくなったなどの歴史
	- 2-4. 現状 : インターネット技術に関する原則など

また、元々 `Request for Comments(コメント求むの意)` で生まれたことから
ジョークRFCと呼ばれる遊び心があるお話も載っています。
RFC 5841 の TCP Option to Denote Packet Mood(パケットムードを示すTCPオプション) などがあります。

### RFC XXXXXX

RFCには通し番号があり、
新しい使用が定義されるとバージョンを変えて新規に発行したり、
古いRFCを無効化して置き換えたりすることがあります。


## 勉強後イメージ

標準化ってイメージはめっちゃあったけど
ジョークとかいうおもしろいのもあるのね

## 参考

- [インターネット10分講座：RFC](https://www.nic.ad.jp/ja/newsletter/No24/090.html)
- [RFCってなに?](https://www.nic.ad.jp/ja/rfc-jp/WhatisRFC.html)
- [ジョークRFC](https://www.wdic.org/w/WDIC/%E3%82%B8%E3%83%A7%E3%83%BC%E3%82%AFRFC)
DDD 値オブジェクトとは

# 値オブジェクトとは
ドメインのオブジェクトをエンティティだけで構成した場合、あらゆるオブジェクトがidをもち、オブジェクト同士の区別をする必要があることになる。

しかし、ユーザークラスの属性である名前や所属といったような、単なる説明にすぎないオブジェクトにもidをあたえて区別する必要はなく、これらは値オブジェクトとして生成するのがいい。

# 値オブジェクトのポイント
値オブジェクトのポイントは区別する必要がないということ。

ユーザークラスの名前オブジェクトを Name クラスとして作成する場合、たとえ同姓同名のユーザーが存在しても、それらを区別する必要はない。

# 区別する必要がないことでうまれる特徴
値オブジェクトは、特定のそれと指し示す必要がないので、その属性は不変となる。

これがユーザーの場合であれば、特定のその人と指し示す必要があるので、「id 〇〇の名前を××に変える」という処理が発生するけれども、ユーザーの名前オブジェクト（値オブジェクト）を差し替えるときには、その名前オブジェクト自体を新たに生成して差し替えるだけとなる。

「変更」という処理自体、コレとソレを区別する必要があるからこそ発生する操作であって、区別する必要のない、ものを説明したり形容したりするだけの概念は、作ったり捨てたりすることはあっても、変更することはない。

# なぜエンティティとしてはいけないか
値オブジェクトをエンティティとしてはいけない、というわけではなく、値オブジェクトのメリットを享受するために利用するものとおもわれる。

値オブジェクトのメリットは、不変である（publicなsetterをもたない）ために、このインスタンスをまるごとメソッドに渡しても、その中身が意図せず変わってしまうことが防げるとあらかじめわかることにあるとおもう。

より制約の強い値オブジェクトを積極的に利用することで、バグの発生する可能性を減らし、無用な心配の種を最初から摘み取ることができることが大きなメリットになる。

# エンティティ or 値オブジェクト
不必要にエンティティをつくらず、できるだけ値オブジェクトで構成することを検討したほうがいいとおもう。

特に、「本来エンティティにするべきところ値オブジェクトにしてしまった」、という問題は後で気づいて修正しやすいが、「本来値オブジェクトにするべきところエンティティにしてしまった」という問題は、間口がひろくなっただけで問題として認識されにくいようにおもわれる。
データ形式変換

#エラー内容
```DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().``` 

自前のCSVを学習に用いたときに目的変数の型が少し違っていて警告されました。
これでも結果が出ているので大丈夫ですが、念のため警告が出ないように(500,1)→(500,)
のように変換してあげます。

#コード

```np.ravel(data[:, 0:1])``` 
簡単ですがnumpyのravelを使用して[]を外してあげました。
これで警告は出なくなります。

初歩的ですがメモとして書かせていただきました。
VBA　エクセル　ラインマーカーグラフチャート作成

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/a7499748-7a10-9bfb-5bdc-7924d3c94bd9.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/f10ff675-45ce-4851-7d0b-1bb31938ea47.jpeg)


```vb
Sub ファンチャートの作成()
'グラフシートにファンチャートを作成する
    With Charts.Add
        .ChartType = xlLineMarkers
        .SetSourceData Source:=Sheets("ファンチャート").Range("A4:A23,E4:G23")
        .PlotBy = xlRows
        .HasTitle = True
        .ChartTitle.Characters.Text = "売店売上ファンチャート"
    End With
End Sub

```
[Power BI 王子のアイコン集] Power Platform / Dynamics 365 / Azure のアイコンが欲しい時


# タイトルの通りです😇
アーキテクチャ図やシステム構成図を作る際、やはりアイコンは公式のモノを使いたいですよね？
まさかとは思いますが、**Google** 検索で著作権の怪しいものをダウンロードして使ってないですよね？

Azure はもともと提供されていましたが、新たに一つ知ったので、備忘録として載せておきます。
また Power Platform と Dynamics 365 はこれまで提供がなかったのですが、2021年6月3日に提供が開始されたようです。

# Power BI Icons (2021.08.17 追記)
**microsoft/PowerBI-Icons**
https://github.com/microsoft/PowerBI-Icons

GitHub に公式が **Power BI Icons** を公開してましたので、新たに追記しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b52abd65-ea00-dc33-4d31-8847ef89785b.png)

**やっていいこと** と **やっちゃいけないこと** は 
https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks
に書いてあるので、一読してみてください。英語なので、適宜日本語に訳してね。

# Power Platform のアイコン

**Microsoft Power Platform icons**
[https://docs.microsoft.com/ja-jp/power-platform/guidance/icons](https://docs.microsoft.com/ja-jp/power-platform/guidance/icons?WT.mc_id=DP-MVP-5002429)

↑ のリンクからダウンロード可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/3261cbf6-c464-96f6-d8c3-db30770cbbd2.png)
サイトで **[I agree to the above terms]** にチェックを入れると **[Download SVG icons]** ボタンが押せるようになります。
サイトには **Do's (やっていいいこと)** と **Don'ts (やっちゃダメなこと)** が記されております。

### Do's (やっていいいこと)

- 製品間の連携について示すために、これらのアイコンを使用してください。
- 図の中で使用するアイコンには、その製品名をどこか近くに追加してください。
- 個々の製品を表示する場所にアイコンを使用してください。

### Don'ts (やっちゃダメなこと)

- アイコンのトリミング、反転、回転はしないでください。
- アイコンを変形させたり変更したりしないでください。
- Microsoft 製品のアイコンを、自社の製品やサービスを表すために使用しないでください。

これらを守って使いましょう🤗

# Dynamics 365 のアイコン

**Microsoft Dynamics 365 アイコン**
[https://docs.microsoft.com/ja-jp/dynamics365/get-started/icons](https://docs.microsoft.com/ja-jp/dynamics365/get-started/icons?WT.mc_id=BA-MVP-5002429)

↑ のリンクからダウンロード可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/34a62ae4-c8d0-f204-3c74-6a1eb7692a04.png)

サイトで **[上記の利用規約に同意する]** にチェックを入れると **[SVG アイコンのダウンロード]** ボタンが押せるようになります。
こちらのサイトにも **Do's (やっていいいこと)** と **Don'ts (やっちゃダメなこと)** が記されております。
**Power Platform** と内容は同じで、かつ日本語になっているので、わかりやすいですね。

やはり、これらを守って使いましょう🤗

# Azure のアイコン
**Azure アーキテクチャ アイコン**
[https://docs.microsoft.com/ja-jp/azure/architecture/icons/](https://docs.microsoft.com/ja-jp/azure/architecture/icons/?WT.mc_id=AZ-MVP-5002429)

↑ のリンクからダウンロード可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/71146271-ba0c-53f1-c5d5-f9370d668ec7.png)
サイトで **[上記の利用規約に同意します]** にチェックを入れると **[SVG アイコンのダウンロード]** ボタンが押せるようになります。
こちらのサイトにも Do's (やっていいいこと)と Don'ts (やっちゃダメなこと) が記されております。

やはり、これらを守って使いましょう🤗

**Azure** についてはもうひとつ公式が提供しているサイトがあります。
こちらの方が数が多いですが、ひとつずつ表示して、右クリックからダウンロードする必要があります。
ですが、例えば最近新しくなった **Azure 自体のアイコン**などは **[Azure.microsoft.com UX Patterns]** にしかないので、
**[Azure アーキテクチャ アイコン]** に欲しいものがなければ、こちらで探してみてください。

**Azure.microsoft.com UX Patterns**
[https://azure.microsoft.com/en-us/patterns/styles/glyphs-icons/](https://azure.microsoft.com/en-us/patterns/styles/glyphs-icons/?WT.mc_id=AZ-MVP-5002429)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/4c900f8b-cb9d-484b-3fc6-ffdc5f5a2903.png)

# 以上です
公式がアップしているので、今後アップデートが入ったら、順次更新されていくはずなので、定期的に見に来ることをオススメします。
STM32F303K8と温度,S-5851で液晶温度計 (Mbed)(AQM0802A)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり



```c++


#include "mbed.h"

//#define S5851A 0x48
#define ADDR        ((0x48)<<1) //  address
#define ADDR_LCD    (0x7C)      //  address

I2C i2c(I2C_SDA, I2C_SCL); //767 303
//I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁
int     ii;             //ループカウンター

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

int main()
{

    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    } //for

    while (1) {

        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //初期化
        //set address 0
        i2c.write(ADDR, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, data_read,1,false);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  data_read[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = DVI10(tempval);             //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力
        // Display result
        data_read[0] = '@';
        data_read[1] = '0' + n10;
        data_read[2] = '0' + tempval;
        //data_read[3] = '\r';
        //data_read[4] = '\n';
        data_read[3] = 0;
        i2c.write(ADDR_LCD, data_read ,3);

        //1秒待つ
        wait_ms(1000);

    }//while

}//main




```

![i2c_s5851a_1114_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5f2e6799-8b72-79ae-bfe1-0295372e182a.jpeg)
EC2(Amazon Linux 2)でDockerを使えるようにする

SSHログインして上から順番に実行していけばOK

```sh
sudo yum update -y
sudo amazon-linux-extras install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user
su - $USER

# 動作確認
docker info
```

参考

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

https://stackoverflow.com/questions/52750796/unable-to-run-docker-without-sudo-on-ami-linux-ec2-instance-on-aws
HTMLのテーブルのボーダーラインを重ね合わせたい(border-collapse)

# border-collapseとは
テーブルセルにて、隣接するボーダーラインを重ねあわせて表示するにはborder-collapseプロパティを使う。このプロパティはデフォルトではないため、各々で設定する必要がある。

以下の値で指定する。

__collapse__
隣接するボーダーラインを重ねあわせて表示。
__separate__（初期値）
隣接するボーダーラインを離して表示。

## Example

- border-collapseプロパティを設定した場合の見た目( border-collapse: collapse; )
![table2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/f139c6ee-3412-b913-05a4-ac8ce24f12c6.png)

- border-collapseプロパティを設定しない場合の見た目
![table1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/c6ae0d01-b59b-c4d3-586b-90e7cc554f83.png)

適当にHTMLファイルを作ってコピペし、開いて確認してください。

```
<!DOCTYPE html>
<html lang="ja">
    <style>
        table {
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid #333;
        }
    </style>
    <body>
        <table>
            <tr>
              <th>果物</th> <th>味</th>
            </tr>
            <tr>
              <td>いちご</td> <td>甘い</td>
            </tr>
            <tr>
              <td>レモン</td> <td>酸っぱい</td>
            </tr>
          </table>
    </body>
</html>
```

## 参考にしたサイト
- [HTML Table](https://code-kitchen.dev/html/table/)
- [border-collapse](https://html-coding.co.jp/annex/dictionary/css/border-collapse/)
CVSとSubversionとGitを比較してみる

いまだに Git のことがよくわかっていない私ですが、これまでに使ってきたバージョン管理システムである CVS, Subversion, Git を比較してみました。

この比較では、各システムが内部的にどう管理しているのか、集中型か分散型かなどは置いておき、自分の理解を整理するために**バージョンの振りかた・タグ・ブランチの違い**を図にしてみました。

# 比較

## CVS

変更がコミットされるごとに、ファイルごとのリビジョンが上がります。

ブランチは切り替えるもので、タグはある時点での各ファイルごとのリビジョンをまとめたものです。

![CVS](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699223/e1d2582c-6ab0-964b-0d66-5458353994d6.png)


## Subversion

変更がコミットされるごとに、全体のリビジョンが上がります。

ブランチはフォルダへのコピーで、タグもフォルダへのコピーです。

![Subversion](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699223/fe026908-f0ba-8871-24f8-f1e8638a6d6f.png)


## Git

変更がコミットされるごとに、コミットを表すハッシュ値が生成されます。

ブランチは切り替えるもので、タグはコミットに対する別名です。
ブランチは切られた枝全体を指すのではなく、枝の先端のコミットを指すもののようです。コミットには parent があるのでブランチが通ってきた履歴を追うことができます。

![Git](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699223/05cda4a9-8fad-8771-d191-a605eadcbf27.png)


# まとめ

||CVS|Subversion|Git|
|---|---|---|---|
|リビジョン(ハッシュ値)|ファイルごと|リポジトリ全体に対するもの|ソース一式に対するもの|
|ブランチ|切り替えるもの|コピーされたフォルダ|切り替えるもの|
|タグ|ブランチに対するもの|コピーされたフォルダ|ソース一式に対するもの|

図にしてみたところ CVS と Git の差が驚くほど少なく感じられ、Subversion がブランチとタグをディレクトリとして扱う点がかなり大きな違いであることが浮き彫りになりました。

*****
編集履歴
 * 2022/08/03 Gitのブランチの理解が間違っていたので図を差し替え
雑にBacklogのチケットを一括で作成できるスクリプト書いた

## はじめに

仕事の関係で一括でBacklogに複数のチケットを登録する必要があり、作成したものになります。
手作業なんて面倒くさいことしたくない人は是非使ってみてください。

またこの記事はブログに書いた内容を転載したものです。

https://gamelinks007.hatenablog.com/entry/2021/06/19/121039

## 作ったもの

https://github.com/S-H-GAMELINKS/backlog-tickets-create

## 使い方

使い方は簡単。
上記のコードをクローンした後、必要なAPIキーなどを`.env`に追加

```
SPACE_ID=<スペースID>
API_KEY=<APIキー>
PROJECT_ID=<プロジェクトID>
ISSUE_TYPE_ID=<チケットのタイプ>
PRIORITY_ID=<優先度>

```

その後、`tickets.md`をクローンしたディレクトリ内に以下のように作成。

```markdown
### ○○の修正対応

○○は××だったのでそのように修正

TICKET_END

### △△の修正対応

△△は××だったのでそのように修正

TICKET_END
```

`TICKET_END`で各チケット毎に区切るようにしています。

あとは`bundle install`などをした後に`bundle exec ruby main.rb`を実行するだけです。

```bash
bundle exec ruby main.rb
```

## 参考

https://github.com/emsk/backlog_kit

https://developer.nulab.com/ja/docs/backlog/api/2/add-issue
OWASP ZAPとBurp Suiteを同時に使う


https://securitymemo.blogspot.com/2014/12/owasp-zap-4owasp-zap.html

↑これ見た方が早い。
忘備録～

# Foxy Proxy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/0d341d5e-e65e-9d61-906d-a62de5670872.png)

7777ポートを介するようにする

# OWASP ZAP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/c8cef903-8978-4316-9fe1-189b63250e9e.png)

ポートを7777にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/4a293c6c-b277-4b09-f9ab-271f57c4abc8.png)

外部プロキシサーバ利用でBurp Suiteのポートを指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/125e0ffe-1fff-a55d-824b-e1cd4d02d98c.png)
ポートはここで確認出来る～～

# 終わり！

設定1つでも分からないことばかりだ～
3dsmax Script ダイアログメッセージ系


##■各種類について

MAXScript のメッセージ ボックスおよび問い合わせダイアログ ボックスは
以下3種類です。

①messageBox　メッセージ＋"OK"ボタン
②queryBox　メッセージ+"はい"(Yes)、"いいえ"(No)ボタン
③yesNoCancelBox　メッセージ+"はい"(Yes)、"いいえ"(No)、"キャンセル"(Cancel)ボタン

##■①messageBox
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/b37d387d-ed56-06ac-c610-09ef530c8136.png)

~~~
messagebox "データを確認してください" title:"作業確認"
--OKを押す or ダイアログを閉じる　返り値：true
~~~

##■②queryBox
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/34141cc2-3dd7-a95d-2d8e-7550eebb8d65.png)

~~~
j = queryBox "作業ファイルを上書きしてもよろしいですか?\n   はい: 上書きして進みます。\n   いいえ: 上書きなしで進みます。" title:"ファイル上書き確認" beep:true

if j ==true then
(
    print "res_yes"
)else if j ==false then
(
    print "res_no"
)else
(
    print "テスト用_使用なし"
)

--返り値：true,false
--ダイアログを閉じるはできません(右上無効)

~~~


##■③yesNoCancelBox
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/f0652c9a-6246-4724-9dc1-40c86d1731a8.png)

~~~
j = yesNoCancelBox "作業ファイルを上書きしてもよろしいですか?\n   はい: 上書きして進みます。\n   いいえ: 上書きなしで進みます。\n   キャンセル: 出力せずに戻ります。" title:"ファイル上書き確認" beep:true

if j ==#yes then
(
	print "res_yes"
)else if j ==#no then
(
	print "res_no"
)else
(
	print "res_cansel"
)

--返り値：#yes,#no,#cancel もしくは、1,2,3でも可能
--ダイアログを閉じる：cancel

~~~

#####参考にさせていただいたページ
https://help.autodesk.com/view/3DSMAX/2017/JPN/?guid=__files_GUID_7A4AA91A_0DEB_470B_AD6B_2E7A3A105BD0_htm
エンコードとは

エンコードは、日本語では符号化と言われ、データを~~暗号化すること。~~
例えば、デジタルカメラで写真をとって、画像をデータ化することを言う。

逆に、暗号化したものを読み取り、解読することをデコードと言う。
デコードはスマホでYouTubeを見るときに、送られてきたデータを解読する。そしてスマホ画面で見れるようにする。

エンコードとデコードが両方できるのが、コーデックと言う。
HTML/CSSのポートフォリオサイトから2年振りにReactでポートフォリオサイトを作り直した

#まず初めに
初めてQiitaに投稿させて頂きます
shuuheiと申します。

簡単に経歴
2017.12〜2019.12 ベンチャー企業でアルバイト(HTML,CSS,jQuery,JavaScript,PHP,Wordpress)

2020.02〜　SES企業でフロントエンジニア
(Vue,Angular,PHP,Java などなど)

今回は元々github.ioで作成していたポートフォリオサイト
https://shuuheiigarashi.github.io/
こちらをReactで作り直したのでその作成過程を書いていきます。

#デザイン
こちらは元々ベンチャー企業に在籍していた際に使用しており馴染みがあった
Adobe XD
を使用しました。

![スクリーンショット 2021-06-19 11.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344096/136d3fee-15bd-2b7e-d037-213ffbdfb3ef.png)


SPA風にしたかったのでこんな感じになりました。
シンプルなデザインかつわかりやすさを意識してデザインしました。

# Atomic Design とコンポーネント設計

Atomic Designを取り入れ、ポートフォリオサイトを
作ろうと思い下記サイトを参照しました。

https://www.weblab.co.jp/staff/creator/7352.html

あまり複雑なデザインにしなかったので
Atomic Designを取り入れる意味があったかどうかは
微妙なところですが、経験として設計もできたのでそこはよかったかなと思っています。

# いざ実装

UIライブラリはChakra UIを使用しました。

https://chakra-ui.com/

デザインがシンプルなので実装はさほど
時間はかかりませんでしたが、、、、

、、、、

味気ない、、、
となったので

https://chakra-ui.com/guides/integrations/with-framer

https://www.framer.com/api/motion/

Framer Motionを用いてCSSアニメーションを実装いたしました。
(本当はもっと複雑なものを作りたかったが、、、力不足)

問い合わせフォームを作成する際に参考にしたのは下記

https://react-hook-form.com/jp/

バリデーション等も含んでチュートリアルがあるので
かなり扱いやすかったのです。


# 作り終わったのでデプロイしてみよう

せっかくだ、githubにあげるだけじゃもったいない
と思い
AWS amplifyを使って
デプロイをしてみました。

https://aws.amazon.com/jp/amplify/

Githubの今回のポートフォリオサイトのリポジトリと連携し
デプロイ完了。
また、独自ドメインを設定したかったので下記動画を参照しました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/kFj_mdW7Sy8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

手順通りに進めていったらエラーが、、、
![FireShot Capture 008 - AWS Amplify Console - console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344096/6f2b0200-f02c-49c4-4d67-79e59c322780.png)
CNAMEがこのドメインに1つ以上既に紐づいているよとのこと。
全ての設定を削除し
CloudFrontが元々何も設定していなかったので、
何も設定せずRoute53を登録しamplifyに独自ドメインを紐付けしてみたら、、、

いけました！！！

#最後にそして、これから
作成期間としては2週間ほどかかりましたが
以前のHTML/CSSのものと比べたら
とてもいいポートフォリオサイトができたかなと思っています。
逐一ブラッシュアップはしていこうとは思っておりますが、、、

公開URLはこちら
https://shuuhei.ml

今後もポートフォリオを作成していく予定です。
Reactだけでなく業務で色々な言語を扱っているので
そこに対して個人的にポートフォリオを残して行けたらと思っています！

ここまでご覧頂き有難うございました。
MacRumorsとは

　さて今回私がご紹介するのは、Qiitaさんにて「[3000文字Tips - 知ると便利なTipsをみんなへ届けよう][1]」なるイベントが開催されているので、何か書いてみようと思ったTipsです。
　ぬう、先日、「[【Win】+【→→↑】][2]」のTipsを書いたばかりだったのにな。　

#▼Apple社製品に関する海外サイトです

　Macファンな方ならご存じの方も多いかと思いますが、Apple社の製品、OS等の情報、ニュースが網羅的に掲載されているWebサイトです。
　英語のみで、日本語版は無いようなので残念ですが、その分レアで最新のお宝情報がいち早くキャッチできる（かも）なサイトです。
　[Forums][3]もあり、ワールドワイドなユーザーからの情報が集まるのも魅力です。
　私はGoogle翻訳先生に頼りながら、英語の勉強がてら活用させていただいております。

https://www.macrumors.com/

[1]:https://qiita.com/official-events/d523df99d6479293ffa7
[2]:https://qiita.com/takeC74/items/899879513da0dc4d1219
[3]:https://forums.macrumors.com/

皆さん、いかがでしたでしょうか？　少しでも皆さんのご参考になれば幸いです。これ何文字だ？
以上、最後までお読みいただきありがとうございました。
【Next.js】 Next.js11から画像コンポーネントのwidthとheightの指定が不要に


## はじめに
先日2021/6/16にNext.js 11が発表されました。

[Next.js 11](https://nextjs.org/blog/next-11)

今回のアップデートでは、いくつもの機能改善が行われていますが、その中でも私がうれしかった改善を１つお伝えしたいと思います。

## 画像コンポーネントのwidthとheightの指定が不要になった

### Before

Next.jsの画像コンポーネントは、`width`と`height`の指定が必須でした。
このため予め画像の縦横の値を確認しなければならず、表示する画像の数が増えてくると、それなりに手間がかかっていました。

具体的には、以下のようなコードで、画像の`width`と`height`を指定する必要がありました。

```javascript
import Image from 'next/image'

function Home() {
  return (
    <>
      <Image
        src='/vercel.svg'
        alt='logo'
        width={588}
        height={136}
      />
    </>
  )
}
```

### After

これが今回のNext.js 11のアップデートにより、`width`と`height`の指定が不要になりました。

コードは、以下の様になります。

```javascript
import Image from 'next/image'
import logo from '../public/vercel.svg'

export default function Home() {
  return (
    <>
      <Image src={logo} alt='logo' />
    </>
  )
}
```

![ 2021-06-19 11.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/8238c070-7d47-3498-7ae9-a5139e3b356a.png)

上の画像は、コードの実行結果です。
`width`と`height`を指定しなくても縦横比が保たれていることが確認できます。
これで、予め画像を開いて縦横の値を確認する必要がなくなりました。

ただ画像の読み込みは、`import`で行う必要があります。
直接`import`で画像を指定することによって`width`と`height`が自動的に画像コンポーネントに提供されるからです。

もし以下の様なコードで`import`を使わずに画像を指定すると、`Unhandled Runtime Error`というエラーが発生してしまうので注意して下さい。

```javascript
import Image from 'next/image'

export default function Home() {
  return (
    <>
      <Image src="/vercel.svg" alt="logo" />
    </>
  )
}
```

## さいごに

画像コンポーネントの機能改善は、私にとって地味ながらもうれしいアップデートでした。

今日現在、新規にNext.jsプロジェクトを作成すると、新しいバージョンであるNext.js 11がインストールされます。
今回紹介した画像コンポーネントの機能も試すことができます。

ぜひ皆さんの環境で、新しいNext.js 11を試してみて下さい。

## 参考

[next-11#automatic-size-detection-local-images](https://nextjs.org/blog/next-11#automatic-size-detection-local-images)
3分でNuxt.js(+TailwindCSS) + StorybookでAtomic Designする環境を作る

#はじめに

これはNuxt.js + Storybookの環境を作りたいけど色々めんどくさい人のために作った雛形です。
とりあえずサンプル用に `Button` だけ作成してます。

#Let's 3分クッキング✊😸

## GitHub
https://github.com/tsuengineer/nuxt-storybook

## 手順

Git for WindowsとかTerminalを起動して作業ディレクトリで下記コマンドを順番に入力します。

```
git clone https://github.com/tsuengineer/nuxt-storybook.git
```

```
cd nuxt-storybook
```

```
npm i
```

```
npx nuxt storybook
```

最後のコマンドの実行が終わると勝手にブラウザが起動するはずですが、`localhost:3003` でも開けます

# Storybookの画面

うまくいくとこんな感じの画面が表示されます。

ボタンに関するソースコードは `/components/atoms/Button` ディレクトリの中にあります。

![storybook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122701/f51c6d52-6053-aab5-f209-191d0922865c.png)


# このボタンを実際に使ったところ

下記コマンドを実行したあとに `localhost:3000` にアクセスすると右下に(青い)ボタンが表示されます。

どうやってButtonコンポーネントをimportしてるかは `/pages/index.vue` の中見ればわかると思います。

```
npm run dev
```


![localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122701/f0b26203-96cc-3fc6-1326-ff5efca741b5.png)


以上です😽
【TypeScript】様々なIDを型安全にする

ユーザーID、組織ID、商品ID、予約ID、、、と
システムでは様々なIDを扱うことがある。
IDは通常、文字列型や数値型で扱われるが、
それだとあるIDを別の種類のIDと取り違えてしまったときに気づきにくい。

多くの静的型付け言語であれば、
IDの種類ごとにクラスなどを定義してやるという手がある。
しかし TypeScript は「[構造的部分型](https://qiita.com/suin/items/52cf80021361168f6b0e)」であるため
これでは区別できない。

↓の記事でこれに対する解が示された。

https://qiita.com/chimerast/items/1bea8bfb049767570b49

通常はこれでなんの問題もないだろう。
ただしIDの種類を表す文字列リテラル型（`Id<'Entity'>` の `'Entity'`）が偶然同じになってしまうと
意図せず同等の型になってしまう。

そこで↓の記事のテクニックを組み合わせることでその問題を回避する。

https://qiita.com/suin/items/35c3953254255d24a193

## 実装例

型定義等：

```typescript
export type UserId = string & { [userIdNominality]: never };
declare const userIdNominality: unique symbol;
export function toUserId(value: string): UserId {
    // 妥当性検証
    if (!/^[0-9]{8}$/.test(value)) {
        throw new Error(`UserId として妥当ではありません。value: ${value}`);
    }

    return value as UserId;
}

export type OrganizationId = string & { [organizationIdNominality]: never };
declare const organizationIdNominality: unique symbol;
export function toOrganizationId(value: string): OrganizationId {
    // 妥当性検証
    if (!/^[A-Z]{4}$/.test(value)) {
        throw new Error(`OrganizationId として妥当ではありません。value: ${value}`);
    }

    return value as OrganizationId;
}
```

利用例等：

```typescript
const str1: string = "00000000";
const userId1: UserId = toUserId(str1);
const str2: string = userId1; // UserId 型の値は string 型の値としても使える。
const userId2: UserId = str1; // コンパイルエラー！ string 型の値は UserId 型の値としては使えない。
const organizationId1: OrganizationId = toOrganizationId("AAAA");
const userId3: UserId = organizationId1; // コンパイルエラー！ OrganizationId 型の値は UserId 型の値としては使えない。
```

別のモジュール（`.ts` ファイル）であれば `unique symbol` 型の変数名（`userIdNominality` など）が同じになっていても別物と見なされる。
同じモジュール内の別の型向けの `unique symbol` を使ってしまわないようには注意すること。

／以上
LaravelからMAMPを使ってDB接続する方法

##前提
自分用メモです
Laravelインストール済み
mampインストール済み

##動作環境
macバージョン11.4
Laravel6.20
MAMP6.3
PHP7.4

##phpMyAdminでデータベースの作成
今回は以下のように作成
データベース名：mydeb
テーブル名：memos

##Bladeを使ったページの作成
Laravelapp(自分が作成したディレクトリ)/resources/views内に「test.blade.php」というファイルを作成

```
~~略
<body>
 
    <table>
        @foreach ($memos as $memo)
            <tr>
                <td>{{$memo->id}}</td>
                <td>{{$memo->memo}}</td>
            </tr>
        @endforeach
    </table>
 
</body>
```

##Controllerの作成
```
<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
 
class MemoController extends Controller
{
    public function index(){
        $memos = DB::select('select * from memos');
        return view('memo',['memos' => $memos]);
    }

}
```

useでnamespaceに

```
use Illuminate\Support\Facades\DB;
```
　を追加するのがポイントのようです。

##web.phpのRouteを編集
```
Route::get('memo', 'MemoController@index');
```

これで接続した際に、MemoControllerのindexの実行ですね。

##.envファイルを編集
Laravelapp/.envで以下のように設定

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=root
```

##database.phpファイルの編集

Laravelapp/config/database.phpを開き、以下の部分を編集。

```
'default' => env('DB_CONNECTION', 'mysql'),

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '8889'),
            'database' => env('DB_DATABASE', 'mydb'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'root'),
]
```

##マイグレーションの実行
```
php artisan migrate
```

これで完了です。

マイグレーションについて、まだ理解しきれていないので、別記事でまとめてみます。
EC-CUBE4 オーナーストアのプラグインをコマンドで更新

## はじめに

EC-CUBE4 には、オーナーストアプラグインを更新するための専用コマンド `eccube:composer:update` があります。
このコマンドにはパッケージを指定するオプションがないため、対象のプラグイン（依存パッケージ含め）以外の更新がされる可能性があるかと思います。

対象のプラグイン（依存パッケージ含め）のみを更新する方法です。

**※公式ドキュメントに、コマンドラインでプラグインを更新する方法の記載がないため、この方法は自己責任で行う必要があります。**
※`eccube:plugin:update`は、独自プラグインを更新するときに利用。 [*参考](https://qiita.com/nanasess/items/791c9ec98f69ada93ea0)
※ 管理画面のプラグイン一覧のアップデートボタンだけが、`PluginService` クラスの `update()` を実行できる。 
※ `updatePlugin()` では、オーナーストアプラグインをアップデートできない。

## プラグインを更新する

`composer require` は、インストール済みパッケージの対象バージョンを変更するときにも使用するようです。
なので、ここでは [プラグインの新規インストール](https://qiita.com/applexco/items/4260505b566caa171f4e) と同じ手順で行います。

`EC_CUBE_PLUGIN_PACKAGE` には、パッケージ名（例：ec-cube/SalesReport4）を入れ、`EC_CUBE_PLUGIN_CODE` には、プラグインコード（例：SalesReport4）を入力します。

```bash
# メンテナス状態に変更
echo auto_maintenance_update > ./.maintenance

# プラグインを無効化
./bin/console eccube:plugin:disable --code=EC_CUBE_PLUGIN_CODE

# EC-CUBEプラグインのダウンロードと依存ライブラリのダウンロード
./bin/console eccube:composer:require EC_CUBE_PLUGIN_PACKAGE

# キャッシュ削除
./bin/console cache:clear --no-warmup

# ダウンロードしたプラグインを適用（バージョン情報がDBにも反映される）
./bin/console eccube:plugin:update EC_CUBE_PLUGIN_CODE

# プラグインを有効化
./bin/console eccube:plugin:enable --code=EC_CUBE_PLUGIN_CODE

# メンテナス解除
rm ./.maintenance
```

## ローカルで動作確認ができたら

こちらの記事を参考に、他のマシンにもインストールします。
https://qiita.com/applexco/items/0f0f5b2640cc79580d29
Vue.jsにおける遅延ローディングによるページ高速化対応

##概要
Vue Routerの特徴として、最初のローディング時に全てのコンポーネントをimportしているため、大きなシステムで何十個もコンポーネントがあると、**初期ローディング時に時間がかかってしまいます。**
例えば、ユーザプロフィールやお問い合わせのページなどがあった時に、皆が皆お問い合わせページを使うわけではないので、必要なユーザだけがお問い合わせページのコンポーネントを読み込んで、必要ないユーザは読み込まない方が効率的です。

```js:router.js
import Vue from 'vue';
import Router from 'vue-router';

import Home from './views/Home.vue';
import Users from './views/Users.vue';
import UsersPost from './views/UsersPost.vue';
import UsersProfile from './views/UsersProfile.vue';
import HeaderHome from './views/HeaderHome.vue';
import HeaderUsers from './views/HeaderUsers.vue';

Vue.use(Router);
```

##対応
それを解決する方法として、下記のようにimportの記述方法を変えることで、最初に全てのコンポーネントを読み込むのではなく、**必要な時に必要なコンポーネントを効率よくローディングしてくれます。**

```js:router.js
import Vue from 'vue';
import Router from 'vue-router';

const Home = () => import(/* webpackChunkName: "Home" */ "./views/Home.vue");
const Users = () => import(/* webpackChunkName: "Users" */ "./views/Users.vue");
const UsersPost = () => import(/* webpackChunkName: "UsersPost" */ "./views/UsersPost.vue");
const UsersProfile = () => import(/* webpackChunkName: "UsersProfile" */ "./views/UsersProfile.vue");
const HeaderHome = () => import(/* webpackChunkName: "HeaderHome" */ "./views/HeaderHome.vue");
const HeaderUsers = () => import(/* webpackChunkName: "HeaderUsers" */ "./views/HeaderUsers.vue");

Vue.use(Router);
```

webpackChunkNameを記述することで、ファイルをローディングした際に指定したファイル名になるので、検証ツールで見た時にわかりやすくなります。
仮にwebpackChunkNameを記述しないと、0.js、1.jsのようにファイル名が数字になります。

また、上記は全て異なるwebpackChunkNameにしていますが、Usersコンポーネント関連でまとめたい場合は、下記のように同じwebpackChunkNameにするとローディング時にファイルをまとめることができます。

```
const Users = () => import(/* webpackChunkName: "Users" */ "./views/Users.vue");
const UsersPost = () => import(/* webpackChunkName: "Users" */ "./views/UsersPost.vue");
const UsersProfile = () => import(/* webpackChunkName: "Users" */ "./views/UsersProfile.vue");
const HeaderUsers = () => import(/* webpackChunkName: "Users" */ "./views/HeaderUsers.vue");
```
VSCodeエディタの設定

#はじめに
効率よくプログラミングするために、エディタの設定は重要です。
今回、当方が使い慣れているVSCodeの設定について書きます。

#VSCodeの設定

Windowsの場合は、**「Ctrl+,」**で設定を開くことができます。
Macの場合は、**「command+,」**で設定を開くことができます。


![スクリーンショット 2021-06-19 11.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/8ab490f3-8b87-7dac-72d1-f761dbf798c5.png)


### Auto Save
デフォルトでは、offとなっているので、afterDelayと設定しておきます。

### FontSize
デフォルトのサイズより少し大きくしておきます。自分は14に設定ししています。

### Font-Family

半角と全角スペースが区別しやすい**Ricty Diminished**フォントを使用します。
[**こちら**](https://github.com/edihbrandon/RictyDiminished/raw/master/RictyDiminished-Regular.ttf)からダウンロードして、インストールします。

下記のように半角と全角スペースが区別できます。
![スクリーンショット 2021-06-19 11.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/32de76db-354d-cfbf-a71f-ba42381e7fe9.png)


###TabSize
2に設定しました。

###WordWrap
テキストの自動折返しの設定です。onに設定しました。

### Formatting

Format On Saveにチェックいれておきます。
保存すると自動でコードを整形してくれます。

![スクリーンショット 2021-06-25 15.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/82738aed-ca82-d2aa-42b8-e89a32917144.png)



以上です。
Next.js「'NODE_OPTIONS' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」の対処法

#背景
「Next.js」で開発するときに、VSCodeでデバッグしたいと思い、
公式サイトを参考に進めてみましたが、
デバッグモードで起動コマンドを実行したら
下記のようにエラーが発生しました。

```
$ npm run dev

> racsche@1.0.0 dev
> NODE_OPTIONS='--inspect' next dev

'NODE_OPTIONS' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
https://nextjs.org/docs/advanced-features/debugging


同じエラーを経験している方、未来の自分のためにメモを残します。

#対処法
ちゃんとした対処法なのかは分かりませんが、`cross-env`というのをインストールしたら治るらしい。
https://base64.work/so/node.js/2080857

2021/6/19 11:42 時点では、weekly download が 「3,115,840」もあるから取り敢えず信頼できるものと判断。
https://www.npmjs.com/package/cross-env
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/2112d6c8-c64e-f2f0-b60c-130ba19af0e6.png)

#原因
今のところ不明。
公式サイトは`cross-env`なしでもちゃんと動くし、他のエンジニアさんの書いてある記事でも`cross-env`をインストールした手順は見当たらなかった。

まあ、個人的にはデバッグできるようになったから良しとします。
VBA　エクセル　Zチャート作成

移動年計は過去一年分から当月までの合計
（例）2021年2月分の移動年計　2020年3月～2021年2月
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/0175195e-1a36-0e23-7215-b8ab5b6ede7c.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/eda6f1ed-a8fb-ec2d-6421-bf197ff0a0d6.jpeg)

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/8c9c0ebb-9929-178f-6266-e5b9081e262b.jpeg)

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/3ec66898-cb13-afbc-c941-b1aa8bccb316.jpeg)

```vb
Sub Zチャートの作成()
'渋谷支店のZチャート
With Sheets("支店別Zチャート").ChartObjects.Add(10, 30, 250, 150).Chart
    .ChartType = xlLineMarkers
    .SetSourceData Source:=Sheets("渋谷支店").Range("A3:A15,C3:E15")
    .HasTitle = True
    .ChartTitle.Characters.Text = "渋谷支店売上推移"
    .ChartTitle.Font.Size = 10
End With
'新宿支店のZチャート
With Sheets("支店別Zチャート").ChartObjects.Add(280, 30, 250, 150).Chart
    .ChartType = xlLineMarkers
    .SetSourceData Source:=Sheets("新宿支店").Range("A3:A15,C3:E15")
    .HasTitle = True
    .ChartTitle.Characters.Text = "新宿支店売上推移"
    .ChartTitle.Font.Size = 10
End With
'品川支店のZチャート
With Sheets("支店別Zチャート").ChartObjects.Add(10, 200, 250, 150).Chart
    .ChartType = xlLineMarkers
    .SetSourceData Source:=Sheets("品川支店").Range("A3:A15,C3:E15")
    .HasTitle = True
    .ChartTitle.Characters.Text = "品川支店売上推移"
    .ChartTitle.Font.Size = 10
End With
'全支店のZチャート
With Sheets("支店別Zチャート").ChartObjects.Add(280, 200, 250, 150).Chart
    .ChartType = xlLineMarkers
    .SetSourceData Source:=Sheets("全支店").Range("A3:A15,C3:E15")
    .HasTitle = True
    .ChartTitle.Characters.Text = "全支店売上推移"
    .ChartTitle.Font.Size = 10
End With
End Sub
Sub 削除()
Sheets("支店別Zチャート").ChartObjects.Delete
End Sub
```
【AWS】EC2でのデプロイ（データベースの設定）

# 目的
`AWS`のサーバーを利用し、Railsで作成したアプリを公開する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- `EC2`の初期設定が完了している。[【AWS】EC2でのデプロイ（EC2の初期設定）](https://qiita.com/oak1331/items/cb435733a04a63fce94e)

# 手順

1. [はじめに](#はじめに)
1. [MariaDBのインストール](#mariadbのインストール)
1. [データベースの起動](#データベースの起動)
1. [rootパスワードの設定](#rootパスワードの設定)
1. [データベース接続の確認](#データベース接続の確認)

# はじめに

今回はデータベースの設定をしていきます！
今回デプロイで使用している`Amazon Linux 2`は`MariaDB`を使用しているので、その設定をします。
ちなみに`MariaDB`とは、MySQLの派生として開発されているオープンソースソフトウェアであり、MySQLとの互換性があります。

# MariaDBのインストール

それでは早速始めていきます！
`Amazon Linux 2`を利用している場合、MariaDBは `yumコマンド`からインストールします！

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install  mariadb-server mysql-devel
```

# データベースの起動

続いてデータベースの起動です。
データベースの起動には`systemctlコマンド`を利用します。
`systemctlコマンド`は、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツールです。

```
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start mariadb
```

起動確認のため、以下のコマンドを打ってみます。

```
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl status mariadb
```

「active (running) 」と緑色の表示がされれば、データベースの起動は成功です。

# rootパスワードの設定

次にyumでインストールしたMariaDBの`rootユーザー`にパスワードを設定していきます！

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/bin/mysql_secure_installation
```

コマンド入力後、以下の手順でパスワードを設定していきます。

1. Enter current password for root (enter for none): 」と表示されたらEnterキーを押す
1. 「Set root password? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
1. 「New password:」と表示されたら自身で決めたパスワードを入力
1. 「Re-enter new password:」と表示されたら、同じパスワードを入力

ここで`「... Success!」`と表示されればパスワードの設定は完了です!
続いて細かい設定について答える必要があります。

1. 「Remove anonymous users? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
1. 「Disallow root login remotely? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
1. 「Remove test database and access to it? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す
1. 「Reload privilege tables now? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す

プロンプトが表示されたら設定は完了です！

# データベース接続の確認

それでは、先ほど設定したパスワードが使えるか確認してみます！

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p
```

「Enter password:」とパスワードを入力するように表示されるので、設定したパスワードを入力して、Enterキーを押してください。
以下のように表示されれば、データベースの設定は終了です。

```:ターミナル（EC2内で実行）
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 142
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```

「exit」と入力すれば抜け出すことができます。

# 最後に

以上で、データベースの設定は完了です。
次回はEC2のRailsを起動を行っていきます。[【AWS】EC2でのデプロイ（EC2のRailsを起動）](https://qiita.com/oak1331/items/d62ac2921765af379fe5)
では。
pythonエンジニア認定試験受験記⑤

### 前書き
以下のオデッセイ開催のpython基礎認定試験を今度受験するにあたり
勉強して上で学んだことを記事でアウトプットしていく。

Odyssey CBT | オデッセイ コミュニケーションズ
https://cbt.odyssey-com.co.jp


前回で終わりのつもりだったが、その後色々気づいたことが出て来たためおまけとして記載する

### 四捨五入について

通常四捨五入を行う場合は1~4までを切り捨て、5~9までを切り上げと言うパターンが多いと思う。
というかそれが文字通りの四捨五入だと思っている

pythonで四捨五入を行いたい場合はroundという関数が用意されているためそれを使う
例えば

```python
round(1.543, 1)
```

とやると1.543を少数第2位(0開始なので1は0,1の二番目)でまとめてねとなる

```python
1.54
```

ぱっと見問題無いように見えるが次の場合を考える

```python
print(round(1.5, 0))
print(round(2.5, 0))
```

```:実行結果
2.0
```


上は正しいが下は5を切り上げたいので本来は3と出力したいところだが、どちらも2になっている
これはpythonが偶数側に丸めようとする性質があるかららしい。
つまり1.5であれば偶数側に丸めるので2になるが2.5だと偶数側にまとめるので3にはならず2となってしまうのである

これを解決するにはどうするか調べたところDecimalというモジュールを使うのが良いことがわかった
方法は次の通り

まずdecimalモジュールを読み込みDecimal, ROUND_HALF_UP属性をインポートする

```python
from decimal import Decimal, ROUND_HALF_UP
```

次にDicimalの引数として文字列型の変換したい数字を入れる
`文字列型`を入れるというところがポイントであるintやfloatじゃダメよということである

```python
Decimal('2.5')
```

これにquantizeというメソッドを使って2つ引数を指定してやる
第一引数はDecimalで揃えたい桁数(今回は少数台1位を切り上げたいので0)を文字列で指定
第二引数は切り上げたいのでrounding=にROUND_HALF_UPという文字列を渡す

因みに以下のリンクにroundingに渡すパラメータにどんなモードがあるか分かりやすく書いてある
https://docs.python.org/ja/3/library/decimal.html#rounding-modes

```python
Decimal('1.5').quantize(Decimal('0'), rounding=ROUND_HALF_UP)
Decimal('2.5').quantize(Decimal('0'), rounding=ROUND_HALF_UP)
```

```:実行結果
Decimal('2')
Decimal('3')
```

おまけとして以下のような小数点以下の足し算もこのDecimalを使えば意図した結果を出すことができる
なぜ少数同士の足し算で意図した結果にならないかは二進数の問題と丸誤差とか情報処理的な話になるのでここでは割愛する

```python
if 0.3 == 0.1 + 0.1 + 0.1:
    print('True')
else:
    print('False')
```

```:実行結果
False
```

Dicimalを使うと次の通り

```python
from decimal import Dicimal
if Decimal('0.3') == Decimal('0.1')+Decimal('0.1')+Decimal('0.1'):
    print('True')
else:
    print('False')
```

```:実行結果
True 
```


### 10進数を別の進数に変換

10進数を2進数とか8進数とか16進数に変換するにはどうしたら良いか

答え
`bin(),oct(),hex()` を使う
終了！

ではあまりにも味気ないので自分で実装してみたというお話
以下をサンプルにして作っていく

```python
bin(765),oct(765),hex(765)
```

```:実行結果
('0b1011111101', '0o1375', '0x2fd')
```

できれば引数渡して何進数とか指定して変換してくれる感じがいいよねということで次のようなコードになった

```python
def number_conv(num=255, convert=2):
    bin_num = ''
    
    if convert not in (2, 8, 16):
        return None

    while num != 0:
        num, surplus = divmod(num, convert)
        bin_num = str(surplus) + bin_num

    if convert == 2:
        bin_num = '0b'+ bin_num

    if convert == 8:
        bin_num = '0o'+ bin_num

    if convert == 16:
        bin_num = '0x' + bin_num
        bin_num = bin_num.replace('10','a').replace('11','b').replace('12','c').replace('13','d').replace('14','e').replace('15','f')

    return bin_num
```

```python:実行内容
print(number_conv(765, 2))
print(number_conv(765, 8))
print(number_conv(765, 16))
```

```:実行結果
0b1011111101
0o1375
0x2fd
```

・・・なんかものすごく強引な気もするが動けばよかろうなのだ
コードの解説はまた時間がある時に追記しようと思う
話題のグリーン仮想通貨”Chia”採掘協同組合Pool はどこを使う？！コレで利益が決まるから重要！！

やっとこさPlotのコツが掴めたのも束の間、、、採掘できるのはいつかというと、、、
え〜〜〜〜〜７年後！！！！！

SOLOでFarming してもこんな感じ、、、

一人で畑作って、一人で野菜を作って利益出そうって、そりゃ大変だろ〜って事で採掘協同組合に加盟するのが具体的に利益を出すのに必要になるんですよ、、

協同組合に入ると、採掘できると、、作物ができて売れるとチャリン、、とChiaが入り、分け前として提供したPlotに見合う分前がもらえるわけ、、

ただこのPoolに関しては個人が立ち上げたものやら、怪しげなのやら、、、、
Chia NetのオフィシャルPoolが立ち上がるというアナウンスはあったけど、一向に立ち上がらず、
しかも何やら　re-plot が必要だとおお〜〜〜！！

今までのPlot どうしてくれるんじゃい！
って事で、まあ純正Poolが立ち上がるまでは今のPlotで稼ぐためにPool 探しの旅に出る事にした、、、

まずChiaの有象無象のPool確認はココ；
https://miningpoolstats.stream/chia

何やら有象無象がいっぱいあるぞ、、、　日本も一個あるし、、今日時点で１６８個

先日話題になってたのは、ワーワー言ってプロモーションしてた
https://www.bluepool.io/
が三日で潰れた、、、　　ガクガクブルブル　＜＝　久々に聴いた人もいるだろ〜

Chiaの場合Hpoolが最大勢力なんだが何せ中華、、、
いつ何があってもおかしくない、、のでこれはちょっと避けたい、、、

となると、、
https://core-pool.com/
が候補と思いきや、、、サイトを見ると素性が知れない、、、

次の中華の
https://www.huobipool.com/pow/innovative
は、Pool Fee 8% ！！！　　　　こりゃないだろ〜

でもって次の
https://chia-og.foxypool.io/
ここはドイツのFelix Brucker氏がGitHubにも顔出しで出てるし、複数のアルトコインのPoolも運営
参加plot 数も伸びてる
Pool Feeも１％という事で、、

よーし、ここで行ってみよ〜    という事でこの協同組合にて栽培を始めるのだった、、、

つづく、、、、、、、


という事で
Azure VM 自動起動方法について

#やりたいこと	
AzureのVMを土日深夜は停止させて、平日日中帯のみ稼働させ節約したい。
恐らくVM費用が半額になるはずです！！
Azure　VMは自動停止はあるが、自動起動については
Azure Automationを利用してスケジュール化する必要があります。

簡単そうでしたが少しはまったので、自動起動方法についてご紹介させていただきます。

<dl>
<dt>▼作成方法</dt>
<dd>１、Automationアカウント作成</dd>
<dd>２、Azure Automation Runbook を作成する。</dd>
<dd>３、スケジュールを作成・設定する。</dd>
</dl>

#１、Automationアカウント作成
**１－１、AzureポータルにログインしAutiomationアカウントを作成する。**
　![Autiomationアカウント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/802c24fb-4d15-662a-7eaa-9e4b43daed8c.png)
**１－２、しばらく経つとアカウント作成されます。**　
![Automation完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/e3847c7c-ada4-d049-1409-53be6ad9f402.png)

　参考：Azure Automationアカウント作成方法
　https://docs.microsoft.com/ja-jp/azure/automation/automation-quickstart-create-account

#２、Azure Automation Runbook を作成する。
**２－１、RunBookを選択し『ギャラリー参照』を押す。**
![RunBook作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/8505863e-cfbd-c784-730a-502d5708f312.png)

**２－２、ギャラリーから今回はVMの起動なので『Start Azure V2 VMs』 をインポート**
![インポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/abf86357-fc7f-6ba8-ea32-c70fccf3c3bd.png)

**２－３、Runbook に名前を付けて作成**

**２－４、少し待つとRunBookが表示されます（表示されない時は、最新の情報に更新ボタンを押してください）**
![RunBook完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/7f0f67ae-e392-d2ac-e958-8e357361c17b.png)


**２－５、RunBoookを選択し編集を押し、テストウィンドウを開く**
![テスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/577c1931-fb15-8e3d-5adc-d6b370e2018e.png)
・リソース名とVM名を文字列入力し、テスト開始。
　RESOURCEGROUPNAME
　VMNAME
![テスト実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/c77cd0e8-f97b-278c-2ab2-b55ad4941d62.png)

・しばらくすると、名称が正しければ　“完了”　と画面が表示されます。
　【はまり】入力と出力部分の変数名を変更すると動かなくなり恥ずかしながらはまりました・・。

**２－６、RunBookを公開する。**
・テストが問題無く成功できたら、公開ボタンを押しRunBookの公開（発行）します。
![公開.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/dd6265f5-7d9e-80c6-e75e-d8b954e12e08.png)

#３、スケジュールの作成
**３－１、RounBookのスケジュール設定を開き、新しいスケジュールの追加を押す。**
![スケジュール１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/c3b04df1-fce1-ba76-c988-4f71a8a7af33.png)
**３－２、スケジュールをRunBookにリンクを押し、スケジュールの追加を押す。**
![スケジュール２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/39aec175-8dd6-8cf0-3b8f-660e2cce0d62.png)
今回は、今回は平日のみ実行したいので、間隔を週単位とし月曜日から金曜日までを設定し作成。

**３―３、作成されたスケジュールを選択し、「パラメーターと実行設定を構成する」を押す。**
テスト時に行った、RESOURCEGROUPNAMEとVMNAMEを設定しOK。
後は設定した時間に実行されれば完了です!!
#最後に
以前はPowerShellでゴリゴリ書く物だと思っていましたが、現在はギャラリーが豊富に用意されていて簡単に自動起動が実現できました。
ギャラリーを色々と試してみても面白そうです。

Azureのコストも抑えつつ、Azure利用の敷居が下がれば幸いです。
Let's Azure!!
WebRTC始めるために最低限必要な知識をすごく丁寧に説明する

# この記事の目的
- WebRTCを0から学ぶのが割としんどかった。他の人が同じ思いをしないように今わかっていることをわかりやすく記述します。
- 本当に何も知らないのに急に仕事でやらないといけなくなった人とかに読んでもらいたいです。
- できるだけ用語解説やリンクの掲載は行いますが、言葉がわからない場合は調べてください。

#WebRCTとは
- web会議が一番有名な例。リアルタイムに動画や音声の通信を行うことを可能にする技術全体のこと。
- 色々な場所にいる人が同時に音声や動画を共有することを実現するための技術のこと。

# どうやって実現するのか
Web会議ツールでAさんとBさんが通話するまでの流れを例に取り、実現方法を説明します。
まず最初に実現手順を示します。

1. 通話をするために必要な情報を運ぶネットワーク上の道を開く(共有シグナリングチャネル)
2. Aさん、Bさんお互いのネットワーク上の住所を取得する(STUN/TURN, ICE)
3. お互いのネットワーク上の住所に通話するために必要な情報を送り合う(Session Negotiation)
4. お互いがお互いの情報を受け取ることで通信が確立して通話可能な状態に(WebRTC確立)

### 共有シグナリングチャネル
お互いの通信ができるか確認したり情報を交換するための仲介役を立てておく必要があります。この仲介役は共有シグナリングチャネルと呼ばれ、主にWebSocketが使われています。
[今さら聞けないWebSocket~WebSocketとは~](https://qiita.com/chihiro/items/9d280704c6eff8603389)

### STUN/TURN, ICE
実際の世界で手紙を送るためには相手の住所を知らないといけないのと同様に、ネットワーク上でも通信相手に情報を届けるために相手の住所を知っておく必要があります。
ネットワーク上の住所、というのはIPアドレスのことです。IPアドレスさえ分かっていれば情報を届けることができます。
ところが、プライベートなIPアドレスからパブリックなIPアドレスを直接取得することはできないので、通信者のどちらかもしくは双方がプライベートネットワークに所属している場合、情報をお届けできないのです。この問題を解決してくれるのがSTUNサーバーです。
(プライベート・パブリックIPアドレスに関しては[こちら](https://livra.geolocation.co.jp/iplearning/205/)など)

**STUNサーバー**
自身のパブリックIPアドレスを教えてくれるサーバー。STUNサーバーに「外から見たらどんな住所に見えますか〜？」と聞くと自分をネットワークの外から見た時の住所を教えてくれるイメージ。
STUNサーバーとはhttps://webrtcforthecurious.com/ja/docs/03-connecting/#stun

ところが、通信しようとしているネットワークがそれぞれSTUNサーバーに対する互換性がない場合など、なんらかの妨げがある場合は通信に失敗してしまいます。この場合はお互いが直接通信する方針を諦め、サーバーに通信の仲介役をしてもらいます。この仲介役がTURNサーバーです。

**TURNサーバー**
通信しようとしている人の間に立ってデータのやりとりの仲介者となってくれるサーバー。通信しようとしている人はTURNサーバーに向けてデータを投げ、相手はTURNサーバーからデータを受信することになります。
TURNサーバーとはhttps://webrtcforthecurious.com/ja/docs/03-connecting/#turn

実際のWebRTCの確立ではSTUNサーバーがうまく機能しなかった場合にはTURNサーバーを使用するという流れになります。そしてこれを勝手にやってくれるのがICEという技術です。

**ICE**
STUNとTURNをいい感じに使用して接続を確立してくれる技術。
到達可能な住所をリスト化して送信し、そのリストのなかで接続可能なものがあれば終了、なければ再度リクエストするといったやりとりをします。

### Session Negotiation
接続を確立するためにどのような情報を送っているのか、について説明をします。
送る必要のある情報は、やりとりする音声と動画ファイルのタイプ・音声や動画ストリーミング用のIP・プロトコルの候補などで、これらを全て含むものをSDP(Session Description Protocol)といいます。また、SDPを送信して接続の交渉を行うことをSession Negotiationと呼びます。
自身のSDPはLocalDescription、通信相手のSDPはRemoteDescriptionと呼び、それぞれ保存しておくことでWebRTCが確立できます。

これらを踏まえて、再度手順を示します。

1. 共有シグナリングチャネルをたてる
2. ICEによって通信経路を確立する
3. 共有シグナリングチャネルを通じてお互いのSDPを送り合い、LocalDescriptionとRemoteDescriptionを保存する
4. 正常に情報交換が完了すれば接続完了。データのやりとりができるようになる。

# 最後に
ここまで読んだらまずは簡単に実装してみることをお勧めします。
SDPのやりとりやICEのやりとりのシーケンスに関しては文章を読むより実装したほうが理解が早いと思います。(あくまで個人の意見ですが)
もう少し踏み入った話(SFUにjanusgateway使うとか)や、ハンズオンみたいなのもやりたいので気が向いたら書きます〜
いつから touch コマンドでファイルを作れるようになったのか

答え： **最初から**

（この記事は[地平線に行く](https://yujisoftware.hatenablog.com/entry/touch)とのマルチポストです）

# 最初の touch コマンド

FreeBSD の touch のマニュアル曰く、touch コマンドは Version 7 の AT&T UNIX で登場したそうです。

> HISTORY
>     A touch utility appeared in Version 7 AT&T	UNIX.
> [touch(1) - FreeBSD Manual Pages](https://www.freebsd.org/cgi/man.cgi?query=touch&sektion=1)

このときの man を読むと、すでに「ファイルが存在しなければ作成する」ということが記載されています。

> ## DESCRIPTION
> *Touch* attempts to set the modified date of each *file.*
> This is done by reading a character from the file and writing it back.
> <font color="red">If a *file* does not exist, an attempt will be made to create it unless the **\-c** option is specified.</font>
>
> *Touch*は、それぞれのファイルの修正日時の設定を試みます。
> これは、ファイルから文字を読み取り、それを書き戻すことによって行われます。
> <font color="red">ファイルが存在しない場合、**-c** オプションが指定されていない限り、ファイルの作成を試みます。</font>
>
> [unix-history-repo/touch.1 at Research-V7 · dspinellis/unix-history-repo · GitHub](https://github.com/dspinellis/unix-history-repo/blob/Research-V7/usr/man/man1/touch.1)

ソースコード[^source]を読むと、たまたまファイルがなければ作るようになったのではなく、あえてそのように実装していたことが分かりました。
具体的には、まず `stat(3)` でファイルの存在を確認して、なければ `create(3)` でファイルを作るという実装をしていました。
[unix-history-repo/touch.c at Research-V7 · dspinellis/unix-history-repo · GitHub](https://github.com/dspinellis/unix-history-repo/blob/Research-V7/usr/src/cmd/touch.c)

[^source]: たったの70行しかありません。

```c
#include <sys/types.h>
#include <sys/stat.h>

touch(force, name)
int force;
char *name;
{
struct stat stbuff;
char junk[1];
int fd;

if( stat(name,&stbuff) < 0)
	if(force)
		goto create;
	else
		{
		fprintf(stderr, "touch: file %s does not exist.\n", name);
		return;
		}

if(stbuff.st_size == 0)
	goto create;

if( (fd = open(name, 2)) < 0)
	goto bad;

if( read(fd, junk, 1) < 1)
	{
	close(fd);
	goto bad;
	}
lseek(fd, 0L, 0);
if( write(fd, junk, 1) < 1 )
	{
	close(fd);
	goto bad;
	}
close(fd);
return;

bad:
	fprintf(stderr, "Cannot touch %s\n", name);
	return;

create:
	if( (fd = creat(name, 0666)) < 0)
		goto bad;
	close(fd);
}
```

では、**なぜファイルが存在しない場合にエラーにするのではなく、ファイルを作るようにしたのでしょうか。**

それは、わかりませんでした（ぇ

# まとめ

いかがでしたでしょうかw

ソースコードにコメントはなく、なぜこのような仕様にしたのかはこのコードを書いた[Dennis M. Ritchie](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%8B%E3%82%B9%E3%83%BB%E3%83%AA%E3%83%83%E3%83%81%E3%83%BC)氏[^ritchie]しか知る由がなさそうです。ただ、2011年に亡くなられたので、もはや聞くことはできません…。

おそらく、その方が便利だからだとは思うのですが、確証がありません。
もしかしたら本か何かに、その意図が残されているかもしれません。
ご存じの方がいましたら、情報をお寄せいただければと思います。

[^ritchie]: C言語の生みの親。当時はベル研究所に所属していた。