OmniAICreator/Qiita-1.07M huggingface dataset:
VyOS 1.3系（buster） に apt で git をインストールする

##背景

この記事（[VyOSのバックアップをGitHubとTFTPに自動でアップする - ぽぽぽぽーんのネットワークとOSS](https://komeiy.hatenablog.com/entry/2014/12/05/200946)）を見て、VyOSのコンフィグをgitで管理したくなった。

しかし、2020年5月時点のVyOSの最新版 1.3 系では、以前使えていた`set system package repository`コマンドが廃止されている。


そこで、[VYOS 1.2.X系 (apt パッケージの有効化) - Qiita](https://qiita.com/tuntunkun/items/e5da8d41653c6a8902d5) を参考に、`/etc/apt/sources.list`にリポジトリを追加することで対応した。

## 実行環境
```
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
[edit]
```

## リポジトリの追加
VyOSのベースOS(debian)のコードネーム(buster)を確認し、リポジトリを追加する。
再起動すると白紙に戻ってしまうので注意。

```
echo "deb http://deb.debian.org/debian/ buster main" | sudo tee -a /etc/apt/sources.list
echo "deb http://security.debian.org/ buster/updates main" | sudo tee -a /etc/apt/sources.list
```

## gitのインストール
後は普通に`apt`が使える。

```
sudo apt update
sudo apt install git
```

## 注意
`apt upgrade`もできるが、VyOS全体として整合が取れなくなる可能性があるのでやめた方がよい気がする。
Font Awesomeを使う

#プログラミング勉強日記
　2020年5月28日　Progate Lv.55


##Font Awesomeを用いてアイコンを作成する

1.`<head>`要素の中でFont AwesomeのCSSファイルを読み込む。
 Font Awesomeのサイト：https://fontawesome.com/?from=io
　このサイトから会員登録をする。登録後、Font Awesomeを使用するためのコードが発行されるので、コピペして利用する。HTMLの`<head>`タグの中に追加する。

2.使用したいアイコンをを選択する
　使いたいアイコンを選択すると`<i class="fa[スタイルの頭文字 fa-[アイコンの名前]"></i>`が表示されるので、コピペしてHTMLファイルに書き込む。

```html
<head>
  <script src="https://kit.fontawesome.com/(個人によって違う文字列)" crossorigin="anonymous"></script>
</head>
<body>
  <i class="fab fa-twitter"></i>
</body>
```

　今回の例ではFont AwesomeからTwitterのアイコンを読み込んでいる。
[備忘録]　GASのdoPost()にJavaScriptからJSONを渡す方法

（とりあえずまずは備忘録として残します。あとでちゃんと書き直すかも）

#はじめに
簡易的なデータベースとしてGoogle Spreadsheetにデータを記録していく仕組みを作ろう！
ということで、WebページからGoogle Application Script (GAS) で作ったWebアプリケーションにJSONを投げ、Google Spreadsheetに書き込むという仕組みを思いつく。
同じWebアプリケーション上に入力用のWebページも用意したいので、順当にdoGet()で入力ページを表示、doPost()でJSONデータを受け取ることにした。

#はまったこと
CORS (Cross-Origin Resource Sharing) にガッツリはまった。
JavaScriptからJSON投げると、GASのWebアプリケーションにさえ到達しない。
全く無反応。
Chromeのデベロッパーツールでコンソールを確認すると、

>Access to fetch at 'https://script.google.com/macros/s/XXXXXXXXXXXX/exec' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

とエラーをはいていた。
尚、この時点でJavaScript側でエラー表示するようにしていても「結果はだめだよん」という返事しか返ってこなくて何が悪いのか何もわからなかった。
なので、このChromeのデベロッパーツールコンソールが唯一のエラー把握の方法。

どうやらGoogle様、CORSのドメイン制限はワイルドカードで全許可にしてくれたけど、preflight には対応していないとのこと。

**意味ないじゃん！！！**
**どうしてそういう中途半端なことするわけ！？！**
**結局使えないことは変わらないじゃん！！！**

Googleに限らず、こういうの大嫌い。

#解決方法
最初は XMLHttpRequest() を使っていたのだが、どうも動きが分かりずらかったので fetch() に変更。

fetch() のPOSTはデフォルトでCORSを使用するような動きに見えた。
その為、パラメータを以下のように指定。

```JavaScript:script.js
var URL = "https://script.google.com/macros/s/XXXXXXXXXXXX/exec";

var SendDATA = {
   "param1" : value1,
   "param2" : value2,
   "param3" : {
      "subparam1" : subvalue1,
      "subparam2" : subvalue2
   }
};

 var postparam = 
       {
         "method"     : "POST",
         "mode"       : "no-cors",
         "Content-Type" : "application/x-www-form-urlencoded",
         "body" : JSON.stringify(SendDATA)
       };

 fetch(URL, postparam);

```

- method に "POST" を指定。
- mode に "no-cors" を指定。
 - ここが必須。これにより CORS を使用しなくなる。
- Content-Type に "application/x-www-form-urlencoded" を指定。
 - たぶんこの指定でないと後の方法でdoPost()にデータを渡せない。
- body に "JSON.stringify(SendDATA)" と指定。
 - この SendDATA に送りたいJSONを入れておく。
 - body を使わないと後のdoPost()での方法で取得できない。


#GASのdoPost()側での受け方
以下のようにすればJSONを受け取れる。

```JavaScript:gas.js
function doPost(e){
 var JsonDATA = JSON.parse(e.postData.getDataAsString());

 ~~ (JSONを使った処理) ~~
}

```
- e のpostDataを呼び出す。これで POST の content を呼び出せる。
- さらにgetDataAsString()を呼び出すことでcontentの中身を文字列として抜き出せる。
- JSON.parse()を使って、呼び出した文字列をJSONに変換する。

要は、ただの文字列として渡してしまって後で文字列からJSONを復元しますよ、ということ。
valueにスペースが入っているものも試したが、問題なく渡せた。

#おわり
高卒業務系システムエンジニアが、Courseraで学ぶ機械学習（0週目）

# 高卒業務系システムエンジニアが、Courseraで機械学習を学ぶ（0週目）
## Courseraとは
世界中の多くの大学と協力し、それらの大学のコースのいくつかを無償で(※1)オンライン上に提供している。(https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%82%BB%E3%83%A9より)
※1　無料期間は1週間であり、それ以降5313円(税込み)の月額サブスクリプションとなる。(2020/05/19時点)
　　 コースは、自分の速度で進めることができ、1週間以内にコースを終えることができれば、実質無料である。（分散学習の観点から、自分はサブスクリプション前提で定期的に進めてます。）

## 僕が、Courseraを受講するに至った切っ掛け。

それは、LinkedInを見てたある日のこと。
僕は、ある致命的事実に気付いたのです。

「みんな、〇〇 university」

「僕だけ、highschool...」

しかも最近、ヘッドハンターからの

----------------
> 「あなたの**プロフィールを拝見**し、大変興味を持ちました。
本案件については、**限定した方**に声をかけさせていただきます
つきましては下記のような案件をご紹介できます。
---中略---
■求められるスキル
○必須:大学卒以上
---後略---」

--------------
＞限定した方
・・・
確かに限定していますね。
その中に僕は入っていないですけど。
というか、ちゃんと最終学歴書いているのですが。


みたいなことがありまして、やはり趣味でいくら勉強しようが、**アウトプット**。
もっと言えば、市場価値を上げるためには、何かしらの**証明**が必要だなと。

でも、学習の証明ってなかなかできないじゃないですか。
だから、多くの人は一生懸命、身を削って受験するわけです。（特に日本とか韓国とか）

`高卒の私は、LinkedIn内で路頭に迷うっていると、ふと、コンタクトを送った人からはじめての承諾が帰ってきました。`

### Courseraとの出会い

おすすめされたリストの中から、AIなどの最新技術に詳しそうな人に割と無差別にコンタクトを送っていた私は、感謝の気持を込めて、彼のプロフィールを見返しました。

ふむふむ、名前的にインドの出身の方かな？
ふむふむ、The Oxford College of Engineering。インドのオックスフォードね。
ふむふむ、一昨年までインドで機械学習のインターンを受けながら、去年から日本企業でその技術を生かして働いているのか。

そして、**免許・資格**の欄を見ると。
Deep Learning Specialization
**Coursera**

免許・資格でCoursera？？ナンジャラホイ？？
当時、グローバルに使える資格=TOEIC という謎の方程式があった僕は、当然Courseraのことを知りませんでした。

調べてみると、
MOOCs(https://ja.wikipedia.org/wiki/Massive_open_online_course)
という新しい教育・学習の形の一つであり、
**世界のトップと呼ばれる大学のコースをオンラインで受けられる。**
**その上、学習の証明としての修了証・認定証を発行可能。**
というサービスでした。

#### ほうこれは！

でもお高いんでしょ？
いえいえ、そんなことはないです。
一週間以内に終わらせれば無料だし、そうじゃなくても約５０００円/月。

全然許容範囲。
(edXなどという選択も後で知ったが、比較しなかったことを後悔していない。スピード重視）

### そして、学習へ

ということで、早速登録。

何よりも興味を惹かれるのは、スタンフォード大学の講師が教えるDeep Learning。

およそ１ヶ月相当のプログラムで、一番人気だという言うし手始めに受講しよう。

そんなこんなで、僕はCourseraを受講し始めました。

果たして、その先に待っているものとは！（edXは、MOOCのコース修了率が5.5%であったことを2016年に明らかにした）

#### **次回に続く！**
次回:[高卒業務系システムエンジニアが、Courseraで学ぶ機械学習（1-2週目）](https://qiita.com/ginzi44338489/items/9b80ef9d5f76a6b3f9d2)
久しぶりにaxiosを使ったらエラーになったので変更点をメモ

# はじめに

久しぶりにVue.js+axiosを使用して、WEBアプリケーションを作成することになりました。
ライブラリの採用理由としては、あまり開発に時間も取れず、既存のものを利用するためです。

画面の実装は特に問題なく進めていたのですが、APIを呼び出す際に以前使っていたプログラムを~~コピペ~~参考にしていたところ、エラーが発生したので、メモとして残します。

## ~~コピペ~~参考ソースコード
中身はそれっぽく変えてます

```
  public async callAxios() {
    const requestParam = {
      method: "get",
      url: "endpoint",
      data: {
        from_time: "2019-01-01T00:00:00+09:00",
        to_time: "2020-01-01T00:00:00+09:00",
      },
      headers: {
        "x-api-key": "apikey",
      },
    };
    const apiResponse = await axios(requestParam);
  }
```

## エラー内容

```
No overload matches this call.
  Overload 1 of 2, '(config: AxiosRequestConfig): AxiosPromise<any>', gave the following error.
    型 '{ method: string; url: string; data: any; headers: { "x-api-key": any; }; }' の引数を型 'AxiosRequestConfig' のパラメーターに割り当てることはできません。
      プロパティ 'method' の型に互換性がありません。
        型 'string' を型 '"get" | "GET" | "delete" | "DELETE" | "head" | "HEAD" | "options" | "OPTIONS" | "post" | "POST" | "put" | "PUT" | "patch" | "PATCH" | "link" | "LINK" | "unlink" | "UNLINK" | undefined' に割り当てることはできません。
  Overload 2 of 2, '(url: string, config?: AxiosRequestConfig | undefined): AxiosPromise<any>', gave the following error.
    型 '{ method: string; url: string; data: any; headers: { "x-api-k
```

エラーが発生している箇所は

```
await axios(requestParam) 
```

の型定義によるものです
引数はAxiosRequestConfigになりますが、こちらの内容がどうやら変わっているようでした。

以前(いつだったか覚えていない)axiosを使用した際には、methodはstring型でしたが、
今回使用しているバージョン0.19.2ではMethod型である必要がありました。

修正としては、requestParamの型定義を行い解決です。

## 修正版ソースコード

```
import { AxiosRequestConfig } from "axios";

  public async callAxios() {
　　 // 型定義を追加
    const requestParam: AxiosRequestConfig = {
      method: "get",
      url: "endpoint",
      data: {
        from_time: "2019-01-01T00:00:00+09:00",
        to_time: "2020-01-01T00:00:00+09:00",
      },
      headers: {
        "x-api-key": "apikey",
      },
    };
    const apiResponse = await axios(requestParam);
  }
```


## まとめ

今回作成するWEBアプリケーションは時間をかけて作ることができなかったので、
既存の構成を利用したのですが、バージョンによる影響がありました。

すぐに解決できるレベルの問題でしたが、やはりコピペ駆動開発をする際には、理解して行わないと余計に時間がかかる可能性があることを考えさせられました。
[Ruby]配列で要素を習得する際の添え字の役割


添え字について、読み流していたのでこの機会にまとめてみました。

##配列における添え字の役割

```ruby:添え字

a = [1,2,3,4,5,6,7]
a[2,5] #=> [3,4,5,6,7]
```

引数のひとつ目が、位置
引数のふたつ目が、長さを表す。

ちなみに

```ruby:添え字の代入

a = [1,2,3,4,5,6,7]
a[2,5]= 777
a #=> [1,2,777]
```
要素の3番目から、5つの要素一括で777に置き換わります。

***
##values_atとlast

こっからは配列のおまけ。

```ruby:values_at
a = [1,2,3,4,5,6,7]
a.values_at[2,5] #=> [3,6]

a = [1,2,3,4,5,6,7]
a.values_at[2,5,6] #=> [3,6,7]
```
取得したい要素の数に応じて、添え字を追加できる。

```ruby:last

a = [1,2,3,4,5,6,7]
a.last  #=> 7

a = [1,2,3,4,5,6,7]
a.last(4)  #=> [4,5,6,7]
```
配列の最後の要素を取り出すメソッドlastは、引数に０以上の値を渡すと、
その分だけ要素を後ろから取り出します。
最初みたときは、引数に指定した値を後ろから数えて、要素を1つ取得するのかと思っていました。

配列だけ見ても、新たな発見ばかりで面白いですね。
今日はこの辺で。

>[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)
clangコマンドとかで複数のヘッダファイルをひとつにまとめる (そしてwandboxに張る)

## やりたいこと

複数のヘッダファイルを1つに出来るとwandboxに張るとき便利。なのでまとめたい

自作他作問わず、ヘッダオンリーなライブラリあるとする
これのサンプルコード等をwandboxで動けるようにすると，サンプルコードがブラウザで動いて紹介などで便利だ
しかし、ヘッダファイルが複数あると様々な面倒ごとがある(wandboxに張るのが面倒とか)

なので1つのファイルにまとめる

## やる

方針

- プリプロセッサ展開(`clang -E`)して、ほしいヘッダ全部いい感じに展開済みファイルを生成する
  - この際標準ライブラリが展開されると面倒なので展開されないようにする
     - これだと今度は標準ライブラリ不足になるので必要そうなライブラリの`#include`文を適当に追加する
- 作ったファイル(下ではout.hpp)をwandboxに張る

```bash
$ HEADER_DIR=${ヘッダのあるディレクトリ}
$ MAIN_FILE=${必要なヘッダをincludeするだけのcppファイル}
$ find ${HEADER_DIR} -type f | xargs perl -nle '/^#include.*<(\w+)>/ and print "#include <$1>"' |sort |uniq >> out.hpp
$ clang -E ${MAIN_FILE} -P -nostdinc++ -I ${HEADER_DIR} >> out.hpp
```
おそらく`fatal error: hoge: No such file or directory`がでるが無視してよい

## 解説

```bash
$ find ${HEADER_DIR} -type f | xargs perl -nle '/^#include.*<(\w+)>/ and print "#include <$1>"' |sort |uniq >> out.hpp
```
必要な標準ライブラリを抜き出す。
考えるのが面倒なのでライブラリ中に現れた`/`とかを含まないincludeっぽい文面全部抜き出す


存在する標準ライブラリ全部書けばいい気がしたが、対象環境がC++17なのか20なのかわからなかったのでこのような方法にした

```bash
$ clang -E ${MAIN_FILE} -P -nostdinc++ -I ${HEADER_DIR} >> out.hpp
```

- -E : プリプロセッサで展開してstdoutに出力する
- -P: ほしくない出力を抑制する(linkmakerの出力を抑制する。詳しくはmanみて)
- -nostdinc++: 標準ライブラリをincludeしない
  - out.hppに標準ライブラリが展開されると面倒なのでincludeしないようにする
  - 当然clangに怒られる(` No such file or directory`)が、欲しい部分は出力されるので大丈夫
  - これが仕様なのかは知らない
  - なお、gccではこのようにならない

コンパイルそのものに必要なオプションが他にある場合は適宜何とかする

## 例

ヘッダオンリーなjsonライブラリ [nlohmann/json](https://github.com/nlohmann/json) で試してみる


```bash

$ find json/include/ -type f | xargs perl -nle '/^#include.*<(\w+)>/ and print "#include <$1>"' |sort |uniq >> out.hpp
$ cat json.cpp
#include <nlohmann/json.hpp>
$ clang -E json.cpp -P -nostdinc++ -I json/include >>  out.hpp
In file included from json.cpp:1:
json/include/nlohmann/json.hpp:37:10: fatal error: 'algorithm' file not found
#include <algorithm> // all_of, find, for_each
         ^~~~~~~~~~~
1 error generated.
```

生成されたout.hppをwandboxに適当な名前で貼って完成


完成品: https://wandbox.org/permlink/mNio8fruFbGBdt2z



## ほか
- ブラウザで動くサンプルコードを君のライブラリのreadmeに張ろう
- いやなんかもっとスマートな方法あるでしょ。教えてくれ
- 最初sproutで例作ってたんだけどsprout展開したファイルがでかすぎてwandboxが413返してきた。そういう日もある
個人アプリ制作日記４

#活動報告
teach controllerをわからないことの投稿機能を実装
skywayを用いてビデオ通話を実装
ビデオ通話をしながら非同期で画像やコメントを入れられる投稿機能を実装中
viewの整え

個人アプリsutu-suppoにskywayを導入し、ビデオ通話（１対１）を実装した。
ビデオ通話は、skywayのチュートリアルを参考にて作成しいる。詳しく実装の仕方は、webサーバで確認後
に報告をする。ただし、只今AWSに奮戦中！
【備忘】Oracle 19c インストールでつまずいたところ

windows2016にoracle19cをインストールする際に躓いたところの備忘です。

# DBCAのアイコンがスタートメニュー内に存在しない
Oracleインストールの最後に「windowsのスタートメニューまたはデスクトップにアイテムを作成できません」というエラーが表示され、インストールが終わったあと普通なら表示されるはずのDBCAのアイコンがスタートメニューに見当たらない。

そんなときはコマンドプロンプトを管理者権限で立ち上げ、以下で起動させます。

```
dbca
```

#メモリ選択画面で「dbt-50000 使用可能なメモリーを確認できません」というエラーで先に進めない
上記のコマンドに引数を追加して実行します。

```
dbca -J-Doracle.assistants.dbca.validate.ConfigurationParams=false
```

#文字化け
日本語でインストールしようとしているのにPCの言語、ロケーションが日本語になっていない場合、文字化けする場合があります。下記を参考に直します。
https://ecl.ntt.com/faq/2.0/oracle-4/

#DBの作成で失敗
最後のDBの構築画面でDBの作成に失敗してしまう。
単純にDBCAを管理者権限で実行していなかっただけでした。「DBCAのアイコンがスタートメニュー内に存在しない」の項目でコマンドプロンプトを立ち上げるときに管理者権限で実行します。
VMWare Fusion上のUbuntuで共有フォルダをマウントする

## 前提

* ホストOS: macOS Catalina 15.05.4
* ゲストOS: Ubuntu 18.04.4 LTS
* VMWare Fusion 11.5.3
* open-vm-tools 11.0.5

## 問題
Fusionの共有フォルダをゲストOSインストール直後に設定し、そのときは自動でマウントされた。
それ以降起動すると、自動でマウントされなくなった。

## 解決策
この[stackoverflowの記事](https://stackoverflow.com/questions/37871470/how-to-change-permission-of-vmwares-shared-folder)を参考にした。

ただし、一番評価の高い回答をもとにマウントすると"Permission denied"となって、マウントしたディレクトリに一般ユーザとしてアクセスできなかったので、同記事の最も新しい回答の方法を試し、解決した。

手動でマウントする。

```
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
```
これで共有フォルダとして設定したディレクトリが`/mnt/hgfs/`以下にマウントされ、一般ユーザからも`sudo`なしでアクセスできるようになった。
PhpStorm をバージョンアップしたら起動しなくなった

:::note info
バージョン 2019.3 以前（Pleiades による日本語化済み）から
バージョン 2020.1 以降へのバージョンアップを行い起動しなくなったケースを想定しています。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/a0b68da1-dc04-8616-b6a5-fc31358f717d.png)
途中で起動が止まる。

# 原因

バージョン 2020.1 より PhpStorm のディレクトリ構成が変更されており
Pleiades での日本語化済み PhpStorm をバージョンアップすると正常に起動できなくなる。

【2020.1 以降】
**Windows**
`<ドライブ>:\Users\<アカウント名>\AppData\Roaming\JetBrains\PhpStorm<バージョン>`

**Mac**
`/Users/<アカウント名>/Library/Application Support/JetBrains/PhpStorm<バージョン>`

【2019.3 以前】
**Windows**
`<ドライブ>:\Users\<アカウント名>\.PhpStorm<バージョン>`

**Mac**
`/Users/<アカウント名>/Library/Preferences/PhpStorm<バージョン>`

# 解決方法
vmoptions ファイルを開き
Pleiades での日本語化時にカスタム VM オプションファイルへ追記した[^1] 記述を削除する。

**Windows**
`<ドライブ>:\Users\<アカウント名>\AppData\Roaming\JetBrains\PhpStorm<バージョン>
\phpstorm64.exe.vmoptions`

```text:phpstorm64.exe.vmoptions
-javaagent:<ドライブ>:\Users\<アカウント名>\.PhpStorm<バージョン>\config\jp.sourceforge.mergedoc.pleiades\pleiades.jar
```

**Mac**
`~/Library/Application Support/JetBrains/phpstorm.vmoptions`

```text:phpstorm.vmoptions
-javaagent:/Users/<アカウント名>/Library/Preferences/PhpStorm<バージョン>/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

[^1]: バージョンアップを実施すると旧バージョンの設定ファイルが複製され、設定内容が引き継がれるようです。



その後、日本語化されていない状態で起動することを確認する。

# 補足

これまで PhpStorm をはじめとする JetBrains 製品の日本語化は
Pleiades 日本語化プラグインを使用する方法が
非公式ながら一般的でしたが、
バージョン 2020.1 以降は JetBrains 公式プラグインの利用が推奨されているようです。
https://qiita.com/ABE_TAKASHI/items/fc3c5432d22d7b4bcf36

# 参考
https://affi-sapo-sv.com/note/phpstorm-verup-error.php
はじめてのThree.js 4章 日記

[はじめてのthree.js](https://www.amazon.co.jp/dp/4873117704)

#新たに知った知識
- multimaterialはジオメトリのそれぞれの面に独自のマテリアルを適応する
- materialにはneedUpdateプロパティがあり、変形していくならばtrueにする必要がある
- sideプロパティはdoubleにすることでパフォーマンスに影響が出てくる
- arrowhelperプロパティで法線ベクトルが可視化できる(サンプルはコメントアウトしてある)
- ゴスパー曲線


#気づいたこと
- linebasicmaterialは結構使えそう
- materialプロパティのwireframeはメディアアートっぽくなる
- かっこいい表現求めるならshaderは必須(早く覚えなければ)


#wow moment
- multimaterialのルービックキューブ
- [太陽](https://www.shadertoy.com/view/4dXGR4)

#まだ解決していない点
- idとuuidの違いと使用用途
- 高度なプロパティ
- clippingの使い所
- 今回気づいたけどguiでsphere, cubeなど切り替える際にコードでは用意していたオブジェクトを全部消して新たに作るというのだったけどこれがエラーにならない原因が分からない

```javascript
        spGui.add(controls, 'selectedMesh', ["cube", "sphere", "plane"]).onChange(function (e) {

            scene.remove(plane);
            scene.remove(cube);
            scene.remove(sphere);

            switch (e) {
                case "cube":
                    scene.add(cube);
                    break;
                case "sphere":
                    scene.add(sphere);
                    break;
                case "plane":
                    scene.add(plane);
                    break;

            }

            scene.add(e);
        });
```


[5章はこちら](https://qiita.com/asadsexyimp/items/3bf1c4266bac770cd1b0)
ubuntu 20.04が出たので、早速オレオレディストロの作り方のレシピを書いてみる(2020-06-04版)

#初めに
「社内用ディストロ」ならばおそらくこの程度で事足りる筈。

 - GPLでは[一つの組織あるいは会社で複数のコピーを作成して使うことは「配布」とみなさない](https://www.gnu.org/licenses/gpl-faq.ja.html#InternalDistribution)としている
 - MPLでも[同様の見解](https://www.mozilla.org/en-US/MPL/2.0/FAQ/)になっている
    - FAQのQ6を参照
 - [Ubuntuの知財ポリシー](https://ubuntu.com/legal/intellectual-property-policy)もほぼ同様
    - You can modify Ubuntu for personal or internal use
    - You can make changes to Ubuntu for your own personal use or for your organisation’s own internal use.


組織外に「配布」する場合にはGPLやMPL、Ubuntuの知財ポリシーに従い、少なくとも以下の措置をとるべきである。

- ソースコードを配布できる体制を整えておく
    - 必ず
- 商標の差し替え

#要件定義

##コンセプト
COVID-19対策で注目されているテレワーク/リモートワークに全振りする

- ベースにしたのはxubuntu 20.04 (作成開始当時、lubuntu20.04が未リリース)
- Network ManagerのVPNプラグイン全部入り
- Remminaの追加プロトコルのプラグインも全部入り
- ブラウザは残す
- それ以外のパッケージは「消せるものは消す」

###追加要件(途中で思いついた)
- 社内でディストロのコピーをUSBメモリに焼いて引き渡す時、各々の人でバラバラな「VPNとremminaの接続設定を施した状態」で引き渡せるようにする(未解決)
    - 筆者は「機材と現物がある所に出向かないとどうしようも無い部門」に所属しているが、間接部門の人も通常通り出勤してきている。(おそらく環境未整備？)

#手順
 1. 仮想マシンor実機に(x)buntuをインストールして、パッケージを差し替える。
    2. この時、外部に配布する予定なら商標の差し替えと、ソースコードがどこに有るか分からないパッケージを含め、再配布に制限のあるパッケージを削除する(snap版パッケージはソースコードを探すのが面倒くさそう・・・)
 2. [Distroshare Ubuntu Imager](https://github.com/Distroshare/distroshare-ubuntu-imager)でISOファイル化する

今回は外部配布向けの制作をしなかったが、パッケージのソースコードを取得するにはmanifestファイルを見て*パッケージ名=バージョン*の形になるようにする

> $cat /media/cdrom/casper/filesystem.manifest |sed -e 's/ /=/g' >package.list

とでもすると良い。ただ、apt source --download-onlyで全てのパッケージを食わせようとしたら
 >NOTICE: 'accountsservice' packaging is maintained in the 'Git' version control system at:
https://anonscm.debian.org/git/collab-maint/accountsservice.git
Please use:
git clone https://anonscm.debian.org/git/collab-maint/accountsservice.git
to retrieve the latest (possibly unreleased) updates to the package.
(以下略)

と言われてしまったので、

>$cat /media/cdrom/casper/filesystem.manifest |sed -e 's/ /=/g' |  sed -e 's/^/apt source --download-only /g' >pkg-dl.sh
$chmod u+x pkgdl.sh

とでもするべきらしい。


#未解決の課題
 - ~~apt等で、パッケージのソースコードの一括取得~~
 - 個々の人毎に違う設定をした状態のISOイメージを作るのを自動化する良い方法が思い浮かばない
 - 外部配布の場合、Snapパッケージのソースコードを落としてくるのに手間が掛かりそう(不要なら削除)

#反省点
 - **ネタを思いついたのが遅くて機を逃した**
 - 要件定義が甘かった
    - そもそも自分専用なら(台数が少なくてそれぞれ用途も違うので)「全てのマシンに共通して入れたい物だけをインストールするメタパッケージ」で事足りた
Azure IoT Hubで受け取ったデータを利用する方法（Azure function）

#概要
　Azure IoT Hub でエッジデバイスからデータをAzureに送信することに成功したのですが、そこからどう使うかかを模索した話です。

【前回記事】
[M5Stackとクラウドを直接連携してみる（Azure IoT hub入門）](https://qiita.com/kmaepu/items/878c71f357cf72c9fce4)

今回は[こちら](https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/3-create-an-azure-functions-app-in-the-azure-portal?pivots=javascript)を参考に、「Azue function」を使用して、Azure IoT Hubで取得したデータを利用することができました。

# Azure IoT HubとAzure functionを接続
　Azure Functionを使う準備をしていきます。Azure portalを開き、Azure IoT Hubと同じリソースグループに、関数アプリを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/4081b05c-f7cc-7ffa-0589-61a87e931bef.png)

 関数アプリを作成できたらリソースに入り、関数を作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/6cff1d41-baf1-a1ad-c1a2-8429336e3f2b.png)

 画面右側に関数のテンプレート選択が現れるので、「IoT Hub」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/91d76049-1f3f-37a5-27ed-57f13d9ff35d.png)

　関数テンプレート作成時に初期設定を行います。名前は適当。Event Hub connectionをIoT Hubにします。この時、IoT Hubのリソースが作成済みでないといけません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/96bf397f-5ead-8be1-90c4-1e42b1eb93ff.png)

　関数作成後、次のような画面となれば作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/fbb0ef5b-e0cf-2edc-1087-fbd8c964d48a.png)

##接続確認
　画面左の欄から、「コードとテスト」を選択します。次のようにIoT Hubからメッセージを受け取ったら、コンソールログに出力するコートになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/9fc88000-a25c-db57-cbc5-cc2acd8258cf.png)

　IoT Hubへメッセージを送るデバイスを起動し、次のようにログにメッセージが表示されれば接続Okです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/346a1421-7ab2-69aa-6217-a8c6d91d4ed1.png)

　例えば、次のようにするとM5Stackから送信された温度データをログに表示できます。

```javascript
module.exports = function (context, IoTHubMessages) {
//    context.log(`JavaScript eventhub trigger function called for message array: ${IoTHubMessages}`);
    
    IoTHubMessages.forEach(message => {
        context.log(`Processed message: ${message.Temperature.toFixed(1)}`);
    });

    context.done();
};
```
　
#おわりに
　この方法は特に回りくどい事せずことをせず、設定するのみだけなので簡単かなと思います。
ただし、あまりに頻繁にデータを送信していると課金になるかもしれないので気を付けましょう。

#参考
・[Azure Functions の Azure IoT Hub トリガー](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-iot-trigger?tabs=javascript
)
・[Azure IoT Hub と Windows 10 IoT Core とRaspberry Pi 3 Model B+ とでテレメトリーの収集をしてみた](https://www.softbank.jp/biz/future_stride/entry/techblog/20200313/)
・[IoT Hub メッセージ ルーティングを使用して device-to-cloud メッセージを別のエンドポイントに送信する](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-messages-d2c)
【2020年】Nuxt.js & Typescript & ESList で作成するボイラープレートはこれでいいはず！


## 📗 説明

Nuxtjs・Typescript を利用したボイラープレートです。

#### サンプル機能
- 認証
- 入力フォーム
- チャート表示
- 画像カルーセル
- オーバーレイ

### ディレクトリ構造
```
.
├── src (Nuxt関連のソースファイル)
│    ├── @types
│    ├── assets
│    ├── common
│    ├── components
│    ├── interfaces
│    ├── middleware
│    ├── pages
│    ├── plugins
│    ├── static
│    ├── store
│    ├── test
│    └── utilities
├── .babelrc (Babel設定ファイル)
├── .vscode (VSCode設定ファイル)
├── jest.config.js
├── nuxt.config.ts
├── package.json
├── tools (サーバー起動用モジュール)
└── tsconfig.json
```

## 🖊️ 利用している技術
- Nuxtjs 2.12.2
- Typescript
- ESLint
- Jest
- VueChart
- AdminLTE3

## 🌐 Demo

![DEMO](https://github.com/isystk/nuxtjs-typescript-boilerplate/raw/master/demo.jpg "DEMO")

https://demo.isystk.com/nuxtjs/

## 📦 インストール方法

```bash
$ cd /path/to/nuxtjs-typescript-boilerplate
$ nodebrew install v13.13.0
$ node install -g yarn
$ yarn
```

## 💬 使い方

```bash
$ cd /path/to/nuxtjs-typescript-boilerplate
# サーバーサイドを起動する（認証機能で利用）
$ node ./tools/server.js
# クライアントサイドを起動する
$ yarn run dev
```

#### 接続先情報
##### テストユーザー test@sample.com / password

| 接続先| URL|
| :-----| :---------------------------------------|
| DEMO画面| http://localhost:3000/|

## 🔗 参考

| プロジェクト| 概要|
| :---------------------------------------| :-------------------------------|
| [公式ドキュメント - Nuxt.js](https://ja.nuxtjs.org/guide/)| 公式ドキュメント - Nuxt.js|
| [公式ドキュメント - TypeScript](https://www.typescriptlang.org/docs/home)| 公式ドキュメント - TypeScript|
| [仕事ですぐに使えるTypeScript](https://future-architect.github.io/typescript-guide/)| 仕事ですぐに使えるTypeScript|
| [AdminLTE Docs](https://adminlte.io/docs/2.4/installation)| AdminLTE Docs|
| [Bootstrap4 日本語リファレンス](https://getbootstrap.jp/docs/4.4/getting-started/introduction/)| Bootstrap4 日本語リファレンス|
| [アイコン（fontawesome）](https://fontawesome.com/icons?d=gallery)| アイコン（fontawesome）|


## 🎨 ソースコード
https://blog.isystk.com/web_production/boilerplate/1108/
【Python】月の初日や最終日を取得する方法

# 結論
replaceメソッドを使うと楽チン。

```python
from datetime import datetime
from dateutil.relativedelta import relativedelta

today = datetime.now().date()
print(today)
# => 2020-05-27

last_month_start = (today - relativedelta(months=1)).replace(day=1)
print(last_month_start)
# => 2020-04-01

last_month_end = today.replace(day=1) - relativedelta(days=1)
print(last_month_end)
# => 2020-04-30
```
変数名がアレなのは見逃してください。

# 参考
https://www.lifewithpython.com/2018/06/python-get-first-and-last-day-of-month.html
Debian系のLinuxでcurl実行時に「curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small」というエラーが発生した時の対処方法

# ある日

古くから稼働しているサーバーに対して、DebianベースのDockerコンテナからcurlを実行したら、以下のエラーに遭遇しました。

```sh:sh
curl https://example.com/foo/bar
```

```sh:実行結果
curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
```

SSL/TLSの暗号化で使われている鍵長が短く、セキュリティの面で引っかかっているようです。

# どうすれば、、、

ネットを調べたところ、opensslのバージョン1.1.1からセキュリティが強化され、暗号化の際に用いる鍵長がデフォルトで2048ビットになっており、その影響を受けているようでした。

> Change the default RSA, DSA and DH size to 2048 bit instead of 1024

* https://github.com/openssl/openssl/commit/70b0b977f73cd70e17538af3095d18e0cf59132e
* via [急に外部APIとの通信が "dh key too small" で失敗するようになったのはなぜ？ - BANK tech blog](https://tech.bank.co.jp/entry/2019/07/29/170000)

curlのバージョンを調べてみましょう。

```sh:sh
openssl version
#=> OpenSSL 1.1.1d  10 Sep 2019
```

バージョンは1.1.1。ドンピシャですね。

# 対処方法

サーバー側のopensslをアップデートすることで、この問題は回避できそうですが、サーバー側の管理者権限がないので今回はクライアント側で調整することにします。

Debian系Linuxでopensslの設定を変更する方法を探します。するとGoogle先生のお力で以下のページが見つかりました。

* [#907788 - "dh key too small" since openssl upgrade - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=907788#21)

このページ内で以下の記述を見つけました。

> I would close that if I were the curl maintainer. The remote site in the
> example uses a small DH key [0]. If you can't get owner to upgrade the
> site and want still to access the site I suggest to remove
> 	CipherString = DEFAULT@SECLEVEL=2
> from /etc/ssl/openssl.cnf.

`/etc/ssl/openssl.cnf` の `CipherString = DEFAULT@SECLEVEL=2` の記述を取り除くと良さそうです。該当の行をコメントアウト対応してみます。

```diff:/etc/ssl/openssl.cnf
-	CipherString = DEFAULT@SECLEVEL=2
+	# CipherString = DEFAULT@SECLEVEL=2
```

sed を使ってコマンドで書き換える時はこちら。

```sh
# コメントアウト対応、以下を実行するとファイルを即上書きするので要注意(-iオプション)
sed -i -e 's/CipherString = DEFAULT@SECLEVEL=2/# CipherString = DEFAULT@SECLEVEL=2/g' /etc/ssl/openssl.cnf
```

`/etc/ssl/openssl.cnf` を書き換えたら、再度curlを実行します。

```sh:sh
curl https://example.com/foo/bar
```

```json:実行結果
{"message":"Hello, World!"}
```

無事レスポンスが得られました！

# 注意事項

こちらの対処方法はopensslのクライアント側のセキュリティレベルを下げることになるため、セキュリティリスクがあります。セキュリティ面を考慮して `/etc/ssl/openssl.cnf` 設定を変更してください。
設定内容についていまいちピンとこない場合は、この対応方法を取らずに、詳しい方に相談するのをおすすめします。
C# グラフの値をCSVで保存する

```Save
using System.IO;   //Save
using System.Text; //Save

private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                //ファイル書き込み形式（上書き）
                StreamWriter file = new StreamWriter(str_save_file, false, Encoding.UTF8);
                for (int i= 0; i < chart1.Series[str_ms_x].Points.Count; i++) {
                    file.WriteLine( chart1.Series[str_ms_x].Points[i].YValues[0] + "," + chart1.Series[str_ms_y].Points[i].YValues[0] );
                }
                file.Close();
                //セーブボタン使用不可
                btnSave.Enabled = false;
            }
            catch
            {
                
            }
        }
```
【随時更新】microCMSを使うときのTips: 公式サポートとのQ&A

microCMSを使っててサポートさんから聞いたあれこれをまとめていく記事

## 文字色の設定

リッチエディタでは、文字色が設定できます
文字色を設定すると、`<span style="color: #111111>`のように`span`タグで色が設定されます

文字色を解除したいときは、一番右上の黒を選ぶと「文字色なし」にできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/8a1214c5-2d2d-dfd2-9a6d-fe2f458ba6e0.png)

## 文字背景色の設定

文字色と同様に、文字背景色も解除できます
これは、一番左上の白です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/b410ade2-e709-0c30-b9f3-9f71f371b0f5.png)などの

## 埋め込みの設定

microCMSでは、[Twitter, YouTube, InstagramなどSNSの埋め込みができます](https://microcms.io/blog/richeditor-embed/)

が、microCMSの埋め込みの設定では、Instagramの「キャプションをオフにする」や、Twitterの「画像をURLではなく画像そのものを表示する」という細かいところまでは弄れません

公式としても細かいパラメターの調整を実装する予定はなく、そういうときはmicroCMSの「カスタムフィールド」などを使ってフロントエンド側で実装してください、とのことでした
Python可視化ツールいろいろ

# 目的
分析コンペの効率化のための、可視化ツールのいろいろまとめ。
少しずつ、増やしていく！

# 目次
1.相関マップ
2.混同行列(Confusion Matrix)
3.LightGBMの特徴量重要度



## 1.相関マップ
pandasデータフレームの各列の相関をヒートマップ表示。
各特徴量の相関、モデルのアンサンブル用の予測結果の相関に使用する。
### 参考
－
### コード
```python
fig ,ax = plt.subplots(1,1,figsize=(12,12))
sns.heatmap(df.corr(), annot=True, fmt='.7f', ax=ax)
df.corr()
```

## 2.混同行列(Confusion Matrix)
### 参考
－
### コード
```python
import numpy as np
import pandas as pd
from scipy import signal
from sklearn.metrics import confusion_matrix, f1_score, plot_confusion_matrix

# Thanks to https://www.kaggle.com/marcovasquez/basic-nlp-with-tensorflow-and-wordcloud
def plot_cm(y_true, y_pred, title="", figsize=(14,14):
    y_pred = y_pred.astype(int)
    cm = confusion_matrix(y_true, y_pred, labels=np.unique(y_true))
    cm_sum = np.sum(cm, axis=1, keepdims=True)
    cm_perc = cm / cm_sum.astype(float) * 100
    annot = np.empty_like(cm).astype(str)
    nrows, ncols = cm.shape
    for i in range(nrows):
        for j in range(ncols):
            c = cm[i, j]
            p = cm_perc[i, j]
            if i == j:
                s = cm_sum[i]
                annot[i, j] = '%.1f%%\n%d/%d' % (p, c, s)
            elif c == 0:
                annot[i, j] = ''
            else:
                annot[i, j] = '%.1f%%\n%d' % (p, c)
    cm = pd.DataFrame(cm, index=np.unique(y_true), columns=np.unique(y_true))
    cm.index.name = 'Actual'
    cm.columns.name = 'Predicted'
    fig, ax = plt.subplots(figsize=figsize)
    plt.title(title)
    sns.heatmap(cm, cmap='viridis', annot=annot, fmt='', ax=ax)
```


## 3.LightGBMの特徴量重要度
LightGBMの学習結果の特徴量重要度の可視化
入力はLightgbmのリスト

### コード
```python
def display_feature_importance(models):
    fi = pd.DataFrame(columns=['importance','feature'])
    for i, m in enumerate(models):
        df_t = pd.DataFrame(columns=['importance','feature'])
        df_t['importance'] = m.feature_importance(importance_type='gain')
        df_t['feature'] = m.feature_name()

        fi = pd.concat([fi, df_t], axis=0)
    fi = fi.groupby('feature').sum() 
    best_features = fi.sort_values(by='importance', ascending=False).reset_index()

    plt.figure(figsize=(16, 16));
    sns.barplot(x="importance", y="feature", data=best_features);
    plt.title('LGB Features (avg over folds)');
    print('worst:\n',best_features['feature'][-20:].values)
```

### Sampleコード(疑似)
```
### 学習
m_lgb = lgb.train(params, train_data, valid_sets = [valid_data], 
                  verbose_eval=100,early_stopping_rounds=200)

### 特徴量の重要度の表示
display_feature_importance([m_lgb])
```
#### 表示例
表示は、kaggleの「M5 Forecasting - Accuracy」コンペの特徴量の重要度。
ちなみに結果は、395/5,558の銅メダル
![__results___25_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184825/418c3ebd-15fa-7c04-644b-757d399ab19d.png)
IAMポリシーについて

#前提
IAMについて学んだことを書いていきます。

#本題

#IAMポリシーとは
ポリシーとはJSON形式のドキュメント
IAMユーザーやロールなどといったものにアタッチして使用する

IAMユーザーやロールなど認証される主体をプリンシパルという

##概要
PrincipalがAWSリソースなどの操作をリクエストする
↓
そのリクエストをAWSがJSONのドキュメントと付き合わせて許可されているかされていないかを判断する
↓
許可されていればAWSリソースに対するPrincipalが出した操作が許可される
例えばEC２インスタンスをdeleteすることやstopすること


###詳細
Principal
　AWSに対してリクエストを行う人またはアプリケーション
　（IAMユーザー、IAMロール、FederatedUser）
　※グループはない（正式にPrincipalとしては認められていない、あくまでグループはIAMポリシーを複数のユーザに一括してまとめて付与できる位置付け）
　
↓

Authentication（認証）
　ログイン情報をチェックする

↓
Request
　Actions/Operations
　Recources
　Request information
　Environment data
　Recource-data

↓

Authorization（認可）
　１、アイデンティベースのポリシー
　　・管理ポリシー
　　　AWS管理ポリシー（AWSがあらかじめ用意しているポリシー）
　　　カスタマー管理ポリシー（直接JSONを記述して設定できる）
　　・インラインポリシー（現在は推奨されていない）


#JSONの記述方法
statementを元に一つの塊となっており、
Principalがどのようなアクションをなんのリソースに対し、どのような条件の場合に許可をするか記述されている

PARCモデルと言われている
Principal
Action
Resource
Condition

```
{
"Statement":[{
  "Effect":"effect",
  "Principal":"principal",
  "Action":"action",
  "Resource":"arn",
  "Condition":{
    "condition":{
      "key":"value" }
    }
  }
 ]
}
```

Principal

```
#全てのユーザー
"Principal":"AWS":"*.*"

#特定のアカウントを指定
"Principal":{"AWS":"arn:aws:iam::123456789012:root"}
"Principal":{"AWS":"123456789012"}
```

Action

```
#EC2インスタンスをスタートするアクション
"Action":"ec2:StartInstances"

#IAMユーザーのパスワードを変更するアクション
"Action":"iam:ChangePassword"
```

Resource

```
#アカウントが持っている全てのEC2インスタンスに対するリソース
"Recource":"arn:aws:ec2:us-east-1:123456789012:instance/*"
```

Conditon
複数の値をカンマで並べるとAND条件
一つのキーに対して複数の条件を横になれべるとOR条件


#Identity-based Policies（アイデンティティベースのポリシー）
principalはない
→principalはIAMユーザだと明確なため

#Resource-base Polocies（リソースベースのポリシー）
S３のバケットなどリソースに対してアタッチするポリシー
ポリシーを付与したリソースに対して、誰がなんの操作を行うことができるかリソース側で決めることができる


Identity-based PoliciesとResource-base PolociesはAND条件（どちらかが許可されていれば実行可能）
※明示的Deniedは除く

#Service Control Policies(SCPs)
組織を管理するpolicieの一つ

#IAM Permissions Boundaries(境界)
plicipalに付与するpolicieで権限の適用範囲を狭めるイメージ
identiryベースのポリシーとPermissions Boundariesが両方許可したもが操作できるAND条件のポリシー

どういう時に使われるか、、、
IAMロールの権限を管理する開発者を選任し、ポリシーの権限の管理を任せたい場合
片方のサービスでのみロールなどの権限管理を自由に任せたい場合

#Access Control Policies(ACLs)
他のアカウントのprincipalがどのリソースにアクセスできるか操作できる
リソースベースのポリシーに似ているが、自身のアカウント内での制御はできない
JSONフォーマットではない
VPCのACL、S３などのサービスをサポートする

#Session Policies
IAMロールやペデレーションしたユーザーの一時的なセッションを認証情報をパラメーターとして渡す

#クロスアカウントアクセス
IAMロールを使用して、自身のAWSアカウントと第３者との間に信頼関係を築くこと
STS、assumes role、APIを使用し、短期的な権限を与える
SQLで複数テーブルをDELETEする方法

ユーザーアカウント削除時に削除されたアカウントの投稿内容も一緒に削除したい。
そんな時に使用したコードです。

それぞれのテーブルが以下となります。

users
id name
1  鈴木
２　山田
3　佐藤

posts
id user_id message
1    2     こんにちは
2    1　　　おはよう
3    3　　　こんばんは


実際のSQL文は以下になります。
DELETE users,posts FROM users LEFT JOIN posts ON users.id = posts.user_id WHERE users.id=?'



コードの読み下し文としては
削除対象のテーブルはusersとposts、usersのidとpostsのuser_idが一致したものを結合。
結合した後のデーターにてusersのidが後程代入された値と同じものを削除して下さい、となる。
【言語処理100本ノック 2020】第5章: 係り受け解析

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第5章: 係り受け解析」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/12/200121

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
Gitでのエラー

#プログラミング勉強日記
　2020年5月27日　Progate Lv.54


##Gitでaddしようとするときのエラー処理

```
$ git add stylesheet.css
warning: LF will be replaced by CRLF in page3/stylesheet.css.
The file will have its original line endings in your working directory
```

　Gitでファイルを共有するためにaddすると、上記のよううな警告がでてきた。これを無視してもGithubで登録することはできるが、コードの中に変な文字列が挿入されてしまう。これはGitの設定で改行コードを変更しようとしている。

```
$ git config --global core.autoCRLF false
```

　上記のような処理を行うことで改行コードの変更が行われず、変な文字列も挿入されない。
ArcGIS API for JavaScript で deck.gl を利用してみる

Esri が開発している ArcGIS API for JavaScript でも deck.gl が利用できるようになりましたので、ArcGIS API for JavaScript と deck.gl の連携を中心にした記事になっています。
簡単なサンプルも紹介しています。

詳しくは以下のはてなブログに書いていますので参照していただければと思います。
https://freedom-tech.hatenablog.com/entry/2020/05/23/212428
Qt for Python アプリの自己アップデート

備忘録かつ添削をお願いしたく。

パッケージ化しないアプリでも、アップデートする仕組みを入れておかないと、修正する度にそれぞれのマシンでコピーする作業が起こってしまう事に気が付きました。
http経由でダウンロードする事も、zipファイルを展開することも簡単にできてしまうのだから、それを組み合わせてアプリケーションディレクトリのの .py ファイルを更新してやればよいのでは？ということで、当該の部分はこのようになりました。

```python

    def updateDownloadQuit(self):
        url ="http://〜〜"
        title = './update.zip'
        urllib.request.urlretrieve(url,"{0}".format(title))

        QMessageBox.information(None, "Info",  "アプリケーションを更新して、終了します")
        with zipfile.ZipFile('update.zip') as existing_zip:
            existing_zip.extractall('.')

        MainWindow.close()

```
Qtでなくても、ちょっとしたスクリプト群の配布に使えると思います。
[Microsoft] Angular側からBlazorを眺めて比較する

Blazorが一般公開になりました。
身の回りでは（大いなる誤解含みで）にわかに話題になっています。
自分はAngularが好きなので、AngularでできることがBlazorだとどうなるのかを調べてみたいと思います。

# コンポーネント

Angularのコンポーネントと、Blazorのコンポーネントはほぼほぼ同じ意味です。
コンポーネントを用意していくことで画面を組み立てます。

思いついたものをまとめました。

| 比較項目 | Angular | Blazor |
|:--|:--|:--|
| コンポーネントを構成するもの  | クラス、テンプレートHTML、（必要に応じて）スタイルシート  | Razorファイルひとつ  |
| コンポーネント専用のスタイルシート  | 持てる  | 持てない[^1]  |
| 他コンポーネントからの参照  | `<app-foo></app-foo>`のようなタグで参照できます | `<Foo></Foo>`のようなタグで参照できます  |
| 値のバインディング | テンプレート中に`{{foo}}`と書くことで、変数を参照できます | テンプレート中に`@foo`と書くことで、変数を参照できます |
| フォームとのバインディング | タグに`[(ngModel)]`をつけます。あるいはリアクティブフォームを使います | タグに `@bind` 属性をつけます |
| ライフサイクル | 画面遷移時にインスタンスが生成/破棄される | ← 同左（？）  |
| スタイルシート | SCSS、CSSが使えます | 別途設定しない場合はCSSのみ(?) |


[^1]: [コンポーネント専用のスタイルシートは、まだ持てないようです。](https://github.com/dotnet/aspnetcore/issues/10170)

# フォームと入力バリデーション

## Angularの場合

タグに属性をつけたり（テンプレート駆動の場合）、FormGroupを使ったり（リアクティブフォームの場合）することで、Valid/Invalidな状態になります。

## Blazorの場合

バインディングした変数にアノテーションをつけることで、その入力項目を持つフォーム全体がValid/Invalidな状態になります。


# テンプレートで使用できる制御構文

## Angularの場合

* If
* Forループ
* Switch Case

## Blazorの場合

RazorはそのままC#を書けますので、C#と一緒です。

# コンポーネント間におけるデータの共有

## Angularの場合

サービスクラスを作り、コンポーネントヘインジェクトします。

## Blazorの場合

好みのクラスを作り、DIコンテナへシングルトンとして登録します。
コンポーネントに `@inject` と書くことでインジェクトできます。


# ルーティング

## Angularの場合

パスとコンポーネントの組み合わせを`RouterModule`へ渡します。

## Blazorの場合

コンポーネントの先頭に置いた `@page` でパスを指定します。

# 既存HTMLタグの拡張

Angularは、既存HTMLタグをコンポーネントとして宣言できます。また、タグに属性として特別な機能を付与できるディレクティブというものがあります。

Blazorには、同じようなものはないようです。[^2]

[^2]: https://github.com/dotnet/aspnetcore/issues/5607 実装もされなさそう。


# 定番サードパーティライブラリ

| ライブラリ | Angular | Blazor |
|:--|:-:|:-:|
| テスト  | Karma, Jasmine, Spectator 等  | xUnit 等  |
| 状態管理  | NGRX, Akita、NGSX 等  | (?)  |
| マテリアルデザイン  | Angular Material 等  | (?)  |


# 感想

Blazorは、機能が少なく単純なため、学習コストは低そうです。

`@` の書き方がなかなかのカオスっぷりで、なんというかMicrosoftらしいなぁと感じます。

日本のSEが大好きなグリッドコントロールが、いくつもサードパーティ[^3][^4]から出ています。すぐに使えそうですね。

[^3]: GrapeCity https://www.grapecity.com/componentone/blazor-ui-controls
[^4]: Infragistics https://www.infragistics.com/products/ignite-ui-blazor

# 参考リンク

* [Get Started](https://docs.microsoft.com/en-us/aspnet/core/blazor/get-started?view=aspnetcore-3.1&tabs=visual-studio)
* [Road map for .NET 5](https://github.com/dotnet/aspnetcore/issues/21514)
Vue（Vue CLI）で他ファイルをインポート

```
<script>
import "./components/Component.vue"

export default {
  el: '#app',
  data() {
    return{
      now: "",
      wakachiko:"uhouho"
    }
  },
  methods:{
    onClick(){
      // alert("onClick!");
      this.now =new Date().toLocaleString();
    }
  }
}
</script>
```

こんな感じで`import＋"ファイル場所"`って書けばOKです。
【AWS】S3(Simple Storage Service)の構成要素とは？

# はじめに
現在、AWSソリューションアーキテクトの学習をしております。
今回は、S3の構成要素についてアウトプットしていきたいと思います。

# S3の構成要素

## リージョン
地域。拠点。
地理的に離れた領域でサービス上も完全に分離されたサービスやネットワークの集合体のこと

## パケット
S3に保存されるあらゆるオブジェクト(ファイル)を置いておくための入れ物。
一言で言うと「バケツ」。

グローバルで一意に定義される。
(他の人が名前を使用していた場合は使用不可

## オブジェクトキー
オブジェクトを一意にするための名前

## プレフィックス
階層構造のようなもの。
プレフィックスを利用してオブジェクトを一意のキーとすることが可能。

※S3には「フォルダ」という概念はない。

## バージョンID

オブジェクトをバージョン管理するためのID。

## VPCエンドポイント

S3に対してインターネット経由ではなく、VPC内の閉じられたネットワーク内でアクセスを行うことをを可能とする。

# 図にしてみる

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/20c28ea4-719e-5fac-90fa-970a4b86d085.jpeg)

※「この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集」を参考にさせて頂きました。

# 参考
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
[バケットの制約と制限](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/BucketRestrictions.html)
[Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする](https://dev.classmethod.jp/articles/amazon-s3-folders/)
配列の中にオブジェクトがある場合のデータの入れ替え方法

# 二つの配列かつ中にオブジェクトがある場合
二つの配列かつ中にオブジェクトがある場合にデータが片方に存在しない場合にデータを入れ替えたいって言う需要ってありますよね。
はい、最近ありました。

と言うわけで、結構忘れがちなので、備忘録も込めて記載します。

```javascript
const ArrayObject1 = [{id:1,name: 'shuichi'},{id:2, name: 'takesi'},{id:3,name: 'tabasa'},]
const ArrayObject2 = [{id:1,name: 'ichiro'},{id:2, name: 'ziro'},{id:3,name: 'saburo'},]

// idが同じ場合に名前を入れ替える
console.log(ArrayObject1.map((obj1) => {
  if (obj1.id !== null) {
    ArrayObject2.map((obj2) => {
    if (obj1.id === obj2.id) {
      obj1.name = obj2.name
    }
  })
  return obj1
 }
}))
```
# 結果
![スクリーンショット 2020-05-27 22.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127391/9cfa18a3-40f9-9565-ddd3-ae4c82757e90.png)

便利なんだけど、わかりづらいこともある。

# 参考
[Array.prototype.map() MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
sls deployするとStack with id lambda-demo-dev does not existエラー

### serverless frameworkでdeployエラー

lambdaとAPIGatewayの構成のスタックを今まで何回かdeployしてうまく行っていたのですが、
`sls remove -v`したあとに`sls deploy -v`し直したときに以下のエラーが発生しました。

```
ServerlessError: Stack with id lambda-demo-dev does not exist
```

翻訳すると、**lambda-demo-dev のスタックが存在しません。**という内容。
調べていくと`serverless.yml`の以下の記述が原因でした。


```serverless.yml
service: lambda-demo

---------省略---------

resources:
  Outputs:
    ServiceEndpointTestRequest:
      Value: !Join
              - ''
              - - "curl -v -X GET -sS '"
                - ${cf:lambda-demo-dev.ServiceEndpoint}
                - "?person_id=001' -H 'Content-Type:application/json'|jq"


```

serverlessframeworkが自動で作成するOutputsであるServiceEndpointを使用したかったので、
自分自身のスタックのcfnの変数を参照していました。
`sls deploy -v`だけしている分には問題なかったのですが、`sls remove -v`することで今まで参照していたcfnが削除され、`sls deploy -v`しても**スタックが存在しません**というエラーが出たようです。

### 解決方法

以下のように、ServiceEndpointを自分でcustomに作り直し、Outputsに組み込みました。

```serverless.yml
service: lambda-demo

---------省略---------

custom:
  ServiceEndpoint: !Join
                    - ''
                    - - "https://"
                      - !Ref ApiGatewayRestApi
                      - ".execute-api."
                      - !Ref AWS::Region
                      - "."
                      - !Ref AWS::URLSuffix
                      - "/"
                      - ${self:provider.stage}

resources:
  Outputs:
    ServiceEndpointTestRequest:
      Value: !Join
              - ''
              - - "curl -v -X GET -sS '"
                - ${self:custom.ServiceEndpoint}
                - "?person_id=001' -H 'Content-Type:application/json'|jq"


```


# 参考
- [Stack with id does not exist](https://seed.run/docs/serverless-errors/stack-with-id-does-not-exist.html)
M5StickCでLCDが表示されない


## TL;DR
設定初期化スケッチ書いたら直った
https://lang-ship.com/blog/work/m5stickc-resetter/


## 症状
CO2測定器を作りとりあえず数日動かしていたものの、電源は余っていたモバイルバッテリーを使って、バッテリーがなくなって電源が落ちて以来起動してもLCDに表示されなくなる。


## 対策
大体先人がぶちあたってる箇所だった。

 * https://qiita.com/kazuhidet/items/7c0c6fa7995fa5da6e9a
 * https://lang-ship.com/blog/work/m5stickc-trouble-shoot/

CO2測定器でMH-Z19が繋がれていない場合はLCDでエラー表示をするというスケッチを書いていたため、LCDが表示されていなくてもLCDは光っていたため、本体は動いていてLCDだけが動いていないという状況。

普通にスケッチを書き込むことはできたので、後は以下のことを試したけどダメだった。

 * 別のモバイルバッテリーで一時間以上充電
 * `BAT`と`GND`を短絡して充電
 * M5BurnerでUIFlowのファームを焼き直し


## で、初期化スケッチ入れたら直った
`G0`と`3V3`を1k抵抗で短絡すれば電源ICにリセットがかかって直るらしいとあるものの、この自粛期間中で抵抗一本だけ買いに行くのもめんどくさいなと思いながら、設定初期化スケッチを書いたらLCDが表示されるようになった。

https://lang-ship.com/blog/work/m5stickc-resetter/

えっこれでいいの？？と思いつつも直ったのでヨシ！
Vagrant upしたらBluetoothイヤホンの音がおかしくなった時


作成日:2020/05/27

## 発生環境
MacOS:macOS 10.15.5
Vagrant:2.2.9
VirtualBox:6.1.8
CentOS:7

## 現象


YouTubeを見ながらvagrant upをしたところ
Bluetooth接続のイヤホンの音声出力がおかくしくなった
イヤホンを起動し直すと音は元に戻ったが、またすぐにおかしくなった。
音は出ているがノイズが酷く左右の音声バランスもおかしくなり
イヤホンの停止・再生、音量操作などリモコンも操作できなくなった
PCを再起動しても治らなかった。
Bluetoothイヤホンをやめて有線イヤホンを使うと問題は起きなかった


## 原因

Vagrantの不具合ではなくVirtualBoxが原因だったVirtualBox上で使用中のCentOSの設定で
オーディオ出力を有効化にチェックがついていたので外して設定を保存すると
音が戻った！

がしかし、またvvagrant upをすると現象が再発する・・・


## 対処法

vagrant upを実行した段階でVMのオーディオ設定を無効化にすれば良い

Vagrantfileに以下を追加する

```{.line-number}
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--audio", "none"]
  end
```

これによりvagrant upした時のおかしな音声出力は直った
Salesforceの承認プロセスのコメントの最大文字数について

# Salesforceの標準機能承認プロセスについて
　Salesforceの標準機能に承認プロセスというものがあります。社内承認フローを見直しのためにSalesforceを導入を開始したという利用者も話も聞くほどのメジャーな機能だと思います。この承認プロセスの承認コメントには最大文字数の制限があります。

# 今回の問題
　標準の承認申請のコメント入力欄で最大文字数を超えるとエラーが発生します。
この時の問題として、以下2つが挙げられます。
①開発者ではないユーザにとって、戸惑うエラーの表示内容。
<img width="663" alt="pic1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/ea25f410-68ef-f1ba-01e3-7e647d92fffa.png">
（正直このエラー文だと開発者でも戸惑いますね。）

②エラーになると入力したコメントが消失してしまう。

# 解決策
　おそらく標準の承認申請ボタンを使用すると解決策がないと思われます。承認申請の文字数チェックの機能を付けることが出来なくて、入力内容を返してあげることができないです。
　現状は、AuraかVFで画面を開発し、申請前にコメントの文字数チェックを実施するしか方法がなさそうです。
　せめてエラー文の表示だけでも、非開発者にも分かる(例えば、「コメントが最大文字数を超過しているため申請できません。」)様なものに変わってほしいです。

# この仕様の詳細
　[公式のヘルプ](https://help.salesforce.com/articleView?id=approvals_users.htm&type=5)には以下のように記載されています。
>承認申請を受信したら、承認、却下、または再割り当てをして返答します。使用する Salesforce の環境に応じて、いくつかのオプションがあります。承認申請のコメントは 4,000 文字に制限されています。中国語、日本語、または韓国語の場合は 1,333 文字に制限されます。

　日本語、韓国語、中国の1333文字の制限がどのようなものなのか、検証してみました。

①日本語1334文字
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/2fb92d0c-d05a-50a5-7171-1b3cbaf247f2.gif)
エラーとなります。

②日本語(全角)1330文字+半角3文字
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/fde274fe-fbff-3a8b-fac1-2c16a41914c6.gif)
エラーにならず、承認申請できます。

①、②の結果から、バイト数で計算されていることが分かります。

③日本語1333文字+半角1文字
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/960b2201-3a35-0354-f699-0217000782dc.gif)
エラーにならず、承認申請できます。
ちなみに、日本語1333文字+半角2文字はエラーとなります。

④日本語1333文字+改行
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/746a98e3-9f1c-e536-138e-eff6848091ea.gif)
もちろん改行もカウントされるためエラーとなります。

⑤バイト数が大きい文字1000文字
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/61b9c30b-6692-0b85-ecaf-e2accadee06b.gif)
日本語には3バイト以上の文字があります。その場合は1000文字でもエラーになります。
(もっと少ない文字数でもエラーになります。)

# まとめ
　利用者によっては、かなり重要な社内承認フローでも使用している場合もあるみたいで、その場合コメントも長文になるそうです。
　エラーになる様な長文が消失して、再入力しなければならないというのは辛いと思うので、要件次第ではカスタムで承認申請コンポーネントを開発したほうがいいかもしれません。
【開発環境としてのChromebook】Lenovo Chromebook Duetその１

# はじめに
これまでも何回かChromebookで開発環境構築するまでの道のりを記事にしてきました。
今回新たに快適ノマド開発（まだまだステイホームだけど）を実現すべく、新たな相棒端末を手に入れましたので、いろいろ検証してみようかと思います。

# 今回の端末
2020年1月に開催されたCESで発表されました「**Lenovo Chromebook Duet**」
が5月にいよいよアメリカにて発売開始となりました。
発表当時から気になっていたこの端末を無事入手することができました。

![Google Storeのティザー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/f30f58a5-2e2b-9ce3-71db-a437c95718b9.png)

#特徴
MicrosoftのSurfaceタイプのタブレット利用をメインとしたキーボードカバー付き端末となります。
White paperは[こちら](https://news.lenovo.com/wp-content/uploads/2020/01/Lenovo-IdeaPad-Duet-Chromebook_Datasheet-1.pdf])にありますが主たるスペックは以下の通りです。

||Lenovo Chromebook Duet|ASUS Chromebook Flip C101PA|
|:-:|:-:|:-:|
|CPU|MediaTek Helio P60 Octa-Core|RockChip OP1 Hexa-core|
|メモリ|4GB|4GB|
|ストレージ|eMMC 128GB|eMMC 16GB|
|ディスプレイ|1920x1200|1280x800|
|重量|450g+250g+220g=920g|900g|
|外付けSD|なし|あり|
|参考価格|$299|￥39,800|

これまで同じ位置づけで利用していたASUS Chromebook Flip C101PAと比べて見ました。

### ストレージ
純粋なるChromebookの使い方であればストレージはいくつかのAndroidアプリとダウンロードファイルをちょっと保持できればいいかな？ぐらいの使い道ですが、CrostiniでDockerぐらいは普通に使いたいなと考えると、16GBや32GBではぜんぜん足りないことがネックでした。今回はこの部分が大きく改善されています。
なおLenovo Chromebook Duetには外付けSDカードのスロットはありませんが、[前回記事](https://qiita.com/gontaneko/items/def4238d1b6b1cf0685a)で開発環境用ストレージとしてのSDカードは使い物にならないことがわかっているので特に気にしません。

### ディスプレイ
Visual studio Codeを使う際などちょっと狭いなと思う感じでしたが、この面でも大幅な改善が期待できます。
出荷時のデフォルトは1080x675ですが、最大1920x1200で表示できます。ただしだいぶ小さくなってしまうので、1440x900ぐらいがちょうど良いのではないかと思います。
気になる点としてはだいぶ反射します。日中屋外や日光があたるような席位置だと見難くなるかもしれません。

<デフォルトサイズ(1080x675)>
![デフォルト(1080x675)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/afd0ba72-1460-0fdb-256c-bff72cd62706.png)

<最大サイズ(1920x1200)>
![最大(1920x1200)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/2762ec0f-7808-9fd5-9f5a-609c763a173b.png)

<ちょうど良いかなと思うサイズ(1440x900)>
![中間?(1440x900)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/f3030cee-42a9-eac5-8d0d-f29a6d567413.png)


### キーボード
キーボードカバーですが机の上ではかなりしっかりした打鍵感があります。
Surfaceの時は斜めってるのも影響しているのか、力をいれた打鍵時にちょっとフニャフニャ感を感じました。
但し今回のキーボードは右から３列目がかなり特殊な形状をしています。他のキーと比べると2/3ぐらいの大きさしかないものがあります。矢印キーも小さいです。（Vimのキーマップを使いなさいということでしょうか）
これはだいぶ慣れが必要そうな気がします。万人におすすめできるかはちょっと微妙です。
（携帯性を追求した形としてトレードオフした結果だと思うので、これは割り切らないといけません）

![IMG_20200527_192641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/2b3fbb5e-79f1-3693-0e82-68b8994dd106.jpeg)


### タブレット
Chromebookによくあるフリップタイプではなく、タブレットで利用できることはとても大きいと思います。PDFやKindleなどのドキュメントビューアとして利用する場面においてとてもスマートに利用できます。
また、ちょっとしたモデリングなどをスケッチする場面などにおいても今後利用できるのではないかと思います。(USI方式のスタイラスに対応していますが、市場にあまり種類がないので、このへんは今後に期待です）

![Kindleで表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96398/3c5e1356-c193-fc01-584b-439efa0fa8b0.jpeg)

# 今回はここまで
長くなりましたので、今回はここまでです。
使い初めて１日目の印象としては、やはりこの端末はタブレットでこそ真価を発揮するのかなと感じました。ただし癖はあるもののキーボードも悪くない印象ですので、端末を持ち出してコードを書くにはちょう

次回はCrostiniを有効にしてVisual Studio Codeを入れたり、dockerしてみたりしようと思います。
StateとPropsの違い（React）

ReactのStateとPropsの違いがよくわからなかったのでメモ

##State
:point_up_tone1:変更可能
:point_up_tone1:そのコンポーネント自体が値を持っている
:point_up_tone1:setStateで更新することができる

＊Propsだけでできなかった時に使うようにする（なるべく使わない）

##Props
:star:外部からもらう値
:star:Readオンリー（変更不可）→通信が早い

###「mapStateToProps」と「mapDispatchToProps」

:airplane:mapStateToProps
・stateの値をcompornentのpropsに入れる

:airplane:mapDispatchToProps
・グローバルステート:React-reduxのstate
・React コンポーネントのツリーの一番上流（Buttonとか）

:helmet_with_cross::helmet_with_cross::helmet_with_cross:connect:helmet_with_cross::helmet_with_cross::helmet_with_cross:
connectを使うことで、親→子ではなく親→孫、ひ孫...にも渡すことができるようになる

```
const mapStateToProps = ({ app, taskSubscription }) => ({
  isLoading: app.isLoading,
  taskSubscription: taskSubscription.selected
})

const mapDispatchToProps = dispatch => ({
　//ページタイトルはこのサービス内全てで共通
  setPageTitle: pageTitle => dispatch(setPageTitle(pageTitle)),
})

export default connect(　　//ここで渡す
  mapStateToProps,
  mapDispatchToProps)
```

:writing_hand_tone1:（メモ）exportとは？
定義したものを外部からインポートできるようにする
defaultありとなしではimportの仕方が異なる。
:exclamation:defaultは1つのファイルに一つしか定義できない

`export default AAA`
→`import AAA from './sample.js'`

`export BBB`
→`import { BBB } from './sample.ls'`
*{}をつける