OmniAICreator/Qiita-1.07M huggingface dataset:
シェルと改行とクォート

シェル（bash）で変数に入れた複数行の文字列をsed処理したのに、結果が一つしかない……となって困った。結論としては改行をそのまま取り出すにはダブルクォート`"`が必要だった。

## 値に改行を入れる

バッククォート`\`に続いて改行する場合、その改行はなかった事になる。

```sh
$ echo abc\
> def
abcdef
```

改行を実際の値に入れるには、シングルクォート`'`やダブルクォート`"`を使う。

```sh
$ echo 'abc
> def'
abc
def

$ echo "abc
> def"
abc
def
```

## 変数から取り出す

変数`x`に改行を含む文字列を代入する。

```sh
$ x="abc
> def"
```

これを取り出すときも、クォートによって挙動が異なる。つまり改行をそのまま取り出すにはまたダブルクォート`"`が必要になる。

```sh
$ echo $x
abc def

$ echo "$x"
abc
def
```

jsonなどの場合は問題にならないが、複数行を前提として処理していると初めに書いたようなことが起こるので注意が必要だった。（`cat`とか多数のパラメータを受け取るコマンドにはクォートなしの挙動の方が都合がいいのだろう。）
branchを指定してcloneする方法

##背景
YouTubeで、Vuetifyのチュートリアルを学習しようと思った。動画投稿者が、githubにサンプルコードを載せてくれていた。それは、各lessonごとにbranchが切られていたので、ただgit cloneするだけだと、目的のファイルが入手できず、branchごとにcloneする必要があった。

これ→https://github.com/iamshaunjp/vuetify-playlist


# 方法

```
$ git clone -b ブランチ名 cloneのhttps
```
つまり

```
$ git clone -b git clone -b lesson-2 https://github.com/iamshaunjp/vuetify-playlist.git
```
です。

参考
https://www.sejuku.net/blog/71801
GitHubでブランチを切ったあとになぜmasterをマージするのかの理由と、macだけで出て解決大変だった Permission denied (publickey). を解決した話

Git hubで作業する際に、初学者の僕が疑問に思っていた `pull, push, merge` をしていく理由について少し理解できたので、備忘録で記載しています。あと、macユーザーですがめちゃくちゃ `pull, push, merge` ではまった`Permission denied (publickey).`の解決方法も提示します。

まず、なぜ `pull, push, merge` なんてややこしいことをたくさんやらないといけないのかということです。今の時代共同作業だったら、`google docs` みたいにみんなでポンポン同時並行で出来ちゃえばいいのに、最先端のエンジニア領域でこんなめんどくさいことやっているんだろうと疑問に思いました。

まず大前提として `master` は何の汚れも無い（バグが絶対にないことを期待される）完全体です。

（図でいうと緑の線　出所：https://backlog.com/ja/git-tutorial/stepup/01/）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/12d7231b-5f3a-9a6b-df5f-d369b2ad4fda.png)


なので `master` が汚れないように、開発されたコード部分を `master` へ取り込む際に、「検証する人（＝レビュアー）」がいます。その検証者がチェックして、`OK` であれば `master` に反映されます。

完全体ということで、`master` は他のブランチを担当している人たちの修正が統合され、どんどん成長していく一方で、ブランチによっては昔に作られたまま長らく放置されたり、独自でプログラミングしてる状況のものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/3f46d6d5-6da9-2f68-21d4-d5b56b1ca93d.png)


そのため、いざ長期に切り離して作っていたブランチを反映させようとすると `master` 自体がずっと先にいっていますので、「他の人によって更新された膨大な量の変化」を検証者がチェックしなくてはいけなくなります。

「すでにチェックされ、統合された部分の再チェックをしてしまう」工数を省くために、ブランチ担当者が `master` の現在の状態を `merge` して、現状の `master` との差分（＝自分が本当に開発した部分）だけを見てもらうようにします。

でこんな話を書いたのは、長らく、`mac`で `pull, push, merge` をしようとしても `Permission denied (publickey).` にハマって全然できていなかったからです。

`windows` はないのですが、`mac` は、**<font color="red">キーチェーン登録</font>** をしないといけないようで、その実行をしたら解決しました。

```
$ ssh-add -K
```

これをterminalで実行したら、VSCode上からのUI操作からでもPushがうまくいきましたとさ。
ドライプを使うにはフォーマットする必要があります

  ストレージデバイスをコンピューターに接続すると、コンピューターが警告メッセージを表示することがあります。「ドライプF:を使うには<a href="https://jp.bitwar.net/course/format/712.html">フォーマットする必要があります</a>。フォーマットしますか? 」どうすればよいですか？ディスクをフォーマットするというWindowsの提案を受け入れる必要がありますか？


 ただし、保存する写真、ビデオ、音楽、ドキュメントは非常に重要であるため、ストレージデバイスをフォーマットしたくありません。では、このデータをどのように見つけて使用できるでしょうか。


 保存されたデータを再度見つけるには、Windowsの推奨に従ってディスクをフォーマットせず、[キャンセル]をクリックしてメッセージを無視し、最適な無料のデータ復元ソフトウェアを使用してこのエラーを修正してください。


 こちらからBitwar Data Recoveryをダウンロードしてください：https://jp.bitwar.net/data-recovery-software/。

「ドライプを使うにはフォーマットする必要があります」問題を防ぐ方法は？

   ●ポータブルセキュリティドライブをPCセキュリティデバイスから取り外す前に、取り外してください。

   ●パソコンへのデータ転送時、ポータブルハードディスクの停電を防ぎます。

   ●ストレージデバイスをウイルスに感染させたり、トロイの木馬に攻撃させたりしないでください。

   ●ストレージデバイスの不良セクターを防止するように注意してください。


   その理由を知ることで、ポータブルハードドライブでの不適切な操作を回避して、このような「ドライプを使うにはフォーマットする必要があります」問題に再び直面することを防ぐのは簡単だと思います。


   いずれにしても、データは常にストレージデバイスよりも優先されるため、コンピュータのハードディスクまたはストレージデバイスに問題がある場合は、時間内にデータを復元およびバックアップしてください。


   Bitwar Data Recoveryを使用して失われたデータを復元してみてください。

   詳しくは、「<a href="https://jp.bitwar.net/course/format/712.html">「修復済み」ドライプを使うにはフォーマットする必要があります。</a>」をご参照ください。
node-sassがDeprecatedになるとのことでNuxt.jsのsassをアップデートした


node-sass(LibSass)って長らく使ってたイメージありますね。

