OmniAICreator/Qiita-1.07M huggingface dataset:
Jetson Nanoのセットアップ (JetPack 4.5対応)

JetPack SDK の新しいバージョンが公開されたタイミングで手元の Jetson Nano の再セットアップをやったので、手順のメモ。

* SSH or RDP を使ってリモートで使う
* Python で機械学習をいろいろやってみる

というあたりが目指す最終形。
Jetson Nano 初期モデルでしか試していませんが、Jetson Nano 2GB でもほぼ同じ手順で行けるはず。

# 初期設定

起動するところまでは [公式ドキュメント](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit "Getting Started with Jetson Nano Developer Kit") 通りにセットアップを進めます。特に引っかかることはないと思いますが、言語設定は English にしておけば余計な気を使わなくて済みます。
あと、公式ドキュメントには [ヘッドレスセットアップの方法](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#setup-headless "Initial Setup Headless Mode") についても記載されていますが、うちの macOS Big Sur ではシリアルデバイスが見つからず、ヘッドレスセットアップは試せていません。Big Sur以降はセキュリティの何とかで [USBシリアルが使えないらしい](https://infornography.blue/mac/macos-big-sur-and-kext/ "あまり知られていないmacOS Big Sur以降で利用不可になるkext | INFORNOGRAPHY") です。

# 必要なソフトのインストール

まずはソフトウェアのアップデート。

```bash
sudo apt update
sudo apt upgrade
```

SSH と avahi-daemon

```bash
sudo apt install ssh avahi-daemon
sudo systemctl restart ssh
sudo systemctl restart avahi-daemon
```

ここまでやれば、Jetson Nano のキーボードその他は外しても大丈夫です。
avahi-daemon があれば、初期設定中に設定したマシン名でログインできます (例えば、`ssh 192.168.xxx.xxx` ではなくて、`ssh jetson` みたいな感じ)。

# リモートでの作業

ここから先は、母艦となるPC上での作業。
まずはSSH公開鍵のコピー

```bash
ssh-copy-id -i .ssh/id_rsa.pub <machine-name>
```

ここで ssh でログイン。
ディスプレイマネージャの変更 (以下の手順は、"[Save 1GB of Memory! Use LXDE on your Jetson - JetsonHacks](https://www.jetsonhacks.com/2020/11/07/save-1gb-of-memory-use-lxde-on-your-jetson/)" の内容そのままです)。

```bash
sudo dpkg-reconfigure lightdm
```

ディスプレイマネージャの選択画面が出るので、`lightdm` を選択。
(Jetson Nano 2GB だとデフォルトが lightdm だそうなので、ここのステップは無視してください)

```bash
sudo apt install xrdp
echo lxsession > ~/.xsession
sudo systemctl restart xrdp
```

これでリモートデスクトップが使えます。

# Python関係

pipでのモジュールインストールだとバイナリファイル周りの依存関係がいろいろ面倒くさいので、aptでインストール

```bash
sudo apt install python3-pip python3-numpy python3-pandas python3-matplotlib python3-sklearn python3-ipykernel
```

Tensorflow のインストールは基本的に [公式ドキュメント](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html "Installing TensorFlow For Jetson Platform :: NVIDIA Deep Learning Frameworks Documentation") の手順を踏めばいいのですが、上の流れでPythonモジュールはいろいろインストールしているので、途中段階をすっ飛ばしていきなり

```bash
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow
```

でも行けるかもしれません。

# その後

あとはこの辺りの情報をいろいろ

* [Jetson Community Projects | NVIDIA Developer](https://developer.nvidia.com/embedded/community/jetson-projects)
* [Tensorflow　公式サイト](https://www.tensorflow.org/)
react 横スライドメモ

```react
    const records_lists = records.length ?  
        records.map((tile,index) =>
          <GridListTile key={tile.if} className="border"  style={{ borderRadius: 10, backgroundColor: 'white', height: '89%', margin: '2%' , paddingTop: 7, paddingLeft: 10}}>
            <Grid container spacing={2} style={{height: '80%'}}>
                <Grid item xs={3}>
                  <AccountCircleOutlinedIcon  style={{fontSize: '3.2em'}}/>
                </Grid>
                <Grid item xs={9}>
                <div style={{fontSize: '1.0em', paddingTop: 7, fontWeight: 700, color: '#444444'}}>
                    { tile.appointment_date[0] + "/" + tile.appointment_date[1] + "/" +  tile.appointment_date[2]  }&nbsp;&nbsp;
                    { tile.appointment_start[0] + ":" +  tile.appointment_start[1]} 〜 { tile.appointment_finish[0] + ":" +  tile.appointment_finish[1]}
                </div>
                <div>
                担当: ここに担当者を
                </div>
                { session_menu_box(tile.session_menus) }
                </Grid>
            </Grid>
            <Grid item xs={12} style={{textAlign: 'center'}} className="samplebtn">
              <Button style={{backgroundColor: '#666666'}} variant="contained" className="insideBtn" style={{width: '60%'}}>詳細をみる</Button>
            </Grid>
          </GridListTile>   
    )
    : 
        <></>
       <div className="customer_my_page">
          <div style={{textAlign: 'center',margin: '0 auto'}}>セッション記録</div>
          <div className={listClasses.root}>
              <GridList className={listClasses.gridList} cols={1.4}>
              { records_lists }
              </GridList>
          </div>

          <div className="session_log_all">
            <div className="session_log_all_text">
               一&nbsp;覧
            </div>
          </div>
        </div>
```
【Vue.js】v-forで回ってきたオブジェクトをcomputedにデータとして保持する

#はじめに
このようなデータがv-forで使用され、中身のオブジェクトをデータとして保持したい時がある。
その時の例を備忘録として残す。

```vue
data () {
    return {
      members: [
        {
          id: 1,
          name: 'sato'
        },
        {
          id: 2,
          name: 'tanaka'
        },
        {
          id: 3,
          name: 'kobayashi'
        }
      ],
    }   
  }
```

##選択要素のidを取得
1. レンダリングされたnameの元のオブジェクトからidを取得するイベントを設定する。
2. 取得したidをもとに__dataに保持__

```
data() {
  return {
    selectedMemberId: undefined
  }
},
methods: {
 setId: function () {
          this.selectedMemberId = member.id //membersのオブジェクト
        }
}
```


##取得したidを元にオブジェクトをデータとして保持
__lodash__を使って配列操作
1. vueインスタンスを__変数に代入__
2. 取得したidと一番最初に一致するidをもつ__オブジェクトを返す__

```
computed: {
  currentMember: function () {
      const self = this
      return _.find(self.members, function (member) {
        return thumb.id === self.selectedMemberId
      })
    },
```

###computedの中身
* スコープがcurrentMemberになってしまうためvueインスタンスを変数に代入
* _.find(lodash.find)は条件に一致する一番最初の要素を取得
AWSの為のクラウドとネットワーク

## クラウドとは
クラウドとは、いつでもどこでもインターネット回線を介してアクセスできる環境のことを指します。代表格としましては、Microsoft社のOffice 365や、ファイルのストレージサービス、音楽配信のサービス、画像保存サービスなどが挙げられます。これらのサービスを、スマホやパソコンからインターネット越しに使います。従来であれば、自分の端末にインストールしたソフトウェアや、保存したデータしか使用できませんでしたが、クラウド環境であれば、エンターネット常に置かれたソフトウェアや画像・音楽などのリソースを使えたり、ローカル環境に保存するようにクラウド上に保存したりできるわけです。
クラウド環境は、自分で作ることもできれば、借りることもできます。また、事業者が提供しているサービスを利用する方法もあります。

### パブリッククラウドとプライベートクラウド
クラウドには、パブリッククラウドとプライベートクラウドがあります。パブリッククラウドとは、AWSのようなレンタルするクラウドです。一方、プライベートクラウドは自社で構築するクラウドです。

## クラウドコンピューティング
クラウドの中でも、サーバーやネットワークなどのインフラ一式を貸してくれるサービスが、AWS。ほかにも調べたら色々あります。このように、クラウド上に用意されたインフラを利用するサービスや、利用することをクラウドコンピューティングといいます。
『クラウド』というと、このクラウドコンピューティングを一般的に指します。
(クラウドコンピューティングは、AWSのほかにGoogle Cloud PlatformやMicrosoft Azureなどがあります)

## オンプレミス
オンプレミスとは、自社でサーバーなどを用意することをいいます。データセンターにサーバーを置いていても、それはオンプレミスです(所有権が自社にあるから)。レンタルサーバーとの違いがわかりづらいですが、サーバーのみをかりているものは、レンタルサーバーと呼ぶことが多く、ネットワークや場所などを借りている場合は、オンプレミスと呼ぶ傾向にあるようです。
オンプレミスのメリットは、自社で自由に設計・運用できることです。ただしその分だけ、頻繁なサーバー構成の変更に追われたり、スキルのある技術者も必要とします。
逆に対義語は、オフプレミスと言われたりします。自社で保有・運営するのではなく、レンタルしたり、公衆の場に用意されたりしたものを使用する形態です。レンタルのメリットは、自社で管理する必要がないこと。基本的には提供する側がすべてのメンテナンスを行うので、技術者を用意する必要もなければ手間もかかりません。デメリットは、提供する側のルールに縛られることです。OSのアップデートや入れられるソフトウェア、構成に制限があることが多く、自由度は値段と比例します。
Django管理画面のカスタマイズまとめ

#はじめに
Djangoの管理画面は手軽に使える点が魅力的だがカスタマイズ関連での困りごとが多い
カスタマイズして調べたことを忘れないうちにまとめておく

#モデルごとの管理画面のカスタマイズ
##基本的な使い方
モデルごとの画面や機能をカスタマイズしたいときは独自のModelAdmin派生クラスを用意して
AdminSiteのregister()の第二引数として渡す

```python:アプリ名/admin.py
from django.contrib import admin
from .models import Book
#Bookの場所には適宜クラス名を入れる

class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
#クラス変数やメソッドをオーバーライドする

admin.site.register(Book, BookAdmin)
```

ModelAdmin派生クラス内での記述により、表示する項目を変えたり
フィルターをつけたり検索機能をつけたりできる
出来ることについては以下参照
[Django 管理画面逆引きメモ](https://qiita.com/zenwerk/items/044c149d93db097cdaf8)
##管理画面でのアクセス制御
スーパーユーザーのみの閲覧にしたいモデルがあるときは

```python:admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
    
    def has_view_permission(self,request,obj=None):
        return request.user.is_superuser
```
また、閲覧は出来るが追加や変更、削除の権限をOFFにも出来る
引用元：[DjangoでRead OnlyなModelAdmin](https://www.memory-lovers.blog/entry/2021/01/28/012816)

```python:admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
    
    def __init__(self, *args, **kwargs):
        super(ReadOnlyAdmin, self).__init__(*args, **kwargs)
        # すべてのフィールドをreadonlyに設定
        self.readonly_fields = [field.name for field in self.model._meta.get_fields()]

    def has_add_permission(self, request):
        # 追加の権限OFF
        return False

    def has_change_permission(self, request, obj=None):
        # 変更の権限OFF
        return False

    def has_delete_permission(self, request, obj=None):
        # 削除の権限OFF
        return False
```

#adminテンプレートの上書き（オーバーライド）
管理画面はテンプレートが上書きできるため見た目を変えることができる
自分好みの管理画面もオーバーライドによって実装できる

管理画面の元テンプレートはcontrib/admin/template/adminに格納されている
上書きする場合は
①settings.pyのTEMPLATE＿DIRで設定されているディレクトリにadmin/を追加する
②上書きしたい管理対象を、上記ディレクトリ配下に  アプリ名/モデル名/  で追加する
③テンプレートを追加する
詳しい上書き対象については下記リンクを参照
[Django adminテンプレートのオーバーライド方法について解説](https://ryu22e.org/posts/2020/12/10/how-to-override-the-django-admin-templates/)

基本的には必要な部分だけ上書きする方が効率的
例：hogeアプリのfugaモデルの一覧画面を上書きしたいときはtemplatesフォルダに
　　admin/hoge/fuga/change_list.htmlを作成。
あとは以下のように変更したい{% block %}を上書きしていく

```html:change_list.html
{% extend 'admin/change_list.html' %}
{% block 'content' %}

<!-- 追加したいフォームや変数など　--!>

{{ block.super }}
{% endblock %}
```

#管理画面でのクエリの大量発行(n+1問題)
adminでのクエリの大量発行が起きている場合、これで解決できた

```python:admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')

    def get_queryset(self,request):
        return super().get_queryset(request),select_related(メソッド名)
```

#最後に
一人て開発していると割と適当になりがちな管理画面だが、規模が大きい開発では管理画面が使いやすい方がいいんだなと痛感しました
管理画面を使わずに個別でページを自作している人は割と簡単に作れるので試して欲しいです
###参考文献
この方が出している本はわかりやすいのでおすすめです（小学生並の感想）
[現場で使える Django 管理サイトのつくり方](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Django-%E7%AE%A1%E7%90%86%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-%EF%BC%88Django-%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%89-ebook/dp/B08HVJPRR8)
boothでも売っているので検索してみてください
CentOS 7にEmacs 27.1をインストールしvtermを使う

## はじめに

Emacs 27.1ではダイナミックモジュールがデフォルトで有効になりました。Emacs内で利用できる端末ではこのダイナミックモジュールを使うvtermがなかなかよいので、CentOS 7にEmacs 27.1をインストールし、vtermを使ってみました。

## 手順

snapでEmacs 27.1をインストール

```console
sudo yum install epel-release
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
# 一度ログアウトし、ログインし直す
sudo snap install emacs --classic
```

vtermのインストールに必要なモジュールをインストール

```console
sudo yum -y install cmake3 gcc libtool
sudo ln -s /usr/bin/cmake3 /usr/local/bin/cmake
```

melpaリポジトリを有効化するために、~/.emacs/init.el を編集

```emacs-lisp
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
```


Emacsを起動し、M-x package-installでvtermをインストールします。
M-x vterm でモジュールがコンパイルされ、vtermを開くことができるようになります。
AtCoder Regular Contest 112


##[A - B = C](https://atcoder.jp/contests/arc112/tasks/arc112_a)

O(N)
Rにおける等差数列の和を計算した後に、まとめてLの和を引きます。
等差数列の和を知っているか知らないかの問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    int t;
    cin >> t;
 
    vector<ll> L(t), R(t);
    
    rep(i, t){
        cin >> L[i] >> R[i];
        ll a = L[i]+L[i];
        ll l = R[i];
        ll n = R[i]-L[i]-L[i]+1;
        if(l>=a){
            ll p = n*(a+l) / 2;
            ll q = (L[i]+L[i])*n;
            ll res = p - q + n;
            cout << res << endl;
        }else{
            cout << 0 << endl;
        }
    }
 
    return 0;
}
```

##感想
B問題は解説を見てもまだ理解ができないです。
ARCに関しては、緑コーダーになるまで参加しないことにしました。
【python】csv読み込み

```python
import csv
import tkinter as tk

with open('path.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row[0])

p = row[0]

full = p + '\\' + 'test.csv'
with open(full) as f:
    reader = csv.reader(f)
    for row in reader:
        print(row[0])

root = tk.Tk()
root.withdraw()
# メッセージボックス（はい・いいえ） 
ret = tk.messagebox.askyesno('タイトル', 'メッセージ内容')
print(ret)
```
【Express】__dirnameと__filenameの使い方

#プログラミング勉強日記
2021年2月14日
[昨日の記事](https://qiita.com/mzmz__02/items/23e8e8f840ccd169daec)で`__dirname`を扱っているが、いまいち理解できていなかったのでまとめる。


#__dirnameとは
　現在のディレクトリのパスを示す特別な変数。

```js:
// C:/sample/sample.js
console.log(__dirname);
//  C:/sample と表示される
```


#__filenameとは
　現在のモジュールの絶対パスを取得する。

```js
// C:/sample/sample.js
console.log(__filename);
// C:/sample/sample.js と表示される
```

#参考文献
[面倒なJavaScriptコードのとりまとめがこれ1つで可能に、「webpack」入門](https://knowledge.sakura.ad.jp/21623/)
MISRA C/C++, AUTOSAR C++, CERT C/C++とC/C++工業標準をコンパイルする

MISRA C/C++, AUTOSAR C++, CERT C/C++とC/C++工業標準をコンパイルする作業のまとめです。

 <この項は書きかけです。順次追記します。>

工業標準は、しばしば架空の仕様について議論する危険性を含んでいます。

実際に仕事で行っていることは、機密事項で競合他社に教えるわけにはいかないからかもしれません。

常に、架空の仕様と現実の仕様のせめぎ合いの中にいるかもしれません。

IT関係では、MulticsというOSの失敗と、ISO/OSIという通信仕様の失敗を例として示していることがあります。

それ以外にも、Process standardという分類では、具体的な試験仕様でないかぎり、架空の議論に巻き込まれているかもしれません。

さらに、バベルの塔のように、部分ごとに用語の整合性が取れていなかったり、OSIのように整合性を取ろうとして肥大化して実用的に使える部分が少なくなってしまうという両極端に走るかもしれません。

C言語標準、C++言語標準を検討するにあたって、
実用的なコンパイラでコンパイルするとどうなるかを確認し、
少なくとも複数種類のコンパイラで実装しているものを標準化するようにしていることが大事だと感じてきました。

セキュリティのように、実装できていないが目標としたいという規定が一部混じることはやむを得ないかもしれません。
言語そのものの信頼性を確保するために。

ただし、現在実装できていないことを、顧客に明示的に示さない限り、
仕様の出発点としての国際規格の役割を果たすことはできないかもしれません。

安全に関する視点も同様かもしれません。

ただし、計算機の標準化をしていないのに、プログラミング言語だけ標準化するのには無理があります。

プログラミング言語が、どのような計算機の上では動くかを示すのに、計算機の標準がない上で、言語の標準だけ完備することは、ほぼ不可能です。

例えば、レジスタ（register）に関連する扱いで、
8bit, 16bit, 32bitのレジスタを持ったCPUと、
32bitのレジスタしか持たないCPUとでは、
振る舞いが異なり、場合によっては言語に対する有利不利ができます。

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 最後までおよみいただきありがとうございました。

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

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

Please press the like icon 💚　and follow me for your happy life.
Herokuでデプロイしたアプリの起動の遅さの原因

# はじめに
先日、HTML,CSS,Javascript,Ruby,RubyonRailsを使った簡単なアプリケーションを作成し、Herokuへデプロイしました
自分でもアプリを使っており、毎日１〜２回webページを開こうとすると毎回読み込みがものすごく遅い。。。
待つときは１０数秒待つようなこともありました
そこで、読み込みが遅い原因とその解決方法についてまとめました

# 環境
ruby 2.6.5
rails 6.0.3.4
herokuは無料版認証済みのアカウントを使用

## 読み込みが遅い理由
読み込みが遅い理由はwebサーバーがアクセスの度に起動するため、起動時間がかかっているのが原因のようでした
heroku無料版では、30分ごとに使っていなければwebサーバーが停止します(スリープ状態)
そのため、時間を開けてアクセスするとその度にwebサーバーが起動するため、webサーバーが立ち上がるまでの時間が読み込みが遅いと感じるようです
## 対策
３０分ごとにサーバーが停止するなら30分以内に毎回アプリを起動すればいいじゃない！
ということで、herokuにスケジューラという**アドオン**を追加します
**アドオン**とはソフトウェアに新たな機能を追加するプログラムのことです
https://qiita.com/kyabetsuda/items/391044601a113f73667d
こちらの記事を参考に10分おきに自分のwebページへアクセスし、webサーバーがスリープしないよう設定しました
**curlコマンド**というものがでてきましたが
**curlコマンド**はサーバへ、またはサーバーからデータを転送を行うコマンドとのこと。

```
curl URL
```
でURLのwebページをHTTPリクエストのGETメソッドで取得するという記述になります
これをスケジューラに登録したので、１０分ごとに自分のアプリケーションのデータを取得しに行ってくれるため、サーバーが起きている状態になります

意外と簡単に対策できるので、自作アプリをherokuにデプロイされている方は是非お試しください！
MicrosoftのRPA - Power Automate Desktop 2021年2月アップデートについて

皆さんこんにちは、マイクロソフトの川端です。
2021年2月のPower Automate Desktopのアップデート情報を紹介していきます。

#1. はじめに
元の情報（英語）はこちらになります。
https://flow.microsoft.com/nl-nl/blog/power-automate-desktop-february-2021-update/

本内容はPower Automate Desktopのバージョン2.4.63.21036での動作内容となります。

以前のバージョンをお使いの場合も、最新のインストーラーをダウンロードし起動、インストール完了して頂ければ最新版へと更新されます。

#2. Power Automate Desktopの2021年2月アップデート情報
###"ここから実行"機能がフローデザイナーで利用可能に
構成済みの任意のアクションを右クリックし、フローの途中から実行がスタートできるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/03a46d4d-e0cd-624a-f983-1c9ac0420764.png)

###様々なアクションがより直感的に呼び出せるように
特殊キーの挿入が選べるようになり、ユーザービリティが向上しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/3b80867c-aa76-cf0f-684e-918401ed23ce.png)

[UIオートメーション]>[Windows]>[ウィンドウにフォーカスする]のアクションや、[遅延]>[ウィンドウを待機する]のアクションで、自動操作対象のタイトルやクラスを選択していくことが可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/af69cc67-c46c-2549-77b8-b01b8c8978df.png)

[フローコントロール]>[移動先]アクションでサブフローの中で使われているラベルを指定できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/add48f6f-b949-21c0-5209-5fe3b19f11a5.png)


###定義済みの変数が[生成された変数]として選択し利用できるように
以前は逐一フロー変数を手入力する必要があったものが選択できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/bfd1bdaa-4d09-5d8f-deff-2eba2305b1e0.png)



#3. まとめ
今月もユーザビリティの向上に関係するアップデートが多く行われました。今後もPower Automate Desktopにご期待ください！
Power Automate Desktopの[無料トライアルはこちら]
[無料トライアルはこちら]:https://flow.microsoft.com/ja-jp/robotic-process-automation/
A - Round One, A - One Card Poker, D - Derangement

2021/2/14
くじかつ、精進内容

##[A - Round One](https://atcoder.jp/contests/abc148/tasks/abc148_a)

O(1)
xorで必要な数を取り出します。

```python:python
A = int(input())
B = int(input())
 
res = ((1^2^3)^A)^B
print(res)
```

##[A - One Card Poker](https://atcoder.jp/contests/abc054/tasks/abc054_a)

O(1)
実装問題、13と1の時だけ条件式が必要です。

```python:python
A, B = list(map(int, input().split()))
 
if A == 13 and B == 1:
  print("Bob")
elif A == 1 and B == 13:
  print("Alice")
elif A > B:
  print("Alice")
elif A < B:
  print("Bob")
else:
  print("Draw")
```

##[D - Derangement](https://atcoder.jp/contests/abc072/tasks/arc082_b)

O(N)
実装問題、最後の要素だけ別で処理を行います。

```python:python
import math
import heapq
import itertools

def main():
    N = int(input())
    P = list(map(int, input().split()))
 
    cnt=0
    for i in range(0, N):
        if P[i] == i+1 and i < N-1:
            P[i], P[i+1] = P[i+1], P[i]
            cnt+=1
        elif P[i] == i+1 and i == N-1:
            P[i], P[i-1] = P[i-1], P[i]
            cnt+=1
    
    print(cnt)
 
 
# エントリポイント
if __name__ == '__main__':
    main()
```

##まとめ
緑diffの問題は過去に記事を作成しています。
WoWLANを設定する(ASUS編)

ASUSマザーボードでのWoWLAN (Wake on Wireless LAN)設定についてまとめる。

# 環境
下記スペックの自作PCで確認。

* AMD Ryzen 9 5950X
* NVIDIA GeForce RTX 3080 ※Wi-FiのネットワークアダプターはIntel Wi-Fi 6 AX200
* DDR4-4000 16GBx2
* ASUS ROG STRIX X570-I GAMING

# UEFI BIOS Utility
ここではASUS製マザーボードの場合の設定を記載する。

|メニュー|設定項目|設定値|
|:--|:--|:--|
|詳細\APM|ErP Ready|無効|
|詳細\APM|PCIEによる電源ON|有効|

# 電源オプション
Windowsの電源オプションで「電源ボタンの動作を選択する」でシステム設定を開き、以下の項目を設定する。

|設定項目|設定値|
|:--|:--|
|高速スタートアップを有効にする(推奨)|チェックを外す|

# デバイスマネージャー
WindowsのデバイスマネージャーでWi-Fiのネットワークアダプターのプロパティを開く。詳細設定タブは初期設定のままとした。主要項目の設定値を記載する。

|プロパティ|値|
|:--|:--|
|Wake on Magic Packet|有効|
|Wake on Pattern Match|有効|
|WoWLANのARPオフロード|有効|
|WoWLANのGTK Rekey|有効|
|WoWLANのNSオフロード|有効|
|WoWLANのスリープ状態の解除|無効|

電源の管理タブを設定する。

|設定項目|設定値|
|:--|:--|
|電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする|チェックを入れる|
|このデバイスで、コンピューターのスタンバイ状態を解除できるようにする|チェックを入れる|
|Magic Packetでのみ、コンピューターのスタンバイ状態を解除できるようにする|下記参照|

「Magic Packetでのみ、コンピューターのスタンバイ状態を解除できるようにする」は、スリープ解除をMagic Packetに限定したい場合、またはIPアドレスがDHCPの場合などネットワークから当該端末を宛先とした通信が発生する場合にチェックを入れる。IPアドレスが固定の場合などネットワークから当該端末を宛先とした通信が発生せず、Magic Packet以外でも当該端末を宛先とした通信でもスリープを解除したい場合はチェックを外す。わからない場合は勝手なスリープ解除を避けるためチェックを入れる。ここではIPアドレスが固定のためチェックを外した。

# 動作確認
スマホにWake on LAN用のアプリをインストールし、アプリからスリープ解除できることを確認する。勝手にスリープ解除される事象が発生した場合は[前記事](https://qiita.com/shiba48b/items/0c23934ad2b02dcd8219)も参照のこと。
【JAVAについてまとめてみた】配列とList、ときどきMap

#はじめに
今回はjavaの配列についてまとめてみました。
配列は大量のデータを扱うときに使用します。
意外と奥が深い配列のみんな。
そんなみんなの生態にせまっていきます。

##1.配列

```java:宣言の仕方
 String[] list = new String[2];
```
```java:初期値指定
 String[] list = {"hello","world"};
```
```java:その他の処理まとめ
 list.length; //配列のサイズ取得
 list[0] = "hello"; //要素の挿入
 list[0]; //要素の取得
```
大体こんな感じですかね。
始めの宣言時にサイズを指定する必要があります。
その後はサイズを増やしたり、減らしたりは基本できないっす。（固定長）
##2.List

```java:宣言の仕方
 List<String>  list = new ArrayList<String>();
```
```java:初期値指定
 List<String>  list = new ArrayList<String>(Arrays.asList("hello","world"));
```
```java:その他の処理まとめ
 list.size(); //配列のサイズ取得
 list.add("hello"); //要素の挿入
 list.get(0); //要素の取得
 list.remove(0); //要素の削除
 list.indexOf("hello"); //要素の検索
```
普通の配列との違いは長さが固定ではないという点にあります。（可変長）
要素の追加、削除、検索が行えたりします。
ただ、基本データ型の情報は扱うことはできないのでラッパークラスとか使う必要がありそうです。
##3.Map

```java:宣言の仕方
 //Map<キーの型,値の型> マップの名前 = new HashMap<>();
 Map<String,Integer> map = new HashMap<>();
```
```java:初期値指定
 Map<String,Integer> map = new HashMap<>(){{put("商品1",800);put("商品2",1000);}};
```
```java:その他の処理まとめ
 map.size(); //配列のサイズ取得
 map.put("消費税",8); //map.put(キー,値)要素の挿入
 map.get("消費税"); //map.get(キー)要素の取得
 map.remove("消費税"); //map.remove(キー)要素の削除
 map.clear(); //要素の全削除！
```
```java:mapの値全取得
　for(String key :  map.keySet()){
	map.get(key);
  }
```
Mapはkeyと値を指定して格納する配列っぽいやつです。
Mapもよく使われるので覚えておきたいです！

##まとめ
いかかがだったでしょうか！
他にもこんな書き方あるよと知ってる方は教えてください！

ご覧いただきありがとうございました！
Flutter 画像にクリックイベントをつけるには？

#ImageはonTapを持っていない・・・
画像をクリックで遷移させたい時や、何かイベントを発動させたい時、普通に`onTap`があると思ってたのですが、ありませんでした。。。
![スクリーンショット 2021-02-14 21.56.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/4cb61da4-fedb-1305-7e37-cb3261ed5f9b.jpeg)

さてどうしましょうか？？:thinking:

#GestureDetectorを使おう

```dart:main.dart
 Widget build(BuildContext context) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(10),
      child: GridTile(
        child: GestureDetector(
          onTap: () {
            // do something
            );
          },
          child: Image.network(
            imageUrl,
            fit: BoxFit.cover,
          ),
        ),
        ),
      ),
    );
```

`GestureDetector`はimageだけじゃなくて、あらゆる任意のWidgetにクリックイベントをつけることができるようです。

**これは絶対に使う！**
Linux系统中切换到root用户的方法

## 使用root权限执行命令
`$ sudo [命令]`

## 临时进入root用户
`& sudo -i`
输入当前用户的密码即可进入root用户

## 永久切换到root用户
### 首先需要重置root用户密码
`$ sudo password root`

### 切换到root用户
`$ su`
输入root用户密码

### 退出root用户
`# exit`
【Git】git addをする理由について

#はじめに
gitはコミットを残すことによって、projectの履歴管理ができる素晴らしいシステムです。コミットをするためには先ずgit addというコマンドを使ってステージングする必要があります。何故、すぐに変更履歴をコミットしないでgit addでステージングする必要があるかについてずっと疑問だったので、その理由について調べてみました。

#目次
- gitの構成
- ワークツリー（working Tree)とは
- ステージング(staging)とは
- リポジトリ（repository)とは
- git addをする理由
- 参考サイト

# gitの構成
gitは大きく３つの段階に構成されています。ワークツリー、ステージ、リポジトリ。図で表すと以下のようになります。ワークツリーからリポジトリに段階が進むに連れて、星の形が出来ていく感じです。ワークツリーからステージに到達するには「git add」コマンドが、ステージからリポジトリに行くには「git commit」コマンドが必要になります。
![スクリーンショット 2021-02-14 21.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/ff85d789-b71c-ea50-6a88-ac63829e0272.png)

#ワークツリー（working Tree)とは
ワークツリーは簡単に言って自分が今作業しているファイルやフォルダーのことです。一つのprojectの中にいろいろなフォルダーがあり、階層構造になっていますよね。それをツリー（tree)に例えて表しているだけです。

