OmniAICreator/Qiita-1.07M huggingface dataset:
M5UnitV2メモ

個人的な設定とまとめ情報をメモしておきます。

![スクリーンショット 2021-05-29 23.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/fb55dae1-1c62-ef2a-fe00-4c165978492b.png)

# デバイス

## macOS対応

macOS 11.3.1 BigSurでは接続するだけで、ネットワークに「USB 10/100 LAN」が表示されました。Intel/M1でも同様にNICとして認識されました。

正常に認識すると、http://10.254.239.1/ でアクセスできます。Safariでうまく動作していないようなのでChromeを使います。

## デバイスとして認識されているのにアクセスできない（IP取得できない）場合

NICとしてデバイスとしては認識しているのに、M5StackからDHCPでアドレスが振られず未接続状態になっている場合はインターフェースの有効/無効（もしくはコメント欄でいただいたようにifconfigによるdown/up）で認識される可能性があります。

![スクリーンショット 2021-05-30 12.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/2441a7c2-8d6c-d572-2ee4-71c35c6e48a6.png)


それでもダメな場合には「待つ」のが正解のようです。

![スクリーンショット 2021-05-29 5.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/932fffea-6170-1008-2779-52ba090a8222.png)

上記では1時間16分かかっています。SDカードに不良セクタでもあったのでしょうか...。謎です。

# 設定

## ルート権限の取得

* 右上の歯車から「Switch to notebook mode」を選択します。
* Jupyter Notebookで以下を実行します。
 
```
!chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo
!chown root:root /usr/libexec/sudo/sudoers.so
!chown root:root /etc/sudoers
```
これでデフォルトユーザー「m5stack」でsudoが利用できるようになります。

## WiFi NICアドレスの固定

* WiFiに接続

```:/etc/wpa_supplicant.conf
...
network={
     ssid="MYACCESSPOINT"
     psk="MYSECRETPASSWORD"
}
```
※MACアドレスが再起動毎に代わる現象が出たのでIPアドレス固定が必要です。

* IPアドレスの固定

```:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.1.111
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
...
```

# 雑感

あくまで個人の意見＆調べた範囲です。

* UIではpayload/bin以下のプログラムを起動。Pipeで標準出力した物がResultに出る感じ
* プログラムはroot権限で実行しないと/dev/video0を取得できない
* OpenCVは/lib以下に4.4.0, /usr/lib以下に3.4.9がいる
* Jupyter Notebookモードにすると全て止まり待機状態になる。
* CPU(2Core)でぶん回す感じなので熱くなる。実行中は重い。

# リンク

## 公式

https://docs.m5stack.com/en/unit/unitv2?id=description

https://github.com/m5stack/UnitV2Framework

## その他情報

https://www.switch-science.com/catalog/7160/

https://qiita.com/airpocket/items/e6f736e539e18a314ae2
サイバー攻撃についてまとめてみた

#はじめに
最近勉強していてふと、「あれ、ただ機能をつくるだけじゃなくてサイバー攻撃についても知識も学ばないと企業に大損害与えるエンジニアになってしまうのでは？」と不安になりました。今回は、世の中のサイバー攻撃についてまとめていきます

#サイバー攻撃の目的
そもそも、サイバー攻撃ってなんのためにやるんでしょうか？暇つぶし？利益の強奪？
理由については、様々ありますが主なものとして金銭の要求が挙げられます。例えば、不正アクセスで個人情報やクレジットカードの番号を盗み取ったり、あるいは盗んだ機密情報で金銭の要求をしたりする事例があります。他にも、不満を持つ企業や組織が運営するシステムにダメージを与えて、損害を発生させることを目的としたサイバー攻撃もあるみたいです。本当に厄介ですが、エンジニアたるものこうした悪とも戦わないといけません！

#サイバー攻撃の種類

それでは、実際にどんな攻撃があって、現実にどんなことが起きたのかみていきましょう

##マルウェア
マルウェアは、コンピュータやネットワークに被害を与えることを目的に作られた不正なソフトウェアの**総称**です。有名なもので言えば、トロイの木馬やランサムウェアといったものでしょうか？？マルウェアは総称です。「病気の中の風邪」と同様の関係で「マルウェアの中のトロイの木馬」ですので注意です。
ちなみに、昨年大流行したエモテットもこのマルウェアに分類されます（注意喚起大変でした）

###トロイの木馬
アプリケーションやスクリーンセーバ、文書ファイルなど、害のなさそうなプログラムを装い、利用者にダウンロードさせることでコンピュータに侵入します。感染すると、不正な挙動をしまくるものです。

###ランサムウェア
「身代金要求型不正ウイルス」「身代金要求型不正プログラム」と呼ばれることもあります。コンピュータに不正に侵入して機能をロックする、データを暗号化するなどをした後、制限や暗号化を解除することと引き換えに身代金を要求します。

##SQLインジェクション
悪意のある第三者が、セキュリティの甘いWebサイトのフォームに、SQLの断片だと受け取られるコマンドを入力します。それにより不正な命令文を「インジェクション（注入）」するサイバー攻撃を、SQLインジェクションと呼びます。その結果、データベースの情報が漏えいしたり、改ざん・消去されたりする場合があります。

##パスワードリスト攻撃
ユーザID、パスワードを何らかの方法で入手し、そのユーザIDとパスワードを利用して別のサイトなどで不正ログインを行うものです。たしか半沢直樹のドラマのシーンでパスワードをとにかく無造作に当てに行くプログラムで機密情報を〜〜〜みたいなシーンがありましたが、それもこのパスワードリスト攻撃ですね。このへんは、パスワードを特定されにくいようにする努力が必要ですね

##標的型攻撃
主に機密情報を入手することを目的に、特定の企業を狙うサイバー攻撃のことを標的型攻撃と言います。

##セッションハイジャック
Webアプリケーションは、Webサイトにアクセスした利用者を識別するため、個別にセッションIDという情報を付与しています。攻撃者がこのセッションIDを何らかの方法で入手したり推測したりして、利用者に代わってWebサイトに不正にアクセスすることを「セッションハイジャック」といいます。セッションハイジャックを受けると、個人情報やクレジットカードの情報を盗まれる恐れがあります。

##バッファオーバーフロー攻撃
コンピュータのメモリの容量以上のデータを不正に送りつけ、不具合を起こさせる攻撃のことです。


##DoS
攻撃者が、WebサイトやWeb上のサービスに対し、メールを大量に送信するなどの方法で過大な負荷をかけ、システムの動作や機能を停止させる攻撃です。ちなみに、私はこのサイバー攻撃を知ったのは、上司に怒られた先輩が「DoS攻撃くらったわ〜〜〜」と言っていてことがきっかけでした笑

##DDoS攻撃
標的のサイトやサービスに負荷をかけてサービスを妨害する点ではDoS攻撃と同じですが、DoS攻撃がひとつの端末から行われるのに対し、DDoS攻撃は、まず多数のコンピュータや機器に侵入し、それらの機器から一斉に攻撃が行われます。攻撃者を特定しづらく、攻撃の規模がより大きくなります。


#最近のサイバー攻撃の動向と傾向

新型コロナウイルスの流行により、急速にテレワークの実施が進みました。しかし、セキュリティー対策が万全ではない企業が多いです。サイバー犯罪者はこうしたセキュリティーの甘さの隙間を狙っています。また、今年はオリンピックやコロナといった話題に関してのフィッシングサイトに誘導するものも見られているそうです。

#未経験が生意気にエンジニアとしてできることは何か考えてみた
エンジニアであれば、もちろんサービスの作り手としてセキュリティー対策には万全を期すべきです。しかし、実際はプログラム上だけで防ぐことは難しいです。だが、エンジニアだからこそ持つセキュリティーの知識を社内外問わず発信することで、少なくとも周囲の人の意識を変えることはできます。「起きてからでは遅いよ」、そんな一言でも周囲の人間の意識は大きく変わると思います。私がエンジニアになった暁には、「今できること」をやっていき、完璧でなくていいから、少しでも自身や周囲のセキュリティーへの意識を高めることが非常に重要になるのではと考えます。

#おわりに
いかがでしたでしょうか。
今回はサイバー攻撃についてまとめてみました！未経験ながら生意気に語ってしまいましたが、きっと間違ってはないはず！皆様も個人パスワード見直しや日頃の管理体制を見直してみてはいかがでしょうか。
Redhat on vagrant 

# redhat on vagrant

```bash
vagrant box add generic/rhel8 
```
## For vagrant

*Vagrantfile*

```text
  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end
  config.cache.scope = :box
  config.vm.box_check_update = false
  config.vm.synced_folder "./", "/vagrant"
  config.vm.box = "generic/rhel8"
  config.vm.network "private_network", ip: "192.168.33.21"
  config.vm.hostname = "redhat8.local"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2", "--ioapic", "on"]
  end
```

