OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2統合されたDocker for WindowsでaptがRelease file for xxx is not valid yetなエラーになった場合の対処

Dockerのbuild時にapt getやapt updateをしていると"Release file for http://security.debian.org/debian-security/dists/buster/updates/InRelease is not valid yet"などのようなエラーが出る場合の問題です。

現象としてはまんま以下の記事のとおりです。
[apt update で Release file for xxx is not valid yet って言われる問題](https://qiita.com/nobuoka/items/1bb8cbb5af7be5259547)

上記の記事では
> Docker for Windows の場合は、restart すれば解決する。

とありましたが、WSL2が有効になっていてDocker for windowsがWSL2と統合されているとちょっと話がややこしくなります。
この場合Dockerデーモンが動いているホストはWSL2になるため、たとえWindowsホスト側から`docker build`などのコマンドを実行していても、WSL2側の時刻ズレの影響を受けます。
そのため、WSL2の時刻ズレを修正してあげる必要があります。

WSLの時刻ズレを修正するには、WSLに入った状態で、
`sudo hwclock -s`
を実行します。
これによりWindowsホスト側の時刻と同期されます。

参考: [Release file for repository is not valid yet](https://github.com/microsoft/WSL/issues/4114)

Windowsの時刻はズレてないしDockerのrestartしても直らないなーと少しハマったのでメモ。

**追記**

同じ原因でnpm installが

```
error code CERT_NOT_YET_VALID
```

というエラーになった場合もありました。
同様に時刻ズレを補正することで成功するようになりました。
JAG Practice Contest for ACM-ICPC Asia Regional 2012 C Median Tree

##問題
https://atcoder.jp/contests/jag2012autumn/tasks/icpc2012autumn_c
##見た感じ
中央値を最小にしたくて、最小全域木の中央値が最小になりそう。
もしそうじゃないとり方の場合、大きさ順後半n/2個に含まれるある辺より重みの小さい使っていない辺が存在するので、そこを取り換えても中央値の値は小さくなるもしくはそのままである。
よって、最小全域木の場合より中央値が小さくなることはなくて、よって最小である。
##解法
Kruskal法していく
今回はノードの個数が偶数個であることに注意
##ソースコード
```c++
struct uftree{
    int cou;
    vector<int> parent;
    vector<int> rank;
    vector<int> _size;
    uftree(int n){
        parent=vector<int>(n);
        rank=vector<int>(n,0);
        _size=vector<int>(n,1);
        cou=n;
        rep(i,n){
            parent[i]=i;
        }
    }
    int root(int i){
        return parent[i]==i?i:parent[i]=root(parent[i]);
    }
    bool same(int i,int j){
        return root(i)==root(j);
    }
    void merge(int i,int j){
        i=root(i);j=root(j);
        if(i==j)return;
        cou--;
        if(rank[i]>=rank[j]){
            parent[j]=i;
            _size[i]+=_size[j];
        }else{
            parent[i]=j;
            _size[j]+=_size[i];
        }
        if(rank[i]==rank[j])rank[i]++;
        return;
    }
    int count(){
        return cou;
    }
    int unitsize(int i){
        return _size[root(i)];
    }
};
const int N_MAX=100005;
int n,m;
vector<ll> ans;

void Main(){
    int x=0,y=INF10,z=1;
    //入力
    
    while(1){
        cin>>n>>m;
        if(n==0&&m==0)break;
        uftree  tree(n);
        priority_queue<ppll,vector<ppll>,greater<ppll>> que;
        rep(i,m){
            cin>>x>>y>>z;
            que.push({z,{x-1,y-1}});
        }
        int count=0;
        ll res=0;
        while(count<1+(n-1)/2){
            ppll now=que.top();que.pop();
            if(tree.same(now.second.first,now.second.second))continue;
            tree.merge(now.second.first,now.second.second);
            count++;
            if(count==1+(n-1)/2)res=now.first;
        }
        ans.pb(res);
    }
    //処理
    //出力
    for(auto l:ans){
        cout << l <<endl;
    }
}

int main(){
    cin.tie(nullptr);
    cout<<fixed<<setprecision(1);
    Main();
}
```
RPGツクールMVで複数の暗号化画像リソースに強引に対応する

わかりやすさ優先で、Sysytem.jsonにキーを追加します

```json:System.json
    "encryptionKey2":"<暗号化キー>",    
```

読めるようにします

```JavaScript:rpg_core.js

Decrypter._encryptionKey = "";
Decrypter._encryptionKey2 = ""; // 追加
Decrypter._ignoreList = [
```

```JavaScript:rpg_core.js

Decrypter.readEncryptionkey = function(){
    this._encryptionKey = $dataSystem.encryptionKey.split(/(.{2})/).filter(Boolean);
    this._encryptionKey2 = $dataSystem.encryptionKey2.split(/(.{2})/).filter(Boolean); // 追加
};
```

既存の関数をコピペしてデコード関数を追加します

```JavaScript:rpg_core.js
Decrypter.decryptArrayBuffer2 = function(arrayBuffer) {
    if (!arrayBuffer) return null;
    var header = new Uint8Array(arrayBuffer, 0, this._headerlength);

    var i;
    var ref = this.SIGNATURE + this.VER + this.REMAIN;
    var refBytes = new Uint8Array(16);
    for (i = 0; i < this._headerlength; i++) {
        refBytes[i] = parseInt("0x" + ref.substr(i * 2, 2), 16);
    }
    for (i = 0; i < this._headerlength; i++) {
        if (header[i] !== refBytes[i]) {
            throw new Error("Header is wrong");
        }
    }

    arrayBuffer = this.cutArrayHeader(arrayBuffer, Decrypter._headerlength);
    var view = new DataView(arrayBuffer);
    this.readEncryptionkey();
    if (arrayBuffer) {
        var byteArray = new Uint8Array(arrayBuffer);
        for (i = 0; i < this._headerlength; i++) {
            byteArray[i] = byteArray[i] ^ parseInt(Decrypter._encryptionKey2[i], 16);
            view.setUint8(i, byteArray[i]);
        }
    }

    return arrayBuffer;
};

```

読み込み処理を多重化します


```JavaScript:rpg_core.js
Decrypter.decryptImg = function(url, bitmap) {
    url = this.extToEncryptExt(url);

    var requestFile = new XMLHttpRequest();
    requestFile.open("GET", url);
    requestFile.responseType = "arraybuffer";
    requestFile.send();

    requestFile.onload = function () {
        if(this.status < Decrypter._xhrOk) {
            var arrayBuffer = Decrypter.decryptArrayBuffer(requestFile.response); //Bitmap
            bitmap._image.src = Decrypter.createBlobUrl(arrayBuffer);
            bitmap._image.onload = Bitmap.prototype._onLoad.bind(bitmap); 
            //Bitmap.prototype._onError.bind(bitmap);
            bitmap._image.onerror = ()=>{

                var requestFile2 = new XMLHttpRequest();
                requestFile2.open("GET", url);
                requestFile2.responseType = "arraybuffer";
                requestFile2.send();
            
                requestFile2.onload = function () {
                    if(this.status < Decrypter._xhrOk) {
                        var arrayBuffer2 = Decrypter.decryptArrayBuffer2(requestFile2.response); //Bitmap
                        bitmap._image.src = Decrypter.createBlobUrl(arrayBuffer2);
                        bitmap._image.onload = Bitmap.prototype._onLoad.bind(bitmap);
                        //bitmap._image.onerror = Bitmap.prototype._onError.bind(bitmap);
                    }
                };
            };
            
            
        }
    };

```

こうすると、(読み込み失敗時は別のキーを使ってリトライすることによって)複数の暗号化キーによって暗号化された画像に強引に対応されます。
EC2デプロイ時、bundle installができずUndefined local variable or method `git_source' for Gemfileのエラーが出る件

EC2デプロイ時に、サーバーにアプリをcloneするもbundle installでエラーが発生してハマりましたので、忘備録として載せておきます。

#環境
Ruby 2.5.1
Rails 5.2.4.3

[こちら](https://qiita.com/Yuki_Nagaoka/items/dbb185feb6d4f051c2f2)の記事を参考にAWSにデプロイを進めている最中、bundle installを試みると以下のエラーが発生しました。

```
$ bundle install
-bash: bundle: コマンドが見つかりません
```
どうやら先にbundlerをインストールする必要があるみたいです。

```
$ gem install bundler
Fetching: bundler-2.1.4.gem (100%)
Successfully installed bundler-2.1.4
Parsing documentation for bundler-2.1.4
Installing ri documentation for bundler-2.1.4
Done installing documentation for bundler after 4 seconds
1 gem installed
```
bundlerがインストールできたようです！
bundle installしてみます。

```
$ bundle install
Traceback (most recent call last):
	2: from /home/hiroki/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
	1: from /home/hiroki/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/home/hiroki/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```
違うエラーが出ています。
調べてみた結果、こちらのエラーはGemfile.lockに記載されているbundlerと実際にインストールされているbundlerののヴァージョンが違うということみたいです。
自分のGemfile.lockを確認したところ、bundler (>= 1.3.0)という記載があるのでバージョンを指定してインストールしてみます！

```
$ gem install bundler -v 1.3.0
Fetching: bundler-1.3.0.gem (100%)
Successfully installed bundler-1.3.0
Parsing documentation for bundler-1.3.0
Installing ri documentation for bundler-1.3.0
Done installing documentation for bundler after 1 seconds
1 gem installed
```
インストールできたので再度bundle installを行います。

```
$ bundle install
Undefined local variable or method `git_source' for Gemfile
        from /var/www/rails/Ticket-Rec/Gemfile:2
```
なんとまたエラーがでてしまいました。
こちらのエラーについて調べたところbundlerのバージョンが古いのでバージョンを上げると解決する場合があるとのことですが…
clone元は問題なく動いてたので、他に何か原因があるのではと思います。

#解決

Gemfile.lock内に記載されているBUNDLED WITHのバージョンにbundlerを合わせると無事インストールできました。
Gemfile.lockの一番下に以下の記載があります。

```Ruby:Gemfile.lock
BUNDLED WITH
   1.17.1
```
再度bundlerのバージョンを指定してインストール

```
$ gem install bundler:1.17.1
Fetching: bundler-1.17.1.gem (100%)
Successfully installed bundler-1.17.1
Parsing documentation for bundler-1.17.1
Installing ri documentation for bundler-1.17.1
Done installing documentation for bundler after 3 seconds
1 gem installed
```
この後bundle installを実行すると無事成功しました！

#参考
[【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法【その1〜ネットワーク,RDS環境設定編〜】](https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2)
PHPStormなら、「あ〜これ別のメソッドに切り出したいな〜」ってときに一瞬でした


![Jun-22-2020 17-48-06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/60688d66-f9b9-2bc7-91b2-05919f7c8fe6.gif)

# 例

以下のようなコード、
パンケーキを3つ焼くメソッドがありますが、ループの中でパンケーキを焼く処理を細かく記述されています。
もちろんこれでもそれほど悪いコードではないと思いますが、
パンケーキを焼くための詳細なロジックを他のメソッドに切り出せたら、メソッド全体の見通しが少しスッキリしそうです。

```php
class Test
{
    public function makeThreePancake(): void
    {
        $kitchen = new Kitchen();
        $kitchen->initialize();

        foreach (range(0, 3) as $i) {
            // 見通しが悪い処理
            $pancakeMaker = new PancakeMaker($kitchen, $i);
            $pancakeMaker->mix();
            $pancakeMaker->bake();
            $pancakeMaker->turnOver();
            $pancakeMaker->bake();
            $pancakeMaker->getPancake();
            print 'パンケーキが焼けたよ';
        }

        $kitchen->finalize();
    }
}
```

メソッドに切り出したい箇所を選択して`Refactor > Extract > Method...` をクリックします
メソッド名、アクセス修飾子を選択するとメソッドに切り出してくれます。

結果は以下のようになります。

```php
class Test
{
    public function makeThreePancake(): void
    {
        $kitchen = new Kitchen();
        $kitchen->initialize();

        foreach (range(0, 3) as $i) {
            $this->makePancake($kitchen, $i);
            print 'パンケーキが焼けたよ';
        }

        $kitchen->finalize();
    }

    /**
     * @param Kitchen $kitchen
     * @param $i
     */
    private function makePancake(Kitchen $kitchen, $i): void
    {
        // 見通しが悪い処理
        $pancakeMaker = new PancakeMaker($kitchen, $i);
        $pancakeMaker->mix();
        $pancakeMaker->bake();
        $pancakeMaker->turnOver();
        $pancakeMaker->bake();
        $pancakeMaker->getPancake();
    }
}
```

これで`makeThreePancake()`がスッキリしました。
コードの中で使ってるローカル変数をメソッドの引数にしてくれるのが賢いですね。

以上、参考になりましたら幸いです。
micro:bit BLE通信で加速度を10Hzで計測してPCで計測する

# マイクロビットのBLE無線通信機能とシリアル通信機能で加速度計測器をつくる
マイクロビットはブロックプログラミングで多彩なプログラミングができるマイコンです。そのマイクロビットを２つ使って、内蔵の加速度センサで加速度を計測し、BLE通信で無線化します（送信プログラム参照）。その無線通信で送られた値を、もうひとつのマイクロビットで受信させ10Hzでシリアル通信で母艦に送ります（受信プログラム参照）。
母艦にはUart-plotterというシリアル通信を受信して、Logデータを保存しながら画面上にグラフ表示するフリープログラムを動作させます（下図参照）。
これらを、動作させることで、ロボットなどに搭載したマイクロビットによって非計測物の加速度情報をデジタルデータ化できます。
![スクリーンショット 2020-06-22 17.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237044/9e0884e8-82c9-0a1e-1599-16f0eb23b395.png)


# 関連プログラム
- [microbit share link: 送信プログラム](https://makecode.microbit.org/_AexgsHXMPLx3)
- [microbit share link: 受信プログラム](https://makecode.microbit.org/_fwPXpffpW3aL)
- [Uart-Plotter](https://afur.biz/uart-plotter/)
- [GitHub 送信プログラム](https://github.com/tmdoi/microbit_BLE_ACC_Trans)
- [GitHub 受信プログラム](https://github.com/tmdoi/microbit_BLE_Acc_Receive)

# 関連動画
以下のYouTubeチャンネルで動画にて類似のプログラムを説明しています。
- [送信プログラム](https://makecode.microbit.org/_AexgsHXMPLx3)
- [受信プログラム](https://makecode.microbit.org/_AudAcbJxwCRF)
- [Uart-plotter](https://afur.biz/uart-plotter/)
- [理科づき集まれマイクロビット実習・シーズン２・５週目・加速度計測実験](https://www.youtube.com/playlist?list=PLPKfPNY87vShK5lnIV94eDTJJK0g5Of87)
- [理科づき集まれマイクロビット実習・シーズン２・全６週](https://www.youtube.com/playlist?list=PLPKfPNY87vSirj3sSpAgth26AXPPN6A0C)
- [簡単マイコン教室：YouTubeチャンネル]()

# 関連ホームページ
- [簡単マイコン教室 micro:bit 大好き！おっちゃん先生のホームページ](https://qiita.com/tmdoi/items/61be444e1879912aa2a5)

# 参考リンク
- [端子入力と音のサンプル](https://makecode.microbit.org/_hX2KHi9xa0bw)
CloudWatch Synthetics でスクリーンショットなどが保存されない場合の対処

CloudWatch Synthetics を使ってて、 Canary 実行は正常に OK、 NG を返しますが、スクリーンショット、 HAR ファイル、 ログなど、 S3 に保存される情報が確認できないという状態になってました。

## 結論
Canary を VPC から実行 （実体は VPC Lambda） されていて、さらに S3 の VPC エンドポイントが設定されていて、ポリシーの設定に不備があるのが原因でした。

ポイントとしてはバケット（リソース）自体に付与するポリシー （`PutObject`, `GetBucketLocation`） とバケット一覧を取得する `ListAllMyBuckets` が必要でした。
ここでハマったのが `ListAllMyBuckets` はバケット（リソース）レベルで付与するポリシーということではなかったので上手く権限設定できていないというところでした。 

最終的に設定したエンドポイントのポリシーは以下のような形です。 `ListAllMyBuckets` を設定する場合は `Resource` を `*` にするのがポイントになります。

```json:VPCエンドポイントポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::cw-syn-results-XXXXXXXXXXXX-us-west-2/*",
                "arn:aws:s3:::cw-syn-results-XXXXXXXXXXXX-us-west-2"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}
```

Canary の Lambda のログには「ListAllMyBuckets の許可がないよ」が出てましたが、設定方法を間違っていたため解決に時間がかかっていました。

以上。
GCP Professional Cloud Architect プログラミング初級者最短取得方法

# 記事の目的
ブログやqiitaで記載されているGCPの認定試験の内容の大半がプログラミングの熟練者だったりAWSなどのクラウド開発経験者ばかりで初心者レベルの記事がありません。そこでプログラミングを少しかじった程度の私がGCP Professional Cloud Architectの認定をされるまでに必要だった情報をここに記録し情報の共有をしたいと思います。

# おすすめ読者
* プログラミングやITをかじった程度の経験者

# 記事者のスペック
* railsチュートリアルをなんとか独学で完走できる
* GCPの模擬問題に記載されているIT専門用語が全くわからない(サブネットなど)
* ドキュメントを読んで理解するまで時間がかかるタイプ

#勉強時間
100時間超えました。事前知識がなければ多くの時間が必要でしょう。

# 勉強前の知識
[Professional Cloud Architect試験ガイド](https://cloud.google.com/certification/guides/professional-cloud-architect?hl=ja)を必ず全て読みましょう。

# 勉強ポイント
[GCPドキュメント](https://cloud.google.com/docs?hl=ja)が全ての要であり非常に重要な内容が記載されています。しかしドキュメントを全て正しく読み解き実際に活用することは数週間の勉強では圧倒的に足りません。そこで最低限知っておくとべき情報を身に付け、余裕があれば補強していく勉強の仕方が良いと思います。

# 勉強方法
以下の勉強方法を取りながら全くわからない単語から曖昧な単語までを全て調べながら勉強していくとよいでしょう。
## プロダクトを知る
[GCP公式サイト](https://cloud.google.com/docs?hl=ja)から主なプロダクトを確認します。
![スクリーンショット 2020-06-22 16.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319183/3e250074-c87e-8f96-2e40-c1f541260371.png)
ここではプロダクトを三行で大雑把な内容が示されています。まずはここからどのようなプロダクトがあるのか理解しましょう。

## よく使われるプロダクトや設計パターンを知る
[Architecting with Google Compute Engine 日本語版専門講座](https://www.coursera.org/specializations/gcp-architecture-jp)の受講や[Google Cloud Platform エンタープライズ設計ガイド](https://www.amazon.co.jp/Google-Cloud-Platform-%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%E8%A8%AD%E8%A8%88%E3%82%AC%E3%82%A4%E3%83%89-%E9%81%A0%E5%B1%B1/dp/4822257908/ref=asc_df_4822257908/?tag=jpgo-22&linkCode=df0&hvadid=295686767484&hvpos=&hvnetw=g&hvrand=4781068358185037433&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-526224396361&psc=1&th=1&psc=1)を読み大まかな内容やよく使われるプロダクトのパターンを覚えていきましょう。認定試験では詳細なプログラミング問題や詳細な操作問題を追求するものはなかったので「Architecting with Google Compute Engine 日本語版専門講座」のQwiklabsハンズオンクラウドトレーニングはやらなくても資格を取れると思います。ただし使用する拡張子の問題やサーバーのデフォルト設定ルートなどは出てきました。

## ↑の内容を復習する
[Preparing for the Google Cloud Professional Cloud Architect Exam 日本語版](https://www.coursera.org/learn/preparing-cloud-professional-cloud-architect-exam-jp)で今まで学んできたことを再確認しましょう。コースの本題ではどのように勉強すると試験に受かりやすくなるかを説明していますが、内容は短い時間で主なプロダクトの復習ができるコースになっていると思います。特に表や図がわかりますくまとめられているので試験前に確認するのも良いと思います。

##模擬試験を受ける
[GCP模擬問題集](https://googlecloud.4watcher365.dev/tag/professional-cloud-architect/)や[公式模擬試験](https://docs.google.com/forms/d/e/1FAIpQLSc4uGyqcfAzoXdjRBsLEErZzQO4NUu5wljpHLoRGv7ZCi9yxA/viewform?usp=send_form)を受けてみましょう。選択問題しかありません。答えがあっているかどうかよりも選択一つ一つを理解して正しい理由や正しくない理由を言えるようにしましょう。答えられないところが勉強不足な部分です。

## 時間が許す限り公式ドキュメントを読む
おすすめなドキュメントはユースケースが書いてあるものや図があるものです。それらは一つのプロダクトだけを使っているわけではなく他のプロダクトやGCP以外のサービス、オンプレミスなどといったリアルな使用例を記載しているのでGCPの立ち回りが理解しやすいです。

##試験前に知っておくと幸せになれるかも
上記で記載したGCP模擬問題集の内容がそのまま出題されたこともあったのでかなり使えました。
試験では見直したい内容にマークすることできるのでわからない問題を飛ばしてしまっても戻るのが簡単です。
試験の文字フォントはMS明朝体ですごく見づらかったです。
試験はオンライン、オフラインでも受講が可能です。
私の試験時間の配分は60分解き、60分見直しでちょうどでした。９割ぐらい回答を説明できる内容で残りの１割は全くわからなかったので自分が勉強していなかった範囲だと思います。
受講開始時間は決まっていますが、私の場合当日早めにいって受講開始時間を前倒して受けることも可能でした。
テストセンターの状態が良かったのか耳栓、ヘッドホン型耳栓、マウスカーソル速度変更マウスがありました。
試験前にカーソルの速度を変えておいた方が誤爆がなくてすみます(初期設定がハイセンシのマウスだったので誤爆して開始早々終了ボタンを押すところでした
【JavaScript】テキストボックスを含むTableからテキストを取得する

#はじめに
通常のtext要素だけで構成されるtableからテキストを取得する方法の解説記事は多かったが、
inputを含んだtableから取得している記事はあまり見られなかったので、メモついでに。
まあ、やっていることはほぼ変わらないのですが...

#やりたいこと
こんな感じでtdタグの中にinputが入っていて、ユーザーが編集できたりするテーブルですね。
このテーブルからinputの部分も含めて、body部分のテキストを全て抽出します。

![20200622-152056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660151/ece5ca77-3d7f-9cb5-7526-47647c7a3ef9.png)

```html:table.html

<!DOCTYPE html>
<html>
<head></head>
<body>
 <table id="table" border="1"  cellpadding="10">
    <tr>
      <th>名前</th>
      <th>年齢</th>
      <th>性別</th>
      <th>出身地</th>
    </tr>
    <tr>
      <td>山本</td>
      <td>
          <input type="number" style="font-size: 16px;" value="27">
      </td>
      <td>男</td>
      <td>栃木</td>
    </tr>
    <tr>
      <td>高橋</td>
      <td>
        <input type="number" style="font-size: 16px;" value="42">
      </td>
      <td>女</td>
      <td>高知</td>
    </tr>
    <tr>
        <td>渋谷</td>
        <td>
            <input type="number" style="font-size: 16px;" value="35">
        </td>
        <td>男</td>
        <td>神奈川</td>
      </tr>
  </table>
</body>
</html>
```

#テキストボックスを含むTableからtdタグの値を全取得する関数

```javascript:sample.js

function getTableData(){
    // 抽出したデータを格納する配列
    let data = [];
    // idでhtmlからtableの要素を取得し、trタグのNodeListを取得
    let table = document.getElementById('table');
    let tbl_tr = table.querySelectorAll('tr');
    //テーブルの1行(trタグ)毎に処理
    tbl_tr.forEach(function(tr){
        //tdタグのNodeListを取得
        let cells = tr.querySelectorAll('td');
        //テーブルのヘッダー部分は飛ばす
        if (cells.length!=0){
            // テーブルの1行(trタグ)のデータを格納する配列
            let d =[];
            //セル(tdタグ)毎に処理
            cells.forEach(function(td){
                //セルがinputタグだった場合
                if(td.innerHTML.indexOf('input') != -1) {
                    d.push(td.firstElementChild.value);
                }
                //セルがtextだった場合
                else if(td.textContent!=""){
                    d.push(td.textContent);
                }
                //セルが空白だった場合
                else{
                    d.push("");
                }
            });
            data.push(d);
        }
    });
    return data
}
```

このjsファイルで作成しているgetTableData()を呼び出してあげると、以下のような配列が返ってきます。

```
0: (4) ["山本", "27", "男", "栃木"]
1: (4) ["高橋", "42", "女", "高知"]
2: (4) ["渋谷", "35", "男", "神奈川"]
```
EC2手動デプロイに失敗してしまったので対応内容のメモ

# EC2デプロイ

EC2インスタンスにて手動デプロイを行った際、こけた内容をメモします。

## Nodeを使用する場合
サーバー側追記設定
BootStrapなど使用している場合サーバー側にNodeのインストールが必要になります。

```node.sh
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
```

```
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install -y yarn 
```

## コンソールのエラーログに bundle instal関連が記載されていた場合

```libcurl.sh
sudo yum -y install curl
sudo yum -y install libcurl libcurl-devel
```

## S3が反映されなかった場合
設定周りで問題がない場合、EC2インスタンス再起動

## 本番環境にシードファイルを実行する場合
EC2上で実行

```seed.sh
cd /var/www/アプリケーション名/
cd current/
bundle exec rails db:seed RAILS_ENV=production
```

# 参考資料
http://blog.serverworks.co.jp/tech/2020/01/19/rails6/
https://qiita.com/pieroplus/items/a9a7b2d1bf1674bdc622
https://qiita.com/potterqaz/items/01e1279989f9494c488a
scipy/solve_ivp における初期条件のイベント検知回避

# 問題点
`solve_ivp`のイベント検知関数 `find_active_events` はデフォルトで以下のように定義されている．（コメントは省略した）

```python:ivp.py
def find_active_events(g, g_new, direction):
    g, g_new = np.asarray(g), np.asarray(g_new)
    up = (g <= 0) & (g_new >= 0)
    down = (g >= 0) & (g_new <= 0)
    either = up | down
    mask = (up & (direction > 0) |
            down & (direction < 0) |
            either & (direction == 0))

    return np.nonzero(mask)[0]
```

上記定義に従うと，初期条件 $(t_0, y_0)$ が `g=event(t0,y0)=0` を満たす場合でもイベントを検知してしまうため，例えば Poincaré 断面 $\Pi_0 = \\{ \boldsymbol{x} \in R^n ~|~ x = 0\\}$ 上の点を初期条件として再び $\Pi_0$ 上へ戻る軌道を計算したい場合などには不便である．

# 解決策
このイベントを回避するためには，`ivp.py` を直接，以下のように変更すれば良い．

```python:ivp.pyの変更
# up = (g <= 0) & (g_new >= 0)
up = (g <= -1e-12) & (g_new >= 0)

# down = (g >= 0) & (g_new <= 0)
down = (g >= 1e-12) & (g_new <= 0)
```

# 原理
`g` の値は `g_new` の古い値をストアしているに過ぎないため，必ず `g == 0` よりも（時系列的な意味で）先に `g_new == 0` が検知される．
言い換えれば，`g == 0` によって検知されるイベントはすべて「初期条件により生じるイベント」といえる．

そこで，`abs(g) < 1e-12` の場合にはイベントを検知しないよう，上記の変更を施せば，初期条件由来のイベント検知を回避でき，かつ元々の機能も損なわない．

# 補足
`ivp.py` の格納場所は `inspect` モジュールの `getfile` 関数によって確認できる．

```python
>>> from scipy.integrate import solve_ivp
>>> import inspect
>>> inspect.getfile(solve_ivp)
```
初めてのアプリ　トラブル日記

文系なわたしですが、2020年3月からAppleホームページのswift programming language guide(https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html)
から勉強してから３ヶ月が経ちました。3月は夜と週末しか時間がないですが、4月になってからコロナの関係で自宅で待機になり、毎日swiftと戦っています。

何か目標があった方が効率が良いと思うので、興味がある「芸能・エンターテイメント」情報を中心としたSNSアプリを作るようにしています。面白いと思った機能、新しく勉強した知識どんどんこのアプリに入れます。今このアプリはどんどんきれいになり、realmも使えるようになってきていますが、改善点がどんどん出てきて、改善に当たってのトラブルも多いです。

そこでトラブルを記録して、解決できた時には解決案も書こうと思っています。

2020年6月22日時点　問題①
realmに保存したデータ（日記全件のタイトルや本文）を抽出したものを「diaries」と定義した。
if let diaries != nilの前提で、diariesをForEachループし、タイトルだけの一覧をUIに表示、
.onDelete(perform:deleteFromRealm)で削除機能を実装しました。

問題は、削除をクリックして確定しても、削除されたはずのセルは消えない！
でも再度アプリを起動したら消えているし、realmデータを見たら消えているし、
UIがUpdateされていないだけだと思っています。

ちなみに、diariesは＠Stateで定義しているので、データが変わる途端、UIが更新されるはず。。。
deleteFromRealm関数の中で削除実施後、realmから再度全件データを取得、それをdiariesへ与えるのを
試しました。FetalError発生でした。
Reload、Refreshとかを実装してみたいが、方法がまだわかりません。
ていうか、なんで＠Stateで定義したのにAuto更新しないのか知りたい！！

調べてみましたけど、同じ状況の人もいるが、まだ解決案まで辿り着いていません。
ソースコードはこんな感じです。↓
MarkdownでLatex数式を正しく反映したPDF/HTMLを作成する with Mathjax（VScode，markdown-pdf）


# 目的

VScodeでmarkdownを用いて数式を正しく表示したPDF，html資料を作成する。

実行環境は`Markdown All in One`と`markdown-pdf`の拡張環境を導入したVScode（On Windows10）とします。



## 背景と課題

Latex数式をMarkdown上で表示する方法は多くの場合2通りに分類できます。（他にあったら教えて下さい。）

- Katex を使用
- Mathjax を使用

Markdown Previewと同じKatexを用いて表示したい場合は[こちらの記事](https://qiita.com/1gy/items/5b1f3c772b6da43cc13e)が参考になります。

課題として，Katexを使った場合

- いくつかのLatex記法（例えば`\align`）が使えない
- `\newcommand`などのマクロ宣言を大幅に書き換える必要がある [参考例](https://motchy99.blog.fc2.com/blog-entry-127.html)

など不都合が存在します。一方Katexが使われる理由としてはレンダリングが早いというのが挙げられるようです。

そこで，**Katexの代わりにQiitaの数式表示などにも用いられているMathjaxを使用するようにします。**

# 解決策

**template.htmlの変更による変換時のMathjaxの有効化**を用います。

テンプレートファイルを開く手順は，

1. `Cmd+Shift+P`でコマンドパレットを呼び出し`Extensions: Open Extensions Folder`でEnterする。
2. `yzane.markdown-pdf-x.x.x\template`のフォルダに移動する。
3. template.htmlを開き，以下の文を追記する。

```html
  <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    <script type="text/x-mathjax-config">
        MathJax.Hub.Config({ tex2jax: {inlineMath: [['$', '$']]}, messageStyle: "none" });
    </script>
```

なお，場所はheadとbodyの間にいれましたが，多分どこでも良いはずです。
参考にしたQ&Aは[こちら](https://github.com/yzane/vscode-markdown-pdf/issues/21)。


万が一変更しすぎてわからなくなった場合は，デフォルトのtemplateを[Githubのページ](https://github.com/yzane/vscode-markdown-pdf/blob/master/template/template.html)から落としてきます。


# TODO
上田先生の[詳解確率ロボティクスの授業スライド](https://github.com/ryuichiueda/LNPR_SLIDES)をPDFにしようとするのに使いました。


## Previewで結果を確認できない合わない問題

- MarkdownのPreviewがKatex準拠のままなのでPDFに変換するまで数式が出力されない問題があります。

Previewの見た目。（Katexのエラーが出る場所は見れない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/c107cf60-9a3a-90a5-b180-fab5d8a4c172.png)

HTMLに変換した見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/9983664b-49e5-4622-17ba-97ef1d01b27f.png)

## Mermaidやpumlを書く

仕様書などでumlなどを書くときに含めれたら良いなと思います。
Preview-enhancedならできるようなのでPDF化もできるのかなとは思っています。

[参考](https://qiita.com/tamaki_osamu/items/b5785930a77d44bba59c)

もっとも，そこまで求めるならasciidocで書いたほうが良いかもしれないですが…
ProgateのRuby on Railsコースで気になった所【エラーメッセージのeach文】

プログラミング未経験の初心者ですが、少し前にProgateのRuby on Railsコースを終わりました。

Railsチュートリアルをしながら復習してみると、Progateをやっていた時はあまりピンと来なかったけど、今なら少し理解できることが増えたので、気づいた点をまとめていきたいと思います。
この記事はその2です。
その1はこちら
https://qiita.com/HiMinmeg/items/1e29bf9252096d463f6b

Progateしているけど、ピンと来ていないな、ここ分からないなと思っている方のお役に立てば幸いです。

## エラーメッセージのeach文【コースⅤ】
バリデーションをかけて、投稿に対してエラーとなった時（制限文字数以上入力したとか…）投稿すると、エラーメッセージが表示されるようにします。

この時、each文を使う理由が分かっていませんでした。
考えてみると当たり前のことだったのですが、それでも理解できた時嬉しかったので、記録に残したいと思います。

エラーメッセージのeach文は例のような使い方になります。

      <% @post.errors.full_messages.each do |message| %>
          <%= message %>
      <% end %>

`errors.full_messages`はエラー内容を配列で取得します。

参考記事　https://qiita.com/ryuuuuuuuuuu/items/1a1e53d062bff774d88a
　　　　　[Railsガイド　7.バリデーションエラーに対応する](https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B)
　　　　　[Railsガイド　8.バリデーションエラーをビューで表示する](https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)

ここでポイントなのは、バリデーションを複数かけているとエラー内容で取得する配列も複数あるということです。
なので、each文で配列の中身を一つずつ取り出す必要があります。
エラーが同時に複数発生する可能性はあるので、そこをまったく考えていなかったが為に、どうしてeach文なのだろうと思っていた、ということでした。


## まとめ

・`errors.full_messages`はエラー内容を配列で取得する。
・リデーションを複数かけているとエラー内容で取得する配列も複数あるため、each文で配列の中身を一つずつ取り出す必要がある








ここまで目を通していただきありがとうございます。
間違っている場合、コメントでご指摘ください。
参考になれば嬉しいです。
pandas でエクセル(xslx)データを読むメモ 

```py
pd = pandas.read_excel(filename, sheet_name=N, index_col=None, header=None)
```

`sheet_name` でシート名前指定はものによってはだめっぽい? シート番号であれば OK

インデックスラベル(例)のは `index_col=1` などで調整可能(0 ベース)
カラムラベル(行)は, `header=0` などで調整可能(0 ベース)

## インデックス, カラムのラベルを取得

`.columns`, `.index` で取得可能(Index 型)
`.columns.values`, `.index.values` で array 型で取得可能


## セルの値を取得

https://stackoverflow.com/questions/16729574/how-to-get-a-value-from-a-cell-of-a-dataframe

`iat[x, y]` で取得できる.

インデックスやヘッダにラベルがついている場合は `at['A', 0]` のようにできるようだが, `read_excel` 時に index_col, header 両方を設定しておかないとだめっぽい.


`.values` で, numpy 2D array としてセル値を取得できる.

## 大きさ

`.shape` で取得できる

### 行の値, 列の値を取得

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html

`.iloc` を使う.

`.iloc[3]` 列 3 を取得
`.iloc[[3]]` 行 3 を取得

範囲指定もできる. ただ, 行の場合は `.iloc[[3, 10]]` と記載する.

#### ラベルから取得

行を取得.

`.loc['Theta']`

列を取得は少し書き方が変わる.

`.loc[:,['A']]`

#### 数値だけ取得する.

セルを全部数値(float)で取得したい場合. `values` で取得して, このままだとセルの値は object 型なので, `astype` で変換する. numpy 形式なので `np.float32` でもいいかもしれません.

`.iloc[[3, 5]].values.astype('float32')`


## ラベルから値を取得

特定のラベル名から値を取得したい場合.

`.lookup(['Theta'], ['Phi'])` のようにしてラベルの配列を指定して取得できる.

## CSV へ変換

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

`.to_csv` で行ける.

`.to_json` で JSON もいける.

## TODO

* [ ] xslx 読んだあとでインデックスやヘッダーの列を変更する方法を探す
* [ ] シート名を取得する
  * とりあえずは LibreOffice なりで開いて確認でもいけるが
   
## 参考文献

* https://note.nkmk.me/python-pandas-read-excel/
* Pandas でデータフレームから特定の行・列を取得する https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA
Delta Lake について翻訳し、まとめてみた

##はじめに
Delta Lake について、下記のリンク先の記事と動画を参考に、内容を翻訳してまとめてみました。
本記事にはより詳細な内容が記載されているので、そちらも参照してください。

■リンク

- [Databricks Delta Lake and Its Benefits](https://www.slideshare.net/databricks/databricks-delta-lake-and-its-benefits)
- [Delta Lake - Reliable Data Lakes at Scale](https://delta.io/)

##Delta Lake について
###Delta Lake とは

Delta Lake はデータレイクに信頼性をもたらすオープンソースのストレージレイヤです。
Delta Lake を利用するメリットとしては、3つ挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/dec5e8c3-74b7-78c9-c2f5-c248b534a4e8.png)

###Delta Lake の特徴
Delta Lake には、ユーザが快適に利用できるよう10の機能があります。
■Delta Lake の10の機能

- ACID トランザクション
 - ACID トランザクションをデータレイクに提供
 - 最強の分離レベルであるシリアライザビリティを提供

- スケーラブルなメタデータのハンドリング
 - Spark の分散プロセス力を利用して、数十億のファイルを持つペタバイト規模のテーブルの全てのメタデータを簡単に処理可能 

- タイムトラベル（データのバージョニング）
 - ロールバックや監査証跡の全履歴、そして再現可能な機械学習実験などがデータのバージョニングで可能

- オープンフォーマット
 - Delta Lake の全データを ApacheParquet 形式で保存
 - Parquet にとってネイティブな効率的な圧縮とエンコーディングスキームを提供 

- 統一されたバッチとストリーミングのソースとシンク
 - Delta Lake のテーブルはバッチテーブルでもあると同時に、ストリーミングソースやシンクでもある
 - ストリーミングデータの読み込み、バッチ履歴の埋戻し、対話型クエリをそのまま使用可能 

- スキーマの実施
 - Delta Lake はスキーマを指定して実行する機能を提供 
 - 不良データによるデータ破損を回避し、正しいデータタイプとカラムの存在を確認することが可能

- スキーマの進化
 - Delta Lake デーブルスキーマに変更を加え、自動的に適用される
 - DDLといった面倒は不要 

- 監査履歴
 - Delta Lake のトランザクションログは、データに関するあらゆる変更履歴を記録
 - 完全な監査証跡も提供 

- アップデートと削除
 - データセットのマージ・更新・削除する Scala/Java API のサポート
 - GDPR と CCPA に簡単に準拠でき、変更データキャプチャなどのユースケースも簡素化可能

- Apache Spark API との 100% の互換性
 - 大規模データ処理エンジンとして利用される Spark と完全互換性
 - Delta Lake を最小限の変更で既存のデータパイプラインと利用が可能


##Data Lake と Delta Lake の違い
下記は、Data Lake と Delta Lake の違いを図に表したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/0512cc40-7533-148a-f437-cba4919f3310.png)

- 信頼性
 - Delta Lake：高（スキーマの ACID 操作を強化することでデータの信頼性を高める）
 - Data Lake：低（あらゆるデータを許可し、結合も遅いため、大量の孤立したデータが生まれる）

- 統一性
 - Delta Lake：高（バッチやストリームデータを同一のパイプラインで生成可能）
 - Data Lake：低（ストリーミングプロセスにはホットパイプランが必須）

- パフォーマンス
 - Delta Lake：高（Zオーダスキッピングファイルで効率的な読み取り）
 - Data Lake：中（シーケンス読み取り）

- 使いやすさ
 - Delta Lake：中（DBA オペレーションを求められる）
 - Data Lake：高（スキーマへの記述も不要で、どのようなデータも許可）


信頼性、統一性、パフォーマンス、使いやすさ、の4項目でそれぞれ比較した結果、Delta Lake の方がData Lake に比べてより優れているのがわかります。

##おわりに
Delta Lake に関する説明は以上となります。
より詳細な内容については、リンク先の記事等を参照ください。
Dockerってなんだ。。

Dockerについて学んだことを書いていきます。

#Dockerってなに？
コンテナ型仮想化技術を実現するために実行される常駐アプリケーションと、
操作するためのコマンドフロントインターフェイスから成るプロダクト。

むむむ。。。

###コンテナ型仮想化技術
仮想化ソフトウェアなしにOSリソースを隔離し、仮想OSとする技術。
この仮想OSをコンテナという。

###CLI（コマンドインターフェイス）
コンピュータやソフトウェアが利用者に情報を提示したり、操作を受け付けたりする方法。

#Dockerを導入すると
- Dockerのセットアップが済んでいれば、数行の構成ファイルとコマンド１つ叩くだけで検証環境が構成できる。
- 環境起因のトラブルを最小限にできる。
- 高速に起動・終了できる。


##なぜそのような恩恵を受けられるのか
Dockerは
```Infrastructure as Code```
```Immutable infrastructure```
これら２つの考え方を簡単かつ低コストで実現することができるため。

###Infrastructure as Code（インフラの構成管理）
インストールするライブラリ、ツール等は何かをコードベースで定義しする。
これで手作業を減らし、コード中心にすることで、複数の同じ構築のサーバを再現しやすくなるという利点がある。
DockerではDockfileというfileによって、構成を管理している。
###Immutable infrastructure（不変なインフラ）
ある地点のサーバ状態を保存して、複製可能にする考え方。
サーバに変更を加えたい場合は、
既存のインフラをアップデートではなく、
作り直して新しいサーバのイメージとして保存し、複製できるようにしている。

###構成管理がしやすい

ある程度規模のシステムは複数のアプリケーションやミドルウェアを組み合わせている。そのため、いつかの箱を組み合わせることによってシステムを作成しており、全体の構成管理が必要になってくる。
Dockerは```Docker Compose```というツールを提供している。

- ```Docker Compose```  
yaml形式の設定ファイルで、
コンテナを定義したり、依存関係を定義して起動順を制御したりできる。
- ```Dockerノード```  
Dockerがインストールされたサーバ
- ```Docker Swarm```  
Docker Composeを単一のサーバだけでなく、複数のサーバをまたいで複数のコンテナを管理できるようにしたもの。
- ```コンテナオーケストレーション  ```  
複数のノードをまたいで多くのコンテナ群を管理する手法。
コンテナオーケストレーションとしてデファクトスタンダードの地位を確率しつつあるのが、Kubernetes（Google社が長年のコンテナ運用で培われてたノウハウを凝縮したOSS）


#Docker基本概念を学んで

環境の構築には１日がかりになることも普通にある。
開発者や機器の違いによって生じる差異をどう埋めるかもとても悩ましい問題だけど
Dockerはそういった問題点の多くを解決できるツールであることが良くわかった。
PHP/Laravelの書き方の基本ルールまとめる(PHPフレームワークLaravel入門に入る前に）part2

#配列
配列とは、一つの変数に対して複数の値が入ったモノのことを指します。
上記の配列に関する
・配列の作り方
・値の変更
・値の追加
・値の取り出し方
をまとめます。



##配列の作り方


```
$teamA =["太郎","次郎","三郎"]
```
配列には見えてませんが、左から順に0~数字が振り分けられてます。これを**インデックス配列**と呼びます。
配列の中身の値を指定したい際はこれを利用する。

```html
[0]=>太郎、[1]=>次郎、[2]=>三郎、
```
この配列に対して、ユーザー側で名前をつけることができます。それは、**連想配列**といいます。

```連想配列の作り方.php
$teamA =['長男'=>'太郎','次男'=>,'次郎','三男'=>'三郎']
```

##値の変更

```元の例文.php
<?php
$teamA =["太郎","次郎","三郎"];
$teamA =['長男'=>'太郎','次男'=>,'次郎','三男'=>'三郎'];
?>
```

####インデックス配列利用時
```.php
<?php
$teamA =["太郎","次郎","三郎"];
$teamA =['長男'=>'太郎','次男'=>,'次郎','三男'=>'三郎'];

$teamA[0] ="新太郎"; 
?>
//これで、$teamAの太郎が新太郎になる
```
####連想配列利用時
```.php
<?php
$teamA =["太郎","次郎","三郎"];
$teamA =['長男'=>'太郎','次男'=>,'次郎','三男'=>'三郎'];

$teamA[次男] ="二太郎"; 
?>
//これで、$teamAの次郎が二太郎になる
```
##値の追加
####インデックス配列利用時
```記述例.php
<?php
$colors = [];
$colors[] = "赤";
$colors[] = "青";
$colors[] = "黄";
$colors[] = "白";

print_r($colors);
?>
```

```出力例.php
Array
(
  [0] => 赤
  [1] => 青
  [2] => 黄
  [3] => 白
)
//print_rを利用することで、配列の中身がインデックス配列と共に出力される
```
空の配列に対し、インデックス配列番号を指定せず"="で代入すると、値が追加される。
※値が入っている配列に対し、実行すると値の中身が更新される。

####連想配列利用時
```記述例.php
<?php
$user = [];
$user['name'] = "井上萌";
$user['yomi'] = "いのうえもえ";
$user['age'] = 28;

print_r($user);
?>
```

```出力例.php
Array
(
  [name] => 井上萌
  [yomi] => いのうえもえ
  [age] => 28
)
```
空の配列に対し、連想配列に存在しないキーを指定して値を"="で代入すると、値が新規で追加される。

##値の取り出し方
###foreach文
配列から順に値を取り出すことができる。値だけ取り出す方法とキーと値両方取り出す方法がある。
配列に入っている全ての値が処理されるまで、指定した処理を繰り返す。

```foreach文(値だけ取り出す方法).html
foreach($array//配列が入った変数 as $value){
  //$valueを使った繰り返し処理
}
```

```記述例.php
<?php
$namelist = ["太郎","次郎","三郎"];
echo "<ol>","\n";

foreach($namelist as $value){
  echo "<li>",$value,"さん"</li>\n";
}
echo "</ol>\n";
?>
//\nをechoの後につけることで改行できる
```

```出力例.html
<ol>
<li>太郎</li>
<li>次郎</li>
<li>三郎</li>
</ol>
```


```foreach文(値とキーを両方取り出す方法).html
foreach($array//配列が入った変数 as $key => $value){
  //$keyと$valueを使った繰り返し処理
}
```

```記述例.php
<?php
$date = [`ID`=>"TR123",`商品名`=>"ピークハント",`価格`=>14500];
echo"<ul>","\n";

foreach(data as $key => $value){
  echo"<li>",$key,":",$value, "<li>\n";
}
echo"</ul>n\";
?>
```

```出力例.html
<ol>
<li>ID:TR123</li>
<li>商品名:ピークハント</li>
<li>価格:14500/li>
</ol>
```

#配列のまとめ終了。読んでくださった方ありがとうございました！
[Windows][Access]「１つ以上の必要なパラメータの値が設定されていません」のエラー対応

プログラム実行時に下記のエラーが表示される

１つ以上の必要なパラメータの値が設定されていません

原因
　SELECT文の項目名を誤って設定していた（品目ジャンル名→品目カテゴリ名）
誤：sql = "SELECT * FROM 出力_品目ジャンル WHERE 品目ジャンル名 = '" & l_NameSt2 & "'"
正：sql = "SELECT * FROM 出力_品目ジャンル WHERE 品目カテゴリ名 = '" & l_NameSt2 & "'"

以上
IBMクラウド・アカウントの登録方法　2020年版

こんにちは。初めてブログを掲載しています。

私はIBMのクラウド事業部にて新規のお客様に快適にプラットフォームをご利用いただくため、オンボーディング支援を行っています。
今後のいくつかのブログの投稿で、IBMクラウドについてご案内をしようと思います。
投稿はすべて私が自分で試したことや、個人の見解となります。正式資料ではございませんので、内容について古くなっていたりもし正確ではない場合に責任を負うことはできませんので、あらかじめご了承ください。

それでは、まず初めにIBMクラウドの登録方法をご案内いたします！

![Image 1123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660071/e1bb4a77-fdbb-eac3-b01e-7fb1dfadf368.png)

ポータルはこちらになります：https://cloud.ibm.com/login

「アカウントの作成」をクリックすることで登録フォームを記入することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660071/b107657f-a7dd-2282-2682-70e685e2288d.png)

フォームを記入し、登録しますと、メールアドレスに承知メールが送信されます。
認証を行うことでログインが可能になります。ログイン後の画面は下記になります：

![Image 1125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660071/f0d63b35-6e35-09d0-c3f1-b094a3fb52d1.png)

画面の右上に数字がありますが、こちらがアカウント番号になります。
後にサポート・ケースなどをあげた時に、アカウント番号を聞かれますので、ここから確認ができます。

ログイン後最初の画面はダッシュボードです。基本的なサービスにすぐにアクセスできるようデザインされています。
他に、画面左側のメニューは、左上の横線４つのアイコン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660071/6439a54f-1661-dc12-17d9-63301abfad1b.png)
をクリックすることで表示することができ、画面上部にもカタログやアカウント管理に関するページへのリンクがあります。


とても短いですが、今日はここまでとさせていただきます！IBMクラウドへようこそ！
ポータル上ではサービスをプロビジョニングしたり、管理したりとたくさんの操作を行うことができます。
ユーザー管理や請求書管理などもあり、一つのページで基本的にはすべてが管理できるようになっています。（アカウントによっては請求書の確認は別ページになることがあります。）

さて、次のステップはどうなりますでしょうか。おすすめはこちらになります：
資料ページ：https://cloud.ibm.com/docs
チュートリアルなどもあります。
AWS IoT に上げたデータをCloudWatchで簡単にグラフ化する

AWS IoTに上がったデータの可視化方法は色々ありますが。これは個人的に最もシンプルと思われる方法です。

ちなみに他の方法の例としては、

* リアルタイムの可視化
    * ElasticSearch Service
* BI
    * IoT Analytics + QuickSight
* アプリで見る
    * Amplifyなどを使って作る
        * https://aws.amazon.com/jp/builders-flash/202006/amplify-hygrothermograph/

あたりがあると思います。

# 入力データ例

```json
{
  "humidity": 52,
  "temperature": 27.61
}
```

こんなデータが定期的にデバイスからMQTTでPubされたとします。
トピックは、`data/area-1/device-1` とします。

# ルール、アクションの設定

* AWS IoT のコンソールで、左側のメニューから　`ACT` > `ルール` を選びます
* 右上の作成を押します
* ルール作成の画面で、
    * 名前は適当に入れます
    * ルールクエリステートメントは、 `SELECT * FROM 'data/area-1/device-1'`
    * アクションの追加で、CloudWatch Logsにメッセージデータを送信する　を選びます
    * ログのグループ名は、新しいリソースを作成するを選び、CloudWatchのコンソールで、アクション > ロググループの作成 を選びます
    * ロググループの名前は  `BME280` にします。（センサーの名前にしました）
    * 終わったらAWS IoTのコンソールに戻り、ログのグループ名から、 `BME280` を選択します
    * ロールの作成で、適当な名前をつけて、 `ロールの作成` を押します
    * `ルールの作成` をクリックします
* ここまでで、ログが先程設定したロググループに追加されるようになるはずです

# CloudWatchの設定

* CloudWatchのコンソールを開き、インサイトをクリックします。
* ロググループから先程作成したものを選びます。
* クエリを以下のように変更します

```
stats avg(temperature) by bin(1m)
```
* クエリの実行をクリックします。
* 可視化のタブを開くとログが表示されます
*  `アクション > ダッシュボードに追加` をクリックします 
*  以下のように設定することでダッシュボードで見れるようになります
*  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/d83a273f-985a-ec94-83f7-d478d621963e.png)

* できたら左側のメニューから `ダッシュボード > BME280（ダッシュボード名）`を選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/97cd3b0a-5707-b13f-2b32-51455f7b5aa1.png)
 
以上で完成です！もちろんクエリをカスタマイズすると色々描画方法は変えられます。
【Carrierwave】別のモデルでも画像アップロードをしたい時

## 画像をアップロードしてもデータがエラーになる！

railsで画像投稿機能を実装中。
新たに別モデルで画像アップロード機能を追加したいな！
imageカラムを追加して早速アップロード！
しかしデータ名がActionDispatch::Http::UploadedFileになってしまった。
解決方法を備忘録として投稿。
初投稿の初学者ですが参考になれば幸いです。

## 結論：新たなuploaderファイルの作成と連携が必要

Carrierwaveは導入してあるので、カラムを追加すればアップロード機能完成！と勘違いしていた。

各モデルに各uploaderファイルの作成が必要だった。

#### 手順
- 画像用のカラムを作成
- 新たなuploaderファイルの作成
- モデルと関連付け
- コントローラのストロングパラメータにカラムを追加
Hugo用テーマ TwentyFourteen のカスタマイズ

# Hugo用テーマ TwentyFourteen のカスタマイズ


`twentyfourteen/static/css/style.css`を編集する．
## コンテンツの幅を広くする。
1040行目付近

```css
/**
 * 6.0 Content
 * --------------------------------------------
 */

.content-area {
/*
	padding-top: 48px;
*/
}

.hentry {
	margin: 0 auto 48px;
	max-width: 672px;
}

.site-content .entry-header,
.site-content .entry-content,
.site-content .entry-summary,
.site-content .entry-meta,
.page-content {
	margin: 0 auto;
/*
	コンテンツの幅を広くするため、max-widthを474pxから
	noneに変更。
*/
	max-width: none;
}

.page-content {
	margin-bottom: 48px;
}
```

## 記事タイトルのUppercaseを無効にする。


`test-transform: uppercase;`をコメントアウトする．

```css
/**
 * 6.2 Entry Header
 * -----------------------------------------------------
 */

.entry-header {
	position: relative;
	z-index: 1;
}

.entry-title {
	font-size: 33px;
	font-weight: 300;
	line-height: 1.0909090909;
	margin-bottom: 12px;
	margin: 0 0 12px 0;
	/* text-transform: uppercase; */
}

```

## 記事表示位置のpadding-topを狭める

3630行目付近

```css
@media screen and (min-width: 846px) {
	.content-area,
	.content-sidebar {
		padding-top: 20px;
	}
```

##適用前
<img width="800" alt="hugo_site.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647646/8811710e-e27d-ebca-1c93-326aedfb7611.png">
中央に配置されていたコンテンツがは左寄りになっている．
##適用後

<img width="800" alt="hugo_site_css.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647646/09f289f6-5dd7-98f0-0ef3-e7a5b93381aa.png">
EC2でオレオレHTTPS化

とりあえずブラウザでカメラ動かしたい。

下記にお世話になりました。

参考：

https://qiita.com/taka_katsu411/items/fb1ad876c0017b9fe49d

気をつけたいポイント：

- `https://<アドレス>`でアクセスする
- EC2セキュリティグループで443を許可
- server側portも443にする
canvasで別ドメインの画像を読もうとするとクロスドメインになってだめって言われるよ

フロントエンドのことはよくわからないけど、そういうことらしい。
以下でOK。

```Apache:.htaccess
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin: "*"
</IfModule>
```

# 参考
https://developer.mozilla.org/ja/docs/Web/HTML/CORS_enabled_image
macOS Catalinaで静的サイトジェネレータHugoを使えるようにした

# 静的サイトジェネレータHugoを使えるようにする
## はじめに
macOS CatalinaにStatic Site Generator(静的サイトジェネレータ) Hugoを導入し、使えるようにする。

## Hugoとは
[Hugo](https://gohugo.io/getting-started/quick-start/)はオープンソースで開発されているStatic Site Generatorである。

<img width="400" alt="hugo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647646/cfa49257-3dbb-ce7c-41be-0a051fdee17a.png">

一般的に、Webサイト構築ではWordpressのようなCMS（コンテンツ管理システム）が使用されることが多い。が、個人で運用してるようなblogなどのWebサイトでは静的サイトジェネレータを用いて構築したほうが、システム管理・保守の面でメリットがある。

ほかにも、WebページのコンテンツをGitのようなバージョン管理システムを用いて管理できるようになる利点などもある。

## macOS Catalina にセットアップする
### インストール
[Hugoの公式サイト](https://gohugo.io/getting-started/quick-start/)に記載の内容に基づいて、macOSにインストールする。

```console
$ brew install hugo
$ hugo version
Hugo Static Site Generator v0.71.1/extended darwin/amd64 BuildDate: unknown
```

### サンプルプロジェクトを作成する
Hugoの公式サイトには、以下の例が記載されている。

```console
$ hugo new site quickstart
```
このコマンドは、カレントディレクトリの`quickstart`ディレクトリが作成される。ユーザーのhomeディレクトリで実行した場合、`/home/{user}/quickstart`が作成される。

ここでは`~/Sites`ディレクトリ以下に`samplesite`プロジェクトを作成する。

```console
$ mkdir Sites
$ cd Sites
$ hugo new site samplesite
$ ls samplesite
archetypes/  config.toml  content/     data/        layouts/     static/      themes/
```

### テーマを導入する
**Hugo**では、公式サイトから様々なCSSテーマを入手できる。

<img width="400" alt="hugo_themes.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647646/897f2b85-8ea5-ac1a-da97-b39f785bf784.png">


ここでは`Twenty Fourteen`というテーマを入手する。テーマの入手方法はzipアーカイブで取得する方法もあるが、ここではGitを使って取得する。

```console
$ cd samplesite
$ git init
$ git submodule add https://github.com/jaden/twentyfourteen.git themes/twentyfourteen
```

config.tomlにテーマの設定を追記する。

```console
echo 'theme = "twentyfourteen"' >> config.toml
```

### コンテンツを用意する
記事を追加する。

```console
$ hugo new posts/my-fast-post.md
/Users/{user}/Sites/samplesite/content/posts/my-first-post.md created
```

Hugoでは`samplesite/content`以下にコンテンツを格納する。

```console
$ tree ./samplesite
./samplesite
├── archetypes
│   └── default.md
├── config.toml
├── content
│   └── posts
│       └── my-first-post.md  //作成したコンテンツ
├── data
├── layouts
├── resources
│   └── _gen
│       ├── assets
│       └── images
├── static
└── themes
    └── twentyfourteen
        ├── LICENSE.md
        ├── README.md
```

`my-first-post.md`の内容は適当に記入する。これで記事の用意が完了。

### サンプルサイトを立ち上げる
Hugoでは静的サイト出力する前にローカルサーバを起動して、内容を確認することができる。

```console
$ pwd
/Users/{user}/Sites/samplesite
$ hugo server -D
( ローカルサーバは http://localhost:1313/ で起動する。Ctrl+C で終了)
```

<img width="450" alt="hugo_site.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647646/4febcf9b-bd10-59a9-2061-d9bf6c2c9ec0.png">


### サイトの設定をする
構築するWebサイトのURLや言語コードなどを設定する。

```file:config.toml
baseURL = "http://example.org/"  //適時URLは修正する。
languageCode = "ja-JP"
title = "My New Hugo Site"
theme = "twentyfourteen"
```

### 静的サイトを出力する

```console
$hugo -D
```
`samplesite/public`以下に静的サイトのファイルが出力される。

## おわりに
作成されたファイルをドメイン付与したAmazon S3などにアップロードすれば、静的Webサイトとして公開できる。

テーマCSSなども自由に編集できるので、自分の好みに合わせてカスタマイズすることもできる。
Java Spring environment in vsCode

# Java Spring environment in vsCode

## Extensions

以下のやついろいろインストールしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/edd8db45-f0a4-429d-7771-20270a907b7b.png)
SPRINGのもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/4eb32096-36a2-fd2b-8ca9-f41f9ccf5b2e.png)
Javaスタイルチェッカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/5454bda5-038e-2ae1-cae4-6ee5053007af.png)
XMLスタイルチェッカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/a2a2f870-33ab-368d-a6af-493a52695fae.png)
Laravel 現在のマイグレーションを管理しているテーブルを確認する

# 目的

- マイグレーションを管理しているテーブルの確認方法を説明する。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提情報

- LaravelアプリとMySQLのDBが紐付いていること。（.envファイルでDBの指定がされており、マイグレートが実行できる状態になっていること。）

# 詳細

1. 下記コマンドを実行してMySQLにログインする。(rootユーザのパスワードがわからなくなった方はこちら→[Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

    ```terminal
    $ mysql -u root -p
    ```
1. 下記を実行してLaravelアプリと紐付いているDBを指定する。

    ```sql
    mysql> use　DB名;
    ```
1. 下記を実行してマイグレーションを管理しているテーブルの内容を確認する。

    ```sql
    mysql> select * from migrations;
    ```

# 説明

1. マイグレーションを管理しているテーブルのselect文の出力例を下記に記載する。

    ```sql
    mysql> select * from migrations;
    +----+--------------------------------------------------+-------+
    | id | migration                                        | batch |
    +----+--------------------------------------------------+-------+
    |  1 | 2014_10_12_000000_create_users_table             |     1 |
    |  2 | 2014_10_12_100000_create_password_resets_table   |     1 |
    |  3 | 2019_08_19_000000_create_failed_jobs_table       |     1 |
    |  4 | 2020_06_19_030827_create_admins_table            |     2 |
    | 14 | 2020_06_22_012231_create_□□_table                |     3 |
    | 15 | 2020_06_22_013938_create_△△_table                |     3 |
    | 16 | 2020_06_22_014218_create_▲▲_table                |     3 |
    | 17 | 2020_06_22_014439_create_■■_table                |     3 |
    | 18 | 2020_06_22_060959_create_◆◆_table                |     4 |
    +----+--------------------------------------------------+-------+
    ```
1. 上記出力結果に記載されているマイグレーションファイルが現段階でマイグレートが行われているマイグレーションファイルである。
1. 上記出力結果に記載未記載のマイグレーションファイルが`アプリ名ディレクトリ/databases/migrations`直下に存在した上で`$ php artisan migrete`コマンドを実行した場合、未記載のマイグレーションファイルがマイグレートされる。
1. `$ php artisan migrate:rollback`を実行した際には「batch」の数字が大きい順にロールバックが行われる。「batch」の数字が同じマイグレーションファイルは一緒にロールバックが行われる。
mysqlからmariadbへの移行に関する内容

初めて投稿させていただきます。
どなたか、ご存じの方はご回答の程をお願いします。

環境
　旧サーバ：rhel5、DB:mysq((5.5.33)
　新サーバ：rhel7、DB:mariadb(5.5.64)

目的
　旧サーバから新サーバへの移行を行ってます。
　DBのrootやユーザの名称は同じですが、パスワードが異なってます。
　
行った作業
　旧サーバーでdumpファイルをrootで取得、新サーバへrootでインポートしました。

発生した事象と質問
　①root及びユーザのパスワードが旧サーバのものになりました。
　・パスワードが変わらないようなインポート方法はありませんか？

　②ストアドプロシージャの作成時に『SQL : #HY000Cannot load from mysql.proc. The table is probably corrupted』のエラーが発生しました。
　　ストアドプロシージャはインポートされませんでした。
　・エラーの解消方法を教えてください。

　③mariadbのログ出力から、[ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.]が出力されました。
　・エラーの解消方法を教えてください。

　④mariadbのログ出力から、【 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 ・・・ 】が出力されました。
　　エラーが発生していますが、mariadbは起動しています。
　・エラーの解消方法を教えてください。

上記のことで、一部でも構いませんので、ご存じの方、ご教授ください。
Office365でvimxlsが動かない（アドインに入れたのに認識しない）

あとで清書します。


ファイル→オプション→トラストセンター→トラストセンターの設定(T)...→信頼できる場所→新しい場所の追加(A)...→パス(P)にvimxlsのファイルがあるフォルダのパスを入力→OK→OK→OK→念のためにExcelを起動し直す

参照URL
https://hiromiworks.wordpress.com/2016/09/12/excel2016
【C++】初級者からみた制約とコンセプト

# 制約について
C++20で追加予定の機能。
`template`のエラー文が長い上に分かりづらいという問題点を解消すべく追加された。（と勝手に思っている）

# 使い方
制約は以下の3通りの記述ができる。

```c++:
// (1)
template<typename T>
requires /* bool値(コンパイル時定数式) */
void f(T); 

// (2)
template<typename T>
void f(T)
requires /* bool値(コンパイル時定数式) */; 

// (3)
template</* concept */ T>
void f(T);
```
(3)の書き方がシンプルでわかりやすいが、制約を追加したい場合にconceptを変更するか(1)や(2)の記述に変更する必要があるため、拡張性で劣る。
`/* bool値(コンパイル時定数式) */`とあるがここには主にrequires式やconceptが入る。

# requires式について
柔軟な制約を記述する上で必ず必要になる式。bool値を返すコンパイル時定数式でだいたいあっているとおもう。
以下の2通りの書き方がある。

```c++:
// (1)
requires {
    // 式
}

// (2)
requires (パラメータ){
    // 式
}
```

(1)に関しては完全にただのコンパイル時定数式らしいので以下のコードがエラー無しで通る。

```c++:
std::cout << (requires{std::vector<int>(10);}) << std::endl; // output 1
```

制約には使用するであろう式をそのまま書く。
例えばT型に対する`std::make_unique<T>()`を実行したい場合は

```c++:
requires {
    std::make_unique<T>();
}
```
といった感じ。

T型とU型の変数に対して実行したい式があった場合はパラメータを使用する。

```c++:
requires (T t, U u) {
    ++u; // 前置++演算が有効
    t[0]>(*u); // t[0]と(*u)が有効かつ戻り値が比較可能
    {t.begin()} -> std::same_as<U>; // 複合要件 t.begin()が実行可能かつ戻り値の型がU
}
```

複合要件は`noexcept`や戻り値の型を指定する場合の記述方法。
`{式} noexcept(任意) -> concept(任意) `の記述らしい(戻り値の方にconcept以外が指定できるかは不明。conceptの第一テンプレート引数が式の戻り値の型に置き換わる)。
複数記述した場合はand条件になるため、or条件は式を分ける必要がある。

# conceptについて
制約用にカスタマイズされた変数テンプレートでだいたいあっていると思う。

```c++:
template<typename T>
concept = /* bool値(コンパイル時定数式)  */;
```

templateのtypenameやclassに置き換わって使用できたり、複合要件の戻り値の型要件に使用できたりする。
でも結局ただの変数テンプレートなので以下が普通に通る。

```c++:
std::cout << (std::same_as<int,int>) << std::endl; // output 1
```

# まとめ
なんの制約もなく使用できるtemplateはほぼ皆無なので、これまでのtemplateが使用されていたところには必ず制約が追加される(する必要がある)と思っていい。
`type_traits`の機能の多くが`concepts`に移動すると思うんだけど`type_traits`で何が出来たかよく覚えていないので`concepts`になにがあるかだけ気にしようと思う。
Debian Busterでusbmount 

Raspberry Pi OS Busterでusbmountを使ってみる。

sudo apt update
sudo apt upgrade
sudo apt install usbmount
で使えるようにしてみたが
USBメモリをRaspberry Piに刺しても反応がない。

[ここ](https://raspberrypi.stackexchange.com/questions/100312/raspberry-4-usbmount-not-working)に従い

sudo mkdir /etc/systemd/system/systemd-udevd.service.d

sudo vi /etc/systemd/system/systemd-udevd.service.d/00-my-custom-mountflags.conf

内容は
[Service]
PrivateMounts=no

sudo reboot

これで幸せになれる。