#ステージング(staging)とは
ステージング(staging)とはワークツリー（自分の作業場）からステージ（stage)という臨時的な保存場所（実際は少し違います）に移す作業です。ステージ（stage)は日本語でいうと舞台ですよね。つまり、コミットの前段階であってコミットするファイルを舞台に乗せるという意味になります。git addコマンドによって実行されます。

# リポジトリ（repository)とは
リポジトリは簡単にいうとコミットした履歴を保存する場所です。コミットするには「git commit」というコマンドを入力します。履歴を残すことでバグが起こったりして元の状態に戻す必要がある時に、このリポジトリに残っている履歴を辿って過去のある時点（コミットした履歴）に戻すことが出来ます。gitでproject管理をする主な理由でもありますね。

#git addをする理由
本題に入りまして、そもそもなぜ「git add」をするのでしょうか。ステージという段階はなぜ必要なのか、その理由について疑問に思ったりしませんか？ 履歴を残すだけだったらワークツリーからリポジトリに直接コミットすればいいのであって、ステージなんか要らないですね。しかし、ステージングをする理由はちゃんとあります。例えば、掲示板の投稿機能を実装する場合、その機能に関係あるファイルを修正すればいいんですが全く関係のないところいじったりした経験はありませんか？例えば、掲示板の投稿機能を実装していたら、メイン画面の配置が気になったので修正し（index.htmlなどを修正）、それから掲示板の投稿機能に関するファイルを触ったとか。そういうことってありますよね。そんな時にもしステージングが無かったとしたら、全く関係のない内容まで履歴として残してしまうんですね。そういうのを防ぐために、掲示板の投稿機能に関係あるファイルだけを選んでステージング（舞台に乗せて）してコミットする。その後にメイン画面の修正は別のステージに乗せて、コミットすれば履歴（過去に戻る時点）がキレイになる。だから、git addコマンドで選別作業をするというわけですね。

