OmniAICreator/Qiita-1.07M huggingface dataset:
【Streamlit】インストールしてみた

## はじめに

Pythonのオンライン勉強会にて、Streamlitが紹介されていたので、
改めて自分で調べてメモ書きします。

Steamlitのインストール方法とデフォルトで含まれているサンプルアプリについて言及します。

## Streamlitとは

Streamlit社が開発した、
データ分析のプロダクトを開発するデータサイエンティストを助ける
Webアプリフレームワーク。

通常、複数の言語を使って実装する必要があります。

* データ分析処理をPythonで実装
* フロントエンドをHTML、CSS、JavaScriptで実装

Streamlitを利用すれば、Pythonでフロントエンドも実装することができます。

[Welcom to Streamlit - The fastest way to build and share data apps](https://www.streamlit.io/)

![スクリーンショット 2020-11-05 21.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546125/2167680c-551c-387e-5bdc-347a7c0cf45d.png)



## インストールしてみた

VS Codeのターミナルで、以下のコマンドを実行します。
（完了まで多少時間がかかります）

```　
 pip install streamlit
```

サンプルアプリを起動します。

```
 streamlit hello
```

すると、ローカルURLとネットワークURLが表示されます。

```
  Welcome to Streamlit. Check out our demo in your browser.

  Local URL: http://localhost:8501
  Network URL: http://xxx.xxx.xxx.xxx:8501

  Ready to create your own Python apps super quickly?
  Head over to https://docs.streamlit.io

  May you create awesome apps!
```

ブラウザを確認します。

![スクリーンショット 2020-11-05 21.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546125/cb99ef16-03bf-fde3-3e52-e924c8cbdad3.png)

「Choose a demo」から選択すると、インタラクティブなグラフが描画されました。
（執筆時は4つ選択できました）。
![スクリーンショット 2020-11-05 21.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546125/93b011e8-8ef5-831f-6881-a8a04409c4b2.png)

サンプルコードも表示されます。
![スクリーンショット 2020-11-05 21.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546125/b453755e-2497-1a14-26cb-d56738de031d.png)

## おわりに

今後の掘り下げのために備忘。

* UIの部品はAPIが公開されているため、公式ドキュメントを参考にすると良いとのこと。
[API reference - Streamlit 0.70.0 documentaion](https://docs.streamlit.io/en/stable/api.html)


* DataFrameの理解しておくと良いとのこと。
[DataFrame - Pythonオンライン学習サービス PyQ（パイキュー）](https://docs.pyq.jp/python/pydata/pandas/dataframe.html)
Unityで他のオブジェクトの変数を見たい



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 見せるのは簡単、見に行くのは大変

#やること
Unityで他のGameObjectのPublic変数を参照します。

### スクリプトその① Publicを発行する側

下記のスクリプトをCube等、適当なObjectにアタッチします。
Object名はPubTestとします。

```cpp:Script1
using UnityEngine;

public class Script1 : MonoBehaviour
{
    public int open_value = 123; //publicな変数を設定
}
```

### スクリプトその② Publicを見に行く側

下記のスクリプトをSphere等、適当なObjectにアタッチします。
Object名はRefTestとします。

```cpp:Script2
using UnityEngine;

public class Script2 : MonoBehaviour
{
    GameObject target1 = GameObject.Find("PubTest"); //スクリプト①のオブジェクトを見つける
    Script1 script = target1.GetComponent<Script1>(); //見つけたオブジェクトのスクリプトを指定
    Debug.Log(script.open_value);//そのスクリプトの中の変数を指定してログに表示
}
```


# 実行

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/c4505f8e-c9b4-9e2e-7834-5e6e9fcbfdba.png" width ="300">

こうなっていれば成功ですが、もう少し簡単な方法がありそうな気がします。

[前回記事]
UnityでSliderを使ってCubeを回したい
https://qiita.com/Ninagawa_Izumi/items/96f316d417d825cc1137
htmlとcssはそこまで深く勉強しなくて大丈夫

webデザインのホームページで必要なhtmlとcssは深堀りしなくて大丈夫です。
基本的な構造とどんな感じで書かれているかを知識として知っておくだけ。
もし、どうしてもホームページのことを勉強したいならデザイン方面のUI（ユーザーインターフェース）やUX（ユーザーエクリペンス）に力を入れた方がいい。
用語の意味が分からない方はこちらをご覧ください。
https://ferret-plus.com/655

理由は３つあります。

１．クライアントや消費者が求めていることは、使いやすさとデザイン性を求めているから。

２．肝の部分である、cssの部分がネットにひたすら落ちている。
https://www.free-css.com/

３．twitter社が開発したbootstrapがあり、簡単にデザインが可能である。
https://getbootstrap.jp/

本当に簡単に作れて、加工もしやすいので誰でも作れる時代がもうすぐそこです！

考えてみてください。
あなたは、限りある時間をここに使いますか！？
SQLをお試しすることが出来るWEBサービス

# MySQLをお試しする
https://paiza.io/ja/

[コード作成を試してみる]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/d6054070-e86c-2e0e-5533-600096478b1b.png)

開発言語の中から[MySQL]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/219261f0-0d27-e42e-b678-e7eb7e2b54ee.png)


# SQLiteをお試しする
https://wandbox.org/

言語から[SQL]とバージョンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/a2f8a197-7408-9bef-728d-c7e68d6b789b.png)