> [LibSass is Deprecated](https://sass-lang.com/blog/libsass-is-deprecated)


こちらに記事にあるようにLibSassっていうC++で書かれたライブラリを使った非推奨になるとのことで、これを使ってるnode-sassも非推奨になり、Dart製のSassを使ってねという感じになる模様です。

* https://www.npmjs.com/package/node-sass ← 今まではよく使われていたけど今後非推奨
* https://www.npmjs.com/package/sass (Dart Sass) ← 今後はこっちが推奨

今回Node.jsのv15系にアップデートしたのでnode-sassのバージョンも上げようかと思って調べてたら発見しました。


## 環境

* Node.js v15.0.1
* Nuxt.js v2.12.2

元々v14系で動かしてたけどアップデートさせてみました。

## node-sassからsassに移行

削除して(nuxtのバージョンは上げなくても良かったけどついでに)

```
yarn remove nuxt node-sass sass-loader
```

インストール

```
yarn add nuxt sass sass-loader
```

アプリケーションを起動させてみる

```
yarn dev
```

無事に起動しました。

### package.jsonの差分はこんな感じ

```diff_json:package.json
  "dependencies": {
     省略
-    "nuxt": "^2.12.2",
-    "node-sass": "^4.14.0",
-    "sass-loader": "^8.0.0"
+    "nuxt": "^2.14.7",
+    "sass": "^1.27.0",
+    "sass-loader": "^10.0.4"
  }
```


## 所感

少し触ってみてるけど特に挙動は変わらない模様です。もともとのsassってすごくビルドが遅くてnode-sassが流行ってきたとかだった気がしたけど(嘘かもしれない)知らぬ間にDartで作り替えられてたんですね。

僕はそのまま移行できた感じですが、そのままスッと移行してプロジェクトに影響でないかは各自の判断でお願いします。

## おまけ

これ完全にタイミング悪かった問題だと思うんですけど、[node-sassのGitHubリポジトリ](https://github.com/sass/node-sass)だとNode.js15系に対応した5.0.0がリリースされていて......

> GitHub
> ![](https://i.gyazo.com/c2b4223f8c10077e7f7ddb73fbb00c2e.png)


npm側ではまだ対応されてないという感じで

> npm
> ![](https://i.gyazo.com/1f32805a48779b370ffe5b12529a868a.png)

これによってnode-sassを入れ直してもバージョン指定して入れてもうまくいかず、
Node.js v15系でnode-sassのインストールエラーがずっと変わらなかったです苦笑

結果的に今回はこれを回避する話ではなかったけど出てたエラーもメモ

```
・
・
・
[3/4] 🔗  Linking dependencies...
warning "@nuxtjs/markdownit > raw-loader@4.0.2" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
warning "nuxt > @nuxt/components@1.1.1" has unmet peer dependency "webpack@^4.0.0".
warning " > sass-loader@10.0.4" has unmet peer dependency "webpack@^4.36.0 || ^5.0.0".
[4/4] 🔨  Building fresh packages...
error /Users/n0bisuke/Documents/hogehoge/node_modules/node-sass: Command failed.
Exit code: 1
Command: node scripts/build.js
Arguments: 
```
新しいGoogle Play Consoleさん！mapping.txt置く場所どこですか！？

#はじめに
※とにかく結論が読みたい！という方は一番下の項目　ここだよ　まで飛んでください:airplane:

初めまして！@hayashidamokaと申します！
会社や個人でAndroidアプリの開発をしてます:hugging:
まだまだ半人前で勉強中の私は、いつもQiitaの記事に助けられています:sob:
皆さん、ありがとうございます！
私も誰かのお役に立ちたい！初投稿がんばります！

#新しくなったGoogle Play Console
最近Google Play Consoleのデザインがまた新しく変わりましたね！

公式様によれば、

>2020 年 11 月 2 日より、Google Play Console の旧バージョンはご利用いただけなくなります

とのことです！旧バージョンを使えるのも残り数日...!!
早く新バージョンに慣れないといけませんね！

#mapping.txt置く場所どこよ
アプリを更新しようとしたところ、困った問題がありました。
###「mapping.txtを置く場所が分からないよ！！」

以前のGoogle Play Consoleなら、
Android Vitals　>　解読ファイル　に置く場所があったのに
<img width="300" alt="昔" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/6a220b79-3da2-9b53-9b4b-0e54862054a7.png">

新しいGoogle Play Consoleの、
Android Vitals　には　解読ファイル　がないのです:scream:
<img width="300" alt="今" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/fe272a23-6815-86c2-91cf-c2db94d27660.png">

#ここだよ
色々と探した結果...
App Bundle エクスプローラ　>　ダウンロード　>　アセット　>　ReTrace マッピング ファイル
に置く場所がありました！やったー！:sunny::dancer_tone1:

![スクリーンショット 2020-10-27 16.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/839b4e24-811c-ac51-6ea0-27cafb2df191.png)
初学者チームがWebサービス開発を始めて約２ヶ月が経ちました

#はじめに
ドットインストール、プロゲート上がりの素人集団の挑戦を綴らせて頂いております。
**[YouTube万屋エンジニアチャンネル](https://www.youtube.com/channel/UCHxqQ8bUg5F2GW79D_DvSjQ/videos)**のコミュニティ内で、「フレームワークって何？美味しいの？」レベルのプログラミング初学者が４人集まってWebアプリを制作を始めて９週間、つまり約２ケ月が経過しました。

チームメンバーの振り返り用のメモですが、「初心者だけど何かモノを作ってみたい！」という方の参考にもなれば幸いです。過去記事はこちら。

* [初学者チームがWebサービス開発を始めて最初の２週間でやったことを振り返り、そして次を考える](https://qiita.com/kakudaisuke/items/8a3f9e9d9ed2630e7e4f)
* [初学者チームがWebサービス開発を始めて４週間で出来たことと出来なかったこと](https://qiita.com/kakudaisuke/items/3596e78bd158f6e39987)
* [初学者チームがWebサービス開発を始めて６週間経ったらそれぽくなってきた？](https://qiita.com/kakudaisuke/items/6ed6d1002ec469d3a136)

２週間ごとにフェーズを設けて、目標設定、振り返りということを繰り返してきて、これが第４フェーズが終了しました。

GitHubを初めて公開してみます→https://github.com/WebYorozuya/jazz-review

#目標達成度
３週間前掲げていた目標と、実際できたことを整理します。

| 3週間前掲げた目標 | 達成度10点満点|コメント|
|:-----------|------------:|:-----------|
|検索機能|9|[投稿とタグのテーブルそれぞれから同時に検索し](https://qiita.com/kakudaisuke/items/1daf16e021c4c2c30b15)、検索ワードをハイライトすることができます。レスポンシブも対応。ただ今はタグがハイライトできません。|
|いいね機能の実装|10|jQueryで非同期処理で実装。|
|投稿の編集削除権限をその投稿主に限る|0|全く手をつけられませんでした。|
|投稿にチップスの効いたタグ付けができる|10|最後はチーム総力戦の様相を呈すほど苦戦しましたが、メンターの助けも得て実現しました。|
|投稿に付いたタグをクリックするとそのタグの投稿一覧をTagControllerで表示できる|8|扱うモノとコントローラの名前は合わせた方が良いという助言をいただき、ReviewControllerから移設できました。|
|ユーザーがプロフ画像を設定できる|5|担当メンバーががんばってくれているのですが、難しいようです...|
|開発者紹介がモーダルウィンドウで展開できる|9|良い感じのができました。あとはHTMLのフォーマットを繰り返さないように改善したいです。|
|フッターの画像がランダムに切り替わる|10|新メンバーが朝飯前的なスピードで実装してくれました。|
|ユーザーログイン周りのデザインを統一する|7|継承レイアウトやテンプレートを駆使してかんなり進歩しました。あとはマイページ|
|利用規約ページを設ける|8|あとは細かい文言を修正していきたいところ。|
|**総合**|**74/100**|**達成度74%**|

###その他にやったこと
* JavaScriptファイルの大整理
* ビューファイルのディレクトリと名前の大整理
* 新メンバーの環境構築
* 投稿ページの文字数カウント機能
* レスポンシブ対応
* もっと読む機能の実装
* 投稿編集削除ページにその投稿のタグも表示する
* 投稿のテキストの改行を表示の時に反映する
* オンラインお茶会

#この３週間を振り返って
* プルリクする際になるべくメンバーにブリーフィングしてもらうようにしました。コードレビューがだいぶスムーズになって良い感じでした。
* この第４フェーズからプロが参加してくださっており、もっと効率的にチームとして開発する方法など、プロならではの視点で指摘をしてくれてありがたいです。
* メンバーが確実にレベルアップしいます。勉強しなきゃ！っていう義務感でやっている人はたぶんいなくて、みんな楽しく作業している感じがします。


#次に目指すもの（第５フェーズ）
目標：**[我らがメンターおさない氏](https://www.youtube.com/channel/UCHxqQ8bUg5F2GW79D_DvSjQ/videos)**にレビューをお願いする！！
期日：11/16月曜

1. プロフ画像
* 退会機能
* 投稿の編集削除権限をその投稿主に限定する
* 細かいスタイルや機能の修正
* リファクタリング
* シーダーを利用してメンバー間の開発をもっと効率的にしたい（いまさら感w）
* モーダルウィンドウで投稿の通報を実装
* セキュリティ対策を考える
* マイページ（PW変更、アイコン画像など）をテンプレートを活用してスタイル整える
* エラーハンドリング（例外処理）を考える

この３週間でメンターのレビューを頂けるレベルに磨いていって、第６フェーズでそれを反映して一旦この開発をひと段落させてもいいのかなと考えていたりします。
ここまで読んでくださってありがとうございます。
通信の仕組みに関しての備忘録

#通信の仕組みに関して
###通信の仕組みに関しての簡易図を備忘録として記す
![通信の仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790462/45fd2cec-29b3-e5ac-d868-749f3b62221c.png)

##追記
###ポート番号に関して
・ポート番号とは、サーバとアプリケーション間でやりとりをする際に
　アプリに割り振られる番号である。
　アプリとのやりとりを行う際に、どのアプリとやりとりするかを判別する為に利用する。
Amazon EC2のインスタンスにプロキシサーバーを構築する方法

##はじめに
自分専用のProxyサーバーを構築しました。
その手順を書き残しておきますので参考になれば幸いです。

##目次
・環境
・Elastic IPの設定
・Squidのインストール
・Squidの設定
・AWSセキュリティグループの設定
・クライアント（自宅PC）の設定
・終わりに

##環境
AWSのインスタンスは以下のものを使用しました。
・Red Hat Enterprise Linux 8（無料版）

##Elastic IPの設定
インスタンスを作成したら、IPアドレスを固定します。
（これをしないと、起動するたびにIPが変わって面倒です。）

方法は以下のURLを参考にしてください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html


##Squidのインストール
インスタンスにSSH接続して以下のコマンドを実施します。
①Squidのインストール

```
sudo yum install -y squid
```

②Squidの起動

```
sudo systemctl enable squid
```

③ステータスの確認（squid.serviceがenabledであること）

```
sudo systemctl list-unit-files -t service | grep squid
```

##Squidの設定
squid.confを以下のように修正します。
①ファイルの修正

```
sudo vim /etc/squid/squid.conf
```

②追記する内容

```
# 接続したいIPアドレスを指定（複数指定可能）
acl myip src [IPアドレス１]/32
acl myip src [IPアドレス２]/32

# 接続したいIPを許可
http_access allow myip
```
自宅PCのグローバルIPは以下のサイトで調べられます。
https://www.cman.jp/network/support/go_access.cgi

③Squidのリロード

```
sudo systemctl reload squid
```

##AWSセキュリティグループの設定
インスタンスのファイヤーウォールの設定を行います。
デフォルトではSSH接続のポートしか開いていないので、
Proxy用のポートも解放します。（デフォルトだと3128）

設定方法は以下のURLを参照してください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule

設定は以下のようにします。
タイプ：カスタムTCPルール
プロトコル：TCP
ポート範囲：3128
ソース：自分のPCのグローバルIP/32
説明：TCP for Proxy（これはなんでもいいです。）

AWSコンソールのセキュリティグループを選択。

##クライアント（自宅PC）の設定
Proxyを指定します。

設定⇒ネットワークとインターネット⇒プロキシ

プロキシサーバーを使うをオンにする。
アドレス：インスタンスのIP
ポート：3128


##終わりに
とりあえずこれらを実施して動きました。
IPを調べてみたらちゃんとProxyサーバーのIPになってます。

参考にしたサイト
https://blog.officekoma.co.jp/2020/04/aws-ec2linux.html
作ったWebアプリを公開する自分メモ

#Netlify&FreenomでWebサービス化
　Freenomは12か月まで無料で使えて、それ以降も手動更新すれば無料みたい。
<B>1. CodePenからエクスポートする</B>
ビューポートを設定する⇒おまじない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/72cd6083-e281-ea12-4063-6d71b84e0de3.png)

<B>エクスポートする</B>
右下のexpotからzipを選んでエクスポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/71e9aba6-db73-2bb9-5aac-086805ea339c.png)

<B>解凍して中身を確認する</B>
JSライブラリがあるかを確認しておく。

<B>Netlifyに登録&アップロードする/B>
CodePenからエクスポートしたZIPを解凍して出てきた 「dist」フォルダを、ドラッグ&ドロップしてアップロード

キャプチャし忘れたけど、画面真ん中あたりに配置したら勝手に取り込んでくれる。

<B>Freenomで独自ドメインを取得</B>
↓FreenomにアクセスしてGmailでサインイン
https://www.freenom.com/ja/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/5b61516e-8b5f-94bd-75b2-2816b745be2a.png)

あかん、googleアカウントからサインインしようとすると、
your social login could not be determinedのエラーでサインインできない。
同じクロム上でログインしている別アカウントをログオフして、再度試したけど、
無理。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/2a7e45d9-caba-529f-aa53-faa54855b3f0.png)

↓のサイトから、先にドメイン登録をしてみることにする。
    http://www.web-app.xyz/?p=1267


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/14db4d30-b1c4-35ae-804f-2f990ef128e5.png)

今すぐ入手！のことろから入手。
無料期間最長の12か月にしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/fdf36532-b71d-6a92-fc7f-b7ca9d17a791.png)

購入手続きを進める。住所など入れる必要あり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/0cbe835f-4bac-5849-7dc6-062b278dd034.png)

エラーになる。

ここで、サインインの画面で再度試す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/94e5b7e3-dbff-3d71-d9a3-b1fdb7d26fc3.png)

なぜかうまくいく。

<B>Netlifyに独自ドメインを設定</B>
Netlifyに戻り、custom domain setupで取得したドメインを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/8da99579-1b10-766e-ae4a-374bccd47dd4.png)

Yes! Add DomainへGo

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/1fbb901f-3eb8-51f6-5783-89634d086c61.png)

ここで、またFreenomに戻り、Manage Domainを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/8b35ec5f-24a6-7ded-536e-266733c8bbc7.png)