※git add ファイル名を実行すると指定したファイルだけをステージング出来ます。

#参考サイト
- https://kray.jp/blog/expound-git-add/
- https://www.atmarkit.co.jp/ait/articles/2003/13/news031.html
Slackでリンクのタイトルを変更する

## はじめに
slackでリンクをそのまま貼りたくない！と思い、マークダウン 記法で試したが上手くいきませんでした。意外とググってもなかなか見つからなかったので、議事録としてまとめました。

```:slack
[yahoo](URL)　#=>うまく表示されない
```

## 目的

slackでリンクをテキストで表示したい


<img width="361" alt="スクリーンショット 2021-02-14 21 46 23" src="https://user-images.githubusercontent.com/64491435/107877169-1788d200-6f0e-11eb-8bfb-ffc879c23a9c.png">



## 結論

`command + shift + u`で実行できます

（URLを指定した状態で）

## 手順

①URLを選択し、`command + shift + u`を実行

②以下の画面が表示されるので、テキストの部分を変更する
<img width="544" alt="スクリーンショット 2021-02-14 21 36 17" src="https://user-images.githubusercontent.com/64491435/107877094-98939980-6f0d-11eb-90d9-6a494e43a9d8.png">
以下のようなリンクを作成できます
<img width="361" alt="スクリーンショット 2021-02-14 21 46 23" src="https://user-images.githubusercontent.com/64491435/107877169-1788d200-6f0e-11eb-8bfb-ffc879c23a9c.png">



