OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL:平文形式でバックアップをとる方法

# 概要
データベース名examdbのcustomerテーブルのバックアップファイル作成し、そのバックアップファイルからリストアする。


# 手順 
```bash

# 前準備 ログインとpostgres起動
su - postgres
pg_ctl start -D /home/postgres/data

# データベースとテーブルを作成する。
createdb examdb
psql -d examdb -f /home/postgres/ch6/1-plainbackup/create.sql
psql -d examdb -f /home/postgres/ch6/1-plainbackup/select.sql
 name  | age 
-------+-----
 aiue  |  30
 abcd  |  29
(2 rows)

# バックアップファイルを作成する
pg_dump -f /home/postgres/ch6/1-plainbackup/examdb.sql examdb

# データベースとテーブルを削除する
dropdb examdb

# examdb.sqlで復元する
createdb examdb
psql -f /home/postgres/ch6/1-plainbackup/examdb.sql examdb
psql -d examdb -f /home/postgres/ch6/1-plainbackup/select.sql
 name  | age 
-------+-----
 aiue  |  30
 abcd  |  29

```


# スクリプト

## create.sql
```sql
-- /home/postgres/ch6/1-plainbackup/create.sql
--テーブルの追加と適当にデータを追加する。
CREATE TABLE customer(
name CHAR(5) NOT NULL,
age INTEGER NOT NULL);

INSERT INTO customer(name,age) VALUES('aiue',30);
INSERT INTO customer(name,age) VALUES('abcd',29);
```

## select.sql

```sql

-- /home/postgres/ch6/1-plainbackup/select.sql
--テーブルとデータが存在するか確認する。
SELECT * FROM customer;
```

## examdb.sql

```sql
-- /home/postgres/ch6/1-plainbackup/examdb.sql
-- 以下コマンド実行した時の出力ファイル
--pg_dump -f /home/postgres/ch6/1-plainbackup/examdb.sql examdb

--
-- PostgreSQL database dump
--

-- Dumped from database version 14.6
-- Dumped by pg_dump version 14.6

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- Name: customer; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.customer (
    name character(5) NOT NULL,
    age integer NOT NULL
);


ALTER TABLE public.customer OWNER TO postgres;

--
-- Data for Name: customer; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.customer (name, age) FROM stdin;
aiue 	30
abcd 	29
\.


--
-- PostgreSQL database dump complete
--

```


# 参考
OSS教科書 OSS-DB Silver Ver.3.0対応
p132
コールバック関数とは

## コールバック関数とは

コールバック関数は、ある関数が実行された後に呼び出される関数です。

通常、**他の関数に引数**として渡されます。

また、コールバック関数の範囲よりも、外側の関数から呼び出されます。
> 【引用：MDN】
> コールバック関数とは、**引数として他の関数**に渡され、**外側の関数の中**で呼び出されて、何らかのルーチンやアクションを完了させる関数のことです。

```jsx
// コールバック関数
function greeting(name) {
  alert('Hello ' + name);
}

// コールバック関数を受け取り、処理の最後でコールバック関数を実行する。
function processUserInput(callback) {
  var name = prompt('Please enter your name.');
  callback(name);
}

//* ほかの関数を呼びだす際に、その関数の引数として渡される。
// よく使われる方法として、その関数の処理が終わった後に、コールバック関数が実行される
/* 結果的に、他の関数が実行された後に、半自動で実行される関数といえる
processUserInput(greeting);

```

## コールバック関数の種類
コールバック関数には、同期型と非同期型の２種類があります。

### 同期型

配列の繰り返しや並び替え時など、すぐに結果を見たい場合に使用。

同期とは、上から下に、順番に行っていく処理です。

例えば、`foreach`, `map`, `filter`, `sort`で使用します。

```jsx
//before → number　→ afterの順番で出力される。
const numbers = [1, 2, 3, 4];

console.log('before')
// numbers.forEachが関数。numbers.forEachの引数がコールバック関数。
numbers.forEach((number) => {
	console.log(number)
}

// console.log('number')のあとに実行される
console.log('after')
```

### 非同期型

ファイルの読み書き、ネットワークリクエストなど、待ち時間が起こる処理で使用。

非同期とは、同時並行で行う処理。
```JavaScript
// Before→After→Set Timeoutの順で実行される
// １秒後にSet Timeoutが表示されるので、先にAfterが表示される。
console.log('Before');

/*
*1秒後にSet Timeoutと表示する関数。
*１秒後に処理が行われるため、Afterが出力された後に実行される。
*/
setTimeout(() => {
  console.log('Set Timeout');
}, 1000);

console.log('After');
```
Requiring unknown module "134"の治し方

リアクトネイティブで発生した
下記エラーの治し方

Requiring unknown module "134". If you are sure the module exists, try restarting Metro. You may also want to run yarn' or "npm install".
Requiring unknown module "134". If you are sure also want to run yaty or arin eti. You may Error: Requiring unknown module "134". If you are
sure the module exists, try restarting metro. tou may also want to run "yam" or "npm install'. at unknownModuleError (http:/10.0.2.2:8081 /index.bundle/&platform=android&dev=true& minity=falseBapp=com.obenkyou@modulesDnly=
・・・(以下略)

npm installしろって出ていますが、実行した結果下記ログが出る

ユーザー名@ユーザー名shinoMacBook-Pro Obenkyou % npm start

> Obenkyou@1.0.0 start
> expo start --dev-client

Starting project at /Users/ユーザー名/Obenkyou
› Port 8081 is running this app in another window
  /Users/ユーザー名/Obenkyou (pid 34576)
✔ Use port 8082 instead? 

ここでYes(y)を選択しても治らない

nを選択して、ポート８０８１を停止

killall node

その後、npm installを再実施

直った
チャットGPTに理由を聞いたら、以下が原因らしい

エラーが解決した理由について、以下の要因が考えられます：

ポートの競合: 別のNode.jsプロセスがポート8081を使用していた可能性があります。killall nodeコマンドを使用することで、他のNode.jsプロセスが終了し、ポートが解放されたと思われます。

キャッシュの問題: Metro Bundlerやその他のパッケージがキャッシュされている場合、一部の変更が反映されずにエラーが発生することがあります。Node.jsプロセスを終了して新しいプロジェクトを起動することで、キャッシュがクリアされ、問題が解決される可能性があります。

依存関係の問題: プロジェクトの依存関係に問題がある場合、再起動することで解決されることがあります。npm installコマンドを実行したことで、依存関係が再インストールされ、問題が解消された可能性があります。

これらの要因のいずれか、または複数がエラーの解決に貢献した可能性があります。
【Excel】個人用マクロブックの作り方

## 前置き
どのブックでも同じマクロが使いたいなぁと思う時がある。

マクロ用ブック(xlsm)を作成して開いておけばマクロを使用できますが、
いちいち開かないといけないのが面倒だったり、あの時作ったマクロ用ブックどこに格納したっけ？と迷子になったり・・。

なんかいい方法ないかな～と見つけたのが、個人用マクロブック。


## 概要
自身で作成する必要がありますが、個人用マクロブックを作成しておくことで、
どのブックでも個人用マクロブック内のマクロが使用できるようになる。


## 個人用マクロブックファイルの新規作成方法

> ①開発タブ ＞ マクロの記録をクリック
![t1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/aef469c2-2e76-a211-297a-6f51ee3a27a5.png)
>②マクロの保存先を個人用マクロ ブックを選び、OKボタンを押下
![t2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/e0473f21-3c05-2f2e-787f-1c1cc525f503.png)
> ③開発タブ ＞ 記録終了をクリック
![t3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/e658054e-5188-6e6c-c4ac-a109a46fc8b0.png)
> ④開発タブ ＞ Visual Basicで開く
すると、VBAProject (PERSONAL.XLSB)が増えてModule 1に記録したマクロが記載されている。
そして、PERSONAL.XLSBの上書き保存をすると次回から裏側で呼び出されるようになる。
![t4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/722bda7f-e3f1-3469-61b8-c4c2544d7ea8.png)

## 使用例
便利マクロやユーザ―関数、ショートカットにセットするマクロなど
ライブラリとして使用。
![t6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/d854d310-bfe9-2c58-2ced-b36b0641ca4d.png)

- Ut_Func
エクセルのユーザー関数として使用するマクロの格納場所
- Ut_Menu
右クリックに追加する機能を記載するマクロの格納場所
- Ut_ShortCut
ショートカットにより起動するマクロ、エクセルのタブに追加するマクロの格納場所
- Ut_Work
お試しマクロを作って動作させるマクロの格納場所

## 最後に

