OmniAICreator/Qiita-1.07M huggingface dataset:
化石エンジニアの野良リカレント教育・Kaggle～化石がレベルアップ・Contributorになった！～

# 前提

数学力・統計力・技術力がほぼすべて「ゼロより低い、マイナス」の化石エンジニア・アンモナイトがエンジニアとしての生き残りを目指して~~賞金が欲しくて~~ 、Kaggleに挑戦する。
たぶん、Kaggleに挑戦する記事の中で、もっともレベルが低いと思う。
そもそも、なんでKaggleに挑戦するのかとゆーと、下記のよーなリカレント教育（大人の再教育）プランを考えているからです。

アンモナイトが考えた化石エンジニアの進化論：

ふりだし：「アンモナイト＝太古の海中でたゆたってる化石エンジニア・Lv3」
　→アジャイル開始：Done!
　　→社外コミュニティ参加：Done!
　　　→スクラム経験：Done!
　　　　→CSM取得：Done!
　　　　　→常識（他社研修視聴）：Done!
　　　　　　→知識の深堀り＝Kaggle：in progress
　　　　　　　→知識の深堀り＝アプリ作成：To do
　　　　　　　　→あがり：陸上（肺呼吸）：人権を得る

# 1：現在の状況
前回の記事から、チュートリアルコンペ・『タイタニック号』に挑戦中。
ナビゲーターとなってくださる御本は下記。いつもありがとうございます。

『PythonではじめるKaggleスタートブック』
https://www.amazon.co.jp/dp/4065190061
![PythonではじめるKaggleスタートブック_書影.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1668633/535ad1ad-a63d-7c94-88ec-aa0f871da576.jpeg)
（書影は版元ドットコム様）

で、検討＆理解中の現在、どうなっているかというと……
レベルアップ＝Contributorになった！
え、どうやって？！

# 2：Contributorになるには
Kaggleアカウント取得時、レベルは「Novice」（初心者）からの出発となる。
実はNovice→Contributor（投稿者・たぶん）になるには下記の3つを行えばよい。

　1：Submit1回→御本のお導きで、Done！
　2：コメント投稿→応援したい方を発見し、Done！
　3：「いいね！」（upvote）付与→上記同様、応援したい方を発見し、Done！
　他にもアカウント認証やプロフィール登録などもあるが、あんまり記憶に残ってない。
　※御本に記載があるので、たぶんやってると思う 

　結果、1レベル上の「Contributor」になれました。
　化石でも。
　SyntaxErrorに悩まされているけれども。

# 3：戦いはこれからだ！

このように、化石エンジニアでも、KaggleでContributorにはなれる。実証した。
問題は、一つ上のランク・「Expert」である。銅メダル以上のメダル2枚獲得が条件となる。
つまり、今後、御本のお導きでExpertになれるかどうかは、~~神の味噌汁である。~~ アンモナイトの努力と工数+理解力次第である。

ちょっと待って、これからTOEIC受けないといけないし、スクラム系の勉強もあるし、年末~~しなかった~~できなかった大掃除もあったりするから、Kaggleだけに全力投入！！　はできないんよ。
週末、ちょっとずつコツコツやるのが精いっぱいなんよ。

メダル獲得ができる気がしない。まったくしない！
でも、肺呼吸を獲得して人権を得るためにはやるしかないから、やる。
……かなりな長丁場になるかもしれんけど……。

なので、化石の戦いはこれからだ！
某マンガ雑誌のよくある最終回的な感じ（勢いと伸びしろはありそうな雰囲気。次回作にご期待ください）で本日は終わります。
いや、野良リカレント教育はまだ続けます。人権欲しいから。
でもある日、KaggleのKもねえような全然違うテーマに取り組んでいたら、「アッ、あれ最終回だったのか……。で、これが次回作ね」と静かにうなずいていただければ幸いです。
（→自分を追い詰めないタイプ）

長文にお付き合いいただき、ありがとうございました！
Autoscaling設定方法 備忘

自分の備忘。。

AMI作成
セキュリティグループ作成
　特定のIPから80ポートでのALBへの許可用セキュリティグループ作成
　セキュリティグループからEC2インスタンスへの80ポート許可用セキュリティグループ作成
起動テンプレート作成
　AMI指定
　インスタンスファミリー指定
　パブリック使用するか指定
ターゲットグループ作成
　80番ポートに対してどんな風にチェックするか指定
ALB作成
　ターゲットグループ指定
auto scaling group作成
　ALB指定
　起動テンプレート指定
備忘録MLX90614 M5Stack Ambient wifi

#MLX90614とM5stackを使いLCDに表示しながらAmbientにデータ送信使用目的はモーターの温度上昇計測とクラウドに上げ記録をする。
##MLX90614のライブラリはAdafruitのモノを使用した。
その他のものを使用したらうまく動かなかった。
##この次はSDカードにCVSを収納できるように改造予定。
~~~
#include <M5Stack.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Ambient.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();
WiFiClient client;
Ambient ambient; // Ambientオブジェクトを定義


const char* ssid = "*********";
const char* password = "********";

unsigned int channelId = ~~~~~~~~; // AmbientのチャネルID
const char* writeKey = "========"; // ライトキー


void setup() {
  M5.begin();
  Wire.begin();
  Serial.begin(74880);
  delay(100);

  Serial.println("MLX90614 test10sec");  

  WiFi.begin(ssid, password);  //  Wi-Fi APに接続
    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
        delay(100);
    }
      
      Serial.print("WiFi connected\r\nIP address: ");
      Serial.println(WiFi.localIP());

 
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
  mlx.begin();  
  /* M5stackの
   *  画面の使い方はhttps://wak-tech.com/archives/1770を参照
   */
  M5.Lcd.setBrightness(127);//照度調整最高２５５
  M5.Lcd.setTextSize(3);//LCDテキストサイズ指定
  M5.Lcd.setCursor(5,10);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.print("MLX90614");//表示させる文字（常時表示）
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(5,40);
  M5.Lcd.print("Object Temp Sensor");  
  M5.Lcd.setCursor(5,60);
  M5.Lcd.print("wifi Iot device");
  delay(5000);
  
  M5.Lcd.clear(BLACK);
  
  M5.Lcd.setTextSize(2);//LCDテキストサイズ指定
  M5.Lcd.setCursor(5,10);
  M5.Lcd.print("WiFi connected\r\nIP address: ");
  M5.Lcd.print(WiFi.localIP());
  delay(5000);
}

void loop() {
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(5,10);
  M5.Lcd.print("Ambient Object temp");
  
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(5,80);
  M5.Lcd.setTextColor(ORANGE);
  M5.Lcd.print("Ambient:");
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.print(mlx.readAmbientTempC());
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.print(" ^C");
  M5.Lcd.setCursor(5,110);
  M5.Lcd.setTextColor(ORANGE);
  M5.Lcd.print("Object: ");
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.print(mlx.readObjectTempC());
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.print(" ^C");

  
  Serial.print("周囲温度 = ");
  Serial.print(mlx.readAmbientTempC()); 
  Serial.print("℃");
  Serial.print("  対象物温度 = "); 
  Serial.print(mlx.readObjectTempC());
  Serial.println("℃");

  ambient.set(1,mlx.readAmbientTempC());
  ambient.set(2,mlx.readObjectTempC());

  ambient.send();
  
  delay(10000);//1000ms=1秒 5000ms=5秒 10000ms=10秒 60000ms=1分  600000=10分
}
~~~
vscodeのターミナル（PowerShell）でoh-my-poshの区切り文字の色がおかしい

2022年4月現在、vscode 1.66.x + PowerShell + oh-my-poshを利用する際に下記の現象が発生しているのでメモ。


## 現象を確認したバージョン情報

- vscode 1.66.2
- PowerShell 7.2.2
- oh-my-posh 7.64.2

## 発生事象

下記画像のように、`vsocode`のターミナルで`PowerShell`を利用し、`oh-my-posh`でスタイル`powerline`を利用している場合。

区切り文字で選択している▶の色がおかしくなる。(画像だと水色になっていて欲しい部分が白い▶マークになっている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f8f37e0e-7244-c45e-1855-e00d1f65eba0.png)

なお`vscode`以外の、`WindowsTerminal`上で同様のテーマ設定で`oh-my-posh`を実行してみると、こちらは問題が発生しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/245f8653-ea09-fa28-b730-3ce5791ca85a.png)


## 原因

[Diamond rendering with different color #2017](https://github.com/JanDeDobbeleer/oh-my-posh/issues/2017)
[Powerline symbols in the terminal get wrong colors #146406](https://github.com/microsoft/vscode/issues/146406)

少し調べた所、上記issueがあがってました。

どうやら`vscode`の`terminal.integrated.minimumContrastRatio`という設定項目のデフォルト値が`1`から`4.5`になった事が影響を与えているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ff17a471-ebf0-ec2b-75d9-fbbdfc2265ea.png)

現在、表示を直したい場合は、`terminal.integrated.minimumContrastRatio`を`1`に設定する事で元に戻す事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/afd656da-47fb-5a94-d9e8-6f88d3fd1903.png)

