OmniAICreator/Qiita-1.07M huggingface dataset:
文字列じゃなくて、実際の日付を反映させていく date-fns

###文字列じゃなくて、実際の日付を反映させていく



前のやつ
https://qiita.com/shoiizuka/items/6f4fa25b23c6f830b3fb

前のやつは文字列だったけど、dateーfnsを通じて、時計みたいな感じにする


```LiveDate.vue

<template>
  <div class="text-subtitle-1 ml-4">
    {{date}}　<!-- 8データの値を反映 -->
  </div>
</template>

<script>
import {format} from 'date-fns' //1日付処理のやつイン。前にnpmでインストールした

export default {
  data(){　//2新しく設定
    return{
      date:'' //3空にしとく
    }
  },
  methods:{
    getDate(){　 //4データに入れる日付はメソッドにする
      this.date = format(new Date(), 'MMM d')　//5thisでdataのdateに今日の日付をいれる
    }
  },
  mounted(){//6リロードしたときに反映させたいので、マウンテッドの中に
    this.getDate()　//7,メソッドを使う
  }
}
</script>
```

前にnpmインストールしたやつ
日付をうまいこと反映させてくれる、パッケージ
https://date-fns.org/v2.16.1/docs/format


これで、今日の日付が反映された
![スクリーンショット 2020-11-22 9.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898667/2eff5e5b-e854-bad0-2d5e-6bcd64440b16.png)


###日付にプラスして時間も追加したい

前にnpmインストールしたやつ
日付をうまいこと反映させてくれる、パッケージ
https://date-fns.org/v2.16.1/docs/format
のドキュメントを見てみると、

Month (formatting)
M1, 2, ..., 12
Mo	1st, 2nd, ..., 12th
MM	01, 02, ..., 12	
MMM	Jan, Feb, ..., Dec
MMMM	January, February, ..., December ●これ採用
MMMMM	J, F, ..., D


Hour [0-23]

H　0, 1, 2, ..., 23　●これ採用
Ho　0th, 1st, 2nd, ..., 23rd7
HH　00, 01, 02, ..., 23

Minute
m 0, 1, ..., 59　
mo 0th, 1st, ..., 59th7
mm 00, 01, ..., 59　●これ採用


Second
s 0, 1, ..., 59
so 0th, 1st, ..., 59th7
ss 00, 01, ..., 59　●これ採用

と書いてあるので

```LiveDate.vue

  methods:{
    getDate(){
      this.date = format(new Date(), 'MMMM d,H:mm:ss') //１,月時間分秒を表示、コロン区切り

```


リロードすれば表示が切り替わるが、セットタイムアウトで毎秒切り替わるようにする

```LiveDate.vue
  methods:{
    getDate(){
      this.date = format(new Date(), 'MMMM d,H:mm:ss')
      setTimeout(this.getDate,1000)  //2,１秒毎にmountedのgetdateを実行
    }
  },
  mounted(){
    this.getDate()
  }

```

日付が細かく入るようになった

![スクリーンショット 2020-11-22 10.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898667/740efe53-e5c0-2660-f002-ceb7cff8a94f.png)
Raspberry Pi＋MAX7219で7セグLEDディスプレイ



# 環境
- Raspberry Pi 3 Model B
- Rasbian 10
- Python 3.7
- HiLetgo MAX7219 デジタルLED
- HiLetgo IIC I2C ロジック レベル 変換 双方向モジュール

# インストール
```bash
$ git clone https://github.com/rm-hull/max7219.git
$ cd max7219
$ sudo python3 setup.py install
```

# 接続
MAX7219は5V動作ですが、Raspberry PiのGPIOは3Vのため、レベルコンバーターを使用します。

| Raspberry Pi | MAX7219 | Mode |
|:-:|:-:|:-:|
| +5V | VCC ||
| GND | GND ||
|GPIO 10 | DIN | ALT0 |
|GPIO 11 | CLK | ALT0 |
|GPIO 8 | CS | OUT |

```

$ gpio readall
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 0 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 0 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 0 |  7 || 8  | 1 | ALT5 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
```
モード変更が必要であれば、下記のコマンドで変更する。

```
$ gpio -g mode 10 ALT0
$ gpio -g mode 11 ALT0
$ gpio -g mode  8 OUT
```

# テスト
```bash
$ sudo python3 examples/sevensegment_demo.py
```

![7seg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109483/b898a66e-d2b8-4633-5fe2-ed903266a136.png)
【エラー】Postgres PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?【Rails】

```brew install imagemagick```した後にサーバーを立ち上げると下記のエラーが。![スクリーンショット 2020-11-22 午前8.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692366/8a1c735d-a751-773a-44d6-3be72532e0cb.png)


#したこと
とりあえずhttps://qiita.com/great084/items/98c83364f246473249c4 を参照。
しかしエラーは解決せず。

```
postgres -D /usr/local/var/postgres　
2020-11-21 23:37:47.476 AEDT [84006] FATAL:  database files are incompatible with server
2020-11-21 23:37:47.476 AEDT [84006] DETAIL:  The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.1.
```

postgresqlのバージョンをあげたらいけるっぽいのであげてみる

```
brew postgresql-upgrade-database
Error: Upgrading postgresql data from 12 to 13 failed!
==> Removing empty postgresql initdb database...
==> Moving postgresql data back from /usr/local/var/postgres.old to /usr/local/v
Error: Failure while executing; `/usr/local/opt/postgresql/bin/pg_upgrade -r -b /usr/local/Cellar/postgresql@12/12.5/bin -B /usr/local/opt/postgresql/bin -d /usr/local/var/postgres.old -D /usr/local/var/postgres -j 4` exited with 1.
```
何故かバージョンがあげれないというエラーが。
そこで、以前postgresql関連のエラーが出たときにした事を思い出して```brew doctor```を実行

```
Warning: Git could not be found in your PATH.
Homebrew uses Git for several internal functions, and some formulae use Git
checkouts instead of stable tarballs. You may want to install Git:
  brew install git

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install


Warning: Your Xcode does not support macOS 10.15.
It is either outdated or was modified.
Please update your Xcode or delete it if no updates are available.

Warning: Xcode alone is not sufficient on Catalina.
Install the Command Line Tools:
  xcode-select --install
```

検知された問題を解消していく。
そして再度postgresqlのバージョンをあげてみる

```
brew postgresql-upgrade-database
~~（省略）~~
==> Upgraded postgresql data from 12 to 13!
==> Your postgresql 12 data remains at /usr/local/var/postgres.old
```
無事にバージョンをあげることができ、サーバーもエラーが出ずに立ち上げれました！
Apple Silicon を使った Mac に wasm-pack をインストールするには

注意：

