OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】Route53で取得したドメインでアクセスすると「404 Not Found」が表示されてしまう

AWSにデプロイしたwebサイトに独自で取得したドメインからアクセスしようとしたらエラーで正常にアクセスできずにハマってしまったので、僕のインプットも兼ねて今回解決に至った解決策を共有したいと思います。

<img width="1005" alt="スクリーンショット 2020-04-19 1.42.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574875/b7c45536-2d26-b240-c0e3-bae0bc33a489.png">

# 結論
初めに結論から申しますと、今回のエラーの原因はRoute53で取得したドメインを本番環境のnginxの設定ファイル（nginx.conf)に紐付けする作業を行っていなかったために発生してしまいました。

# なぜドメインからアクセスできなかったのか？
nginxはserver_nameを見てどのサーバーに振り分けるのかを見ているようなので、nginxの設定ファイルであるnginx.confファイルの「server_name」にRoute53で取得したドメインを記述するという作業を行っていなかったため、アクセスすることができなかったようです。

# 解決方法
nginx.confファイルの設定を変更してやれば解決できます。

エラー時のnginx.confファイル↓

```
error_log  /var/www/rails/friends/log/nginx.error.log;
access_log /var/www/rails/friends/log/nginx.access.log;

client_max_body_size 2G;
upstream app_server {
  server unix:/var/www/rails/friends/tmp/sockets/.unicorn.sock fail_timeout=0;
}
server {
  listen 80;
  server_name 18.180.36.193;
  keepalive_timeout 5;
  root /var/www/rails/friends/public;
  try_files $uri/index.html $uri.html $uri @app;
  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/rails/friends/public;
  }
}

```

この中のserver_nameにRoute53で取得したドメインを追加する必要があります↓

```
error_log  /var/www/rails/friends/log/nginx.error.log;
access_log /var/www/rails/friends/log/nginx.access.log;

client_max_body_size 2G;
upstream app_server {
  server unix:/var/www/rails/friends/tmp/sockets/.unicorn.sock fail_timeout=0;
}
server {
  listen 80;
  server_name 18.180.36.193 guardians-community.com;
  keepalive_timeout 5;
  root /var/www/rails/friends/public;
  try_files $uri/index.html $uri.html $uri @app;
  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/rails/friends/public;
  }
}

```

server_nameを複数設定する際は、nameの間を空白で開けてやれば復数設定することができます。
[参考記事：Nginx server_nameを複数指定する](http://keruuweb.com/nginx-server_name%E3%82%92%E8%A4%87%E6%95%B0%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)

以上の設定が完了したら下記コマンドを実行してnginxの設定を上書きします。↓

```
$ sudo nginx -s reload
```

これで設定完了です。

この紐付け作業が完了したらドメインからアクセスすることができるようになっているはずです。

<img width="1262" alt="スクリーンショット 2020-04-19 11.16.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574875/08d4d469-f0d2-e7c9-b3d8-cd1c18b38ce4.png">

# まとめ
以上で今回僕がハマってしまったRoute53で取得したドメインでアクセスできなかった問題と解決策の共有を終わりたいと思います。

インフラは最近触り始めてばかりで初歩的な間違いではあったのかもしれませんが、今回のエラーのおかげでまた１つインフラに対する知見を増やすことができました。

最後まで読んでいただきありがとうございました。
この記事がどなたかのやくに立ってくれれば幸いです。
ネットを使った飲食店の支援を考える

#飲食店の売り上げが下がっている件

そもそも緊急事態宣言以後、主に夜の街、そして観光客相手の飲食店の売り上げが軒並み下がっていて、このままでいくと、宣言解除まで保たないかもしれないのです。

https://tsurezure.theshop.jp/

たとえばこんな試みも行われていて、だったらテレビ会議システムでいわゆる「宅飲み」クラスタへ向けて、飲み屋への支援となるさらなる投げ銭システムとかできないだろうか？


##動画サービスを選ぶ

###zoom

無料だと最大100人、3人以上の場合40分で一度通話を切る必要がある。

###SOBA Meeting

ホストのみアカウント登録が必要

###BizMee

ブラウザ使用。人の出入り管理が難しい？

###Google ハングアウト

最大100名。当然googleアカウントが必要


こんな所か？

##課金システムに関して

考えたらWEBベースだとミーティング画面に行き着くまでに何らかの課金システムを1つかましてあげればいいのか？
たとえばnoteを使ってみるとか。

#一旦しめる

と、考えてみると開発するまでもなく既存のシステムでどうにかなるんじゃないかなと。
Pythonでできるだけ短いコードで素数を求める

#はじめに
[この記事](https://qiita.com/ryuichi1208/items/f9e6ac2b99bbe4fc82d3)をみて僅か七行でテトリスができるのかと感動した。
しかし私は全くjavascriptができないので、意味が分からない。(というか構文は理解できるが、何をしているのかがわからない)
しかし、ショートコーティングをするとなんかかっこいいということに気付き、Pythonでもそんなやつができるのかもしれないと思ってやってみたので紹介してみる。
あと語彙力がないので、文が変になっていても許してください。
#普通に素数判定アルゴリズム
まずは普通に素数判定プログラムを組んでみる。(実行速度は考慮しない)

```python
JudgeNum=int(input("数?"))
prime=True
for i in range(2,JudgeNum):
    if JudgeNum%i==0:
        prime=False
print(prime)
```
実行結果

```
数?5
True
```

これが普通の答えである。これをほかの人に見せても、「ふーん」ぐらいの反応である。
とりあえずこれを少し短くしてみる
#短い素数判定アルゴリズム
まず

```python
int(input("数?"))#は
int(input())#に置き換える
JudgeNum#は
n#に置き換える
```

次に、内包表記を使う。

```python
prime=True
for i in range(2,n):
    if n%i==0:
        prime=False
```
こいつは

```python
prime=not[i for i in range(2,n) if n%2==0]
```
とほとんど同じである
この内包表記では、割れた数をリストに追加していっている。

pythonでは空のリストはFalseと評価されるので、こいつをnotで反転させてあげることで空のリスト(すべての数で割り切れなかったということを表す)が素数ということを表す。(語彙力)
(一瞬 not ではなく ~ で反転しようと思ったが、反転するものがリストなのでできなかった。)


そしたらprimeという変数はいらなくなる。
なので

```python
print(not[i for i in range(2,n) if n%2==0])
```
で短くできる。
最終的には

```python
n=int(input())
print(not[i for i in range(2,n) if n%2==0])
```
と二行に短縮できた。
#一行の素数判定アルゴリズム
ここまで来たのなら1行でしたい。しかし変数を宣言するときに、どうしても改行をしなければいけない。変数を使わずに素数判定アルゴリズムは不可能に近いので最低でも二行は必要なのか。関数の引数みたいにコンマでできたらいいのに...
.
.
.
!
関数を使えばいいのか!
しかし普通の関数では無理だ。そこで無名関数(lambda)を使うことにする。
nを引数にすれば良い

```python
(lambda n:print(not[i for i in range(2,n)if n%i==0]))(int(input()))
```
これで一行にまで圧縮できた。え?二行のほうが文字数が少ないって?んなもん知るか。
#最後に
これが結構頑張って考えたショートコーティングです。
もし、これより短いコードがあったら教えてください。
10進数と2進数の変換 ｜Power Query

勉強がてら書いてみたので、置いておきます。
コードの通り、変換できる10進数は正の64bitの整数に限定してます。

##コード
###10進数⇒2進数
```pq:fx_10進数から2進数へ
(DecimalNum as number) as text=>
if Int64.From(DecimalNum)<>DecimalNum
   or DecimalNum < 0 then error "変換対象は正の64bit整数に限ります。"
else if DecimalNum =0 then "0"
else
let
    Source = List.Generate(
                ()=>[current =DecimalNum,
                     mod =Number.Mod(current,2)],
                each [current]>0,
                each [current =Number.IntegerDivide([current],2),
                      mod =Number.Mod(current,2)]
             ),
    BinaryNum = List.Accumulate(
                    {each List.Transform(_,(x)=>Number.ToText(x[mod])),
                     List.Reverse,
                     Text.Combine},
                    Source,
                    (x,y)=>y(x)
                ),
    result = BinaryNum
in
    result
```
###2進数から10進数へ

```
(BinaryNum as text) as number=>
let
    Source = List.Transform(
                Text.ToList(BinaryNum),
                Number.FromText
    ),
    Multipliers = List.Accumulate(
                    //実行する関数:逆順にして、2の累乗数に変換。                    
                    {List.Reverse,
                     each List.Transform(_,(x)=>Number.Power(2,x))},
                    //0から桁数-1までの連番
                    {0..Text.Length(BinaryNum)-1},
                    (x,y)=>y(x)
    ),
    zipped = List.Zip({Source,Multipliers}),
    calculation = List.Sum(
                    List.Transform(zipped,each _{0}*_{1})
    ),
    //0と1だけなら、空リストになる。
    IsBinaryNum = List.Select(Source,each not List.Contains({1,0},_)) ={},
    result = if IsBinaryNum then calculation
             else error "2進数の表記に誤りがあります。"
in
    result
```

##実行例
0から16の連番に列追加で実行してみました。
10進数から2進数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/3b6489d6-7f6c-79fc-e463-2b2b86f7ada0.png)
さらに2進数から10進数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/1a219e53-0375-35dc-35fa-ab0387f7f105.png)



