OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】【Shader】テクスチャを２枚表示する

Unlitシェーダーを新規作成すると既に_MainTexが記述されているが、同じシェーダーで別のテクスチャを使いたい場合にはどうすればいいのか分からなかったので試してみた。

# テクスチャを２枚表示

ただ単にテクスチャを２枚表示するだけなら、_MainTexの記述を参考にして以下のように処理を追加してあげればOK。
簡単だった。

```.c
Shader "Unlit/SH_MultiTex"
{
    Properties
    {
        // _MainTexから名前を変更
        _RGTex ("RGTexture", 2D) = "white" {}
        // 追加
        _BlueTex ("BlueTex", 2D) = "black" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            // _MainTexから名前を変更
            sampler2D _RGTex;
            float4 _RGTex_ST;            
            // 追加した
            sampler2D _BlueTex;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _RGTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_RGTex, i.uv);
                // 追加
                fixed4 col2 = tex2D(_BlueTex, i.uv);
                // 変更
                return col + col2;
            }
            ENDCG
        }
    }
}

```

以下の２枚のテクスチャを設定。

- 赤(#ff0000)から緑(#00ff00)のグラデーション画像
- 青(#0000ff)の単色画像

<img width="461" alt="スクリーンショット 2019-10-04 15.37.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85509/ddd8736b-64d8-69cb-f2bc-18a0b5238841.png">

こんなふうになった。加算されて、#ff00ffから#00ffffのグラデーションになっているっぽい。

<img width="486" alt="スクリーンショット 2019-10-04 15.08.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85509/15360885-e799-0b45-82e5-83390baa5377.png">
AWS Cloud9のファイルツリーに好きな場所を表示する

# はじめに
環境を作る際に記入したEnvironment Pathとホームディレクトリしかファイルツリーで表示することができませんでした。`/var/www/html`をファイルツリーに表示したい。

# シンボリックリンクを作成する
シンボリックリンクを作成したら表示されました。

```
ln -s [表示させたいパス] [Environment Pathに設定したパス]
```
`/var/www/html`を表示させたく、Environment Pathに`/home/username`を設定したため

```
ln -s /var/www/html /home/username
```
としました。
![PresentHtmlInFileTreeForCloud9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403520/908d0913-5d28-746c-feba-eb8a813e6e6b.png)
表示できました。

## Environment Path
対象の環境を選択し、[Edit] - [Advanced settings]の順にクリックすることで確認できます。

## アクセス権限
Cloud9上でファイルの保存・削除を行うと`Permission denied`といったエラーが発生するかもしれません。chmodなどでファイルのアクセス権限を変えてあげてください。
KVMホストPCのOS変更に伴うKVM仮想マシンの移動（CentOS6 ⇒ CentOS8）

# サーバ用に使っているPCをリプレイスしてみた
消費税が10%増税っていうこともあり、サーバ用に使っているPCもこの際なので新調してみた。というのもあるけどホストサーバのOSを CentOS8 にしてみたかったっていうのが大きい。

# イメージファイルを移動しただけだと動かなかった！！

[ゲストOSのバックアップ＆リストア](http://www.sea-bird.org/pukiwiki/index.php?CentOS6%20/%20%A5%B2%A5%B9%A5%C8OS%A4%CE%A5%D0%A5%C3%A5%AF%A5%A2%A5%C3%A5%D7%A1%F5%A5%EA%A5%B9%A5%C8%A5%A2) は、こっちをみてもらううとして。

起動すると下記のようなエラー(/var/log/messages)が。。。”unsupported machine type” ですか、マシンタイプが違うと。

```terminal
error : qemuMonitorIORead:609 : モニターから読み込みできません: 接続が相手からリセットされました
error : qemuProcessReportLogError:1923 : 内部エラー: qemu unexpectedly closed the monitor: 2019-10-04T23:21:12.485357Z qemu-kvm: -machine rhel6.4.0,accel=kvm,usb=off,dump-guest-core=off: unsupported machine type
```

修正点

```text
<type arch='x86_64' machine='rhel6.4.0'>hvm</type>
↓
<type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
```

起動したあああああああああああ

だが・・・

```text
# /usr/libexec/qemu-kvm -machine help
Supported machines are:
pc                   RHEL 7.6.0 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-rhel7.6.0)
pc-i440fx-rhel7.6.0  RHEL 7.6.0 PC (i440FX + PIIX, 1996) (default)
pc-i440fx-rhel7.5.0  RHEL 7.5.0 PC (i440FX + PIIX, 1996)
pc-i440fx-rhel7.4.0  RHEL 7.4.0 PC (i440FX + PIIX, 1996)
pc-i440fx-rhel7.3.0  RHEL 7.3.0 PC (i440FX + PIIX, 1996)
pc-i440fx-rhel7.2.0  RHEL 7.2.0 PC (i440FX + PIIX, 1996)
pc-i440fx-rhel7.1.0  RHEL 7.1.0 PC (i440FX + PIIX, 1996)
pc-i440fx-rhel7.0.0  RHEL 7.0.0 PC (i440FX + PIIX, 1996)
q35                  RHEL-7.6.0 PC (Q35 + ICH9, 2009) (alias of pc-q35-rhel7.6.0)
pc-q35-rhel7.6.0     RHEL-7.6.0 PC (Q35 + ICH9, 2009)
pc-q35-rhel7.5.0     RHEL-7.5.0 PC (Q35 + ICH9, 2009)
pc-q35-rhel7.4.0     RHEL-7.4.0 PC (Q35 + ICH9, 2009)
pc-q35-rhel7.3.0     RHEL-7.3.0 PC (Q35 + ICH9, 2009)
none                 empty machine
```

# ついでに、仮想マシンのCPU数上限をあげてみる（１⇒２）

```terminal
# virsh setvcpus ゲストOS名 2 --config --maximum
```

> [KVM仮想マシンのCPU数 / メモリサイズ変更](https://www.eastforest.jp/centos6/3694)
Mac で空ディレクトリを rm -rf しようとても Directory not empty

## 結論

Finder でゴミ箱に入れられた。GUI 強い・・。

<img width="1012" alt="trash.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106789/8b27a461-1f79-b41e-1fc5-76cbe5d870b6.png">

## それまでに試したこと

- `$ ls -la target_dir` -> 何も無いことを確認。
- `$ sudo rm -rf target_dir` -> やっぱり Directory not empty
- `$ sudo chown -R $(whoami) target_dir` -> やっぱり Directory not empty
- `$ sudo chmod -t target_dir` -> スティッキービットを解除か、ほほう・・関係なし。
- mac 再起動

## 背景

ndenv を削除して nodenv にしようと思ったのです・・。

~~~sh
$ anyenv uninstall ndenv
anyenv: remove /Users/hoge/.anyenv/envs/ndenv? y
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules/webdriverio/node_modules/tar-stream: Permission denied
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules/webdriverio/node_modules/wgxpath: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules/webdriverio/node_modules/wrappy: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules/webdriverio/node_modules: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules/webdriverio: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib/node_modules: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10/lib: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions/v6.10: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv/versions: Directory not empty
rm: /Users/hoge/.anyenv/envs/ndenv: Directory not empty
~~~

## 参考
- [Mojave won't delete my empty directory](https://discussions.apple.com/thread/8561902)
- [Permission denied when trying to cd /usr/local/bin from terminal](https://superuser.com/questions/717663/permission-denied-when-trying-to-cd-usr-local-bin-from-terminal)
- [“cannot remove 'some_directory': Directory not empty”](https://unix.stackexchange.com/questions/48227/cannot-remove-some-directory-directory-not-empty)
cocos2d-x v4 rc0 のMetalを試してみる

 Metalに対応したv4 rc0が公開されています.
https://discuss.cocos2d-x.org/t/metal-support-rc0-released/47797/6

将来的に現行のcocos2d-xで作成したプロジェクトを
Metalでリプレースする可能性もあるので動作確認してみます.


## テストを実行してみる
環境 macOS 10.14.6 XCode10.1 cmake3.15.3

### cocos2d-x v4 rc0を[ダウンロード](https://discuss.cocos2d-x.org/t/metal-support-rc0-released/47797/6)します

### cmakeでxcodeのプロジェクト作成する
解凍したフォルダに移動して

```
mkdir ios-build & cd ios-build
cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos
```

ios-buildにxcodeprojが作成されXCodeから実行できます.

### テスト結果
作成されたxcodeprojから
iPhoneでAuto Testを実行してみました.
(XCode11のシミュレーターでは動作せず)

下記のテストでエラー

```
Run test:TurnOffTilesDemo.
Run test:TransitionTurnOffTiles.
```

TiledGrid3Dは未実装なのかな.

下記のテストでたまに止まる.

```
Run test:Particle3DWithSprite3DDemo.
```

Metal関係のCache周りがこなれてないのかも.

以上
Kaggle「IEEE-CIS Fraud Detection」コンペで銀メダルを取りました。

## コンペ概要
取引データから詐欺や不正を判定するコンペでした。
isFraud=1のデータが少ない不均衡データで評価指標はAUCでした。

https://www.kaggle.com/c/ieee-fraud-detection/

類似コンペとしてDiscussionではTalkingData AdTracking Fraud Detection Challengeがあげられていました。
ただしデータサイズは本コンペの方が小さいので取り組みやすかったと思います。

## コンペ結果
##Kaggle「IEEE-CIS Fraud Detection」コンペに参加して、125位でした。PublicLBスコアだと900位程度の提出でしたがshake upしたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200770/ee286aa7-718d-88ba-e102-94017b31b8da.png)

## 取り組み
### モデル
基本はLightGBMを使いました。
Catboost もちょっとだけ試したのですが、特徴生成時にOneHotエンコーディングしたカラムがあり、CatboostはOneHotが苦手と聞いたことがあったためLGBMで良いかなと思いました。

### CVの切り方
これに関しては色々悩んだのですが、自分のモデルでは以下のようにしました。
1.時系列データになっていたので、訓練データをTransactionDTのカラムでソートしてtrainとvalを85：15にhold outで切り分ける。

2.earlystopping=100の状態で学習してbest iterationを出す。

3.trainingデータの全量を2で出したbest iteration分学習させる。
この工程だと1つ1つのモデルがベストのスコアをたたき出すまで学習が進んでいないような気がしますが、アンサンブルする際には多様性が大事だからまあいいかという判断です。

## 特徴量エンジニアリングなど
匿名データで理解できなかったこともあり機械的に進めた部分かったです。

#### 総当たり集約
素のLGBMのFeatureImportanceの上位20くらいの中でカテゴリ型と数値型を見て集約。

#### ユーザー識別のための特徴
最初はitertoolsのcombinationなどを使って組み合わせを作ったりしていました。（これはAtcoderをやっていた時に覚えた）
最終的にはカード情報とアドレスを足したものを使っていました。

#### magic feature
コンペの勝敗を左右するような強い特徴をmagic featureと呼ぶようですが、私はわかりませんでした。

#### 特徴選択
特徴を総当たりで作ったのでメモリを食いすぎてRFEは使えませんでした。
なので、permutationImportanceを利用しようとeli5を入れましたがこれもメモリ枯渇。
Discussionにスクラッチの実装があったのでそれを参考にした。
numpyのSEEDを変えて何度か試すとシャッフルの結果が変わって、それを使うことも考えましたが、処理時間が伸びるため今回は使わず。


####パラメーターチューニング
Optunaで寝ている間に実行

#### LGBMのGPU版
ローカルのGPU積んだマシンでGPUバージョンを使っていました。
今まではCPUでしか使っていなかったのですが、異なる挙動があり、pandasのカテゴリ型を渡すことができないなど気づきがありました。

## 最終サブミットの作り方
1位チームの<a href="https://www.kaggle.com/kyakovlev">@kyakovlev</a>さんの公開カーネル4つと自分でつくったモデル6つの10モデルのブレンドです。自分のモデルだけでRankAverageも最終サブの1つに選んでいましたがそちらはダメダメでした。
これは終わってからなぜそうなったか考えたので、サブミット提出時から狙っていたことではないのですが、
公開カーネルはGroupKfoldを使っていて自分は異なるValidationの切り方だったので、ブレンドした際にスコア改善が結果的にうまくいったのではないかと思います。
ほかにもやったことはあるのですが、magic featureが見つからないから結果は出ないだろうと半ばあきらめていたため最終サブには入っていません。（実際最終サブは9月17時点で作ったものになっている）

### 総括
テーブルデータコンペ(csv形式のデータ)は画像に比べると取り組みやすいと思いますので真面目に取り組みたいと思っていました。
AutoMLの普及などで課題を抱えた企業が外部に出さずともある程度の結果を得られるため、1~2年前と比べ開催頻度が下がったのではないかという声もtwitterなどで見かけましたし、実際そうなのではないかと思います。

10月7日に発売される『Kaggleで勝つデータ分析の技術』といった書籍や、各種のWebに掲載されたテクニックで良いスコアを出しやすくなった半面、差をつけることが難しくなり、これからはテーブルデータコンペでのメダル獲得の難易度はあがっていくと考えています。
本質に迫れたとは思いませんが、8~9月は残業が多く、平日はあまり実装時間が満足に取れない中、結果を得ることができたので満足する部分はあります。

今後は本コンペの復習や、前述の書籍を購入し過去コンペで試すなど学びを深めたいと思います。
ラズパイ電源投入時にPythonスクリプトを実行

#やりたいこと

* 作ったPythonスクリプトを、電源投入時に自動で起動したい
* piユーザで実行したい（作成時と同じ権限）
* 作ったスクリプトと、起動用のスクリプトを分けたい

あたりです。
https://www.instructables.com/id/Raspberry-Pi-Launch-Python-script-on-startup/
こちらの記事が参考になった。

#手順

* 自動実行したいスクリプトを作る
    * ファイル名は `startup.py` としておく
* launcher.sh を作る
    * `chmod 755 launcher.sh` しておく
    * launch.shに、 `python /home/pi/startup.py` を記述
    * /home/pi/以下に置いておく
* Cronを設定する
    * `crontab -e`
    * `@reboot sh /home/pi/launcher.sh >/home/pi/log 2>&1`　を追記
* 再起動して試す
【HTML】labelタグとラジオボタンでメニューバー

HTML上でWindows Formのようなメニューバーを実現するサンプルです。

![menubar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192467/c7cec7e6-91be-0d13-187e-4f08188b184c.gif)


# 簡単な説明
labelタグにfor属性を指定し、ラジオボタンと関連付けると、labelタグをクリックするだけでラジオボタンにチェックを入れることができます。

ラジオボタンにチェックが入っているとき、その隣接要素（＝表示したいサブメニュー）に対して`display:block`を設定することで、サブメニューを表示します。

メニュー部分以外をクリックしたときは開いているサブメニューを閉じたいので、そこだけはJavaScriptの処理を使っています。

# HTML
```HTML
<div id="menubar">
    <ul class="menu-category">
        <li class="menu-item">
            <input type="radio" class="menu-radio" name="radio-categories" id="radio-file" value="ファイル">
            <label for="radio-file" class="menu-label">ファイル</label>
            <ul class="radio-submenu">
                <li>新規</li>
                <li>新しいウィンドウ</li>
                <li>開く</li>
                <li>上書き保存</li>
                <li>名前を付けて保存</li>
            </ul>
        </li>
        <li class="menu-item">
            <input type="radio" class="menu-radio" name="radio-categories" id="radio-edit" value="編集">
            <label for="radio-edit" class="menu-label">編集</label>
            <ul class="radio-submenu">
                <li>切り取り</li>
                <li>コピー</li>
                <li>貼り付け</li>
                <li>削除</li>
            </ul>
        </li>
        <li class="menu-item">
            <input type="radio" class="menu-radio" name="radio-categories" id="radio-help" value="ヘルプ">
            <label for="radio-help" class="menu-label">ヘルプ</label>
            <ul class="radio-submenu">
                <li>ヘルプの表示</li>
                <li>バージョン情報</li>
                <li>お問い合わせ</li>
            </ul>
        </li>
    </ul>
</div>
<h1>HELLO WORLD!!</h1>
```

# CSS
```CSS
body{
    margin: 0;
}

.menu-category{
    margin: 0;
    padding: 0;
    list-style: none;
}

.menu-category, .radio-submenu{
    background: #666;
    color: #fff;
}

.menu-item{
    display: inline-block;
    vertical-align: top;
}

.menu-label{
    padding: 5px;
    display: inline-block;
}

.menu-radio{
    display: none;
}

.radio-submenu{
    display: none;
    position: absolute;
    list-style: none;
    margin: 0;
    padding: 0;
}

.radio-submenu li{
    padding: 5px;
}

.radio-submenu li:hover{
    background: #777;
    cursor: pointer;
}

/* チェック済みの.menu-radioに隣接する.menu-labelに隣接するulにCSSを適用 */
.menu-radio:checked + .menu-label + ul{
    display: block;
}
```

# JavaScript
```JavaScript
// メニューバー以外の場所をクリックしたらラジオボタンのチェックを外す
document.addEventListener('click', (e) => {
    if(e.target.closest('.menu-category') === null){
        document.querySelectorAll('.menu-radio').forEach((el) => {
            el.checked = false;
        });
    }
});
```
CentOS8の起動が遅いので調べる


# 調べる

```
# systemd-analyze
Startup finished in 1.070s (kernel) + 4.813s (initrd) + 43.808s (userspace) = 49.692s
multi-user.target reached after 40.904s in userspace
```

40秒はちょっと長いです。

```
# systemd-analyze blame
         30.128s NetworkManager-wait-online.service
          4.553s initrd-switch-root.service
          3.455s firewalld.service
          3.150s kdump.service
          2.430s tuned.service
```

30秒待ちとは。

[NetworkManager Wait Online を有効にする](https://wiki.archlinux.jp/index.php/NetworkManager#NetworkManager_Wait_Online_.E3.82.92.E6.9C.89.E5.8A.B9.E3.81.AB.E3.81.99.E3.82.8B)

>ネットワークが立ち上がる前にサービスが起動して失敗する場合、NetworkManager サービスにプラスして NetworkManager-wait-online.service を使って下さい。ただし、ネットワークが設定されていないときでも殆どのネットワークデーモンは正しく立ち上がるので、これが必要になるのは稀です。
それでもサービスが正しく起動できない場合 /usr/lib/systemd/system/NetworkManager-wait-online.service のタイムアウト設定が短すぎることが原因です。デフォルトのタイムアウトである 30 を高い値に修正してください。

```
# cat /usr/lib/systemd/system/NetworkManager-wait-online.service
[Unit]
Description=Network Manager Wait Online
Documentation=man:nm-online(1)
Requires=NetworkManager.service
After=NetworkManager.service
Before=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
RemainAfterExit=yes

[Install]
WantedBy=network-online.target
```

タイムアウト30秒待ちに引っかかっているようです。


# NetworkManager-wait-onlineとは

[NetworkTarget](https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/)

network-online.targetがあるのでいらないんじゃないですかね。

```
# systemctl disable NetworkManager-wait-online.service
Removed /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
```


```
# systemd-analyze
Startup finished in 1.021s (kernel) + 4.598s (initrd) + 12.746s (userspace) = 18.366s
multi-user.target reached after 11.227s in userspace
```

11秒になりました。
さくらVPSでCentOS8のインストール


![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/9f344b4b-773d-e71c-3f9f-e2d15f035724.png)

カスタムOSにCentOS8がありました。

![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/1dae9019-857a-b3d9-dec4-983e3e93c958.png)
![003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/17e7a8ca-e97d-9f35-ed4c-088d17fc08c7.png)
![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/17bc8534-ac7c-7fa1-6439-ae5c835e056a.png)

Installation Destinationさえ設定すればインストールは先に進めます。

![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/ddcdd3fe-2feb-e9f4-e0f7-ee8cdfda56dd.png)
![006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/c6025e9e-614f-93c4-fa1e-dcb4ae3ee27e.png)
![007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/21227c08-8385-bd62-36d4-e22272e7daca.png)

インストールし直しの場合はここからパーテーションを削除します。

![008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/01269a0f-be8a-3f6a-5b8c-dd3fb9c7ed03.png)
![009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/9c077f69-6c4a-8e63-33cd-52d85aae5bbf.png)
![010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/db18ec3c-5f18-cd6c-8a66-3463b9cd9471.png)
![011.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/529ba42e-21f4-b858-fff7-3c89fdb32445.png)
![012.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/5f816d8d-2f6f-6ec4-5432-e89b1e926fad.png)
![013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/24635b70-82fa-ec70-ca28-702e35467083.png)

この画像ではMinimalを選択していますが、なぜかMinimalを選択するとインストールエラーしたのであえて無指定にしました。

![014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/0aec8c2a-eaed-3b66-47d6-673bcc75d4b7.png)
leafletを鍛える。その20

#概要

leafletを鍛えてみた。
geojsonを表示してみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/153c8414-31cb-6850-0b99-0da26bd4d3a9.png)



#成果物

https://embed.plnkr.co/vfXZbzsoJDIBsYGfSUty/


以上。
vmcore を読んでみる(1)

Linuxマシンが crash して停止してしまった、あるいは、再起動してしまった、ということはありませんか。
設定によっては、/var/crash 配下に、vmcore が取得できているかもしれません。
今回は、そんなコアファイルを読んでみたいと思います。

kernel-debuginfo, kernel-debuginfo-common パッケージをダウンロード、インストールします。 
例えば、CentOS であれば、以下のサイトに行くと、ダウンロードできます。crash したマシンと同じバージョンのものをダウンロードしましょう。

http://debuginfo.centos.org/7/x86_64/

vmcore を出力したカーネルと同じバージョンのkernel-debuginfo, kernel-debuginfo-common をインストールできたとして、以下の順番で確認します。

crash コマンドにより、vmcore を開きます。

```
$ crash /usr/lib/debug/lib/modules/<kernel-version>/vmlinux vmcore 
```

例えば、以下に注目します。

```
KERNEL: /usr/lib/debug/lib/modules/<kernel_version>/vmlinux
DUMPFILE: vmcore  [PARTIAL DUMP] ★<-- PARTIAL となっていますが、crash が効率性のために、0 で埋めた
ためで問題ないです。
CPUS: 8 ★<-- この数が64を超えるようであれば、spin lock で競合している可能性があります。
DATE: Sat Nov 5 06:58:00 2019 ★<-- 事象発生の日時となっています。
UPTIME: 17:23:57 ★<-- もし、数分であれば、boot プロセスで発生したと考えられ、再現する可能性があると
考えられます。209日ぐらいであれば、clock underflow 問題の可能性があります。
LOAD AVERAGE: 0.58, 0.44, 0.47 ★<-- （左から、1分、5分、15分）実行可能なプロセス数を示す。
左に向かって増加していれば、ロードが増加傾向で、事象発生が最近であることを示しています。
ロードが平板であれば、システムがスタックしていると考えられ、左に向かって減少していれば、
システムがアイドルになっているということになります。もし最近のロードが高ければ、ロードは、
実行可能なプロセスがCPUを得られないためなのか、I/O待ちまたは他のイベント待ちによる割り込み不可な
プロセスのためなのかを見分ける必要があります。
TASKS: 399 ★<-- この数が2000を超えるようであれば、リソースが足りないと言えます。
たとえ、CPU数が多くても、多くのTASKをさばけるわけではありません。
急上昇するようなら、リクエストの混雑をまねくだけのため。
NODENAME: xxxxxxxx
RELEASE: xxxx.el7.x86_64
VERSION: #1 SMP Sat Jun 18 01:51:33 ICT 2016
MACHINE: x86_64  (xxxx Mhz)
MEMORY: xxxx GB ★<--swap を含まないメモリサイズ。
PANIC: "BUG: unable to handle kernel NULL pointer dereference at (null)" ★<--panic string
問題を示す、panic string となっています。
PID: <数値>
COMMAND: "xxxx"
TASK: <アドレス>  [THREAD_INFO: <アドレス>]
CPU: <CPU番号>
STATE: TASK_RUNNING (PANIC)
```

なんとなく分かってきましたね。
お腹すいたよー。。
つづきです。
https://qiita.com/intrajp/items/a66c7b142441fc19054d

参考:Linux カーネル Hacks オライリージャパン 第7章デバッグ
参考:「CRASHダンプ解析について 最終更新 2017/12/19」https://www.concurrent-rt.co.jp/external/TechSup/crash.html
参考:https://bitbucket.org/meszarv/webswing/issues/118/null-pointer-exception-when-running-inside
参考:https://access.redhat.com/solutions/969393
制作で役に立ったサイトなど　

### XDでデザイン→レスポンシブサイトの作成をするにあたり役に立つ情報、サイト等覚書
元デザイナーのweb制作者です。
制作中に役に立ったことを覚書として書いています。
便利なサイトが多くて助かってます。ありがたいです！

##CSSのみで要素を変形させたい
https://bennettfeely.com/clippy/
歪んだ台形を作りたくて利用したサイト。
頂点を直感的に動かし、生成されたCSSをコピペできる
星型や矢印など、もともと整った形も多く揃っている
サイト上で大きさの変更もできて便利

##CSSのみでデザイン的な枠を作る
https://saruwakakun.com/html-css/reference/box

##CSSでグラデーションを作成する
http://grad3.ecoloniq.jp/
グラデーションボタンの参考
今回は使わなかったけど…
Udemyの動画だと自分で色の調整ができていたのに、ボタンの表示だけ？なので要確認（自分メモ）



##ブレイクポイント参考
https://hashimotosan.hatenablog.jp/entry/2019/05/28/164834

##タグ、クラス名、画像等の命名規則参考
https://html-coding.co.jp/knowhow/tips/naming-rule/


##画像を使って、大きさ可変の枠
https://blog.maromaro.co.jp/archives/2834
文章を入れる枠の背景を画像にし、かつ文章や画面幅によって大きさが変わる枠を作成したい時


他順次追加予定
【Linuxコマンド】システムクロックを変更するコマンド集

Linuxのシステムクロックを変更するコマンド集です。

## 1. 指定した日時・時刻に変更する　date -s "日付"
【例】2019年10月1日 10:00:00に変更する場合

```
# date -s "2019/10/01 10:00:00"
```

### 主なオプション

|オプション|意味|
|:--|:--|
|-s "日時"|"日時"に入力した日時に変更する|
|-u|協定標準時に設定・表示する|


## 2. NTPサーバと同期する　ntpdate [オプション] NTPサーバー
【例】「ntp.nict.jp」（独立行政法人 情報通信研究機構が公開している日本標準時に直結しているNTPサーバー）と同期する場合

```
# ntpdate -v ntp.nict.jp 
```

### 主なオプション

|オプション|意味|
|:--|:--|
|-b|stepモードで直ぐに時刻を修正（settimeofday()を使用）<br>**デフォルト**|
|-B|slewモードで徐々に時刻を修正（adjtime()を使用）
|-d|デバッグモード（時刻の修正は行わない）|
|-q|NTPサーバーに日付と時刻の問い合わせを行う（時刻の修正は行わない）|
|-s|コマンドの実行結果を syslogに出力|
|-v|詳細情報を表示|


#### ※エラー「the NTP socket is in use, exiting」が出た場合
以下のコマンドを実行し、ntpdを停止させる
(1)ntpdのステータスの確認

```
# /etc/init.d/ntpd status
```
(2)動作が確認できたら以下を実行

```
# /etc/init.d/ntpd stop
```
これで、再度ntpdateコマンドを実行すれば、指定したNTPサーバと日付・時刻の同期がとれるはず！

## 3. ハードウェアクロックと同期する　hwclock
ハードウェアクロックの日付・時刻を設定する

```
# hwclock --hctosys
```
逆に、システムクロックの現在時刻をハードウェアクロックに反映するコマンドは以下の通り

```
# hwclock --systohc
```

## 参考
[【 date 】コマンド――現在の日時を表示する／変更する | @IT](https://www.atmarkit.co.jp/ait/articles/1701/12/news016.html#opt)

[ntpdate - 日付と時刻をNTPサーバーと同期 - Linuxコマンド | Linux入門](https://webkaru.net/linux/ntpdate-command/)

[Linuxサーバの時刻設定手順とエラー（the NTP socket is in use, exiting）| Qiita](https://qiita.com/megu_ma/items/bb902740ee7de9ddd102)

[パソコンの時計　ハードウェア クロックとシステム クロック | eのらぼらとり](http://park12.wakwak.com/~eslab/pcmemo/clock/clock2.html)

[3.3. HWCLOCK コマンドの使用 | RedHat CUSTOMER PORTAL](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-configuring_the_date_and_time-hwclock)
HTTPのリクエストヘッダーでタイムアウトを操作できない

# まとめ

* リクエストのタイムアウト制御はリクエストを送るサーバー、メソッドの責任？
* TimeOutというヘッダーがあるが、それを遵守する責務はない
* そもそもTimeOutヘッダーはHTTPメソッド[^1]のLOCKリクエストに使用するものであり、通常は使用しない

[^1]: GETとかPOST


# 疑問

HTTPでGETやPOSTするときに、
リクエスト先に到達できなかったり処理に時間がかかる場合に、リクエストにタイムアウトを設定したい。
リクエストに対する設定なので、HTTPのリクエストヘッダーで設定できないか？

(ヘッダーは自由に記述できるが送信機能に手を加えられない場合がある)

観測として、一部のネット上の記事でTimeOutヘッダーを付与しているものを確認しているので、これを使えないか？


# HTTPヘッダーの確認

[HTTP ヘッダー - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers)

>'X-' 接頭辞を使用して独自のヘッダーを追加できますが、この慣習は 2012 年 6 月に非推奨になりました。これは、 RFC 6648 で非標準のフィールドが標準になったときに発生した不便さのためです。それ以外のヘッダーは IANA レジストリ に収録されており、その基になったものは RFC 4229 です。また IANA は 新たに提案された HTTP ヘッダーのレジストリ も管理しています。

とあるのでIANA レジストリ を参照する

[Message Headers](https://www.iana.org/assignments/message-headers/message-headers.xhtml)

>Header Field Name 	Template 	Protocol 	Status 	Reference 
Timeout 		http 	standard 	[RFC4918]

それらしいTimeOutヘッダーを確認。

RFC4918を参照

[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)#section-10.7](https://tools.ietf.org/html/rfc4918#section-10.7)

>10.7.  Timeout Request Header
>
      TimeOut = "Timeout" ":" 1#TimeType
      TimeType = ("Second-" DAVTimeOutVal | "Infinite")
                 ; No LWS allowed within TimeType
      DAVTimeOutVal = 1*DIGIT
>
   Clients MAY include Timeout request headers in their LOCK requests.
   However, the server is not required to honor or even consider these
   requests.  Clients MUST NOT submit a Timeout request header with any
   method other than a LOCK method.
>
   The "Second" TimeType specifies the number of seconds that will
   elapse between granting of the lock at the server, and the automatic
   removal of the lock.  The timeout value for TimeType "Second" MUST
   NOT be greater than 2^32-1.
>
   See Section 6.6 for a description of lock timeout behavior.

機械翻訳と別途部分機械翻訳

[RFC4918 日本語訳 - [RFC/技術資料] ぺんたん info](http://pentan.info/doc/rfc/j4918.html)

>   クライアントは、LOCK要求にタイムアウト要求ヘッダーを含めることができます。
   ただし、サーバーはこれらを尊重することも考慮する必要もありません。
   リクエスト。 クライアントは、タイムアウト要求ヘッダーを送信しないでください。
    LOCKメソッド以外のメソッド。

ちょっと後半の翻訳がイマイチですが、つまり

LOCK要求(LOCK requests.)に使ってください。
LOCKメソッド以外に使わないでください(Clients MUST NOT submit a Timeout request header with any
   method other than a LOCK method)

そして
**ただし、サーバーはこれらを尊重することも考慮する必要もありません。**

送ったとしてそれが守られるとは限らないと読みました。

# LOCK methodとはなんぞや

GETにPOSTにCRUDプラスあれやこれやはわかりますが、LOCKは知らなかったので調査。

["svn lock"で"400 Bad Request"が返ってくる - kakakakakku blog](https://kakakakakku.hatenablog.com/entry/20130124/1359034078)

>access.log
>127.0.0.1 - kakku22 [24/Jan/2013:20:41:25 +0900] "LOCK /svn/trunk/Hello.txt HTTP/1.1" 400 226


[WebDAV時代のセキュリティ対策［前編］（1/4）](https://www.atmarkit.co.jp/flinux/special/webdav02/webdav01a.html)

>LOCK 	コレクションを含むリソースのロック

というわけでリソースに対する処理であり、通常のGETやPOSTとは違うということはわかりますね。


GETのように扱えないし、そもそも守ってもらえないわけです。

# というわけで

HTTPヘッダーだけでは制御できず、どうしても
[XMLHttpRequest.timeout - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/timeout)
のようにリクエスト側の機能として実装されているものを使う必要があるように見受けられました。

レスポンスのデータの寿命やキャッシュにはかなりヘッダーが絡んでくるので、リクエストの制御も出来るかなと思ったのですが、
ここだけ扱えなくてとても困っております。
VegaでマシンのUP/DOWNを表示する際のメモ

Vegaを使ってマシンのアップダウンを表示するときのメモ
Elasticsearchならデータ部分をインデックスに変えて、少しいじれば多分いける

https://vega.github.io/editor/#/url/vega/N4KABGBEAkDODGALApgWwIaQFxUQFzwAdYsB6UgN2QHN0A6agSz0QFcAjOxge1IRQyUa6SgFY6AK1jcAdpAA04KABN0eTFgDaYYFBnpUybFAA2jKgqgV0J1sljHNARgC6iiBEh4ATuhmwAM25vVGxNUA8PLwBPQiMcSCCQ1hNMd0ioZAAPQm9jSFU8VlQ6QvQwAH4wAB1IAFUABVqwHFqAEQB5AHUAOVqFJUjIdAcE2HUih0GwAF8XJTmwdMgMbwBrUfDpmLj8vGy8AaGA725QnF0CtQ1TcyNZ9M9kGXhuZXiIoef9vIvpqKCMjwAGVGAAveI6Kw2OzGABsAHYZo8hvssocLlAAoxkCZlPlxmpWA5Zv8ZtNyRA5iAZkA

あと見つからなかったので、一番簡単な文字列出力の例もあげときます
https://vega.github.io/editor/#/url/vega/N4KABGBEAkDODGALApgWwIaQFxUQFzwAdYsB6UgN2QHN0A6agSz0QFcAjOxge1IRQyUa6SgFY6AK1jcAdpAA04KBgBOAa1jYA2qAgRIeAJ6Fk2KHmQAPPAqX7kM+NwAmprLr1QHFlWY+fzKxscYCgKdAAbVjcoAAlkCIjuMAB3bhUI50gwAF87CDzPQtyAXRAcoA
未経験からweb系プログラマーになるための独学履歴~クラスについての学習履歴索引~

## [クラスの基本からコンストラクタ・デストラクタまで](https://qiita.com/shitikakei/items/1c26e2b086a53f07b073)

##[クラスの継承から型演算子まで](https://qiita.com/shitikakei/items/8783b6e8d4d775c858a5)
##[マジックメソッド編](https://qiita.com/shitikakei/items/93c9d4beef546d1cfaa1)
##[オーバーロードとそれに関わるマジックメソッド編](https://qiita.com/shitikakei/items/e1333a1695270a93f1cc)
##[遅延静的束縛と名前空間編](https://qiita.com/shitikakei/items/034dac8c4c39fe77725a)
##[例外処理編](https://qiita.com/shitikakei/items/afc1b37f0c0a7d24799e)
(12ステップで作る 組込みOS自作入門)VM上のCent OSへのssh接続の仕方

##概要
書籍 12ステップで作る 組込みOS自作入門において、公式サイトで配布されている仮想環境(※)に対して、
sshを仕掛けてみたところうまくいかなかった。


セキュリティ関連の設定を許可することで、対応ができた。

(※)http://kozos.jp/books/makeos/#vmimage


##発生エラー

teratemから該当のVMをVirtualBoxから立ち上げて、sshをしたところ以下のエラーになった。

```
SSH パケットを送信中に通信エラーが発生しました. 切断します. (WSAAsyncSelect1:10093)
```


##対応概要
sshdの設定でパスワード認証を可能にした。


#備考　対応手順の前提

対抗の全量としては、以下の通り。
ローカルPC内での利用が前提のため、セキュリティとしてはがばっと開けている。


### 1.NWの疎通用設定

以下の手順を実施し、ホスト側からVMへNWが疎通できるように設定した。
https://qiita.com/Gotcha/items/e82eb6c2d4d289e5bcd1


### 2.TCP Wrapperでの接続制限解除


```
echo "sshd : ALL" >> /etc/hosts.allow
```


### 3.sshdのパスワードによる認証の許可

鍵認証のみになっており、パスワード認証が通らないようになっているため、パスワード認証を許可。

```
vi /etc/ssh/sshd_config

#以下の行について、noからyesに変えることでパスワードでの認証を可能にさせる
PasswordAuthentication yes

```


### 4.sshdデーモンの起動

VMへrootでログインの上、以下のコマンドでsshdを起動。
また、起動時のサービスとしても登録。

```
service sshd restart
chkconfig sshd on
```
[SwiftUI]セルが下から並ぶチャットUI

```swift
var body: some View {
        List {
            ForEach(viewModel.messages.reversed(), id: \.id, content: {
                Text($0.text)
            }).rotationEffect(.radians(.pi), anchor: .center)
        }.rotationEffect(.radians(.pi), anchor: .center)
}
```

List自体とForEachを180度回転させることで実現できる

<img width="433" alt="Screen Shot 2019-10-05 at 3.42.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/889b3c88-f8f5-7915-a9fc-a8ec930a9c16.png">

要素のalignmentなども逆になってしまうので注意
JavaScript #1 概要

##JavaScriptとは
　汎用的にWebアプリケーションに利用されている言語です。特に、デザイン面で、CSS等では難しい動的な修飾を得意としています。
　また、非同期通信（いいね機能）などにも汎用的に利用されています。

##成り立ち
　1990年代半ば、JavaScriptのせいで重くなることもありましたが、インターネットの普及を支えました。
　その後、JavaScriptの書き方が異なるという問題が生じ、それを統一したのがECMAという国際機関で、ここで統一した規格のものが一般的にJavaScriptと言われています。
　また、ECMAのJavaScriptには何種類かのバージョンがあり、毎年改訂がなされています！

注)JavaとJavaScript全く関係のない言語です。
PDFを画像にメモリーエラーを出さずに変換する

## はじめに
PDFのページ数が100枚を越えるとpdf2imageではメモリエラーが発生した。
メモリエラー回避しつつPDFを画像に変換する。

## コード

一度に処理するとメモリを圧迫するため、ページ数を取得し前から逐次変換していく

```py
import pdf2image
from PyPDF2 import PdfFileReader

path = './pdf/hoge.pdf'
pdf = PdfFileReader(str(path))
page_count = pdf.getNumPages()

page_range = 50

images = []
for page in range(1, page_count, page_range):
    pdf2image.convert_from_path(
        path,
        output_folder='./image',
        dpi=400,
        first_page=page,
        last_page=min(page + page_range - 1, page_count),
    )

```

## エラーを吐いていたコード
```py

import pdf2image

path = './pdf/hoge.pdf'
pdf2image.convert_from_path(path, output_folder='./image', dpi=400)
```

## 参考
https://stackoverflow.com/questions/56471728/how-to-solve-memoryerror-using-python-3-7-pdf2image-library
GitHubに草が生えない



#現状

CommitしてもGitHubのContributionsに反映されない！
備忘録として残します。

どうやら、ターミナルからcommitするとGithubと違う名前でCommitされてしまうようです。
（GitHubはonenechanなのにNeneがcommitしている）

<img width="936" alt="スクリーンショット 2019-10-05 2.55.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253009/bdfb1ad0-5094-9d0a-7bc0-e072b8225326.png">



#方法
1. ローカルのユーザー名とメールアドレスを確認
2. ローカルのユーザー名とメールアドレスをそれぞれ変更
3. [補足]　E325: ATTENTIONの対処法
4. できた！
5. 参考

## 1. ローカルのユーザー名とメールアドレスを確認

ローカルのユーザー名とメールアドレスを確認してみます。
ユーザー名を調べるコマンド↓

```
git config user.name
```
メールアドレスを調べるコマンド↓

```
git config user.email
```
GitHubのユーザー名、メールアドレスとローカルが違う場合、
以下の方法を試してみてください。


## 2. ローカルのユーザー名とメールアドレスをそれぞれ変更
まずはユーザー名を変更します。

```
git config --local user.name GitHubのユーザー名
```
メールアドレスも変更。

```
git config --local user.email GitHubのメールアドレス
```
下記のコマンドで変更を反映させます。

```
git commit --amend
```
無事にこのコマンドが通ればローカルの情報の変更は完了です!


私はここで以下のような画面が出てきてしまいました。

<img width="616" alt="スクリーンショット 2019-10-05 2.58.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253009/3ba59d65-abde-00b0-f607-f21718b42bde.png">


## ３. [補足] E325: ATTENTIONの対処法
下記のサイトを参考にしました。
https://www.webdlab.com/mac/tips-terminal-error/

私の場合も、消えて困るデータではなかったのでDキーを押してDeleteしたところ上手くいきました。
必 ず バックアップを取ってから行ってください。

#### [補足の補足]Vimについて 
Vim全くわからないのですが、どうやらINSERTモード(文字挿入モード)とコマンドモード(保存、実行モード)があるようで、コマンドモードではいくら文字を打っても入力されません（小一時間悩んだ）。今回使ったコマンドを下記に書いておきます。

| コマンド | 意味 |
|:-----------|------------:
| a      | INSERTモードに入る       |
| esc     | コマンドモードに戻る/INSERTモードの解除      | 
| :wq       | 保存して編集を完了(コマンドモードに戻る)       | 
| :qa!         | 保存しないで終了          | 

###4. できた！
無事に、

```
git commit --amend
```

のコマンドが通ればローカルの情報の変更は完了です!

私はこんな感じで無事に草を生やすことができました。

#参考
https://qiita.com/sea_mountain/items/d70216a5bc16a88ed932
https://www.webdlab.com/mac/tips-terminal-error/
http://feb19.jp/blog/archives/000226.php
MySQLが動かなくなった

#MySQLが起動不可に
いつものようにxamppからApacheとMySQLを起動すると、以下のようなエラーメッセージが羅列し、MySQLが起動出来なくなってしまいました。

```
 23:50:30  [mysql]     This may be due to a blocked port, missing dependencies, 
 23:50:30  [mysql]     improper privileges, a crash, or a shutdown by another method.
 23:50:30  [mysql]     Press the Logs button to view error logs and check
 23:50:30  [mysql]     the Windows Event Viewer for more clues
 23:50:30  [mysql]     If you need more help, copy and post this
 23:50:30  [mysql]     entire log window on the forums
```

Apacheは普通に起動出来たのに、何故かSQLは起動せず･･･。

#原因は何か･･･？
MySQLのエラーログを確認してみると、以下のようなログが出力。

```
2019-09-30 23:50:28 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2019-09-30 23:50:28 0 [Note] InnoDB: Uses event mutexes
2019-09-30 23:50:28 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-09-30 23:50:28 0 [Note] InnoDB: Number of pools: 1
2019-09-30 23:50:28 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-09-30 23:50:28 0 [Note] InnoDB: Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M
2019-09-30 23:50:28 0 [Note] InnoDB: Completed initialization of buffer pool
2019-09-30 23:50:28 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=1354642
2019-09-30 23:50:29 0 [Note] InnoDB: Starting final batch to recover 13 pages from redo log.
2019-09-30 23:50:29 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-09-30 23:50:29 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
2019-09-30 23:50:29 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-09-30 23:50:29 0 [Note] InnoDB: Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-09-30 23:50:29 0 [Note] InnoDB: File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.
2019-09-30 23:50:29 0 [Note] InnoDB: Waiting for purge to start
2019-09-30 23:50:29 0 [Note] InnoDB: 10.3.16 started; log sequence number 1603984; transaction id 9
2019-09-30 23:50:29 0 [Note] InnoDB: Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool
2019-09-30 23:50:29 0 [Note] InnoDB: Buffer pool(s) load completed at 190930 23:50:29
2019-09-30 23:50:29 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-09-30 23:50:29 0 [Note] Server socket created on IP: '::'.
```

こいつらをググってみると、「ファイアウォールが許可されていない」「ポートが被っている」と出てきたのでファイアウォールとポートを確認したり設定を変えてみましたが、改善されず･･･。

#テーブルがぶっ壊れていた。
どうにも独りでは解決出来ないので質問を投げてみると、「mysql.user」というテーブルが壊れている可能性があるとのご指摘をいただいた。
実際にSQLに繋がれなくなってしまったので確認は出来ませんでしたが、状況からこの可能性が非常に高いと感じました。

#で、解決したかというと・・・
解決方法ですが、SQLを初期化するか再インストールしか無いとのこと。
結局再インストールすることにしました。

#まとめ
結局根本的な解決には至りませんでしたが、こういったことは起きるものだと学んだ為、こちらに備忘録として書き留めることにしました。
思い当たる原因ですが、
⓵MySQLを切らず、又は切った直後にシャットダウンをしてしまった。
②Windows updateによるもの 
の二つしか思い当たりませんでした。
特に①に関しては今後気を付けようと思います。
リモートサーバーで起動したjupyter notebookに接続出来ないときに確認すること

# この記事について
リモートサーバーでjupyter notebookを設定しても、クライアントPCから接続できない場合に確認すべきことです。

なお、[ipython notebook(jupyter)をリモートから使う](https://qiita.com/shimaken/items/b411de87b00c051e6697)
のような基本的な設定が間違いなく出来ていることを先に確認しましょう。

## 環境
* **サーバー側OS:** Ubuntu
* **クライアント側OS:** Windows10

## 1. アクセス制限の有無
サーバー側の`/etc/hosts.deny`のファイルでアクセス制限がされており、接続出来ていない可能性があります。

```
 vi /etc/hosts.deny
```
で、**全てコメントアウトされている**か**クライアントPCのIPアドレスが許可されている**ことを確認しましょう。

## 2.ポート解放の有無
jupyter notebookの設定で指定しているポートがサーバー側で解放されておらず、接続できていない可能性があります。
現在解放されているポートは、

```
sudo ufw status
```
のコマンドで確認できます。
例えば、

```
To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
8081                       ALLOW       Anywhere
8083                       ALLOW       Anywhere
5900                       ALLOW       Anywhere
5800                       ALLOW       Anywhere
5903                       ALLOW       Anywhere
```
この場合だと、22, 8081, 8083, 5900, 5800, 5903ポートが解放されています。
~/.jupyter/jupyter_notebook_config.pyの`c.NotebookApp.port`という項目が解放されているポートに設定されているかを確認しましょう。

## まとめ
以上2点を確認して、快適なリモートjupyterライフを過ごしましょう。
間違い等ありましたらコメントでご指摘ください。

## 参考
[ipython notebook(jupyter)をリモートから使う](https://qiita.com/shimaken/items/b411de87b00c051e6697)
スライディングモード制御のお気持ち

今回はスライディングモード制御についてです。

## スライディングモード制御とは
あらかじめ設計しておいた状態(位相)空間における超曲面上に状態変数を到達、拘束させる制御則のこと。
主に、到達モードとスライディングモードの二つのモードからなる。

## 到達モードとスライディングモード
- 到達モード
    - 状態変数を設計した状態空間における超曲面上に到達させる
    - 有限時間かかる
- スライディングモード
    - 状態変数を設計した状態空間における超曲面上で滑らせて目標値へ収束させる
    - 超曲面への拘束は入力のスイッチングなどで実現
    - 超曲面上を滑っている際には設計したダイナミクスの通り線形動作をする

## なぜスライディングモード制御をする必要があるのか
モデル化誤差や外乱に対してロバストであるといった利点を満たした上で非線形なモデルに対しても設計可能であり、制御の構造が$H_\infty$制御などに比べて比較的シンプルである。
ただし、到達モードにおいてはナイーブな応答しか保証されていないので、目標値追従における律速となってしまう。

## もうちょっと詳しく
状態変数を$x(t)$としたとき、
$S(x(t))x(t)=0$という超曲面を設計する。
この設計の際には線形制御の枠組みである極配置法による設計や最適レギュレータの構築などを使用する。
到達モードにおける入力はリアプノフの安定論に基づいて入力を設計する。

## 最後に
スライディングモード制御について軽くまとめてみました。
すでに記事を書いておられる方がいたので下位互換のような記事になってしまっているかもしれません。
上記の内容は私が大学学内で発表した資料に基づいています。
ご質問、ご指摘等あればよろしくお願いします。

## 参考
[スライディングモード制御(Qiita)](https://qiita.com/HppyCtrlEngnrng/items/0b8d6a31e5123ac71e01)
【MATLAB】畳み込み積分について学んでみた

# あらすじ

制御工学の学習中に頻繁に出てくる、畳み込み積分。
matlabにも、関数「conv」として用意されている。

折角matlabが使用できる環境にあるので、matlabを
使用して畳み込み積分について学んでみる。

# この記事でやること

1. 畳み込み積分の基本及びその用途について記載
2. 手計算で畳み込み積分を計算
3. matlabを使用して畳み込み積分を計算
4. ②と③の結果の突き合わせ

# 1-1. 畳み込み積分の基本 - 畳み込み積分って何？

合成積とも呼ばれる畳み込み積分は、関数 $f(x)$ と $g(x)$ が存在する時、以下式にて定義する。

　　　　　　　　  $h(x) = \int_{-∞}^{∞} f(τ)g(x-τ)dτ = \int_{-∞}^{∞}  f(x-τ)g(τ)dτ$

離散系で考える場合は畳み込み和と言い、以下式にて定義される。

```math
h(m) = \sum f(n)g(m-n) = \sum f(m-n)g(n)
```

# 1-2. 畳み込み積分の用途 - 何のために使うの？

システムにデルタ関数を入力した場合のインパルス応答が分かる、という利点がある。
入力信号を $f(x)$、デルタ関数を $g(x)$ と定義すれば、畳み込み積分の結果 $h(x)$ がシステムの出力として表される。
離散系で考えれば、どんな信号もサンプリングタイムを幅とするインパルス（状）の信号の連続であるため、
畳み込み積分によってインパルス応答が分かるということは、あらゆる入力信号に対する出力信号が
「畳み込み」で分かる、ということになる。

# 2. 手計算で畳み込み積分を計算


$f(x)=sin(x)、g(x)=cos(x)$ として、
以下の畳み込み積分  を計算する。

```math
h(τ) = \int_{0}^{3} sin(τ)cos(2-τ)dτ
```

[ 回答 ]

積和公式 
$sin(α)cos(β) = \dfrac{1}{2} \\{sin(α+β)+sin(α-β)\\}$ 
を使用し、

```math
\begin{align}
h(τ)&=\dfrac{1}{2}\int_{0}^{3} \{sin(2)-sin(2τ-2)\}dτ\\
\end{align}
```
とする。

$sin(2)$は定数なので$τ$で積分すれば単純に$τ$がつくだけ。
$sin(2τ-2)$ は $t=2τ-2$ として合成関数の積分公式
$\int t^{-1}dx = \dfrac{1}{n+1}・t^{n+1}・\dfrac{1}{t^{\prime}}+C$
を使用して
$\int sin(2τ-2)dτ=\{(cos(2τ-2))・\dfrac{1}{2}\}$
とすると


```math
\begin{align}
h(τ)&=\dfrac{1}{2}\left[τsin(2)-\dfrac{1}{2}\{cos(2τ-2)\}\right]^3_0\\
&=\dfrac{1}{2}\{3sin(2)-0sin(2)-\dfrac{1}{2}((cos(4)-cos(-2))\}\\
&=1.4233\\
\end{align}
```


# 3. matlabを使用して畳み込み積分を計算

```matlab
% 条件
range = [0 3]; % 定積分の範囲
ts = 0.1; % サンプリングタイム
x = range(1):ts:range(2);

% ① 連続時間系
h = @(x) sin(x) .* cos(2 - x);
cans = integral(h, range(1), range(2)); % 連続時間系積分の解

% ② 離散時間系
f = sin(x);
g = cos(2 - x);
h = f .* g;
dans = sum(h) * ts; % 離散時間系積分の解

% 連続時間系と離散時間系の解の差分
err = abs(cans - dans);
```

答え（cans）は1.4233で、手計算での結果と一致した。
※ 離散時間系はついでで記述


# ところで関数「conv」は？

結局、関数「conv」を使用せずに計算した。

https://jp.mathworks.com/help/matlab/ref/conv.html

関数convについて公式の説明を見てみたが、「畳み込みおよび多項式乗算」と
タイトルにあるように、厳密には畳み込み「積分」まではやってくれないらしい。
式：$\int_{-∞}^{∞}  f(τ)g(x-τ)dτ$ のうち、$ f(τ) $ と $ g(x-τ)$ の乗算のみをやってくれる関数のようだ。

しかも無名関数として$sin(x)$などを宣言しても引数として使えず、スカラやベクトル（一次元配列）を
引数として使うしかない。

同じ長さの２つの配列の要素同士を演算をするためのものでもないため、
結局convを畳み込み積分に使用する方法が分からなかった。
（オマエが知らないだけで普通に使えるわ！という声が聞こえてきそうだ）

もしかするとSymbolic math toolboxがあればうまく活用できたのかもしれないが、
持ってないため試すことができなかった。残念。。


# 参考にさせていただいた情報

大変お世話になりました。誠にありがとうございます。

[ネット]

|内容|リンク先|
|---|---|
|畳み込み積分の用途|http://zellij.hatenablog.com/entry/20110924/p1|
|同上|https://www.noe.co.jp/technology/18/18inv1.html|
|置換積分|https://yorikuwa.com/m3402/

# 最後に
ここはこうしたほうがいいぞ！ここ間違っているぞ！等もしございましたら、
お手数ですがご指摘いただけますとそれはもう大変喜びます。
[Python] 処理ファイルをGUIから選択する方法(絶対パス版)

##[Python]Windowsサーバー内のファイルダイアログを出してファイルを指定し、それをローカルにコピーする方法
`pip install pathlib tkinter`
1. Windowsサーバーのパス名を扱えるようにするため、pathlibパッケージ
2. ダイアログボックスを出させるため、tkinterパッケージ
を、あらかじめインストールしておく。

```Windowsサーバー内のダイアログを開き、ファイルを選んで置きたい場所にコピー(絶対パス指定).py
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import pathlib
import shutil

# pathlib.WindowsPath(r の rオプション によって、わざわざ \\ と書かなくてよくなる。
# これで、WindowsPCであれば ローカル/社内サーバー に関わらず、絶対パスをそのまま指定して通用する。
# ダイアログを開いたときに見せたい場所
sDir = pathlib.WindowsPath(r'\\Server-01\管理\日報')
# 貼り付けたい場所
dDir = pathlib.WindowsPath(r'C:\Users\UserName\Desktop\週次処理')

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

# 選びたいファイル種類を指定する
fTyp = [("エクセルファイル","*.xls?")]
copyfile = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = sDir)

# 最後にコピーして終了
shutil.copy2(copyfile, dDir)
```


[処理環境]
・Windows8.1 64bit
・Python3.7.4

【参考】[Qiita: Python：処理ファイルをGUIから選択する方法](https://qiita.com/chanmaru/items/1b64aa91dcd45ad91540)
　を参考にしました。@chanmaruさんのソースが相対パス仕様だったのを、絶対パス仕様にしたのが今回の記事です。
　どうしても絶対パスの方が使いやすかったので、相対パスから絶対パスに変えたのですが、エラーの連続で苦心しました。
　「pathlib.WindowsPath(r の rオプション によって、わざわざ \\ と書かなくてよくなる」ということが分かってから、やっと解けました。
　[ExcelVBAのやり方](https://qiita.com/kazta/items/4aaccfbb1ff4bf16ba91)に比べて、どれだけラクか・・・。@chanmaruさんには感謝しかありません😄
SVMによる聴牌判定

# ※この記事は2020年に作成しました
#概要
SVMを使い手牌の聴牌判定を行った。

#結果
精度は約93%になった。

#作成したプログラム

```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # クロスバリデーション用
from sklearn import metrics 
from sklearn.svm import SVC # SVM用
import time
np.set_printoptions(threshold=100000000)
t1 = time.time() 

# データ用意
data = 101437
X = np.zeros((data,34), dtype='float32')# Xは手牌
with open('C:/sqlite/tehai13.csv', 'r') as fr:
    for i,row in enumerate(fr.readlines(),start=0):
        if i <data:
            X[i] += np.array(list(map(np.float,row[:34])))

dahai = np.zeros((data,1), dtype='float32')#打牌読み込み
with open('C:/sqlite/tenpai.csv', 'r') as fr:
    for i,row in enumerate(fr.readlines(),start=0):
        if i <data:
            dahai[i] += np.array(list(map(np.float,row[:1])))

Y = dahai.flatten()
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,test_size=0.1,random_state=0)

# SVM実行
model = SVC(C = 1,kernel = 'rbf',decision_function_shape = 'ovr',gamma = 'auto_deprecated') # インスタンス生成
model.fit(X_train, Y_train) # SVM実行

predicted = model.predict(X_test) # テストデーテへの予測実行
acc = metrics.accuracy_score(Y_test, predicted)

#print(Y_test)
#print(predicted)
print('精度：',format(acc))

t2 = time.time()
elapsed_time = t2-t1
print(f"経過時間：{elapsed_time}")
```
WSL2 + VSCode + Solargraph で "Failed to start Solargraph: your 131072x1 screen size is bogus. expect trouble your 131072x1 screen size is bogus. expect trouble"

solargrach を起動しようとするとよくわからないエラーで死にました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7000/4b286aa4-a005-792d-a617-3c876384fe58.png)

どうも、vscodeから `solargrach` を起動しようとすると死ぬようなので、起動はvscodeの外で行うこととし、vscodeからは「外部のsolargraphサーバに接続」する形で利用しようと思います。

## 環境

- Visual Studio Code 1.38.1
  - Remote Development 0.17.0
  - Remote - WSL 0.39.5
- Windows 10 Pro Version 1903 Build 18990.1
- Windows Subsystem for Linux 2
  - Ubuntu 18.04.2 LTS (GNU/Linux 4.19.67-microsoft-standard x86_64)
  - Ruby 2.6.5
  - solargraph 0.37.2

## 手順

以下の設定を追加

```json:settings.json
{
  "solargraph.transport": "external",
  "solargraph.externalServer": {
    "host": "localhost",
    "port": 7658
  }
}
```

https://github.com/castwide/vscode-solargraph#transport-options


VSCodeを一度閉じます。

WSL2を開いて `solargrach` を起動します。

```bash
$ cd YOUR_PROJECT_DIRECTORY
$ bundle exec solargraph socket
Solargraph is listening PORT=7658 PID=5350
```

これでVSCodeを起動すると無事TCP経由で接続できました。

```ruby
Solargraph is listening PORT=7658 PID=5350
[ANY] Solargraph initialized (6.4928773910005475 seconds)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7000/db101ac4-7a01-27ab-4761-4560ea4d7a15.png)

## 補足

都度自分で `bundle exec solargraph` をたたくのが面倒なので、スクリプト書くなり適当にやってください。

## 参考

https://github.com/castwide/vscode-solargraph#transport-options
ローカルリポジトリのコミットを切り替えるやり方

色々検証したら、コミットをローカルブランチのように切り替えられることが出来たので記録しておく。
![スクリーンショット (24)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/fcde5c18-81c5-8403-a1cf-dbf857cc730f.jpeg)
青丸で囲んだtreeのIDを入力して、あとはいつも通りブランチを切り替えるようにgit 
checkoutすると切り替えができる。

```
$git checkout tree_id名
```

他にやり方あったら是非押してほしいです。いちいちリモートにとんでtreeIDを確認するのが結構めんどうなので

追記　当然あくまでコミットを切り替えているだけなのでこのコミットにgit add、git pushすると事故る。なのでそのコミットを編集したい場合はそのコミット間で、ブランチを新たにきってgit add~する。
クラス名消失事件を解明する: Angular事件簿001

1ってつけたけど、2があるかはわかりません。
# 事件の概要
カスタムのセレクトコンポーネントにキーバインドを実装した際、↑↓キーを使うと現在選択されている選択肢につけている `selecting` というクラス名が消失する事件が起きました。キーイベントの処理では `selecting` クラスつけ外しの基準となる変数には一切触れていないのに、一体なぜでしょうか:spy_tone2:

# 事件の現場
[謎解きをしたい人向けに簡単に再現をStackBlitzで作って見ました。](https://stackblitz.com/edit/angular-hxjaab)再現用にいらない部分を出来るだけ削ったのでコンポーネントとしては色々アレですが、謎解きには十分だと思います。事件発生の経緯は以下の通りです。
- inputをクリックするとオプションが表示されます
- 現在valueとして選択されている値には `selected` クラスが付き、水色でハイライトされます。
- オプション表示時に↑↓キーを押すと、フォーカスされている選択肢が薄いグレー混じりの水色でハイライトされます。が、これをすると現在valueとして選択している値自体には変更がないのに`selected`クラスが消え、水色のハイライトが無くなります。

# 調査結果
調査を進めると、「とりあえず`[class.XXX]`で記述していたselectingクラスの制御を`{{ XXX }}`で書き換えると事件は起きなくなる」ということがわかりました。実際に、現場StackBlitzでそのように書き換えると起きなくなることが確認できます。(その逆で、focusのクラス指定をクラスバインディングにしてもちゃんと動きます。)
しかしながら、回避策はわかったものの原因が全くわからないので調査を続けることにします。普通に検索しようとしても、なかなか求めている答えにはぶつかりません。そこで、直接angularのレポジトリのissueで「interpolation class」で狙い打ちしてみることにしました。そしてついに答えを見つけることができたのです。

# 真相
クラス名が消えてしまうのは、「[interpolationによるクラス名の付与はクラスリスト全体をバインドするため、ChangeDetectionが走ってクラスリストが再設定された時に、プログラムから付与したクラス名が消える](https://github.com/angular/angular/issues/30199#issuecomment-487818661)」からでした。
実際にその部分だけ試してみたいという人のために、[ミニマルStackBlitzをつくりました。](https://stackblitz.com/edit/angular-nmztxm)IMPORTANTを押してからCOLORを押すと、IMPORTANTにより付与されたクラス（およびそのクラスに付随するスタイル）が消えることがわかります。

# 結論
クラスバインディング `[class.XXX]` とinterpolation `{{ XXX }}` でのクラス名の付与は併用しないのが一番。どちらかにしましょう :dog2:
一般的にはミニマルレポのように、変数名をそのままクラスに使いたい時がinterpolationの出番で、クラスバインディングとは微妙に使いたい時が違うと思うので混ぜたい時が少なからずあるとは思います。ただ、ChangeDetectionを完全把握して影響のないように設定できるなら話は別ですが、人間の頭では難しい気がしています。
関係ないですが、私はフォーマットかけた時になんとなく見やすいのでクラスバインディングに揃える方が好きです。
Hyper-Vのクイック作成からUbuntuをインストールしたのにログイン出来ない件。

# Hyper-Vのクイック作成からUbuntuをインストールしたのにログイン出来ない件。


まずなんで新しくクイック作成したかというと、カーソルがしんどかったから。

Windows上で操作しているときにHyper-VのUbuntu上をカーソルが通過すると、カーソルが見えない。だからカーソルが迷子になる。
いったんHyper-VをクリックするなどしてアクティブにしないとUbuntu上でカーソルが表示されない。

Windows/Ubuntuを行き来するたびにこれをやんなきゃいけなくて、しんどくてしんどくて。

the カーソル問題！

---

不便だなーと思いながら使っていた、ある日、

https://kledgeb.blogspot.com/2018/09/ubuntu-1804-264-hyper-vubuntu.html

たまたまこんな記事を発見！

そこでひっさしぶりにUbuntuを新たに追加。


そしてこの手の作業でお約束のトラブル発生！

![hyper-v-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205767/616e0982-fc60-2d88-e338-66ae4b1aaa29.png)


Connection Log

connecting to sesman ip 127.0.0.1 port 3350
sesman connect ok
sending login info to session manager, please wait...
login failed for display 0


ググっても大抵「パスワード設定しろ！」って書いてある。
インストール時パスワードを設定してない自動ログインだとだめだって。

でも設定してるんです、パスワード。


その後粘っていろいろ試してました。

結論から言うと、


　　　**Σ パスワードに記号が含まれていると失敗する！！！**


でした。

英数字ハイフン等無難な文字のみのパスワードに変更するとあっさりログイン出来ました。
@とか$記号は失敗したのを確認。


## 試したこと

![hyper-v-mode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205767/35ca63ed-7c73-b400-3b33-2402efd50f5a.png)

赤丸注目！

Ubuntuを起動するときに基本セッション(従来の方法)と、拡張セッション(リモートデスクトップ？　よくわかりません)があって、
そのまま開くと拡張セッションで開こうとする。その時に出るのが今回のエラー。

それをいったん基本セッションに切り替えてログインする。


従来のログインなので、このモードではカーソル問題は付きまとう。


![hyper-v-pw-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205767/7e44e10b-63d0-1575-5633-1b8d59eb0692.png)


右クリックから「settings」、あるいはデスクトップ右上にあるまーるかいてちょんボタン(なんていうのかしらない)のユーザーＩＤ→「Account Settings」から記号を含まないパスワードに変更。

ちなみに基本セッションでログインしたままだと拡張セッションでログイン出来ないみたいなので用が済んだらログアウトしておく。

再びUbuntuを起動(拡張セッションで)、パスワードを入力すると無事アクセスできるようになっている・・・ハズ。



これは気づきにくいorz

キーボードがちゃんと入力できているかを疑ってなかったらたどり着かなかったかも。
Cartopy（地図）を試す

こんにちは。
[Cartopy Gallery](https://scitools.org.uk/cartopy/docs/latest/gallery/global_map.html#sphx-glr-gallery-global-map-py) のサンプルソース "Global Map" を動かしてみました。なお、Cartopy のインストールは、"[Failed to pip install latest cartopy on MacOS with proj v6.0.0](https://github.com/SciTools/cartopy/issues/1288)" (GitHub) を参考にしました[^1]。

<img width="406" alt="cartopy.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/d3447ab1-3dee-c38d-0815-8daf0c40037b.jpeg">

[^1]: なお Cartopy 0.18 がリリースされればこの問題は解決しそうです。

```
$ brew install proj
$ brew info proj
proj: stable 6.2.0 (bottled), HEAD
$ pip3 --version
pip 19.2.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
$ pip3 install shapely --no-binary shapely
$ pip3 install git+https://github.com/snowman2/cartopy.git@5e624fe --no-binary cartopy
$ pip3 list | grep Cartopy
Cartopy             0.17.1.dev147+head.detached.at.5e624fe
$ python3 sphx-glr-gallery-global-map-py
```
[sed] dコマンドは「パターンスペース削除」ではなく「パターンスペース削除後に次のサイクルを開始する」

# 要点

sedのdコマンドについて「パターンスペースの削除」と記憶していたが、実は「パターンスペース削除後に次のサイクルを開始する」だった

# 解説

```text:test.txt
1
2
3
4
5
```
上記ファイルがあるとき、

```:command
$ sed -n 'p; /3/d; s/^/-/p' test.txt
```
このコマンドの出力に以下を想定していた

```:expected_output
1
-1
2
-2
3
-
4
-4
5
-5
```

しかし、実際の出力は以下だった。

```:actual_output
1
-1
2
-2
3
4
-4
5
-5
```

理由としては`/3/d`にマッチした後、以降の処理`s/^/-/p`が実行されず次の行の処理を開始したため。

この「**次のサイクルを開始する**」の部分を知らずに、ループ処理の途中等で`d`コマンドを使うと、想定外の結果となってしまうので注意が必要。