OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressテーマやプラグイン更新で「メンテナンスモード」が消えない時の対処

[「メンテナンスモード」が消えなくなる](#「メンテナンスモード」が消えなくなる)
[プラグインやテーマ更新の過程](#プラグインやテーマ更新の過程)
[不具合の理由](#不具合の理由)
[不具合の原因](#不具合の原因)
[不具合の解消](#不具合の解消)
[一括更新への誘惑…](#一括更新への誘惑…)
[参考記事](#参考記事)

#「メンテナンスモード」が消えなくなる
WordPressのテーマやプラグイン更新で「メンテナンスモード」が消えなくなり、ダッシュボード画面もサイト表示も以下のようなままで固まってしまうケースがみられます
![スクリーンショット 2021-09-23 10.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/193d1c63-bcee-3b75-e902-9951804ab268.png)

#プラグインやテーマ更新の過程
１）最新バージョンのzipファイルがダウンロードされる
２）zipファイルが解凍される
３）メンテナンスモードが有効になる　→「.maintenance」ファイル生成
４）ファイルがアップデートされる
５）メンテナンスモードが解除される
６）更新完了してサイト表示が回復する　→「.maintenance」ファイル削除

過程３でトップディレクトリに「.maintenance」というファイルが生成され、サイト表示がメンテナンスモードになり、過程６で「.maintenance」が削除される仕組みです。

#不具合の理由

メンテナンスモードが消えない、という不具合は、過程３で「.maintenance」が生成されたものの、過程６で削除されなかったことで起こります。

#不具合の原因
「メンテナンスモード」が消えなくなる不具合の原因は、
１）更新中にブラウザを閉じた
２）一度に多くのテーマやプラグインを更新しようとした
３）互換性に問題がある
といったことが考えられます。

#不具合の解消
FTP接続し、トップディレクトリにある「.maintenance」ファイルを削除すれば解消します。
![スクリーンショット 2021-09-23 10.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/0039afae-22d0-ce2f-b80b-1b59c726ff43.png)


#一括更新への誘惑…

WordPressダッシュボードの上部にある「更新」ボタンから、

![スクリーンショット 2021-09-23 10.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/a5a72d1f-58a5-2338-9da1-c6b13418a569.png)


「WordPress の更新」ページに入ると、一括で更新できる機能が表示されます。
ここですべてにチェックを入れて一括更新を始めると、

![スクリーンショット 2021-09-23 10.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/169602db-da8a-1cef-da88-d2e573cfc235.png)
　メンテナンスモードのまま固まってしまうことがあります。

![スクリーンショット 2021-09-23 10.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/1cef5169-a1f2-e39b-2889-04e3ad933349.png)
面倒でも、一個づつ更新したほうがオススメです。
***
#参考記事
`https://funfairfanfare.com/wordpress-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E6%9B%B4%E6%96%B0-%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89-%E3%82%A8%E3%83%A9%E3%83%BC/`
`https://kinsta.com/jp/knowledgebase/briefly-unavailable-for-scheduled-maintenance/`
[Xcode]Xcode13へアップデート後に発生したNavigationBarの不具合の対処法

## 投稿経緯
業務で開発中のアプリが、Xcode13ヘアップデートした際に、`NavigationBar`のUIが崩れると言う不具合が発生しました。現状解消されているので共有したいと思います。

## 環境
macOS BigSur バージョン 11.6
Swift バージョン 5.5
Xcode バージョン 13.0

## 症状
`pushViewController`で遷移した先のNavigationBarに遷移元のNavigationBarのUIと遷移後のUIのふたつともが表示されUI崩れが発生するという不具合です。

## 対処法
どうやら`iOS15`ではラージタイトルだけでなくすべてのナビゲーションバーに`scrollEdgeAppearance`が適用されるようになったようで、iOS15未満と同じ挙動にするにはscrollEdgeAppearanceを指定する必要があるようです。

具体的に必要なコードは以下の通り👇

```swift
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = // 配色の場合
appearance.backgroundImage = // 画像の場合
appearance.titleTextAttributes = [
    .foregroundColor: UIColor.black,
    .font: UIFont.init(name: APP_FONT_LIGHT, size: 12.0) as Any
]

navigationController?.navigationBar.scrollEdgeAppearance = appearance
navigationController?.navigationBar.standardAppearance = appearance
```
Xcode13 × iOS15からNavigationBarの設定方法のお作法が変わったようですね。

## 参考にした記事
[Apple ドキュメント](https://developer.apple.com/documentation/uikit/uinavigationbar/3198027-scrolledgeappearance)
> When running on apps that use iOS 14 or earlier, this property applies to navigation bars with large titles. In iOS 15, this property applies to all navigation bars.

## お知らせ
現在、iOS開発案件を業務委託で募集中です（副業）。[TwitterDM](https://twitter.com/ken_sasaki2)でご依頼をお待ちしています
Pythonでデータ分析をするときのフロー



PythonでSignateやPythonのお題をゴチャゴチャといじっているときに、DataFrameの使い方がこんがらがって、大切な元データをボロボロにしてしまうことがあったので、自分なりのDataFrame(とかの変数)名の整理をしてみました。
意外と、こういうお作法を書いたものが見つからないので、自分用のメモ_φ(･_･として。
![DataPythonFlow20210923~03.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522382/eb0b2153-db8b-f2f3-9373-8aadb6a0bcec.png)

前提
* train_data → 出題者から提供された学習用データ
* test_data → 出題者から提供された評価用データ
* submit_data → 提出用データの提出直前状態

試行錯誤用のデータにtrain01と数字を付けているのは、試行錯誤の過程でいろんなパターンを作ってみたくなったときに備えてです。（train02、train03...を作ってみるとか)→copy()を使って元データに傷を付けないようにするのがポイントです。

最終的な前処理をmerged_dataというDataFrameで行うのは、get_dummiesなどで不整合を起こさないようにするためです。
AsciiDoc - ローカルkrokiサーバを使用したPlantUMLプレビュー表示

# AsciiDocプレビュー表示

VSCode＋[AsciiDoc](https://marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode)（拡張機能）を使用してプレビュー表示を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0c9a5173-a621-87c9-ff6b-81968fc8ed32.png)

以下、今回使用するAsciiDocファイル

```adoc:sample.adoc
== シーケンス図

[plantuml,format=png]
....
@startuml sample
Bob -> Alice : こんにちは！
@enduml
....
```

AsciiDocファイルのタブで右クリック、`Open Preview`を選択するとプレビュー表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ea043344-ae8e-9415-67b4-24182c97321d.png)

以下、プレビュー表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/368679ce-1294-2881-c3aa-9cc7975016fd.png)

# AsciiDoc内のPlantUMLプレビュー表示

AsciiDoc（拡張機能）の`Use_kroki`設定を有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0a3ecb10-733b-af44-e92a-012d30b37c30.png)

settings.jsonに以下が追加される

```json:settings.json
  "asciidoc.use_kroki": true
```

以下、プレビュー表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c41c12dc-497b-950b-754a-8436e620864e.png)

# ローカルkrokiサーバを使用したAsciiDoc内のPlantUMLプレビュー表示

※Docker環境が必要

```
Note that this extension will send graph information to https://kroki.io. If this is an issue it is also possible to use your own kroki instance (see the instructions for further information).

----
（訳）
この拡張機能はグラフ情報をhttps://kroki.ioに送信することに注意してください。 
これが問題である場合は、独自のkrokiインスタンスを使用することもできます（詳細については、手順を参照してください）。
```
上記が[AsciiDoc](https://marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode)（拡張機能）に記載されており、グラフ情報を`https://kroki.io`に送信しないようローカルでkrokiサーバを立ち上げる

## krokiサーバ起動

[Using Docker or Podman](https://docs.kroki.io/kroki/setup/use-docker-or-podman/)に記載されている以下コマンドでkrokiサーバのコンテナが立ち上げる

```
docker run -p8000:8000 yuzutech/kroki
```

2回目以降はすでにコンテナが存在するので、Docker Desktop等から起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/04a03190-e452-b01a-3c32-349b91daeab3.png)

## krokiサーバ指定

settings.jsonに以下を追加する
（ポートはkrokiサーバ起動時に指定したポートを設定する）

```json:settings.json
    "asciidoc.preview.attributes": {
        "kroki-server-url": "http://localhost:8000"
    }
```

## プレビュー表示のセキュリティ設定変更

ローカルホストからHTTP経由でコンテンツをロードするためにセキュリティ設定変更を行う

AsciiDocファイルを開いている状態でコマンドパレット（F1）から、
`AsciiDoc: Change Preview Security Settings` → `Allow insecure local content`
を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/caddc4b4-2395-f846-00c3-711c663ab29b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a80c37f7-30f5-2f0f-d060-806fe2626121.png)

以下、プレビュー表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/60b8e6d6-b0c6-7b49-8393-666aa9bc4d1a.png)
WSL2でsystemctlを使えるようにする

#環境
・Ubuntu20.04

#WSL2の弊害・対策
・WSL2でsystemctlコマンドを実行すると、下記のようなエラーが出てしまい使えなくなってしまいます。
・「genie」をインストールすることでsystemctlを使えるようにします。
※ちなみにディズニーのアラジンに出てくる「ジーニー」のことらしいです。

```
$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

#systemctlとは？
・サービスを管理するコマンド。うーん、よくわからない。

#そもそも「サービス」とは？
・意外とわからなかったりします。
・正解は「WindowsOSにおける”常駐プログラム"」です。つまり、見た感じでは特に作動していないように見えるが、ソフトウェアを動かすために動いてくれている裏方のこと。
・画像のように、たくさんのサービスが裏で動いてくれています！ありがたや！
・UNIX系OSでは「サービス」ではなく「デーモン(daemon)」と呼びます。目に見えない悪魔ということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/f3c606f7-4aea-913a-d20b-e470e956976a.png)


#コマンド例
※「hoge」にはサービス名、すなわちapache2, nginx, mysqlなどが入ります。 
```
systemctl start hoge
systemctl stop hoge
systemctl restart hoge
systemctl reload hoge
systemctl enable hoge //自動起動を有効化。重要
systemctl disable hoge //自動起動を無効化。
systemctl status hoge //状態確認。重要
```

#genieのインストール（準備）
```
#必要なパッケージのインストール１
sudo apt install daemonize dbus gawk libc6 libstdc++6 policykit-1 systemd systemd-container
#必要なパッケージのインストール２
wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

# パッケージの最新版を取得、更新
sudo apt update
sudo apt upgrade
 
# dotnet-runtime-5.0をインストール
sudo apt install dotnet-runtime-5.0
```


#genieのインストール
```
sudo apt install apt-transport-https

wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg

sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

#rootユーザーで実施。入力後exit
cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF

sudo apt update
sudo apt install systemd-genie

#実行
genie -l
#もし「Waiting for systemd....!!!!!!!」で止まるようならCtrl+Cで停止した後で実行
genie -s
```
docker-compose を使って Jenkins Master(docker) - Slave(物理PC) [SSH通信]を構築する



## 概要

下図のシステムを docker-compose を使って構築する手順.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/4bdf4ae6-c830-f27f-6e72-c1c733802d55.png)

・Jenkins <font color=Blue>**Master**</font> は <font color=Blue>Docker コンテナ</font>で稼働する
・Jenkins <font color=purple>**Slave**</font> は<font color=purple>物理ホスト上</font> (192.168.1.100 と 200 の 2台) で稼働する


## 手順

### 1. Jenkins Master の構築

#### 1-1. docker-compose.yml の作成

次の内容で docker-compose.yml を作成する.

使用する Dockerイメージは「jenkins/jenkins:latest」としているが、
トラブルを回避させたければ動作実績がある版を指定した方が良いかと思う.

なお、タイムゾーンの指定方法については自信が無い.
私の場合は下記で成功した、というだけである. 恐らくハマりポイントになりそうな気がする.

```yaml
version: '3.7'
 
services:
  jenkinsmaster:
    container_name: jenkinsmaster
    user: root
    image: jenkins/jenkins:latest
    ports:
      - 8080:8080
    environment:
      JAVA_OPTS: "-Duser.timezone=Asia/Tokyo"
      TZ: "Asia/Tokyo"
    volumes:
      - ./PV/jenkinsmaster/jenkins_home:/var/jenkins_home
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro 
```

#### 1-2. 永続ボリュームを作成する

```bash
$ mkdir -p PV/jenkinsmaster
```

#### 1-3. Jenkins Master を稼働させる

```bash
$ docker-compose up -d
```

#### 1-4. Jenkins Master の初期セットアップをする

WEB-UI から Plugin インストールなどを済ませる.


#### 1-5. コンテナにログインして秘密鍵・公開鍵を作成する

jenkins アカウントで操作すること

```bash
## jenkins アカウントでコンテナにログインする
$ docker-compose exec -u jenkins jenkinsmaster bash

## 以下コンテナ内での作業

## 秘密鍵と公開鍵をパスフレーズなしで作成する
$ cd $HOME
$ ssh-keygen -t rsa -N '' -f .ssh/id_rsa

## 下記で表示される公開鍵の内容をダンプしてコピーしておく
$ cat .ssh/id_rsa.pub

## コンテナからログアウトする
```

　

### 2. Slave マシンのセットアップ

192.168.1.100 (Linux) でのセットアップ例.
192.168.1.100 にはユーザアカウント `foo` が存在しているものとする.

#### 2-1. Master からの公開鍵認証による接続を許可しておく

```bash
## 192.168.1.100 にアカウント foo でログインして、次の操作をする
$ mkdir -p /home/foo/.ssh
$ sudo chmod 755 /home/foo
$ sudo chmod 700 /home/foo/.ssh
$ echo '上述の id_rsa.pub の内容' >> /home/foo/.ssh/authorized_keys
```

#### 2-2. Slave の workspace を作成する

```bash
## 192.168.1.100 にアカウント foo でログインして、次の操作をする
$ mkdir $HOME/workspace
```

　

### 3. Jenkins WEB-UI で Slave を定義する

「Jenkinsの管理」-「Manage Credentials」より、下表のように入力して「保存」を押す.
(同時実行数を 1 にしているが、変更しても良い)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/cfde01f0-94e4-9738-f851-675ac4870671.png)

(1)
「種類」に「SSHユーザー名と秘密鍵」を指定する.
「ユーザー名」には「foo」を入力する.
「直接入力」にチェックを入れて、./PV/jenkinsmaster/jenkins_home/.ssh/id_rsa の中身を貼り付ける.

(2)
「高度な設定」より、「Javaのパス」を開いて「/usr/bin/java」を入力する.
(正確なパスは which java で調べること)


### 4. Jenkins Master から Slave へ SSH 接続できるかを検証する

```bash
## Jenkins Master コンテナにログインする
$ docker-compose exec -u jenkins jenkinsmaster bash

## 以下、コンテナ内での操作である
$ ssh -o 'StrictHostKeyChecking=no' foo@192.168.1.100

## このときパスワードなしでログインできれば成功である
```

### 5. Jenkins Slave 192.168.1.200 のセットアップをする

上記 192.168.1.100 と同じ要領でセットアップすれば良い


### 6. Jenkins Master コンテナを再起動すれば完了

```bash
$ docker-compose restart
```

以上
【Laravel】Class not foundエラーの対処方法

ポートフォリオ作成中にClass not foundエラーにつまづきました。
突破に時間を要してしまったので、対処方法を記載しておきます。

#エラー画面
![IMG_3568.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159752/7819438f-a7ac-72d7-bc60-ffb9f795decd.jpeg)
CalendarViewが見つかりませんというエラー。
カレンダーを表示するコードを書いてあるCalendarView.phpというファイルを、表示する際に呼び出せずにエラーが出ている様子。

#確認したこと

####１.composer.jsonの確認
オートローダで対象となるディレクトリはcomposer.jsonで設定してあるため、それが間違っていないか確認する。
ちなみにオートローダとは、PHPでは別のファイルのプログラムを利用する際、requireなどでパスを指定して読み込む。
しかしLaravelはオートローダ機能があり、対象となるファイルが自動的に読み込まれる。
その対象となるディレクトリを設定してあるのがcomposer.jsonである。

```php:composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
```
autoloadの部分を確認します。
今回使用したいディレクトリが記載されているか確認します。
ちゃんと設定されていました。


####２.namespaceが間違っていないか

```php:CalendarView.php
namespace App\Calendar;
use Carbon\Carbon;
```

ComposerはPSR-4という約束に従ってオートローダを実行しているらしい。
名前空間とファイル名にはその規則があり、間違っているとオートローダできない。

仕様に沿っているか確認する。（詳しくは[こちら](https://www.php-fig.org/psr/psr-4/)に記載ありました）

まずは名前空間とパスは一致しているかどうか。
今回はappの下のCalendarフォルダにCalendarView.phpを格納している。
大文字、小文字も間違っていないか確認。
どうやら合っている様子。



####3.composer dump-autoloadしてみる
クラスを変更したり、追加した時などにコンパイルされていない可能性があるため、dump-autoloadする必要があるらしい。
これをすることでファイルが読み込まれて、変更内容が読み込まれる。

```
$ composer dump-autoload
```

![スクリーンショット 2021-09-22 20.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159752/31095cb5-6bbd-f99c-1b24-d59598e72c92.png)

**does not comply with psr-4 autoloading standard**というエラーが出ています。
psr-4の仕様に沿っていないのでオートロードできていない様子。

しかし１で何度も確認したし、と思いエラーコードをよく見てみると・・

```
Class App\Calendar\CalendarView located in ./app/Calendar/ CalendarView.php does not comply with psr-4 autoloading standard. Skipping.
```
ファイル名の前に変な空白が・・・

#原因
ファイル名の先頭に空白が入っていました。
ファイル名を正しいものに修正して再度dump-autoloadしてみる。

![スクリーンショット 2021-09-22 20.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159752/fdfc9590-f08a-26f9-f059-bae74f52c27f.png)

エラー解消しました！

#わかったこと
クラス名やパスが間違っていないときは、コンパイルされていない可能性があるため**composer dump-autoload**することで解消されることがある。
しかしそれでもエラーが出る場合は、クラス名がパスが間違っていたり、命名規則に沿っていない可能性があるのでそこを確認する必要がある。
フリーランスエンジニアはつらいと感じる4つの原因と3つの解決法

## はじめに
フリーランスエンジニアとして、つらいと感じる原因はさまざまです。

- 単価が安い
- 仕事が安定しない
- 仕事が大変

など。

このような悩みに直面して「**フリーランスってつらい……**」と感じる方も多いのではないでしょうか？

フリーランスエンジニアは実績があれば、なるのは簡単です。しかしライバルも多く、人と同じやり方をしていたり、稼ぐためにどうすればいいかを本気で考えて行動に移せないと、いつまでたってもつらい状況が続いてしまいます。

今回はフリーランスエンジニアとして、

- なぜつらい状況に陥ってしまうのか？
- つらい状況を脱出するためにはどうすればいいのか？

について解説していきます。

## なぜフリーランスエンジニアはつらいのか？
フリーランスエンジニアがつらい状況に陥ってしまう原因は人によって異なりますが、大きくわけて以下の4つがあります。

- 仕事が見つからなくてつらい
- お金が稼げなくてつらい
- 孤独でつらい
- 仕事が終わらなくてつらい

### 1.仕事が見つからなくてつらい
フリーランスは忙しい時期もあれば暇な時期もあります。

今の仕事が終わって次の仕事を探しても、「なかなか良い仕事が見つからない……」といった状況が続き単価が安い仕事で妥協してしまうこともあり得ます。

これは、仕事の探し方が間違っている可能性があります。

### 2.収入が低くてつらい
フリーランスは会社員のように、毎月一定の給料が振り込まれるわけではなく、「月によっては収入がまったくない……」なんてこともあります。

固定で報酬を出してくれるクライアントを何件も抱えているならともかく、単発の仕事を請け負っていると、このような自体に陥りやすくなります。

### 3.孤独がつらい
自宅でフルリモートで仕事をする場合、当然ながら話す相手がいないので孤独な状況に追い込まれます。

私のように孤独になれている人、好きな人は問題ないですが、人によっては想像以上に孤独がつらく、仕事が手につかない……。なんてことになってしまうようです。

せっかく嫌な人間関係からさよならして自由に働く環境を手に入れたのに、襲いかかる孤独で絶望してしまったら元も子もないですね。

### 4.仕事が終わらない、セルフブラック化している
自分で自分自身を追い込んでしまうと、**セルフブラック化して会社員より辛い働き方を強いられることも…**。

かつては私も朝7時から、日付が変わる頃まで仕事をしていた時期があります。

しかしそんな働き方は長く続かず、どこかで方向転換をしないとフリーランスとしての働き方が嫌になります。

## フリーランスエンジニアがつらい状況から脱出するためには
### 1.なぜフリーランスになったのか振り返ってみる

あなたがフリーランスになった理由は何でしょうか？

- 年収1,000万を目指したい
- 好きな時間に働きたい
- 好きなことをして働きたい
- 嫌な人間関係に悩まされずに自由気ままに働きたい
- 満員電車に乗りたくない

など、それなりの動機があったはずです。
せっかくフリーランスになったのなら、これらの願望はぜひ叶えたいですよね。

しかし、まず直面するのが理想と現実のギャップです。

フリーランスは基本的に一人でなんでもこなさなければならないので、まちがったやり方ではいつまでたっても収入も上がらず、仕事も終わらず、つらい状況から脱出することはできません。

### 2.フリーランスエンジニアに大切なのはスキルと最低限の営業力
大切なことは、次の2つです。

- 十分な収入を得るための技術的なスキル
- 条件の良い仕事を自分で会得するための営業力

#### 稼ぐためのスキルとは
フリーランスは基本的に、スキルなしで食べていけるほど甘くないと思うし、誰でもできる仕事は基本的に単価が安いです。

そのため、スキルなしでいきなりフリーランスになると苦労すると思います。

もし当面生活するのに困らない資金（1年以上）があるなら、フリーランスになって働きながらスキルを磨くのもありです。

そうでない場合は興味のある仕事を副業から初めてみたり、資格を取るなどしてスキルを身に着けたほうが良いです。

余裕がない状態でフリーランスを初めてしまうと、安い単価で妥協してしまったり、ただの作業を延々とこなすだけで精一杯でスキルを磨くといった余裕がなくなってしまいます。

#### 最低限の営業力
次に営業力ですが、これは自力で条件の良い仕事を獲得するために必要です。

クラウドソーシングサービスを利用すれば、自分で営業する必要がないので一見楽ですが、単価が相場よりかなり安く、報酬の10-20%を手数料として差し引かれる場合が多いのでおすすめできません。

エンジニアならエージェントサービスを利用するという手段があります。ある程度その業種の経験があるなら、仕事を獲得することはそう難しくはありません。

ただし、エージェントサービスも営業が実績を上げるために、条件がよくないSESを紹介することもあるので、自分の希望はしっかりと伝えることが大切です。

作業範囲は明確にして、単価もなるべく妥協しない、抱えてる仕事が終わりそうなら、次のプロジェクトを探すなども必要です。

フリーランス向けのエージェントサービスは、こちらの記事でも解説しています。

> [フリーランス向けエージェントサービスおすすめ10選](https://www.furikatu.com/freelance-engineer-job-site/)

### 3.仕事内容を振り返る
フリーランスとして大切な要素としてスキルと営業力を挙げましたが、仕事を受注したらプロとして必ずやり遂げましょう。そして振り返りの時間も必ず設けてください。

- どこがいけなかったか？
- いけてなかった状況をどうすれば解決できるか？

を自分に問いかけます。

そして、答えが出たら簡単なPDCAを回していきます。

このサイクルを繰り返すことで、より高い報酬を得るためにどうすれば良いか？という考えや行動が自然に身につきます。

次の記事ではフリーランスのためのKGI（重要目標達成指標）・KPI（重要業績評価指数）設定とPDCAサイクルについて詳しく解説しています。

> [フリーランスのためのKGI・KPI入門](https://www.furikatu.com/kgikpi/)

## さいごに
フリーランスは何でも一人でこなさなれければいけませんが、圧倒的な自由度はあります。せっかくフリーランスになったのなら真の自由を手に入れるため、ぜひともつらい状況から脱出しましょう。
【Python】【timeit】コードの処理の実行時間を計測する！

　僕は何度か、Pythonの標準機能として既に存在しているプログラムを自分で作りました。自分でアルゴリズムを考えて手を動かす学習のためです。

　そんな時に考えたのは、「同じプログラムは同じプログラムでも、処理にかかる時間はそれぞれどのように異なるのだろう」ということでした。

　そこで、「timeit」というモジュールを使って、同じプログラムの処理にかかる時間を比較してみることにしました。
　今回は以下の、16進数を10進数に変えるプログラムを用いました。参考までに、コメントでいただいた他のプログラムも使わせていただきました。

- [16進数→10進数](https://qiita.com/kim-shun/items/1efca5d3d4854d6dc66d)

```python
import timeit

def change_decimal(hexa): #【A】
    nums = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,
            '7':7,'8':8,'9':9,'A':10,'B':11,
            'C':12,'D':13,'E':14,'F':15}
    sum = 0
    for i in hexa:
        sum = 16 * sum + nums[i.upper()]
    return sum


HEXA = '0123456789ABCDEF'
def change_decimal2(hexa): #【B】
    return sum(HEXA.index(digit.upper()) * (16**n)
               for n, digit in enumerate(hexa[::-1]))

try:
    hexa = input("16進数を入力してください(マイナス値が扱えません)：")
    
    result = change_decimal(hexa)
    print("【A】：",result)
    print("処理にかかる時間は",timeit.timeit('change_decimal(hexa)',globals=globals()),"です")

    print()
    
    result2 = change_decimal2(hexa)
    print("【B】：",result2)
    print("処理にかかる時間は",timeit.timeit('change_decimal2(hexa)',globals=globals()),"です")

    print()
    
except KeyError:
    print('0～9の数字、A～Fの英字を半角で入力してください')


print("Python標準機能：",int(hexa, 16))
print("処理にかかる時間は",timeit.timeit('int(hexa, 16)',globals=globals()),"です")


```
　そうすると出力結果は以下のようになりました。予想できることではありますが、標準機能を使った場合が圧倒的に速いですね。

```
16進数を入力してください(マイナス値が扱えません)：ff5
【A】： 4085
処理にかかる時間は 1.15236393 です

【B】： 4085
処理にかかる時間は 2.2030069250000004 です

Python標準機能： 4085
処理にかかる時間は 0.14431074899999974 です
```

　大規模のプログラムを作るとなると、ロジックやコード量だけでなく、処理速度も考慮に入れなければならないと考えられます。この「timeit」というモジュールの存在を知った時に、プログラミングって奥が深くて面白いなーって思いました。

<br>
備忘 railsのrake_taskでmodelを更新するときに反映されない..

なぜか、updateやcreateがtrueで完了するのに、更新が反映されなかった。

結局は、validateエラーになっていたのだが、そのレスポンスがなくてハマった。

以下のコマンドでvalidateを確認出来る。

```
MODELインスタンス.valid?
pp(MODELインスタンス.errors.messages)

```
varについて

# varとは
C#3.0から利用可能となった暗黙の型指定。
メソッド内のローカル変数を宣言する際、
型名の代わりにvarを使用するとコンパイラが
自動で型を判断してくれる。

例 Dictionaryをvarに書き直してみる。

Dictionaryを使用した場合

```ruby
        static void Main(string[] args)
        {
            Dictionary<string, int> dict = new Dictionary<string, int>();
            dict.Add("test1",1);
            dict.Add("test2",2);
            Console.WriteLine(dict["test2"]);
        }
```
実行結果
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1921604/a6d8e6e9-1800-4e90-b2c3-7fda20203f12.png)

varを使用した場合

```ruby
        static void Main(string[] args)
        {
            var dict = new Dictionary<string, int>();
            dict.Add("test1",1);
            dict.Add("test2",2);
            Console.WriteLine(dict["test2"]);
        }
```
実行結果
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1921604/c5011424-c24b-c737-5c1a-7af6df8320e3.png)

例のようにvarを使用すればコードを短く書けるので
可読性が上がり非常に良いと思われる。

MSDNのコーディング規約では以下のように記されている。
---

・変数の型が割り当ての右側から明らかである場合、または厳密な型が重要でない場合は、ローカル変数の暗黙の型指定を使用します。

・割り当ての右側から型が明らかではない場合、var を使用しないでください。 メソッド名から型が明らかであると想定しないでください。 変数の型は、new 演算子または明示的なキャストの場合に明らかであると見なされます。

・変数の型を指定するときに変数名に頼らないでください。 変数名が正しくない場合があります。
(var inputInt = Console.ReadLine();などStringを格納するのに変数名にIntが使われている場合)

・dynamic の代わりに var を使用しないようにしてください。

・for ループでループ変数の型を決定するときは、暗黙の型指定が使用されます。

・foreach ループでループ変数の型を決定するために暗黙の型指定を使用しないでください。


[MSDNのサイトはこちら](https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/coding-conventions)

## まとめ
変数名に型名を入れるなどをしなければ、
世の中のトレンドとしてvarを使う流れになっている。
また、変数を初期化しない。
nullで初期化するなどは
コンパイルエラーを起こしてしまうため、
その点は注意したい。

##### 参考文献
###### この記事は以下の書籍を参考にして執筆しました。
実戦で役立つ
C#プログラミングのイディオム/定石＆パターン
QLC+をMacOS Big Sur で起動する方法

DMXコントローラのソフトウェアである[QLC+](https://www.qlcplus.org/)ですが、MacOS Big Surで起動するにはワークアラウンドが必要なようなのでメモしておきます。

### 実行環境
- MacBook Air (M1,2020)
- MacOS Big Sur 11.5.2
- QLC+ 4.12.4

### 起動方法
本家ウェブサイトの[掲示板に記載されています。](https://www.qlcplus.org/forum/viewtopic.php?p=62989#p62989)


- 起動スクリプト用のファイルを作成

```
vi ~/Library/LaunchAgents/com.qlcplus.set-env-vars.plist
```

- ファイルの中に以下を記載して環境変数QT_MAC_WANTS_LAYER=1を起動時に設定する

```~/Library/LaunchAgents/com.qlcplus.set-env-vars.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>setenv.MY_VARS</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv QT_MAC_WANTS_LAYER 1</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
</dict>
</plist>
```

- Macを再起動

- 以下のコマンドで環境変数QT_MAC_WANTS_LAYER=1が設定されていることを確認する

```
printenv | grep QT 
```

- アプリケーションメニューのアイコンからQLC＋をクリックして起動
Gitフックでgit commit時にRubocopを走らせる方法

Gitに備わっているGitフックのpre-commitという機能を使って、
`git commit`時にRubocopを走らせる方法を紹介します。
[- Gitフックとは](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%83%95%E3%83%83%E3%82%AF)
[- appbrew Tech Blog (pre-commitとは)　](https://tech.appbrew.io/entry/2020/05/15/132413#pre-commit%E3%81%A8%E3%81%AF)

### 手順1.
chmodコマンドで、設定を記述する`.git/hooks/pre-commit`の実行権限を与える

https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

```:ターミナル
chmod a+x .git/hooks/pre-commit
```

### 手順2. 
`.git/hooks/pre-commit`を開く

```:ターミナル
open .git/hooks/pre-commit
```

VScodeなら

```:ターミナル
code .git/hooks/pre-commit
```

### 手順3.
`.git/hooks/pre-commit`のファイル末行にRubocopを走らせるコマンドを記述する

```:.git/hooks/pre-commit
~省略~
bundle exec rubocop
```

Docker-composeを使っていたら

```:.git/hooks/pre-commit
~省略~
docker-compose -f docker-compose.yml exec -T サービス名 bundle exec rubocop
```
`-T` オプションをつけないと、うまくいかない。
>  [ -T ] : 擬似 TTY への割り当てを無効にします。 デフォルトにおいて`docker-compose exec` には TTY が割り当てられます。
https://docs.docker.jp/compose/reference/exec.html?highlight=exec

### 手順4.
`.git/hooks/pre-commit`を保存して完了。
Angularではtsconfig.jsonのtargetがes2016までしか設定できない模様

tsconfig.jsonのtargetには変換後のES editionを設定します。
対象を限定できるなら最新のほうがパフォーマンス等で嬉しい部分です。

残念ながら、現在Angularではes2016までしか指定できません。
以下のメッセージの通り、Angularで利用しているzone.jsがサポートできていないためです。

>WARNING: Zone.js does not support native async/await in ES2017.
These blocks are not intercepted by zone.js and will not triggering change detection.
See: https://github.com/angular/zone.js/pull/1140 for more information.

もし該当機能を使ってない場合は最新にすることも可能です。

今後はzone.jsを着脱可能にする予定なのでそれまで待ちましょう
https://angular.jp/guide/roadmap
Reactでブートストラップ使う

#パッケージのインストール

まず、ターミナルを起動して、
react-bootstrapを作成します。

```.bash
npm install react-bootstrap bootstrap
```

#インポートの作成

bootstapが出来たら、
インポート文を作成します

```.bash
  import 'bootstrap/dist/css/bootstrap.min.css';
```

これだけ！
いい感じですね。



参考ドキュメント
https://react-bootstrap.github.io/getting-started/introduction
Reactでらくらく非同期通信　SWRの紹介

#SWRとは、

SWRとはReactのバックエンド通信を行うラッパーです。
Reactは通常fetchという関数を使ってバックエンドと通信をしますが、
通常の通信は、404エラーや認証エラー等、様々な要因で失敗します。

そこで、fetchによる通信に様々なエラー状況の対応をさせるために、
処理をカスタマイズ可能にするラッパーがSWRです

#SWRを使わない実装


``` App.js
import { useState } from 'react'

export default function App() {
// ステートを用意しておく
const [data setData] = useState("")

//APIのアドレスを定義しておく
const url = './v1/api/getUserData'

//アドレスにリクエストを送信する
  fetch(url)
    .then(res => res.json())
    .then(res => setData(res))

export default App;
```

これが正常に動けばいいのですが、
バックエンドサーバーがエラーを起こすと、dataステートにはundefinedが定義されてエラーになってしまいます。
そこで、SWRのお出番です


#SWRを使う実装

``` App.js
import useSWR from 'swr'

// フェッチ関数を定義
const fetcher = (url) => fetch(url)
  .then((res) => res.json());

// デフォルトコンポーネント
export default function Home() {

//APIのアドレスを定義しておく
const url = './v1/api/getUserData'

  const { data, error } = useSWR('./data.json', url )
export default App;
```

なんか、関数が一つ増えてわけわからんくなっただけじゃん、と思うかもしれませんが、
**リクエスト処理**と**リクエスト処理の実装**を分けることで、
実際の本処理が少なくなり、更に、リクエスト処理にはエラー処理を分岐させることが出来ました。

バックエンド側の処理は、それぞれの環境によって違うと思うので、
このような、レスポンスによって、処理を分岐させるラッパーは役に立つと思います

いい感じにクールになりましたね(*'▽')
Scalaで1行で3つのデータを入力する

Scalaで1行で3つのデータを空白区切りで入力し、1行ずつ出力するプログラムです。
paiza様の問題集に掲載されている問題です

```scala
object Main extends App {
    // 自分の得意な言語で
    // Let's チャレンジ！！
    import scala.io.StdIn.readLine
    val Array(data1,data2,data3) = readLine split " "
    println(data1)
    println(data2)
    println(data3)
}
```

map配列を使うと綺麗に書けるのでこちらも勉強して挑戦します。
【Java】繰り返し処理でつまづきそうだったから復習する

#目的

* Javaで学習したことを振り返って理解できるようにする



###1.繰り返し処理

* while文、for文、break文、continue文の４つ
* ここはRubyと差ほど変わらない（？）
* 以下、スクールのカリキュラムの問題を噛み砕いていく

####1.　while文

* 1以上5未満の数の2乗を出力

````java
public class practice1 {
    public static void main(String[] args) {
//    	変数numberを定義する
        int number = 1;
//      「１以上５未満」なので５より小さくなるように数字を条件式に入れる
        while (number < 4){
//        	「二乗」を表すために変数同士をかける ex 2の二乗＝ 2*2
        	System.out.println(number * number);
//        	numberが１つずつインクリメント（増加）し、3乗、4乗と増えていく
        	number++;
        } 
    }
}
````

####2.for文

* 要素数が4の「int」配列を初期化
* 配列のサイズ分ループして、要素を出力

基本構文は以下の通り

````java
for (初期化式; 条件式; 変化式) {
    ブロック(繰り返し処理)
}
``````

これをもとにして、for文を作成する

`````java

public class Chapter8retry {
	public static void main(String[] args) {
//		配列の変数を初期化（数字は適当）
		int[] array = { 1, 22, 333, 4444 };
//		配列の要素の変数を定義
		int i;
//		配列の要素をゼロにして初期化
//		lengthメソッドで配列のサイズ分（５文字）より小さい数を条件とする
//		iが１ずつインクリメントする
		for (i = 0; i < array.length; i++) {
//		１つ目の配列から順番に出力していく
			System.out.println(array[i]);
		}
	}
}
````

####3. 拡張for文

拡張for文とは、配列やコレクションの全要素に対して、繰り返し処理を行なう制御文

基本構文は以下の通り

````java
for (型 変数名：配列やコレクションの変数) {
    ブロック(繰り返し処理)
}
````

また、continueはループ処理の途中で条件の処理をスキップできる制御文

````java
public class Chapter8retry {
	public static void main(String[] args) {
		int[] array = { 1, 22, 333, 4444 };
		int i;
		for (i = 0; i < array.length; i++) {
			System.out.println(array[i]);
		}
		
//		数値のデータ型の変数numberに配列を代入
		for(int number : array) {
//			偶数＝２で割ったときに０になる数なので、%で割った値が０と等しいことを条件にする
			if(number % 2 == 0) {
//				 偶数の場合処理をスキップする
				continue;
			}
			System.out.println(number);
		}
	}
}
````


これで復習完了です！
CSS変数について

 - 宣言の仕方はハイフンを2つつける

```
--my-color: orange;
```

 - 使い方はvar関数を使う

```
color: var(--my-orange);
```

 - 複数要素で同じ変数を使用したい場合は共通の親要素で変数を定義する
 - HTML全体で同じ変数を使用したい場合は:root要素で定義してあげる
 - 値には適用できるが、プロパティ名には適用できない
 
 - 単位を使う場合①　宣言に単位までつける

```
--my-margin:32px;
```

- 単位を使う場合②　calc関数を使う

```
margin-left: calc(var(--my-margin) * 1px);
```
【本番環境では】405ルーティングエラー。原因はaxiosのurlだった

#○エラー内容・状況

```
The GET method is not supported for this route. Supported methods: POST.
```

ローカル環境では、同じコードでも問題なく動作していましたが、リリース環境になってから405エラーが出ました。

#○解決方法

![スクリーンショット 2021-09-23 8.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/413eb78c-efca-3245-1759-787fa6b802ca.png)

原因は、

**Vue.js側のaxiosでPOSTで記載しているが、GETになってしまっている事でした。**

```sample.vue
const url = '/post/search/';
$('.bath-search .error').text('');
axios.post(url, {
    prefecture: this.selectedPrefecture,
    keyword: this.keyword,
})
```

原因のコードがこちら

```
const url = '/post/search/';
```

最後のスラッシュがいらないです。

```
const url = '/post/search';
```

#○スラッシュの有無で結果が変わる理由

**末尾のスラッシュの有無で、アクセス対象がディレクトリかファイルかが変わってしまいます。**

>末尾スラッシュが入っている場合、web サーバ（Apache, nginxなど）はHTTPステータス 301 のリダイレクトレスポンスを返すことが多いです。このリダイレクト時にはもともとのリクエストが POST メソッドであっても強制的に GET メソッドとなり、リダイレクト元とは全く違う API を叩くことになりバグとなりえます。

#○参考
https://teratail.com/questions/113036

https://cpoint-lab.co.jp/article/202103/19447/
「3点を通る円を求める」を参考にWolframAlphaとSymPyとVBAソルバーでやってみた。(2/2)

# (前頁)

https://qiita.com/mrrclb48z/items/36eb751ac44698659612


# VBAソルバーで　

エクセルのソルバーのダイアログ入力で普通にできますが、あえてVBAでチャレンジしてみました。ソルバーのための以下の参考の設定が必要です。
SolverOptions AssumeNonNeg:=False追加しました。
おすすめのサイトがあれば、教えて下さい。

(参考)　

https://docs.microsoft.com/ja-jp/office/vba/excel/concepts/functions/using-the-solver-vba-functions

(0,3)(-1,0)(-3,4)


```vb
Const myMethod = "GRG Nonlinear"
'Const myMethod = "Simplex LP"
'Const myMethod = "Evolutionary"
Sub aaa_main()
    ActiveSheet.Cells.Clear
MsgBox "3点を通る円を" & myMethod & "で計算します。"
    Range("A1") = 0
    Range("B1") = 3
    Range("A2") = -1
    Range("B2") = 0
    Range("A3") = -3
    Range("B3") = 4
    
    Range("C1").Formula = "=(A1-$A$4)^2+(B1-$B$4)^2"
    Range("C2").Formula = "=(A2-$A$4)^2+(B2-$B$4)^2"
    Range("C3").Formula = "=(A3-$A$4)^2+(B3-$B$4)^2"
    Range("C4").Formula = "=(C1-C2)^2+(C1-C3)^2"
    Dim ws As Worksheet: Set ws = ActiveSheet
    SolverReset
    SolverOk setCell:=ws.Range("C4"), _
                   MaxMinVal:=3, _
                   ByChange:=ws.Range("A4:B4"), _
                   EngineDesc:=myMethod
    SolverOptions AssumeNonNeg:=False
    SolverSolve UserFinish:=True
    Cells(1, 1).Select
End Sub
```
結果
"GRG Nonlinear" で -2,2,1.57772181044202E-29
"Simplex LP"　 　で 0,0,320
"Evolutionary"　で 3.40853850515957E+28,-3.26028208865797E+29,0

# VBAソルバーで(2022-03-26)

(0,0)(1,0)(0,1)


MaxMinVal 設定
1最大化
2最小化
3値と一致


```vb
Const myMethod = "GRG Nonlinear"
'Const myMethod = "Simplex LP"
'Const myMethod = "Evolutionary"
Sub aaa_main()
    ActiveSheet.Cells.Clear
MsgBox "3点を通る円を" & myMethod & "で計算します。"
    Range("A1") = 0
    Range("B1") = 0
    Range("A2") = 1
    Range("B2") = 0
    Range("A3") = 0
    Range("B3") = 1

    Range("A5").Formula = "=(" & _
                          "    (A1-A4)^2+(B1-B4)^2" & _
                          "   -(A2-A4)^2-(B2-B4)^2" & _
                          " )^2+(" & _
                          "    (A2-A4)^2+(B2-B4)^2" & _
                          "   -(A3-A4)^2-(B3-B4)^2" & _
                          " )^2"
    Dim ws As Worksheet: Set ws = ActiveSheet
    SolverReset
    SolverOk setCell:=ws.Range("A5"), _
                   MaxMinVal:=3, _
                   ByChange:=ws.Range("A4:B4"), _
                   EngineDesc:=myMethod
    
    SolverOptions AssumeNonNeg:=False
    SolverSolve UserFinish:=True
    Range("C4").Formula = "=sqrt( (a1-a4)^2+(B1-B4)^2 )"

End Sub
```
結果
GRG Nonlinear
0	0	
1	0	
0	1	
0.499999719	0.5	0.707106582
6.32914E-13
GithubとJIRAの比較（タスク/スケジュール管理）

## 結論

**あくまでも個人的感想です。**

ここ２年位Githubでタスク管理してて、久しぶりにJIRAでタスク管理しました。
**結論、JIRAの方が私は使いやすいかな、と思いました。** 
以前はもっさり重いな、と思ってましたが比較的良くなったイメージ。

双方で似ている機能がありますが、使いやすいなと思った点を書きます。

**なお、当社はアトラシアンにちゃんと利用料払ってます（笑）** 

## Githubより使いやすいと思った点
似たような機能で優劣つけるのは、
使うチームと使うプロジェクトのルール次第だなと思うところもあるので判断できないなと思ってます。

そもそも、JIRA/Bitbucket/Confluenceと連携させないといけないじゃないか的なこともあります笑

なので、JIRA/Bitbucket/Confluenceの方が使いやすいと思った点を3つ、書こうと思います。

### 1. タスクの大中小管理がしやすい

エピックに「要件定義」「設計」「実装」といった大きな単位で作る。
ロードマップでエピックに紐づく【課題】を作る。
あとは【課題】を達成するための【子タスク】を作る。

以下はロードマップ機能で表示したものです。エピックと課題で表現されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69626/534b5897-6f87-5e91-5c75-2c1a2c165d00.png)

個別のチケットを見ても全体と小課題がわかるので良い感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69626/f684ada8-e13d-7b81-6a68-48f5fc5e07a5.png)

Githubは小課題を作れないことが嫌でした。
Issueへの関連をIssue内部に書けばできますが、直感的にわかりにくいと感じてました。

### 2. スケジュールが見やすい

これ結構メリット大きく

* メンバーへの説明が楽　
* お客さんへの説明が楽　

なんです。
チケットの進捗がロードマップに反映されるのが良いんです。
Github使っていたときは、別のスケジュールツールを使ったりしてて、面倒としか思ってませんでした。
お客さんに説明するのにもコストかかりますし。

スプリントも定義するとそれも反映されるし、、、ロードマップ、最高です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69626/c9afb0b8-756b-9637-bd0c-e26421e5f3e6.png)

### 3. Confluenceが情報共有に適している

マークダウンは両方とも使えますし、ファイル一覧も頑張ればWikiでも書けるので良いのですが、
GithubのWiki、画像を直接貼り付けできないのでモヤモヤしてました。
（一度Issueに貼り付けてそのリンクをWikiに・・・面倒ｗ）。

それだけですｗ

個人的にはConfluenceの方が見やすいし、Wikiの方がメンテ大変かな（サイドバーの編集をよく忘れる）と思ってます。
仕様書の管理は全てJIRA/Confluenceで行いたいですね。

## 参考：JIRA
課題管理がメインですが、Bitbucketを使うことでソースコード管理も出来ます。

https://www.atlassian.com/ja/software/jira

https://www.atlassian.com/ja/software/bitbucket
Oracle Databaseの特長 (またはOracle依存症への入り口)

そもそものDBMSとしてのOracle Databaseの特長・特徴をまとめておくもの。


## Oracle Database

https://ja.wikipedia.org/wiki/Oracle_Database

> 1977年、ラリー・エリソン、ボブ・マイナー、エド・オーツの3名により、Software Development Laboratories (SDL) が設立された。1979年にSDLは、社名を Relational Software, Inc (RSI) に変更し、その際に初期の商用関係データベースとして、Oracle V2を発表した。Oracle V2には、トランザクションの概念はなかったが、基本的なデータベース言語であるSQLを使用することができた。


### PL/SQL

https://ja.wikipedia.org/wiki/PL/SQL

> Oracle社が、Oracle Databaseのためにコンピュータのデータベース言語SQLを独自に拡張したプログラミング言語


### 「便利なSQL」等

Oracleでしかおよそ使えない「便利な」SQL等。

#### セッション情報にクライアント情報をセットできる

```sql
call DBMS_APPLICATION_INFO.SET_CLIENT_INFO('てすとです') 
select client_info, * from V$SESSION where client_info is not null
```

#### Table情報の取得

```sql
SELECT column_name, data_precision, data_scale
FROM user_tab_columns
WHERE table_name = 'BOOKS'
```

#### 全角半角変換とひらがなカタカナ変換

https://www.saka-en.com/oracle/oracle-convert-full-width-half-size/

TO_MULTI_BYTE、TO_SINGLE_BYTE

#### マテリアライズド・ビュー

https://atmarkit.itmedia.co.jp/ait/articles/0504/21/news105.html

> MViewには大きく2つの利用方法があり、1つはリモート・データベース上に存在するデータをローカル・データベース上に定期的にコピーする目的で使用され、スナップショットとも呼ばれます。もう1つは、ローカル・データベース上のデータの集計や結合処理を高速化するために使用されます。

#### フラッシュバッククエリ

http://brsounds.net/index.php/2017/03/22/oracle_flashback_query/

> ユーザから「更新してしまったデータを復活させたい」などの要望があって、過去データを参照する必要が出てきたときに便利な機能です。どの時点までを参照できるかは、UNDOデータに依存するようです。


### 他DBMSとの比較

ここまでのようなお話から、

> RDBMSのデファクトスタンダードとも位置づけられる製品であるが、古くからの仕様を引きずるあまり、標準SQL規格に準拠していない点が多く、他RDBMSとの移行性は良くない場合がある。

と言われる。例として null と 空文字 を区別しないなど。


### ここまで知っていたら通な小話

> Oracle Databaseに付属するdemobld.sql（Oracle Database 10g以降ではutlsampl.sql）を実行すると「EMP」「DEPT」というふたつのテーブルと **「SCOTT/TIGER」**というスキーマよりなる伝統的なデモ環境が構築される。「SCOTT」とはオラクルの前身であるSDLに在籍していたBruce Scottを指し、「Tiger」は彼の愛猫の名前に由来する。


### 「Oracleは『高価』で『難しい』」

Wikipedia より。
> Oracleは高機能である反面、システムや操作方法を理解するのが非常に困難であり、ユーザビリティも低い（CUIによる操作がメインである。Oracle Enterprise ManagerでGUIの操作も可能となっているが、CUIによる操作と比較すると限定される）ため、開発・運用がとても難しいと思われている。また、大規模のシステムを構築するには必要不可欠となるOracle Database Enterprise Editionの価格は1プロセッサ（CPU）当たり570万円とかなり高額である。さらに、大規模システムでは各オプション機能(パーティショニング、DataGuard、RAC等)も高価で他社DBの製品自体のライセンス価格に匹敵するものも多い。こうしたことから、Oracleは「高飛車である」「高くて難しい」というイメージを持たれていると、日本オラクルのクロスインダストリー統括本部長が明かしている。

しかし、便利で、そのマイグレーションがなかなか難しい...。



## 関連

https://qiita.com/e99h2121/items/efd3e12a526816775aab

https://qiita.com/e99h2121/items/43f518f72994464ae912

https://qiita.com/e99h2121/items/941bc0d7f09fee3384a7

https://qiita.com/tbtakhk/items/e10853a2624e55259b25

https://qiita.com/tbtakhk/items/27c55dae1316b0dd69a1

ということでこの記事では言及しないが色々と、Oracleの「特長」との距離感を考えないといけないぞ、というはなし。以上、参考になればさいわいです。
【MySQL・PostgreSQL】SQLをワンライナーで実行する

## MySQL
MySQLサーバのホストを`127.0.0.1`、ポートを`3306`、接続ユーザを`root`、パスワードを`password`と仮定します。
-pオプションとパスワードの間に空白を入れないのがコツです。

```bash
mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "select now()"
```

上の場合だと、結果のみが出力されます。
実行SQLも出力する場合は、`verbose`オプションも指定します。

```bash
mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "select now()" -v
```

複数のSQL文などをファイルに記載し、それを実行したい場合、次のように実行します。
実は単にリダイレクトでも実行可能ですが、MySQLの場合は`executeオプション+cat`を使ったほうが出力が見やすいです。

```bash
mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "$(cat file.sql)"
```

実行SQLも出力する場合は、`verbose`オプションも指定します。

```bash
mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "$(cat file.sql)" -v
```

最後に、今回は完全にワンライナーで書きましたが、パスワードはmy.cnfに登録すると良いです。

## PostgreSQL

PostgreSQLサーバのホストを`127.0.0.1`、ポートを`5432`、接続ユーザを`postgres`、パスワードを`password`、接続データベースを`postgres`と仮定します。

```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres postgres -c 'select now()'
```

上の場合だと、結果のみが出力されます。
実行SQLも出力する場合は、`echo-queries`オプションも指定します。

```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres postgres -c 'select now()' -e
```

複数のSQL文などをファイルに記載し、それを実行したい場合、次のように実行します。

```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres postgres < file.sql
```

実行SQLも出力する場合は、`echo-queries`オプションも指定します。

```bash
PGPASSWORD=postgres psql -h 127.0.0.1 -p 5432 -U postgres postgres -e < file.sql
```

最後に、今回は完全にワンライナーで書きましたが、パスワードはpgpassに登録すると良いです。
もしくは、PGPASSWORDをexportする手もあります。
WSL2でUbuntuの初回起動時に0x800701bcが出てインストールできないときの備忘録(追記:2021/09/29)

#はじめに
Windows11 DevPre版をクリーンインストールしWSL2でUbuntuを実行しようとした際にでた0x800701bcエラーに対する備忘録です（タイトル通り）

```
WslRegisterDistribution failed with error: 0x800701bc
```
###環境
・Windows11 DevPre版
・WSL2

##原因
Linux カーネル更新プログラム パッケージを適用していなかったことが原因だった

##対処法
~~このページの手順4にあるパッケージをDL&インストールすることで解決~~\
追記(2021/09/29)
手順が変わったようで、管理者権限にて

```
wsl --install
```
と実行すると自動でインストールされるようになったようです
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1013591/38a64512-7a21-2f94-4f31-cb9cf5780c7b.png)


#おわり
これでおそらく解決すると思ういます
それではよいWSLライフを！
GitHubにSupport for password authentication was removed on August 13 2021.でPushできなくなった時の対処法

# はじめに

GitHubでPushしようとした時に以下のエラーが発生しました。


```terminal
Pushing to https://github.com/Moto0124/Calculator.git
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/Moto 124/Calculator.git/': The requested URL returned error: 403}
```


最初はアカウントのパスワードが間違っているのかなと思っていたのですが、ログを見るとそうではなかったらしく
どうやらGitHubはGit操作の認証時にアカウントパスワードを受け付けなくなり、代わりにPAT（パーソナルアクセストークン）を使用する方法に変わりました。

解決方法としては以下のドキュメント通りに操作を行えば解決できます。

https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token
【Lombok】GradleでLombokを導入しようとしたらコンパイルエラー

#GradleでLombokを導入、実行しようとしたらエラーが発生した
Annotationを書くことでJavaのBoilerplateを省略してくれるLombokを試してみようとしたところ、コンパイルエラーになったので、その解決法です。

##ソースコード
```java:java
import lombok.*;

public class LombokDemo {
    public static void main(String[] args) {
        Human aoi = new Human("aoi", 22);
        Human ryo = new Human();
        ryo.setName("ryo");
        ryo.setAge(21);

        System.out.println(aoi);
        System.out.println(ryo);
    }
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
class Human {
    private String name;
    private int age;
}
```

```gradle:build.gradle(dependencies)
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.20'
}
```

##実行結果(Before)

```terminal:terminal
C:\project_pass\src\main\java\LombokDemo.java:3: エラー: クラス Humanのコンストラクタ Humanは指定された型に適用できません。
        Human aoi = new Human("aoi", 22);
                    ^
  期待値: 引数がありません
  検出値: java.lang.String,int
  理由: 実引数リストと仮引数リストの長さが異なります
```

##原因
build.gradleにはLombokに関する依存をもう一つ書かなければならなかった。

```gradle:build.gradle(dependencies)
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
}
```

##実行結果(After)

```terminal:terminal
> Task :LombokDemo.main()
Human(name=aoi, age=22)
Human(name=ryo, age=21)
```

##感想
公式サイトはしっかり見ましょう。
【Swift】TableViewCellの使い方（自分用メモ）

# はじめに
UITableViewにTableViewを用いてカスタムビューを表示するまでの流れでステップがいくつかあったので、自分用にメモします。

## 下準備

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018949/3362775b-575e-dd3c-bc53-06b325255b4c.png)
1. 右クリック → NewFileを選択 → Cocoa Touch Classを選択

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018949/1aff0f65-03b0-422d-2530-edc7f0ef62c8.png)
2. Class名を任意の値に変更 
3. SubClassをUITableViewCellに変更 
4. Also create XIB fileにチェックを入れて次へ