こちらの方がわかりやすいと個人的には感じるので、こちらを使っていきたいと思います！
AWS CloudTrail とは

## 勉強前イメージ

費用確認する系のやつ？
なんか普通のサービス的な感じじゃない気がするなー

## 調査

### AWS CloudTrail とは

AWSサービスを記録し、いつ・だれが・何をしたのか を残すサービスです。
イベント履歴と証跡情報の2種類の項目のリソースの追跡を行うことができます。

### AWS CloudTrailの特徴

- コンプライアンスの支援

ユーザのアクティビティ履歴を確認できるので、ポリシーや規則の準拠に沿ってるかの確認がより簡単になります。

- データ不正引き出しの検出

ユーザのアクティビティ履歴を確認できることにより、データの不正引き出しを検出することができます。

- セキュリティ分析

イベントをログを分析することによって、ユーザーの行動パターンを検出できます。

- トラブルシューティング

アクティビティ履歴を確認できるので、最近変更のあったリソースなどの確認が行なえます

### イベント履歴

イベント履歴はダッシュボードの下にあり、そこから確認することができます。
s3のを作ったり削除したりなどもこちらで見ることができます。

![イベント履歴CloudTrail Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3af62e7d-2e53-e530-2364-9ea6a6e50ace.png)


### 証跡情報

