OmniAICreator/Qiita-1.07M huggingface dataset:
Apple Watchの次は

Apple Watch 備忘録
https://qiita.com/qjuliar/items/37079f3cbd3d109edc22

Apple Watchのコンプリケーションファミリー
https://qiita.com/toshi586014/items/0bfeb464c16a8e800abe

Apple Watchでカウントアプリ
https://qiita.com/K___K/items/8b8fc9a2c2dc9b29a377

Apple Watch テキスト入力
https://qiita.com/shun_nakahara/items/6fa33404e1e450c985d9

Apple Watch でスケールを取得する
https://qiita.com/yuki0n0/items/d460da2dad2cb50f05af

Apple Watchで最寄り駅を取得する
https://qiita.com/TinyKitten/items/65d26ff5066996d66566

Apple Watch アプリ開発について(Watch OS 1のとき)
https://qiita.com/HIkaruSato/items/46f7075b04b1afecafd5


# 文書履歴(document history)
ver. 0.01 初稿 20190516
ver. 0.04 URL追記　20230226

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
初心者がPythonを使ってPostgreSQL に接続する

#Postgresに接続してSQLでDBいじってみたい
と思ったPython超初心者向け。
今日Python、postgresを初めて触った、そんな私がpostgresDBにpythonで接続するまでのメモ。
##まず環境を整えなければ
新しい言語を触るとなったら、まず必要なのはPythonとIDEなどの環境、postgresに繋ぐためのライブラリ。
とりあえず以下を入れました。

Pycharm
Python3.0
postgres-x64-10

そしてPostgresとの接続に必要らしい、anaconda3、psycong2。
インストールはこちらを参考にさせて頂きました。
http://prunus1350.hatenablog.com/entry/2016/01/09/135110
##インストールが終わったら
一通りインストールが終わったら、とりあえずpgadmin4を開いてみた。
https://dev.to/programmingmonky/postgresqlsql-3dja
上記を参考にしながら新しいスキーマ、テーブルを作成。
SQLによって自分の作成したテーブルにレコードが追加されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353603/6c03ea5c-e9d4-2fa2-eafb-38df144a8e82.png)
できた。名前が適当すぎるがpgadmin4でSQLでレコードが取れる状態になりました。
で、このレコードをPythonで取れるようにしたいので次はpython。
##ソースの作成
セットアップが終わったので、
とりあえずPycharmでソースを書いてみた。

```python:pythonTest.py
import psycopg2


# connect postgreSQL
users = 'postgres'　# initial user
dbnames = 'DB名'
passwords = 'パスワード'
conn = psycopg2.connect(" user=" + users +" dbname=" + dbnames +" password=" + passwords)

# excexute sql
cur = conn.cursor()
cur.execute('SELECT * FROM table1;')
results = cur.fetchall()

#output result
print(results)

cur.close()
conn.close()
```
こんな感じ。
ローカルでつなぐ場合には、host、portは必要ありません。
また、握ったConnectionはキチンと開放します
これをコンソールから実行します。

```console:console
C:\pythonDirectry> python phthonTest.py
[('1', 'テスト１', 'テスト２', 'テスト３')]
```
とれました。
めでたし。

##そう簡単にいかなかったんだってばよ
```:console
C:\pythonDirectry>python pythonTest.py
Traceback (most recent call last):
  File "pythonTest.py", line 1, in <module>
    import psycopg2
  File "C:\pythonDirectry\psycopg2\__init__.py", line 50, in <module>
    from psycopg2._psycopg import (                     # noqa
ModuleNotFoundError: No module named 'psycopg2._psycopg'
```
最初にセットアップしたときに怒られたもの。
AWSに上がっているプロジェクトを面倒くさがって流用してしようしていたところ、怒られてしまった。
AWSで使うにはLinux用のpycong2が必要ですが、
Windows上で開発するときはWindowsx64など、対応するパッケージを参照しているかを確認してから作業しましょう。
参考にさせて頂いた質問
https://github.com/jkehler/awslambda-psycopg2/issues/23
##そう簡単にいかなかったんだってばよ2
```console:console
C:\pythonDirectry> python pythonTest.py
Traceback (most recent call last):
  File "pythonTest.py", line 10, in <module>
    + '***')
  File "C:\Users\***\AppData\Local\Continuum\anaconda3\lib\site-packages\psycopg2\__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused (0x0000274D/10061)
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 5432?
could not connect to server: Connection refused (0x0000274D/10061)
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?
```
エラーでた。。。つながらないよ！といわれている。
PORTの空き状態とかいろいろ見てみたが、とりあえずpostgres再起動したら解消した。
しかし、よく見たらpostgresが死んでいたらしい。pgadmin4上で死んでるよ！と言われていたのに後で気づいた。
なんてこった。
LaravelのEagerロード（ネストしたリレーション）にほんの少し詰まったのでメモした

LaravelでEagerロードをしようとした際に、ほんの少しだけ詰まったので備忘録的にまとめました。

#はじめに
Laravelには、N+1クエリ問題の解決策として、Eagerロードが用意されています。

このEagerロードを、とあるケースで使おうとした際に、詰まったのでそれについて書いて行きます。

ではまずは、僕がLaravelのEagerロードで詰まったケースについて、まずは提示していきます。

#####サービス内容
典型的な求人システムの開発

#####DB設計

| usersテーブル      |
|:-----------------|
| id               |
| name             |
| email            |
| password         |

| companiesテーブル  |
|:-----------------|
| id               |
| name             |
| email            |
| password         |

| jobsテーブル  　　　|
|:-----------------|
| id               |
| company_id       |
| title            |
| description      |

| entriesテーブル  　|
|:-----------------|
| id               |
| user_id          |
| job_id           |

企業（Company）が求人（Job）を作成し、ユーザー（User）が求人に応募(Entry)
することができる簡単な構成です。

#どこで詰まったのか
やりたかったことは、ユーザーのマイページに、応募済みのすべての求人を表示することです。表示される求人には、企業名も表示したいので、企業名をEagerロードする必要がありました。

最初こんな感じで書きました。

```php:UserController.php

public function entriedJobs()
{
    $user = Auth::user();

    //自分の応募情報をすべて取得する
    $entries = App\Entry::where('user_id', $user->id)->get();
    $entries->load('job');

    //自分の応募情報から求人情報をリレーションですべて取得する
    $jobs = [];
    foreach ($entries as $entry) {
        $jobs[] = $entry->job;
    }

    return view('user.entried-jobs', [
        'user' => $user,
        'jobs' => $jobs,
    ]);
}

```
ただこれでは、求人（Job）しかEagerロードできていません。企業情報（Company）もEagerロードしたいです。

最初は、以下のようにEagerロードしようとしましたが、ここではリレーションで求人情報を取得しているため、当然エラーがでます。なぜなら、EagerロードはEloquentの動的プロパティを使用した際にしか使えないためです。

```php:UserController.php

    $jobs = [];
    foreach ($entries as $entry) {
        $jobs[] = $entry->job;
    }
    $jobs->load('company');

```

あらためてLaravelのドキュメントを確認したところ、ネストしたリレーションをEagerロードする際には、以下のように「ドット」記法が使用できるようです。

```php:UserController.php

public function entriedJobs()
{
    $user = Auth::user();

    $entries = App\Entry::where('user_id', $user->id)->get();
    //ネストした遅延Eagerロード
    $entries->load(['job',  'job.company']);

    $jobs = [];
    foreach ($entries as $entry) {
        $jobs[] = $entry->job;
    }

    return view('user.entried-jobs', [
        'user' => $user,
        'jobs' => $jobs,
    ]);
}

```