マクロ自体、結構色々できるので、
個人用マクロブックに繰り返し作業や面倒な作業をうまくマクロ化すれば、
自分の作業の一部を肩代わりしてくれる存在になると思います。
how to configure ntp server in windows server 2016.

how to configure ntp server in windows server 2016
Installing the NTP Server Feature
Open Server Manager: Launch Server Manager from the taskbar.
Add Roles and Features: Click on "Add roles and features" from the Dashboard or the Manage menu.
Configuring the NTP Server
Installing the NTP Server Feature:
Click "Next" until you reach the "Features" page.
Select "Time Server" under "Network Time Protocol (NTP) Server".
Click "Next" and then "Install" to install the NTP feature.
Configuring the NTP Server:
Open a PowerShell window with administrative privileges.
Use the following command to enable and start the NTP server service:
text

Enable-WindowsFeature w32time
Start-Service w32time
Configuring Firewall Settings
Open Windows Firewall with Advanced Security: Search for it in the Start menu.

Create an Inbound Rule:

Click on "Inbound Rules" in the left pane.
Click on "New Rule..." in the right pane.
Select "Port" and click "Next".
Select "UDP" and enter "123" as the specific local port. Click "Next".
Select "Allow the connection" and click "Next" through the remaining steps.
Name the rule (e.g., "NTP Inbound Rule") and click "Finish".
Create an Outbound Rule:

Follow the same steps as above, but this time select "Outbound Rules".
Configuring NTP Server Settings
Open Registry Editor: Press Windows key + R, type "regedit", and press Enter.

Navigate to the NTP Server Parameters: Go to
text

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Parameters
.

Edit Registry Values:

Right-click on the right pane, select "New" > "DWORD Value", and create a new value named "NtpServer".
Double-click on "NtpServer" and set its value to "0x9".
Configure NTP Server Peers (Optional):

Add peers by modifying the "NtpServer" value with a comma-separated list of server addresses.
Restart the Windows Time Service:

In the PowerShell window, use the following command:
text

Restart-Service w32time
Verify NTP Server Configuration
Check the NTP Service Status:

In the PowerShell window, use the command:
text

Get-Service w32time
Verify NTP Synchronization:

Use the command w32tm /query /status to verify the synchronization status.
Conclusion
By following these steps, you should be able to configure the NTP server on Windows Server 2016. Don't forget to regularly monitor the server's time synchronization to ensure accurate timekeeping for your network.

visit : https://docs.vultr.com/how-to-set-the-timezone-and-configure-ntp-on-windows-server
sortで日本語がいい感じにソートされない

:::note warn
警告
コメントを受けてGhostBSD(FreeBSD)で確認してみたのですが、GhostBSDでは回避策に書いてあるようなことをしなくても問題なく動作しました。なので、かなり限られた環境での問題である可能性が高いです[^oldmac]。ただ、私の手元（の一部、具体的には新しいMac）で問題が起きているのは事実ですので、記事としては残しておきます。
:::
[^oldmac]: そういえば古いMacでも似たようなことをやったことがあるのですが、その時はこんな問題に悩まされることはありませんでした。

# はじめに
皆さん、ファイルの行を並べ替えるために普段からsortをお使いのことと思います。そこで出会った不可解な現象とその回避策について書きます。

また、恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

# さて困った
sortで英数字の内容のファイルを並べ替えている分にはびっくりすることは起こりません。が、日本語が入ったファイルを相手にすると途端に謎な動作になります。この動作はGNU版（Linuxなら多分こちら）でもBSD版（macOSとかGhostBSD/FreeBSDとか）でも変わりません。例を示します。

以下のようなファイルtest.txtがあるとします。（もちろんファイル名はどうでもいいのですが。）
```
c
aaaaa
bbb
ええ
あああ
いい
う
い
あ
```
これを並べ替えると当然「abc順、あいうえお順に並ぶ」と思いますよね。で、実際にやってみました。
```
$ sort test.txt
aaaaa
bbb
c
あ
い
う
いい
ええ
あああ
```
「a、b、c」、うんうん、あってる、あってる。「あ、い、う」、ん？「い、え、あ」ええ？？？
英語はおかしくないのですが、日本語になると、
- まず文字数の順に整列
- 同じ文字数の中であいうえお順

みたいな動作をしているようです。これはこれで役に立つ場合もあるのですが、普通は文字数に関係なくあいうえお順に並ぶことを期待するのではないでしょうか。

# 回避策
ロケールの設定が影響しているようです。なので以下のようにしましょう。
```
$ LC_COLLATE=C sort test.txt 
aaaaa
bbb
c
あ
あああ
い
いい
う
ええ
```
はい、これで期待した通りに動作しました。

説明は不要かもしれませんが、sortの前の"LC_COLLATE=C"というのは「このsortの時だけ環境変数のLC_COLLATEの値をCにせよ」ということです。ですので、既存の環境には影響を与えません[^newstpg]。
また、LC_COLLATEの代わりにLC_ALLやLANGも使えます。