## カスタムViewの作成
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018949/245a9de2-16d5-ed5d-8141-fa24158405b1.png)
1. AutoLayoutを適応しながら1つのCellのレイアウトを決定
2. それぞれの要素を関連付け
3. Cell生成時に値を代入するための関数（ここではsetCellに該当）を用意
4. XibファイルのViewのIDを任意のものに変更


## TableViewへの反映
![スクリーンショット 2021-09-23 1.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018949/62687782-6df0-d203-71ee-0c543b08d309.png)
1. delegateとdatasourceを継承
2. delegateとdatasourceを設定（ViewDidload）
3. TableViewCellのIDを変更（Attributes Inspector）
4. TableViewCellの大きさをAutomaticに変更（Size Inspector）
5. TableViewにカスタムセルを登録（registerメソッド） 
6. TableViewのCellにIDを付与
7. cellForRowAtでcellを定義する際、6のIDを指定して取得する
8. cellForRowAtで定義したcellを作成したカスタムビューの型にキャスト
9. cellForRowAtでsetCell関数を実行してCell内部のオブジェクトに値を代入
10. テーブル名.rowHeight = UITableView.automaticDimensionをViewDidloadに追加


みたいな感じで実装したら、ええ感じに実装できる。
Hyper-V上に作成したUbuntu20.04LTSでブリッジ接続が利用できない場合の対応方法

