OmniAICreator/Qiita-1.07M huggingface dataset:
TF-IDFとは？

## tfとは
tfとは単語出現頻度のことです。文書をd、語をwとするとdの中にwが何回出ているかを意味します。本記事では、TF(d, w)とおきます。

## dfとは
dfとは文書頻度のことです。文書の集合をD、語をwとすると、dfはwが出現している文書の数となります。本記事では、DF(D, w)とおきます。

## idfとは
idfはdfの逆数にlogを取ったもので、式で書くと次のとおりです。

```mathematica
IDF(D, w) = log(|D| / DF(D, w))
```
|D| / DF(D, w)は、DF(D, w)が小さいほど大きな値をとります。英語の文書を考えると「the」、「You」といったような単語はどのような文書でも出てくるはずなので値は小さくなります。すなわち、特定の文書にしか出ないかどうかを表す指標といえます。

## tf・idfとは
tf・idfとは、ある文書をdとしたときに、dの中にある語wが文書dの特徴を表しているかの指標となります。
式で書くと、

```mathematica
TFIDF(d, w) = TF(d, w) ・ IDF(D, w)
```

となります。

tfは「文書内に語wが何回出るか」でした。頻繁に出る語ほどその文書の主題を表していそうです。一方で、tfだけだと、「the」や「You」のような単語も特徴語と判断されてしまうので、idfをかけることによって「どの文書にも出てくるような語」を除くようにしています。

よって、tf・idfが大きいほどwは特徴語であろうと推測されます。

## idfの定義再考
idfとは以下の式で表されました。

```mathematica
log(|D| / DF(D, w))
```

しかし、

```mathematica
|D| / DF(D, w)
```
だけでも「特定の文書にしか出ないかどうか」を表す指標といえそうです。なぜlogをとるのでしょうか。

ここでは、文書数|D|を大幅に増やした時のことを考えてみます。この時、「the」や「You」のような単語の場合は、DF(D, w)の値も大きく増えるはずですから、結果として、|D| / DF(D, w)の値はそこまで変動しないでしょう。
一方で、「ある特定の文書にしか出てこなさそうな単語」の場合はどうでしょうか。|D|が増えたとしてもDF(D, w)はほとんど増えないと考えられます。よって|D| / DF(D, w)の値は大きく増えます。

ここで、wが文書dの特徴語かどうかの指標を

```mathematica
TF(d, w)・|D| / DF(D, w)
```

で表したとします。

wとして、「ある特定の文書にしか出なさそうな単語」で、かつ今注目している文書にはあまり出てこない単語を考えてみます。このとき、文書にあまり出てこないことからwは明らかに特徴語にはならないと考えられます。しかし、|D|を増やしたとき、|D| / DF(D, w)が非常に大きくなるので、結果として特徴語であろうと判断されそうです。

しかし、logをとると文書数|D|を増やした時の|D| / DF(D, w)の変動は抑えられるので上記のようなことは起こりにくくなります。すなわち、logをとることによってTFとIDFの両方の影響をバランスよく含ませることができます。

以上がlogをとる理由です。
【Android】HttpUrlConnectionを使ってみる

# 【Android】 HttpUrlConnectionを使ってみる