##おまけ
Power Queryの関数にビット演算はあります。これはExcelのワークシート関数と同じく、10進数で行えます。
[Number関数―バイト| Microsoft Docs](https://docs.microsoft.com/ja-jp/powerquery-m/number-functions#bytes)
#Github で git push すると Approve ( 承認状態 ) が消えるのだが、レポジトリの設定で変更可能っぽい。 ( Dismiss stale pull request approvals when new commits are pushed )

レポジトリ > Settings > Branches > Branch protection rules より設定可能

**Dismiss stale pull request approvals when new commits are pushed** にチェックが入っていると、新しいコミットを積むときに承認が取り消されてしまうみたいだ

![image](https://user-images.githubusercontent.com/13635059/79624792-17d60680-815f-11ea-849c-a216ab5f06c4.png)

[About pull request reviews - GitHub Help](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews)

>>If both required reviews and stale review dismissal are enabled and a code-modifying commit is pushed to the branch of an approved pull request, the approval is dismissed. The pull request must be reviewed and approved again before it can be merged.

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3082











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Github git push new commits automatically cancel Approve  

See Repository > Settings > Branches > Branch protection rules > Dismiss stale pull request approvals when new commits are pushed )


![image](https://user-images.githubusercontent.com/13635059/79624792-17d60680-815f-11ea-849c-a216ab5f06c4.png)

[About pull request reviews - GitHub Help](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews)

>If both required reviews and stale review dismissal are enabled and a code-modifying commit is pushed to the branch of an approved pull request, the approval is dismissed. The pull request must be reviewed and approved again before it can be merged.

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3081











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Docker】docker-compose up によりWEBがすぐに落ちてしまう問題【Rails】


最近嵌ってしまった問題を備忘録的に残します。

#$ docker-compose up -d
いつも通り、バックグラウンドでコンテナを起動させました。

WEBを確認すると・・・エラーが発生して繋がりません。

#$ docker ps
により、状況を確認すると、

DB（MYSQL）だけが立ち上がっている状況でした。

<img width="996" alt="スクリーンショット 2020-04-19 11.32.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620533/03e21d85-6338-a5e9-d8f7-280ffca6ad43.png">


docker-compose up -dにより立ち上げたはずが、何故かすぐに落ちてしまっています。

docker-compose stop
docker-compose up -d

により、再起を試してみても一向に変化なし。

これはどうしたものかと思い、途方に暮れ、原因を探っていると、コンテナ起動の前に、

#gemをgemfileに追加していたことを思い出しました。


ここで思い出しました。

gemを追加した場合、Dockerイメージの再作成をするため、

#$ docker-compose build する必要があったのでした。

つまり、buildコマンドの入力忘れだったということです。

その後、docker-compose up -dによりコンテナ作成。

docker psにより確認すると、

<img width="1020" alt="スクリーンショット 2020-04-19 11.26.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620533/7be27d1b-8943-d647-d1b7-2f0f584358dc.png">

無事に起動しました・・・。

#gemを追加したらbuildしてup!
この一連の作業を忘れないように、心に刻んだのでした。

#【参考までに】
- buildコマンドを毎回打つのは面倒・忘れてしまうという方は、以下のような方法で回避できるようです。

- [docker-composeでRailsのGemを更新する時、docker buildするのを回避したい](https://qiita.com/neko-neko/items/abe912eba9c113fd527e) | Qiita
【Swift】getter/setterについて

# はじめに
classやstruct内でたまに見かける、

```swift
get{
  return ~~
}
set{
  処理
}
```

この`get/set`って何？？
と思ったので、勉強したことの備忘録を書きます！

# getter/setter　とは！

結論からざっくりいうと

**getter : 他のプロパティから値を受け取り、処理した値を返す！**
**setter : 処理した値を他のプロパティに渡す！**

て感じです！

実際にコードで見てみます！

```Swift:get_set_playgriund

import UIKit

var str = "Hello, playground"

class Product {
    var name:String
    var price: Int
    
    var tax: Int {
        get{
            //priceからtax(消費税)を計算
            //他のプロパティ（price）の値を処理してtaxに返してますね！
            return Int(Float(price)*0.1)
        }
        set{
            //newValue(getから得たreturn値)からpriceを算出
            //taxの値(newValue)を処理して、他のプロパティ（price）に渡してますね！
            price = Int(Float(newValue)/0.1)
        }
    }
    init(name:String, price:Int) {
        self.name = name
        self.price = price
    }
}

var apple = Product(name: "青森県産リンゴ", price: 100)
print(apple.tax) //出力10

apple.tax = 90
print(apple.price)  //出力900
```
C言語　クイックソート


##コード
```c
#include <stdio.h>

static void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

static void print_array(int array[], int array_len)
{
    printf("%d", array[0]);
    for (int i = 1; i < array_len; i++)
        printf(" %d", array[i]);
    printf("\n");
}

void quick_sort(int A[], int left, int right)
{

    int pivot;
    int i, j;

    if (left >= right)
        return;

    pivot = A[left];

    i = left;
    j = right;

    while (1)
    {
        while (A[i] < pivot)
            i++;
        while (A[j] > pivot)
            j--;
        if (i >= j)
            break;
        swap(&A[i], &A[j]);

        i++;
        j--;
    }

    quick_sort(A, left, i - 1);
    quick_sort(A, j + 1, right);
}

int main(void)
{
    int N = 10;
    int A[10] = {2, 1, 8, 5, 4, 7, 9, 0, 6, 3};
    print_array(A, N);

    quick_sort(A, 0, 9);
    print_array(A, N);

    return 0;
}
```
##ポイント
- 不安定なソート



##所感
2020/04/19　コード模写しただけ
めっちゃ簡単な原理なのに早い。


##参考
クイックソートを図を使って分かりやすく解説（C言語サンプルプログラム付き） | だえうホームページ
https://daeudaeu.com/programming/c-language/quicksort/
秒速で業務マニュアルを作成するために、スクショから加工、マークダウンまで5sで行う方法

## 用意するもの
- [skitch](https://evernote.com/intl/jp/products/skitch)
- mac

## やり方
1. 「⌘ + shift +5」でskitchのスクショ機能を呼び出す
  - 無い場合は設定してね
  - <img width="1300" alt="スクリーンショット 2020-04-19 10.52.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344152/24e35347-0d50-db8a-0ab5-57834ad42333.png">
2. 必要な範囲を切り取り、加工を行う
  - <img width="1372" alt="スクリーンショット 2020-04-19 11.00.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344152/ac0af498-1aba-eccc-dd3c-fd64586f3f4e.png">
3. 加工したやつを更に「⌘ + shift + 4」でスクショする
  - (ここが重要で、加工したファイルを保存し、編集中のファイルにアップするためには更に「⌘ + s」→「保存ボタンを押す」→「編集中のファイルに戻る」→「画像アップボタンをクリックする」→「スクショした画像を選択」というステップを踏まなければいけない。くそめんどいので↓)
  - <img width="747" alt="スクリーンショット 2020-04-19 11.10.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344152/0dfa6e95-93d2-c362-9ea2-4fae786f8a3a.png">
4. スクショをアップする
    - このやり方でスクショすると、右下にresultみたいなのが出てくるので、それを編集中のファイルまでドラッグする。大体のエディタはアップが始まる。
    - <img width="1201" alt="スクリーンショット 2020-04-19 11.16.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344152/8a648318-44cd-dd86-d9d4-e9d7eafaec0d.png">
5. 必要に応じて「width=****」を変えて画像サイズを調整してください

## 注意
- デフォルトだと容量に上限があるので[こちらの記事](http://koba.me/skitch-apps-231/)参考にしてカスタマしてください
Markdownで表を書くのがめんどくさい全ての人へ

# はじめに

素の Markdown で 表を書くのはめんどくさいですね

# `Typora` をいれましょう

これまでもMarkdownで表を書くのを支援するツールがたくさん紹介されています[^2] が、最強は `Typora` です[^1]。[Webサイトはこちら](https://typora.io/)

[^1]: 俺調べ
[^2]: 多すぎるのでここであげるのはやめときます

![typora-table.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/c048dbe4-eb20-6587-3276-1468ab587417.gif)

- `⌥` + `⌘` + `t` で 任意の場所にテーブルを挿入
- `⌘` +  `/` で Markdownのソースを参照（もう一回押すと、GUIのモードに戻る）
- GUIのモードではエクセルみたいに行を掴んでドラッグして入れ替えたりできます
- Excelの表をTyporaに貼り付けても表になる

# まとめ

`Typora` つかうとストレスなく Markdown で表を書くことができるんで、みなさんもどうぞ。
JavaScriptでunixtimeから日時へ変換する方法

下記参照です、そのままだ(*・ɜ・ﾉﾉ"☆ﾊﾟﾁﾊﾟﾁ♪
[JavaScriptでunixtimeから日時へ変換するやり方のメモ](https://qiita.com/shirokurotaitsu/items/5efd855900ec6135bbab)
15年前の駆け出しエンジニア、2020年の駆け出しエンジニアと交流する（１）

# ベンチャー企業における駆け出しエンジニアとの交流(2020年）

　私は、一人法人で15年間、Webシステム開発と自治体・大学・研究所の統計分析を事業としている。
　現在、あるベンチャー企業のWebシステム開発支援をしている。

　そこで何名かの「駆け出しエンジニア」と知り合い、彼らの言動がとても参考になったので、記録しておこうと思う。
　その前に「駆け出しエンジニア」に関して、私のみた感想を少し記述する。

# 2018～2019年あたりのプログラマーをめぐる状況とTwitterにおける「駆け出しエンジニア」

## プログラマーの人材不足による高単価、義務教育化によるプログラミングへの関心

　2018年～2019年あたりからTwitterでも「#駆け出しエンジニア」というハッシュタグはよく見られた。
　この時期に、ソフトウェア開発、特に、Web開発への就職・転職希望者が多くなり始めた印象がある。

　[👉 参考：第2回：IT分野の市場は拡大する一方、人材は不足～統計データによる現状分析～](https://resocia.jp/case/287)

　好況を背景とした人材不足で単価が上がっていることもあるし、2020年のプログラミングの義務教育化の影響でプログラミングへの関心が高まったのも影響しているのかもしれない。

　転職者の増加については、座ってパソコンで文字打てばいいし、それほど厳しい資格取得などはなく転職できそうだと思うのも影響しているのだろうか。高単価という意味では、他の業種でも好況を受けて単価が高いものはあるので、それ以外の理由なのだろうか。

　リーマンショックあたりでは、「デスマーチ」という言葉が象徴するように3K職場で敬遠されがちな職種だった印象があるけど、実際の職場環境の改善やメガベンチャーを筆頭に新しいスタイルのソフトウェア会社が登場したのも状況をかえたのかもしれない。

　[👉 参考：IT業界の就職を敬遠する学生が増えている？IT技術者の3K説を検証する](https://ascii.jp/elem/000/000/587/587632/)

## 「駆け出しエンジニア」という言葉から見えるもの

　これらの転職希望者、初学者が「駆け出しエンジニア」という言葉を、アカウント名やハッシュタグにつけて、Twitter内で発信・受信を行っていた。

　その目的は千差万別なのだと思うが、自分がTweetを見て感じたのは、以下。

- 自分の学習記録・モチベーション維持
- 同じ境遇の人とのつながりの創出
- 転職・就職希望
- なんとなく自己アピール：俺、勉強してます！
- 経験者などから情報を得るため

実際は、発信者しかわからない心のうちだけど、傍から見てると上記のようなものを感じた。

# 2020年、コロナショックと忍び寄る不況、やや冷たい風が「駆け出しエンジニア」に吹き始める

　2020年は、周知の通りコロナショックにより世界的に経済だけでなく、人々の生活が萎縮し、それに伴い、景気も下降線を描き始めた。
　元々、コロナショックの前から、「オリンピック不況」と言われるように、オリンピックが終わった頃には不況になるだろうとは巷で言われていた。

　[👉 参考：６４年大会後は倒産３倍、「五輪不況」の回避焦点＝前回との比較・五輪あと１年](https://www.jiji.com/jc/article?k=2019072700250&g=eco)

 オリンピックすら来年に延期させたコロナショックによって、不況は早まるようにみられている。
　それもあってか、「駆け出しエンジニア」にも冷たい風が吹き始める。好況を背景としたときは、未経験でも採用してくれる人は多かったが、未経験者よりは経験者を採用する経営者の話をよくきく。

　[👉 参考：転職求人倍率レポート（2020年2月）](https://doda.jp/guide/kyujin_bairitsu/?sid=GuideTop-footer)

　「駆け出しエンジニア」という言葉へもTwitter内では、傷のなめあいはどうなんだろうかみたいな発言も見られたり、言葉への見方も若干冷たさを感じる。

　その背景には、プログラミングスクールへの批判めいた発言とも相まっており、「駆け出しエンジニア」、「プログラミングスクール」の母数があがり、言葉が認知されてくるに従って、それへの認識も高まり、批判もでてきたのかなという気はする。
　母数が増えれば、いろいろ批判もでてくるのは当然かと思う。


　こうした背景のなか、実際に「駆け出しエンジニア」として転職した若い人たち数名と話す機会があり、駆け出しエンジニアの状況や考えを少しだけど、聞けたのでそれを記載したい。
　
　（前フリ長い！）

　ここまで書いてつかれたので、後半はまた別の投稿で。

---

# 筆者のバックグラウンド

- 2006年にソフトウェアの営業を退職し、独立してプログラマーとなる。
- 2006年当時は、現在(2020年）とは違いプログラミングスクールという簡易的な教育環境はなく、独学で書籍とネットをつかってプログラミングは学習。経験言語は最後に記載。

- 現在は一人法人として開発の要件定義、設計、テスト設計（支援）、製造、企画を請け負う。ソフトウェア会社の社外執行役員として人材面、技術面のコンサルを行う。



# 経験言語、案件

- 業務系のWeb開発では、Java、PHP、Ruby、Javascript(Typescript)、ASP(VBS）を経験。
- Webのフレームワークやアプリケーションサーバは、PHPはCodeigniter、Cake、FuelPHP、Laravel、RubyはRails（2-5）、PythonはFlask、JavaはJBoss、Weblogicでの開発。
- 工場などでPLC(programmable logic controller)との通信関連プログラムをJavaで経験。
- 社内業務システムでは、Access、ExcelのVBA、JavaのSwingによるアプリ開発、C言語によるメール配信システム、JavaによるProxyサーバ開発。DBは、Oracle、SQLServer、PostgreSQL、MySQL、SQLite、H2、Redisなどなど。
- 統計事業では、Python、R、C++（Rとの連携）、JMPScript、SPSSスクリプト、Java、Excel/Word/PowerPointのVBA。
- 自社内の開発では、go、Nim、Pythonで社内ユーティリティを作成。
- 開発現場は、フリーランス/一人法人として持ち帰り案件、ベンチャー、中小企業、大企業（大手グローバル企業等）を経験。
- 2020年現在は、ElixirとNimによるシステム開発を開始。
Automation Anywhere Enterprise Control Room サービス起動順番メモ

環境: v11.3.4
Control Roomのインストーラが最後にサービスを起動するときの順番スクリーンショットメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/13788771-4273-6db8-6bc4-b3ba0b318423.png)
GitHub Pagesで「404エラー」時に確認すべき7つのこと

# 404エラーでサイトが表示できない

GitHub Pagesはユーザーに提供している静的Webサイトのためのウェブホスティングサービスです。無料で、かつ簡単に静的Webサイトをインターネット上で公開することができます。

■公開手順
1. GitHubでPublicのリポジトリを作成
2. リポジトリをローカルにクローン
3. クローンしてきたリポジトリをローカル上で静的Webサイトを構築
4. 構築した静的Webサイトをプッシュ
5. SettingsのSourseの「None」を「master branch」に変更
6. https://{ユーザー名}.github.io/{リポジトリ名}/で公開した静的Webサイトにアクセス

今回はこの6でなぜか404エラーが出て静的Webサイトが表示されませんでした。
![404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/5ebad8fd-6e55-5c83-4416-af160807b648.png)

## 確認すべき7つのこと

■確認事項
1. index.htmlを配置しているか
2. プッシュしてから5分以上経っているか
3. index.htmlを再コミットして再プッシュしたか
4. アクセスしているURLは間違えていないか
5. ソースリポジトリは1GBを超えていないか
6. 月当たり100GBのソフトな帯域幅制限を超えていないか
7. 時間当たり10ビルドのソフトな制限を超えていないか

1.の説明
GitHub pagesはデフォルトでリポジトリ直下のindex.htmlを見に行くため、index.htmlが見つからないと404エラーを返します。

2.の説明
プッシュしてから数分間は反映されない場合があるそうです。

3.の説明
理由はよくわからないのですが、index.htmlを編集して再コミット・再プッシュで解決される場合があります。この時はコードに修正を加える必要がなく、行を削除したり、行を追加したりするだけで大丈夫です。

4.の説明
ホスト名は合っていて、パスを間違えるとGitHubが用意してくれた404エラーが返ってきます。

5.6.7.の説明
6. 静的Webサイトなので5. 6. 7.の制限を超えることはほとんどないと思いますが、容量の大きい動画ファイルを大量にアップしていると制限に引っかかる可能性があります。

ちなみに私の場合は、3.で静的Webサイトを表示させることができました。
<img width="1312" alt="スクリーンショット 2020-04-18 20.00.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/48d86eaa-b0b9-72e6-060a-a03fbf550228.png">

GitHub Pagesのファイル等をどこに配置してよいかわからない方は私の[リポジトリ](https://github.com/yuuta1988/shussekikun-design)を参考にしてみてください。

## 参考

- [公式サイト](https://help.github.com/ja/github/working-with-github-pages/about-github-pages)
- [【初心者向け】Github pagesでwebページを公開する方法](https://qiita.com/sota_mikami/items/c6038cf13fd84b519a61)
- [GitHub Pagesの作り方（404が出てしまい挫折した人向け）](https://qiita.com/KOJI-YAMAMOTO/items/38578a3f4c822a15ef49)
家に帰ったら、玄関のライトを自動に付けたい

## 背景

東京のある団地に住んでいる私、通勤の日々中で、ふと思い出しました。

前に住んだマンションは、玄関に人感知ライトがついていました。

ほ、ほしい

## 揃ったもの

* SwitchBot: [Amazon Link](https://www.amazon.co.jp/SwitchBot-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC%E6%A9%9F%E8%83%BD%E6%90%AD%E8%BC%89-%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E5%AE%B6%E9%9B%BB%E3%81%AE%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AB%E9%81%A9%E7%94%A8-IFTTT%E3%81%AA%E3%81%A9%E3%81%AB%E5%AF%BE%E5%BF%9C%E5%8F%AF%E8%83%BD%EF%BC%88%E7%99%BD%EF%BC%89/dp/B07B7NXV4R/)
* RaspberryPi 3
* Nature Remo
* Google Cloud Platform Account
* LINE Developer Account
* IFTTT Account


## 全体像
![smart_timleafs_home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562445/946f823c-94f1-2355-cb4c-883f5f3a5171.png)


## 説明

### IFTTT
スマホに IFTTT のアプリを入れます。
「あるエリアに入ったら、Web Request (Post) を Cloud Functions に送信する」と設定します。
<img width="375" alt="IMG_5684.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562445/7fd61149-da37-d7bd-bce1-bec598a29184.png">


### Cloud Funcitons
Web Request (Post) をゲットしたら、
Cloud Pub/Sub にメッセージを publish します。
一方、「You have entered the area.」と LINE に送信します。


### Raspberry Pi 
Cloud Pub/Sub の Subscriber として、publish したメッセージを受信したら、
Nature Remo API から部屋の照度を取得し、
一定値以下の場合は、SwitchBotを起動し、ライトを付けることができました。
実行した結果も LINE に送信します。 

<img width="375" alt="IMG_5685.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562445/47ddc03a-2c0d-8399-02ea-aff834fc8b02.png">


## 参考したリンク集

* [Cloud Pub/Sub: メッセージのパブリッシュ](https://cloud.google.com/pubsub/docs/publisher)
 Cloud Functions での Python プログラムの実装に参考しました。

* [Cloud Pub/Sub: pull を使用したメッセージの受信](https://cloud.google.com/pubsub/docs/pull#asynchronous-pull)
 Raspberry Pi での Python プログラムの実装に参考しました。
 
* [Nature Remo Cloud API](https://developer.nature.global/)
 Nature Remo API 仕様、及びアクセストークンの発行に参考しました。
 
* [GitHub - OpenWonderLabs/python-host](https://github.com/OpenWonderLabs/python-host)
 Raspberry Pi からSwitchBotを操作するに参考しました。
 
* [Linux の任意のスクリプトをサービス登録し OS 起動時に自動起動させる [init.d/SystemD 編]](https://qiita.com/KEINOS/items/f3e6b3064b0cbe35fd03#systemd-%E3%81%A7%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E4%BB%BB%E6%84%8F%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
 Raspberry Pi でのプログラムをサービス登録した時に参考しました。

* [GAEでLINE Message API(line-bot-sdk-python)を試してみた](https://qiita.com/mochan_tk/items/db3fd4e4867dd3fb6540)
 GAE は使ってないですが、Message API の利用に参考しました。

## 雑談

ここにソースなどは書いてない理由ですが、
まず、私と同じ轍を踏む人がいないと思いました。
人感知電球って、Amazon で SwitchBot より安く買えますし（同僚に突っ込まれましたｗ）、
GCPの代わりに、他のクラウドサービスもあります。
また、参考したリンク先のソースに少し修正を加えたら、動けます。

Raspberry Pi で何がを実現するのは私の長年の宿題ですが、
進めるのが遅いのは課題です。
この記事は温かい目で見ていただけると幸いです。
これからもこれらのデバイスを眠らせないように、活用していきたいと思います。
Pythonで定期的にクリックイベントを発生させ、テレワーク中仕事以外のことをしよう！

#はじめに

昨今、コロナウイルスの影響で全世界的にテレワークが行われていると思います。
さらに、多くの企業がSkype for Businessなどを導入しており、プレゼンス状態が共有されている状況だと思います。

その中でプレゼンス状態を適正に保ちながら、別のことをするためのPythonコードを作成しました。

#できること
５分に一回、デスクトップ座標(1,1)をクリックする。

#ソースコード
```click.py
import pyautogui
import datetime
import schedule
import time
import random
import os

os.environ["OMP_NUM_THREADS"] = "1"

def job():
	dt_now = datetime.datetime.now()
	print(dt_now)
	pyautogui.click(1,1,1,1,'left')
	print("click!!")
	
schedule.every(5).minutes.do(job)
while True:
    schedule.run_pending()
```
【Unity】取得してないのにコード中唐突にでてくるgameObject、transform、tagを解説

#環境
Unity 2019.3.7f1

#はじめに
ネットでやりたい処理内容を探していると

**・gameObject**
**・transform**
**・tag**

こいつら唐突にでてきませんか？
あれ？いつ取得したの？とりあえず動くからいいか・・・

でもなんかもやもや。。。

今回はそんなもやもやを解決します！

#結論
ゲームオブジェクトにスクリプトをアタッチすると、
そのスクリプトはアタッチされたゲームオブジェクトの

**・ゲームオブジェクトクラス
・トランスフォームクラス
・タグ**

の情報を勝手に取得します。
そして、その呼び出し呪文が


**・gameObject**
**・transform**
**・tag**

なわけです。

なので、
**スクリプトをアタッチしたゲームオブジェクトのみ、
ゲットコンポーネント不要でゲームオブジェクトの情報やトランスフォームの情報を操作できるのです！**


具体例をみていきましょう。

#具体例
それぞれの値の中身を見てみましょう。

まず、空のオブジェクトを作成します。
(名前はobject123に変更してみました)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/de564d62-6b96-063b-a09b-16ced06b21d4.png)

　
スクリプトを作成し、先程のオブジェクトにアタッチします。
(名前はtestにしました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/8798751c-de17-aa38-1313-69ce932d2865.png)
　
コードはこちら

```CSharp:test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{    
    void Start()
    {
        Debug.Log("gameObject="+gameObject);
        Debug.Log("transform="+transform);
        Debug.Log("tag="+tag);              
    }
}
```
　
**実行結果**
コンポーネントを取得してないのにそれぞれの情報が入っていることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/ffe5e2f9-181b-ab92-7de5-95ba9eaeb024.png)

###実際に使ってみる
では、実際にこれらの情報を使って処理してみましょう。

**処理したい内容**
・gameObjectを使ってオブジェクトの名前を変える
・transformを使ってオブジェクトの位置を変える
・tagを使ってタグの名前を変える

```CSharp:test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{   
    void Start()
    {        
        gameObject.name = "123";//このスクリプトがアタッチされたオブジェクトの名前を変更
        transform.Translate(1, 2, 3);//このスクリプトがアタッチされたオブジェクトの位置を変更
        tag = "Player";//このスクリプトがアタッチされたオブジェクトのタグ名を変更　タグはあらかじめ用意しておく必要有り
    }
}
```
　
**実行結果**
オブジェクト名、タグ名、オブジェクト位置が変更できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/687dfb6b-cc0e-773b-08ff-223dcb0811dd.png)



#おわりに
今回紹介した呪文たちをみたら、
スクリプトがアタッチされたオブジェクトについて
なにかしらの処理をしてるんだなーと考えると良いと思います。

良いUnityライフを！
VueでIonicons利用時に"Unknown custom element"エラーが出る場合の対処法

Vueの開発バージョンで[Ionicons](https://ionicons.com/)を利用すると、コンソールに下記のような`Unknown custom element`のエラーが表示されます。

>[Vue warn]: Unknown custom element: &lt;ion-icon&gt; - did you register the component correctly? For recursive components, make sure to provide the "name" option.
>
>(found in &lt;Root&gt;)

[`compilerOptions.isCustomElement`](https://v3.ja.vuejs.org/api/application-config.html#compileroptions-iscustomelement)でカスタム要素であることを認識させると解決します。

```javascript
const app = createApp({});
app.config.compilerOptions.isCustomElement = tag => tag.startsWith('ion-');
app.mount('#app');
```

## Vue2での方法

`ignoredElements`に`ion-icon`を設定することでVueがIoniconに対してエラーを出さないようにできます。

```javascript
Vue.config.ignoredElements = ['ion-icon'];

new Vue({
...
```

## 参考文献
- [compilerOptions.isCustomElement - Vue.js](https://v3.ja.vuejs.org/api/application-config.html#compileroptions-iscustomelement)
- [config.ignoredElements は config.compilerOptions.isCustomElement に変更 - Vue.js](https://v3.ja.vuejs.org/guide/migration/global-api.html#config-ignoredelements-%E3%81%AF-config-compileroptions-iscustomelement-%E3%81%AB%E5%A4%89%E6%9B%B4)
- [Ionicons in Vue.js](https://www.raymondcamden.com/2020/02/17/ionicons-in-vue)
コード不要機械学習-rapidminer-触ってみた話


コードなしで機械学習できるautoMLの一つ
rapidminerを触ってみたのでその備忘録とイントロ紹介

[rapidminer](https://my.rapidminer.com/nexus/account/index.html#downloads)


#登録後

ユーザー登録を行って最初の画面は以下のような感じ

![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/945b1e37-9b40-555e-9852-61b5cbaae898.png)


データは左のrepositoryから選択やimportできる。
今回はdataフォルダの中からzip codesというデータセットを使って機械学習を試してみることにする。


![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/acaa99fc-6a59-acf8-839a-539b0d79e40c.png)


選んでみるとデータの内容一覧を観覧できる。
量的なのか質的なのか、欠損地の有無が表示される。

この場で特徴量の生成や変換ができて、基本的な機能は左の選択項目に乗っている。

![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/0aebf0db-e5d6-19a7-0974-399be2170b30.png)

たとえば列を指定してdummy encodingをせんたくすると

![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/6e07bbb3-1289-74bd-42e0-e912a5f0782f.png)


5列目からダミー化されている。

![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/1d3726c9-2977-15e3-1eb8-072337f9b086.png)


欠損地があれば変数の名前部分に赤色の警告がでているので、欠損地補間もしてみる。
欠損地を含んでいる列を選択して、


![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/cd5b2845-6ce7-a0da-b1ab-00e2b6eb5a39.png)

高頻度の項目名で補填するか、平均値にするか？などを選択できる。
特徴量をいじり終わったら上タブから「auto model」を選択する。
すると、被説明変数をどれにするか？予測か？クラスタリングか？などを選択できるようになる。



![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/7d2b8d5c-d40e-987e-487f-42b7abf6f89c.png)

今回はpredictとして数値予測をしてもらう。
モデルの選択としていくつかの候補が出てくる。
今回は決定木やGBDT、ディープラーニング、が選択できる。

![09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/70fbdde3-d2e0-acaf-b565-f2cff3b873db.png)

予測に使うモデルを選択し終え、runで学習させる。
学習し終わると、モデルの精度などが比較できるような画面がでてくる。


![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/e34ed75b-cc27-85d3-1206-dbc9d0294936.png)

学習後のモデルを選択してみると、決定木モデルならば決定木が可視化できる。

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/d6ca1dc9-1050-51aa-d82e-d2f1db66fd36.png)

さらに、GBDTだと学習過程で出来ている決定木がすべて確認できたりするのがすごい。
この画像だと150本の木を確認できる。

![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/8014eaba-75df-135b-85ec-0c1c47ed71bb.png)



もちろんグリッドサーチの結果も表示してくれる。


![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/59f40118-6608-0a36-eea7-609ea2bcef28.png)



作ったモデルを実運用していったらdeployボタンで実用できるようになるそうだけど・・・
無料版なのでここまで。


#おわり

はやくpythonコーディングから解放されたいんじゃ～
【Swift】条件分岐まとめ

# はじめに

最初は「条件分岐ってif文のことでしょ？」となめていたら、意外と色んな種類があり、「コード上ではよくみるけど、そういう意味、目的だったのか！」ていうのもあったので、今回はswiftの条件分岐についてまとめていこうと思います！

## 条件分岐の種類

- if文
- guard文
- switch文
- 三項条件演算子
- Nil Coalescing演算子

# if文
これは条件分岐の基本中の基本ですね！

```Swift

if 条件式{
  処理
}else{
  処理
}
```

Swiftの場合はオプショナル変数をアンラップするために**nilチェック**をよく行います。

```Swift
//if文のnilチェック
var str: String!
if let str: String = str {
    //出力されない
    print(str)
}

var str2 = "Hello, World! "
if let str2:String = str2{
    //出力される
    print(str2)
}
```

>**if文のPoint!**
Nilチェック、アンラップにif文もよく使われる

# guard文

guard文は、エラーであれば早々に処理を行わないようにする「**早期リターン**」として使われます！


```Swift
//guard文

func printNumber(_ num:Int){
    guard num>0 else {
        return
    }
    print(num)
}

printNumber(-1)
printNumber(0)
printNumber(5)
```

>**guard文のPoint！**
・早期リターンでNilチェックとアンラップを同時に行える！
・elseとセット
・return か　throwを必ず使用しなければならない
・guard文で定義した変数はguard文を抜けた後でも使用可能


```text:出力
5
```

# switch文
switch文はif文と異なり、全ての条件を網羅する必要があります。


```swift
var str = ""
//print(str)！

let test = "a"

//ノーマル
//break するためにbreakを書く必要がない
switch test {
case "a":
    print("正解！")
default:
    print("やったね！")
}

//出力「正解！」

//Fallthrough
switch test {
case "a":
    str += "case1:"
    fallthrough
default:
    str += "fallthroughしました！"
    print(str)
}

//出力「case1:fallthroughしました！」

// MARK: - 様々な型に対応してる

//例１：double型
let double = 2.5
switch double {
case 0..<5:
    print("Double型の例")
default:
    print("default")
}

//出力「Double型の例」

//例２：enum
enum Study {
    case A, B, C
}
//呼び出しかた
var math: Study
math = Study.A
math = .B  //型が分かっている場合はenum名は省略できる
switch math{
case .A:
    print("Aだよ")
case .B:
    print("Bだよ")
case .C:
    print("Cだよ")
}

//出力「Bだよ」

```

# 三項条件演算子

条件分岐と似た手法です！

書き方
`条件式 ? trueの場合 : falseの場合`

```swift

//三項条件演算子
var testBool:Bool = true
var result1 = testBool ? "trueだよ" : "falseだよ"
print(result1)

//出力
trueだよ
```

# Nil Coalescing演算子
「??」を使うことにより、nilかどうかをチェックすることができます！
nilだった場合は、helloに"Nil Coalescing"が代入されます！


```swift
// Nil Coalescing演算子
let nilStr:String? = nil
let hello: String = nilStr ?? "Nil Coalescing"
print(hello)

//出力
Nil Coalescing

```
[Unity初級]２Dオブジェクトを消したり表示したり

#概要
複数の敵キャラがいて、プレイヤーにぶつかるとGAMEOVERが表示されます。
GAMEOVER文字は①ゲーム開始時に見えなくする②ぶつかったタイミングで表示。
![スクリーンショット (103).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/359f018f-f3dc-1da2-fcf2-0af4b6f565d5.png)

#方法１

```cs
    public string gameOverText;//GAMEOVER表示オブジェクトの名前を取得
    void Start()
    {
        gameOverObject = GameObject.Find(gameOverText);
        gameOverObject.SetActive(false);
    }
    void OnCollisionEnter2D(Collision2D collision) {
        //if (collision.gameObject.name == targetObjectName){
            gameOverObject.SetActive(true);
        //}
    }
```
これはInspectorのチェックを外して表示させないようにするのと同じことをスクリプトでやっています。

![スクリーンショット_(104).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f0f4f768-5bd4-a385-b541-b7012002422e.png)

SetActive(false)を実行すると表示を消せますが、そのオブジェクトへの操作も出来なくなります。消すときにオブジェクトを変数に入れておけばそれを使って操作（再表示）することもできるのですが
①1体目の敵キャラがGAMEOVER表示を消す（変数をもっているので再表示できる）
②2体目がGAMEOVER表示を消そうとしてもすでに消えているから操作できない（操作するための変数も手に入らない）
こんな風になってうまくいきませんでした。

#方法２

```cs
    public string gameOverText;//GAMEOVER表示オブジェクトの名前を取得
    private SpriteRenderer spRenderer;
    void Start()
    {
        gameOverObject = GameObject.Find(gameOverText);
        spRenderer = gameOverObject.GetComponent<SpriteRenderer>();
        spRenderer.color = new Color(1, 1, 1, 0f);
    }
    void OnCollisionEnter2D(Collision2D collision) {
        //if (collision.gameObject.name == targetObjectName){
            spRenderer.color = new Color(1, 1, 1, 1f);
        //}
    }
```

アルファで透過表示を操作したらうまくいきました。

#補足

```CS
        Destroy(gameOverObject); 
```
Destroyでも表示を消せますが、破壊なので元に戻すこと（再表示）ができません。

```CS
        gameOverObject.GetComponent<MeshRenderer>().enabled = false; 
```
MeshRendererは３Dオブジェクト用なので２Dオブジェクトでは使えないです。
mvp.css

https://andybrewer.github.io/mvp/

```html
<link rel="stylesheet" type="text/css" href="mvp.css">

<button> aaa </button>

<table>
<tr>
<th>
ama
</th>
<td>
ama
</td>
</tr>
</table>

<a href="aa">aa</a>
```

```html:改行を削除する君
<link rel="stylesheet" type="text/css" href="https://andybrewer.github.io/mvp/mvp.css">
<style>
textarea {
        height: 70%;
        width: 40%;
        display:inline-block;
}
</style>

<div>
<textarea class="text" id="text" onKeyDown="convert();"></textarea>
<textarea class="result" id="result" readonly onClick="this.select();"></textarea>
</div>

<div>
<button onClick="clear();">clear</button>
</div>

<script>
function convert() {
        var text = document.getElementById("text").value;
        text = text.replace(/\r?\n/g, "");
        text = text.replace(/\./g, ".\n\n");
        text = text.replace(/,/g, " ");
        document.getElementById("result").value = text;
}

function clear() {
        document.getElementById("text").value = "";
}
</script>
```
Gridagramを使ってみた。

[おうちモニター](https://qiita.com/yamori813/items/776ce00bedb558450490)にパネルのような表示がしたくていろいろ調べてみました。

まずダッシュボードという仕組みがあるようで、いろいろ調べてみましたが、結構規模が大きかったり、nodejsを使ったりでリソースの少ないモジュールで動かすのは無理そうでした。ダッシュボードの主な利用方法は管理系のページになるようです。ダッシュボード系のライブラリはチャートの機能を持ったものが多く、独自で処理しているものやchart.jsを組み込んだものなどありました。

この手の調べ物には画像検索が有効な方法です。

次にドラッグできるグリッド系のライブラリを調べてみたのですが、使い方がわからなかったりで、これも諦めました。

そうしているうちに単純なグリッド系のGridagramというライブラリを見つけて試してみました。

https://github.com/julianbrowne/gridagram

GridagramはjQueryのpluginでそれほど大きなコードではありません。

cssはexamples.cssをほぼそのまま使って

```HTML
        <link rel="stylesheet" media="all" href="gridagram.css" />
        <script src="js/jquery.gridagram.js"></script>
```

をHEADに追加して

```HTML
                <div id="grid-container"></div>
                <div id="source-container"></div>
```

をBODYに追加して

```javascript
function topcont() {
  $('#grid-container').show();
  $('#source-container').show();
  var data = [
    { a: "IP Address", b: { c: "10.0.1.1" } },
    { a: "UPTime", b: { c: "10000 sec" } },
  ];

  $("#grid-container").gridagram(data, {
    titleField: "a",
    bodyField: function(e) { return e.b.c; }
  });
}
```

で書けました。

![スクリーンショット 2020-04-19 8.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/30b7755d-30df-a7e0-d409-552737ec741e.png)

グラフを表示するときには、以下のようにしてjQueryのメソッドで消します。

```javascript
function pre() {
  $('#grid-container').hide();
  $('#source-container').hide();
}
```

![スクリーンショット 2020-04-19 8.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/88012ecf-8e9e-db23-6579-d915672c1618.png)

レスポンシブではないようですが、使い方によっては十分な気がします。

ルーターのグローバルアドレスなどを表示するのが目的で調べていたですが、これをするためにshスクリプトのcgiでjsonを作るようにします。

```sh:cgi/top.cgi
#!/bin/sh
#[{ "a": "IP Address", "b": { "c": "10.0.1.1" } }]

GIP=`bsnmpwalk -s 10.0.1.1 1.3.6.1.2.1.4.20.1.1 | awk '!/ 10\./&&!/ 127\./{print $3}'`

UPDAYS=`bsnmpwalk -s 10.0.1.1 .1.3.6.1.2.1.1.3 | awk '{upsec=$3/100;days=int(upsec/(3600*24));print days}'`

echo "Content-Type: text/json"
echo ""

echo "[{ \"a\": \"IP Address\", \"b\": { \"c\": \""${GIP}"\" } },{ \"a\": \"FW UpTime\", \"b\": { \"c\": \""${UPDAYS}" days\" } }]"
```

これを読んで表示します。

```javascript
function topcont() {
  $('#grid-container').show();
  $('#source-container').show();
  $.getJSON("cgi/top.cgi" , function(data) {
    $("#grid-container").gridagram(data, {
      titleField: "a",
      bodyField: function(e) { return e.b.c; }
    });
  });
}
```

できました。

UPDAYSはbcnmpdの起動時間で、システムの起動時間ではありません。
Forge Modding 1.12.2 Part1 -Baseクラス

#Forge Modding Part1
(Forge Projectのセットアップの説明は他を当たってください)

##Object
Objectパッケージを作り、その中に

・ItemBase.java
・BlockBase.java

を作成。
その中に、Implmentsパッケージを作成。
そこに、
・IHasModel.javaを作成。

### ItemBase
```Java
String name;
    public BlockBase(String name, Material material, CreativeTabs tabs,float blockHardness) {
        super(material);
        setTranslationKey(name);
        setRegistryName(Refarence.MOD_ID,name);
        setCreativeTab(tabs);
        setHardness(blockHardness);
        setResistance(1.0F);
        this.name=name;

        Blockinit.BLOCKS.add(this);
        Iteminit.Items.add(new ItemBlock(this).setRegistryName(Refarence.MOD_ID,name));
    }

    @Override
    public void registerModels(){
        System.out.println("ModelRegistered");
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(new ResourceLocation(Refarence.MOD_ID,name) ,"inventory"));
    }
```

### BlockBase
```Java
public ItemBase(String name,CreativeTabs tabs){
        setTranslationKey(name);
        setRegistryName(Refarence.MOD_ID,name);
        setCreativeTab(tabs);
        Iteminit.Items.add(this);
    }


    @Override
    public void registerModels() {
        nobamod.Proxy.registerItemRenderer(this,0,"inventory");
    }
```

### IHasModel
```Java
public interface IHasModel {
    public void registerModels();
}
```

##

こんな感じになります。

次回:実際にアイテム追加してみる
Python の 2to3 で一気に変換メモ

## Windows 10 で python の変換ツール 2to3.exe を動かしてみました。

```dos:2to3.bat
@echo off
set PATH=%Python3のパス%\Scripts;%PATH%
set CNV=2to3.exe
set OPT=-w
set LOG=.\2to3.log

for /r ".\" %%A in (*.py) do %CNV% %OPT% %%A
```
を変換対象のフォルダに配置し、```2to3.bat > 2to3.log 2>&1```で実行します。

変換前のファイルは、*.py.bak で保存されていました。

今回は、ここまでです。
golangでgoroutineに無名関数を使う

goroutineを使う際に無名関数を使う方がwaitするのが簡単とのことで
備忘録

```main.go

var wg sync.WaitGroup
wg.Add(1)
go func() {
   defer wg.Done()
   //回したい関数
}()
wg.Wait()

```

回したい関数に&wgを渡すという記事を最初に読み、そうしていたけど
こっちのが簡単だった。（その後調べたらこの書き方の記事のがやはり多かった）
いまさらNginxでDoS攻撃対策してみる（３つの対応してみた）

# NginxでDoS攻撃対策してみる
テレワーク中、自宅サーバのアクセスログを眺めているとDoS攻撃が頻繁にあり、しかもかなりしつこい輩でしたので対応してみました（いままで対応してなかったのも問題ですが汗）
とりあえず３つほど対応してみました。相変わらずシツコク攻撃してくるけどまあ自分なりに納得してますｗ

・[DoS攻撃・DDoS攻撃とは？攻撃の目的や種類、事例、対策方法を解説](https://cybersecurity-jp.com/security-measures/18262#DoS)

# 前提
我が家は、Apache -> Nginx として Nginxを [リバースプロキシサーバー](https://qiita.com/murachi1208/items/d04797b0b61e69018938) としています。そのため Nginx 側でいくつかの攻撃を防いでみることを前提としてみています。

# その１：NginxでIPアドレス制限かけてみる（ブラックリスト形式）
ログから攻撃者のIPが判る場合、手っ取り早くIPを弾いてみます。下記の様に攻撃者IPをブラックリスト形式で登録してみます。

```config
server {
・
・
    location / {
        deny 118.107.46.156;　　※IP指定
        deny 193.38.54.0/24;　　※範囲指定
        allow all;
} 
```

該当のIPであれば「403 Forbidden」を返却します。

# その２：NginxでIPアドレス制限かけてみる（ブラックリスト形式）
上記と同じような感じですが、ブラックリストとして別ファイルに攻撃者IPを記述する方法。レスポンスコードを指定することができるので後から集計するときに便利と思われます。

```config
geo $access_filter {
    default OK;
    include /etc/nginx/conf.d/ip_deny_list.txt;
}

server {
・
・
    # black list
    if ($access_filter = "NG") {
        return 444;
    }
} 
```

```/etc/nginx/conf.d/ip_deny_list.txt
193.38.54.237 NG;
162.241.217.141 NG;
```

該当のIPであれば「444 [Nginx独自のステータスコード](https://github.com/yuuki/yuuki/blob/master/misc/nginx-status-444.md)」を返却します。

# その２の1：NginxでIPアドレス制限かけてみる（ブラックリスト形式-国指定）
とりあえず静になったかな？と思ったら某国から大量のアタック！！うっさいですよね、かまってちゃん・・・

国別のIPアドレスをまとめている http://nami.jp/ipv4bycc/ サイトさんから `cidr.txt.gz` をダウンロードして上記の `/etc/nginx/conf.d/ip_deny_list.txt` に追加する手順を実施してみます。

```text
$ wget http://nami.jp/ipv4bycc/cidr.txt.gz
$ gunzip cidr.txt.gz
$ sudo sed -E 's/^(CN|KR|DE|GB|BR|FR|CA|AU|IT|NL|RU|IN)\t(.*)/\2 NG;/g' cidr.txt | grep 'NG;' >> /etc/nginx/conf.d/ip_deny_list.txt
$ systemctl restart nginx.service
```

とりあえずこれで多少はマシになるハズ。

・[世界の国別 IPv4 アドレス割り当てリスト](http://nami.jp/ipv4bycc/)
・[Nginxで一部海外IPからのアクセスを遮断する](https://programming-beginner-zeroichi.jp/articles/125)

# その３：過度アクセスする輩の対策をしてみる
秒あたり数百リクエストしてくる攻撃者には `limit_req` こちらがよさげ。
`limit_req` を使用すると単位時間あたりにリクエスト数に制限をかけることができるらしい。

以下定義としてみます。
　① `limit_req_zone` にて「攻撃者の同IPからアクセスが秒間１回以上の制限する」定義をする。
　② `limit_req` で秒間５回までのリクエストを受け付ける。

```/etc/nginx/nginx.conf
http {

    # dos対策, レスポンス 444で返却
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_req_log_level error;
    limit_req_status 444;
}
```

```config
server {
    location / {
        # dos 秒あたり 5リクエストは受け付け、それ以外は破棄=444
        limit_req zone=one burst=5 nodelay;
    }
} 
```

# おわり
攻撃者か否かの判定をステータスコードで判別できる点がいいなと思いました。
弱小サイトだけどこれだけしているだけでも、だいぶ違うと思いましまね。

# 参考サイト
・[nginxでIPアドレス制限](http://shim0mura.hatenadiary.jp/entry/20130610/1370837544)
・[[Nginx] メンテナンス状態に設定する](https://hacknote.jp/archives/32728/)
・[nginxでIPフィルタを設定した上で無許可IPにはステータスコードを返さない](https://www.denet.ad.jp/technology/2018/09/nginxipfilter.html)
・[過度のアクセスに備える（その２）！！Nginxのlimit_reqの設定と検証](https://remotestance.com/blog/2474/)
RでNAを含む列を簡単に削除したい

データ処理の前段階はデータを読み込むところから。ここで、手持ちのデータを読み込むと、しばしば空の列ができたり長さが揃っておらず不要な列ができて削除したいことがあります。次の表を読み込んだとします。

| a    | b    | c    | d    |
| ---- | ---- | ---- | ---- |
| 1    | 2    | 3    | NA   |
| 2    | 3    | 4    | NA   |
| 3    | 4    | NA   | NA   |

```{r}
df <- data.frame(a = c(1,2,3),
                 b = c(2,3,4),
                 c = c(3,4,NA),
                 d = c(NA,NA,NA))
```

```
> df
  a b  c  d
1 1 2  3 NA
2 2 3  4 NA
3 3 4 NA NA
```



## dplyr::select_ifを活用する

```{r}
library(dplyr)
```

NAが含まれるかどうか調べる`anyNA()`を列ごとに適用し、返り値を論理ベクトルにして反転させる。

```{r}
df %>% lapply(.,anyNA) %>% unlist %>% !.
```

```
    a     b     c     d 
 TRUE  TRUE FALSE FALSE 
```

これを、条件に合う列を選択する関数`select_if()`に渡す。

```{r}
df %>% select_if(lapply(.,anyNA) %>% unlist %>% !.)
```
```
  a b
1 1 2
2 2 3
3 3 4
```

何とか1行のスクリプトで不要な列を削除できました。パイプのおかげで可読性もそんなに悪くないかと思います。

## 追記：purrr::negate()を活用する

@hkzm さんからのコメント参考になりました。

与えた関数の否定を渡す`purrr::negate()`を使うとよりストレートに、シンプルに記述できました。

```{r}
library(tidyverse)
df %>% select_if(negate(anyNA))
```

```
  a b
1 1 2
2 2 3
3 3 4
```

演算子`!`で反転させ、`~`でformulaにするのと同等です。

```{r}
df %>% select_if(~ !anyNA(.))
```
```
  a b
1 1 2
2 2 3
3 3 4
```

可読性が良いのは`purrr::negate()`を使う方かと個人的には思いました。

## Pythonだと簡単なのに、Rだとなぜか苦労する

Pythonのpandasの場合、欠損値を削除するメソッド`dropna()`が用意されており、行方向と列方向の両方に適用可能です。

参考：[pandasで欠損値NaNを除外（削除）・置換（穴埋め）・抽出](https://note.nkmk.me/python-pandas-nan-dropna-fillna/)

- NAを1つでも含む列の削除
  - `dropna(how='any', axis=1)`
- 全てNAの列の削除
  - `dropna(how='all', axis=1)`

ところが、Rだと欠損値を削除する関数は行方向のみです。

- NAを1つでも含む行の削除
  - `na.omit()`

google検索かけて列方向で削除できる方法を探してなかなか見つかりませんでした。やっと見つけたのがこちらの記事。

[RでNAを含む列を削除する手段](https://qiita.com/pauze/items/1e37daa0deda1ca9d123)

プログラミング言語により、得意不得意があるのかもしれません。なぜRで似たような関数がないのでしょうかね。
Javascriptメモ

#Javascript メモ
Javascriptのオブジェクトについて自分用にメモします。

###オブジェクトの省略表記
オブジェクトは省略して作ることができます。

```javascript
const a = 1;
const b = 2;
const obj = {a, b}
console.log(obj) //{ a: 1, b: 2 }
```

###オブジェクトから変数の代入
オブジェクトから変数を作ることができます。

```javascript
const props = { numList: [1,2,3], children: "This is a child" };
const {numList, children} = props;
console.log(numList); // [1,2,3]
console.log(children); // "This is a child"
```
ただしキーと違う変数名で代入するとundefinedになります。

```javascript
const {a, b} = props;
console.log(a); // undefined
console.log(b); // undefined
```

###オブジェクトを展開する
オブジェクトの前に...と表記することで中身を展開できます。

```javascript
const object = { a: 1, b:2 };
console.log({...object}); // {a: 1, b: 2}
```
{}で囲わないとエラーになります。

```javascript
console.log(...object); // Uncaught TypeError: Found non-callable @@iterator at <anonymous>
```

###値を更新する
{}の中でオブジェクトを展開してさらにそこにキーバリューペアを追加できます。
同じキーがあると後に追加された値で更新されます。

```javascript
const object = { a: 1, b:2 };
console.log({...object, a: 5}); // { a: 5, b: 2 }
console.log({ a: 5, ...object }); // { a: 1, b: 2 }
```

###変数名がキーになる
変数に入れたオブジェクトをさらに{}で囲むと変数名がそのままキーになります。

```javascript
const object = { a: 1, b:2 };
const object2 = {object};
console.log(object2); // {object: { a:1, b:2 }
console.log(object2.object); // {a: 1, b: 2}
console.log(object2.object.a); // 1
```

###変数をオブジェクトのキーにしたい時は[]で囲む
変数をオブジェクトのキーに指定したいときは[]で囲みます。

```javascript
const num = 2;
const object = {1: "a", [num]: "b"}
console.log(object); // {1: "a", 2: "b"}
```

以上です。
【AWS】VPC、サブネット作成のメモ書き、参考サイトやVPCのネットワーク作成

　AWSでVPC、サブネットを試しながら作った時に参考にしたサイトのメモ書きです。

##参考にしたサイト

[【AWS】EC2でWebサーバの構築 – VPC作成 -【Nginx】](https://swallow-incubate.com/archives/blog/20191108/)
・こちらを参考にして、VPC、サブネット、ルートテーブル、インターネットゲートウェイを順に作ってみた。
・削除する場合、反対にインターネットゲートウェイ、ルートテーブル、サブネット、VPCの順に削除した。
（*VPC内のEC2やセキュリティグループとか、ルートテーブルとサブネットの関連付けなどを解除しないと削除できないかも）

[動画で学ぶAWS講座 VPC編 【section1】 リージョン, アベイラビリティゾーン, サブネット](https://www.youtube.com/watch?v=aQpMBqn5mRY)
[動画で学ぶAWS講座 VPC編 【section2】 ルートテーブル, プライベートサブネット, パブリックサブネット](https://www.youtube.com/watch?v=lqsiWw-eDzQ)
・VPCについての基本を説明している動画

[Amazon VPC IPアドレス設計レシピ](https://dev.classmethod.jp/articles/vpc-cidr/)
・VPCのCIDRの設計の考え方の基本について説明している
[[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる（その1）](https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_1/)
・VPC、サブネット、インターネットゲートウェイ、ルートテーブルの作成についての説明。VPCのCIDRは/16、サブネットは/28。構成図を示しながらでわかりやすい、見やすい。



[AWSでWebサーバー構築！VPC設計に必要なIPアドレスとサブネットの基礎知識（第1回）](https://miyabi-lab.space/blog/8)
・VPCについてだけでなく、IPアドレスやマスクなどのネットワークの基本について説明している。


[【AWS VPC入門】0.概要](https://qiita.com/_Yasuun_/items/ae6b1b7fa3397256ee90)
・VPC、サブネットの作り方についての説明。VPCのCIDRは/16、サブネットは/26。

[VPC　料金を計算](https://aws-rough.cc/vpc/)
[[初心者]AWSを月数百円くらいの範囲で使っていると思ったら、2000円くらい請求された話](https://qiita.com/riekure/items/7b266ce291d780f1768b)
・２つともVPCの料金について。NAT Gatewayはちょっとそれなりにするらしい。。

##自分で試したこと

上のサイトを参考にしながら実際に、VPC、サブネット、ルートテーブル、サブネット、セキュリティグループ、EC2まで作ってみました。

その時のネットワーク構成は、
VPCのサイダーは、10.0.0.0/24
サブネットのサイダーは、10.0.0.0/26、10.0.0.64/26、10.0.0.128/26、10.0.0.192/26

*参考サイトのVPCのCIDRはどれも/16だったので、VPCのCIDRが/24、サブネットのCIDRが/26で試してみました。これだとサブネットは最大4つまでしか作れません。

####ec2作成時にパブリックIPv4アドレスの自動割り当てを有効にする

作成したサブネットのアクションから自動割り当てIP設定の変更で、パブリックIPv4アドレスの自動割り当てを有効にするにしておくと、ec2作成時の自動割り当てパブリックIPが「サブネット設定を使用（有効）」になり、パブリックIPが付与されるようになる。
サブネットでパブリックIPv4アドレスの自動割り当てを有効にしておかないと、ec2作成時の自動割り当てパブリックIPが「サブネット設定を使用（無効）」になり、パブリックIPは付与されない。ただ、自動割り当てパブリックIPを有効にしておけば、パブリックIPは付与される。

####ec2作成時にパブリックDNS(IPv4)が割り当てられるようにする

上で作成したVPCでec2を作成すると、パブリックDNS(IPv4)欄が空欄の状態だったので、これが割り当てられるようにしてみます。
（*ちなみにデフォルトVPCでec2を作成すると、最初から割り当てられています）

VPCの画面で作成したVPCを選択すると、下の説明タブのDNSホスト名が「無効」の状態になっています。
これを「有効」に変更するには、アクションボタンからDNSホスト名の編集を選択する。DNSホスト名の編集画面へ遷移するので、DNSホスト名の有効化にチェックを入れて保存します。
これで、ec2のパブリックDNS(IPv4)が割り当てられているはずです。

あと、パブリックDNS(IPv4)が割り当てても割り当てなくても、パブリックDNS(IPv4)でsshアクセスできたり、ec2でウェブサーバを起動したら、パブリックDNS(IPv4)でurlアクセスできますね。パブリックDNS(IPv4)を割り当てなくても、パブリックDNS(IPv4)は生きてるって事か。。

参考サイト
[【2020年最新】AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法](https://qiita.com/shota0701nemoto/items/89af575523eab915b002)
[AWSにおけるパブリックDNSという概念について](https://ja.stackoverflow.com/questions/37688/aws%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AFdns%E3%81%A8%E3%81%84%E3%81%86%E6%A6%82%E5%BF%B5%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
オブジェクトの値をJSONを使ってlocalstorageに保存する【超個人用】

【不明点あればコメントからご質問ください】

```set.js
        var firebaseConfig = {
            apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            authDomain: "xxxxxxxxxxxxxxx.firebaseapp.com",
            databaseURL: "https://xxxxxxxxxxx.firebaseio.com",
            projectId: "xxxxxxxxxxxxxxxxx",
            storageBucket: "xxxxxxxxxxxxxxxxxxx.com",
            messagingSenderId: "xxxxxxxxxxxxxxxx",
            appId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            measurementId: "xxxxxxxxxxxxxxxx"
        };

        temp = JSON.stringify(firebaseConfig);　//（１）JOSN形式に
        localStorage.setItem('firebaseConfig',temp);
```
     
```get.js     
        firebaseConfig1=localStorage.getItem('firebaseConfig')
        firebaseConfig2=JSON.parse(firebaseConfig1)　//（２）parse
        console.log(firebaseConfig2);
```
【Unity】スクリプトからのテキスト改行方法

#環境
Unity 2019.3.7f1

#はじめに
スクリプトからのテキストの改行方法について解説します。

↓テキスト変更についての詳細はこちら

https://qiita.com/Maru60014236/items/232047c1695a2c187c14

#方法
改行は\nで行う。
 \ はスラッシュではなく**バックスラッシュ**なので注意!

また、バックスラッシュはなぜか私のVisualStudioでは表示されません。(汗)
正しくバックスラッシュを打ち込んでも¥マークになってしまいます。
¥マークに変装しているバックスラッシュという感じです。

注意しないといけないのは最初から円マークを全角で打ち込んで半角にすると
それはただの¥マークなので改行になりません。(ややこしい)

→半角モードで打ち込んでいれば問題無いです。

#具体例
コード

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを使用するときに必要

public class test : MonoBehaviour
{

    [SerializeField] private Text a;//テキストをアタッチする

    //スタート関数
    void Start()
    {
        a.text = "おはよう\nございます。";//テキストの中身を変更
    }

}
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/2926f566-4fdf-c164-ea67-684cfc1417bc.png)

#おわりに
コード中にでてきた[SerializeField]が初見の方は、
こちらで解説を行っていますので、ついでにご覧いただければと思います。

https://qiita.com/Maru60014236/items/f550b07d49e199be771b