# サンプル
お試し用のサンプルとして以下の記事で紹介したSQLを掲載しておきます。
[SQLで特定の条件を満たすレコードを1件でも持つグループのレコードをすべて抽出する](https://qiita.com/takahasinaoki/items/c74e177577aa34b5520a)

```sql
CREATE TABLE 成績テーブル(氏名 VARCHAR(10), 教科 VARCHAR(2), 点数 INT);  
INSERT INTO 成績テーブル VALUES('佐藤', '国語', 0);
INSERT INTO 成績テーブル VALUES('佐藤', '数学', 31);
INSERT INTO 成績テーブル VALUES('佐藤', '英語', 19);
INSERT INTO 成績テーブル VALUES('鈴木', '国語', 59);
INSERT INTO 成績テーブル VALUES('鈴木', '数学', 38);
INSERT INTO 成績テーブル VALUES('鈴木', '英語', 25);
INSERT INTO 成績テーブル VALUES('高橋', '国語', 92);
INSERT INTO 成績テーブル VALUES('高橋', '数学', 100);
INSERT INTO 成績テーブル VALUES('高橋', '英語', 39);
INSERT INTO 成績テーブル VALUES('田中', '国語', 40);
INSERT INTO 成績テーブル VALUES('田中', '数学', 52);
INSERT INTO 成績テーブル VALUES('田中', '英語', 30);

SELECT 氏名, 教科, 点数
  FROM 
    (SELECT *
          , MAX(CASE WHEN 点数=0 OR 点数=100 THEN 1 END)
              OVER (PARTITION BY 氏名) AS 抽出対象
       FROM 成績テーブル
    ) AS Z
 WHERE 抽出対象 = 1
```

# 最後に
他にもご存じのサービスがあればコメント欄で、紹介願います。


# その他
参考記事　2020.11.25 追記
[SQLをログイン不要で試せるサイト](https://qiita.com/AketiJyuuzou/items/801b48ee36f5952929cb)
【Java】try-catchの例外処理について

#プログラミング勉強日記
2020年11月5日
Javaでtry-catch文を使ったので使い方をまとめる。

#例外処理とは
　まずは例外処理とはどういった状態なのかを説明する。調べてみると以下のように出てくる。([出典](https://www.sejuku.net/blog/26344))

> 実行停止してはいけないプログラムに何らかのエラーが発生して落ちた
途中で問題が発生した場合、その後の処理を自分でコントロールしたい

　例外に対応するためにはその場でエラーを解決する方法(try-catch文)と、その場では例外へは対応せず処理を中断して呼び出し元に任せる(メソッドのthorws節)の2つ方法がある。
　Javaのtry-catch文はプログラム中で例外が発生するかを試し(try)、例外が発生したら捕まええて(catch)、何かしらの処理を行う。

#try-catch文とは
　上でも述べたが、例外が発生する可能性のある処理に使う。try-catch文を使うことで例外が発生しない場合の処理と例外が発生したときの処理を分けられる。
　finallyを使うことで例外の有無に関わらず最後に必ず実行される処理を記述できる。

```java:書き方
try {
  // 例外が発生する可能性のある処理
} catch (例外の型 引数) {
  // 例外が発生した場合の処理(例外が発生しなければ行われない処理)
} finally {
  // 例外の有無に関わらず、最後に必ず実行される処理
}
```
　例外の変数名は自由だが、多くの人は<b>`e`</b>と記述する。

##サンプルコード
　例としてファイルを読み込むときに発生する例外のプログラムを書く。

```java
try {
 FileReader fr = new FileReader("test.txt"); 
} catch (FileNotFoundException e) { 
 System.out.println("ファイルがありません"); 
}
```

##意図的に例外を発生させるサンプルコード

```java
try {
  if(i == 0){
     throw new ArithmeticException("意図的に例外を発生させる");
  }
  int mul = i * 5;
  return mul
} catch (Exception e) {
  System.out.println("例外が発生");
  System.out.println(e);
  return 0;
}
```

```:iが0だった場合の実行結果
意図的に例外を発生させる
java.lang.ArithmeticException: 例外が発生
戻り値 = 0
```

#Exceptionクラスの種類

| 例外クラス | 説明 | 例
|:--:|:--:|:--:|
|java.lang.IllegalArgumentException | 不適切な引数 | 引数の指定エラー |
|java.lang.IllegalStateException | 不正な状態 | 未初期化で呼び出し |
|java.lang.NullPointerException | Nullアクセス | 文字列の値がNull |
|java.lang.IndexOutOfBoundsException | 範囲外 | 配列のインデックス番号がオーバー |
|java.lang.ArithmeticException | 不正な算術計算 | ゼロでの割り算 |
|java.lang.NumberFormatException | 不正な数値型への変換 | 変換元の文字列が数値でない |
|java.io.FileNotFoundException | ファイルが開けない | ファイルが存在しない |
|java.io.IOException | 不正な入出力 | ファイルが存在しない |



#参考文献
[クラス java.lang.Exception の使用](https://docs.oracle.com/javame/config/cdc/ref-impl/cdc1.1.2/jsr218/ja/java/lang/class-use/Exception.html)
[Javaのtry-catch文を基本から! より良いエラー処理の方法を身に着けよう](https://engineer-club.jp/java-try-catch#-try-catch)
[【Java】try-catchで例外処理を実装しよう！Exceptionクラスの使い方](https://www.sejuku.net/blog/26344)
Jで湯婆婆を実装してみる

[湯婆婆にエラーを吐かせて遊ぶ](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2) のが流行っているみたいなので、便乗して J で書きました。

わざわざファイルを作るのも面倒なので、GUI (JQt) の REPL で実行します。

# 下準備

以下の verb (関数のようなもの) を定義しておきます。

```j
ask=: 1!:1@1@echo
say=: echo@stringreplace~ '$'&;
utf32=: 9&u: :.(8&u:)
rand=: {~ ?@#
```

`ask` は、メッセージを表示してユーザーからの入力を受け取ります。`say` は、文字列内の `$` を置換して出力します。これらは入出力のためのユーティリティーです。

`utf32` は、UTF-8 と UTF-32 の相互変換を行います。文字をコードポイント単位で操作するために、UTF-32 を利用します。J では文字列は UTF-8 でエンコードされます。UTF-8 はバイト単位で扱われるため、そのまま使うと悲惨なことになります (1 バイトだけ取り出される)。

`rand` は、リストの中からランダムに 1 つ要素を選びます。UTF-32 文字列から 1「文字」(厳密にはコードポイント) 取り出すのに使います。

# 湯婆婆を錬成

上で定義した verb を組み合わせると、湯婆婆が出来上がります。

```j
yubaba=: [: ('今からお前の名前は$だ。いいかい、$だよ。分かったら返事をするんだ、$!!' say rand&.utf32 [ 'フン。$というのかい。贅沢な名だねぇ。'&say) ask@'契約書だよ。そこに名前を書きな。'
```

J では、式は右から実行され、データは右から左へと流れます。途中で変数に値を格納することなく、全ての処理を記述できています。具体的な説明には J の知識がある程度必要になるので、ここでは割愛します。

# 実行

```j
   yubaba''
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は山だ。いいかい、山だよ。分かったら返事をするんだ、山!!
   yubaba''
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!
```

ランダムに 1 文字選べています。他の例も試してみましょう。

```j
   yubaba''
契約書だよ。そこに名前を書きな。
湯婆婆
フン。湯婆婆というのかい。贅沢な名だねぇ。
今からお前の名前は婆だ。いいかい、婆だよ。分かったら返事をするんだ、婆!!
   yubaba''
契約書だよ。そこに名前を書きな。
や婆婆
フン。や婆婆というのかい。贅沢な名だねぇ。
今からお前の名前はやだ。いいかい、やだよ。分かったら返事をするんだ、や!!
```

コードポイント単位で処理しているので、絵文字も扱うことができます。ただし、👨‍👩‍👧‍👦 のような、複数のコードポイントからなる文字は、バラバラになります。

```j
   yubaba''
契約書だよ。そこに名前を書きな。
寿司🍣
フン。寿司🍣というのかい。贅沢な名だねぇ。
今からお前の名前は🍣だ。いいかい、🍣だよ。分かったら返事をするんだ、🍣!!
   yubaba''
契約書だよ。そこに名前を書きな。
👨‍👩‍👧‍👦
フン。👨‍👩‍👧‍👦というのかい。贅沢な名だねぇ。
今からお前の名前は👧だ。いいかい、👧だよ。分かったら返事をするんだ、👧!!
```

もちろん、入力が空だとエラーになります。

```j
   yubaba''
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
|domain error: rand
|       yubaba''
```

# 救済措置

湯婆婆がエラーで死んでしまっては かわいそうなので、空の入力の場合、名前が空文字列になるようにしてみます。

変更箇所は 1 つだけです。`rand` の定義を以下のように書き換えます。

```j
rand=: {~ ::[ ?@#
```

これだけで、エラーは防げます。

```j
   yubaba''
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!
```

# おわりに

この記事を見て、J に興味を持った方は、是非始めてみてください。J は奥が深い言語なので、他にも色々な書き方があると思います。例えば、ワンライナーでも書けます。

```j
echo('今からお前の名前は',,&'だ。いいかい、',,&'だよ。分かったら返事をするんだ、',,&'!!')8 u:({~?@#)9 u:(['フン。'echo@,,&'というのかい。贅沢な名だねぇ。')1!:1@1 echo'契約書だよ。そこに名前を書きな。'
```

手前味噌ですが、現在 [J 言語入門](https://qiita.com/unsigned-wrong-wrong-int/items/e15a87999cedfc6b9ced) を書いています。J を始めたいけど英語のドキュメントを読むのが辛い、という方は、参考にしてみてはいかがでしょうか。
【初心者向け】HTTPとHTTPSの違いって何？

# はじめに
WEB開発をしていると気にしなければいけない「HTTP」と「HTTPS」。
これらの違いについて初心者ながら調べてみたので、まとめます！

間違っている点があればコメントで指摘してくださると幸いです。

# 結論
結論から言うとHTTPは**普通の通信規格**、HTTPSは**安全を考慮した通信規格**です。
HTTP：Hypertext Transfer Protocol （ハイパーテキスト トランスファー プロトコル）
HTTPS：Hypertext Transfer Protocol **Secure**（ハイパーテキスト トランスファー プロトコル セキュア）
正式名称から見てもわかるとおり、HTTPSは安全なんですね～。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/4a6b560f-a4a2-f1d3-f008-1daca5e1c79f.png)
と、コレだけでは何も説明したことにならないと思うので詳しく説明していきます。

# そもそもHTTPとは？

HTTP：Hypertext Transfer Protocolはインターネット上でHTMLファイルや画像ファイルをやり取りする時の決まり事です。

例えば、Qiitaを見たいと思ったらグーグルで検索してリンクをクリックしますよね。
そうすると、Qiitaの公式サイトがモニタに表示されて記事を読むことができます。

このクリックすることを**リクエスト**と呼び、情報がモニタに表示されることを**レスポンス**といいます。

このようにユーザーがサーバーに情報（HTMLファイルや画像ファイル）をリクエストし、それに対してサーバーがユーザーに情報を返すという一連のやりとりが、典型的なHTTP通信となります。

# HTTP通信は情報が第3者に丸見え
しかし、このHTTP通信でやりとりされる情報は第3者が簡単に読み取ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/171d7c3e-fe19-5553-f394-3adc139ec8aa.png)
これって滅茶苦茶マズくないですか！？
HTTP通信だとECサイトで入力したクレジットカード情報や自分の住所などが簡単に読み取られてしまう危険性があります。

また情報が読み取られるだけでなく、改ざんされてしまうこともあります。
実際、NSAという米国の国家安全保障局が、HTTP通信でやりとりされたデータを改竄しマルウェアを仕込んでいたというとんでもない事が暴露された歴史もあります。詳しくは[コチラ](https://www.schneier.com/blog/archives/2013/10/how_the_nsa_att.html)。

**国家安全保障:sweat_smile:**
# HTTPS通信は情報を暗号化する
そこで導入されたのがHTTPS通信です。
HTTP通信は情報を平文のままやりとりするのではなく、暗号化して通信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/35637eb4-4a6d-7fda-1a9d-911618f01f4e.png)
これにより、第3者に情報を読み取られても書いてある内容がわからないので、安全な通信ができるというわけです。
# しかし犯罪者は狡猾
しかし悪意ある第3者は狡猾です。
「暗号化された情報が読めないなら、通信相手になりすませばいいじゃない」ということで、ユーザーの通信相手になりすまし暗号を解読するということを始めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/3442f18e-ec60-4b1b-5e29-c609acd790a6.png)
これではせっかく暗号化した情報も意味が無くなってしまいます。
# SSL/TLSサーバー証明書
ここでの問題は、**通信相手が本当に通信したかった相手かわからない**ということです。
そこでSSL/TLSサーバー認証という手段が用いられます。

SSL/TLSサーバー認証には以下の3つがあります。

名称|説明
---|---
ドメイン認証|ドメイン使用権の認証
企業認証|ドメイン使用権の認証，サイト運営組織の法的な実在を認証
EV認証|ドメイン使用権の認証，サイト運営組織の法的な実在を認証，サイト運営組織の物理的な存在を認証，承認者・署名者の認証
下に行くほど安全性の高い認証になり、取得が難しくなります。
サイト運営者がこの認証を取得することで、「ここは第3者に本物と認められたサイトですよ」と証明することができ、なりすましを防ぐことができます。
# Qiitaの認証を確認してみよう
①
Qiitaの[ホームページ](https://qiita.com/)にアクセスしURLの錠前マークをクリックすると、「証明書」と表示されるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/c2749518-846f-c7f4-17ee-3f0b22d65d66.png)
②
「証明書」ダイアログが表示されるので、「詳細」タブに移りサブジェクトをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/668d6959-e67d-ef53-e939-a0e1b94e17f5.png)
③
CN(コモンネーム)＝Qiita.comとなっていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/cef74904-c256-a792-830b-0cfd93b931a7.png)
これってドメイン認証しかしていないということなのだろうか:thinking:？
詳しい方、ぜひコメントで教えて頂ければ幸いです。

# まとめ
**①HTTPSはHTTPと比較して安全だよ。
②HTTPSは情報を暗号化するよ。
③HTTPSはSSL/TLS証明書を用いて通信相手の信頼性を担保するよ。**

以上になります。少しでも良いと思っていただけたらLGTMをよろしくお願いいたしますm(_ _)m
preg_replace(): Unknown modifier 'd' エラー

今回少し引っかかってしまった事・・・

Laravelの青本を進めていると出てくるのですが（115ページのリスト4ー6）

 <pre><code>
 $pattern = '/<middleware>(.*)<\/middleware>/i';
</code></pre>


と記述するところがあります。
閉じタグのところで
 /middlewareと
書き間違えてしまってました。
\/middleware
と書かないといけませんでした。

さすが初心者の中の初心者・・・
自分の引っかかったところを掲載しています。

他にもこんな記述の仕方があるとか、ご指導いただけたら幸いです。
SOLIDについて

# SOLIDって？
OODの設計で心がけること。
以下、SOLIDってつまりこういうことでしょって自己解釈。

## Single Responsibility
1クラス、1つの役割、多すぎると抽象化しにくい。

## Open Close
他の原則を守ればなされる

- 拡張に開いている

    インタフェース、抽象クラスを実装した新しいクラスで機能を追加できる。
- 修正に閉じている

    インタフェース、抽象クラスを実装しているので修正しにくい。

## Liskov Substitution
基底クラス型でインスタンスを扱う。
派生クラスで好き勝手しない(ふるまいを変えない)、いわゆるIsA関係に従う。

## Interface Segregation
実装クラスで扱わないメソッドはインタフェースで定義しない。
というよりは、インタフェースに機能が多すぎる、SRPに従う。

## Dependency Inversion
抽象に依存する
インタフェース、抽象クラスは積極的に使う（正しく）
Git / GitHubとは

##結論
`Git`＝`バージョン管理システム`
`GitHub`＝Gitを軸にしたプロダクト開発を支援する仕組みを提供しているWEBアプリ。
　　　　　`リモートリポジトリの提供`(リポジトリについてはGitが必要な理由にて記載)
　　　　　類似サービスで`Bitbucket`、`GitLab`がある。
[バージョン管理システムとは・・・]
・主に`コーディングデータ`を保存。
・`誰が`、`いつ`、`どこ`を編集したのかの履歴を保存管理できる仕組み。
（保存内容：日付/バージョン/製作者/更新内容）
・`常に保存されてる履歴にアクセスできる。`
[バージョン管理システムのメリット]
・勝手に`上履き`されたり、データを`バッティング(重複)`することなく一つのファイルを`数人で編集可能`。
・過去の履歴に`アクセスしたり復元`が可能。
・`最新のデータがどこにあるのか`が分かる。

##Gitが必要な理由
他にもバージョン管理システムがある中で、何故Gitが良いのか？
・生みの親がLinux創設者「リーナス・トーバルズ」。
・フリーライセンスの為、Gitを利用するのに何か`別で購入する必要が無い。`
・リポジトリが２種類ある。
→`リモートリポジトリ：サーバーに保存`、`ローカルリポジトリ：開発者のPCに保存`
（リポジトリ＝データの保管場所）

##事例
例：サーバーダウン、ハッキングによりアクセス出来なくなったり、データが破損した。
下記の順番でローカルリポジトリによってデータを`分散型`保存しておくことでデータを復元できる。
1.自分のローカルリポジトリに保存
2.ローカルリポジトリ経由でリモートリポジトリに保存

※他サービスの`Subversion`、`Mercurial`は`集中型`でデータ保存される。

##まとめ
・Gitとは、数あるバージョン管理システムの中の一種。
・バージョン管理システムとは、`過去のデータを保存/復元できる。`
・Gitは`分散型`でデータを保存できる。
・Gitを利用するには、`GitHub`や`Bitbucket`にアカウント登録する。

参考元はこちら
(https://youtu.be/1l8oBEown8c)
nginxのリバースプロキシ設定

#nginxインストールでのerror
```
"/etc/nginx/nginx.conf" failed (2: No such file or directory)
```
設定ファイルが無いと言われたらすべて消して再インストール

```
sudo apt-get remove --purge nginx nginx-full nginx-common
sudo apt-get sintall nginx
```

#リバースプロキシ設定
###Apacheのポートを変更
```conf:/etc/apache2/ports.conf
#listen 80
listen 8080
```
###ドキュメントルート変更
```conf:/etc/apache2/sites-enabled/000-default.conf
#好きなところに変更
DocumentRoot:/var/www/html
```
###Apacheのバーチャルホストのポート変更
```conf:/etc/apache2/sites-enabled/000-default.conf
#<VirtualHost *:80>
<VirtualHost *:8080>
```

###nginxでリバースプロキシの設定
```nginx:/etc/nginx/conf.d/reverse_proxy.conf
server {
  listen 80;               # ポート番号80番でアクセスされたら
  server_name localhost;   # http://localhost でアクセスされたら

  location / {
    proxy_pass http://127.0.0.1:8080; # どこにアクセスさせるか
    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-Proto      $scheme;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
  }
}
```

###nginxの設定チェックコマンド
上記コンフィグファイルに文法errorがないかチェック

```
sudo nginx -t
```

```
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
nginx: configuration file /etc/nginx/nginx.conf test failed
```
サーバ名が長いと言われているから以下修正

```nginx:/etc/nginx/nginx.conf
http{
...
   #このコメントを外す
   server_names_hash_bucket_size 64;
...
}
```
そしてチェック

```
 $ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
これでOk


#トラブルのときの役立つかもしれないコマンド
####nginxの設定チェックコマンド
```
sudo nginx -t
```
####動いているかの確認コマンド
```bash
ps aux | grep [動いているか確認したキーワード]
```

####ポートチェック

```bash
#80番ポートが何に使用されているか
lsof -i:80
```

#参考
- [Nginxのリーバスプロキシ化（Apacheと共存）](https://qiita.com/mike-ayumu/items/5f255bab07606759a8e5)
- [nginxでサーバ名が長いって怒られた](https://qiita.com/madaran0805/items/8a32b123fa94018284fa)
Discord Botで湯婆婆を実装してみる

~~N高生ってこのネタ好きだよなぁ...人のこと言えないが。~~

## はじめに

@Nemesisさんの「[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)」が話題なので、実際にDiscord上で「名前を奪ってみようと」思います。

## 要件整理
Discordの場合、契約書も何も、全部名乗ってから喋ってるので契約書は交わす必要はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401342/c85d18db-a1f1-26ff-47b0-992a99d7ec6e.png)

ということで以下の動作をするBOTを作る。

1. 湯婆婆宛にメンション
2. 例の文章を言われ ~~名前を奪われる~~ ニックネームを変更される

あとついでに、ステータスも表示させてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401342/3b666331-fd39-5787-6000-26c51fffd1fb.png)
~~お仕事をプレイ中…なんかヤバそう~~

## ① 下準備
この記事通りにセットアップしてみた。
[誰でも作れる！Discord Bot（基礎編） - EOiさん](https://note.com/exteoi/n/nf1c37cb26c41)

## ② server.jsをいじる

とりあえずこんな感じに実装してみた。

```js:server.js

//略

client.on('ready', message =>{
 console.log('フン。ようやく準備ができたのかい。');
 client.user.setActivity('お仕事');
});

client.on('message', message =>{
 if (message.author.id == client.user.id){
   return;
 }
 if(message.isMemberMentioned(client.user)){
   console.log(message.author.id);
   var text = "フン。<@" + message.author.id + ">というのかい。贅沢な名だねぇ。";
   message.channel.send(text);
   
   const random = Math.round(Math.random() * (message.member.displayName).length);
   let newName = (message.member.displayName).substr(random, 1);
   message.guild.member(message.author.id).setNickname(newName);
   console.log(newName);
   
   text = "今からお前の名前は<@!" + message.author.id + ">だ。いいかい、<@!" + message.author.id + ">だよ。分かったら返事をするんだ、<@!" + message.author.id + ">！！";
   message.channel.send(text);
   return;
 }
});

//略
```

## ③ 実行してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401342/a269160f-8d84-b02d-433d-7870b7f035f4.png)

うまく行った

## 困りごと
湯婆婆よりも上位権限のロールがついている人相手には、名前が奪えない。
湯婆婆が上司から名前を奪ったらそれはそれで社会問題になるので、この問題はスルーするとしよう。

## 終わりに
ネタでした。
湯婆婆BOTはここからサーバーインポートできます。
[湯婆婆BOT](https://discord.com/api/oauth2/authorize?client_id=773517769102721054&permissions=201394176&scope=bot)

## 参考記事

* [Javaで湯婆婆を実装してみる - @Nemesisさん](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)
* [JavaScriptで湯婆婆を実装してみる - @hato-poppoさん](https://qiita.com/hato-poppo/items/670d5186c2807a5f51b4)
* [Discord Botアカウント初期設定ガイド for Developer - @1ntegrale9さん](https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf)
* [誰でも作れる！Discord Bot（基礎編） - EOiさん](https://note.com/exteoi/n/nf1c37cb26c41)
dockerチュートリアルでnpmエラー

##Dockerの公式ドキュメント
[Docker document Quickstart part2](https://docs.docker.com/get-started/part2/)でエラーが発生
`$ docker build --tag bulletinboard:1.0 .`の部分で

```
Step 4/7 : RUN npm install
 ---> Running in 1a42d2b3c5dd
npm notice
npm notice New patch version of npm available! 7.0.3 -> 7.0.8
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v7.0.8>
npm notice Run `npm install -g npm@7.0.8` to update!
npm notice
npm ERR! code FETCH_ERROR
npm ERR! errno FETCH_ERROR
npm ERR! invalid json response body at https://registry.npmjs.org/vue reason: Unexpected token � in JSON at position 70253

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-11-05T12_02_36_331Z-debug.log
```

##やったこと1
Node.jsとnpmを直接インストール
[インストール方法](https://phoenixnap.com/kb/install-node-js-npm-on-windows)
インストールあと以下のサイトで設定
[Node.jsのPath（パス）を確認する方法【初心者向け】](https://techacademy.jp/magazine/16113)
あとコントロールパネル＞システム＞アドバンスドシステム設定(左下）>環境変数>システム変数のpathを編集してC:\Program Files\nodejs\を追加(自動でできてるかも）

##やったこと2
`bulletin-board-app`ファイル内の`package-lock.json`ファイルを削除して
`$ docker build --tag bulletinboard:1.0 .`を実行

まだエラー出ていたので、dockerfileの5行目に`RUN npm cache verify`

```docker


FROM node:current-slim

WORKDIR /usr/src/app
COPY package.json .
RUN npm cache verify
RUN npm install 

EXPOSE 8080
CMD [ "npm", "start" ]

COPY . .
```
##なんとなくうまくいった？
```
$ docker build --tag bulletinboard:1.0 .
Sending build context to Docker daemon  12.03MB
Step 1/8 : FROM node:current-slim
 ---> 922b09b21278
Step 2/8 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 5d3d82eda8ed
Step 3/8 : COPY package.json .
 ---> Using cache
 ---> 7cc831630440
Step 4/8 : RUN npm cache verify
 ---> Using cache
 ---> 54aab39eb76b
Step 5/8 : RUN npm install
 ---> Using cache
 ---> b6e782bc92e7
Step 6/8 : EXPOSE 8080
 ---> Using cache
 ---> baf0c121f375
Step 7/8 : CMD [ "npm", "start" ]
 ---> Using cache
 ---> 5fcb2b27e8f0
Step 8/8 : COPY . .
 ---> b02d075c5110
Successfully built b02d075c5110
Successfully tagged bulletinboard:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
```
最後の
`SECURITY WARNING:~~~~`は無視

##結論
もっとNode.jsやらの知識を身に着けてからの方がいい
LINE Developerの管理画面の「検証」ボタンからの接続確認を成功させる

## 管理画面の「検証」ボタンの場所

https://developers.line.biz/console/channel/1654463371/messaging-api

この先のページの

[![Image from Gyazo](https://i.gyazo.com/a59ac6c515a8511999e29b39b3042ac2.jpg)](https://gyazo.com/a59ac6c515a8511999e29b39b3042ac2)

これですね

## 今までは成功したり、しなかったり…

今までのコードではこんな感じに接続確認のときの通信を判断していました。
（一部抜粋）

```js
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);

    //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
    if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
        res.send('Hello LINE BOT!(POST)');
        console.log('疎通確認用');
        return; 
    }

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});
```

ちょっと前（2020年9月くらい？）では、成功したりしなかったりであまりあてにしてなかったでした

すると最近（2020年11月現在)、まったく成功しなくなりました

ただ、その検証以外は普通に動くし、そのif文消したら消したで普通に検証成功するのでまぁいいやと思ったのですが、今回これを解消してみようとして、成功しましたので共有します

## 検証成功したソースコード

完成コードですが、チャンネルシークレットやアクセストークンはそれぞれ置き換えお願いします

```js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: '作成したBOTのチャンネルシークレット',
    channelAccessToken: '作成したBOTのチャンネルアクセストークン'
};

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);

    // 空っぽの場合、検証ボタンをクリックしたときに飛んできた"接続確認"用
    if (req.body.events.length == 0) {
      res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します
      console.log('検証イベントを受信しました！'); // ターミナルに表示します
      return; // これより下は実行されません
    }

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