manage freenom DNS というタブから下記、各種設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/64a965e9-9720-3e59-84cd-9d7be79377dc.png)

自分のドメインにアクセス成功！

※注意：wwwを最初小文字で打っていた。WWWの大文字にしたらちゃんとドメインアクセスできるようになった。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/d14c3912-7653-a3d4-caaa-3b62fe5670a9.png)
ISUCON10 Online event

こんにちは, This is Santosh.I participated in ISUCON2020 Online event, It was held on September 12,2020.
Rules and regulations are mentioned on the official sites. please go through once(~5 minutes) 
http://isucon.net/archives/54704557.html
Around 500~ teams participated on that day, It was fun as my first isucon! let's move to the technical side, 
There was an application given「isummo」、It was about finding chair(isu in japanese) by different conditions. The goal was to improve the search time and processing speed of isummo application.
![issumo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/0f5dd642-8cc4-a2ad-277d-493d7442c9ba.png)
![issumo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/077f74c0-fed9-3019-fe10-7e144d026d75.png)

lightly just go through the following;
・http://sinatrarb.com/
・new relic
ruby version check-install,start mysql(may be it will helpful next time too)
![installruby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/61129680-3ccc-18d7-592b-dfeafe9db4b8.png)
![dbSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/9aa19ed1-e98d-db75-7413-98c72dd7ad4a.png)
If any login issue with mysql just try this or follow stackoverflow↓
<b>mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_passw</b>

About coding language, you can choose any language Rust, Python, Go, Php or whatever you are comfortable with,I did with ruby as other team member were very familiar with it.Now the question is how to optimize our isummo app?
① Check all SQL queries -> Add index, as no index key was there
  eg. SQL -> select * from isuumo.chair where kind = 'some value'
check kind is indexed or not ,if not -> KEY `kind` (`kind`)
adding index is easy as soon as you find the query, and it's fasten our app to some level.(rank was going up & team was enjoying) 

② Index based on order BY ASC OR DESC
eg; select * from issumo.desk where some_condition order by popularity DESC;
Please not here, order by have column by DESC, and the default index we add earlier will be ASC .To speedup execution of query make it, DESC INDEX, -> <b>KEY `popularity` (`popularity` DESC)</b>
https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html
After this our app performance increased a bit.

③ Next, find n+1,source code and try to fix that,
  this was a bit tough ,I tried but there was no such improvement in speed.
Other things can be done on infrastructure side,as other member was doing that part I don't have much idea about it. Next isucon will try to cover up infra as well.
Good luck everyone for next event!
binding.pryの追加（rails）

ターミナルにて（追加したいディレクトリ）を「cd ~ 」で指定する。
VSCodeで（追加したいディレクトリ）のgemfileを開き、「gem 'mysql2', '0.？.？'」の「mysql2」のあとのバージョンを「'0.5.3'」に変更し、
「gem 'mysql2', '0.5.3'」とする。

gemfileの一番下に「gem 'pry-rails'」と記述し、ターミナルに戻る。
ターミナルにて、bundle updateをするとgemがインストールされる。

mysql２のバージョンが既に変更されていたら、pry-railsを記述した後に「bundle install」をすると導入される。

間違いなどあれば、ご指摘いただけるとありがたいです。
json builder

cli で json を生成したいと思うことがそこそこある。

## httpie

httpie の引数みたいに作れたらいいなと思っていたこともあった。実は `offline` オプションを使えばそのままできる。

```bash
$ http --offline -p B PUT localhost key1=value1 key2=value2
{
    "key1": "value1",
    "key2": "value2"
}
```

ところが普通に作っても、それほど変わらない。

```bash
$ echo '{"key1":"value1","key2":"value2"}' | jq .
{
  "key1": "value1",
  "key2": "value2"
}
```

httpie は、浅い json を扱うのには適しているけれど、深いネスト形式になると苦しい。残念。

## jq

長い文字列をまるっと安全にフィールドに格納したいときに raw input + slurp が便利。

```bash
$ cat server.crt | jq -R -s '{"server":{"cert":.}}'
{
  "server": {
    "cert": "-----BEGIN CERTIFICATE-----\nMII (中略) iXK\n-----END CERTIFICATE-----\n"
  }
}
```

json の merge は `slurp` オプションを使うと簡単。

```
$ jq -s '.[0] * .[1]' <(echo '{"key1":"value1"}') <(echo '{"key2":"value2"}')
{
  "key1": "value1",
  "key2": "value2"
}
```

`--arg`, `--argjson`, `--slurpfile`, `--rawfile` と null input を使うと組み立て専用な感じになる。