## 概要
Androidで通信を行う際は、[Retrofit](https://github.com/square/retrofit)がデファクトかなと思いますが、
HttpUrlConnectionを試しに触ってみたものの記録です。

## とりあえず公式を読もう
まずは[公式ドキュメント](https://developer.android.com/reference/java/net/HttpURLConnection?hl=ja)を読みました。

### ドキュメントを読んで分かったこと

以下は、公式の最初に出てくるサンプルコードです。
やっていることは、URLに対してGETリクエスト実行して、レスポンスを受けとるという処理です。

``` 公式ドキュメントのサンプルをKotlinに変換.kt
val url = URL("http://www.android.com/") 
val urlConnection : HttpUrlConnection = url.openConnection() as HttpUrlConnection
try {
   val inputStream = BufferedInputStream(urlConnection.getInputStream())
   readStream(inputStream) // ※この部分を、コピペしても動かない
 } finally {
   urlConnection.disconnect()
}
```

まず以下で、URLからURLクラスのオブジェクトを作成して、
作成したURLオブジェクトで、`openConnection()`を実行します。
[openConnection()について](https://docs.oracle.com/javase/jp/8/docs/api/java/net/URL.html#openConnection--)
openConnection()によって、リクエスト先とのコネクションを確立します。

``` サンプルコードの上半分.kt
val url = URL("http://www.android.com/") 
val urlConnection : HttpUrlConnection = url.openConnection() as HttpUrlConnection
```

次に、レスポンスの処理方法について
まずurlConnection.getInputStreamで、レスポンスのボディを受け取ります。
そして、`readStream`は、おそらく自分で定義するメソッド？
なので、そのままコピペしても動かないです。
受け取ったInputStreamをStringなどに変換する処理を実行するものと思われます。

そして、finallyで、`urlConnection.disconnect()`でリークしないように、コネクションを切断します。

``` サンプルコードのtry以下.kt
try {
   val inputStream = BufferedInputStream(urlConnection.getInputStream())
   readStream(inputStream)
 } finally {
   urlConnection.disconnect()
}
```

### 追加で分かったこと

``` 追加で分かったこと.kt
val url = URL("http://www.android.com/") 
val urlConnection : HttpUrlConnection = url.openConnection() as HttpUrlConnection

urlConnection.setRequestMethod("GET") // "POST"などにすることで、HTTPメソッドを変更できる。デフォルトはGET

urlConnection.connectTimeout(6000) // msで接続のタイムアウトを設定可能

urlConnection.readTimeout(6000) // レスポンスの読み取りタイムアウトを設定

urlConnection.setRequestProperty("Key", "value") // リクエスト ヘッダーにContent-Typeを設定。 
// 例: setRequestProperty("Content-Type", "application/json; charset=utf-8")

``` 

## 感想
公式でもRetrofitが推されているように、HttpUrlConnectionでやる必要はないかなと思いました。

## 参考
[HttpUrlConnection](https://developer.android.com/reference/java/net/HttpURLConnection)
[Androidの通信ライブラリの歴史を振り返る](https://qiita.com/Reyurnible/items/33049c293c70bd9924ee)
MAMP環境のDB接続エラー[SQLSTATE[HY000] [2002] Connection refused]

最近パソコンをMacに変えてMAMP環境で学習しています。

PHPからDBに接続する時、ちょっとハマってしまった点があったのでこちらに忘備録も兼ねて記載しておきます。

#PDOの引数

PHPでPDOのオブジェクトを生成してデータベースに接続する際には、引数として以下のように3つ必要です。ちなみにPDOはPHP Data Objectの略でPHPでデータベースを扱うときにオブジェクトになります。

```PHP:PHP
new PDO('接続文字列','ユーザー名','パスワード')
```


#XAMPP環境

WindowsではXAMPP環境で以下の記述でデータベースに接続できていました。

```PHP:PHP
<?php
try{
    $db = new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','');
} catch(PDOException $e) {
    echo 'DB接続エラー:'.$e->getMessage();
}
?>
```
#MacでのDB接続エラー

MacでもMAMP環境で同じようにやればいいかなと思い、同じ記述でデータベースに接続してみたところまさかのエラー

```
DB接続エラー:SQLSTATE[HY000] [2002] Connection refused
```

#MAMP環境

どうやらMAMP環境ではPDOの引数の記述が違うようで、正しくは以下の通りです。

```PHP:PHP
<?php
try{
    $db = new PDO('mysql:dbname=mydb;host=localhost;charset=utf8','root','root');
} catch(PDOException $e) {
    echo 'DB接続エラー:'.$e->getMessage();
}
?>
```

PDO接続文字列のところで、host=に後に続くのがXAMPPでは`127.0.0.1`なのに対して、MAMPでは`localhost`になります。またパスワードがXAMPPでは`''(空文字)`なのに対して、MAMPでは`'root'`になってます。これは初期値となっておりこちらも変更しないといけません。

参考書やテキストではXAMPP環境での記述が多いので、MAMP環境で接続エラーになっている人がいたらとりあえずhostをlocalhostに、パスワードをrootにしておけばOKです。

以上！！
python ループ処理速度(append vs reduce)

# 結論
割と大きめのデータ処理をしている時、もっと処理速度を早くしようと思って色々いじっていたら、reduceよりappendの方が断然早かった話

# はじめに
実行時間計測に使用するデータはこれで生成

```python
import random
data_list = [random.randint(-2, 2) for _ in range(100000)]
```

作ったデータをどのように処理したいかというと、
配列のある要素x_nとその要素のひとつ前x_(n-1)を加算した新しい配列を生成したい↓

```
[1, 2, -1, -2] => [1, 3, 2, 0]
```

# ループ処理
## appendメソッドを使う
```python
def append_loop(data):
    out_put = [data[0]]
    for i in data[1:]:
        out_put.append(out_put[-1] + i)
    return out_put

# 実行時間: 0.019423961639404297
```
appendは破壊的メソッドとよばれ、思わぬバグを発生させることが多く。また空の配列を用意しなくてはいけないため、コード量がその分多くなったりするので割と避けていたが速度は非常に早かった。


## reduce

```python
def reduce_append(li, elem):
    return [elem] if not li else li + [li[-1] + elem]

# 実行時間： 11.915228843688965
reduce(reduce_append, data_list, [])
```
reduceを使う場合は非常にコード簡潔になるが、速度に関しては大きな差が開いている。およそ600倍の時間がかかっている。
これにはif文があるから実行時間が遅くなった可能性があるので、少々可読性は落ちるが、そのパターンも作成

```python
def reduce_append(li, elem):
    return li + [li[-1] + elem]

# 実行時間: 10.55799412727356
reduce(reduce_append, data_list[1:], [data_list[0]])
```
実行時間は1秒くらいしかかわらなかった。

## おまけ
### 内包表記

```python
[sum(data_list[:i + 1]) for i in range(len(data))]

# 実行時間: 86.43631505966187
```
一行でかけるが、遅すぎて使い物にならない。sum関数自体にループがあるからしゃーない

### 再帰関数

```python
@tail_recursion
def recursive_function(result_array, origin_array, index):
    if len(result_array) > 0:
        result_array.append(result_array[-1] + origin_array[index])
    else:
        result_array.append(origin_array[0])
    if len(origin_array) > index + 1:
        return recursive_function(result_array, origin_array, index + 1)

# 実行時間: 0.08165287971496582
recursive_function(result, data_list, 0)
```
わかりにくいがそこそこはやい。テクニークの練習にはなる。

## おわり
append使うのはダサいとか、カッコ悪いとか、初心者とかおもっていたけどちょっと見直しました。まぁ私、初心者なんですが笑
なにか他に良い方法があったら教えてくださいヽ( ◔ ౪ ◔ )ﾉｲｯﾊﾟﾂﾃﾞｺﾝﾊﾟｲﾙﾄｵｯﾀｧｧｧｧwwwwww
LaravelでIntervention/Imageを使う際に、GD拡張機能を使うためのDockerfileの書き方

#環境
・Docker, docker-composeを用いてLEMP(laravel, php-fpm, nginx, MySQL)環境
・php-fpm7.4
・MySQL8.0
・nginx1.8

#概要
LaravelでIntervention/Imageを使って画像のアップロード機能を実装する際に、以下のエラーが出た。

###エラー
```
GD Library extension not available with this PHP installation
```
「このPHPインストール環境では、GD拡張機能は使えませんよ」という意味。

###同様の事例
同様の事例を調べたところ、以下の記事がヒットした。
[LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法](https://qiita.com/njn0te/items/1807c0ef2c0cbc94a305)

この記事によると、「Intervention/Image」はPHP5.4以上では、画像処理ライブラリのGDまたはImageMagickをインストールする必要があり、下記の対処を行えば良いとのこと。

```
apt-get update
apt-get install php7.0-gd
```

しかし、Dockerfileに上記```apt-get install php7.0-gd```を追記してもそんなパッケージはありませんと怒られてしまう。

#対処
DockerでGD拡張機能を使うためにDockerfileをどのように書き換えれば良いか模索した結果以下の記事とその参考元のDockerfileの使い方の表記を発見。

・ [DockerでのGD拡張についてPHP/Laravel](https://teratail.com/questions/246204)
・ https://hub.docker.com/_/php

上記を参考にphp実行環境のDockerfileを以下のように修正

```Docker:Dockerfile
FROM php:7.4-fpm-buster
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

ENV \
  COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer

RUN apt-get update 

RUN apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales \
+	libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \  //追記：GD拡張に必要なパッケージ
	apt-get clean && \
	rm -rf /var/lib/apt/lists/* && \
	locale-gen en_US.UTF-8 && \
	localedef -f UTF-8 -i en_US en_US.UTF-8 && \
	mkdir /var/run/php-fpm && \
	mkdir /var/log/php && \
	docker-php-ext-install intl pdo_mysql zip bcmath && \
+	docker-php-ext-configure gd --with-freetype --with-jpeg && \ //追記
+	docker-php-ext-install -j$(nproc) gd && \ //追記
	composer config -g process-timeout 3600 && \
	composer config -g repos.packagist composer https://packagist.org

COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /work/backend
```

#結論
LEMP環境下でGD拡張機能を使えるようにするためには、Dockerfileに下記コードを追記する必要がありました。

```
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
```

```
docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-install -j$(nproc) gd
```

#参考
・ [LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法](https://qiita.com/njn0te/items/1807c0ef2c0cbc94a305)
・ [DockerでのGD拡張についてPHP/Laravel](https://teratail.com/questions/246204)
・ https://hub.docker.com/_/php
　→特に参考になりました。
【ROS Python】Subscriberがqueue_size=1でも最新のメッセージを受け取れいないときの対処

# この記事の要約

- ROSにおいて，PythonのSubscriber内部の処理が重い場合，queue_size=1としても最新のメッセージを受け取らなくなる
- Subscriberのbuff_size=2**24などとすると対処できるとあると他の記事で書かれている（しかしこれで対処できなかった）
- 結果，元のPublishrをqueue_size=1とすることで対処できた


# queue_size=1としても最新のメッセージを受け取らない場合がある

``` sub.py
sub = rospy.Subscriber('/image_raw', Image, imageCb, queue_size=1)
```

queue_size=1とすると，複数のメッセージ（上の場合は/image_rawという画像）を保持しなくなるため，たとえimageCBの処理が重くても，常に最新のメッセージに対する処理ができる様に思えます．しかしなぜか，メッセージを複数保持してしまい，時間が経てば経つほど最新のメッセージと処理するメッセージの間に時間遅れが出てきてしまいます．

# 大きめのbuff_sizeを指定して対処

``` sub_buf.py
sub = rospy.Subscriber('/image_raw', Image, imageCb, queue_size=1, buff_size=2**24)
```

上に示す様に，Subscrierのbuff_sizeを大きくすると対処できるという記事を発見．例えば[ココ](https://answers.ros.org/question/50112/unexpected-delay-in-rospy-subscriber/)．しかしこれでも問題は直せず．


# Publisherもqueue_size=1とする

``` pub.py
pub = rospy.Publisher('/image_raw', Image, queue_size=1)
```

ここまでやってちゃんと予期した挙動になりました．理由はよくわからないけど，とりあえずこれで最新のメッセージに対してだけ処理ができる様になりました．


# この記事のまとめ

ROSにおいてPythonのSubscriberの処理が重い場合，queue_size=1としても最新のメッセージだけを処理することができないという問題を見かけました．buff_size=2**24など，Subscriberのbuff_sizeを大きくすると直せるという記事を見つけましたが，結果直せませんでした．最終的に，Publisherもqueue_size=1とすることで予期した挙動となりました．
Python Library


#ライブラリ
pythonのライブラリは非常に優秀なものが揃っていると言われる

#システム
##pip(標準)
ライブラリを管理
##sys(標準
「システムパラメーター」という、システムの挙動に外部から干渉できるデータに関する関数が含まれています。


#日付
##datetime(標準)
datetimeの主な機能は、時刻に関するものです。

・現在の日付と時刻の取得
・年月日から時分秒までを単体で取得
・日付の足し算や引き算
##dateutil
dateutilは、標準ライブラリであるdatetimeの扱いにくさ、機能不足を補ってくれます。
dateutilの主な機能はこちらです。

・現在時刻の取得
・日付の足し算と引き算

##calendar
その名の通りカレンダーの表示や、日付の計算等ができます。
日付データを表示するライブラリとしてある程度便利

#数学系

##math(標準)
・円周率などの表示
・平方根や自然対数などの計算
##Numpy
配列や行列の演算を高速で行うことができ、非常に人気のあるライブラリでもあります。

・配列の演算
・行列の演算

##matplotlib
データをグラフ化するのに非常に便利なのが、このmatplotlibです。

・sinやcosの計算式をグラフ化
・グラフにタイトル、軸名、凡例などを付ける
・グラフの線の色、線種を変更できる

matplotlibは、mathや numpyとも相性がいいです
#統計・データ処理

##pandas
データの統計量の表示や、そのグラフ化ができます。
Pythonでデータ分析や機械学習を行う場合には必須となるライブラリです。

・データ概要の表示
・データの行数列の表示
・統計量を表示

##sklearn
こちらは、比較的簡単な機械学習アルゴリズムです。

学習させたいデータを入力して学習させ、予測したいデータを入力することで予測の正答率を算出することができます。

・分類
・回帰
・クラスタリング

#画像処理

##Pillow
基本的な画像処理を行うライブラリです。
次に紹介する「OpenCV」のような高度な処理はできないものの、シンプルな構造で使いやすいという特徴があります。

・画像の表示
・画像のリサイズ
・画像のトリミング

##OpenCV
コンピュータで画像、データを処理するのに便利な様々な機能を備えています。
Pythonで画像処理を行う場合は欠かせないライブラリです。

・画素データの表示
・輪郭の抽出
・合成

##TWINT
TWINTはツイッターのスクレイピングライブラリーです。

ツイッターAPIなしにツイートをスクレイピングできます。

###便利
##iclawler
iclawlerはキーワードを指定して、まとまった画像を一気にダウンロードできるライブラリ
機械学習などのトレーニング用の画像をキーワード指定で一気に集められるのがこのライブラリ。
100枚など枚数を決めてダウンロードすることができます。
フォルダを作って指定のキーワードでネット上にある画像を集めてくれるので、とても便利

##PyCaret
わずか数行という簡単なコードの記述のみで機械学習の前処理、モデルの構築、はたまたデータ可視化まで行ってくれるライブラリです。
機械学習でおなじみのscikit-learnなどのライブラリの機能を含んでいます。
PyCaret2.0ではautomlの機能が追加され、かなりパワーアップされました。
正直AUTO MLか！とまで言われたライブラリ。
機械学習入門者にはぜひ使って欲しい。

##pickle
pickleはあらゆるデータを保存しておくのに便利なライブラリ。
リスト、文字列、クラスのインスタンス、データフレームなど色々なデータをバイナリファイル形式に変換して保存することができ、呼び出すのも簡単です。
メリットはプログラムをシャットダウンしてもデータが保存されていること、CSVからの読み込みよりもスピードが数十倍から100倍程度早いことなどです。

##pytube
Youtubeの動画をダウンロードすることができるライブラリです。
例えば動画の文字起こしのプログラムを作るために、何か適当な動画を使いたいなどの理由で使えます。
pytubeを使えば、好きな動画を指定して自由にダウンロードすることができるので、便利
Arduino UNOとMCP3425で電圧を測る(MCP3425A0T-E/CH 16bitADC)

Arduino UNOとMCP3425で電圧を測る(MCP3425A0T-E/CH 16bitADC)

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり



```c++

#include <Wire.h>
#define ADD 0x68

float Volts;
float Vref = 2.048 ;
 
void setup() {
    Wire.begin();         //i2cの初期化
    Serial.begin(9600);

    // 7 *(1)待ち
    // 6 *(0)
    // 5 *(0)
    // 4 (0)ワンショット,*(1)連続
    // 3 | (00)12ビット,(01)14ビット
    // 2 | *(10)16ビット
    // 1 I *(00)x1,(01)x2
    // 0 I (10)x4,(11)x8

    //初期値の書き込み
    Wire.beginTransmission(ADD);
        Wire.write(0b10011000); //16bit 15sps PGA x1
    Wire.endTransmission();
}

int read_data() {

    //2文字の読み込み
    Wire.requestFrom(ADD, 2);

    //戻し
    return ( (Wire.read() << 8 ) + Wire.read() );
}
 
void loop() {
    Volts = read_data() * Vref / 32767.0 ;
    Serial.println(String(Volts,5));
    delay(1000);
}

```

![mcp3425_uno_vol_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e3df602e-9a85-ec71-e906-f6a8259a8d05.jpeg)

![mcp3425_uno_vol_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5227949b-c012-63f7-ba99-b77907b41c59.jpeg)
picoCTF 2021 tunn3l v1s10n Writeup

何度，心が折れても，あきらめずに粘り強く頑張った結果解けた問題なので，うれしさのあまり Writeup を残す。やったぜ！！！

# tunn3l v1s10n
Category: Forensics
Description:
We found this file. Recover the flag.
Hints:
1. Weird that it won't display right...

Solution:
fileコマンドでファイルの種類を確認

```
$ file tunn3l_v1s10n
tunn3l_v1s10n: data
```

バイナリエディタでは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/245a7447-c5a9-5bfe-2840-831a14cf5496.png)
ヘッダのシグネチャ的には，BMなのでビットマップだが。

http://www.umekkii.jp/data/computer/file_format/bitmap.cgi


https://nipponkaigi.net/wiki/BMP_file_format


ビットマップか否か検証していく。
まずはサイズから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/f6751fe9-4512-9022-bf20-9a02af8f2675.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/0cc98d34-c80f-d6c0-ca15-a5a064d1322c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/96298e26-4bf8-e2e3-99a4-b74fe7456f0a.png)
ビンゴ！　ビットマップの可能性大

とりあえず拡張子をbmpにしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/881e505d-6fe2-1180-ec8d-0aff0a1cc321.png)
やっぱダメよね

検証を続ける
予約領域１
予約領域２
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/9dedd597-bf40-65cf-6bc4-c74038e17918.png)
0x0000 0x0000 なのでOK!

ファイル先頭から画像データまでのオフセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/97e443d4-385c-978a-2aaa-15ac3c840b95.png)
0xD0BA
ちょっと遠いけど，どうせピクセル配列の区別つかないから，ひとまず置いとく。

情報ヘッダサイズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/c969cfb9-9798-a761-aa90-9e2166ae4345.png)
0xD0BA
これは明らかにおかしい
なぜなら　

```
情報ヘッダサイズ = ファイル先頭から画像データまでのオフセット - 0xE
```

でなければならないから
しかも0xD0BAは大きすぎる

40 (0x28)に変更してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/dca6b55b-d061-3144-0814-fbc06f1ec51e.png)
プレビューは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/908d1894-b1c0-5895-0dcc-dbed9cb2ceb7.png)
なんか見えた!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/bf0bbd0e-e22e-ba24-1df3-dafccbbdccc3.png)
フラグっぽいのがあるので拡大
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/80c363c8-e7a1-f5a3-9257-69285da87e0d.png)
残念，ハズレ