async function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: event.message.text //実際に返信の言葉を入れる箇所
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

```

受け取るデータの中のeventsは、検証時空っぽでした。

また、以前は成功したりしなかったりでしたが、ほぼほぼ検証が正確にできていそうでした！

こうすることで、検証ボタンからの通信か、普通にBOTに話しかけた通信かがわかるようになりました。
【RDS】Amazon Auroraとは

## Auroraとは
MySQL 及び PostgreSQL と互換性がある完全マネージド型のリレーショナルデータベースエンジン

- 高性能のストレージサブシステムを含み、それを利用するようカスタマイズされている
- 既存のアプリケーションの殆どを変更することなく、MySQLのスループットの5倍、PostgreSQLのスループットの3 倍を実現する
- 3つのAZに2つずつ、計6つのデータコピーを持つ
- Auroraノードに障害が発生すると、別のAZで起動中のReaderノードが自動的にWriterノードに昇格し、クラスターエンドポイントの指すAuroraノードが新しいWriteノードに変更されることで復旧が行われる

## Amazon Aurora DB クラスター
以下2種類のDBインスタンスのうちの1つ以上と、これらのDBインスタンスのデータを管理する1つのクラスターボリュームで構成される

**1. プライマリDBインスタンス**： 読み書きオペレーションをサポートし、クラスターボリュームに対するすべてのデータ変更を実行する
**2. Auroraレプリカ**：プライマリDBインスタンスと同じストレージボリュームに接続し、読み取りオペレーションのみをサポートする

**クラスターボリューム**：複数のAZにまたがる仮想データベースストレージボリューム

↓ Aurora DBクラスター内のクラスターボリューム、プライマリDBインスタンス、及びAuroraレプリカの関係を示す図
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/515ed830-e385-089c-1ea0-e4aa18b6e7c9.png">

- 最大サイズ128TiBまで拡張可能

## Aurora レプリカ
Aurora DBクラスター内の独立したエンドポイント

- 最大15個のAuroraレプリカを、1つのリージョンの中でDBクラスターが処理するAZ全体に分散可能
- フェイルオーバーターゲットとして使用することで、プライマリインスタンスが失敗した場合にAuroraレプリカがプライマリインスタンスに昇格し、即座に復旧が可能

## エンドポイントのタイプ
### 1. クラスターエンドポイント （ライターエンドポイント）
DBクラスターの現在のプライマリDBインスタンスに接続するエンドポイント

- 書き込みオペレーションを実行できる唯一のエンドポイント
- Aurora DBクラスターごとに1つのクラスターエンドポイントと1つのプライマリDBインスタンスがある

### 2. リーダーエンドポイント
DBクラスターへの読み取りオペレーションで使用するエンドポイント

- Aurora DBクラスターごとに1つのリーダーエンドポイントがある
- Auroraレプリカが作成されていない場合はプライマリインスタンスに接続
- クラスターに1つ以上のAuroraレプリカが含まれている場合、リードレプリカ間で各接続リクエストを負荷分散する

### 3. インスタンスエンドポイント
Auroraクラスター内の特定のDBインスタンスに接続するエンドポイント

- DBクラスターの各DBインスタンスに独自のインスタンスエンドポイントがある
- クラスターエンドポイントやリーダーエンドポイントの使用が適切でないシナリオ向けに、DBクラスターへの接続の直接制御を提供する

## バックアップと復元
### バックアップ
クラスターボリュームを自動的にバックアップし、バックアップ保持期間分の復元データを保持可能

- 自動バックアップを無効にすることは出来ない
- バックアップ保持期間は1～35日を指定 （デフォルトは1日）
- バックアップ保持期間を超えたバックアップを保持する場合は、クラスターボリュームの中にデータのスナップショットを作成する
- スナップショットから新しいDBクラスターを作成可能

### 復元
Auroraが保持するバックアップデータ、または保存したDBクラスターのスナップショットから新しいAurora DBクラスターを作成することで、データを回復可能
【RDS】RDSの可用性 / 拡張性 / セキュリティ

## マルチAZ
複数のAZでRDSインスタンスを起動し、冗長化すること

- アクティブ - スタンバイ型のクラスター構成
- 2つの異なるAZに**プライマリインスタンス**（アクティブインスタンス）と**セカンダリインスタンス**（スタンバイインスタンス）を展開する
- エンドポイントに対するアクセスは全てプライマリインスタンス側で処理される
- 書き込みも読み取りもプライマリインスタンスで処理されるため、**負荷分散の効果は無い**
- プライマリインスタンスで更新されたデータはセカンダリインスタンスに完全に同期される
- プライマリインスタンスへの書き込みトランザクションをコミットした場合、セカンダリインスタンスへの同期完了確認後にコミット完了となる
- コミット完了前に障害が発生した場合はロールバックされる
- プライマリインスタンスに障害が発生した場合、エンドポイントはセカンダリインスタンスに接続され、セカンダリインスタンスがプライマリインスタンスに昇格する

## 自動バックアップ
2種類の自動バックアップが取得される
以下のバックアップデータを利用することで、ポイントインタイムリカバリが可能

**ポイントインタイムリカバリ**：特定の時刻を指定し、その時刻時点のデータを復元すること

###1. スナップショット
- 1日に1回、バックアップウィンドウとして設定した時間帯に自動的に取得される
- デフォルトでは7世代保存可能（最大35代）
- 手動によるスナップショットの取得も可能
- 取得時に数秒間のI/O停止を伴う（※マルチAZ構成の場合はセカンダリインスタンスから取得されるため、プライマリインスタンスはI/O停止しない）

### 2. トランザクションログ
5分ごとにRDSへの全ての書き込みトランザクションを記録するログ

## サブネットグループ
異なるAZを2つ以上含むサブネットの集合
RDSでインスタンスを作成する際に必ず指定する

- シングルインスタンス構成のRDSで、インスタンス障害やAZ障害が発生した場合には、指定したサブネットグループ内の別のAZのサブネットに、バックアップから新たなインスタンスを起動する
- 障害前に利用していたエンドポイントを新しく起動したインスタンスに明示的に紐付ける必要がある

## リードレプリカ
**ソースDB**：インスタンス間でデータの同期を行う際に元になる書き込み可能なインスタンス
**リードレプリカ**：読み込み専用のインスタンス

- 読み込み負荷の分散が可能
- SQL Server以外で作成可能
- Auroraの場合 → リードレプリカ専用エンドポイントがロードバランサーの役割を担い、複数のリードレプリカへの接続を自動で行う
- Aurora以外の場合 → リードレプリカごとにインスタンスエンドポイントが用意されており、接続するリードレプリカを利用者側で指定する必要がある
- ソースDBと同じAZ、異なるAZ、異なるリージョンのいずれにも作成可能
- セカンダリインスタンスとは異なり、ユーザーがリードレプリカにアクセスし、読み取り処理を実行出来る
- ソースDBからリードレプリカへのデータ反映は非同期で行われる
- ソースDBへの書き込みトランザクションは、リードレプリカへのデータ反映が完了していなくてもコミット完了させる
- リードレプリカをソースDBに昇格させることも可能

## アクセス制御
DBインスタンスへのアクセス制御にセキュリティグループを利用する

- EC2インスタンスに割り当てるセキュリティグループと同様
- インターネット経由でRDSにアクセスする場合、Public accessibility設定を有効化する

**Public accessibility設定**：有効化すると、グローバルIPアドレスがインスタンスに割り当てられる

## 暗号化
各データベースエンジンのSSL通信機能を利用して、通信内容を暗号化することが可能
インスタンス作成時に自動的に証明書が作成されるため、ユーザーによる証明書の設定は不要

- KMSを利用することでデータベース及びスナップショットを暗号化可能
- データベースの暗号化設定はインスタンス作成時にのみ可能
- インスタンス作成後にデータベースを暗号化する場合、インスタンスのスナップショットを取得し、スナップショットのコピー時に暗号化設定を行う
- 暗号化されたスナップショットからリストアを行うと暗号化されたデータベースを持つDBインスタンスを起動可能
【RDS】RDSとは

## RDS とは
**Amazon Relational Database Servie** の略
様々なデータベースソフトウェアに対応したフルマネージドのリレーショナルデータベース

以下7種類のRDBMSからエンジンを選択肢、利用可能

- MySQL
- Oracle DB
- SQL Server
- PostgreSQL
- MariaDB
- Amazon Aurora（MySQL-compatible）
- Amazon Aurora（PostgreSQL-compatible）

## DBインスタンス
AWSクラウド内の独立したデータベース環境であり、RDSで選択したデータベースエンジンが実行される
RDSの基本的な構成要素はDBインスタンスである

### DBインスタンスストレージ
**1. 汎用SSD**
様々なワークロードに対応できるコスト効率の高いストレージとして使用

**2. プロビジョンドIOPS**
低I/Oレイテンシー及び一貫したI/Oスループットが必要となるI/O負荷の高いワークロード（特にデータベースワークロード）のニーズを満たすように設計されている

**3. マグネティック**
下位互換性のためにマグネティックストレージをサポートしている

## RDBMS on EC2 と RDS の違い
RDSで選択可能なデータベースエンジンは、Auroraを除いて、EC2インスタンスに直接インストール可能だが、以下のような使用上の違いがある

| 操作 | RDBMS on EC2 | RDS |
|:----------:|:-----------:|:------------:|
| ssh / リモートデスクトップ接続 | ◯ | × |
| データファイル操作 | ◯ | △<br>（代替手段有り） |
| システムレベルの操作 | ◯ | △<br>（代替手段有り） |
| 自動バックアップ | △<br>（利用者が仕組みを作る必要有り） | ◯ |
| 冗長化 | △<br>（利用者が構成する必要有り） | ◯ |

### ライセンス
商用RDMNSであるSQL ServerとOracle DBを利用するためには、通常、ライセンスを購入する必要がある

**EC2にRDBMSをインストールする場合**

- Oracle DBをインストール → 別途ライセンスを購入する必要がある
- SQL Serverをインストール → BYOLで利用する際には専用ホスト型のEC2インスタンスを起動しインストール、BYOLで利用しない場合はWindows Server上に提供されている、あらかじめインストールされたAMIを利用可能なため、費用は発生しない

**RDSを利用する場合**

- 料金にライセンス費用が含まれたインスタンスタイプが提供されているため、別途ライセンスを購入する必要はない
- Oracle DBをBYOLで利用することも可能
- RDS SQL ServerをBYOLで利用することは不可

## RDSの制限事項
- 使用出来るバージョンが限定される
- キャパシティに上限がある
- OSへのログインやファイルシステムへのアクセスが出来ない
- IPアドレスが固定出来ない
- 個別パッチは適用出来ない
これから学ぶ言語まとめ

これからプログラミングの学習を始めるにあたり言語の内容や役割を調べてみました。下記にまとめましたのご確認ください。間違い等ありましたご指摘の方よろしくお願いいたします。

HTMLについて
HTML（エイチティーエムエル、HyperText Markup Language）は、ウェブページを作成するために開発された言語であり、 現在、インターネット上で公開されてるウェブページのほとんどは、HTMLで作成されている。
ハイパーテキストでは、ウェブページから別のウェブページにリンクをはったり、 ウェブページ内に画像・動画・音声などのデータファイルをリンクで埋め込むことができ、 HTMLには、このハイパーリンク機能で関連する情報同士を結びつけて、情報を整理するという特徴がある
身近なHTMLとしてウェブサイト、電子メール（HTML形式）、スマホアプリがあげられる。


CSSについて
CSS（Cascading Style Sheets、カスケーディング・スタイル・シート）とは、ウェブページのスタイルを指定するための言語です。 ワープロソフトなどで作成される文書も含めて、文書のスタイルを指定する技術全般をスタイルシートといいます。 HTMLやXHTMLなどで作成されるウェブページにスタイルを適用する場合には、スタイルシート言語の1つであるCSSが一般的に利用されています。CSSは、HTMLと組み合わせて使用する言語です。 HTMLがウェブページ内の各要素の意味や情報構造を定義するのに対して、CSSではそれらをどのように装飾するかを指定します。 例えば、ウェブページがスクリーンに表示される際の色・サイズ・レイアウトなどの表示スタイルや、 プリンタなどの機器で印刷・出力される際の出力スタイル、 音声で読み上げられる際の再生スタイルなど、 ウェブページをどのようなスタイルで表示・出力・再生するかについて指定することができます。

JavaScriptについて
JavaScriptとは、ブラウザに作業をさせるためのプログラミング言語で
Webページに「動き」のあるページを作成するための言語です。
画像のスライド時のエフェクトやユーザーの入力に応じた処理などをJavaScript言語で実現できます。
　
Rubyについて
Ruby（ルビー）とは、1995年に一般公開されたオブジェクト指向スクリプト言語です。このスクリプト言語とは、アプリケーションソフトウェアを作成するためのプログラミング言語のことです。Webサービスやアプリケーションが挙げられます。Rubyは人気のフレームワーク「Ruby on Rails」のベース言語です。Ruby on RailsはWebアプリケーションを作成するためのフレームワーク（枠組み）で、これを利用してさまざまなアプリケーションの開発ができます。Rubyは、Ruby on Rails以外にも、SINATRA、Padrino、Hanamiなどのフレームワークでも使えます。
RubyはWEBアプリケーションの「システム」をつくるためのプログラミング言語です。 似たような言語として、PHPやPythonといったものがあります。

Ruby on Railsについて
Ruby on Railsは、Rubyで書かれた、WEBサービスの開発に必須のフレームワークです。フレームワークは日本語では「枠組み」というふうに言われますが、まさにその通りで、このRailsもプログラミング言語のRubyで使えるフレームワーク
Gemfileに gem 'bcrypt'  を記入しbundle installでエラーが出たときの対処法

<h1>エラー内容</h1>


```rails:ターミナル
You have requested:
  bcrypt = 3.1.12