例えば、Hyper-V上にUbuntuをインストール後にLXDでそのブリッジを利用してコンテナをブリッジ接続しようとすると、コンテナからブリッジ接続したネットワークが利用できない（ネットワークが疎通しない）場合があります。

https://qiita.com/tabimoba/items/e371dddb4c87baa07832

https://qiita.com/tabimoba/items/e5ea32c8359f0f9e0f3b

そのような場合は、Hyper-Vの仮想マシンのネットワークアダプターの設定の「高度な機能」にある「MACアドレスのスプーフィングを有効にする」にチェックを入れることで、LXDコンテナで仮想マシンのNICを経由するブリッジ接続が利用可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f2c8afd7-fd1e-cc3e-b2ae-17c39aec44e3.png)

なお、LXDに限らずHyper-Vでブリッジ接続できない問題は、ほとんどの場合同様の対応で解決します。
LXDでブリッジ接続する方法（Ubuntu20.04）

# 【１】プロファイルの作成
## １．ブリッジインターフェースを追加する
以下を参照

https://qiita.com/tabimoba/items/e371dddb4c87baa07832

## ２．lxcのprofileを追加する
```
# lxc profile create bridge
```

## ３．作成したprofileにブリッジインターフェースをアタッチする
```
# lxc network attach-profile br0 bridge eth0
```