[^newstpg]: [ナウいMacにとってもナウいPostgreSQLをインストールする](https://qiita.com/koizumistr/items/93dfa6e8d8ec2213ab80)でも使った方法です。だから「（無駄な努力な気がしますが）既存の環境にはできるだけ影響を与えないようにしています。」と書きました。

ちなみに私の環境ではLANG=ja_JP.UTF-8となっていたのが良くなかったようです。（と言われても、この環境変数を変更するとどこまで影響するか怖くて、そんなことはできません。）
Flutterでエラー class AccelerometerReadingValues implements JSObject

久々にビルドしたらFlutterでエラーが出ました。
↓　エラー内容
```
Waiting for connection from debug service on Chrome...
../../../../.pub-cache/hosted/pub.dev/web-0.3.0/lib/src/dom/accelerometer.dart:52:45: Error: The type 'JSObject' can't be used as supertype.
class AccelerometerReadingValues implements JSObject {
                                            ^
                                       
../../../../.pub-cache/hosted/pub.dev/web-0.3.0/lib/src/dom/ambient_light.dart:22:44: Error: The type 'JSObject' can't be used as supertype.
class AmbientLightReadingValues implements JSObject {
                                           ^

以降長いです
```

どうやら web が悪いらしい

# 結論

pubspec.yaml に追記したら治りました。
```
dependencies:

  web: ^0.4.2　←追記

```

# 他にやったこと

- Flutter SDKとDartを最新にアップデート
- AndroidStudio を最新にアップデート
- もちろんflutter clean や flutter doctor

他にネットで出てきた対処法
- flutter pub upgrade web を実行
- pubspec.yaml の google_sign_in などバージョンを下げてみたり

分かれば早いのですよ分かれば
初めて出会った"Trait"の魔法：あなたのコードを変える革新的な考え方

突然ですが、Traitってどんなものかはみなさんご存知でしょうか？
私はこれまで長くソフトウェアエンジニアとして働いてきていますが、大変恥ずかしながらTraitという考え方にこれまで出会ったことがなく、全く知りませんでした💦
（たまたまこれまで使ってきた言語にtraitがなかったからという言い訳）

最近Kotlinを書き始める中で、実際にTraitを使う必要に迫られたので、自分なりにTraitについて説明をしてみたいと思います。

## Traitってなに？

端的に言うと、Abstractやクラスの継承は縦方向の共通化であるのに対し、Traitとは横方向に処理を共通化するための方法です。

複数のクラスで共通して使われる処理を記述する方法として、継承はJavaの初期からある考え方ですが、traitはその後追加された考え方で、php、Ruby, Rust, Scala,Pythonでも導入されています。

参考：[https://en.wikipedia.org/wiki/Trait_(computer_programming)](https://en.wikipedia.org/wiki/Trait_(computer_programming))

abstractの理解がある方であれば、abstractの様に具体的なメソッドが記述できるinterfaceだと考えてもらえると理解しやすいかもしれません。

上記の説明だけだと分かりにくいので、図解してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/884470c0-7d0c-866a-2797-344d645d7614.png)


# Abstract, Interface, Traitの違いと特徴
### abstract
まず、abstractは下図の通り、抽象メソッド・具象メソッドを保つことができ、それを利用するクラスはabstractで定義された”クラス”を”継承(extends)"します。一つのクラスは同時に一つのクラスだけを継承することができます。

> 抽象メソッドはメソッド名とその戻り値のみを定義したメソッド、具象メソッドはその中の処理も定義したものを指します。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/272ef48e-e1a1-a35c-710d-00eae6f7dcc5.png"/>


### interface
次にinterfaceです。interfaceは抽象メソッドのみ持つことができます。
このinterfaceを利用するクラスはこれを"実装(implement)"します。実装は継承と異なり、複数のinterfaceを同時に実装することができます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/fd685f92-1ae2-9d43-9c95-f601a7ba0d75.png"/>


### Trait
最後にtraitです。traitの場合、interfaceではできなかったinterfaceに具象メソッドを持つことができます。また、利用クラスはinterfaceと同様にtraitを"実装"するため、複数のtraitを同時に持つことが可能となります。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/09f6fb32-f7b2-2c21-a540-a23011b12636.png"/>


## 表でまとめる

以上のことを表にまとめてみると以下の通りとなります。
※ただ、これは基本的な考え方であり、言語によって可能なことが異なることに注意してください

|   | abstract | interface | trait |
|:-:|:-:|:-:|:-:|
|  実装（一つ以上） | できない  | できる  | できる  |
| 継承（一つだけ）  | できる  | できない  | できない  |
| 具象メソッドの定義 | できる  | できない  | できる  |
| 抽象メソッドの定義  | できる  | できる  | できる  |
| プロパティの定義  | できる  | できない  | できない  |


# Typescript, Java, Kotlin言語での実装
各言語のtraitの扱いについて調べてみました。いずれもtraitという構文はないものの、traitの考え方に合った実装を実現することはできそうでした。
https://kotlinlang.org/docs/interfaces.html#properties-in-interfaces


### Typescript
Typescriptでは、クラスをimplementすることができ、これをミックスインと呼んでいます。

### Java 
Javaでは、Java8からinterfaceにもdefaultメソッドやstaticメソッドを書ける様になっています。これを使うことでtraitの様な処理を書くことができます

### Kotlin
Kotlinでは、interfaceに具象メソッドを記述することができます。そのため、interfaceはtraitの特徴も包含していると考えることができます。

> ※ 元々Kotlinではtraitは存在した様ですが、2015年にリリースされたM12からtraitはdepricatedになり、interfaceに統合された様です
https://blog.jetbrains.com/kotlin/2015/05/kotlin-m12-is-out/


# まとめ
traitをうまく利用することにより、各クラスに散らばっている処理を１箇所にまとめることができます。同じ様な処理が複数のクラスに点在してしまっている場合は、その処理をtraitに移動することができないかを考えてみましょう。
フォルダの容量をツリー表示したい（Java

フォルダの容量をツリー表示したい（Java

昔からの書式で恐縮ですがJava22で作ってみました。

![スクリーンショット 2024-03-24 07.37.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518713/980e6d78-10c7-4a87-1ce4-090d604af051.png)


使用しているいくつかのライブラリは、以下から取得できますが、
フォルダブラウザなどですので、なくても動かせるようになるとは思います。


https://github.com/syntaro/javamidimixer/blob/main/mixrecipe/src/jp/synthtarou/tools/FolderSizeChecker.java
instagramのギャラリー画面をwebサイトに埋め込む方法

<h1>instagramのギャラリー画面をwebサイトに埋め込む方法</h1>
<a href="https://hp.asakusa64.tokyo/instagram%E3%81%AE%E6%8A%95%E7%A8%BF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%96%B9%E6%B3%955%E3%81%A4/">Instagramの投稿・タイムラインの埋め込み方法5つ</a>

<a href="https://elfsight.com/instagram-feed-instashow/?affise_click_id=65feaececbd3560001601311&affise_offer_id=3&affise_pid=348">『Elfsight』の『Instagram Feed』</a>
Docker+VSCode+serve-webでリモート開発環境を構築する(GPU)

VSCodeのcode serve-webコマンドを使うと, 外部からアクセスできるVSCodeのサーバーを立ち上げることができる。
これを計算機のDocker上で立ち上げ, そのVSCodeサーバーにネットワークからアクセスする方法について調べたのでまとめておく。GPUを使用することを想定する。
coderとほぼ同じ機能だが, (体感的には)速く, Pylanceが使える, ユーザー権限で実行できるなどの利点はある。

## 1. VSCodeをインストールしたDockerイメージの作成
nvidiaのdockerをベースとし, それにpythonやpytorch等をインストールする。
注意点として, PyTorchが提供しているdocker(```pytorch/pytorch:1.12.1-cuda11.3-cudnn8-...```など)はGLIBCのバージョンが古く, VSCodeをインストールできないため使えない。
例えば以下のようなDockerfileになる。
```Dockerfile
FROM nvidia/cuda:11.3.1-runtime-ubuntu20.04
RUN apt update
RUN apt-get update

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y --no-install-recommends sudo curl tzdata gpg apt-transport-https 
ENV TZ=Asia/Tokyo

# vscodeのインストール
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg && \
    install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/ && \
    echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list
RUN apt update
RUN apt-get update
RUN apt-get install -y code
```
その後必要に応じてpythonパッケージのインストールする。   
Pythonはdockerに元々入っているが, 違うバージョンが良い場合はanacondaやpyenvなど適当な方法でインストールする。  

## 2. Dockerネットワークの作成
```code serve-web```を立ち上げるには, Dockerに割り当てられているIPアドレスを知る必要がある。  
特に設定しない場合Dockerがランダムに割り当てるので, それを```ip```コマンド等で調べてもよいが, ここでは指定したIPアドレスがdockerに割り当てられるようにする。  
デフォルトのネットワークではIPアドレスを固定できないので，新しくネットワークを作る。  
ネットワークのIPアドレスは, プライベートIPアドレスとして割り当てられるものならばなんでもよい。例えば以下
```
# @host
docker network create --subnet 192.168.1.0/24 <適当なネットワーク名>
```

## 3. Dockerの作成・起動
割り当てるIPアドレスを適当に定め, 指定する。またDockerのポートをホストのポートに接続させる。
```
docker create -it -p <ホストのポート番号>:<dockerのポート番号> -v /dev/shm:/dev/shm --net=<適当なネットワーク名> --ip=<dockerに割り当てるIPアドレス> \
-v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro \
--gpus all --name <docker名> <docker image名>

docker start -ai <docker image名>
```

## 4. VSCodeの実行
docker内でVSCodeを実行する。
```sh
nohup sudo -u <計算ノードのユーザ名> code serve-web --without-connection-token --host <dockerに割り当てたIPアドレス> --port <↑で接続したdockerのポート番号> &
```
SSHのポートフォワーディングによりローカルPCの適当なポートを3.で接続したホストのポートに接続して, ブラウザでアクセスすることでVSCodeを使うことができる。

## 参考文献
- https://qiita.com/ku_suke/items/07b67bd710b17a3a7cf3
FlaskとMYSQLとSQLite3について

### 背景
筆者はFlaskを構築しているが、従来のMySQLを使っていました。
Flask-SQLAlchemyについては、ほとんど触れずにいました。
そこで気軽にデータベースとして使えるSQLiteとMySQLとFlaskとのやりとりの中で、なにか一番ベストな選択かについて考察しました。

### 結論
1. 拘りがなく、お試しで使いたい場合→「Flask-SQLAlchemy」
1. 持ち出ししたい、IoTなどセンサーのデータを扱う場合→SQLite
1. 本格的開発したい→MySQL

### Flask-SQLAlchemyについて
Flask-SQLAlchemyはFlaskと外部DBとの統合しやすく作られているので、筆者は、これから使ってみたいと思う。
また、従来の使い方とFlask流の使い方について理解したら、どこかで記事を書きたいと思う。

### 基本的な使い方
以下は基本的な使い方をおさらいする

## SQLite(Flask)

以下のように完全にPythonでDBにデータを入れているので、SQL文を使わずにできそう。

```py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

with app.app_context():
    db.create_all()
    
user = User(username='john', email='john@example.com')
db.session.add(user)
db.session.commit()
```
MYSQLを使う場合
```py
class DB_Connector:
    def __init__(self) -> None:
        try:
            self.connector = myconnector.connect(
                host=Sql_Param.host,
                user=Sql_Param.user,
                password=Sql_Param.passwd,
                database=Sql_Param.health_database
            )
            self.curs = self.connector.cursor(dictionary=True,buffered=True)
        except Exception as e:
            print(f'Error Occurred: {e}')

    def create_table(self):
        sql = """CREATE TABLE user_info
            (
                `id` INTEGER PRIMARY KEY AUTOINCREMENT,
                `name` VARCHAR(100) DEFAULT NULL,
                `mail_address` VARCHAR(255) DEFAULT NULL,
                `hash_key` TEXT
            ); """
        self.curs.execute(sql)
        
    def insert_user(self, data):
        sql = "INSERT INTO user_info (name, mail_address, hash_key) VALUES \
            (%s, %s, %s)"
        self.curs.execute(sql, data)
        self.connector.commit()

# データ登録
data = ['john', 'john@example.com','HASH_KEY']
ins = DB_Connector()
ins.create_table()
ins.insert_user(data)
```
ちょっとソースの量が増えるので、また、バグなどがあった場合どうしても、行ったり来たりするので、
筆者は頑張って、Flask-SQLAlchemyを使っていこうかと考えています。

MYSQLとFlaskを統合したFlask-SQLAlchemyについて以下のように使います
```py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@hostname/db_name'
db = SQLAlchemy(app)

# 以後はSQLiteと同じ
```
Apple StoreでEUデジタルサービス法 (DSA)

<img width=90% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/f83e97c1-20c3-1b80-fdfe-4526e11a3533.png>

<img width=90% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/66cd3178-182d-1fc8-b67e-e43ebfc9c3b4.png>

私は個人開発で Apple Store で175カ国に公開しています（していました）

**問題**
2024年2月以降 EU でアプリをリリースするためには住所も公開する必要があるそうです。個人で住所は厳しいですね。

**対処法**
とりあえずヨーロッパの公開を取り止めました。そしてノントレーダーにチェックを入れました。

<img width=70% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/fd7052ee-8b77-6d88-a03b-e8c0174763ef.png>

# Apple Developer の文書

>コンプライアンス情報の管理
>欧州連合 (EU) デジタルサービス法のコンプライアンス情報の管理
>
>App Store の配信における地域間のコンプライアンス維持を目的として、欧州連合のデジタルサービス法 (DSA) においてトレーダーと認められるデベロッパは、その旨を明示することが求められます。トレーダーがコンテンツを配信する場合、同法により住所や連絡先など一定の身元証明情報を提供することが義務付けられており、EU 圏内の消費者に向けて App Store のプロダクトページでそれら情報が公開されます。デベロッパをトレーダーとする条件に当てはまるアプリが 1 つでもある場合は、トレーダーのステータスのご確認をお願いします。その後、配信するアプリごとにトレーダーのステータスをオフにしたり、指定したりすることができます。トレーダーに該当しないデベロッパの場合、適用される消費者保護法に起因する消費者の権利は、当該デベロッパと消費者の間で結ばれる契約には適用されない旨が、EU 圏内の消費者に対し示されます。
トレーダーに該当するかの判断
DSA におけるトレーダーの定義は、「私企業か公企業かを問わず、自己の商取引、事業、技術または職業に関連する目的のために、自己の名において、または代理人を通じて行動する自然人、または法人」です。トレーダーに該当するか不明な場合は、ご自身の法律顧問にご相談ください。
デジタルサービス法の詳細はこちらをご覧ください。
トレーダーが提供する必要のある情報
提供する必要がある情報は、Apple Developer Program に登録しているのが個人か組織かによって異なります。
組織：住所は、D-U-N-S 番号に登録されているものが自動的に表示されます。以下の情報が App Store プロダクトページの表示対象となり、入力が求められます。
電話番号
メールアドレス
この情報は表示のみを目的としており、Apple Developer Program メンバーシップの登録内容が書き換えられることはありません。住所の更新が必要な場合は、別途お問い合わせください。
個人：以下の情報が App Store プロダクトページの表示対象となり、入力が求められます。
住所または私書箱
電話番号
メールアドレス
この情報は表示のみを目的としており、Apple Developer Program メンバーシップの登録内容が書き換えられることはありません。
すべてのトレーダー対象：支払い口座情報を App Store Connect で入力していない場合は必ず提供してください。また、EU 法の適用される規則に準拠したプロダクトやサービスのみを提供していることの証明が求められます。

トレーダーってなんやねん (´・ω・`)

# 総務省のPDF

↓ EU DSA法(Digital Services Act)の概観
https://www.soumu.go.jp/main_content/000932295.pdf

↓ インターネット上での偽・誤情報の拡散等
https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r05/pdf/n2300000.pdf

↓ EU法の抜粋
>2 欧州連合(EU)
デジタルサービス法(DSA:Digital Services Act)は、オンラインプラットフォーム等の仲介
サービス提供者*24 に対して、事業者の規模に応じて、利用者保護、利用規約要件、違法コンテン ツや利用規約に反するコンテンツ等への対応、政治広告を含めたオンライン広告に対する義務等を 規定している。超大規模なオンラインプラットフォーム及び超大規模なオンライン検索エンジ ン*25 に対しては、偽情報を含む違法で有害なコンテンツを拡散する際に生じる重大な社会的リス クに応じてより厳しい対応を求めている。例えば、サービスを通じた違法コンテンツの拡散や人権 など基本的権利、表現の自由等への悪影響に関するリスク分析・評価やリスク軽減措置の実施、レ コメンダーシステム(ユーザーが何を見るかを決定するアルゴリズム)を使用する場合にプロファ イリングに基づかないオプションを少なくとも一つ提供すること等を義務づけており、義務に違反 した場合は最高で前年度の総売上高の 6% の課徴金が科せられることになる。

# これからの個人開発はどうなる

最近はスマホでお金の支払いや身分の証明ができます。そしてスマホの乗っ取り事件などが起こっています。ネイティブアプリは本体の情報や写真などにもアクセス可能です。私の知らないところで犯罪アプリが多数あるのでしょうね。基本的にアプリをリリースするためには、法人登録された会社名か住民登録された名前が必要です。逆に犯罪を犯すためにはダミーの会社を作ればいいのですが、今より断然ハードルは上がりますね。

今後どうなるのでしょかね。個人開発＝自営業なので開業するような手続きが必要になるのでしょうか。私のは無料アプリなのですがフリービジネスの観点からも無料でも責任が問われるのかも知れません。プライバシーポリシーの件もそうでしたがこの流れはやがて日本にもやってくると思われます。今後少しずつ調べていこうと思います。
OpenWrt NURO光 MAP-e

:warning:Japanese notation
# こちらに統合しました
https://qiita.com/site_u/items/c6a50aa6dea965b5a774

![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/ebcf1227-8809-3fad-ba47-5e44a04ccac6.png)

# はじめに
::: note
### 初心者対応構成
- スクリプトでの自動設定
- UCIとLuCi及びWinSCPにて比較しながら作業がおススメ
:::

::: note
### デバイスアクセス
#### [PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/what-is-windows-powershell?view=powershell-7.4)の開始
- キー入力：**`Win`+`x` > `a` > `はい`**

#### [UCI（SSH）アクセス](https://openwrt.org/docs/guide-quick-start/sshadministration)
```powershell:powershell:初期設定用
ssh -o StrictHostKeyChecking=no -oHostKeyAlgorithms=+ssh-rsa root@192.168.1.1
```
- root@192.168.1.1's password:`初期値：パスワード無し`

<details><summary>OpenSSHのインストールが無い場合:exclamation:</summary>

- 機能の確認
※Windows 10 Fall Creators Update(1709)以降標準搭載
```powershell:powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
```
- 機能のインストール
```powershell:powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```
---

:::

# NURO光 MAP-e
::: note warn
### 検証中
https://missing233.github.io/map-e/

:::

::: note
### 設定
![nuro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412833/79ebfd33-1361-9a77-7e71-a9d6ccc20c6d.png)

[map-e-nuro.sh](https://github.com/site-u2023/config-software/blob/main/map-e-nuro.sh)

:warning:検証中
```sh
mkdir -p /etc/config-software; wget --no-check-certificate -O /etc/config-software/map-e-nuro.sh https://raw.githubusercontent.com/site-u2023/config-software/main/map-e-nuro.sh; sh /etc/config-software/map-e-nuro.sh

```

宜しければ、結果をこの板にお知らせください



### ポート動作確認
- [ニチバンベンチ](https://www.nichiban.co.jp/)
- [LuCi ファイアーウォール](http://192.168.1.1/cgi-bin/luci/admin/status/nftables)
カウンター確認
### 利用可能ポート確認
- map-wanmap.rules
```ruby
cat /tmp/map-wanmap.rules | awk '/PORTSETS/'

```

:::

::: note
### ポートについて
- **マルチセッション対応を追加しました**
使えるはずです

- [NURO光がMAP-E方式の利用を開始し、拡大させる予定らしい。](https://fal.ms/b/2024/02/nuro-starting-ipv6-map-e-tunneling/)
[F660P](https://www.nuro.jp/pdf/device/manual_ZXHNF2886S.pdf)のWAN情報画面に「使用できるポート」という項目がありました。
そのポートを使えば、一応リモートもできることを確認しました。
uPNPに相当する機能が動作していると思われます。
`https://XXX.XXX.XXX:[使用できるポート]/`
ルーターでIPSecが500/4500などポート固定の場合で、「使用できるポート」ではない場合は接続できないと思われます。
WireGuardのポートを「使用できるポート」に変更すれば、VPN接続がスムーズにできます。（かなり高速）



:::

# 参考資料（感謝:relaxed:）

- https://qiita.com/obsolete-standard/items/e410530cecb0a21d3ecc
大手独立系SIerからWebシステム開発のベンチャーに転職した話

# はじめに
別に大きな山も谷もない、ただ転職したってだけの話です。
小さな山と谷を書き殴ります。

# 要約すると
- 新卒からSIerで12年金融系業務システムの保守開発
- 第一子誕生翌月にベンチャーに入社
- 同じシステム開発やろ、と舐めてたらWebシステム開発全然わからん
- 結局金融系ちょっとやって、現場やめて社内に引きこもった
- いま楽しい

# 前職（SIer）時代
## ずっと証券の保守開発
SIer12年のうち11年を同じ証券会社の情報系システム保守開発で過ごしました。

配属された直後はバッチ担当でShellとかCOBOLを扱い、半年後ぐらいにオンラインのチームでJavaを扱うことになりました。
そのタイミングで基盤更改の案件にアサインされ、1年半ほどほぼテストしかしていません。

基盤更改案件終了後、オンラインチームとして保守開発をしていましたが、2人月前後の小規模な改修や本番のデータパッチ、制度改正などに伴う影響調査などがほとんどで、ほぼプログラミングはしていません。
改修案件も、2人月と言ってもコーディングする量なんて5〜50stepぐらいのものがほとんどで、1日で終わります。
ほとんどの期間をテストで過ごします。

4年目から中規模案件のサブリーダーやったり保守のチームリーダーやったりサブリーダーやったり、ずっとマネジメント系の業務をやっていました。
この11年で書いたコードは1〜2Kstep程度です。

### 開発環境
見てきた現場が少ないので正直一般的かわかりませんが、開発の環境はかなりレガシーだったと思います。
- バッチ：COBOL（金融なのでこれはまぁ多いと思いますが）
- オンライン：Java（Spring Bootなどのフレームワークはなく、顧客の金融系システム全般で使われている独自のフレームワーク）
- JOB管理：JP1
- インフラ：オンプレミス
- バージョン管理：CVS
- 客先常駐（15年近く前なのでリモートも浸透しておらず）
- 常駐先常設のデスクトップPC
- 外部ネットワーク接続不可（なのでWebサービス利用不可。調べるのもスマホ使うしかない）

## 辞める前の1年
債権回収の案件があり、そこに異動になりました。
そこでちょっとだけ「うーん・・・」と思うことがあり、何気なく転職サイトに登録しました。
あまり本気で転職する気はなかったんですが、たまたま現所属の会社からオファーがあり、「ベンチャー面白そう。10年以上上場企業でやってたし無双出来んちゃう？」という浅はかな考えで転職しました。

# 転職に際し思ったこと
2020/12ぐらいに内定をもらって、2021/5から新しい会社に入社することになったわけですが、ゆるく転職してた頃、妻が妊娠しており、2021/4に出産を予定していました。
家族が一人増えるタイミングでいつ潰れるともわからないベンチャーに転職するのは、多少リスクある決断だったかとは思いますが、上場企業で10年以上働いていた実績があればまたすぐに転職できるだろう、と楽観的で、あまり葛藤はありませんでした。
2021/4は1ヶ月まるまる有給をもらい、育児してました。

# 現職（ベンチャー、Webシステム開発）時代
## 現場時代
入社後すぐ挫折しました。
先述の通り、これまでの開発環境はレガシーで、Webサービスも利用していなかったので、RailsだけでなくGitもGithubもDockerもDatadogもアジャイルもMacもSlackも全部初めましてでした。
前職では比較的高評価だったので自信家だったんですが、この時は「せっかく期待されて採用してもらったのにこんなポンコツですみません」とかなり落ちてました。

半年ほど苦しんだ後、Webシステム開発から離れ、1年ほど金融系の案件に単独でアサインされました。
その後、あまり難易度の高くないWebシステムの開発チームリーダーにアサインされ、無難にこなしながら社内の改善や制度づくりなどで少しずつ成果を出すことで自信を回復していきました。
着任11ヶ月で顧客のコストカットに伴う開発チーム縮小のタイミングで離任し、現場を卒業。開発本部のマネージャーとなりました。

## 社内時代
2024/1から現在まで3ヶ月弱。
いろんな施策・制度設計・課題解決などを並行で進めなければならなかったり、打ち合わせだらけで自分の作業時間が全然取れなかったり、家庭の事情で残業もほぼできない状況で、色々苦戦する部分もありつつ、これまでと比べると明らかに適性があることを感じています。
人生で初めて、仕事を楽しいと思えています。
ポンコツだった私の活きる道を一緒に模索してくれて、このポジションを与えてくれた経営陣には感謝の念に堪えません。

今では自信を取り戻しすぎて赤髪にしたり奇抜なファッションで完全に調子こいてます。

# おわりに
収入アップだけ考えれば他の会社にいくほうが効率的だったと思いますが、楽しいと思える仕事ができる確率って、あまり高くないだろうなーという気がするので、今のところ今の会社を選んで正解でした。
従業員みんながそう思えるような会社を目指して頑張ります。

全然推敲してない乱文でお目汚し失礼しました。
気が向いた時に見直して修正します。
パッケージマネージャーとは何なのか

こんにちは、toraguitarです。
フロントエンジニア(以下、FE)として働いています。
今回は「パッケージマネージャー」についてまとめていきます。

## この記事の目的
* 筆者が 「言葉は知っているけど説明できない」というものをピックアップする
* 調べなくても概要を説明できる、具体例を1~2つ出せるレベルに引き上げる
* 歴史的背景など踏み込んだ説明は省く


## 言葉の意味
まずは言葉の意味を押さえます。
パッケージマネージャーとは、以下のように説明をされています。

> パッケージマネージャーとはその名の通りパッケージを管理するソフトウェアやシステムのことです。一言でパッケージマネージャーと言っても色々ありますが、大まかには以下の二種類に分けられます。
>* OSレベルの機能やソフトウェアパッケージを管理するもの
>* ソフトウェア開発時に使用する機能部品や実行部品を管理するもの

参考記事: [パッケージマネージャーとは？わかりやすい仕組みの解説](https://www.hitachi-solutions.co.jp/sbom/sp/blog/2023033101/)

ここで、FEが業務で耳にするパッケージマネージャーは主に、

**「ソフトウェア開発時に使用する機能部品や実行部品を管理するもの」**

を指していることが多いようです。
本記事ではこちらを掘り下げ、説明をしていきます。

## パッケージマネージャーの具体例
「ソフトウェア開発時に使用する機能部品や実行部品を管理するもの」と説明をされても、あまりピンと来ません。
ここではイメージがつきやすいよう、具体例を挙げていきます。

### npm
FEとして仕事をしていて一番目にしているものですね。
「Node package Manager」の略で、JavaScriptで幅広く使われているパッケージマネージャーです。
その名の通り、Node.jsにおいてデフォルトのパッケージマネージャーとなっています。

参考記事: [【JavaScriptの応用】パッケージマネージャー -Npm](https://tcd-theme.com/2021/10/javascript-npm.html)

### yarn
npmの後継として登場したパッケージマネージャーです。
npmと互換性があり、ほぼ同じ感覚で使用することができます。

他にもありますが、この記事では割愛します。

## パッケージマネージャーの役割・機能
先程上げた具体例のうち、主にnpmを例に挙げつつ、
パッケージマネージャーが持つ役割、機能についてまとめていきます。

### パッケージの取得・更新・削除
インターネット上には、アプリケーションの開発に役立つパッケージが数多く公開されています。
パッケージは商用として公開されているもの、OSS(オープンソースソフトウェア)として公開されているものがあります。
パッケージマネージャーは、その開発に必要なパッケージを取得することができます。

パッケージをインストールしたいディレクトリにて、ターミナルで以下のように入力します。
```terminal
npm install {パッケージ名}

もしくは

npm i {パッケージ名}
```

パッケージのアンインストールをする場合、以下のように入力します。
```terminal
npm uninstall {パッケージ名}
```

パッケージの更新をする場合、以下のように入力します。
```terminal
npm update {パッケージ名}
```


### パッケージの管理
インストールされたパッケージは、設定ファイルで情報が管理されています。
npmの場合、package.jsonが設定ファイルに該当します。

例) React+TypeScript+microCMSでアプリケーションを作成した場合
```json
  "dependencies": {
    "@testing-library/jest-dom": "^5.17.0",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "@types/jest": "^27.5.2",
    "@types/node": "^16.18.68",
    "@types/react": "^18.2.45",
    "@types/react-dom": "^18.2.18",
    "microcms-js-sdk": "^3.0.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "typescript": "^4.9.5",
    "web-vitals": "^2.1.4"
  }
```

新たにパッケージをインストールした場合、package.jsonにパッケージの情報が記録されます。

### パッケージの依存関係の解決
パッケージの中には、あるパッケージの存在を前提としたパッケージが存在します。
パッケージマネージャーはそれらの依存関係を管理しており、必要に応じてインストールやバージョンアップなどを行います。

npmの場合、`npm install`コマンドを実行すると自動でバージョンアップなどを行ってくれます。

実際はそれだけで依存関係を解決できないこともしばしばです。
ターミナルにエラーメッセージや依存関係解決のために取得したパッケージ名などが表示されるため、解決しない場合はそこからさらに掘り下げて原因を探していきます。


## まとめ

* パッケージマネージャーとは、web開発に役立つパッケージを管理するためのもの
* パッケージマネージャーには以下の機能がある
    * パッケージのインストール、アンインストール、更新
    * パッケージの管理
    * パッケージ同士の依存関係の解決 

## 参考記事
- [パッケージマネージャーとは？わかりやすい仕組みの解説](https://www.hitachi-solutions.co.jp/sbom/sp/blog/2023033101/)
- [JavaScriptのパッケージマネージャーnpmとYarnについて解説します！](https://www.sejuku.net/blog/96866)
- [【JavaScriptの応用】パッケージマネージャー -Npm](https://tcd-theme.com/2021/10/javascript-npm.html)
Excelで複数条件並べ替え

# 概要

最初の状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d52e3ec1-8472-6585-eb09-1c52ad2b0106.png)

苗字で並べ替えるだけだと…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0f621de6-7c3b-1c34-4372-9a57e6668592.png)

天敵が並ばないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/49f84c67-b9c1-448b-1f0b-81a5b815903b.png)

そこから天敵で並べ替えると、今度は苗字が並ばないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ef71f101-8ff7-4159-f16d-49020ee38561.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/791a1ed0-f170-63c6-7238-4409eb5d85f9.png)

つまり、フィルターの▼による並べ替えは1項目のみです。

これに対して…

1. まず苗字で並べ替えて。
1. 同じ苗字の中では天敵で並べ替え。

という複数条件並べ替えをしたい。

# やり方

『データ』⇒『並べ替え』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ff12cc9a-9be2-d1ae-5f3f-50f1d07ae9f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ee120b49-d2bb-db46-e2af-c960dcd70ed9.png)

並べ替え結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/833d902d-7db0-05b2-e26d-a9b5b15dbb66.png)