* この記事は 2020/11/22 に記述された回避策です
* wasm-pack、もしくは Rust 本体の対応が進めば、この回避策は不要になります
* まずは[リリースノート](https://github.com/rustwasm/wasm-pack/releases/)を確認してください
* [Rust そのもののインストールについては、こちらの記事](/chikoski/items/f973e551a71ed0179116)をご覧ください

## TL;DR

* arch コマンドで x86_64 を指定して、インストールスクリプトを実行します
* インストール後は、Intel Mac と同様に開発を行えます

## インストールスクリプトが動きません

[Web サイト](https://rustwasm.github.io/wasm-pack/installer/) には、次のようにインストールスクリプトを実行してインストールするように案内されています。

~~~bash
$ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
~~~

そのまま実行すると、arm64 向けのバイナリは存在しないというエラーメッセージが出力され、インストールが進みません。

~~~
wasm-pack-init: no precompiled binaries available for CPU architecture: arm64
~~~

インストールスクリプトの 46 行目付近に次の記述があります。ここではインストールスクリプトの実行されたハードウェアのタイプから、インストールするバイナリを選んでいます。

~~~bash
    46      local _tardir="wasm-pack-v0.9.1-${_arch}"
    47      local _url="$UPDATE_ROOT/${_tardir}.tar.gz"
~~~

`$UPDATE_ROOT` には `https://github.com/rustwasm/wasm-pack/releases/download/v0.9.1` が設定されていること、また 56 行目や 172 行目付近の内容から、このスクリプトは wasm-pack のリリースページからバイナリをダウンロードすることがわかります。

Rosetta2 のおかげで Apple Silicon では x86_64 のバイナリが実行できます。wasm-pack も x86_64 版をダウンロードしてインストールすればよさそうです。念のため、[GitHub　のリリースページ](https://github.com/rustwasm/wasm-pack/releases/) にアクセスし、v0.9.1 に x86_64 向けのバイナリがあることを確認します。

## インストール方法

前節で、x86_64 のバイナリをインストールすればよさそうであることがわかりました。

インストールスクリプトはシェルスクリプトで記述されています。arch コマンドを使い、 x86_64 上で動いていることとして、このスクリプトを起動します。

~~~bash
$ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | arch --x86_64 sh
~~~

しばらく待てばインストールが終わります。

## 動作確認

hello_wasm プロジェクトを作り、ビルドして、Wasm ファイルができていることを確認します。

~~~bash
$ wasm-pack new hello_wasm
[INFO]: ⬇️  Installing cargo-generate...
🐑  Generating a new rustwasm project with name 'hello_wasm'...
⚠️   Renaming project called `hello_wasm` to `hello-wasm`...
🔧   Creating project called `hello-wasm`...
✨   Done! New project created /Users/username/hello-wasm
[INFO]: 🐑 Generated new project at /hello_wasm
$ cd hello_wasm
$ wasm-pack build
[INFO]: 🎯  Checking for the Wasm target...
[INFO]: 🌀  Compiling to Wasm...
# 中略
[INFO]: ⬇️  Installing wasm-bindgen...
[INFO]: Optimizing wasm binaries with `wasm-opt`...
[INFO]: Optional fields missing from Cargo.toml: 'description', 'repository', and 'license'. These are not necessary, but recommended
[INFO]: ✨   Done in 9.54s
[INFO]: 📦   Your wasm pkg is ready to publish at /Users/username/hello-wasm/pkg.
~~~

以上でビルドが終わり、pkg フォルダに Wasm ファイルが作られていれば、動作確認終了です。

~~~bash
$ ls pkg
README.md		hello_wasm_bg.js	package.json
hello_wasm.d.ts		hello_wasm_bg.wasm
hello_wasm.js		hello_wasm_bg.wasm.d.ts
~~~
[macOS/iOS] Autolayout覚書

# はじめに
本文書では, macOS/iOSのソフトウェアのautolayout処理を、コードで実装する場合に関して、気づいた点/注意すべき点についてまとめます。

## Autolayout処理
### まとめ
AutoLayoutを制御するために、下記2のメソッドをオーバーライドします。
* Viewが要求するサイズを、[intrinsicContentSize](https://developer.apple.com/documentation/appkit/nsview/1526996-intrinsiccontentsize)の戻り値でかえす
* Viewに与えられたサイズを、[setFrameSize](https://developer.apple.com/documentation/appkit/nsview/1483530-setframesize)で取得し、Viewの内容に反映する

また、Viewの内容に応じた、拡張・縮小しやすさを定義します。
* [setContentHuggingPriority](https://developer.apple.com/documentation/uikit/uiview/1622485-setcontenthuggingpriority)メソッドで、Viewの伸長されやすさを定義します
* [setContentCompressionResistancePriority](https://developer.apple.com/documentation/uikit/uiview/1622526-setcontentcompressionresistancep)メソッドで、Viewの圧縮されやすさを定義します。
伸長/圧縮されやすさを表すパラメータについては、次節を参照してください。

経験的には、各Viewの必要最小限のサイズをintrinsic contents sizeで返して、そこからViewのサイズを大きくしていく方が上手くいく様です。また、水平もしくは垂直にViewを並べる場合は、[NSStackView](https://developer.apple.com/documentation/appkit/nsstackview)もしくは、[UIStackView](https://developer.apple.com/documentation/uikit/uistackview)を使用しましょう。

### 優先順位

[NSLayoutConstraint.Priorityで定義される定数の値とその意味](https://developer.apple.com/documentation/appkit/nslayoutpriority?language=objc)です(macOS 10.15)。説明はマニュアルのgoogle翻訳です。

|名前                        |即値 |説明 |
|:--                        |:--    |:-- |
|required                   |1000.0 |必要な制約 |
|defaultHigh                |750.0|ボタンがコンテンツの圧縮に抵抗する優先度レベル |
|dragThatCanResizeWindow    |510.0|ウィンドウのサイズを変更する可能性のあるドラッグの適切な優先度レベル |
|windowSizeStayPut          |500.0|ウィンドウの現在のサイズの優先度 |
|dragThatCannotResizeWindow |490.0|たとえば、分割ビューの仕切りがドラッグされる優先度レベル |
|defaultLow:                |250.0|ボタンがその内容を水平方向に保持する優先度レベル |
|fittingSizeCompression     |50.0 |fitingSizeの結果は、ビューのコンテンツを表示するのに十分な大きさのサイズです |


## View毎の処理
### NSTextView
* スクロールバー付きの[NSTextView](https://developer.apple.com/documentation/appkit/nstextview)のサイズ変更については、NSTextViewそのものでなく、それを含有する[NSScrollView](https://developer.apple.com/documentation/appkit/nstextview)に対して実施する。

### NSTabViewController
* ビュー毎のWindowのリサイズ

[preferredContentSize](https://developer.apple.com/documentation/appkit/nsviewcontroller/1434409-preferredcontentsize)を使用して各ビュー(アイテム)のサイズを使用します。
`preferredContentSize`の値は、`viewDidAppear`メソッドの中で取得します。以降の`viewWillAppear`メソッドの中で、その値を使ってNSWindowのcontents sizeを変更します。

# 変更履歴
* 2020/12/29 `NSTabViewController`の項を追加
* 2021/02/22 「まとめ」を追加
スパコンでguppy をGPUモードで動かす[Sirokane](備忘録）

# この記事は何？
大学のスパコン(Sirokane) で初めてguppy をGPUモードで動かす際につまったので備忘録的なメモ

# 解決したコード
```run_guppy_GPU.sh
#!/bin/sh
#$ -S /bin/sh
#$ -cwd
#$ -l v100=1,s_vmem=1000G

## -l v100=1,s_vmem=1000G でGPU v100を何個確保するかとメモリを指定する

##　FLO-MIN106とSQK-LSK109のセットで実行しているので"dna_r9.4.1_450bps_hac.cfg"でいい
## それ以外なら guppy_basecaller --print_workflowからconfig file確認

guppy_basecaller -i ./fast5/ -x "cuda:all:100%" -s ./guppy__3.4.5_basecalled/ -c dna_r9.4.1_450bps_hac.cfg -r --num_callers 8 --qscore_filtering

```

# guppyとは
Nanoporeのシークエンスデータをbasecall する際に用いるsoftwareで開発元のONTが開発しており、basecallの際一般に用いられる

Nanoporeが読み取った電位変化の波形ファイル（fast5ファイル)を入力として塩基配列（fastqファイル)を出力する

# つまっていた点
qsubで投げるとGPUは確保されているみたいだがoutputのファイルをみるとCPUmodeがONになっておりGPUが使われていない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/e2571e08-c080-43ec-bd35-8602c2045b45.png)
qsub時の出力（CPUのslot(1)とともに、GPUが確保されている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/c1c971bf-0d86-ccd5-185f-cb050860a144.png)
出力(log)ではCPUmodeがONになっておりGPUが使われていない

qsub -j "taskID" で調べると
`-wild score 0.99 CPU usage 2335%`
とCPU稼働率が２４倍と負荷がかかってjob が止められていた（wild scoreというのはCPUに異常な負荷がかかっている確率みたいなもの）

CPU数（slot 数)を上げてもGPU用のoptionをつけていることでGPU用にリソースを確保しているのか毎回異常な負荷がかかっておちていた

GPUを直で指定しようと
`--device auto -s ./guppy_basecalled_0_cpu/`
などにしてログインしているGPUを指定してもだめだった。

# 原因と解決策
`-x "cuda:all:100%"` のoption が必要だった
結局はoption をちゃんと理解することが必要。。

# 参考
https://supcom.hgc.jp/internl/mediawiki/v100　SirokaneにおけるGPU
(Tesla V4の使い方wikiなのでログイン要)
【自分用チートシート】batファイル

#ディスプレイ表示変更
![Qiita](https://news.mynavi.jp/article/win10tips-195/images/002l.jpg "ディスプレイの切り替え")

```batchfile:ディスプレイ表示変更.bat
rem    DisplaySwictch /引数
rem ex DisplaySwictch /extend
rem 拡張 /extend
rem 複製 /clone
DisplaySwictch /extend
DisplaySwictch /clone
pause
```
引用元:https://news.mynavi.jp/article/win10tips-195/


#目次２
nginxでbackendが起動するまでreloadする

flaskのbackendが再起動中とかに`502 Bad Gateway`で画面が止まってしまうので
backendが生きていないときは復帰するまでreloadするものを用意してみた。

**11/22　静的HTMLでリロードする方法　追記**

- 302リダイレクトで返すとリダイレクトループになるので503に。
- すぐ`location.reload()`させるとログが大変なのでsleepさせないといけない。
- よくよく見たら試行錯誤の末2箇所でsleepかかってる。片方で良い。
- [nginxでnon\-blocking sleep \- Qiita](https://qiita.com/cubicdaiya/items/7a4065443e6943f55852)の通り、nginx本体にsleepする機能はないのでnginxモジュールを使う必要がある。
- `echo-nginx-module`も`ngx_lua`もnginxをコンパイルし直す必要があるが、nginxの依存関係にある`nginx-mod-http-perl`の中でsleepが使えたのでこちらを利用する。[ngx\_http\_perl\_modules モジュール 日本語訳](http://mogile.web.fc2.com/nginx/http/ngx_http_perl_module.html)
- 普通にdocumentrootの下に`location.reload()`するhtml置けば良いことに今更気づく。

## ngx_http_perl_modules モジュールを使う方法

```nginx:/etc/nginx/nginx.conf
http {
#省略...
    perl_modules perl/lib;
    perl_require hello.pm;
#省略...
```

```perl:/usr/share/nginx/perl/lib/hello.pm
package hello;

use nginx;

sub handler {
    my $r = shift;

    $r->discard_request_body;
    $r->sleep(2000, \&next);
    $r->send_http_header("text/html");
    return OK if $r->header_only;

    $r->print("<script>setTimeout(\"location.reload()\",2000);</script>");
    $r->print("please wait a moment\n<br/>");
    return OK;
}

sub next {
    my $r = shift;

    $r->send_http_header;

    return OK;
}

1;
__END__
```


```nginx:/etc/nginx/default.d/hello.conf
location ~ /hello/(.*)$ {
	proxy_redirect off;
	proxy_set_header Host $http_host;
	proxy_set_header X-Forwarded-Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	include uwsgi_params;
	uwsgi_param SCRIPT_NAME /hello;
	uwsgi_param PATH_INFO /$1;
	uwsgi_pass unix:/run/flask_hello/uwsgi.sock;

	proxy_intercept_errors on;
	error_page 502 =503 @sleep_redirect;
}
location @sleep_redirect {
	perl hello::handler;
}
```

## 静的HTMLでリロードする方法

```nginx:/etc/nginx/default.d/hello.conf
location ~ /hello/(.*)$ {
	proxy_redirect off;
	proxy_set_header Host $http_host;
	proxy_set_header X-Forwarded-Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	include uwsgi_params;
	uwsgi_param SCRIPT_NAME /hello;
	uwsgi_param PATH_INFO /$1;
	uwsgi_pass unix:/run/flask_hello/uwsgi.sock;

	proxy_intercept_errors on;
	error_page 502 =503 /502.html;
}
location /502.html {
        root /usr/share/nginx/html/;
}
```

```html:/usr/share/nginx/html/502.html
<!DOCTYPE html>
<html>
<script>setTimeout("location.reload()",2000);</script>
please wait a moment!
</html>
```
rtl-sdr

#概要

購入するので、調査。

#チューナーの調査

|Tuner	|Frequency range|
|:--|:--|
|FCI FC2580	|146 - 308 MHz , 438 - 924 MHz|
|Fitipower FC0012	|22 - 948.6 MHz|
|Fitipower FC0013	|22 - 1,100 MHz |
|Rafael Micro R820T	|24 - 1,766 MHz|
|Rafael Micro R828D	|24 - 1,766 MHz|
|Elonics E4000	|52 - 1,100 MHz , 1,250 - 2,200 MHz|


以上。
Railsアプリのローカルサーバー起動中、間違ってサーバー終了せずに閉じてしまった時の対処方法

Railsのアプリをローカルサーバーで起動中、間違ってターミナルを閉じてしまった時、もう一度ローカルサーバーを起動しようとすると、以下のようなエラーが出てきます。

```ruby:ターミナル
xxxxx@xxxxxMacBook-Air test-app % rails s
=> Booting Puma
=> Rails 6.0.3.4 application starting in development 
=> Run `rails server --help` for more startup options
A server is already running. Check /Users/xxxxx/projects/test-app/tmp/pids/server.pid.
Exiting
```


既にローカルサーバーが立ち上がっているため、もう立ち上げられないというエラーです。

今回、この対処方法を記述します。


<h1>起動しているサーバーを表示する</h1>

以下のコマンドより、起動しているサーバーを表示します。

```ruby:ターミナル
xxxx@xxxxxMacBook-Air test-app % lsof -i:3000
```

するとターミナルに以下の表示がされます。

```ruby:ターミナル
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google     3037 xxxx   34u  IPv6 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:63318->localhost:hbci (ESTABLISHED)
ruby      96536 xxxx   18u  IPv4 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:hbci (LISTEN)
ruby      96536 xxxx   20u  IPv6 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:hbci (LISTEN)
ruby      96536 xxxx   35u  IPv6 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:hbci->localhost:62805 (CLOSE_WAIT)
ruby      96536 xxxx   42u  IPv6 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:hbci->localhost:63062 (CLOSE_WAIT)
ruby      96536 xxxx   43u  IPv6 0xxxxxxxxxxxxxxxxx      0t0  TCP localhost:hbci->localhost:63221 (CLOSE_WAIT)
```
<h1>起動しているサーバーを終了する</h1>

COMMANDが「ruby」のPID番号のものを削除します。
ここでは「96536」を示します。

```ruby:ターミナル
xxxx@xxxxxMacBook-Air test-app % kill -9 96536
```

起動しているサーバーを終了したことで、再度サーバーを立ち上げることができます。
Railsアプリ起動中、テーブル処理等うまく動かなくなった時の対処方法(現在起動中の処理削除)


Railsのアプリを起動中、テーブルcreate処理でロックによるエラーなど、テーブルに関するエラー発生する時があります。

これは、複数同アプリの処理が起動中なのが原因な場合も考えられます。

その場合は、現在アプリで処理しているものを停止させる必要があります。

<h1>mysqlを起動する</h1>

以下のコマンドより、mysqlを起動します。

```ruby:ターミナル
xxxxx@xxxxxMacBook-Air test-app % mysql -u root
```
<h1>アプリの処理一覧表示</h1>
次に以下のコマンドで現在起動している処理一覧を表示させます。

```ruby:ターミナル
mysql> show processlist;
```
するとターミナルに以下の表示がされます。

```ruby:ターミナル
+-----+------+-----------+----------------------+---------+------+-------+------------------+
| Id  | User | Host      | db                   | Command | Time | State | Info             |
+-----+------+-----------+----------------------+---------+------+-------+------------------+
| 388 | root | localhost | test_app_development | Sleep   |  382 |       | NULL             |
| 389 | root | localhost | test_app_development | Sleep   |  371 |       | NULL             |
| 390 | root | localhost | NULL                 | Query   |    0 | init  | show processlist |
+-----+------+-----------+----------------------+---------+------+-------+------------------+
```

Idと388と389がアプリ内で処理中のもの、390は先ほどコマンドにより処理一覧を表示させたものです。

<h1>アプリの処理しているものを削除</h1>
388を削除してみます。(以下同様に389も削除します)

```ruby:ターミナル
mysql> kill 388;
```

すると、以下のように388が削除されました。
このように、アプリ内で起動中の処理を削除することで、解決することもあります。

```ruby:ターミナル
+-----+------+-----------+----------------------+---------+------+-------+------------------+
| Id  | User | Host      | db                   | Command | Time | State | Info             |
+-----+------+-----------+----------------------+---------+------+-------+------------------+
| 389 | root | localhost | test_app_development | Sleep   |  371 |       | NULL             |
| 390 | root | localhost | NULL                 | Query   |    0 | init  | show processlist |
+-----+------+-----------+----------------------+---------+------+-------+------------------+
```


<h1>mysqlを閉じる</h1>
以下のコマンドでmysqlを閉じることができます。

```ruby:ターミナル
mysql> exit
```
.DS_Storeと._hogehoge（リソースフォーク）を許さない

私は一応Macを使ってはいますが、それなりにゲームするのでWindowsとかも結構使うんですよ。
そういうときにmacOS側でいじったファイルをWindowsで見ようとすると、「.DS_Store」やら「._a.png」みたいなゴミカスファイル共があるせいで他人と共有するときとか色々とめんどいんですよね。（zip解凍したら出てきたときはキレかけた）

てなわけで調べるとやっぱり消す方法とかあるもんなんですね。

というわけで備忘録も兼ねてまとめておきます。

# コマンド

### 現存してる.DS_Storeを削除

```zsh
sudo find / -name '.DS_Store' -type f -ls -delete
killall Finder
```

findの後ろがルートディレクトリなのでなんか嫌だなって思った人は自分で変えるなりしてください

### そもそも作らないようにする

```zsh
defaults write com.apple.desktopservices DSDontWriteNetworkStores True
killall Finder
```

### リソースフォーク削除

```zsh
dot_clean .
```
意外と簡単だった。


#あとがき

そもそもこんなことしなくてもいいようにしてくれると嬉しいんだけどな！
Rails で既存カラムにdefault オプションを追加したい

# はじめに

Rails で既存カラムのdefault オプションを追加したい場面があったので備忘録です。

# 環境

* macOS 10.15.6
* Ruby 2.5.7
* Rails 5.2.3

# 参考URL

<https://railsguides.jp/active_record_migrations.html>
<https://qiita.com/toda-axiaworks/items/dcc24c8e4b23318e37f4>
<http://tanihiro.hatenablog.com/entry/2014/01/10/182122>

# 目標

* 既存カラムにdefault オプションのみ変更したい
* きちんとロールバックできるmigration ファイルを作成したい

# ロールバック用のメソッドについて

* `up/down` メソッド
* `change` メソッド

上記の2つのパターンでmigration ファイルを記述できますが、オプションの変更のみであれば`change` メソッドの方がシンプルでロールバックも可能ということなので今回は`change` メソッドで進めます。
[こちら](https://qiita.com/toda-axiaworks/items/dcc24c8e4b23318e37f4)の記事を参考にしました。ありがとうございました。

# 実装

Users テーブルのid カラムに`default: 0` オプションを追加する想定です。

1. migration ファイル作成
2. migration ファイルにオプションを追加する処理を追加
3. migrate して設定を反映させる

```Shell
# 既存カラムのオプション変更用migratiton ファイル作成
$ rails g migration change_column_default_to_users
```

```Ruby
# migration ファイルでdefault値に0 を追加
class ChangeColumnDefaultToUsers < ActiveRecord::Migration[5.2]
  def change
    change_column_default :users, :id, from: nil, to: "0"
  end
end
```

```Ruby
# migration ファイルの各項目の詳細
  def change
    change_column_default :テーブル名複数形, :カラム名, from: 変更前のdefault オプションの状態, to: 変更したいdefault オプション
  end
```

`default: true/false`, `dafault: デフォルト値` などのオプション変更も可能です。

```Shell
# 作成したmigration ファイルでmigrate
$ rails db:migrate

# migrate の履歴を確認
$ rails db:migrate:status
```

# 学び

* option を追加するだけだったのに以外にハマってしまった
* migration ファイルはロールバックできるのかを意識して書く事が重要
* オフィシャルのドキュメントはちゃんと読む事
【Rails】でデータを保存・更新後に直前のページに戻りたい！

# はじめに
たとえばECサイトの購入ページからユーザー情報を更新した後、トップページに飛ばされたらどうでしょう？
ユーザーはまた購入画面にアクセスし直さなければならず、かなりUXが悪い状態になってしまいます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/7f9ba5a6-f57d-5386-85bc-ed69abae3da8.jpeg" width=75%>
そこで、元の購入ページへ戻す方法を調べてみました。

# 直接指定すれば良いのでは？
もちろんページ同士が1対1の関係にある場合はこれでOKです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/76971680-854e-091f-0c0b-aaeb736c8c54.jpeg" width=75%>


しかし、ユーザー情報の更新などは他のページからも行えるようにしたいですよね。
ページの関係が多対1の場合、リンク元によって戻るページを変える必要があります。

# 1つ前のページに戻す方法
1つ前に戻る方法はRailsに標準メソッドにあるので簡単です。

```ruby
redirect_back(fallback_location: root_path)
```

しかし、今回はこれを使うことができません。

# 実は「2つ前」に戻さないといけない
データの保存・更新では`元のページ`→`new`→`create`と遷移するので元のページに戻るには2つ前に戻らないといけません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/7ec223fc-5685-bd59-aa11-33fa0cc5139a.jpeg" width=75%>


そこで、戻りたいページのURLをセッションに保存し、create後にそのページに遷移する設定にします。

```ruby:controller
  def new
    session[:previous_url] = request.referer  # ここで前ページセッションを保存
  end
  
  def create
    redirect_to session[:previous_url]  # create後に遷移させる
  end
```

`request.referer`で遷移元のURLを取得することができるので、それをセッションに保存し、createメソッド後に保存しておいたセッションを利用してnew直前のページに遷移させています。
これで2つ前のページに戻ることができます。

# 参考
Referer - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referer

Action Controller の概要 - Railsガイド
https://railsguides.jp/action_controller_overview.html#request%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8response%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88

Railsで遷移元のURLを取得する方法
https://qiita.com/taka_571/items/9b1c82d8fcc602df8a1a![C4CEA757-38D3-4557-A690-5176C5FA5FED_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/169675de-3a9a-6c9b-fc99-8bdffd5be323.jpeg)
VSCodeでSSH X11 Forwardingする方法

VS CodeでSSH X11 Forwardingする方法を雑に記録する。

# 前提条件:

* ローカルマシン: 
    * OS: Windows 10 
    * Application:
        * wsl or wsl2
        * VS Code
            * Remote - SSH 
        * VcXsrv
    * その他
        * batが動作すること
* ホストマシン: Linux
    * Application:
        * ssh(X11Forwardingが有効になっていること)
    * 検証のためにxeyes等のアプリが入っていること

# 方法

ローカルマシンにて、次のファイルを用意する

```x11ssh.bat
set DISPLAY=localhost:0.0
ssh %*
```

VS Codeの設定画面より、Remote.SSH:PATHに1で作成した`x11ssh.bat`のPathを登録する。
VS Codeよりホストマシンにssh接続して、xeyesが動作することを確認する。
VBAでセル内改行を含むUTF-8のCSVを取込む

# やりたいこと
UTF-8のCSVをエクセルに取り込んで、CSVの値をブックに転記します。
元のCSVファイルにはセル内改行が含まれています。セル内改行コードを含んだままCSVファイルをインポートするVBAを作ります。

# CSVを取込む方法
VBAでCSVを取込む方法はいくつかあります。
今回は、CSVの文字コードがUTF-8だったこと、セル内改行があること、ゼロ落ちを防ぐことから、CreateObject関数を使用します。

**Openメソッド**
Openメソッドで取り込むと、ゼロ落ちしてしまいます。携帯電話番号だと09012345678が9012345678となってしまい、もとのCSVデータと値が変わってしまうため採用しませんでした。

**OpenTextメソッド**
UTF-8のcsvを取込むと文字化けが発生します。おそらくエクセル固有のバグのようです。txtに変換すると文字化けしないようですが、変換は煩雑なので採用しませんでした。

**QueryTables.Add関数**
CSVの1項目ずつ読み込みます。セル内改行があると、ブックに転記する時に改行され、取り込んだCSVデータのレイアウトが崩れてしまいます。QueryTables.Addではセル内改行に対応できないため、採用しませんでした。

**CreateObject関数**
CSVの文字コード指定ができて、セル内改行でも取り込んだ際にレイアウトが崩れないため、CreateObject関数を採用しました。

# ソースコード
```vb
Sub Sample1()
    Dim buf As String, Target As String
    Target = "C:\Users\xxxx\Desktop\list.csv"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8" '文字コードの指定
        .Open
        .LoadFromFile Target
        buf = .ReadText
       .Close
    End With
    
    Dim AddressData As Variant
    Dim v As Variant
    Dim i As Long
    
    'AddressDataの改行コードは「vbLf」だったので、「vbLf」ごとに分割
    'サクラエディタで改行位置にカーソルを合わせるとフッターバーに改行コードを確認できる
    AddressData = Split(buf, vbLf)
    
    'Uboundは配列に入っている値の数を返す関数
    For i = 0 To UBound(AddressData)
        
        'AddressDataのCSVの最後の行にカラ行がある。カラ行になったら処理を終了する
        If Len(AddressData(i)) > 0 Then
        
            'AddressDataはセミコロン区切り。セミコロンで分割する
            v = Split(AddressData(i), ";")
            
            'Offsetプロパティを用いて、A1セルからi個をずらした行に値を入力
            'Ubound(v)で何個分データが入っているかを計測。Resizeを用いて、データに入っている項目分だけセル分割
            Range("A1").Offset(i).Resize(, UBound(v) + 1).Value = v
        End If
    Next
End Sub
```
FlaskでHTTP環境変数

HTTP環境変数という言葉が合っているのかわからない。

```py:app.py
from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def hello_world():
    for k in request.environ:
        print("{}={}".format(k, request.environ[k]))
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

```

```
SERVER_SOFTWARE=Werkzeug/1.0.1
REQUEST_METHOD=GET
SCRIPT_NAME=
PATH_INFO=/
QUERY_STRING=
REQUEST_URI=/
RAW_URI=/
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=62784
SERVER_NAME=127.0.0.1
SERVER_PORT=5000
SERVER_PROTOCOL=HTTP/1.1
HTTP_HOST=127.0.0.1:5000
HTTP_CONNECTION=keep-alive
HTTP_CACHE_CONTROL=max-age=0
HTTP_UPGRADE_INSECURE_REQUESTS=1
HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
HTTP_SEC_FETCH_SITE=none
HTTP_SEC_FETCH_MODE=navigate
HTTP_SEC_FETCH_USER=?1
HTTP_SEC_FETCH_DEST=document
HTTP_ACCEPT_ENCODING=gzip, deflate, br
HTTP_ACCEPT_LANGUAGE=ja,en-US;q=0.9,en;q=0.8,und;q=0.7
```
Go言語の特徴

# 概要
* [Gocci.me]("https://gocci.me/")と言うサービスをGo言語で開発しており、そのGo言語の持つ特徴をまとめました

# 言語設計と文法
## シンプル
Go言語はいろいろな書き方が存在するわけではなく、ある程度書き方が決まっているので、シンプルに実装することができます。
比較的昨日の割には言語仕様を理解しやすくなっています。

## コンパイル言語
コンパイル言語とは実行をする前に**一括で全てのコードを機械語もしくは中間言語にコンパイル（翻訳）する言語**のことです。
コンパイル言語は**記述方法が厳密**と言う特徴がありますが、一括で機械語に変換してコンピュータに処理させるため、**処理が高速**であると言う特徴を持ちます。
Go言語は**コンパイル速度も早い**と言われています。

## 静的型付け
Go言語ではプログラムを書く際に**予め型を指定しなければいけません**。
静的型付けは事前にコンパイルを行うことで、プログラムの実行時には型の生合成チェックをする必要がなく、処理が高速になります。
また、コンパイル時に型のチェックを行うため、**型の整合エラーをチェックできます**。
JavaやC言語がこの特徴を持っています。

対してプログラムを書く際に型付けを行わない動的型付け言語が存在します。
JavaScriptやRubyやPythonなどが動的型付け言語になります。
これらは処理は高速ではありませんが、プログラムの記述量が少なく、文甫の学習コストが低いため、直感的にコードを書くことができます。

# 並行プログラミング
## ゴールーチン
処理を仮想スレッドで起動する機能のことで、軽量なスレッドのイメージです。
goキーワードをつけて関数を呼び出すことで実現できます。

```go
func main() {
  go f()  // ゴールーチンの呼び出し
}
func f() {
  // some task
}
```

ゴールーチンでは関数に戻り値を設定することができません。
ゴールーチンでは処理が完了されると破棄されます。

## チャネル
ゴールーチンのみでは作業中か破棄されたのかを検知することができないため、意図しない挙動が発生した時にエラーハンドリングなどができません。
また、戻り値がないので、作業の結果として加工した値を受け取ることもできません。
そこでチャネルと言う機能によって、**ゴールーチン間のデータのやりとりを可能にします**。
チャネルの受信を記述することで、**値が送信されるまで待ってくれます**。
チャネルは**バッファを持たせる**こともでき、作成時にバッファを指定すると、チャネルが持てるデータの個数が決まります。（デフォルトは0）
バッファを超えて値を送信すると、送信ブロッキングが発生します。

# 豊富な標準ライブラリ
Go言語には[標準ライブラリ]("https://golang.org/pkg/")が豊富に揃っています。

# シングルバイナリ・クロスコンパイル
Go言語では異なるOSやアーキテクチャ向けのバイナリを作ることができます。
下記のように環境変数のGOOSとGOARCHを指定することで実現可能です

```bash
# Windows(32bit)向け
$ GOOS=windows GOARCH=386 go build

# Linux(64bit）向け
$ GOOS=linux GOARCH=amd64 go build
```
Go言語で書かれたプログラムは基本的には単体で実行可能なシングルバイナリとして生成されます。
一旦コンパイルしてしまえばLL言語（短い記述で処理を実現できる言語）などで必要なランタイムや依存関係の管理が必要なくなり、動作環境を用意しなくていいと言う特徴があります。
Delphi で湯婆婆を実装してみる

# はじめに
ネタに乗ってみました。

Delphi による湯婆婆は @e99h2121 さんが既に投稿されていたので、

 - [Delphiで湯婆婆する (Qiita:@e99h2121)](https://qiita.com/e99h2121/items/0aba0ce4b5b4d1c27505)

私はコンソールアプリケーションで書いてみることにしました。


# コード
**Delphi 10.4 Sydney** で書いてみました。

```pascal:Yubaba.dpr
program Yubaba;
{$APPTYPE CONSOLE}

uses
  System.SysUtils;

begin
  Randomize;
  Writeln('契約書だよ。そこに名前を書きな。');
  var name: string;
  Readln(name);
  Writeln('フン。', name, 'というのかい。贅沢な名だねぇ。');
  var newNameIndex := Random(name.Length);
  var newName := name.Substring(newNameIndex, 1);
  Writeln('今からお前の名前は', newName, 'だ。いいかい、', newName, 'だよ。分かったら返事をするんだ、', newName, '!!');
end.
```

SysUtils を使わないようにすれば (標準ルーチンだけで書けば) 行数を減らせます。

```pascal:Yubaba.dpr
program Yubaba;
{$APPTYPE CONSOLE}
begin
  Randomize;
  Writeln('契約書だよ。そこに名前を書きな。');
  var name: string;
  Readln(name);
  Writeln('フン。', name, 'というのかい。贅沢な名だねぇ。');
  var newNameIndex := Random(Length(name));
  var newName := Copy(name, newNameIndex + 1, 1);
  Writeln('今からお前の名前は', newName, 'だ。いいかい、', newName, 'だよ。分かったら返事をするんだ、', newName, '!!');
end.
```

実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/44655b52-b921-aac0-0fd5-ffb106909bb6.png)
まぁ、そうなるな。

**See also:**

 - [標準ルーチンと入出力 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E6%A8%99%E6%BA%96%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3%E3%81%A8%E5%85%A5%E5%87%BA%E5%8A%9B)

## 追記

わざわざ `SubString()` や `Copy()` を使っているのは、空の文字列が入力された時にエラーになるからです。次のような書き方もできるのですが、空の文字列が入力された時にエラーになってしまいます。

```pascal:Yubaba.dpr
program Yubaba;
{$APPTYPE CONSOLE}

uses
  System.SysUtils;

begin
  Randomize;
  Writeln('契約書だよ。そこに名前を書きな。');
  var name: string;
  Readln(name);
  var newNameIndex := Random(Length(name));
  var newName := name.Chars[newNameIndex];
  Writeln('フン。', name, 'というのかい。贅沢な名だねぇ。', sLineBreak, '今からお前の名前は', newName, 'だ。いいかい、', newName, 'だよ。分かったら返事をするんだ、', newName, '!!');
  readln
end.
```

```pascal:Yubaba.dpr
program Yubaba;
{$APPTYPE CONSOLE}
begin
  Randomize;
  Writeln('契約書だよ。そこに名前を書きな。');
  var name: string;
  Readln(name);
  Writeln('フン。', name, 'というのかい。贅沢な名だねぇ。');
  var newNameIndex := Random(Length(name));
  var newName := name[newNameIndex + 1];
  Writeln('今からお前の名前は', newName, 'だ。いいかい、', newName, 'だよ。分かったら返事をするんだ、', newName, '!!');
end.
```


# おわりに

いろんな言語のコードが読めて面白いですね。

**See also:**

 - [Delphi で前前前世 (Qiita)](https://qiita.com/ht_deko/items/19f7bc80ec24e2019650)
LaravelのEloquentで、グループごとに日付が最新の行を取得したいときのテク

たとえば、サロンの予約テーブルがあるとしたら、
ユーザーごとに日付が最新の予約だけを取得したいときに使えるテク。

## 前提
```php
// NGな例
$reservations = Reservation
    ::groupBy('user_id')
    ->selectRaw('user_id, max(visit_salon_time)')
    ->get();
```
みたいな感じで良さそうだが、これだと`user_id`と`visit_salon_time`しか取得できない。
集計が効かないカラムの取得には工夫が必要。

## 具体的な方法
別の書き方は複数存在するが、以下のコードはサブクエリが不要でシンプル。

```php
$reservations = Reservation
    ::leftJoin(
        'reservations as reservations2',
        function ($join) {
            $join->on('reservations.user_id', 'reservations2.user_id')
                ->whereColumn('reservations.visit_salon_time', '<', 'reservations2.visit_salon_time');
        }
    )
    ->whereNull('reservations2.user_id')
    ->get();
```

## ざっくり解説
同じテーブルを条件付きで`leftJoin`して、日付が最新の行は`Join`されないようにする。
`Join`されたテーブルのいずれかのカラムが`Null`であれば最新。
スクショがMacのデスクトップに出ないようにする方法

# 概要
スクショはよく使いますが、なんの設定もしていないとデスクトップに保存されてしまい、
デスクトップが汚れてしまうということがあると思います。
せっかく好きな画像をデスクトップにしたのに埋もれてしまった。。
人にPCを見せるときに見せたくないものが見えてしまった。。

今回はそんな人のために、変更方法を記載します。

# 変更方法
ターミナルを開き、下記コマンドを実行します。

```sh
// スクショの登録先をデスクトップ→Picturesに保存する場合
defaults write com.apple.screencapture location ~/Pictures/;killall SystemUIServer
```

これでスクショを撮影すると以降はPictures(ピクチャ)に保存されます。

※ただし、この段階では今までのものはデスクトップに残ってしまっています。
どこかにコピーなり移動してから(バックアップしてから)、削除したいですね。
その場合、
Finderでの全ファイルの選択は
⌘(コマンドキー) + A
で行うことが出来ます。
あとは全部選択した状態で
control + 右タップから　○○項目をコピーを選択することでコピーが可能です。
あとは、同じくFinderで対象のディレクトリに入り、
control + 右タップから　○○項目をペーストを選択することでペースト出来ます。
削除も同様に全ファイル選択して一括削除可能です。


# 解説
defaultsはMacOSの便利なコマンドで、システムの設定を変更することが可能です。
上記のコマンドはMacのスクショの保存先を変更しています。

他にも、下記のようなことができるようです。

```
## 未確認のアプリケーションを実行する際のダイアログを無効にする
defaults write com.apple.LaunchServices LSQuarantine -bool false

## 三本指でドラッグ
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDrag -bool true && \
defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerDrag -bool true
```

引用: https://qiita.com/keitean/items/bf82da152fd587fa29ef


# おわりに
本記事を読んでくださり、ありがとうございます！
是非この機会に余計なスクショを無くして快適なMACライフを過ごしましょう！
create-react-app + TypeScript: 初っ端からnpm startでエラーが出たときの対処法

```
バージョン情報
- TypeScript: 4.1.2
- create-react-app: 4.0.0
```

## エラー内容

Reactアプリをサクッと書きたいときに便利な`create-react-app`。
TypeScriptで書きたいなと思ったときには、

```
npx create-react-app [app name] --template typescript
```

と書くことで簡単に作成してくれるのですが、create-react-appのバージョンを`4.0.0`にした途端、`npm start`をしてみると

```
path\to\app\node_modules\react-scripts\scripts\utils\verifyTypeScriptSetup.js:239
      appTsConfig.compilerOptions[option] = value;
                                          ^

TypeError: Cannot assign to read only property 'jsx' of object '#<Object>'
```

のように怒られてしまう問題が発生しました。

## 解決方法

1. create-react-appによって作成された`tsconfig.json`を削除
2. その状態で`npm start`または`yarn start`する。（ここで自動的に`tsconfig.json`が再作成される）
3. なぜか動くようになる！！！

何が違うのか気になったため2つのtsconfig.jsonを比較しましたが、**何も違いませんでした**。
なぜ動くんだ......

(参考: https://github.com/facebook/create-react-app/issues/10117)
Redmineのデフォルトテーマはなんか味気ないよね…もうちょい見栄えがいいテーマを適用しよう

#やり方
Redmineインストールフォルダー内のpublic/themesにテーマのファイル置くだけだす。
（この記事は/var/lib/redmine にRedmineをインストールした前提になります）

dwarfっていうテーマをインストールしてみます。
gitでファイル取ってきます。

```
git clone https://github.com/themondays/Dwarf.git /var/lib/redmine/public/themes/dwarf
```
これだけだとダメ！フォルダーの階層が間違っているから…。
themes/テーマ名 フォルダーの直下にimagesフォルダーとかが入ってないといけないん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0b283a72-bb83-e2a9-5ee3-9a05269fb234.png)
こうなるようにファイル移動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/23415d3f-ae52-8f16-c08a-0f4fc5c3edbf.png)
ファイルを置くだけでOK。
OSとかデータベースとか、何かを再起動する必要はなっしんぐ。


#テーマを適用するざんす
管理の設定ページへ行って…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4dd35084-0ff5-7191-2f05-2baab2348ff3.png)
表示タブのテーマを変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3d46fc33-c0e8-1415-1b7a-1c5589ac0b13.png)
こんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2f1f6fd2-07b5-2de0-8e5a-2d02764b483f.png)
変更前のデフォルトテーマはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/01fcb3fd-f191-85bb-3375-7f260485163d.png)


#テーマの適用範囲
全ユーザーだよ。
使ってるみんなに影響あるから注意ね。


#蛇足
ユーザーごとにテーマ変えられたらいいなあ。


#参考サイトさん
https://www.sejuku.net/blog/86277

#バージョン
CentOS Linux release 8.2.2004 (Core)
Redmine 4.0.6
【chartkick】DBから任意のデータを抽出しグラフを作成する


目的：データベースから任意のデータを抽出してその合計や割合をグラフで表現する

環境:rails 6
DB :mysql 5.６

完成物　
①アンケート結果の割合を円グラフで表示
②毎日の売上を折れ線グラフで表示

①![スクリーンショット 2020-11-22 0.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864534/a4923d8a-645b-dab4-29ea-b2a67ec7b965.png)

②![スクリーンショット 2020-11-22 1.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864534/fda1c4b2-8fcd-5ebc-c9f0-d3393b1dd2c2.png)

直面した課題
・各グラフに挿入するデータの抽出。割合を求める場合はグラフの配列にどのようにアンケート結果を振り分けていくべきか？折れ線グラフの方は特定のユーザーが投稿しているポストの中でオーダー実績があるポストの価格を合計するという指定。

以下手順。
まず、必要なライブラリのインストール

require("chartkick")
require("chart.js")

yarn add chartkick chart.js

でインストール実施。
グラフ自体の作成は極めて簡潔です。公式リファレンスも参考にして頂ければと思います。
https://chartkick.com/

①円グラフの作成
割合を表す円グラフは下のように配列形式で、項目とデータを指定。
＠result = [["男性",0],["女性",0],["その他",0]]
HTMLは
<%= pie_chart @result, width: "400px", height:"350px", class:"chart"%>
のように記述します。

今回の問題、データの指定方法として、アンケート（データ）が入力されるたびに上記のような各配列の値を増やしていく繰り返し処理を定義致しました。

![スクリーンショット 2020-11-22 1.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864534/358110ce-acda-9f50-cb6f-8247a831b4be.png)

result[0][1]という記述で、配列のキーと値を指定、それに対してアンケートの結果（id)によって＋１を振り分ける処理の繰り返しを実行。あとは、引数に抽出したいデータが入っているカラムデータを指定してあげればOKです。参考までに私の場合はいかになりました。

@first_id = Evaluation.where(post_id: @post.id).pluck(:first_id)
@aggregate = aggregateOpinion(@first_id)

whereでテーブル内検索の条件を指定、pluckでその中で特定のカラムのデータを全て取得。

②折れ線グラフで売上の推移を表示

こちらでは主にデータの抽出に関して苦労した点を共有致します。完成のHTMLは以下となります。

<%= line_chart @order_posts.group_by_day(:created_at).sum(:price), width: "800px", height: "300px",xmax: @today,label: "Value",xtitle: "日付",ytitle: "販売金額"%>

ざっと説明だけしておくと、group_by_day(:created_at)で日時の指定、sum(:price)で抽出したデータの全てのpriceを合計。

苦戦したデータ抽出
前提として、usersテーブル、postsテーブル、post_ordersテーブルがありそれぞれがアソシエーションが組まれている状態。current_userが投稿したpostの中で、価格が０円の物を除く（今回のアプリの都合上0円で投稿されている物もあり）、その中でpost_ordersテーブルにデータがあるものを全て指定する。
(初学者で変数名の定義がおかしいです。ご容赦下さい）

@user = User.find(params[:user_id])　//ユーザーの指定
@post = @user.posts　//ユーザーが投稿した全てのpost
@posts = @post.where.not(price: 0)　//価格０円を除く
@order_posts = PostOrder.where(post_id: @posts.ids)　//ユーザーが投稿した中で売れたpost
@sales = Post.where(id: @order_posts.post_id) //postsテーブル内のユーザーが投稿して売れているアイテムを指定

雑魚初心者の私はこれでOK、と考えましたがこれではダメです。最終行の＠order＿postsでpost_idは定義されていませんというエラーとなります。色々なパターンを確認しましたが、このように複数のデータを抽出している場合はアソシエーションが組まれているテーブル同士の要素を組みわせて指定することはできません。
しかし、グラフに表示するにはpostsテーブルのpriceのデータが必須なのでモデルはpostでなくてはなりません。かなり試行錯誤しましたが、雑魚初心者の私には解決できず....。
結局、post_ordersテーブルにpriceカラムを追加することで解決しました。上記のグラフの指定データが@order_postsになっているのはその為です。

今回とは別に各postごとの売上を棒グラフ化するというのも合わせて実装しました。

![スクリーンショット 2020-11-22 2.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864534/244a4c15-db11-6314-513d-6d16023af413.png)

これも含めて今回の教訓となったのはデータを抽出するソート方法です。
各投稿という指定でいくと、重複はダメなので、distinctというオプションを使うのですが、これはwhereメソッドとは併用できずselectメソッドを使います。私が苦労したように複数データを指定する場合は、変数.子テーブルのカラムという定義ができなかったり、where(正の条件).where.not(否の条件)と合わせて使うことも可能だったり、countメソッドも使える場合と使えない場合があったり。

どうにもならない時は少し視点を変えて、今回のようにカラム自体を追加するという解決方法もアリかと思います。何かお気づきな点ございましたら、何卒ご教授お願い致します。
RTX810 に SSH できなくなった

# はじめに

自宅のルータに SSH で入ろうと思ったら `no matching key exchange method found.` とか言われて認証させてくれなくなった

環境は以下

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:        20.04
Codename:       focal
$ ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f  31 Mar 2020
```

```
RTX810 Rev.11.01.33 (Fri Apr 20 08:44:58 2018)
```

# 事象

相手（RTX810）の鍵交換方式が古すぎて疎通できないってよ！

```
$ ssh 192.168.x.x
Unable to negotiate with 192.168.x.x port 22: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```

# 解決策

ホストを限定して古いアルゴリズムを許可すれば通信できるよ

```
$ vim ~/.ssh/config
```

```
Host 192.168.x.x
    KexAlgorithms +diffie-hellman-group14-sha1
```

# 更新：2020/11/22

解決策 で `diffie-hellman-group1-sha1` を指定していましたが、コメントをいただいたとおり
選択可能なら鍵長の長い安全なものを選択するべきでした。
`diffie-hellman-group14-sha1` に修正しました！（@ttdoda さん、ありがとうございます！！）

参考：
[OpenSSHの暗号化周りの設定について](https://qiita.com/aqmr-kino/items/8c3306ea8022b0d5cbe4)
[対応しているアルゴリズムはなんですか？](http://www.rtpro.yamaha.co.jp/RT/FAQ/TLS/tls-algorithm.html)
[対応しているTLSのバージョンはいくつですか？](http://www.rtpro.yamaha.co.jp/RT/FAQ/TLS/tls-version.html)

買い替え時期か～
gitコマンドを2要素認証に対応させるメモ

1. `git`に関する認証情報の保存先を確認する。
    - Windows環境

        ```
        $ git config --global credential.helper
        manager
        ```

1. `manager`の場合、`GCM(Git Credential Manager)`に保存される。

1. `GCM`から`github.com`に関する認証情報を取得する。

    ```
    $ git credential-manager get
    protocol=https[Enter]
    host=github.com[Enter]
    [Enter]
    ```

    ```text
    protocol=https
    host=github.com
    path=
    username=foobar@example.com
    password=********
    ```

1. `GCM`から`github.com`に関する認証情報を削除する。

    ```
    $ git credential-manager erase
    protocol=https[Enter]
    host=github.com[Enter]
    [Enter]
    ```

1. `git clone`コマンドを実行する。
1. `GCM`の認証画面が表示される。
1. 新たに、`github.com`の認証情報をキャッシュする。
1. パスワードにアクセストークンを指定する。
Visual Basic 6.0で実装する湯婆婆（サポート状況も調べてみた） 

個人的にサポート状況を知りたかったのもあり、流行りにも乗りかかり、記事にしてみました。

ちなみに、大本は@Nemesisさんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)です。参考にさせて頂きました。ありがとうございます。

できたのは、とりあえず、こんな感じです。

##開発環境
確かVB6.0のIDEがXPまでしか対応していなかったはずです（Vista対応していたか？）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/3be46f2e-9492-f2b8-899c-d54dd3e55f0b.png)

##コード

```visualbasic
Option Explicit
Const popupTitle = "湯婆婆 for VB6.0"

'契約ボタン
Private Sub btnContract_Click()
    '名前の長さを取得
    Dim length As Integer
    length = Len(Me.txtName.Text)

    If (length = 0) Then Exit Sub
    
    MsgBox "フン。" & Me.txtName.Text & "というのかい。贅沢な名だねぇ。", vbOKOnly, popupTitle
    
    'ランダムな位置を取得
    Randomize
    Dim newNameIndex As Integer
    newNameIndex = Int((length * Rnd) + 1)
    Dim newName As String
    newName = Mid(Me.txtName.Text, newNameIndex, 1)

    MsgBox "今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!", vbOKOnly, popupTitle

End Sub
```

##実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/281086d3-604f-31d5-c099-e75cc15d5af2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/e83db2e0-958f-a2e3-f81c-cd3ff1e10570.png)

##.NETと比べて困るところ
.NETだとPictureBoxのDockプロパティで、親要素全体に張り付けることが可能ですが、VBにはありません。なので、ウインドウサイズが変わると子要素も連動するようにコーディングしてやる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/eebf815f-f16b-fb53-954a-764b048340bb.png)

あと、UTF-8にも対応していません。
「𠮷田」さんには対応できません…。

コントロールの種類も少ないし、メソッド・プロパティも少ないし、色々と不自由が多いですね。

##まだまだ使われているVB6.0アプリ
不自由が多いですが、それでも、現役で動くVB6.0で作られたアプリは今でもあるようです。某大手の電子カルテパッケージでも部分的には.NET化されていますが、VB6.0の部分もまだ残っていたり…と（あと、Officeで作られた資産が多いのかも）。

そういう状況だからか、Windows 10になってもVB6.0で作られたアプリについては現在でも動作が保証されています（IDEはとっくの昔にサポート切れてますが）。

##MicrosoftのVB6.0対応状況

Microsoft公式サイトの情報源としては、以下の2点が見つかります。

- [Visual Basic 6.0 には、どのようなライフサイクル ポリシーが適用されますか?（ライフサイクルに関する FAQ - 開発者ツール）](https://docs.microsoft.com/ja-jp/lifecycle/faq/developer-tools#smallwhat-lifecycle-policy-does-visual-basic-60-followsmall)
- [Support Statement for Visual Basic 6.0 on Windows](https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/visual-basic-6-support-policy?redirectedfrom=MSDN) (英語)

2番目の英語のサイトの冒頭（下の引用）に「It Just Works」とありますが、VB6アプリケーションが動作することのみに限定して対応しているような印象です。

>The Visual Basic team is committed to "It Just Works" compatibility for Visual Basic 6.0 applications on the following supported Windows operating systems:
>
>- Windows 10
>- Windows 8.1
> 
> （以下略）

IDEは、2008/4/8でサポート打ち切りがされています。なので、新規に作るのは難しい状態。ただ、昔、VB6.0アプリの改修をしていた時にWindows7に入れて作っていましたが、7では一応使えていました（但し、Officeを入れた後にVBをインストールすると、デバッグ実行がおかしくなる）。

VB6.0の実行にはランタイムが必要で、まだMSサイトでも配布されています。ランタイム自体は、同梱しているOSのサポートのライフサイクルに合わせるみたいです。

なので、まだまだVBもVBAも現役であり続けるのでしょうかね…？

例外処理・イベント処理だけでなく、今となっては色んな面で作りにくい言語ですが、当面、消えることはなさそうです。

ちなみに、ちゃんとWindows 10でも動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/f971751e-570e-eb73-e463-be8ff2a6111a.png)
構造体について【Swift】

# 構造体とは？
* 変数、定数、関数を１つのグループとしてまとめる仕組み。  
* 構造体の中で作られた変数・定数を __プロパティ__ 、関数を __メソッド__ という。  
* 構造体の中で作られた変数・定数を初期化することを __イニシャライズ__ という。  
* 構造体を利用するにはインスタンス化が必要。
* データ型は全て構造体である。（ `Int`、 `Float`、 `Double`、 `String`、 `Bool` ）

# 実装例
```Swift
struct Human {
    // プロパティを定義
    let name: String
    let age: Int

    // initを使用することでイニシャライザ定義
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func introduction() {
        print("私の名前は\(name)です。年齢は\(age)歳です。")
    }
    
}
// Human構造体をインスタンス化
let human = Human(name: "山田太郎", age: 25)
// introductionメソッドへアクセス
human.introduction() // 私の名前は山田太郎です。年齢は25歳です。
```


# 定義方法
```Swift
struct 構造体名 {
    // 構造体の定義
}
```


# プロパティとは？
#### インスタンスプロパティ
* 型のインスタンスに紐付くプロパティ
* 型のインスタンスに紐付くため、インスタンス化しなければ使うことができません。

#### スタティックプロパティ
* 型自身に紐付くプロパティ
* 型の性質を表すプロパティを定義したいとき（大規模なプロジェクト以外はあまり使う機会がない？）
* 静的という意味なので `let` を推奨


#### インスタンスプロパティとスタティックプロパティの違い
```Swift
struct Human {
    // スタティックプロパティ
    static let name = "山田太郎"
    // インスタンスプロパティ
    let age = 25 
}
// スタティックプロパティへアクセス
Human.name // OK
Human().name // NG

// インスタンスプロパティへアクセス
Human.age // NG
Human().age // OK
```
* `型名().プロパティ名`（型名に`()`をつけることでデフォルトのイニシャライザが働き、インスタンス化される）


# イニシャライザとは？
* プロパティを初期化する為のもの（他の言語ではコンストラクタとほぼ同様）
* インスタンス化時に実行される特殊なメソッド

#### 書式
```Swift
init(引数名: 型名, ...) {
    // selfは構造体自身のインスタンスを意味する
    self.プロパティ名 = 値（引数を使ったりする）
}
```

#### メンバーワイズイニシャライザ
* デフォルトで用意されている特殊なイニシャライザ
* イニシャライザは定義しない
* 単純な初期化ならメンバーワイズイニシャライザが使えるが、イニシャライザを定義すると使えなくなる

# インスタンス化の方法
#### イニシャライザを定義していない時
```Swift
let 変数名 = 構造体名()
```

#### イニシャライザを定義した時
```Swift
let 変数名 = 構造体名(引数名: 型名, ...)
```

#### メンバーワイズイニシャライザを使用する時
```Swift
let 変数名 = 構造体名(プロパティ名: 値, ...) // プロパティを直接指定する
```


# アクセス方法
```Swift
let 変数名 = 構造体名()
変数名.プロパティ名
変数名.メソッド名
```


# 参考
* [本気で学ぶSwift講座【構造体〜プロパティ編】はじめてのプログラミング~iOSアプリ開発までの道](https://www.youtube.com/watch?v=8G7twq8GYn4&list=PL3nfHFjHVxFaf5EuHUXRMjT_DwPFH2-21&index=15)
* [本気で学ぶSwift講座【構造体〜イニシャライザ編】はじめてのプログラミング~iOSアプリ開発までの道
](https://www.youtube.com/watch?v=29WuUetOipQ&list=PL3nfHFjHVxFaf5EuHUXRMjT_DwPFH2-21&index=16)
* [本気で学ぶSwift講座【構造体〜メソッド編】はじめてのプログラミング~iOSアプリ開発までの道](https://www.youtube.com/watch?v=07iCBtFvJQw&list=PL3nfHFjHVxFaf5EuHUXRMjT_DwPFH2-21&index=17)