なんか横に長すぎるので高さを変更してみる。
pngみたいにCRCは無いので，ひたすら試行錯誤。

横
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/24216368-8a3c-eed4-85df-865f5e660f27.png)
0x46e = 1134ピクセル

縦
4:3でいってみる
1134/4*3=849 (0x351)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/5a39a0f6-0f98-d8a6-797a-4876bb2397e1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/37e610c6-bac6-66a0-a44c-bd5588af9f75.png)
ダメだ。プレビューできなくなった。

試行錯誤省略

0x340 で成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/e6940f4c-2e3a-59c0-4c5b-dd6dc6ef3496.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/425ebd18-04f5-1036-c620-ddd4a084a5d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/cfad6920-2de2-70ee-cea9-36b8e7d4ac2c.png)

あー、ビールが美味いわ。
GASもGitHubでバージョン管理(2021/4)

できるわけないと思っていましたがどうやら常識だった模様。
##準備
```
google chrome
gitHubのアカウント
```


▼今回の主役(chromeの拡張機能)

https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja

▼拡張機能を入れる前と後
![スクリーンショット 2021-04-10 19.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/47978c79-e1da-8807-5465-5f6a5169f8b9.png)

![スクリーンショット 2021-04-10 20.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/6475b315-27c5-5e75-3d89-10ccb439fbce.png)

エディタの上に何やらボタンが増えましたね。

▼gitHub access tokenを取得する
以下サイトにログインしてtokenを生成する
https://github.com/settings/tokens

`Generate new token`をクリック

|![画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/1772042f-0e96-c216-5e49-f49c9df5f467.png)
|:-:|

`repo`の権限を渡す

|![画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/bb59a10e-9486-6578-9b69-a7f320b8efe1.png)
|:-:|


生成されたtokenをコピーしておく。

▼GitHubと連携する
先ほど増えたボタン群の`Loging SCM`をクリックし、gitHubのusernameと先ほど取得した`github access token`を入力してログインする

|![画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/a0adf048-ff82-e10e-4a71-245e5e62f22a.png)
|:-:|


▼GASのエディタに戻る
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/49b2dcf1-61cb-b14a-e789-1bc66316170b.png' width=80%>

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/071a536e-eb6f-e942-3fc3-75d440676600.png' width=50%>

あとは直感でわかると思いますが⬇️がpullで⬆️がpushの模様です！
関数

# 関数とは
- 値を受け取って値を返すもの
- ある一連の手続き（タスクや値計算）を再度利用できるようにまとめたもの

<strong>メリット</strong>

- コード量の削減
- 再利用可能
- コードの見通しが良くなる

<strong>オブジェクトのメソッド＝関数</strong>

# 構文
```php
function 関数名(仮引数１,仮引数２) {
    //いろいろ処理
    return 関数の返り値;
}
```

# 文字数制限
```php
function isTweetble(text) {
  return text.length <= 140;
}
console.log(isTweetble("foo")); //true
```
returnを使わない方法

