OmniAICreator/Qiita-1.07M huggingface dataset:
【ReactNative】Androidリリースビルド時のメモ(2019/10/28 追記あり)

## はじめに

ReactNativeで開発しているアプリが完成の運びとなりました。
ストア公開はまだ先なのですが、リリースビルド時の手順を備忘として書いていきます。

## keystore作成
リリースビルド作成に先立ち、keystoreファイルの作成が必要です。
keystoreファイルとはざっくり説明すると「開発者である個人または法人を特定するもの」です。

作成にはプロジェクトルートで下記のコマンドを実行します。

```:cmd
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
```
対話形式でいくつかの質問(名前やらパスワードやら)に回答します。
回答し終えると`release-key.keystore`が作成されるので、これを
`android/app`に移動します。

## gradle.propertiesを修正
`android/gradle.properties`に先ほど入力したパスワード等を記入します。PC全体の設定としたい場合は`~/.gradle/gradle.properties`の方を修正してください。

```gradle.properties
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=【ストアパスワード】
MYAPP_RELEASE_KEY_PASSWORD=【キーパスワード】
```

## build.gradleを修正
`android/app/build.gradle`を`gradle.properties`の値を参照するように修正します。

```build.gradle
...
android {
    /* 略 */
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            /* 略 */
            signingConfig signingConfigs.release
        }
    }
}
```

## android直下でリリースコマンドを実行

```:cmd
cd android
gradlew assembleRelease
```

これで`android/app/build/outputs/apk/release`に`app-release.apk`が作成される...はずでしたが、自分の場合は下記のエラーに遭遇しました。

```:cmd
Execution failed for task ':app:mergeReleaseResources'.
...
com.android.builder.internal.aapt.v2.Aapt2Eception: Android resource compilation failed
【対象リソースパス】: error: failed to read PNG signature: file does not start with PNG signature.
```

どうやらプロジェクト内で使っていたPNGファイルのフォーマットがおかしかったようです(思えばスプラッシュのテストに使う画像の拡張子をjpgからpngにリネームしただけだった)。

上記を修正したところ正常にapkファイルが書き出されました。
やったー！

# 追記.GooglePlayStoreに公開できる状態にする
GooglePlayStoreに公開するためには、最適化と署名が必要になります。


## Android直下でzipalignを実行
```:cmd
zipalign -f -v 4 app/build/outputs/apk/release/app-release.apk my-app.apk
```

## zipalignしたAPKファイルに署名する
```:cmd
apksigner sign --ks app/my-release-key.keystore --ks-key-alias my-key-alias my-app.apk
```
keystore作成時に設定したパスワードを求められるので入力します。

これでGooglePlayStore公開可能なAPKファイルが作成されました！
完全非IT人がGoogleAppsScriptを知って2日で椎名林檎名曲botを作れた話