## 総評

`vscode`が`terminal.integrated.minimumContrastRatio`の設定を最終的にどうするか。

ここらへんの表示問題をどんな場所に着地させるのかはわかりませんが、忘備録として残しておきます。
UnityでMapboxを使う

# 前準備
## Mapboxのアカウント作成
ちゃちゃっと作りましょう

![スクリーンショット 2022-04-17 23.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/d0b50d5f-f806-36c3-7cf2-e3cd6456e5ed.png)

## アクセストークン発行
ログインしたらアクセストークンを発行しておきましょう。
アクセストークンは後ほど使います

![スクリーンショット 2022-04-17 23.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/1dd2dc77-c423-1715-aefc-4aa7792c48c9.png)


## Maps SDK for Unityをダウンロード
以下のURLからMapboxのパッケージをダウンロードします。
https://www.mapbox.com/install/unity

![スクリーンショット 2022-04-17 23.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/6e4f178d-3949-a74b-4031-e7b3f525870e.png)

# Unityプロジェクト作成
今回は３Dのテンプレで始めます

![スクリーンショット 2022-04-17 23.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/4e7f0c21-0f95-4db0-5a83-508fd9abb768.png)

## パッケージをインポート
先程ダウンロードしたMaps SDK for UnityをUnityにインポートします。
アセット＞パッケージをインポート＞カスタムパッケージ　からMaps SDK for Unityを選択してインポートします。

普通にMapboxを使うだけならMapboxだけにチェックをいれましょう。
![スクリーンショット 2022-04-17 23.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/7dc182ed-2773-92ac-1426-e341ecf89d8c.png)

MapboxARなどのAR系にチェックを入れる際にはUnityのEditorバージョンに気をつけましょう。
2019系よりも最新のバージョン（２０２０系とか）でAR系にチェックを入れてしまうとエラーが出ます。

これはGithubでIssueが上がっているので既知の問題です。
https://github.com/mapbox/mapbox-unity-sdk/issues/1753

## アクセストークンを登録
先程発行したアクセストークンをコピペするだけで使えるようになります。
![スクリーンショット 2022-04-17 23.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/89db7115-bf6b-3942-d19f-ffcd70d95552.png)

## Example Scenesで遊ぶ
アクセストークンの認証が通れば、下にあるExample Sceneが活性化して選択できるようになります。
色々と種類があるので、遊んでみましょう。

![スクリーンショット 2022-04-17 23.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/9b4720d8-19e4-c5d8-7345-03b4c04fa3b0.png)
リーダブルコードを読んで気が付いたこと1

書籍『リーダブルコード』を読んでいて、はっとしたこと、なるほどーと感じたことの備忘録的なメモです。
1としていますが、続きがあるかは不明です

### p.61 コードの欠陥にコメントをつける

プログラマが使う記法として4つが紹介されていました

- TODO: あとで手をつける
- FIXME: 既知の不具合があるコード
- HACK: あまりキレイじゃない解決策
- XXX: 危険! 大きな問題がある

### 開発ツールでは検知してくれるのか
TODOは自分も最近はよく使っていて、Visual Studio 2022 や Visual Studio Code, InteliJIDEAではTODOを検知してくれるので、後で検証するのにいいなと思っていました。
他の3つは知らなかったのですが、では、実際にこうした開発ツールでは検知するのかなーと思って試してみました。

もしかしたら、ほかに検知方法があるかもしれないので、知っている人がいたら教えてほしいのですが、とりあえでコメント行にして書いたらこんな感じだったということの紹介です。

ちなみに、Visual Studio 2022はC#、Visual Studio CodeはTypeScript, JAVA、InteliJIDEAはTypeScript, JAVAで試しています。コメントの色が変わっていることで、検知されていることが分かります。

Visual Studio 2022: C#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/b883be79-b7d9-bbad-9767-6d6505ef3902.png)

Visual Studio Code: TypeScript (波線は無視してください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/f5dbbb0d-33bb-2599-3de1-96e4d24a3d78.png)

Visual Studio Code: JAVA
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/545e39df-131b-f74f-7505-b20cc7675ecb.png)

InteliJ IDEA: TypeScript
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/a20b2274-b780-763f-f753-2e0b3c24af9b.png)

InteliJ IDEA: JAVA (最後の{}の色が変わっているのはカーソルが当たっているだけです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/f1fd1ef6-5482-a272-c756-3930b69ccb72.png)

### 結果
Microsoft社製のVisual StudioではTODOのみが検知されました。
Visual Studio Codeは何も検知していないです。当たり前といえば当たり前ですが、拡張を入れると検知するのかもしれません。
JetBrains社製のInteliJ IDEA ではTODOとFIXMEが検知できました。

InteliJ IDEAは本当に使いやすくて、Ecliplseと比較するとその使いやすさは天地の差があると自分では思っているのですが、こうした検知についてもVisual Studioよりできることが分かりました。
これまで、TODOだけを使っていましたが、FIXMEは開発プロジェクトで他人が作ったコードを触るときに重宝する気がします。


#### 近況
最近、記事のアップをしていませんでしたが、C#だけではなく、JAVAやTypeScriptなどに手をだしていて、いろいろと勉強を重ねていました。
まだまだ、記事にできるほどのものではないかなと思っていて、滞っていました。
新しい言語や技術を学び始めるのがとても楽しく、いろいろと手を出しすぎて収拾がつかなくなっています。
落ち着いてきたところで、また記事をアップしていこうと思います。
EC2踏み台インスタンスからORACLE（RDS)へ接続

踏み台で。

```
sudo yum install wget
wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm
sudo yum install oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm
sudo yum install oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm 
```

インストール確認
```
# バージョン確認。
$ sqlplus64 -V
```

```bash
$ sqlplus user_name@\"//database.xxxx.ap-northeast-1.rds.amazonaws.com:1521/DB_NAME\"
```

Ref:
https://www.suzu6.net/posts/241-yum-install-sqlpuls/
久しぶりにターミナルからGithubのリポジトリにコミットしたら認証エラーが出て焦ったので備忘録として残します

久しぶりにリポジトリを作成して、ターミナルからコミット・プッシュしようとしたら下記のエラーが出ました。
どれだけ久しぶりに触ったのかバレるという恥ずかしさよりも、トークン認証かぁと感心したので、備忘録代わりにこのエラーの対処法を残しておきます。

```
% git pull　（※ここは他のgitコマンドでも良き）
Username for 'https://github.com':[ユーザー名]
Password for 'https://[ユーザー名]@github.com': [ログイン時のパスワード]
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/[ユーザー名]/[リポジトリ名].git/'
```

# Githubでは2021年8月13日からパスワード認証が廃止
そうなんです。Githubでは今まで行われていたパスワード認証が廃止され、代わりに**トークン認証**に切り替わりました。
そのため、トークンの取得がまだの人はトークンを取得しましょう。

# トークンの取得方法
1. 右上の自分のアイコンの「Settings」をクリック
1. 左メニュー下部の「Developer settings」をクリック
1. 左メニューの「Personal access tokens」をクリック
1. 右上の「Generate access tokens」をクリック
1. 「Note」に利用目的、「Expiration」に有効期限、「Select scopes」に対象範囲を書く
※「Select scopes」は「repo」にチェックをつけることでローカルにクローンするなどのリポジトリ操作で可能。
1. 5.を終えたら「Generate token」をクリック
1. ✔の右にトークンが記載されるので**必ずコピー**しておくこと
※トークンの文字列はこの画面でしか確認できないので注意。

# トークン認証してリポジトリ操作できるように
上記のトークンを取得できたら、ターミナルでgitコマンドを実行します。

```
% git pull　（※ここは他のgitコマンドでも良き）
Username for 'https://github.com':[ユーザー名]
Password for 'https://[ユーザー名]@github.com': [トークンの文字列]
```

これで今後はエラーがでなくなります。
ターミナル操作

### 主なディレクトリ構成
1. root
2. usr, home(ホームディレクトリ), var, bin
3. desktop等、ホームディレクトリ以下のもの

* 「/」 ルートディレクトリの位置を表す
* 「~」 ホームディレクトリの位置を表す

最初ターミナル入った時はホームディレクトリにいる

cd ~/hoge とすれば絶対パスでホームディレクトリ直下のhogeディレクトリを指定出来る。
GitとHeroku CLlを使ってデプロイする

## 参考
この記事の内容はおおよそこちらのページに書かれています。

https://devcenter.heroku.com/ja/articles/git

## 環境
- **Windows OS**
- **VS Code**
- **Git**
- **Heroku CLI**

Githubのインシデントにより自動デプロイが動かなくなったので、今後のために取り急ぎHeroku CLIを使ってデプロイを行う方法を超大雑把にメモ。

※今までGithubを使って自動デプロイしていた場合を想定しています。
## 手順
はじめに**Heroku CLI**と**Git**をインストールします。

> **Heroku CLI** 
https://devcenter.heroku.com/ja/articles/heroku-cli#download-and-install
**Git**
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