The bundle currently has bcrypt locked at 3.1.13.
Try running `bundle update bcrypt`
```

<h1>エラーの原因</h1>

`bcypt` の古いバージョンをインストールしていたため発生。
今回の場合、Gemfile.lockでは`bcypt`のバージョンが3.1.12となっていましたが、Gemfileの方は3.1.13でインストールしようとしたため発生したようです。 バージョン違いには気をつけましょう！

<h1>対策</h1>
`Gemfile.lock`を削除することで解決できます。
`Gemfile.lock`は`bundle install`を実行することで`Gemfile.lock`が自動生成されます。
PureScriptで湯婆婆を実装してみる

いつの間にか [Ja 婆婆](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)が妙に流行っていたのでどれいっちょ Rust で実装してみっかと思って念の為検索をかけたら[もういた](https://qiita.com/7321hasu/items/cad5efdaaf842cc967ba)ので, ~~人気がなさそうな~~まず間違いなくかぶらない PureScript で実装することにしました。

なお, PureScript で標準入力を実現するのは少し面倒なので, コードに直書きすることにしてます。 すまねえ。 やり方は[こちら](https://qiita.com/goldarn_ring/items/e3cc607dd63e57d91fe5)。

でも代わりに [Try PureScript!](https://try.purescript.org/) に貼り付けて実行できるので環境構築とかしなくても遊べるよ。

## コード

```haskell
module Main where