```bash
$ jq -n '{"a":$a, "b":$b}' --arg a hello --arg b world
{
  "a": "hello",
  "b": "world"
}
```
Tips: Ansibleにおいて when: x == "foo" は正しいが、when: "foo" == x は誤り

備忘

AnsibleというよりYAMLの問題

以下のansible playbookは正しくhello worldが出力される

```yaml
---
- hosts: localhost
  gather_facts: false
  tasks:
  - debug:
      msg: hello world
    when: x == "foo"
    vars:
      x: foo
```

しかし、以下はplaybookの実行時に Syntax Error while loading YAML. となってしまう


```yaml
---
- hosts: localhost
  gather_facts: false
  tasks:
  - debug:
      msg: hello world
    when: "foo" == x    # <= 順序を入れ替え
    vars:
      x: foo
```

これは、dictonaryのvalueが"や'で始まる場合、valueの最後において"や'で閉じる必要がある為

この順序で記述する場合、以下の様に書けば問題ない

```yaml
---
- hosts: localhost
  gather_facts: false
  tasks:
  - debug:
      msg: hello world
    when: '"foo" == x'    # <= 全体をシングルクォートで囲む
    vars:
      x: foo
```

その他、以下などでも良い

```yaml
    when: "\"foo\" == x"
```
```yaml
    when: "'foo' == x"
```
```yaml
    when: >-
      "foo" == x
```

最も下の書式では、when:の値全体を"や'で囲う必要がない為、"や'をユーザー側で使用するとしてもそれらのエスケープが不要という点で有用。
SpringFrameworkでJdbcTemplateを使ってみる(Javaアプリケーション)

##データを更新してみる。

https://tokkan.net/spring/jdbc.html


// 新規追加
jdbcTemplate.update("insert into m_user(id, name) values(? , ?)", user.getId(), user.getName());

// 更新
jdbcTemplate.update("update m_user set name = ? where id = ?", user.getId(), user.getName());

// 削除
jdbcTemplate.update("delete from m_user where id = ?", user.getId());
streamApiのサンプル

#streamApiのサンプル

import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) throws Exception {
        
        
        List<String> data = new ArrayList<>(Arrays.asList("あいう1111", "かきくけこ", "さしすせそ"));
        
        data
        // ①Streamを生成
        .stream()
        // ②中間処理（加工）
        .filter(s -> s.length() >= 5)
  
        // ③終端処理
        .forEach(System.out::println);
    }
        // Your code here!
    //     List<String> list = Arrays.asList("A", "D", "B", "C", "E");

    //     System.out.println("XXXXXXXX");
        
    //     // staticメソッドを参照する場合
    //     System.out.println("--- 匿名クラス ---");
    //     list.stream().forEach( new Consumer<String>() {
 
    //         @Override
    //         public void accept(String value) {
    //             MethodReferenceSample1.println(value);
    //         }
    //     });
        
    //     System.out.println("--- ラムダ式 ---");
    //     list.stream().forEach(value -> MethodReferenceSample1.println(value));
  
    //     System.out.println("--- メソッド参照 ---");
    //     list.stream().forEach(MethodReferenceSample1::println);
    //     // list.stream().forEach(::println); // ← これはNG
    //     // list.stream().forEach(println); // ← これはNG
 
    // }
    
    // private static void println(String value){
    //     System.out.println(value);
    // }
}
swiftでListしたRealmデータを削除するとクラッシュの件：Index 1 is out of bounds 

Realmに保存したデータをListで表示、
Cellごとに閲覧、編集、削除できるようにしたい。

と思っていましたが、削除する度に
Index 1 is out of bounds (must be less than 1)が出てクラッシュ。
長い間いろいろ英語の文章を参照したのですが、解決できなかった。

久しぶりに調べてみたら、この記事が救ってくれました。
https://llcc.hatenablog.com/entry/2020/04/26/205254

私のような新人の理解では、本来Listを出すには直接Realmへデータを取りに行くんですが、
今度は、ListのCellに対するView Modelを作り、View全体もView Modelを作り、
Listを出すにはViewModel経由で取得、

ForEach(model.myModels, id: \.id) 
↓
ForEach(model.cellModels, id: \.id)
もう削除したデータ、存在しないデータへ取りに行くことは発生しない

中身はこんな感じ：

```ContentViewModel
private var token: NotificationToken?
    private var myModelResults = try? Realm().objects(MyModel.self)
    @Published var myModels: [MyModel] = []
    
    init() {
        token = myModelResults?.observe { [weak self] _ in
            self?.myModels = self?.myModelResults?.map { $0 } ?? []
        }
    }
    
    deinit {
        token?.invalidate()
    }
```
```ContentView
ForEach(model.myModels, id: \.id) 
```
を以下へ変更

```ContentViewModel
private var token: NotificationToken?
    private var myModelResults = try? Realm().objects(MyModel.self)
    @Published var cellModels: [ContentViewCellModel] = []
    
    init() {
        token = myModelResults?.observe { [weak self] _ in
            self?.cellModels = self?.myModelResults?.map { ContentViewCellModel(id: $0.id, title: $0.title) } ?? []
        }
    }
    
    deinit {
        token?.invalidate()
    }
```

```ContentView
ForEach(model.cellModels, id: \.id)  
```

このようにしたら、エラーが綺麗に解消できました。
remote.itのWindowsデスクトップアプリをv2.8.2にバージョンアップしてみた

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. remote.itのクライアントバージョンアップ

Windowsデスクトップアプリがバージョン2.8.2になったのでバージョンアップする


https://github.com/remoteit/desktop/releases/tag/v2.8.0
https://github.com/remoteit/desktop/releases/tag/v2.8.1
https://github.com/remoteit/desktop/releases/tag/v2.8.2

デスクトップアプリ リリースノート
https://support.remote.it/hc/ja/articles/360047705691
`まだ。2.8系のリリースノートは出てないようだ。中の人ガンバ`

# 1. ログインすると以下の画面が出る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/72fd3e0b-08ad-4b76-9caa-220f60e04d00.png)

Devicesの上の`RESTART`ボタンを押す

# 2. インストール
## 2-1. インストール開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b2c69142-4c66-f0ee-8485-60d1ab5ac784.png)

## 2-2. デバイスの登録の解除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/fdc6b4d4-eefe-20b5-ee4a-80bf70747051.png)

unregisterするか？と聞かれるので  **`はい`** を押す。
どうも、remote.itクライアントを入れている自分のデバイスを1回登録解除しないといけないらしい。`登録していなくても実施する`

## 2-3. デバイスの登録の解除済みの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5635e99c-6f07-3873-70bf-ddc827268e18.png)

登録解除(unregister)されたので、`OK`を押す

## 2-4. インストールが開始される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5cd11e93-17a9-df91-9f2f-5f3a056d8dfa.png)

# 2-5. インストール終了確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0729a0f0-b9e8-016e-bd0d-08270ca625fa.png)

`完了`を押す

# 3. アップデート後のログイン
## 3-1. ログイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/18a7dd18-b1a0-6396-7342-02602f21fc14.png)

ログイン UIが変更されて、`SIGN IN WITH GOOGLE`が追加された

## 3-2. ログイン中画面

特に変化無し
(強いて言えばロゴが出るようになった)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/60d913bf-c492-824a-ba11-67c2708bbc9f.png)

## 3-2. デバイスリストダッシュボード

UIがスマートになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/256cac8c-5a6a-09bb-68f3-a1712f695c7c.png)

## 3-3. 接続メニュー
コンテキストメニューで出るようになった
地味に便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/37e81951-78e2-f38e-2f26-b007fcf0ce72.png)

## 3-4. デバイス概要画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/4c13a5bd-4a0b-3217-1367-10734461ffc0.png)

あまり変わってない？
デバイスログが参照できるようになっている

## 3-5. デバイス詳細画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/869021aa-3af6-e996-9044-0624ee15bafe.png)

この画面から他のユーザーへの共有ができるようになった。
ROUTINGが選択できるようになっている。

# 4. まとめ

全体的にUIがブラッシュアップされて、かゆいところに手が届く感じになっているのが好感が持てる。
操作感もよくなっていてキビキビ動くところもよい。
設定を編集する鉛筆アイコンもあちこちにあって気軽に変更できるようになっている。
Laravel:v8.xにおけるTarget class ...Controller does not exist.の解消方法

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.Target class ...Controller does not exist.はどういう意味か

<b>3.どのように変更するか</b>

<b>4.なぜTarget class ...Controller does not exist.になるのか</b>

<b>5.開発環境</b>



1.結論
----------------------------------------
<b>web.phpのルーティングの書き方を変更</b>する！

<br>

