OmniAICreator/Qiita-1.07M huggingface dataset:
【Ubuntu 20.04】外部モニターを認識しない場合の対処法

環境:
Ubuntu 20.04をASUS laptopにクリーンインストール(最小のインストール)
type-cのドックからHDMIに接続しようとしたらディスプレイを認識しなかった

# lightdmのインストール

ディスプレイマネージャLight DMをインストールする。

ターミナルで以下を実行。

```bash
$ sudo apt install lightdm
```

LightDMをデフォルトで使用するディスプレイマネージャーに登録する。

PCを再起動。

# nvidiaのインストール

ターミナルで以下のコマンドを実行。

```bash
$ sudo apt-get purge 'nvidia*'
$ sudo add-apt-repository ppa:graphics-drivers
$ sudo apt-get update 
```

PCを再起動すると、HDMIから外部モニターを認識し、使用できるようになる。

# 参考

- https://qastack.jp/ubuntu/1033785/external-monitor-not-detected-on-ubuntu-18-04
- https://qiita.com/yto1292/items/463e054943f3076f36cc#1-%E6%96%B9%E6%B3%95
- https://techpiezo.com/linux/switch-display-manager-in-ubuntu-20-04/
C# - SplitContainerのサンプル　コードべた書き（Visual Studio不使用）

意外とSplitContainerを使うサンプルソースがサクッと見つからなかったので、メモ代わりに置いておきます。

# キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/af058c88-3804-9136-39b9-b02c5c755ed1.png)


# ソースコード

`SplitterDistance`は、親である`Form`のコンストラクタ内で設定してもうまく反映されないようなので`Load`イベントにつっこんでみた。（そのうち調べる・・・かも・・・）

```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class SampleForm : Form
{
    SplitContainer spl1;
    SplitContainer spl2;

    SampleForm()
    {
        ClientSize = new Size(500, 300);

        Controls.Add(spl1 = new SplitContainer(){
            Dock = DockStyle.Fill,
            Orientation = Orientation.Horizontal, // 横線で上下に分割
            // SplitterDistance = 250,                // 分割線の位置を指定[pixel] Horizontalの場合は上端からの位置
            BorderStyle = BorderStyle.FixedSingle,
            SplitterWidth = 2,
            FixedPanel = FixedPanel.Panel1, // spl1が属すコントロールがリサイズされたときに、Panel1側のサイズ（分割線）を保持（固定）する
        });

        spl1.Panel2.Controls.Add(spl2 = new SplitContainer(){
            Dock = DockStyle.Fill,
            Orientation = Orientation.Vertical, // 縦線で左右に分割
            // SplitterDistance = 100,// 分割線の位置を指定[pixel] Verticalの場合は左端からの位置
            BorderStyle = BorderStyle.Fixed3D,
            SplitterWidth = 2,
            IsSplitterFixed = true,
        });

        Load += (s,e)=>{
            spl1.SplitterDistance = 150; // 分割線の位置を指定[pixel] Horizontalの場合は上端からの位置
            spl2.SplitterDistance = 200; // 分割線の位置を指定[pixel] Verticalの場合は左端からの位置
        };


        spl1.Panel1.Controls.Add(new Button(){
            Text="Button on spl1.Panel1",
            Dock = DockStyle.Fill,
        });
        spl2.Panel1.Controls.Add(new Button(){
            Text="Button on spl2.Panel1",
            Dock = DockStyle.Fill,
        });
        spl2.Panel2.Controls.Add(new Button(){
            Text="Button on spl2.Panel2",
            Dock = DockStyle.Fill,
        });
    }
    
    [STAThread]
    static void Main(string[] args)
    {
        Application.Run(new SampleForm());
    }
}
```

# 参考サイト

- https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.splitcontainer?view=netframework-4.8
小学生がBASICのコードをMSXマガジンを見ながら写経した結果、何を得られたか

## 小学生のとき、BASICのコードをMSXマガジンを見ながら写経した話

時は三十うん年前。
スーパーマリオが大ブームとなり、ファミコンが一家に一台あたりまえみたいな時代となりました。
当然、私も欲しい！となったのですが、我が家の両親はゲームに理解がなく、泣いてお願いしても、必死にプレゼンしてみても、まったく買ってもらえませんでした（頑固だな！！）。

しかし、MSXだったらパソコンだから、なんか勉強になりそうだからいいよ、ということに（単なるイメージ！）。
なんでそんな一般的にはマニアックなものを知っていたかというと、姉の友人が2人ほど、なぜかMSXを持っていたのですね。うちと同じような両親だったなのかな。
結局買ってもらったのは、当時出たばかり（年齢がばれる）のSONYの定価32,800円HB-F1でした。カセット差し込むところが赤いやつ。

で、ドラクエ2とか悪魔城ドラキュラとか、ファミコンの倍の値段はするカセットをお小遣いやお年玉をやりくりして購入し、ファミコン代わりに楽しんでいました。

ある日、そのとき先に進めなくて詰まっていたゲームの攻略方法が載っていたので、雑誌「MSXマガジン」とやらを購入してみたんですね。
そしたら、読者が作成・投稿したゲームが掲載されていて、BASIC言語で書かれたコードが丸々載っていたのですよ。
RPGの楽しげなゲームが画面キャプチャとともに紹介されていて、ナニコレ、やってみたい！え、これ打ち込めば動くの？すごくない？

で、意味も分からず、コードを頑張って打ち込みました。
ひたすら打ち込みました。
来る日も来る日も打ち込みました。
（この時失敗したと今思うのは、まったくコードの意味とかを考えずに、ただひたすら打ち込んでいただけという点です）

RUNリターンする瞬間のドキドキといったらたまりませんでした（大概エラーだらけ）。
エラーをひとつひとつつぶしていくのも楽しかったです（ここで言うエラーは、ただのスぺルの打ち込みミス）。
何千行もあるコードなので、もちろん打ち間違いだらけで、結局まともに動かなかった記憶があります。

## 結果どうだったか

大事な子供時代に、この写経に膨大な時間を費やしましたが、結果得たものは、**タイピングスピードが早くなった**ってことだけ（それも１本指打法）！！
プログラミングについての知識はちっとも身に付きませんでした。

## プログラムの写経に大事なのは何か

**ソースコードの意味を考えながら行うこと**
なんですね。
あたりまえですが。

そもそも、当時はプログラムを勉強しようとしてやっていないわけで。
目的は「早くこのゲームをやってみたい！！」
むしろ考えることは時間の無駄、とばかりに、無心にただコードを打ち込むのみ！！

ただ、パソコンの青い画面に向かって英語書いてる自分かっこいい？みたいなのは感じていて、いつかこのコードを見ただけで何が書いてあるか分かりたいな、とは思っていました。
久しぶりにBASICのコードながめてみましたが、まぁ今だったら文法知らなくてもなんとなく分かりますね。成長してて良かった。

今の自分が小学生時代の自分にアドバイスするとしたら、**先に条件分岐やら繰り返しやらのプログラミングの概念を学んだほうがいい**ということ。
じゃないと、文法を知ったところで、概念がわかってないから行き詰ってしまいます。
Scratchなどの子供でも分かりやすいビジュアルプログラミングでそれらを学んでみて、それからBASIC等テキストプログラミングの写経をすれば、条件分岐はこういう風に書くんだーとか、あ、ここはリストだな、ふむふむ、などと、ただのまる写しでも思うところはあって、少しは身になったのかなと思います。
（あ、昔だからScratchなんかない...）

## まとめ

**１、写経はソースコードの意味を考えながら行うこと**
**２、写経の前にプログラミングの概念を学んだほうがいい**

でした。
備忘録　Ubuntu Linuxでcommand lineでC#を実行する。

以下のサイトを参考にさせていただきました。

https://stackoverflow.com/questions/20392243/run-c-sharp-code-on-linux-terminal/20392531#20392531


```
$sudo apt update
$sudo apt install mono-complete
```

ちょっとインストール時間かかります。

```
$vi hello.cs
```

```hello.cs
using System;
class HelloWorld {
  static void Main() {
    Console.WriteLine("Hello World!");
  }
}
```

```
$mcs -out:hello.exe hello.cs
$mono hello.exe
```



出力

```
Hello World!
```
Githubのデフォルトブランチがmainであることに気付かず、ローカルのブランチをmasterのままpushし、エラーが出たときの対処法


# 経緯
アプリケーション作成のためGithubにリモートリポジトリを作成し、ローカルのブランチ名を`master`にしてpushしました。Githubを確認するとプルリクの表示が出ていたので疑問に思って確認すると、Githubで作成されたデフォルトブランチが`main`になっていたことに気が付きました。調べてみると**2020年の10月からGithubにて作成されるデフォルトブランチが`main`になっている**ことが分かりました。