参考：[Laravel 5.7 Eloquent：リレーション](https://readouble.com/laravel/5.7/ja/eloquent-relationships.html#eager-loading)

# 最後に
よく分からない点や間違っている点がありましたら、コメント欄で教えていただければと思いますm(_ _)m
Vue.jsでESLint

## VueでESLint

不要なのがあるかもしれない・・・
プロジェクト作成時にprettierは入れている

```bash
npm install --save-dev eslint-config-standard
npm install --save-dev eslint-plugin-import
npm install --save-dev eslint-plugin-node
npm install --save-dev eslint-plugin-promise
npm install --save-dev eslint-plugin-standard
```

## 設定ファイルの編集

プロジェクトルート直下の「.eslintrc.js」を編集する
細かい部分は調整が必要かもしれない

```javascript
module.exports = {
  root: true,
  env: {
    node: true,
    mocha: true,
    browser: true,
  },
  extends: [
    'standard',
    'plugin:vue/recommended',
    'plugin:prettier/recommended',
  ],
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'prettier/prettier': [
      'error',
      {
        semi: false,
        singleQuote: true,
        trailingComma: 'es5',
        indent: ['error', 2],
        'no-multiple-empty-lines': ['error', { max: 1 }],
      },
    ],
    // 'vue/html-closing-bracket-newline': 'off',
    'vue/max-attributes-per-line': 'off',
    'vue/html-self-closing': [
      'error',
      {
        html: {
          void: 'always',
          normal: 'always',
          component: 'always',
        },
        svg: 'always',
        math: 'always',
      },
    ],
    'vue/html-indent': [
      'error',
      2,
      {
        attribute: 1,
        baseIndent: 1,
        closeBracket: 0,
        alignAttributesVertically: true,
        ignores: [],
      },
    ],
  },
  parserOptions: {
    parser: 'babel-eslint',
  },
}
```

## 実行してみる

```bash
npm run lint
```
サーバーのプロセスが生き残っててサーバーが起動できない時の対処法

# ひょんな拍子にプロセスを生き残らせてしまう
サーバーストップする前にsshから抜けちゃうとか、会議でPC持ってったらVPN切れちゃってとか・・・
で、戻ってくると、サーバーが立ち上がらなくて、スムーズに業務に戻れない的な現象にちょくちょく当たる。
単にそそっかしい私の性格から起こる現象だと思いますが、よくそれでお世話になるコマンドをここに覚書として記します。

```
(port is in use or requires root privileges) (RuntimeError)
```

上記のようなエラーが出たりします。

## 解決策

```
$ ps ax | grep サーバー名
```
railsサーバーなり、thinなり、nginx、apache、使ってるサーバー名のプロセスをgrepかけて特定。

すると、

```
24245 pts/0    Sl+    0:48 ruby /home/chinchirorin/.rvm/gems/ruby-2.1.9@hogehoge/bin/thin start -p 3333
```

上記のようにプロセスIDを出せます。
一番左端にあるのが、それです。

で、これを

```
$ kill -9 24245
```

killしてあげれば、サーバーを正常に立ち上がらせることができます。
VBScriptについて

VBSでEXCELマクロ実行
--
pushd E:\test
RunMacro.vbs マクロ.xlsm

--
RunMacro.vbs (macro1はEXCELマクロの名前)

```vb
Dim BookPath
Dim FS, Folder
Dim Excel, Book, Sheet

main

If Err.Number = 0 Then
	WScript.Quit(0)
Else
	MsgBox Err.Description

	If IsNull(Excel) Then
		Excel.Quit
	End If

	WScript.Quit(1)
End If

Sub main()

	BookPath = WScript.Arguments(0)

	Set FS = WScript.CreateObject("Scripting.FileSystemObject")
	Set Folder = FS.GetFolder(".")

	If Mid(BookPath, 1, 1) <> "\" And Mid(BookPath, 2, 1) <> ":" Then
 		BookPath = Folder.path + "\" + BookPath
	End If

	Set Excel = WScript.CreateObject("Excel.Application")

	Excel.Visible = False
	Excel.DisplayAlerts = False

	Excel.Workbooks.Open BookPath

	Set Book = Excel.Workbooks(1)
	Set Sheet = Book.Sheets(1)

	Excel.Run "macro1"
	'①②③はどちらでもマクロファイルを保存なしで終了する
	'Book.Saved=true
	'②
	'Book.Close False 
	'③
	Excel.DisplayAlerts = False 
	'マクロファイルを保存して終了する
	'Book.Save
	'Book.Close
	Excel.Quit

End Sub
```

VBSでIEを開く
--
```vb

 Set objIE = CreateObject("InternetExplorer.Application")
 objIE.Visible = True

 objIE.FullScreen = False
 objIE.Top = 100
 objIE.Left = 1480
 objIE.Width = 430
 objIE.Height = 150

 objIE.Toolbar = False
 objIE.MenuBar = False
 objIE.AddressBar = False
 objIE.StatusBar = False

 objIE.Navigate2 "http://server/solar/default.asp"

 Set WSHShell = WScript.CreateObject("WScript.Shell")
 WSHShell.AppActivate "Explorer"
```
コメントの書き方なにもわからない

この分野は素人なのですが、配列の連番と要素の考え方がなにもわかりません。

例として、０オリジン（zero-based）な言語で以下のような配列を定義します。

```c
int a[] = {1, 2, 3, 4, 5};
```

この配列から、`2`と`4`だけを出力したいです。

```c
for (int i = 0; i < 5; i++) {
    /* [  ?  ]を取り出す */
    if (i % 2 == 1)
        printf("%d\n", a[i]);
}
```

簡単ですね。

ここで問題です。
ソースコード上の`[  ?  ]`に適切な語句を埋めてください。

奇数番目？　偶数番目？　２ｎ＋１番目？

とりあえず「連番が奇数となる要素」って書いて事なきを得たものの、冗長な感じが否めないんですよね。誤解を招くくらいならいっそこれでいいのかな。
１オリジン（one-based）な言語ならこんなこと悩まずに済むのですがね。
Finderのサイドバーに突然現れた「？」という名前のファイルを削除する方法

ある日、FinderのFavoriteリストに「？」という名前の項目が現れました。

クリックしても "? can't be opened because the original item can't be found." というメッセージが出て、deleteすることもできません。

試行錯誤したところ、解決法はシンプルに「ドラッグ＆ドロップ」。

ファイルをドラッグしてウィンドウの外に持っていきドロップすると、簡単に消すことができました。
オセロAIの学習のためのデータをダウンロードするプログラム

#初めに
プログラミングを勉強するには何を作るか目標を立てるのがベストだといいます。
私が目標として選んだのはオセロです。
ゲーム開発の勉強も兼ねて[Unity](https://unity.com/ja)でオセロを作りました。
一人でプレイできるようにはなったものの、AIが作れません。
強化学習だか深層学習だかで実装できるようなので勉強しながらコードを書いていきます。
今のところデータをダウンロードしただけです。
[ここのデータ](https://www.skatgame.net/mburo/ggs/game-archive/Othello/)をダウンロードしました。


#ソースコード

言語は機械学習のライブラリが豊富なpythonです。
同階層にdatasetというディレクトリを作成し、その中にデータを入れていきます。

```python:download.py
import sys
import urllib.request
import os.path

url = "https://www.skatgame.net/mburo/ggs/game-archive/Othello/"
#ダウンロードするファイルのリスト
fileList = {

}
#ダウンロードするファイルのリストを作る
for fileNumber in range(1, 155):
    if fileNumber <= 9:
        fileList[fileNumber] = 'Othello.0' + str(fileNumber) + 'e4.ggf.bz2'
    elif fileNumber <= 128:
        fileList[fileNumber] = 'Othello.' + str(fileNumber) + 'e4.ggf.bz2'
    else:
        fileList[fileNumber] = 'Othello.' + str(fileNumber) + '.ggf.bz2'
    print('making download list...' + fileList[fileNumber])
    pass
print("Done")

def _download(fileName):
    filePath = "./dataset/" + fileName

    if os.path.exists(filePath):
        return

    print("Downloading " + fileName + " ... ")
    urllib.request.urlretrieve(url + fileName, filePath)
    print("Done")

#ファイルをダウンロードする
for fileName in fileList.values():
    _download(fileName)
```

#今後
次はダウンロードしたファイルを解凍する予定です。
手動で解凍したらこんなデータが出てきました。(改行がないので見づらいですが)

```Othello.01e4.ggf
(;GM[Othello]PC[GGS/os]DT[940606712]PB[igor]PW[ant]RB[1285.87]RW[1471.98]TI[15:00//02:00]TY[8]RE[-38.00]BO[8 -------- -------- -------- ---O*--- ---*O--- -------- -------- -------- *]B[D3//4.58]W[C5/8.57/1.56]B[D6//1.67]W[E3/-35.58/0.09]B[F4//1.05]W[C6/-52.58/0.08]B[F5//1.41]W[C3/-24.58/0.06]B[C4//1.00]W[B5/-39.58/0.06]B[B4//0.93]W[F3/18.69/0.02]B[A5//2.25]W[B6/8.83/0.01]B[E6//1.40]W[A6/3.56]B[A7//1.72]W[A3/5.22/0.01]B[C7//2.88]W[D7/8.34/0.01]B[C8//1.78]W[G4/5.74/0.01]B[H3//4.70]W[F7/8.15]B[E7//3.44]W[G6/4.89/0.01]B[G3//3.31]W[G5/8.55/0.01]B[H5//1.46]W[F8/18.78/0.01]B[E8//4.44]W[F6/20.19/0.01]B[F2//4.39]W[D2/22.85/0.02]B[E2//1.56]W[C2/24.21/0.01]B[D1//4.15]W[B3/27.01/0.01]B[C1//2.23]W[A4/29.50/0.03]B[A2//1.40]W[G2/31.79/0.01]B[F1//4.67]W[H1/36.59/0.01]B[G1//1.46]W[E1/42.76]B[B2//1.40]W[A1/35.63/0.01]B[B1//0.88]W[H2/34.88/0.01]B[G8//3.04]W[D8/35.22/0.01]B[G7//1.66]W[H8/35.13/0.01]B[H7//0.91]W[H6/37.81/0.01]B[pass//0.68]W[H4/40.62/0.01]B[pass//0.62]W[B7/39.05/0.01]B[B8//1.80]W[A8];)
```

初心者がこのデータの前処理をするのは大変そうですが…
やるしかない！乞うご期待！

アドバイスがあればください！

#追記(2019/07/11)
今はDjangoの勉強で忙しいので続きは夏休みあたりになりそう。

#追記(2019/09/04)
先駆者が整形済みのデータを公開していました。
これを使います。
[オセロの教師データ公開【ディープラーニング】 - meipuruのブログ](http://meipuru-344.hatenablog.com/entry/2017/11/27/205448)
[学習データ](https://drive.google.com/uc?id=1b3FwVioqOwprVoI1wCd80CM4YP3q0Pxf&export=download)
初心者が知っておきたいGit-概要編-

# Gitとは
　バージョン管理システム。
ファイルの変更履歴を管理、追跡するもの。

# Gitを使うメリットとは
　複数人での開発において誰がどこを変更したかがわかる。
変更履歴を比較でき、問題箇所が見つけやすい。
ファイルの変更履歴を残しておくことによって過去の状態に遡ることができる。

# プラットフォーム
見かけることが多いのは以下の二つ。

- GitHub
- Bitbucket

そこでリポジトリを作成していく。

# リポジトリとは
　ファイルやディレクトリの状態を記録する場所のこと。
ローカルとリモートの２種類が存在し、ローカルリポジトリで開発したものをリモートリポジトリに反映させていくという流れになる。

<table>
  <tr>
    <td>ローカルリポジトリ</td>
    <td>各々のPCに配置する、開発作業をするためのリポジトリ</td>
  </tr>
  <tr>
    <td>リモートリポジトリ</td>
    <td>専用のサーバを配置し、複数人で共有するためのリポジトリ</td>
  </tr>
</table>
内密に言えば少し違ってくるけれどイメージ的にはそれぞれローカルで担当の部品を作ってリモートで組み立てるような感じ。

# ローカルからリモートへ
共有化したいデータをリモートへ移すには

- add
- commit
- push

をする必要がある。

<table>
  <tr>
    <td>add</td>
    <td>共有化したいデータをリモートにあげる準備（ステージングエリアにあげる）をする</td>
  </tr>
  <tr>
    <td>commit</td>
    <td>ローカルリポジトリにその変更を履歴として残す</td>
  </tr>
  <tr>
    <td>push</td>
    <td>変更内容をリモートリポジトリに反映する</td>
  </tr>
</table>

これらの一連の流れによって複数人でデータを共有できるようになる。

# ステージングエリア
 作業スペースからローカルリポジトリにあげる時に挟む場所。
変更したものの中からローカルリポジトリに作業スペースでの変更を選択する場所。

# リモートからローカルへ
　他者の変更をローカルの環境に反映させたい場合、

- fetch
- merge

または

- pull

をする必要がある。
<img src='http://elsur.xyz/wp-content/uploads/2017/02/git-flow.png' width="80%">
<a href="http://elsur.xyz/git-commands-pull-fetch">【Git】トラッキングブランチの存在を意識して理解を深める</a>
# ブランチとは
　変更履歴の流れを分岐させ記録していくもの。
本番用・開発用・新機能用・バグ取り用などで分けたり、作業や機能ごとに分けたりなどする。
ブランチを分け、それぞれ開発し、合わせる(マージという)流れで開発していく。
ここで気をつけたいのは合わせる時にコンフリクトしてしまうこと。

## ローカルブランチ
　ローカルリポジトリ上のブランチ。
自分の作業の履歴を残していくためのもの。

## リモートブランチ
　リモートリポジトリ上のブランチ。
他者の作業の履歴などを共有して残していくためのもの。


本来であれば、トラッキングブランチというブランチも押さえておくべきなのだが、トラッキングブランチに関してはこちらの記事を参考にしてほしい。
参考：<a href="http://elsur.xyz/git-commands-pull-fetch">【Git】トラッキングブランチの存在を意識して理解を深める</a>

# コンフリクトとは
　同じファイルの同じ場所を同時に変更してしまうことでGItがどちらを優先すべきか判断できず衝突すること。
Aさんが変更していたところをBさんも変更していた…と言う時などに起こってしまう。
どちらの変更が正しいのか、見比べる必要があり、あまり起こってほしくない事態である。

# まとめ
　段階ごとに履歴を残しておけばその状態に戻ることもできるので、「開発してたら前よりも悪い状況になってしまった」なんて時に便利ですね。
ちなみにコマンドで打つCUIのものと画面を操作して行うGUIがあり、イメージはGUIの方がつきやすいけれどCUIで使えないと理解しているとは言えないので、CUIも使いこなせるようにすべきかと思います。
そのコマンドに関してはまた記事にしていこうと思います。

参考：<a href="https://www.yoheim.net/blog.php?q=20140104">[git] 基本操作（clone、add、commit、pushなど）を覚えて、開発出来るようになる</a>
　　：<a href="https://qiita.com/satoshi1335/items/ead109412430a078feaa#git%E3%81%AE%E6%A6%82%E5%BF%B5%E5%9B%B3">Gitの基礎</a>
　　：<a href="https://qiita.com/forest1/items/db5ac003d310449743ca">【Git】リモートからの取得とリモートへの反映で行っていること(fetch,pull,push)</a>
　　：<a href="https://open-groove.net/git/git-summary/">Git概念の整理を試みる</a>
PostgreSQLが起動できなくなっていた時の対処法

# 状況
新しくアプリを作る際に、以前PostgreSQLで作成していたアプリを参考にしようと思ってDBを覗こうとしたらPostgresに接続できなくなっていた。

```
psql -l
```

結果、下記のようなエラーが出てポスグレに接続出来ない

```
psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

色々調べた結果、下記コマンドを実行すると、、、

```
postgres -D /usr/local/var/postgres
```

```
[2960] FATAL:  database files are incompatible with server
[2960] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.2.
```

どうやらポスグレのバージョンがおかしいらしい
ということで、

```
brew postgresql-upgrade-database
```
このコマンドを実行したところ、

```
==> Upgraded postgresql data from 10 to 11!
==> Your postgresql 10 data remains at /usr/local/var/postgres.old
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

アップグレードに成功し、

```
psql -l
```

```
                                       List of databases
           Name           | Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
--------------------------+--------+----------+-------------+-------------+---------------------
 hoge_development | hoge | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 hoge_test        | hoge | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
```

psqlコマンドも使えるようになり、接続できるようになった。
java Documentation Comment

アクセス修飾子protected以上のスコープで公開しているものにはDocumentation Commentを付ける。

```
/**
* 先頭にメソッドやクラス, フィールドの要約
* 必要であれば詳しく説明
* @author 名前
* @param 引数 説明 
* @throws 例外名 条件
* @return 返り値の説明
*/
```
指定した期間の日付文字列を得る

date コマンドを利用しているので、うるう年も対応してます。

```shell
$ for D in $(seq $(date -d'2016/2/25' +%s) 86400 $(date -d'2016/3/2' +%s)); do date -d@$D +'%Y/%m/%d';done
2016/02/25
2016/02/26
2016/02/27
2016/02/28
2016/02/29
2016/03/01
2016/03/02
```
LuaTeXでbeamerとpdfxを使う

LaTeXのbeamer.clsで生成したPDFを特に数式まで含めて検索可能にするためにpdfx.styを使おうとすると `\pdfminorversion` が未定義でエラーになる対策は `pdfx.sty` を読む前に `luatex85.sty` を読めばよい。以下例

```latex
\RequirePackage{luatex85}
\pdfminorversion=7
\pdfobjecompresslevel=2
\pdfcompresslevel=9
\documentclass[luatex,unicode]{beamer}
\usepackage{unicode-math}
\usepackage[match,deluxe]{luatexja-preset}
%\setmainfont{STIX2Text-Regular}[
%    Extension=.otf,
%    BoldFont=STIX2Text-Bold,
%    ItalicFont=STIX2Text-Italic,
%    BoldItalicFont=STIX2Text-BoldItalic
%]
\setmathfont{STIX2Math.otf}
\usepackage[a-2u,pdf17]{pdfx}
```

`pdfx.sty` のメンテナにメール送ったらそちらでもこの問題を再現できるそうで、`beamer.cls`が読み込んでいる`pgf`との相性問題なんだそうです…
logistic regressionのp値とbetaからseを計算する

なぜこんなことを

```
P = (1-pnorm(abs(d$BETA/d$SE)))*2
```

なので

```
1 - P/2 = pnorm(abs(d$BETA/d$SE))
qnorm(1-P/2) = abs(d$BETA/d$SE)
abs(qnorm(1-P/2)) = d$BETA/d$SE
d$SE = d$BETA/abs(qnorm(1-P/2))
```
Coldfusionでのmodelの操作

Coldfusionでのmodelからのデータの取り出し型の紹介です。

#基本
基本はcfqueryタグの中にSQLを書きます。
下記はt_userテーブルのuser_nameを表示するコードです。

```
<cfquery name="qUserData" datasource="sample_db">
　　　SELECT　user_name
　　　FROM　t_user
　　　WHERE　status_flg = 1
</cfquery>

<cfoutput>
 <cfloop query="qUserData">
　 #qUserData.user_name#
 </cfloop>
</cfoutput>
```

上記のコードでは、t_userテーブルのuser_nameを取得して、その結果をqUserDataとして扱っています。
その後cfloopを用いてqUserData内のレコードの数だけuser_nameの情報を表示させています。

#その他
Coldfusionではsql内にif文なども書くことができます。
似たようなコードを書くときに使えたりするので結構便利です。

```
<cfset user_id ="1">
<cfquery name="qUserData" datasource="sample_db">
　　　SELECT　user_name
　　　FROM　t_user
　　　WHERE　status_flg = 1
　　　<cfif user_id is not "">
	    AND user_id= <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#user_id#">
　　　</cfif>
</cfquery>

<cfoutput>
<cfif qUserData.recordCount gt 0>
 <cfloop query="qUserData">
　 #qUserData.user_name#
 </cfloop>
</cfif>
</cfoutput>
```
上記のコードでは、、t_userテーブルのuser_nameを取得して、その結果を表示するという、基本の時と同じ動きをするコードですが、sql文の中でif文を使うことで変数に値がある場合は条件を追加などが可能になります。（変数に値があったらjoinさせるなど)
課題研究（4月21日～5月9日の授業内容）

#目次
[１．課題研究について](#１課題研究について)
[２．ＡＩチーム](#２AIチーム)
[３．大田区チーム](#３大田区チーム)
[４．デジタルサイネージチーム](#４デジタルサイネージチーム)

#１.課題研究について
私たちは課題研究という授業の中でAIチーム、大田区チーム、デジタルサイネージチームの３つのグループに分かれて活動しています。
**AIチーム→簿記の知識が入ったAIの開発**
**大田区チーム→大田区を活性化させるための取組**
**デジタルサイネージチーム→学校用のデジタルサイネージの開発**
各班、ゴールに向かって授業を進めています。

#２.ＡＩチーム
仕事を分担して各自進めています。
簿記の仕訳を作る人、モナカでサンプル、チュートリアル、ログイン、会員認証機能を学ぶ人、勘定科目や仕訳の例を書き込む、簿記の説明や簿記の意味を書き込む人、勘定科目の説明をうつす人、表の作り方を書き込む人、問題作りの人で分担をしています。
問題集を参考にして書き込んでいます。

#３.大田区チーム
昨年、私たちクラスがマーケティングの授業で大田区にある「ブックカフェ羽月」のプロデュースをしました。各班に分かれてそれぞれ抱えている問題点をなくしていきました。
大田区チームはまず、その各班がやり残した仕事を片付けています。
主にやっていることは、くじ・特典班がやり残した外国人観光客向けの折り紙の折り方を説明する動画の編集(字幕をつける等)、Web班が作成したWebの改良です。


#４.デジタルサイネージチーム
まずモニターに映したいものは何か？学校内で困っていることは何か？という話し合いました。
意見として上がったものは、「教科係が教員を探す際どこにいるかわからない」「教員の出張状況が知りたい」「委員会の呼び出し」「授業変更」「部活動の大会の結果」「検定の日程、申込日」です。
私たちの意見のみならず他の生徒にも取り入れました。

この意見をさらに絞り、実際に表示させるものを「検定の日程、申し込み」「委員会の呼び出し」「時間」「写真」に絞りました。
写真に関しては背景が寂しいという意見が上がったので写真部から写真を提供してもらい、スライドショーを流していくことにしました。
【はじめてのUiPath】セレクターを動的に変更してみる（変数・ワイルドカード）


こんにちは！

今回はUiPathでセレクターを動的に変更するやり方を書きたいと思います！

同じことをやるんだけど、アプリが違ったりサイトが違ったりするとセレクターが変わってしまってうまく認識してくれないんですよね。

というわけで、さっそくいきましょう！！


ワイルドカードの知識はある前提でいきますよぉぉぉぉおお！


# セレクターの書き方（ワイルドカード編）


https://google.comでスクリーンショットをとるとします。

ちなみに、UiPathには「スクリーンショットを撮る」というアクティビティがあります。


「スクリーンショットを撮る」アクティビティで、https://google.comを選択するとこんなセレクターが抽出されました。

```
<html app='chrome.exe' title='Google' />
<webctrl id='viewport' tag='DIV' />
```

スクリーンショットを撮りたいサイトがすべて「Google」から始まるタイトルだとしましょう
その場合はセレクターはこのように変更します。

```
<html app='chrome.exe' title='Google*' />
<webctrl id='viewport' tag='DIV' />
```

Googleの後にアスタリスクを付けました。

逆にGoogleで終わる文字列であればこうなります。

```
<html app='chrome.exe' title='*Google' />
<webctrl id='viewport' tag='DIV' />
```

逆に逆に、文字列の中にGoogleって必ず入っていればこうなります

```
<html app='chrome.exe' title='*Google*' />
<webctrl id='viewport' tag='DIV' />
```

Googleとあと一文字の場合はこうなりますね！

```
<html app='chrome.exe' title='Google?' />
<webctrl id='viewport' tag='DIV' />
```

まあそんな感じです。

# セレクターの書き方（変数編）

セレクターに変数を埋め込んでいきましょう！！

先程のこいつを使います。

```
<html app='chrome.exe' title='Google' />
<webctrl id='viewport' tag='DIV' />
```

タイトルの部分を変数にしていきましょう。

UiPath Studioからみるとこんな感じです。

![UiPath Studio - スクショ自動化 2019_05_16 15_03_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/4fdd181b-d4eb-ed28-dbab-d30ac052173d.png)

1. まずは、改行を全て消します！！

```
<html app='chrome.exe' title='Google' /><webctrl id='viewport' tag='DIV' />
```

2. つぎに一番左と一番右にダブルクォーテーションをつけます！

```
"<html app='chrome.exe' title='Google' /><webctrl id='viewport' tag='DIV' />"
```

3. 変数にした文字列を`" + 変数 +"`に置き換える（ここで変数はvariableと示すことにします）

```
"<html app='chrome.exe' title='" + variable + "' /><webctrl id='viewport' tag='DIV' />"
```

4. これをセレクターに貼り付ける！！


以上です！！


セレクターがいろいろ使いやすくなると、超幅が広がるらしいですよ～
というわけで、みなさんもやってみてください！
UnityでHTTP通信をするときのAndroid9(Pie)対応の件

## はじめに
Android9 (Pie)から、暗号化されてない通信はデフォルトでは無効になっており、通信を許可するためには設定が必要になります。Unityで、Android Manifestをカスタマイズするときにはまったので、設定方法を残しておこうと思いました。

## Android Manifest側の設定
### 簡易編
``` 
<application android:usesCleartextTraffic="true"
        ...
</application>
```
上記のように設定すれば、HTTP通信はすべて通す設定になります。

### 詳細設定編
Android Manifestに次のように設定を書きます

```　
<application android:networkSecurityConfig="@xml/network_security_config">
        ...
</application>
``` 

次に、Plugins/Android/res/xml/　以下にnetwork_security_config.xmlというファイルを準備します。

先程の設定と同様にすべての通信を通すのであれば、

```
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
```

とします。
もし、特定のドメインのみ平文を通したい場合は

```
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">www.example.com</domain>
    </domain-config>
</network-security-config>
```
注意
www.example.com
の部分は平文を通したいドメイン（自分で変更する)

## まとめ
Android9(Pie)から、iOSのATSと同様の決まりがはいりました、上記のように設定を行ってセキュリティを高めてアプリを作成しましょう。
EC-CUBE4で管理画面からロゴを画像に変更するカスタマイズ例

説明は後で追加します。


## ロゴ画像に変更

```html:logo.twig
<!-- ロゴを画像にする場合h1タグの中をimgタグにする -->
<h1><img src="http://placehold.jp/500x50.png" alt="{{ BaseInfo.shop_name }}"></h1>
```

## デバイスごとにロゴ画像に変更

```html:logo.twig
<!-- PCとSPでロゴを画像を切り替える場合はpictureタグを使う -->
<h1>
	<picture>
	<source media="(max-width:375px)" srcset="http://placehold.jp/200x50.png?text={SP用ロゴ}">
	<img src="http://placehold.jp/500x50.png?text={PC用ロゴ}" alt="{{ BaseInfo.shop_name }}">
	</picture>
</h1>
```
EC-CUBE4で管理画面から横幅の制限を外すカスタマイズ例

後で説明を追加します。

```css:customize.css
/* メインコンテンツ外枠の横幅固定を外す */
.ec-layoutRole .ec-layoutRole__contents{
    max-width: none; /* 1150px; */
}

/* スライドショーの横幅固定を外す */
.ec-sliderRole{
   max-width: none; /* 1130px; */
   padding-left: 0; /* 20px; */
   padding-right: 0; /* 20px; */
}
```
EC-CUBE4でカテゴリページごとにコンテンツを追加する例（カテゴリコンテンツプラグインの代用）


EC-CUBE4では管理画面のコンテンツ管理機能を応用するとカテゴリページごとにコンテンツを追加できる。

説明は後で追加します。

```twig:category_contents.twig
{% if Category %}
    {% set category_block_name = 'Block/category_'~Category.id~'.twig' %}
    {{ include(category_block_name) }}
{% endif %}
```

## ジェラートカテゴリのブロック

```twig:category_1.twig
<div class="ec-sliderRole"><img src="{{ asset('assets/img/top/img_hero_pc02.jpg') }}"></div>
```

```twig:category_1.twig
<div class="ec-pickupRole">

    <h2 class="ec-pickupRole__title">
        <picture>
        <source media="(max-width:768px)" srcset="/html/user_data/pickup_gelato_sp.png">
        <img src="/html/user_data/pickup_gelato_pc.png" alt="ジェラート特集">
        </picture>
    </h2>
    <p class="ec-pickupRole__description">
        カテゴリ一覧に静的HTMLを追加し、特集ページを作る方法です<br>
        picuture要素を使うことで、特集タイトル画像をPCとスマホで切り替えることができます。
    </p>
</div>
```

```css:customize.css
img{
    max-width: 100%;
    height: auto;
}
.ec-pickupRole{
    width: 100%;
    max-width: 1130px;
    margin: 10px auto 30px;
}
.ec-pickupRole__title{
    margin-bottom: 20px;
}
.ec-pickupRole__description{
    text-align: center;
    font-size: 18px;
    font-weight: bold;
}
```

## アイスカテゴリのブロック

```twig:category_5.twig
<div class="ec-sliderRole"><img src="{{ asset('assets/img/top/img_hero_pc05.jpg') }}"></div>
```
Vue.jsでGTMを組み込む

## やりたいこと
Vue.jsのコンテンツでタグマネージャーを使う（アナリティクスを読み込むなど）
以下そのための前準備です

## 前提
アナリティクスのアカウントがあり、GTMに連携済みであること
タグマネージャーでは環境別の設定をされていること

## 手順
「public/index.html」のheadの最初に追記

```public/index.html
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl+ '&gtm_auth=<%= VUE_APP_GTM_AUTH %>&gtm_preview=<%= VUE_APP_GTM_PREVIEW %>&gtm_cookies_win=x';f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','<%= VUE_APP_GTM %>');</script>
```

「public/index.html」のbodyの最後に追記

```html
<noscript>
<strong>JavaScriptが有効になっていないとサイト内は正しく機能しません。JavaScriptを続行するには有効にしてください。</strong>
<iframe src="https://www.googletagmanager.com/ns.html?id=<%= VUE_APP_GTM %>&gtm_auth=<%= VUE_APP_GTM_AUTH %>&gtm_preview=<%= VUE_APP_GTM_PREVIEW %>&gtm_cookies_win=x"
               height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
```

## 環境変数

#### 各環境毎のファイルを用意する

「.env.production」「.env.develop」「.env.staging」などなどプロジェクトルートの直下に置く

#### 各環境毎に設定を記載する

serveで再起動しないと反映しないので注意

```ini
VUE_APP_GTM="GTM-YOURCODE"
VUE_APP_GTM_AUTH="YOURAUTH"
VUE_APP_GTM_PREVIEW="env-your"
```

## GTMでの設定

#### GAのページビュー

履歴の変更をアナリティクスに紐つければ取れる
【はじめてのUiPath】ブラウザを開いて、そのページの「タイトル(title)」を取得する！

任意のサイトのタイトルをとってくることにします。

ここでやる手順はこんな感じです。

1. 適当なURLでブラウザーを立ち上げる
2. そのサイトのタイトルを取得する


# 全体像はこんな感じ

全体像はこんな感じです。
（ちょっとみえにくいなあ）


<img width="243" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/eb4667f1-7a26-7562-eaef-e0daeb131c90.png">


一つ一つ説明していきます！

## 1. とりあえずブラウザを開く

アクティビティパネルから「ブラウザを開く」を持ってきて、適当にURLをいれます。

![UiPath Studio - スクショ自動化 2019_05_16 14_04_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/d92cae05-e5c3-7a48-67cd-06574588e275.png)


プロパティパネルにある「出力」は、「UIBrowser」という名前の変数にしました。

変数の型は、「Browser」という型になっていますねぇ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/64f4ba95-6776-6ce1-cd98-552c2d0b37b9.png)


## 2. タイトルを取得するための準備をする

まずは、タイトルを取得するための準備をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/dca1afcb-e321-4884-c040-97821515db3e.png)

代入アクティビティを用意して、先ほどのBrowser型の「UIBrowser」を新しく定義する「UIBrowserElement」に代入します。

UIBrowserElementの型は、「UiPath.Core.UiElement」です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/ef3f69b0-0719-2307-a539-29742961dbf2.png)


次にいよいよタイトルを取得していきましょう！！

## 3. タイトルを取得する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/7e05777a-9730-af47-94a8-72357e11e80e.png)


右辺は`UIBrowserElement.Get("title").ToString`です。UIBrowserElementから「title」を取得しています！

左辺は適当に`PageTitle`という変数にしています。

## 4. メッセージボックスで表示する

PageTitleをメッセージボックスで表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/d5e926a5-685c-7d57-447f-532737c0a32d.png)


# 任意のサイトのタイトルを取得できると、セレクター操作がいろいろできるようになる

今回はgoogle.comで試しましたが、いろんなサイトを開いて、そのサイト内でぽちぽちしたいことたくさんあるとおもいます！！きっと！

僕は実は、ブラウザーを開いて、スクリーンショットをとるというのをやりたかったです。
スクリーンショットをとるときにブラウザの「title」が変動すると結構困っちゃうんですよね。。

やることはほぼ同じだけど、セレクターのタイトルの部分だけ若干違う。
こういうときにセレクターに変数をぶちこんであげると、どのサイトでも正常にスクショをとってくれるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/c7c6765e-9bfa-3308-0f9a-f4c12edfb2c2.png)


# おわりに

意外と使えそうなので、記事にしてみました。
セレクターのタイトルで困っている人がいれば、ぜひ使ってみてください！
プログラミング未経験者がN予備校の2019年度プログラミング入門をやってみた。part2

#HTMLタグてなんぞ？

こんにちは、新人エンジニアのyusukeです。前回のN予備校の記事
(https://qiita.com/yusuke-aoki/items/24c90d1541459c886224)
に引き続きN予備校やっていきたいと思います( ﾟДﾟ)

##HTMLタグってなに
さて、HTMLを書いていると
<img width="425" alt="コメント 2019-05-16 141049.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/35d24ce4-09ed-17f1-040d-7ebca3aca0f3.png">
【N予備校で作ったやつ】

こんな、タグをいっぱい見かけます。（赤いやつ）

勉強してて、こいつらすげえってなりました。
文字をタグで囲えばめいれいできるんですよ

##HTMLタグとは？

>
HTMLとは、Hyper Text Markup Language(ハイパーテキスト・マークアップランゲージ）の略で、タグというマーク（命令）を使って、HTML文書の構造（ここは見出しでここからは段落など）を指定したり、文字の大きさや色を変えるとか、画像を表示することなどが出来ます。
引用:https://www.google.com/search?q=HTML&rlz=1C1GCEB_enJP849JP849&oq=HTML&aqs=chrome..69i57j69i59j69i61j69i59j69i61j0.1006j0j8&sourceid=chrome&ie=UTF-8


google先生に聞くとこんな感じです

##わからんから実際に作ってみる。
N予備校では、結構詳しく書いてました( ..)φメモメモ

```html
<body>
  <h1>HTML について</h1>
  <h3>さまざまな HTML タグ</h3>
  <p>HTML タグは、文章をマークアップすることで、<br>文章に意味を与えることができます。</p>
  <p>p タグは、段落を表すので、p タグごとに隙間が空いた改行になります</p>
</body>
```

タグを使いながら説明されていてわかりやすいですねー
基礎知識としていろいろ試せそうなところがたくさんありそう。

あとはタグさえ間違えなければ大丈夫そう。

#まとめ
>
`h` タグ は見出しを作る
`p` タグ は段落を作る
`a` タグ はリンクを作る
`img` タグ は画像を作る
`ul` タグ はリストを作る
`table` タグ は表を作る

このくらいの認識があればひとまず大丈夫かなと思ってます。
reCAPTCHA V3導入の問題点

結構ハマるなこれ。

[reCAPTCHA]:https://developers.google.com/recaptcha/docs/v3

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 余談はここから ↓-------------------
スパム対策にGoogle謹製の[reCAPTCHA]を導入することは多いと思う。
`I'm not a robot` でパズルやらされる例のアレだが、
Version3.0ではあのパズルがなくなって、
AIで判別するようになるらしい。
実装はV2とほぼ一緒で簡単に終わったなと思った。

ところが、数日後、

```shell
投稿者数が減ったような気がする
```

という連絡が。

(ﾟ-ﾟ) こりゃあかんやつやも。

こちらとしてはGoogleの実装例そのまま載せたのだが、
エラーを解析した結果、
`timeout-or-duplicate` というエラーばかりだった。

マニュアルには

```
timeout-or-duplicate
The response is no longer valid: either is too old or has been used previously. 
```
https://developers.google.com/recaptcha/docs/verify
と記載されているが、
このtoo oldとは何時間のことなのか。
実際に測ってみたら。5分だった。

＿人人人人人人人人＿
＞　Too Old: 5分　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^￣

有効期限を延ばす手段は管理画面とかにもない。
Googleさん、そりゃねーよ。
さて、困った。これで実装方法を大幅に変えなきゃならん。
方法は3つ。

1. タイマーでtokenを再発行
2. サブミットの直前で発行
3. timeout-or-duplicateを許容する

(｡_｡) さて。。。

----
------------------- ↓ 本題はここから ↓-------------------
#### タイマーでtokenを再発行
コードはこんな感じになるだろうか

```javascript
grecaptcha.ready(function() {
  grecaptcha.execute('reCAPTCHA_site_key', {action: 'user/register'});
  var ticker = setInterval(function(){
    try{
      grecaptcha.reset();
      clearInterval(ticker);
    } catch(e) {}
  },250);
}
```
一定時間が経過した時点でresetを実行する。
これでキーが再発行される（らしい）
setIntervalかsetTimeoutかはお好みで。

#### サブミットの直前で発行
コードはこんな感じになるだろうか
(Jquery記述で申し訳ない)

```javascript
  grecaptcha.ready(function() {
    $('.recaptcha')
      .on('click', function () {
        grecaptcha
         .execute('reCAPTCHA_site_key', {action:'article/edit'})
         .then(function(token) {
           $('form:first').submit();
         });
      });
  });
```

サブミットボタン（type=button）を押したときに、
Googleからキーを発行して貰い、
それが完了したらsubmitを実行する流れ。

これであればタイムアウトが5分でも問題は起こらない。

#### timeout-or-duplicateを許容する
Googleサーバーにverify掛け、
bot判定（Success:false）されたときに結果JSONは以下のような感じになる。

```json
{
  "success": false,
  "error-codes": [
    "timeout-or-duplicate"
  ]
}
```
この`error-codes`を判別してtimeout-or-duplicateの時はそのまま受け付ける。

----
------------------- ↓ 後書はここから ↓-------------------

実際採用したのは3番目。
`timeout-or-duplicateを許容する`である。

タイマーはなるべく避けたかったし、
JSゴリゴリでテスト満載も避けたかったのがその理由。


参考記事:
https://stackoverflow.com/questions/48133487/getting-invisible-recaptcha-to-trigger-on-page-load
ASP.NETについて


```
'/' アプリケーションでサーバー エラーが発生しました。

構成にエラーがあります。 
  説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。 

パーサー エラー メッセージ: CodeDom プロバイダー型 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" を読み込めませんでした。

ソース エラー: 

行 38:     <compilers>
行 39:       <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
行 40:       <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
行 41:     </compilers>
行 42:   </system.codedom>
  

ソース ファイル:  C:\inetpub\wwwroot\kikai_t\web.config    行:  40 


バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.6.1087.0 
```

対処：
IISを実行して、Webサイトを右クリックし、[アプリケーションへ変換]を選択する。 
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/95f95edc-a7a1-8042-17bb-b9922066179a.png)
JavaScriptで文字列が正規表現に合致するかどうかを判別する

## Solution: RegExp.prototype​.test()を使おう

1. 正規表現を定義する
1. チェックしたい文字列を定義した正規表現のtest()メソッドでチェックする
1. Booleanで値が返ってくる

```javascript
const validRegexFormat = RegExp('hoge*')
const string1 = 'hoge'
const string2 = 'bar'
console.log(validRegexFormat.test(string1)) // => true
console.log(validRegexFormat.test(string2)) // => false
```
録音サイトをJavaScriptで作ってみた

#使い方
スマートフォンやパソコンで使えます。（マイク必須）
![r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285513/86d47cc4-d829-1952-cc2c-e22692bb065e.png)
一番左が録音開始
真ん中が一時停止
一番左が停止です。
かんたんに使うことができると思います。
URL: https://anyfre.github.io/record-studio/
## 追記
Record Studioは「Recood」に改め、デザイン変更、多数の新機能を搭載しました。
![Screenshot from 2019-10-21 17-01-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285513/256d87c8-6abb-7b49-318c-80194bf0be05.png)

URL:https://anyfre.github.io/recood/
グローバル変数とローカル変数についてのメモ

```python:test.py
#グローバル変数(どこでも使える)
globalNum = 3


#同じ変数名を使い回す
def sumInt():
    
    #ローカル変数(関数の中でのみ有効)
    local = 2
    print(globalNum + local)


def sumString():
    
    local = "ほげ"
    print(str(globalNum) + local)
    

#関数内でグローバル関数を書き換える
def globalRewrite():
    
    global globalNum
    globalNum = 4
    print(globalNum)
    

sumInt()
sumString()
globalRewrite()
#変数globalNumは書き換わったまま
print(globalNum)
#関数の外でローカル変数localを表示
print(local)
```


結果


```
5
3ほげ
4
4
----------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-a2e37807fa3a> in <module>()
     31 print(globalNum)
     32 #関数の外でローカル変数localを表示
---> 33 print(local)

NameError: name 'local' is not defined

```
学校の遅刻・欠席連絡フォーム作成手順

# 概要

いつもながらグダグダとTwitterを見ていました。
下記記事を見つけました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">さっそく学校の遅刻・欠席連絡フォームを使って遅刻連絡してみました。<br>20秒かかったかな？<br>選択肢から選ぶだけなので超カンタン。<br>ストレス全く無し。<br>娘の高校の先生、本当に有能！<br>全国の小・中・高校、みんなこれにしようよ～٩( ‘ω’  )و <a href="https://t.co/VGmIAiwZ5j">pic.twitter.com/VGmIAiwZ5j</a></p>&mdash; あんだんて (@ammitsucan) <a href="https://twitter.com/ammitsucan/status/1127705498042503168?ref_src=twsrc%5Etfw">2019年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

素晴らしい！全国の皆さんに伝えたい＆こんな感じで運用してもらいたい。。！

ということで先生がすっと運用できるようにできるだけ楽な作成手順をまとめました。
（簡単にできる機能ですが、インターネットになかなかなじみのない先生もいると思います）

# Google フォーム
1. 下記にアクセスします  
https://docs.google.com/forms/u/0/  
※Googleのログインが必要です(ログイン方法:https://www.howtonote.jp/google-account/new/index3.html#section1)
2. 下記の「＋」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/86202140-d607-cb0b-4aca-5d1bb9748986.png)
3. 下記のようにさくっとフォームを作っていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/6580d79e-04f3-0248-a922-14c33b2c3999.png)
4. 右上にある送信ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/50e70920-1b95-c4f0-3849-31186dca10e1.png)
5. 赤丸部分を押して「コピー」を押し、このURLをみんなに配布します(URL を短縮にチェックを入れたほうが短くなります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/257b422a-da81-4983-fc88-051df5779d3f.png)
6. 回答結果を見るときは前ページの赤丸部分の回答を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/f0a7af62-6baa-b5c0-91ee-47a05f580748.png)