## For Redhat

```bash
subscription-manager --help
subscription-manager register
dnf module list perl
dnf module list php
vim /etc/yum.repos.d/redhat.repo 
subscription-manager repos --list
subscription-manager list --available # ここで表示される　poolid
subscription-manager attach --pool=<POOL_ID>
subscription-manager list --available
vim /etc/yum.repos.d/redhat.repo 
```
VRChatのワールド作成（Quest2対応、Unity2018.4.20、VRCSDK3）

# はじめに
Quest2対応のVRChatのワールドを作成していきたいと思います。

# 開発環境
- Unity Hub
- [Unity 2018.4.20f1](https://unity3d.com/jp/get-unity/download/archive)
- [VRCSDK3-WORLD-2021.05.21.12.13_Public.unitypackage](https://vrchat.com/home/download)

# 導入
1．VRCSDK3をインポートする
2．VRChat Examples->UdonExampleSceneを開く
3．VRChat SDK->Show Control Panel->BuilderからAndroidをターゲットにしてBuildする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2b74549d-f5c6-1baa-3b6a-9486be749d5c.png)

4．ワールドの名前を設定し、必要なところ✔してUpload
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/56f46ef8-0c33-6d95-ad94-12f586c50cff.png)

5．Quest2のVRChatからワールドには入れたらOK
https://vrchat.com/home/launch?worldId=wrld_86eda122-42ac-45e9-b3b8-c7e1a42d72f7

6．WindowsでビルドしたらPCから入れるよ

# 実行動画
https://youtu.be/0dH5arnTg8A
AWSソリューションアーキテクト―アソシエイト用語集⑤アプリケーション統合編