**今回、私と同じようにローカルブランチを`master`にしてpushし、プルリクの表示が出て以降進めず、どう対処すればよいか分からない方がいると思い記事を書こうと思いました**

**※記事にしようと思ったときにはマージまで終了してしまったので画像は少ないです！**

※10月からリポジトリのデフォルトブランチ名が`main`になるという情報は以下を参考にしています。
https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/

#原因
リモートリポジトリ作成時、デフォルトブランチが`main`になっていることを確認せずにローカルブランチを`master`のままpushしてしまったこと。

#実際に発生したこと
いつものようにpushまでしました。

```
$ git init
$ git add .
$ git commit -m "XXXXXXX"
$ git remote add origin https://github.com/YYYYYYY/test.git
$ git push origin master
```
ここでGithubを更新すると、`Compare & pull request`が表示されます。

通常であれば、`Compare & pull request`を押すと以下が表示されますが・・・

![スクリーンショット 2020-10-14 10.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544844/683a36be-df83-e83e-84fc-7c6c03bca70e.png)


今回は表示されませんでした。

今回の場合、`Conpare & pull request`押すと以下が表示されました。

```
There isn’t anything to compare. main and master are entirely different commit histories.
```

「mainとmasterは全く異なるコミットを持つので比較できません」という意味ですね。

関連性を構築できればうまくいくかもしれません。


#解決策

##mainとmasterを関連づける
```
$ git branch --set-upstream-to origin/master main　　　　　　　　　　　　　　　　　　　　 
```
master = (ローカルリポジトリのブランチ)
main = (リモートリポジトリのブランチ)

これでmainとmasterの関連性を構築できました。

あとは以下を行います。

```
$ git checkout master
$ git pull
$ git checkout main
$ git pull
$ git merge master
$ git push origin main
```

#補足
上記を行った際に以下が発生するかもしれません。

```
! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/maruuchi/health_care6.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

その際は以下の方法で対処しました。

```
$ git push -f origin main
```

これは強制的にpushを行うことです。あまり良い方法ではないかもしれませんが...

#追記
新たなアプリケーションを作成するため新しくリモートリポジトリを作成し、ブランチ名を`main`にしてローカルリポジトリのブランチ名を`master`にしてpushしたところエラーは発生せず、通常通りpushできました。原因は不明です。
Djangoでstaticフォルダから画像を読み込めなかった時の解決策

結論から言うと、再起動しただけです。
わざわざ投稿するほどのことでもないかもしれませんが、案外こういうところでハマることも多いのではないかと思ったので。

## 状況
djangoで、`myblogapp`というプロジェクト内で`posts`というアプリを作っていました。
この時に`static`ファイルを新しく追加して、画像を読み込ませようとしたときのことです。

myblogapp
　└posts
　　　├ templates
　　　｜　└ posts
　　　｜　　　└ index.html
　　　｜
　　　├ static　　　　　　　　⏋
　　　｜  └ posts　　　　　　　｜←ここを作って
　　　｜　　└ home.html　　　⏌
　　　｜
　　　｜
　　(views.py などその他は省略)


`index.html` の中で

```django
{% load static %}
<img src="{% static 'posts/home.jpg' %}" alt="home image">
```

と記述して画像を表示しようとした時のことです。

## 起こった問題
正しく指定したにも関わらず、画像が表示されずに
画像がないことを表すマークと「home image」という文字が表示されるだけで、
正しく画像が読み込まれませんでした。

djangoを起動しているシェル上の表示を見ると

```
[(日時)] "GET /static/posts/home.jpg HTTP/1.1" 404 1668
```
と表示されており、404を返していることから
ファイルの存在が認識されていないことが分かります。

## 解決策
一度djangoのサーバーを止めてから、再度`python manage.py runserver`を実行したら普通に読み込めました。
（正しくは、一度サーバーを止めて`python manage.py findstatic .`を実行し
`static`ディレクトリがちゃんと認識されているかを確認してから
`python manage.py runserver`を実行しました。）

どんなプログラムでも、
うまく動かないときはとりあえず再起動した方が良いということを
改めて実感しました...
【Java】com.sun.glass.WindowEventがimportされていてウインドウが閉じない

#開発環境
IDE: Eclipse photon 4.8
MacBook: Catalina 10.15.7
言語: java8

#閉じるボタンでウインドウを閉じるためのコード

```java
		addWindowListener(new WindowAdapter() {
//			@SuppressWarnings("unused")
			public void windowClosing (WindowEvent e) {
				dispose();
				System.exit(0);
			}
		});