##自己紹介
はじめまして。かわしまです。
これまで完全非ITな業界で働いていましたが、ちょうど１年程前、IT業界に足を踏み入れました。といっても、所属は人材サービス系の部署なので、いまのところエンジニアの仕事とはある意味無縁です。
###エンジニアさんてすごい
新卒で某鉄道系大手不動産会社に入り、不動産売ってる時、「あ、職業SEね、はいはい、~~みんな鬱罹患してるんでしょ~~。住宅ローン組めないから客じゃないわ、ハイ帰った帰った」みたいな認識しか持ちませんでした。本当に本当にごめんなさい。
しかし！やっと！今更！わかりました。これからの時代はエンジニアだし、エンジニアさんてすごい。かっこいい。
###私もやってみたい！！
IT業界をチラと覗いてよく分かりましたが、ちょっと触ったぐらいで仕事に出来るような甘い世界ではないらしい。でも、かっこいいな・・・かじってみたい・・・
そう思い至り、まずVBAに触れてみました。
とりあえず本屋で平置きされている中で、１番易しそう＆優しそうだった「[スラスラ読める Excel VBAふりがなプログラミング](https://www.amazon.co.jp/%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E8%AA%AD%E3%82%81%E3%82%8B-Excel-VBA-%E3%81%B5%E3%82%8A%E3%81%8C%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%81%B5%E3%82%8A%E3%81%8C%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4295004812)」。この本で挫折する人は（多分）絶対いない。
その後、[ドットインストール](https://dotinstall.com/lessons/basic_excel_vba)のExcel VBA入門にもお世話になり、仕事で使えるちょっとした便利グッズをつくれる程度のレベルでうろうろ遊んでいました。
##「Gmailを動かしたいんですけど」
７月末、仕事をしている折、特定のアドレスにメールを送信した時刻と、返信があった時刻のデータを分析したくなった私は、飲み友達のサーバーサイドのエンジニアさんに聞きました。
「手作業で見つけていくこともできるけど、さすがにアホなんで、自動でなんとかならないですかね・・・」
『それならGoogle Apps Scriptじゃないですか』
「そ、それはいったい何者！？？？」というやりとりをしたのが３日くらい前のこと。
###GASもVBAも、初心者に優しい。
私のような「サーバー？って？画面がついてないパソコン？なんでしょ？」って感じの、インターネットの仕組みすら知ってるか怪しい非IT人間にとって、VBAとGASは圧倒的に優しいんです。
本当はPythonとかやってみたいけど、「で、その文章を書く画面はどうやったら現れるの？」っていう壁があまりに高すぎる。（壁が高いのではなくレベルが低い）
環境構築っていうんですか？非IT人間には、その最初の１歩が難関すぎるのよ・・・

その点VBAは、Excel開いて「alt」＋「F11」さえ押せば、ここに書いてねっていう窓が出てくるし、GASはツールバーから「スクリプトエディタ」を開ける。
書く場所が分かれば、もうこっちのもんです。その先だいたいのことは、ググれば出てくるんですもの。

##椎名林檎の名曲をつぶやくBotを作って基礎を学ぶ
本来の目的であった、「GASでGmailを動かしたい」はさておき、まずは触ってみて慣れることを目標にしました。
もう、めちゃめちゃ、手取り足取りお世話になったブログがこちら。
「[超初心者向けGASでBotを作りながら基礎を学ぶ](https://tonari-it.com/google-apps-script-manual/#toc2)」
え？？こんなに丁寧に分かりやすくタダで教えてもらえちゃっていいんでしょうか？？IT系の人々の、ナレッジはどんどん公開していくんだぞ！ってスタンスって、かっこいいよね。
###びっくりする程すぐできた（Chatworkです）
VBAをちょこーっとかじっていたから、抵抗感無かったというのは大きいとは思うのですが、拍子抜けする程すぐできた。↓↓↓
![コメント 2019-08-01 160645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295560/bbcdb712-30f6-97f6-577e-1b8da55f7516.png)
**黙々と椎名林檎の名曲を私の推薦文と共につぶやくだけのBotです。**
先ほどのブログの手順に従っていじっていっただけ。その割に、コストパー嬉しさが高すぎる！！非IT人間にとっては、大いなる一歩です。

```javascript:
function myFunction(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var maxRow=sheet.getDataRange().getLastRow();
  var numRow=Math.floor(2+Math.random()*(maxRow-1));
  var token = PropertiesService.getScriptProperties().getProperty('CWTOKEN');
  
  var strBody="[info][title]本日の１曲[/title]『 "+
    sheet.getRange(numRow,1).getValue()+"』 / アルバム「"+
    sheet.getRange(numRow,2).getValue()+"」より / "+
    sheet.getRange(numRow,3).getValue()+"\n[hr]"+
    sheet.getRange(numRow,4).getValue()+"[/info]";
     

  var cw=ChatWorkClient.factory({token:token});
    cw.sendMessage({
      room_id:*****,
      body:strBody 
    });
}
```

なんか、背景が黒いと一気に、ぽくなりますよね。笑
本当は、何か話しかけたら名曲を返してくれるチャットbot風にしたいのですが、一気に難しくなるようで、一旦心折れました。パラメータって何！？！？
そういうのを分かりやすく教えてくれる教材はどこかにないものでしょうか・・・
Qiitaユーザーの大半の想像を上回る程度の非IT人間でもわかるやつ・・・


あ、あと遊んでいるばっかりではなく、GASに触れた1日目はメールを自動で配信するやつを作りました。ちゃんと仕事には（一部）活かしています。
Windows 8.1/10 > Taskbar > タスクバーに登録できないソフト > レジストリ: IsHostAppがあるため > 対処: インストーラと実行ファイル名を同じ名前にしない + トラブル後の対処 (Windows10はさらに複雑)

```txt:確認環境
Windows 8.1 Pro(64bit) 
Windows 10 Pro (64bit)
```

### 概要

作成したソフトをタスクバー登録しようとしたが、「タスクバーにピン留め」が右クリックのコンテキストメニューに登場しない。

タスクバーにドラッグしても登録できない。


### 関係するレジストリ

以下が関係することが分かった。

```
HKEY_CALSSES_ROOT\Applications\[ファイル名].exe
IsHostApp: REG_SZ
```

- https://www.pg-fl.jp/program/winreg/classes.htm
    - > (val) IsHostApp = ""
    - > ホストアプリは単体で起動してもタスクバーやスタートメニューにピン留めすることができなくなりますが、ショートカットから引数付きで起動された場合はピン留めすることができます(引数がない場合はピン留めできません)。

情報感謝です。

### 対処

IsHostAppの登録をレジストリから消す。

これで「タスクバーにピン留めする」が右クリックのコンテキストメニューに表示されるようにうなった (詳しい対処については後述を参照）。


### そもそも

そもそもIsHostAppがなぜレジストリに登録されたのか。

ソフトのインストーラーを実行することで、レジストリにIsHostAppが登録されることを確認した。

インストーラの設定によるのだろう。


### 原因

下記の原因だったようだ。

- インストーラの名前と実行ファイル名を同一にしていた

インストーラ起動時に、その名前のファイルは「ホストアプリ」として認識 (IsHostAppが登録される）。
その後は、同じ名前の実行ファイル名はタスクバーに登録できない。

### 対処

- インストーラと実行ファイル名を同じ名前にしない



## トラブル後の対処

タスクバーに登録できなくなった状態からは以下の作業で対処する。
Windows 8.1においては下記の手順1までで十分であった。
Windows 10において下記の手順2が必要であった。

### 1. レジストリ

`HKEY_CALSSES_ROOT\Applications\[ファイル名].exe`にある`IsHostApp: REG_SZ`を消す。

### 2. TaskBarフォルダ

手順1のレジストリ変更後に「タスクバーにピン留めする」が右クリックのコンテキストメニューに表示されるようになるが、Windows 10では「タスクバーにピン留めする」を選択してもタスクバーに登録されない。

さらに、以下を実施する。

- 2-1. 以下の場所をExplorerで開く
    - `C:\[ユーザ名]\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar` または`%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar`
        - <font color=red>`User Pinned`は隠しフォルダのため、Explorerで直接入力すること</font>
- 2-2. その場所(TaskBarフォルダ)にショートカットをコピーする (exeファイルでなく、ショートカット)
- 2-3. そのショートカットを削除する

この操作により.exeファイルの右クリック時の「タスクバーにピン留めする」が正常に動くようになる。

<font color=red>Note: タスクバーからピン留めを外したソフトは「タスクバーにピン留めする」が無効になる。再度、上記の手順2を行う。</font>

### 関連情報

- [Fix duplicate icon issues on the Windows taskbar](https://www.ghacks.net/2015/08/04/fix-duplicate-icon-issues-on-the-windows-taskbar/)
    - > Windows stores all pinned icons, taskbar and start menu, in a central location. Open Windows Explorer (File Explorer) and load the following path in it: `%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar`
Java通信APIのまとめ（一）Socketの使い方

### はじめに
今回では、Java通信APIの使い方を簡単にまとめてみます。まずはSocketの使い方を紹介してみましょう。
Socketは元々のjavaの通信APIの一つです。一般的に、tcp(udp?)コネクションをベースに、サーバ側もクライアントも通信できます。
### ServerSocket(サーバ側)の使い方
以下のソースの通り、サーバを作ろう。  
 
   - 通信用のServerSocketを作る

   - クライアントとのコネクションを取る

   - ストリームを取ってクライアントからのデータ情報を読み込む

   - ストリームを取ってクライアントへデータ情報を書き出す

```Server.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
   public static void main(String[] args) {
      try {
         ServerSocket serverSocket = new ServerSocket(6666);
         System.out.println("server start....");
         Socket s = serverSocket.accept();
         // ログ出力
         System.out.println("client:"+s.getInetAddress().getLocalHost()+"access successed");
         
         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
         //クライアントからのデータ情報を読み込む
         String mess = br.readLine();
        // ログ出力
         System.out.println("client:"+mess);

         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
　　　　　
　　　　　//クライアントへデータ情報を書き出す
         bw.write(mess+"\n");
         bw.flush();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
```

### Socket(クライアント側)の使い方
   - Socketのインスタンスを作ってIPとPortを設定

   - ストリームのインスタンスを取る

   - サーバへ送信

   - サーバからの返信を読み込

```Client.java 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class Client {
   public static void main(String[] args) {
      try {
         Socket s = new Socket("127.0.0.1",6666);
         
         //ストリームのインスタンスを取る
         InputStream is = s.getInputStream();
         OutputStream os = s.getOutputStream();
         
         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
         //サーバへデータ情報を送信
         bw.write("client -> server:hello server! \n");
         bw.flush();
         
         //サーバからの返信を読み込む
         BufferedReader br = new BufferedReader(new InputStreamReader(is));
         String mess = br.readLine();
         // ログ出力
         System.out.println("server："+mess);
      } catch (UnknownHostException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

```

### 最後に

最後まで読んでいただき、ありがとうございます。
今度はHttpURLconnectionの使い方をまとめます。
Linuxでdocker-composeをroot以外のユーザーで使用する設定

Linuxでdocker-composeをroot以外のユーザーで使用する時にグループを設定する必要があるのでメモしておく。

usernameというユーザーに設定する前提で解説する。

wheelグループを追加する。

```
$ sudo usermod -aG wheel username
```

dockerグループを追加する。

```
$ sudo usermod -aG docker username
```

現状のコンソールだと反映されてないので、新しいコンソールを立ち上げて追加されているか確認する。

```
$ groups
username wheel docker
```

docker-composeのインストールは公式サイトを参照する。
[Install Docker Compose](https://docs.docker.com/compose/install/ "Install Docker Compose")

現時点のインストール方法は下記を実行する。

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```
証拠があっても、「ない」のと同じことになってしまう事象への取り組み。仮説（132）

メールでIDがあって送った記録があっても、「メールなんかで連絡するな」。

電話で連絡しても、「聞いてない」。

直接会って話しても、「いそがしかったから聞いてなかった」。

配達証明で郵送しても、「こんな大事なことを郵送で済ますな」。
https://www.post.japanpost.jp/service/fuka_service/haitatsu/index.html

ありとあらゆることは、否定できる。

証拠があっても、それを証拠として認めない論理を展開する。

門前払いの類。

当方が、間に入ってなんとかしようとすると、なんであんなところに話しをしたんだと怒り出す。
これが、いちばん、あるあるです。

# 対策案１　公開
機密事項以外は、すべて公開することを原則とする。

個人宛に送っているから、門前払いを食う可能性がある。

社会全体に発信して、その人のまわり全員が知っているようにする。

仕事場だけでなく、個人で活動しているところすべて。

情報包囲網を作るしかない。

# 対策案２　体系的な発表。
公開が、個別の件ごとの情報発信であるのに対して、
体系的な発表とは、数個の情報発信の社会的な価値を、
学会等で発表する。

ある情報発信が、どのように成果を生んだかを、３つ以上の事例の、
社会的制約条件、生命的制約条件、物理的制約条件、論理的制約条件と、
ありとあらゆる学問領域の成果を利用して発表する。

# 対策案３　機密事項の取り扱い
機密事項については、１、２の方法は取れない。
そこで、特許、規格、論文、法律上の意味と、
社会的制約条件、生命的制約条件、物理的制約条件、論理的制約条件とともに記述して、
機密事項を共有している関係者に review を依頼する。

ある組織内では機密事項だと言っていることが、
たんに不要な情報を保持しているだけで、役に立たないので捨てた方がよいことがわかることがある。

あるいは、もっとすぐに次の手をうった方がよいことがある。

# 対策案４　別の案件に集中する
緊急性が高く、人命が関係する案件に集中する。

何か、苦情があれば、人命に関係する案件が終わったら着手しますという。

## 4-1
愛知県は交通死亡事故１位が連続していました。

仮説（２１）交通事故死を減らすのにプログラマが協力できる仮説13選
https://qiita.com/kaizen_nagoya/items/4d46bbf0dde44d7bb99a

## 4-2
原子力発電所事故の国際規格に基づく分析が未実施です。
安全（２０）安全分析（HAZOP）の際の声かけ
https://qiita.com/kaizen_nagoya/items/381649a6ea025ecba173

## 4-3
医療システムが少し便利になれば、助かる人がいるかどうかの検討

安全（１９）医療システムをHAZOPで分析する
https://qiita.com/kaizen_nagoya/items/16fdc44da4fbb4f12d30

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
サービスリリース時にやるべきことチェックリスト

新しいプロダクトをリリースする前にやるべきことっていろいろありますよね。

特に、決済とかOAuthみたいに外部サービス巻き込む系はAPIKeyの発行に数営業日かかることもあり、リリース日前日に「出してなかった！」とかなるとめっちゃ焦ります。（経験済み）

最近、新しいプロダクトをリリースしてまさにハマったというか、やっちまった経験をしたので同じ轍を踏まないようリストを書いておきます。
皆さんも、これもやったほうが良いぞ！というのがあればコメントにてお知らせください。

## 目次
- 外部サービスのAPIKey発行
- キャッシュ系の動作確認
- DNSまわり
- データベースのバックアップ体制確認
- 死活管理ツールのセットアップ
- GoogleAnalytics設定
- まとめ

それでは、Check it out!

## 外部サービスのAPIKey発行
今回この記事を書くきっかけになったもの。

今回は、twitter認証用と決済サービス用が審査必要にも関わらず、審査を出すのがリリース前々日、しかも出した翌日には追加の説明文を送ってくれ、、と言われるアグレッシブな事態に。

ツイッターは色々なブログを読んでいると7日間かかった、みたいなことも散見されたので焦りました。結果的には追加の説明文を送った12時間ぐらいに審査が通り、無事本番リリースに間に合いました。

決済も同じく。

二度とこの焦り方はしたくない、、


## キャッシュ系の動作確認
今回リリースしたサービスはフロントをnuxt+herokuな構成で進めましたがここにも罠が。

**新しいコミットが全然反映されない！**
**更新すると反映されるからキャッシュだ！**
**けど異様にキャッシュがキツい！**
**しかも同じ状況になってるissueも見つからない！**

キャッシュ系は気付きにくいのと、キャッシュのせいで修正してもクライアントによってエラー内容が変わってくるので予め適切に設定されているか確認しましょう。

ちなみに、今回はnuxt.cinfig.jsに
```
build: {
  analyze: true
}
```

と、オプションをつけっぱなしにしていたことが原因でした。

## DNSまわり
メールを送る際、なるべくスパム認定されない為にドメインのDNSにDKIMレコードやSPFレコードの設定をすることが推奨されています。

が、、今回使っているMTA(sendgrid)とonamae.com のレンタルサーバープランのNSの相性が最高に最悪で、まさかのdkimなど設定できない問題に。

これは今でも続いていて、NSの変更が必要になりました。

## データベースのバックアップ体制確認
無事リリース完了！お疲れ様でした！

と、リリース後数日してバーボン片手にdb設定眺めていたらまさかのノーバックアップ。

死ぬほど焦ってすぐセットアップしましたが、heroku+heroku postgresの環境だとサービスの一時停止とdb移管が必要になります。

深夜にめちゃくちゃ慎重に作業しましたが、リリース前にやってれば安心安全だったよな、と反省。

## 死活管理ツールのセットアップ
まぁリリースした直後にセットしよう、と甘い考えしてたら意外にセットアップかかったので先にやりましょう。

そして、、その際に入れたのがフロントとapiそれぞれが生きてるかの監視だけで、統合的な監視になっていなく、、結果、数日間apiが全然違う方向を向いていたという致命的なミスを起こしました。

原因は少し複雑な設定ミスでしたが、想定してないことが起きたときに気づくのが死活監視。api、db、最低限の動作が問題なくできるか統合的な監視になるよう予め設定すべきでした。

## GoogleAnalytics設定
リリース当日に、あれ、なんか設定変じゃない？と気付いて修正した事案。

もちろん修正作業より前のデータは不正データが入っていて使えません。

トラッキングが正しくできているかももちろん、analytics上でもcvとかは先にセットしないと見れないので予め計測したいデータを洗い出して設定しておきましょう。

## まとめ
振り返ると、「おいおい大丈夫かよ」とか「普通対策うっておくだろ」と思えます。

が、スクラッチからシステム開発する際の怖いところで、やるべきことが多岐にわたるし、責任が分散しがちで本当に抜け落ちていました。

ということで、ここに羅列したものはどれも「もっと早く気づくべきだった！」なことなので、チェックリストとしてキチンと全部潰しておきましょう。
macの画面収録でできるmovをgifに変換するスクリプト


プルリクなど作る際に動くと何作ったのかわかりやすい。

そんな際に使うスクリプトです。

```
brew install ffmpeg
```

```bash:mov2gif.sh
#!/bin/bash

# same speed: $ bash ./mov2gif.sh  hogehoge.mov
# X2     speed:  $ bash ./mov2gif.sh  hogehoge.mov 2

INPUT_FILENAME=$1

ARGSPEED=$2
SPEED=${ARGSPEED:=1}
OUTPUT_FILENAME="$1-x${SPEED}.gif"

echo "${INPUT_FILENAME} -> ${OUTPUT_FILENAME}"

ffmpeg -i ${INPUT_FILENAME} -vf scale=320:-1 -vf setpts=PTS/${SPEED} -af atempo=${SPEED} -r 10 ${OUTPUT_FILENAME}

```


----

後ほど気付いたのですがmov2gifなるソフトウェアがあるのですね。こちらを使えば問題なさそうですね

https://github.com/cakecatz/mov2gif
shiftキーを押しながら、、、

## shiftキーを押しながらは面倒なのです

エクセル等のMS Officeファイルを読み取り専用で開くには、shiftキー + 右クリメニュー → 読み取り専用で開く(R) を押します。

## レジストリ編集

### ファイル形式はUnicode BOMあり

以下のファイルをダブルクリックすれば、**shiftキーを押しながら、、、** とは、お別れ
※コンピュータの管理者権限が必要です

```msoffice.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"


[HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"


[HKEY_CLASSES_ROOT\Word.Document.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Word.Document.8\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\PowerPoint.Show.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DisablePasswordCaching"=dword:00000000

```

## 解説

やみくもにレジストリを書き換えるのが不安な人のために。

#### これはレジストリファイル

`Windows Registry Editor Version 5.00` を先頭に書く必要があります。


#### .xlsx の拡張子を読み取り専用で開く。

`"Extended"=-` でshiftキーを不要にします。
`@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"` は読み取り専用で開くメニューが間違っているので修正しています。

```
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"
```

#### .xls の拡張子を読み取り専用で開く。ry)

```
[HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"
```

#### .docx の拡張子を読み取り専用で開く。ry)

```
[HKEY_CLASSES_ROOT\Word.Document.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-
```

#### .doc の拡張子を読み取り専用で開く。ry)
 
```
[HKEY_CLASSES_ROOT\Word.Document.8\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-
```

#### .pptx の拡張子を読み取り専用で開く。ry)

```
[HKEY_CLASSES_ROOT\PowerPoint.Show.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-
```

#### IEのパスワードキャッシュを有効にする

shift キー関係ない
こういうのが混ざっているから、やみくもにレジストリを変更してはいけないわけです :sweat_smile:

```
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DisablePasswordCaching"=dword:00000000
```

## 残課題


#### コマンドウィンドウをここで開く

shiftキーなしにできませんでした。
以下のキーを削除できればできそうですが、レジストリエディタでも削除できませんでした。

```
[HKEY_CLASSES_ROOT\Directory\Background\shell\cmd]
"Extended"=-
```
【Kinect V2】JointTypeのpositionをスムーズに取得する

#昔作った資産をまたサルベージした
BodyFrameのPositionをColorFrameに変換して画像とかを動かす時に
Positionがガタガタになる問題を解決するために実装した。

#ガタガタするのはなぜか
もはやかなりうろ覚えだがKinectV2はToF方式で計測されており
対象へ赤外線を照射し、それが反射してKinectに戻ってくる時間を元に位置情報を取得している。

このとき対象物に動きがあった場合、射出した赤外線がデバイスに戻ってこないことがあり
それが測定不能値としてPositionが欠損するためにガタガタしてしまう（だった気がする）

#どうやって解消したか
生の値を使用すると欠損があった場合にPosition.x,y,zはNULLないし0となってしまうので
ここを補完する必要がある

なので位置情報のバッファを取っておいて前後の値で穴埋めすれば解決するはず、
という結論に達した。

以下ソース。
Queueを使用して位置データを保持するDictionaryに、指定した数の履歴を追加しておき
Dictionary内に保持されたPositionを平滑化する（平均値で動かす）
Smoothing関数にJointTypeとそのフレームにおけるPositionを渡せば
平滑化されたPositionが返却される。
今気づいたがz軸が考慮されてねぇ。

```C#
using System;
using System.Windows;
using System.Collections.Generic;
using Microsoft.Kinect;

namespace Microsoft.Samples.Kinect.BodyBasics
{
	class SmoothingPoint
	{
		private static Dictionary<JointType, Queue<Point>> pointBufferS = new Dictionary<JointType, Queue<Point>>();
		private static Dictionary<JointType, Queue<Point>> pointBufferE = new Dictionary<JointType, Queue<Point>>();

		public SmoothingPoint()
		{
			foreach (JointType jt in Enum.GetValues(typeof(JointType)))
			{
				pointBufferS.Add(jt, new Queue<Point>());
				pointBufferE.Add(jt, new Queue<Point>());
			}
		}

		public Point Smoothing(JointType jType, Point p)
		{
			return DoubleMovingAverage(jType, p);
		}

		private Point SimpleAverageFilter(JointType jt, Point newPoint, int parameter)
		{
			pointBufferS[jt].Enqueue(newPoint);
			if (pointBufferS[jt].Count <= parameter)
			{
				return newPoint;
			}
			pointBufferS[jt].Dequeue();
			Point[] list = pointBufferS[jt].ToArray();
			Point point = new Point();
			double x = 0;
			double y = 0;

			int n = pointBufferS[jt].Count;
			for (int i = 0; i < pointBufferS[jt].Count; i++)
			{
				Point p = list[i];
				x += p.X;
				y += p.Y;
			}
			point.X = x / n;
			point.Y = y / n;

			return point;
		}

		private Point DoubleMovingAverage(JointType jt, Point newPoint, int parameter = 5)
		{
			Point newSimpleAverage = SimpleAverageFilter(jt, newPoint, parameter);
			pointBufferE[jt].Enqueue(newSimpleAverage);
			if (pointBufferE[jt].Count <= parameter)
			{
				return newSimpleAverage;
			}
			pointBufferE[jt].Dequeue();
			Point[] list = pointBufferE[jt].ToArray();
			Point point = new Point();
			double x = 0;
			double y = 0;

			int n = pointBufferE[jt].Count;
			for (int i = 0; i < pointBufferE[jt].Count; i++)
			{
				Point p = list[i];
				x += p.X;
				y += p.Y;
			}
			point.X = x / n;
			point.Y = y / n;

			return point;
		}
	}
}
```
iPhoneで縦向き撮った画像が横向きに回転しちゃうよーん！

# 縦で撮影した画像が横に回転している
まずは『Exif情報』というものが何かを理解する

##### ↓フロント系はこの記事が素晴らしかった
[iPhoneからアップロードしたJPEG写真が横向きになる問題(EXIF, Orientation)](https://qiita.com/RichardImaokaJP/items/385beb77eb39243e50a6)

##### ↓色々と全体を把握するために見た記事
http://www.glic.co.jp/blog/archives/88
https://qiita.com/uda0922/items/c83c239eb32ed295fca8
https://qiita.com/k-holy/items/2ed10bdcf53181bb695d

##### ↓PHP側の最終解決策
https://stackoverflow.com/questions/50277697/laravel-is-rotating-the-image-when-uploaded

## 前談
iPhoneで撮影した画像だと起きる現象と言われたので
SlackでMacに画像を送信してローカルで試してみると再現しない…

なにこれ！？

AirDropで送って見ると再現する。
画像の拡張子は`.HEIC`…なにそれ！？！？

調べて見るとiOS11辺りで導入された.jpegよりも効率のいいファイル形式なのだとか、、、
そして対応OSがとても限られている…

HTMLの`<input type="file" accept="image/*">`にすると
Mac上では.HEIC形式の画像を選択することすら出来ない始末…

じゃあ何でiPhoneだと選択できるんだよ！！
と思ったらモバイルSafariでは.HEICを自動で.JPEGによしなに変換してくれているのだそう。

ほーん。
それじゃあ、ローカルでは`accept`指定外して.HEICも[このサイト](https://www.apowersoft.jp/heic-to-jpg)
使って.JPEGに変換して実験してやろうじゃないの！！

## Exif情報のorientationを見てみた

上のリンクの記事を見ればわかるのでざっくりいきます。
横向きに回転してしまう画像のOrientationは6になっていました。

```php
$image = // 画像
$exif_data = @exif_read_data($image);
echo $exif_data['Orientation'];
// 6
```

>Orientation = 1 は、Exif画像ファイルに保存されたデータの行0と、表示画面でのvisual topを、列0とvisual leftを、それぞれ一致させて表示する場合に記録する。
Orientation = 2 は、Orientation = 1 を左右反転したものに相当する。
Orientation = 3 は、Orientation = 6 を時計回りに90度回転したものに相当する。
Orientation = 4 は、Orientation = 3 を左右反転したものに相当する。
Orientation = 5 は、Orientation = 6 を左右反転したものに相当する。
Orientation = 6 は、Orientation = 1 を時計回りに90度回転したものに相当する。
Orientation = 7 は、Orientation = 8 を左右反転したものに相当する。
Orientation = 8 は、Orientation = 3 を時計回りに90度回転したものに相当する。

じゃあお手製で画像をクルクル回すコード書いてやればいいんやろ？？
と思いImageMagickやらimagickやらを使ったパターンや
PHPのGDを使ったパターンなど一生懸命構想を練ったものを実装していたんですが…

## Image::makeを使えばかんたん！

下記は[これ](https://stackoverflow.com/questions/50277697/laravel-is-rotating-the-image-when-uploaded)のコードをそのまま移したものです。

```php
$img = \Image::make($request->file('image_file')->getRealpath());
$img->orientate();
```

私がlaravelで実装した時はこんな感じ

```php
<?php
namespace 省略

// 省略
use Image; // この子が活躍します。

class hogeController extends Controller
{
    public function save(Request $request)
    {
      // 沢山省略
      $orgImage = $request->image;
      $image = Image::make($orgImage->getRealPath);
      // サイズ変更したり、あんなことやこんなことをする
      
      // ↓これでOK
      $image->orientate();

      // 省略
    }
}

```

## 独自で書きたければ

一番上に並べてあるリンクのコードの抜粋です。
これなら自分でメソッド作って自由な処理を入れられますね！

```php
$exif = exif_read_data($request->file('image_file'));
if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']) {
        case 8:
            $image = imagerotate($image,90,0);
            break;
        case 3:
            $image = imagerotate($image,180,0);
            break;
        case 6:
            $image = imagerotate($image,-90,0);
            break;
    }
}
```
さくらVPSでCentOS7 ９．環境のバックアップ

# はじめに

自由にテスト出来るLinuxのサーバーがほしくて、さくらVPSで構築してみました。
順次手順をアップしていく予定です。

今回は、環境のバックアップです。
さくらVPSにはバックアップ機能が無いようなので、ツールをインストールしました。
バックアップツールは「MondoRescue」を、圧縮には「LZO」を使用します。

#目次

1. [申し込み](https://qiita.com/Qsugi/items/9239f93f35967e567b5b)
2. [CentOS7インストール](https://qiita.com/Qsugi/items/4cc4ba9983191a306b19)
3. [SSH接続](https://qiita.com/Qsugi/items/45772c8a71a31bd0d3c8)
4. [Apache・PHPインストール](https://qiita.com/Qsugi/items/bf9740f31b4c42eaad91)
5. [MariaDBインストール](https://qiita.com/Qsugi/items/7798669338b555f4ea8d)
6. [FTP接続](https://qiita.com/Qsugi/items/6f383694f60913abb948)
7. [sftp接続](https://qiita.com/Qsugi/items/a8328a116218b058a8bf)
8. [phpMyAdminインストール](https://qiita.com/Qsugi/items/8b6f5b457285140b2ca2)
9. 環境バックアップ
10. [Ruby On Railsインストール](https://qiita.com/Qsugi/items/c7e69a6761f125846bff)
11. [RailsプロジェクトをGitで共同開発](https://qiita.com/Qsugi/items/3c31cfeffee288c05d5e)


#９．環境のバックアップ

## インストール

MondoRescueとLZOをインストール

```
$ cd /etc/yum.repos.d/
$ sudo wget http://www.mondorescue.org/ftp/centos/7/x86_64/mondorescue.repo
$ sudo yum -y install mondo lzop
```

このまま動かすとCentOS7では容量不足のエラーが出るようなので、以下の設定をしておきます。

エディタを起動し、/etc/mindi/mindi.confを開きます

```
$ sudo vi /etc/mindi/mindi.conf
```

以下を追加

```
EXTRA_SPACE=524288
BOOT_SIZE=131072
```

以上でインストールは完了です

## バックアップ

バックアップ用のフォルダを作成

```
$ sudo mkdir /backup
```

バックアップ実行

```
$ sudo mondoarchive -Oi -L -N -s 5000m -d /backup -E /backup
```

使用したオプションは以下です

| オプション | 内容 |
|:--|:--|
| -O | バックアップ実行 |
| -i | バックアップデータをISOイメージで出力 | 
| -N | ローカルディスクのみバックアップ対象とする |
| -s size | CD/DVD, ISOの最大サイズ |
| -d path | バックアップイメージの出力パス |
| -E path | 除外するディレクトリ(パイプ区切り) |

## 毎日バックアップしたいなら

私のサーバーはテスト用なので、アプリのインストール前とかにバックアップを作成し、FTPでローカルパソコンに転送して保存しています。

毎日バックアップするならば、スクリプトで自動化した方が良いと思います。
/etc/cron.daily/にスクリプトを置いておくと、毎日実行されます。

※ただし、/backupに貯めてもおいてもバックアップにはなりませんので、/backupを何処かのオンラインストレージ等にマウントして、データをサーバー外部に保存できるようにする必要があると思いますが、今回はそこまではしませんのであしからず。

```
$ sudo vi /etc/cron.daily/auto_backup.sh
```

以下の内容を打ち込みます
何日前まで残すかは、-mtime の引き数で決まります。
-mtime +3 だと、4日前～過去のデータが削除されます。

```
#!/bin/bash
today=$(date +%Y%m%d)

#Backup_日付.isoのファイル名でバックアップ
mondoarchive -O -i -N -L -s5000m -E"/backup" -d /var/tmp -p Backup_${today}
#バックアップイメージを移動
mv /var/tmp/Backup_${today}-1.iso /backup
#古いバックアップイメージを削除
find /backup -type f -mtime +3 -exec rm -f {} \;
```

実行権限を与えます

```
$ sudo chmod 755 /etc/cron.daily/auto_backup.sh
```

#次回

前回：[phpMyAdminインストール](https://qiita.com/Qsugi/items/8b6f5b457285140b2ca2)
次回：[Ruby On Railsインストール](https://qiita.com/Qsugi/items/c7e69a6761f125846bff)
react-routerでページ遷移の整合性を担保する

# やりたいこと
直前のページからの遷移かどうかを簡易的に確認し、違っていたらトップに戻す。
例えばお問い合わせページの完了画面に直接アクセスされた（確認画面からの遷移でない）ときなどに使いたいテクニックです。

# 実装
react-routerでユーザーのインタラクションに依らないページ遷移を実現する方法としては以下が挙げられます。

```react
props.history.push('/foo')
<Redirect to='/foo' />
```
ただし、上記のいずれかで遷移した場合、遷移した先では遷移元が不明なので、「本来想定しているページから遷移してきたか」が判別できません。
そこでちょっと加工してやります。

```react:PageA.jsx
import { withRouter } from 'react-router';

class PageA extends React.Component {
  constructor(props) {
    super(props)

    // NG
    props.history.push('/page_b');

    // OK
    props.history.push({pathname: '/page_b', state: { referrer: '/page_a' }});
  }

  render() {
    return <div></div>;
  }
}

export default withRouter(PageA);
```
もしくは

```react:PageA.jsx
import { Redirect } from 'react-router';

class PageA extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {
    return <Redirect to={{pathname: '/page_b', state: { referrer: '/page_a' }}} />;
  }
}

export default PageA;
```

そして遷移先のページで

```PageB.jsx
import { withRouter } from 'react-router';

class PageA extends React.Component {
  constructor(props) {
    super(props);

    // PageAからの遷移でないと判断したときはトップページに飛ばす
    if(!props.location.state.referrer) props.history.replace('/');
  }

  render() {
    return (
      <div>Page B</div>
    )
  }
}

export default withRouter(PageB);
```



# 解説
props.historyは以下の4つのプロパティを持っています。

- pathname
- hash
- search
- state

このうちstateは任意の値を持たせることができるので

```javascript
{ referrer: '/page_a' }
```
という値をprops.history.push()ないしRedirect toする際に設定してやり、
遷移先で取得→判別するという流れになります。
作用と副作用。仮説（131）

この文章は、プログラムを記述したことがない人が、関数の作用と副作用を理解するための実験かもしれません。

力学を理解していない人が、作用と反作用を理解するきっかけになるといいかもしれません。

記述していることが正しいかどうかを課題としていません。

記述している論理展開、事象描写が、関数の作用と副作用の理解に役立つことなのかどうかを検討するための記述です。

正しいことをいくら並べ立てても、物理現象との相似性がわからなかったり、
工学で問題を解こうとしているのに問題が解けなければ意味がありません。

正しいことをいくら並べ立てても、必要な時間内に終わらなかったり、
必要な時間内に伝達できなければ、無駄でしかないかもしれません。

正しいことと、意味があることは、直交しているかどうかはわかりませんが、方向が異なると感じているといいかもしれません。

プログラミングは、何か正しいことをしようとしている論理世界だけでなく、
正しいかどうかわからないが存在してしまっている物理世界を描写し、
物理的になにかわからないけど困っていることを解決したい工学世界の解の候補をだしたり、することにも使うことを前提とした記述できればと思います。

大事なのは、時間。計算時間と転送時間。必要な時間内に届かないよりは、近似値でいいので時間内に届くのが大事。

# 関数
関数とは何かを考える際に、数学、物理学、工学、プログラミングの間に差があるとすれば何か。
差があるのは言葉の印象か、用語の範囲か、注目している事象が違うのかなどを検討したい。

## 三角関数
関数でわかりやすいのは三角関数。

物理学、工学で周期的事象を取り扱うのによい。

```math
y = sin(x)
```

三角関数
https://qiita.com/rakusan/items/2f60f2ae6af208dda40f

# 指数関数
三角関数は、複素数を用いて指数関数で置き直すことができる。


```math
\begin{eqnarray}
　e^{-i\theta} = cos \theta + i・sin \theta \\
\end{eqnarray}
```
逆に


```math
\begin{eqnarray}
cos \theta =  \frac{e^{i \theta} + e^{-i \theta}}{2}\\
sin \theta =  \frac{e^{i \theta} - e^{-i \theta}}{2 i}\\
\end{eqnarray}
```

# 関数の共通の性格
関数に値または式を与えると、値または式を求めることができる。

入力が値または式で、出力が値または式である。これは数学、物理学、工学、プログラミングで違いはない。この関数の共通の性格を、「作用」ということにする。

# 副作用
副作用とは、関数を適用して、発生した作用以外の現象、事象を指す。

数学では、副作用が存在しないように定義しようとしている。

例えば、具体的な数を０で割ったら、無限大という概念を答えとする。

副作用が生じないような定義をしていけば

## 物理現象
では、すこしやっかいな問題があるかもしれない。

ある物理現象に、関数を適用したときに、適用対象が爆発し、適用対象外に損傷を与えたとしよう。ある液体Aと別の液体Bを混ぜたら、爆発して容器が壊れたとする。
液体と液体を混ぜて、爆発したことが作用。
容器が壊れたのは副作用だとしよう。

これは、物理現象をどういう系で見ているかによる。容器も含めた系に作用させようとしたのか、容器の中の液体だけに作用させようとしたのか。

まず、Aが変数、Bが関数だとすると、

B(A)

次に、A, Bが変数、混ぜるという操作Xを関数だとすると

X(A, B)

さらに、容器Yを変数だとすると、

X(A, Y, B)

容器Yが関数だとすると

X( Y(A), B)

という感じで、一つの物理現象を、変数、関数でいろいろ表現できる。

そうすると、何が作用かは、何を変数、何を関数だと決めるかに依存する。

物理現象は、今、着目している制約条件の中だけで解決すればいい。
その制約条件は、いっぱいある。

## プログラム
プログラムは、数学も、物理現象も表現し、工学的な問題も解決しようとする。
そのため、何を変数とし、何を関数とするかも、プログラムできるかもしれない。

プログラムでやっかいなのは、出力をプログラムの内部に値または式を返すか、プログラムの外部に返すかの選択が必要なことかもしれない。

プログラムが、プログラムの内部に値または式を返す場合には、数学の式と同じように取り扱うことができる。内部に値または式を返すことを作用と呼ぶことがある。

プログラムの外部に値または式を返す場合には、外部に値または式を返すことを副作用と呼ぶことがある。

より厳密には、関数を呼んだ相手に、関数の戻り値として式または値を返す場合を作用、関数の戻り値以外の値または式を変えたり、外部に値または式を返すことを副作用と呼ぶこともある。

# 参考資料(reference)
[数学] 三角関数について整理する
https://qiita.com/edo_m18/items/f8b8f86a857d34eec3c5

ゼロから理解するCGプログラミングのための数学（三角関数編）
https://qiita.com/hatuxes/items/6151da80f033e96f2acb

任意の座標を原点から指定した角度回す
https://qiita.com/FumioNonaka/items/c246aca8f1b1b03a66be

三角関数は何に使えるのか 〜 サイン・コサイン・タンジェントの活躍 〜
https://qiita.com/drken/items/41b4ec6bde794cbcd0f6

自然対数と指数関数の値をテイラー展開で求める関数を自作する！
https://qiita.com/MilkySaitou/items/614fcbb110cae5b9f797

オイラーの等式よりも美しい
https://qiita.com/koher/items/05a31a8ca28653dc4bdb

文系フロントエンドエンジニアは、アニメーションに三角関数をどう活用したら良いのか Part.1
https://qiita.com/yukiTTT/items/92f2f3910a333ff2d8a1

文系フロントエンドエンジニアは、アニメーションに三角関数をどう活用したら良いのか Part.2
https://qiita.com/yukiTTT/items/c961e3c6de7e2f7f2770

数式サンプル
https://qiita.com/bobchin/items/cb77ccf68a6ce9c39b46

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
配列中のObjectを全て取り出してひとつのObjectにする

ついつい忘れてしまうのでメモ
連想配列ひとつずつが配列の要素として存在しているものを、ひとつの連想配列に変換したい。
そんな時はスプレッド演算子を使うと楽です。

```js
const objectsInArray = [
  {
    foo: 'AAA',
  },
  {
    bar: 'BBB',
  },
  {
    baz: 'CCC'
  }
];

const result = Object.assign({}, ...objectsInArray);

console.log(result) // {foo: "AAA", bar: "BBB", baz: "CCC"}
```
アナログ・デバイセズ　EV-COG-AD4050LZ でADT7420を使ってみよう　Mbed編

EV-COG-AD4050LZ でADT7420を使ってみましょう。
これは、アナログ・デバイセズ　EV-COG-AD4050LZ でLチカしよう　Mbed編の続きです。
https://qiita.com/usashirou/items/3d1207c3d1909517e317

まずは、プログラムを用意してみましょう。
https://os.mbed.com/users/APS_Lab/code/COG4050_ADT7420/file/0901bc032f82/main.cpp/
ちなみに、これAPSLabのもので、インスケイプAPSの浦邉さん製作のものです。
よって、セミナーで使ったものとほぼ同じと思われます。

Import into Compilerでインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/63039dfc-7ba1-142b-6023-7f9ae004ce74.png)

なお、このボードを使用するうえで重要なのはI2Cのプルアップです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/295aa2b5-7c9c-040f-0651-604d430b0b0b.png)

GPIO28を有効にすることでI2Cのプルアップが稼働し、I2Cデバイスが使用可能になります。
GPIO28はD8に当たるそうです。

```
DigitalOut sensor(D8);
```

Programを選択し、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/93d7d08e-6cd3-7567-d68c-48016ae99dd5.png)

そして、コンパイルを押して、ファームウェアがダウンロードされるので、ドラッグアンドドロップで、DAPLINKに書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1afb9db9-7520-0bac-433b-aaaaee443b08.png)

書き込み完了後、DETAILSとMBED以外なくなったらリセットボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/26167371-6c61-f573-f379-b7be171b040e.png)

それでは、TeraTermなどを使って、シリアルのデータを見てみましょう。
設定⇒シリアルポート
スピード：115200
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/abf2089b-46c0-5f19-3ba0-17dc53bbbabd.png)

設定⇒端末
受信：AUTO
送信：CR+LF
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2dfa5015-11c1-ae2a-e325-e8e3b5cabea3.png)
としましょう。
すると、温湿度のデータが見えると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f32deb54-c028-4778-8741-c3c799b77271.png)

ADXL362のデータはこちらのようです。
https://os.mbed.com/users/APS_Lab/code/ADXL362/
【Vue.js】JSONファイルを読み込み、現在保有している配列を置換する。【splice() / push() / pop()】


始めに言っておきますが、今回実装したかったことは`splice()メソッド`を使えば簡単にできました。

そちらの使用をお勧めします。
##場面設定
AWS S3に常に更新される社員名簿JSONファイルが置いてあり、それを一定期間ごとにWeb側から読み込む。変更があった場合にそれをWebに反映させる。

##やりたいこと
JavaScript内で既に保有している辞書型配列と、新規にJSONから読み込んだ辞書型配列に差分があればそれをpushする。

単純に辞書型配列を代入しても、Vue.js側から変更を認識できないため、Vueが管理可能な関数を使って実装します。
ex. push/pop/splice/等

## push()/pop()による実装
社員情報は`members`という名前で既に保有しています。
存在の有無は`includes`メソッドで判定します。`employee_id`にしたのは一意だからです。

- 新規配列に追加されたものを検知するため、元の配列と新規配列を比較して該当要素をpush()

```javascript
axios.get('GET_URL?timestamp=${new Date().getTime()}',headers)
    .then(response => {
      res = response.data;
      ids = []; //idのsetを作る。
      app.members.forEach(member => {ids.push(member.employee_id)});
      res.forEach(r => {
        if(!ids.includes(r.employee_id)){
          app.members.push(r); //Vueコンポーネントのmembers配列にpushする。
        };
      });
    }).catch( error => { console.log(error); });
```

このような形で実装したのですが、pushとかpopって末尾しか扱えないから不便じゃん、と思いspliceについて調べているとどうやら配列が丸ごと置換できそうだとわかりました。最初からこれに気づくべきでした。

## splice()による実装
```javascript
app.members.splice(0);//配列を空にする
app.members.splice(0,0,...res);//index=0を起点,削除0,配列の中身を展開したもの
```
splice()の第3引数を配列自体にしてしまうと配列の配列になるらしく`...`による展開が必要です。

```javascript:sample.js
var months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ['Jan', 'Feb', 'March', 'April', 'June']
```

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

## epilogue
splice()だけでいいんでない？
【Excel VBA】時分秒ミリ秒取得【関数サンプル】

```VB:VBA
Rem
Rem 関数呼び出し例
Rem
Private Sub FncCall()
    '使用例１：時間
    Debug.Print GetTime()

    '使用例２：日付＋時間
    Debug.Print Format(Date, "yyyy/mm/dd") & " " & GetTime()
End Sub
Rem
Rem 時分秒ミリ秒
Rem
Public Function GetTime() As String

    Dim timeHmsS: timeHmsS = Timer
    Dim timeHms: timeHms = Int(timeHmsS)
    Dim timeS: timeS = timeHmsS - timeHms

    Dim hour: hour = Int(timeHms / (60 * 60))
    Dim minute: minute = Int((timeHms - (hour * 60 * 60)) / 60)
    Dim second: second = timeHms - (hour * 60 * 60 + minute * 60)
    Dim millisecond: millisecond = Left(Right(CStr(timeS), Len(timeS) - 1), 4)

    GetTime = Format(hour, "00") & ":" & Format(minute, "00") & ":" & Format(second, "00") & Format(millisecond, ".000")

End Function
```
composer: command not found　とエラーが出たときの対処方法をメモ

#はじめに

```php
composer install
```
をコマンドラインで打つと

```
composer: command not found
```
とエラーがでたので、その対処方法をざっくりメモ


調べたところ、
https://getcomposer.org/download/

こちらのサイトに従って対応するのが一番ラクそうでございました。

上記サイトに記載されているコマンドをひとつずつ実行すればOKですが、せっかくなので書き留めておきます。

#ファイルをコピー

```php
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```

phpコマンドで、composer-setup.phpを召喚。-rオプションをつけることで、コマンドラインからPHPの実行が可能に。

#コピーしたファイルをチェック

```php

php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
```

コピーしてきたcomposer-setup.phpが正常かチェックするために、ファイルの内容からハッシュ値を生成して、一致していたらOK!
一致していなかったらNGと出力して、ファイル削除をしているだけ。

#PHPでファイル実行

```php
php composer-setup.php
```
ファイル実行。
実行したら、`composer.phar*`が生成されているはず。

#ファイル削除

```php

php -r "unlink('composer-setup.php');"
```
ファイル削除


で最後に、

```php
php ./composer.phar install
```

でインストールできる。


composerをインストールするならこちらの記事などを参考に
https://qiita.com/kakijin/items/02364adacf36410f449e
【Excel VBA】配列入れ替え(x,y)->(y,x)【関数サンプル】

※標準機能のTransposeは上限値があるため、自作した。

```VB:VBA
'-------------------------------
' 関数呼び出し例
'-------------------------------
Private Sub sample()
    '使用例
    Dim ret: ret = TransposeArray(Range("A1:B5"))
End Sub
'-------------------------------
' 配列を入れ替える。(x,y)->(y,x)
'-------------------------------
Public Function TransposeArray(arr) As Variant

    TransposeArray = ""
    
    If Not IsArray(arr) Then GoTo OnError
    
    Dim ret() As Variant: ReDim ret(1 To UBound(arr, 2), 1 To UBound(arr, 1))
    Dim i: For i = LBound(arr, 2) To UBound(arr, 2)
        Dim j: For j = LBound(arr, 1) To UBound(arr, 1)
            ret(i, j) = arr(j, i)
        Next
    Next
    
    TransposeArray = ret()

End Function
```
Azureアーキテクチャガイドまとめ 6 【イベントドリブンアーキテクチャ】

## はじめに
[**Azureクラウドアプリケーションアーキテクチャガイド**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)より、7つあるアーキテクチャスタイルの一つ、**イベントドリブンアーキテクチャ**に関してまとめます。

#### 連載目次
[Azureアーキテクチャガイドまとめ 1 【はじめに】](https://qiita.com/Catetin0310/items/74249f333d9fbfccd543)
[Azureアーキテクチャガイドまとめ 2【N層】](https://qiita.com/Catetin0310/items/1ab0ae1130f767d770d3)
[Azureアーキテクチャガイドまとめ 3 【Webキューワーカー】](https://qiita.com/Catetin0310/items/fe0729549faeee843e8a)
[Azureアーキテクチャガイドまとめ 4 【マイクロサービス】](https://qiita.com/Catetin0310/items/06ab890a04baa161cac6)
[Azureアーキテクチャガイドまとめ 5 【CQRS】](https://qiita.com/Catetin0310/items/d0e8b489f6501e4da90b)
Azureアーキテクチャガイドまとめ 6 【イベントドリブンアーキテクチャ】 → 本記事
[Azureアーキテクチャガイドまとめ 7 【ビッグデータアーキテクチャ】](https://qiita.com/Catetin0310/items/d515fc3fdff68b54f408)
[Azureアーキテクチャガイドまとめ 8 【ビッグコンピューティングアーキテクチャ】](https://qiita.com/Catetin0310/items/eebd754637dcda8ad14d)


## 概要
情報の送り手が「**イベント**」を発行し、それを保持する箇所を設け、情報の受け手はそこにイベントを**取りに行く**、というアーキテクチャスタイルです。Webキューワーカーアーキテクチャと似ていますが、以下のようなイメージで違いを理解しています。

- **キューの格納先 = パイプ**
    - 処理したい命令を流しつつ保持しておける
    - パイプの形状変更は一苦労
        - 配信者や受信者を変更/追加する場合には、配信側のコードをいじる必要あり

- **イベントの格納先 = 箱**
    - 処理のためのトリガーを放り込める
    - 複雑なものが入ってても大丈夫そう (パイプだと詰まりそう)
    - 受信者は能動的に箱の中身を取りに行く必要あり
    - 何人で箱を共有してもOKで、拡張性が高い

要件に応じて、**パブリッシュサブスクライブモデル**と**イベントストリームモデル**、2種類のモデルが使用可能です。

それぞれ、ざっくりとした構成を図示します。


![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/acc8ee60-eca2-e0ea-5214-23b4c9330c11.jpeg)

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/02e4eb69-a450-872d-db35-22cfae894a5d.jpeg)



## 適するアプリケーション
このアーキテクチャスタイルには以下のようなアプリケーションに適しています。

- **複数のサブシステムが同じイベント**を処理
- **最小のタイムラグ**のリアルタイム処理
- パターンマッチングや特定の時間範囲内の集計など、**複雑なイベント処理**
- IoTなど、大量の**高速データ**を処理



## 利点
- 送り手と受け手を分離できる
- Point to Pointがないので、**新しい受け手を容易にシステムへ追加**できる
- 受け手はイベントが到着すると**即座に応答**できる
- 高い**拡張性**と**分散性**

## 課題
- **配信の保証**
- イベントを**正しい順序**で処理する必要がある場合


## 対応するAzureサービス
コンシューマー側の処理方式は、以下3種に大別されます。要件に応じて使い分けます。

|-|トリガー例|組み合わせるサービス例|
|:---|:---|:---|
|**単純なイベント処理**|ストレージに画像ファイルがアップロード|**Azure Functions** <br> **Service Bus**|
|**複雑なイベント処理**|特定のデータをある時間範囲で集計、移動平均値が特定のしきい値を超える|**Azure Storm Analytics** <br>**Apache Storm**|
|**イベントストリーム処理**|IoTデータ<br> (大量のイベントが発生)|**Azure IoT Hub** <br> **Apache Kafka**|


組み合わせる各サービスの概要とアイコンは以下の通り。

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a4654317-bb88-4884-cc0e-3d0df59daf47.jpeg)


## まとめ
イベントドリブンアーキテクチャの特徴と使用されるサービスについて見ていきました。次回はビッグデータアーキテクチャスタイルについてまとめます。お楽しみに！



## 参考リンク
[**Azureアーキテクチャセンター イベントドリブンアーキテクチャ**](https://docs.microsoft.com/ja-jp/azure/architecture/guide/architecture-styles/event-driven)
[**Azureクラウドアプリケーションアーキテクチャガイド ダウンロードページ**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)
特定のページでビューの一部を非表示にする方法

# URLが"sign_in"という文字を含む時、link_toを非表示


表示中のページURL：　http://localhost:3000/users/sign_in

```ruby:hoge.rb

- unless request.path.include?("sign_in")
# URLが"sing_in"をいう文字を[含まない時]、次の処理を実行

  = link_to "サインイン", new_user_session_path

# つまり、"sing_in"をいう文字を含む時、下の処理は実行しない（表示しない）
【Excel VBA】ブックの名前一覧の辞書化＋Exists【関数サンプル】


```VB:VBA
'-------------------------------
' 関数呼び出し例
'-------------------------------
Private Sub sample()

   Dim nameDic As Object: Set nameDic = CreateObject("Scripting.Dictionary")
    Set nameDic = NameDefinition(ActiveWorkbook)

    '使用例
    Dim ret: ret = IIf(nameDic.Exists("何かの名前"), Range("何かの名前").Value, "")

End Sub

'-------------------------------
' 名前一覧の作成
'-------------------------------
Public Function NameDefinition(wb As Workbook) As Dictionary

    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim Name: For Each Name In wb.Names
        If dic.Exists(Mid(Name.Name, InStr(Name.Name, "!") + 1)) Then GoTo n
        dic.Add Mid(Name.Name, InStr(Name.Name, "!") + 1), Name
n: Next
    Set NameDefinition = dic
    
End Function
```
これを読んでわかった気になろう。Web界隈でよく出てくる用語まとめ

【随時更新しますので、コメントいただけますと幸いです】

最近Webの世界でよく出てくるような気がする単語をまとめました。
単語がわからないと全てわからなくなってしまうので、ざっくり知り、一緒にわかった気になりましょう。

自分もわかった気になっているだけなので、わかった気になれる説明文を書きます。

## _略語たち_

### AWS（エーダブリューエス）

Amazon Web Service の略
Amazonが社内で使っていたインフラを、誰もがサービスとして使えるようにしたもの
クラウドサービスで、インフラのだいたいはAWSで完結できる。
クラウドサービスとして一番人気。よって文献も多い。

---

### PWA（ピーダブリューエー）

Progressive Web Apps の略
Webサイトをスマホのアプリのように使えるようにするもの
プッシュ通知、キャッシュなどが使えるのでほぼアプリ
アプリのストアではDLできないので、Webサイトに来た人にインストールさせる。
実例はTwitterLiteやSUUMO

---

### SPA（エスピーエー）

Single Page Application の略
いわゆるwebのページ遷移がなく、JavaScriptなどでデータのみを入れ替える
このことでネイティブアプリのようなUXを提供できる。

---

### GCP（ジーシーピー）

Google Cloud Platform の略
AWSのGoogle版
GoogleMapのAPIとか、機械学習とかとか

---

### SSR（エスエスアール）

Server Side Rendering の略
PHPとかのように、サーバーで処理してレンダリングするやつ

---

### CDN（シーディーエヌ）

Contents delivery Network の略
いろいろあるみたいですが、まとめると他サーバからデータを持ってくることで自サーバの負荷を軽減する。
他にもキャッシュだったり、メリットが多い。らしい。

---

### JAMstack（ジャムスタック）

JavaScript, API, Markupの技術でモダンなアーキテクチャを作ろうというもの。
要はサーバーサイドのPHPとか使わないでやるのが今時。多分。

---

### DevOps（デブオプス）

開発 (Development) と運用 (Operations) を組み合わせてできた概念的なもの。
その名の通り、開発と運用の自動化などで効率を上げることとかを指して言われていることが多い気がします。
Gitのソース管理もDevOpsだし、開発環境、本番環境のデプロイ自動化などもDevOpsだと思う。

---

## _技術系_

### webpack（ウェブパック）

モジュールバンドラー
jsファイルとかcssファイルを一つにまとめて最終的に使うものを生成してくれる。
Gulpとかとはちょっと違う。

---

### Babel（バベル）

JavaScriptコンパイラです。
新しい書き方で書かれたjsを古い書き方に変換してくれます。
これでIEも気にする必要がなくなります。

---

### Nuxt.js（ナクスト）

Vue.jsのフレームワーク
SSRとSPAを切り替えられ、静的ページも生成できる。
Vue.js+webpack+Babelで動いています。

---

### Next.js（ネクスト）

Reactのフレームワーク
Nuxt.js=Vue.js
Next.js=React

---

### Gatsby（ギャッツビー）

Reactベースの静的サイトジェネレータです。
ビルド時に静的サイトを作るもんだと思っていましたが、どうやらSSRなどもできるらしい。
爆速のための仕組み盛りだくさん。

---

### Netlify（ネットリファイ）

静的サイトのホスティングサービスです。
サーバーサイドで処理をしないWebサイトなんかが無料で公開できます。
ドメインも割り当てられます。
jsフレームワークとの相性抜群です。
React, Vue.js, Gatsby, Gridsome, Next.js(静的), Nuxt.js(静的)など公開できます。

---

### TypeScript（タイプスクリプト）

JavaScriptの親戚。
これは本当にわかっていないですが、多分よりJavaみたいなオブジェクト指向のプログラムを書けるようです。
クラスを作ったり、型の宣言をしたりなどなど

---

### Stylus（スタイラス）

Sassの親戚。
CSSメタ言語です。
:（コロン）や;（セミコロン）{}なども省ける。
Pugのようにインデントで入れ子を作ります。 
sass記法、scss記法もいけます。

---

### Azure（アジュール）

AWS,GCPのMicrosoft版です。
金融業界、航空業界、電力業界など特定の業界の課題解決に強みを発揮すると書かれていました。

---

### Gridsome（グリッドサム？）

GatsbyのVue.js版
07/31時点でV0.6.7なのでまだベータ版のようです。
今後のNuxt.jsとの使い分けを探っていきたい

---

### Kubernetes（クーバネティス）

k8sと略されているよう。
自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。
DevOpsの話だと思います。

---


## まとめ
単語を知っているだけで世界が広がります。
内容に間違いがあったらご指摘お願いします。
TLS 1.2 -> 1.3 で何が変わるか・何が変わらないか

[WEB+DB Press vol.110](https://gihyo.jp/magazine/wdpress/archive/2019/vol110) の特集3 をベースに、サーバサイドエンジニアが知っておいて損のない TLS 1.3 についてまとめます。

TLS 1.3 は重大な脆弱性が発見されない限り息の長いプロトコルになりそうなので、今からトラックしておくのがおすすめです。

## 要約

### 変わること

- 安全ではないアルゴリズムは使えなくなる(MD5, SHA1, ...)
- 初回通信時のパフォーマンスが向上する(往復回数の削減)
- HTTP/3(QUIC) でも使われるようになる予定
    - = 息の長いプロトコルになりそう
- IoT などを意識したパフォーマンスが考えられている(ARM 最適化など)
- 来年くらいには TLS 1.3 でサーブすることを考え出してもいいかも(今はまだ[ブラウザサポート](https://caniuse.com/#feat=tls1-3)が微妙)
- TLS 1.1 の(ブラウザ)サポートが 2020 年内に終了予定
    - TLS 1.0 はもうサポート終了しているはず

### 変わらないこと

- TCP プロトコル以下
- HTTP プロトコル以上(TLS に乗っているだけなので)
- TLS 1.2(当分は 1.2 のサポートはある)

## 背景

- Web 界隈は `https = 暗号化通信` をスタンダードとするようになってきた
    - Google の検索ランクに影響
    - ブラウザで非暗号化通信時に警告するように
    - https じゃないと使えない Web API の増加
- 現在暗号化通信は TLS 1.0, 1.1, 1.2 が主流
- SSL は TLS の前に使われていた技術の名前(3.0 まであったが、脆弱性があるのでもう使われていない)
- SSL/TLS は改善されてきたが、同時に負の遺産も作られてきた
- 4 年の議論で負の遺産を回収した「良い感じの TLS」として 1.3 が 2018/08 に RFC 8446 として策定された

## 暗号化アルゴリズムの選別

MD5 や SHA-1 など、暗号化レベルの低い(ハックされやすい)アルゴリズムは全てなくなり、 TLS 1.2 で追加された AEAD 一種類のみになりました。

↑現在はサーバサイドの設定で MD5 を使わない、などの対策が必要な状態です。 TLS 1.3 のみのサーバであれば対策不要になります。

## 完全な前方秘匿性

完全な前方秘匿性(_Perfect Forward Secrecy_) が必須になりました。

これは、暗号化された通信データを保存しておいても、後から復号化出来ないようにする仕組みです(具体的には、セッションごとに必要な情報を破棄して、後からそれらの情報を取得出来ないようにする)。

## プロトコル自体の改良

TLS のプロトコルは、最初に _HandShake_ と呼ばれる鍵交換や認証などを行います。そのため、通信が確立するまでに複数(2~3)回の通信をする必要がありました。

TLS 1.3 では 1 往復で通信を開始出来るようになり、セッション再開時は最短 0 往復で、最初の通信からデータを送受信できるようになります。つまり、待ち時間が削減されパフォーマンスが向上するという話です。

IoT など、通信遅延が大きくなる場所において特に効果を発揮します。

## 2020 年 TLS 1.1 サポート終了

ブラウザベンダー各社は 2020 年中に TLS 1.0, 1.1 のサポートを終了することを表明しています。今後は TLS 1.2 及び 1.3 を使うことになります。

## TLS 1.3 対応状況

多くの環境で TLS 実装として利用されている _OpenSSL_ は、 v1.1.1 から TLS 1.3 を利用出来ます。

_Apache_ は 2.4.37 から、 _nginx_ は 1.15.6 から OpenSSL 1.1.1 を採用しているため、利用出来ます。

クライアントとして、ブラウザは [_iOS Safari 12.2_ から、 _Chrome 70, Firefox 63_ から](https://caniuse.com/#feat=tls1-3)サポートされているので、最新環境では使えるようになり始めています。実際にプロダクションで使うにはまだ少し早いですね。

## HTTP/3 と TLS 1.3

UDP プロトコルベースになる HTTP/3(QUIC) は、通信暗号化機能として TLS1.3 を利用します。今後 TLS1.3 に重大な脆弱性が発見されない限りは、息の長いプロトコルバージョンになること間違いなしです。

## 量子コンピュータ

量子コンピュータの登場により、現在使われているアルゴリズムが解読可能になってしまうという危険性も示唆されています。 2026 年頃に量子コンピュータの計算にも耐えられるアルゴリズムを標準化する計画もあるようです。
プロになるためのWeb技術入門 　１章キーワード

## www（world wide web）登場の背景
- 欧州原子核研究機構のティムバーナーズ＝リー博士が提案。核素粒子の実験成果を全世界の研究者で共有しようという話しから、試行錯誤の結果登場することになりました。当初は研究用の資料を共有するためだけであったので、文字が主体でしたが、マークアンドリューセンが開発したMosaicというWebブラウザが文字と画像を混在させて表示できるようにしました。これが基礎となり、のちにInternetExplorerやfirefoxなど現在私たちが使用しているwebブラウザにつながります。

## Webにおけるクライアントとサーバの役割分担
- クラインアントとサーバをなぜ分ける必要があるかということについて。インターネットの普及により、不特定多数の人がコンテンツにアクセスできるようになりました。しかし、様々なコンテンツを多くの人に公開するにはサーバを管理する必要がありました。そこで、一箇所に情報を集めてしまおう、そしてたくさんいるクライアント（人々）とインターネットで接続してしまおうということで、クライアントとサーバは役割がわかれました。

## URL（Uniform Resource Locator）の役割と構造
- Webブラウザが目的の情報をどのようにして得るかということについて。クライアントがサーバにリクエストを投げることによって、サーバがレスポンスを返すというのがクライアントとサーバの関係です。しかし、インターネットの発達によりコンテンツは数え切れないほどあるので、それをどのように特定するかということで発明された技術がURLです。

## HTTPの役割
- インターネットが登場したばかりのころは、異なるコンピュータの間でどのように情報を通信するかという問題がありました。そこで、様々な種類のコンピュータが通信できるように取り決めをしたことを通信プロトコルと言います。インターネット黎明期はすでにファイル通信のためのFTPやSMPTなどのプロトコルが存在しましたが、HTMLの転送に適したHTTPが発明され幅広く利用されるようになりました。他のプロトコルに比べシンプルで実装が簡単であったのことが普及の要因です。

## CGI登場の背景
- 人間は動くものに興味が引かれるという基本的な性質により誕生しました。wwwの誕生部分でも記述しましたが、インターネットは当初研究用の資料など文書の共有を中心に発達しました。サーバは静的なコンテンツをリクエストがあると返すというシンプルな構造でした。ただ、不特定多数の人がインターネットという大きなプラットフォームを絶えず訪れるようにするためには、変わり映えのしない静的コンテンツでは閲覧者が減ってしまいます。そこで誕生したのが、動的コンテンツでした。その仕組みがCGIです。CGIによってクライアントはリクエストを送り、それに応じたレスポンスをサーバ側で生成して返します。※静的コンテンツとはいつ誰がリクエストを送っても同じ内容しか返ってこないもの・動的コンテンツとはリクエストによって返ってくる内容が変わるもの。例えばtwitter、ログインしているユーザで内容がそれぞれ違います。

## サーブレット登場の背景
- CGIのおかげでwebアプリケーションが爆発的に普及し、Webの利用者も同じく増えました。一方CGIは大規模で複雑な仕様には向いていません。これは言語と性能の問題です。①CGIはperlという言語を利用してプログラムを設計していましたが、perlは大規模で複雑な開発には向いていないうえに、当時はオブジェクト指向プログラミングも取り入れていませんでした。②ブラウザからリクエストが届くたびにCGIを通してプロセスを起動していました。アクセス数が少ないうちは問題ありませんが、1日に何万、何十万というアクセスになると処理が追いつかなくなってしまいます。CGIが上記のような問題を抱えているのに対して、登場したのがサーブレットです。サーブレットはJavaで作られたHTMLなどのWebコンテンツを生成するためのプログラムのことです。基本的構造はCGIと同じですが、CGIと違いリクエストのたびにいちいちCGIを通してプログラムを実行しましたが、サーブレットはWebサーバと同じプロセスの中でコンテンツを生成するプログラムが動作するため、比較的高速に動作します。

## JSP登場の背景
- 　サーブレットは記述方法がJavaの中にHTMLを書くという記法でした。そのため、ソースコードが大量になればなるほど後の改良が難しくなりました。そこで新たに生まれたのが、JSPです。JSPはHTMLの記法の中にJavaのコードを埋め込むという記法をとりました。

## Webアプリケーションフレームワークの必要性
- サーブレットやJSPによりWebアプリケーションの開発は進歩しましたが、インターネットの大規模化により、ますます効率がよく、分かりやすい開発手法を求められるようになりました。それが、「再利用」という考え方です。よく利用される部品はライブラリとよばれます。さらに再利用できる部分を増やしてアプリケーションを開発しやすくするための土台として作られたものが「フレームワーク」です。フレームワークを土台にして必要な部分を作り足していけば、望むアプリケーションが短期間で開発できます。