import Prelude

import Data.String.CodePoints (length)
import Data.String.CodeUnits (singleton)
import Data.String.Unsafe (charAt)
import Effect (Effect)
import Effect.Console (log)
import Effect.Random (randomInt)

yubaba :: String -> Effect String
yubaba name = do
    let nameLen = length name
    index <- randomInt 0 (nameLen - 1)
    pure $ singleton $ charAt index name

main :: Effect Unit
main = do
    log "契約書だよ。そこに名前を書きな。"

    -- 契約書
    let name = "千尋"

    log $ "フン。" <> name <> "というのかい。贅沢な名だねぇ。"
    newName <- yubaba name
    log $ "今からお前の名前は" <> newName <> "だ。いいかい、" <> newName <> "だよ。分かったら返事をするんだ、" <> newName <> "!!"
```

## 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/fc0067b6-175c-85fc-5393-250dfe4acfbf.png)

## 解説

### `main`

`main`に関しては見たままです。 PureScript の知識がなくてもなんとなく分かると思います。 PureScript では関数は引数をカッコで囲んで与える必要はなく, 隣に書くだけで OK です。 間に挟まっている`$`は関数適用演算子で, `a $ b $ c $ d`は`a(b(c(d)))`に等価です。 全体をカッコで囲う必要がないので便利です。

非 Haskeller に説明が必要そうな部分として, `let hoge = ...`と`hoge <- ...`の違いは, 右辺が`Effect`つまり作用を持っているかどうかです。

作用のない, 直の値なら`=`でそのまま束縛します。

作用を持つなら値そのものではなく, 「それによって得られる値をこのように操作する」という手順(アクション)として記憶します。 そのために使うのが`<-`です。

`log`は標準出力に`String`を流します。 `<>`は文字列の結合に使う演算子です。 関数適用は演算子よりも優先度が高いので, 全体をカッコで囲む……かわりに`$`演算子を使っています。

### `yubaba`

`yubaba`は気持ち的には`String`をとって`String`を返す関数です。 ~~湯婆婆関数とかいうパワーワード。~~ しかし, 乱数によって結果が変わる……すなわち作用を持つので, 文字列そのものではなく「`String`を得る手段(アクション)」`Effect String`を返します。

`length`は`String`の文字数`Int`を返します。

`randomInt`は第一引数`Int`以上第二引数`Int`以下の整数を得ます……が, 乱数なので作用を持ちます。 つまりこの関数は`Int`そのものではなく「`Int`を得る手段(アクション)」`Effect Int`を返しています。 よって`<-`です。

`charAt`は第二引数の`String`の第一引数`Int`文字目の`Char`を返します。

`singleton`は`Char`を`String`に変換しています。

`pure`は少し説明が難しいのですが, 「この値を手順(アクション)`Effect T`として扱う」というような意味を持ちます。 この関数は手順(アクション)を返すからです。 `index`は具体的な値そのものではなく, 便宜上つけられた識別名でしかありませんので, 最後に手順(アクション)を返さなければいけないのはそれは当然だよね。

## クラッシュする湯婆婆

もちろん元ネタ様にしたがい, 空文字列を与えるとクラッシュします。 やったぜ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/5aa27414-ce7c-8936-cc4a-d4948bb8d145.png)

これはわざと「安全でない」`charAt`を使用しているためです。 よく見ると`Unsafe`って書いてあるよね。 PureScript は超・安全志向言語なのでちゃんとしたプログラムではこんなことは起こりませんが, それについて長々と語ってもただの宣伝になってしまいますし, なにより Ja 婆婆らしさ(?)がなくなってしまいますので割愛。
[Unity] お手軽！Mathf.PerlinNoise で地形を作る

こちらは Unity #2 Advent Calendar 2020 の 2日目の記事です

Unityには、(x,y)の値に依存した[0,1]の連続したノイズ値を返す```Mathf.PerlinNoise(x,y)```という数学関数が用意されており、これを使うと地形ステージが簡単に作れます。
例えば、空のオブジェクトに以下のスクリプトをアタッチして実行するとこうなります。

![2020-11-05_203911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b28b6f77-5e33-2fbf-5cea-fce422b30f8a.png)

海の領域を減らしたければこう
![2020-11-05_204538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/cb34d887-e35a-65ef-a478-da397365c34f.png)
![2020-11-05_204343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/17074f88-2a8d-2058-107b-391d09e568b5.png)

迷路っぽくしたければこう
![2020-11-05_204819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1cfa7cdd-2566-72ac-3b4d-5203cf578f56.png)
![2020-11-05_204851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f321be54-a5d0-1866-21ac-9805b657c478.png)

ね？簡単でしょ？

```PerlinNoiseSample.cs
using UnityEngine;
public class PerlinNoiseSample : MonoBehaviour {
    [SerializeField, Range(0f, 1f)] float m_threshold = 0.5f;
    [SerializeField, Range(0.05f, 0.3f)] float m_scale = 0.1f;
    int sz = 50;