```

`@SuppressWarnings("unused")`のところは、Eclipseが提案してきたコメント。これを挿入すればエラーは表示されなくなったけど、`使用していないよと明示してJVMに教えたげてるので、使われていない変数があってもエラーとして認識しなくてもいいよ。書いた人もわかっているよ`ということでエラーを表示させなくするためのコメント。

つまり、解決してないってこと！

当然、ウインドウを閉じることはできない。でも教材通りに書いてるつもりなんだけど。


#Eclipseに頼ってたらちゃんと理解できない

```java
// この部分でエラーが発生
public void windowClosing (WindowEvent e) {
```

Eclipseのエディターには`com.sun.glass.events.WindowEventをインポートする`っていう提案が一番上に出てきたので、import文を追加しました。

```java
import com.sun.glass.events.WindowEvent;
```
**これが元凶でした。**

次に表示されたエラーが
`型 new WindowAdapter(){} からのメソッド windowClosing(WindowEvent) はローカルで使用されません`

Eclipseの言われた通りに修正したのにあかんやん。どゆこと？

上のエラーを簡単に言ったら`メソッドの使い方がちゃうよ`ってことだけど、、、なんでEclipseの言った通りにやったのにさ、解決してへんやんって感じでした。

そこから次のようなコメントを挿入することが提案される

```java
@SuppressWarnings("unused")
```

いや、これって、使ってないよって話じゃん。。。

んで教材をみて、サンプルと比較しても該当する部分は完全に一致しているように見える。サンプルの該当部分をコピペして貼り付けても同じエラーが起こるので、スペルミスや、見えないコードが混じり込んでいることも考えられないし。。。。

というのでどんどん沼にハマって行きました。。。。



#同じ名前のクラスが異なるパッケージに複数ある
また最初のエラーが出ている状態のコードに戻して、Eclipseに表示される提案部分を確認したら、スクロールして下の方にも別の提案がありました。

そこに`java.awt.Eventをインポートする`っていうような提案がありました。

ひょっとしてそれじゃねぇのか？って思ったらビンゴでした。

経験が浅いと`Eclipseの一番上に出てくる提案部分を採用して修正すればいいんじゃないか`と思っていたのが間違い。だめ絶対。

####結局インポート文が間違っていた

```java
import java.awt.Event;
```

とすれば一瞬で解決しました。


#じゃあcom.sun.glass.WindowEventはなんなの？

![micromagic_ouyou_src_myApp_BufferedStream_java_-__Users_onoharamakoto_Desktop_work_java_-_Eclipse_IDE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/b8c5e58a-6e80-a5c6-aa1b-b82606d673eb.png)

ここにありました。違うパッケージにあるんですね。ややこしい。


結局これでめっちゃ時間がかかってしまった。。。。


#2時間くらいかかったけど実りはあったかなと

####エラーの解決手順が身についた？
これは自分で思っていることですけど、

1. Eclipseに頼りっきりにしない
2. 公式ドキュメントを確認する
3. ググってみて英語のページしかでてこないけど、ちゃんと読む
4. JREライブラリを確認するようになった
5. スペルミス以外のミスの経験が得られた
6. 自分で解決した経験が得られた

たかだかインポート文が間違っていたというしょうもないミスだったのに2時間くらいかかってしまったのはアホらしいですけど、こういう経験が身になるのかなと信じています。

基本的にはエラーは自分で解決できていますが、やっぱり同様のエラーが出てきた時には教えてもらったことよりも解決するのが断然早い。

そして、なんとなくエラー解決の手順が自分なりに形になってくるので、新しいエラーに関しても手順自体は生かせるかなと感じました。
初心者向け勉強会ではもしかしたら主催者は「無能」を装ったほうが良いのではないかという話

初心者向け勉強会を主催して思ったことを書く。

今回の記事は、「小規模な初心者向けオンライン勉強会ではもしかしたら主催者は「無能」を装ったほうが良いのでは」という話である。今回のは初心者向けで当てはまることで、なれた人向けの勉強会では当てはまらない。

ここで注意するべきは、「無能」を装う必要があるのは主催者のみで、参加者はそうでもない。参加者は無理して無能を装う必要はない。理由は参加者は主催者ほど注目が集まらないからだ。参加者にそこまで強制できないしする必要もない。
あと主催者は持ってる権限が結構強い。それで技術力が高いと「最強」になって誰も近づかなくなる。なので、技術力が低い人が主催して技術力高い人を呼び寄せて「対等」にする。これはなれた人向けの勉強会になる。

何度も小規模なオンライン勉強会を開いて思ったのが、勉強会は技術的なものになればなるほど、「力比べ」的な要素がやっぱり出てしまう。いくらそういう競争的な要素を排除しようとしても難しい。いくら点数やランクをつけていなくても、「自分ではコードを走らせられなかったが、相手のアドバイスで走らせられた」というので優劣が出てしまう。

マウンティング発言をしようがしまいが関係ない。

もしも、勉強会の「力比べ」的な要素を排除できないとするなら、例えてみれば、普通の技術者は一日のほとんどの時間を「技術作業」に費やしている。つまり、技術能力では一日中トレーニングしているアスリートみたいなものだ。

逆に初心者は子供に近い。いずれは成長するが、現時点では力はあんまりない。

普通、子供と力比べをするアスリートは普通は「手加減」をする。それは当たり前すぎる話であって、今さら言うこともない。自分の子供だろうが、他人の子供だろうが普通は手加減をする。
しかし、オンライン勉強会で「手加減」をする主催者はあんまりいない。

例えば、Q&Aサイトみたいに「正解そのものが必要」となると、「手加減」は特に必要なくて、正解そのものを言えばいい。

普通の技術者は、やはりかなりキャリアが長いので、「プログラミングに対するカン」みたいなものが醸成されていたりする。説明するまでもなく、「こうやればコードは動く」みたいなものだ。

問題は、勉強会において「初心者がいろいろ動かせない」時に、正解そのものを言うと、確かにコードは動く。だが、「プログラミングに対するカン」みたいなもの（メンタルモデルとも言う）を初心者の中で育てるためには、実はちょっとそれだとまずいのではと思ったりする。問題は「キャリアのある技術者のカン」が正しすぎるということだ。

つまり、そこで主催者がするべきは「無能を装う」ことなのではと思う。つまり、わかることでも「よくわからない」と言う。あえてどういうロジックで結論に至るかを考えて、時間をかける。直感で分かることでも、勉強会で読んだ本の中に「答え」を見つけようとする。あえて難しく考える。回り道をする。あんまり喋らない。

相手の該当分野の技術能力やキャリアがどれぐらいかがだいたい分かったら、それに合わせる。

こういう「無能を装う」という戦略は講義やお金を取った家庭教師では恐らくダメだと思うが、勉強会では意外と有効な戦略なのではと思う。

もちろん相手がそれなりに技術力も自信もある人なら手加減は必要ないと思う。むしろぼやっとしてると負けるので、ちょっと自分にプレッシャーがかかっていいかも。

この戦略のもう一つの利点は、無能を装うと宣言して無能を装うと、本当に無能なのがバレないということだ。

必要なことは、プログラミングに対する「自信」のようなものをつけさせることだ。

追記
もちろんセキュリティ的にまずいことになりそうな場合は正解をすぐ言ったほうがいいかもしれない。

追記
初心者向き勉強会を開いても金銭的にはまったく得をしないし、その他の付随的な利益もないです。僕は無能なので得しないのはいいが、他にやる人がなかなかいないというのも問題かなと。特に初心者向き。
人工知能の基礎知識 そもそも人工知能って何？

# はじめに
この記事は、筆者が人工知能・機械学習・ディープラーニングについて勉強した知識をまとめてアウトプットしようという試みです。
随時更新していく予定です。

2020年10月現在の知識を元にしていること、誤りの可能性があることをご留意ください。
誤りがあれば編集リクエストをいただけると幸いです。

# 人工知能とは
## 人工知能の定義はあいまい
人工知能（Artificial Intelligence）という言葉については、研究者ですら正確な定義を示せていません。

__「人工」とはなにか？人と機械の違いとは？__
__「知能」とはなにか？何を持って知能と言うのか？__

をまず定義しないといけないため、人工知能という言葉の定義は容易ではありません。

Wikipediaでは以下のように定義されています。

>人工知能（じんこうちのう、英: artificial intelligence、AI〈エーアイ〉）とは、「『計算（computation）』という概念と『コンピュータ（computer）』という道具を用いて『知能』を研究する計算機科学（computer science）の一分野」を指す語[1]。「言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術」[2]、または、「計算機（コンピュータ）による知的な情報処理システムの設計や実現に関する研究分野」ともされる[3]。

>「[人工知能](https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD)」（2020年10月17日 (土) 10:00　UTC）『ウィキペディア日本語版』。

とりあえず「人間と同じような知的処理を行う機械やその技術」くらいの認識で良いと思います。

## 人工知能の分類
### 「強い人工知能」と「弱い人工知能」
哲学者ジョン・サールによって作られた言葉。
人工知能は__「強い人工知能」__と__「弱い人工知能」__にざっくり分類できるとされています。

#### 強い人工知能
人間の知能そのものを模倣し、同じような認知状態を持った機械のこと。
__人間と同じように考え、自律的に行動することができる__もの。

具体的に言ってしまうと__「ドラえもん」__や__「ターミネーター」__のようなもの。
最近だと仮面ライダー01のイズのようなヒューマギアも強い人工知能に含まれます。
彼らはいわゆる__「そういうふうにプログラムされているだけ」__の域を超えており、自律的に行動しますよね。

しかしお察しの通り強い人工知能は現状フィクションの存在で、現実にはまだ存在していません。~~キズナアイ？なんのことやら・・・。~~
機械の計算能力と人間の知能を持った強いAIは人間を超え__シンギュラリティ__をもたらすと言われています。
※シンギュラリティの定義についても諸説ありますが、本記事では「人間を超えたAIが自身より優秀なAIを生み出せるようになること」という解釈をしています。

#### 弱い人工知能
人間の行動を模倣し、能力の一部を代替する機械のこと。
あくまで__模倣し、知能があるように振る舞っているだけ__で、考えは持たず自律的に行動したりはできません。

具体的にはGoogleが開発した囲碁AIプログラム__「Alpha Go」__やAppleが開発した自然言語処理プログラム__「Siri」__などが挙げられます。
これらは__「そういうふうにプログラムされているだけ」__の域にとどまっており、自律的な行動はできません。
しているように見えても、__「そういうふうにプログラムされているだけ」__です。

こちらは当然実在しており、実用化されているものも多いです。
また、上記のAlpha Goのように__部分的には人間の能力を超えた人工知能は既に存在しています。__


### 「汎用型人工知能」と「特化型人工知能」
#### 汎用型人工知能
人間と同じようにさまざまな課題の処理が可能な人工知能。
想定外の出来事が起こった場合でも、経験に基づいて総合的に判断を行い、問題を解決できる能力がある。

#### 特化型人工知能
特定のタスクに特化した人工知能。
想定外の出来事に対応することはできない。
<br>

着目点こそ異なりますが、
__汎用型人工知能 ≒ 強い人工知能__
__特化型人工知能 ≒ 弱い人工知能__
と考えることができます。

# まとめ
- 人工知能の定義は実ははっきり定まっていない
- 知能に着目した分類として「強い人工知能」と「弱い人工知能」がある
- 分野に着目した分類として「汎用型人工知能」と「特化型人工知能」がある
- 皆が思うような（ドラえもんのような）強い人工知能はまだまだ先の話
- 逆に、部分的に人間を超えた人工知能は既にできている


# 参考
## 書籍
株式会社アイデミー　山口達輝・松田洋之，機械学習＆ディープラーニングの仕組みと技術がこれ一冊でしっかりわかる教科書，技術評論社，2019.

松尾 豊, 人工知能は人間を超えるか, KADOKAWA, 2015

## Web
人工知能に関する「よくある10の誤解」──すごい人工知能はまだ存在しない | IBM THINK
https://www.ibm.com/think/jp-ja/business/ten-misunderstandings-about-ai/ 

強いAIと弱いAIとは | 定義と種類、汎用型と特化型AIの違いを解説 | Ledge.ai
https://ledge.ai/strong-ai/

## 動画
AIcia Solid Project, “【AIってなんだ？】強いAIと弱いAIのお話【人間ってなんだ？】 #002” Online video. YouTube, 2018/07/01. Web. 2020/10/17
https://youtu.be/AVZseiYndKc
Gitのリモートリポジトリにpushしてしまった機密データを削除する

## はじめに

リモートリポジトリから機密データを削除する際に調べたことを備忘のためにまとめます。

- 参考にしたGitHubのヘルプページ：[機密データをリポジトリから削除する](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/removing-sensitive-data-from-a-repository)
- Gitのドキュメント https://git-scm.com/book/ja/v2 を引いて、普段使わないコマンドで何をやっているか確認しながら進めました

## 前提

- Git version: 2.26.1
- トランクベース開発のため、masterブランチのみが作業対象でした（他のブランチも対象にする場合は未検証です）
- タグは使っていなかったので、タグ周りのコマンドは省略しています（→上のGitHubヘルプページが参考になると思います）

## 手順

1. 手順確認用のブランチでリハーサルする
2. 他のブランチで実行する

### A.手元のローカルリポジトリでの作業

```console
# 機密データが含まれているコミットを確認
$ git log -- ファイル名

# 機密データをリポジトリから削除（全ブランチの場合は--allを指定すると思われる）
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch 機密データを含むファイルへのパス" \
  --prune-empty

# 先のgit logコマンドで機密データを含むコミットがないことが確認できる

# 以下は2.他のブランチでの作業の中で実行
# リモートリポジトリのブランチを上書き（--all指定により全ブランチを上書き）
git push origin --force --all
```

### B.他の開発者の手元のリポジトリでの作業

リモートリポジトリのブランチを上書きした後の作業。
ローカルにリモートリポジトリを強制的にpullする。

```console
# 前提: カレントブランチはmaster

# リモートのmasterブランチをフェッチ
git fetch origin master
# ローカルリポジトリのインデックスと作業ディレクトリにある変更がなくなるので注意
git reset --hard origin/master
```

参考

- https://stackoverflow.com/a/1628334
- [git pull を強制し、リモートでローカルを上書きする方法](http://www-creators.com/archives/1097)

## コマンド調査事項メモ

### `git log`

[2.3 Git の基本 - コミット履歴の閲覧](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)

>最後に紹介する git log のフィルタリング用オプションは、パスです。 ディレクトリ名あるいはファイル名を指定すると、それを変更したコミットのみが対象となります。 このオプションは常に最後に指定し、一般にダブルダッシュ (--) の後に記述します。 

### `git filter-branch`

https://git-scm.com/docs/git-filter-branch#_examples

`git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD`

- `--index-filter`と`git rm`の組合せは`tree-filter`と`rm`より速い
- `--force`：`refs/original/`で始まるrefがあったり、一時ディレクトリで開始したりすることを拒否しないようにする指定
- `--prune-empty`：filter-branchによりできる空のコミットを削除（枝刈り）する指定

### `git rm`

https://git-scm.com/docs/git-rm

- `--cached`：インデックスからのみアンステージし、削除する指定
- `--ignore-unmatch`：1つもファイルが一致しなかったとしてもステータスコード0（正常終了）で終了する指定
- `--dry-run`あり

### `git push`

[3.5 Git のブランチ機能 - リモートブランチ](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)

### `git fetch origin master`

ローカルリポジトリの**リモート追跡ブランチ**を更新。

リモート追跡ブランチは以下の記事が分かりやすかったです。
[【Git】リモートからの取得とリモートへの反映で行っていること(fetch,pull,push)](https://qiita.com/forest1/items/db5ac003d310449743ca)

### `git reset --hard`

現在のブランチの内容を、リモート追跡ブランチ（ここでは`origin/master`）と同じにしている。

[7.7 Git のさまざまなツール - リセットコマンド詳説](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A9%B3%E8%AA%AC)

`--hard`は「HEAD が指し示すブランチを移動」し、「インデックスの内容を HEAD と同じに」し、「作業ディレクトリの内容をインデックスと同じにする」
→インデックスと作業ディレクトリの変更はなくなる

## 所感

`filter-branch`コマンドで機密データを削除できました。
ただ、変更したmasterブランチのpullを開発者全員にお願いする必要がありました。
小さなチームでもこれは大変でした。
なので、`filter-branch`コマンドは本当に最終手段で、機密データをpushしないようにする手段を整えていくのがよさそうです。

以上です。
【React】 合成イベント（SyntheticEvent） を利用する時注意点


###Reactの合成イベント（SyntheticEvent ）特性
1. ブラウザのイベントハンドラーとReactのSyntheticEvent は別である
2. SyntheticEventはPullingされる。
3. SyntheticEvent再使用される。
4. 全ての属性は呼び出し後に初期化される。



###実際にエラーを作てみましょう


```js

export default function App() {
  const syntheticEvent = (event) => { // 1.全ての属性は呼び出し後に初期化される。

    setTimeout(() => {. 
      console.log(event.target.value); //2. 非同期でevent.target.valueを呼ぶと警告が発生する！！
    }, 1000);
  };

  return (
    <div className="App">
      <input type="text" onChange={syntheticEvent} />
    </div>
  );
}

```

##警告発生

> Warning: This synthetic event is reused for performance reasons. If you're seeing this, you're accessing the property >`target` on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event >around, use event.persist(). See https://fb.me/react-event-pooling for more information.

### 解決方法

#####1. event.persist()を追加する

```js

export default function App() {
  const syntheticEvent = (event) => { 
     event.persist() // 1. 警告が書いているメソッドを追加 
    setTimeout(() => {
      console.log(event.target.value);
    }, 1000);
  };

  return (
    <div className="App">
      <input type="text" onChange={syntheticEvent} />
    </div>
  );
}

```

> 補足
> 非同期処理の中でイベントのプロパティにアクセスしたい場合は、event.persist() をイベント> 内で呼び出す必要があります。これにより、合成イベントがイベントプールの対象から除外され、イベントへの参照をコードで保持できるようになります。

上のreactドキュメントはevent.persist()を利用する場合。
①. 合成イベントがイベントプールから除外される。
②. ①の理由で呼び出し後に初期化されない。
③. ②の理由で非同期の内部でもevet.target.valueの値が利用できる

event.persist()を利用する事は上の①の理由でオススメしない。

####2. event.target.valueの値をPrimitive(プリミティブ)値で取得
```js

export default function App() {
  const syntheticEvent = (event) => { 
    const value = event.target.value // 1.primitive値で取得 
    setTimeout(() => {
      console.log(value);  //2.警告は発生しない値を表示
    }, 1000);
  };

  return (
    <div className="App">
      <input type="text" onChange={syntheticEvent} />
    </div>
  );
}

```
この方法でする事をオススメします。
合成イヴェントを除外しなくても利用できます。

### 結論
Reactの合成イベントを利用する時は非同期処理について注意が必要
setStateなども非同期で処理するので注意！

参考記事
https://ja.reactjs.org/docs/events.html#gatsby-focus-wrapper
ServiceNow - 部下を表示させる

#概要
指定されたユーザの部下一覧を表示させるフォームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d924f592-bf40-a3dc-7195-d31e44015121.png)

#フォームの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/5e21563d-b5e4-d07d-db5f-1bb6087ec7f9.png)

##マネージャー変数の定義

![employeeList_form_manager_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c6de9107-b55e-31ab-1f5d-3c3f2abb08f9.png)

![employeeList_form_manager_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/57f691b9-0359-3a38-1ff8-5b7c79084ed9.png)

##部下一覧変数の定義

![employeeList_form_members_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/001e63ff-3696-f46b-d4be-6cef3c6498a2.png)

![employeeList_form_members_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/95725384-7cfb-08b7-158b-39639d96874d.png)


#スクリプトの作成
##スクリプトインクルード

```
var SC_User_Funcs_Ajax = Class.create();
SC_User_Funcs_Ajax.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getReportingHierarchy: function() {

        var hierarchy = [];
        var manager_sys_id = this.getParameter("sysparam_manager_sys_id");

        _runLoopReportingHierarchy(manager_sys_id);
        return hierarchy.toString();

        function _runLoopReportingHierarchy(manager_sys_id) {
            var gr = new GlideRecord('sys_user');
            gr.addQuery('manager', manager_sys_id);
            gr.query();
            while (gr.next()) {
                if (hierarchy.indexOf(gr.sys_id.toString()) == -1) {
                    hierarchy.push(gr.sys_id.toString());
                    _runLoopReportingHierarchy(gr.sys_id);
                }
            }
        }

    },
    type: 'SC_User_Funcs_Ajax '
});
```
##クライアントスクリプト

```
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var ajax = new GlideAjax('SC_User_Funcs_Ajax');
    ajax.addParam('sysparm_name', 'getReportingHierarchy');
    ajax.addParam('sysparam_manager_sys_id', newValue);
    ajax.getXML(addMembers);
}