## ４．作成したprofileにストレージプールをアタッチする
```
# lxc profile device add bridge root disk path=/ pool=default
```

# 【２】コンテナの作成と起動
profileを指定してコンテナを作成する

```
# lxc launch ubuntu:20.04 testdrive --profile=bridge
```
Log::debug();でArray to string conversionになって詰まった話。

Laravelを触っていてログに出力したい時があると思います。
この変数の中身はきちんと想定している変数の値が入っているのか、とか、配列がどのようにして入っているのか、など。
そういったことを確認する時に、Log::debug();で出力することがかなりあります。
今回はその時にミスったことを備忘録としてまとめていこうと思います。

脱線するのですが、Log::debug();で出す時に、ぜひ初心者の方におすすめしたいのですが、文字連結を用いて、メッセージ付きで今出そうとしているものの説明をつけておいたほうがいいと思います。

例としては、

```
publick function example (){
    $intArray = array(1,2,3,4,5);
    Log::debug("Value of $intArray in example", $intArray);
}
```

のように、配列の値を出力する時にや、変数の値を出力する時には、必ずメッセージを付けて出力しましょう。

##いやいやちょっと待てよ

数日前のワイ「確かに、いろいろLogを仕込んで置く時にメッセージをつけないと、何の値が出力されたのかわからないからつけるんでしょ。
だったら今出力しようとしているところ以外すべてコメントアウトしておけばいいじゃないか。
そうすれば迷わなくないか。
そもそも、いまこれ以外のLogコメントアウトしてあるからやる必要なくないか。
」

