OmniAICreator/Qiita-1.07M huggingface dataset:
DonkeyCar スロットルも推論で制御する（旧バージョン2.5.1）

#keras.py の差し替え
ラズパイとホストのそれぞれにインストールした donkey/donkeycar/parts/keras.py を
https://raw.githubusercontent.com/wroscoe/donkey/dev/donkeycar/parts/keras.py に差し替え

#manage.py の書換え
ラズパイとホストのそれぞれにインストールした mycar/manage.py の中身を https://raw.githubusercontent.com/wroscoe/donkey/dev/donkeycar/templates/donkey2.py に差し替え

２４行目の
from controller import LocalWebController, JoystickController
を
from donkeycar.parts.controller import LocalWebController, JoystickController
に修正

#スロットルの値
一定値で訓練しても推論値はバラつく
bashのシェルを動かしたら line 1: ﻿#!/bin/bash: No such file or directory となった場合の対応方法

# 事象：シェルは実行されるけれどなんかいわれている
```bash
# シェルの中身
$ cat ~/Desktop/shell_kind.sh 
#!/bin/bash

canuse=`cat /etc/shells`
echo '使用可能なシェルの種類：'"$canuse"
echo '使っているシェルの種類：'$SHELL
echo '今動かしているシェルの名前：'$0

# 動かしてみるとなんかいわれている
$ bash shell_kind.sh 
shell_kind.sh: line 1: ﻿#!/bin/bash: No such file or directory # <<<<< なんかいわれている
使用可能なシェルの種類：# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
使っているシェルの種類：/bin/bash
今動かしているシェルの名前：shell_kind.sh
```