function addMembers(response) {
    g_form.clearOptions('members');
    var answer = response.responseXML.documentElement.getAttribute("answer");
	g_form.setValue('members', answer);
}
```

以上
WVDでFFベンチしてみた

Windows Virtual Desktop (WVD)でGPUを使った性能の確認に、ネットで数多くの報告事例があり、比較対象にしやすいファイナルファンタジーのベンチマークを使って計測してみました。

### 注意
- WVDのセッションホスト単体の性能です。レスポンスを含めたGPUワークステーションの使い勝手の参考にはなりません。
- 「ファイナルファンタジー ベンチマークでは」、というあくまで参考値です。CAD等別のアプリケーションでは違った特性を示す場合があります。

# 環境
- Azure 東日本リージョン
- Standard NV6_Promo (6 vcpu 数、56 GiB メモリ) : NVIDIA Tesla M60
- Windows 10 multi-session Version 2004 : 日本語言語パック適用

# 計測
- 1セッションホストを、1仮想デスクトップで使っている場合
- 1セッションホストを、2つの仮想アプリケーションで同時に使っている場合

2つの仮想アプリケーションで同時に使う場合、DirectX 11を使っているという[Unigine Heaven Benchmark](https://benchmark.unigine.com/heaven)を裏で動かしています。
ファイナルファンタジーのベンチマークは、起動したデフォルト設定をそのまま利用しています。ウインドウモードで計測していますが、フルスクリーン、仮想フルスクリーン(ボーダーレス)でも大差ありませんでした。実際にWVD環境で利用するには、フルスクリーンモード設定だときちんと全画面表示できないので、仮想フルスクリーン(ボーダレス)を選択することが多いと思います。

# [FINAL FANTASY XV WINDOWS EDITION ベンチマーク](http://benchmark.finalfantasyxv.com/jp/)
- 1仮想デスクトップ
![FFXV-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/a8932bc7-4198-5228-e3fd-041b7605afd4.png)
- RemoteAppによる仮想アプリケーション (同じホストで2つのアプリがGPU利用)
![FFXV-RemoteApp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/41b4c9ff-42ce-cb5f-79e0-b4eb8936e4e2.png)


# [ファイナルファンタジーXIV: 漆黒のヴィランズ ベンチマーク](https://jp.finalfantasyxiv.com/benchmark/)
- 1仮想デスクトップ
![FFXIV-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/a12acfcc-8cc7-6324-e79b-2786ea37a042.png)
- RemoteAppによる仮想アプリケーション (同じホストで2つのアプリがGPU利用)
この環境では、ベンチマークを実行しようとするとセッションが切れてしまい計測できませんでした。

# 付加情報
複数動かす場合、裏で動かしているUnigine Heaven Benchmarkのfpsが1/2近くになりました。
200fps出たりする環境ですが、このスナップショットの右上に、ファイナルファンタジーのベンチマークを同時に動かしているときのfpsが表示されています。
![Heaven Benchmark-focus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/0a0a6121-4204-1e5e-07cd-547f49788ec5.png)
セッションホストの性能ではありませんが、ファイナルファンタジーXIV: 漆黒のヴィランズ ベンチマークで画面変化が広範囲に速い場合、クライアントに対して下記のようなトラフィックを出すことがありました。これはあくまで特徴的な瞬間をスナップショットしただけですが、これ以上になることは目測では計測されませんでした。
![FFXIV-bandwidth - 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/470f2a3b-e396-8f47-60be-15b4c89ad064.png)

# 参考
- [Azure Academy: WVD GPU Powered VMs | Windows Virtual Desktop #14](https://www.youtube.com/watch?v=IiRyc26_lds)
- [Windows を実行している N シリーズ VM に NVIDIA GPU ドライバーをインストールする](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/n-series-driver-setup)
- [Windows Virtual Desktop 用にグラフィックス処理装置 (GPU) のアクセラレーションを構成する](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/configure-vm-gpu)
未経験がポートフォリオで使ったReactライブラリ(その3)

## まえがき
業務でReactを触る機会が出てきそうなので、復習のため、以前作ったポートフォリオを個人的に振り返ります。

フロントエンド
https://github.com/momonoki1990/house_work_memo_front
バックエンド(Express)
https://github.com/momonoki1990/house_work_memo_back

サービス
https://house-work-memo-front.herokuapp.com/
(Herokuのフリープランで定期モニタリングも解除したので、起動がめちゃ遅いです(1分くらい?))
(表示が変な場合は、バックエンドの起動に時間がかかっています。そのままお待ちいただくと表示されます)

前回
未経験がポートフォリオで使ったReactライブラリ(その1)
https://qiita.com/momonoki1990/items/a1edd4fa922cd3ed3b14
未経験がポートフォリオで使ったReactライブラリ(その2)
https://qiita.com/momonoki1990/items/49f490378c724daaaf68

## React Router関連

```
react-router-dom connected-react-router @types/react-router-dom
```

react-router-dom
>SPAでは全てのアクセスはindex.htmlにリダイレクトされます。
その為、サーバーサイドではなくクライアントサイド（Webアプリ側）でルーティングできます。
２時間で作れる簡単フォーラムWebアプリ！
https://www.techpit.jp/courses/20/curriculums/21/sections/184/parts/663

Reactでページを切り替える(「遷移」といっていいんだろうか..)ために使います。
react-routerとreact-router-domがあり、迷いましたが、

>結論
迷わずreact-router-domを使おう。
react-routerとreact-router-domの違い
https://qiita.com/koja1234/items/486f7396ed9c2568b235

とのことで、react-router-domを使いました。

connected-react-router
>SPA（Single Page Application）は、描画されるコンポーネントが変わって画面が遷移したように見えてもURLは変わっていません。
なので、ユーザーはブラウザの「戻るボタン」を押しても前の画面に戻れないのですね。
ページ遷移なしで画面がヌルッと切り替わることがSPAのメリットであると同時に、ブラウザの「戻るボタン」を使えないのはユーザービリティを下げかねないですよね。
そこでconnected-react-routerを使って、SPAだけどURLルーティングを実装します。
connected-react-routerでSPAの描画をURLで切り替える
https://tech.playground.style/javascript/connected-react-router/

URLルーティングを実装するために使います。
文字だけで書いてるとわかりづらいですが、react-router-domだけだと、表示するページが変わっても、URLは変わらないし、「戻る」「進む」ボタンも使えないんですね。
connected-react-routerを使うと、react-routerによるルーティングの状態をReduxで管理できるようになります。
具体的には、表示されるページが切り替わるとURLが変わり、「戻る」「進む」ボタンが使えるようになります。

## Redux Logger

```
redux-logger @types/redux-logger
```

>redux-loggerは数あるredux middlewareの中で一番知られているものではないでしょうか。
(中略)
ActionがDispatchされる前後のstateとDispatchされたActionをconsole上に出力します。
意図したActionが発動しているか、その前後で期待したstateの変更が意図した通りに行われているかどうか
確認するためにはとても有用です。
redux-loggerの導入とオススメのLog出力設定の紹介
https://qiita.com/tatapopo/items/3bdf2f3132948e3d75e3

上で説明されているとおりですが、ActionをDispatchする(Reduxのstateを変更する)前後のstateの中身が見えるようになるので、便利です。
使うのも、基本的にReduxのStoreを作成する際に、applyMiddlewareに噛ませるだけなので、簡単です。

## あとがき
以上です。復習のためまとめてみましたが、いろんな方の記事の切り貼りになってしまいました。
でも、それでいいのか！
curl: (77) error setting certificate verify locations: CAfile: ~/anaconda3/ssl/cacert.pem CApath: none の対処法

# 概要
RVMをインストールする際に `\curl -sSL https://get.rvm.io | bash -s stable`を実行したところ、
次のようなエラーが出た。