ということを職場の先輩に行った時に、

先輩「今はそうかも知れないけれども、大規模なサービスになった時にLogをこうやって仕込まないと訳わかんなくなるよ。」

ワイ「なるほど!!!。わかりました!!!」

#話を戻します。
このエラーが起きた時に、書いたコードはこういったふうにやりました

```php
Log::debug('Value of $clientsInfo in clientsController@index'. $clientsInfo);

```

このコードをいざ実行しようとした結果、タイトルのエラーになってしまいました。
このLog::debug();で出力しようとしている$clientsInfoは配列です。
ということは、感の言い方ならもう気づいたかと思います。

文字連結をする時に、ピリオド(.)ではなくカンマ(,)でないと、文字列と配列の連結をするときはうまく行かないのです。

#まとめ

文字列と配列を連結させてLogに出力したい場合は、

```
Log::debug("message",変数);
```

のように、カンマ(,)を使わないといけない。

ピリオドを文字列と配列で使ってしまうと、

```
Array to string conversion
```

になってしまうので注意が必要。

もう一つが、Log::debug();で出力してデバッグをするなら、必ずメッセージを付けること。
になります
ありがとうございました。
S3バケットポリシーによるアクセス制限

特定の VPC からのアクセス制限をしようとして、バケットポリシーでミスったので、その備忘録。