証跡情報は `証跡` にs3のバケットが記載されているのでそのバケットを確認するとデータがあります。

![証跡情報CloudTrail Management Console - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/48f3ff9f-0f5d-3bca-0a0c-a5a280d6858e.png)

## 勉強後イメージ

AWSって何してるか、何変更したかわからんーって思ってたけど
ちゃんと見れるサービスがあるのか・・・

## 参考

- [CloudTrailの基本](https://blog.serverworks.co.jp/tech/2018/03/05/cloudtrail_basic/)
- [AWSサービスのイベント履歴を記録する「AWS CloudTrail」とは？実際に利用してみた](https://business.ntt-east.co.jp/content/cloudsolution/column-try-36.html)
【Xiaomi Redmi 9T】USBデバッグモードにする方法

# はじめに
[Xiaomi Redmi 9T](https://amzn.to/3pjIc2s)を買いました。

Android Studioに接続して早速開発に活用しようと思います。
少し他機種とは変わっているので手順を残しておきます。

# 手順
## 設定アプリを起動する

あらかじめホーム画面にある設定アプリを起動します。
![Screenshot_2021-02-14-21-06-02-462_com.miui.home.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/8b79ee5a-3420-df05-548c-f39aed5076d4.jpeg)

## デバイス情報を選択する

デバイス情報を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/485ec468-83d8-f619-7307-611efcb5cac7.jpeg" width=300>

## MIUIバージョンを７回タップする

MIUIバージョンを７回タップすると開発者向けオプションが有効になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/1fac78ff-5df2-ca25-d8f5-0d932afc606e.jpeg" width=300>

## 開発者向けオプションを開く

一旦設定画面トップに戻ったあと下にスクロールすると「追加設定」の項目があるのでそれを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/67a33551-0a07-ac10-7cad-4e802305d2f9.jpeg" width=300>

下にスクロールすると「開発者向けオプション」の項目があるのでそれを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/156ac46a-9ef5-b815-c093-100aab6c7972.jpeg" width=300>

## USBデバッグを有効にする

デバッグ項目に中にUSBデバッグがあるのでONにするONするときに警告が表示されるので内容を読んで同意を選択する。
（ここら辺は他のAndroid端末と同じです）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/1dc8d0be-68ad-3ae7-9f1a-8a04e1cb3bcd.jpeg" width=300>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/d3f21fa7-3a47-8d24-adc9-6818e85101e5.jpeg" width=300>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/a6c6f8f9-69d5-41c7-57ff-deee918e341a.jpeg" width=300>

## USB経由でインストールを有効にする

次にUSB経由でインストールを有効にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/d49cb364-7987-60be-0118-36f8caa2eafe.jpeg" width=300>


## AndroidStudioで実行可能状態にしてからUSB接続する

AndroidStudioでプログラムが実行できるようにプロジェクトを開いた状態で接続する。
初回にUSBデバッグ許可が出てくるのでOK選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/3ac6154a-417d-ff07-62d0-65df842f4ee7.png" width=300>

## Android Studioからデバッグ実行すると

Xiaomi Redmi 9Tにインストール許可画面が表示されるのでインストール選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/86217890-34c5-79bb-0031-d2d4f3bc9272.jpeg" width=300>
Go 言語仕様10（テスト）

## 概要
Go 言語の仕様まとめ。

前回：
[Go 言語仕様9（構造体）](https://qiita.com/R_R/items/c85bed04e55edd0cc071)

## 内容

- テスト

## テスト

Goでは標準でテスト用のパッケージが用意されているため、容易に単体テストができる。
手順は以下。

- テストをしたいファイルと同じディレクトリ内にテストファイルを作成する。ファイル名は、パッケージ名_test.go

```:ディレクトリ構成
go/
 └ src/
   └ test/
     ├ main.go
     └ main_test.go 
```
　　

- main.goにテストしたい関数を作成。（型をチェックし、stringの場合にtrueを返す。）

```Go:main.go
package main

import "fmt"

func CheckTypes(t interface{}) bool {
	var returnVal bool

	switch t.(type) {
	case int:
		returnVal = false
	case string:
		returnVal = true
	case float64:
		returnVal = false
	default:
		returnVal = false
	}

	return returnVal
}

func main() {
	var f interface{} = "Golang"
	//var f interface{} = 100

	if b := CheckTypes(f); !b {
		fmt.Println("error")
	} else {
		fmt.Println("ok")
	}
}
```
　　

- main_test.goにCheckTypesをテストする関数を作成。

```Go:main_test.go
package main

import (
	// testingパッケージをimportする
	"testing"
)

// テストしたいときだけfalseにする
var DoTest bool = false

// 関数名はTestではじめて、テストしたい関数名をつなげる
// testing.Tを引数に指定する
func TestCheckTypes(t *testing.T) {
	if DoTest {
		t.Skip("Do nothing")
	}

	// PASS
	var f interface{} = "Golang"
	// FAIL
	//var f interface{} = 100

	var result bool = CheckTypes(f)

	// falseの場合はエラーにして、テストを終了させる
	if !result {
		t.Errorf("error")
	}
}
```
　　

- テストの実行

テストファイルがあるディレクトリで、go testコマンドを実行する。

```:エラーなしの場合
$ go test

PASS
ok      test    0.398s
```

```:エラーの場合
$ go test

--- FAIL: TestCheckTypes (0.00s)
    main_test.go:22: error
FAIL
exit status 1
FAIL    test    0.302s
```

go test -vで詳細を出力できる。

```
$ go test -v

=== RUN   TestCheckTypes
    main_test.go:22: error
--- FAIL: TestCheckTypes (0.00s)
FAIL
exit status 1
FAIL    test    0.177s
```
　　

- 特定のファイルを指定してテストを実施する場合

```Go
// テスト対象のファイル名を指定する
go test xxx_test.go xxx.go
```
　　
## 次回
[Go 言語仕様11（スコープ）]()
[Rails] DB カラム名の変更方法

カラム名を間違えてmigrateしてしまった時の対処法です。

#migrationファイルを作成する
以下を実行します。

```
$ rails g migration rename_変更前のカラム名_column_to_モデル名
```

#作成されたmigrationファイルを編集する
`rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名` を追記します。
例えば `img` を `user_img` に変更したい時は、以下のようになります。

```:db/migrate
def change
    rename_column :users, :img, :user_img
end
```

#migrationファイルを反映させる
`rails db:migrate` でテータベースにmigrationファイルを反映させるとカラム名が変更されます。

```
$ rails db:migrate
```
【Rails】メソッド名(カラム名)の一部を変数に置き換え動的に変化させる方法

# 背景
とあるユーザーテーブルにて、
`hoge1`,`hoge2`,`hoge3`
というカラムがあったとします。
それぞれの値を取得しようとすると、

```ruby
@user.hoge1
@user.hoge2
@user.hoge3
```
みたいに書くことがあると思います。
今回は、この1,2,3のメソッド名を変数に置き換えて、動的に変化させたいという背景がありました。


# 方法
.sendを使う。
(.sendは動的にメソッドを変化させるメソッドです。)
### ・例

```ruby
num = 1
@user.send("hoge#{num}")

# @user.hoge1が実行される
```

このように書けば、変数numの値が代入されます。
あとは、`num`の部分を`params[:fuga]`とかにすれば、動的に変化できるかと思います。
VSCode で Arduino を開発していてシリアル出力を表示する際エラーが出る場合の対処方法

VSCode で Arduino を開発していてシリアル出力を表示する際、下記のようなエラーが出る場合の対処方法です。

````
vscode-arduino-0.3.4\out\node_modules\usb-detection\build\Release\detection.node' was
compiled against a different Node.js version using NODE_MODULE_VERSION 80. This
version of Node.js requires NODE_MODULE_VERSION 85. Please try re-compiling or re
-installing the module (for instance, using `npm rebuild` or `npm install`).
```

VSCode v0.3.4 でのバグらしく v0.3.5 を手動でインストールすることにより一応は回避可能です

まずは以下のページから拡張機能ファイルをダウンロードします。
[Release v0.3.5 · microsoft/vscode-arduino ](https://github.com/microsoft/vscode-arduino/releases/tag/v0.3.5)

次に手動で拡張機能ファイルをインストールします。
[Visual Studio Code の拡張機能を VSIX ファイルからインストールする ](https://mseeeen.msen.jp/how-to-install-extension-in-visual-studio-code-with-vsix/)

あとは再起動を行えばエラーは消えて、シリアルポートが使えるようになるかと思います。

通信速度の変更は「 ctrl + shift + p 」を押して「 Arduino: Change Board Rate 」を選択します。
USB接続なら 9600 で大丈夫かと思います。

参考リンク

- [Was compiled against a different Node.js version using NODE_MODULE_VERSION 57. This version of Node.js requires NODE_MODULE_VERSION 76. · Issue #1074 · ](microsoft/vscode-arduino https://github.com/microsoft/vscode-arduino/issues/1074)
- [近況的2021/02の様子 ](http://www.osk.3web.ne.jp/~nyasu/diary/202102.html)
- [Visual Studio CodeでArduino - 滴了庵日録 ](https://lipoyang.hatenablog.com/entry/2019/08/25/093321)
Could9からHerokuにデプロイした際に発生したエラー’’App crashed”の原因調査について

#はじめに
* Railsチュートリアル第４版の第２章の開発中にエラー発生。
* エラー調査方法の備忘録として投稿。

#開発環境
* MacOS Catalina 10.15.7
* Safari 13.1.3
* AWS Cloud9
* Rails 5.1.6
* Ruby 2.6.3
* Heroku 7.47.6

#事象
Herokuにて**ApplicationError**が発生。
![スクリーンショット 2021-02-13 17.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948417/9e024aaf-67a8-0bf7-848f-c9db8cb4148a.png)

#調査方法と原因

**1.「heroku logs --tail」にてHerokuのログを確認**

エラーコード「**H10**」の「**App crashed**」が出力される。

```
heroku[router]: at=error code=H10 desc="App crashed"
```
Herokuで出力されるエラーコードとその内容は以下を参照。
https://sodocumentation.net/heroku/topic/8321/heroku-error-codes (2021/2/13)

ちなみにHerokuは標準で最新1500行のログを１週間保持しているらしい。
Herokuのログ内容の見方や出力方法については以下を参照。
https://devcenter.heroku.com/ja/articles/logging (2021/2/13)

**2.「heroku run rails console」にてログ確認**
当該コマンドにてHerokuにデプロイしたアプリケーションに対してRails Consoleを実行できる。Railsチュートリアルの場合であれば、Cloud9のコンソールにてより詳細なエラー内容を確認できる。
https://devcenter.heroku.com/ja/articles/getting-started-with-rails5#run-the-rails-console (2021/2/13)

コマンド実行結果として以下のログが出力される。
未定義のメソッド「protect_from_forger」が「/app/app/controllers/application_controller.rb」の「２行目」にあるいう旨のエラー。親切なことに「もしかして'protect_from_forgery'って言いたかったの？」とまで記載されている。

```
/app/app/controllers/application_controller.rb:2:in `<class:ApplicationController>': undefined method `protect_from_forger' for ApplicationController:Class (NoMethodError)
Did you mean?  protect_from_forgery
```
つまり原因は**メソッド名称の記載間違い**だった。(単純ミスにも程がある...)
コンソール上のコマンドを消そうとした際に、誤ってソースコードにカーソル当たっていたと思われる。(通信環境の悪い場所で作業していたため、Cloud9の動作が重くカーソル位置の反映が遅れていた？)

#解決策
当該箇所のメソッド名称を修正。問題なく動作。

#まとめ
Cloud9上でデバッグしたのちに当該バグを作り込んだため、Heroku上で発生したバグから調査する形となった。バグの原因自体はとても単純ではあるが、Herokuで発生したエラーメッセージから調査する方法を理解する良い機会となった。
また、普段はJava、C#といったコンパイラ型言語を用いることが多いため、スペルミスはコンパイル時にエラーとなっていたが、Rubyのようなインタープリタ型言語ではこういった単純なスペルミスに始まる構文エラーにも注意したい。(IDEによる検出表現も知っておく必要あり。Cloud9では定義済み関数は色が変化していた。)
どんなに簡単な原因だったとしても、事象からは簡単に原因特定できないのがアプリの難しさであり面白さだなと改めて感じた(もちろん最終的にちゃんと解決して初めて面白い)。
[Rails] Blocked hostエラーが発生した場合の対処方法

###結論
下記のコードでエラーを避けれます。

```rails:/config/environments/development.rb
(中略)

config.hosts.clear

(中略)
```

### 発生している問題・エラー
Rails6環境でherokuへプッシュしてアクセスしようとしたところ、Blocked hostエラーが発生。
reducer 사용하기

#reducer 를 사용해보기

```react
import React,{useReducer} from 'react';

function reducer(state, action){
    switch (action.type) {
        case 'INCREMENT':
            return state + 1;
        
        case 'DECREMENT':
            return state - 1;
        default:
            return state
    }
};

//useReducer 에 넣는 첫번째 파라미터는 reducer 함수이고, 두번째 파라미터는 초기 상태입니다.

function Counter(){
    const [number, dispatch] = useReducer(reducer, 0);

    const onIncrease = () => {
        dispatch({type : 'INCREMENT'})
    };
    const onDecrease = () => {
        dispatch({type : 'DECREMENT'})

    }
    return(
        <div>
            <h1>{number}</h1>
            <div>
                <button className="btn btn-light" onClick={onIncrease}>+1</button>
                <button className="btn btn-light" onClick={onDecrease}>-1</button>
            </div>
        </div>
    )
}

export default Counter;
````

reducer 는 상태를 관리해준다고 하는데
최근에는 reducer 를 사용하지 않고 mobx 로 한다고도 하는데 어찌되었든간에 연습해보았다.
【Swift】変数の宣言について

変数を宣言するとき、通常は

```swift
var count(変数の名前) = 0

@IBOutlet var webView: UIWebView!
```
と記述してたが、この`!`は値が`nil`でも変数を宣言することができる。
例えば

```swift
var count = 0
//　↓
var count : Int?
// とか
var [変数名] : Array<UIImage> // ←画像を取り扱うための配列
```

`!`や`?`を付けない変数は`非オプショナル型`で`nil`は使えない。

オプショナルは、変数にラップがかけられている状態。
ラップを外す＝アンラップするには3つの方法がある。
# 1.強制的アンラップ

```swift
var [変数名] : Int? = 5 //<-オプショナル型
print([変数名]) //=> Optional(5)

// 強制的アンラップ"!"をつける
print ([変数名]!) //=> 5
```

# 2.オプショナルバインディング
強制的アンラップは変数の値に関係なくアンラップできるが、値が`nil`のときに強制的にアンラップを行うとアプリが落ちる可能性がある。
そこで`if文`を用いてアンラップを行う。

```swift
let [変数名] : Int? //オプショナル型

if let [変数名] = 値 {
    print([変数名])
} else {
    print("[変数名]の中身はありません")  //=>else以降の処理が行われる
}
```

# 3.オプショナルチェイニング
オプショナル型の変数に値が入っているかいないかでその後の処理を分けてくれる

```swift
var [変数名] : ViewController? = ViewController() //->初期化

[変数名]?.image
```
ここの処理はxcodeが補完してくれるので、errorメッセージに合わせて`fix`すると良いらしい...
RaspberryPiでDNSサーバーを構築する

自宅サーバーと同じネットワーク内でもドメイン経由でのアクセスができるようにしてみた。

# DNSサーバーの構築

dnsmasqをインストールする。

```
sudo apt -y update
sudo apt -y install dnsmasq
```

名前解決したいホストを設定する。

```
sudo vim /etc/hosts
--------------------------------------------------------
RaspberryPiのIP           ドメイン名
--------------------------------------------------------
```

dnsmasqの設定と再起動を行う。

```
sudo vim /etc/resolvconf.conf
--------------------------------------------------------
name_servers=127.0.0.1
name_servers=8.8.8.8
--------------------------------------------------------
sudo service dnsmasq restart
```

# Wifiルーターが参照するDNSサーバーを変更する。

使用するWifiルーターによって設定方法が異なるため、ここではGoogle Nest Wifiの設定方法を記載する。

1. Google Homeアプリを起動
2. ホーム画面の「Wifi」を選択
3. 右上の設定アイコンを選択
4. 「ネットワークの詳細設定」を選択
5. 「DNS」を選択
6. 「カスタム」を選択
7. 「プライマリ サーバー」にDNSサーバーを構築したRaspberryPiのIPアドレスを指定
8. 「OK」を押す
9. 右上の保存アイコンを選択する

# 備考

* https://totech.hateblo.jp/entry/2015/06/28/135657
* https://support.google.com/googlenest/answer/6274141?hl=ja#zippy=%2C%E3%81%A9%E3%81%AE-dns-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B
E2Eテスト自動化ツールの選び方

2020年代に入り、もはやE2Eテスト自動化は必須でしょ。
ということで自動化ツールなにがいいのか問題に対しての考察をまとめてみました。
自動化したいけど、どうやって選んだらいいのかわからないという方の参考になれば幸いです。


# まずはE2Eテスト自動化を取り巻く状況を知ることから
## 1. 主要なテスト自動化ツール
### ざっくり変遷
2010年代からオープンソースのツールが充実し始め、続いて有料サービスで多機能のツールが出てきている。有料サービスはサポートがしっかりしている。
最近のトレンドは非技術者をターゲットにしたノーコードサービスでAIを使ったシナリオ生成。
この他にもツールはたくさんあり網羅するのは断念。
大雑把な流れとしては時間とともに↓表の上から下に流れている感じ。
コード → ノーコード → ハイブリッド のような流れ。
![スクリーンショット 2021-02-14 12.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357158/af1cfdd5-c59d-2b67-449b-36bb65eeb548.png)


### Selenium系
扱えるフレームワークや言語の種類が豊富で得意なものを選べる。
ただしフレームワークとは別にWebdriverのインストールが必須で環境構築が煩雑。またツール（ブラウザ含む）のアップデートによってツール間の互換性がなくなる可能性があるため安定運用に手間がかかる。

### Non-Selenium系
１つのインストールで環境構築が完了するというのがメリット。

### AI系
売りにしているツールは、オートヒーリング機能（アップデートで変更された要素を自動予測して差し替えてくれるっぽい）、自動比較による意図しない変更の検出、リンク切れ検出などの機能が提供されている。
AIとコード両方が扱えるハイブリッドも出てきている。

### Non-AI系
最初のテストシナリオ作成まではブラウザ操作をレコードすることで生成される。ここまではAI系と同じ。
Non-AI系は作成したシナリオで扱う要素を手動で細かく編集（調整）することができ、シナリオ作成の柔軟性が非常に高い。
柔軟性の高さをどう使えばやりたいことが実現できるか、ハックする姿勢があればとても扱いやすいのではないかと思う。


## 2. 日本は遅れている
### 自動化の状況 : 日本
どうやってテストを自動化するか試行錯誤している段階。
ネット上には「こんなツールでこんな風に自動化することができました。」といった趣旨のコンテンツが大半を占める。

### 自動化の状況 : アメリカ
どうやってテストを自動化するかという段階はすでに超えている。テスト自動化が一般化しつつある印象。
自動化によってなにを狙うか。QAの取り組み方がどう変わるか。開発体制をどうすれば品質をより向上させることができるかという段階。
**QAE（Quality Assuarance Engineering）**という言葉も見かけた。
E2E自動化はこうすべし！的なコンテンツがたくさん共有されている。

## 3. 業界標準はできつつあるのか
### 日本のパターンは3つ
1. **技術者寄りのQAチーム**
1. **非技術者のQAチーム**
1. **1と2の混合**

技術者寄りのQAチームと非技術者のQAチームを両翼に、その間をグラデーションが埋めるのが日本のQAの状況。

パターンによって選ぶツールや取り組み方が変わってくるため、テスト自動化における標準的な形は見受けられない。
しいていえば、QAチーム体制にあったツールを選択するようになっていくと思われる。

参照ソースは少ないので明言はできないが、アメリカではツールによる自動化が進むにつれ、QAチームは手動のテストチームという考え方からQAEを行うチームへという流れがあるよう。
つまり、より能動的にQuality Assurance（品質保証）を向上させていく変化が起こりつつある。

# とりあえずツールを選んでみる

## 4. 課題の整理
自動化ツールを何のために導入するのか目的と、過去に試みた経験があればそのときに見えてきた課題を整理する。
これによってどんな機能が必須なのかを明確にすることができ、ツールの選択肢を絞り込める。

具体的な例だと以下のようなものが考えらる。

- リグレッションテストを自動化して日次で動作確認すること
- 非技術者のチームである
- メール受信テストの自動化
- シナリオ管理のしやすさ

## 5. チーム構成が最も重要
目的と課題が整理できたらツールを絞り込んでいく。
どの程度コードが扱えるかによって選択の幅がかわってくるため、最も重要になってくるのが先出のチーム構成パターン。
自動化ツール表からチームにあったツールを選んで、実際にフリートライアルでテストシナリオを作成してみる。

## 6. チームにあったツールを導入する
E2Eテスト自動化で大切だと思うのはツールの特性とチーム構成が合っていることだと思う。
それさえ正しく選択することができれば、テスト自動化自体はそれほど難しいものではないと思う。


# E2E自動化ツール探しで感じたこと
### まーやっぱり英語力には地道に投資した方がいい
先にも書きました通り、アメリカの方がテスト自動化が進んでおり有益な関連コンテツがたくさんあります。
特に自動化ツールのサイトで提供されているコンテンツには、導入した会社の経験談や自動化HowToなど良質なものが豊富にあります。また、ツールの多くはドキュメントもUIもすべて英語で提供されています。
ですので英語読解能力はE2Eテスト自動化にあたって、個人的にも組織的にも投資する価値は大いにあります。

様々なコンテンツを見てE2Eテスト自動化は市場として拡大しつつあると感じました。
勢いのある情報が多く生み出されている今、その情報を活かすことができたらチームに大きな価値を提供できるのではないでしょうか。

### AIは今後に期待
個人的には、AIがどんなことをしているのかブラックボックス感があり、試用した感想としてはまだあまりグッとくるものはありませんでした。AIによる自動機能はAIを教育する視点も必要なようで、今までに経験したことのない考え方が必要になりそうだと思いました。
しかし、自動テストでおそらく一番大変になりそうなシナリオマネージメントコストの削減には大いに期待を持っており。引き続きツールの進化には注目しています。



以上です。お読みいただきありがとうございました。
React.FC使う必要ある？

## はじめに
React.FC型を使うことが絶対に悪いことだと言う記事ではありません。

ただ、React.FC型を使うことにもいくつかデメリットもあり、React.FC型をあえて使っていないプロジェクトが多く存在します。
今回はそんなReact.FCについて書いていきます。

## React.FCとは
``` jsx
type Props = {
    hoge:string
}

const Component:React.FC<Props> = ({hoge}) => {
    return (
        <div>{hoge}</div>
    )
}
```

`React.FC`はReactの関数コンポーネントを定義するための型です。
ジェネリクスにpropsの型を入れられます。

## React.FCを使わなくても書ける
```jsx
type Props={
    hoge:string
}

const Component = ({hoge}:Props) => {
    return (
        <div>{hoge}</div>
    )
}
```
#### 型定義だけしたい場合

```jsx
type Component = (props: Props) => JSX.Element
```

## React.FCのデメリット1:ジェネリクスが使えない

再利用しやすくするためにPropsの型をジェネリクスで渡したいときどうすればよいでしょうか。

``` jsx
type Props<T> = {
  hoge:T
}

const ParentComponent = () => {
  return <Component<number> hoge={1}/>;
  //どうやって型をComponentに渡す？
}
```
`React.FC`を使うと下記のどれでも実現できません。

``` jsx
const Component<T>:React.FC<Props<T>> = ({hoge}) => {} 
const Component:React.FC<Props<T>> = <T>({hoge}) => {} 
const Component:React.FC<Props<T>> = function <T>({hoge}){}
```
ラッパー関数を使えば実現できなくもないですが、さすがに不便です。

`React.FC`を使わない場合はどうでしょうか。
この場合はTyescriptの知識がある程度ある方には簡単でしょう。

``` jsx 
function Component<T>({hoge}:Props<T>){}
```

## React.FCのデメリット2:childrenが必要かどうかわからない

React.FCを使うと関数コンポーネントのPropsに`children`が元から入っています。
逆に言うと`children`が必要がない場合でも、`children`に値を入れることができます。
`children`が必要なのか分からず、間違えて入れてしまってもエラーが出ないのです。
なんのためにTypescriptを使っているのか分かりませんね。

``` jsx
type Props = {
    hoge:string
}

const Component:React.FC<Props> = ({hoge}) => {
    return (
        <div>{hoge}</div>
    )
}

const ParentComponent = () => {
  return (
    <Component hoge={""}>
      <div>fuga</div>
      //childrenは必要ないのにエラーが出ない
    </Component>
  );
}
```

childrenが必要かどうかはちゃんと明記したいですよね。

```jsx
type Props = {
  hoge:string
  children: React.ReactNode
}
```

##  React.FCのデメリット3:将来的に大丈夫?
最後は現在に起こっている問題ではありませんが、今後ReactがアップデートをしReact.FCが使用できなくなったり非推奨になる可能性があるかもしれません。
そんなことあり得るのか、と思うかもしれませんが`React.SFC`が実際にver16.7で非推奨になっています。

## 最後に
皆さんもReact.FCを使わないReact+typescript開発をしてみてはいかがでしょうか？

## 2021/3/03追記
React18からReact.FCからchildrenは外されるそうです。
それに伴い、React.VFCは非推奨になるかも？
SwiftUI製アプリにFirebase Crashlyticsを導入する

# 概要
初投稿です...！
SwiftUIの勉強もかねて個人アプリを作成したので、そのときに導入したCrashlyticsの導入方法について記載します。
すでにcocoaPodsやFirebaseの機能の一部を使っていたので、多少端折っています。
プロジェクトの作成や初期設定方法については公式ドキュメントを参照してください。
https://firebase.google.com/docs/crashlytics/get-started?platform=ios

## Firebase Crashlyticsとは
クラッシュレポートを収集して解析するためのサービスです。
他にもSmartbeatなど、複数のクラッシュレポートサービスが存在します。

## 導入方法
### 1.Crashlyticsのインストール
まずはPodfileを更新します。

```rb:Podfile

pod 'Firebase/Crashlytics'
pod 'Firebase/Analytics'
```
Podfileを更新後、下記を実行してライブラリを使えるようにします。

```shell-session
$ pod install
```

### 2. XcodeのBuild PhasesからRun Scriptセクションを追加する
下記画像のように左の+ボタンからRun Scriptを生成します。
![Run Script](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224949/da2df68a-ad93-5fcf-af56-7c05b9f1d696.png "New Run Script")

### 3. Run Scriptに必要な設定を記述する
Shellフィールドの下に
以下のコードを記述します。

```
"${PODS_ROOT}/FirebaseCrashlytics/run"
```
次にInput Filesにある+ボタンを2回押して、それぞれの行に以下のコードを記載します。

```
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
```

```
$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
```

画像のようになっていればOKです。
![Run Script Content](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224949/271cb932-5b6c-e45a-45bc-d37e9446cbaa.png "Run Script Content")

### 4. XcodeのBuild Settingsの設定を変更する
XcodeのBuild Settingsのタブを開き、Debug Information FormatのDEBUGの設定を「DWARF」から「DWARF with dSYM File」に変更します。
![Debug Information Format](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224949/a0f61560-a7a7-d56d-7c0f-0aadef113a03.png "Debug Information Format")

### 5. AppDelegate.swiftを用意して、Firebaseの共有インスタンスを構成する
自分はAppDelegateを用意して初期化しましたが、Main Viewのinit部分で行っても問題ないと思います。

```swift:AppDelegate.swift
import Firebase
import UIKit

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        FirebaseApp.configure()
        return true
    }
}
```
AppDelegateを参照できるようにする

```swift:???.swift
@main
struct ???: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

### 6. 任意のViewにクラッシュさせるボタンを配置する
以下のようなボタンを設置してクラッシュさせてください

```swift:ContentView.swift
struct ContentView: View {
    var body: some View {
        Button(action: {
            fatalError()
        }, label: {
            Text("クラッシュさせる")
        })
    }
}
```

これでFirebaseのCrashlyticsのダッシュボードに該当のクラッシュイベントが表示されると思います。

![Crashlytics dash board](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224949/aba88c18-95fc-ea9f-3e51-535ba038430d.png "Crashlytics dash board")
【Workato】JobがずっとProcessing...のままになるときの対処

#実行したジョブが一向に終わらないときの考えられる原因
実は、実行しているアクションが「Long action」だった、という可能性が高いです。

#Long actionとは？
アクションの中には、long actionと呼ばれる特殊なアクションが存在します。
どんなものかと言うと、「非同期で実行されるアクション」です。
例えば、
- Bulkアクション
- SchedulerコネクターのWaitアクション
- ストリーミングでファイルを転送する系のアクション

こういったものがlong actionであるケースが多いです。

#Long actionがレシピに含まれる場合、レシピを「start」させる
Long actionが含まれるレシピを実行するときはレシピをstartして稼働させておく必要があります。

##なぜ稼働させておく必要があるのか？
一般的に、処理に時間がかかるAPIは非同期で呼び出されるようにデザインされている場合があります。こういったAPIは、アプリケーション側がリクエストを受け付けたら一旦すぐにレスポンスを返しちゃいます。そして裏で処理を粛々と進めます。
そのため、逆にAPIを呼び出した側は処理が終わってるかどうかは別途「終わってるかな〜？」と確認しにいく必要があります。終わってなければ、もう少し待って再度様子を見にいきます。

Workatoはこういった非同期で呼び出すアクションを実行すると、裏で5分おきに処理が終わってるかどうかのリクエストを自動で投げます。ただし、これはレシピがstartされて稼働しているときにしか行われません。
なので、例えばレシピを稼働させてない状態でtest実行すると、非同期APIを呼び出してはくれますが、終わってるかどうかのチェックが行われないためずっとProcessing...となってしまうわけです。

一応、test実行してからレシピの編集画面をexitし、レシピをstartさせた場合はうまく動作します。
【メモ】プルダウンリストを更新し選択した値で並び替える

これ単体ではあまり意味がない（手作業でやればよい話）が、メモメモ。

毎日、
①複数部署から統一されたフォーマットで送られてくるリストを集約（1シートにまとめ）、
②対象のリストを特定の行でグループ化し分割（たとえばA部、B部という風に）、
③それらを各部へメール送信
ということを行っている。

今回は、集約したデータの項目行を読み取り、それをプルダウンリストとして設定可能とし、
プルダウンで設定した値と一致する列で並び替えることを行うため書いてみた。

まず１つ目。【指定行の値をプルダウンに設定】する

 ※※同一シート内が条件※※※※

・C2がプルダウンを設定したいセル
・6行目がプルダウンリストとする値（要は項目行）

    Range("C2").Select                  'プルダウンを設定したいセルを選択
    With Selection.Validation           'プルダウンリストにどの範囲の値を用いるか選択
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & Range("A6", Cells(6, Columns.Count).End(xlToLeft)).Address
        
        'ここではA6セルから最右列までを範囲として指定
        
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .IMEMode = xlIMEModeNoControl
        .ShowInput = True
        .ShowError = False
    End With
End Sub



次が【指定セルの項目列で並び替え()】するもの

Sub 指定セルの項目列で並び替え()


'１．C2に設定した値でA6から右端の列を検索し、ヒットしたセルの番地を取得
    
'１．名前の定義＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
    
  Dim keyword       As String   '検索キーワード
  Dim FindArea      As Range    '検索対象とする範囲
  Dim FindResult    As Range    '検索の結果一致したセル
  
  


'２．キーワードの設定・検索結果の取得＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

  keyword = Range("C2").Value

  Set FindArea = Range(Range("A6"), Cells(6, Columns.Count).End(xlToLeft))  'A6から右端列までを検索対象とする
  Set FindResult = FindArea.Find(keyword, LookAt:=xlWhole)                  'keywordに一致したセルをFindResultとする
  
  
          
          
  Dim strAddress As String  'アドレス
  Dim intRowNo As String    '行番号
  Dim intColNo As String    '列番号
      strAddress = FindResult.Address(RowAbsolute:=False, ColumnAbsolute:=False)
      intRowNo = FindResult.Row
      intColNo = FindResult.Column

    


'３．フィルタの設定・特定項目行で並べ替え＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

'①A6行目にフィルタをセットする
'②特定セル（おそらくFindResult）で並び替え

    Rows("6:6").Select
    Selection.AutoFilter
        
    
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
        (strAddress), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    
    Selection.AutoFilter
    
End Sub


以上。まだまだ途中だが、これをベースに進めていく。