```
curl: (77) error setting certificate verify locations: 
CAfile: ~/anaconda3/ssl/cacert.pem 
CApath: none
```

# 対処法
以下の処理を実行する。

```
conda update curl
conda install ca-certificates
```

以上です。
Git hub でcloneしようとすると「fatal: destination path '　' already exists and is not an empty directory.」際の対応方法

```
% git clone git@github.com:ochun0116/saku202010.git
```
でcloneしようとしたところ、
`fatal: destination path 'saku202010' already exists and is not an empty directory.
`
と表記が出てしまいました。
「cloneするときは空っぽのフォルダにしてくれ！」

ってことらしく、対応はチェンジディレクトリして、そのフォルダがあるところでやるらしいです。

すなわち

```
% cd ../
```
```
% rm -fr saku202010
```
```
% git clone git@github.com:ochun0116/saku202010.git
```
です。
![スクリーンショット 2020-10-17 12.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/2b42bcfe-de07-69de-b93b-0737fa5a84f6.png)


できました！
Font Awesomの使い方

##はじめに
Font Awesomeの使用方法をメモしておきます。
(バージョンはFontAwesome6)

##Font Awesomに登録
<a href="https://fontawesome.com/">Font Awesom</a>にて、登録 or ログイン。

##HTMLファイルの<head>タグ内にFont Awesomeの読み込みを記述
FontAwesomeホームページの右上のアイコンから```Your Kits```にアクセスし、発行済みのKitをクリックすると、

```html
<script src="https://kit.fontawesome.com/[ユーザーによって違います].js" crossorigin="anonymous"></script>
```

