OmniAICreator/Qiita-1.07M huggingface dataset:
Simple Data Integrator (SDI) 実践入門：コネクション設定 (SDI Gateway service経由リモート接続）

# SDI Gateway service経由リモート接続設定
下記の記事で設定したSDI Gateway serviceに接続する場合の例：
https://qiita.com/RiCCT/items/a82ce61c3ddfd6376a2b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/510bc08f-3298-4247-8c80-759d64024013.png)


1. `「新規コネクション」`ボタンをクリックしてコネクション設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/eb0f9d6b-6be6-7107-5474-eb6ce6950591.png)

2．接続情報を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/bbbdb040-96c4-43ce-8207-f0572ab502ae.png)

下記の記事で設定したSDI Gateway serviceへ接続する場合の例。
https://qiita.com/RiCCT/items/a82ce61c3ddfd6376a2b

|No|項目|説明|
|----|----|----|
| 1 |コネクション名 |コネクション名を入力、任意の名前設定できます。システムは名前の重複チェックしていないですが、管理上、ユニークの名前の設定をお勧めします。 |
| 2 |ロケーション | `リモートデータベース（SDI Gateway Service経由）`を選択|
| 3 |テータタイプ|`Oracle`を選択|
| 4 |End Point Address|	SDI Web Service のEnd Point Addressを入力。 <br /> 例の場合：<br />`http://***.***.***.***/SdiService/CdbcService.svc`<br />　※WEBサーバーに証明書インストールされている場合、https接続してください。|
| 5 |ユーザー認証情報|例の場合：<br />User Authentication Method:`UserPsk` <br />userId:`testuser`<br /> userPsk:`xxC2FxmyF2rY2K8f` <br /><br />Service側設定資料：[ユーザー認証関連設定 (userAuthentication)](https://qiita.com/RiCCT/items/a82ce61c3ddfd6376a2b#41%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%AA%8D%E8%A8%BC%E9%96%A2%E9%80%A3%E8%A8%AD%E5%AE%9A-userauthentication)|
| 6 |アプリケーション認証情報|例の場合：<br />Application Authentication Method:`ApplicationPsk` <br />ApplicationId:`testappli`<br /> ApplicationPsk:`EoQSKkfReZMO685E`<br /><br />Service側設定資料：[アプリケーション認証関連設定 (clientApplicationAuthentication)](https://qiita.com/RiCCT/items/a82ce61c3ddfd6376a2b#42-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%AA%8D%E8%A8%BC%E9%96%A2%E9%80%A3%E8%A8%AD%E5%AE%9A-clientapplicationauthentication)|
| 7 |ConnectionString|サービス側で設定されたConnectionString名を入力。<br /> 例の場合：<br /> `oracletest` <br /><br />Service側設定資料：[接続文字列を設定 (connectionStrings)](https://qiita.com/RiCCT/items/a82ce61c3ddfd6376a2b#43-%E6%8E%A5%E7%B6%9A%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%A8%AD%E5%AE%9A-connectionstrings)|
| 8 |Network Data Encryption|SDIがSDI Web Serviceとデータを通信する際、データを暗号化するかどうか。（この設定はEnd Point Addressがhttpの場合のみ有効です。End Point Addressがhttpsの場合、ssl暗号化通信するので、この設定を無視する）|
| 9 |Network Data Compression|SDIがSDI Web Serviceとデータを通信する際、データを圧縮するかどうか。|
| 10 |Default Schema|Default Schema指定された場合、マッピングの際、指定されたスキーマのテーブル、ビューがリストされます。空白の場合、アクセスできるすべてのテーブル、ビューがリストされます。|
| 11|接続テスト|`[接続テスト]`ボタンをクリックしてOracleへ接続できるかどうかをテストします，接続が成功する場合、下記のメッセージボックスが表示されます。<br />![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/2895baaa-276a-fd49-f9fd-163d1a3b86ea.png)|

接続テストして問題なければ　保存します。


以上です。

[Simple Data Integrator (SDI) 実践入門](https://qiita.com/RiCCT/items/3dc109ff82546459a8b0 "Simple Data Integrator (SDI) 実践入門")

# 参考資料
[SDI日本語公式サイト](https://ja.sdi.ricct.com/ "SDI日本語公式サイト")
[SDI English Official Website](https://sdi.ricct.com/ "SDI English Official Website")
[リモートデータベースへのコネクション設定 (SDI Gateway service 経由)](https://ja.sdi.ricct.com/userguide/connectionsdiservice/ "リモートデータベースへのコネクション設定 (SDI Web service 経由)")
CLIのhistoryコマンド

### CLI操作のhistory機能について

teminalで、history -○と打ち込むと過去○回までの履歴を表示してくれます。
```
history -10
```
```
user@usernoMacBook-Air chat-app % history -10
  967  clear
  968  rails g devise:install
  969  clear
  970  rails d model install
  971  clear
  972  bundle install
  973  clear
  974  rails g devise:install
  975  rails s
  976  history -10
```
Ubuntu 22.04 の zfs 2.1.2 を使っていると mysql が立ち上がらない

以下のようなエラーが出て、mysqlのdockerが立ち上がらなくなっていた。

```
Log file ./ib_logfile0 size 18833408 is not a multiple of innodb_page_size
Log file ./ib_logfile1 is of different size 0 bytes than other log files 18923520 bytes!
```

innodb_page_size を 16kB から 8kB に変更してみても、2つ目のエラーが出て停止した。
mysqlが確保したと思っている容量と、ファイルシステムから返ってくる容量が違っている容量が違うようだった。

同様の現象が報告されていて、修正のPRは上がっているが、確認した時点ではまだリリースされていないようである。2.1.5 で修正がリリースされる見込みと書かれていた。

https://github.com/openzfs/zfs/issues/13329

その場しのぎの対策として、zfs からブロックデバイスを切り出し、ext4 でフォーマットしてマウントして使うというテクニックが紹介されており、私もこれで凌ぐことができた。

以下、手順を記載する。

zfs からブロックデバイスを切り出す

```sh
sudo zfs create -s -V 50g rpool/MYSQL
```

ブロックデバイスができていることを確認する

```sh
lsblk
```
```
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...
zd0         230:0    0    50G  0 disk 
```

ブロックデバイスにパーティションを作成する

```sh
sudo gdisk /dev/zd0
```

```
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

Command (? for help): p
Disk /dev/zd0: 104857600 sectors, 50.0 GiB
Sector size (logical/physical): 512/8192 bytes
Disk identifier (GUID): 98B290DB-F56C-420D-85BA-EBACCA1657D8
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 104857533 sectors (50.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-104857566, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-104857566, default = 104857566) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/zd0.
The operation has completed successfully.
```
ブロックデバイスができていることを確認する

```sh
lsblk
```

```
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...
zd0         230:0    0    50G  0 disk 
└─zd0p1     230:1    0    50G  0 part 
```

ext4 でフォーマットする

```
sudo mkfs.ext4 /dev/zd0p1
```

/etc/fstab に書いてマウントする

```sh
sudo mkdir /var/lib/mysql
sudo vi /etc/fstab
```

```:/etc/fstab
/dev/zd0p1 /var/lib/mysql ext4 nofail 0 0
```

そしてmysqlを起動する。私の場合はdocker-composeで動かしていたため、volume mount でこのパスを指定しました。

```yaml
version: "3.7"
services:
  mysql:
    image: mysql/mysql-server:8.0.27
    environment:
      - MYSQL_USER=xxx
      - MYSQL_PASSWORD=xxx
      - MYSQL_ROOT_PASSWORD=xxx
      - MYSQL_ROOT_HOST=%
      - MYSQL_DATABASE=xxx
    ports:
      - 3306:3306
    volumes:
      - /var/lib/mysql:/var/lib/mysql
```
【SSG】Next.jsで多言語対応のサイトを作るのが簡単ではなかった件

## 確かに簡単すぎたが、静的ページのみの構成では...

https://zenn.dev/steelydylan/articles/nextjs-with-i18n

こちらの記事がまとまっていてとてもわかりやすかったので、これをもとに導入しようとしたら、記事のタイトルにあるように本当に簡単すぎて3時間ぐらいでi18n対応(日本語対応)ができました。
NextLink の遷移先も特に何も考えずによしなに対応してくれて、便利！
しかし、SSGモードで Amplify にデプロイしようとしたら build エラー！

```
Error: i18n support is not compatible with next export
```

あれ、公式にSSG対応について書いてあるはずなのに...

と疑問に思い色々見てみると、どうも SSG/SSR のハイブリッドでホスティングしている場合のSSGページの対応方法が記載されているだけらしく、
`next export` でプリレンダリングしてホスティングしている場合には対応していないようです。
(基本は SSR でホスティングしていないとダメ)

## next-export-i18n

https://dev.to/adrai/static-html-export-with-i18n-compatibility-in-nextjs-8cd

同じところで悩んでいる方はいるようで、結構対応が大変そうだなと思っていたのですが、この記事↑のコメント欄に `next export` に対応したライブラリ作ったよとのコメントがありました。

https://github.com/martinkr/next-export-i18n

これは確かに簡単そうで、元々の i18n の ja.ts ファイルも流用できそう。
しかも、実装例まであってとてもわかりやすい！

https://github.com/martinkr/next-export-i18n-example

例がこれです↑

## 移行しよう

https://zenn.dev/steelydylan/articles/nextjs-with-i18n

↑の記事の実装から移行する場合、基本的には以下を

``` i18nの場合.ts
import { useLocale } from "@/hooks/use-locale"
const { t } = useLocale()
t.SIGNUP
```

以下のように書き換えればOK

``` next-export-i18nの場合.ts
import { useTranslation } from "next-export-i18n"
const { t } = useTranslation()
t('SIGN_UP')
```

それに加えて少しパヤパヤしないといけませんが、対応するところは以下
- アプリルートに i18n というディレクトリを作って、locale用のファイルを**jsonファイル**で作成して置く
- ページ遷移時にクエリパラメータを追加する
- 言語切り替え用のボタンなどを作成する

``` ページ遷移はこんな感じ title.tsx
import NextLink from 'next/link'
import { useLanguageQuery } from "next-export-i18n";

export const TitleLabel = () => {
  const [query] = useLanguageQuery();
  return (
    <NextLink href={{pathname: "/", query: query}} passHref>
       title
    </NextLink>
  )
}
```

``` 切り替えボタンはこんな感じ.tsx
import { LanguageSwitcher } from 'next-export-i18n';
const ChangeLangButton = (id, name) => {
  return (
    <LanguageSwitcher lang={id}> // 例えば lang={"en"} のようになるようにする
      <Button>
        { name }
      </Button>
    </LanguageSwitcher>
  )
}
```



設定ファイルに `useBrowserDefault: true` を設定すると、ブラウザのデフォルトの言語が自動的に適用されます。これは便利！

``` index.js
var en = require('./translations.de.json');
var de = require('./translations.de.json')

const i18n = {
  translations: {
    en: en.i18n,
    de: de.i18n,
  },
  defaultLang: 'de',
  useBrowserDefault: true, // これ
}

module.exports = i18n;
```

## 時間はかかった

状態管理に jotai を使っていて、ステートをURLと同期させていたのでうまく動かないか心配しましたが、その点もクリアでした！
なぜ `next export` でできないのかとか、他の実装方法がないか調べたり、実際に移行作業したり動作確認したりで、1日潰れました笑
同じ轍を踏むような人がでないために、備忘録としてここに記しておきます :bow:
Specification of Flash Driver, No.25, AUTOSAR R21-11(105) CP

Specification of Flash Driver, No.25, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_FlashDriver.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term| Definition|
|:--|:--|
|DET |Default Error Tracer – module to which development errors are reported.
|DEM |Diagnostic Event Manager – module to which production relevant errors are reported.
|Fls, FLS |Official AUTOSAR abbreviation for the module flash driver (different writing depending on the context, same meaning).
|AC |(Flash)access code – abbreviation introduced to keep the names of the configuration parameters reasonably short.
|Flash sector |A flash sector is the smallest amount of flash memory that can be erased in one pass. The size of the flash sector depends upon the flash technology and is therefore hardware dependent.
|Flash page| A flash page is the smallest amount of flash memory that can be programmed in one pass. The size of the flash page depends upon the flash technology and is therefore hardware dependent.
|Flash access code| Internal flash driver routines called by  the main function (job processing function) to erase or write the flash hardware.


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)
[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules,
AUTOSAR_SRS_BSWGeneral.pdf
[4] General Requirements on SPAL,
AUTOSAR_SRS_SPALGeneral.pdf
[5] Requirements on Flash Driver
AUTOSAR_SRS_FlashDriver.pdf
[6] Requirements on Memory Hardware Abstraction Layer
AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf
[7] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[8] Basic Software Module Description Template
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[9] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
Specification of Memory Mapping, No.128, AUTOSAR R21-11(104) CP

Specification of Memory Mapping, No.128, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_MemoryMapping.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|;--|
|BSW| Basic Software
|ISR| Interrupt Service Routine
|NVRAM |Non-Volatile RAM

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)


[1] Glossary
AUTOSAR_TR_Glossary
[2] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral
[4] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate
[5] Basic Software Module Description Template
AUTOSAR_TPS_BSWModuleDescriptionTemplate
[6] Methodology for Classic Platform
AUTOSAR_TR_Methodology
[7] Specification of RTE Software
AUTOSAR_SWS_RTE
[8] Cosmic C Cross Compiler User’s Guide for Motorola MC68HC12, V4.5
[9] ARM ADS compiler manual
[10] GreenHills MULTI for V850 V4.0.5
Building Applications for Embedded V800, V4.0, 30.1.2004
[11] TASKING for ST10 V8.5
C166/ST10 v8.5 C Cross-Compiler User’s Manual, V5.16
[12] TASKING for ST10 V8.5
C166/ST10 v8.5 C Cross-Assembler, Linker/Locator, Utilities User’s Manual,V5.16
＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220522
Git Hubを使っていてトラブルが起きた時用の備忘録

エンジニアを目指すようになって早2か月、GitHubと接する時間が一気に増えました。
その中で、色々な試作品をプッシュしたり、チーム開発で複数人と一緒にリポジトリ共有したりすると毎日のようにトラブルが起きています…(ただの注意欠陥)

そんな私を毎日救ってくださる方々の知恵を残すための備忘録記事です。
新しいトラブルが起きるたびに更新されるので、更新されてたら察してください。


【サイト紹介】
①Gitのコマンドを感覚で理解するために参考にしました

http://kinokoru.jp/archives/1017

②DMMWEBCAMPでもおすすめされているサイト。困り事が起きたらまずこのサイトを見てます

https://backlog.com/ja/git-tutorial/

③マージしちゃいけないブランチにマージしちゃったときにお世話になりました

https://qiita.com/getty104/items/cfd98f5f0ea89ef07bf0

④ブランチ名をつけるときの参考になりました

https://gist.github.com/tiijima/9854122dafa5eeb9bf7a

⑤rails new してからGitHubにリポジトリを作るまでの流れをいつも忘れちゃいます…

https://qiita.com/tmyn470/items/338733077277eb8af8c4
Requirements on Memory Services, No.7, AUTOSAR R21-11(102) CP

Requirements on Memory Services, No.7, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_MemoryServices.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,318文書読んだ。2022年6月初めにFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 目的と成果(Purpose and Outcome)
|item|description|
|:--|:--|
|who|memory designer|
|what|no changes?|
|importance|  high|
|others|specification of memory access and memory driver are changed. |
|comment| Please read v.2 or v.3, there are initiaters.|

# 用語(terms)
|Term|Description|
|:--|:--|
|Basic Storage Object| A “Basic Storage Object” is the smallest entity of a NVRAM Block. Several “Basic Storage Objects” can be used to build a NVRAM Block. A “Basic Storage Object” can reside in different memory locations(RAM/ROM/NV memory).
|NVRAM Block |The “NVRAM Block” is the entire structure, which is needed to administrate and to store a block of NV data.
|NV data |The data to be stored in the Non-Volatile memory.
|Block Management Type| Type of the NVRAM Block. It depends on the (configurable) individual composition of a NVRAM Block in chunks of different mandatory/optional Basic Storage Objects and the subsequent handling of this NVRAM block.
|NV Block Header |Additional information included in the NV Block if the mechanism “Static Block ID” is enabled.
|RAM Block |The “RAM Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the RAM. See [SRS_LIBS_08534]
|ROM Block |The “ROM Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the ROM. The “ROM Block” is an optional part of a NVRAM Block.
|NV Block |The “NV Block” is a Basic Storage Object. It represents the part of a NVRAM Block, which resides in the NV memory. The “NV Block” is a mandatory part of a NVRAM Block.
|Administrative Block |The “Administrative Block” is a Basic Storage Object. It resides in RAM. The Administrative Block contains any RAM data, that are necessary to manage the NVRAM block, for being able to perform processing on it and to deliver status information. The “Administrative Block” is a mandatory part of a NVRAM Block.


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[AUTOSAR_SW_ARCH] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[AUTOSAR_BASIC_SW] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[AUTOSAR_SRS_MEMHW] Requirements on Memory Hardware Abstraction Layer
AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf
[TPS_STDT_0078]SoftwareComponentTemplate
AUTOSAR_TPS_SoftwareComponentTemplate.pdf


# 文書履歴(document history)
ver. 0.01 初稿
ver. 0.02  (Purpose and Outcome are added. 20220604
Weixin Openplatform OAuth2.0 Authorization Code Grant 連携メモ

Weixin Openplatform のOAuth2.0 Authorization Code Grant 連携方法についてメモする。
## シーケンス
![wechat_acg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f5e75eb4-4a14-37e0-beab-118f0deb72ff.png)


## 認可リクエスト

```http
GET https://open.weixin.qq.com/connect/qrconnect
?appid d=APPID
&redirect_uri=REDIRECT_URI
&response_type=code
&scope=SCOPE
&state=STATE
```

| パラメータ    | 必須 | 説明                                                         |
| :------------ | :--- | :----------------------------------------------------------- |
| appid         | 〇   | アプリケーション識別子                                       |
| redirect_uri  | 〇   | リダイレクトURI                                              |
| response_type | 〇   | `code`                                                       |
| scope         | 〇   | 認可スコープ。Webアプリの場合は`snsapi_login`のみ。複数指定時は`,`区切り。 |
| state         |      | CSRF対策文字列                                               |

## 認可レスポンス

```http
redirect_uri?code=CODE&state=STATE
```



## トークンリクエスト

```http
GET https://api.weixin.qq.com/sns/oauth2/access_token
?appid=APPID
&secret=SECRET
&code=CODE
&grant_type=authorization_code
```

| パラメータ | 必須 | Description                                    |
| :--------- | :--- | :--------------------------------------------- |
| appid      | 〇   | アプリケーション識別子                         |
| secret     | 〇   | アプリケーション登録時に発行されたシークレット |
| code       | 〇   | 認可コード                                     |
| grant_type | 〇   | `authorization_code`                           |

## トークンレスポンス

```json
{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
```

※`openid` : ユーザーID。

※`unionid` : ユーザーがユーザー情報取得を認可した際に表示される識別子。WeixinOpenPlatformアカウント内で一意。同じWeixinOpenPlatformアカウントのアプリケーションは、同じunionidを共有する。



## Userinfo APIリクエスト

```http
GET https://api.weixin.qq.com/sns/userinfo
?access_token=ACCESS_TOKEN
&openid=OPENID
```

| パラメータ   | 必須 | 説明                                         |
| :----------- | :--- | :------------------------------------------- |
| access_token | 〇   | アクセストークン                             |
| openid       | 〇   | ユーザーID。トークンレスポンスで取得した値。 |
| lang         |      | 定義域：zh_CN(default)、 zh_TW、 en          |

## Userinfo API レスポンス

```json
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
```





## 参考情報

* [Website App Weixin Login Development Guide](https://developers.weixin.qq.com/doc/oplatform/en/Website_App/WeChat_Login/Wechat_Login.html)
Chrome Extensionで選択テキストをショートカットで処理する

# 動機
いちいち、複数ある拡張機能の起動をコンテキストメニューから選んで実施したくない
そもそも、Chrome-Extensionの制約として、複数のコンテキストメニューを追加すると、親メニューに包含されて、めちゃくちゃ選びづらい。
なので、選択されたテキストに対して、ショートカットキーによる操作を行えるようにする。

# 作成する機能
* 選択テキストによるDeepL英日翻訳（テキスト選択後、Ctrl+Shift+Lで起動）
* 選択テキストによる英Google検索（テキスト選択後、Ctrl+Shift+Eで起動）

全然関係無いが、Ctrl+EでChromeのアドレスバーに飛ぶので日Google検索はなし。

# 手順
1. manifestにcontent_scriptsを追加する
1. manifestにcommands（ショートカット定義）を追加する
1. content.jsに選択テキストの変化に応じたbackground.jsへのメッセージ送信を追加する
1. background.jsにメッセージ受信に応じた選択テキスト（グローバル変数）の更新を追加する
1. background.jsにショートカットキーに応じた処理を追加する

## manifestにcontent_scriptsを追加する
```json
  "content_scripts": [{
    "matches": ["http://*/*","https://*/*"],
    "js": ["content-script.js"]
  }]
```

## manifestにcommands（ショートカット定義）を追加する
```json
  "commands": {
    "translateDeppL": {
      "suggested_key": "Ctrl+Shift+L",
      "description": "Translate Selected Text."
    },
    "searchByEnglishGoogle": {
      "suggested_key": "Ctrl+Shift+E",
      "description": "Search Text by EN Google."
    }
  }
```
## content.jsに選択テキストの変化に応じたbackground.jsへのメッセージ送信を追加する
```javascript
document.addEventListener('selectionchange', function (event) {
    let selectionText = window.getSelection().toString();
    console.log(`selection changed:${selectionText}`)

    if (selectionText.length)
        chrome.runtime.sendMessage({
            message: selectionText
        }).catch(e => console.error(e))
})
```

## background.jsにメッセージ受信に応じた選択テキスト（グローバル変数）の更新を追加する
```javascript
let selectionText
function onMessageFunc(message, sender, sendResponse) {
    chrome.tabs.query({active: true}).then(tabs => {
        const tab = tabs[0]
        console.log(`selection text[${message.message}] update by sender:${sender.tab.id}, active.tab.id:${tab.id}`)

        if (sender.tab.id === tab.id) {
            selectionText = message.message
        }
    })
    return true
}
```

## background.jsにショートカットキーに応じた処理を追加する
```javascript
chrome.commands.onCommand.addListener((command) => {
    switch (command) {
        case "translateDeppL":
            openDeepL(selectionText)
            break
        case "searchByEnglishGoogle":
            openEGoogle(selectionText)
            break
    }
    console.log(`Command "${command}" called selectionText:${selectionText}`);
});
```

# 参考にしたもの
* [chrome開発者ツールを作る](https://qiita.com/moajo/items/8241719479987697ca37)
* https://developer.chrome.com/docs/extensions/mv3/content_scripts/ 
* https://developer.chrome.com/docs/extensions/reference/commands/
* https://developer.chrome.com/docs/extensions/reference/runtime/#method-connect
Docker環境で起動しているMySQLのバックアップ/リストア方法 メモ


## テスト環境

* 次のdocker-compose.ymlでMySQL5.7を立ち上げた後、`create_table.sql`でテーブル`test_table`を作成する。

* `docker-compose.yml`

  ```yaml
  version: '3'
  
  services:
    # MySQL
    db:
      image: mysql:5.7
      container_name: mysql
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: test_db
        MYSQL_USER: root
        MYSQL_PASSWORD: p@ssword
        TZ: 'Asia/Tokyo'
      command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
      ports:
      - 3306:3306
  ```

* `create_table.sql`

  ```sql
  create table IF not exists `test_table`
  (
   `id`               INT(20) AUTO_INCREMENT,
   `name`             VARCHAR(20) NOT NULL,
   `created_at`       Datetime DEFAULT NULL,
   `updated_at`       Datetime DEFAULT NULL,
   PRIMARY KEY (`id`)
  ) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  ```

  

* 次のようなデータを登録しておく。

```
id, name, created_at, updated_at
1, test, 2019-10-04 15:25:07, 2019-10-04 15:25:07
2, test2, 2019-10-04 15:25:07, 2019-10-04 15:25:07
3, test3, 2019-10-04 15:25:07, 2019-10-04 15:25:07
```



## バックアップ(ダンプ)コマンド

```shell
docker exec -it mysql  mysqldump -u root -pp@ssword test_db > dump.sql
```

テーブル指定

```shell
docker exec -it mysql  mysqldump -u root -pp@ssword test_db test_table > dump.sql
```

条件指定

```shell
# =　句
docker exec -it mysql  mysqldump -u root -pp@ssword test_db test_table --where 'id = 1' > dump3.sql
# IN 句
docker exec -it mysql  mysqldump -u root -pp@ssword test_db test_table --where 'id in (1,2)' > dump4.sql
```



## リストアコマンド

```shell
docker exec -it mysql mysql -u root -pp@ssword test_db -e"$(cat dump.sql)"
```



## 参考情報

* [mysqldumpオプションまとめ。whereで条件を指定したりする](https://tech.basicinc.jp/articles/82)
濾紙上にある黒さを定量化する

# はじめに
初投稿です。化学系出身なので、間違い等があるかと思いますが、ご指摘いただければ幸いです。
スクリプトは[私のGithub](https://github.com/r-shiomoto/black_contamination)にアップしていますので、自由に使用・改良してください。今回はコンセプトの紹介なので、コードは掲載していません。

# 目次
1. 背景
1. 目的
1. 方法
1. 結果
1. 今後の予定

# 背景
化学の世界では、化合物の着色を**真っ黒な活性炭** (Activated Carbon: **AC**)で除去することがあります。一般的な手順は以下のとおりです。
1. 着色した化合物、AC、溶媒を容器に加えて撹拌する。このとき、化合物は溶媒に溶け、ACは溶けずに溶液は真っ黒な懸濁液である。
1. 濾紙と漏斗を用いて上記の懸濁液を濾過し、ACを除去する。
1. 濾液を濃縮や再結晶し、固体の化合物を得る。

![filter_procedure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672794/5f0946b4-6c0c-9237-53f1-f427136d9569.png)


このとき、最後に取得した化合物にACが混じり、せっかく脱色したものが台無しになることがあります。実験室レベルのような小さなスケールなら、やり直しが効きますが、工場スケールではそうはいきません。やり直しに原料も人員も必要となり、コストと時間が増加し、結果として利益は減少、生産スケジュールにも影響します。

***
お察しの通り、工場スケールでACが混じるトラブルに直面し、製造法を検討することとなりました。 

しかしながら、固体中に混じっているACがどの程度含まれているかは、見た目だけでは比較ができません。そこで、以下の方法を考案しました。
1. 取得した化合物を溶媒で溶解させる。
1. 製造で使用する濾紙よりも孔径が小さいもので濾過する。
1. その濾紙上の黒さで比較する。

![filter_procedure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672794/35b514db-b49d-dc0e-3aa4-4f55e32f9c85.png)


これで様々な条件で検討しようとしましたが、その濾紙上の黒さも**定性的**であり、微妙な違いが判断しづらいという問題がありました。

![constract_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672794/068ff4da-fb86-800e-85ed-1f62898a7d02.png)


# 目的
濾紙上にあるAC (黒さ)を定量化すること

# 方法
1. 濾紙をプリンターなどでスキャンし、濾紙の画像を取得する (画像取り込みの再現性が高いプリンターを採用)。
1. pythonのOpenCVを用いて、画像を取り扱う。
1. 濾紙上の黒ピクセル数と濾紙の面積の割合から、**定量する**。

幸いにも、pythonを習得していたため、上記のような発想にすぐに至りました。OpenCVの取り扱い経験があったため、スクリプトの作成は1日ほどで完了しました。

# 結果
ある濾紙の画像と、その定量値を以下に示します。目視での感覚と一致しているのではないでしょうか？

![filter_qualified.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672794/fb7a142a-2249-464e-dc54-2ac40160a0dc.png)


さらに、再現性についても調査しました。ある濾紙のスキャンを6回繰り返したところ、定量値の変動係数が3.6％となり、再現性があると判断しました。この方法論の信頼性を示すデータと考えています。

| 項目 | 定量値 |
|:-:|:-:|
| n=1  | 8.32  |
| n=2  | 8.18  |
| n=3  | 7.47  |
| n=4  | 7.75  |
| n=5  | 7.80  |
| n=6  |  8.02 |
| **平均** | 7.92  |
| **標準偏差**  | 0.28  |
| **変動係数**  | 3.6%  |

これを用いて、実際の検討を行いましたが、スクリプトが完成してすぐに、製造に使う濾紙の孔径を細かくする解決策をとりました (至極当たり前ですが)。

# 今後の予定
スクリプトはあまり活躍しませんでしたが、OpenCVの勉強にもなり、**定性から定量**するプログラミングのパワーを実感できたのは大きな成果でした。



最後まで読んでいただき、ありがとうございました。:v:
環境変数設定時　-bash: export: `=': not a valid identifier

### 環境変数設定時に下記のようなエラーが出た

```
-bash: export: `=': not a valid identifier
```

### 解決方法（自分が起きたエラーの場合）
下記のように半角スペースを入れてはいけない。
```
export 環境変数="変数名"
export 環境変数 = "変数名"
```

このエラー文が出たら、自分の打ったコードをもう一度見直してみると解決できるかもしれないです。
不要な文字やスペースが入っているかもしれません。
tar: Removing leading `/' from member namesについて

# 事象
tarを使っていたら警告```tar: Removing leading `/' from member names```が出ていたので、何だろうと思い、調べてみた内容と検証結果を備忘録として残しておきます。

tarでアーカイブの作成（とgzipへの圧縮）を行います。srcフォルダのアーカイブをdstフォルダにa.tgzとして保存したいです。ところが、実際にはsrcフォルダではなく、ルートフォルダ直下のhomeフォルダがアーカイブされてしまいます。

```
$ pwd
/home/username/temp
$ ls
dst  src
$ ls src
a.txt  b.txt  c.txt
$ ls dst
$ tar cvf /home/username/temp/dst/a.tgz /home/username/temp/src
tar: Removing leading `/' from member names
/home/username/temp/src/
/home/username/temp/src/c.txt
/home/username/temp/src/a.txt
/home/username/temp/src/b.txt
$ ls dst
a.tgz
$ tar xvf dst/a.tgz dst
tar: dst: Not found in archive
tar: Exiting with failure status due to previous errors
$ tar xvf dst/a.tgz
home/username/temp/src/
home/username/temp/src/c.txt
home/username/temp/src/a.txt
home/username/temp/src/b.txt
$ ls
dst  home  src
```

どうやらtarコマンドでは絶対パスを指定すると、先頭の/が削除されるようです。相対パスで指定してねってことなんですかね。

# 解決方法

ということで、カレントディレクトリにsrcフォルダがある状態でtarコマンドを以下のように実行すれば良いです。

```
$ tar cvf /home/username/temp/dst/a.tgz src
src/
src/c.txt
src/a.txt
src/b.txt
```

カレントディレクトリ以外のフォルダをアーカイブしたい場合は、-Cオプションを使います。-Cオプションで指定したディレクトリに移動した状態でアーカイブを実行できます。

```
$ pwd
/home/username/temp2
$ tar cvf a.tgz -C /home/username/temp src
src/
src/c.txt
src/a.txt
src/b.txt
```

しかし、なんで絶対パスで指定できないんですかね。
【本要約】統計入門〜システム運用における統計を学ぶ〜【入門監視：4章】

# 概要
・システム開発や運用において、統計は軽視されがちである。
・多くの人がちょっと統計を使うことで、簡単に欲しい情報が得られると誤解している。
# 4.1 システム運用における統計を学ぶ前に
・少々統計が軽視される背景として、Nagiosが広く普及し、その影響が**監視の仕組みの改善の妨げ**になっていた。
・Nagiosでアラートを設定するのは簡単な一方で、アラートが役に立たないことも多い。
### Nagiosについて
・Nagiosのアラートは現在のメトリクスとアラートの閾値を比較し判定するものである。よって下記のような問題が起こる。
→閾値を一瞬だけ超えたケース（偽陽性の疑い）
→閾値を超える、超えないを行ったり来たりするケース（重複送信）
注意）Nagiosの非難ではない。Nagiosが広く普及して、他のツールがNagiosを基準としていることが影響している。
# 4.2 計算が救いの手を差し伸べる
・モダンな監視スタックの原則の一つは、***監視サービスが送信したメトリクスを捨てない***ことである。
・Nagiosは現在の値しかとれず、時系列のトレンドはとれない（現在はGraphios、pnp4nagiosなどで取得可能）
→過去のデータの保存によって、統計を使った問題解決が可能になる
### データ収集と閾値に対するチェックを分けるモデル
・ホストに対して直接値チェックを行うのではなく、時系列データベースに保存された値に対し、チェックを行うようにする
→過去のデータを見ずに、未来を洞察、推測はできない
# 4.3 統計は魔法ではない
・間違った結論に辿り着かずに、データのアプローチを決定するには、統計の分野で多くの学びが必要である。
# 4.4 meanとaverage
・mean（平均値）は集合内の個別の値ではなく、***集合がどのようなものか***を表すのに用いる。
・時系列データにおいては最近取得したデータ群の移動平均（moving average）をとることが多い。
→グラフの平滑化が可能になる。
・平均化のメリットとしては、パターンの識別が容易になること。
・平均化のデメリットとしては、外れ値が隠され、重要かもしれないデータを失う可能性があること。
# 4.5 中央値
・中央値(mediun)は平均だと集合の把握が難しい場合に利用する。
・一方向に大きな偏りのある、データセットを扱う場合に、平均値よりも中央値の方がデータの傾向をより正確に表す。
# 4.6 周期性
・周期性（seasonality）とはデータポイントがパターンを繰り返すこと
→パターンを知ることで未来を推測できる
・サーバのリクエストに周期性を見出すことで、このパターンから外れた値を検知して、調査するといった運用が可能。
・サーバの負荷には認識できる***周期性が全くない***場合も存在する
# 4.7 分位数
・分位数（quantile）はデータセットのある点を表す統計手法。第2四分位数と言えば中央値になる。
・パーセンタイルがよく使われる。パーセンテージでデータセット内の点を表す手法。
・パーセンタイルは平均を取ることが不可能なので注意。
・パーセンタイルのデメリットは、いくつかの値を捨てているため、重要な情報を失う可能性があること。
# 4.8 標準偏差
・標準偏差（standard deviation）は平均からどの程度離れているか、近いかを表す値。
・正規分布（normally distributed）にしか期待する結果が出ないことに注意。（正規分布をデータセットの分布に仮定している）
・大半のデータは正規分布に従わないため、利用を諦めるのも一つである。
# 4.9 まとめ
データを扱う前に以下の問いを参考にしたい
・大小どちらかに偏りのあるデータか
・極端な外れ値の発生頻度はどうか
・データポイントに上限下限はあるか

# 読んでみた感想
・Nagiosに限らず、閾値超えたら発砲みたいなアラートがとりあえず設定されているシステムは多いが、それだと対応手順が曖昧になることが多い気がする。（アラート設定した側も目的がアラートの設定に終始している場合が往々にしてあるので。本来の目的はシステムが異常な状態になっているケースの検知。）
・時系列で普段のアクセスパターンから外れた傾向になっていたら、発砲するなど、もう少しアラートルール工夫したいなって思った。
・正規分布仮定していること知らず、標準偏差使うはあるあるだと思うので気をつけないと。
MySQL　4バイトの絵文字を保存できるようにする

## 用途
MySQLで4バイトの絵文字を保存できるようにしたい時に使う。
(MySQL5.5以上の環境)


:::note info
文字コードがutf8に設定されている場合は、4バイトの絵文字は保存できません。
:::

## すでにテーブルがある場合に4バイトの絵文字を使えるようにする方法
文字コードを `utf8mb4` に設定する。

#### 現在のテーブルの文字コードの設定を確認する方法
```
show テーブル名 like "chara%";
```

#### テーブルの文字コードの設定を変更する方法
```
alter table テーブル名 default character set utf8mb4;
```
　
## これからテーブルを場合に4バイトの絵文字を使えるようにする方法
テーブル作成の際に、`DEFAULT CHARSET=utf8mb4` を設定する。
```:例
CREATE TABLE hoge_table (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
hoge_id int(10) unsigned NOT NULL,
hoge text,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 comment='ほげほげ';
```

`DEFAULT CHARSET`
テーブル全体に文字コードを指定するオプション。

テーブル作成について
https://qiita.com/marukome/items/1e359bdc2a91f52bf875
Next.jsで配列内のJSONデータで必要な部分のみ出力したい


## はじめに
もっと良い方法があるかもしれないですが、調べた中で上手くいったコードをメモがてら記載

## コード

```index.js
const [qiita, setQiita] = useState('');
const fetchQiita = async () => {
  // データを取得
  const response = await fetch(`/api/qiita?query=${keyword}`);
  let qiita = await response.json();
　// 配列を1つ出力して別の変数に格納
  const listQiita = qiita.map(article => 
    <>
      <li><a href={article.url} target="_blank" rel="noopener noreferrer">{article.title}</a></li>
      <li>{article.body}</li>
    </>
  );
　// useStateの変数にセットする
  setQiita(listQiita);
};
---
// 以下{qiita}で画面に出力する
<div>
  <ul>
    {qiita}
  </ul>
</div>
```

## 参考

https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF
【超簡単】Next.jsでBasic認証を導入してみた


## はじめに
Next.jsでBasic認証を導入しようと思いましたが、TypeScriptで記載されたサンプルしか見つけられなかったため、JavaScript版を作成しました。

## Next.jsでBasic認証を導入する方法

以下を`pages`フォルダ配下に作成する

```<project-root>/pages/_middleware.js
import { NextRequest, NextResponse } from 'next/server'

export function middleware(req) {
  const basicAuth = req.headers.get('authorization')

  if (basicAuth) {
    const auth = basicAuth.split(' ')[1]
    const [user, pwd] = Buffer.from(auth, 'base64').toString().split(':')
    if (user === process.env.NEXT_PUBLIC_USER && pwd === process.env.NEXT_PUBLIC_PASS) {
      return NextResponse.next()
    }
  }

  return new Response('Auth required', {
    status: 401,
    headers: {
      'WWW-Authenticate': 'Basic realm="Secure Area"',
    },
  })
}
```

Buffer.fromでエラーが出た場合は、以下コマンドでbufferを導入する
```bash
npm install buffer
```

ユーザ名やパスワードは環境変数で定義する

```<project-root>.env.local
NEXT_PUBLIC_USER=hoge
NEXT_PUBLIC_PASS=fuga
```

## 検証

環境変数を更新したので、サーバを再起動する
```bash
npm run dev
```

npm run devでpackage.jsonに記載の`next dev`が動作する

```package.json
{
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "buffer": "^6.0.3",
    "next": "latest",
    "react": "17.0.2",
    "react-dom": "17.0.2"
  }
}
```

http://localhost:3000 にアクセスすると、ベーシック認証画面が表示される。
ユーザ名にhoge, パスワードにfugaと入れると認証される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/269a76db-4bc3-e8e0-5774-a34fc5a6b7a2.png)

キャンセルを押下すると、以下のAuth requiredが表示される。
この文言は`_middleware.js`で変更できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/a6f04650-56ef-9342-207c-99eb1eed0eb7.png)



## 参考
https://github.com/vercel/examples/tree/main/edge-functions/basic-auth-password
https://tech.012grp.co.jp/entry/2021/11/08/083809
https://stackoverflow.com/questions/70169772/how-to-unprotect-route-in-next-js-middleware
VPSとWireguardとnginxで自宅サーバーをポート開放せずに公開する

## 何がしたいか
タイトルの通りです。ポート開放ができない環境の方やオリジンのIPを晒したくない人、事情によってCloudflareが使えないがIPを隠したい場合などにオススメです。

## 全体図
```
インターネット ↔ VPS ↔ [Wireguard] ↔ 自宅サーバー
```
## 事前準備
予め自宅サーバーの80番ポートでサイトが動いていることが前提です。

### 必要パッケージのインストール
以下のパッケージを双方のサーバーに入れてください。
・nginx
・wireguard

### Wireguardの設定生成
Wireguardの設定を生成するサイトがあるのでそれを使ってWireguardの設定を準備します。
https://www.wireguardconfig.com/

"Endpoint"をVPSのIPアドレスに、"Number of Clients"を1に設定します。複数の自宅サーバーを繋げたい場合はその数に設定してください。
"Use Pre-Shared Keys (Enhanced Security)"という欄がありますがオンにするとセキュリティが向上するのでオンにすると良いかもしれません。

設定が終わったら生成ボタンで設定を生成します。
**この設定ファイルには通信の暗号化に使う秘密鍵が含まれます。取り扱いには十分注意しましょう。くれぐれも暗号化されてないFTPなんかで飛ばさないでください。**

## Wireguardの設定

### Wireguard準備

#### VPS側
お好みのエディターで`/etc/wireguard/wg0.conf`を開きます。先程生成した設定に "Server" と "Client1" があると思います。（というか無かったらどこかで間違えてます）

VPS側ではこの "Server" の方をコピペしてください。これで完了ですと言いたいところですがこれだと不足があるので以下のように追記してください。

```
[Interface]
... (略)
Table = off [←これを追加する]


[Peer]
... (略)
PersistentKeepAlive = 30 [←これも追加する]
```

`Table = off`を設定しないとデフォルトルートの設定が面倒なことになり下手するとネットに繋がらなくなります。
`PersistentKeepAlive`はその名の通り切断されないようにするための設定です。

#### 自宅サーバー側
先ほどと同じくお好みのエディターで`/etc/wireguard/wg0.conf`を開きます。今度は先程生成した設定の "Client1" の方を貼り付けてください。
VPS側と同じく以下のように追記してください。

```
[Interface]
... (略)
Table = off [←これを追加する]


[Peer]
... (略)
PersistentKeepAlive = 30 [←これも追加する]
```

### ファイアウォール設定
VPS側で設定生成時に指定したWireguardのポート（デフォルトは51820）を開けてください。忘れると原因探すのに苦労します。

### 有効化
基本的にsystemdを使って管理することを推奨
`sudo systemctl enable --now wg-quick@wg0`

### テスト
VPS側から`ping 10.0.0.2`、自宅サーバー側から`ping 10.0.0.1`を実行して返ってきたら成功です。

## nginxの設定
VPSへのリクエストを自宅サーバーにパススルーします。ファイアウォールの設定は各自適切に行ってください。ただし不要なポートを開けるのは禁物です。

お好みのエディターで`/etc/nginx/nginx.conf`を開きます。

`http`設定の上に以下の`stream`設定を追記します。

```
stream {

  server {
    listen     443;
    proxy_pass 10.0.0.2:443;
  }

  server {
    listen     80;
    proxy_pass 10.0.0.2:80;
  }

}
```
もし443と80以外で使いたいポートがあるなら適当に追加してください。

##### 追記:
書くのを忘れてました.... 
以下の行を必ずコメントアウトしましょう。
```
include /etc/nginx/sites-enabled/*;
```


最終的にこんな感じになればokです。
```
events {
  ...(略)
}

stream {
  ...(略)
}


http {
  ...(略)
}

```

最後に`sudo nginx -s reload`で設定を反映しましょう。


ブラウザからVPSのIPにアクセスして自宅サーバーのサイトに繋がったら成功です。お疲れ様でした。
HTTPS化する場合は自宅サーバー側でcertbotを使って設定してください。ここでは詳しい手順は解説しませんがセキュリティとプライバシーの観点からHTTPS化することを強く推奨します。
formタグのbutton要素をクリックするとsubmitされる理由

## 結論
「buttonタグ」のtype属性の初期値が `submit` だからです。

## 詳細
下記のコードは同じになるというわけです。
```html:
<button>ボタン</button>
<button type="submit">ボタン</button>
```
- 1行目のコードに関しては、「buttonタグ」のtype属性の初期値は `submit` なので、このボタンをクリックすると `submit` のイベントが発火します。
- formタグで `type="submit"` が指定してある「button」要素をクリックすると、`submit` のイベントが発火します。

## submitを発火させたくない場合
```html:
<button type="button">ボタン</button>
```
上記のコードだと、ボタンをクリックしても `submit` のイベントは発火しません。

------------------------------------------
以下のサイトを参考にさせていただきました。
- https://zenn.dev/phi/articles/form-submit-button-type-default
今週の学び　第6回

# 今週の学び


JavaScriptなど

- sort()で()内に何も入れない時どうなるか
    - 何もなければ a - b になる

- reduceメソッド
    - 配列のそれぞれの要素に対して順番通りに、ユーザーが提供した「縮小」コールバック関数を呼び出す
    その際、直前の要素における計算結果の返値を渡す
- alert()
    - Webサイト側からメッセージが表示される機能

- Math.floor
    - 対象の値の小数点以下を切り捨てた値を取得する

- 商の余り
    - %

- value属性
    - HTML要素のvalue属性の値を操作したり、値を参照したりできるプロパティ

jQueryなど

- eqメソッド
    - jQueryオブジェクトの中からeqの引数の数字と同じインデックス番号の要素を取得できる

- prevメソッド
    - jQueryオブジェクトの兄弟要素（同じ階層の要素）の中から1つ前の要素を取得する

- nextメソッド
    - jQueryオブジェクトの兄弟要素（同じ階層の要素）の中から1つ後ろの要素を取得する

- textメソッド
    - 引数に指定した文字列を要素に「セット」するメソッドだが、引数を指定せずに用いることで要素内の文字列を「ゲット（取得）」することができる

- htmlメソッド, cssメソッド
    - jQueryで値をセットするメソッドは大抵ゲットにも使うことができる
    htmlメソッドとcssメソッドもゲットとして使うことができる

- attrメソッド
    - HTMLの属性
    「ゲット」と「セット」ができ、例えばattr('id', 'title')のように第一引数に属性名、第二引数にその属性値を指定することで属性をセットすることができる
    第二引数を指定しない場合は、その属性の値を取得する

- submitイベント
    - 送信ボタンがクリックされたときだけでなく「Enter」キーでフォームが送信された場合もイベントが発生する

- selectタグ
    - 選択肢式のセレクトボックスを作ることができる
    selectタグとoptionタグからなり、各optionタグが選択肢になる
    selectタグはvalメソッドによって選択中の値（optionタグのvalue属性の値）を取得できる

- カスタムデータ属性
    - 属性は自分でつくることもできる
    これをカスタムデータ属性といい、「data-」から始まる属性名を自由に設定できる

- animateメソッド
    - アニメーションをつける

- scrollTopメソッド
    - $('html, body').scrollTop(値); のように指定し、ページ最上部から値pxの位置に移動することができる
    scrollTopは通常$('html, body')に対して用いる

- $( )内のドットを付ける時
    - 中身が、タグ→何もなし、クラス→ドット、ID→#となる

- jqueryの読み込み
    - head内に<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    bodyの終了間際に<script src="script.js"></script>を入れる

ITパスポートなど

- RFID
    - 電波を用いてRFタグのデータを非接触で読み書きするシステム

- 10進数を2進数にする方法
    - 変換したい10進数を商が0になるまで2で割りつづけ商と余りを求めればよい

- 情報世界の接頭語
    - 10の−9乗　n ナノ(nano)　、　10の9乗　G　ギガ(giga)　など

- クロック数
    - クロック数はクロック周波数とも呼ばれ、CPUが処理を行う際に発する信号を扱う速さで「Hz（ヘルツ）」という単位で表される
    この数値が高いと同じ時間内により多くの処理を行うことができる

- GPU
    - Graphics Processing Unitの略で、3Dグラフィックスを描画する際に必要な計算処理を行う半導体チップのこと

- デュアルコアプロセッサ
    - 一つの半導体パッケージにマイクロプロセッサ（MPU/CPU）の演算・処理回路であるプロセッサコアを2つ集積し、それぞれ独立に稼働させることができるもの

- ブラックボックステスト
    - システムの内部構造は考慮せず、仕様を満たしているかどうかのみを検証するテスト技法のことを指し、主に複数のプログラムが組み合わさった機能テストやシステムテストで使われる

- 管理図
    - 工程の状態や品質を時系列に表した図であり、工程が安定した状態にあるかどうかを判断するために用いる

- オブジェクト指向
    - コンピュータプログラムの設計や実装についての考え方の一つで、互いに密接に関連するデータと手続き（処理手順）をオブジェクト（object）と呼ばれる一つのまとまりとして定義し、様々なオブジェクトを組み合わせて関連性や相互作用を記述していくことによりシステム全体を構築していく手法

- WBS
    - Work Breakdown Structureの略で「作業分解構成図」とも呼ばれる
    プロジェクトのスケジュール管理に使われるツールの1つで、作業工程を細かな作業（Work）に分解（Breakdown）し、構造化（Structure）することで管理する手法

- アダプティブラーニング
    - 一人ひとりに最適な学習内容を提供して、より効率的に学習を進める方法のこと

# まとめ

覚えることはどんどん増えてくるが、1つずつ忘れないように覚えていく
webアプリの実装

# 連想力トレーニングwebアプリを作成してみました。
言葉を見聞きしたときに、別の言葉を思い浮かべる連想力は会話などで役に立ちます。
また、ボケに対してツッコミをする際にも連想力があるとキレが良いでしょう。
例えば、スベった人に対して、スベる→心が痛い→傷ができる→マキロンいっぱい必要なやつですよ！
のような感じで。
言葉から言葉を連想するトレーニングをwebで行えるように、webアプリケーショを実装しました。

## 環境など
開発言語はPython、フレームワークはDjangoを使用しました。
クラウド環境としてAWS-ec2にデプロイしました。
Class based Viewを基本として、最低限必要な機能のみを実装しました。

なお、今回の実装は以下の教材を元にして行いました。
・動かして学ぶPython開発入門第2版
・Udemy (Python + Django3 Djangoを基礎から応用まで、アプリケーション開発マスターpython付き)

## webアプリの機能
・ログイン機能
・CRUDのうちCRD機能(データの更新は前提としていないので未実装)
・DBはPostgresql
・日毎に連想した単語数をグラフ化
・タイマー機能

## 使用した技術、知識
python
pycharm
Django(class based view)
git
postgresql
AWS(EC2)
Gunicorn
Nginx

## 完成
![スクリーンショット 2022-05-09 11.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692393/32d6e5f8-3649-2bd9-bf77-add0ffcad856.png)
5.8 (標準) 確率収束1 マルコフの不等式

## 方針

確率収束を示す時は，大数法則を使うか定義通り計算するかのいずれか．定義通り計算する際はマルコフの不等式が足がかりになる．

## 答案

![5.-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/88681303-a31d-bf4b-819d-6e1ff4a108fe.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
RailwayでDiscord Botをホストしてみた

[Railway](https://railway.app)というサービスでDiscord Botをホストしてみました。
![](https://storage.googleapis.com/zenn-user-upload/e9339eadd5cc-20220522.png)

# 登録
メール、またはGitHub連携で登録するようです。
Loginが登録も兼ねてるのが地味に判りづらい。
![](https://storage.googleapis.com/zenn-user-upload/669433216a8f-20220522.png)

# デプロイ
![](https://storage.googleapis.com/zenn-user-upload/1057a5c7cbad-20220522.png)
[Dashboard](https://railway.app/dashboard)に飛び、`New Project`ボタンを押します。
<br>
![](https://storage.googleapis.com/zenn-user-upload/4c9e45e9f644-20220522.png)
GitHub連携でユーザーのリポからデプロイできるので、今回はそれでデプロイします。
https://github.com/sevenc-nanashi/BCDice4d
<br>
![](https://storage.googleapis.com/zenn-user-upload/3e02e798bd55-20220522.png)
リポの名前を入れると良い感じに候補で出してくれました。
<br>
![](https://storage.googleapis.com/zenn-user-upload/ec0d873e0059-20220522.png)
環境変数を設定する必要があるので`Add variables`で進めます。
<br>
![](https://storage.googleapis.com/zenn-user-upload/0c91769849ea-20220522.png)
環境変数を設定する画面に進みました。この時、`.env.sample`があると良い感じに追加候補で出してくれます。
<br>
![](https://storage.googleapis.com/zenn-user-upload/6dc2e708362e-20220522.png)
登録したら、Settingsで開始コマンドを設定します。（[`Procfile`があるとそれを認識するようです。](https://docs.railway.app/deploy/builds)）再デプロイを待てば完了です。

# 動かしてみて
楽。Herokuからの乗り換えとして良い感じかも知れません。

また、1つのシンプルなBotだと月0.25＄ほどで、無料枠が5＄（クレカ登録で10＄まで、ただし使いすぎると請求される）なので単純計算で無料で12個くらいホストできる計算になります。
<br>

![](https://storage.googleapis.com/zenn-user-upload/855fcaba4107-20220522.png)

ちなみにPricingにDiscord Botが3$と書いてありますが、PostgresやRedisも入っているのであまり参考にならないかも。

# 最後に
Procfileを読み込んでくれる上、[DBクライアントも提供している](https://docs.railway.app/databases/database-view)ので、Herokuから乗り換えても良いかもしれません。
最後まで読んで下さりありがとうございました。

## ちなみに

この記事の[Bot(BCDice4d)](https://github.com/sevenc-nanashi/BCDice4d)は[discorb](https://github.com/discorb-lib/discorb)で作られています。使って下さると喜びます（バグ報告も）。
cscの作法 その166

# 概要
cscの作法、調べてみた。
mikovm、やってみた。

# 参考にしたページ

https://qiita.com/stk2k/items/d258c50edc08bf5df80f

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc miko.cs

```

# 結果

```
>miko
T_VARIABLE(a)
T_EQUAL(=)
T_EXPRESSION(3 + 1)
T_END_OF_STATEMENT(;)
T_PRINT(print)
T_VARIABLE(a)
T_END_OF_STATEMENT(;)

>
```

以上。
IntelliJ IDEAショートカットまとめ

## 初めに
仕事でIntelliJ IDEA 2022.1 を使うようになったので、ショートカット情報をまとめました。Udemyの
[実践 IntelliJ：高速な Java 開発を実現するための実践的なテクニックを学ぼう](https://www.udemy.com/course/poco-tech-intellij/)を受講したので、その中で紹介されていたショートカットの中から、個人的にこれ覚えたいなと思ったものを中心に記載しています。

※誤記等あれば、指摘いただけると幸いです。

## 目次
- [環境](#環境)
- [ショートカット](#ショートカット)
   - [編集](#編集)
   - [移動](#移動)  
   - [検索](#検索)  
- [参考情報](#参考情報)

## 環境
- IntelliJ IDEA 2022.1 (Ultimate Edition)
- Windows10
※Macのコマンドも記載していますが、実際に試していないのでミスがあるかもしれません

## ショートカット
自分がよく利用するなとおもったものショートカットは優先度を高としています。

### 編集
|Windows|Mac|意味|優先度|
|:--|:--|:--|:---:|
|Ctrl + /|Cmd + /|コメントアウト(※1)|高|
|Ctrl + Shift + /|Cmd + Shift + /|行またはコードブロックをコメントアウト||
|Ctrl + Y|Cmd + delete|行の削除|高|
|Ctrl + C(※2)|Cmd + C|行のコピー|高|
|Ctrl + D|Cmd + D|行の複製|高|
|Ctrl + Shift + ↑(↓)|Cmd + Shift + ↑(↓)|行の移動|高|
|Alt + Shift + クリック|Opt + Shift + クリック|マルチカーソル|高|
|Ctrlを離さず2回 + ↑(↓)|Optを離さず2回 + ↑(↓)|マルチカーソル||
|Alt + j|Cmd + j|マルチカーソル(同じ単語)||
|Ctrl + P|Cmd + P|パラメータ情報を表示||
|Ctrl + Alt+ L|Opt + Cmd + L|パラメータ情報を表示||

(※1)連打で複数コメントアウト可能
(※2)何も選択していない状態に押すと行全体がコピーされる

### 移動
|Windows|Mac|意味|優先度|
|:---|:---|:---|:---:|
|Ctrl + G|Cmd + L|行番を指定して移動|高|
|Ctrl + E|Cmd + E|最近開いたファイル||
|Ctrl + E を2回|Cmd + E を2回|最近編集したファイル||
|Ctrl + B|Cmd + B|定義・呼び出し個所に移動|高|
|Ctrl + Alt + ←|Cmd + [|定義・呼び出し個所から戻る|高|
|Ctrl + Shift + T|Shift + Cmd + T[|テスト対象クラスに移動||

### 検索
|Windows|Mac|意味|優先度|
|:--|:--|:--|:---:|
|Shift を2回|Shift を2回|なんでも検索|高|
|Ctrl + F|Cmd + F|ファイル内検索|高|
|Ctrl + N|Cmd + O|クラス検索||
|Ctrl + Shift + N|Cmd + Shift + O|ファイル検索||

## 参考情報
- [実践 IntelliJ：高速な Java 開発を実現するための実践的なテクニックを学ぼう](https://www.udemy.com/course/poco-tech-intellij/)
- [IntelliJ 公式ショートカット一覧 (日本語版) Windows/Linux](https://pleiades.io/sites/willbrains.jp/keymap/pdf/shortcut_intellij_windows.pdf)
- [IntelliJ 公式ショートカット一覧 (日本語版) Mac](https://pleiades.io/sites/willbrains.jp/keymap/pdf/shortcut_intellij_mac.pdf)
PHP　絵文字を削除

## 用途
PHPで絵文字を削除したいときに使う。
データベースに絵文字を保存したくない時などに、あらかじめ値から絵文字を削除したい時などに使う。

:::note info
4バイトの絵文字を削除するものです。（3バイトの絵文字は今回のコードでは削除できません）
:::

## 使用方法
```php:4バイトの絵文字を削除
preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $hoge);
```
第1引数 → 4バイトの絵文字の正規表現
第2引数 → 空にするためにクオーテーションのみ
第3引数 → 対象の値
5.7 (標準) マルコフの不等式2

## 方針

5.6と一緒．

## 答案

![5.-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a1311705-9633-10a6-c1b3-ea11c4b1f673.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Microsoft Certified: Azure Fundamentals (AZ-900) 合格体験記

# はじめに
Azureの資格を初めて取得したので簡単に記録を残しておきます。

# Azure Fundamentals (AZ-900)とは
https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900

名前の通り、Azureの基礎に関しての知識を問う入門資格。
内容は以下の構成。

- Describe cloud concepts (25–30%)
- Describe Azure architecture and services (35–40%)
- Describe Azure management and governance (30–35%)

5月5日に英語版の試験内容が変更されたので注意。SLAに関する問題などがなくなり、少しシンプルになったようです。

# 個人的バックグラウンド
[OCIの記事](https://qiita.com/tkuribayashi/items/f17dc8a321766caa0e4d)、[GCPの記事](https://qiita.com/tkuribayashi/items/573f675b78be67bda549)で書いたとおり。

Azureはアプリケーション開発者として1年少々利用していますが、たまにポータルを見て特定の操作を行ったりするくらいで、知識としてはとても狭い範囲でしか持っていない状態でした。

# 学習方法
[公式サイト](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900?tab=tab-learning-paths)の下部にあるLearning pathの動画を流し見ました。
OCIやGCPの動画と違って、倍速再生ができないのが非常に不便で時間の無駄……。

一通り学習を終えたら、[esi.microsoft.com](https://esi.microsoft.com/)の模擬試験を実施。こちらは、所属の企業や教育機関などがMicrosoftと提携している場合に使えるようになっているようです。
150問前後の模擬試験問題セットの中から毎回ランダムに40数問出されるので、何度も繰り返して答えを全部覚える勢いで学習します。間違った問題、迷った問題があれば、その度に検索して知識の補填を行えばより効果的。
出題形式(操作方法)も本番とかなり近いので、非常に効果的な学習方法でした。
5月初めの試験内容変更にも、数日以内に追従していたようです。

# 試験
公式サイトからリンクをたどって申し込み。今回はテストセンターでの受験としました。
試験会場には15分前には着いて、本人確認や写真撮影などを受付で行い、その後入室して受験という形です。
身分証明書を忘れたりしなければ、自宅などの遠隔試験よりも楽に受けられると思います。

# 結果&所感
35問45分の試験で、700点が合格ラインのところ、835点で合格。所要時間は20分弱程度でした。
終わった瞬間に画面上で合否が出て、更にテストセンターで結果の紙も印刷して渡してもらえるので安心です。紙は要らないが……。
問題の性質というか、訊かれるポイントが妙に細かくてOCI FundamentalsやGoogle Cloud Digital Leaderよりも無駄に難しく感じましたが、結果的に、ちゃんとキーとなる概念を押さえておけば問題はないレベル感だと思います。

# 今後
迷っているところ。とりあえず実務ではまだしばらくAzureに関わることになりそうなので、AI or Data Fundamentals (AI-900/DP-900)を受けるか、Associateレベルを受けるか。
あるいはGCPもそろそろ触りそうなので、ACEもありかなと。
AWSについてはほぼ素人なので、とりあえずCloud Practitionerを取っておくという選択肢もあり。
一旦、情報処理安全確保支援士の講習をこなし、秋口までの忙しい時期を乗り切ってから考えようと思っています。
JavaScript　セッションに保存・取得

## 用途
JavaScriptでセッションに値を保存したい時、値を取得したい時に使う。

## 使用方法
### 保存方法
```js:
sessionStorage.setItem('hoge','保存したい値');
```
第1引数 → セッションの名前を自分で決める
第2引数 → 保存したい値や文字列を入力する

### 取得方法
```js:
sessionStorage.getItem('hoge');
```
引数に保存した際に決めた名前を入力する

### 保存した特定のデータを削除する方法
```js:
sessionStorage.removeItem('hoge');
```
引数に保存した際に決めた名前を入力する

### 保存したすべてのデータを削除する方法
```js:
sessionStorage.clear();
```
JavaScript　未入力または改行・空白のみの場合に空文字判定

## 用途
textarea などで空白や改行のみが入力された際に、空文字判定にしたい時に使用する。

## 方法
```js:
var hoge = $('#hoge').val(); // idがhogeのtextareaの値を取得
if (hoge.trim() === '') {
  // 未入力または改行・空白のみの場合の処理を書く
}
```
`trim()`
対象文字列の両端の空白（スペースやタブ、改行）を削除します。
（コメントでご指摘をいただき追記しました。）

:::note info
Internet Explorer９未満のバージョンではtrimに対応していません。
他の書き方については下記をご覧ください。
:::

### 空白や改行のみの場合に空文字判定
```js:
var hoge = $('#hoge').val(); // idがhogeのtextareaの値を取得
if (!hoge.match(/\S/g)) {
  // 改行・空白のみの場合の処理を書く
}
```
`!hoge.match(/\S/g)` で「改行・空白のみの場合に空文字判定」ができます。

### 何も入力されていない、または空白や改行のみの場合に空文字判定
```js:
var hoge = $('#hoge').val(); // idがhogeのtextareaの値を取得
if (hoge === "" || !hoge.match(/\S/g)) {
  // 未入力または改行・空白のみの場合の処理を書く
}
```
`hoge === "" || !hoge.match(/\S/g)` で「未入力または改行・空白のみの場合に空文字判定」ができます。
5.6 (標準) マルコフの不等式1

## 方針

マルコフの不等式の証明はいくつかコツがいるが，非負確率変数について成り立つ不等式の証明問題は大体似たような方法になるので理解しておく．(2)を解くことで「非負」でないと成り立たない理由に敏感になれる．

![5.-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/6a280cf1-ce22-6022-b336-4971a4cbf61a.jpeg)

## 答案

![5.-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/f7899883-eb6c-859c-fcae-84ecb544687a.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
TypeScriptのBarrel(バレル)パターンてなに？

バレルパターンというファイルの管理の仕方がTypeSctiptにあるようです。
[TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/main-1/barrel)

- Barrelの意味：樽
  - [参考](https://ejje.weblio.jp/content/barrel)

## 従来のモジュールのimportの仕方
3つのモジュールをimport
```typescript:demo/fizz.ts
const Fizz = () => {
  console.log('Fizz')
}
export Fizz
```

```typescript:demo/buzz.ts
const Buzz = () => {
  console.log('Buzz')
}
export Buzz
```

```typescript:demo/fizzbuzz.ts
const FizzBuzz = () => {
  console.log('FizzBuzz')
}
export FizzBuzz
```

importする文が3つ必要になる
→これを1つにまとめることができるのがBarrelパターン
```typescript:demofile.ts(Barrelパターン前）
import { Fizz } from '../demo/fizz'
import { Buzz } from '../demo/buzz'
import { FizzBuzz } from '../demo/fizzbuzz'
```

そのために必要なindexファイルを作成
```typescript:demo/index.ts
export * from './fizz'; 
export * from './buzz'; 
export * from './fizzbuzz'; 
export FizzBuzz
```

1つのファイルからimport
```typescript:demofile.ts(Barrelパターン後)
// ../demo/indexのindexは省略することが可能
import { Foo, Bar, Baz } from '../demo';
```
aタグ　リンクを無効化　js　javascript:void(0)

## 用途
「aタグ」をクリックした際にリンクの処理を無効化したい時に使う。
onClick での処理は行いたいけど、ページ遷移はさせたくない時に使う。

## 使用方法
```html:書き方
<a href="javascript:void(0)">文字</a>
```
`href="javascript:void(0)"` とすることで、リンク処理を無効化し、ページ遷移しなくなります。
ブラウザ依存はありますが主要ブラウザでは動きます。
1点注意点があり、リンクにカーソルを合わせると `javascript:void(0)` と表示されてしまいます。

## その他
```html:書き方
<a href="#">文字</a>
```
上記の方法でもページ遷移されませんが、ページ内でのリンクが発生してしまいます。
ホバー効果があるまま「aタグ」が使えます。
「現時点ではリンク先が未定で、今後ここにリンクが入る」という意味で使ったり、一旦作業を進めるためなどに使います。