# 参考サイトさん

https://dekiru.net/article/12699/

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Microsoft Excel for Microsoft 365 MSO (バージョン 2402 ビルド 16.0.17328.20124) 32 ビット
SVNでエラー「E120106」が発生する場合の対処法


Subversionでエラー「E120106: ra_serf: The server sent a truncated HTTP response body.」が発生してチェックアウトできない場合の対処法を解説します。

:::note warn

※ これは2019-07-21に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています(スクリーンショットを除く)。情報は古い可能性があります。

:::

## SVN でチェックアウトができずに詰む

`svn checkout` をしている途中で、「E120106: ra_serf: The server sent a truncated HTTP response body.」が発生して止まってしまいました。しかも、作業コピーの状態が中途半端なため、再度の `svn checkout` や `svn update` もできない状態で詰んでしまいました。

## 原因

巨大なリポジトリでチェックアウトに時間がかかる場合、サーバーの設定が不適切で、タイムアウトが短かかったり回線が不安定な場合にサーバーとの接続が切断されてしまうことで発生します。

## 対処方法

### 原因療法 1

リポジトリのファイル容量やファイル数を減らすことで、タイムアウトを防ぐことができます。

### 原因療法 2

サーバーの設定の見直し(Apacheの場合httpd.confの `Timeout` を大きく)することでタイムアウトを防ぐことができます。