VS Codeでいつものようにフォルダを開き変更を保存します。
※GitHubの任意のローカルリポジトリになると思います。

次にそのままVS Codeの**ターミナル**を開き、
```
heroku login
```
と入力し、**heroku**にログインします。

続けて
``` 
heroku git:remote -a example-app
```
と入力します。
※example-appの部分はアプリ名に書き換える。


この時にバージョンがなんたらとか言われたら、
```
heroku update
```
と入力してアップデートしましょう。

ここでGitHubのデスクトップアプリから変更内容をcommit、pushしておきましょう。

最後に
```
git push heroku main
```
と入力すればデプロイ完了です。
Git関連のまとめ記事（初心者向け）　少しずつ追加

## 最初に知っておいた方がいいかも
・[よくわからないリモートやらローカルやら追跡やらブランチについて](https://qiita.com/kitutune/items/b5e05b37f330388d3249)
↑特に参考記事が重要

## 環境構築（自分のPCとGitHubの連携の仕方やVsCodeの簡易な設定など）
・[terminalでcode . が使いたい(VsCodeをターミナルで開きたい)](https://qiita.com/kitutune/items/9ef59759a04f4b0e3eff)
・[VsCodeとGitHubをSSH認証で連携する](https://qiita.com/kitutune/items/dd8e145b064a88c3f6c5)
・[GitHubのメールアドレスを確認（設定）する](https://qiita.com/kitutune/items/421ddf16279a54ace5aa)

## 主にGit関連の操作
・[空のリポジトリ（プロジェクト）を作成する](https://qiita.com/kitutune/items/df4dcd2c657140610db8)
・[ローカル(自分の？PC)で作成したプロジェクトをGitHubに連携する](https://qiita.com/kitutune/items/7e25a5ced8cc5f26ffda)
・[Gitのリポジトリをクローンする](https://qiita.com/kitutune/items/dff6f2f14b9fb1fad187)

・[terminalでローカルブランチを作成する(git branch と　git checkout -b)](https://qiita.com/kitutune/items/7fe379b9698aebb1d0f4)
・[GitHubでリモートブランチを作成する](https://qiita.com/kitutune/items/68ec48d72f940219ebbe)
・[ローカルブランチとリモートブランチを紐づける(git branch -u )](https://qiita.com/kitutune/items/d80a3a36d490cd5425df)
・[既に存在しているリモートブランチをローカルブランチとして持ってきたい（git checkout -b）](https://qiita.com/kitutune/items/f1b6686ae3f64b4b92ce)


・[ローカルブランチとリモートブランチが紐づいているか確認する(git branch -vv)](https://qiita.com/kitutune/items/ca2c0c9e083737e76e5b)

## エラー
[error: the requested upstream branch 'リモート場所名/リモートブランチ名' does not exist](https://qiita.com/kitutune/items/4419f2d726bf8d060ea3)


## Gitコマンドの参考記事
[Gitコマンド虎の巻](https://git.command-ref.com/)

少しずつ追加していきます
後は要望あれば言ってもらえれば追加するかもしれません
100日でSQLの達人になる@LeetCode! Day64 <3年連続してメダル獲得あるいは3回以上金メダル>

## 1811. Find Interview Candidates （問題レベル: Medium）要課金
今日の問題はこれ。
大会毎の金・銀・銅メダル取得者のIDが入ったテーブルから、3年連続して金銀銅メダルのいずれかを獲得したユーザーIDまたは、3回以上金メダルを獲得したユーザーIDをリストアップするという問題。

3回以上金メダルを獲得したユーザーIDの方はすぐに分かったのだが、3年連続してメダル獲得の方は少し悩んでしまった。

`WITH`句で`UNION ALL`を使って金銀銅を一つのIDにまとめて、`IN()`を2つ使って異なる2つの条件をまとめてみました。なかなかややこしいですが、一つずつ分解して考えると自力で解けました。

最終的に提出した回答は下記。
ポイントは`WITH`句と`IN()`を使うとした。

```:SQL
WITH cte AS (
SELECT contest_id, gold_medal as id
FROM contests
UNION ALL
SELECT contest_id, silver_medal as id
FROM contests
UNION ALL
SELECT contest_id, bronze_medal as id
FROM contests
)

SELECT u.name, u.mail
FROM users u
WHERE 
u.user_id IN (SELECT gold_medal FROM contests GROUP BY gold_medal HAVING COUNT(gold_medal) >= 3)
OR
u.user_id IN (SELECT　DISTINCT a.id
FROM cte a
LEFT JOIN cte b
ON a.contest_id + 1 = b.contest_id
LEFT JOIN cte c
ON a.contest_id + 2 = c.contest_id
WHERE a.id = b.id AND a.id = c.id) 
```

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
テンプレートで関数が呼び出せないならPipeを使えばいいじゃん！

# Angularテンプレートで関数が呼ぶのはあまり良くない
https://qiita.com/kihaya-tech/items/059e1a0a5f717739f856

にも書いたが、テンプレート内で関数を呼び出すことはあまり良い方法ではないということだが、そこで、AngularのPipe機能を使うという手もあるなと思いました。

# AngularのPipeとは
テンプレート上に埋め込まれたデータを加工・整形するための仕組み。
Angularには標準的なパイプ(dateパイプやjson,asyncパイプのなど)があるがそれを自作することができる。
俗に言うCustom Pipeがある。

与えれた要素の加工・整形だけではなく、DatePipeのように、パラメーターも定義することができる

# ただし、PupePipeを使おう
AngularのPureパイプは処理を高速化するために、純粋な変更が検出した場合にパイプを実行します。
純粋な変更が検知されたタイミングとは具体的には、

1.プリミティブ型(String,number,Boolean,Symbol)の値が変更された時
2.オブジェクト型(Date,Array,Function,Objectなど)の参照が変更された時

が当てはまります。

逆に言えば、impureなパイプを使用するとページ内で発生したすべてのイベント（変更）をもとに無制限に再評価されることになります。

# 他に良い手があれば
もしかしたら他に良い手があれば**コメント**や**DM**で教えて頂けると助かります。
空のリポジトリ（プロジェクト）を作成する

## 前提条件
- GitHubのアカウントを作成済み

## 1. GtiHubのアカウントでアカウントで`New`を押下
<img width="1440" alt="スクリーンショット 2022-04-09 5 56 56" src="https://user-images.githubusercontent.com/79749395/162534115-a999ac33-4164-4d56-8941-925e2955975d.png">

## 2. プロジェクトの名前を任意で決めて書く
<img width="1440" alt="スクリーンショット 2022-04-09 6 01 25" src="https://user-images.githubusercontent.com/79749395/162534117-eeb8a528-7238-447e-b5ad-c70f4137b539.png">

## ３. Create Repositoryを押下
<img width="846" alt="スクリーンショット 2022-04-09 6 03 49" src="https://user-images.githubusercontent.com/79749395/162534124-87656add-4c1a-4453-9a39-e36ab865ffaa.png">

## 4. プロジェクトが完成した
### ※　中身のない名前だけのプロジェクトなので下の画像のような表示になる

![スクリーンショット 2022-04-09 6 51 55](https://user-images.githubusercontent.com/79749395/162536913-9b64ff16-4e6d-42d0-a93b-aad74928ca61.png)
gitのリポジトリをクローンする

## 前提条件
- GitHubのアカウントを作成済み
- GitHubにリポジトリ（プロジェクト）が存在する
- SSH認証済み:[参考](https://qiita.com/kitutune/items/dd8e145b064a88c3f6c5)



## 1. git cloneしたいリポジトリのページに行く＋git cloneしたディレクトリを配置したいディレクトリをターミナルで開く（今回の例だとユーザー/ユーザー名（yoshiteruとなってるところ）配下）
[pwdって何？:コマンド　ターミナルで現在自分がどのディレクトリにいるのか参照する](https://wa3.i-3-i.info/word11161.html)

[lsって何？:コマンド　ターミナルで現在いるディレクトリの中にあるファイルを一覧表示する](https://wa3.i-3-i.info/word11162.html)
![スクリーンショット 2022-04-12 6 53 27](https://user-images.githubusercontent.com/79749395/162840401-a0de472a-9321-4cf8-aada-cc3a1548c6fb.png)

## 2. GitHubページのCodeを押下してSSHの欄にあるURLをコピーしターミナルでgit clone コピーしたURLという形で貼り付ける
~~~
git clone git@github.com:kitutune/tes-repo.git
~~~
![スクリーンショット 2022-04-12 6 54 10](https://user-images.githubusercontent.com/79749395/162840408-3c766bea-b98a-467d-b73d-9b2f4b426ba2.png)

## 3. git cloneしたリポジトリのディレクトリが自分のPCのディレクトリにあることを確認（git clone自体はここで完了）
![スクリーンショット 2022-04-12 6 55 03](https://user-images.githubusercontent.com/79749395/162840410-a336bfd0-dcb1-41fd-a971-01171162481b.png)

## 4. cloneしたディレクトリにターミナルで移動してプロジェクトの起動をしたり
![スクリーンショット 2022-04-12 6 55 38](https://user-images.githubusercontent.com/79749395/162840433-c0ca85b4-c7ef-4499-96bf-c386eef12b2f.png)

## 5. VsCodeに貼り付けて開いたりする
[余談：code .コマンドを使った方が簡単と思う](https://qiita.com/kitutune/items/9ef59759a04f4b0e3eff)
![スクリーンショット 2022-04-12 6 56 01](https://user-images.githubusercontent.com/79749395/162840442-bbc5b786-a093-45df-a082-6559827c98c5.png)

![スクリーンショット 2022-04-12 6 56 45](https://user-images.githubusercontent.com/79749395/162840448-818b90b7-4a2f-4370-825a-1040b1887052.png)
terminalでcode . が使いたい(VsCodeをターミナルで開きたい)

##  ↓で下記のコマンドを打ってVsCodeを開きたい（ターミナルで）
![スクリーンショット 2022-04-17 14 42 24](https://user-images.githubusercontent.com/79749395/163702293-e79d2dc5-1769-4440-b6b6-b551f5728cf2.png)

## 1. 歯車のアイコン(管理)⇨コマンドパレットを押す

![スクリーンショット 2022-04-17 14 53 01](https://user-images.githubusercontent.com/79749395/163702667-37f0115b-c823-4670-b6db-b9de18d3af2a.png)
![スクリーンショット 2022-04-17 14 55 06](https://user-images.githubusercontent.com/79749395/163702668-81eeadf9-d706-4460-925a-271fcd1a585c.png)

## 2. 開いた入力画面でshellと打ちVsCodeコマンドをインストール

~~~
shell
~~~
と打つと
下記の画像のように出るので（自分は既にインストールしているのでアンインストールが選択肢に出ている）、インストールを選択する

![スクリーンショット 2022-04-17 14 55 55](https://user-images.githubusercontent.com/79749395/163702670-2e600a69-41d9-483b-95a1-5b96a2099cb6.png)


## 終わり
これでターミナルで今開いてる位置のディレクトリ（フォルダ）がVsCodeで開く

[pwdとは？：現在位置を確認するコマンド](https://wa3.i-3-i.info/word11161.html)
![スクリーンショット 2022-04-17 15 06 10](https://user-images.githubusercontent.com/79749395/163702884-e0806976-d6b9-472e-8e93-0734610b1545.png)
Sourcetreeの基本的な操作

# 初めに
Sourcetree(ソースツリー）での基本的な操作方法をメモとして記事にしました
私自身がわかるように残しますが、Sourcetreeの使い方がまだ覚えられていない方などに見て、
参考にしてもらえると嬉しいです！

# コミット
Sourcetree全体で見た時の左側の欄にある「ワークベース」内から「ファイルステータス」を選択
「ステージングに未登録のファイル」から追加、修正などの変更箇所を確認し
「ステージング済みのファイル」へ移す
変更に対してコメントを残し、コミットする対象のブランチが正しいかを確認し右下ボタンからコミット


# プル
「プル」を押すとダイアログが表示されるので
反映・取り込みさせたい　ブランチを選択しプルを押す
プルするリモートのブランチ：直接の親ブランチ
プルするローカルのブランチ：反映させたいブランチ（自動で選択されてる）

___
プルした際の注意点
* Conflicts（競合）
自分の差分と他の人の差分で　ブランチ元から差ができてしまうので、差分をプルする
プルした際にConflicts（差分が競合、ぶつかってしまう）が出るので　お互いに差分内容を確認し、いらない部分を削除
削除が終わったら　アプリが正常に動くか確認
ステージング済みのファイルへ移し、コミット
コメントは　そのままで（Conflicts用のコメントが自動で入力されてる）コミット
# プッシュ
コミットしたローカルブランチの差分（手元にある自分の作業したもの）からリモートブランチに送る
プッシュを押すとダイアログが表示されるので
初めてローカルブランチからリモートブランチへプッシュする場合は自分のコミットしたブランチを探しチェックを入れOKボタンを押す

2回目以降の場合は
コミットしたローカルブランチとリモートブランチが自分の作業したものと合っているかを確認し
チェックを入れてOKボタンを押す



# ブランチ
SourceTree全体で見た時の左側の欄の「ブランチ」から枝分かれさせたいブランチ(親ブランチ)を選択
親ブランチが選択されていることを確認し、ブランチを押す
ダイアログが表示されるので、現在のブランチに枝分かれさせたい親ブランチが入力されていることを確認し
新規ブランチに子ブランチの名前を入力
ブランチのファイルを指定したい場合は
例：　ファイル名/子ブランチ名 
とファイル名の後ろに/　その後ろに子ブランチ名を入力


# スタッシュ（一時保存）
Sourcetree全体で見た時の左側の欄にある「ワークベース」内から「ファイルステータス」を選択

「ステージングに未登録のファイル」から「ステージング済みのファイル」へ移す
スタッシュを押すとダイアログが表示されるので
そのスタッシュのコメント、メッセージを残しスタッシュを押す

スタッシュから戻したい場合は
戻したいブランチが合っているかを確認し
Sourcetree全体で見た時の左側の欄にある「スタッシュ」から対象のスタッシュを選択
確認ダイアログが出るのでコメント、メッセージ、ブランチ名などを確認しOKを押す
競馬をより楽しむために、AIを自作した話

# まえがき
こんにちは。馬風(うまかぜ)と申します。
名前に"馬"が入っているように、私は競馬大好き人間です。
自分の予想がハマったときの快感に取り憑かれました。
予想をするのも良いのですが、私は答え合わせ(馬券が当たるor外れる)の瞬間が一番楽しいです。

# 我が救世主、競馬AI
さて、皆さんはこんなジレンマに悩んだことはありませんか？

**予想はちゃんとしたいけど、全レース勝負したい! でも時間も労力も必要……**

私も大いに悩まされました。
楽しむために、答え合わせの回数を増やしたいけど、テキトウな予想だとなぁなぁになってしまって賭けるのもはばかられる…。
予想紙などに丸乗りしたりするのではなく、あくまで自分の力でたくさん予想したい。

それを解決したのが、**競馬予想AI**でした!

# 競馬AIがピッタリ
AIに任せるのも、他人の丸乗りと同じと思われる方もいるでしょう。でも、自分で予想するのと共通する大事な要素があるんです。それは……

**自分の努力で成績を上げられること**

AIの精度を上げるための工夫は無限にあります。
プログラミングの醍醐味とも言えるでしょう。

# プログラミング初心者なりに、自作してみた
当然、時間はかかりますが、何とかなりました。
はじめはweb検索で見よう見まねでツギハギしたり、一文一文検索したり…。
競馬関連も意外と先駆者がいて参考になりました。

最初に作ったのは、複勝圏内の2値分類でした。各馬の複勝率を予測するわけです。
↓イメージ
| 馬番 | 予測値 |
|-:|---:|
|2 |1.8|
|6 |1.5|
|1 |1.1|
|9 |1.0|
|12|1.0|
|8 |0.8|

# 不満と向上心
はじめは2値分類の確率順に並べたものを見て満足していましたが、意外と応用しづらく、飽きてきてしまいました。
数値の表を見て予想するのは、競馬の良さが感じられない…。そう思いました。

そこで試行錯誤して追加した機能が個人的に革命的でした!

# 大満足! 自作競馬AIの最終形
出力図を大改良! ご覧のようになりました。
![d3db984e1415-20220412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632128/5cb79e2b-c80a-6063-e03e-aec2bc9798bf.png)
図の見方を説明しますと、
- 馬番の濃さ：馬の実力
- 馬番の位置：4角の位置取り
- 馬番から出た矢印の長さ：上り
- 左上：レースの特徴

となっています。
情報が視覚的にスッと入ってきます。こういうものが欲しかったんだと気づきました。

# プログラム共有
この革新的競馬予想AIを共有するために、1からコードを書き直し、まとめあげたものを販売しています!

[誰でもかんたん！ 自分の競馬予想AIを作ろう！](https://zenn.dev/umakaze/books/312ddc2bbf3601)

自分の苦労を踏まえ、まずはコピペで **即実行可能**、さらに、説明を加えて理解も進む内容です。
カスタマイズも可能です。世界に1つだけのオリジナル競馬AIを作りましょう!

# あとがき
自分に合った競馬スタイルを探究していった結果、競馬AIにたどり着いたというお話でした。
プログラミングの楽しさにも触れられて良かったです。皆さんにも、ぜひ味わってほしいですね。

[Youtube](https://www.youtube.com/channel/UCV8C-MybF6gUbFca1gWqyyw)で今回の競馬予想AIを使用した全レース予想のライブ配信も行っていますので、そちらもご興味あればご覧いただけたらと思います。
pyenv + fish (M1 Mac)

よくわからないが、pyenv の PATH の設定方法が変わったらしい。

```
brew install pyenv
```

```fish:~/.config/fish/config.fish
set -x PYENV_ROOT $HOME/.pyenv
set -x PATH  $PYENV_ROOT/bin $PATH
pyenv init - | source
```

動くかを確認

```
pyenv list 
pyenv install 3.9.6
pyenv local 3.9.6
which python
```

あとはよしなに仮想環境を作る

```
python -v venv venv
source ./venv/bin/activate.fish
```

# 参考リンク

https://stackoverflow.com/questions/67473902/pyenv-no-longer-sets-paths-correctly-when-activating-virtual-environments
GemfileでグローバルインストールするGemを管理する



普段プロジェクトごとにGemfileを管理していますが、システム全体で使うGemもGemfileで管理したいと思い方法を調べました。

## 環境
Mac OS Big Sur 11.6
Bundler 2.2.32
Ruby 3.0.2
Gem 3.2.22


## 結論

好きな場所にGemfileを作成して

```ruby
bundle install --system
```

これだけでシステム全体でGemが使えるようになります。

## 保存場所

自分の場合は[rbenv](https://github.com/rbenv/rbenv)を使いバージョン管理をしています。

そこで、 `Gemfiles` というフォルダを作り、その下でバージョンごとに管理することにしました。

```ruby: 好きな場所
Gemfiles
├── 2.6.3
│   └── Gemfile
│   └── Gemfile.lock
├── 2.6.6
│   └── Gemfile
│   └── Gemfile.lock
└── 3.0.2
    └── Gemfile
    └── Gemfile.lock
```


参考

https://ruby.studio-kingdom.com/bundler/bundle_install/
GitHubのメールアドレスを確認（設定）する

## 1. GitHubと連携しているアドレスの確認または追加

![スクリーンショット 2022-04-17 22 11 01](https://user-images.githubusercontent.com/79749395/163715823-291b8992-863b-4b8c-a127-5b9b821ff162.png)
![スクリーンショット 2022-04-17 22 12 40](https://user-images.githubusercontent.com/79749395/163715866-dbe42ce9-9399-4fb4-8da0-523033cb71ef.png)
## 2. これで確認できる　ただし無かったらAdd email addressで追加もできる
![スクリーンショット 2022-04-17 22 13 51](https://user-images.githubusercontent.com/79749395/163716028-dd2a8a51-815f-422d-b394-3e1d914ea043.png)

## ３. 余談：コマンドでも確認できる　
~~~
git config -l
~~~
オプションの -l　は　listの意味
![スクリーンショット 2022-04-18 7 30 12](https://user-images.githubusercontent.com/79749395/163734624-ae7bc60f-f074-47f6-8956-0c2552dc106f.png)

参考は[コチラ](https://qumeru.com/magazine/587)

ちなみに
~~~
git config
~~~
とするとコマンド一覧が出る
これから制作していくゲームの方針を考える

2022.4.17 4日目　今日はこれから休日に制作していく方針を考えていたのでメモ。

## レギュレーション
・プロジェクトは3Dで作成→制作物は2Dを予定
・休日を使用して制作していく
・期間は2～３か月を予定
・やったことは毎回Qiitaに投稿する

とりあえず、短いスパンでゲームを制作していきたいと思っています。

## ゲーム案
2Ｄゲームの種類があまり私の脳にリソースが無かったので、ググりました。
以下のサイトを参考にさせていただきました。（ありがとうございます）
https://kurokumasoft.com/2022/01/05/unity-game-genre-difficulty/

・ブロック崩しゲーム
・アクションゲーム
・シューティングゲーム
・パズルゲーム

こんな感じで制作していければと思います。

まずはブロック崩しゲームを5月末までに制作していきたいですね…。
タイトル→バー選択（強さ選択）→リザルト
的な流れかな…？？？
プログラミング言語ロゼッタストーン

あれ、この言語でこれどうやって書くんだっけ？ が頻発するので忘備録

## 記法

## 関数リテラル
es
```javascript
const func1 = e => e + 1
const func2 = e => { return e }
```

python
```python
func_1 = lambda x: x + 1
```

ruby
ほぼ無い。Procオブジェクトが近い
```ruby
func_1 = lambda { |x| x + 1 }
func_2 = -> (x){ x + 1 }
func_3 = Proc.new { |x| x + 1 }

func_1.call(100)
```


## 文字列処理
### 置換
python
```python
import re
re.sub(r'before', 'after', 'before_text')

'aaahoge'.replace('aa', 'bb')
```

### マッチ
python
```python
import re
re.match(r'hoge', 'hogefuga')
```

## 配列処理
### 参照
python
```python
[][0] #=> IndexError: list index out of range
```

### map
es
```javascript
const hoge = [1, 2, 3].map(e => e + 1)
```

python
```python
a = list(map(lambda x: x + 1, [1,2,3]))
a = [x + 1 for x in [1,2,3]]
```

### map with index

python
```python
list(map(lambda x: (x[0], x[1]), enumerate(['a', 'b', 'c'])))
 #=> [(0, 'a'), (1, 'b'), (2, 'c')]

[(x, y) for x, y in enumerate(['a', 'b', 'c'])]
 #=> [(0, 'a'), (1, 'b'), (2, 'c')]
```

### reduce
es
```javascript
```

python
```python
from functools import reduce
reduce(lambda sum, x: sum + x, [1, 2, 3], 0)
```

### sort
python
```python
sorted([1,3,2])

sorted([1,3,2], reverse=True)

sorted("This is a test string from Andrew".split(), key=str.lower)

student_objects = [
  Student('john', 'A', 15),
  Student('jane', 'B', 12),
  Student('dave', 'B', 10),
]
sorted(student_objects, key=lambda student: student.age) 
```

### filter
python
```python
list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5]))
[x for x in [1, 2, 3, 4, 5] if x % 2 == 0]
```

### zip
python
```python
list(zip(['a', 'b', 'c'], [1, 2, 3, 4]))
#=> [('a', 1), ('b', 2), ('c', 3)]

list(zip(['a', 'b', 'c'], [1, 2]))
#=> [('a', 1), ('b', 2)]

dict(zip(['a', 'b', 'c'], [1, 2, 3, 4]))
#=> {'a': 1, 'b': 2, 'c': 3}
```

## Dictionaryの処理
### dictionaryのmap_key
python

```python
dict([['xx_' + x, y] for x, y in {'a': 1, 'b': 2}.items()])
```

### dictionaryのfilter
python
```python
for (key, value) in { 'id': 100, 'price': 50, 'unit': ''}.items():
        if (key != 'id' and value):
          print(key, value)
#=> price 50
```
Linux OS 情報収集 シェルスクリプト

自分が直接触れない RHEL 8 VM の OS情報を取得する必要があったので、OS情報収集用のスクリプトを作ってみました。

:::note info
NOTE
運用環境で実行する前に、検証環境でスクリプトを検証してください。
:::

https://gist.github.com/yukit7s/ecd696602c7fe0ed011b49130bfd75aa

中のコマンドは必要に応じて書き換えてください。
なお、 シェルスクリプトの中で ```|``` を使うと、直感とは異なる動きになりがちのでご注意ください。

また、スクリプトを書くことに慣れていないので、ベストプラクティスから外れている可能性が高いです。改善点があれば、コメントをいただけますと幸いです。

## 参考
* [シェルスクリプト最大の罠、while問題 | ITmedia](https://atmarkit.itmedia.co.jp/ait/articles/1209/14/news147.html)
よく使うちょっと複雑なLinuxコマンド一覧

ちょっと複雑なコマンド処理の仕方の備忘録

### Contents
ファイル100行目から110行目までを見たいとき
```
cat file | head 110 | tail 10
```

最初から100行目までを削除する
```
# 確認
sed -e '1,100d' /path/to/file | head

# 上書き削除
sed -i -e '1,100d' /path/to/file

```
テキストボックスで動的に表示変更 SELECTEDVALUE 

# はじめに
 スライサー等で項目を選んだときに、テキストボックス・ビジュアルに動的に選ばれたものを表示する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/44a8c1eb-df49-1441-1e9a-08aea8ba616d.png)

## 動作例

実際の動作はこちらの[Power BI レポート](https://ishiayaya.net/AzureServices)を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c8368371-71cb-9016-02be-ecbe6fa619c9.png)


## 動画での動画説明

　2022年4月17日のPower BI Weekly News 19の後半の小ネタコーナーで紹介しました。

https://www.youtube.com/watch?v=4-yUHvMNghI

## メジャーを作成する SELECTEDVALUE

　動的に変える部分をメジャーで準備します。

```javascript:メジャー
measure name = 
SELECTEDVALUE(
    'table name'[column name],
    "カテゴリ名で絞れます"
)
```
第1引数：動的に変えたいテーブル、カラム
第2引数：選ばれていない時等に表示する既定のテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/606270b2-3f22-f611-9249-b5cba40c8715.png)


## テキストボックスでメジャーを呼び出す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/91f898c3-456c-3b08-0ac2-9b6d0091f0e3.png)

## 関連事項
　テキストボックスは内部的にはスマート説明ビジュアルと同じです。
今回はSELECTEDVALUEのメジャーを呼び出していますが、他のメジャーも同様に呼び出せます。

https://docs.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-smart-narrative?WT.mc_id=DP-MVP-5004418

# おわりに
　動的な値の変更は便利なので、適時ご利用を～
CUDAとプロセス並列化で超高速画像処理 with Julia 

# この記事でやりたいこと
NVIDIA GPUで大量の画像処理(20万枚の画像をフーリエ変換するとか)をしたいとき，CUDA C/C++ で書くと Glob を使いたくなるし，Python だと CuPy の遅さが気になるしで一長一短です．Juliaでいいとこ取りしましょう．さらに Distributed.jl の ```pmap()``` を使ってプロセス並列化することでファイルアクセスのオーバーヘッドを軽減でき，さらに高速化できます．

# 実装例

```julia:fftOnGPU
# マスタープロセスでだけ使うパッケージのロード
using Glob
using Distributed
# ワーカープロセスを起動．　今回は10並列．
addprocs(10)
# ワーカープロセスで行う処理は @everywhere をつける．
@everywhere using CUDA
@everywhere using Images
@everywhere using CUDA.CUFFT
@everywhere using FileIO

# 出力したい画像サイズの8bit BMPヘッダを予めpathに用意した画像から読み込む
function getBMPHeader(path)
    io = open(path,"r")
    header = read(io,1078)
    close(io)
    return header
end

# 8bit BMPを保存するための関数． あらかじめ用意したヘッダとデータで無理やり作るよ．
@everywhere function save8bitBMP(path,header,data,dataLen)
    io = open(path,"w")
    write(io,header)
    writeData = UInt8.(floor.(data*255))
    for i in 1:dataLen
        write(io,writeData[i,:])
    end
    close(io)
end

# 画像をGrayscaleで読み込んでFloat32に．
@everywhere function loadImg(path)
    out = Float32.(channelview(Gray.(load(path))))
end

# path の画像をGPUでFFTしてスペクトル分布を保存する関数
@everywhere function fftOnGPU(path, dataLen, header)
    # 処理するファイルのパスを表示
    println(path)
    # 白黒画像ファイルの読み込み．cu()でGPUに配列をコピー．
    img = cu(loadImg(path))
    # 二次元フーリエ変換と fftshift (画像中央が低周波数域になるように変換する処理)
    d_fft = CUDA.CUFFT.fftshift(CUDA.CUFFT.fft(img))
    # 諸々の処理．あとd_fftをComplexF32からFloat32に変換．
    d_fft = Float32.(log.(abs.(d_fft).+1))
    # 値域を0~1に
    d_fft = d_fft ./maximum(d_fft)
    # Array() でGPUからホストへ配列をコピー．
    hostout = Array(d_fft)
    # 保存用パスの準備
    newPath = replace(path,"hoge" => "hogefft")
    println(newPath)
    # 8bit BMPとして保存． Images.jlのsaveだと24bitBMPになっちゃう．
    save8bitbmp(newPath,header,hostout,dataLen)
end

# ./hoge ディレクトリのbmpファイルのパスをリストで取得
pathList = glob("./hoge/*.bmp")
# 画像一辺の長さ
dataLen = 1024

# sample.bmp は出力と同型の画像．ヘッダと流用します．
header = getBMPHeader("./sample.bmp")

# 10個のワーカープロセスに処理を分散．
pmap(x -> fftOnGPU(x, dataLen, header),pathList)
```

# 補足
* ```fft()```や```fftshift()```だけ```CUDA.CUFFT```をつけているのは，Images.jlのFFTWと競合するからです．
* Images.jl の```save()```ではモノクロ8bitBMPの保存はできません．なので出力と同じサイズの8bit BMPを事前に(ImageJとかで)作成して，ヘッダを流用することで出力しています．
* ProgressMeter.jlの```progress_pmap()```が便利らしいですが，なぜかうまく動きませんでした．
* Juliaでは画像輝度値は0~1の実数値で扱います．


# 参考
1. 「高速な計算にむけて」 http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/fast-computing/
1. 「Juliaで超単純にマルチプロセス」 https://qiita.com/kojix2/items/52c0b9cf9c130eae387d
[Unity]TileMapは運用でカバー（解決済）


ただ床に敷いて並べたり、真上から見たマップにコリジョンをつけるだけの場合はとても使いやすいTileMapですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/79e4468a-a106-0bbe-61e7-9c1fc652b2ef.png)

こういったのを縦に重なるように並べて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/16d71777-fda2-a9c3-cf7a-59e04d608dc8.png)

こういったことをしたかった途端に意味不明で大変でした（ポエム）。
というか一応実現できたのですが、次に同じことをやっても同じ結果になる自信がありません。本当にこれであっているの・・・感満載です。


とりあえず。。

####縦横幅１、セルの重なりを0.5にする
つまり正方形の草を上下に半分重なるようにタイリングしたいのですが、
**パレットのプレハブをダブルクリックして、** 設定を下記のようにすることで実現できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/fb55107a-0470-1596-ef27-cabbbea8a5b3.png)

Cell Size=(1,1) Cell Gap=(0,-0.5)です。
ただ最初にこれをやったときは何故かダメでした。途中までCell Size=(1,0.5) Cell Gap=(0,0)で運用していました。
もしかしたら次回やったらシレっと大丈夫かもしれません。それくらい疑心暗鬼です。

そのすぐ下のLayer1の設定は特に変更なしで大丈夫でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/dd1ffa90-86c3-a213-a9cb-672c29c52776.png)

プレハブから抜けてHierarchy上のTilemapに移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/3972f8bd-bc0e-7c09-c305-11041297d31f.png)

Tilemapのスケールが(1,0.5,1), TileMapのOrientation-Scaleが(1,2,1)です。
**なんですかこれ？**

この後、自分がいる場所の草を動かそうと思っているのですが、
```tilemap.layoutGrid.WorldToCell()```で問題が出そうな気がしてなりません。

Transform-Position-Z の-2.71も、プレイヤーが動いたときにそれっぽい位置で優先が変わるように適当に設定した値です。
今は心が折れかけているので、とりあえず動くところから・・・。

さらに、タイル毎に優先を取るためには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/030b984c-517b-3acd-e926-979d4bba8a66.png)
TileMapRendererのSort OrderをIndividualにしておく必要があります。

また、自分はURPモードを使っているのですが、URPモードはTransparencySortModeの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1761abd3-5552-5d61-2692-0d855b887bda.png)
がないので、Render2Dの設定でやっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/410fec93-2ddf-f925-e902-8213905cdc85.png)

とりあえずは以上です。ぬけているところがあったら教えてください。ではまた。

---将来の自分へ 自分より---

**追記**
謎は解けた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4944d6a5-51cb-45ef-55ac-f8bc2510161a.png)
一つ上の階層のGridをいじればよかったんや・・・。
LambdaのSecurityGroupが削除できなくて困った話

# はじめに
AWSの運用として、「このLambda使わなくなったから削除してー」と言われ、
リソースの削除後に、使われなくなったSecurityGroup（以下SG）も削除する。
というのはよくある運用かと思います。

その際に、SGが削除できない、正確にはLambdaのENIが自動で削除されなくて困った
という話になります。

# なにが起きたか
①　VPC内のLambdaを削除

②　Lambdaの実行ロールを削除

③　LambdaのSGを削除するために、
念の為、削除対象のSGがネットワーク・インターフェースにアタッチされていないか確認。
→あれ、まだ使われてるな…（削除したLambdaのENIが削除されていない）
時間かかってるだけかな、、明日になって確認してみるか。。
→翌日、まだアタッチされている。SGの削除を試みるも、もちろんネットワーク・インターフェースにアタッチされているため削除できない旨のエラーがでる。

# 原因
EC2などと同様に、Lambdaも削除後、使用していたENIも自動的に削除されるはずだが、
その際に、Lambdaの実行ロールを使用しているため、ENIの自動削除が終わる前に、
実行ロールを削除してしまうと自動で削除されなくなってしまうとのこと。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-eni-find-delete/
> ネットワークインターフェイスが表すリソースを削除すると、Lambda はネットワークインターフェイスをデタッチおよび削除します。使用されていないネットワークインターフェイスを削除するために、Lambda サービスはネットワークインターフェイスを作成した関数の実行ロールを使用します。

なので、上記の手順でいうと、②で実行ロールを消したのが早すぎて、
ENIの自動削除がされなかったと。（ちなみにENIの自動削除は最大で20分程度らしいです）

# 対処
シンプルにENIを手動で削除してあげれば大丈夫でした。
上記の、AWSのリンクに、「Lambda ENI Finder」なるもので、
ネットワーク・インターフェースがLambdaに使われていないか確認できるそうですが、

今回の場合は、
①　ネットワーク・インターフェースの画面でSG IDで検索
②　削除されるはずだったENIが出てくる。
③　状態が「Available」であることを確認。
④　対象のENIを「アクション」から削除。
→このときに「Avalable」じゃない（どこかで使用されている）ときは削除できません。
⑥　無事、LambdaについていたSecurityGroupが削除可能に。

# おわりに
ENIってほとんど自動で削除されるので、意外と手動で削除したことなくて嫌だなーって
人も多いかと思うので、そんな方は是非スピードにとらわれず、VPC Lambdaを削除した後は
SGの削除行ってから、実行ロールの削除をするようにすれば良いかなと思います！
tweepyでtwitter上のトレンド把握


#  目的 
- ツイートからトレンドを把握する方法を身に着ける

# 手段
- Twitter API
- tweepy

# 実験で分かったこと
- アスパラガスは揚げ浸しが人気らしい
- イーロンマスクからはツイートが取得できなかった。何故か分からない...
    - バイデン大統領やテスラからはツイート取得できた
![wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/873d6d7a-a902-a62d-7ce4-284b0b94f9fc.png)

# 方法
- ツイートの取得
    - [基本実装参考](https://okumuralab.org/~okumura/python/wordcloud.html)
    - [Api.searchが使えない](https://okumuralab.org/~okumura/python/wordcloud.html)
    - [You currently have Essential access which includes access to Twitter API v2 endpoints onlyと表示された時](https://www.sassy-blog.com/entry/2022/02/21/223016)

```python:getTimeLine.py
import tweepy

def remove_url(text):
    return text.split('https')[0] #URLで分割して前半のみを取り出す

def gettwitterdata():

    # APIキー設定(別ファイルのconfig.pyで定義しています)
    Consumer_key  = '各自'
    Consumer_secret  = '各自'
    Access_token  = '各自'
    Access_secret  = '各自'

    #認証
    auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
    auth.set_access_token(Access_token, Access_secret)

    api = tweepy.API(auth, wait_on_rate_limit = True)

    #検索キーワード設定 
    q = 'アスパラガス'
    #screen_name ='elonmusk'

    #つぶやきを格納するリスト
    tweets_data =[]

    #カーソルを使用してデータ取得
    for i, tweet in enumerate(tweepy.Cursor(api.search_tweets, q=q, count=200,tweet_mode='extended').items()):
    #for tweet in tweepy.Cursor(api.user_timeline,count=200,screen_name=screen_name,include_rts=False,exclude_replies = True).items():

        #つぶやきテキスト(FULL)を取得
        # print(tweet.text)
        # text =remove_url(tweet.text)

        print(tweet.full_text)
        text =remove_url(tweet.full_text)
        tweets_data.append(text + '\n')


    #出力ファイル名
    fname = r"'"+ './data.txt' + "'"
    fname = fname.replace("'","")

    #ファイル出力
    with open(fname, "w",encoding="utf-8") as f:
        f.writelines(tweets_data)


if __name__ == '__main__':
    gettwitterdata()

```

- worlcloud化
    - [mecab-python3の取得](https://github.com/SamuraiT/mecab-python3#common-issues)
    - [日本語の文字化けを直す](https://self-development.info/matplotlib%e3%81%ae%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%ae%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e3%82%92%e7%9b%b4%e3%81%99%e6%96%b9%e6%b3%95%e3%80%90python%e3%80%91/)
```python:getTimeLine.py
import MeCab

from wordcloud import WordCloud

FILE_NAME = "data.txt"

with open(FILE_NAME, "r", encoding="utf-8") as f:
    CONTENT = f.read()


tagger = MeCab.Tagger("-Owakati")
parse = tagger.parse(CONTENT)

# fontが無いと日本語は文字化けする
fpath = "./ipaexg.ttf"

#wordcloud.generate(CONTENT)
wordcloud = WordCloud(background_color="white", font_path=fpath, width=900, height=500,
stopwords={'https','http','の','が','を','も','た','と','で','か','から','に','は','て','し','な','だ','する','てる','お','こと','これ'
            'って','いう','この','なる','たら','たい','さん','ある','ない',
            'これ','けど','ん','なっ','や','つ','て','な'}).generate(parse)
wordcloud.to_file("wordcloud.png")

```
【Vue3×TypeScript】 computedプロパティについて

## computedプロパティについて
勉強しているのでまとめておく。

``` typescript
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
・
・
省略
・
・
const budget = 50000

const priceLabel = computed(() => {
  if (item1.price > budget * 2) {
    return '高すぎだろ、ふつうにさぁ'
  } else if(item1.price > budget){
    return 'やばすぎ、それは'
  } else {
    return item1.price + ' yen'
  }
})

</script>
```
 
### template内の記述
```html
<template>
<div class="container">
  <h1>最近の支出だぞーーーーー</h1>
  <input v-model="item1.name" />
  <input v-model="item1.price" />
  <button @click="clear">消すぞ</button>
  <div class="payment">
    <label>{{ item1.name }}</label>
    <label>{{ priceLabel }}</label>   // ここでcomputedの処理を呼び出す
    <a v-bind:href="url1">ここで買いました</a>
    <button @click="buy(item1.name)">購入すんのか？</button>
  </div>
  <div class="payment">
    <label>{{ itemName2 }}</label>
    <label>{{ price2 }} yen</label>
  </div>
</div>
</template>
```

こんな感じでcomputedプロパティについて記述することがができる。

ちなみに、普通のアロー関数で定義をしても同じような挙動をするが、computedを使用することでキャッシュなどをしてくれてよりはやい動作を見込めるらしい。
詳しいことはわからないので、気になる人はググってください。Vueの公式にも買いてありそう。
【初心者応援】新人だった頃に行っていた習慣まとめ

# はじめに
[新人プログラマ応援 - みんなで新人を育てよう！](https://qiita.com/official-events/3f21c92121aa125807b4)
ということで、今月から社会人となり、エンジニアになる方も多いのではないでしょうか？
今月は上記イベントに合わせて初心者応援をキーワードとして記事を書いていこうと思います。

今回は初心者応援記事第4弾、私が新人だった頃に行っていた習慣を幾つかご紹介したいと思います。
初心者の方が日々業務を進めていく中で参考になるかはわかりませんが、少なくとも現在に至ることができたのはこの習慣があったからだと思いますので、何かの参考になればと思います。

# 習慣その１：GitHubのコードを毎日熟読する
まず１つ目に、ひたすらコードを読むという事を日々の日課にしていました。
エンジニアとして駆け出しの頃、SESという都合上どうしても出向先を切り替えるタイミングがありますが、その度に切り替え先のコードを理解するのに時間がかかり、悶々としていました。
この課題を解決する為に始めたのが、GitHubのコードを読むという事でした。

参画している現場が長ければ長いほど、そこの記述方法から脱するのが難しくなり、切り替えるコストがかかります。
その点、GitHubに上がっているコードは知らない方が書いた自分の枠から外れているコードであり、視野を広げるという点でも学びが深かったです。
また、この習慣は今でも続けていて、現在でも学びのベースになっています。

# 習慣その２：他のアプリで実装されている機能の動きを再現してみる
2つ目ですが、普段から使っているアプリや気になっているサービスで実装されている動きを実装してみるという事です。
新人だった頃は仕様書やデザイン上の機能を再現する能力がなく、中々期待した動作を実装できず悩んでいました、、、
そんな中で少しでも再現力を上げる為に始めたのが、他のアプリやサービスで実装されている機能を真似するという事でした。
時間がある時は週に3つほど、少なくとも週に1つの機能は真似するようにしていました。
これを続けている事で、動きと実装のイメージがつくようになり、実装のクオリティを上げることができたかと思います。

# 習慣その3：質問の仕方を考える
3つ目ですが、とにかく周りの方とのコミュニケーションの取り方を気にする習慣をつけていました。
新人の頃はとにかく聞けばいいとロケットスタート的に情報をぶつけてしまっていました。
そんな事を続けていたある時、私の質問に悩んでしまう方が多い事に気がつき、質問の投げ方を考えるようになりました。
たくさんの情報をぶつけてしまうと結果何が聞きたいのかわからなくなってしまう事から、まず知りたい事を頭出しし、その上で調査した内容などを添えるように調整しました。
そうする事で回答いただく際もスムーズになり、コミュニケーションが円滑になっていきました。

# さいごに
記事を書く際に初心に戻り、振り返りながらまとめていましたが、日々の試行錯誤の連続が今の自分を作ると改めて実感しました。
新人だった頃の自分をいつでも思い出せるよう、定期的にこちらを見直そうと思います。
NestJSでアプリを構築する際に気をつけたいこと

# はじめに

NestJSバックエンドアプリはデフォルトのままだと、サーバ情報がバレます。
下記のResponse HeadersのX-Powered-Byをご覧ください。Expressだとバレます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/2507d03c-1c79-d394-2b52-f4d6150bbd47.png)

例えば、Expressの脆弱性が発見された場合、サーバに対して攻撃を受ける可能性があります。
そこで、サーバ情報を隠す方法があります。

---

### main.tsにimport文を１行追記します。

```js:main.ts
import { NestExpressApplication } from '@nestjs/platform-express'; //  追記
```

### main.tsを修正して、更にコードを１行追記します。

```js:main.ts
// const app = await NestFactory.create(AppModule); // 修正前
const app = await NestFactory.create<NestExpressApplication>(AppModule); // 修正後
app.disable('x-powered-by'); // 追記
```

---

下記のようにレスポンスヘッダーにX-Powerd-Byの項目が非表示となりました。
これでサーバ情報が、ExpressなのかApacheなのかNginxなのかバレません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/ea5a9df3-09f7-6f52-b8b6-fbc27b68c4c3.png)



以上です。
エラー回避録１(初投稿)

# はじめに
エンジニアなり立てで、使ったことがまだないフレームワークに触れてみようとおもい、
Pythonのフレームワークである「Django」を[Corey Schafer](https://www.youtube.com/watch?v=qDwdMDQ8oX4)という方のYoutubeで学習しております。
※英語に自信のある方はおすすめです！ぜひ参考にしてみてください！

# 今回のエラー
確認のためにコードを書きrunserverしたところ、
***A server error occurred.  Please contact the administrator***
とだけブラウザに表示されました。ぴえん。

コマンドプロンプトを見ると
**ZoneInfoNotFoundError(f"No time zone found with key {key}")**
...ふむふむタイムゾーンが見つからないと。

```ruby:settings.py
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia Tokyo'

USE_I18N = True

USE_TZ = True
```
...書いてあるがな。

# 回避するには

偉大なるGoogle先生に確認、
そして正解を発見いたしました。
[参考URL](https://stackoverflow.com/questions/71058888/zoneinfonotfounderror-no-time-zone-found-with-key-utc)

```ruby:settings.py
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_TZ = True
```
正解はスラッシュがAsiaと東京の間に必要でした。
誰かの助けになりますように。
AtCoderのB - FizzBuzz Sum問題をC#で解くことを楽しむ

**み垣もり衛士のたく火の夜はもえ昼は消えつつものをこそ思へ**

Advent Calendar 2022 101日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

この記事は、[AtCoder](https://atcoder.jp/)の[B - FizzBuzz Sum](https://atcoder.jp/contests/abc162/tasks/abc162_b)問題をC#で解いてみます。

私はC#初心者です。
なにかのタイミングで「C#やってみます！」と元気よく書いた気がするので、おもむろに[AtCoder](https://atcoder.jp/)をC#で解いてみます。
[B - FizzBuzz Sum](https://atcoder.jp/contests/abc162/tasks/abc162_b)問題は良い問題だとおもっています。


# [AtCoder](https://atcoder.jp/)とは?

> AtCoderは、世界最高峰の競技プログラミングサイトです。
> リアルタイムのオンラインコンテストで競い合うことや、
> 3,000以上の過去問にいつでもチャレンジすることができます。

https://atcoder.jp/

# プログラム


```cs
using System;
 
class Program
{
    static void Main()
    {
        long n = long.Parse(Console.ReadLine());
        long sum = 0;
        for (long i = 1; i <= n; i++)
        {
            if (i % 3 == 0 || i % 5 == 0) {
                continue;
            } else {
                sum += i;
            }
         }
         Console.WriteLine($"{sum}");
    }
}
```

`C#(.NET Core 3.1.201)` でパスしました。

---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:


この記事は、[AtCoder](https://atcoder.jp/)の[B - FizzBuzz Sum](https://atcoder.jp/contests/abc162/tasks/abc162_b)問題をC#で解いてみました




以上です。





---

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)

---

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We appreciate this shoutout, Torifuku! <a href="https://t.co/dThmJg4CYN">pic.twitter.com/dThmJg4CYN</a></p>&mdash; ClickUp (@clickup) <a href="https://twitter.com/clickup/status/1513541411634913284?ref_src=twsrc%5Etfw">April 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
GPSを使ったNTPサーバの構築 その4 送信センテンス限定の結果

# 1.送信センテンスを限定した結果
[前回](https://qiita.com/R800/items/48eff85c240e3059d780)、NMEAドライバのリファレンスの記載通りGPSレシーバーからの送信センテンスを限定してみたが、有意な差はみられなかった。下図は設定変更後、2日目からの5日間のoffsetをグラフしたもの(記録していたpeerstatsから作成)。
![ntp_peers-pinpoint=1649602800,1650034800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611482/5872acb4-5dd7-92ee-0237-c423bdf0fd4a.png)

転送速度の遅い(4800bps) GLOBALIST BU-353S4の遅延が多少なりとも解消されるかと考えていたが、[設定変更前のグラフ](https://camo.qiitausercontent.com/7b003b49461fcbbe17c4be1e25a71d7479dc8ade/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323631313438322f30356532323965372d666263342d396164352d343561362d3933303561386332653131632e706e67)と比較してそうした変化がみられない。BU-353S4はoffsetに100msの変動が出ているので、少々の差はそれに紛れてしまっている可能性もある。ではjitterに変化はあったのか?と思いグラフにしてみた。
- BU-353S4 送信センテンスデフォルト時のjitter
![変更前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611482/5b9277e9-e23e-7f25-a46d-a9812bf64609.png)
- BU-353S4 送信センテンス限定後のjitter
![変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611482/aebb4ffa-cb87-d274-7dea-25fa470da805.png)

10msを超えてるのはoffsetに大きな変動があった時。センテンスの限定とは別の要因っぽいので置いといて、それを除くとなんとなくjitterが減ったか?程度。
一応各GPSレシーバーのjitterの中央値を算出してみた(平均値はBU-353S4のように大きなoffset変動があると当てにならないので見ない)。

| GPSレシーバー | 変更前 | 変更後 |
|:-|:-:|:-:|
| VFAN UG-353(9600bps) | 2.812 ms | 2.771 ms |
| GLOBALIST BU-353S4(4800bps) | 7.151 ms | 6.347 ms |
| LOCOSYS LS22030-V2(115200bps) | 5.779 ms | 5.154 ms |

一応、送信センテンスを限定するとjitterが抑えられており精度には寄与しているようだが、offset変動が20ms以上ある状態なのでそう大きな要素ではなさそう。
ちなみにNMEAのリファレンスに送信センテンスの限定について書かれたのを[調べた](https://github.com/ntp-project/ntp/commit/fbbd23151bb6909a8554a9380757f41fe1c36cf8)ら2010/11/9だった。もしかするとスペックの低いマシンだともっと違いが現れていたのかも知れない。

## BU-353S4
jitterをグラフにして気づいたが、時々起こる大きなoffset変動とは別に、周期的な変化が見られる。グラフは掲載しないが、他の2つのGPSレシーバーではこうした周期的な変化は見られなかった。
GPSモジュールの特性か、掴んでる衛星によるものか。

# 2.転送速度の変更
次は転送速度を上げて、しばらく様子を見る。
ntpdが対応する最大転送速度は115200bpsまでなので、最低転送速度が115200bpsのLS22030-V2はこのまま。UG-353とBU-353S4はそれぞれの最大速度38400bpsに上げる。

~~~sh:UG-353
$ ubxtool -P 14 -f /dev/gps0 -S 38400
$ ubxtool -P 14 -f /dev/gps0 -p SAVE ※1
~~~
~~~sh:BU-353S4
$ printf '$PSRF100,1,38400,8,1,0*3D\r\n' > /dev/gps1
~~~
※1 u-bloxは変更しただけでは設定が保存されないので、SAVEで現在の設定を不揮発性メモリに保存する。

# おまけ.NMEAコマンドのチェックサム計算
リファレンスを見ながら送信するNMEAコマンドを作るが、チェックサムの計算が面倒なのでこんな感じのスクリプトを作っている。perlやrubyでなくawkを使ってるのは単なる好み。
~~~sh:put_nmea.sh
#!/bin/sh
printf '$'
printf "${1}"
printf '*'
echo $1 | awk 'BEGIN{for(i=0; i<=255; i++) {Asc[sprintf("%c", i)]=i}; cs=0;} {for(i=1;i<=length($0);i++) {cs=xor(cs, Asc[substr($0,i,1)]);}} END {printf("%02X", cs)}'
printf '\r\n'
~~~
~~~sh:使い方
$ put_nmea.sh "PSRF100,1,38400,8,1,0" > /dev/gps1
~~~
セキュリティ トークン サービス (STS) から返される AADSTS エラー コードの取得ページ

# 背景
単純に、こんなのがあるんだ！と驚いたと共にいつか使えそうだなぁと思ったので記録

# 概要
https://login.microsoftonline.com/error 

このページで、エラーコードを入れることで、詳細が取得出来る、というだけのお話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7ee2a452-8b4a-034e-32ff-676a2bd9cc2b.png)

実際は、エラーコード入れて、検索して到達する方が速そうなので、本気で使うことは極稀ですね、きっと

でもって、紹介ページは以下。一覧欲しい場合なら、上をたたく必要もたぶんない（最新は上だけかも？）

https://docs.microsoft.com/ja-jp/azure/active-directory/develop/reference-aadsts-error-codes

> login.microsoftonline.com 

は、

> https://www.office.com/?auth=2

にリダイレクトする、ある意味 Office のトップページみたいなもの。

# あとがき
こういう隠し？API URL とかを探索するツール作ったら面白そうね。

既にだれか作ってるんだろうなぁ・・なんて

おしまい