    void Start() {
        createCustomCube(Vector3.zero, new Vector3(sz, 0.1f, sz), new Color(0.4f, 0.3f, 0.9f));
        for (int x = 0; x < sz; ++x) {
            for (int z = 0; z < sz; ++z) {
                float noise = Mathf.PerlinNoise((float)x * m_scale, (float)z * m_scale);
                if (noise < m_threshold) {
                    float thRate = (m_threshold - noise) / (m_threshold);
                    createCustomCube(new Vector3(-sz*0.5f+x, 0f, -sz*0.5f+z), new Vector3(1f,thRate*10f, 1f), new Color(1f-thRate*1.1f, 0.8f+thRate*0.3f, 0.9f-thRate*1.2f));
                }
            }
        }
    }

    void Update(){}

    GameObject createCustomCube(Vector3 _position, Vector3 _scale, Color _color) {
        GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
        go.transform.SetParent(transform);
        go.transform.localPosition = transform.position + _position;
        go.transform.localScale = _scale;
        go.GetComponent<MeshRenderer>().material.color = _color;
        return go;
    }
}
```
rubyで変数を使える範囲【スコープ】

変数のスコープについて、かなり単純なコードで説明したいと思う。

下記のようなコントローラーが記述されていたとする。

```ruby
class SampleController < ApplicationController

  def test1
    sample_1 = 10
    test3(sample_1)
  end 

  def test2
    sample_2 = 10
    test4
  end

  private

  def test3(num)
    sample_3 = num + 10
  end

  def test4
    sample_4 = sample_2 + 10
  end

end
```

見たところ、test1アクションではプライベートメソッドのtest3(num)アクションを呼び出すことになり、test2アクションではプライベートメソッドのtest4アクションを呼び出すことになる。

結論から先に書くと、test1からのtest3(num)の呼び出しと処理は上手くいくが、test2からのtest4の呼び出しはできるが処理がうまくいかずエラーが出る。

#何が違うのか

####test1とtest3の場合

test1では、その内部で`sample_1 = 10`と定義して、それを実引数として`test3(sample_1)`という書き方でtest3(num)に渡している。

```ruby
  def test1
    sample_1 = 10
    test3(sample_1)
  end
```
test3内部では、渡されたsample_1が仮引数であるnumに代入される。つまりわかりやすく（？）書くと`num = 10`ということになる。

```ruby
  def test3(num)
    sample_3 = num + 10
  end
```
こうして無事にnumに数を引き渡せたのでtest3(num)の中身の計算は実質`sample_3 = 10 + 10`
となって、`sample_3 = 20` となる。

####test2とtest4の場合

test2では、その内部で`sample_2 = 10`と定義したあと、test4を呼び出している。

```ruby
  def test2
    sample_2 = 10
    test4
  end