2.Target class ... Controller does not exist.はどういう意味か
----------------------------------------
<b>目的である....コントローラーがないよ！</b>と言っています。つまり、
❶何かしらの原因でコントローラーがいないことになっている
❷何かしらの原因でルーティング➡︎コントローラーへと指示がいっていない

という可能性があります。
<br>

3.どのように変更するか
----------------------------------------
今回は❷でした。

正しい書き方は2種類あります。
`i)絶対パスを記載する`

```php:routes/web.php
Route::get('/person' , 'App\Http\Controllers\UserController@index' );
```

`ii)useを使用してルートを設定`

```php:routes/web.php
#省略
use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
```
<br>
<br>
自分が記載した間違った方法は以下のようでした。(Laravel6.xでは使用可能)
`iii)パスを省略して記載`

```php:routes/web.php
Route::get('User' , 'UserController@index' );
```
<br>


4.なぜTarget class ...Controller does not exist.になるのか
----------------------------------------
LaravelのVersionが原因でした。`Laravel6.x`では`3.iii)`の方法で記載できましたが、`Laravel8.x`では`3.i)orii)`でないとダメみたいです。下記の参照URLにて詳しく書かれています。

参考にさせていただいたURL:
<a href="https://qiita.com/tamakiiii/items/e71040173fa0a1fcad83">Laravel8を試したら即効でエラー「Target class [〇〇〇Controller] does not exist.」が表示された</a>


5.開発環境
----------------------------------------
PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql 5.6.47
Sequl Pro 1.1.2
<br>
Railsで日付比較の検索の書き方

Ruby2.7.1
Rails6.0.3.3
で確認

久しぶりにRailsでDBの検索処理を書いていて日付の比較の検索ってどう書くんだと調べていたのでメモ書き。
調べてるとたいてい、SQLを書くかArel使うかみたいのばっかで他に無いのかと調べていたら下記のような書き方でもいけた。


```Ruby
[0] pry(main)> User.where(created_at: ..DateTime.now)
  User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE `users`.`created_at` <= '2020-10-27 14:41:26.943067'
[
    [0] #<User:0x000055861898f208> {
                   :id => 1,
           :created_at => Tue, 27 Oct 2020 14:18:54 JST +09:00,
           :updated_at => Tue, 27 Oct 2020 14:18:54 JST +09:00,
    }
]
```

逆は

```Ruby
 User.where(created_at: DateTime.now..)
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`created_at` >= '2020-10-27 14:52:57.534880'
```

へぇって感じ。
Pythonのオブジェクトでの代入と変更

