OmniAICreator/Qiita-1.07M huggingface dataset:
XAMPPでPHPをローカル環境で実行

先日新しいマシンを買ったので、そのローカル環境(Windows10)にXAMPP入れてローカル環境でPHPなどのサーバープログラムを実行する環境を構築したときの情報をメモ。

(各マシンのローカル環境には用意してるけど、WindowsOSの仮想環境には全部XAMPP入れておこうかな････)

なお、以下の各ページを参考にさせていただきました。
ありがとうございます。

- [PHPなどのサーバープログラムをローカル環境で動かそう｜かずっち｜note](https://note.com/kingkazugamba/n/n8c78e42189bf)
- [XAMPPでPHPプログラムを動かそう｜かずっち｜note](https://note.com/kingkazugamba/n/n625d24515f92)
- [超簡単！PHPプログラムをローカルで動作確認するための環境構築方法 | HPcode](https://haniwaman.com/local-apache/)
- [Windows10 - XAMPP のダウンロードとインストール - 開発メモ - Webkaru](https://webkaru.net/dev/windows-10-xampp-install/)

# XAMPPのダウンロード
Apache FriendsからXAMPPをダウンロード、インストールする。(リンクは以下)

+ [XAMPP Installers and Downloads for Apache Friends](https://www.apachefriends.org/jp/index.html)

※Windows、Linux、iOS向けに各種インストーラーがあるので、自身の環境に合わせてダウンロードしてください。

# XAMPPのインストール

インストールは基本的に、すべてデフォルトで進んでいけば問題なし。
ただし、以下2点に注意。

- 最初の警告は、「UACが有効だとXAMPPの機能が制限される。C:¥Program Files (x86)にインストールするのはやめるか、UACを無効せよ」とのことです。デフォルトでC:\xamppにインストールされるので、基本的には問題ないはず。
- Bitnamiは、WordPressやDrupalなどのブログシステムが簡単にインストールできるツール。ただし、これを使うとWordPressの管理画面が英語になってしまいます。特にWordPressを日本語で使う予定のある方は、後で公式ページからダウンロードできるので、今はBitnamiインストールしない方がいいです。

# 動作確認
あとはXAMPPを使うだけ。
たとえば、Apacheサーバーを起動させたい場合は、XAMPPの管理画面にあるApacheの「Start」をクリック。
↓
「Apache」の文字の背景色が緑色にかわり、ログの「running」というステータスが表示されたら、Apacheサーバーの起動成功。
他のMySQLやTomcatなども同じ手順で起動。
停止は「Stop」で。

1. localhostにアクセス
http://localhost:80/ にアクセスし、「Welcome to XAMPP」と表示されれば成功。
※80ポートでアクセスできない場合、IISなどでポートが競合している可能性があります。C:\xampp\apache\conf\http.conf のListenポートの設定を80から適当なポートに変更してください。
- C:\xampp\htdocs 配下の任意の場所に、動作確認したいPHPプログラムを置く。
- http://localhost:80/(htdocsをルートとした相対パス).php にアクセス。

PHPのコーディングの記事じゃないので、実コードについては割愛します。
XAMPPがちゃんと動くかの確認程度なので、Hello,worldなり出せばいいと思います。MySQLとか絡めるなら簡単なテーブル1個作って参照する程度のコード書けばヨシ！
gulp-typescriptでコメントを含むtsconfigを使う方法

gulpでtypescriptをコンパイルするプラグイン[gulp-typescript](https://www.npmjs.com/package/gulp-typescript) で`tsconfig.json`を読み込むと、エラーになります

jsonは本来**コメント**を含むことができませんが、`tsconfig.json`は説明用にコメントを含む(ことが多い)ためです

そこで、説明用のコメントを消さなくても[gulp-typescript](https://www.npmjs.com/package/gulp-typescript)でコンパイルを行う方法を調べました

※tscはコメントを含むtsconfig.jsonを扱ってもエラーにならないようにしているようです

手順
1. コメント付きjsonをパースできる[JSONCパーサ(コメント付きJSONパーサ)](https://github.com/microsoft/node-jsonc-parser) を読み込む
2. パースしたオブジェクトをgulp-typescriptの引数に渡してコンパイルを行う

# 初期設定
- Typescriptのインストール

~~~bash
$ npm install -D typescript @types/node
$ npx tsc --init
~~~

- コンパイルに必要なモジュールと、[JSONCパーサ(コメントを許可したJSONパーサ)](https://github.com/microsoft/node-jsonc-parser)を追加

~~~bash
$ npm install -D gulp gulp-typescript jsonc-parser
~~~


### フォルダ構成

tsフォルダにtypescriptを配置し、コンパイル結果をjsフォルダに出力します

```
/project
	/src
		/ts
	/dist
		/js
```


### gulpスクリプト

[gulp-typescript](https://www.npmjs.com/package/gulp-typescript)は、コメントを含む`tsconfig.json`を直接読み込めないため、`jsonc-parser`でパースした結果(オブジェクト)を設定として引き渡すようにします

詳細はコメント参照

- gulpfile.js

~~~javascript
const gulp   = require("gulp");
const ts     = require("gulp-typescript");    //TypeScriptコンパイルプラグイン
const fs     = require("fs");                 //node.js標準モジュールのため、npmでインストール不要
const parser = require("jsonc-parser");       //コメント付きjson(jsonc)用パーサ

// "gulp-typescript"はコメント付きの./tsconfig.jsonを使ってコンパイルできません
// そこで"jsonc-parser"を利用してparseを行い、コンパイルオプションとして引き渡します
const fileContent = fs.readFileSync("./tsconfig.json", "utf8");  //tsconfig読み込み
const tsconfig = parser.parse(fileContent);

// コメントがないjsonであれば読み込み可能だが、コメントがついている場合エラーが発生する
// const tsconfig= require("./tsconfig.json"); 


// src/tsをコンパイル
gulp.task("compile:ts", ()=>{
    return gulp.src(["src/ts/*.ts*"])
        .pipe(ts(tsconfig.compilerOptions))     //parseしたコンパイルオプションをセット
        .js
        .pipe(gulp.dest("dist/js/"));
});
~~~


### コンパイル
エラーが発生せずコンパイルに成功しました

```
$ npx gulp Compile:ts
[00:33:40] Using gulpfile ~\source\repos\browserifyts\gulpfile.js
[00:33:40] Starting 'compile:ts'...
[00:33:42] Finished 'compile:ts' after 2.74 s
```
Data Robot 保険の不正請求　AIでどう判断するのかやってみた

##保険の不正請求
データ項目の確認　データ数他
![保険の不正請求.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/43603f8b-5875-ae59-0047-158e35612691.jpeg)
![保険の不正請求1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/b2013d17-3cf2-5b74-59e0-d3869fa71112.jpeg)
![保険の不正請求2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/d357dffb-40b9-1bf9-c451-0f543a3c1cde.jpeg)
![保険の不正請求3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/b9421b8c-2c51-0ec2-0c13-f699046fdc6a.jpeg)
![保険の不正請求4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/992c6dac-0487-0b03-0090-fde703be18f3.jpeg)
相関関係
![保険の不正請求5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/897a09cd-abc0-0fef-40cb-13417546fd4e.jpeg)
![保険の不正請求6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/59bbca3d-aa00-631d-7b21-f6777f162519.jpeg)
リフトチャート分析
![保険の不正請求7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/35576bd7-5656-6482-b91e-6ee686c82b66.jpeg)
ROC曲線　予測分布
![保険の不正請求8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/c17fd535-0813-65a3-24c2-199d75034d01.jpeg)
収益曲線
![保険の不正請求9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/167db2fd-74ff-776c-5e61-737f6666b823.jpeg)
ブループリント
![保険の不正請求10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/06c5f29e-5e47-7909-55fd-111b28a60083.jpeg)
予測してみました

![保険の不正請求11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/cb8466b8-9685-52e4-bc11-b9b54e2b4e0d.jpeg)
XserverへのSSH接続流れ

# Xserver

Xserverの設定を行う
本稿では、流れのみ記述している。
中身は自分で調べるから、流れだけ知りたい人に向けて

## SSH接続

### サーバー設定(Xserver)
[Xserver : SSH接続設定マニュアル](https://www.xserver.ne.jp/manual/man_server_ssh.php)

##### 1. XserverでSSHを有効にする
##### 2. パスフレーズの設定
##### 3. SSH公開鍵を作成
##### 4. 鍵ファイルをダウンロード

### ターミナル設定

#### Git-Bashを利用する
理由
* Linuxライクにコマンドが使える
* Gitでバージョン管理を行う
* 複雑な設定がいらない

#### 1. Git インストール  

```posh:PowrShell
choco install git --params "/NoGuiHereIntegration /NoAutoCrlf"  
# Chocolateyはインストール済みであること
# /NoGuiHereIntegration … Bash GUIは利用しない為
# /NoAutoCrlf … pull時LF改行をCRLFに自動変換機能を無効にする
```

#### 2. PowerShellでGUID作成  

```posh:PowerShell
([GUID]::NewGuid())
#Qiitaの仕様で[]:の記述が消えるので()で囲んでいる外側の()はいらない
```

#### 3. WindowsTerminalで、GUID, CLIパス, 名前など設定

`Windows Terminal > 設定 を開く`

List項目内
Powershellの下に追記
②で生成したGUIDを使用 … 下記`<New GUID>`

```json:settings.jason
{
    "guid": "{<New GUID>}",
    "name": "Bash MinGW",
    "commandline": "C:\\Program Files\\Git\\bin\\bash.exe",
    "hidden" : false,
    "icon": "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
    "startingDirectory": "%USERPROFILE%"                
},

```

### クライアント設定

#### 1. `~/.ssh`フォルダ作成
```bash:Git-Bash-inWindowsTerminal
mkdir ~/.ssh
```
`~`は、システム環境変数%HOMEPATH%
※ 作成後は、.sshフォルダ内を確認しておく
※ すでに作成済みの場合は、退避（GitHubのSSHファイルがあったりする）
※ GitHubのSSHファイルがあった場合は、GitHubのSSH設定を見直す必要があるかも
  → [GitHubのSSH接続 : id_rsa以外の名前対応](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

#### 2. 公開鍵ファイルをリネーム保存
```bash:Git-Bash-inWindowsTerminal
mv <Xserverからダウンロードしたフォルダパス> ~/.ssh/id_rsa
```
※ リネーム保存後に状態確認

### SSH接続コマンド

#### 1. 接続
```bash:Git-Bash-inWindowsTerminal
ssh -l <server id> -p 10022 <server url>
```
`<server id>`は、契約時に設定したもの
`<server url>`の既定は、`<server id>.xsrv.jp`
KotlinでSpring Data JPAの複合主キーを設定するときの注意点

# 概要
Spring Data JPAを使用する際、エンティティに複合主キーを設定することができます。Kotlinで複合キーを設定する際にハマった点があるのでメモとして残しておきます。

# 前提
* Javaでの実装についての記事、[Spring Data JPAで主キーに値オブジェクトを使う方法（複合キーバージョンも）](https://qiita.com/shotana/items/906d0596ce152fe3c6c1)を参考にしています。Kotlinでも基本的な設定方法はこちらの記事の通りです。

# Kotlinで何が問題なのか
* 複合主キー用のクラスを作る際に、`Serializable`の実装が必要です。Javaであれば普通にimplementsすれば問題ないのですが、KotlinだとJavaと同様の書き方だと継承できません。
* そのまま実装しようとすると`Cannot access 'Serializable': it is internal in kotlin.io`というエラーが出て怒られます。

# どうすればよいか
* [How do I implement Serializable in Kotlin so it also works in Java?](https://stackoverflow.com/questions/50897540/how-do-i-implement-serializable-in-kotlin-so-it-also-works-in-java)にある通り、`java.io.Serializable`を明示的にimportしてこれを継承します。

# 実装サンプル
＜親のエンテティ＞

```SampleTable.kt
package com.entity

import javax.persistence.EmbeddedId
import javax.persistence.Entity
import javax.persistence.Table

@Entity
@Table(name = "sample_table")
data class SampleTable(
  @EmbeddedId
  val key: SampleKey,
  val name: String,
  val memo: String
)

```


＜複合キー＞

```SampleKey.kt
package com.entity

import java.io.Serializable
import javax.persistence.Embeddable

@Embeddable
data class SampleKey (
  val key1: Int = 0,
  val key2: Int = 0
) : Serializable

```
Datarobot　鋼板の欠陥予測　やってみた

##Datarobot　鋼板の欠陥予測
UCI Steel Plates Faults Data Set
Download: Data Folder, Data Set Description

日本における中小企業でも利用できるよう勉強してみました
手探りですが、利用できるようにデータを分析し、予測アルゴリズム作りたいと思います
データについて
![鋼板不良品.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/c183a07e-68c1-21c2-3104-e60af1690014.jpeg)
![鋼板不良品2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/8da25aaa-685d-7341-6b9c-9576d5e00650.jpeg)
![鋼板不良品3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/4b9346df-2971-0b2a-6a7f-3e3eafc06e0c.jpeg)
データの相関性
![鋼板不良品4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/17f61870-1c0e-b9f7-7b05-a1b43b0ccf54.jpeg)
関連性
![鋼板不良品5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/94d35011-b09d-89af-ad15-7a5a25c49d66.jpeg)
リフトチャート
![鋼板不良品6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/4ae8ad10-5dc5-ec48-c53c-c89697476be2.jpeg)
![鋼板不良品7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/9e7b1d3a-e43d-db59-43b5-45d72103d06b.jpeg)
![鋼板不良品8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/8304de7d-004e-8823-2cfc-f70bdf5a9647.jpeg)
![鋼板不良品9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/b1cfd33c-c050-fc02-df8e-c6596653b905.jpeg)
特徴量インパクト
![鋼板不良品10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/f11f5f4f-45b8-2186-f57a-2b835dd8783d.jpeg)
分析の流れ
![鋼板不良品11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/968804cb-51d8-ae81-4a9f-58df6d27a5c2.jpeg)

予測しました

![鋼板不良品12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/540b8692-0642-3872-9ff0-347f0f4f99f8.jpeg)
文字列Aから文字列Bを検索する（重複カウント）

# とある文字列から、とある文字列を検索したい
以下のような文字列「t」から「s」を検索したいんですよ。

```ruby:filename.rb
s = 'AA'
t = 'abdeeAAbAAAbfde'
```

普通に、「へっ、countメソッドでいけるやん」と思った馬鹿な私。

```ruby:filename.rb
s = 'AA'
t = 'abdeeAAbAAAbfde'
puts t.count(s)

# 期待する出力　➡︎　3
# 実際の出力　➡︎　5
```

いや、これ普通にAの数を数えとるだけやんけー。
countメソッドだと引数にまとまった文字列を与えても1文字・1文字を検索しちゃうみたい。

## 重複してもいいから文字列AAを検索したい！
つまり、
1. 左から数えて最初のAA
2. AAAの最初のAA（AA←これ　A）
3. 最後のAA（A　これ→AA）

以上の３個を数えたいんですよ。
（伝われ、、、！笑）

## どうすればいいのか
噛み砕いて考えると文字列abdeeAAbAAAbfdeを
ab bd de ee eA AA Ab bA AA AA Ab bf fd deに分割して
文字列AAに合致するかどうかを検証してtrueなら数えて、falseなら数えなければ良いのだ。

※ポイント
文字列のインデックスを上手く利用して範囲指定をする

## 実際のコード
```ruby:filename.rb

s = 'AA'
t = 'abdeeAAbAAAbfde'

result = 0

(0..(t.size - s.size)).each do |i|
  substring = t.slice(i, s.size)


  if substring == s
    result += 1
  end
end

puts result

# 期待する出力　➡︎　3
# 実際の出力　➡︎　3
```

出来た！

##知らなければいけないこと

###sizeメソッド
stringクラスで使用すると文字列を数えることが出来る。（Arrayクラスで使うと要素数を数える）lengthメソッドと一緒。

###sliceメソッド
引数で範囲を指定すると、その範囲の文字列を返す。



##反省点
「必要なデータをどのように切り取るか」という部分が今回のミソだと思う。パッと出てこないところがまだまだアルゴリズムを生み出す頭になっていないのだと思う。んー難しい。
webpackでエイリアスを貼ったモジュールがresolveできない時の落とし穴

先日、特定の環境でビルドができない事象に遭遇し結構ハマったので紹介する。

# 表示されるエラー
```
npm run prod

~中略~
these dependencies were not found
```
can not find module '$comp~みたいなエラーが出る。どうやら下記のエイリアスがうまく解決されていないみたいだった。

```js:webpack.mix.js
mix.webpackConfig({
  resolve: {
    extensions: ['.js', '.json', '.vue'],
    alias: {
      '~': path.resolve(__dirname, './resources/js'),
      '$comp': path.resolve(__dirname, './resources/js/components')
    }
  },
```

# 解決方法
ローカルでは出来ていたのに、EC２で出来ないことなんてあるかと思い、いろいろ調べたが、そもそものAliasの貼り方はあっているし、Nodeモジュールを入れ直したり、キャッシュを消したりしてもうまくいかなかった。
結論何が悪かったかと言うと```typo```
ローカルのOS（Mac）のfile management systemは大文字小文字を区別しないっぽく、例えば呼び出しモジュールのディレクトリ名が```Sample```だろうが```sample```だろうが、良きように解決してくれていた。
今回使用したOSはそこを厳格にみるため、そもそもそんなディレクトリないよと言う形でエラーを吐いていた。

なので呼びだし元のtypoを修正して普通にビルドできた。

本当にしょうもないミスだったが、もしかするとtypoに気づかず時間を浪費される方がいるかもしれないのでログとして残す。
macでGoogle Cloud SDKを設定する

#　問題
このサイトに従って進めた。
https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja
途中でエラーが出た。

```
./google-cloud-sdk/install.sh
```
errorメッセージ

```
ImportError: dlopen(/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so
  Reason: image not found
```

#　解決方法
以下コマンドを実行してから再度実行したら通った。zshenv内でPATHを設定し直したことが良かったらしい。
(pythonのPATHをpyenv経由にしたのが良かったのか、それともそれ以外のPATHの問題だったのかは不明)

```
source ~/.zshenv
```

私の.zshenv

```
export PATH=/usr/local/bin:$PATH
export PATH="/usr/local/opt/icu4c/bin:$PATH"
export PATH="/usr/local/opt/icu4c/sbin:$PATH"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

#感想
いろんなチュートリアルとかやりすぎて、macの環境がごっちゃになっている気がする。整理したい。
【Rails】rails g modelコマンドを使う際に注意したいこと

####rails g moldelコマンドを使ってモデルとテーブルを作成する際に、ターミナルでサーバーを起動している場合は、`「control + c」でサーバーを止めるようにする。`

####理由：「rails s」でサーバーを立ち上げたままだと、例えばマイグレーションファイルを書き換えたりすることでデータベースの情報が変化している時に、サーバーとデータベースとで齟齬が生じてしまうから。
いまさらだけどTracからRedmineに移行する（ユーザー名変換）


[いまさらだけどTracからRedmineに移行する](https://qiita.com/hkato/items/8783b3316089b5033923)
こちらでの Trac と Redmine のユーザーが一致しない様な場合の対応。

## Trac のユーザー管理

現行版？のスキーマ情報は[ソースコード](https://trac.edgewall.org/browser/trunk/trac/db_default.py)だけの様だが、0.11, 0.12 に関しては、公式サイトの [Trac Database Schema](https://trac.edgewall.org/wiki/TracDev/DatabaseSchema) に ER 図がある。

Trac 自体はデータベース内でユーザーを管理せず、Web サーバー側から得た [REMOTE_USER 環境変数](https://trac.edgewall.org/wiki/1.5/TracInstall#ConfiguringAuthentication) で処理させる仕組みである。

このため、

- 都合によりユーザー名を変更
- htpasswd でのローカルな BASIC 認証管理だったものを、LDAP/ActiveDirectory などへ認証方法を変え統合のため変更

などでユーザー名が変更された場合、古いチケットのユーザ名は古いままだったりする。

また、チケットのアサイン先なんかは適当に自由な文字列が入れられちゃったりする。全員担当で、"All" とか複数人をカンマ区切りで入れたりとかしても内部的にはただの TEXT になる。 

## Redmine/GitLab などへの移行時の問題

たとえば、既に動作しない [Redmine 公式の移行方法](https://www.redmine.org/projects/redmine/wiki/RedmineMigrate/)[^1]だとか、確認はしていないが [TracBoat](https://github.com/tracboat/tracboat) による GitLab への移行で上記の点が問題になるはず。

Redmine の migrate_from_trac の Rake タスクベースでは、この様な現在存在しないユーザーが新規追加されてしまうのでちょっと困りもの。

## 解決案

Trac 自体のユーザー情報を事前に整理する

1. 一旦チケットなどのユーザーを抽出する
2. ユーザー変換の置き換え情報を作る
3. それを元にデータベース上のユーザーを置き換える

というのがありそう。

次のような感じで単一ユーザーにて試してみると大丈夫そうだった。

```sql
UPDATE ticket SET owner='john-lydon' WHERE owner='johnny-rotten';
```

## 成果物

ということで、上記の案の一連の作業を行うものをスクリプト化した。

https://github.com/hkato/trac-username-converter

これで Redmine への以降の場合ユーザーの問題もなんとかなりそう。

[^1]: こちらの修正パッチは前回記事および [GitHub](https://github.com/hkato/migrate_from_trac.rake) に掲載しました。redmine.org の [Issue にあげた](https://www.redmine.org/issues/33722)けど反応ないから、そのうち、もう[シラネーヨ](https://dic.nicovideo.jp/a/シラネーヨ) って書いて close しようかな。
pythonでSQL使ってみた エピソードⅠ : Group By処理

# 背景
SASを使っているが、Rやpythonも勉強しようかなと思ったことがある
RやpythonでSQLが使えることを知ってから、とりあえずSASでSQL練習し、再びRにチャレンジ
https://qiita.com/saspy/items/2829fdf6ab21ce9d9ce0
https://qiita.com/saspy/items/43b4c368d22f45f023a2

qiitaには載せていないがSQLで分割表の計算などもできたりし、Rはちょっとずつ慣れてきたかも

今度はpythonにチャレンジ👍
pythonでSQLのgroup byをやってみる
pythonではpandasqlやSQLite3などでSQLが使えるよう

# 準備
https://qiita.com/saspy/items/2829fdf6ab21ce9d9ce0
↑と同様、SASのCLASSデータを使用

<img width="322" alt="class.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/dfe6436c-b1e8-b224-2620-130fa791da5d.png">

```python
# パッケージ
import pandas as pd
import numpy as np
import dask
import dask.dataframe as dd
import sqlite3
from pandasql import sqldf
from sas7bdat import SAS7BDAT
from dask_sql import Context

# フォルダパス
Data_Dir = "フォルダパス"
File_Name = Data_Dir + "/class.sas7bdat"

Sashelp_Class = SAS7BDAT( File_Name , encoding = "cp932" ).to_data_frame()

# pandasで読み込む場合(日本語入ってると、エラーにはならないが正しく読み込めない)
# Sashelp_Class = pd.read_sas( File_Name , format = "sas7bdat" )
```

# pandasqlのsqldf使用
```python
query = """
  select AGE , count(*) as N
  from Sashelp_Class
  group by AGE;
"""
CLASS_STAT = sqldf( query , locals() )
```

<img width="516" alt="c_stat.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/d96c1203-bb29-afd5-66aa-bf458d9c7436.png">

SASのSQLプロシジャと同様に、SQLの構文の最後に「;」が必要

SASのSQLプロシジャやRのsqldfともそんなに変わらないようなプログラムで集計できる

# ちなみにSQL使わないでthe pythonっぽい感じなら
```python
CLASS_STAT2 = Sashelp_Class.groupby( "Age" ).Name.count( )
```

とか

```python
CLASS_STAT2 = Sashelp_Class.groupby( "Age" ).agg({ "Height" : [ np.size , np.mean ] , "Weight" : [ np.min ] , ...て集計内容書いていく } )
```

<img width="647" alt="c_stat2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/491779b9-30a0-7288-5d1f-a945e25f2d5a.png">


pandasとかの方が速いだろうし、python慣れたらこっちのほうがいいかもね
SQLの方がハンドリングきれいな気はするけど、好みかな

# SQLite3とread_sql_query

```python
# データベース(db指定する場合は""内にかく)
conn = sqlite3.connect( "" )

# SQL化
Sashelp_Class.to_sql( "Class_Sql" , conn )

query = """
  select AGE , count(*) as N
  from Class_Sql
  group by AGE
"""
CLASS_STAT3 = pd.read_sql_query( sql = query , con = conn )

# データベース閉じる
conn.close()
```

<img width="526" alt="c_stat3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/8bba360a-fd08-0d8c-9827-2873bff44693.png">

こっちは、「;」不要

# dask-sql
dask-sqlなるものもあったので追記
sqlite3&read_sql_queryを使う流れとほぼ同じ

```python
# SQL化
c = Context()
c.create_table( "dask_class" , Sashelp_Class )

# クエリ
query = """
  select Age , count(*) as N , avg( Height ) as M_HEIGHT , min( Weight ) as MIN_WE
  from dask_class
  group by Age
"""
CLASS_STAT4 = c.sql( query ).compute()

print( CLASS_STAT4 )
```

![aaaaaa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564185/afae7e75-945a-805d-eb7a-0e0915d4d947.png)



https://pypi.org/project/pandasql/
https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html
https://docs.python.org/ja/3/library/sqlite3.html
https://dask-sql.readthedocs.io/en/latest/
CPUコア数に応じたストレステストができるスクリプト

# はじめに

Linux環境でCPUのストレステストをしようと思った時、一番簡単な方法は`yes > /dev/null`だと思います。

ただしこのコマンドには弱点があって、CPUのコア数が2以上の時は、複数プロセスを同時に実行した後、killコマンドでプロセスを強制的に止めることになります。
[【Linux】stressコマンドを使わずに手軽にCPU負荷をかける方法](https://techblog.ap-com.co.jp/entry/linux-cpu)

そこで[Linuxで手軽にCPU負荷をかける方法をまとめてみた](https://i-think-it.net/linux-cpu-stress-how-to/)で紹介されている`openssl`コマンドを使って、CPUの論理コア数（スレッド数）を加味してCPUのストレステストを実行できるスクリプトを作ってみました。

# 作成したスクリプト

```bash
#!/bin/bash

function usage {
    cat <<EOS
$(basename ${0}) is a cpu stress test tool for multi-core processor.
Usage:
    $(basename ${0}) [<options>]
Options:
    -n    using n cores in stress test. default is `grep processor /proc/cpuinfo | wc -l`.
EOS
}

CPU_THREADS=`grep processor /proc/cpuinfo | wc -l`

while getopts n:h OPT
do
  case $OPT in
    "n" ) CPU_THREADS="$OPTARG"
          ;;
    "h" ) usage;
          exit 0
          ;;
  esac
done

echo "using "$CPU_THREADS" cores in stress test."
openssl speed -multi $CPU_THREADS > /dev/null 2>&1
```

# 使い方

* コマンドのオプションは`-h`と`-n`の2つです。
 * `-h`オプションを使うと、コマンドのオプションに関する説明が表示されます。
 * `-n`オプションでストレステストに使用する論理コア数（スレッド数）を指定できますが、何も指定しない時はこのOSに割り当てられているCPUの論理コア数（スレッド数）を全て使ってストレステストを実行します。
 * コマンドのオプションを表示した例では「default is 8.」と表示されていますが、これはこのOS（仮想マシン）に割り当てられている論理コア数が8個となっているためです。

```shell-session:コマンドのオプション
[root@akagi ~]# ./cpu_stress_test.sh -h
cpu_stress_test.sh is a cpu stress test tool for multi-core processor.

Usage:
    cpu_stress_test.sh [<options>]

Options:
    -n    using n cores in stress test. default is 8.
```
```shell-session:CPUストレステストの実行
[root@akagi ~]# ./cpu_stress_test.sh -n 2
using 2 cores in stress test.
```

# 参考URL

* [【Linux】stressコマンドを使わずに手軽にCPU負荷をかける方法](https://techblog.ap-com.co.jp/entry/linux-cpu)
* [Linuxで手軽にCPU負荷をかける方法をまとめてみた](https://i-think-it.net/linux-cpu-stress-how-to/)
railsアプリのログイン認証機能の実装


deviseを導入しようとするも,

bundle exec rake db:migrate
duplicate errorで通らなかったので、

```
t.string :email,              null: false, default: ""
add_index :users, :email,                unique: true
```

をコメントアウトとした
もともと作成していた、emailカラムとpasswordカラムがあるため、結局うまく通らなかった。

ってことで、deviseをアンインストール(下記参照)
https://qiita.com/NT90957869/items/8c5285775a67a51f03e1

deviseは諦めて、初めてサイトを訪れた人がユーザ登録できる機能を作った。

今までは管理者しかユーザ登録ができなかった。app/controllers/admin/下は、adminしか利用できない。だから、初めて訪れた人はユーザー登録ができない。

##やったこと
app/controllers/users_controller.rb として管理者権限のいらない新しいユーザーコントローラーを作成して、そこからユーザー登録できるようにした。
users_controller.rbは炉ログインしていない状態でも、利用できるように、

```app/controllers/users_controller.rbapp/controllers/users_controller.rb
skip_before_action=login_required
```
を加えた。

githubに掲載しました！
https://github.com/raimirarara/tasknotice

```
$git add -A
$git commit -m "Update application"
```

上のローカルリポジトリに登録するってことかな？

```
$git push heroku master
```
gitからherokuに持っていって、

リモートリポジトリ

```
$git remote add origin https://github.com/raimirarara/tasknotice.git
$git push -u origin master
```
に保存
VPSでWordPressの個人ブログを開設するまでの道(1)

# はじめに
今更ながら、個人ブログを開設しようと思ったので、開設までの道筋を記事にしようと思いました。
複数回投稿予定ですが、今回は主にブログ開設方法について記事にします。

# ブログ開設の目的
ブログ開設の目的は大きく3つです。

### 1. 自己啓発のアウトプットの場
技術本やビジネス本などを読むと、その時にはわかった気になります。
しかし、後で振り返ると頭に残っていなかったりするので、
インプットしたものをアウトプットする場として使おうと考えています。

### 2. 買い物の記録
私は、いろいろ調べてから購入する性格です。
比較した商品や最終的に購入した商品などを記録して、同じように悩む他の人の役に立てればよいかと考えています。

### 3. サーバの運用
Apacheの業務から離れてしまい、サーバを触ることが全くなくなってしまったので、プライベートでやればよいかと考えました。
AWSなどのクラウドサービスを使う上でもサーバー運用、構築のスキルは役に立つのではないかと考えています。
他にも、サーバがあれば、何か新しいことをやりたいときにも活用できるかと考えています。

# ブログ開設方法
Webで調べたところ、無料ブログで作る方法と、サーバーを立ててWordPressで作る方法の大きく2つの方法があります。

## 1. 無料ブログで作る
Amebaブログや、はてなブログなどです。
無料会員登録するだけですぐに使えるようになります。
一番手軽かと思いますが、こちらの方法では目的3.が達成できないので、見送ります。

## 2. サーバー立ててWordPressで作る
サーバーと独自ドメインを取って、WordPressを使ってブログを開設する方法です。
無料ブログより手間はかかりますが、私の目的には合っています。

### 2-1. 自宅にサーバーを立てる
サーバー購入費やバックアップなどの維持費、ハードウエアの管理など、一番手間がかかる方法です。
メンテナンスを怠って火事にしかけたという記事とかを読み、ハードルの高さを感じたので、この案は没です。

### 2-2. レンタルサーバー(共用サーバー)を使う
WordPressで作る場合にWebでよく解説記事がありました。
ただ、目的3.はレンタルサーバ運営会社がやるので、私の目的とは合わなそうです。

### 2-3. クラウドサービスを使う
AWSやAzure、GCPなどのクラウドサービスでサーバーを立てる方法です。
目的はすべて満たせそうですが、長期運用するとなると無料期間を超えるため、
将来的に金銭面が少し負担になりそうでした。

### 2-4. VPS(Virtual Private Server)を使う
今回、ブログ開設で調べるまで知らなかった方法です。
共用サーバーの場合は選択できる項目がストレージ種類とストレージ容量ぐらいです。
それに対してVPSではストレージ関連はもちろんOSやメモリ、アプリなどを選択できます。
共用サーバーより手間はかかりますが、目的3.も満たせるし費用的にも良さそうなので、
**VPSで開設しよう**と考えています。

# おわりに
いろいろと比較した結果、自分の目的＋費用面を考えて、VPSでブログを開設しようと考えています。
次回以降はVPSの比較と、どこでドメインと取るかなどを検討したいと思います。

次回の記事：[VPSでWordPressの個人ブログを開設するまでの道(2)](https://qiita.com/tomluck/items/163e8a6029f7f82c8a60)
DataRobot　3日目　貸し倒れリスク予測　AIでやってみた

###ローンの債務不履行リスクの理解

ターゲット特徴量：貸し倒れ 業界:銀行業 を試してみました　データその他たは練習データです。

データの内容です
![ローン債務不履行.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/40ea51f9-97bb-5668-7217-915f5b4c78e2.jpeg)

今回ターゲットは貸し倒れ
![ローン債務不履行2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/c01bac3c-96cb-42be-7b9d-5f1fc48d1c88.jpeg)

モデル製作開始しました　まずはデータの特徴量他から
![ローン債務不履行3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/a8631017-bc93-b276-2c28-d83a6092e84c.jpeg)

現在モデル14個作成中　
![ローン債務不履行4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/afd2c597-a25b-6704-e7e3-642c7b38caae.jpeg)

![ローン債務不履行21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/1c12dc13-d692-6bfa-c27e-d49d488d9498.jpeg)
![ローン債務不履行22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/709c479d-9507-3e4c-a391-99575b476154.jpeg)
![ローン債務不履行23.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/d71831f0-8603-9c78-c10d-12ed419b5c1e.jpeg)
![ローン債務不履行24.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/ebbf19ba-3b02-c44c-f6ed-e61e0ac224ad.jpeg)
![ローン債務不履行25.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/82bd0e13-7384-182b-3bac-d9d2544bdef4.jpeg)
![ローン債務不履行26.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/30bb3410-a662-55a0-1396-07759d75030f.jpeg)

相関図追加しました　20200718　23：45
![ローン債務不履行30.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/97e54be0-f92a-4d74-bd9c-91fe9ce48694.jpeg)
![ローン債務不履行31.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/87c83d5f-b0bd-2b8e-9b91-105e594e3237.jpeg)

詳細はお見せできませんが、予測できました。　実社会でも試せるよう更に磨きたいと思います
![ローン債務不履行41.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55742/9e52fdba-bd0b-3ad9-880b-1f152107ea21.jpeg)
Docker Rails Vue.js MySQL環境構築

#前提
Docker for macインストール済み

#本題
DockerとRails、Vue.jsの環境構築にかなり時間を割いてしまっったっため記述していきます。
また、様々な記事を参考にするもののbundle installがうまくいかず、エラーが出ておりましたがなんとか構築できたので残しておこうと思いました。

mkdirで新規ファイルを作成。

```Dockerfile
FROM ruby:2.5.3

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && \
    apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - 
RUN apt-get install -y nodejs npm && npm install n -g && n 10.17.0

RUN yarn add node-sass

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
```

```docker-compose.yml
version: '3'
services:
    web:
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
        volumes:
            - .:/app
        ports:
            - 3000:3000
        depends_on:
            - db
        tty: true
        stdin_open: true
    db:
        image: mysql:5.7
        volumes:
            - db-volume:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: password
volumes:
    db-volume:
```

```Gemfile.
source 'https://rubygems.org'
gem 'rails', '5.2.3'
```

```
#自動でファイルの中身を形成されるため空のファイルを作成
$ touch Gemfile.lock
```
上記４つのファイルを準備。

その後、ターミナルにて下記コマンドを入力。

```
$ docker-compose run web rails new . --force --database=mysql --webpack=vue --skip-coffee
```
結構終了するまで時間かかります。
終了したらdatabase.ymlをコンテナと同じように編集します。

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  #以下追記
  password: password
  host: db
```
続いて、

```
$docker-compose build
```
buildが終了したら、

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

```
$ docker ps
```
起動しているか確認。

最後にデータベースを作成。（起動したままで）

```
$ docker-compose exec web rails db:create
Created database 'app_development'
Created database 'app_test'
```
こんな感じで出てきたら成功。

localhost:3000を接続し起動してたらOK。

#Vue
コンポーネントをjavascriptへコンパイル

```
$ docker-compose run web bin/webpack
```

```
$ docker-compose exec web bash
```
コンテナの中に入り、コントローラーを作成

```
# rails g controller Page home
```
作成したらルーティングを設定

```config/routes.rb
Rails.application.routes.draw do
  root to: 'page#home'
end
```
Viewに下記入力

```views/page/home.html.erb
<%=javascript_pack_tag 'hello_vue'%>
```

localhost:3000をリロードして
Hello Vue!
と出てきたら完了。
FileMaker Go にて iOSで、タッチイベント処理を色々仕込んでみた

# FileMaker Go 向けにタッチイベント処理が色々準備されているので活用してみる。

---
### FileMaker Goが素晴らしい。

- なんといっても、無料アプリとして提供される。
- 標準でいくつかのAppsが付属するが、即全削除w
- FileMaker Pro または、Pro Advancedを持っていないとやりたいことは全くできない。
- FileMakerで作成したレイアウトがそのまま再現され、データ入力が簡単に行える。
- URLへアクセスしてHTTPで、ほぼ自由にデータをGETできる。
- URLへアクセスしてHTTPで、ほぼ自由にPOSTできる。

ここまで読んで、お気づきだろうか？FileMakerを持っていれば、外部通信を行う専用のiOSアプリを、結構な低コストで低工数にて作成できる事を意味する・・・

---
### どんな物が作れる？

アイデアしだいで、いろんな物が作成できる。

- 受付専用のキオスク端末をiPadで構成
- WiFiが通った敷地内であれば、各所を回って撮影し、チェック項目を入力し、最後に責任者にサインをしてもらう工程管理アプリ
- LETモデルを使ったなら、出先は自由、お客さんとの商談で、各種オプション構成を選択して貰って、最後にシグニチャサインして貰う契約端末アプリ
- お客様にダウンロードしてもらって、必要項目を入力し発注して貰うB2B専用アプリ

などなど

---
### しかし・・・

やってみるとわかるけど、エラー処理を含めて作り込みを行うと、FileMakerとはいえ結構大変になってくる。特にテストとか。

---
### そこで、デバッグ専用の画面を用意したりするのだが・・・

だれでもアクセスできてしまうと困るので、隠しボタンにしたりとか、本ちゃんモードに切り替えたら間違って移行しないようにしたりとしないように気を遣ったり、いろいろと面倒なことも多い。

---
### 普段起こりえないジェスチャーを仕込むことができたら？

そこで、普段は起こりえないジェスチャーを、専用の画面切り替えトリガーにできたらどうだろう。例えば三本指タップを4連続発生したら・・・とか。
![Touch_event.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207772/b37c8d41-8878-258f-2dee-9aea8a20223d.png)

こちらは、一定時間、画面のタッチがなかったら強制的に認証画面に戻す。
そして、三本指の連続タップが4回発生したら専用のスクリプトを呼び出し、デバッグ専用の画面に切り替えるという例。

レイアウト設定のスクリプトトリガーで、

```
OnGestureTap
```
ってのがるので、そちらでスクリプトを呼び出す。

```
Get(トリガジスチャ情報)
```
という関数で改行区切り文字列にいろいろ情報が返ってくるので、特定時間内に連続して三本指タップが発生した回数を記録していき、連続回数が4回になったところでスクリプト呼び出しと。

一定時間タッチイベントが発生しなければ、ログイン認証画面に戻るようにしてセキュリティを高めたり。

いろいろ便利に使えたりします。

---

開発テストが完了したら、デバッグ画面に切り替えるスクリプトだけ修正すれば間違って変な画面を出されることも無くなるし、社内用だったら告知しなけりゃ誰も気づかないでしょうw
モダンC++における初期化(Initialization in Modern C++)

# Initialization in Modern C++

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Initialization in Modern C++. <a href="https://t.co/wiGaFf090r">pic.twitter.com/wiGaFf090r</a></p>&mdash; Timur Doumler (@timur_audio) <a href="https://twitter.com/timur_audio/status/1004017362381795329?ref_src=twsrc%5Etfw">June 5, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![Anyway like I was saying](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6657/925cf057-6dea-8a21-01fe-3f40fb27f04e.png)
「さっきも言ったように、

![f0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6657/fb076c0a-e55d-7409-f9f0-7c1030abb5d7.png)
C++はマジでフレキシブルなんだ。

（続きは元動画にて）

# 元ネタ
🎥映画「[フォレスト・ガンプ/一期一会](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88%E3%83%BB%E3%82%AC%E3%83%B3%E3%83%97/%E4%B8%80%E6%9C%9F%E4%B8%80%E4%BC%9A)」（原題: [Forrest Gump](https://en.wikipedia.org/wiki/Forrest_Gump)）より、[多数のエビ料理を説明するシーン](https://www.eiga-square.jp/title/forrest_gump/quotes/17)。
マーケット・セグメンテーションにおける６つの要件

### マーケット・セグメンテーションにおける６つの要件
Weldel and Kamakura(1998)

■特定可能性
入手できるデータで分類可能かどうか
■実在性
各セグメントは利益を上げるための十分なサイズであるかどうか
■反応性
　マーケティングの介入に対してそれぞれ違った反応をするかどうか
■到達可能性
  ターゲットに到達可能か
■安定性
  セグメントを特定してから何かしら実行するまでの期間は安定しているかどうか
■実行可能性


### セグメンテーション手法
- 先見的✖️記述的: 分割表、対数線型モデル
- 事後的✖️記述的: クラスター分析、ファジー、混合モデル、自己組織化マップ

- 先見的✖️予測的: クロス表、回帰、ロジット, 判別分析、サポートベクターマシン
- 事後的✖️予測的: AID、CART、ニュートラルネットワーク, 混合モデル

参考
マーケティング・モデル 里村卓也著(103p ~ 104p)
すべりこみAZ-103合格体験記

# はじめに
2020年7月18日、Microsoft Azure Administrator Associateの資格試験「AZ-103」に合格しました。合格に当たっては、先達の体験記にお世話になりましたので、私も残しておこうと思います。

ちなみに、AZ-103は2020年8月31日を以て終了、以降はAZ-104になります。
AZ-103とAZ-104の違いは以下記事をご覧ください。

[AZ-103とAZ-104の比較](http://tagfa.wpx.jp/archives/129)

## 2020/9/1追記
[AZ-203とAZ-204の比較](https://tagfa.wpx.jp/archives/424)

# 学習のコツ
合格してから思う、学習する際に意識しておくと合格に近づきそうなことは以下の2点です。

①Azureはグローバルサービスであること
②制約事項（機能が使えない場合の条件）を理解すること

例えば、

ネットワークの機能にVNet Peeringがありますが、
・東日本リージョンと米国西部リージョンは接続できるのか
・Peering接続できないときはどのようなときか

VMであれば、
・東日本リージョンから米国西部リージョンへ移動できるのか
・ダウンタイムが発生するのはどのような操作か

などを考えながら取り組むと、ぐっと合格に近づくと思います。

# 学習方法

①Microsoft Learn

Microsoft公式の学習サイト「Microsoft Learn」のラーニングパスをやりました。座学だけでなく、実機を使って演習ができるのでお勧めです。演習用のアカウントで演習できるので、費用も掛かりません。（一部費用掛かる演習もあります。）

[試験 AZ-103: Microsoft Azure Administrator](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-103)

②Whizlabs

海外のIT系試験対策サイトで、AzureのほかAWSやLinux、Javaのコースもあります。Azureのコンテンツもたくさんあり、今後の学習にも役に立ちそうです。(https://www.whizlabs.com/)

![alt](https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_2428/http://tagfa.wpx.jp/wp-content/uploads/2020/07/Whizlabs.png)

また、試験問題が公開されていないAzure試験の模擬試験を受けることができる、貴重なサイトです。AZ-103の場合、無料の模擬試験が1つ、有料の模擬試験が5つあり、合計で290問の問題を解くことができます。出題形式も実際のテストとほぼ同じで、非常に役に立ちます。正直、これがなければ合格できていなかったと思います。

各テストでは、全体/分野ごとの正答率や過去の正答率も見れたりするので、苦手な分野がどこか、すぐに把握することができました。

![alt](https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_1583/http://tagfa.wpx.jp/wp-content/uploads/2020/07/WhizlabsTest.png)

また、上記2つで学習する際に、気になるポイントや試験に出題されそうなところは、ブログの下書きにメモを取りながら進めました。
非常に参考になると思います。
[AZ-103に合格した男の学習メモ](https://tagfa.wpx.jp/archives/205)

# 所感
2020/7/4に受験し、608点で不合格になりましたが、何とか2回目に合格できました。範囲が広いうえに、コマンドの引数や詳細な操作手順まで聞かれたので難しい試験でした。もう一度受けて受かるかというと、結構厳しいと思います。

現在、Azureはシェア2位ですが、AWS・Azure両方を使ったことのある立場から言うと、Azureのほうが使いやすい（UIがすばらしい）と思っています。これからどんどんシェア率が伸びる予感がします。
モンテカルロ法で円周率を近似するプログラムをGoで実装してみる

最近大学の授業で登場した、モンテカルロ・シミュレーションの当たり外れ法を用いて円周率を近似してみようと思います。Goで実装していますが、選んだ理由は最近ハマってるからってだけです。

##モンテカルロ法とは？
まず、モンテカルロ法ってなんだって話ですが、問題を確率を利用したシミュレーションで解く方法です。
今回は、正方形にランダムに点を落とし、内接する円の内側に落ちた点を数えることで円周率を近似する当たり外れ法を実装します。

###円周率を近似する際の考え方
簡単に言うと、半径1の円の面積は 1 × 1 × π = π になるので、円の面積がわかれば円周率もわかるということです。

そこで、図のように半径1の円を四分割したものを一辺の長さ1の正方形で囲い、その中のランダムな位置に N 個の点を落とします。落とした点のうち、円の内側に落ちた点の個数がそのまま1/4円の面積を近似しているため、 N 個のうちの円内の点の個数の割合を求め、 4 をかけて全円の面積にすることで、円周率を近似できます。
![monte.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673998/ba867edc-f2be-7ab0-92e6-82905748e12d.png)
この図の例では、N = 10 とし、円内に7個の点が落ちているので、7 / 10 = 0.7 が1/4円の面積、 0.7 × 4 = 2.8 が全円の面積、すなわち円周率の近似となります。

お察しのとおり、この例ではNの値が小さすぎて皆さんご存知の π = 3.141592... とはかけ離れたものになってしまっているので、実際にプログラムを作成してシミュレーションする際にはもっと大きな値を指定します。

##Goによる実装
まず乱数についてですが、 math/rand パッケージの疑似乱数を使用します。rand パッケージの Intn 関数は、引数に指定した自然数 n に対し、 0 以上 n 未満の範囲の整数を rand.Seed 関数で指定されたシード値に基づいて一様に返します。

以下の関数ではシード値に 1 を指定し、 Intn 関数に 16777217 を渡すことで 0 以上 16777216 以下のいずれかの整数を取得します。取得した値を 16777216 で割ることで 0 以上 1 以下の小数を取得しています。
また、この 16777216 という数字ですが、除算において誤差の生じない 2 のべき乗の数となっています。コメントでご指摘いただきありがとうございました。

```montecarlo.go
/*モンテカルロ法で円周率を求める関数*/
func CalcPi(n int) (int, float64) {
	var x, y, d float64
	count := 0											//円内に落ちた点を数える
	rand.Seed(1)										//シード値を設定

	for i := 0; i < n; i++ {
		x = float64(rand.Intn(16777217)) / 16777216		//x, y座標を乱数で決定
		y = float64(rand.Intn(16777217)) / 16777216
		d = x * x + y * y								//原点からの距離の2乗を計算

		if d <= 1.0 {count++}							//円内ならcount++
	}
	return count, 4.0 * float64(count) / float64(n)		//円周率を計算しreturn
}
```

二度乱数を取得、それぞれ x 座標、 y 座標とし、変数 d に原点(=円の中心)からの距離の2乗を計算して代入しています。 d の値が 1 以下ならば x, y ともに 1 以下、つまり、円内の点ということになるのでカウントを増やし、 N 回それを繰り返します。

最後に、円内に落ちた点の数を N で割った数に 4 をかけた値(=求めた円周率)と、円内に落ちた点の数を返しています。

###動作結果
実際にこの関数を使ってシミュレーションしてみました。

```montecarlo.go
func main()  {
	n := 1000000
	start := time.Now()
	count, pi := CalcPi(n)
	end := time.Now()

	fmt.Println("\nPI = ", pi)
	fmt.Println(count, "points out of", n)
	fmt.Println("\nexecution time : ", end.Sub(start).Seconds(), "s")
}
```

実行結果は以下のようになりました。

```N=1,000,000での実行結果.
PI =  3.141656
785414 points out of 1000000

execution time :  0.0560016 s
```
`N = 1,000,000` で実行した結果、小数点以下 4 桁まで正しい値が出ましたね。
ちなみに `N = 100,000,000` で実行すると、

```N=100,000,000での実行結果.
PI =  3.14148656
78537164 points out of 100000000

execution time :  7.1651347 s

```
このようになり、大して変わりませんね。この方法の限界というものの存在がなんとなくわかります。また、実際にシードを変えて複数の乱数列でシミュレーションを行うと、意外とバラツキが大きいです。今回は試行回数を重ねて結果を集計などはしませんが、求めるものによっては信用に足る結果を出すために N の値を相当大きくしなければならないのだと思います。

しかし、小学生の頃から慣れ親しんでいる定数をこのような形で求められるのはなかなかおもしろいです。良かったら読んでいる方もプログラムを作成して試してみてはいかがでしょうか？

今回はシード値を 1 に固定して実行しましたが、毎回別の乱数列を使用したい場合は、 `rand.Seed(time.Now().UnixNano())` のように現在時間をシード値に用いれば実行ごとに結果を変えることもできます。
【JavaScript, Node.js】axiosでGETする際、レスポンスデータが文字化けしていた場合の対応方法

<h4>＊個人的なメモです。

<h1>axiosでGETする際、レスポンスデータが文字化けしていた

<p>Line-MessageApiにて、コンテンツを取得するAPIを叩いた時のお話。

```apib:get-content
GET https://api-data.line.me/v2/bot/message/{messageId}/content
```

レスポンスが文字化けしていた。ほかのAPIたたいた時は問題なかったのに......

<h2>そんな時は、axiosの　responseType　responseEncoding　を付け加える。</h2>

```javascript:axios.create
axios.create({
    responseType: 'arraybuffer',
    responseEncoding: 'binary',
})
```

これで文字化けが解消した。
マルチスレッド環境で遭遇したshared_ptrの注意点

　先日、C++でマルチエージェントシステムを書いているときに、ん？となったので記事にしました。

## ソースコード
　問題となったコードは以下のようなものです。

```c++:
std::weak_ptr<sample> self = agent;
std::thread t([self]() {
    for(auto s = self.lock(); s && s->predicate(); s = self.lock()) {
        //do something 
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
});
t.detach();
```

　非同期にエージェントを一定間隔で更新して、スレッドの外では例えばエージェントの状態を表示する、というようなコードです。

## 問題
　このままではスレッド外でagentの所有権が手放された場合メモリリークを起こす可能性があります。問題の部分がfor文の更新式です。
　具体的に説明する前にまずはstd::weak_ptr::lockの定義を確認しましょう。

```c++
shared_ptr<T> lock() const noexcept;
```
https://cpprefjp.github.io/reference/memory/weak_ptr/lock.html より引用

　上記の通りlock()が返す値はstd::shared_ptr&lt;T&gt;の一時オブジェクトです。つまりlock()で作られたオブジェクトの寿命は式の評価が終了するまで、ということです。shared_ptrへの代入では自身の持つリソースを放棄してから代入しますが、その間にも別のshared_ptrがそのリソースを保持しているため破棄されずに残ってしまいます。

## 解決策
　解決策は所有しているオブジェクトを使った後すぐに放棄してしまうことです。
　コードは以下のようになります。

```c++:
std::weak_ptr<sample> self = agent;
std::thread t([self]() {
    for(auto s = self.lock(); s && s->predicate(); s = self.lock()) {
        //do something 
        s.reset(); //abandon
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
});
t.detach();
```
s.reset()はsleepの前後どちらでも動作しますが、後ろに置いた場合不必要にオブジェクトの寿命が延ばされることになるので、前に置いた方がよいと思います。

　

というわけで、マルチスレッド環境で遭遇したshared_ptrの注意点でした。
MSVC++でstatic inlineなstd::mapのデストラクタが呼ばれたとき落ちる件

# 発生した環境
Windows 10
Visual Studio 2017 バージョン：15.9.16
VC++バージョン： 14.16

# 発生した問題
問題が起きたコードは以下のようなものです．

```c++:sample.h
#ifndef SAMPLE_H
#define SAMPLE_H

#include <map>

struct sample {
    static inline std::map<int, float> m;
};

#endif
```

```c++:sample.cpp
#include "pch.h"
#include "sample.h"

```

```c++:test.cpp
#include "pch.h"
#include <iostream>
#include "sample.h"

int main(void) {
    std::cout << "Hello, world" << std::endl;
    
    return 0;
}

```

**C++17**から構造体やクラスの**staticメンバにinlineをつけることができる**ようになり，ヘッダファイルで変数を定義した場合でも**複数の翻訳単位で一つの実体を共有することができる**ようになりました．
このコードをC++17のバージョンでコンパイルするとコンパイル自体は通るのですが，実行したとき以下のようにエラーを出力して終了します．

```
Hello World!

C:\Users\XXX\Documents\Visual Studio 2017\Projects\test\Debug\ConsoleApplication3.exe (プロセス 9164) は、コード -1073741819 を伴って終了しました。
このウィンドウを閉じるには、任意のキーを押してください . . .
```

デバッガで詳細を調べたところ，main関数を抜けた後std::mapのデストラクタ(正確にはstd::mapの基底クラスである_Treeクラスのデストラクタ)で**ダングリングポインタ**にアクセスしてSEGVが発生しているようです．またもっと深く調べたところ，デストラクタが2回呼び出されており2回目でSEGVが発生していました．clangやgccでも同じコードをコンパイルして実行してみましたがやはりどちらでもこの問題は発生しませんでした．

# 解決策
Visual Studioをアップデートすれば解決します．
どうやらこの問題はVisual Studio 2017 version 15.7の頃からあったようですが([同様の問題](https://stackoverflow.com/questions/52809631/strange-behaviour-when-using-c17-static-inline-members-in-visual-studio))，15.9.23，24辺りで修正されたようです．

Visual Studioってアップデートの通知がないのでついつい忘れてしまいますね．
条件演算子・3項演算子

#3項演算子の記述方法


**if・elseの場合
 条件判定式 ? trueの場合 : falseの場合**

**if・else if・elseの場合
条件判定式1 ? trueの場合 : 条件判定式2 ? trueの場合 : falseの場合**


ちなみに、条件判定後の処理に関してですが
**セミコロン(;)は行の最後以外には記述してはいけません。**

##if・elseの場合
```c
int x = 0;

//if・elseで記述した場合
if(x <= 0){
   printf("true");
}
else{
   printf("false");
}

//3項演算子で記述した場合
x <= 0 ? printf("true") : printf("false");

```

```
//結果

true
true
```

##if・else if・elseの場合
```c
int x = 0;

//if・elseで記述した場合
if(x < 0){
   printf("if");
}
else if(x >= 0){
   printf("else if");
}
else{
   printf("else");
}

//3項演算子で記述した場合
x < 0 ? printf("if") : x >= 0 ? printf("else if") : printf("else");

```

```
//結果

else if
else if
```

#最後に

3項演算子はそんなに多用することはないですが、覚えておくに越したことはないです。
良ければ、使ってみてください！
記号23匹全部言えるかな？(英語付き)

# 記号を読めるとけっこうメリットがある
記号ってそんなに声に出すタイミングないので、けっこう適当に覚えている方が多いと思います。ただ、記号の読み方を覚えておくと以下のメリットがあります。

* 英語で検索する際に役立つ（普通に記号を書いて検索しても出てこないので英語で書くとかなり捗る）
* 突然コードレビューの文化のある会社に転職しても恥をかかない
* ジョシュアツリーの法則でいろいろ覚えやすくなる（ジョシュアツリーの法則は単語を認識することでそのことを意識しやすくなり、いろいろ認識できるようになる的な法則）

# 記号の読み方と英語の一覧
あまりに簡単なマイナスとかプラスとかそういう系を除いて確認しておきたい記号の一覧です！

| 半　角 |          読　み　方          |       英　　　語      |
|:------:|:----------------------------:|:---------------------:|
| !      | エクスクラメーションマーク   | exclamation mark      |
| ?      | クエスチョンマーク           | question mark         |
| '      | シングルクォーテーション　→　シングルクウォートと省略して呼ぶことが多い     | single quotation mark |
| "      | ダブルクォーテーション　→　ダブルクウォートと省略して呼ぶことが多い       | double quotation mark |
| \      | バックスラッシュ                 | back slash              |
| (      | レフト　ペアレンシス   | left parenthesis    |
| )      | ライト　ペアレンシス   | right parenthesis    |
| ＾     | キャレット、ハット | caret、circumflex     |
| ~      | チルダ             | tilde                 |
| &#124;     | パイプ        | pipe,vertical bar          |
| `      | バッククォート               | back quotation       |
| [      | レフト ブラケット         | left bracket               |
| ]      | ライト ブラケット         | right bracket               |
| {      | レフト ブレイス           | left brace                 |
| }      | ライト ブレイス           | right brace                 |
| *      | アスタリスク → アスタみたいに略すことがあります                 | asterisk              |
| ;      | セミコロン                   | semicolon             |
| :      | コロン                       | colon                 |
| ,      | カンマ               | comma                 |
| <      | レスザン             | less than sign        |
| >      | グレーターザン       | grater than sign      |
| /      | スラッシュ                   | slash                 |
| _      | アンダーバー、アンダースコア → アンスコみたいに略すことがあります | low line、underscore  |

# まとめ
とりあえずさっさと覚えておきたい暗記系の話でした。
ITエンジニアやっているととりあえず暗記しとかないとまずい系の事って結構おおいので、繰り返し読んだり動画をみたりしてなるべく頭を使わず覚えて行きたいですね。

# ポエム
あとこの記事を書いているときにpipeをどうやってmarkdownに書き込むか一瞬止まりました（マークダウンでテーブルの絡むの区切りはpipeのため）
pipeをpipeと読むことを知っていれば検索して調べることができますね！結構読み方を覚えておくのは重要です。
ちなみにこの記事のタイトルはポケモン250匹全部言えるかなっていう歌をもじってます（気づいた人は年齢結構いってるかもw）
DockerをUbuntuへインストール

# はじめに

kubernetesを構築するためにdockerのインストールを実施します。

# 環境

- Ubuntu 18.04

# リポジトリのセットアップ
1. 関連ソフトウェアのインストールを実施。

    ```
    $ sudo apt-get update
    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    ```

2. Dockerの公式GPGキーを追加します。

    ```
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    ```

3. 次のコマンドを使用して、stable repositoryを設定します。 

    ```
    $ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    ```

# dockerのインストール

```
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```
[Javascript]reduceの第２引数（初期化）の使い所を理解する[なにが返ってくるんじゃい2]

#目的

- reduceの第２引数の要否を判断できるようになる。

#今日やること

[昨日の投稿](
https://qiita.com/nktuk/items/94d087067419f146c689)でmapとfilterの使い分けを理解した。
今日は、その中で疑問点に上がったreduceの第２引数要否について理解を深める。

##reduceとは

```JS:reduce.js

 collection.reduce = (iterator, accumulator) => {
    let i =0
    collection.each((value, index, collection) => {
      if (accumulator === undefined && i==0) {
        accumulator = value;
        i++
      } else {
        accumulator = iterator(accumulator, value, index, collection);
      }
    });
    return accumulator
  };

```



昨日の投稿から抜粋。

```Js:不要なとき
avgMaxCP()=>{   
return allPokemon.filter(pokemon => pokemon.MaxCP)
    .reduce((acc, pokemon) => acc + Number(pokemon.MaxCP),0) 
  }

```

filter処理後にMaxCP（オブジェクト）を要素にもつ配列している。
そして、reduceに渡している。そのためreduceの第二引数には０をいれる必要がある。
そうしなければ、配列の最初の要素はaccに入りNumberで数字化できず結果NaNになる。
ただし、二つ目の要素からはできる。


```JS:必要なとき
  avgMaxCP () => {
   const hasMaxCP = allPokemon.map(pokemon => {
        return pokemon.MaxCP
      });
      const a = hasMaxCP.filter(maxcp => {
        return maxcp
      });
      let sum = a.reduce((acc, cur) => {
        return acc + cur
      });
      return sum 
    },

```

map処理後に、全てのポケモンをMaxCPに変形した。[1,2,3,undefined・・・]のイメージ。
（ポケモンのオブジェクトではない）
filterに上記の配列を渡して処理し、MaxCPをもつ要素だけの配列になる。
今、aには数字のみが入っているので、Numberやreduceの第二引数のような処理は不要になる。


##結論　第二引数 = 初期化は、渡した配列の最初の要素が想定通りであれば不要。

array.reduce((a,b)=>a+Number(b)のように数字化して処理するときに、最初の要素が数字化（変形）されているか確認すること。


その他、下記の記事も見つけた。
[reduce()はArrayにて最強……おぼえておけ。](https://ginpen.com/2018/12/23/array-reduce/)
[意外と知られていないJavaScriptのreduceの使用方法](https://iwb.jp/javascript-reduce-howto-use/#reduce-2)

想像以上にreduceは万能そう(!)なので、reduce利用シーンを後日まとめる。
【注意】2値画像（1bit/pixel）を作成するときはファイル形式（format）も意識しよう！

#はじめに
こんにちは！
今回は2値画像を作成する際のファイル形式に関して話したいと思います。

ここでは「グレースケール画像（8bits/pixel）を2値画像(1bit/pixel)に変換する」場合を例に説明します。

pillowを使った画像変換を例に説明していますが、今回の話はファイル形式に起因するものですので、2値画像(1bit/pixel)を作る際には必ず知っておいた方がいい話です。

一方で、2値画像を0(黒)、255（白）として保存したい場合は8bits/pixelとなるため、ここで説明している形式では逆に期待に沿えません。（拡張子をJPEGなどに変更して保存してください。）


#2値画像（1bit/pixel）を保存できるファイル形式（format）は？
白と黒で描写される2値画像ですが、1画素（1pixel）を1bit(0:黒、1:白)とするのが一般的です。

ただ、ファイル形式によってはグレースケールのように1画素（1pixel）を1bit(0:黒、1:白)で保存できず、8bit(0:黒、255:白)で保存してしまう場合も存在します。（JPEGが該当します。）

そのため、1画素（1pixel）を1bit(0:黒、1:白)として保存したい場合は対応したファイル形式を選ぶ必要があります。
代表的なものとしては下記が挙げられます。
png
pbm
bmp
などなど

今回の例ではpillowを使用していますのでpillowが対応しているファイル形式かを確認します。
https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

pillowだとpngとbmpは対応していることが分かります。

今回は使用しませんが、openCVなど別のライブラリを活用する場合は改めて対応ファイル形式であるかを確認してください。
http://opencv.jp/opencv-2svn/cpp/highgui_reading_and_writing_images_and_video.html?highlight=write#imwrite


#開発環境

Windows10
python3.7.7
pillow=7.1.2



#「グレースケール画像（8bits/pixel）を2値画像(1bit/pixel)に変換する」

それでは実際にソースコードを示します。
今回はグレースケール画像（8bits/pixel）から2値画像(1bit/pixel)への変換を行っていますが、
フルカラー画像（RGB各8bits/pixel）から2値画像(1bit/pixel)への変換も可能です。
その際はif inimg.mode == "L":をコメントアウトしてください。（elseの方も忘れずに）

```python:gray2bin.py
import os
import glob

from PIL import Image

if __name__ == "__main__":
    get_dir = os.walk("./input")

    #カレントディレクトリを取得
    current_dir = os.getcwd()

    #入力ディレクトリを取得
    indir = current_dir + "\\input\\"

    #出力ディレクトリを取得
    outdir = current_dir + "\\output_bin\\"

    # 出力用フォルダがない場合は作る
    if os.path.isdir(outdir) == False:
        os.mkdir(outdir)

    #入力ディレクトリ内の画像を選択
    all_images = glob.glob(indir + "\\*")

    # それぞれの画像に対する処理
    for img in all_images:

        # 入力画像の画像名を取得（拡張子付き）
        basename = os.path.basename(img)
        print(basename)

        # 入力画像の画像名から拡張子を分離
        name, ext = os.path.splitext(basename)

        # 2値画像に変換した画像の保存先
        save_path = outdir + name + "_bin.png" # pbmやbmpでも大丈夫
        #save_path = outdir + name + "_bin.bmp"


        if ext != ".bat" and ext != ".txt":
            with Image.open(img) as inimg:

                # print("inimg mode:",inimg.mode) # inimg mode: RGB

                # L(grayscale)か否かを確認する 問答無用で2値化したい場合はコメントアウトすること
                if inimg.mode == "L":

                    conv_image = inimg.convert("1")
                    #print("inimg.mode:", conv_image.mode)

                    conv_image.save(save_path)

                else:
                    print("inimg mode(not L):", inimg.mode)

```




#まとめ

今回は「グレースケール画像（8bits/pixel）を2値画像(1bit/pixel)に変換する」を例に、
2値画像(1bit/pixel)を保存する際の注意点を説明しました。

ここで説明したファイル形式（png/bmpなど）は代表的なものではありませすが、全てではありません。
ご自身の用途に合わせて他のファイル形式も色々試していただければと思います。

何かコメントがありましたらお願い致します。
(次あたりからgithubでも公開できるようにしたいです。)
【初心者でもわかる】パソコンとスマホで改行の位置を調整する方法

# どうも7noteです。レスポンシブサイトを作成するときに気を付けたい改行の調整方法のお話。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/br/
個人アプリ作成　用語

# collectionとmember
collectionとmemberは、ルーティングを設定する際に使用できます。
これを使用すると、生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできます。
collectionはルーティングに:idがつかない、memberは:idがつくという違いがあります。

例
<img width="529" alt="スクリーンショット 2020-07-18 22.17.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/1cd76bcf-9674-33de-a8a2-88fb384e65c0.png">

<img width="535" alt="スクリーンショット 2020-07-18 22.17.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/bd2fa51e-fa24-d499-b8d0-97724908c835.png">
URLの指定先が、collectionは:idなし、memberが:idありとなっています
OpenCoreのUSBメモリが二度と立ち上がらなくなったら

## TL; DR
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">OpenCore起動してこないと思ったら前のブートエントリが残ってたのか… efibootmgrでエントリを削除して解決…</p>&mdash; ねぎまぐろ (@kume_negitoro) <a href="https://twitter.com/kume_negitoro/status/1282988002570993666?ref_src=twsrc%5Etfw">July 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 状況

先日、OpenCoreを試してみよう！と思い、OpenCoreをUSBメモリに導入しました。
起動してみたのは良いんですが、なぜだかその一回きりでブートできなくなってしまいました。

UEFI上でブート可能な一覧にはOpenCoreが表示されるものの、BootOverrideでそれを選択してもUEFIに戻されてしまいます。
よくよく考えてみると、初回の表示は`(UEFT)<USBメモリ名>`みたいな表記になっており、OpenCoreという表記ではなかったことに気づきました。それから紆余曲折あってブートエントリが設定されていたりするのでは？と思い至りました。

実際に`efibootmgr`で確かめてみると、OpenCoreのエントリが残っていますね。

```
$ sudo efibootmgr
BootCurrent: 9698
Timeout: 1 seconds
BootOrder: 9698,9697,9696
Boot9696* OpenCore
Boot9697* Windows Boot Manager
Boot9698* ubuntu
```

これのせいで起動用のefiにたどり着けなかったわけですね。さっさと消してしまいましょう。

```
$ sudo efibootmgr -b 9696 -B
```

というわけで、`Boot9696`を削除してやるとブート可能になりました。めでたしめでたし。