```
test4内部では、test2で定義された`sample_2 = 10`が使えるので、中身の計算は実質
`sample_4 = 10 + 10`となるため、`sample_4 = 20`とな・・・・・・らない。

###エラーが出ます

なぜか？

```ruby
  def test4
    sample_4 = sample_2 + 10
  end
```

実はtest4内部でsample_2が使えないからである。
いくらtest2内部で`sample_2 = 10`と定義していようが、test4さんには関係ない事なのである。

これが変数のスコープと呼ばれる物。
結論から先に書けば、test4内部使える変数は

* test4で定義した変数、または
* test4を呼び出したtest2内部で定義されたインスタンス変数

なのである。（正確に言えば確かグローバル変数とかいうやつも使えたと思うが話がややこしくなるので省略）

ん？インスタンス変数？あれです、あの@ついたやつです。

というわけで、test4の中で`sample_2 = 10`を使いたいなら

```ruby
  def test2
    @sample_2 = 10
    test4
  end
```
っていう風に定義して、test4でも

```ruby
  def test4
    sample_4 = @sample_2 + 10
  end
```
っていう風に@をつけて呼び出してあげれば使うことができ、無事に`sample_4 = 20`となる。
MySQLでレコードの追加・更新・削除

### はじめに
SQLの学習を始めるにあたって、備忘録として残しています

### テーブルにデータを追加する

#### INSERT文

INSERT文はテーブルにデータを新たに追加する場合に使用する

`INSERT INTO 対象とするテーブル名 (カラム1,カラム2,...) VALUES(値1,値2,...);`

INSERT文で一度に追加できるレコードは原則1件
複数件のレコードを追加したい場合は複数INSERT文を記述する必要がある

INTO句には、対象とするテーブル名を記述。その後ろにテーブル内のカラム名を指定する
VALUES句には、カラムに対応した値を指定する。

カラム名は省略してデータを追加する事もできる

#### デフォルト値を設定できる

値リストに何も記述しなかった場合は、デフォルト値という、予め設定しておいた値が代入される
デフォルト値を明示的に設定しなかった場合はNULL値が代入される

### データの更新
データの更新は、SQLではUPDATE文を使う

`UPDATE 対象とするテーブル名 SET 書き換えたいカラム名=値, ... (WHERE 書き換えたいレコードの条件);`

### レコードを削除
レコードの削除は、SQLではDELETE文を使う

`DELETE FROM 対象とするテーブル名 (WHERE 削除したいレコードの条件);`
azure cliやarm templateの実行でDue to a configuration~のエラーを解決したメモ


## 概要

しょうもないエラーを解決したメモ。
armテンプレートの実行や、azコマンドで以下のエラーが出ていた。

```
Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access
````

## 解決法

```sh
az login
```

でログインしなおしたところ、動作するようになった。
Scrum Fest Sapporo Day 0 参加レポート「プロダクト生存戦略 : スクラムギャザリング東京の10年から学ぶ」

# Scrum Fest Sapporo Day 0 「プロダクト生存戦略 : スクラムギャザリング東京の10年から学ぶ」

2020/11/05に開催されたScrum Fest Sapporoでの最後の発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14104/10

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、6人で参加して、その場で実況しつつ、記事も作っています。

# [RSGT/スクラムギャザリング東京](https://2021.scrumgatheringtokyo.org/index.html)

RSGT実行委員の川口さん、細沢さん、秋元さんの３名による講演で、
発表はMURALの付箋でつくった年表をベースにした、座談会形式で行われていました。

RSGTの変遷を４つのフェーズに分けて話をされていました。

# フェーズ１
はじまりはInnovation Sprint 2011
楽天の品川シーサイドで実施。
第１回目ということもあり、ノウハウがなく最初はとても苦労したとのこと。

**１回目の苦労**

- 翔泳社さんの岩切さんに協力してもらい、プレッシャーをもらいつつチケットを手売り
- 100-150人規模のカンファレンス
- 開催費用を収入として得られなければ、開催者が補填すると血判状を書いたとか
- 販売チャネルがなかったため、スピーカーの近くの人達に声をかけていった
- 結果、満員な状態で開催できた
- なぜスクラムギャザリングをやるのか？（Why）から始めるようとすると、やったことのない人が集まっているため”怖い”というところから入ってしまう。

# フェーズ２

第２回からは自分たちはカンファレンスの運営に集中し、運営会社とうまく協力しながらすすめていくことができた。
チケットは売れてたくさんの人に参加してもらえたものの、ネットワーキングパーティーに人があまり参加してくれずギャザ感がなかったと開催後の打ち合わせで反省が話に上がった。
やり方を一度見直そうとなった。
社内でHackDayを開催すると、社内の申請が必要など大変なことも。
運営会社を利用すると自分たちの負担は軽くなるものの、きちんと費用を用意しなければいけなかったり、成果物の期限を切ってしっかりとアウトプットしないといけない苦労も。。
かといって会社の施設を利用すると事前申請など施設の利用にいろいろと制約があったりといった問題も発生。


# フェーズ３

一般社団法人化は2016。税処理をしないといけなくなってきた。
第２回目まではスクラムのカンファレンスなのに、カンファレンスの開催はウォーターフォールだという話をしていたが、第３回目からはなれもあり”スクラム”ぽくカンファレンスの運営をできるようになってきた。
周囲からも「来年も来たい」「学びがたくさんあった」など予想以上の反響があった。

みんながなんで「いい」って言っているかは半分分からない状態。会場の外でも盛り上がるようになった。廊下が使いやすいってことになって、廊下で勝手に話している人が増えてきた。

年１のカンファレンスだと運営の人が燃え尽きて交代するとかが起こっていた。
学生のイベント運営とかは一度開催すると次の世代に引き継いで終わり。

普通のカンファレンスは毎年テーマを打ち出しているが、RSGTではテーマを打ち出していない。テーマは大きく変えてない。
負担をかけないでできることが継続の秘訣のようでした。（発表社自身はめんどくさいと表現していたが。）

## なぜやめようとしないのか？
羽生棋聖に「なんで将棋をやめないのか？」と聞いても「なんでだろうね〜」と回答が来ると思う。
それと同じようなこと。（川口さん談）
スクラムの呼吸を使える方々は生活の一部と化しているのだろうか。

# フェーズ４

コロナ禍ということもあり開催が危ぶまれたもののAkiさんの強い意志でオンライン開催。
６月のスクラムフェス大阪、9月のXP祭りとスクラムフェス三河はオンライン開催だった。
徐々にオンラインでの開催をする実績が増えてきた。

# RSGT2021

いよいよオンライン。でも、オンサイトでもやりたいからハイブリッド。
会場だけ盛り上がる感じが合って、オンライン側が疎外感を感じがちかも？
両方メイン会場にできるためにはどうすれば、というのが課題。

スクラムの原文の１つとなっている論文を執筆された野中郁次郎先生を知らない人が増えてきた。
野中先生はInnovation Sprintのことを知らなかった。
野中先生ご自身は全然PCを使わない方で、スクラムの原文の１つとなった論文を書いていた野中先生が逆に徐々にスクラムを学んでいったというパラドックスが面白かった。

# 感想

- 今は重鎮となっているような方々が、いかにイベントを作り上げてきたかという話を聞けて。最初はそんなに順調じゃなかった話などは面白かった。また、スクラムのカンファレンスの運営が最初はWF的な進め方であったのに、回を重ねるごとに徐々にスクラム的な進め方になった言うのは、興味部かかった。そういう思考回路をしている人たちなのだろうか。
- 不足した開催費用を自分たちで補填するリスクを負っての開催は強い思いがないとできないなと感じた。今日のイベントが開催されているのも先駆者の方々のおかげなので感謝
- スクラム初心者の自分としては、知らない単語・人名が多いことや雑談ベースのセッションだったため、内容をあまり理解できなかった気もする。こんな世界もあるのか、くらいに思っておこうと思う。
- 2011年からずっと毎年実施してるのがすごいと思った。だんだんスクラムが盛り上がってくる時代の流れを感じる。今後10年、どうなるのかと考えると面白い。
- 最初の想いが見えてきたのと、Discordのチャットで色々補完されていくのと、ですごく面白かった。チームメンバーが知らない世界を開くきっかけになったんじゃないかなと。
- カンファレンスの最初の立ち上げの際のアンチパターンが聞けてよかった。ふりかえりカンファレンス立ち上げるとき気にしないと…
【Vue】computedで引数を渡す方法

computedプロパティに引数を渡す方法。


通常、computedに引数を渡すことができないが、computedの処理の中に関数を書くことで引数を渡すことができる。


```js:通常
export default {
  computed:{
    変数名(){
      return 処理
    } 
  }
}
```

```js:引数あり
export default {
  computed:{
    変数名(){
      return (引数)=>{
        処理
      }
    } 
  }
}
```

ややこしそうに見えるが、
`return 処理`を
`return (引数)=>{処理}`
としただけ。



##追記
変更がある度に自動で再計算をして欲しかったのでcomputedプロパティを使ったが、methodsプロパティに置き換えても全く同じ処理ができた。。（上級者に教えてもらいました）

また、computedは中の処理が他の変数と依存関係にある場合のみ、変更を検知して自動更新する処理となる。

このため、computedの中に依存関係がない場合値は更新されない。

都度、新しい処理を実行する場合はメソッドを使う。