# 最後に
先生でこの手順を使ってみようと思う方もいるかもしれません。
実際に生徒側として使う方もいるかもしれません。

先生は無駄な連絡をなくして時間に余裕をもって早く帰ったり、その分自分の時間をもてたりするかもしれません。（さらに余裕があっても生徒のことを考える時間にしたら意義がなくなるかも。。個人的な意見ですが。）

生徒（使う）側は、あまり改善に無茶を言ってしまうとフォームがつぶれてしまう可能性があります。
先生のためのものと思って穏やかに見守りましょう。もちろんよりよくなる改善はどんどん提案していったらいいと思います！
[コピペ用]都道府県を都道府県番号順に並べた配列

```javascript:都道府県
let prefectures = ["北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"];
```
Font Awesomeが表示されないときに確認するべきポイント？！【Ruby on Rails】

#はじめに
「あれっ?!」RailsでHTMLには記述しているのにFont Awesomeが表示されず。。。その解決方法と確認するべきポイントを書きました。
##目次

+ gemがインストールされているか確認する
+ htmlが正しく記述できているか確認する
+ application.css.scssファイルを確認する

###gemがインストールされているか確認する

```:Gemfile
gem "font-awesome-rails"
```
記述していて bundle install できていればOKです。
不安であれば「Gemfile.lock」ファイルを確認してインストールできているか確認します。
###htmlが正しく記述できているか確認する