特定の VPC でエンドポイントを作成した後、S3 のバケットポリシーで特定の VPC からのアクセスのみ許可する設定として以下を実施した。
が、設定が不足していたため、AWS マネジメントコンソールからもアクセスできなくなってしまった。

```bash
{
    "Version": "2012-10-17",
    "Id": "PolicyDemo",
    "Statement": [
        {
            "Sid": "Allow-from-specific-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::S3バケット名",
                "arn:aws:s3:::S3バケット名/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpc": "VPC ID"
                }
            }
        }
    ]
}
```

とりあえず、上記の VPC 内の EC2 から以下のコマンドを実行し、バケットポリシーを削除。

```bash
# aws s3api delete-bucket-policy --bucket <S3バケット名>
```

その後、バケットポリシーを設定し直し。

```bash
{
    "Version": "2012-10-17",
    "Id": "PolicyDemo",
    "Statement": [
        {
            "Sid": "Allow-from-specific-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::S3バケット名",
                "arn:aws:s3:::S3バケット名/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "自端末のIP/32"
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "VPC ID"
                }
            }
        }
    ]
}
```


# 参考資料

S3バケットポリシーを使用した VPC エンドポイントからのアクセス制御
https://cloud5.jp/s3_policy_endpoint/

複数の否定条件を使ったS3バケットポリシーを正しく理解してますか？
https://dev.classmethod.jp/articles/s3-bucket-policy-multi-condition/