```php
function alertTweetble(text) {
  if (text.length <= 140) {
    alert("you can tweet!");
  }
}
alertTweetble("hoge");//you can tweet!
```

# 関数式
変数（定数）に関数を値として代入し、後からその変数を呼び出すことで関数を間接的に利用する方法

```php
const isTweetble = function (text) {
  return text.length <= 140;
}

console.log(isTweetble("hoge"));//true
```
関数名は無くても動かすことができる（匿名関数）

# コールバック関数
- 引数に関数を入れたもの
- 引数に関数を受け取った関数を高階関数という
- それぞれの関数がコンパクトになり、役割が明確になる

```php
function unfollow() {
  console.log("フォローを外しました");
}

function cancelTweet() {
  console.log("ツイートをキャンセルしました");
}

//確認を完了させる処理(コールバック関数)
function confirmed(fn) {
  if (window.confirm("実行しますか？"));
  fn();
}
confirmed(cancelTweet); 
```

# アロー関数

```php
const tax = (number) => {
  return number * 1.08;
}
tax(300);//324
```
変数に関数を代入する形にして、<code>function（）{...}</code>を<code>（） => {...}</code>に変換

```php
const isTweetble = (text) => {
  return text.length <= 140;
}
console.log(isTweetble("hoge"));//true
```
__init__メソッド

# \_\_init\_\_メソッド
\_\_init\_\_メソッドはインスタンスを生成した直後に処理を実行することができるメソッドです。
「`クラス名()`」でインスタンスを生成した直後に自動で呼び出されます。
\_\_init\_\_メソッドは他のインスタンスメソッドと同様に定義することができます。

```py:例
class FruitPrice:
    def __init__(self):
        print('自動で出力されました')

fruit_price = FruitPrice()
```
```text:出力結果
自動で出力されました
```
と記述することで、`fruit_price = FruitPrice()`でFruitPriceクラスのインスタンスが生成された直後に\_\_init\_\_メソッドが呼び出され、その中の処理が実行されます。
これまでは、インスタンスメソッドが`info`であれば`fruit_price.info()`と記述しなければ呼び出すことができませんでした。
##### \_\_init\_\_メソッドを用いる利点
これまでは、
1.クラスを用意する
2.クラスからインスタンスを生成する
3.インスタンス変数に値を代入する
を順に行っていたが、\_\_init\_\_メソッドを用いることで手順の2,3をまとめて、
「インスタンス生成すると同時にインスタンス変数に値を代入する」を行うことができます。

```py:例
class FruitPrice:
    def __init__(self):
        self.name = 'apple'   # インスタンス生成直後にインスタンス変数nameに'apple'を代入

fruit_price = FruitPrice()
print(fruit_price.name)
```
```text:出力結果
apple
```
と記述することで、インスタンス生成直後にインスタンス変数nameに'apple'を代入することができました。
しかし上記のままだと、どのインスタンスにもnameが'apple'になってしまいます。
そのため、\_\_init\_\_メソッドに引数を渡すことで、インスタンスごとに値を変えることができます。
\_\_init\_\_メソッドは通常のインスタンスメソッドと同じように、引数を受け取ることもできます。
その際、インスタンスを生成している「`クラス名()`」に対して引数を渡すことで、\_\_init\_\_メソッドにその値を渡すことができます。

```py:例
class FruitPrice:
    def __init__(self, name):   # nameに'apple'が渡されている
        self.name = name

fruit_price = FruitPrice('apple')
print(fruit_price.name)
```
```text:出力結果
apple
```
多段ssh (途中のホストで名前解決)

# 構成

| Host | Port | User | HostName | IP | target の名前解決 |
| :-:  | :-: | :-: | :-: | :-: | :-: | :-: |
| local | - | - | - | - | 不可 |
| jump1 | 10022 | user1 | jump1.domain1.example.com | - | 可 |
| jump2 | 20022 | user2 | jump2.domain2.example.com | - | 不可 |
| target | 30022 | user3 | target.domain3.example.com | 192.168.3.3 | - |

<img width=400 alt='image.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/73b9d004-bbf4-085c-be3a-0a4978c6695a.png'>

# 目標

local から jump1、jump2 を経由し、target に ssh 接続。
ただし、target の名前解決は jump1 で実行。

普通にやるとこうなる:

```
user0@local$ ssh -p 10022 user1@jump1.domain1.example.com
user1@jump1$ ssh -p 20022 user2@jump2.domain2.example.com
user2@jump2$ ssh -p 30022 user3@192.168.3.3 # jump2 は target を名前解決できない
user3@target$
```

config を書いてこうしたい:

```
user0@local$ ssh target
user3@target$
```


# 準備
jump1 で `resolve` を実行すると target の名前解決ができるものとする。

```
user1@jump1$ resolve target.domain3.example.com
192.168.3.3
```

# 解決策

local の ~/.ssh/config:

``` 
Host jump1
    Port 10022
    User user1
    # local が名前解決
    HostName jump1.domain1.example.com

Host jump2
    Port 20022
    User user2
    # jump1 が名前解決
    HostName jump2.domain2.example.com
    ProxyCommand ssh -W %h:%p jump1

Host target
    Port 30022
    User user3
    # local から jump1 に ssh アクセスし、resolve を実行し、target を名前解決
    ProxyCommand ssh -W $(ssh jump1 resolve target.domain3.example.com </dev/null):%p jump2
```

# 一般化
nameserver で target を名前解決し、local から jump 経由で target にアクセス。

<img width=400 alt='image.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/1e1a7492-0b48-7125-09da-f190b24d1459.png'>


目標:

```
local$ ssh target
target$
```

localの ~/.ssh/config:

```
Host jump
    ...
Host target
    ProxyCommand ssh -W $(ssh nameserver resolve target </dev/null):%p jump
```

local から nameserver に必ずしも直接アクセスできる必要は無い。
nameserver へは ProxyCommand を使い、複数の jump サーバー経由でアクセスしても良い。

# 注意
ProxyCommand に `</dev/null` が無いと以下のようにエラーとなり、ssh 接続できない。

```
user0@local$ ssh target
Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect
```

また、ProxyCommand を利用しない多段 ssh で名前解決を実行しても、同様のエラーが発生する場合がある:

```
ProxyCommand ssh -W $(ssh jump1 ssh nameserver resolve </dev/null):%p jump2
```

これは `</dev/null` を ssh の引数に工夫して入れ込めば恐らく解決できる。
しかし、ssh が3段や4段となるとクオートが大変だったり色々面倒くさいので検証していない。
Arduino IDE 2.0 (beta) がもはやVSCodeだった件

Arduino IDE の最新版が公開されているという話を小耳にはさみ、どんなもんかと試してみました。
# 私が食いついた機能
- オートコンプリート(インテリセンス的な)
    - これが欲しくてVSCodeの拡張機能で開発やってました

- ライブデバッグ機能
    - 遂にデバッガが搭載なのか！？熱すぎる！！


# 黙ってインストールしてみた


https://blog.arduino.cc/2021/03/01/announcing-the-arduino-ide-2-0-beta/

公式ブログによるとなんだか高機能になった感がひしひし伝わってきます。

https://www.arduino.cc/en/software

公式からダウンロードしてみましょう！

# 起動してみた

![L_CHIKA _ Arduino IDE 2.0.0-beta.4 2021_04_10 18_42_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/60510ae7-3739-f6be-dac4-425acaa7e833.png)

おお、なんだかイマドキな見た目になってます！

設定を見てみるとテーマを選べるようになっていました。
私は基本エディタはダークモードなので早速設定します。

![L_CHIKA _ Arduino IDE 2.0.0-beta.4 2021_04_10 18_44_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/31fe5c9c-4672-208e-7970-b1cc314b404e.png)

**デデン！！**

![L_CHIKA _ Arduino IDE 2.0.0-beta.4 2021_04_10 18_45_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/18f880dd-193c-7e4b-bbef-5883f937148f.png)

！！！！
VSCodeのアーキテクチャを踏襲しているとのことでしたが、想像以上にVSCodeでした。

おかげでVSCodeのショートカットも余裕で対応していますし、関数を定義しているところに飛べたり、VSCodeの良い所全部入りです。

![L_CHIKA _ Arduino IDE 2.0.0-beta.4 2021_04_10 18_51_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/3960d377-ce5d-c7b0-1a1b-f33d3f00fda3.png)

左側のタブをクリックするとボード、ライブラリマネージャが出現します。
安定版の1.8.13に比べてサクッとライブラリをGetできて便利ですね。

# デバッグ機能どうだったの？
**ダメでした**
どうやらARMコア系のマイコン専用だそうで、AVR系マイコンは対象外だそうです。
よくよくドキュメント見ればそう書いてあったのですが、ほぼこれ目当てだったので、無念・・・

