OmniAICreator/Qiita-1.07M huggingface dataset:
パスワードなしで sudo で apt を実行できるようにする (ubuntu 21.04)

# パスワードなしで sudo で apt を実行できるようにする (ubuntu 21.04)

## 手順

```
echo $USER ALL=NOPASSWD: /usr/bin/apt | sudo tee /etc/sudoers.d/apt
sudo chmod 440 /etc/sudoers.d/apt
```

## 説明

[こちらの記事](https://qiita.com/m-tmatma/items/0e5300c678a19b1af6fc) でパスワードなしで sudo を実行する方法を説明しました。

[apt のプロキシ対応](https://qiita.com/m-tmatma/items/e3d9de76be50763ac01c) の記事で少し触れたとおり、ubuntu 21.04 では `/etc/sudoers` が readonly に設定されています。そのうえで `/etc/sudoers` の最後で `/etc/sudoers.d` 以下のファイルを include するようになっています。

このため  `/etc/sudoers` を直接編集する方法ではなく、`/etc/sudoers.d` 以下に新しいファイルを作成して行います。

`/etc/sudoers.d/README` の説明によれば `/etc/sudoers.d` 以下のファイルのファイルの permission を 440 とすべきとあるので、permission を明示的に指定します。



## sudoers 関連のファイルを編集するときの注意

sudoers 関連の設定ファイルを編集する場合、操作を間違うと sudo が機能しなくなる恐れがあります。

このため sudoers 関連の設定ファイルを編集する前に、別に terminal を起動して以下コマンドでroot のシェルを起動したうえで、行うことをお勧めします。

```
sudo -i
```

別で root 権限の terminal を起動しておくと、sudoers 関連の設定ファイルの操作を誤った場合でも root 権限で元に戻すことができます。

## 参考


/etc/sudoers

```
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d
```

/etc/sudoers.d/README

```
#
# As of Debian version 1.7.2p1-1, the default /etc/sudoers file created on
# installation of the package now includes the directive:
#
#       #includedir /etc/sudoers.d
#
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
#
# Note that there must be at least one file in the sudoers.d directory (this
# one will do), and all files in this directory should be mode 0440.
#
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade.  Feel free
# to add the above directive to the end of your /etc/sudoers file to enable
# this functionality for existing installations if you wish!
#
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
# See the man page for visudo for more information.
#
```
応用情報技術者試験に向け勉強してみた〜コンピューター編〜

##CPUとは
日本語で言うところの中央処理装置。
人間で言うところの脳みそのこと。
中には制御装置と演算装置が含まれている。

##ノイマン型コンピューターとは
コンピューターに処理をさせるプログラムは通常、補助記憶装置に納められている。（HDやCD ROMなど）
いざ実行となると主記憶装置にプログラムがコピーされてCPUが一つずつ実行していく。
この特徴を持つコンピューターをノイマンコンピューターという。
現代のコンピューターのほとんどがノイマン型コンピューターである。

##レジスタとは
レジスタとはCPU内部の記憶装置のこと
最も早く書き込みできる。

###レジスタの種類

|名称|役割|
|:--:|:--:|
|プログラムカウンタ|次に実行されるアドレスを記録するレジスタ|
|命令レジスタ|取り出した命令を一時的に記憶するためのレジスタ|
|インデックス（指標）レジスタ|アドレス修飾に用いるためのレジスタで、連続したデータの取り出しに使うための増分値を保持する|
|ベースレジスタ|アドレス修飾に用いいるためのレジスタで、プログラムの先頭アドレスを保持しやすくなる|
|アキュームレジスタ|演算の対象となる数や演算結果を記憶するレジスタ|
|汎用レジスタ|特に機能を限定していないレジスタ。一時的な値の保持やアキュレーターなどの代用に使ったりする。|


##命令の実行手順
1. 命令の取り出し（フェッチ）
1. 命令の解読
1. 対象データ（オペランド）読み出し
1. 命令実行
PC-8001でもXMODEM

HardOffで110円で手に入れた[UP12](https://qiita.com/yamori813/items/467a3cccdcb308a4eba0)でPC-8001とWindows 7がつながったのに気をよくて、XMODEMのシーケンスを試してみました。

XMODEMはコンピュータ間でシリアル通信を使いファイルの送受信をおこなうプロトコルで、1977年にWard Christensenにより8BitのCP/M上で開発されたようです。日本ではパソコン通信とともに80年代に入ってから普及しました。XMODEMが元祖で、いろいろな派生系が存在します。

Windows 7でターミナルはRLoginを使っているのですがRLoginにもXMODEMのサポートがありました。

Z80のアセンブラで受信のプログラムを書いてみました。シーケンスの確認で中身は無いです。

```
UARTRD	EQU	20H
UARTRC	EQU	21H

RTSHIG	EQU	00010111B
RTSLOW	EQU	00110111B

SOH     EQU     01H
STX     EQU     02H
EOT     EQU     04H
ACK     EQU     06H
NAK     EQU     15H
CAN     EQU     18H

PUT	MACRO	C
	LD	A, C
	RST	18H
	ENDM

	ORG	6000H

START:

	CALL	INIT8251
L2:
	LD	A, NAK
	CALL	CHAR_OUT
	CALL	CHAR_IN
	CP	EOT
	JP	Z, L1
	LD	C, 131

L3:
	CALL	CHAR_IN
	DEC	C
	JP	NZ, L3

	LD	A, ACK
	CALL	CHAR_OUT

	PUT	'.'
	JP	L2

L1:
	LD	A, ACK
	CALL	CHAR_OUT

	JP	05C66H

INIT8251:
	XOR	A
	OUT	(UARTRC), A
	OUT	(UARTRC), A
	OUT	(UARTRC), A
	LD	A, 01000000B
	OUT	(UARTRC), A
	LD	A, 01001110B
	OUT	(UARTRC), A
	LD	A, RTSLOW
	OUT	(UARTRC), A

;
;  PC-8001の8251を外部RS232Cヘ
;
	LD	A, (0EA66h)  ; ワークエリアから I/O 30hへ出力する情報を取得
	AND	A, 0CFh
	OR	A, 20h      ; BS2 = ON
	OUT	(30h), A    ; CMTから外部RS232Cへ切り替え
;
	RET

;
; 8251から1文字入力
;
CHAR_IN:
	IN	A, (UARTRC)
	AND	A, 02h
	JP	Z, CHAR_IN
	IN	A, (UARTRD)
	RET
;
; 8251へ1文字出力
;
CHAR_OUT:
	PUSH	AF
CHAR_OUT1:
	IN	A, (UARTRC)
	AND	A, 01h
	JP	Z, CHAR_OUT1
	POP	AF
	OUT	(UARTRD), A
	RET
```

8Bit時代に作られたプロトコルなので、8Bitのアセンブラにしっくりきますね。

RLoginをcom 300 ビット/秒で接続してXMODEMアップロード状態にして、このプログラムを実行すると処理が行われ、終了します。

![RLogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/77d61a43-0a67-eaa8-20e4-1fae1c54fac1.png)

こちらのページを参考にしました。

https://kuninet.org/2021/04/27/pc-8001%E5%86%85%E8%94%B5%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%A8%E9%80%9A%E4%BF%A1/

ちなみに内蔵の8251はカセットインターフェースとの兼用で、割り込みを使っていません。拡張ユニット(PC-8011)の方の8251は割り込みを使っているようです。そのためか、外付けの8251の方はBASICでサポートがありますが、内蔵のほうはありません。

ボーレートはデフォルト300ですが、筐体の中のジャンパーで、4800まで変更可能です。
Python3: JSON 形式の Post を処理する方法

サーバープログラム　(CGI)

```py:sum_up_json.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#       sum_up_json.py
#
#                                               Jul/24/2021
#
# ---------------------------------------------------------------------
import	os
import  sys
import  json
import	cgi
#
# ---------------------------------------------------------------------
if os.environ['REQUEST_METHOD'] == 'POST':
	length, _ = cgi.parse_header(os.environ['CONTENT_LENGTH'])
	data = sys.stdin.buffer.read(int(length))
#
	json_str = data.decode("utf-8")
	data_aa = json.loads(json_str)
	aa = int(data_aa["aa"])
	bb = int(data_aa["bb"])
	data_aa['wa'] = aa + bb 
	data_aa['sa'] = aa - bb
	str_aa = json.dumps(data_aa)
#
	print('Content-Type: text/json; charset=utf-8')
	print("Access-Control-Allow-Origin: *\r\n")
	print(str_aa)
#	print(data.decode("utf-8"))
# ---------------------------------------------------------------------
```

テストスクリプト

```bash:go_post_json.sh
#
URL="http://localhost/python/sum_up/sum_up_json.py"
#
#
curl -X POST -H "Content-Type: application/json"  $URL \
	-d '{"aa":81, "bb":34 }'
```
Linux MintでRails開発(ローカル)の環境を作る

# なんでMac使わないの？
以前までMacBookで開発していたけどMintに変えました。
環境構築の解説をする前に、Macと比較して個人的に感じたメリットとデメリットを書いておきます。

## Mintで開発環境作るメリット
・好きなデザインのPC選べる
-> Macのデザインも好きですが、みんなと同じなのがなんか嫌

・Macのシステムや仕様を覚えなくても良い
-> OSアップデートするとライブラリ更新されてビルドできなくなったりっていうのはよくあった

・本番環境に近い環境で開発できる
-> CentOSだとけっこう勝手が違うけどUbuntsならほぼ同じ

## Mintで開発環境作るデメリット
・デバイスドライバが少ない(自己責任)
-> 最近はスピーカーとかそのまま刺してもわりと動くけど、動かないものもある。仕方ない(自分で書く)

・Macで使えるソフトが使えない
-> Photoshopとか使いたかったらWine経由で頑張るしかなさそう(知らない)

・linuxに関する専門知識が必要
-> APサーバのプログラムだけやりたいって人はこれがネックになる。サービスについて開発からリリースまで全部できるようになりたいって人は避けて通れないので勉強したほうがいい

# OSをインストールする
・ディスクイメージをダウンロードする
公式から自分のマシンに合ったisoファイルをダウンロードしてください。
https://linuxmint.com/download.php

わたしが今使っているのは[Linux Mint 20 "Ulyssa" Cinnamon(64bit)]です。
ミラーから直接ダウンロードするよりTorrentの方が圧倒的に早くダウンロードできます。


・ディスクイメージをDVD-Rに焼く
Windows10かMacなら空のDVD-Rを挿入すれば特に困ることなく書き込めるはずです。
PC持っていない方でMintからスタートする方はネカフェとかにあるPCを使うか、友達や先輩にお願いしてください。

・PCにインストールする
インストール先の光学ドライブにディスクを入れればインストーラが起動するはずです。
BIOSの設定によっては光学ドライブからブートできない場合もあるので、お使いのPCメーカーかMBの製造元のサイトを参照してください。
細かいインストールの設定は「linux mint インストール」で検索すればたくさん出てきます。

# 日本語入力を使えるようにする
MintにはデフォルトでWindowsで言うところのIMEがインストールされていないので、日本語入力には別途ソフトウェアをインストールします。
わたしは下記のサイト様を参考に設定しました。

[LinuxMint 19: 日本語入力の設定をする](https://www.hiroom2.com/2018/07/17/linuxmint-19-japanese-input-method-ja/)

# rbenvとruby-buildのインストール
複数のrubyバージョンをインストールして、プロジェクトごとに切り替えられるソフトです。
わたしは下記の記事を参考にして進めましたが、パッケージ管理はyumがaptになるので注意です。

https://qiita.com/NaokiIshimura/items/ff04b6eaa40b33c4bea8

# VSCodeのインストール
VimやEmacsだと大変なので、ハイライトや入力補助が最初から入っているVSCodeのlinux版をインストールします。

公式サイトからVSCodeの.debパッケージをダウンロードしてインストール。
https://code.visualstudio.com/download


# VSCodeにerb拡張機能のインストール
htmlやrubyのファイルはそのままでもシンタックスハイライトされますが、rails標準のhtmlテンプレートの.erbファイルはハイライトされません。
拡張機能を作っている方がいるのでインストールします。

"Ctrl + X"で拡張機能画面を開いて、"erb"で検索します。

![capcha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97287/563bf792-f9f6-5743-325a-5aef4011b4c8.png)

これでerbファイルがきれいにハイライトされるようになります。

![chapcha3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97287/b441fc2b-c23a-2365-5ad7-5f101b0b5dbe.png)

# 画面キャプチャ+編集ソフトをインストール
macだとわりとよく"Skitch"というソフトが使われているようです。
https://evernote.com/intl/jp/products/skitch

ubuntuだと"Shutter"が人気のようだったので使ってみました。
下記のサイトに導入方法が書いてあります。
https://www.linuxuprising.com/2018/10/shutter-removed-from-ubuntu-1810-and.html

aptにリポジトリを追加してapt-getコマンドでインストールできます。

```
$ sudo add-apt-repository ppa:linuxuprising/shutter
$ sudo apt-get update
$ sudo apt install shutter
$ sudo apt install gnome-web-photo
```
Go のテストでプロジェクトの特定箇所のディレクトリをフルパス指定する

Go のプロジェクトで、デバッグと、コマンド実行時のテストの挙動の違いが発生して、原因が、カレントディレクトリの違いということに気づいた。VSCode のデバッガでデバッグを実行するときは、プロジェクトルートをワーキングディレクトリにしているが、通常実行すると、現在テストのソースがあるディレクトリがある場所がカレントになる。

この場合、どうやって解決したらいいだろうか？　という小ネタを調べたのでメモしておく

# ファイルの現在位置を取得する

`runtime.Caller` は、関数実行のファイルやライン行数を取得するための関数。この関数を利用して現在のファイルパスを取得する。

```go
_, testSourceFilePath, _, _ := runtime.Caller(0)
```

# 相対パスを取得する

Win/Mac/Linux のファイルのパスの違いが気になるので、ライブラリで処理する。結局こんなメソッドを書いた。すると、プロジェクトルートからの相対パスを渡すと、そのパスの絶対パスを返すようになる。

```go
func GetTargetPath(t *testing.T, relativePathFromProjectRoot string) string {
	_, testSourceFile, _, _ := runtime.Caller(0)
	currentDir := filepath.Dir(testSourceFile)
	projectRootDir := filepath.Join(currentDir, "..", "..", "..")
	return filepath.Join(projectRootDir, relativePathFromProjectRoot)
}
```

大変単純であったが、しっかりデバッグも、コマンドラインも動くようになった。ただ、VSCode のデバッガ側の設定をもっとうまくする方法も勉強すべきであるが、ファイルパスを元にファイルの絶対パスを求める方法がわかったのでメモしておく
[US配列]AutoHotKeyでコロンとセミコロンの入れ替え[Windows]

<H2>コロンとセミコロンの場合</H2>
<pre>
<code>
*vkBA::
	If (GetKeyState("Shift")){
		Send `;
	}
	else {
		Send :
	}
	return
</code>
</pre>
<H2>ダブルクォーテーションとシングルクォーテーションの場合</H2>
<pre>
<code>
*vkDE::
	If (GetKeyState("Shift")){
		Send '
	}
	else {
		Send "
	}
	return
</code>
</pre>
スプーフィング とは

## 勉強前イメージ

名前から全然イメージつかないなぁ

## 調査

### スプーフィングとは

spoofing と書いて、意味としてなりすましのことになります。
自分以外の人のふりをして騙すことで、
IPアドレスを偽装したり、人のアカウントでログインしたりすることを言います。

### スプーフィングの種類

なりすましの対象として、大きく以下の4つに分類されます。

- IPスプーフィング

送信元のIPアドレスを偽装して攻撃を行うことで、
攻撃元のIPを隠してDoS攻撃をしたり、DDoS攻撃をしたりする際に使用されることが多いです。

- メールスプーフィング

メールのヘッダーを偽装して送信者を偽装したりします。
一般的にはメールフィッシングという言葉で言われることが多いです

- DNSスプーフィング

IPアドレスとドメインを紐付けするDNSの情報を不正に書き換える行為です。
アクセスに対して偽サイトに誘導するために使用されることが多く、
MITM攻撃や、DNSキャッシュポイズニングなどに使用されます。

- ARPスプーフィング

IPアドレスからMACアドレスを得るためのプロトコルですが、
ARP応答を偽装して、LAN上でのネットーく聞きのなりすましを行う行為です。
ルーターになりすましを行えばLAN→WANへのデータを不正に中継して傍受するため、
データを盗み見られたり、またネットワーク管理者やサービスの使用者にも気づかれづらいので
発見が遅れる場合が多いです。

## 勉強後イメージ

なりすまし全体のことをいうのか
いろいろ攻撃とかを行うための一部って感じなのかな

## 参考

- [IPスプーフィングとは？攻撃の仕組みや危険性、対策について徹底解説](https://cybersecurity-jp.com/column/34568)
manjaroinux ( arch 系列 ) motion 監視カメラ HDMI Virtual Display


sva.or.jp/wp/?p=25137　より

|ある日、釈迦は弟子二人を連れて托鉢に出かけました。|
|:---|
|なので　釈迦自身も　村民から鉢に　食物をもらっていたのだろう　|
|自ら農地を耕作し作物を作らないという意味では　プログラマーも一緒かな|
|なお　托鉢は自ら歩いていかないといけません！　乗り物は禁|

```
# crontab -l
@reboot motion ; sleep 1 ;  /home/jaro/ufw.bat
*	 *	*	*	*	 /home/jaro/mv.bat
# every Saturday erase 3 days before
1	18	*	*	6	 /home/jaro/motion-clear.bat
```



```
# ./comment-out.bat ufw.bat 
ufw disable
ufw enable
ufw default deny
 ufw allow Deluge
 ufw limit ssh/tcp

```



```
 ./comment-out.bat mv.bat



x=`date +%Y%m%d`
y=`date +%H`
mkdir -p /home/jaro/kansi---/$x/$y
mv /home/jaro/kansi---/*$x*.mkv  /home/jaro/kansi---/$x/$y


```

これにて

# ls -ltr  /home/jaro/kansi---/20210724/
合計 28
drwxr-xr-x 2 root root 4096  7月 24 05:59 05
drwxr-xr-x 2 root root 4096  7月 24 06:00 06
drwxr-xr-x 2 root root 4096  7月 24 07:26 07
drwxr-xr-x 2 root root 4096  7月 24 08:48 08
drwxr-xr-x 2 root root 4096  7月 24 10:59 10
drwxr-xr-x 2 root root 4096  7月 24 11:59 11
drwxr-xr-x 2 root root 4096  7月 24 12:00 12

な感じに　日にちの下に時間フォルダを作ってます



```
# ./comment-out.bat motion-clear.bat


x=`date +%Y%m%d`
z7=`date +%Y%m%d  --date '7 day ago' `
z6=`date +%Y%m%d  --date '6 day ago' `
z5=`date +%Y%m%d  --date '5 day ago' `
z4=`date +%Y%m%d  --date '4 day ago' `
z3=`date +%Y%m%d  --date '3 day ago' `
z2=`date +%Y%m%d  --date '2 day ago' `
z1=`date +%Y%m%d  --date '1 day ago' `
z0=`date +%Y%m%d`
rm -rf /home/jaro/kansi---/$z7
rm -rf /home/jaro/kansi---/$z6
rm -rf /home/jaro/kansi---/$z5
rm -rf /home/jaro/kansi---/$z4




```

##motion.confは

```
# ./comment-out.bat /etc/motion/motion.conf | ./comment-out.bat-
daemon off
setup_mode off
log_level 6
target_dir /home/jaro/kansi---
videodevice /dev/video0
width 640
height 480
framerate 15
text_left CAMERA1
text_right %Y-%m-%d\n%T-%q
emulate_motion off
threshold 1500
despeckle_filter EedDl
minimum_motion_frames 1
event_gap 60
pre_capture 3
post_capture 0
picture_output off
picture_filename %Y%m%d%H%M%S-%q
movie_output on
movie_max_time 60
movie_quality 45
movie_codec mkv
movie_filename %t-%v-%Y%m%d%H%M%S
webcontrol_port 8080
webcontrol_localhost on
webcontrol_parms 0
stream_port 8081
stream_localhost on

```


## 別のPCから入って見ます　（ vnc over ssh )

virtual monitor をつかいます
これだと　monitor（自分の場合はTVです）をつかわなくていいので便利です

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/9aa45e36-1314-728a-b9d7-27be4693ed7c.jpeg)

動画では以下です
https://www.youtube.com/watch?v=QbfFLZm8eRc
あっという間に　motion（監視カメラ）を動かしているPCに　入ってます

```
なお　水色の別のPCでは

$ ./comment-out.bat vnc-over-ssh-2-kansi.bat 
x='192.168.0.3'
ping -c 3 $x
ssh jaro@$x  -L 5900:localhost:5900


./comment-out.bat vnc-viewer.bat 
vncviewer localhost:5900


です
```

```
2021/07/22開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[Rust LT Online #4](https://rust.connpass.com/event/215770/)|[Rust](https://rust.connpass.com/)|166|1005|
|:two:|[JAWS-UG CLI専門支部 #188R CloudFormation入門](https://jawsug-cli.connpass.com/event/217280/)|[JAWS-UG CLI専門支部](https://jawsug-cli.connpass.com/)|129|150|
|:three:|[公務員情シスの会　第２回](https://government-infosys.connpass.com/event/217447/)|[公務員情シス](https://government-infosys.connpass.com/)|46|50|
|:four:|[【7/22（木・祝）】個人開発エンジニアLT会～こんなもの作ってみた～-vol.2](https://connpass.com/event/218220/)||43|43|
|:five:|[【ハンズオン】はじめてのTerraform](https://connpass.com/event/219609/)||41|41|
storybook next/image エラー解決：next.config.jsにドメイン設定してもダメ

## 前提

### 環境

<details><summary>package.json</summary><div>

```
"dependencies": {
    "next": "^11.0.1",
    "react": "17.0.2",
    "react-dom": "17.0.2"
  },
"devDependencies": {
  "@babel/core": "^7.14.8",
  "@storybook/addon-actions": "^6.3.5",
  "@storybook/addon-essentials": "^6.3.5",
  "@storybook/addon-links": "^6.3.5",
  "@storybook/addon-postcss": "^2.0.0",
  "@storybook/react": "^6.3.5",
  "@testing-library/react": "^12.0.0",
  "@types/jest": "^26.0.24",
  "@types/node": "^15.6.1",
  "@types/react": "^17.0.6",
  "@types/react-dom": "^17.0.5",
  "@typescript-eslint/eslint-plugin": "^4.28.4",
  "autoprefixer": "^10.3.1",
  "babel-jest": "^27.0.6",
  "babel-loader": "^8.2.2",
  "eslint": "^7.31.0",
  "eslint-config-next": "^11.0.1",
  "eslint-config-prettier": "^8.3.0",
  "husky": "^7.0.1",
  "identity-obj-proxy": "^3.0.0",
  "jest": "^27.0.6",
  "jest-watch-typeahead": "^0.6.4",
  "lint-staged": "^11.1.0",
  "postcss": "^8.3.6",
  "prettier": "^2.3.2",
  "tailwindcss": "^2.2.6",
  "typescript": "^4.2.4"
  }
```
</div></details>

### エラー内容

Next.jsでコンポーネントを開発していると、Storybookで以下のエラーに遭遇しました。
![storybook_next_image_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174479/78d6f3dd-0cc2-f44a-4bc4-b94f99dc766f.png)

https://nextjs.org/docs/messages/next-image-unconfigured-host

> next/image component, you passed a src value that uses a hostname in the URL that isn't defined in the images config in next.config.js.

これを見ると、どうやらnext/imageコンポーネントを活用するページで、next.config.jsのimagesで定義されていないURLをsrcに使用することはできないようです。

しかし、next.config.jsを作成し、上記のリンクのように設定してもエラーは解決しませんでした。

```sh
touch next.config.js
```

next.config.js

```js
module.exports = {
  images: {
    domains: ['example.com'],
  },
};
```

## 解決した方法

.storybook/preview.jsに以下を追加

```js
import * as nextImage from 'next/image';

Object.defineProperty(nextImage, 'default', {
  configurable: true,
  value: props => <img {...props} />
});
```

<details>
<summary>修正後 (.storybook/preview.js)</summary><div>

```js
import '../src/styles/globals.css';
import * as nextImage from 'next/image';

Object.defineProperty(nextImage, 'default', {
  configurable: true,
  value: props => <img {...props} />
});

export const parameters = {
  actions: { argTypesRegex: '^on[A-Z].*' },
  controls: {
    matchers: {
      color: /(background|color)$/i,
      date: /Date$/,
    },
  },
};
```
</div></details>

## 参照

https://github.com/vercel/next.js/issues/18393

https://stackoverflow.com/questions/67409774/cant-properly-set-up-next-config-storybook-to-get-images-from-url
【Git】git の運用で参考になる記事まとめ

世の中ではどのように git を運用しているかをざっと調べたので、参考になった記事をここにまとめました。随時更新予定。

## ブランチ運用

言わずと知れたGit Flow

https://nvie.com/posts/a-successful-git-branching-model/

頻繁にリリースするときはGitHub Flow

https://gist.github.com/Gab-km/3705015

## コミットメッセージ

1行目にサマリ、1行あけて3行目に変更の詳細を書く

https://chris.beams.io/posts/git-commit/

## issue 管理

GitHub 使うと PullRequest から issue のクローズができる

https://github.blog/2013-05-14-closing-issues-via-pull-requests/

## コードレビュー

https://mtlynch.io/code-review-love/

google のエンジニアリングガイド

https://github.com/google/eng-practices

lgtm

https://qiita.com/e99h2121/items/072fa31827bf4591d799

https://dev.classmethod.jp/articles/how-to-use-lgtm/

## OSS プロジェクト

### kubernetes

ワークフローがまとめられている。

https://github.com/kubernetes/community/blob/master/contributors/guide/github-workflow.md

### aws

GitHub の Project を使用したタスク管理。何の機能が今後リリースされるのかなどが分かる。

https://github.com/aws/containers-roadmap/projects/1
Vue3で moment.js を使いたい！

Vue3.xで、[moment.js](https://momentjs.com/)を使いたかった人のメモです。良い感じに日付整形したり演算できたりするようになるJSのライブラリですね。
※後から気づいたのですが、Vueのライブラリで[vue-moment](https://www.npmjs.com/package/vue-moment)なるものがあり、こちらも候補に入れたかったなぁと思っています。

# install

まずはインストールします。

```
$ npm install moment --save   # ← npm
$ yarn add moment             # ← yarn
```

# usage

たとえば、以下のように書けます。
Vue2.xのコードを参考にするとfiltersを使っていることがありますが、Vue3では使えないので、以下はmethodsに書いています。

```vue
<template>
  <div>
    <div>
      {{ moment(new Date, 'MMMM Do YYYY, h:mm:ss a') }}
    </div>
  </div>
</template>

<script>
import moment from 'moment';

export default {
  methods: {
    moment(date, format) {
      return moment(date).format(format)
    }
  }
}
</script>

```

マスタッシュが展開されると、view上は以下のようになります。※時間帯はご愛嬌です。

```
July 24th 2021, 3:08:28 am
```

format例は公式はもちろん、「[全61件！Moment.js日付フォーマット実例](https://blog.capilano-fw.com/?p=908)」なども参考にさせていただこうと思います。
laravel新規プロジェクト環境設定＋認証機能

#Laravel新規プロジェクト作成（laravel7）

まずは、ターミナルで以下のコマンドを打ってプロジェクトを作成していく。

```
$ composer create-project "laravel/laravel=7.*"　＜プロジェクト名＞
```

次はpostgresでDBを作成(postgresインストール済みとする)

```
//ログイン
psql -d postgres

//DB一覧
\l

//DB作成
# create database DB名;
//CREATE DATABASE と表示されたらOK
```


次に.envファイルの編集

```
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=先ほどpostgresで作成したDB名
DB_USERNAME=postgres
DB_PASSWORD=
```

php artisan migrate を実行

```
$ php artisan migrate
```

postgresにusersテーブルが作られているか確認。
＊Laravelをインストールした時に最初からあるはずのcreate_users_table.phpとcreate_password_resets_table.phpを元にテーブルが作られる。

```
//DB接続
myproject-# \c データベース名

テーブル一覧
myproject-# \d　

                 List of relations
 Schema |        Name        |   Type   |  Owner
--------+--------------------+----------+----------
 public | failed_jobs        | table    | postgres
 public | failed_jobs_id_seq | sequence | postgres
 public | migrations         | table    | postgres
 public | migrations_id_seq  | sequence | postgres
 public | password_resets    | table    | postgres
 public | users              | table    | postgres
 public | users_id_seq       | sequence | postgres
```

確認できればOK！！

#認証機能
次はusersテーブルにちゃんとデータが入るか確認する。
Laravel6.0以降からmake:authコマンドが使用できなくなり、laravel/uiをインストールする必要があるため下記のコマンドを打つ

```
$ composer require laravel/ui:^2.4
$ php artisan ui vue --auth
```

これで画面右上に認証機能が追加された。
しかし認証画面へ遷移するとスタイルが崩れてしまっている。
原因はsass/app.scssが反映されてない(コンパイル)ので下記のコマンドを打つ

```
$ npm install 
$ npm run dev  
```

これでスタイルが修正された。

#ちゃんとDBに接続されているか実際に呼び出してみる

viewsファイルに新しくindex.blade.phpを作成

```
<div>
	<h1>{{$users->name}}</h1>
</div>
```

次にControllerの作成

```
$ php artisan make:controller HelloController 
```

HelloController.phpに下記を追記

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

// Userの情報をとってくるため追記
use App\User;
use Auth;

class HelloController extends Controller
{
    public function index(){
        // 認証済みのユーザーのデータを$usersに格納
        $users = Auth::user();
        return view('index',compact('users'));
    }
}
```

web.phpにroteを追加

```
<?php

use Illuminate\Support\Facades\Route;


Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

//追記
Route::get('/index', 'HelloController@index')->name('index');
```

これで下記のURLにアクセスして登録したuser名が表示されていれば多分OK！！
http://127.0.0.1:8000/index
[便利]ショートカットキー紹介

# はじめに
プログラミング学習をしていく中で、
これは`commandを用いるショートカット`で
`使える`と思ったをリストアップして勝手に順位付しました。
順位がないものは今回調べて学んだことです。

# commandを用いるショートカットキー紹介
一般的なものについては、主観で使える順にしてみました。

####一般的なショートカット

|順位|キー|内容|
|---|---|---|
|1|Z|一つ前に戻る|
|2|shift+Z|一つ先に進む|
|3|F|項目内検索|
|4|A|全選択|
|5|X|切り取り|
|6|shift+3|スクリーンショット|
|7|C|コピー|
|8|V|貼り付け|
|9|S|現在ファイル保存|
|10|T|新しいタブ作成|
|11|スペース|Spotlight検索|
|12|W|最前面のウィンドウを閉じる|
|13|O|選択した項目を開く|
|14|M|最前面のウィンドウを最小化してDockへ|
|15|G|直前に選択した項目が次に出現する箇所を検索|
|16|H|最前面のAppのウィンドウを非表示|
|17|P|印刷|
||;|書類でのスペルミス検索|
||[|前のフォルダに移動|
||]|次のフォルダに移動|


####その他のショートカット
|キー|内容|
|---|---|
|D|選択したファイルを選択|
|E|選択したディスクまたじゃボリューム取り出し|
|I|選択したファイルの「情報を見る」ウィンドウを表示|
|N|新しいウィンドウを開く|
|shift+C|「コンピュータ」ウィンドウを開く|
|shift+D|「デスクトップ」フォルダを開く|
|shift+F|「最近使った項目」ウィンドウを開く|
|shift+G|「フォルダへ移動」ウィンドウを開く|
|shift+H|ユーザーアカウントのホームフォルダを開く|
|option+D|Dockの表示・非表示|

#覚えられましたでしょうか
私は、特に[一つ前に戻る・進む]をたくさん使います。
その他に、こんなものが便利というものがあれば、
どんどん共有してまいります。
引き続きがんばりましょう！！

[参考]
[Apple](https://support.apple.com/ja-jp/HT201236)
[Windows](https://dekiru.net/article/18619/)
Bashシェルに表示されるホスト名を変更する。

複数台のサーバにSSH接続していると、
どの画面がどのサーバか分かりづらくなります。

そこで、
表示名を変更するコマンドを自分用に残します。
（コマンド内の「ec2-user」を自身のユーザ名に読み替えてください）

また、本設定はユーザ毎の設定です。
サーバのホスト名を丸ごと変えたいという場合は、
「/etc/sysconfig/network」を書き換えると良いみたいです。

#ホストの表示名を変更

　1.rootユーザにログイン
　2.一つめのコマンドをコピペ（右上のコピーマークをクリック）
　3.「HOGEHOGE」を設定したいホスト名に変更
　4.二つめのコマンドを実行

```Bash:
cp -a /root/.bashrc /root/.bashrc.org && cp -a /home/ec2-user/.bashrc /home/ec2-user/.bashrc.org && echo 'export PS1="[\u@\[\e[1;33m\]HOGEHOGE \[\e[m\]\w]$"' | tee -a /root/.bashrc /home/ec2-user/.bashrc && source /root/.bashrc && exit
```

```Bash:
source /home/ec2-user/.bashrc
```

#元に戻す
　1.rootユーザにログイン
　2.一つめのコマンドをコピペして叩く（右上のコピーマークをクリック）
　3.yesを入力しエンター（2回）
　4.二つめのコマンドを実行

```Bash:
cp -a /root/.bashrc.org /root/.bashrc && cp -a /home/ec2-user/.bashrc.org /home/ec2-user/.bashrc && source /root/.bashrc && exit
```

```Bash:
source /home/ec2-user/.bashrc
```

#補足
※本設定はbash用の設定です

今回は、「/root/.bashrc」や「/home/ec2-user/.bashrc」に対して表示名の設定を”追記”しました。
なので、既に表示名の変更が記されていた場合、そちらの設定を削除する必要があります。
正規表現　後方参照は文字クラス内では使えない

正規表現の勉強中。

HackerRankのRegex(https://www.hackerrank.com/domains/regex)
の問題「Negative Lookahead」で少々ハマったので備忘録。

問は
>Write a regex which can match all characters which are not immediately followed by that same character.
`直後に同じ文字が続かないすべての文字にマッチする正規表現を書きなさい。`

正解は
　(.)(?!\1)
なのだけれど

　(.)[^\1]
も思いついてしまって・・・

`改行以外の任意の一文字の次に
グループ１でマッチした一文字以外の一文字。`
のつもりだが、思い通りにマッチしない。

で、日本語でかなりググってようやく見つけた記事が以下。

>文字クラス外で、バックスラッシュに続いて 1 以上の数値（複数桁可） を記述したものは、パターン中のより前方（すなわち左）にある キャプチャ用サブパターンに対する後方参照 (back reference) です。
( https://www.php.net/manual/ja/regexp.reference.back-references.php より引用)

　**文字クラス外**・・・
もう少し詳しく知りたかったので英語検索で以下の記事がヒット。

>"In Perl regexes, expressions like \1, \2, etc. are usually interpreted as "backreferences" to previously captured groups, but not so when the \1, \2, etc. appear within a character class. In the latter case, the \ is treated as an escape character (and therefore \1 is just 1, etc.)."
( https://stackoverflow.com/questions/18242119/general-approach-for-equivalent-of-backreferences-within-character-class より引用）
`　文字クラス内での\はエスケープ文字として扱われるので　　
　\1 は文字の1でしかなく、マッチの後方参照にはならない。`

で、ようやく納得。
差分を取って動きがある間だけ画像を順番に差し替えていくPGM

<h3>差分を取って動きがある間だけ画像を順番に差し替えていくPGM</h3>
差分を取っていき、動きがある間だけ画像を更新していくpythonのPGMを作りました
これで散歩画像データリストがあれば、足踏みしている間だけ画像を差し替えるようにして仮想散歩ができそうです...
内容としては前に作った差分が出ているうちだけ動画を再生するPGMの
中身を修正して作成しました

2021.08.14 : 画像差し替え時に差分を積算して更新していくように動作を変更しました

<hr>
githubURL:https://github.com/NanjoMiyako/WalkingAndImage

<hr>
使い方
以下のようなパラメータを指定してコマンドラインから実行します
python 実行ファイルパス 差し替え画像のリストファイルのパス　差分検出判定率(ex:1.0) 画像差し替え間隔秒(ex:1.0) 画像入れ替え積算差分回数(ex:5(この場合5回以上差分検出判定率以上の差分が発生したときに画像を更新する))

<hr>
参考にしたサイト
<a href="https://docs.pyq.jp/python/library/file.html">ファイル入出力 — Pythonオンライン学習サービス PyQ（パイキュー）ドキュメント</a>
<a href="https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb">pip で OpenCV のインストール - Qiita</a>
Reactで別のcomponent中の特定箇所にlinkを貼る。


問題 | ReactでSPAを作ったとき、ページ内の特定の箇所に飛ばせたかったのでanchorを使ったが、別コンポーネントからは効かなかった。:unamused: 

解決策 | react-router-hash-linkで行けた! :thumbsup: : 備忘録も兼ねて詳しくどこをどうしたかを記します。


### 状況説明

Reactで"/"というURLにアクセスしたときはHomeというコンポーネントを、"/foo"にアクセスしたときはFooを、"/Hoge"にアクセスしたおきはFogeを表示するようにreact-router-domを使ってルーティングを以下のように設定。

App.js

```
import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Foo from './components/Foo';
import Hoge from './components/Hoge';

function App() {
    return (
        <BrowserRouter>
            <Switch>
                <Route exact path="/">
                    <Home />
                </Route>
                <Route path="/foo">
                    <Foo />
                </Route>
                <Route path="/hoge">
                    <Hoge />
                </Route>
                <Route>Not Found</Route>
            </Switch>

            <GlobalStyles />
        </BrowserRouter>
    );
}
```

さらに各コンポーネントに、以下のナビゲーション内容を持つHeaderというコンポーネントをimport。(Linkでもいいのですが、選んだ時にactiveStyleを適用できるよう、NavLinkを使っています。）

```
import React from 'react';
import { NavLink } from 'react-router-dom';

  <NavLink 
      activeStyle={{ borderBottom: '1px solid black' }}
      exact to="/"
  >
      Home
  </NavLink>

  <NavLink 
      activeStyle={{ borderBottom: '1px solid black' }}
      exact to="/foo"
  >
      Foo
  </NavLink>

  <NavLink 
      activeStyle={{ borderBottom: '1px solid black' }}
      exact to="/hoge"
  >
      Hoge
  </NavLink>                 
```

###　Homeコンポーネント中のAboutという箇所に各コンポーネントのHeaderから飛べるようにしたい！

* anchorはHome以外のコンポーネントからは効かないので調べると、react-router-hash-linkが使えることが判明。そこで、、、
    * `yarn add react-router-hash-link`でdependencyを追加。
    * Headerの中に、NavHashLinkを使ってAboutを追加。
    * スムーズに移動できるので、smoothというプロパティを追加。:surfer:
    * App.jsは変更不要。
    * 飛ばしたい先の要素にid="about"とつける。
    
Header.js

```
import { NavHashLink } from 'react-router-hash-link'; ←importする。

 <NavLink 
      activeStyle={{ borderBottom: '1px solid black' }}
      exact to="/"
  >
      Home
 </NavLink>

 <NavHashLink　　　　　　　　　　　　　　　　　　　　　　　←ここを追加。
      smooth
      activeStyle={{ borderBottom: '1px solid black' }}
      to="/#about"
  >
      About
 </NavHashLink>
   {/*　以下省略　*/}

```

これで、別のコンポーネントから、Homeコンポーネント中の特定箇所に飛ぶようになりました。:grinning:

------------
今回もいろいろなサイトを参考にさせていただきました。ありがとうございました。:pray:

https://stackoverflow.com/questions/40280369/use-anchors-with-react-router

https://github.com/rafgraph/react-router-hash-link

https://qiita.com/kume_krowl/items/607516e8878ac0653425
node.jsを使ってxmlをjsonにParseしたい

#node.jsを使ってxmlをjsonにParseしたい
**使ったライブラリ**

* xml2js <br>
いくつかあるライブラリの中で最も人気が高かった。xmlに準拠していて、jsonをxmlに変換することも可能。
* fs  <br>
今回はxmlファイルを読み込むのでこのファイルを読んだり書いたりするnodeの標準モジュールを使用した。

```js
const fs = require("fs");;
const xml2js = require("xml2js");

var sampleXml = './exmample/test.xml'
//parseしたいxmlファイルのあるパスを書きます。
```

まずは、xmlのファイルを読み込んでいきます。

```js
var xmlData = fs.readFileSync(sampleXml, "utf-8");

//fsのreadFilesSyncメソッドを使います
//このメソッドは、第一引数に読み込みたいもの。第二引数にそのものの文字コードを入れます。
```

次に読み込んだファイルをjson形式にparseしませう。

```js
 xml2js.parseString(xmlData, function (err, result) {
    if (err) {
      console.log(err.message)
    } else {
      console.log(result)
     }
}
```

これで、parseされたjsonがコンソールに表示されます。
最近はjson形式でのデータのやり取りが多いですが、~~古めかしい~~大きなシステムではいまだにxml
を使っていたりします。
データの加工はjsonの方がやりやすいと思うので、ひとつくらいpaese方法を知っておくと良きでしょう。
PowerShellでファイル名に使用できない文字を除外する

PowerShellでファイル名を動的に出力する処理を書く際に、ファイル名として利用できない文字が入力されてエラーになる事があります。

このような場合にファイルで利用できない文字を置換して回避するサンプルを紹介します。

```PowerShell
# 変数 $fileNameにファイル名を入力して実行すると、許可されない文字は除外されます。
[RegEx]::Replace($fileName, "[{0}]" -f [RegEx]::Escape([string][System.IO.Path]::GetInvalidFileNameChars()) , '')
```

何をやっているかバラして解説すると

```PowerShell
# .Net PathクラスのGetInvalidFileNameCharsメソッドからファイル名に使用できない文字を含む配列を取得
[System.IO.Path]::GetInvalidFileNameChars()

# ファイル名に使用できない文字を含む配列をstringに変換
[string][System.IO.Path]::GetInvalidFileNameChars()

# ファイル名に使用できない文字列を 正規表現で扱えるよう　RegExクラス　Escapeメソッドでエスケープ処理
[RegEx]::Escape([string][System.IO.Path]::GetInvalidFileNameChars())

# ファイル名に使用できない文字列を　正規表現のいずれかに一致　[...]　な形式にフォーマット
"[{0}]" -f [RegEx]::Escape([string][System.IO.Path]::GetInvalidFileNameChars())

# RegExクラスの Replaceメソッドで $fileNameを 上記 [...]　な許可されない文字とマッチさせて''に置換
[RegEx]::Replace($fileName, "[{0}]" -f [RegEx]::Escape([string][System.IO.Path]::GetInvalidFileNameChars()) , '')
```

## OSによって動作が変わります

ちなみに　`[System.IO.Path]::GetInvalidFileNameChars()`

Windowsの場合はWindowsでつかえない文字列を出力しますが、Linuxの場合はNullと/を出力したりとOSによって動作が異なるのでその点だけは注意して下さい。

## まとめ

PowerShellは.Netの便利なクラスを気軽に使えるのがいいですね。
BigQueryで複数カラムの仮想テーブルを作る方法

# 概要
任意のスキーマのテーブルに対してクエリを試したいがわざわざ新しいテーブルを作りたくないときや一連のクエリの中で何らかのマスタテーブルを作りたい時は仮想テーブルが便利です。

日付や連番のマスタテーブルのようなカラムが1つしかない仮想テーブルの作り方は調べると出てきますが、複数カラムの仮想テーブルの作り方の情報が見当たらなかったのでまとめておきます。

# やり方
## 行数が少ないとき

行数が少ない時は愚直に SELECT文を `UNION ALL` を使って繋げるやり方が簡単です。

```sql
WITH users AS(
  SELECT 1 as id, '佐々木' as name, 'sasaki@example.com' as email
  UNION ALL
  SELECT 2 as id, '田中' as name, 'tanaka@example.com' as email
)

SELECT
  *
FROM
  users
```

## 行数が多いとき

行数が多い時に `UNION ALL` を使うとクエリが縦に長くなって可読性が下がりますし、各カラムにデータを入力するのも面倒です（短形選択などを使って効率的に作成はできるかもしれませんが）。

各カラムのデータの入った配列を展開してレコードを作成し、 `WITH OFFSET` の連番を使ってそれらを結合します。

このようにすればSELECT文はカラムの数の分しか増えず、レコードのデータを変数に格納できるのでデータの見やすさや追加・修正のしやすさも向上します。

```sql
DECLARE ids ARRAY<INT64> DEFAULT [1,2];
DECLARE names ARRAY<STRING> DEFAULT ['佐々木', '田中'];
DECLARE emails ARRAY<STRING> DEFAULT ['sasaki@example.com', 'tanaka@example.com'];

WITH users AS(
  SELECT 
    id, name, email
  FROM 
    UNNEST(names) as name 
    WITH OFFSET as offset
  JOIN (
    SELECT 
      id, offset
    FROM 
      UNNEST(ids) as id
      WITH OFFSET as offset
  ) as table2 ON offset = table2.offset
  JOIN (
    SELECT 
      email, offset
    FROM 
      UNNEST(emails) as email
      WITH OFFSET as offset
  ) as table3 ON offset = table3.offset
)


SELECT
  *
FROM
  users
```

※ 上記のように `id` カラムがシンプルな連番で良いのなら `offset + 1` でも良いですね

参考:
[配列内の要素をテーブル内の行に変換する](https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays?hl=ja#flattening_arrays)
SQL　基礎 Part2

##DISTINCT

DISTINCTを用いると重複しているカラムを省くことができます。
使い方はSELECT DESTINCT(カラム名）です。

##四則計算の使い方

SEKECTでカラム名の後に計算式を書くことで四則の計算ができます。

例えば消費税の1.1を掛ける場合、
SELECT price * 1.1とすることで、priceに1.1を掛けることができます。

##集計関数

集計関数といって、カラムの合計を計算する時はSUM(カラム名)を使いましょう。
WHEREと兼ね合わせることも可能です。

また、平均を求める時はAVGを使うようにしましょう。

カラム名のデータの数を数える時はCOUNTを使います。
この時、NULLは数に含まれませんが、カラム名のところを*にすることでNULLも含んだ
データ数になります。

保存されたデータの中で、一番大きい数をMAX,一番小さい数をMINで表します。

##GROUP BY

GROUP BYはデータをグループ化することができます。
ただし、GROUP BYを使う時、SELECTで使用できるのは集計関数を使った時のみです。
GROUP BYに更に条件を付け加えたい時はHAVINGを使いましょう。

実行の順番
検索(WHERE)→グループ化(GROUP BY）→関数の順番で実行されます。

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
【Ruby】アプリの作成方法

Rubyのアプリの作成方法について記載します。

この記事でわかること
・Rubyのアプリの作成方法

-----------------------------------------

手順

①ターミナルを開く

②% 「cd」を記入する

```
% cd
```

アプリを作成したい場所を指定する。
僕はcdでホームディレクトリに戻って、作成したい場所としてカレントディレクトリを選択しちゃいます。（わかりやすいから）

③「rails new アプリ名 -d mysql」を記入する


```
% rails new アプリ名 -d mysql
```

アプリ名は自分で決めたやつでOK

-----------------------------------------

③まで終わればアプリケーションが作成できているはずです。




おまけ
僕のTwitter：https://twitter.com/honaki_days
systemd-resolvedを無効化する

覚書です

[不具合があるらしく](https://access.redhat.com/discussions/5560861)、なくても困らないので[無効](https://fedoraproject.org/wiki/Changes/systemd-resolved#Detailed_Description)にします。

```:rootで実行する
systemctl stop systemd-resolved
systemctl disable systemd-resolved
rm /etc/resolv.conf
systemctl restart NetworkManager
```
SvelteでModalを作ってみた

SvelteでWebサイトを作っているときに、Modalを表示したいなと思ったので調べてみた。
イメージとしては、ReactのcreatePortalのような感じ。
modal.svelteを、メインのApp.svelteとは、別のHTMLElementで作成して、表示したい。

##使ったもの
●　[svelte-portal](https://github.com/romkor/svelte-portal)

上記のComponentを自身のプロジェクトにインストールして使用した。

##作成したコード
```javascript:modal.svelte
<script>
    import Portal from 'svelte-portal';
</script>
    <Portal target="#rootModal">
      <div class='Modal'>
        <slot></slot>
      </div>
    </Portal>
<style>
 .Modal{
    position:absolute;
    top:0;
    left:0;
    display:flex;
    justify-content:center;
    align-items: center;
    height:100%;
    width:100%;
    background-color:rgba(0,0,0,.5);
}
</style>
```
インストールしたsvelte-portalから、Portalコンポーネントを使用します。target="指定したいHTMLElement"になるので、htmlファイルにあるmodal用のidを指定します。

##作成したModal
![Modal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527794/ac801369-975e-54b6-5a7c-809d5aa39a5a.gif "作成したデモサイト")

##感想
Reactをかじり、Vueをかじった私からしても、svelteはとても使いやすいと実感している。でも、日本語のドキュメントが少ないので、調べたものを地道にまとめていきたいと思う。がんばるぞ。。。

##参考
svelte練習用のWebサイトとして、やっすんさんのReact入門を参考にsvelteで再構築しています。
　[React入門 未経験から1週間でReactをマスターする #01. プロジェクトの作成と立ち上げ](https://qiita.com/yassun-youtube/items/2ae26050efd2133c2286)
【Docker】「コンテナに入る」が何をしているか1分で理解する


#結論
**指定したDockerコンテナの対話形式bashシェルを起動して、コマンドの入力を受け付ける状態にすること。**

#「コンテナに入る」コマンドのおさらい
```php
docker exec [オプション] CONTAINER COMMAND [ARG...]
```

###実行例

```php
// 起動しているコンテナの確認
> docker ps

CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS       
9f9d9249cb39   mariadb:10.5.11   "docker-entrypoint.s…"   18 minutes ago   Up 18 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp

// MariaDBが起動しているコンテナに入る
docker exec -i -t 9f9d9249cb39 /bin/bash

//コマンドラインが出力されコマンドを入力できるようになる
root@9f9d9249cb39:/# mysql -u root -p とか

```

#細かく見ていく

###docker exec
CONTAINER IDを指定したコンテナのデフォルトディレクトリで新たにコマンドを実行します。
上記コマンドでいうとコンテナのデフォルトディレクトリで「/bin/bash」を実行していることになります。

### -i
標準入力を受け付けることを示すオプションです。
```-i```をつけないとキーボードからの入力を受け付けてくれません。

```php
// -iを付けないでdocker execしてみる
docker exec -t 9f9 bin/bash 

//コマンドラインが正常に表示されているが、キーボードを叩いても何も入力されない
root@9f9d9249cb39:/#
```

### -t
擬似 TTY を割り当てることを示すオプションです。
TTY(TeleTYpeの略とされているそう)とは、標準入出力となっている端末デバイスを示します。
端末デバイスというとハード的なものが連想されますが、ここではターミナルを指します。
```-t```をつけないとコマンド入力用のターミナルが割り当てられない...のようなイメージでしょうか。

```php
// -tを付けないでdocker execしてみる
docker exec -i 9f9 bin/bash 

//コマンドラインが表示されない

```

###/bin/bash
対話形式のbashシェルを起動してコマンドの入力を受け付ける状態にします。

#再まとめ
**指定したDockerコンテナの対話形式bashシェルを起動して、キーボードからコンテナ内でコマンドを実行できるようにすること**を「コンテナに入る」と表現しているということで理解しました。

コマンドラインを起動して指示を出せるようにしているだけで、あまり「入る」って感じじゃないなあと個人的には思いました。

#参考
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/exec/
[02] docker-composeを活用して即座にGitLabを立てて使ってみる ... git clone 〜 push をする

# はじめに

GitLab を試したくてローカルPC 上に立てることにしたときの記録である.
また、別PC でも素早く環境構築ができるように docker-compose を使うことにした.
なお、試行錯誤の中での記録なので誤りもあると思う.

[前回](https://qiita.com/robozushi10/items/6ea798fd8f9863ef5439)は docker-compose を使って GitLab を立てた.
**今回はリポジトリを作成して git clone 〜 push までができるところまでである.**

## 参考サイトおよび書籍

|URL|
|:--|
|[GitLab実践ガイド (impress top gear) 北山 晋吾](https://www.amazon.co.jp/dp/B079DL362C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)|


## 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

[GitLab実践ガイド (impress top gear) 北山 晋吾](https://www.amazon.co.jp/dp/B079DL362C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) によると、
・GitLab では「Git リポジトリ」のことを「Project」という.
・「Project」は「Group」単位で作成する.

### 1. Group を作成する

GitLab の Web-UI にて次の操作をする.

・`Admin` → `Groups` → `NewGroup` より、「`02_software`」を作る.

### 2. Project を作成する

GitLab の Web-UI にて次の操作をする.

・`Admin` → `Projects` → `New Project` より、「`Create Blank Project`」を選択して下図のように入力・操作する.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/dc071a3c-a8df-9e8c-3c61-191146e38f79.png)


以上で空っぽだが、リポジトリ `ssh://git@server_01:59022/02_software/mysoft.git` が作成された.


### 3. SSH秘密鍵・公開鍵を作成する

今回は次のワンライナで鍵ペアを作る.

```bash
$ ssh-keygen -t rsa -f ~/.ssh/server_01 -N '' -C 'foo@example.com'
```

### 4. GitLab 上に 3 で作成した公開鍵を登録する

GitLab の Web-UI にて次の操作をする.

・`画面右上のユーザアイコン` → `Preferences` → `SSH Keys` の順にアクセスする.

・下図のように、上記 3 で作成した `~/.ssh/server_01.pub` の中身を貼り付ける.

・最後に「`Add Key`」を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b952ae51-7ef3-8ca8-87a3-de9c6201aa29.png)

### 5. $HOME/.ssh/config に次の記述を追加する

・`192.168.10.115` は各自の PC の IPアドレスに読み替えること.
・`(ユーザ名)` も各自読み替えること.
・その他は下記の記述で良い

```ssh
Host server_01
  User git
  Port 59022
  HostName 192.168.10.115
  IdentityFile /home/(ユーザ名)/.ssh/server_01
  TCPKeepAlive    yes
  IdentitiesOnly     yes

```

### 6. 上記 1, 2 で作成したリポジトリ「mysoft」を clone する

このとき `$HOME/.gitconfig` は設定済みであるものとする.

```bash
$ git clone ssh://git@server_01/02_software/mysoft
Cloning into 'mysoft'...
warning: You appear to have cloned an empty repository.

$ cd mysoft
`````

### 7. README.md を作成して、Push する

```bash
$ vim README.md
(適当に編集して保存する)

$ git add READM.md

$ git commit -m 'README.md を新規作成した'

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 1.46 KiB | 1.46 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://server_01/02_software/mysoft
 * [new branch]      master -> master

```

　

以上.
Laravel artisan コマンド

Laravelのartisanコマンド。
自分用の備忘録です。

###コマンド一覧の表示
artisanコマンドの一覧を表示する。

```
php artisan list
```
###Laravelのバージョンを調べる
```
php artisan -v
```

###Laravelの簡易サーバーを起動する
```
php artisan serve
```

###モデルファイルの作成
実行するとappフォルダの配下にファイルが作成される。

```
php artisan make:model　modelname
```

ただ、appフォルダ配下に作成してしまうとモデルが増えたときに管理が煩雑になるため、modelsフォルダを作成しその配下にモデルファイルを作成するのが一般的。
また、マイグレーションファイルとコントローラファイルも一緒に作成する場合はオプションに-mcをつける。


```
php artisan make:model models/modelname -mc
```

###マイグレーションファイルの作成
マイグレーションファイルを作成する場合は、複数形のsをつける。
¥app¥database¥migrations配下にファイルが作成される。

```
 php artisan make:migration create_tests_table
```

###マイグレーションの実行
```
php artisan migrate
```
###マイグレーションのロールバック
```
php artisan migrate:rollback
```
###マイグレーションの実行状況を確認する
```
php artisan migrate:status
```

###DBへの簡易接続
Laravelから対話型形式でDBとのやり取りが可能。

```
php artisan tinker
```

###コントローラの作成
ファイル名の後にControllerとつけるのが一般的。
¥app¥Http¥Controllersにファイルが作成される。

```
php artisan make:controller TestController
```
残プロ　第-50回　~ターミナルでイコライザーを表示~

# イコライザーとは

音圧を周波数ごとに表示するやつです．

今回は，**こういうの⇩**をつくります．

![Equalizer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578927/91afa726-2cbc-122d-f13c-09125bfa43ed.gif)


# 環境・使用ライブラリ

Windows 10
コマンドプロンプト
Python 3.8.10
- pyaudio
- numpy


# 音楽の再生

pyaudioを使用します．詳しくは[前回記事](https://qiita.com/R1nY1x1/items/e6c5d894a5c80c420a76)をご覧ください．
なお，今回の対象ファイルはwavファイルのみです．


# 音圧(amp)と周波数(freq)の計算

numpyのfft(高速フーリエ変換)を利用すると簡単に求められます．

**音圧の代わりとして**，フーリエ変換後の振幅スペクトルを使用しました．(音圧と振幅スペクトルの関係に詳しい方はコメントで教えてください...)

~~~ python:
f = np.fft.rfft(data)
freq = np.fft.rfftfreq(data.shape[0], d=1.0/framerate)
amp = np.abs(f)
~~~


# イコライザーの表示

いつも通り，ANSIエスケープシーケンスを利用しましょう！
ANSIエスケープシーケンスは[第-38回](https://qiita.com/R1nY1x1/items/52cda53cefd3a7471905)や[第-39回](https://qiita.com/R1nY1x1/items/2e072d4d31209f59381c)でも利用しているので，ぜひ参考にしてください．

下記コードでは，周波数ごとの音圧をリストで表現し，上から順にプリントしています．

~~~ python:
    print("\033[18F")
    for i in range(15, 0, -1):
        color = "\033[35m" if i<=3 else "\033[36m" if i<=6 else "\033[32m" if i<=9 else "\033[33m" if i<=12 else "\033[31m" 
        level = ["\033[0m  "+color+"|" if a>=i else "\033[0m   " for a in amp_by_freq]
        print("\033[0m "+"".join(level))
~~~


# ソースコード

[github](https://github.com/R1nY1x1/PlayMusic)で公開しています．お試しあれ．
react-leafletのMarkerを回転させる

react-leafletのMarkerを回転させる方法を調べて、ちょっと無理やりな感じになってますが一応できたのまとめです。

~~~typescript:RotableMarker.tsx
import { useEffect, useRef } from "react";
import L from "leaflet";
import { Marker, MarkerProps } from "react-leaflet";

type RotableMarkerProps = MarkerProps & {
  rotationAngle: number;
  rotationOrigin: string;
};

export const RotableMarker: React.FC<RotableMarkerProps> = (props) => {
  const markerRef = useRef<any>();

  useEffect(() => {
    const marker = markerRef.current;
    if (marker) {
      const proto_setPos = marker._setPos;
      marker._setPos = (pos: any) => {
        proto_setPos.call(marker, pos);
        if (props.rotationAngle) {
          marker._icon.style[L.DomUtil.TRANSFORM + "Origin"] =
            props.rotationOrigin;
          marker._icon.style[L.DomUtil.TRANSFORM] +=
            " rotateZ(" + props.rotationAngle + "deg)";
        }
      };
      marker.update();
    }
  }, [props.rotationAngle, props.rotationOrigin]);

  return (
    <Marker ref={markerRef} {...props}>
      {props.children}
    </Marker>
  );
};
~~~

使い方としては、以下が例です。
**rotationAngle**で回転角を45度、**rotationOrigin**でCSSのtransform-originを指定します。

~~~typescript:App.tsx
import L, { LatLngExpression } from "leaflet";
import "leaflet/dist/leaflet.css";
import { MapContainer, TileLayer } from "react-leaflet";
import { RotableMarker } from "./RotableMarker";

L.Icon.Default.imagePath =
  "//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/images/";

const App = () => {
  const position: LatLngExpression = [51.505, -0.09];
  return (
    <MapContainer center={position} zoom={13} scrollWheelZoom={false}>
      <TileLayer
        attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
      />
      <RotableMarker
        position={position}
        rotationAngle={45}
        rotationOrigin="center"
      />
    </MapContainer>
  );
};

export default App;

~~~

結果は以下のように回転しています。
![capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30716/9a429aba-387c-9d4d-5c05-c50dd8fe2a90.png)

### 参考

* [How to dynamically move and rotate marker in react-leaflet?](https://stackoverflow.com/questions/66342168/how-to-dynamically-move-and-rotate-marker-in-react-leaflet)
* [Leaflet Rotated Marker](https://github.com/bbecquet/Leaflet.RotatedMarker)
[01] docker-composeを活用して即座にGitLabを立てて使ってみる ... GitLab立ち上げまで

# はじめに

GitLab を試したくてローカルPC 上に立てることにしたときの記録である.
また、別PC でも素早く環境構築ができるように docker-compose を使うことにした.
なお、試行錯誤の中での記録なので誤りもあると思う.

今回は SSL を使った GitLab の立ち上げまでである.

## 参考サイトおよび書籍

|URL|
|:--|
|https://mikoto2000.blogspot.com/2018/06/gitlab-docker-image-https.html|
|https://mikoto2000.blogspot.com/2017/12/openssl-ca.html|
|https://tsyama.hatenablog.com/entry/docker-local-gitlab-and-runner|
|[GitLab実践ガイド (impress top gear) 北山 晋吾](https://www.amazon.co.jp/dp/B079DL362C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)|


## 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

### 1. docker-compose.yml を作成する

https://mikoto2000.blogspot.com/2018/06/gitlab-docker-image-https.html を基にして作成した.
差分としては以下である.

・ポート番号を変えた
・GitLab の初期 root パスワードを `rootroot` にした
・GitLab Runner を立てるようにした (現時点では本当に動くかは不明)
・PlantUML コンテナを立てる
・🛑 は「`./PV/gitlab/opt:/var/opt/gitlab`」だと `docker-compose up -d` に失敗したため仕方無く

```yaml
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: 'mygitlab-core'
    restart: always
    hostname: 'server_01'
    volumes:
      - './PV/gitlab/config:/etc/gitlab'
      - './PV/gitlab/log:/var/log/gitlab'
      - mygitlab_opt:/var/opt/gitlab 🛑
    environment:
      TZ: "Asia/Tokyo"
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://server_01:59443/'
        nginx['redirect_http_to_https'] = true
        gitlab_rails['gitlab_shell_ssh_port'] = 59022
        gitlab_rails['initial_root_password'] = 'rootroot'
    ports:
      - "59080:80"
      - "59443:59443"
      - "59022:22"
  runner:
    image: "gitlab/gitlab-runner"
    container_name: 'mygitlab-runner'
    restart: "always"
    hostname: "server_01"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./PV/runner:/etc/gitlab-runner
volumes:
  mygitlab_opt:
```

### 2. 自己署名証明書を作成する

https://mikoto2000.blogspot.com/2017/12/openssl-ca.html を実施する.
上記 URL の手順を実施すると、次のような構成で生成される.
最初は余計な間違いを起さないためにも「server_01」という名称にしておくと良い.

```bash
$ pwd
/etc/ssl/keys
 
$ tree . --charset=C
.
|-- server_01.crt .... サーバ証明書
|-- server_01.csr
`-- server_01.key .... サーバ秘密鍵
```

### 3. 上記 2 で生成した証明書と鍵を次のように配置する

```
.
|-- PV
|   `-- gitlab
|       `-- config
|           `-- ssl
|               |-- server_01.crt
|               `-- server_01.key
`-- docker-compose.yml
```

### 4. /etc/hosts に「127.0.0.1 server_01」を登録する

```bash
$ cat /etc/hosts
127.0.0.1	localhost
127.0.0.1	server_01  # 追加
略
```


### 5. docker-compose up -d を実行する

docker-compose ps で Up になってから 10〜15分ほど待つ.
挙動が心配なら `docker-compose logs -f gitlab` でログを監視すること.

### 6. Web ブラウザから GitLab にログインする

`https://server_01:59443`にアクセスし、「`root`」「`rootroot`」でログインする.
もしも Not Found や 502 エラーであれば、上記 5 でのセットアップ中かも知れないので待機すること.
　

以上
【超簡単】Vue.jsでページ内スクロールとTOPへ戻るボタンを実装

#はじめに
Vue.jsでページ内スクロールやTOPへ戻るボタンを実装したらとても簡単だったのでそのやり方のメモです。
脱jqueryを考えている方に参考にしてもらえたら幸いです。

#ページ内スクロールの実装

```html
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-scrollto"></script>
```
まず上記のCDNをHTMLファイルに読み込ませます。
Vue.jsのバージョンは必要に応じて変えてください。
<br>

```html
<body>
  <div id="app">
  <!--  この中に実際のHTMLコードを記述する -->
  </div>
</body>
```
次にbodyタグの1つ内側にdivタグを記述し、id="app"を指定します。
<br>



```html
<script>
    new Vue({
      el: '#app'
    });
</script>
```
そして、上記のコードをbodyの最後(id="app"が指定されているdivタグの外側)、または別のJSファイルに記述します。
Vue.jsの基本コードです。
<br>

```html
<a href="#" v-scroll-to="'#contact'" >Contact</a>
```
最後にaタグに上記のように記述するだけです。
これだけでページ内スクロールが実装できます。
上記のコードでは、このaタグをクリックすることで、id="contact"が指定されているタグまでスクロールしてくれます。

#TOPへ戻るボタンの実装
TOPへ戻るボタンが途中から出現する機能を実装します。

```html
<script>
    new Vue({
      el: '#app',
      data: {
        visible: false,
      },
      created: function() {
        window.addEventListener("scroll", this.handleScroll);
      },
      methods: {
        handleScroll() {
          this.scrollY = window.scrollY;
          if (!this.visible) {
            this.visible = window.scrollY > 200;
          } else if (window.scrollY < 190) {
            this.visible = !this.visible;
          }
        }
      }
    });
</script>
```
先ほどのVueのコードに、data、created、methodsを追記します。
methodsの中の数値を変えるだけで、TOPへ戻るボタンの出現タイミングが変わります。
<br>

```html
<a href="#" v-scroll-to="'#app'">
    <button class="return-top-button" v-show="visible">
      TOPへ戻る
    </button>
</a>
```
あとはボタンを作って、v-showを記述するだけです。
Webページで日本語(縦書き)文章を縦スクロールできるようにする

ネットで見かけなかったので書いておきます。

## 動作確認ブラウザ
+ Mozilla Firefox 90.0.2(64bit)
+ Microsoft Edge 92.0.902.55 (公式ビルド) (64 ビット)

## 方法
CSSでいくつかの指定をするだけです。

## コード
百聞は一見にしかず。
HTMLファイルのテキストを載せておきます。CSSはこの中の`<style>`要素で**ルート要素（html要素）**に対して指定しています。（外部CSSファイルにしてxmlファイルから指定しても効果がありました。xmlファイルの場合も、ルート要素に対して同様に指定します。）

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<base href="/">
<meta charset="UTF-8">
<meta name="viewport"	content="width=device-width,initial-scale=1.0">
<title>たて書き</title>
<style>
html{
  width:97%;
  height:85%;
  -ms-writing-mode: tb-rl;
  writing-mode: vertical-rl;
  margin:1em 0;
  padding:1em;
  column-count:1;
  column-rule-style:solid;
}
p{text-indent:1em}
</style>
</head>
<body>
<p>あいうえお、かきくけこ、さしすせそ、たちつてと、なにぬねの、はひふへほ、まみむめも、やゆよ、らりるれろ、わをん
<p>がぎぐげご、ざじずぜぞ、だぢづでど、ばびぶべぼ、ぱぴぷぺぽ
<p>あいうえお、かき...（以下くり返し）
</body>
</html>
```

## 結果
（下の画像を参照。）マウスで縦スクロールができるようになりました。横幅はブラウザの表示幅（の97%）、高さはブラウザの表示高さ（の85%）に設定、段組の境界線も表示しています。

スクロール前（Firefox）
![tate1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/08774074-6ec4-b043-84af-a1e70b3ae3d4.jpeg)

スクロール中（Firefox）
![tate2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/fe389122-8379-66d7-0a28-f1b71469a6df.jpeg)

Edge
![edge.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327025/8ebdb8c2-1a4a-4691-2f29-f6dc8845b89f.jpeg)

Microsoft Edge では、行の幅が Firefox より狭く表示されました。このあたりは工夫の余地がありそうです。