上記のようなscriptタグが表示されるので、コピーしてHTMLファイルのheadタグ内に記述する。
##アイコンを表示させたい位置に記述
ホームページ内の```Icons```にアクセスすると、使用可能なアイコンが全て表示される。
（有料登録でないと使用できないものも有り）
使用したいアイコンをクリックし、```Start Using This Icon```をクリックするとアイコンのコードが表示されるので、コピーして表示したい部分に貼り付ける。

##アイコンのサイズ指定
アイコンのサイズ指定の方法は```fa-[サイズ]```を指定するだけ。

```html:
//サイズで指定
<i class="fas fa-[アイコンの名前] fa-xs"></i>
<i class="fas fa-[アイコンの名前] fa-sm"></i>
<i class="fas fa-[アイコンの名前] fa-lg"></i>

//数字で細かく指定(1~10)
<i class="fas fa-[アイコンの名前] fa-1x"></i>
<i class="fas fa-[アイコンの名前] fa-2x"></i>
                   .
                   .
                   .
<i class="fas fa-[アイコンの名前] fa-9x"></i>
<i class="fas fa-[アイコンの名前] fa-10x"></i>
```

##アイコンの向きを変更

```html
//90°回転（右周り）
<i class="fas fa-[アイコンの名前] fa-rotate-90"></i>

//180°回転
<i class="fas fa-[アイコンの名前] fa-rotate-180"></i>

//270°回転
<i class="fas fa-[アイコンの名前] fa-rotate-270"></i>

//反転
<i class="fas fa-[アイコンの名前] fa-flip-horizontal"></i>

//ぐるぐる回転
<i class="fas fa-[アイコンの名前] fa-spin"></i>

```

##参考記事
><a href="https://ayaito.net/webtips/other/16628/">アイコンフォントFont Awesome 6の使い方・向きやサイズ、動き設定</a>
LaravelのアプリをLaravelのバージョンを指定して作成する

# 目的

- Laravelアプリを作成する最にバージョンを指定して作成する方法をまとめる

# 実施環境

- ハードウェア環境

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

- ソフトウェア環境

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

# 方法

1. Laravelアプリを作成したい環境で下記コマンドを実行する。コマンドは二通り存在する。
    - その1    

        ```terminal
        $ composer create-project "laravel/laravel=バージョン" アプリ名
        ```
    - その2
  
        ```terminal
        $ composer create-project --prefer-dist laravel/laravel アプリ名 "バージョン"
        ```
1. 例えばLaravel6の最も新しいバージョンで作成したいときは下記のようにして実行する。
    - その1

        ```terminal
        $ composer create-project "laravel/laravel=6.*" アプリ名
        ```
    - その2

        ```terminal
        $ composer create-project --prefer-dist laravel/laravel アプリ名 "6.*"
        ```
1. ~~Authによる認証機能をもたせたい場合はアプリファイル作成後アプリ名ディレクトリに移動して下記コマンドを実行し認証に必要なファイルを作成する。~~ （各バージョンによりAuth認証の実装方法は異なるため、下記は参考にならない）

    ```terminal
    $ composer require laravel/ui "^1.0" --dev
    $ php artisan ui vue --auth
    ```
Rails zshを使った環境変数 設定の仕方と記述方法

Google Map API を使用中自分で取得したAPIをそのまま記述してGit Hubのpushしてしまいました。
するとGit Hubからこんなメールが…
*GitGuardian has detected the following Google Key exposed within your GitHub account.*
**GitGuardian は、あなたの GitHub アカウント内で公開されている以下の Google キーを検出しました。**
素晴らしい！GitHubはこんなことまでしてくれるのだと感動しました。
感動している場合ではないのですぐ環境変数に入れて記述を変えようといろいろ調べたので共有させてください

##環境変数とは何か
#####見せたくないものを隠す変数…といったイメージで良いと思います
そして環境変数を設定できるものはたくさんあるのでご自身で良いものを探してみてください！
私の場合は**zsh**を使って環境変数をし設定していきます
#####zshは自称「最強」のシェルらしいです