# VSCodeの拡張機能で十分じゃね？
現状のベータ版は、画面をご覧頂ければわかる通り、VSCodeとArduino拡張機能がIDEとしてまとまったモノとなっていました。そしてデバッグ機能は残念ながらAVR系Arduinoには使えません。
スケッチのアップロードのスピードは多分上がってます。いや、間違いなく。ベータ版とはいえ従来のIDEに比べて圧倒的に便利になったと思います。
VSCodeの拡張機能と変わんないじゃん！って感じなので正直VSCodeの環境構築済の方は様子見でいいと思いました。
設定面の手間等考えるとこれから導入する方には新IDEを是非試してみて頂きたいです。

# ちょっとハマった事
- シリアルプロッタが無い！
VSCodeの拡張機能にもこれ無かったので若干予想はしていましたが、公式のIDEを使う最後の理由だったのでこれは正式版リリースの際は是非実装して欲しい。

- ヘッダファイルが見つからない！

![no_delay _ Arduino IDE 2.0.0-beta.4 2021_04_10 19_40_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/b9946af1-d828-247f-eb88-2692929fe7ee.png)

こんな感じでヘッダファイル無いよみたいな怒られ方します。
ちゃんと所定の場所にあるんだけどなぁ。
恐らくヘッダファイルの参照範囲を指定するjsonファイルがどこかにあるはずで、そいつでパス通せば行けそうですが、パっと出てこなかったのでコンパイルは通るし今回はスルーしました。

# 結論
良い感じにVSCodeなIDEに進化したArduinoIDEでした！
VSCode拡張機能で環境作っている方はそっちのほうが安定かも！(現状ほぼ同じ)
私はしばらくVSCode環境のまま居座ろうと思います。
はじめてのAR 〜自分の部屋にARでポスター貼ってみた〜 

# 目的
- 自分の部屋にARでポスターを貼って、iPhone(iPad)カメラを通して眺めて楽しむ
    - ※もし誤りなどありましたら、ご指摘くださればありがたいです。

# 必要な環境やツール(自分で動作確認した環境)
- MacBookPro(Appleシリコン)
    - XCodeを動作させるのにマスト
- XCode(12.4)
    - iPhone(iPad)アプリを開発する
- ARKit4
    - 現実世界を認識する
- RealityComposer
    - ARコンテンツ（ポスター）を制作する
    - usdzファイルを読み込む
- RealityKit
    - 製作したARコンテンツを現実世界と重ねてレンダリングする
- Blender(v2.92.0)
    - 3DCG（ポスターを貼る直方体）を製作する
    - glbファイルで出力する
- RealityConverter
    - glbファイルをusdzファイルに変換する

# レシピ（作り方）
1. Blenderでポスターを作成する。
    - Blenderの画面左上あたりにある[Add]から、[Mesh]-[Plane]とボタンを押していき、ポスターを貼るための直方体(Plane)を配置する。
    - 直方体(Plane)の[MaterialProperties]-[BaseColor]-[Texture]-[ImageTexture]で、ポスター用画像(jpg等)をテクスチャとして指定する。
    - 上のメニューバー[File]-[Export]-[glTF2.0]をボタンを押していき、作成したポスターをglbファイルで出力する。
1. XCodeでARアプリを作成するためにファイルを変換する。
    - XCodeでのポスター利用に向け、RealityConverterを用いて、Blenderで出力したglbファイルをusdzファイルに変換する。
1. XCodeでARアプリを作成する。
    - XCodeにて、[New]-[Project]-[Augumented Reality App]でARアプリ開発を開始する。
    - Experience.rcproject-[Open in RealityComposer]を押して、ポスター(usdz)を取り込む。
        - RealityComposer左側Scenesの[+]-[Vertical]でシーンを追加する。
        - シーンの名前を[Poster]と変更する。
        - RealityComposerメニュー[File]-[Import]から、usdzファイルをインポートする。
    - ContentView.swiftのmakeUIView関数を編集する
    
    ```
    func makeUIView(context: Context) -> ARView { 
        let arView = ARView(frame: .zero)
        let posterAnchor = try! Experience.loadPoster()
        arView.scene.anchors.append(posterAnchor)
        return arView    
    }
    ```
1. XDCodeでiPhone(iPad)を指定して実行する。

# 関連リンク
- Expolore ARKit4
    - https://developer.apple.com/videos/play/wwdc2020/10611
- What's New in RealityKit
    - https://developer.apple.com/videos/play/wwdc2020/10612/
- The artist's AR toolkit
    - https://developer.apple.com/videos/play/wwdc2020/10601
メモ: スクリプト言語を 単一の実行可能ファイルにまとめる

以下の言語の中では Python3 を pyinstaller で実行ファイルにする記事が一番多く見かけた。

## Python3

```
pip install pyinstaller
```

```python:main.py
import Tkinter

root = Tkinter.Tk()
root.mainloop()
```

```sh
# DOS窓あり
pyinstaller main.py --onefile

# DOS窓なし (Tkinterなど用)
pyinstaller main.py --onefile --noconsole
```

`dist/main.exe` が生成されているので実行できることを確認。