```:html.erb
<%= fa_icon("home") %>
```

```:html.haml
= fa_icon 'home', class: 'icon'
```
###application.css.scssファイルを確認する
私の場合、表示されなかった原因がこれでした。これであっさり解決しました。
以下を追記しました。

```:application.css.scss
@import " font-awesome ";
```
#おわりに
viewで検証ツールを使って要素はあるのに表示ができていない場合は上記のポイントを確認してみるといいと思います。
より詳しく知りたい方は　 [font-awesome-rails/GitHub](https://github.com/bokmann/font-awesome-rails)　などにも目を通すといいかもしれません。
Windowsの操作感をMacに寄せる

WindowsとMacを1つのモニターでスイッチしながら開発してるのですが、最近はかなり切り替え頻度があがったこともあって操作感をなんとか寄せてみた設定類のまとめです
![環境](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20773/d63d31cf-15b6-d523-6cd6-6a90db35ece8.jpeg)
_机新調した_

ただしWindowsでApple純正USキーボードを使う想定なのであまり万人向けではないです

## それぞれの環境
おもにUnity、Blender、Adobe系での開発を行ってます

**Mac**
- MacBook Pro (15-inch, 2016)
- Sierra 10.12
- 英字配列キーボード
- モニター接続時はクラムシェルモードで、Bluetoothキーボード（Apple）とTrackpad （Apple）を使用

**Windows**
- Alienware 13 (R13, 2017）
- Windows 10 Home
- 英字配列キーボード
- 同じくクラムシェルで、Bluetoothキーボード（Apple）、とBluetoothマウス （Microsoft）を使用

## 共通化したい操作
基本的にはあんまり設定をいじらない方針です

-  Apple Wireless Keyboard をペアリング
-  キーの入れ替え
-  AltキーでIME切り替え
-  Mac代替アプリのインストール

これらの設定で違和感はだいぶ軽減したのですが、細かい設定でがんばるよりも同じキーボードが2つあったというのが最も効果的だった気がしてます（かなり身も蓋もないですが...）

### Apple Wireless Keyboard をペアリングする
Windows側では2000円くらいのBTキーボード使ってたのですがキーリピートに問題あったりスリープから帰って来なかったりと難儀してところを、Apple純正BTキーボードで一発解決でした
![wireless_keyboard_hero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20773/05f7fe3e-531b-16d9-6f9f-010599596530.png)
_Magic keyboardよりこっちのが好み_

Windowsで認識させるさいに、システム設定＞Bluetooth追加だとパスコードが表示されないという現象に遭遇しましたが以下の方法でうまくいきました

Bluetooth対応キーボードをWindowsで使用する方法
https://www.buffalo.jp/support/faq/detail/15427.html

### CapsLockをCtrlにする
Mac+USキーボードの定番設定

**Mac**
システム環境＞キーボード＞装飾キー から変更

**Windows**
Ctrl2Cap を導入。導入記事はたくさんあるので割愛
https://docs.microsoft.com/en-us/sysinternals/downloads/ctrl2cap

※キーの入れ替えは最終的に KeySwap に集約しました

### その他のキー入れ替え
KeySwap
https://www.vector.co.jp/soft/winnt/util/se228667.html
_リンク先に XP～win7 とありますが win10 でも問題ないっぽいです_

Apple Wireless Keyboard のUSキーだとコマンドキーがWindowsキーになってたりするので以下のように設定にしてます
![keyswap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20773/ea36534d-a23a-9b3b-4943-c0e6359bf073.png)
左右のwinキーとAltキーを入れ替えてるのは次の項目のための仕込みです

### コマンドキーでIMEを切り替える
これもMac+USキーボードの定番設定のIME（英かな）切り替え

**Mac**
Karabina 一択

Karabiner-Elementsの本家が「英数/かな」の切り替えに対応したみたい
https://qiita.com/emonuh/items/ba5f12ef459f3a34f83e

**Windows**
上記と同じ挙動を実現

alt-ime-ahk
https://www.karakaram.com/alt-ime-on-off

### 共通アプリケーション
Adobe、Unity、Blenderあたりは共通で使えるので特にやることはありません。
問題はエディタですが、vimからVSCodeに乗り換えてたのでこれもかなりスムーズに。

設定の共有は Settings Sync が手軽
https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync

### 代替アプリケーション

**Alfred → Hain**
類似はいろいろありますが、個人的にはいちばん使用感が似てる気がします

https://github.com/hainproject/hain

**iterm2 → Git bash**
Gitと一緒に入ってくる。基本的なコマンドが通るので今のところは十分に感じてます

https://git-scm.com/download/win

**Dash → Phrase Express**
スニペットです。メールアドレスとかコードのテンプレとか入れてます

https://www.phraseexpress.com/download.php


## 改善したいところ
変更を最小限にとどめているので影響は少ないですが、やはりキースワップが弊害あります。Appleキーボードありきの設定なため外出時に本体で入力するときに混乱することもあるので適宜切り替えできるキースワップアプリが欲しいところです
道路反射鏡設置模擬試験(simulator)

カーブミラーを設置する場合、どこに、どういう角度で設置すると、どれくらいの範囲がみやすくなるか。
シミュレータを探しています。

なければ作るしかない。
あれば、評価する。

検索すると大学で研究しているところは出て来た。

オープンソースで対応可能かどうか。

#官庁
道路反射鏡の種類と設置方法 - 道路反射鏡協会
www.dhk.gr.jp/about_mirror/mirror-types.html

道路反射鏡（カーブミラー）の設置について　（東京都町田市）
https://www.city.machida.tokyo.jp/smph/kurashi/sumai/road/jyouhoutetuduki/curvemirror.html

カーブミラー(道路反射鏡)の新規設置について(千葉県市原市)
https://www.city.ichihara.chiba.jp/kurashi/douro_kasen/douro_kanri/douroshisetu.files/mirror_new.pdf

柏市道路反射鏡設置基準(平成26年6月千葉県 柏 市 土木部道路維持補修室)
http://www.city.kashiwa.lg.jp/soshiki/121000/p004300_d/fil/kashiwa_curvemirror_kijun.pdf

カーブミラー設置要望書（奈良市）
http://www.city.nara.lg.jp/www/contents/1212996578084/index.html

道路反射鏡（カーブミラー）（奈良県生駒市）
https://www.city.ikoma.lg.jp/0000005732.html

カーブミラー（道路反射鏡）（大阪市）
https://www.city.osaka.lg.jp/kensetsu/page/0000192827.html



カーブミラーの設置について（大阪府四條畷市）
https://www.city.shijonawate.lg.jp/site/ikenbako/3009.html

交差点へのカーブミラーの新たな設置について(神戸市)
http://www.city.kobe.lg.jp/life/town/road/kouji/curvedmirror.html

道路反射鏡(カーブミラー)設置工(神戸市)
http://www.city.kobe.lg.jp/business/regulation/construction/work/zu-5-2.pdf


道路反射鏡（カーブミラー）の設置について(鹿児島県出水市)
https://www.city.kagoshima-izumi.lg.jp/page/page_00722.html

#研究
 木 計画 学 研 究 ・論 文 集  Vol.24no.42007年9月 
交差点形状を考慮した適切なカーブミラーの設置位置に関する研究
A study about an establishment of the appropriate curved mirror which considered crossing shape, 佐々木正大・ 浜岡秀勝
https://www.jstage.jst.go.jp/article/journalip1984/24/0/24_0_753/_pdf

参考文献
1) 警察庁ホームページ:http://www.npa.go.jp/toukei/
2) 社団法人日本道路協会: 道路反射鏡設置指針第10版 、平成13年
3) 山中英生、日野泰雄、福西博、粂淳: 交通挙動の変化からみた地区内小交差点明示の効果分析、平成9年 度交通 工学研究発表会論文報告集、pp.21-24、1997
4) 工藤慎 司、二村 和彦 、廣畑康裕: 細街路無信 号交差点 に おけるドライバーの注視 ・運動挙動に関する基礎的分析、 平成11年 土木学会第54回 年次学術講演会概要集、 pp.390-391、1999
5) 矢野良太、浜岡秀勝、清水浩志郎: カーブミラー設置交差点における走行特性に関する研究、平成15年 度土木学 会東北支部技術研究発表会講演概要pp.444-445、2003