2つのVPCエンドポイントの違いを知る
https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/
Unityでスライム系の簡単な動きを再現してみた

こんにちは

今回、Unityを用いて自作ゲームを作成するにあたって、「スライム系」のモンスターオブジェクトを動かすことになりました。

そこで、「スライム系」っぽい動きをするために書いたコードをこの記事に残します。

ここでスライムっぽい動きとは、進んで止まって進んで止まってと、緩急をつけて前進することを指しています。

```C#:
    float speed; //スライムの現在のスピード値を格納
    float minspeed; //スライムの最遅スピード値を格納
    float maxspeed; //スライムの最速スピード値を格納
    float del; //スピード値の変化量を格納
    string status; //スピードを上昇下降の判断用

    <font color="orange">void Start()
    {
        speed = 1.5f; //初期化
        minspeed = 1.5f;
        maxspeed = 4f;
        del = 0.005f; 
        status = "up"; //はじめはスピードを上昇させる。
    }

    void Update()
    {
        if (status == "up")//現在のstatusの判定
        {
            speed = speed + del; //変化量を毎フレーム加算
            if (maxspeed < speed) //現在のスピード値判定
            {
                status = "down";
            }
        }
        else if (status == "down")
        {
            speed = speed - del;
            if (minspeed > speed)
            {
                status = "up";
            }
        }

        transform.Translate(0,0,speed * Time.deltaTime); //現在のスピード値分オブジェクトを移動
    }
```