* [tkinterのドキュメント](https://docs.python.org/ja/3/library/tkinter.html#tkinter-modules)

* pyinstaller以外の方法 [多数](https://ja.stackoverflow.com/questions/42597/python-%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)


## Node.js

* [nexe](https://github.com/nexe/nexe)

## php

* [p2x](https://www.vector.co.jp/soft/win95/prog/se365730.html)

## Ruby

* [ruby-packer](https://github.com/pmq20/ruby-packer)
AWS Cloud9の作成時にはまった時のメモ

AWS Cloud9を使おうとしたらこんな画面のエラーが出た。

###エラー画面

<img src="https://docs.google.com/drawings/d/e/2PACX-1vTVeN5XrshQMX24dBthktyv6SaynYdugPJnKZMEfiwojnC8LOFasoy5pVYasHScHs1eIBX2iDtB8jje/pub?w=955&amp;h=482">

画面上のオレンジの部分のエラーメッセージは以下

This is taking longer than expected. The delay may be caused by high CPU usage in your environment, or your T2 or T3 instance is running out of burstable CPU capacity credits, or there are VPC configuration issues. Please check documentation.

###原因

AWS Cloud9を使うにはパブリックサブネットを指定しないといけなかったのですが、このエラーが出た時はプライベートサブネットの設定になっていて、
0.0.0.0/0 (デフォルトゲートウェイ)をインターネットゲートウェイ側に向けるパブリックサブネットの設定にして(赤く囲ったところを追加した)解決。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vTczvXR-A-ypYTEFpFFJpt54g_tq1sUII0h2WLmPrdYG5TsN4DhP7rJaddixgj5r-bOkEBtuDwvYCJ2/pub?w=904&amp;h=146">

VPCのルートテーブルの設定を変更して無事作成できました。
シンプルな問題だったのですが、自分はハマったのでメモとして残しておきます。

AWS Cloud9の設定要件はここに載ってます。
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/vpc-settings.html
HTMLCSSなら3日でできるようになる①

新米UIUXデザイナーがHTMLとCSSを学んで副業でサイトを作ったりできるようになったので、勉強するプロセスをまとめました。

#勉強する順番
- [1]エディタのインストール
- [2]基本的なCSSの記述を学ぶ
- [3]HTMLでよく使うタグを学ぶ
- [4]レイアウトを学ぶ
- [5]とりあえず簡単なページを作ってみる
- [6]ちょっと本格的なページを作ってみる

#[1]エディタのインストール
エディタとはざっくり言うとコードを書く用に便利になっているソフトウェアのことです。
とりあえずなんでもいいので以下のどちらかのメジャーなエディタをインストールしてください。

https://visualstudio.microsoft.com/ja/downloads/
https://atom.io/

インストールできたら[2]に進みましょう。

#[2]基本的なCSSの記述を学ぶ

CSSは基本的に全て以下のような形で書きます。

####HTML
``` index.html
<p>赤色になるよ</p>
<p class="text">青色になるよ</p>
```

####CSS
``` style.css
p {
  color: red;
}

.text {
  color: blue;
}
```

１つ目はHTMLの`p`という`タグ`に対してCSSで文字色が赤色になるように指定しています。
２つ目はHTMLの`class="text"`に対してCSSで文字色が青色になるように指定しています。
`class="クラス名"`で指定するときはその`クラス名`の前に`.`をつけ、`.クラス名`という風に指定します。
形は以下のように常に同じです。

``` style.css
HTMLの指定したい部分の名前 {
  hoge: 値;
}

/*
正確に言うと
セレクタ {
  プロパティ: 値;
}
*/
```

では１つ目と２つ目の指定の仕方の違いはなんでしょう。
以下のような場合を考えてみてください。

####①２つの文字を同じ文字色にしたいとき
``` index.html
<!-- ２つの文字を同じ赤色にしたい -->
<p>赤色にしたい</p>
<p>赤色にしたい</p>

<p class="text1">赤色にしたい</p>
<p class="text2">赤色にしたい</p>
```

``` style.css
/* ひとつのpで指定できる */
p {
  color: red;
}

/* わざわざ2つのクラスで指定しなければならない */
.text1 {
  color: red;
}

.text2 {
  color: red;
}
```

####②２つの文字を違う文字色にしたいとき
``` index.html
<!-- ２つの文字をそれぞれ赤色と青色にしたい -->
<p>赤色にしたい</p>
<p>青色にしたい</p>

<p class="text3">赤色にしたい</p>
<p class="text4">青色にしたい</p>
```

``` style.css
/* pで指定すると後に書いたcolor:blue;が2つのpに反映され、どちらも青色になる */
p {
  color: red;
}

p {
  color: blue;
}

/* それぞれのクラスで指定できるので色を分けられる */
.text1 {
  color: red;
}

.text2 {
  color: blue;
}
```

pタグで指定すると広い範囲を指定できる、クラスで指定すると狭い範囲を指定できるということです。
（①のような場合は単にクラスtextで赤色にしたい２つを指定することもできますが、指定の仕方の違いを説明する例として示しています）

また、タグ・クラスとは別に、`#id`で指定することもできるのですが、とりあえずその２つの指定方法を覚えておけば大丈夫です。

#練習問題（所要時間15分）
では以下のようなHTMLがあったとき、CSSはどのようになるか、問題を解いてみましょう。
`index.html`と`style.css`というファイルを作成し、[1]でインストールしたエディタで開き、`style.css`にコードを書いていきましょう。
`index.html`には以下をコピペしてください。

``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="style.css">
  <title>基本的なCSSの記述を学ぶ</title>
</head>
<body>
  <p class="text">この文字を赤色 (red) にしてみよう</p>

  <div class="block">
    <p class="block_text">
      blockを横幅500px、縦幅300pxにしてみよう<br>
      blockの背景色を青色 (blue) にしてみよう<br>
      blockに5px solid yellow のborderをつけてみよう<br>
      textの色を白く (white) してみよう
    </p>
  </div>

  <div class="section">
    <h2></h2>
    <div class="section_first">
      <p>こちらの文字は #3498db に</p>
    </div>
    <div class="section_second">
      <p>こちらの文字は #e67e22 にしてみよう</p>
    </div>
  </div>
</body>
</html>
```

CSSのプロパティが分からなければ以下のサイトを参照してください。
http://www.htmq.com/style/
答えは次の記事に記載します。
heroku logs --tail --app＜アプリ名＞を入力した際、ActionView::Template::Error (Mysql2::Error: Table --- doesn't exist):が出てきた時の対処法。

エラー文を入力して検索。様々な原因があるようですが、私の場合はmigration fileに　
--NO FILE--が存在することが原因でした。

rails db:rollbackで該当のファイルを差し戻し、手動で消去。rails db:migrateコマンドを実行。

statusコマンドを実行し存在しないことを確認。本番環境に適応させるために、heroku run rails db:migrateを実行。再びheroku logs --tail --app　＜アプリ名＞を実行。エラー分が消えていることを確認。
Flask-SQLAlchemyでJoinして特定の値の合計値の降順で並べ替える。 

メモ的な意味合いを込めて
---

###Fruitテーブル

| id | name |
|:-:|:-:|
|1   |apple   |
|2   |banana   |
|3   |orange   |

###Sellテーブル
| id | fruit_id | count|
|:-:|:-:|:-:|
|1   |1   |1   |
|2   |3   |3   |
|3   |1   |2   |
|4   |2   |8   |
|5   |1   |2   |

flask_sqlalchemyにおいて、上記の２つのテーブルから`一番出荷された数が多い果物順に並べ替えたい`場合は以下のようにする。

```python:例
# flask_sqlalchemyを使用したdbインスタンスが既に存在するとして
from . import db
from sqlalchemy import desc

fruits = (
    db.session.query(Fruit, db.func.sum(Sell.count).label('count'))
    .filter(Fruit.id == Sell.fruit.id)
    .group_by(Fruit.id)
    .order_by(desc('count'))
    .all()
)
```

fruitsの中身は以下のようになる。

| index | Fruit.id | Fruit.name | count |
|:-:|:-:|:-:|:-:|
| 1  | 2  | banana  | 8 |
| 2  | 1  | apple  | 5 |
| 3  | 3  | orange | 3 |
競技プログラミングメモ（Python）

##グリッドに関する処理
### [ABC75 B Minesweeper](https://atcoder.jp/contests/abc075/tasks/abc075_b)
```python
H, W = map(int, input().split())
S = []
for i in range(H):
  S.append(list(input()))
#上、下、右、左、右上、右下、左上、左下
dy = [-1, 1, 0, 0, -1, 1, -1, 1]
dx = [0, 0, 1, -1, 1, 1, -1, -1]
for y in range(H):
  for x in range(W):
    if S[y][x] == '#':
      continue
    cnt = 0
    for i in range(8):
      ny = y + dy[i]
      nx = x + dx[i]
      if ny < 0 or ny >= H:
        continue
      if nx < 0 or nx >= W:
        continue
      if S[ny][nx] == '#':
      	cnt += 1
    S[y][x] = str(cnt)
for y in range(H):
    print("".join(S[y]))
```
###[ABC96 C Grid Repainting 2](https://atcoder.jp/contests/abc096/tasks)
```python
import sys

H, W = map(int, input().split())
S = []
for i in range(H):
  S.append(list(input()))
#上、下、右、左
dy = [-1, 1, 0, 0]
dx = [0, 0, 1, -1]
for y in range(H):
  for x in range(W):
    if S[y][x] == '.':
      continue
    if S[y][x] == '#':
      for i in range(4):
        ny = y + dy[i]
        nx = x + dx[i]
        if ny < 0 or ny >= H:
          continue
        if nx < 0 or nx >= W:
          continue
        if S[ny][nx] == '#':
          break
        if i == 3:
          print('No')
          sys.exit()
print('Yes')
```
USBドライブを遠隔のWindows共有フォルダに同期するソフトを作った[rsync,CIFS,Raspberry Pi]

# はじめに
ネットにつながっていない機器上でUSBドライブに保存したデータを簡単に遠隔のサーバーにアップロードする必要があったため、作りました。
## 動作環境

- ファイルを受け取る側
    - Windows 10 (ソースコードを修正すれば*nixでも使える)
    - ネットワークにつながっていること
    - 共有フォルダを作る権限
    - Softether VPNサーバー
- ファイルを送る側
    - Raspberry Pi 3 (通常のPCでも問題ない)
        - Raspbian
        - ネットワークにつながっていること

## 動作概要

- Raspberry PiにUSBドライブを挿す。すると、VPN経由で遠隔の場所にあるCIFSディレクトリに、USBドライブの中身がrsyncによって同期される。
- 構成
    - autofsはUSBドライブをマウントする用途で用いる
        - マウント先を選ぶことができる
    - udevはUSBドライブマウント時に同期用のスクリプトを実行する用途で用いる
    - cifs-utilsは遠隔のCIFSディレクトリをマウントする用途で用いる
    - softether-vpnは遠隔のネットワークのCIFSディレクトリにアクセスする用途で用いる
    - systemdは以上の内容をサービスとして登録し、起動時に自動的に立ち上がるようにする用途で用いる

# 環境構築
以下の手段はRaspberry Pi上で行う。Windows上ではSoftether VPNサーバーの構築を行う。
## インストール
```
sudo apt install git, autofs # gitとautofsをインストール
git clone https://github.com/rayanti/usb_sync.git # githubのリポジトリ（当プロジェクト）をクローン
sudo cp {auto.master,auto.misc} /etc # autofsのファイルを/etcにコピー
sudo cp 1-usb.rules /etc/udev/rules.d # udevのファイルを/etcにコピー
```

## 静的ルーティング

- 以下のファイルをコピーし、各自の環境に合わせて設定する

```
sudo cp 40-route /lib/dhcpcd/dhcpcd-hooks/
```

### Softether vpncmdインストール
vpncmdはSoftether VPNのコマンドラインツールである

- https://www.softether-download.com/en.aspx?product=softether で必要なファイルをダウンロードする
- ターミナル上で以下の手段にしたがって、環境の設定を行う

```bash
tar xzvf vpnserver-5070-rtm-linux-x86.tar.gz 
cd vpnclient
make
#(1,1,1)
sudo ./vpnclient start
./vpncmd
#(2," ")
PasswordSet
RemoteDisable
NicCreate
#VPN
AccountCreate
#{account name}
AccountPasswordSet
#standard
AccountConnect
AccountStartupSet
quit
```

### cifs-utilsの設定
共有フォルダを閲覧する権限のあるwindowsユーザーのログイン情報を入力する。これにより、Windowsの共有フォルダをLinux上でマウントすることができる。
`cifs-credientials`にはパスワードを保存するため、rootユーザー以外から見えないようにする必要がある。

```
sudo apt install cifs-utils
sudo chown root: /home/pi/usb_sync/cifs_credentials
sudo chmod 600 /home/pi/usb_sync/cifs_credentials
```

### vpncmdを自動起動するサービスに登録する
systemdのサービスとして登録する。

```
sudo cp vpnserver.service /etc/systemd/system/
sudo cp vpn_dhclient.service /etc/systemd/system/
```

### systemdサービスを自動起動するように設定
startで起動、enableでスタートアップ時自動起動する

```
systemctl daemon-reload
systemctl start vpnserver
systemctl enable vpnserver
systemctl start vpn_dhclient
systemctl enable vpn_dhclient
systemctl start cifs_mount
systemctl enable cifs_mount
```

# 各自の環境に合わせて設定する項目
- `nmtui`でipアドレスの固定
- `40-route`でルーティングの設定
- `1-usb.rules`内で用いるUSBドライブのUUIDの設定


# 付録
## automountが行われない場合
autofsのファイルは実行可能な権限を持っていると動かないため、以下のコマンドを実行

```
sudo chmod -x /etc/auto*
```
クラスとインスタンス

# クラスとインスタンス
プログラミングでものを生成するには、まずそのものの設計図を用意する必要があります。
設計図を`クラス`、ものを`インスタンス`と呼びます。
クラスとインスタンスは理解が難しく様々な捉え方があります。
私はたいやきでイメージしており、
・`クラス`：たい焼きの型
・`インスタンス`：たい焼き
と捉えています。

## クラスの定義
クラスは「`class クラス名:`」と記述することで定義できます。
クラス名は「FruitPrice」のように大文字で始めるようにします。

```py:例
class FruitPrice:
    #処理を記入
```
## インスタンス生成
`クラス()`と記述してクラスを呼び出すことで、クラスを用いて新しくインスタンスを生成することができます。
また、「`変数名 = クラス名()`」と記述することで生成したインスタンスを変数に代入することができます。

```py:例
class FruitPrice:
    #処理を記入

fruit_price = FruitPrice()
```
インスタンスにはそれぞれ名前や値段などの情報を追加することができます。
例えば上記では、「`fruit_price.name = 'apple'`」とすることで、変数`fruit_price`に`name`が`apple`であるという情報を追加することができます。この時、`name`のことを「`インスタンス変数`」と呼びます。

```py:例
class FruitPrice:
    pass   # passは処理が何もないことを表します

fruit_price = FruitPrice()
fruit_price.name = 'apple'
print(fruit_price.name)
```
```text:出力結果
apple
```
## メソッド
クラスの中では関数を定義することができます。クラスの中で定義した関数を「`メソッド`」と呼びます。
メソッドの定義の方法は通常の関数のと同じですが、**第１引数に`self`を追加する**必要があります。
##### クラスの中で定義したメソッドを呼び出す
呼び出すには「`インスタンス.メソッド名()`」と記述することで呼び出すことができます。
クラスの中で定義し、インスタンスに対して呼び出すメソッドのことを、「`インスタンスメソッド`」と呼びます。
例では`hello`がインスタンスメソッドに当たります。

```py:例
class FruitPrice:
    def hello(self):
        print('おはよう')

fruit_price = FruitPrice()   # インスタンス生成し、変数に代入
fruit_price.hello()   # クラスの中で定義したメソッドを呼び出す
```
```text:出力結果
おはよう
```
## self
ここでインスタンスメソッドでの第１引数に指定した`self`にはそのメソッドを呼び出したインスタンス自身が代入されています。
下図の例では、メソッド内で`self.name`とすることで、そのメソッドを呼び出している`fruit_price`の`name`の値を取得することができます。

```py:例
class FruitPrice:
    def info(self):   # selfにfruit_priceが代入される
        print(self.name)

fruit_price = FruitPrice()
fruit_price.name = 'apple'
fruit_price.info()   # クラスの中で定義したメソッドを呼び出す
```
```text:出力結果
apple
```

### ここまで学んだことを用いて、fruitの合計金額の出力を行います

```py:例
class FruitPrice:
    def info(self):
        return self.name + 'は'+ str(self.price) + '円です'   #self.priceは数値なので文字列に変換する必要があります

    def get_total_price(self, count):
        total_price = self.price * count
        return total_price

fruit_price = FruitPrice()
fruit_price.name = 'apple'
fruit_price.price = 300
print(fruit_price.info())

result = fruit_price.get_total_price(3)
print('合計金額は' + str(result) + '円です')
```
```text:出力結果
appleは300円です
合計金額は900円です
```
ここで気をつけるポイントは、インスタンスメソッドに引数を渡す場合、メソッドの定義側では`self`の分だけ引数の順番がずれることです。
`fruit_price.get_total_price(3)`の`3`は`get_total_price(self, count)`の`count`に代入されます。
【Laravel】php artisan migrateエラーが出た SQLSTATE[HY000] [2054]

今回、php artisan migrateでエラーが出て困ったので投稿します。

```
 SQLSTATE[HY000] [2054] The server requested authentication method unknown 
```

認証方式が知らんとか言われた。どうしよ、、、じゃあMySQLで確認しますか。

```
 mysql> select user, host, plugin from mysql.user;
```

確認するとrootユーザーのパスワードの認証方式はcaching_sha2_passwordであった。なんかMySQL8.0ではデフォルトでこうなっているらしい？？？

なので変更しましょう！

```
 mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'root';
```
これで変更して無事実行できました！
JavaScriptのletは本当に悪なのか

# はじめに
https://qiita.com/kiyoshiro/items/13c60fad1f5279993fa2

「constこそが唯一神である」というふざけた記事を書いてから時間が経ち、自分の意見も少し変わってきました。
この記事では「本当にプロダクションコードからletを排除し、constに置き換える必要があるのか」という根本的な部分をもう一度考えていきます。

# Q. そもそもletは可読性が低いのか？
条件付きでNoといえます。以下のコードを御覧ください

```ts:util.ts
/**
 * 与えられた数値配列の偶数のみを合計した値を返す。
 * @example sumIfEven([1, 2, 3, 4]) // -> 6
 */
export function sumIfEven(numbers: number[]) {
  let ret = 0
  for (const num of numbers) {
    if (num % 2 === 0) {
      ret += num
    }
  }
  return ret
}
```
このコードにはletを使っていますし、何なら`ret`という命名を放棄したような変数名が使われていますが、別段読みづらくはないはずです。理由を言語化します。

- JSDocのコメントが丁寧に書かれているため、読み手が想像しやすい。
- スコープが短く、letの影響範囲が小さいため、読み手の負担が少ない。


したがって、**ユーティリティ関数のようなスコープの短い場所で、コメント付きでletを使うのは全く問題ない**と考えられます。

# Q. それでは、スコープが長くならないように適度に関数に分割すれば、letを使いまくっても問題ないのか？
チームやプロジェクト、メンバーの得意、不得意によると考えます。
開発が進んでいくにつれて、スコープが長い関数というのが生まれそうになります。例えば、ユーザー登録フォームで登録ボタンが押された時の処理を書いた関数があるとします。開発当初は、あまり行数がないため、letを使ったとしましょう。

```ts:ユーザー登録時の処理
function onClickRegister() {
  let foo = 0
  // *************
  // 10行のコード
  // *************
}
```

この時点では可読性がそこまで悪くないかもしれません。しかし、後に仕様が追加され、ユーザー登録時の処理が増えたとしましょう。

```ts:ユーザー登録時の処理
function onClickRegister() {
  let foo = 0
  // *************
  // 10行のコード
  // *************

  // *************
  // さらに10行のコード
  // *************
}
```
スコープが長くなって、変数`foo`の影響範囲が大きくなってきました。読み手に強いる「fooの値を脳内に記憶しておく」という負担が大きくなってきます。さらに処理が追加されていくと、次第に「読みづらく、保守しづらいコード」になっていってしまいます。
別の関数に切り出せばもちろん。解決します。

```ts:別の関数に切り出して、それを呼び出す
function onClickRegister() {
  doFoo()
  doBar()
}
```
しかし、「切り出す」と一口に言っても考えなければならない、難しいポイントがいくつもあります。

- どのような粒度で切り出すか
- 切り出した関数の命名はどうするか
- 切り出した関数はどこに置くか

「これくらいエンジニアならできて当たり前」という意見が聞こえてきました。理想としてはそうなのですが、メンバーのスキルや、プロジェクトの納期によって、現実には難しい場面がでてくると考えています。

- 変に切り出したせいでむしろ読みづらくなる
- 納期が迫っているので、関数に切り出している余裕がない

ということが発生する開発現場も想像できます。
そのため、メンバーの得意、不得意によって以下のような方針をとるのが良いと考えています。

- mapやreduceが使える人は、積極的に使い、letを少なくしておく。
- mapやreduceが苦手な人は、letやfor文を使っても良い。ただし、なるべく関数に切り出す

# Q. でも、mapとかreduce使うよりも、letとforループを使ったほうがパフォーマンスが良いのでは？
はい。しかし、データ数が少ない場合は、パフォーマンスの差は小さいです。
ユーザーが気づかないくらいのパフォーマンス向上よりも、開発者が読みやすいようにコードを書いておき、バグが発生する可能性を減らしたほうが良いと考えることもできます。そのほうが、結局のところユーザーの利益につながるというわけです。

# 結論
- 短いスコープだったら、letを使っても何ら問題ない
- しかし、短いスコープを維持するのが難しい状況であれば、letの使用を控えることも選択肢のひとつになる
- letを使わないとコードが書けない人は、関数に切り出す練習をするか、`map`とかを覚えるかをしたほうが良い
fish shellユーザーのためのイケてるパス管理

3/1、私がこよなく愛する[fish](https://fishshell.com/)の[ver 3.2.0](https://github.com/fish-shell/fish-shell/releases/tag/3.2.0)がリリースされました。さまざまな改善や新機能の追加、補完データのアップデートなどが行われているわけですが、シレっとパスの管理を楽にするコマンド（`fish_add_path`）が追加されております。

これにより、パスの管理が以前よりも若干容易になっています。そこで、改めてfishユーザが覚えておくべきパスの管理について整理しました。

## ローカル変数、グローバル変数、ユニバーサル変数
fishではローカル変数、グローバル変数、ユニバーサル変数の３つのスコープを持った変数が定義できます。
なんとなく名前から想像つくかと思いますが、ローカル変数 < グローバル変数 < ユニバーサル変数の順でスコープが広いです。

|変数の種類|スコープ|消えるタイミング|
|---|---|---|
|ローカル変数|処理のブロック（[if](https://natsukium.github.io/fish-docs-jp/tutorial/conditionals.html)文や[function](https://natsukium.github.io/fish-docs-jp/tutorial/functions.html)等）|処理のブロックが終わると消える|
|グローバル変数|セッション|セッションが終了すると消える|
|ユニバーサル変数|全セッション|`set -e`で明示的に消さない限り消えない|

> • -l  or  --local forces the specified shell variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local
> • -g or --global causes the specified shell variable to be given a global scope. Non-global variables  disappear when the block they belong to ends
> • -U or --universal causes the specified shell variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current user's fish instances on the  current  computer, and will be preserved across restarts of the shell.

## fish_user_pathsとは？
`fish_user_paths`は、fishシェルで用意されている特殊なユニバーサル変数になります。
この変数に追加されたパスは追加される度に自動的に今開いているセッション及び将来開くセッション全ての` $PATH` に永久的に設定が保存されます。

この変数を用いると、設定ファイルをいじることなくインタラクティブにPATHを編集することができるため、fishではこの変数を用いてパスを管理することが推奨されています。

### fish_user_paths を config.fish で設定するのはNG
ユニバーサル変数である`fish_user_paths`にパスを追加すると、セッションを跨いで永続的に保持されてしまうため、`config.fish`で以下のコマンドを追加してしまうと、セッションを起動するたびにパスが追加されてしまいます。起動の度に起動が遅くなることに。。

```bash
$ set -U fish_user_paths /usr/local/bin $fish_user_paths
```
参考：[fish_user_paths を config.fish で設定するな](https://qiita.com/HelloRusk/items/ea0089bf80b07aa74d8d)

## fish でのパスのエクスポート方法
### （非推奨）設定ファイルにエクスポート命令を書き込む
bashで`.bashrc`にパスのエクスポート命令を書くように、fishでも`~/.config/fish/config.fish` にパスのエクスポート命令を書いて管理することができます。bashでは`export`コマンドですが、fishでは`set -x`になります（通常はグローバル変数としてエクスポートされます）。


```~/.config/fish/config.fish
set -x PATH $PATH /usr/local/bin
```
一方で、この方法はパスの編集が非効率であることから、非推奨とされています。

### （推奨）fish_add_pathコマンドを利用する
ではイケてる方法は何なのかというと、`fish_add_path`コマンドを利用して、ユニバーサル変数`fish_user_paths`にパスを追加します。
このコマンドは既に存在する場合は追加しないため、設定ファイルに記載しても問題ありません。

```~/.config/fish/config.fish
$ fish_add_path /usr/local/bin
```

## インタラクティブなパス管理
繰り返しになりますが、fishではインタラクティブにパスを編集できるのが強みです。

### 追加
`fish_add_path /usr/local/bin` を使用すると、`$fish_user_paths`にそのパスが含まれているか否かを確認し、含まれていなかった場合（かつそのパスが存在する場合）のみパスを追加します。

```bash
$ fish_add_path /usr/local/bin
```

### 確認
現状どんなパスがエクスポートされているか確認する場合は、単純に`echo`で環境変数の値を確認します。空白で区切って改行にしてやるとちょっと見やすいです。

```bash
$ echo $fish_user_paths | tr " " "\n" | nl
     1  /usr/local
     2  /usr/sbin
     3  /usr/local/bin
     4  /home/kimoton/.nodebrew/current/bin
     5  /home/kimoton/.pyenv/shims
     6  /home/kimoton/.pyenv/bin
     7  /home/kimoton/.yarn/bin
```

### 削除
パスを削除したい場合は、`-e, --erase`を使用します。インデックスで指定します。1番目を消したい場合はこんな感じ。

```bash
$ set -e fish_user_paths[1]
```
WineでMIDIが再生できないとき

# はじめに
他の目的の作業をしているときの副産物なので正しく無いかもしれません。
実際に音が出ないを再現して直したわけじゃないです。
ノウハウを捨ててしまうのがもったいないので一応記事に残しておこう程度。

# 環境
OS : Ubuntu 20.10
Kernel : 5.8.0-49-generic
Wine : wine-6.5 (Staging)

最近のwineでは標準で入っているWine midi mapperがいい仕事してくれるらしいので
そもそもMIDI音が出ない事象自体が発生しないかもしれないです。

# 作業

```bash:DirectX診断ツールのインストール
winetricks dxdiag
```

wineに標準で入っているDirectX診断ツールは動かなかったのでwinetricksからネイティブ版を入れます。
wine6.5だと罠があってハマりますので[こちら](https://qiita.com/yakitatata/items/30ab785c560236af61ba)をを先にやってください。


```bash:DirectX診断ツールの起動
wine dxdiag
```
>0024:err:winediag:MIDIMAP_drvOpen No software synthesizer midi port found, Midi sound output probably won't work.

midi周りがだめだとこうやって落ちかもしれないです。
(何をしていた時にこのエラーが出ていたのか・・さっぱり覚えてないです。すみません。
多分wine6.0でなんかのゲームを起動しようとしていた時だったような・・）

wineHQのwikiに解決法が載ってます。

https://wiki.winehq.org/MIDI#Using_MIDI_in_Wine

自分でもよくわかってないですが、
めっちゃ簡単に理解しようとするならば、
MIDIの出力をパススルーしてあげる。
そのためにいろいろ小細工が必要。ということかな？

```bash:MIDIの出力ポート一覧
$ aconnect -o
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
```

Wikiに表示してあるほど無い。

```bash:timidityのインストール
sudo apt install timidity timidity-daemon  alsa-utils
```

```bash:aplaymidiにtimidityを教えてあげる
echo "timidity -iAD -B2,8 -Os1l -s 44100 -x'soundfont /usr/share/midi/sf2/mypatches.sf2 order=1'" >> ~/.profile 
source ~/.profile
```
永続化するために.profideに書いて読んでます。

一応、rebootをかけて、MIDIのポートをもう一度見てみます。

```bash:MIDIの出力ポート一覧
$ aconnect -o
client 14: 'Midi Through' [type=カーネル]
    0 'Midi Through Port-0'
client 128: 'TiMidity' [type=ユーザ,pid=1528]
    0 'TiMidity port 0 '
    1 'TiMidity port 1 '
    2 'TiMidity port 2 '
    3 'TiMidity port 3 '
```
増えてる

aplaymidi -l
でも同様の結果が得られます。
適当なファイルをとってきて再生確認。

```bash:
aplaymidi --port 128:0 Downloads/AIR001.MID
```
流れました。

次にwindowsのレジストリを触るようです。

```bash:これいらないかも
wine reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap" /v "CurrentInstrument" /t REG_SZ /d "#1"
```

診断ツール起動してみる

```shell:DirectX診断ツールの起動
wine dxdiag
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/116a9e93-7773-04f0-ad61-66ce57f160e1.png)


こんな感じでtimidityのポートが表示されていたらOK（多分）

# 参考
https://kakurasan.blogspot.com/2016/01/midi-devices-in-wine.html

https://manerosss.wordpress.com/2017/06/22/wine-midi-linux/comment-page-1/