#概要
Pythonでモヤモヤしていたのでテスト。
詳しくは、元記事(https://qiita.com/yuta0801/items/f8690a6e129c594de5fb )を参照ください。
(私は挙動を知りたいだけなので、参照渡しがどうとか言われても興味がありません。また今度勉強します。)

#内容
```python:tmp.py
obj = {'arr': ['hoge']}
print(obj)

arr = obj['arr']
obj['arr'] = []

print(obj)
print(arr)
```

```:output
{'arr': ['hoge']}
{'arr': []}
['hoge']
```

#蛇足
```python:tmp.py
obj = {'arr': ['hoge']}
print(obj)

arr = obj['arr']
arr.append('fuga')
print(obj)
print(arr)

obj['arr'] = []
print(obj)
print(arr)
```

```:output
{'arr': ['hoge']}
{'arr': ['hoge', 'fuga']}
['hoge', 'fuga']
{'arr': []}
['hoge', 'fuga']
```

#すっきりした
javascript 正規表現で置換 str replace

javascriptで正規表現をやりたい
`text.replace("/<p>/","");` と
マッチング部分を " で囲むとバグるので注意

```

var text = 'youryour';


//文字列置換 (各最短マッチ)
var tmp = text.replace(/<p>|<h3>|<blockquote.*?<\/blockquote>|<img.*?>|<iframe.*?<\/iframe>|<code.*?<\/code>|<pre.*?<\/pre>/gsim, '');

//</p> もしくは </h3> を改行に変換
var tmp = tmp.replace(/<\/p>|<\/h3>/gsim,"\n");

```


# 修飾子の意味

m : 複数行検索
s : を改行文字と一致するようにします。
i : 大文字、小文字の区別をしない
g : 最初にマッチした時点でマッチする文字列を探すのを終了せず全てのマッチする文字列を探します。複数マッチングするかを調べることができます。
intra-mart記事 作成候補よりリクエスト受付

下記の一覧はこんな記事書こうかなとメモしたまま死蔵になっているものです。  
リクエストがあれば記事化するかもしれません。
メモ代わりも兼ねて放流します。

 - IM-Workflowのトランザクション問題について。アクション処理で実施するのがセオリー
 - ViewCreator 計算値項目の小ネタ。NUMで変換を掛けたのちに更新して開き直すとフォーマットが掛けられる
 - Forma グリッドテーブル 折り返し設定
 - Formaカスタム入力チェック プログラムから一括設定方法
サンプル作りたい。getCustomCheck？それっぽいの
 - Forma グリッドテーブル自身の定義取得等
個別記事にしてもいいかも？
 - Forma グリッドテーブルのカラム操作とレコード追加処理

 - Forma罠一覧記事 これは有用なはず
    - クリア処理がマッピング対象項目すべてを対象にしない
    - 先頭空白のセレクトボックスで先頭を選んだ時にイベントが発生しない
    - 自動採番。移行にSQLが必要。かつUNIQUE_NOが被る。最大桁まで行くと採番が勝手に1に戻る。挙動が選べない。DBのシーケンス使ったほうが良いかも。
    - Forma WF連携 案件プロパティ登録のワナ。何か値を設定した後に空文字 or NULL設定すると更新されない。

 - BIS グリッドテーブル セレクトボックス ドリルダウンサンプル
サンプル作成が激ムズっぽいので心が折れて着手せず

 - 開発時 同期処理設定（WF、JOB）

 - IM共通マスタに大量データの投入方法
    - 主にテスト時に
    - XML出力して編集
    - SQLで直接投入。自信があればOK

 - スクリプト開発時 共通処理記述方法
    - content.execute？
関数単体で実行する

    - load & call
ファイルをまとめて取り込めるのでクラスのように使える

    - initializerに登録して云々
インスタンス化がいらなくなりstaticメソッドチックに使える
プロジェクト固有ログ出力処理などに使うかな

 - WF_到達処理_処理対象者展開ハマリ
組織の他ローケール未入力で死ぬ

- WF_到達処理_処理対象者展開ハマリ
いくらソースを書いても反映されない。  
処理対象者展開プラグインはソース修正ごとにresin再起動が必要  
到達処理、到達時の処理対象者展開処理は分散環境だとWFを実行したサーバーで処理されるとは限らない

- WFの到達処理を非同期→同期にする
そうしないと複数人開発時 死ぬ

 - JOB実行サーバーの固定化

```
<?xml version="1.0" encoding="UTF-8"?>
<service-selecter-config xmlns="http://intra-mart.co.jp/system/service/selecter/config/service-selecter-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://intra-mart.co.jp/system/service/selecter/config/service-selecter-config service-selecter-config.xsd ">
<services>
<service service-id="server.service.job_scheduler">
<assign-hosts>
<host>192.168.1.1</host>
</assign-hosts>
<invalid-hosts>
<host>*</host>
</invalid-hosts>
</service>
</services>
</service-selecter-config>
```

- eBuilder resinの再起動が必要なパターン
SQL
メッセージファイル
confファイル
プロパティファイル
xmlファイル

- Qitaのネタ3 未検証なのでまだ書けない
im-workflow グレイボックス初期表示を変更できる
imwUserDataIdとimwWorkflowParams.UserDataId双方に同一キーを設定すると出てくる
SVN のリポジトリを Git のリポジトリとして clone する

## 環境

CentOS 7.7

## 手順

1. 必要なパッケージをインストールする

    `$ sudo yum install -y git-svn`

1. SVN と Git のユーザ情報のマッピングファイルを作成する

    `$ vi authors`

    ```:authors
    # format
    svn-user-name  = git-user-name <git-user-email>
    ```

1. SVN リポジトリを Git のリポジトリとして clone する

    `$ git svn clone --stdlayout --no-metadata --prefix=svn/ --localtime --authors-file=authors <svn-repository-url>`

## clone 時に使用するオプションについて

* --stdlayout
  * SVN のリポジトリが trunk, branches, tags の構成になっている場合に使用する
* --no-metadata
  * コミットログに SVN のメタ情報を残さない
* --prefix=svn/
  * SVN のリポジトリから作成したブランチに、指定したプレフィックスをつける（ex. `remotes/svn/trunk`）
* --localtime
  * コミットログの Date 情報をローカルのタイムゾーンに合わせる（デフォルトはUTC）
* --authors-file=authors
  * コミットログの Author 情報を指定したファイルで置換

---

今回は Git のローカルリポジトリを作成するところまで検証した。
あとは `git remote add` でリモートリポジトリを追加してプッシュしてやれば良さそう。
Simulatorが動かない：Unable to boot device due to insufficient system resources

Simulatorとの戦いはまだまだ続く（泣）

いっぱいSimulatorのバージョンを入れたせいか、
ビルド成功した後、以下エラーが出てSimulatorが動けなくなった。。。
Unable to boot device due to insufficient system resources

参照してみた：
https://www.366service.com/jp/qa/29bc4dae4b18727a1595807565b57e5a
https://blog.csdn.net/CC1991_/article/details/88399495


sudo launchctl limit maxfiles 1024 unlimitedを実行

次にXcodeでビルドしたら、無事にSimulatorが動きました。
Rails学習　3日目

#Ruby on Rails5速習実践ガイド chapter6

##6-2-1　「ルート」を構成する5つの要素
ルーティングとはリクエストをどのアクションで実行するかを指定するもの。ルーティングを構成するのに必要な物は以下である

|要素の名前|要素の内容の例|説明|
|:---|:---|:---|
|HTTPメソッド|GET,POST,PATCH,PUT,DELETE|情報の送信、取得の方法を表す物|
|URLパターン|/tasks、/tasks/:idなど|URLそのもの|
|URLパターンの名前|new_task、tasksなど|定義したURLパターンごとに一意な名前をつけたもの|
|コントローラー|tasks(Taskcontroller)|呼びたいアクションのコントローラークラスを指定する|
|アクション|index|呼びたいアクションを指定する|

##6-2-5 resourcesでCRUDのルート一式を定義する
前の説明でresourcesについて説明した今回はそれの応用編である。

```ruby:/config/routes.rb
resouces :tasks
```
このように記述するとtaskルーティングの７つのHTTPメソッドが自動的に１つにまとまる。ということを書いた。それではそれ以外のルーティングを書きたいときはどうすれば良いのか？プラスで付け加えたい時はcollectionを使う

```ruby:/config/routes.rb
resouces :tasks do
  collection do
    get 'export'
  end
end
```
このようにcollectionのなかにHTTPメソッドとアクション名を書くことで自動的にルーティングが機能するようになる。

##6-3 国際化
ja.ymlファイルなんかによりプログラミングでも日本語対応させてコードを書くことが可能である。利用者もまた日本語に対応したサービスにはなるが外国のかたが使う機会があるかもしれない。利用者によって言語を変える必要も出てくる。そんな時に使うのがI18n.localeである。I18nは一つのプログラムで複数の国向けに使えるようにするものである。

```
class ApplicationController < ActionController::Base
  before_action :set_locale


private

  def set_locate
    I18n.locale = current_user&.locale || :ja #ログインしていなければ日本語
  end
end
```
コントローラに定義することで使えるようになる

##6-6　Railsのログ
ログとは自分が何か処理をしたときの履歴である。もしエラーやバグがあればログを遡り何の操作が正しくなかったかなどをみることができる。
例えばタスク作成時に保存したタスクの情報をログ出力させたい時は、以下のようにする。

```ruby:app/controllers/tasks_controller.rb
   def create

     if @task.save
       logger.debug "task: #{@task.attributes.inspect}"
       redirect_to @task, notice: "タスク「#{@task.name}」を登録しました"
     else

```
inspectはわかりやすく表示してくれるもの。

ただログに残ってはいけない個人情報なんかもある、その時にはログに映らないようにしなければならない。

```ruby:config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameter +=[:password]
```
ここで指定されたパラメータの値は、ログ上では[FILTERED]と表示される。
【Rails】Active Storage（画像保存の設定）

#使用するツール
Active Storage(gem)　※railsに最初から入っている。
MiniMagick(gem)
ImageProcessing(gem)
ImageMagick

#実装手順

##ImageMagickをインストール
```	
% brew install imagemagick
```

##Gemをインストール
```gemfile	
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
```


##Active Storageをインストール
```	
% rails active_storage:install
```
```
% rails db:migrate
```
rails active_storage:installコマンドを実行すると、Active Storageに関連したマイグレーションが作成されます。続けてマイグレートしましょう。

#画像の保存
Active StorageのテーブルとMessagesテーブルのアソシエーションを定義
messages_controller.rbにて、imageカラムの保存を許可


##has_one_attachedメソッド
各レコードとファイルを1対1の関係で紐づけるメソッド

```rb
class モデル < ApplicationRecord
  has_one_attached :ファイル名
end
```
:ファイル名には、添付するファイルがわかる名前をつけましょう。
この記述により、モデル.ファイル名で、添付されたファイルにアクセスできるようになります。また、このファイル名は、そのモデルが紐づいたフォームから送られるパラメーターのキーにもなります。

##画像の保存を許可するストロングパラメーター
```rb
 def message_params
    params.require(:message).permit(:content, :image).merge(user_id: current_user.id)
  end
```
#保存した画像を表示
##image_tagメソッド
```
# ファイルをモデルから指定する場合
<%= image_tag モデル名.has_one_attachedで設定したファイル名 %>
<%= image_tag user.avatar %>

# app/assets/ディレクトリ下の画像ファイルパスでも指定できる
<%= image_tag 画像ファイルのパス %>
<%= image_tag "avatar.png" %>
```

##attached?メソッド
レコードにファイルが添付されているかどうかで、trueかfalseを返すメソッドです。
ifと組み合わせて、画像の有無によって表示するかどうか判断させられます。

```
モデル.ファイル名.attached?
```
```
<%= image_tag message.image, class: 'message-image' if message.image.attached? %>
```

##variantメソッド
ファイルの表示サイズを指定できます。

```
モデル.ファイル名.variant(resize: '幅x高さ')
```
##記述例

```html.erb
<div class="card">
  <%= link_to image_tag(prototype.image, class: :card__img ), prototype_path(prototype) if prototype.image.attached? %>
  <div class="card__body">
    <%= link_to "#{prototype.title}", root_path, class: :card__title%>
    <p class="card__summary">
      <%= "#{prototype.catch_copy}" %>
    </p>
    <%= link_to "by #{prototype.user.name}", root_path, class: :card__user %>
  </div>
</div>
```

##画像かテキストだけのメッセージを送信
```rb
class Message < ApplicationRecord
  belongs_to :room
  belongs_to :user
  has_one_attached :image

  validates :content, presence: true, unless: :was_attached?

  def was_attached?
    self.image.attached?
  end
end
```

#複数枚の投稿
##アソシエーションの変更
has_one_attached :imageをhas_many_attached :imageへ変更

```model.rb
class モデル名 < ApplicationRecord
  has_many_attached :images
end
```

##フォームの修正
```
<%= form_with model: @モデル名, id: 'new_message', local: true do |f| %>
  <%= f.text_field :content, placeholder: 'type a message' %>
  <%= f.file_field :images, name: 'message[images][]', id: 'message_image' %>
  <%= f.submit '送信' %>
  <div id="image-list"></div>
<% end%>
```

##ストロングパラメーターの修正
なお、配列型のパラメーターは最後に書かなければエラーを吐く。
エラーを吐く例：`params.require(:モデル名).permit(images: [], :title)`

```controller.rb
private
  def message_params
    params.require(:モデル名).permit(images: [])
  end
end
```

##ビューの修正
<%= image_tag @変数.image, id: 'image' if @変数.image.present? %>は削除し、以下の記述に置き換える。

```html.erb
<% @変数.images.each do |image| %>
  <%= image_tag image, class: 'images' %>
<% end %>
```

仮に1番目の画像のみを表示したい場合は、以下の記述となる。

```
<%= image_tag @親モデル名.image.first %>
```
[Rails]Google Analytics コンバージョンタグを設定する

## 目標(コンバージョン率の測定)とは
Google Analyticsの機能で、「会員登録」「コンテンツ登録」「5ページ以上の閲覧」など目標を設定することにより、Webサイトの指標を出すことができます。
僕のWebサイト( https://www.mini4wg.com/ )でも目標設定をしたので、設定項目や実装方法などを解説していきます。

![スクリーンショット 2020-10-27 14.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/949efc28-f733-d11e-fae3-54f2a08fe6b6.png)


### 目標設定 1/3
テンプレートが準備されており非常に便利です。google analyticsを指定してあれば、サイトに手を入れ図に対応することもできます。
しかし、画面遷移などによってはコンバージョンタグを仕込むなどの準備が必要になります。

最初の目標では
　- 収益
　- 集客
　- 問い合わせ
　- ユーザーのロイヤリティ
など良く使われる項目が最初から定義されています。自分のサイトにあった目標を設定しましょう。


![スクリーンショット 2020-10-27 14.13.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/96261404-d05c-74a5-5683-844b7bc1138f.png)


### 目標の説明 2/3
目標の説明では測定のタイプを設定します。
- 到達ページ
- 滞在時間
- ページビュー数
- イベント
が設定できます。

![スクリーンショット 2020-10-27 14.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/56b297c1-959e-1ffe-cb9d-70d62d6d2012.png)



# 目標の詳細 3/3
目標の説明(2/3)で設定したタイプにより、ここのフォームが変化します。
イベントを選択した場合は、Webサイトからeventを送信する必要があります。
到達ページや滞在時間やページビューはGoogle Analyticwの画面から設定するだけで利用可能です。

![スクリーンショット 2020-10-27 14.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/d5830dd6-be23-b1fe-6e3c-7811e9b170ee.png)



## Railsでイベントを送信する場合
僕のサイトでも画像を登録する機能があるのですが、コンバージョンを測定するのに作成時に一度だけ送信したい時に下記の様な実装を行いました。
※ gtag.jsかanalytics.jsかでevent送信のコードが違うのでご注意ください。
僕のサイトではコンテンツ送信を測定する場合,ECサイトではよくある[thanks.html]などのサンクスページないため、
作成時に一回限りだけjavascriptのタグを出力し、google analyticsにeventを送信する様にしました。

### ProductsController
```:ruby
class ProductsController < ApplicationController
  =省略=
  def create
    @product = current_user.products
                           .build(product_params)
    authorize @product

    if @product.save
      flash[:cv] = true
      redirect_to @product, notice: t('.saved')
    else
      render :new
    end
  end
 =省略=
end
```

### views/products/show.html.slim
```:slim
~~省略
- if flash[:cv] == true
  javascript:
    gtag('event', 'created', { 'event_category': 'products', 'event_label': '#{@product.id}'});
~~省略
```

## 確認方法
実際にeventの送信が行われているかは下記のChrome Extensionを入れることにより、どんなeventが送信されているかわかります。

Page Analytics (by Google) - Chrome ウェブストア https://chrome.google.com/webstore/detail/page-analytics-by-google/fnbdnhhicmebfgdgglcdacdapkcihcoh/related?hl=ja

### 最後に
目標設定をすることにより、サイトの改善に役立てると共に人に説明する時にも指標があると非常に便利です。
Anaconda環境における仮想環境の作成

## はじめに
Pythonをインストールして `venv` のコマンドより仮想環境の作成をしていたが、**Anaconda**（科学計算のためのオープンソースディストリビューション）を使った方が異なるPythonバージョンの環境作成ができるし、視覚的にも操作しやすいらしいので、本記事ではAnacondaで仮想環境の作成を試してみる。


## 実行環境
【ローカルPC環境-OS】
　　・Windows 10 Pro　

【ソフト・パッケージ】
　　・Anaconda3-2020.07-Windows-x86_64

## 今回やること
１．Anacondaのインストール
２．仮想環境の作成


### １．Anacondaのインストール

**まずは以下のサイトのから自分のPCに合うインストーラーをダウンロード。**
　　https://www.anaconda.com/products/individual
　※自分のPCは Windows なので下図の赤枠をダウンロード。
![Qiita-no016_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/57a5f644-43a4-c125-7e07-6b70aa010484.jpeg)


**ダウンロードした [.exe] ファイルを実行**
起動してからは以下の流れ。

　・セットアップ画面 ⇒ 『NEXT』をクリック
　・ライセンス契約　 ⇒ 『I Agree』をクリック
　・インストールタイプの選択 ⇒ 『NEXT』をクリック ※デフォルト "Just Me" でOK
　・インストール場所 ⇒ 適当に決めて『NEXT』をクリック　※デフォルトOK
　・インストールオプション ⇒ 何もチェックを付けずに『NEXT』をクリック
　
　※インストールが完了したら『NEXT』・『FINISH』などをクリックして終了。


**Anacondaの起動**
【Anaconda Navigator】をクリックして起動すればOK
![Qiita-no016_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/e2c6a14e-c6e7-c5b1-6786-9075791f03eb.jpeg)
![Qiita-no016_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/1f54b936-105b-3f5e-1d7d-cc6c4e808630.jpeg)

### ２．仮想環境の作成

左側メニューの [Environments] を開き、『Create』をクリック。
ポップアップ画面が出てくるので、仮想環境の名前とパッケージを決めたら『Create』をクリックして環境を作成する。

![Qiita-no016_img04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/e59394df-b591-06b5-14ca-c59de47f03ce.jpeg)


### 補足
デフォルトではPythonもRも１つのバージョンしか入ってないなかったが、異なるバージョンの環境を作ることも可能。
【Anaconda Prompt】を起動して、以下のコマンドを実施すれば別バージョンのPythonがインストールされた環境が作成できる。
![Qiita-no016_img05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/2a49d87c-069a-1fc0-bfbd-33f4cc3fc515.jpeg)

```shell:
conda create -n 【環境の名前】 python=【バージョン】

# 実際のコマンド例
conda create -n test_py36 python3.6
```

Navigatorから確認してみると、Python3.6が入った環境が作成されている。
![Qiita-no016_img06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/4a3d9654-5f26-0280-8d75-176a83ef9358.jpeg)



## まとめ
確かに簡単に仮想環境を作れたし、異なるバージョンの環境作成も問題なさそうなので、しばらくはAnacondaを使ってみようと思う。
使っていく中で何か不都合があったら、またメモを残します。。
AWS 認定 ソリューションアーキテクト – アソシエイトに合格しました

#はじめに
AWS SAAに1発合格しましたので、学習方法・反省点をまとめました。
プロフィールは以下の通りです。

 - 年齢：23歳（新卒2年目）
 - 会社：元請けSIer
 - 職業：システムエンジニア
 - 備考：AWS実務経験無し

#学習履歴
以下3つの教材で学習対策を行いました。
学習の際に、```実際のAWSスキル```も養いたかったため、```ポートフォリオ作成```と並行しつつ、
AWS SAA学習を実施しました。

###[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)

 - 良かった点
   - ハンズオン形式で学習出来る
   - AWSの主要サービスを一通り学習出来る
   - 模擬テストを受験出来る

###[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)

 - 良かった点
   - 問題数がかなり豊富
   - スキマ時間に取り組むことが出来る
   - 基礎固めに最適な難易度

###[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)

 - 良かった点
   - 難易度が本試験に近い
   - 6回分模擬試験に取り組むことが出来る
   - スキマ時間に取り組むことが出来る


#最後に
 - 合格後に感じたこと
   - Web系企業への転職の際に、アピールポイントになる
   - AWSのサービス・用語をほぼ理解出来る

 - 反省点
   - 受験直前は、自然と暗記が多くなってしまった
   - 実務経験が無いため、イメージしにくい問題が多かった
   
[![Image from Gyazo](https://i.gyazo.com/5a02c8e64498af7ed91f54d778ae169b.png)](https://gyazo.com/5a02c8e64498af7ed91f54d778ae169b)
[![Image from Gyazo](https://i.gyazo.com/af9dbd7621fa27ea44968578e60a4e14.png)](https://gyazo.com/af9dbd7621fa27ea44968578e60a4e14)
Swiftから始めてSwiftUI

# Swiftの構文

## struct

```swift
struct Game{
    let title: String
    let version: Double
    init(title theTitle: String, version theVersion: Double ) {
        self.title = theTitle
        self.version = theVersion
    }
    func play(){
        print(self.title + " is playing.....")
    }
}
let MyGame = Game(title: "MyFirstGame", version: 0.1)
MyGame.play() // MyFirstGame is playing.....


```

## プロトコル
Javaでのインターフェイスに対応する

```swift
protocol Updatable{
    func update(_ version: Double)
}

struct Game: Updatable{
    ~~~ 略 ~~~
    func update(_ version: Double) {
        print("updated")
    }   
}



```
構造体名: プロトコル名とする



# SwiftUI
これを踏まえたうえでContentView.swiftから引用

```swift

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

```

つまりはContentView構造体をViewプロトコルを使用し定義している
Viewプロトコルではbodyプロパティを実装必要があるのでそのとおりに
some型はViewプロトコルに適合した任意の型なので、必ずしもViewなくてならないわけではない
コントローラとビュー

# MVCモデル
MVCモデルはModel、View、Controllerの３要素で成り立ち、互いを呼び出し合って処理を行う。
Cotrollerはプログラムの**制御**する役割を担っている。例えば、Controllerが呼び出された時に、様々な判定処理や計算処理を行い、その結果をModelまたはViewに受け渡す。
また、Controllerはクライアントとやりとりをする役割をになっていて、クライアントのHttpリクエストはコントローラーに対して行われ、リクエストに応じてviewを返す。viewを返すまでの間Modelからデータをうけとってviewに受け渡すなどの処理をしている。

Viewは、**表示**を司っている。基本的にHtmlの描画になっているが、Controllerから受け取ったデータを表示することもできる。

Modelは、データベースとやりとりして**データ**を扱う役割を担っている。実は、モデルにはデータの取得する関数などは予めCakePHPで用意されていて、複雑なデータ取得関数以外は自分で記述する必要がない。
モデルにモデルの構造を記述することで、ControllerからModel->findのようにデータの取得が可能である。


#Controller

###コントローラーの作り方
1. Controllerフォルダ以下に「名前Controller」の命名規則でファイルを作成する
2. AppControllerを継承して「名前Controller」の命名規則でクラスを作成する
※AppControllerはCakePHPに用意されているクラスでコントローラーの仕組みを備えている。これを経書しなければコントローラーとは認められない。


###Urlの規則

`http://localhost:8000/コントローラー名（Controllerを抜かした部分）/アクション名`

※ある規則（rest api）に沿っている場合、アクション名を省略していい場合がある

###AppControllerのクラス関数、クラス変数

クラス名の指定
`$name = コントローラ名`

他のクラスを読み込む時

```php

App::uses('クラス名','ファイルパス')
//（例）
App::uses('AppController', 'Controller');
App::uses('HttpSocket', 'Network/Http');
App::uses('AppModel', 'Model');
```

コントローラで使うModelの宣言

```php

    public $uses = array(
        'Order',
        'User'
    }
```

###アクションの移動

*setAction*とredirectがある。
setActionがアクションを直接指定して実行するのに対して、redirectは指定したurlに再度、HTTPリクエストを送る形でアクションを実行する。なので、setActionでは、urlのリンクは変わらないが、redirectではurlがかわる。

#View
ビューには大きく分けて「テンプレート」と「レイアウト」がある。
２つの関係は、レイアウトがヘッダーやフッターなどの枠組み、内容部分にテンプレートが入る。
レイアウトはメニューバーなど複数ページで共通して表示させたい場合や統一したデザインにしたい場合に便利だ。
アクションごとにレイアウト機能をoffにすることも可能だ。

###テンプレートファイル
`<title><?php echo 変数 ?></title>`みたいな形で、echoでhtmlタグ内に表示させることで、echoしたものを普通のテキストの様に認識する。

### レイアウト
デフォルトレイアウトは`View/Layouts/default.ctp`に設定されている。

appコントローラのメンバ変数$layoutを指定することで`public $layout = レイアウト名;`、
使用するレイアウトを指定することができる。

### テーマ
基本的に、レイアウトでデザインや枠組みを統一したいが、このページに関してはデザインを少し変えたいという場面があると思う。その際に、レイアウトを変えずにデザイン（cssの部分）を変えることができるのがテーマだ。

1. `View/themed/helloTheme/themed/webroot/css`に`cake.generic.css`の様な形でcssを用意する。
2. アクションで使うテーマを指定する`$this->theme = "helloTheme";`
IBMCloud ICLB TCPロードバランサ構成

##フロントエンドTCP構成
一般的にはフロントエンドをHTTPSで暗号化しつつ、ICLBでSSL/TLS通信をオフロードし、バックエンドをHTTPで接続する
あまり利用する機会はなさそうだが、下記の様な構成でも利用できる。


* 暗号化通信(HTTPS)をオフロードしたくない時(ICLBは透過させる)
* ICLBにSSL/TLS証明書をデプロイしたくない時(サーバ側に証明書を導入する)
    * <font color="red">SSLターミネートの為、サーバ側に正しいCNを含めたSSL/TLS証明書を入れておくことで暗号化通信可能</font>

<font color="red">Front-endおよびBack-end ProtocolをTCPにする</font>事で実現できる
❇ 片方だけTCPにすることは出来ない
![IBM_Cloud____Local_Load_Balancer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/00f031da-9197-f0a4-d098-aab172caaf34.png)
【Mendix】最初のデプロイでエラーが発生したとき

#まだ何もしてないのにエラー発生…
Create New Appでアプリを作成してすぐ、Run Locallyで実行しようとしたら以下のようなエラーが発生するかもしれません。
日本語・英語で検索しましたが、同じエラーで困っている人は見つかりませんでした。

>An unknown error occured while starting the server.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628704/e0a1cdda-add3-b3a3-e58a-df1ce2f1c9d8.png)

#解決策
私の場合、デフォルトのポート番号8080が他のアプリケーションと競合していたことが原因だったようです。
ポート番号は**Project Explorer→Project→Settings**で設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628704/17c5a9ac-578e-cfa9-425f-70e29048029f.png)

Application root URLを8070など競合しなさそうな番号に変えればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628704/370d0bd2-1968-41a3-9502-3b9b045c2707.png)

再度Run Locallyを押下すると成功するはず。
以上！

>参考：https://docs.mendix.com/refguide/configuration
Dockerコンテナ内でcomposer updateしようとしたらproc_open(): fork failed と怒られた

## 環境
Docker for windowsを使用しています．
Docker Machineのバージョンは以下の通りです．

```
docker-machine.exe version 0.16.1, build cce350d7
```

# Docker内でcomposer updateしようとした
LaravelをDockerコンテナ内で動かしているのですが，`composer update`をしようとしたら怒れてしましました．

```
PHP Fatal error: Uncaught exception 'ErrorException' with message
'proc_open(): fork failed - Cannot allocate memory'
```

どうやらメモリ領域が足りないことが原因で起きたようです．
そこでスワップ領域を拡張しようと思い，以下のコマンドを実行したのですが，` swapon failed: Operation not permitted`と怒られました．

```
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
```

権限を与えてもダメでした．


## 解決方法
Docker Machineのメモリを増やしたらうまくいきました．
Docker Machineを一度停止し，Oracle VM VirtualBox マネージャーを起動します．
![2020-10-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/488f4e5e-03c6-6199-e505-cc1b3de9ce51.png)

以下のように該当するMachineの設定を開き，システム＞マザーボード＞メインメモリでメモリを増やします．
自分の環境では2GBでうまくいきました．

![2020-10-25 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/97f4a6e8-4f6a-f93d-27be-a3797266c53b.png)
※Machineを起動した状態では変更できません．落とすのを忘れないように．
【メモ】Jetson Nano B01セットアップ

jetracerの改造版用に構築した環境をバックアップしようと思ってSDをリサイズしたらデータが飛んだため備忘録でメモ


1.SDカードのイメージをDL
2.セットアップ
3.sdk manager
4.各種パッケージのインストール



#JETSON NANOイメージファイルのダウンロード
（2020/11/03時点で）最新の4.4は評判がよろしくない※＆最新にする必要もないため、JetPack4.3をダウンロード。
https://developer.nvidia.com/jetpack-43-archive

※参考：https://qiita.com/karaage0703/items/604ff6e0a8287aa0dce7

#セットアップ
SDカードを挿入し電源を投入。通常のUbuntuと同様にセットアップ。
このときインストール先の容量を選択できるので、お好みに合わせて調整。
（SDカードのバックアップを考え、若干減らしておくと良いらしい）
※参考：https://qiita.com/karaage0703/items/e2170d4d1eab7fdabe46

#SDKマネージャ
UbuntuPCを用意し、SDKマネージャをインストール。Jetsonとは電源用のUSBに接続。別途5V電源でJetsonを起動してセットアップ。
https://developer.nvidia.com/nvidia-sdk-manager
やたらスペック（ディスク容量・画面サイズ・RAM）を要求された上で18.0.4を指定されるので面倒。（20.0.4しか持っていない。。。）
OSをインストールしないのでチェックを入れない。その場合、リカバリモードでの起動は不要な模様。

#各種パッケージをインストール
## setuptool
この後あらゆる場面で"sudo python3 setup.py install"を打つため予め入れておく。
sudo apt-get install python-setuptoolsでインストール可能

## pyTorch
インストールされているpythonのバージョンに合わせてインストール。ここでは1.4.0を選択。
https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-6-0-now-available/72048

インストールするバージョンに合わせて以下のように読み替え。
wget ＜ダウンロードするファイルのURL＞ -O torch-＜バージョン＞-cp36-cp36m-linux_aarch64.whl 
1.4.0の例：wget https://nvidia.box.com/shared/static/ncgzus5o23uck9i5oth2n8n06k340l6k.whl -O torch-1.4.0-cp36-cp36m-linux_aarch64.whl
git clone --branch <バージョン> https://github.com/pytorch/vision torchvision 
例：1.4.0用のtorchvision=v0.5.0

#vscode ssh remote
インストールし直すとサーバの鍵が変わりアクセスできなくなる。
vscode with ssh "C:\Users\<ユーザー名>\.ssh\known_hosts"から一度鍵を削除