httpd.confの設定例です。

```ini
Timeout 60000
```

### 対症療法

エラーで中断した後に、クリーンアップを行うことで、アップデートを行うことが可能になり、再度レポジトリからのコピーが再開できます。

```bash
svn: error: E120106: ra_serf: The server sent a truncated HTTP response body.
svn cleanup
svn update
```
Webフレームワークを集めたDockerComposeを作ってみた

# 今回作成したリポジトリ

https://github.com/perilla0/web_frameworks_template

# はじめに

これまで、フレームワークごとにテンプレリポジトリを作っていたのですが、プロジェクトの切り替えが面倒だったり、DockerComposeごとにNginxやDBサーバーを定義したり、Githubリポジトリが増えすぎたりと不都合を感じておりました。

なので、バックエンド、フロントエンドのフレームワークをまとめたDockerComposeを作成することにしました。

今後のWebフレームワーク追加や削除がしやすいように、構成に少し工夫も加えました。今後は、Webフレームワークを追加したいときは、今回作成したテンプレリポジトリに追加していくことにします。

本テンプレリポジトリは、あくまでWebフレームワークのインストールから初期画面の表示までの簡素化を目的としております。

# DockerComposeに含まれるサービス

READMEに詳細がありますが、本記事でも簡単に説明させて頂きます。