# 原因：ファイルの文字コードが `UTF-8 with BOM` だから
- [BOMが付いているのが問題なので、削れば直ります。 > Ubuntu日本語フォーラム / シェルスクリプトで/bin/bashが見つからない？？？](https://forums.ubuntulinux.jp/viewtopic.php?id=6994)

```bash:文字コードをみてみる
$ file shell_kind.sh 
shell_kind.sh: Bourne-Again shell script text executable, UTF-8 Unicode (with BOM) text
```

# 対応：ファイルの文字コードを`UTF-8` にする
```bash
# BOMを削除してUTF-8にする。
$ nkf --overwrite --oc=utf-8 shell_kind.sh 
$ file shell_kind.sh 
shell_kind.sh: Bourne-Again shell script text executable, UTF-8 Unicode text
```
[コマンドでのBOMの削除・確認 - Qiita](https://qiita.com/tamanugi/items/63fe5cf8e709565777a5#bom%E3%81%AE%E8%BF%BD%E5%8A%A0%E5%89%8A%E9%99%A4)
TDAにIrisデータを適用しただけのチュートリアル

### はじめに
PCAでIrisのデータを4次元から2次元に次元圧縮を行い，その座標から単体複体を作成します．
そしてその単体複体からPD図とバーコードの図を作ってみるチュートリアルになります．
手弁当ですが，こちらを参考にしました．
https://qiita.com/NoriakiOshita/items/005bb17793f15bcb48b8

```tda.py
import dionysus as d
import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets
iris = datasets.load_iris()
# 4次元のデータ
features = iris.data

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(features)
pca_point = pca.transform(features)

plt.scatter(pca_point[iris.target==0,0], pca_point[iris.target==0,1])
plt.scatter(pca_point[iris.target==1,0], pca_point[iris.target==1,1])
plt.scatter(pca_point[iris.target==2,0], pca_point[iris.target==2,1])
```
![スクリーンショット 2018-09-13 0.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/33329/ab2c55fe-2776-8852-c3ce-705f60fb5dd4.png)

```tda.py
# 単体複体を作る
f = d.fill_rips(pca_point, 2, 1.)
p = d.homology_persistence(f)
dgms = d.init_diagrams(p, f)

# PD図をプロットします．matplotlibはライブラリの内部で宣言しているので
d.plot.plot_diagram(dgms[1], show = True)

# バーコード図をプロット
d.plot.plot_bars(dgms[1], show = True)
```

![スクリーンショット 2018-09-13 0.55.24.png](https://qiita-image-store.s3.amazonaws.com/0/33329/7f591796-3e9c-8bae-6f8c-008dfe67b024.png)

![スクリーンショット 2018-09-13 0.55.32.png](https://qiita-image-store.s3.amazonaws.com/0/33329/c9547f16-8df5-0ee5-ec74-aca109358c30.png)


###おわりに
これが何に応用できるかは分かりませんが，たったの4次元での例になってしまいましたがより高次元の特徴を捉えたいときにはこのTDAという手法は役に立つそうです．

###宣伝
札幌で人工知能の数理に関する勉強会を開催します．
参加者と発表者を現在募集中です．
https://ai-math.connpass.com/event/100323/

また札幌でアルバイトとして雇ってくれる会社も募集しています．
雇ってくれる方がいましたら以下にメールください．
oshitanoriaki@gmail.com
地理座標（経緯度）の内部表現

こんにちは。
地理情報システム（GIS）における地理座標の内部表現は、（経度 $\lambda$、緯度 $\phi$）の以外にも下記のように数種類あるようです（もしくは考えられます）[^1]。

[^1]: 今回、右手系／左手系の差異は無視しています。

(1) （$\lambda$、$\phi$）： （例：GeoJSON, GDAL, GEOS geometry library, Boost.Geometry, ほか大多数）（なお単位は大多数が degree）
(2) （三角関数($\lambda$)、三角関数($\phi$)）など[^2] ： （例：S2 Geometry Library）
(3) （$\lambda$、三角関数($\phi$)）： （例は皆無？）

上記の三角関数の具体的候補例は下記のようなものも考えられます：

・ 三角関数($\lambda$) は、 $\tan \frac{\lambda}{4}$ など
・ 三角関数($\phi$) は、  $\tan \frac{\phi}{2}$ （= Braun投影）など

なお、長距離に関わる処理計算には確かに（(1)のように)　$\phi$ が必要になる場合がありますが、そうでなければ必要なのは $d\phi$,  $\cos \phi$ だけです（もしくは十分な近似精度が得られる）。したがって（(2)のように)初めから三角関数($\phi$) を内部表現とした方が、三角関数・逆三角関数を実行するオーバーヘッドが節約されます。


また web メルカトル投影（タイル地図生成など）については (3) が有利と言えます（下記の計算となります）。

```math
\begin{align}
\frac{x}{R} &= \lambda \\
\frac{y}{R} &=  \operatorname{gd}^{-1} \varphi = 2 \operatorname{arctanh} \left( \tan \frac{\phi}{2} \right)
\end{align}
```

[^2]: もしくは三次元表現 ($\cos{\phi}\cos{\lambda}$, $\cos{\phi}\sin{\lambda}$, $\sin{\phi}$)
openpyxlのアクセス方法による処理速度の違い

Exelファイルをアップロードしてごにょごにょする機能でタイムアウトが発生した際に見つけたこと

```python
workbook = load_workbook(hoge_file, read_only=True)
sheet = workbook.get_sheet_by_name('Sheet1')

for row in range(7, 1000):
    data = sheet['C%d' % row].value
```
と

```python
workbook = load_workbook(hoge_file, read_only=True)
sheet = workbook.get_sheet_by_name('Sheet1')

for rows in sheet.iter_rows(min_row=7, max_col=5, max_row=1000):
    data = rows[0].value
```

当初は上の書き方のようにセル番地直接指定でデータにアクセスしていました。
実装時は、数ループでの動作確認しかしていなかったため処理速度の低下には気づきませんでしたが、実業務を想定したデータ(10000行程)を突っ込むといつまで経っても処理が終わらない...って事態に...。

1500行程のデータで十分に処理速度の低下が実感できました。

そこでセル番地直接指定でなく、後者のようにイテレーションさせながらアクセスするようにするとものの数秒で処理が正常終了

ある程度の行数が見込まれるExcelファイルへのopenpyxlを使用したデータアクセスはイテレーションさせながらアクセスしましょう。

# 追記
`get_sheet_by_name` はdeprecated (2020/06/30 確認時点)になっているので、この場合は`workbook['Sheet1]`を利用しましょう。
参考: https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/workbook/workbook.html#Workbook.get_sheet_by_name
使っている sed コマンドが GNU版 か BSD版 か確認する方法

# コマンドに聞く
```bash
# GNU版~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 1. --version してみる
$ sed --version
sed (GNU sed) 4.4 # <<<<<<<<<<<<<<<<<<<<<<<<<< ここにGNUって書いてある
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.

# 2. 改行コードで終わっていない場合をみてみる
$ printf 'Hello,\nworld!' | sed ''
Hello,
world!$ # <<<<<<<<<<<<<<<<< 改行してくれない

# BSD版~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 1. --version してみる
$ sed --version # <<<<<<<<<<<<<< --versionってオプションがないから怒られる
sed: illegal option -- -
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

# 2. 改行コードで終わっていない場合をみてみる
$ printf 'Hello,\nworld!' | sed ''
Hello,
world!
$ # <<<<<<<<<<<<<<< 自動で改行してくれる

# 3. manに聞いてみる(微妙・・・)
$ man sed
# --manの表示--------------------------------------------------------------------------------
SED(1)                    BSD General Commands Manual                   SED(1)# <<<<<<<<<<<<<<< ここにBSDって書いてある

NAME
     sed -- stream editor

SYNOPSIS
<省略>
```

- 出典
    - [最終行が改行コードで終わっていないテキストの扱い > どの環境でも使えるシェルスクリプトを書くためのメモ ver4.51 - Qiita](https://qiita.com/richmikan@github/items/bd4b21cf1fe503ab2e5c#%E6%9C%80%E7%B5%82%E8%A1%8C%E3%81%8C%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%89%B1%E3%81%84)

# OSで推測する

|sed|OS|
|:-:|:-:|
|GNU版|Windows(GitBash for Windows)|
|BSD版|Mac|

ほかは不明
Virtual Boxでローカル環境を作る初心者メモその2

[Virtual Boxでローカル環境を作る初心者メモ - Qiita](https://qiita.com/HelloJTokyo/items/f00cbc1241aad313265d) に引き続きドットインストール見ながら設定。

Virtual Boxに乗せたCentOSにドットインストールのgitのリポジトリのスクリプトで簡単にApacheとかRubyをインストールしてCyber duckで接続するまで。（と理解した）

昨日いったん`vagrant suspend`してるので改めて起動。そしてssh接続。

```
$ vagrant up
$ vagrant ssh
```

以下ドットインストールのコピー

```
# OSを最新状態にアップデート（時間かかります）
sudo yum -y update

# スクリプトを入手するためのgitをインストール
sudo yum -y install git

# gitを使ってアプリケーション設定用のスクリプトをダウンロード
git clone https://github.com/dotinstallres/centos6.git

# centos6フォルダができるのでそちらに移動
cd centos6

# スクリプトを実行（時間かかります）
./run.sh

# もろもろの設定を反映
exec $SHELL -l
```

ドットインストールのリポジトリからアプリケーション諸々をインストールするスクリプトを`git clone`して走らす。ということなのかな。

`git clone`したcentos6の下の./run.shを開いてみた

`less ./run.sh`

↓

```
test -z $(which ansible-playbook) && sudo yum install -y epel-release && sudo yum install -y ansible
sudo yum update -y ansible
ansible-playbook main.yml --connection=local
```

わからん。でも実行。

しばらくかかって、無事に終了。

`./run.sh` が走ってる間、画面眺めてました。

なにやらPythonの依存関係のなんちゃらに時間がかかっている
なにやらSElinuxをいったん無効にしている
なにやらタイムゾーンを変更している
なにやらmanをインストールしている
なにやらApacheをインストールしている
httpd.confをコピーしている
PHPを
MySQLを
Rubyを
rbenv
Python
Node.js

名前聞いたことあるアプリケーションだけ目につきました。

こんなにたくさん一気にインストールできるとは、、、
いうても使えるようになるかな。。。
がんばろ。。。

そしてCyber duck。これは自営のブログメンテの時もお世話になってるのでおなじみ。
cyberduck.ioからダウンロードしてインストール。

「ブラウザ」＞「'.'で始まるファイルを表示」「ダブルクリックしたファイルを外部エディタで開く」にチェック

接続：SFTP
サーバー名：192.168.33.10
ユーザー名：vagrant
パスワード：vagrant

新規ブックマークでブックマークしとく。
React-Nativeで遊んでみる その１ ~<Text>と<TextInput>を使ってみる~






# React-Nativeで遊んでみる

ここでは[React-Nativeで遊んでみる 導入編](https://qiita.com/gittokkunn/items/f02e0ed74a5222b496d3)で作成した`sampleProject`をいじってオリジナルアプリを作っていきます！
ちなみに自分はSwiftが嫌でReact-Nativeを始めましたがReact.jsでうんざり．．って人はReact-Nativeはうーんって感じです

## フォルダ構成
なんか色々入ってますがiOSアプリを実装するのに実際に触るのは以下のファイルとフォルダです

```
sampleProject
- index.js
- App.js
- ios

```


## コンポーネント

React-Nativeではhtmlで使えるようなdivタグやinputタグは使えません(たぶん..)代わりによく使うようなコンポーネントが公式で用意されています
大体はhtmlのタグと同じ名前で実装されているので直感的にわかりやすくなっています


## 今回実装するもの
今回はTextとTextInputというコンポーネントを使って入力した文字列を画面に表示させてみようと思います．
ソースコードは以下のようになります．以下で順を追って説明していきます．
なお，今回はスタイルのことは流します．


```App.js
import React, {Component} from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View,
  TextInput
} from 'react-native';

type Props = {};
export default class App extends Component<Props> {

  constructor() {
    super()
    this.state = ({
      dispString: ""
    })
    this.changeText = this.changeText.bind(this)
  }

  changeText(text) {
    this.setState({
      dispString: texta
    })
  }

  render() {
    return (
      <View style={styles.container}>
        <TextInput onChangeText={this.changeText} placeholder="aaa"/>
        <Text>{this.state.dispString}</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
});

```

上から順に説明していきます．
流れとしては，以下のようになっています

1. stateに空の文字列を持たせる(あとで画面に表示させる文字列)
1. TextInputコンポーネントでユーザの文字入力を取得
1. TextInputコンポーネントの持っているメソッドで`onChangeText`によって入力時に随時stateを書き換え
1. Textコンポーネントに変数をレンダリングして文字列を表示

onChangeTextでは入力された文字列が引数にくるのでtextで受け取ってそのままstateに渡してます．

Viewコンポーネントはhtmlでいうdivタグのような役割を果たします．スタイルはテキトーに中央寄せを指定しています．


ざっと簡単にカスタムしましたが，まだ用意されているコンポーネントの1%も使えてないので次回からもっと登場人物が増えます！
分散型ウェブSolidをMac上で動かす

### 最初に

World Wide Webの創始者、Tim Berners-Leeが新しいプロジェクトをはじめましたね。
その名も[Solid](https://solid.inrupt.com/)
![logo.png](https://qiita-image-store.s3.amazonaws.com/0/18699/c7275bae-2ab6-d6da-ef59-8789e6c8e154.png)


ロゴかっこいい。
[GitHub](https://github.com/solid)に書いてあるとおり、分散型ウェブを作ろうとしているようです。

> Re-decentralizing the web

ここで思い出すのは、人気ドラマ[シリコンバレー](https://www.amazon.co.jp/gp/video/detail/B077TD11DK/)。  
主人公率いるスタートアップ企業「パイドパイパー」はまさに分散型インターネットである「新インターネット」を作ろうと奮闘します。  
このドラマが大好きなので、ぜひ新しいインターネットを触りたい！と思い、本エントリーを書きます。

### 動かしてみる
幸いなことに、Solidは自分の大好きなNodeJsで書かれているようです。早速npm pkgをインストールしましょう

```shell
$ npm install -g solid-server
```
次に適当にディレクトリを作って`init`しましょう、とその前に  
Solidプロジェクトを動かすには、certificate、privateKeyが必要なので、前もって作っておきましょう。

```shell
# 適当にディレクトリを作る
$ mkdir Work/solid-pj

# privateKey作成
$ openssl genrsa 2048 > ../localhost.key
# certificate作成
$ openssl req -new -x509 -nodes -sha256 -days 3650 -key ./localhost.key -subj '/CN=*.localhost' > ./localhost.cert

# init
$ solid init
```

いろいろ聞かれるのですが、自分は以下のように回答しました

```shell
$ solid init
? Path to the folder you want to serve. Default is /Users/username/Work/solid-pj/data
? SSL port to run on. Default is 8443
? Solid server uri (with protocol, hostname and port) https://localhost:8443
? Enable WebID authentication Yes
? Serve Solid on URL path /
? Path to the config directory (for example: /etc/solid-server) ./config
? Path to the config file (for example: ./config.json) ./config.json
? Path to the server metadata db directory (for users/apps etc) ./.db
? Path to the SSL private key in PEM format ./localhost.key
? Path to the SSL certificate key in PEM format ./localhost.cert
? Enable multi-user mode No
? Do you want to set up an email service? No
```

それでは早速nodeサーバを立ち上げてみましょう

```shell
$ solid start
Solid server () running on https://localhost:8443/
```

無事に立ち上がりました！
https://localhost:8443/ にアクセスしてみましょう
<img width="510" alt="solid-top.png" src="https://qiita-image-store.s3.amazonaws.com/0/18699/7424df6c-f64a-7b22-16f1-58c5cae91d8f.png">

早速Registerしてみます！
登録成功！
<img width="1146" alt="solid-login.png" src="https://qiita-image-store.s3.amazonaws.com/0/18699/238a80fe-e828-1f52-8d3e-97da3ef57287.png">

これがSolidで言うところのPOD（パーソナル・オンライン・データ・ストア)ということですかね。  
ユーザーは、PODに自分の情報を持ち、外部からの情報のアクセス権などを自分で操作できるようです。

### 参考
* [「ウェブの父」ティム・バーナーズ＝リーが新プラットフォーム「Solid」を発表 - GIGAZINE](https://gigazine.net/news/20181001-platform-solid-inrupt/)
* [solid/node-solid-server: Solid server on top of the file-system in NodeJS](https://github.com/solid/node-solid-server)
ubuntuにZabbix4.0をインストールする

## ubuntuにZabbix4.0をインストールする方法

最近は機械学習関連でubuntuを使うことも多いはず。
私も機械学習で使っていたインスタンスにZabbix4.0を入れようとして、いつもの方法で入れられなかったのでまとめておきます。

基本的に以下の公式ドキュメントを参照しています。
https://www.zabbix.com/documentation/4.0/manual/installation/install_from_packages/debian_ubuntu

## モジュールインストール

まずはyumが使えないのでwge。
zabbix4.0のファイルを持ってきます。

```
sudo wget http://repo.zabbix.com/zabbix/4.0/debian/pool/main/z/zabbix-release/zabbix-release_4.0-1+stretch_all.deb
```

次に、dpkgコマンドでインストールしていきます。

```
sudo dpkg -i zabbix-release_4.0-1+stretch_all.deb
sudo apt-get update
```

## Zabbixフロントエンドのインストール

次に、zabbixサーバ等のフロントエンドをインストール。
エージェントも入れておきます。

```
sudo apt-get install zabbix-server-pgsql zabbix-frontend-php
sudo apt-get install zabbix-agent
sudo apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring php7.0-pgsql fonts-vlgothic
```

## バージョン確認
そして、バージョンを確認。

```
zabbix_server -V
zabbix_server (Zabbix) 4.0.0rc3
Revision 85283 28 September 2018, compilation time: Sep 28 2018 13:46:58

Copyright (C) 2018 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.
```

問題なく入っていますね！

あとは自動起動の設定を行ってapacheを再起動。

```
sudo service zabbix-server start
sudo update-rc.d zabbix-server enable
sudo service apache2 restart
```

これで設定は完了！

## Zabbix管理画面確認

さて、最後にZabbix管理画面を確認していきましょう。
以下のURLにアクセスします。(ipaddress)はZabbixをインストールしたサーバです。

http://(ipaddress)/zabbix

![スクリーンショット 2018-10-02 23.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/117147/c7662733-08a3-d77d-b55c-df3d6a579fed.png)

管理画面が表示されました。
完璧ですね！
OctoberCMSのAjax用関数($.request)をTypeScriptから使う

[OctoberCMSのJavaScript APIを使用してAjaxコールを呼ぶ](https://octobercms.com/docs/ajax/javascript-api)際、`$.request()`を使用するが、TypeScriptから呼ぶとエラーになる。型定義ファイルを入れて解決する話。

## TL;TR
下記で説明した内容をnodeパッケージとして利用可能にしたので、下記だけで解決する。

```shell
npm install pikanji/oc-framework-ts-types
```


## 説明
TypeScriptで`$.request()`を使用すると不明なプロパティとしてエラーになる。

```
TS2339: Property 'request' does not exist on type 'JQueryStatic<HTMLElement>'.
```

原因は、`request()`メソッドはjQueryにOctoberCMSによって追加されたものであり、jQueryの型定義ファイルに含まれていないためである。

`modules/system/assets/js/framework.js`にて、下記のように関数が追加されている。

```js
$.fn.request = function (handler, option) {
    ...
    return new Request($this, handler, options);
};
```

## 対策
下記のような型定義ファイルを作成することで解決できる。

```ts
interface JQueryStatic {
    request(handler: string, options: any): any;
}
```

詳細は「[jQueryに追加した関数のTypeScript型定義を作成する](https://qiita.com/pikanji/items/c4467a0db08f493b5166)」に記載した。
AWS勉強 -SSHで接続する-

## SSHで接続する

前回起動したインスタンスにインターネットからログインして操作してみる!
操作にはSSH(Secure SHell)を使用します!

### パブリックIPアドレスを確認する

<img width="877" alt="スクリーンショット 2018-10-02 22.18.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/21af5db8-3dcf-e8d9-45dd-4d21a5cf1c04.png">

### SSHで接続

僕はMACなので,ターミナルからやってみます.

#### 手順1 -ターミナルの起動-

よしなにやってください..

#### 手順2 -接続のコマンドを入力-

```bash
$ ssh -i ~/Downloads/my-key.pem ec2-user@18.179.47.97
```

僕の場合はmy-key.pemをDownloadsに入れっぱなので上記です.

#### 手順3 -セキュリティ警告に答える-

<img width="835" alt="スクリーンショット 2018-10-02 22.33.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/8b30fab2-d2a8-c7aa-07a5-5fee0b39f0d8.png">

yesと入力.

#### 手順4 -接続の完了-

<img width="838" alt="スクリーンショット 2018-10-02 22.36.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/27b7231a-c908-3c78-65c8-2d44c5ed6ea8.png">

こんな感じで入ることができた.

## IPアドレスとポート番号

ちょー簡単に記事だけ貼っていく.

### パケットを相手に届けるためのルーティングプロトコル

[EGP](https://www.nttpc.co.jp/yougo/EGP.html)

[IGP](https://www.nttpc.co.jp/yougo/IGP.html)

### サーバー側のサービスとポート番号の関係

なぜSSH接続してコマンドを入力してサーバーを操作できるのか→[sshd](https://euske.github.io/openssh-jman/sshd.html)

#### 待ち受けているポート番号とプログラムを確認

ターミナルで,

```bash
$ sudo lsof -i -n -p
```

と入力.
すると,

<img width="762" alt="スクリーンショット 2018-10-02 23.29.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/46d5b4b3-eff9-9f7f-5ac7-e557e3bc6168.png">

こんな感じに表示される.

それぞれについては割愛.

### ウェルノウンポート番号

[ウェルノウンポート番号](http://e-words.jp/w/ウェルノウンポート.html)

### ファイアウォールで接続制限

このような「IPアドレス」と「ポートの理解」はサーバーやネットワークのセキュリティを高めるのに役立つ.

高めるためには「[ファイアウォール](https://boxil.jp/mag/a1288)」を設けることが効果的.

#### パケットフィルタリング

流れるパケットを見て通過の可否を決める仕組み.

[パケットフィルタリング](http://e-words.jp/w/パケットフィルタリング.html)



### 感想

作業よりは知識の面で勉強になった.
docker 内で git repo を clone したら ssh 鍵の passphrase 聞かれまくった

## 事の発端

とある日、

> メンバー「ビルドこけました〜」
> 　　私　「エラー文送ってもらっていいですか？」
> メンバー「それが、見当たらないんです…」
> 　　私　「ん？？」

一緒にログを遡ることに。

並列ビルドしており、trace が他のビルドプロセスに埋もれてしまうこともしばしばあるため、
とりあえず一緒にログを遡る。そしてエラーの発生箇所にたどり着く。

```shell-session
...

Please make sure you have the correct access rights
and the repository exists.
Cloning into 'HOGE_LIB'...
Permission denied (publickey).
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
-- Had to git clone more than once:
          3 times.
CMake Error at ~~~:
  Failed to clone repository:
  'ssh://git@~~~~/HOGE_LIB.git'
```

これだ。
3回 `Permission denied (publickey)` 食らって死亡したか。

## 問題の特定

プリミティブな条件で再現を試して見る。
とりあえず同じ ubuntu docker 内で適当に ssh プロトコルのリポジトリをクローンできるかを確認すると、
clone を実行した際に以下の表示が、

```
Enter passphrase for key '/root/.ssh/id_rsa':
```

なるほど、パスワードを聞かれて気付かずに何回もタイムアウトしたのが原因かと。
しかも clone する repo は複数あるのと、並列ビルドの他のプロセスによって trace 文が埋もれるため、どこでいつコケてるかが分からない。
ということは repo ではなく、鍵ベースでの対策が必要だ。

## ssh-agent による解決

duckduckgo 先生に聞いてみて、こちらの記事： [ssh-agentの使い方](https://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf) を参考にした。

やったことは、 ssh-agent に鍵を登録しておくことで、
ssh 接続時パスワードを聞かれる手順をスキップすることができるらしい。
手順として、

1. `ssh-add -l` で ssh-agent に登録されている鍵を確認
2. なければ `ssh-add -k` で鍵を追加
3. 完成〜

## しかし

ビルドエラーは回避できたが、まだ以下の問題が残っている。

1. 基本、並列ビルドなため、他の trace に埋もれて気付かない  
  つまり、都度発覚してから `ssh-add` は非効率
2. docker 自体が更新されるため、ssh-agent に一度登録したら永遠に有効ってわけじゃない

*ちなみに、 MacOS であれば `ssh-add -K <鍵のパス>` で永続化できるらしい。

#### よろしい、ならばスクリプト化だ。

## 要件

- 起動中の docker コンテナに対して1つの ssh-agent が必ず起動する
- ssh-agent に鍵が登録されてなければ鍵を追加する

## 実装

一通りシェルに落とし込んだらこんな感じに。
`.bashrc` 内で source してみたらとりあえず要件は満たした。

```shell
#!/bin/sh

key_path=$HOME/.ssh/id_rsa

if [ -z "$SSH_AUTH_SOCK" -a `uname` = "Linux" ]; then
    # Could not open a connection to your authentication agent.
    eval `ssh-agent`
    trap "ssh-agent -k > /dev/null 2>&1" 0
fi

case `ssh-add -l` in
    *${key_path}" (RSA)")
        echo "Key has already stored."
        ;;
    *)
        # The agent has no identities.
        ssh-add -k ${key_path}
        ;;
esac
```

## 苦労したことろ
最初は `trap` してなくて、同じ docker コンテナに再接続するたびに `ssh-agent` プロセスと `/tmp/ssh-XXXX` が増殖した。

## 改善点
### その1
`ssh-add -k ${key_path}` を後半部に切り出して、「agent 起動済みだけど、鍵未登録」に対応したつもりだったけど、
よく考えると B はあまりないかなー、agent 起動と鍵追加を一緒にやっても良い気がした。

### その2
セッションごとに `ssh-agent` を起動・停止するんじゃなくて、
使い回しすほうがよかったと思う。
実装はこちらの記事： [SSH関連](https://tmsanrinsha.net/post/2010/09/ssh関連/#ssh-agent) がかなり参考になった。

### その3
bash でよくね？ python でよくね？
うん、まぁ…
PowerShell Core で Markdown を HTML に変換するショートカット

PowerShell Core 6.1 で Markdown からの変換を行う機能が追加されました。これを利用して、.md ファイルをドラッグアンドドロップすると .html ファイルを作ってくれるショートカットを作りました。

## 作り方と使い方

pwsh にパスが通っていることを前提とします。

1. エクスプローラーで ファイルのない場所を右クリック > 新規作成(X) > ショートカット(S)
1. "項目の場所を入力してください(T):" の欄に次の文字列を入力 `pwsh -c "function f{$in = $($args -join ' '); $out = $($in -replace '\.md$','.html'); ConvertFrom-Markdown $in | Select-Object -ExpandProperty Html > $out; Read-Host "$out を作成しました。Enter を押すと終了します。"} f"`
1. ショートカットに .md ファイルをドラッグアンドドロップ

ファイル名に連続するスペースがあるとうまく動きません。

## 【小並感】pwsh コマンドの引数がふしぎ

ダブルクォートの中にダブルクォートとか心臓に悪すぎるんですが、なぜか動作しました。PowerShell Language Specification 3.0 を適宜読むようにしましたが、pwsh コマンドが引数の引用符をどう扱うか解説した文書は見つからなかったため、なぜ動いてるのか謎です。どなたかー？

## 参考にしたページ

* [PowerShell Core 6.1で導入されるMarkdown関連機能について - しばたテックブログ](https://blog.shibata.tech/entry/2018/09/10/233634)
* [PowerShell 6.1のConvertFrom-Markdownを使ってMarkdownファイルからHTMLファイルを生成してみる - 木俣ロバート久の覚書](https://rh-kimata.hatenablog.com/entry/2018/09/21/123000)
NodeでMySQL8.0

[Knex](https://knexjs.org/)を使っていたのですが`MySQL8`にバージョンを変更してみたところ以下のようなエラーが出るようになりました。

clientが[mysql](https://github.com/mysqljs/mysql)

```
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```

clientが[mysql2](https://github.com/sidorares/node-mysql2)

```
Error: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```

設定を`caching_sha2_password`から今まで通りの`mysql_native_password`に変更を行えば良いのですが、どうせならデフォルトの設定で頑張りたい。

`caching_sha2_password`に対応されているKnexで使えるnodeのクライアントはまだなさそう。

[PR](https://github.com/mysqljs/mysql/pull/1962)が出ていたのでので試してみました。

```
npm install ruiquelhas/mysql#feature/caching-sha2-password
```

とりあえずエラーは出なくなり使うことができました。
jQueryに追加した関数のTypeScript型定義を作成する

## 問題
拡張されたjQueryをTypeScriptから使おうとしたら、コンパイル時このようなエラーが出た。

```
TS2339: Property 'request' does not exist on type 'JQueryStatic<HTMLElement>'.
```

この `request` は下記のように追加された関数なので、当然jQueryの型定義ファイルには含まれていないため、このエラーが発生した。

```js
$.fn.request = function (handler, option) {
    ...
    return new Request($this, handler, options);
};
```

## 対策
### 型定義
型定義ファイルにこの`request`関数を定義してやればよい。

```ts
interface JQueryStatic {
    request(handler: string, options: any): any;
}
```

TypeScriptの`interface`は同じシグネチャの定義を複数記述すると、上書きや無視ではなく、ちゃんと合体してもらえる。おかげで、全て再定義せずに拡張することができる。

エラー文言から、`$`は`JQueryStatic`と認識されていることがわかるので、`JQueryStatic`インタフェースを定義している。また、ここではとりあえずコンパイルが通るようにしたいだけなので、よくわからない型は`any`とした。

### 型定義ファイルの配置と読み込み設定
型定義は任意のファイル名に拡張子「.d.ts」でOK。そして、tsconfig.jsonなどでコンパイラにこのファイルを読み込むように場所を教えてやる。

```jsonnet
{
    ...
    "compilerOptions": {
        ...
        "baseUrl": "./",
        "typeRoots": ["types", "node_modules/@types"]
    }
}
```

`baseUrl`で相対パスの起点となるディレクトリを設定し、`typeRoots`に型定義ファイルが格納されているディレクトリを設定する。

ここでは、`types`というディレクトリに自作の型定義ファイルを格納した。

これで、`$.request(...)`とこの関数を使ってもちゃんとコンパイルするようになる。

### トラブルシューティング
もし下記のようなエラーが発生した場合、型定義ファイルがコンパイル対象のファイルとして認識されてしまっていないか確認する。

```
Module build failed: Error: Typescript emitted no output for ...
```
私の場合、他のコンパイルすべき.tsファイルと同じディレクトリに型定義ファイル(.d.ts)を入れて、ディレクトリ中の.tsファイルをすべてコンパイルするように指定していたため、このエラーに遭遇した。
PHP7開発環境構築_Wordpress

#1.はじめに
　（構築背景）
　　・WordressもさわれるPHPの開発環境を構築する必要が生じた。
　　・Bitnami/XAMPP/cloud9/local/instant〜は要件ショートにより避けた。

#2.基盤特徴
　・VirtualBox+Vagrant
　・Centos7
　・Wordpress4.9
　・PHP7.2
　・Apache(null)
　・MariaDB(null)

　　＊Remote debug(for Intellij)もついでにBase設定済。
　　＊ddなどで圧縮率を高め、yumもcleanを実施。
　　＊開発用イメージなのでSElinuxとFWは無効化済。
　　＊運用工数を前提にyum経由で全てビルド。
　　＊Vagrantでupすればホスティングの簡単インストールのような流れで進む
　　＊composerは今回は未導入（フレームワークの時は...)

　（ダウンロードURL）
　　　https://app.vagrantup.com/HOGE_HOGE/boxes/centos7php72wp49

#3.主な利用方法
　※時間がない為、仮置き/週末リバイス予定

　 1.普通にVagrant経由でBoxAddする
　 2.Portfowardは、(Vagrantfile追記)

　　config.vm.network :forwarded_port, guest: 80, host: 80
　　config.vm.network :forwarded_port, guest: 443, host: 443
　　config.vm.network :forwarded_port, guest: 9001, host: 9001

　 3.http://127.0.0.1へアクセスすれば、wpのインストール画面
　 4.DBアクセスは下記情報

　　(mysql)
　　　root:hoge111hoge
　　　DB:wwwp

　 5.管理画面にログオン
　　 【一通り動作確認済】
よりよい会議の進め方

生産性を向上が叫ばれているので、よい会議の特徴についてまとめてみた。

### 目的、アジェンダを決める
会議の初めに目的について周知しましょう。
たとえば、上長から承認を得るのか、アイデアだしなのか。
会議中に議題が目的からそれたら、司会者がそっと本題に戻してあげましょう。

### 時間配分
時間配分を決めましょう。
特定の人が結論が出ない議論を長々時間とるのはNG。
会話に参加してない人の時間を奪っています。
時間がかかりそうであれば別MTGを設定しましょう。

###みんなが議題に集中しているか
会議中のメンバーの表情を見てみましょう。
会議中に下を向いてたり、内職していたり、つまらなそうにしてるのは、「早く終われ」のサイン。

### 発言してくれるだけでありがたいもの
たとえ反対意見であっても、意見をだしてくれるだけでありがたいもの。
積極的にありがとうと伝えよう。
反対意見であっても、一度肯定して「でもこういう考え方もあるよ」いう言い回しで。

### 時間いっぱい使わない
早ければ早いほどよいです。
追加で議論したければ、関係者のみ残して、ほかのメンバーは解放しましょう。
関係ない議論に付き合わされるメンバーは、モチベーションを下げてしまいます。

### 会議結果の確認
最後に決まったことの復唱しよう。
次にやることが明確になり、認識をあわせれられます。

以上、自分でできていないこともあるので気をつけたいと思う。
macOS Mojave 10.14 にアップデート後、iTerm2 で SSH したら文字化けした

macOS Mojave 10.14 にアップデートしたら文字化けしたので調べました。

## ターミナル
- iTerm2 3.2.2beta3
    - その後、他の安定版や古いバージョンで試したところ再現
- OS 付属の `ターミナル` では再現せず

## LC_CTYPE がおかしい？
### SSH 先
```
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME=C
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES=C
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

### ローカル（mac）
```
$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="C"
LC_ALL=
```

※ `LC_CTYPE="ja_JP.UTF-8" vim hoge` とすると文字化けが解消


## 下記のいづれかで対応可能
1. Preference ＞ Profiles ＞ Terminal ＞ Envirionment
    - `Set locale variables automatically` のチェックを外す
2. SSH 先の環境変数 `LC_*` を適当に設定する
3. `/etc/ssh/ssh_config` で `SendEnv LANG LC_*` しないようにする

## なぜ起きた？
mojave が原因なのか、iTerm2が原因なのか不明ですが、バグレポートは上がっているみたいです。なので近々iTerm2 側で対応がされるかもしれません。

> https://gitlab.com/gnachman/iterm2/issues/5478
Pythonでキーボードから入力を行う

# 編集履歴
10/02 作成
10/03 input()文でのprint()文の削除

# この記事について
というわけで入力します。
キーボードで入力すると言われると二種類の方法が思い浮かびます。

- コマンドから呼び出す際の引数として渡す
- プログラム実行中に入力を求められる

今回はその二つを実装してみようと思います。

# コマンド上で入力
では早速プログラムを書いてみましょう。

```python:input.py
import sys
args = sys.argv
i = 0
print(args)
for arg in args:
    print("第" + str(i) + '引数:' + arg)
    i += 1
```
**sys.argv**というのが引数を参照する関数です。
今回は「**python .\input.py abc 1 def 2**」というコマンドで呼び出して、引数を全て表示してみます。

```text:result
E:\python> python .\input.py abc 1 def 2
['.\\input.py', 'abc', '1', 'def', '2']
第0引数:.\input.py
第1引数:abc
第2引数:1
第3引数:def
第4引数:2
```
**argv**の中には配列が入っていることが分かりました。
配列の0番目にはそのファイル名が保存されておりますのでご注意ください。
また、入力された値は数字あったとしても文字列として扱われている点も注意です。


# プログラム実行中に入力を求める
続いてプログラムの実行途中で入力を求める場合の処理について書いていきます。

```python:input.py
import sys
print('好きに入力してね！')
a = input()
print(a)
```
これで**input()**のタイミングで入力が要求されます。

```text:result
E:\python> python .\input.py abc 1 def 2
好きに入力してね!
abc
abc
```
最初のabcが入力されたものです。
因みに**input('好きに入力してね!>>')**のように記述すると入力の前に>>が表示されてわかりやすくなります。
さらに前行のprint('好きに入力してね!')も不要になります

```python:input.py
import sys
a = input('好きに入力してね！>>')
print(a)
```

```text:result
 E:\python> python .\input.py abc 1 def 2
好きに入力してね！>>123
123
```


以上需要があるかわからない記事でした。
ありがとうございました。
Visual Studio Codeの設定をgithubで管理する

# やりたいこと
Macを新しくした場合に前の設定やエクステンションを移植したい場合や、職場用と自宅用のMacで設定を共通化したい。
自分はいわゆるdotfilesをgithubで管理しているので、vscodeの設定も同様に管理できるようにした。

# セットアップスクリプト
というわけで新しいマシンに前の環境を移植するスクリプトを作りました。

これで以下の設定をgithubで管理できる

- エディタの設定
- キーバインディング
- 自作スニペット
- インストール済みのエクステンション

```sh
# 設定を共有したいマシンで予めインストール済みのエクステンションを書き出しておく
# $code --list-extensions > extensions.txt

# vscodeがインストールされている場合のみ
if [ -e ~/Library/Application\ Support/Code/User ]; then
    cd ~/Library/Application\ Support/Code/User

    # 前の設定をバックアップ
    mv settings.json settings.json.bak
    mv keybindings.json keybindings.json.bak
    mv snippets snippets.bak

    # ~/dotfiles/vscode以下に他マシンと共有したい設定ファイルが置かれている想定
    # 自分はこのdotfilesをgithubで管理している
    #
    # 元の設定ファイルの代わりにシンボリックリンクを置いておく
    ln -is ~/dotfiles/vscode/settings.json
    ln -is ~/dotfiles/vscode/keybindings.json
    ln -is ~/dotfiles/vscode/snippets

    # 他マシンで書き出されたエクステンション一覧を使ってインストール
    for extension in `cat ~/dotfiles/vscode/extensions.txt`; do
        code --install-extension $extension
    done
fi
```

後は新しいマシンでvscodeインストール後に起動し、ctrl + shift + pでパレットを呼び出して`Shell Command: Install 'code' command in PATH`を実行。
`code`コマンドがターミナルで使えるようになるので、上記のスクリプトを実行するだけ。

参考までに、自分はこのようにgithubで管理しています
https://github.com/Kesin11/dotfiles/tree/master/vscode
レガシー環境でも負けない。作業効率化

#レガシー環境の中心で効率化を叫ぶ
SESで死にそうな皆さん、こんにちは。
糞みたいなレガシー環境でも作業を早くするためのショートカットを載せました。
コマンドプロンプトやシェルで効率化出来そうなものがあれば追加で載せます。

※IEのショートカットとか調べようと思いましたけど面倒くさすぎてやめました。
※インターネットに接続出来ない人の事は考えていません。そこは職場ではなく陸の孤島です。諦めましょう。

## Windows
```
Alt + Tab 画面切り替え
Alt + Esc 画面切り替え(確認は出ない)
Windows + D デスクトップに戻る
Windows + ↑    最大化
Windows + ↓　最小化
Windows + →　右に移動
Windows + ←　左に移動
Windows + E マイコンピューターを開く
Windows + T タスクバーを選択
Windows + space 押している間だけ透ける
Cntr + P ページの印刷
Cntr + W ウィンドウを閉じる
Ctrl + U	ひらがなに変換
Ctrl + I	カタカナに変換
Ctrl + O	半角カタカナまたは半角アルファベットに変換
Ctrl + P	全角アルファベットに変換
Shift + Cntl + N 新規フォルダの作成
Windows + 数字キー タスクバーのアプリを起動
Alt + Space ウィンドウのメニュー画面を開く
```

```
Cntr + r 指定して起動
notepad メモ帳
calc 電卓
mspaint ペイント
winver windowsのバージョンを表示
loggoff ログオフ画面を表示
shutdown /r /t 0 リスタート 
shutdown /s /t 0 シャットダウン
excel エクセル
cmd コマンドプロンプト
control コントロール画面
```

## Chrome
``````
Cntl + L アドレスバーへ移動
Space 下へスクロール
Space + Tab 上へスクロール
Cntl + T タブを作成
Cntl + W タブを閉じる
Alt + ←　一画面前に戻る
Alt + →　一画面先に行く
Cntl + Shift + Q Chromeの終了
``````

## Linux 
``````
Cntl + C アプリ停止
Cntl + A 先頭へ
Cntl + E 最後へ
Cntl + R 履歴の検索
Cntl + D ログアウト
Cntl + U 入力コマンド削除
history + !番号　過去の履歴を実行
!! 直前のコマンド
!1文字　直前の文字で始まるコマンドを実行
history | grep 文字 文字の過去のコマンドを検索
Cntl + Z プログラムの停止
fg プログラムの再開
touch ファイルを作成する
less  テキストファイルの閲覧
man 関数名 マニュアルを開く
man -s2 セクション2のマニュアルを開く
man -a すべてのマニュアルを開く
file hoge.txt ファイルの種類を表示
grep フォルダから正規表現で検索
``````

### ブレーズ展開
```
touch {1,2,3} 1,2,3ファイルを作成
touch {1..10} 1から10までのファイルを作成
touch file{1..10} file1からfile10までを作成
```

## Vim
``````
yy 行のコピー
dd 行の削除
u Undo
dw 単語削除
x　1文字削除
p ペースト
cw キーワードを削除して挿入
/r ファイル名 ファイルを挿入
/%s/置換前文字/置換後文字/g ファイル内置換
Ctrl + v(矩形選択)→i(挿入モード)→// 選択範囲をコメント
vi -p file1.txt file2.txt ファイル1とファイル2をタブで開く
:tabnew 新しくタブを開く
/e ファイル名 ファイルを新しく開く
/wqa すべてのファイルを保存して閉じる
Ctrl-p 入力補完
shift+insert コピペ
zz カーソル位置が中央になるようにスクロールする
``````
## google検索  
```
"" 完全一致するキーワードを検索  
-そのキーワードを除外したサイトだけを検索  
空白　AND方式(両方のワードを含むサイトだけを検索する)  
OR OR方式(指定したキーワードを含むサイトだけを検索する)  
site:URL サイト内検索  
filetype:ファイル形式　ファイルの検索  
related:　関連するサイトを検索  
define 辞書として検索  
* ワイルドカー ド  
```

## excel
```
cntr + space 列方向の選択
cntr + shift 行方向の選択
```
Swift4のRxSwiftを使用して、非同期処理に失敗した場合にリトライするかどうか確認した後に再実行する

今日もSwift4！

非同期処理ありますよね、非同期処理。
例えばそれは外部通信だったり……いや、あれ、外部通信が9割9分9厘じゃないかな。

それはともかくとしてッ！
外部通信やら何やらに失敗したら、リトライするかどうか確認した後にもう一度チェックしたい！　っていうことってあると思うんです。
RxSwiftのretryWhenを使用すると、そんな処理もキレイスッキリまとめられちゃうので、備忘録も兼ねてッ！

# 実装例！

```retry.swift
// 何かしらの非同期処理を行う元ネタを用意
let o: Observable<Any> = Observable.create { observer in
    // とりあえずテスト用に毎回必ずエラーが起きるようにする
    observer.onError(TestError())
    return Disposables.create()
}

// retryWhenでリトライの条件を設定！
o.retryWhen({ (errors: Observable<Error>) in
    return errors.flatMap({ error -> Observable<Any> in
        let showAlert: Observable<Any> = Observable.create { observer in
            let action1 = UIAlertAction(title: "OK", style: .default, handler: { _ in
                // OKを押したら再実行！
                observer.onNext("🍛")
            })
            let action2 = UIAlertAction(title: "NG", style: .default, handler: { _ in
                // NGを押したらエラー実行でリトライ処理を抜ける！
                observer.onError(HogeError())
            })

            let alertController = UIAlertController(
                title: "", 
                message: "( ˘ω˘)", 
                preferredStyle: .alert
            )

            alertController.addAction(action1)
            alertController.addAction(action2)

            view.present(alertController, animated: true, completion: nil)

            return Disposables.create()
        }

        return showAlert
    })
}).subscribe(
    onNext: { _ in
        print("おめでとう👏")
    },
    onError: { _ in
        print("☠️")
    }
)
```

キレイスッキリまとめられると言いつつ、イマイチ記述が冗長な気もするけれども……
何はともあれとにかく、リトライ処理をRxSwiftにお任せして書くことができました:relaxed:
#wikipediaの市町村ページで、市町村位置画像のリンクを取得

スクレイピングもといプログラミング超初心者が初投稿してみました。スクレイピングに興味があり、手はじめにWikipediaに挑んでみました。練習なので多めに見てください・・・

```nearby_town.py
import urllib
import requests
from bs4 import BeautifulSoup

busho=input("好きな市町村を入力してください：")
url="https://ja.wikipedia.org/wiki/" + urllib.parse.quote_plus(busho, encoding='utf-8')

#URLからhtmlデータを取得
instance = requests.get(url)

# BeautifulSoupで扱えるようにする
soup = BeautifulSoup(instance.text, "html.parser")

#BeautifulSoup形式をListに変換
soup_list=soup.select(".")


j=0
for img in soup_list:
    j+=1
    str_img=str(img)
    if "位置図" in str_img:
        break

location=soup_list[j]
linkss = location.find_all('a')

location_link=[]
location_link.append(linkss[0].attrs['href'])

lurl = 'https://ja.wikipedia.org/' + location_link[-1]
print(lurl)
```
**結果**
好きな市町村を入力してください：横浜市
https://ja.wikipedia.org//wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:%E5%9F%BA%E7%A4%8E%E8%87%AA%E6%B2%BB%E4%BD%93%E4%BD%8D%E7%BD%AE%E5%9B%B3_14100.svg
firefoxとchromeの標準機能でcookieの内容を確認する方法

## まとめ
* FirefoxとChromeの標準機能でCookieの内容を確認することができる
* Firefox: 設定 --> ウェブ開発 --> ストレージインスペクター --> Cookie
* Chrome: 設定 --> その他ツール --> デベロッパーツール --> Application --> Storage --> Cookies

## 確認環境
* Firefox 62.0
* Chrome 69.0.3497.100

## 余談など
* アドオンを使ってCookieの値を確認しながらWebアプリを操作していたら想定外の値が入っていた
* Webアプリからのレスポンスは想定通りだったのでどうやらアドオンの不具合が原因っぽい
* アドオンの不具合を踏んだことでハマってしまったので、今後はブラウザの標準機能を使ってCookieを確認するようにしたい
Railsで今週の○曜日の日付を取得するシンプルな方法

Railsで今週の○曜日を取得したいと思いググったものの、週末を取得して日付を減算するといったレガシーなコードを多々見掛けて、シンプルに取得できないのかと思った。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Railsで先週の金曜日、来週の金曜日といった先週(prev_week)来週(next_week)の日付を取得する便利メソッドがあるのに、今週の金曜日の日付を取得したい時は泥臭いことをしないといけないのが納得出来ないんですけど...</p>&mdash; hotuta (@hotu_ta) <a href="https://twitter.com/hotu_ta/status/1047109328744767489?ref_src=twsrc%5Etfw">October 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Railsのソースコードを読んでいたところ、今週の終わりの日付を取得するメソッド **end_of_week** の引数に曜日をセットすることが出来るような気がしたが...

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">と思ったら、end_of_week(:friday)で今週の金曜日の日付が取得できるじゃん！</p>&mdash; hotuta (@hotu_ta) <a href="https://twitter.com/hotu_ta/status/1047110651808702464?ref_src=twsrc%5Etfw">October 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">fridayを週の始まりとするときのend_of_weekでは(？)</p>&mdash; ア… (@_mzpn) <a href="https://twitter.com/_mzpn/status/1047116617488961536?ref_src=twsrc%5Etfw">October 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あー。end_of_weekの引数は週の始まりの日時のことですねー。勘違いしてました😇<br>やりたかったことは、Rails5.2で追加されたDate#next_occurringで出来るみたいです！<a href="https://t.co/sRRvRGctNg">https://t.co/sRRvRGctNg</a></p>&mdash; hotuta (@hotu_ta) <a href="https://twitter.com/hotu_ta/status/1047117737057800192?ref_src=twsrc%5Etfw">October 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 今週の○曜日の日付を取得するシンプルな方法

ということで、**Rails5.2**で今回取得したいのは**未来**の今週の○曜日の日付であるとすると...

```ruby
pry(Msr)> Date.today
=> Tue, 02 Oct 2018
# 次の火曜日の日付
pry(Msr)> Date.today.next_occurring(:tuesday)
=> Tue, 09 Oct 2018
# 次の金曜日の日付
pry(Msr)> Date.today.next_occurring(:friday)
=> Fri, 05 Oct 2018
```

**過去**の今週の○曜日の日付を取得したければ、

```ruby
pry(Msr)> Date.today
=> Tue, 02 Oct 2018
# 前の火曜日の日付
pry(Msr)> Date.today.prev_occurring(:tuesday)
=> Tue, 25 Sep 2018
# 前の火曜日の日付
pry(Msr)> Date.today.beginning_of_week(:friday)
=> Fri, 28 Sep 2018
```

Rails5.2で追加された便利メソッドなので、Rubyのみはもちろん、古いRailsのバージョンでは使えません:sob:

## 参考

`曜日を指定すると（現時点から見て）「前回その曜日だった日時」と「次回その曜日になる日時」を返すDate#prev_occurringとDate#next_occurringを追加。 (Pull Request)`
https://railsguides.jp/5_2_release_notes.html

https://github.com/rails/rails/pull/26600

## Railsで日付を取得する時に役立ちそうなリンク集

http://railsdoc.com/references/Date

https://qiita.com/mmmm/items/efda48f1ac0267c95c29
Jsoupを使う経験

#Jsoupを使う経験

前の作業で、Web Scraperが必要になりました。
様々なサイトのデータをクローリングしていたと、Javaを使ったら、一番効率的と使いやすい技術を使用することが大事だと思います。それに関して、Jsoupは私の意見で使用するための最良のツールです。

前にNetbeansを使っていたから、Antをつけっていました。しかしながら、AntはProjectのツールとして大変だと思っていますし、チームがコードシェーアすることが大変だし、しかりにシフトしている環境だし、コラボレーションすることがちゃんとできないと思っています。

#Gradleに移行

そのように、IntelliJに移行してみました。なぜならGradleは私の意見で最良の代替手段です。Mavenにはいっぱいコンペがありますので、他の方法を勉強したいと思っています。真実を伝えて、移行することがちょっと大変だった。それにしても、PHPーLaravelの経験を使って、設定することがでてきました。

これから、毎日Gradleを使って、もっともっと練習のチャンスがあると、絶対頑張りますね！
Eclipseの使い方についての備忘録

#ショートカットキー

##デバッグ
|動作|キー|
|:------:|:-------------:|
|ステップイン　　  |F5|
|ステップオーバー　|F6|
|ステップリターン　|F7|
|次のブレークポイントへ移動　|F8|

##操作効率化
|動作|キー|
|:------:|:-------------:|
|コード補完　　　　　|Ctrlキー　＋　Spaceキー|
|エラージャンプ　　　|Ctrl　＋　.(ピリオド)|
|クイックフィックス　|Ctrl　＋　１|
|リファクタリング　　|Alt　＋　Shiftキー　＋　R|
|不要なインポート分の全削除 |Ctrl + Shift + O|
|変数、メソッド等の呼び出し元の表示|　該当の名前で右クリック、「Open Call Hierarchy」を選択。または、Ctrl + Alt + H|

##ファイル検索
ワークスペースからファイルを選択して開くことができます。
Ctrl + Shift + rとCtrl + Shift + tの違いは下表の通りです。

|キー|javaファイル以外のファイル |インナークラス|備考|
|:---------------:|:-------------------------:|:------------------:|:---:|		
|Ctrl + Shift + R      |探せる           |探せない|リソース(resource)を開くのでT|
|Ctrl + Shift + T       |探せない            |探せる  |型(type)を開くのでT|



###参考文献

[役に立つやつ限定　地味なEclipseショートカット選手権](https://qiita.com/arai-wa/items/69a54b421cedfe648e84)
【PHP】var_dump()出力を省略させずに全て吐き出させる


# var_dump()を省略させずにすべてを出力させる
`Xdebug`の設定で省略される場合があるそうで

```php
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
var_dump($hoge);
exit;
```

これで全ての値を出力させることができるそうな

# 参考
- [var_dumpの結果を省略せず全て出力する | mawatari.jp](https://mawatari.jp/archives/do-not-omit-the-result-of-var_dump)
pythonには、pythonの立場がある lambda

インド人天才科学者
>ラムダ式は、一行しか書けないんだ!

おっさんプログラマ
> そうだよラムダには、ラムダの立場があり、複数行書けたら関数の立場がなくなるから。

インド人天才科学者

> ソースがあるから言語拡張して';'で区切って複数行書けるようにしたら。

おっさんプログラマ
>pythonには、pythonの立場があるから・・・・

## さて本題、pythonの立場は、シンプル! 勝手に言語機能を追加しては、いけない
### ラムダの複数行名付けてラムンダ式(実は、タミール語風の発音)教えてあげるから
次の例文は、mecabを使用したlambda(ラムンダ)です。

```cookMecab.py
# 形態素解析
import MeCab, re
mc=lambda t :re.split("[\t\n]",MeCab.Tagger ("-Ochasen").parse (t)) #めかぶ大量
sw=lambda t,a,b :a in mc(t) and b in mc(t) #めかぶ選別
tg=lambda t:[tuple(a.split('\t')) for a in MeCab.Tagger ("-Ochasen").parse (t).split('\n')] #めかぶ料理
tx="電気をつけて"
print(mc(tx)) #めかぶ大量
print(sw(tx,"電気","つける")) #めかぶ選別
print(tg(tx)) #めかぶ料理
```
+ mc,sw は、ラムンダ風書き方でラムダに2行以上書くことができる。
+ txが"電気をつける" "電気をつけて" どちらのいい方でも ラムンダsw は、Trueを返す
+ ラムダtg AIに渡すためのタプルリストを作る
+ このように音声入力->形態素解析->リレー制御が6行でできあがる

実行結果

```
['電気', 'デンキ', '電気', '名詞-一般', '', '', 'を', 'ヲ', 'を', '助詞-格助詞-一般', '', '', 'つけ', 'ツケ', 'つける', '動詞-自立', '一段', '連用形', 'て', 'テ', 'て', '助詞-接続助詞', '', '', 'EOS', '']
True
[('電気', 'デンキ', '電気', '名詞-一般', '', ''), ('を', 'ヲ', 'を', '助詞-格助詞-一般', '', ''), ('つけ', 'ツケ', 'つける', '動詞-自立', '一段', '連用形'), ('て', 'テ', 'て', '助詞-接続助詞', '', ''), ('EOS',), ('',)]
```
[謝辞 工藤拓 先生　ありがとう](https://ja.wikipedia.org/wiki/MeCab#cite_note-2)
ElasticSearchの正規表現検索が意図に沿わなかった

ElasticSearchでワイルドカード検索がしたい!
という顧客要望に応えるため、何とかできないか試したときのメモ。

### 結論
データ型がkeywordのフィールドに対しては、正規表現検索は有効。
データ型がtextのフィールドに対しては、意図に沿わないことが多い。


### 原因
データ型がkeywordはアナライザによる単語分割が行われないため、目的の単語がヒットしやすい。
データ型がtextのフィールドは文字数分割が行われ、かつ、ワイルドカードを使用した場合は「A * B」で一単語と判断するので、
分割文字単位より長い単語をヒットさせることができない。
(むしろワイルドカード使用しなければ、「A」と「B」で分割されるため、目的の単語をヒットできる)


#### 例)
アナライザ（ngram）の最小文字単位が2、最大文字単位が10でかつ、
「使用済自動車の再資源化等に関する法律」を検索したい場合

検索ワード
「自動車法律」はヒットする。
「自動車\*法律」はヒットしない。(自動車から法律まで15文字)
「使用済\*再資源」はヒットする。(使用済から再資源まで10文字)
「使用済\*再資源化」はヒットしない。(使用済から再資源化まで11文字)
「済\*再資源化」はヒットする。(済から再資源化まで9文字)


### 備考
データ型がkeywordは完全一致を目的としたフィールドにすべきだと思うし、
データ型がtextに対して、正規表現やワイルドカード検索しようとすることがイケてないと思う。

正規表現検索が性能劣化するという記事しか見かけなかったから、仕様上もできると思ってた。

設定すれば何とかなるかもしれないけど、そもそも全文検索の思想上、ElasticSearchの持ち味活かしつつ正規表現検索ってできるのかな…？
Python3でAt CoderのTypical DP Contestに挑戦してみる（その１　Aコンテスト）

#Typcal DP Contest A コンテスト
最近pythonの勉強を始めた。
最初にPaizaの[PaizaラーニングPython3入門編](https://paiza.jp/works/python3/primer)をやり，
そのあとで[「AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～」](https://abs.contest.atcoder.jp/)をやった。
次に何をしようかと思い，同じくAt Coderの[Typical DP Contest](https://beta.atcoder.jp/contests/tdpc)をやってみることにした。


DPにと言われる分野（？）についてほぼ知らなかったので，いろいろ調べながら書いた（というか真似ただけ）
参考にしたサイトは以下
-[プログラミングコンテストでの動的計画法](https://www.slideshare.net/iwiwi/ss-3578511)
-[クリエイティヴなヴログ](http://www.creativ.xyz/tdpc-a-1-660) 

一つめのプログラミングコンテストでの動的計画法というスライドでDPの初歩の何たるかのイメージをつかみ（今回のような問題をナップサック問題と呼ぶらしい。ナップサック問題の特殊な形で少し簡単にしてある），クリエイティヴなヴログで今回の問題について真似してpythonで書いてみたという感じ。
ほうほうなるほどなるほど，と感銘を受けながらやっとサンプルの入力も通ったのでいざ提出したらTLEでした。
もう少し考えます。

[2018/10/06]
コメントをいただいて，修正しました。
大きな変更点は，doneというlistに計算可能ならTrue，そうでないならFalseを格納して，条件分岐をしていたのですが，それだとすでに計算している値に対して再度計算を実行してしまっていたので，doneの各要素を-1で初期化して，値が-1なら計算可能かどうか調べる(can_make内の処理）TrueまたはFalseであればその値をそそまま返すという形にしました。

また，pythonのことをよくわかっておらずお恥ずかしい書き方をしていた個所も指摘いただいたので，修正しました。

ソースコードの主な変更，追記個所は以下

```python
    #can_makeの最初に処理を追加（計算済みかどうか調べる）
    if done[ind][val] != -1:
        return done[ind][val]
```



```python
#計算可能かどうか（-1で初期化。-1のときはまだ計算していない）
done = [[-1 for i in range(total+1)] for j in range(n+1)]
```


#修正したソースコード（全文）
```tdpc_a.py
#ind番目までのコンテストで，合計得点がvalとなるかどうか
def can_make(ind, val):

    #すでに計算済みであれば計算可能かどうかを返却
    if done[ind][val] != -1:
        return done[ind][val]
    
    #以下は，計算をまだ実行していないときの処理（done == -1のとき）

    if ind == 0:#一つも問題を解かない場合
        return val==0#valが0であればTrue，そうでなければFalseを返却
    
    #ind-1番目まででvalまたは，val-p[ind-1]が作れたらOK
    if val - p[ind-1] < 0:#val - p[ind-1] < 0のときはvalが作れるかどうかだけ調べる
        if can_make(ind-1,val):
            done[ind][val] = True#計算済みにして，Trueを返却
            return True
        else:
            done[ind][val] = False
            return False

    else:
        if can_make(ind-1,val) or can_make(ind-1,val-p[ind-1]):
            done[ind][val] = True
            return True
        else:
            done[ind][val] = False
            return False


"""
ここからmain
"""

#コンテストの数
n = int(input())

#入力により与えられる各コンテストの得点
p = list(map(int,input().split()))

#得られる得点の最大値をtotalに格納（この値までをすべてcan_makeで調べる）
total = sum(p)

#計算可能かどうか（-1で初期化。-1のときはまだ計算していない）
done = [[-1 for i in range(total+1)] for j in range(n+1)]

#作れる値が何個あるか
cnt = 0
cnt = sum(1 for i in range(total+1) if can_make(n,i))

print(cnt)
```
Rubyの基本記述の仕方〜その5〜 html.erbの記法

<%= %>記法
-
htmlファイル上で、rubyの記述ができるようになります。

```sample.html.erb
<!DOCTYPE html>
<html>

    <%=    ruby構文の記述     %>
 
</html>
```
htmlファイル上であっても、<%= %>で囲んだ範囲内では、rubyと同じ記法で記述しても処理されます。
.erbや .slimなどのファイルでよく見かける記法です。

<%= yield %>記法
-
元となるhtml.erbファイル上に記載することで、他のファイルで記述したhtml.erbの内容を呼び出すことに使用していました。

サイトページのヘッダーなどを共通化した記述にしておいて、本文を<%= yield %>と記記述。
別のhtml.erbファイルに各ページの要素を記述します。

```index.html.erb
<!DOCTYPE html>
<html>
  <header>　
   〜
  </header>

  <body>
    <%= yield %>
  </body>
</html>
```

```sample1.html.erb
<!DOCTYPE html>
<html>
  <body>
    <h2>はじめまして、もりくまです</h2>
  </body>
</html>
```

```sample2.html.erb
<!DOCTYPE html>
<html>
  <body>
    <h2>プログラミングの勉強をしています</h2>
  </body>
</html>
```

上の例では、index.html.erbに記述された<%= yield%>が
他のファイルで記述された内容を呼び出す処理を行います。

「yield」について少し調べてみた所、「ブロック」という概念が出てきたので後日、詳しく勉強し、内容を更新します。

<%= link_to %>記法
-

リンクに飛ぶためのaタグと全く同じ機能を持った記述です。

```html.erb
＜link_to記法＞
<%= link_to("トップページ", "/top") %>

＜aタグ記法＞
<a href = "/top">トップページ</a>
```
上の２つの記述は全く同じ内容で
「トップページ」というテキストに、「/top」のURL配下となっているページに飛ぶリンクを貼る機能を表します。

link_toの記法を用いた場合、

```html.erb
＜link_to記法＞
<%= link_to("第１引数", "第２引数") %>
```
１，第１引数にテキスト内容
２，第２引数にリンク先の指定

が入る点に注意します。


今日はこのあたりで失礼します。

参考サイト
-

【Ruby】yield の役割
https://qiita.com/tzubasakat/items/749736e40161599ec6df
気楽にJenkinsfileをLintしたい

# 要約
jflintを使うと手元ですばやくJenkinsfileのLintができて便利

# イントロ　
　Pipelineのジョブを調整するにあたって、Jenkinsfileの編集時はgroovyベースのDSLで書いてあることや時々しか触らないこともあって、動くまでエラーが発生しがちです。

動かすためにJenkinsfileを編集した後リモートブランチにpushしてまわすのは大変です。Replay機能を使ってGUIで変更して実行するのは少し速いですが、むやみにビルド記録が増えるのもできれば避けておきたいところです。

　　最近またJenkinsfileをいじることが増えたので、Lintを簡単にできるというツールが発表されていたのを思い出しました。

# jflint
[Jenkinsfileのlintで救える命がある](https://www.slideshare.net/miyajan/jenkinsfilelint)

[作者の方のjflint紹介記事](https://www.kaizenprogrammer.com/entry/2017/03/26/222354)


## インストール
```zsh:インストール
npm install jflint -g
```
```zsh:lint実行
jflint -j [Jenkins master hostname] Jenkinsfile
```

なるほど、確かにJenkinsのプラグイン公式のsshやcurlを使う方法より簡単そうなインターフェースです。

```zsh:正しいJenkinsfileのLint実行例
% jflint --csrf-disabled -j http://jenkins.example.jp ~/project/Example/Jenkinsfile
Jenkinsfile successfully validated.
```

```zsh:間違ったJenkinsfileをLintに掛けた場合
% jflint --csrf-disabled -j http://jenkins.example.jp ~/project/Example/Jenkinsfile
Errors encountered validating Jenkinsfile:
WorkflowScript: 98: unexpected token: } @ line 98, column 1.
   }
   ^
```
すぐに結果が返って来ました。これは役立ちそうです。
CSVファイルをカラフルに表示する

#結論
こんな感じで`ccsv`というCUIコマンドを作りました。Linux,windows,(多分MacOSも)版があります。
![キャプチャlinux.PNG](https://qiita-image-store.s3.amazonaws.com/0/109103/67024f25-20a3-43e6-07c1-bad7edc28652.png)

#置き場
GitHubに置いてあります。
https://github.com/nak1114/ccsv/releases

#きっかけ
VScodeの[Rainbow CSV](https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv)という拡張を見て、CUIでもあったらいいんじゃないかという話を聞いて、Goを久しぶりに使ってみようという目的で作ってみました。

#コード
CSVファイルの操作もカラーで表示するのもLibがあるので組み合わせるだけでできてしまいました。
特に工夫は無いですが、CSVの読み込みは一行毎にすれば大きなファイルで軽くなるのでしょうか。

```go:ccsv.go
package main

import (
  "encoding/csv"
  "flag"
  "fmt"
  "log"
  "os"

  "github.com/fatih/color"
)

//Version is app versioin
var Version = "0.0.1"

var (
  isVersion = flag.Bool("version", false, "Display version")
)

func main() {
  flag.Parse()
  if *isVersion {
    fmt.Println("ccsv Version " + Version)
    os.Exit(0)
  }

  colors := []color.Attribute{color.FgRed,
    color.FgGreen,
    color.FgYellow,
    color.FgBlue,
    color.FgMagenta,
    color.FgCyan,
  }

  fr, err := os.Open(flag.Arg(0))
  if err != nil {
    log.Fatal("Error:", err)
  }
  defer fr.Close()

  r := csv.NewReader(fr)
  rows, err := r.ReadAll()
  if err != nil {
    log.Fatal("Error:", err)
  }

  csize := len(colors)
  for _, cells := range rows {
    size := len(cells) - 1
    for i, value := range cells {
      cc := color.New(colors[i%csize])
      cc.Print(value)
      if i < size {
        cc.Print(",")
      }
    }
    fmt.Println("")
  }
}

```
[Windows]DiskPart

# こんなときに役に立ちましたという例

## 旧 BIOS (非 UEFI ) 起動で Windows をクリーンインストールする際、ターゲットのディスクが GPT フォーマットだった場合

「Windows のインストール場所を選んでください」のダイアログ下部に以下の警告が表示され、**インストールを進めることができません**。

```
ドライブ n パーティション m に Windows をインストールすることはできません(詳しい情報の表示)(W)
詳しい詳細⇒「Windows を選択された場所にインストールできません。エラー 0x80300001」
```

### DiskPart を利用した対処手順

| # | 手順・コマンド | 説明・補足 |
|:-:|---|---|
|1|[Shift] + [F10]|コマンドプロンプトを起動する|
|2|diskpart|DiskPart を起動する|
|3|list disk|ディスクの情報を表示する|
|4|ターゲットのディスクの **ディスク番号** をメモ|**#5** で必要|
|5|select disk *n*|ディスクを選択する<br/>※ *n* はメモした **ディスク番号** に置き換える|
|6|clean|選択したディスクをクリーンな状態にする|
|7|convert mbr|選択したディスクを MBR フォーマットに変換する|
|8|exit|DiskPart を抜ける|
|9|exit|コマンドプロンプトを抜ける|
|10|コンピュータを再起動する|念のため|

```:実行例
X:\Sources>diskpart

Microsoft DiskPart バージョン 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: xxxxxxxx

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン            75 GB      0 B

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

DISKPART> convert mbr

DiskPart は選択されたディスクを MBR フォーマットに正常に変換しました。

DISKPART> exit

DiskPart を終了しています...

X:\Sources>exit
```
これで MBR フォーマットのディスクとして認識され、インストールできるようになります。