**結論**
引数を渡したい場合はmethodsでいけます。わざわざcomputedを使う必要なし。
【ラビットチャレンジ（E資格）】応用数学

本記事は、E資格の受験資格の取得を目的としたラビットチャレンジを
受講した際の勉強記録およびレポート記事である。
#第2章：確率・統計_レポート
###条件付き確率
事象Bが起こったという条件の下で事象Aの起こる確率は、
$$ P(A|B) = \frac{P(A∩B)}{P(B)} $$
###事象の独立
2つの事象$A,B$が独立であるための必要十分条件は,
$$ P(A∩B) = P(A)・P(B) $$
である。
よってこの場合、条件付き確率は、
$$ P(A|B) = \frac{P(A∩B)}{P(B)}=\frac{P(A)・P(B)}{P(B)}=P(A) $$
となる。
###ベイズ則
$$ P(A∩B) = P(A)・P(B|A) =P(B)・P(A|B)$$
###期待値
事象$X$ = $x_1$, $x_2$, ..., $x_n$
確率変数$f(X) = f(x_1), f(x_2), ..., f(x_n)$
確率$p(X) = P(x_1), P(x_2), ..., P(x_n)$
とすると
期待値$E(f)$は
$$E(f) = \sum_{k=1}^nP(X=x_k)f(X=x_k)$$
となる。
また連続型確率変数$f(X)$の場合、期待値$E(f)$は
$$ E(f) = \int P(X=x)f(X=x)dx $$
となる。
###分散
イメージは、データの散らばり具合。
データの各々の値が、期待値からどれだけズレているのか平均したもの。
$$ Var(f) = E\Bigl(\bigl(f_{(X=x)}-E_{(f)}\bigl)\^2\Bigl) =  E\bigl(f^2_{(X=x)}\bigl)-\bigl(E_{(f)}\bigl)\^2$$
###標準偏差
$$ \sigma = \sqrt{Var(f)} = \sqrt{E\bigl((f_{(X=x)}-E_{(f)})^2\bigl)} $$

###ベルヌーイ試行
コイン投げのように結果が2通りにしかならない確率実験のこと。
試行を繰り返したとき、どの試行においても結果が起こる確率は同じであり、各試行の結果は互いに独立である。
###様々な確率分布
**ベルヌーイ分布**
 ベルヌーイ試行によって得られる確率分布。n = 1 の場合の二項分布に等しい。
$$ P(x|\mu) = \mu^x(1-\mu)^{1-x} $$
**二項分布**
ベルヌーイ分布の多試行版。
1回の試行に対して事象$A$が、起こる確率をλとする。さらに、n回の試行において$x$回だけ事象Aが起こる確率は
$$ P(x|\lambda,n) = \frac{n!}{x!(n-x)!}\lambda^x(1-\lambda)^{n-x} $$
となる。上記式で表される確率分布を二項分布という。
**ガウス分布**
$μ$を平均値、を$σ$標準偏差とすると、ガウス分布の確率分布は以下の式で表される。 
$$ N(x;\mu,\sigma^2) = \sqrt\frac{1}{2\pi\sigma^2}\exp\bigl(-\frac{1}{2\sigma^2}(x-\mu)^2\bigl) $$
tinymce-vueの日本語化対応

**tinymce-vue** (WYSIWYGエディタのプラグイン)の日本語対応。
[tinymce-vue](https://github.com/tinymce/tinymce-vue)を `npm install` でインストールした前提。
ちょっと[公式ドキュメント](https://www.tiny.cloud/docs/configure/localization/)がわかりにくかったので忘備録。

## 本題
下記のダウンロードリストからJapaneseの圧縮ファイルをインストールする。
[Language Packages | Trusted Rich Text Editor | TinyMCE](https://www.tiny.cloud/get-tiny/language-packages/)

展開して下記ディレクトリに配置。

```
node_modules/@tinymce/tinymce-vue/langs/ja.js
```

Vue側でlanguageを指定。

```vue
<editor
  :init="{
    language: 'ja',
    ~省略~
  }"
>
</editor>

```

おしまい。

## 参考
[Localization options | Docs | TinyMCE](https://www.tiny.cloud/docs/configure/localization/)
[PlayCanvas] スクリプトの動的追加・削除

# 概要
実行中に特定の属性を持つ、もしくは与える為に後からスクリプトを追加したい場合の方法と、既に処理が完了し、残しておく必要が無いスクリプトを削除したい場合の方法。

# 実装例
## 追加
``` javascript:addSample.js
var AddSample = pc.createScript('addSample');

AddSample.attributes.add('name', {type: string, default: 'None'});

AddSample.prototype.initialize = function(){
    console.log('Hello, ' + this.name);
};
```

``` javascript:main.js
var Main = pc.createScript('main');

Main.prototype.initialize = function(){
    // Scriptコンポーネントがあるかをチェックする ※今回の場合は本来不要
    if( this.entity.script ){
        // create()で追加する
        // 第2引数でアトリビュートの初期化も可能
        this.entity.script.create('addSample', {
            attributes: {
                name: 'John'
            }
        });
    }
};
```

一度だけコンソールに挨拶を表示するスクリプト **addSample** を初期化時に追加しています。
**create()**できるのはレジストリに登録されたスクリプトだけなので、PlayCanvas上のScriptの設定で**Preload**の項目にチェックが入っているスクリプトでのみ可能な方法です。
**create()**できない場合はコンソールに下記のような警告が表示されます。

``` 
script '指定したスクリプト名' is not found, awaiting it to be added to registr
```

## 削除
``` javascript:main.js
var Main = pc.createScript('main');

Main.prototype.destroyUsedScript = function(){
    // Scriptコンポーネントに削除したいスクリプトがあるかをチェックする
    if( this.entity.script && this.entity.script.has('addSample') ){
        // destroy()で削除する
        this.entity.script.destroy('addSample');
    }
};
```

指定したentityから指定したスクリプト名のスクリプトを削除するというシンプルな処理です。
今回はスクリプトを持っているかを判定していますが、なくても警告は出ません。(2020/11/05現在)
Module 'SOMETHING' was created for incompatible target arm64-apple-ios8.0 とでてiOSアプリがビルドできない

今まではビルドできていたアプリがXcode12にアップデートしてからエラーがでてiOSアプリがビルドできなくなりました。

#  環境

- Xcode12
- Carthage

# エラー

ビルドするとCarthageでインストールしているフレームワークのビルドエラーが出ました。
![スクリーンショット 2020-11-05 19.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197742/70a55e2b-62f9-5b05-0a67-7eda7d91cdc9.png)

# 解決方法

以下を参考に targets > Build Settings の `Excluded Architecture` に `arm64` を追加するとビルドできるようになりました。

https://stackoverflow.com/questions/63607158/xcode-12-building-for-ios-simulator-but-linking-in-object-file-built-for-ios/63955114#63955114

![スクリーンショット 2020-11-05 19.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197742/2805e2b7-43f6-f6e6-39d0-f30d9130746c.png)
Sprockets::FileNotFound　//= require highcharts/highcharts　解決方法

# はじめに
rails server をしたときに　Sprockets::FileNotFound
で困ったのでその解決方法について書いておきます。
私自身初学者で間違ったことを書いていることがあると思うので、是非アドバイスをお願いします！！
## 環境
rails 5.2
ruby 2.5.1
mysql5.7
## エラー
rails sever Sprockets::FileNotFound
//= require highcharts/highcharts
というエラーでrails server　を立ち上げることができなっかった。

##  解決方法
```
//= require highcharts/highcharts
```

のところを

```
//= require highcharts/highcharts
```
に直すという簡単なものだった。
ここの原因がわからず2時間ぐらい詰まってしまったので同じ境遇の人は試して見てください!!
Oculus Quest2-WindowsPCのアクセス許可

UnityでOculus Quest2アプリのビルドを試す時に引っかかっていたので完全自分用にメモします。
##準備

* Windows10
* Unity 2020.1.7f1
* AndroidSDKがUnityHubの「モジュールを加える」からチェックを入れて追加してある
* Unity側でPlayer項目のOculus設定をしてある
* PlayerSetting > OtherSettings > MinimumAPILevel をAPILevel 23に設定

などが前提です。詳しくはこちらなどを参考に（https://qiita.com/pira/items/1c935f30d5ba6c020333）

##Unityビルド失敗

>Make sure USB debugging has been enabled and 
that the device has authorized this computer.Check your device

どうやらPC-Oculusでアクセス許可認証ができていないためらしい
しかしUSB接続してもそんな画面が出なかったような・・・自分だけ？

#解決

https://developer.android.com/studio/releases/platform-tools?hl=ja

ここからSDK Platform-Toolsをダウンロード

コマンドプロンプトを開いて、カレントディレクトリコマンド`cd`  でダウンロードしたフォルダのパスにセット

`adb devices` で接続されているOculusデバイスの情報が表示されます。

デバイスの最後に `unauthorized` と表示されていたら、Oculusを装着。すると
許可するかどうかの画面が出てる・・・やったー・・・半日かかりました
後は通常通りにやったらビルド成功しました。

##ついでに
OculusLinkでビルドしなくてもEditorからデバッグできるできるやつは
PlayerSetting > XR Plug-in Management > PCタブ
Oculusにチェックを入れたらできました。結構気付かなくてなんで動かなかったのか分からずずっと探してました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516386/7f741b05-b4da-b994-2262-37a92afd0bbe.png)