## バックエンド

- Laravel（PHP）
- Ruby on Rails（Ruby）
- Django（Python）
- Echo（Go）

## フロントエンド

フレームワークという表現では違和感があるかもしれませんが、ひとまずこの記事ではフレームワークとさせて頂きます。

- Apollo Client（GraphQL）
- Next.js（React）
- Nuxt.js（Vue.js）
- SveletKit（Svelet）

## データベース

- PostgreSQL
- MySQL
- Redis
- memcached
- MongoDB

# 使用方法

使用方法については、リポジトリのREADMEに記載しておりますので、興味がありましたら参照ください。

# 注意事項

シェルで特定ディレクトリ（作成したフレームワークのプロジェクトディレクトリ）を削除する処理が存在しますので、あくまで自己責任でご利用ください。

# フレームワーク個別リポジトリ記事

以下は、これまで作成したフレームワーク個別のテンプレリポジトリの記事です。

https://qiita.com/perilla/items/c84a9788a5cc2009f984

https://qiita.com/perilla/items/1fd83b692f2cb0f59575

https://qiita.com/perilla/items/36b51751e25d3a30b9b5

https://qiita.com/perilla/items/fa2ca603b2a48f16413c

https://qiita.com/perilla/items/a6fe47c8fe75623b6f4c
ExcelでURLが勝手にリンクになったり英語の先頭が勝手に大文字になるオートコレクトを無効に

# やり方

『ファイル』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/072a2c48-e62c-6dd9-66d4-7afc649f8920.png)

『オプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/330066ba-8a75-1095-c1d8-a1d71532a349.png)

『文書校正』⇒『オートコレクトのオプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/57a4361e-61d5-f80e-8f35-ed574edd960a.png)

あとは自分の好みに合わせてカスタマイズ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/be2ab7c4-8469-e2ad-60b4-6d87d7c9044b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3f423070-f145-8252-fa81-aa6aa2f2f2fc.png)

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Microsoft Excel for Microsoft 365 MSO (バージョン 2402 ビルド 16.0.17328.20124) 32 ビット
TwitterのOGPカードが表示されないときの対処法


Twitterカード用のタグを追加しているのにTwitterでTwitterカードが表示されないときの対処法を紹介します。

:::note warn

※ これは2017-07-14に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## Twitter カードが表示されない

Twitterカードが挿入されるWordPressサイトのリンクをツイートしたのですが、何故か特定のページに限りTwitterカードが表示されません。

![Tweetの例、カードが表示されていない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/eadd836c-657f-1cc0-69db-eb9a52ec8477.png)

同サイトの他のページへのリンクではTwitterカードが表示されました。タグの記載ミスも考えにくいです。

![同じサイトの別のページではカードが表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/07a84062-52a6-b4f7-8492-05ccf1cb2631.png)

## 原因を調べる