3DCGシミュレーション法による交差点カーブミラーの視認性評価 ○森みどり、堀野定雄、久保登、西村洋、野口絵理香(神奈川大学 工学部)
https://www.jstage.jst.go.jp/article/jergo/46sp/0/46sp_0_344/_pdf

実路テストコース実車実験に基づく交差点カーブミラーの視認性評価 ○森 みどり、久保 登、堀野 定雄 (神奈川大学 工学部)
https://www.jstage.jst.go.jp/article/jergo/47spl/0/47spl_0_112/_pdf


日本機械学会論文集(C 編) 論文 No.10-7038
77 巻 775 号 (2011-3)
3D CG 鏡像シミュレーション法に基づく交差点出会い頭事故事例分析* 西村洋*1，野口絵理香*1，森みどり*2，久保登*2，堀野定雄*1
https://www.jstage.jst.go.jp/article/kikaic/77/775/77_775_1171/_pdf

カーブミラー設置のためのシミュレーション方法及び装置　学校法人神奈川大学
http://www.ekouhou.net/カーブミラー設置のためのシミュレーション方法及び装置/disp-A,2010-277283.html




#製造販売設置

道路反射鏡について　道路反射鏡協会
http://www.dhk.gr.jp/about_mirror/index.html


始めてのカーブミラー　信正工業　株式会社(静岡市)
http://www.shinseikogyo.com
 