- [AWSソリューションアーキテクト―アソシエイト用語集まとめ - Qiita](https://qiita.com/tatsumicro/items/55c191eea8553a52463c)

## ❒ AWSのアプリケーション統合サービス
- [AWSのアプリケーション統合 - AWS](https://aws.amazon.com/jp/products/application-integration/)

|  カテゴリ  |  AWSのサービス  |
| ---- | :----: |
|  API管理  |  **API Gateway**など  |
|  イベントバス  |  **EventBridge**など  |
|  メッセージング  |  **SNS**、**SQS**、**MQ**など  |
|  コードなしでのAPI統合  |  **AppFlow**など  |
|  ワークフロー  |  **Step Functions**、**Managed Workflows for Apache Airflow (MWAA)**など  |

## ❒ API Gateway
###### スロットリング制限設定
> リクエストが多すぎてバックエンド処理しきれないことを防ぐ

###### キャッシュの有効か
> API呼び出しにキャッシュを使用できる

## ❒ SNS
###### SNSとは？
> SMSメッセージを送信する

###### SNS + CloudWatchで出来ること
> インスタンスの停止イベントをトリガーとしてEメールを送信する

## ❒ SQS
###### SQSとは？
> システム処理を非同期で分散できるキューイングシステム
> システムの水平スケーリングを実現できる

###### ユーザごとに要求返答の優先度を変えたい
> 優先付けをしてリクエストを処理する

###### 可視性タイムアウト
> 一定期間キューが処理されない場合、別のインスタンスがかわりに処理できるようになる
AWS S3 Glacier Deep Archiveで写真のバックアップ

メインマシンをM1 iMacにした。写真管理に使っていたAperatureがM1 iMacだと使えないので、この機会に写真管理とバックアップの方法を見直すことにした。

これまでのやり方とこれからを表にまとめてみた。図らずも10年ごとに見直しするサイクルになっていることが判明。次もまた10年後かな。

# これまで
メインマシンはMacBook Air。写真管理アプリはAperature。
オリジナルデータはWestern Digitalの外付けHDD(3TB)に保存。
ローカルのバックアップはNAS。IOデータのRockDiskNext。バックアップはAperatureの機能を使って実行。
クラウドのバックアップはGoogle Photo。
古いHDDにしかないデータ(2001-2011)は、AWSのGlacierにも保存。70GB。コストは毎月100円以下。

![スクリーンショット 2021-05-29 21.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/3e995eb1-c87a-aed7-7f4e-b88ff973fa03.png)

# これから
メインマシンはM1 iMac。写真管理アプリはApple純正 写真アプリ。
オリジナルデータはSAMSUNGの外付けSSD(1TB)に保存。
ローカルバックアップは外付けHDD(4TB)。バックアップはMacのタイムマシンの機能を使って実行予定。
クラウドのバックアップは引き続きGoogle Photo。6月から容量課金が始まるが、使い続ける予定。
古いHDDにしかないデータは、AWSのS3 Glacier Deep Archiveにも保存。すでにGlaicerに保存してあるデータもS3の方に移動する。旧Glacierに保存したデータはAWS CLIからしかアクセスできなくて不便なため。S3版はAWSコンソールから操作できる。

![スクリーンショット 2021-05-29 21.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/6c804679-d47f-f837-955f-071b3036397b.png)

## S3 Gracier Deep Archiveへのアップロード失敗
1999から2009までのファイルをまとめてAWSコンソールからアップロードを実行。一晩経って結果を見てみるといくつのファイルでエラーが出ている。
マルチパートアップロードに失敗したデータは、残り続けてその分も無駄に課金されるらしい。
下記のページを参考に調べて、ライフサイクルルールを設定してみた。
[https://dev.classmethod.jp/articles/sugano-045-s3-lifecycle-policy/](https://dev.classmethod.jp/articles/sugano-045-s3-lifecycle-policy/)

### 失敗したマルチパートアップロードの調査
下記のコマンドで調査。４件エラーしていることを確認。
この４件はAWSコンソールのS3バケット内のファイル一覧にも表示がないので整合している。

```
aws s3api list-multipart-uploads --bucket バケット名
```

### ライフサイクルルールの設定
AWSコンソールのバケット設定からライフサイクルイベントを追加設定。
アップロード開始から３日後に不完全なマルチパートアップロードデータを削除する。

### CLIで削除
ライフサイクルルールが適用される前に手動で削除してみた。

```
aws s3api abort-multipart-upload --bucket バケット名 --key ファイル名 --upload-id アップロードID
```

## S3 GlacierのVaultの削除
S3 Glacier Deep Archiveの方に全部保存できたので、以前にS3 Glacierの方に保存していたデータを削除する。

下記のAWSのドキュメントに従ってAWS CLIを使って、Vaultに含まれるアーカイブを削除し、その後でValutを削除する。
[https://docs.aws.amazon.com/ja_jp/amazonglacier/latest/dev/deleting-an-archive-using-cli.html](https://docs.aws.amazon.com/ja_jp/amazonglacier/latest/dev/deleting-an-archive-using-cli.html)
コールバック関数（クロージャ）を使用した値渡しのサンプルを作成してみた

クロージャー、コールバック関数について理解を深めるためにサンプルを作ってみました。
この書き方があっているのか分かりませんが、とりあえず動いたので。

![画面収録-2021-05-29-22.26.14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/ae3ad044-e501-ca54-6059-d1d079e78f0c.gif)


```ruby:FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {

    
    @IBOutlet weak var label: UILabel!{
        didSet{
            label.text = "0"
            
        }
    }
   
    
    @IBAction func nextButton(_ sender: UIButton) {
    
            let secondStoryboard = UIStoryboard(name: "Second", bundle: nil)
            let secondVC = secondStoryboard.instantiateInitialViewController() as!SecondViewController
        
            
        secondVC.completion = { CountModel in
            print("ーーーー渡されたよーーーーーーー")
            self.label.text = CountModel.count.description
    }
        
        let nav = self.navigationController!
        nav.pushViewController(secondVC, animated: true)

    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
  
 }

}
```

```ruby:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController{
   
    
   private var countmodel = CountModel.init(count: 0)
    var completion:((CountModel)->Void)?
    
    @IBOutlet weak var countLabel: UILabel!{
        didSet{
            countLabel.text = countmodel.count.description
        }
    }

    @IBAction func countButtun(_ sender: UIButton) {
        countmodel.count = countmodel.count + 1
        countLabel.text = countmodel.count.description
        print(countmodel)
    }
    
    
    @IBAction func addButton(_ sender: Any) {
        tap()
        self.navigationController?.popViewController(animated: true)
        
    }
    
    //クロージャー関数
    func tap(){
        print("tapしたよ")
        print(countmodel)
       completion?(countmodel)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
       
        }
  
      
    }
```

```ruby:CountModel.swift
import Foundation

struct CountModel {
    var count:Int
}
```
Divvyでオシャ作業をしよう

#まえおき
変なタイトルです。今回は初記事投稿ということで、テスト投稿のついでにいろいろ便利にしようと思います。冗長で至らないところがあると思います。すいません。
現在OJTでReactNativeをつかったアプリ開発をしているのですが、僕に色々教えてくださっているKさんという方とお話しするときに、「もっとEmacsうまく使えるんじゃない？？？」というアドバイスをいただいたので、やっちゃおうかと思った次第でございます。

##まえおき２
まず、アプリのビルドをして、いちいちブラウザのウィンドウにいったり、エディタのほうに戻ったりすることが面倒だったので、画面をうまく分割してくれるものを探していました。Kさんが、「EmacsバッファでChrome開けるんじゃなかったかなあ」といっていて、調べたのですが、よくわからなくなっていたところに、
https://www.youtube.com/watch?v=gDAbpz98ooU
という動画を見つけて、これっぽい感じでやりたいと思いました。

##本題
Divvyというソフトを使うことにしました。有料ですが、トライアルとかでつかえます。便利なので買っちゃおうかと思います。

![スクリーンショット 2021-05-29 22.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398389/1c184cac-5d6c-7690-c178-8f6a0249cf87.png)

こんな感じで作業できます。
グローバルでのショートカットもオプションでできます。

![スクリーンショット 2021-05-29 21.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398389/0eecaa62-56cf-f5fb-3b82-c86e4a1b1008.png)

ぴったりなサイズで分けるときに少し引っかかったことがあるのですが、Chromeはウィンドウ幅が500px以下にならないので、Divvy側でグリッドサイズを小さくしすぎると隣のウィンドウとかぶります。

##おわりに
結局Emacsのことじゃないじゃないか！となった方もいらっしゃるかもしれませんが、DivvyとEmacs組み合わせて使われがちなようので、一応タグをつけました。
MySQLを使ったターミナルでのデータベースの基本的な操作方法

### ターミナルからログインします
---
ホームディレクトリにて下記コマンドを実行します。（ユーザーは「ルート」でログインという意味になります。このユーザーのパスワードは空で設定されているため、パスワードは必要ありません。）

```
% mysql -u root
```

### データベースを作成します
---

CREATE文はデータベースやテーブルを作成するSQLです。下記コマンドを実行。

```
mysql> CREATE DATABASE sqltest;
```

作成した「sqltest」というデータベースが存在するか確認してみましょう。下記コマンドを実行。(テーブルが一覧表示されます。）

```
mysql> SHOW DATABASES;
```

### データベースを削除してみましょう
---
DROP文はデーターベースやテーブルを削除できるSQLの文です。下記コマンドを実行。

```
mysql> DROP DATABASE sqltest;
```

### SQLによるテーブルの操作方法
---
まずはデータベースを指定します。その場合はUSE文を使います。下記コマンドを実行。(その前に先ほど「sqltest」のデータベースを削除したので再度CREATE　DATABASE sqltest;でデータベースを作成しておきます。）

```
mysql> USE sqltest;
```

### テーブルとカラムを作成します
---

今回は"INT"型のカラム"id"と、"VARCHAR(255)"型のカラム"name"のある"goods"テーブルを作成します。下記コマンドを実行。
- INT型　数字が保存できる
- VARCHAR(M)　最大M文字の文字列が保存できる

```
mysql> CREATE TABLE goods (id INT, name VARCHAR(255));
```
### 作成したテーブルを表示
---
下記コマンドを実行。

```
mysql> SHOW TABLES;
```

### テーブルの構造を確認
---
FROM句は、対象となるテーブルを指定する際に使用するSQLの句です。下記コマンドを実行。

```
mysql> SHOW columns FROM goods;
```

### カラムを追加
---
ALTER文は、データベースやテーブルを編集できるSQLの文です。（カラムの追加や削除ができます。）下記コマンドを実行。

```
mysql> ALTER TABLE goods ADD (price int, zaiko int);
```

カラムが追加できたか確認してみましょう。下記コマンドを実行。

```
mysql> SHOW columns FROM goods;
```

### カラムを変更
---
zaikoカラムをstockカラムに変更します。下記コマンドを実行。

```
mysql> ALTER TABLE goods CHANGE zaiko stock int;
```
変更されているか、SHOW columns FROM goods;を実行して確認しましょう。

### カラムを削除
---
stockカラムを削除。下記コマンドを実行。

```
mysql> ALTER TABLE goods DROP stock;
```
SHOW columns FROM goods;を実行してカラムが削除できているか確認しましょう。
非同期通信　xhr.open



xhr.open（”第1引数”,`/host/users/`, true）
-
openとはXMLHHttpRequestで定義されているメソッドで、初期化してどのようなリクエストをするか指定するメソッドです。

|第１引数|HTTPメソッドの引数|GET|
|--|--|--|
|第２引数|パスの指定|/posts/users/|
|第３引数|非同期通信のon/off|true|


xhr.send();

「xhr.open()」で、実際に通信する方法（GET / POSTなど）やサーバーの場所（URLなど）を指定し、「xhr.send()」で通信を開始します
【NUnit】単体テスト用プロジェクトの作成方法

# 本記事の記載内容

* 「Visual Studio 2017/Visual Studio 2019」と「使用するフレームワーク(.NET Framework/.NETC ore)」の組合せごとに、単体テスト用プロジェクト(NUnitを適用)を作成する方法を記載する。

# 導入方法

下記組み合わせで手順違う様子。

| No |Visual Studioとフレームワークの組み合わせ  |
|:-|:-|
|1   |Visual Studio2017 + .NET Framework  |
|2   |Visual Studio2017 + NET Framework以外(※)|

※下記の組み合わせを想定する。

|No | 組み合わせ |
|:-|:-|
|1   |Visual Studio2017 + NET Core|
|2   |Visual Studio2019 + NET Framework   |
|3   |Visual Studio2019 + NET Core    |


## Visual Studio2017 + .NET Framework

### テストプロジェクトの作成する。
「クラスライブラリ」を選択する。

### 下記のパッケージをインストールする。
テストプロジェクトに下記を適用する。

![Nunit_Nuget.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/b78ccc4e-3fad-a3fe-76ea-e64b8061f754.png)

参考
[Nunit公式ドキュメント installation][1]
[1]:https://docs.nunit.org/articles/nunit/getting-started/installation.html


## Visual Studio2017 + .NET Framework以外

### NUnitテストテンプレートを使用する。
下記バージョンでは、テンプレートが使用できる。
[Microsoft公式ドキュメント　単体テストの概要][2]
>Visual Studio 2017 バージョン 14.8 以降、.NET 言語には NUnit と xUnit 用の組み込みのテンプレートが含まれています。

[2]:https://docs.microsoft.com/ja-jp/visualstudio/test/getting-started-with-unit-testing?view=vs-2019&tabs=mstest

#### Visual Studio 2017 + Core
Coreにしかテストテンプレートが対応してない様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/2f437c41-0801-91b0-3ef5-d78b1d48563c.png)


#### Visual Studio 2019 + .NET Framework or Core
Visual Studio 2019は.NET Frameworkでも、.NET Coreも選べる様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/f9dde279-4abc-b842-e1fd-a91cbe61fd51.png)

.NET Frameworkと.NET Coreが選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/38e802c6-1fdd-b8c7-5a30-842c5ce14c20.png)

# 動作確認

## 1.テストコードのサンプルを作成する。

下記に一例を示す。

* テスト対象クラス(ConfirmationSample)
* テストコード(ConfirmationSampleTest)

~~~C#:動作確認用のサンプル
using NUnit.Framework;
namespace TestProject1
{
    /// <summary>
    /// 確認用サンプル
    /// </summary>
    [TestFixture]
    class ConfirmationSampleTest
    {
        [TestCase(true, 1)]
        [TestCase(false, 0)]
        public void TestSample(bool expected, int input)
        {
            var  confirmationSample = new ConfirmationSample();
            Assert.AreEqual(expected, confirmationSample.Hoge(input));
        }
    }

    class ConfirmationSample
    {
        public bool Hoge(int a)
        {
            return  a > 0 ? true : false;
        }
    }
}
~~~

## 2.テストを実行する

①「テスト」タブからテストを実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/9760de94-7d75-cbf8-3c99-5e793aee834d.png)

②テストエクスプローラーで結果を確認する
緑のチェックが付けば成功。赤字の☓つけば失敗。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156594/30abd05c-ff1f-4d69-627f-9b0eadaf1bcf.png)


# 参考ドキュメント

* 公式ドキュメント 実装サンプル

NUnitの公式ドキュメントにがあります。ご参考まで。
[公式のコードサンプル][3]

[3]:https://docs.nunit.org/articles/nunit/getting-started/samples.html

* チートシート
ざっくりとテストコードの書き方を調べるときに役立ちます。
[Most Complete NUnit Unit Testing Framework Cheat Sheet(リンク)][4]
[4]:https://www.automatetheplanet.com/nunit-cheat-sheet/
vue3 + tsxをはじめる

##vue-cli3のインストール
```
$ RUN npm install -g @vue/cli@next
```

## プロジェクト作成
```
$ vue create プロジェクト名
```

→Manually select features
次
→◉ Choose Vue version
→◉ Babel
→◉ TypeScrip
→◉ Router
次
→❯ 3.x (Preview) 
→以降yですすめる


## App.vueを編集
```vuejs:App.vue
<script lang="tsx">
import { defineComponent } from "vue";
import MainMenu from "@/components/MainMenu.vue"; // @ is an alias to /src

export default defineComponent({
  setup() {
    return () => (
      <div>
        <router-view />
      </div>
    )
  }
});
```

## router/index.tsを編集
```typescript:router/index.ts
const routes: Array<RouteRecordRaw> = [
  { path: "/", redirect: "/home" },
  {
    path: "/home",
    name: "Home",
    component: Home,
  },
  {
    path: "/page1",
    name: "Page1",
    component: () => import(/* webpackChunkName: "about" */ "../views/Page1.vue"),
  },
];
```

## views/Home.vueを編集
```vuejs:views/Home.vue
<script lang="tsx">
import { defineComponent, ref } from "vue";

export default defineComponent({
  setup() {
    const message = ref("homeです");
    return () => (
      <div class="home">
        {message.value}
        <router-link to="page1">Page1</router-link>
      </div>
    );
  },
});
</script>
```


## views/Page1.vueを編集
```vuejs:views/Page1.vue
<script lang="tsx">
import { defineComponent, ref } from "vue";

export default defineComponent({
  setup() {
    const message = ref("page1です");
    return () => (
      <div class="home">
        {message.value}
        <router-link to="home">Home</router-link>
      </div>
    );
  },
});
</script>
```


index.htmlに以下を追加しておく

```css
<style>
* {
    margin: 0px;
    padding: 0px;
}
</style>
```
Railsテストコード

# テストコードのパターン

<!-- wp:paragraph -->
<p>・正常系</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ユーザーが開発者の意図する操作を行った時の挙動を確認するテストコードです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>・異常系</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ユーザーが開発者の意図しない操作を行った時の挙動を確認するテストコードです。</p>
<!-- /wp:paragraph -->

# テストコードの種類

<!-- wp:paragraph -->
<p>・単体テストコード</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>モデルやコントローラなどの機能ごとに問題がないか確かめるテストコード</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>・結合テストコード(統合テストコード)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ユーザーがブラウザで操作する一連の流れを再現して問題がないか確かめるテストコード</p>
<!-- /wp:paragraph -->

# RspecのGemを導入

<!-- wp:paragraph -->
<p>まずは、Gemfileを編集します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Gemfileのgroup :development, :testというグループの中に記述します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>gem 'rspec-rails'と記述します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Gemfileの編集が完了したので、次にbundle installを行います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ターミナルでbundle installを実行します。</p>
<!-- /wp:paragraph -->

# Rspecの設定

<!-- wp:paragraph -->
<p>ターミナルで、rails g rspec:installを実行します。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>これを行うことによって、Rspecを書くためのディレクトリやファイルなどの生成を行えます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>生成されるディレクトリとファイルは以下のものです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>.rspec</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>spec</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>spec/spec_helper.rb</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>spec/rails_helper.rb</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ディレクトリやファイルの生成が完了したら、.rspecに、--format documentationを追加しましょう。これを追加することによって、テストコードの結果をターミナル上で可視化することができます。</p>
<!-- /wp:paragraph -->
バッチファイルが突然消える場合

バッチで自動化したい時があるかと思いますが、クリックしても突然消える時があります。
これは、エラーが発生し処理が正しく完了しない場合に発生されます。

そんな時は、バッチファイルの最後にpauseを入れれば画面も消えることなくエラーメッセージが表示されます。
結合テスト　ベーシック認証を通す

参考：@taka_no_okapi
>https://qiita.com/takashimayuusuke7316/items/937dd4d52220bcbe3073

メソッド: Capybara.current_session

|Capybara - Poltergeistで動いているサーバのhostとポートを知る|
|--|
|サーバ：Capybara.current_session.server.host|
|ポート：Capybara.current_session.server.port|

>@ms2sato
>https://qiita.com/ms2sato/items/ca288acb070bae87c80f

```rb
def basic_pass(path)
  username = ENV["BASIC_AUTH_USER"]
  password = ENV["BASIC_AUTH_PASSWORD"]
  visit "http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}#{path}"
end

# 省略
RSpec.describe "ユーザー新規登録", type: :system do
  before do
    @user = FactoryBot.build(:user)
  end
  context 'ユーザー新規登録ができるとき' do
    it '正しい情報を入力すればユーザー新規登録ができてトップページへ移動する'do
    # トップページへ移動する
    basic_pass root_path
    visit root_path
# 省略
```
AWSソリューションアーキテクト―アソシエイト用語集④ネットワーキング編

- [AWSソリューションアーキテクト―アソシエイト用語集まとめ - Qiita](https://qiita.com/tatsumicro/items/55c191eea8553a52463c)

## ❒ AWSのネットワーキングとコンテンツ配信サービス
- [AWSのネットワーキングとコンテンツ配信 - AWS](https://aws.amazon.com/jp/products/networking/)

|  カテゴリ  |  AWSのサービス  |
| ---- | :----: |
|  ネットワークファウンデーション  |  **Amazon VPC**、**AWS Transit Gateway**など  |
|  アプリケーションネットワーキング  |  **ELB**、**API Gateway**、**App Mesh**など  |
|  エッジ・ネットワーキング  |  **CloudFront**、**Route 53**、**AWS Global Accelerator**など  |
|  ネットワークセキュリティ  |  **AWS WAF**、**AWS Shield**など  |
|  ハイブリッド接続  |  **AWS Direct Connect**、**VPN**など  |

## VPC
###### オーバレイマルチキャスト
> クライアントPC内のソフトウェアで、マルチキャストを実現する技術
> （VPCはマルチキャスト、ブロードキャストをサポートしていない。。。）

###### VPCエンドポイント
> VPC内からVPC外のAWSサービスに接続できる

###### VPCピアリング
> 異なるVPC間で通信できるようにする
> （異なるアカウントのVPC間でも通信可）

###### トラフィック制御の違い
> セキュリティグループ ・・・ インスタンス間のトラフィックを制御する
> ネットワークACL ・・・ サブネット内外のトラフィックを制御する

###### NAT
> プライベートサブネット内のDBからはNATを経由してインターネットへアクセスする
>> NATインスタンス ・・・ 手動のスケーリング
>> NATゲートウェイ ・・・ フルマネージドの自動スケーリング

## ❒ CloudFront
###### CloudFrontとは？
> グローバルな配信処理の高速化

###### 著名付きCookie機能 と 著名付きURL
> どちらも、コンテンツにアクセスできるユーザを制御できる
> `Cookie` ・・・ URLを変更したくない場合に使用
> `URL` ・・・ 個々のファイルにアクセス制御をする場合、Cookieが使えない場合に使用


## ❒ Route 53
###### ルーティングポリシー
|  ポリシー  |  特徴  |
| ---- | :----: |
|  シンプル  |  普通、ドメイン  |
|  フェイルオーバー  |  アクティブ（ホットスタンパイ） / パッシブ（コールドスタンバイ）  |
|  位置情報  |  言語選択  |
|  地理的接近性  |  最も近いリージョンへ  |
|  レイテンシー  |  最もレイテンシーが小さいサーバへ  |
|  複数値回答  |  ランダムに選んだ回答（最大8）  |
|  加重  |  比率を設定してルーティング  |

###### レコード
|  レコード  |  用途  |
| ---- | :----: |
|  ALIAS  |  AWSリソースを指定する  |
|  A  |  IPv4とドメインを対応付ける  |
|  NS  |  DNSサーバを指定する  |
|  CNAME  |  ドメイン名に別名を付ける  |

## ❒ AWS WAF
###### AWS WAFとは？
> コンテンツのアクセス制御

###### Route Origin Authorization
> 経路情報の正当性を確認する

## ❒ Direct Connect
###### Direct Connectとは？
> オンプレミスとVPCを接続する専用線

###### 大量データを移行したい場合の比較
> `VPN` ・・・インターネットを利用した接続であるため即時利用可能
> `Snowball` ・・・AWSから機器を借りるため準備に時間がかかる
> `Direct Connect` ・・・AWSへ申請し専用ネットワークを開通するため準備に時間がかかる
vue3 <taransition> フェードアウトはできるけどフェードインだけ動かない

https://jp.vuejs.org/v2/guide/transitions.html#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B8%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%B9


環境　vue3

上記の公式のデモがなぜかフェードインだけ動かなかった。
フェードアウトはできるけど、フェードインはできない状況で詰まりました。

```vuejs
<template>
		<div id="app">
			<div class="container">
				<transition>
					<span class="box" v-if="show">っっっf</span>
				</transition>
			</div>
			<button @click="show = !show">アニメーションスタート</button>
		</div>

	</div>
</template>

<script>
export default {
	data() {
		return { show: true };
	},
};
</script>
<style>

.v-leave-active,
.v-enter-active {
	transition: opacity 1s;
}
.v-enter-from,
.v-leave-to {
	opacity: 0;
}
</style>



```
`.v-enter,`を`.v-enter-from`に変更すれば無事フェードインできました。。
bitnami redmine4.1環境で、redmica1.2.2を動作させる。

■インストール( ..)φメモメモ
　bitnami redmine環境で、redmica1.2.2を動作させたので新たなメモを追加。
　※今回は差分のみ。

■ソースの入手。
　まずは、以下公式サイトよりソースを入手します。
　https://www.redmica.jp/
　《Copyright © 2021 ファーエンドテクノロジー株式会社》

■差分（Gemfileの編集）
・redmica1.2.2のGemfileファイルをベースに以下の3行を追加（編集）する。
　※追加は2行目（source 'https://rubygems.org'の後）に追加。
　gem 'thin', '1.7.2'
　gem 'ffi'
　gem 'eventmachine', github: 'eventmachine/eventmachine', branch: :master, ref: '10fb0c4'

※差分以外の手順は『前回の手順』を参照
・前回の手順
　https://qiita.com/katsunori-tanaka/items/75bdf4e69160879bfc2f
　※注意）DBに変更があるのでmigrateを必ず実行しておいて下さい。

■動作確認
　インストールに成功すると、以下の情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651745/4f108dac-4db6-fe51-44c3-8b0da7a7ff67.png)

おしまい。お疲れ様でした！
VSCodeでNimのFormatter(nimpretty）の自動実行を設定

# １．VSCodeで「Run On Save」をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/19256ec1-9704-7afd-d4a7-20cb46268ae3.png)

# ２．VSCodeの設定を開き、「Run On Save」の設定ファイルを開く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/1f4210a6-2bfc-4a9d-78ed-3c2bc7c7cfdc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/5964e52a-95d2-9ac1-a734-1118ceb5e26b.png)


# ３．settings.jsonに設定を記録

- nimのインストールフォルダに「nimpretty.exe」があることを確認。なければ、「koch tools」でインストール。
- これで、nimファイルを保存すると整形される。

```settings.json
  "editor.formatOnSave": true,
  "emeraldwalk.runonsave": {
    "commands": [
      {
        "match": "\\.nim$",
        "cmd": "nimpretty --indent:2 ${file} "
      }
    ]
  }
```
Rubyアルゴリズム（Add Binary）

## 問題

Given two binary strings a and b, return their sum as a binary string.

```
Example 1:

Input: a = "11", b = "1"
Output: "100"
```

```
Example 2:

Input: a = "1010", b = "1011"
Output: "10101"
```

Constraints:

1 <= a.length, b.length <= 10^4
a and b consist only of '0' or '1' characters.
Each string does not contain leading zeros except for the zero itself.


## 私の回答

```ruby
def add_binary(a, b)
    (a.to_i(2) + b.to_i(2)).to_s(2)
end
```

**無事Accepted!!**

どう考えたか書いていきます。
といっても今回そのままなのですが。。。

まず問題としては二進数の足し算ですが、普通にto_iして足し算してしまうと二進数と十進数が混ざった計算になってしまうので、

```ruby
a = "1010"
a.to_i(2) #=> 10
```

十進数に変換します。
十進数として計算した後、二進数に再度変換します。

```ruby
a.to_i(2) + b.to_i(2) #=> 21
21.to_s(2) #=> "10101"
```

 無事終了です。

本当は最初、integerにした後桁ごとに計算しなければいけないのかな？と思いましたが、もっとシンプルに書けました。
ActionController::UnknownFormat エラーの原因と対処法

#エラー内容
投稿機能を作り、試しに投稿を行ってみたところ下記のようなエラーが出てしまいました。
![スクリーンショット 2021-05-29 123114.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532817/1fda6274-2234-8840-c440-8accf78be8bb.jpeg)
#原因と対処法
原因は遷移先のViewファイルを作成していないor正しく作成できていないことが問題です。
俺はちゃんとViewファイル作ってるよ！って人は、Viewファイルを作成した場所、スペルなどをもう一度確認してみましょう。
ちなみに私の場合は「index.html.erb」ファイルのスペルが間違っていました…。
特にViewファイルのスペルミスについては、ファイル名は一目で気づきづらいと思いますので、対応するファイルをしっかりと確認してみましょう。

今回は以上になります。
AWSソリューションアーキテクト―アソシエイト用語集③コンピューティング編

- [AWSソリューションアーキテクト―アソシエイト用語集まとめ - Qiita](https://qiita.com/tatsumicro/items/55c191eea8553a52463c)

## ❒ AWSのコンピューティングサービス
- [AWSのコンピューティングサービス - AWS](https://aws.amazon.com/jp/products/compute/)

|  カテゴリ  |  AWSのサービス  |
| ---- | :----: |
|  インスタンス（仮想マシン）  |  **EC2**、**Amazon Lightsail**など  |
|  コンテナ  |  **ECS**、**ECR**、**EKS**、**Fargate**など  |
|  サーバーレス  |  **AWS Lambda**  |
|  エッジおよびハイブリッド  |  **AWS Snowファミリー**、**VMware Cloud on AWS**など  |


## ❒ EC2
|  インスタンスタイプ  |  特徴  |
| ---- | :----: |
|  オンデマンド  |  通常  |
|  スポット  |  一時的  |
|  リザーブド  |  長期  |

###### EC2 インスタンスタイプ
> A1 ・・・ 汎用インスタンス（Armベースのワークロードに最適）
> T3 ・・・ 汎用インスタンス（CPU使用率をいつでもバースト可能）
> M5 ・・・ 汎用インスタンス（バランス型）
> R5 ・・・ メモリ最適化インスタンス（メモリバウンドのワークロードに最適）
> H1 ・・・ ストレージ最適化インスタンス（HDD）
> D2 ・・・ ストレージ最適化インスタンス（HDD）
> T2 ・・・ 高性能なストレージ処理向け
> 3en ・・・ 安価なストレージ最適化インスタンス

###### IPアドレス
> `EC2のパブリックIP` ・・・ 起動するたびにリセット
> `Elastic IP` ・・・ IPアドレスが固定
> `サブネットのIP` ・・・ IPアドレスが固定

###### VM Import/Export
> 仮想マシンをAWSクラウドにインポートしたりする

###### EC2インスタンスをインターネットへアクセスするための手順
> ・ パブリックIP / Elastic IPの設定
> ・ セキュリティグループとネットワークACLの設定
> ・ サブネットルーティングの設定

## ❒ EC2 Autoscaling
###### スケーリング中に問題が発生した
> 起動プロセスを停止すると、設定上の問題を解析できる

###### 毎日17時にインスタンスを増やしたい
> スケジューリングに基づいたスケールアウト

###### EC2 Autoscaling + ELB
> 負荷に応じて動的にサーバ台数を増減させる

## ❒ ECS
###### EC2よりもコンテナ実行が簡単
> ECS Forgateの場合、タスク定義だけでコンテナを実行できる
> EC2の場合、EC2インスタンスを起動してからコンテナを実行する

## ❒ EKS (Elastic Kubernetes Service)
> Kubernetesを簡単に実行できる

## ❒ Lambda
###### Lambda + 画像識別APIで出来ること
> 外部の画像識別APIを呼び出して、結果をDynamoDBへ格納する

###### 15分以内
> Lambdaは15分以内の実行時間しか使用できない
Firebase emulators:exec でjestが実行できないときに

Firebase firestoreを使っていると，firestore rulesのテストを書きたくなるものですよね．

しかし，いざテストを書きはじめて，

```shell
firebase emulators:exec --only firestore "yarn test"
```

動作確認しようとすると，

```shell
TypeError: _gracefulFs(...).realpathSync.native is not a function
    at tryRealpath (/Users/tom/Work/src/github.com/nicecab/memcpy/firebase/rules/node_modules/jest-util/build/tryRealpath.js:26:39)
    at getCacheDirectory (/Users/tom/Work/src/github.com/nicecab/memcpy/firebase/rules/node_modules/jest-config/build/getCacheDirectory.js:89:33)
    at Object.<anonymous> (/Users/tom/Work/src/github.com/nicecab/memcpy/firebase/rules/node_modules/jest-config/build/Defaults.js:49:50)
    at Module._compile (internal/modules/cjs/loader.js:1136:30)
    at Module._compile (pkg/prelude/bootstrap.js:1394:32)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1156:10)
    at Module.load (internal/modules/cjs/loader.js:984:32)
    at Function.Module._load (internal/modules/cjs/loader.js:877:14)
    at Module.require (internal/modules/cjs/loader.js:1024:19)
    at Module.require (pkg/prelude/bootstrap.js:1338:31)
error Command failed with exit code 1.
```

が出てしまって，テストが実行できないという事態に遭遇することがあります．

[TypeError: _gracefulFs(...).realpathSync.native is not a function · Issue #10012 · facebook/jest](https://github.com/facebook/jest/issues/10012)

のようにみんな困っていて，その対策もなんというか，人それぞれ環境によって異なる印象を受けます．

そんな中，さらに，個別の環境でうまくいったという報告を一つ追加する程度の意味合いしかないのですが，私の環境では，firebase-toolsをauto install scriptでいれていました（だって，それが，[Firebase CLI reference](https://firebase.google.com/docs/cli#mac-linux-auto-script)の推奨のように見えるもの）．

ところが，上記エラーをいかんともしがたく，四苦八苦しながら，いろいろ情報を漁っていたところ，

https://github.com/firebase/firebase-tools/issues/1868#issuecomment-566686331 にて，

> Strangely this problem was fixed by removing the firebase-cli binary I installed with the auto-install script (curl -sL firebase.tools | bash) and reinstalling firebase-cli with Homebrew.

というコメントを発見．

もしやと思い，auto install scriptでインストールした`firebase`バイナリを

```shell
% rm -f /usr/local/bin/firebase 
```

で削除し，npm/yarn globalでいれてみたら，

```shell
% yarn global add firebase-tools
```

なんと上記エラーを解消することができました．

原因はよくわからないですが，auto install scriptでインストールされる`firebase`バイナリ内に，古いバージョンのnode runtimeが埋め込まれていたりするのですかね...

同様の事象に悩まれた方のために，記録として残しておきます．
root起動したNoxPlayer上のアプリにlldbを使ってattachする

# tl;dr
- ホストPCのポートにNoxPlayer上のAndroidのadb_serverがforwardされており、adb connectで接続できる。
- lldb/gdbするにはadbでport forwardする。
- Root化起動を有効にすれば手軽に任意のプロセスにattachできる
 
# モチベ
NoxPlayerはroot化起動が簡単に出来るのでReverseEngineeringの道具にできるのではないか。
rootでlldb-serverを起動したら任意のアプリ/プロセスをデバッグできるのでは→できた

# 手順

## Noxのセットアップ

1. 普通にイメージを作る<br>
今回はAndroid5(Lollipop)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132033/7eb7eb72-78b9-d127-b297-791d87ba0554.png)
1. システム設定→基本設定→Root化起動をONにしておく
1. 起動しておく

## adbのセットアップ

### NoxPlayerのadbポート番号を確認する。 
一台目が62001でそれ以降は62025から連番でふるらしい<br>
https://news.mynavi.jp/article/androidnow-148/

> adbコマンドで使うポート番号ですが、筆者の環境で調べたところ、インスタンス「Nox」は62001、インスタンス「Nox_1」が62025、「Nox_2」が62026となっていて、ポート番号62025から順に割り当てられるようです。

### adb connectする
`$ adb connect localhost:62025`

`$ adb devices`
で表示されていればOK

## lldbのセットアップ
 
### ホストPCにlldbを入れておく。
WSL(Bash for Windows)に入れるのが楽ちん。
https://apt.llvm.org/
```$ sudo apt-get install lldb-12```

### android用lldb-serverを入手する
https://developer.android.com/studio/?hl=ja#downloads
から `android-studio-ide-XXX.XXXXXXX-windows.zip` をDLする。
インストールする必要はない。

### lldb-serverを抽出する
zipから `android-studio/bin/lldb/android/armeabi/lldb-server` を展開して保存しておく
NoxPlayerのAndroid5は32bitARMなのでそれに合わせたlldb-serverを使う。

### ホストPCからlldb-serverをNoxPlayer向けにadb pushする
`$ adb push <保存したパス>\lldb-server /data/local/tmp`

パーミッションを実行可能にしておく。
`$ adb shell chmod 777 /data/local/tmp/lldb-server`

注意: NoxPlayerのadb shellは初めからrootなので注意すること

### NoxPlayer上でlldb-serverを起動して接続する
`adb shell "cd /data/local/tmp && ./lldb-server platform --listen *:5039"`
サーバー起動してポート5039で待ち受け
ターミナルは開いたままにしておく。

### ホストPCでポートフォワーディングの設定をしておく

`$ adb forward tcp:1234 tcp:1234`
でホストの5039をNoxPlayer上の5039にフォワードする

## lldbを使ってデバッグする
### ホストPCでlldbを起動してconnect

`$ lldb`
`(lldb) platform select remote-android`
`(lldb) platform connect connect://localhost:5039`

### lldbで遊ぶ

`(lldb) platform process list`
psとは異なり、アプリ名が解決されないのでみにくい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132033/3e894b1c-b113-ea58-489d-b3a3861adc8b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132033/e2e279f5-86c1-690a-0a91-e854371ae0a6.png)

`(lldb) attach 4795`
ブラウザ()にattachしてみる。
rootでなければdebuggableじゃないアプリはattachできないはず。

attachできればあとは何でもできる
`(lldb) thread list`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132033/77a82573-67f4-36cd-4c34-145d5a50d1f2.png)

# 参考URL
https://news.mynavi.jp/article/androidnow-148/

https://www.ninjastars-net.com/entry/2020/04/27/180000

https://blog.techlab-xe.net/native-debugging-android-2020late/

https://lldb.llvm.org/use/map.html
【Git・Docker】alias の登録方法

## はじめに
長いコマンドを打つのは面倒ですし、なによりタイポが多かったので ***alias*** に登録して自分でカスタムしたコマンドを打てるようにしました。

- ***alias*** 関連の記事はたくさんあるけど、同じようにやってもできなかったり記事によって変更しているファイルが違ったりして結局どうすればいいの？って悩んでいる方。

- **git** コマンドは `.gitconfig` を編集すれば ***alias*** を登録できますが
**「git と打つのも省略したい」** という方。

ぜひ試してみてください。

#### 環境

- macOS Catalina 10.15.7
- Windows10


## 目次

- はじめに
    - 環境
- 目次
- ~/.bash_profile
- Windows
- おわりに
- 参考文献

## ~/.bash_profile

早速 `alias` を登録してきます。

`vim` や `VSCode` などで `~/.bash_profile` を編集してください。

下記私の `~/.bash_profile` です。
記事を執筆時のものになりますので追加や変更していくと思いますが、書き方の参考にしていただけたらと思います。

```bash:~/.bash_profile
# git alias
alias g="git"
alias gaa='git add -A'
alias gcm="git commit -m"
alias gpoh='git push origin HEAD'
alias gst='git status'
alias gc='git checkout'
alias gcb='git checkout -b'
alias gb='git branch'
alias pull='git pull'
alias diff='git diff'
alias log='git log --oneline -n'

# (追記)20210717
# ここから
alias gcam='git commit --amend -m'
alias gss='git stash save'
alias gsp='git stash pop'
alias logp='git log -p'
alias diffc='git diff --cached'
alias gap='git add -p'
# ここまで

# docker alias
alias dk='docker'
alias dp='docker ps'
alias dcu='docker-compose up -d'
alias dcd='docker-compose down'
alias dcs='docker-compose stop'
alias dcr='docker-compose restart'
alias dcx='docker-compose exec'

# 【windows　の方は以下も追記が必要なようです】
test -r ~/.bashrc && . ~/.bashrc
```

`~/.bash_profile` に記述・保存後に今回の変更を反映させるために以下のコマンドを打ってください。

```terminal:ターミナル
source ~/.bash_profile
```

Macの方は設定は終わりです。

## Windows

Windows環境では `~/.bash_profile` に加え `~/.bashrc` にも同様の記述が必要でした。source コマンドで反映しても再起動すると消えてしまいます。

この問題に対してこちらの記事がわかりやすく説明をしてくださっているので合わせてご覧ください。

https://qiita.com/hiesiea/items/860c42a96b031f929b94

https://qiita.com/magicant/items/d3bb7ea1192e63fba850




そのため、上記の　`~/.bash_profile`　に書いた内容を `~/.bashrc` でも行い、
`~/.bash_profile` の最後にこちらを追記してください。


````bash:~/.bash_profile
test -r ~/.bashrc && . ~/.bashrc
```

最後に以下のコマンドを打ったら登録した alias を使用することができるようになります。

```terminal:ターミナル
source ~/.bashrc
```


## おわりに
タイポも減りますしコマンドを打つ時間が短くなるので ***alias*** 登録はとても便利です。
自分の覚えやすい形で登録してみてはいかがでしょうか。


## 参考文献

- [【mac】Gitのエイリアス（alias）設定](http://www.yabi-blog.xyz/mac_git_alias/)
- [【 source 】コマンド／【 . 】コマンド――シェルの設定を即座に反映させる](https://www.atmarkit.co.jp/ait/articles/1712/21/news015.html)
Univa Grid Engine 調査メモ

調査結果をまとめます

# Univa Grid Engine とは

- Univa社の主力製品
- ジョブスケジューラの１つ
- ライセンス料金が必要

# Univa Grid Engine の機械学習への応用可能性

#### できること

- GPU を指定してジョブを実行できる
- Dockerイメージを指定してジョブを実行できる


#### デメリット

- ドキュメントが少ない
- 導入事例が少ない

# 参考

- [HPC Technologies - Univa Grid Engine (UGE)](https://www.hpc-technologies.co.jp/uge)
- [Pacific Tech - Univa Grid Engineとは](https://www.pacificteck.com/ja/products/job-management/)
データベース ダイアグラムのバックアップ

SQL データベースに作成できる、データベース ダイアグラムのバックアップ方法について聞かれたため、備忘として記事にします。

# データベース ダイアグラムとは

SSMSのオブジェクト エクスプローラーを使用して作成できる、データベースの構造をグラフィカル表示するツールです

<参考URL>
[新しいデータベース ダイアグラムの作成 (Visual Database Tools)](https://docs.microsoft.com/ja-jp/sql/ssms/visual-db-tools/create-a-new-database-diagram-visual-database-tools?view=sql-server-ver15)

> オブジェクト エクスプローラーを使用すると、新しいデータベース ダイアグラムを作成できます。 データベース ダイアグラムは、データベースの構造をグラフィカル表示するツールです。 データベース ダイアグラムを使用すると、テーブル、列、リレーションシップ、キーを作成および変更できます。 また、インデックスや制約を変更することもできます。

# 検証作業
## 検証目的
SSMSを使用して作成したデータベースダイアグラムが、データベースバックアップにて保存されるのか、されないのかを確認します。

## 検証日
2021/05/29

## 検証環境
Azure SQL Database

## 検証手順
1. 新しいデータベース ダイアグラムの作成
    参考手順
    - [新しいデータベース ダイアグラムの作成 - Visual Database Tools](https://docs.microsoft.com/ja-jp/sql/ssms/visual-db-tools/create-a-new-database-diagram-visual-database-tools?view=sql-server-ver15)
    - [データベース ダイアグラムの保存 - Visual Database Tools](https://docs.microsoft.com/ja-jp/sql/ssms/visual-db-tools/save-database-diagrams-visual-database-tools?view=sql-server-ver15)

2. データベースのコピー（バックアップ）
    参考手順
    [データベースをコピーする - Azure SQL Database](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/database-copy?tabs=azure-powershell)

## 検証ログ
1. 新しいデータベース ダイアグラムの作成
検証用のデータベースにはデータベース ダイアグラムが存在しないため、新規に作成する。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/36896351-4ed1-5242-62a4-8acf0e4e6f81.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/65b31fd2-fdec-fd20-40ba-5133f1af09da.png)

2. データベース ダイアグラムを保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/8deff28d-8d14-88d7-21a6-d9d2ee431a32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/d5102c30-cc55-a90b-9509-59afc44dee16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/e5b8e146-e809-22d1-fee2-63c927191aa6.png)




3. データベースのコピー（バックアップ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/5cf1b450-f670-c973-0f74-665c2d5365f2.png)


コピー後のデータベースの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617232/b4db69eb-293a-b2c0-3536-e66a8e5e867f.png)

## 検証結果
通常のデータベースコピー（バックアップ）でデータベース ダイアグラムのデータも移行できることを確認した。

# 所感
データベースダイアグラムはSSMSのオブジェクト エクスプローラーを使用して作成されるものであり、SSMS側でデータを持っているものと推測していた。
しかしバックアップ後のデータベースでも保持されることから、データベース側で情報を保持していると推測される。

- 念のため異なる環境からSSMSで接続し確認したが、データベース ダイアグラムが存在することを確認した

# 今後の課題・確認事項

- ドキュメントを見る限り、データベースダイアグラムはSSMSからしか編集できないようだが、その他の編集方法が無いか確認しておきたい
- SSMSからしか編集できない場合、データベース内でデータベースダイアグラムがどのような形でデータとして保存されているかを確認しておきたい

検証内容に関して誤りや補足事項などございましたら、お気軽にコメントください。
WOL & MicrosoftRemoteDesktopを1クリックで接続（Mac）

# Macから1クリックで、スリープ状態のWindowsを起動してリモート接続

1. WOLのスクリプト実行
1. MicrosoftRemoteDesktopアプリを選択
1. マシンを選んで接続

## 追記 23/11/25
~~Windows11にしたせいか、
WOLなしで、MicrosoftRemoteDesktopを使って呼び出した時
勝手にスリープ解除されるようになったので、必要なくなりました。~~
（Windows11を入れ直したら、スリープ解除が自動で行われる事を確認できなかったので、別の要因と思われます。25/2/15）

---

### 慣れてくると面倒
他のアプリケーションなら自由が利くけれども、オプションみたいなものが見当たらない。ショートカットを作ってもパスワードを毎回入力しなければならない。


## Automatorで解決

事前準備

```
brew install wakeonlan
```

### Automator
ファイル＞新規＞アプリケーションを選択

AppleScriptを実行

```
on run {input, parameters}


	do shell script "/usr/local/bin/wakeonlan <Macアドレス>"
	delay 1
	tell application "Microsoft Remote Desktop"
		activate
		delay 0.5
		tell application "System Events"
			keystroke "k" using {command down}
			delay 0.5
			key code 36
		end tell
	end tell

	return input
end run
```

アプリケーションとして保存します。
delayは調整して下さい。
「セキュリティとプライバシー」で、アクセシビリティの権限を与える必要があります。

ここで"Command+K"を入力しているのは
PC Quick Connectを実行するためです。
![スクリーンショット 2021-05-29 18.41.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128851/d4573e7f-e4a7-d5f0-7202-521643962b46.png)

なので、アカウント等の接続設定はクリックして事前に行っておいて下さい。
Dockに追加しておくと、ポチって少し待つだけで接続できます。
この例ではPCはローカルネットワークに存在しています。
テスト35

```vb


'Excel

Sub Ac_Inport()

'----------------------------------------------------
'参照設定
'Microsoft ActiveX Data Objects x.x Library

'Excelにデータと貼付用のシートを準備しておく
'事前にAccessにテーブルを作っておく
'----------------------------------------------------
Dim ac As Variant                 'Accessアプリケーション
Dim cn As New ADODB.Connection    '接続オブジェクト
Dim rs As New ADODB.Recordset     'レコードセット
Dim cs As String                  '接続文
Dim Ac_FileName As String         'Accessファイルパス
Dim Ex_path As String             'Excelファイルパス

'Accessファイル名
Ac_FileName = ThisWorkbook.Path & "\" & "テスト用テーブル.accdb"

'接続文
cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Ac_FileName & ";"

'Accessに接続
cn.Open cs
 
Dim Dlete_SQL As String
'削除用SQL
Dlete_SQL = "DELETE * FROM テスト用テーブル"

'一度テーブルのデータを全て削除する(テーブルの構造を残したまま削除する)
cn.Execute Dlete_SQL

'Excelファイルのパス
Ex_path = "C:\Users\User\Desktop\VBA練習\VBA練習3.xlsm"

'Accessファイルオブジェクトを格納
Set ac = GetObject(Ac_FileName)

'Accessファイルを表示
ac.Visible = True

'VBA練習3.xlsmの[テスト用テーブル]シートのデータをAccessの[テスト用テーブル]テーブルにインポートする
ac.DoCmd.TransferSpreadsheet _
    acImport, , "テスト用テーブル", Ex_path, True, "テスト用テーブル!"

'AccessのAc_testプロシージャを実行、戻り値(レコードセット)を取得
Set rs = ac.Run("Ac_test")


Dim i As Long       'カウント用
Dim j As Long      'カウント用

i = 2
j = 1

With ThisWorkbook.Sheets("貼付用")

    'フィルターが設定されていたら解除
    If .AutoFilterMode = True Then .Range("A1").AutoFilter
    
    '一旦全てのセルの内容を削除
    .Cells.ClearContents
    
    .Range("A1:D1").Value = Array("No", "コード", "合計", "個数")
    'SQLを使ってグループ化、集計したレコードをセットをExcelに出力
    Do Until rs.EOF
    
        .Cells(i, 1).Value = j                          'No
        .Cells(i, 2).Value = CStr(rs.Fields(1))         'コード
        .Cells(i, 3).Value = CLng(rs.Fields(2))         '金額合計
        .Cells(i, 4).Value = CLng(rs.Fields(3))         'グループ化したコードの個数

        rs.MoveNext
        i = i + 1
        j = j + 1
        
    Loop
 
End With


rs.Close
Set rs = Nothing

cn.Close
Set cn = Nothing

ac.Quit
Set ac = Nothing
  
End Sub

'======================================================


'Access

Public Function Ac_test() As Variant

'参照設定
'Microsoft ActiveX Data Objects x.x Library

Dim str_SQL As String               'SQL格納用
Dim rs As New ADODB.Recordset       'レコードセット

'SQL文作成
'str_SQL = "SELECT No, コード, SUM(金額) AS 合計 FROM テスト用テーブル GROUP BY コード"
str_SQL = "SELECT No, コード, SUM(金額) AS 合計 , Count(コード) AS 個数 " & _
                 "FROM テスト用テーブル " & _
                 "GROUP BY コード"
                 
'SQLを実行(グループ化、合計、カウント)
rs.Open str_SQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText

Set Ac_test = rs
Exit Function

End Function
JavaScriptで数字に日本語の桁（万・億・兆）を付ける

数字に日本語の桁（万・億・兆）を付けられるJavaScriptのライブラリを探していたのですが、見つからなかったので関数を作りました。

例えば、`1002000400000`を`1兆20億40万`に変換する感じです。

実際に作った関数は以下になります。

```js
const toJaNum = (num) => {
  if (typeof num === "number") {
    num = num.toString();
  }

  let prefix = "";

  if (num[0] === "-") {
    num = num.slice(1);
    prefix = "-";
  }

  return (
    prefix +
    num
      .slice(0, -12)
      .replace(/^0+/, "")
      .replace(/([0-9]+)/g, "$1兆") +
    num
      .slice(-12, -8)
      .replace(/^0+/, "")
      .replace(/([0-9]+)/g, "$1億") +
    num
      .slice(-8, -4)
      .replace(/^0+/, "")
      .replace(/([0-9]+)/g, "$1万") +
    num.substring(num.length - 4).replace(/^0+/, "")
  );
};
```

## 最後に
もっといい書き方や、同じことができるJSのライブラリをご存知であればコメントいただけると嬉しいです。
C言語の基本的なデータ型と入力範囲

コメントでご指摘を頂いたので、追記して修正しました。
どうもありがとうございます！

---

- データ型と入力範囲を調べてまとめました。
- 全ての型が書いてあるわけではありません。


## そもそもデータ型とは

- 格納されているデータの種類を規定するルールです。
- 言語毎に定められているものの、整数や小数など共通するものも多いです。
- データ型ごとに扱えるデータの種類や範囲は異なります。

~~実体はメモリ領域の確保の仕方です。~~
コメントでご指摘頂きましたが、データ型の実体は、言語レベルでどう解釈するか、ということです。
充てられる容量に限りがあるため、範囲に制限があります。  
（8脚の椅子に座れるのは8人まで）


## C言語におけるデータ型


### 整数

| 型名 | 格納出来るデータ | 範囲 |
|:--|:--|:--|
| int | 4バイト（または2バイト）の整数 | -2,147,483,648<br>～ 2,147,483,647<br>（-2の31乗 ～ 2の31乗-1） |
| short | 2バイトの整数 | -32,768 ～ 32,767<br>（-2の15乗 ～ 2の15乗-1） |
| long | 8バイト（または4バイト）の整数 | -9,223,372,036,854,775,808<br>～ 9,223,372,036,854,775,807<br>（-2の63乗 ～ 2の63乗-1） |
| char | 1バイトの整数 | -128 ～ 127 または 0 ～ 255<br>（-2の7乗 ～ 2の7乗-1） |

- intは概ね4バイト。longは概ね8バイトです。
- 符号付整数が格納されています。正負（符号）の情報を持っている整数のことです。（1や100、-1や-100）
- 各型ともに: 1ビットの符号部 + 7・17・31・63ビットの~~仮数部~~絶対値または1の補数表現による負数の絶対値もしくは2の補数表現による負数の絶対値
- 符号部と仮数部を合わせて"データ"となります。この場合は整数です。
- ~~なぜ負数の方が値が1多いかというと、正数には0が含まれているため。~~<br>C言語には負数の表現の仕方が3種類あり、この場合はそのうちの「2の補数」によるものにしか当てはまりません。
  - char：0～127、-1～-128 または 0～255……共に128の値、合計して256。これは8桁の2進数（＝2の8乗）、即ち1バイト（=8ビット））で表現出来る値と一致します。<br>`char`型が符号付である保証はありません。コンパイラによっては符号なし整数型（0～255）ともなります。
  - 7乗、15乗、31乗と、8の倍数から-1しているのは、符号付き正数型の場合、最上位1ビットは符号を表現するため、絶対値または補数表現による負数の絶対値の部分は8の倍数-1ビット分になる。

符号付の整数型の最上位1ビットに続く部分のことを仮数部とは呼びません。
仮数部とは一般に浮動小数点を構成する要素です。


### 小数

| 型名 | 格納出来るデータ | 範囲 |
|:--|:--|:--|
| float | 4バイトの小数 | 1.175494e-38<br>～ 3.402823e+38<br>（7桁くらいの小数まで） |
| double | 8バイトの小数 | 2.225074e-308<br>～ 1.797693e+308<br>（16桁くらいの小数まで） |

- floatは「単精度浮動小数点」、doubleは「倍精度浮動小数点」
- 基本的にdoubleを使用する。
- 正数と同様に1ビットの符号部と仮数部、更に指数部を持っています。
- float:   1ビットの符号部 +  8ビットの指数部 + 23ビットの仮数部
- double : 1ビットの符号部 + 11ビットの指数部 + 52ビットの仮数部
- 範囲に関しては**大体はいける**感じだと思います。

これは個人的に躓いた点ですが、<br>
「23ビット分の仮数部で、先頭の1が省略されているのなら、実質24ビット」<br>
「じゃあ、2の24乗が 16,777,216 なのだから、8桁扱えるのでは？」
と、思ったのですが、10桁の2進数で2,000が表現出来ないように、<br>
24桁の2進数にも16,777,217以降の表現が出来ません。<br>
故に、20,000,000も表現出来ないので、7桁までしか表現出来ません。


### 真偽

| 型名 | 格納出来るデータ | 範囲 |
|:--|:--|:--|
| bool | 論理値 | true false |


### 文字

| 型名 | 格納出来るデータ | 範囲 |
|:--|:--|:--|
| char | 半角英数字1文字 | ABC...Z abc...z **1文字** |

- char型は-128～127または0～255の整数、半角英数1文字を格納出来ます。


---
## おわりに

浮動小数点、中でも有効桁数の部分でかなり躓いてしまったので、記しておきました。
冷静に考えたら「そりゃそうだ」なんですけど……恥ずかしいですね。あはは。

---
## 参考にしたページ

いつもありがとうございます。


データ型の範囲 | Microsoft Docs<br>
https://docs.microsoft.com/ja-jp/cpp/cpp/data-type-ranges?view=msvc-160

Kajiura Lab. - データ型<br>
http://www.kusa.ac.jp/~kajiura/c/data/newpage1.htm


ITの119番(ict119.com) - float型についてわかったことをまとめる<br>
https://ict119.com/float/

Wikipedia - 符号付数値表現<br>
https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE

Wikipedia - 半精度浮動小数点数<br>
https://ja.wikipedia.org/wiki/%E5%8D%8A%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
summernote-railsのformもfocus設定したい！

## 結論
```css:css
.note-editor.note-frame .note-editing-area .note-editable:focus {
  color: #495057;
  background-color: #fff;
  border: 4px solid #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.4);
}

.note-editable:focus {
  border: 1px solid #ced4da;
  transition: border-color 0.15s;
}
```

ちょっと違うけどフォーカスっぽいものが出来ました～

画像のサイズ変更は今調べ中。。。