[Twitter の公式ドキュメント](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/troubleshooting-cards)を参照してます。その記載によると「[Card validator](https://cards-dev.twitter.com/validator)」なる検証ツールがあり、Twitterによるアクセスログが見られるようです。

https://cards-dev.twitter.com/validator

先程の問題のURLを開いてみます。

![`Unable to render Card preview` のエラーとLogが表示される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/51a27651-12be-c3bb-2cb2-3ee1a670c92b.png)

> ERROR: Fetching the page failed because the response is too large.

というエラーログが確認できました。つまり問題のページはページサイズが大きすぎて取得できなかった。ということになります。

「Card validator」にてURLを入力してみることでTwitterカードが表示されない原因を特定できます。

また、Twitterカードに古い情報が表示されている場合も、「Card validator」にて入力して送信するとキャッシュを頼らずに再取得してくれます(他のツイートのカードも更新されます)。
Vision ProでローカルLLM（llama2）を動かしてみる

とりあえずというレベルですが、Vision Proでllama2が動きました。

[llama.cpp](https://github.com/ggerganov/llama.cpp)のSwiftパッケージを使った日本語チャット[SwiftLlamaApp](https://github.com/ensan-hcl/SwiftLlamaApp)を利用してVision Proネイティブのllama2チャットを作ってみます。
VisionPro内では音声で呼び出したいので[音声認識](https://developer.apple.com/documentation/speech/sfspeechrecognizer)と[音声合成](https://developer.apple.com/documentation/avfaudio/avspeechsynthesizer/)を追加することにしました。

![](https://storage.googleapis.com/zenn-user-upload/130008f0a713-20240323.png)

イマーシブなハレアカラ頂上で動いています（笑）

現在のVision Proは英語しか使えないというのを忘れており、日本語では音声認識してくれませんでした（ja-JPだと初期化で落ちる）。日本語の音声合成は可能なのに不思議です。

英語の音声認識でllama2に"Do you like Hawaii?"と投げたら、日本語で返してくれました。
「ん？もしかして翻訳みたいな事ができるのかな」と思って識者にたずねたら「言語依存しないで学習していて、バイリンガルのような動作をするらしい」とのことでした。

モデルはELYZA-japanese-Llama-2-7b-instruct-q4_K_Mを使っています。
モデルのサイズが4GBあるのでWiFi接続しかないVisionProへのアプリ初回インストールに10分ほど時間が掛かりました。MacとUSB-C接続できるデベロッパーストラップが欲しいところです（日本からは買えないけど...）

引き続き研究中。

** シンギュラリティ・ソサエティの[AI Innovators Hub](https://singularitysociety.org/activities/aihub/)に参加しています。**
Emscripten環境構築から実装まで(Windows)

### Emscriptenを使う機会があったので、備忘録として。
## 対象読者
 Emscriptenって何ぞや。WebAssemblyって何ぞや。とりあえず動かしたい方向け。
 （中身が知りたければ下部参考リンクまで）
## WebAssemblyとは
　機械語に近いため、Webを高速実行できる。WebAssemblyを使えば色んな言語を、色んなブラウザで実行できる。（＝言語やブラウザに依存する必要がない。）
#### 対応言語
- Java
- PHP
- C# .NET
- C++
- Ruby
- C
- Swift
- R
- Go
- Rust
#### 対応ブラウザ
- Google Chrome・Chrome for Android
- Microsoft Edge
- Safari・iOS Safari
- Firefox・Firefox for Android
- Opera
- Android Browser
## Emscriptenとは
　平たく言えば上記対応言語をコンパイルしてwasm形式にできる便利ツール。
## 環境構築
開発環境：Windows10
```bash
$ git clone https://github.com/emscripten-core/emsdk.git
$ cd emsdk
$ # 最新版をインストール
$ ./emsdk install latest
$ # 最新版を使用
$ ./emsdk activate latest
$ # cmdを開いている間の環境パスを変更
$ ./emcmdprompt.bat
```
　Python, Node, Java とPATHが競合するため、`./emcmdprompt.bat`は忘れずに実行しましょう。
## 実行
　hello.cを作成します。
```c
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
}
```
　Emscriptenでコンパイルしてみましょう。emccコマンドを使用します。
```bash
$ emcc <コンパイルするファイル> -o <コンパイル後のファイル名.拡張子>
```
　今回の場合では
```bash
$ emcc hello.c -o hello.html
```
　オプションで `-s WASM=1` を指定すると.wasmファイルが生成されるようです。しかし上記のコマンドでも.wasm, .html, .js が生成された模様。

 実行にはVS CodeのLive Serverが一番手っ取り早いです。
## 生成されたファイルを読み解いてみる
#### htmlファイル
　コードは200行にも渡るが、その実Emscriptenのロゴや基本的なページのテンプレのみであった。
#### jsファイル
　hello.wasmをインポートしているコードを発見。htmlファイルに具体的な出力内容を指定する役目を担っている。
#### wasmファイル
　要はこのファイルさえあればWebページにC言語の内容を出力することは難しくなさそうだ。Emscriptenのテンプレに従う必要がないのなら、.wasmファイルを自サイトに埋め込む方が良いだろう。
 ## 参考リンク
 https://qiita.com/umamichi/items/c62d18b7ed81fdba63c2
 https://qiita.com/RYOSKATE/items/918f2fda3c6f20c7f6ba
Pythonで「直前の文字を指定回数繰り返す文字列にマッチするパターンを記述する」の動作を確認してみた

# 概要

Pythonで「直前の文字を指定回数繰り返す文字列にマッチするパターンを記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index13.html

# 実装

以下のファイルを作成しました。
```sample.py
import re
pattern = re.compile(r'Ha*n')
print(bool(pattern.search('Hn')))
print(bool(pattern.search('Han')))
print(bool(pattern.search('Haaaaan')))
print(bool(pattern.search('HaaUaan')))

import re
pattern = re.compile(r'Ha+n')
print(bool(pattern.search('Hn')))
print(bool(pattern.search('Han')))
print(bool(pattern.search('Haaaaan')))
print(bool(pattern.search('HaaUaan')))

import re
pattern = re.compile(r'Ha?n')
print(bool(pattern.search('Hn')))
print(bool(pattern.search('Han')))
print(bool(pattern.search('Haaaaan')))
print(bool(pattern.search('Ham')))

import re
pattern = re.compile(r'Ha{3}n')
print(bool(pattern.search('Haaan')))
print(bool(pattern.search('Han')))
print(bool(pattern.search('Haaaaan')))
print(bool(pattern.search('HaaaO')))

import re
pattern = re.compile(r'Ha{2,4}n')
print(bool(pattern.search('Haan')))
print(bool(pattern.search('Haaaan')))
print(bool(pattern.search('Haaaaan')))
print(bool(pattern.search('HaaaO')))

import re
pattern = re.compile(r'<em>.*</em>')
msg = '<p>今日は<em>快晴の</em>一日です</p>';
result = pattern.search(msg)
print(result.group(0))
pattern = re.compile(r'[0-9]{3}-[0-9]{4}')
msg = '郵便番号は 123-4567 です';
result = pattern.search(msg)
print(result.group(0))

import re
pattern = re.compile(r'(\d{1,3}\.){3}\d{1,3}')
msg = 'IPアドレスは 192.168.0.18 です';
result = pattern.search(msg)
print(result.group(0))

import re
pattern = re.compile(r'b.*a')
msg = 'breakfast is sandwich';
result = pattern.search(msg)
print(result.group(0))

import re
pattern = re.compile(r'b.*?a')
msg = 'breakfast is sandwich';
result = pattern.search(msg)
print(result.group(0))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
True
True
True
False
False
True
True
False
True
True
False
False
True
False
False
False
True
True
False
False
<em>快晴の</em>
123-4567
192.168.0.18
breakfast is sa
brea
```

# まとめ

何かの役に立てばと。
PowershellでPYTHONPATHを設定する方法

# はじめに
PowershellでPYTHONPATHを設定する方法を忘れがちなので備忘録として置いておく．

# PowershellでPYTHONPATHを設定する方法
以下のコマンドで設定できる，
```
$env:PYTHONPATH = "パスをここに入力"
```
カレントディレクトリをパスに設定するなら以下のコマンド．
```
$env:PYTHONPATH = "$pwd"
```
設定したPYTHONPATHは以下のコマンドで確認できる．
```
$env:PYTHONPATH
```

# 終わり

単純なんだけどUbuntuとやり方が違うから忘れちゃうんだなあ．
WSL2とDocker　〜開発環境構築の比較〜


## WSL2とは
WSL2とはWindows上でLinuxカーネルを実行する技術です。WSL2の特徴と利点は以下の通りです。

・完全なLinux環境の提供
WSL 2は完全なLinux環境を提供し、Linuxコマンドやツールを利用可能にします。

・Windowsとのファイルシステムの統合
Windowsファイルシステムにアクセスできるため、Windowsとの連携が容易です。

・Windowsアプリケーションとの連携 
WindowsターミナルやVisual Studio CodeなどのWindowsアプリケーションとシームレスに連携します。

## Dockerの特徴と利点
Dockerは、アプリケーションやサービスをコンテナとしてパッケージ化し、環境を分離・管理するためのツールです。Dockerの特徴と利点は以下の通りです。

・コンテナ化された環境の提供
アプリケーションやサービスをコンテナ化することで、環境を分離して管理できます。

・複数の環境の管理
複数のコンテナを管理し、スケーリングやデプロイが容易です。

・リソース効率の高さ 
ホストOSとリソースを共有するため、リソース効率が高くなります。

## どちらを選ぶべきか？
どちらのツールを選択するかは、プロジェクトの要件や個々の好みによります。以下は、適切な使用例です：

#### WSL 2を選択する場合

・完全なLinux環境が必要
・WindowsとLinuxの連携が必要

#### Dockerを選択する場合

・複雑なアプリケーションの開発やデプロイメントが必要
・異なる環境での再現性やポータビリティが必要

## まとめ
WSL 2とDockerは、それぞれ異なるアプローチを取りながらも、同じ開発環境を再現できることが特徴です。開発者はプロジェクトの要件や個々の好みに応じて適切なツールを選択することが重要です。
CISA/CISMの受験記録

# はじめに

セキュリティ界隈が盛り上がっているので、CISAとCISMを受験しました。
いずれも2回目で合格できたので、学習方法と不合格だった時の課題などを記載したいと思います。
これから受験する方は参考にしてください。


# CISA、CISMについて
ISACAという米国の非営利組織が認定する資格で、日本語だと「公認情報システム監査人(CISA)」「公認情報セキュリティマネージャ(CISM)」と表記されます。
筆者はディベロッパーなので馴染みの無い用語でしたが「情報セキュリティ管理者」「情報システム監査人」というのは、ISO27001(ISMS)などで定義されているシステム監査の体制上の役割のことのようです。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365809/9b123f32-d941-8a83-6eef-3c967e2201f1.png">


# CISAの受験

- 1回目
初めての受験時、高額な公式問題集など要らないだろうと考え、ヤフオクで買った「公式ではない問題集」で学習を開始しました。
1日あたり100問を出来るだけ時間を掛けないようにサラッと解き、復習として翌日にもう一度見直すという形で学習を進めました。
1000問を3周(復習を入れると6周)行い、およそ8割程度が解ける状態で受験。

| ドメイン | スコア |
| --- | --- |
| 1 | 403 |
| 2 | 331 |
| 3 | 573 |
| 4 | 450 |
| 5 | 581 |

結果は438点で不合格でした。特にドメイン1と2が低い。
受験料が高額なので精神的に結構きます。今思えばただの勉強不足だったのでしょうが、不合格を突き付けられると公式ではない問題集での学習に不安が出てきます。

- 2回目
結局は2度目の受験の前に公式問題集を購入。
公式問題集でスコアの低かったドメイン1/2/4を2周して2回目を受験しました。

| ドメイン | スコア |
| --- | --- |
| 1 | 599 |
| 2 | 388 |
| 3 | 573 |
| 4 | 564 |
| 5 | 581 |

結果は529点で合格。相変わらずドメイン2の理解が浅いようです。


# CISMの受験

- 1回目
CISAの公式問題集と一緒にCISMのものも購入していたので、CISAの合格後にすぐ着手しました。
約2カ月掛けて公式問題集を4周(復習を入れて8周)し、9割前後解けるようになったので1回目を受験。

| ドメイン | スコア |
| --- | --- |
| 1 | 423 |
| 2 | 441 |
| 3 | 563 |
| 4 | 411 |

結果はまさかの不合格。
とは言え、CISAで不合格を経験していたのと、公式問題集での学習だったのでそこまでショックはありませんでした。
問題集も殆ど選択肢だけで答えが判る状態だったので、「答えだけ覚えて理解が浅い」状態だったのだと思います。


- 2回目
スコアの低かった3ドメインの解説を2周ほどを査読して理解を深めることに専念し、不合格から1か月後に2回目を受験。

| ドメイン | スコア |
| --- | --- |
| 1 | 526 |
| 2 | 611 |
| 3 | 478 |
| 4 | 545 |

結果は535点で合格でした。


# 所感
CISAの合格後にCISMを受験したにも関わらず、合格までに同等の時間を要したことを考えるとCISAよりCISMの方が難しかった印象です。

学習時間は正確には計っていませんが1～2時間を週5日、月30時間くらいのペースで行っていました。
CISA、CISMのいずれも2か月の学習で不合格、3か月で合格となっているので、合格までおよそ100時間の学習を行ったことになります。

ネット情報では「公式問題集が8割解ければ合格」と言うのを見かけますが、解けるだけでなく内容を理解していないと合格できないので注意が必要です。

---
.gitattributes をもっと活用して GitHub 上での開発体験を向上させよう


.gitattributesを活用しプルリクエストレビューの負荷を軽減して、開発体験を高めた記録です。

:::note warn

※ これは2022-12-15に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 背景

プルリクエストの差分を確認する際、パッケージマネージャーのロックファイルや自動生成ファイル (CodeGen) が差分となって出てくることがあります。

自動生成ファイルは人が読むものではないため、レビューにおいて邪魔に感じてしまいレビュー負荷が増加してしまうことがあります。

また、実際よりも差分が大きく見えてしまうことで、レビュワーがレビューを後回しにしてしまうことで、リリースの速度の低下にも繋がっていました。

そこで、 `.gitattributes` を適切に設定してみることにしました。

## `.gitattributes` とは

もともとGitで `.gitattributes` の設定が存在します。下記ではツールを利用してバイナリ差分を見やすくする方法について解説されています。

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7

これに加え、Githubでは `linguist-generated` というオリジナルの属性が用意されています。

https://docs.github.com/ja/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github

## 使用例

`linguist-generated` を指定すると、該当のファイルは差分としてデフォルト折りたたまれるようになり、差分の行数としてカウントされなくなります。

```plain
yarn.lock linguist-generated=true
```

![GitHub のプルリクエストのスクリーンショット。yarn.lock の差分がデフォルトで閉じられており、「Some generated files are not rendered by default」と表示されている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/615b8492-a8a9-0a13-4e4e-456490fd91d5.png)

ちなみにドキュメントを見ると他にもいくつかの属性があり、GitHub上に表示される言語統計情報などをカスタマイズできます。

https://github.com/github/linguist/blob/master/docs/overrides.md

- `linguist-detectable`
- `linguist-documentation`
- `linguist-generated`
- `linguist-language`
- `linguist-vendored`

## まとめ

`.gitattributes` を活用し、ロックファイルや自動生成ファイルの差分を折りたたむように設定してみました。
Does My Browser Support WebGL?


A copy of "Does My Browser Support WebGL?"

以前に[個人ブログ](https://bicstone.me)で公開していた、 Does My Browser Support WebGL? のコピーを提供します。

WebGL関連でトラブルが発生した際にお役立てください。

全画面表示は[こちら](https://kbu5zb.csb.app/ "Does My Browser Support WebGL? へのリンク")から。

https://codesandbox.io/embed/does-my-browser-support-webgl-kbu5zb?&theme=light&view=preview
window.locationとdocument.locationの違い

# 1. 背景

document.locationというのを初めて見たので、window.locationと何が違うのか調べようと思った為です。

# 2. Document.locationとWindow.locationの違い

https://developer.mozilla.org/ja/docs/Web/API/Window/location

https://developer.mozilla.org/ja/docs/Web/API/Document/location

https://stackoverflow.com/questions/2430936/whats-the-difference-between-window-location-and-document-location

https://www.web-dev-qa-db-ja.com/ja/javascript/javascript%E3%81%AEwindowlocation%E3%81%A8documentlocation%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/968064340/

https://www.tutorialspoint.com/what-s-the-difference-between-window-location-and-document-location

## window.location
すべてのブラウザで読み書き可能

## document.location
- IEでは読み取り専用？（IEでも書き込み可能との[意見](https://stackoverflow.com/questions/2430936/whats-the-difference-between-window-location-and-document-location#:~:text=I%20can%27t%20reproduce%20the%20claim%20that%20document.location%20is%20read%2Donly%20in%20IE.%20I%20can%20successfully%20assign%20to%20it%20in%20IE%2010%2C%209%2C%208%20and%206%20(using%20VMs%20from%20modern.ie).)もありました）
- Geckoベースのブラウザでは読み取り/書き込みが可能？（Chromeでも書き換えはできてるのでなぜこの記載がされていたのか不明）

## その他
- ハッシュパラメータを扱えるのはwindow.locationという記載も見ましたが、document.locationでも可能です
- Geckoベースのブラウザ
    - [firefox](https://www.mozilla.org/en-US/firefox/new/)
    - [seamonkey](https://www.seamonkey-project.org/)

# 3. 最後に
- 大きな違いは分かりませんでした
- 違いを気にしないといけないcaseがまだ業務で起きていないので今後わかれば追記していきたいです
- 何も考えずにwindow.locationを使っていたので考え直すきっかけとなりました