基本的に、変数「del」に大きい値を入れると、スライムが早く動いているように見える。


また、進んで止まる動きを1アクションとすると、「Maxspeed」の値でどれだけ進めるか調整できる。
Ubuntu 18.04 LTSでAmazon Time Sync Serviceを利用して時刻同期する

Ubuntu 18.04LTSでAWSのTime Sync Serviceの使い方がすぐに見当たらなかったので、手順をまとめてみました。
やることは、パッケージのインストール方法を除けば、CentOS 7と大体同じです。

## ntp関連パッケージを削除する
```
# apt purge ntp ntpdate
```

## chronyをインストールする
```
# apt update && apt install chrony
```

## /etc/chrony.confへ以下を追記する
```
server 169.254.169.123 prefer iburst
```

## サービスの自動起動有効化とサービスの起動を行う
```
# systemctl enable chrony
# systemctl start chrony
```

## 参照先（同期先）ソースを確認する

169.254.169.123が一覧に有り、の先頭が「^*」であれば問題有りません。

```
# chronyc sources
210 Number of sources = 23
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 169.254.169.123               3   6     7     2   +853ns[+874.1s] +/-  432us
^? pugot.canonical.com           0   6     0     -     +0ns[   +0ns] +/-    0ns
^? alphyn.canonical.com          0   6     0     -     +0ns[   +0ns] +/-    0ns
^? chilipepper.canonical.com     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? golem.canonical.com           0   6     0     -     +0ns[   +0ns] +/-    0ns
^? golem.canonical.com           0   6     0     -     +0ns[   +0ns] +/-    0ns
^? chilipepper.canonical.com     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? ec2-xxx-xxx-xxx-xxx.ap-nor>     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? ntp-b2.nict.go.jp             0   6     0     -     +0ns[   +0ns] +/-    0ns
^? time.paina.net                0   6     0     -     +0ns[   +0ns] +/-    0ns
^? mx.execve.net                 0   6     0     -     +0ns[   +0ns] +/-    0ns
^? atl0.jane.mattnordhoff.n>     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? debmirror.tuxis.net           0   6     0     -     +0ns[   +0ns] +/-    0ns
^? ntp3.flashdance.cx            0   6     0     -     +0ns[   +0ns] +/-    0ns
^? electrode.felixc.at           0   6     0     -     +0ns[   +0ns] +/-    0ns
^? 208.67.72.50                  0   6     0     -     +0ns[   +0ns] +/-    0ns
^? 195.50.171.101                0   6     0     -     +0ns[   +0ns] +/-    0ns
^? helium.supersandro.de         0   6     0     -     +0ns[   +0ns] +/-    0ns
^? spacys.de                     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? aurum.valaphee.com            0   6     0     -     +0ns[   +0ns] +/-    0ns
^? 2a01:e0a:334:10f5:f8c1:a>     0   6     0     -     +0ns[   +0ns] +/-    0ns
^? angband.teaparty.net          0   6     0     -     +0ns[   +0ns] +/-    0ns
^? 2001:14e8::25                 0   6     0     -     +0ns[   +0ns] +/-    0ns
```

## 時刻同期されたことをチェックする
```
# chronyc tracking
Reference ID    : ABCDEFGH (169.254.169.123)
Stratum         : 4
Ref time (UTC)  : Tue Apr 14 01:34:36 2020
System time     : 0.000000104 seconds slow of NTP time
Last offset     : +0.000227399 seconds
RMS offset      : 0.000227399 seconds
Frequency       : 48.484 ppm fast
Residual freq   : +0.000 ppm
Skew            : 22.290 ppm
Root delay      : 0.000290389 seconds
Root dispersion : 0.000795178 seconds
Update interval : 4.7 seconds
Leap status     : Normal
```

## 参考

https://tech-lab.sios.jp/archives/11247

https://aws.amazon.com/jp/blogs/news/keeping-time-with-amazon-time-sync-service/