道路設置用カーブミラー ミドリ安全株式会社(東京都渋谷区)
https://ec.midori-anzen.com/shop/c/cLCARAA/
AWS SAM を使用してローカル環境でLambdaを動作させる

[(AWS Serverless Application Model (SAM) コマンドラインインターフェイス。サーバレスアプリケーションをローカルで構築、テスト、デバッグする)](https://aws.amazon.com/jp/blogs/news/aws-serverless-application-model-sam-command-line-interface-build-test-and-debug-serverless-apps-locally/ "Title")
ほぼここから引用ですが個人的備忘録として

# やりたいこと
AWS SAMを使用して、ローカル環境でLambdaの構築をする

# 環境
Windows 10 64bit

# インストール
・[Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)
(sam local コマンドはDockerを使用しているため必須)

・Python　3.6
・VS Code(これは好みで他のEditorでもOK)
・AWS CLI(AWSにデプロイするのなら)
・[AWS SAM CLI 64bit] 
(https://github.com/awslabs/aws-sam-cli/releases/latest/download/AWS_SAM_CLI_64_PY3.msi)
　[参考]
(https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-windows.html)

# インストール方法
1.Docker Desktop for Window のインストール(MSIなので割愛)
2.[python3.6](https://www.python.org/downloads)のインストール
3.AWS CLI のインストール
 ``` pip install awscli --upgrade --user ```
4.VS Code のインストール
5.VS Code にPython Extensionをインストールする
6.AWS SAM CLI のインストール(MSIなので割愛)

# 作成方法
```  
PS C:\User\staff\> mkdir sam_app 
PS C:\User\staff\> cd .\sam_app\
PS C:\User\staff\sam_apps\> sam init --runtime python
(ここでファイルが生成される)
```

```
PS C:\User\staff\sam_apps\> cd .\sam-app\
PS C:\User\staff\sam_apps\sam-app> ls
    ディレクトリ: C:\Users\staff\sam_apps\sam-app


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/05/16     10:08                hello_world
d-----       2019/05/16     10:08                tests
-a----       2019/05/16     10:08           3973 .gitignore
-a----       2019/05/16     10:08           2059 event.json
-a----       2019/05/16     10:08           7541 README.md
-a----       2019/05/16     10:08           1662 template.yaml

```
上記ファイルが生成されている。

```
PS C:\Users\staff\sam_apps\sam-app> md hello_world\build
```
bilidフォルダの生成

```
PS C:\Users\staff\sam_apps\sam-app> pip install -r .\requirements.txt -t hello_world\build
```
requirements.txtを先に作成して、
必要なモジュールはrequirements.txtに記述すること

```
PS C:\Users\staff\sam_apps\sam-app> cp .\hello_world\*.py .\hello_world\build\
```

```
PS C:\Users\staff\sam_apps\sam-app> sam local start-api
2019-05-16 10:18:06 Found credentials in shared credentials file: ~/.aws/credentials
2019-05-16 10:18:06 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
2019-05-16 10:18:06 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
```

記載されているURLを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143249/37ea4fef-ef66-23d8-6014-695d3d954882.png)

ローカル環境でLambdaの値を取得できている。

これでコード変更すれば、デバッグも用意にできるようになります。

最低限の動作できるまでのフローはここまで。
あとは元の記事を参考にやっていこう。
Linuxのホームディレクトリに作られる、.configディレクトリ（$HOME/.config）ってなんだ？

# TL;DR
* ソフトウェアが設定ファイルなどを置く`$HOME/.config`というディレクトリは、XDG Base Directory仕様に則ったもの
* ユーザー個別の設定ファイルを置く用途で利用される

# `$HOME/.config`ディレクトリってなんだ？
Linuxでソフトウェアを利用していると、その時の設定情報などを`$HOME/.config`ディレクトリ内に作るものを目にすると思います。

たとえば、Visual Studio Codeであれば`$HOME/.config/Code`ですね。

`settings.json`であれば、`$HOME/.config/Code/User/settings.json`にあるわけです。

いろんなソフトウェアがこの`$HOME/.config`配下にディレクトリを作っていくので、「これはなにに従っているのだろう？」と思って調べた結果「XDG Base Diretory仕様」にいきつきました。

# XDG Base Directory仕様
XDG Base Directory仕様とは、「FreeDesktop.org」によって定められたものです。

[XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)

FreeDesktop.orgとは、

> freedesktop.org（フリーデスクトップドットオルグ。fd.o（エフディードットオー）などと略されることもある）は、Unix系のシステムの環境のデスクトップ環境（もっぱらX Window Systemを利用する）の、相互運用性の向上と共通基盤技術の整備を目指したプロジェクトである。

だそうで。

「XDG」というのは、FreeDesktop.orgが以前に「X Destop Group」と名乗っていた時の名残りだとか。

[freedesktop.org](https://ja.wikipedia.org/wiki/Freedesktop.org)

このXDG Base Directory仕様のうち、`$XDG_CONFIG_HOME`がユーザーごとの設定ファイルを配置するディレクトリで、そのデフォルト値が`$HOME/.config`なのだとか。

なるほどですねぇ。

（名前の重複で困ったりしないのかな…？）

XDG Base Directory仕様には、その他にもキャッシュ、データファイル、ランタイムの情報、システムディレクトリなどが定められているので、見てみると面白いかもしれません。

[XDG Base Directory サポート](https://wiki.archlinux.jp/index.php/XDG_Base_Directory_%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88)

# 参考
[Debian 管理者ハンドブック](https://debian-handbook.info/browse/ja-JP/stable/sect.filesystem-hierarchy.html)