##Zshのインストール方法
[初心者向け：Zshの導入](https://qiita.com/iwaseasahi/items/a2b00b65ebd06785b443)
こちらの記事がとてもわかりやすかったです！
こちらの記事からZshをインストールしてきてください

##Zshを使った環境変数の設定の仕方

```
% vim ~/.zshrc
```
で.zsherを開きます
すると
![スクリーンショット 2020-10-17 12.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694122/9274826b-18ef-4776-915a-cf4362f1cb2e.png)
こんな画面になっていると思います
自分はすでにいろいろ設定しているので記述されている内容が多いですが無視してください
**この画面が開いたらとりあえず「i」を入力してください**
左下に

```
-- INSERT--
```
と出ていると思いますこれを**インサートモード**と言います
入力ができるようになるので

```
export 使いたい変数名='隠したい値' # イコールにはスペースを入れないように気をつけてください
```
例

```
export GOOGLE_MAP_API='hoge'
```
このように記述すれば設定完了です

インサートモードを抜けるコマンドは**escキー**抜けれます抜けた後
設定を保存する際は**「:wq」**
保存しないときは**「:q!」**
で終了してください

その後
.zshrcを再読み込みし、定義した環境変数を有効にします

```
source ~/.zshrc
```
で環境変数の設定は終わりです。

##設定した環境変数の使い方
基本的には

```
ENV['設定した環境変数']
```
と使います
APIを使用したりしてAPI KEYをviewに記述するときは

```
<%= ENV['設置した環境変数'] %>
```
と記述します
以上になります！
フォトショップでYouTube用のサムネ画像を作る方法

![ldkwqmdlkq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/d789f01d-d8be-9cd8-bb45-d47a607c7cf7.png)

## YouTube公式ヘルプ


>
画像サイズ: 2 MB 以下
アスペクト比: できるだけ 16:9 を使用する（YouTube プレーヤーやプレビューで最もよく使われるため）

## フォトショでアスペクト比16:9にする方法

切り取りツール選択

![mdklqwmlkdq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/90e15dad-d97f-70ea-4ab7-d0c3a7b2834e.png)

右クリックでアスペクト比率を選択

![d；qlw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/c05888f9-62e8-3b56-e985-40c383d7a20b.png)

画像の位置を調整

![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/15d3f249-2409-bd24-fe39-90b172c5f049.png)

## 画像のサイズを2m以下にする方法

イメージ => 画像解像度

を選択

![d,l;qwdq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/9e8d4381-b666-5891-641d-54bea364496f.png)


ここら辺を良い感じにいじればok

![pppp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/2998ebe6-d2c7-3b6f-1e43-006d73c92158.png)



##成功するとこんな感じになる

できたー！٩( 'ω' )و

![dkpqw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/55adc118-61c2-5460-2afe-70996797b04e.png)


## ちゃんとサムネ作らないと、失敗するとこんな感じになるw


悲しいm(_ _)m

![kkk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/776af4df-346f-e327-fd4a-2eba61c2fe5d.png)
scikit-learn を用いたロバスト線形回帰

# 概要
Python の機械学習ライブラリー [sckit-learn](https://scikit-learn.org/stable/index.html) を用いた、ロバスト線形回帰の描画方法を紹介する。本稿では、python の描画ライブラリ [altair](https://altair-viz.github.io/gallery/index.html) でチャートオブジェクトを作成し、[Streamlit](https://qiita.com/keisuke-ota/items/a18f158389f1585a9aa0) というアプリケーションフレームワークを使ってブラウザに表示させる。

# ロバスト線形回帰の特徴
最小二乗法による線形回帰に比べて、外れ値に影響を受けにくい。

# ロバスト線形回帰の作成
[HuberRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.HuberRegressor.html) を用いて、ロバスト回帰直線を作成する。
streamlit は、``streamlit run ファイル名.py`` で実行することに注意

```python:streamlit_robust_linear.py
import streamlit as st
import numpy as np
import pandas as pd
import altair as alt
from sklearn.linear_model import HuberRegressor
from sklearn.datasets import make_regression

# デモデータの生成

rng = np.random.RandomState(0)
x, y, coef = make_regression( n_samples=200, n_features=1, noise=4.0, coef=True, random_state=0)
x[:4] = rng.uniform(10, 20, (4, 1))
y[:4] = rng.uniform(10, 20, 4)
df = pd.DataFrame({
    'x_axis': x.reshape(-1,),
    'y_axis': y
     }) 

# 散布図の生成

plot = alt.Chart(df).mark_circle(size=40).encode(
    x='x_axis',
    y='y_axis',
    tooltip=['x_axis', 'y_axis']
).properties(
    width=500,
    height=500
).interactive()

# ロバスト回帰のパラメータを設定

epsilon = st.slider('Select epsilon', 
          min_value=1.00, max_value=10.00, step=0.01, value=1.35)

# ロバスト回帰実行

huber = HuberRegressor(epsilon=epsilon
    ).fit(
    df['x_axis'].values.reshape(-1,1), 
    df['y_axis'].values.reshape(-1,1)
    )

# ロバスト線形回帰の係数を取得

a1 = huber.coef_[0]
b1 = huber.intercept_

# 回帰直線の定義域を指定

x_min = df['x_axis'].min()
x_max = df['x_axis'].max()

# 回帰直線の作成

points = pd.DataFrame({
    'x_axis': [x_min, x_max],
    'y_axis': [a1*x_min+b1, a1*x_max+b1],
})

line = alt.Chart(points).mark_line(color='steelblue').encode(
    x='x_axis',
    y='y_axis'
    ).properties(
    width=500,
    height=500
    ).interactive()

# グラフの表示

st.write(plot+line)
```
# パラメータについて

Epsilon は 1 以上の実数で、外れ値の影響度を表す。Default は 1.35 に設定されている。
![スクリーンショット 2020-10-17 12.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612858/8f6f8f9b-43b3-323e-4679-d3763ae31c59.png)

Epsilon を大きくするほど、外れ値による影響を大きく受ける。(画像は ``epsilon=10``)
![スクリーンショット 2020-10-17 12.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612858/86a2e2e9-9d7e-ed03-fdd3-1a8028984f9d.png)

# 最小二乗法による線形回帰直線の作成

HuberRegressor を LinearRegression に置換すると、最小二乗法による線形回帰直線を作成できる。
AWS OpsWorksの備忘録

#はじめに
AWS認定資格にてAWS OpsWorksについて度々出題されますが、いまいちどういったサービスわかってないので、本稿で整理したいと思います。

#OpsWorksとは
ChefまたはPuppetを使用して、アプリケーションを設定および運用するための設定管理サービス。
ChefやPuppetとは「構成管理ツール」の一種。構成管理ツールとは、複数のサーバーに対してアプリケーションを一括でデプロイしたり、構成を流し込んだり、管理したりするツールのこと。ChefやPuppetを使用して、運用を自動化（EC2インスタンスやオンプレミスのコンピューティング環境でのサーバーの設定、デプロイ、管理の自動化）することができる。

#まとめると...
・ChefやPuppetによってサーバー設定や反復動作を自動的に行ってくれるのを助けてくれる。
・EC2やオンプレミスのVM上で使用可能。
・AWS OpsWorks = マネージドなChef&Puppet
・ChefやPuppetはSSM/CloudFormation/Beanstalkに似ているが、クロスクラウドで動作するオープンソースである。

※特にAWS SAA・SOA等を取得するにあたって、ハンズオンまでする必要はない。

https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome.html
https://www.ossnews.jp/compare/Chef/Puppet
https://macruby.info/windows/ansible-chef-puppet-compare.html
seaborn, matplotlib文字化けの解消　Windows10、Anaconda仮想環境にて

# グラフ描画時の日本語文字化け
日本語をグラフ中に表示しようとすると文字化けになってしまい、結構はまってしまったので備忘録として。

Anacondaで仮想環境を使用する際は「環境ごと」に再設定することなります。
####環境

- OS windows10
- Anaconda Naviagtor
- python 3.7



###日本語フォントが入ってないと
missing from current fontの表示とともに文字化けします。

![mojibake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366160/6b97e3c0-8faa-e1ba-095e-2f0089bfbae0.png)

## 投稿の動機
文字化け解消する際に用いるフォントは`MS Gothic`などでもよいですが、Linuxでも使用できるライセンスフリーのフォント`IPAexGothic`などがよく利用されるようです。
過去の参考記事などでは`IPAPGothic`などの過去のフォントが使用されているケースもあり、それを参考にして記述してハマりました。

##日本語フォントの入手・実装
[IPA](https://ipafont.ipa.go.jp/node26#jp)のサイトから入手できます。
2020Octでは`IPAexフォントv4.0.1`が最新のようです。
利用規約など手続きを進めてDL・解凍します。

![ipa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366160/49bb0028-ecd0-ec19-2461-dbd8503917cd.png)

ttfファイルを下記フォルダにコピー

`C:\Users\[あなたのアカウント] \Anaconda3\envs\[使用したい仮想環境名]\Lib\site-packages\matplotlib\mpl-data\fonts\ttf`

## ファイルの書き換え

下記フォルダにある`matplotlibrcファイル`をメモ帳などで開く

`C:\Users\[あなたのアカウント] \Anaconda3\envs\[使用したい仮想環境名]\Lib\site-packages\matplotlib\mpl-data`

250行目あたり
1. #font.family: に`IPAexGothic,`を追加。（デフォルトの`sans-serif`は削除してもいいみたい）また使用するフォントにより名称は適宜変更してください。
2. #font.serif:　に`IPAexGothic,`を追加。
3. 変更を保存

![font.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366160/12dfb409-225a-d99e-25c1-8394c3c55a22.png)

## キャッシュのクリア

1. `C:\Users\[あなたのアカウント]\.matplotlib`にあるキャッシュファイル`fontlist-vXXX.json`をゴミ箱へ
2. 先ほど修正したファイル`matplotlibrcファイル`をコピー
3. 準備完了
![cache3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366160/8e4c5d6d-b63f-eed7-6661-b1878b5c937d.png)

## 文字化け解消したか確認
仮想環境を再起動
![mojibakefinlal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366160/55a06b17-8638-3fb9-46a7-a0f096cf6f0b.png)

無事文字化けが解消しました。
ServiceNow - 複数のスクリプトで共有する変数及び関数を定義する

#概要
複数のクライアントスクリプトで変数及び関数をする手順です。

###onLoadスクリプト：グルーバル変数の宣言
共有する変数及び関数をOnLoadで宣言します。
onLoadスクリプトの「Isolate script」を無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/9bb3ea9a-77dc-05be-1725-6f8a1eef6ea0.png)

```
var globalVar = "初期値"; // 共有変数

function onLoad() {

}

function sayHi(name) {  // 共有関数
	alert('Hi ' + name);
}
```

###フィールド1のonChangeスクリプト：共有変数の値を変更

```
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
	globalVar = "フィールド１で変更。"; //共有変数の値を変更
}
```
###フィールド2のonChangeスクリプト：グローバル変数を表示
```
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    alert('変数の値：' + globalVar);  //共有変数の値を表示
    sayHi('Hitoshi'); //共有関数の呼び出し
}
```
###実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4d796dc2-e517-c236-e3ed-1ec22b066f92.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/51f0a599-5e8d-3307-2109-7fe4bd370fdc.png)
postした内容が一覧で表示できなかった時のエラー解決

Ruby on railsで投稿アプリを作りたい。
その際に、userとpostモデルのある状態をまず作ろうと思ったのですが、一ついくらメンターに相談しても時間がかかったエラーがありました。

## ActionView::Template::Error (undefined method `each' for nil:NilClass)

postコントローラでindexアクションに

```
def index   
  @posts = Post.all.order(id: :asc)
end
```

投稿したpostの内容を一覧表示にするところで、

index.html.erbに渡します

```
 <% @posts.each do |post| %>   
    <%= post.title %>
    <%= post.content %>
  <% end %>
```
これで表示できるはずが、
ActionView::Template::Error (undefined method `each' for nil:NilClass)
エラーでググっても、出てくるものは@postsがnilになってるので、、とか
同じ様なエラーでも@postsが@post　になってたり、全角スペースが入っていたり、、

ルーティングもOK
DBに保存もできている
showページは表示できるので、投稿自体は渡っている。

なぜ？

## 原因

postコントローラーのメソッドの書き順が原因でした。

index
new
create
show
edit
update
destoy

と書くのが普通なところを
new 
create
index←ここ

略

とindexメソッドをnewとcreateの後に書いていたのが原因だった様です。
1日悩んで、メンターさんに相談してもなかなか進まなかったよ〜言うなれば根本的な部分だったのかも。
でも、いろんな原因を探るうちに理解できた部分も多かったのでエラーは成長には欠かせないのかもしれません。
MySQLのreplicationをcustom mackerel-plugin で監視する

managed じゃないRDBで replicationするのは、できれば避けて過ごしたい人生ですが、https://qiita.com/masudakz/items/1afafcca1c01d8b9c276 のようなシステム構成もありうるのです。そして replicationを組んでいると、「同期できなくなって障害」というのにいつかは出くわすので、早期警戒体制が欲しくなります。

Mackerel公式の `mackerel-plugin-mysql` には`mysql.seconds_behind_master.Seconds_Behind_Master` があってよさげな感じです。

> スレーブ SQL スレッドとスレーブ I/O スレッドの間の時間差 (秒単位)スレーブ SQL スレッドとスレーブ I/O スレッドの間の時間差 (秒単位)

この plugin を入れて Monitors でAlert設定入れて検証してみると、検出できない障害パターンもありました。Master側がAWS RDS でSecurityGroupで、Slaveからの接続を遮断したパターンです。Master側のbinlogが見えないので、遅延を計測できない感じです。MySQLの `show slave status` にも異常所見が見えない（少なくともAlert出したい時間感覚の中では）。

SecurityGroupの誤設定とか、Master側でのGRANTの誤設定とか、Replication用ユーザを間違って無効化するとか、遅延以外のオペレーションミスでの通信途絶リスクがあるので、これではちょっと足りない。足りないなら自作すればいいのです。

## 手動の同期トラブルシューティング

すでに開発環境で2度の同期事故経験があるので、どこを見てどう判断したかを思い出してみます。

1. `show slave status` の `Last_Error`
2. いつ止まったか、高頻度INSERTのTABLEの最終レコードを見る  
 `SELECT id, ts_created FROM ... ORDER BY id DESC LIMIT 1;` 
3. replication用userで Slave - Master の疎通テスト

## plugin概要

`show slave status` の `Last Error` はどんなパターンが出るか事前には網羅できないし、通信途絶だとそもそも Error 認識できないので custom plugin のスコープからは外します。

高頻度INSERTのTABLEの最終レコードを Slaveからlocalhost と Master(remote)で比較すれば、疎通テストにもなります。疎通失敗で比較不可能だったらその時点でAlert出るようにすればいいでしょう。

## plugin骨格

```sql
SELECT MAX(${keycolumn}) FROM ${table};
```
Primary Keyの `MAX()` で瞬時レスポンスで毎分実行しても負荷にはならない想定です。

```sh
sqloption="--silent --skip-column-names --connect-timeout=2"
mysql -h ${host1} -u ${user1} -D ${database} -e "${sql}" ${sqloption}
```

SQL出力は `--silent --skip-column-names` で最もシンプルな数値だけにします。
通信障害のときにはさっさと(2秒で)あきらめてほしいので `--connect-timeout=2` です。

## plugin metric

Alert目的なので `SELECT MAX...` の結果の差分 `max1 - max2` が必須です。
0 が正常、WARN, CRITICAL は1でも10でも1000でもINSERT頻度に応じて。

でもこれだけだと平常時はずっと 0 が続くので、 custom pluginがちゃんと動いているかどうかが不安になります。元の max1, max2 も出力します。ただし、必須の diff とは値域も重要度も違うので、namespace を分割して別グラフにします。

```sh
echo replica.key.max1 ${max1}  ${EPOCH}
echo replica.key.max2 ${max2}  ${EPOCH}
echo replica.diff.diff ${keydiff}  ${EPOCH}
```

replica.key の方を Mackrelで差分グラフにすると Insert数/min のグラフになります。Insert密度があがっていくとどこかでSlaveが追いつけなくなって diff が非0になるでしょう。それが障害か、利用頻度上昇によるものか、判断の一助になることを期待しています。

## pluginコード

```sh
...
sql="SELECT MAX(${keycolumn}) FROM ${table};"
sqloption="--silent --skip-column-names --connect-timeout=2"

EPOCH=$(date +'%s')
max2=`mysql -h ${host2} -u ${user2} -D ${database} -e "${sql}" ${sqloption}`
max1=`mysql -h ${host1} -u ${user1} -D ${database} -e "${sql}" ${sqloption}`
if [ $? != 0 ]; then
  keydiff=1000
else
  keydiff=`expr $max1 - $max2`
fi
echo replica.key.max1 ${max1}  ${EPOCH}
echo replica.key.max2 ${max2}  ${EPOCH}
echo replica.diff.diff ${keydiff}  ${EPOCH}
```

全容は https://github.com/masudakz/mackerel-plugin-replica で開示しています。

## 余談

2018年06月のMy first mackerel pluginの記事が「自助」になりました。面白みの薄い pluginだなあと思いながら当時書いたものですが、自分が読むには自分の記事が一番読みやすい。2つ目を作るのに大いに助けになってくれました。
https://qiita.com/masudakz/items/654d65041a7507e59ee3
ServiceNow - 指定して日付とユーザが投稿したワークノートを取得するREST APIの作成

#概要
指定した日付に指定したユーザが投稿したワークノート一覧を取得するScripted REST APIです。

```
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
    var tableName = 'incident';
    var userName = request.pathParams.user;
    var startDate = request.queryParams.date;

    if (!startDate) {
        startDate = new GlideDateTime().getDisplayValue();
    }
    var records = [];

    var grSJF = new GlideRecord('sys_journal_field');

    grSJF.addEncodedQuery("'element=work_notes^name=" + tableName + "^sys_created_onON" + startDate + "@javascript:gs.dateGenerate('" + startDate + "','start')@javascript:gs.dateGenerate('" + startDate + "','end')^sys_created_bySTARTSWITH" + userName);
    grSJF.query();
    while (grSJF.next()) {
        var grIncident = new GlideRecord(tableName);
        grIncident.addQuery('sys_id', grSJF.element_id);
        grIncident.query();
        while (grIncident.next()) {
            records.push({
                'incident': {
                    'sys_id': grIncident.sys_id,
                    'number': grIncident.number,
                    'short_description': grIncident.short_description,
                    'sys_created_by': grIncident.sys_created_by,
                    'sys_created_on': grIncident.sys_created_on,
                    'work_notes': grSJF.value,
                    'assignment_group': grIncident.assignment_group,
                    'state': grIncident.state
                }
            });
        }
    }
    return records;
})(request, response);
```
playwright-pythonで日経平均をスクレイピング

# インストール

+ https://github.com/microsoft/playwright/blob/master/docs/docker/Dockerfile.focal

```shell
sudo apt update
sudo apt install -y libwoff1 libopus0 libwebp6 libwebpdemux2 libenchant1c2a libgudev-1.0-0 libsecret-1-0 libhyphen0 libgdk-pixbuf2.0-0 libegl1 libnotify4 libxslt1.1 libevent-2.1-7 libgles2 libxcomposite1 libatk1.0-0 libatk-bridge2.0-0 libepoxy0 libgtk-3-0 libharfbuzz-icu0 libgstreamer-gl1.0-0 libgstreamer-plugins-bad1.0-0 gstreamer1.0-plugins-good gstreamer1.0-libav libnss3 libxss1 libasound2 fonts-noto-color-emoji libxtst6 libdbus-glib-1-2 libxt6 ffmpeg xvfb
```

## 日本語フォントをインストール

```shell
sudo apt install fonts-ipafont-gothic fonts-ipafont-mincho
```

## playwrightをインストール

```shell
sudo apt install python3-pip
pip3 install playwright

# chromium・Firefox・WebKitをインストール
python3 -m playwright install
```

# スクリーンショット

```python
from playwright import sync_playwright

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch()
        page = browser.newPage()
        page.goto("http://whatsmyuseragent.org/")
        page.screenshot(path=f"example-{browser_type.name}.png")
        browser.close()
```

# 日経平均をスクレイピング

+ https://github.com/microsoft/playwright-python

```python
from playwright import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.newPage()
    page.goto("http://www.nikkei.com/markets/kabu/")
    # html = page.content()
    print(page.innerText("span.mkc-stock_prices"))
    browser.close()
```
ServiceNow - 重複したレコード一覧を作成する

#概要
ServiceNowでフィールドをユニークにしようとしたら重複したレコードエラーになると言う問い合わせがServiceNowフォーラムでありました。
重複したレコードを検出するスクリプトを作成しました。

アプリケーションナビゲータから「スクリプト - バックグラウンド」を開いて実行すると重複したレコード一覧が表示されます。

```
var uniqueField= 'state';
var tableName = 'incident';

var count = new GlideAggregate(tableName);
count.addAggregate('COUNT', uniqueField);
count.query();  
while (count.next()) {
   var fieldValue= count[uniqueField];
   var fieldCount = count.getAggregate('COUNT', uniqueField);
   gs.info("Number of duplicates " + fieldCount + ' value:' + fieldValue);
}
```
Jetson Nanoでmackerel-agentを動かす

（20201102追記）aptでarm64版がインストール可能になったようです。

https://mackerel.io/ja/blog/entry/weekly/20201102


---

大きくはこちらの記事([Raspberry Pi を Mackerel で監視する](https://qiita.com/ww24/items/5409aefd87f14beff504))と同様です。バイナリをarm64のものに変更するだけです。

```
wget https://github.com/mackerelio/mackerel-agent/releases/download/v0.69.2/mackerel-agent_0.69.2-1.systemd_arm64.deb
sudo apt install -y ./mackerel-agent_0.69.2-1.systemd_arm64.deb
sudo mackerel-agent init -apikey {your_api_key}
sudo systemctl start mackerel-agent
```

動作確認のため、Mackerelのサイトを見てみます。

![メトリクス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56038/835c924f-e1f4-2fda-e29e-ca14dcba2fd5.png)

無事に接続できているようですね。