OmniAICreator/Qiita-1.07M huggingface dataset:
ManjaroでAmethystのGetting Started

# はじめに
[Amethyst](https://amethyst.rs/) はRust製のゲームエンジンです。
Getting Startedを行う際のArch系の依存パッケージ導入の覚書です。

# Rust環境の構築

`rustup`を使ってインストールしましょう。`arch`系であれば`pacman`で一発です。

```shell
sudo pacman -S rustup
```

Rustコンパイラである`rustc`とパッケージ管理システムである`cargo`というツールが入れば環境のインストールに成功しています。

# 必要なパッケージ

[公式ドキュメント](https://book.amethyst.rs/stable/getting-started.html) で入れろと言われている以下のパッケージ、`libasound2-dev`と`libssl-dev`と`libx11-xcb-dev`はそれぞれArch系においては以下の表のように代用できるようです。

|Debian系|Arch系|
|:-----------------|------------------:|
|libasound2-dev|alsa-lib|  
|libssl-dev|openssl|
|libx11-xcb-dev|libxcb|

それぞれ

```shell

sudo pacman -S alsa-lib openssl libxcb
```

でインストールが可能です。

# Amethyst Command Line Interfaceをインストール
次に、Ametystプロジェクトの生成を容易にするAmethyst CLIをインストールしましょう。`Rust` のパッケージ管理システムである`Cargo`を用いてインストールすることができます。

```shell

cargo install amethyst_tools
```

# プロジェクトを生成

インストールしたCLIを使ってみましょう。以下のコマンドでゲームプロジェクトのフォルダーが作られます。

```shell

amethyst new ゲームプロジェクトの名前
```

今作ったフォルダーに移動しましょう。

```shell

cd ゲームプロジェクトの名前
```

次に出来上がったばかりのまっさらなプロジェクトを実行してみましょう。

```shell

cargo run
```

![Screenshot from 2019-06-01 00-46-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/6c8f2707-6235-6792-686a-249b5abeee73.png)

青緑色の空のウィンドウが立ち上がりました！

# 余談
これからAmethystはちょくちょく触っていこうかなと思っています。コンセプト部分についてまとめられたらまた記事にしようかなと思います。
[ASP.NET]Ajaxを利用して動画ファイルのアップロード・サムネイルを作成を行う。

```javascript:sample.aspx
function file_upload(files, index = 0) {
    var file = files[index];
    var data = new FormData();
    data.append(file.name, file);

    $.ajax({
        url: '<%= VirtualPathUtility.ToAbsolute("~/api/FileUpload") %>',
        type: 'POST',
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        dataType: 'html',
    })
    .catch((...args) => {
    })
    .then(() => {
        var has_next = ((files.length - 1) != index);
        if (has_next) {
            file_upload(files, (index + 1));
        } else {
            window.location.reload();
        }
    });
}

$(document).on('click', '#upload_button', function () {
    var files = $('#upload_files').get(0).files;
    if (files.length > 0) {
        file_upload(files);
    }
}
```


```C#:FileUploadController.cs
private FFMpegConverter FFMpeg = new FFMpegConverter();

/// <summary>
/// 動画のアップロードとサムネイルの作成
/// </summary>
/// <returns></returns>
public HttpResponseMessage Post()
{
    foreach (string name in HttpContext.Current.Request.Files)
    {
        string pathVideo = $"{VideoFolder}{name}";
        string pathThumb = $"{ThumbFolder}{Path.GetFileNameWithoutExtension(name)}.jpg";

        // 動画の保存
        HttpContext.Current.Request.Files[name].SaveAs(pathVideo);

        // サムネイル作成
        FFMpeg.GetVideoThumbnail(pathVideo, pathThumb);
    }

    return HttpContext.Current.Request.Files.Count > 0 ? Request.CreateResponse(HttpStatusCode.Created) : Request.CreateResponse(HttpStatusCode.BadRequest);
}
```
あまりサンプルが見つからないEclipse Collectionsのメソッドたち（MutableList編）

## はじめに
JavaのEclipse Collectionsについて書いていきます。
頻出パターンはググると色々出てくるので、逆にあまりサンプルが見つからないやつらをピックアップしてみようと思います。
サンプルがあまり見つからない＝需要がないってことではあると思うので、大概の人には要らない情報になりそうですが、ニッチなことやってる・やらないといけない人向けにあってもよいかなと思います。

## 前提
- Java8
- Eclipse Collections8.0.0（古くてすみません）


## 解説
### 基本となるリスト
```java:mutableList
MutableList<String> list = Lists.mutable.of(
  "mac1",
  "linux1",
  "windows1",
  "mac2",
  "linux2",
  "windows2");
```

###clone()
- リストから同じ内容をコピーした新しいリストを返す。
- オブジェクト的には同じではない。

```java:clone
MutableList<String> clone = list.clone();
System.out.println(clone);
System.out.println(list == clone);
```

```java:結果
[mac1, linux1, windows1, mac2, linux2, windows2]
false
```
同一オブジェクト（参照型）のコピーではないのでlistに何か変更を加えてもcloneには影響しません。

###collectIf(Predicate<? super T> predicate, Function<? super T,? extends V> function)
- 特定の条件に合致した場合のみ指定したFunctionの結果に基づいて新しいリストを作る。

```java:collectIf
MutableList<String> collectIf = list.collectIf(s -> s.contains("mac"), s -> s + " is picked");
System.out.println(collectIf);

```

```java:結果
[mac1 is picked, mac2 is picked]
```
collectメソッドに条件指定ができるようになったものです。

###partition(Predicate<? super T> predicate)
- 特定の条件に合致するものとしないものをわけて、それぞれ新しいリストを返す。

```java:partition
PartitionMutableList<String> partition = list.partition(s -> s.contains("mac"));
System.out.println(partition.getSelected());
System.out.println(partition.getRejected());

```

```java:結果
[mac1, mac2]
[linux1, windows1, linux2, windows2]
```
新しく作られたリストは条件に合致するものはgetSelected(),合致しないものはgetRejected()で取れます。

###partitionWhile(Predicate<? super T> predicate)
- 条件に合致する間、その合致したものを新しいリストで返し、それ以降のものは別の新しいリストで返す。

```java:partitionWhile
PartitionMutableList<String> partitionWhile = list.partitionWhile(s -> s.contains("1"));
System.out.println(partitionWhile.getSelected());
System.out.println(partitionWhile.getRejected());
```

```java:結果
[mac1, linux1, windows1]
[mac2, linux2, windows2]
```
新しく作られたリストの取得方法はpartitionと同じです。
わかりづらいかもしれませんが、基本リストのwindows1とwindows2を入れ替えて定義しておいた場合、getSelected()で取れるのは[mac1, linux1]、getRejected()で取れるのは[windows2, mac2, linux2, windows1]となります。

###take(int count)
- 最初のN件を取って新しいリストとして返す。

```java:take
MutableList<String> first4 = list.take(4);
System.out.println(first4);
```

```java:結果
[mac1, linux1, windows1, mac2]
```

###drop(int count)
- 最初のN件を削って残りを新しいリストとして返す。

```java:drop
MutableList<String> left = list.drop(4);
System.out.println(left);
```

```java:結果
[linux2, windows2]
```

###selectInstancesOf(Class\<S>clazz)
- 指定したクラスの型に合致するものを新しいリストで返す。

```java:selectInstancesOf
//別の基本リストを定義し直します
MutableList<Object> objectList = Lists.mutable.of("1", 2);
MutableList<String> strList = objectList.selectInstancesOf(String.class);
MutableList<Integer> intList = objectList.selectInstancesOf(Integer.class);
System.out.println(strList);
System.out.println(intList);
```

```java:結果
[1]
[2]
```
例が分かりづらかった＆こんな使い方することはほぼないかと思います。。
が、一応こういうメソッドもあるんだよということで。

## 終わりに
本当はもっとたくさんメソッドあります。詳細は[こちら](https://www.eclipse.org/collections/javadoc/8.0.0/org/eclipse/collections/api/list/MutableList.html)を見ていただければと思います。
git-flow･GitHub Flow 実践要点メモ

gitフローに沿った開発の備忘録

### 前提環境
- GitHubアカウント作成済み
- PCへのgitインストール済み

### 使用ブランチ種類
masterブランチ : 本番公開用
　|
developブランチ : 開発環境メインブランチ
　|
　|- featureブランチ : 機能追加 作業ブランチ
　|- fixブランチ : バグ/デザイン/コード修正 作業ブランチ
　|- updateブランチ : データ更新 作業ブランチ
　|- settingブランチ : 設定 作業ブランチ


## ブランチ最新アップデート - チーム開発時 作業前必須フロー

#### 1. Pull　
` GitHub既存リポジトリの最新developブランチ → ローカルdevelopブランチへ Pull`

#### 2. Checkout　
`(feature / fix / update など)適した作業ブランチへ Checkout`

#### 3. Merge　
`(Checkoutして移動した)作業ブランチに、(1.で Pullしたローカル最新)developブランチを Merge`


## Issue ・ Pull Request(PR) を使った開発フロー

#### 1. Issue　
`課題が見つかったら Github で issue として記録/作成`

#### 2. 作業Branch作成 & 開発
`ローカルで issue 用のブランチ( feature or fix or update )を作成し、そのissue解決の開発作業`

#### 3. Push as Pull Request(PR)　
`開発できたら、その作業ブランチを Github へ Push (masterでないbranchは、GitHubで自動的にPRとして表示)`

#### 4. Review & Merge (PR → Develop)　
`pushされたPRをメンバーまたは自分でReviewし、問題無ければ developブランチ に Merge`

#### 5. Merge (Develop → Master)　
`ある程度 developブランチに mergeされたら、適宜 masterブランチへ mergeし 本番公開反映`

<br><br>
[SQL] 昇順・降順ではなく、任意の順番でソートしたい

## まえがき

ソートするときに、idの昇順・降順ではなく、任意の順番でソートしたい機会があったので、その方法のメモです。
生SQLとRailsで書くときの2パターンを記載しておきます。
（Mysqlだと、`FIELD` が使えるのですが、Postgresqlだとそれに類するものが無いっぽくて、`CASE` で実現する方法くらいしか見つかりませんでした。）

## 説明に使うテーブル

`animals` テーブル

|id|name|
|---|---|
|1|dog|
|2|cat|
|3|bird|

## ソート方法

生SQLで取得する場合と、Railsでの書き方を記載する。

### 昇順で取得したい場合

```sql:sql
SELECT
  *
FROM
  animals
ORDER BY
  id ASC
```

```ruby:rails
Animals.order(id: :asc)
```

### 降順で取得したい場合

```sql:sql
SELECT
  *
FROM
  animals
ORDER BY
  id DESC
```

```ruby:rails
Animals.order(id: :desc)
```

### 任意の順番で取得したい場合（本題）

e.g ) idが `2, 3, 1` の順番に取得したいとする

```sql:sql
SELECT
  *
FROM
  animals
ORDER BY
  CASE id
  WHEN 2 THEN 1
  WHEN 3 THEN 2
  WHEN 1 THEN 3
  END
```

```ruby:rails
# ORDER BY 句のクエリを生成（可読性は...）
def order_query(column_values)
  column_values.each.with_index(1).inject('CASE id ') do |order_query, (column_value, index)|
    order_query << "WHEN #{column_value} THEN #{index} "
  end << 'END'
end

animal_ids = [2, 3, 1]
Animal.order(order_query(animal_ids))
```

## 参考
- https://qiita.com/gooddoog/items/f37f3d3f0081b5b39e05
【Xamarin.Forms】ページ遷移(モーダル, モーダレス)に関してメモ

ここ何ヶ月かXamarinでアプリケーション開発をしていたのですが、GitのREADME.mdにメモを残すのも見栄えが悪くなりそうなので、私もQiitaに自分の備忘録として開発で得た知識を残すことにしました。

ページ遷移に関しては、わざわざまとめる必要もないかもしれませんが、初投稿ということで投稿の練習も兼ねて、この内容で投稿したいと思います。(Prismを使わない)
#2種類の画面遷移スタックとそれぞれのメソッド
|                  |     Modal Stack   |   Navigation Stack |
|:-----------------|:-----------------:|:------------------:|
|    Dependency    |Application        |NavigationPage      |
|Forward           |PushModalAsync     |PushAsync           |
|Back              |PopModalAsync      |PopAsync            |
|その他             |                   |PopToRootAsync      |

# 初期画面のスタック
App.xaml.cs(変更可能)にて初期画面(MainPage)のクラスを呼び出す場合、以下のように、NavigationPageをMainPageに設定します。

```c#:App.xaml.cs
public App()
{
    InitializeComponent();
    MainPage = new NavigationPage(new MainPage() { Title = "メインページ"});
}
```
これにより、MainPage ContentPageインスタンスがナビゲーションスタックにプッシュされるようになり、そこがアクティブページであり、アプリケーションのルートページとなります。

# Page遷移
Page遷移先のコンストラクタの指定は各自対応お願いします。
## PushAsync
現在のNavigationStack上の1つ後のページに遷移する。

```c#:MainPage.cs
async void PushAsync(object sender, EventArgs e)
{
      await this.Navigation.PushAsync(new NavigationPage(new MyPage() { Title = "MyPage" }));
}
```

## PopAsync
現在のNavigationStack上の1つ前のページに遷移すると同時にNavigationStackにページを追加する。

```c#
async void PopAsync(object sender, EventArgs e)
{
      await this.Navigation.PopAsync(new NavigationPage(new MyPage() { Title = "MyPage" }));
}
```

## PushModalAsync
新しいNavigationStackが追加されます。
するとModalStack上に NavigationPageが設定され、新しいNavigation Stackがもう一つ増えます。
つまり、 NavigationStackはNavigationPageと １：１で存在し、NavigationPageが増えればその分増えます。
それに対してModalStackはシステムに１つのみ存在することになります。

```c#:MainPage.cs
async void PushModalAsync(object sender, EventArgs e)
{
      await this.Navigation.PushModalAsync(new NavigationPage(new MyPage() { Title = "MyPage" }));
}
```

## PopModalAsync
１つ前のNavigationStackの一番後ろのページへ遷移する。
その際、Navigation Barからは前のNavigationStackには戻れない

```c#
async void PopModalAsync(object sender, EventArgs e)
{
      await this.Navigation.PopModalAsync(new NavigationPage(new MyPage() { Title = "MyPage" }));
}
```

## PopToRootAsync
現在いるNavigationStack上のModalStackをすべて削除し、の現在のNavigationStackの先頭のPageに遷移します。
その際、Navigation Barからは前のNavigationStackには戻れない

```c#
async void PopToRootAsync(object sender, EventArgs e)
{
      await this.Navigation.PopToRootAsync(new NavigationPage(new MyPage() { Title = "MyPage" }));
}
```
# 最後に
最後まで読んでいただきありがとうございました。
本当は図を使って説明したいところなんですけど、少し面倒かつ下記のサイトにすでに掲載してあるので、割愛させて頂きます。

やはり今回書いたページ遷移のやり方より、よりコンパクトに書ける、PrismのNavigationServiceを使った方が良さそうです。

# 参考にしたサイト
Xamarin.Forms Navigation Overview
http://www.nuits.jp/entry/2017/05/27/170909

Xamarin.Forms モーダル ページ
https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/app-fundamentals/navigation/modal
「自分用メモ」　rails導入するときにした方がいいこと

#bundleの存在を忘れない事
Rubyでの開発をするために欠かせないRuby on rails
railsでの開発を便利にするためのgemファイルを大量に導入する
gemファイルをまとめておくためのgemがbundle

##bundle install　の手順
1. gem install bundler
2. bundle init
3. Gemfile へのgemの記入

```
gem 'rails', '~> 5.2.3'
```

4. 対処のディレクトリに移動
5. railsをインストール
6. budle install
7. rails new プロジェクト名
はじめまして

はじめまして。色んな言語に挑戦しています。裕斗です。
小学校3-4年の頃からパソコンでプログラミングをやっていて小学校の間に Android に カスタムOS を入れたり、batch や vbs で遊んでいました。
中1になってから、Node.js、C#、Python、Ruby、HTMLとCSSなどをやり始めました。

最近では、Discord のボットを作っています。(Discord.js、eris等)
書いていく記事はそれが中心になるかと思います。

目指すはOS作成です。よろしくです。
最近学んだPF周りの知識を整理しておく

## 背景
- レイヤーの低い部分のコーディングばっかりしてせいで、レイヤー高い部分触るようになって意識することがたくさん出てきたので、ちょっと整理がてらにアウトプットしておく
- メモ程度に残して、今後気になったりインプットしたら追記していく

## 目次
- リバースプロキシ
- abuse対策
- LB
- L4 スイッチ
- L7 スイッチ
- GSLB


## リバースプロキシとは
> リバースプロキシとは、外部ネットワーク（インターネット）からの接続を受け、何らかの処理を行った上で内部のサーバーに引き渡す、中継機能を果たす機器のことです。 クライアントとして接続しようとする外部のデバイスに対しては接続先のサーバーのようにふるまい、内部のサーバーに対しては外部のクライアントのようにふるまいます。
[リバースプロキシ - F5 Networks]
(https://f5.com/jp/education/glossary/glossary020-21502)

もう、この説明通りなんです。これやることの旨味としては、、、

- 負荷分散
- セキュリティ対策
- キャッシュによる高速化
- 異なるアプリやフレームワーク、プラットフォームの統合

などがあるっぽいです。

## abuse対策
> abuse(アビュース)とは、不正使用や乱用などを意味する。コンピュータネットワーク上で迷惑行為やその行為を通報する窓口を指している。misuseという似た英単語があるが、こちらは濫用・悪用以外に“誤用”“過誤”という故意ではない意味も含まれている。

> 不適切な公衆への振舞いをする者に対し、RFC 2142は通報するためにabuse@…を用意するべきと規定している。メールアドレスは、スパムメールの送信や第三者によるメールサーバの不正使用など、さまざまな通報先にあり、転じてネットワーク上の迷惑行為やその行為を通報する窓口として使われるようになった。
[Abuse | インターネット用語辞典 | IT用語辞典 | 日立ソリューションズ](https://it-words.jp/w/Abuse.html)

- 要するに濫用の対策です。昨今、APIを公開してるWebサービスが多いですが、abuseによって、クラッシュしてAPIがクラッシュしてフロントエンドに影響が出ることなどもありえます。そのためにabuse対策が必要みたいです。
- 簡単な対策としては、同一のIPアドレスから一定期間内に一定数のリクエストを受けた際に、遮断するなどがあります。多分、だいたいのサービスで導入されてます。

## LB
- Load Balancer? Balancing?の略。
- 要するに負荷分散こと。
- 例えば、アプリケーションが本番に1台しか出てなかったとして(まあ、ありえない話ですが)、トラフィックが増大してパフォーマンスが出なくなります。そうすると、UX下がったり、最悪クラッシュします。
- そんなことを防ぐために、アプリケーションは冗長構成をとって負荷分散をして、最悪の事態を防ごうとしているってこと。
- そんで、LBを理解する上で重要になるのがどのレイヤーでLBをさせるかということ。

## L4とL7について
- L4がトランスポート層、L7がアプリケーション層を指す
- 具体的には、ロードバランサをL4スイッチとして動作させるときはTCP/UDPの情報までを基にスイッチングを行うらしい。
- 一方でL7は、Cookieパーシステンス（Cookieを使用して接続維持を行う機能 ）の使用時や、HTTPヘッダのUser-Agent:を見てスマホ向けとPC向けで接続先サーバ群を分ける場合、あるいはSOAPメッセージ内のトランザクションIDをベースに接続サーバを決定する場合に使われるっぽい。
- 要は、L7の方がレイヤーが低いだけあって複雑な構成なんだろうなって感じ。

## GSLB
> GSLB（グローバルサーバロードバラシング）は、複数のサイト間でサーバロードバランスを行う機能です。 ディザスタリカバリ対策ともなります。 また、DNSの動きと連動させてユーザのリクエストをトラフィック の少ないサーバへ転送することも可能です。 GSLBの専用装置にはF5のGTM、CitrixのMPXなどがあります。
[GSLB（広域負荷分散）とは - ネットワークエンジニアとして]
(https://www.infraexpert.com/study/loadbalancer8.html)

要するに、複数の拠点にサーバー置いて、障害に備えるやつ。
【各言語共通】2種類のインクリメントの違いを覚える方法

## 【各言語共通】2種類のインクリメントの違いを覚える方法
JavaScriptを例にして解説します。
インクリメントの演算子`++`は、変数の左側と右側どちらかにつけることが出来ますが、意味が少し違います。
以下をご覧ください。

```JavaScript
let x = 1;
x++; //1
++x; //3
```
このように、右側につける場合は`x++`の返り値としては、"元々のxの値"が返ります。
一方、左側につける場合は、`++x`の返り値としては、"元々のxの値+1"が返ります。
ややこしいですが、忘れない覚え方があります。それは「左から順に解釈する」という覚え方です。
左に変数が来る場合は元々の値で、右に変数が来る場合は先に++があるので、元々の値+1、という覚え方です。
ぜひご活用ください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Laravel初心者がLaravelでテストコードを書くまでの勉強メモ（Laravelをインストール

# WindowsでLaravelをインストールする

* 環境：Windows 10

## 準備

### XAMPPをインストールする

Windowsでphpを使うためにXAMPPを[インストール](https://www.apachefriends.org/jp/index.html)する
※XAMPPとはWEB開発に必要なソフトをまとめて扱うパッケージソフト。

* X：Windows、Linux、macOS、Solarisのクロスプラットフォーム
* A：Apache
* M：MariaDB
* P：PHP
* P：Perl

### composerをインストールする

[このページからインストール](https://getcomposer.org/download/)
途中phpを指定する手順があるので、そこでは1手順前でインストールしたXAMPPのphpを指定

## Laravelをインストール

[ここ](https://readouble.com/laravel/5.8/ja/installation.html)を参考にインストールしてみる。
コマンドプロンプトを起動して

```
composer create-project --prefer-dist laravel/laravel hoge
```
を実行する。

```
Installing laravel/laravel (v5.8.17)
  - Installing laravel/laravel (v5.8.17): Downloading (100%)
Created project in hoge
・
・なんかいろいろインストールされる
・
Application key set successfully.
```

確認するとhogeというディレクトリができていた！

```
>dir hoge /b

.editorconfig
.env
.env.example
.gitattributes
.gitignore
.styleci.yml
app
artisan
bootstrap
composer.json
composer.lock
config
database
package.json
phpunit.xml
public
readme.md
resources
routes
server.php
storage
tests
vendor
webpack.mix.js
```

早速ブラウザでチェックするために、ビルトインウェブサーバーを起動する

```
cd hoge
php artisan serve
```
を実行後、http://localhost:8000 にアクセス。
※artisanコマンド：Laravel専用のコマンドで、LaravelのControllerやModelのひな形の作成、マイグレーションの実行、サーバーの起動などいろいろやってくれる
<img width="842" alt="Laravel.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19908/9810c44d-8c90-f623-9d03-874dd1a83574.jpeg">

＼(わーいかんたん)／

上記ディレクトリ内の役割やらの確認やめちゃくちゃ簡単なアプリケーションを作成して次記事にまとめる。
PyCharm設定(pyenv + venv環境設定とGitHub連携)

[PyCharm](https://www.jetbrains.com/pycharm/)を使う時に以下の2点が少しわかりにくかったので記録しておきます。

1. pyenv + venvでPython環境を作っている場合の設定方法
2. GitHub連携方法

pyenvとvenvの環境構築に関しては、別記事[「UbuntuにpyenvとvenvでPython開発環境構築」](https://qiita.com/FukuharaYohei/items/2820f7bda6678ce26ea7)を参照ください。

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.1 LTS|Windows8.1から仮想で動かしています。<br>Windows10でも同様なことを確認|
|PyCharm|PyCharm CE 2019.1.2|Community Editionです|
|pyenv|1.2.11|2019/5/29時点で最新|


# 前提
venvでこんなpy35で仮想環境を作り、tensorflow1.13.1をインストールしました。Gitインストール済みです。

```bash
python -m venv py35
source py35/bin/activate
pip install --no-cache-dir --upgrade pip
pip install tensorflow
```

# Python Interpreter設定
Settings画面のナビゲーションエリアで「Project interpreter」を選択して右側の+ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/ddb6e6b5-31e5-e898-a040-f6d914a4851b.png)

"Add Python Interpreter"画面のナビゲーションエリアで、「Virtualenv Environment」を選択して、「<venv path>/<仮想環境名>/bin/python」 を選択します。
※今回の仮想環境名は"py35"

![10.Interpreter01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/2fd1d12b-3fb8-59bc-2d72-93a9574c2b26.jpeg)

Virtualenvを使っていないかったので、少し迷いましたがこれで大丈夫なようです。

# GitHub連携
メニューの「VCS」>「Enable Version Control Integration Dialog」から「Git」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/28fc671c-c709-7fe6-4061-cda4ff3bd2a6.png)

SettingsでVersion Control -> GitでGit実行ファイルのパスが正しく設定されているかを「Test」ボタンを押して確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/b42c4f0e-876b-2842-f9f5-73cc319c2163.png)

SettingsでVersion Control -> GitHubでGitHubアカウントを追加。
![20.Git03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/96193f9f-f7bb-d532-c61d-6d7b9455ab9a.jpeg)

ユーザ名とパスワードを入力してログイン。以上で設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/79e1db4f-a3a0-f9ae-dd83-6bc6e9951566.png)
mbed.2)  mbed【NUCLEO-F303K8】 BMX055を使って加速度、角速度、地磁気を測定する。

【NUCLEO-F303K8】 BMX055を使って加速度、角速度、地磁気を測定します。
今後、GPSと組み合わせた自己位置推定を行いたいと考えています。

さて、本題へ。

## 必要なもの
  - [NUCLEO-F303K8](https://os.mbed.com/platforms/ST-Nucleo-F303K8/)
  - 9軸センサー[BMX055](https://www.bosch-sensortec.com/bst/products/all_products/bmx055)
    - 9軸とは加速度x3次元、角速度×3次元、地磁気x3次元のことです。
    - 今回はkitを使用[秋月電子のページへ](http://akizukidenshi.com/catalog/g/gK-13010/)
    - レジストリへの書き込み・読み込みなど、様々な設定が出来るみたいです。（すべて読めてません）
  - ブレッドボード
  - ジャンパーWire
  - micro USB(F303K8への書き込み、電源用)

## 作業概要
1. 9軸センサーのハードウェア作業
1. 回路を組む
1. プログラム作成作業

## 作業詳細
- 作業1(9軸センサーのハードウェア作業)
  9軸センサーは、裏面にあるジャンパーピン(JP)によって各センサー(加速度、ジャイロ、地磁気)のアドレスが設定されます。
　秋月電子で買った場合は、説明書にあるように、以下の3つのJPをショートさせました。見ずらいですが、図の赤丸の箇所です。
    1. プルアップ抵抗を自分で設定しない場合は,JP4,5をショートさせる
    2. 電源洗濯のため、JP7をショートさせる

　　- 作業1の参考図
　　 [BMX055.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423469/a7f8bc96-9394-171f-d0b1-92fc2b68b8cf.jpeg)

- 作業2(回路を組む)
　今回はF303K8を使用し、I2C通信を行うために、それぞれを結線します。
    1. PB_7:I2C-SDA, PB_6:I2C_SCLをセンサーと結線する。
    2. 5Vと3V3の電源に、センサーのVCCと3V3をそれぞれ結線する。

- 作業3(プログラム作成)
　リンク先のライブラリが参考になりました。[BMX055](https://os.mbed.com/teams/IOTON-Technology/code/IOTON-API/file/9c7195d31602/BMX055.h/)
    1. 新規のプログラムを作成します。
    2. リンク先のライブラリのBMX055.hのみをコピーし使用しました。
    3. ただし、内部のPIN設定は異なるので、PB_7とPB_6に修正する必要があります。
　  4. ヘッダーファイルに合わせて、main関数も作成しました。
　  5. "mbed.h"は、プロジェクトフォルダ内にある`mbed`という設定フォルダが無いとエラーになるので、他のtemplateからコピーして取ってきました。

```cpp　BMX055.h
// Set up I2C, (SDA,SCL)
I2C i2c2(PB_11, PB_10);
```

```cpp　main.cpp
#include "mbed.h"
#include "BMX055.h"

BMX055 bmx;
 
int main() {
    bmx.init();
    while(1) {      
      float ax, ay, az, gx, gy, gz, mx, my, mz;
      bmx.getMotion9(&ax,&ay,&az,
                     &gx,&gy,&gz,
                     &mx,&my,&mz);
      printf("acc(%05.3f, %05.3f, %05.3f), gyro(%05.3f,%05.3f,%05.3f), mag(%05.3f,%05.3f,%05.3f)\r\n", ax, ay, az, gx, gy, gz, mx, my, mz);
      wait(1.0);
    }
    
} 

```


今後は、Madgwickフィルタとクオータニオンを学びながら実装していく予定です。(BMX055.hの中にもコードがあります。)

- 今後の方針
    - 9軸センサーを使用した"sensor fusion"(自己姿勢、自己位置推定)を行う。
    - GPSセンサーを用いて、sensor fusionの精度を上げる。
    - SDカードへの保存を行う。
    - wifiを搭載しソケット通信を行い、クラウドとの連携を行う。
rmでしくじらない方法

#定期的にやらかすやつ

```shell
myuser@myhost:greatlib$ make
...
prog.cc:1:10: fatal error: missed_header: No such file or directory
```

僕「ダウンロードして解凍して手順通りmakeしてるだけなのに、コンパイルがうまくいかんなあ。includeとか見てみるか」

```shell
myuser@myhost:greatlib$ cd /usr/include
myuser@myhost:include$ ls
...
``` 

僕「ライブラリあるはずなのになあ、うまくいかんし、どうすればええんや、とりあえず戻っとこ」

```shell
myuser@myhost:include$ cd 
```

（ここでちょっと考え込む）

僕「もういっそやり直すか、とりあえず中間ファイル全部消しとこ」

```shell
myuser@myhost:~$ rm -rf *
```

僕「さて、ホームに戻って...あれ、なんか時間かかったな、やな予感がする」

```shell
myuser@myhost:~$ ls
myuser@myhost:~$
```

僕「...やらかした」

# 惨劇の原因
まず第一に**ワイルドカード**で指定してしまったこと。特に\*は**任意の文字列を表すので**、間違えたディレクトリで使うと必要なファイルも全部指定してしまいます。

第二に**-rf**というフラグ。rは**再帰的にディレクトリも削除する**、fは**確認なしで削除する**というフラグなので、```rm -rf```は指定されたファイルを血も涙もなく押し流します。

第三に**状態がわからない状態で時間がかかるのを放置したこと**。気づけば途中で止めれたかもしれません。後の祭りという感じがありますが...。

# 対策
とはいえ、「```rm -rf *```を使わない」と決めると非常に困ります。今回もそうですが大量のファイルを消すときに-fオプションを使わないと、yを100回以上押さないといけなくなることもあります。

-rを使わないと

```
rm: cannot remove 'hoge': Is a directory
```
と表示されて「あ"！？ディレクトリやからなんやねん！？」となります。

## -vフラグも立てる
根本解決にはなりませんが、ミスってやばいことになると滝のような通知が表示されるので、運がよければ重要なファイルが消える前に```Ctrl+c```で止めることができます。

```shell
myuser@myhost:~$ rm -vrf *
removed directory 'hoge'
removed 'hoge1.txt'
removed 'hoge10.txt'
removed 'hoge100.txt'
removed 'hoge11.txt'
removed 'hoge12.txt'
removed 'hoge13.txt'
removed 'hoge14.txt'
^C
myuser@myhost:~$ ls
important_files hoge001 fuga001 documents
```
## -Iフラグを立てる
rmには-Iというフラグがあります（-iとは異なる）。これは4個以上のファイルを削除しようとしたときにだけ該当するファイル数を表示して確認するというもので、ミスって消そうとすると大量のファイルがヒットして確認が求められます。ただしファイルごとにyと答えないといけない-iと異なり、一度yと押すと全削除が実行されます。

再帰的削除の場合はファイル数に関係なく確認してくるので、-rと併用すると常に確認が表示されます。だが一度押すといいし、大事なファイルを消さないことを考えると仕方ないような気もします。

```shell
myuser@myhost:~$ rm -vrfI hoge*
rm: remove 100 arguments recursively? n
myuser@myhost:~$
```

# 参考
* rmの-fオプションで泣かないために<br>https://qiita.com/morihirok/items/48651c4c7b14cd7d5689

やっぱりプログラマは誰もが通る道ですね :-(
ハマりメモ：bootstap-vueでb-imgのsrc属性に相対パスが指定出来ない。

# bootstap-vueでb-imgのsrc属性に相対パスが指定出来ない。

結論から言えば、Bootstrap-vueでは、2019/5/31現在、デフォルトではsrc属性に相対パスを指定しても、画像が表示されません。


vue-loaderの設定を少し書き加える必要があります。

## ハマり発生

「ここにテキストをここに画像を貼って２カラムのレイアウト作るぞ。」

```pug:hoge.vue
<template>
  b-container.hoge-container
    b-row(align-v="center").hoge-contents
      b-col(md="6")
        p hogehoge
      b-col(md="6")
        b-img(fluid src="../static/images/hoge.jpg" alt="hoge")
</template>
```

上手くいきません。

ググります。

公式にありました。
> https://bootstrap-vue.js.org/docs/reference/images/

## 解決方法

大体の内容は、vue-loaderは```<img>```タグのsrc属性のに相対パスを書いても自動的に変換するけど、BootstrapVueカスタムコンポーネントの場合は自動的には変換しませんよ。

不親切です。
```b-img```何て特別な書き方してて、ただでも初級者には、bootstrapやっとうろ覚えてきたに、また方言〜というところなのに、デフォルトでは使えないから、よろしくね、なんて。。。

気をとり直して読んでいくと、Vue-Loaderのoption設定で```b-img```とか```b-card```とかに相対URLが結びつくように設定してよとVue-CLI3とNuxtでの設定方法が書いてありした。

```js
module.exports = {
  build: {
    extend(config, ctx) {
      const vueLoader = config.module.rules.find(rule => rule.loader === 'vue-loader')
      vueLoader.options.transformAssetUrls = {
        video: ['src', 'poster'],
        source: 'src',
        img: 'src',
        image: 'xlink:href',
        'b-img': 'src',
        'b-img-lazy': ['src', 'blank-src'],
        'b-card': 'img-src',
        'b-card-img': 'img-src',
        'b-card-img-lazy': ['src', 'blank-src'],
        'b-carousel-slide': 'img-src',
        'b-embed': 'src'
      }
    }
  }
}
```

これで画像が表示されました。

またrequire使っても出来るようです。


```pug
b-img(:src="require('../static/hoge.jpg')")

b-card-img(:img-src="require('../static/picture.jpg')"
```

## まとめ
デフォルトで当たり前のよう出来そうな事が案外出来ないですよね。

webpackの周りの復習が出来たし、Nuxt、vue-loaderの公式の今まで読んでなかったページをまじまじと読めたので良かったという事にします。

## 該当箇所のソースです。

----
Nuxt　=>  https://ja.nuxtjs.org/api/configuration-build/
bootstrap-vue =>  https://bootstrap-vue.js.org/docs/reference/images/
vue-loader => https://vue-loader.vuejs.org/options.html#transformasseturls
Golangで簡単にPrometheusのExporterを作れる。

# 移動
勝手ながら、以下に移動いたしました。

こちらをご覧いただけると幸いです。
https://ryo-xjsbx.hatenablog.com/entry/prometheus-exporter-with-golang?_ga=2.121151368.1491172660.1586781023-819593473.1552544309
[量子コンピュータ関連] 古典力学 + 電磁気学 + ド・ブロイ波 + 境界条件から磁束量子を導出する

# 概要

D-Wave量子コンピュータで少し(?)注目を浴びた**磁束量子**。量子力学では観測量が量子化されます。つまり磁束(磁場x面積)も量子化されて、とびとびの値になるのです。このとびとびの値の基準となるものを磁束量子と呼びます。具体的な値としては

```math
\Phi_0 = \frac{hc}{2e} \sim 2.07 \times 10^{-7} \rm{[G cm^{-2}]} \tag{1}
```

です。ここで$\hbar, c, e$はそれぞれプランク定数$h$を$2\pi$で割ったディラック定数、光速の大きさ、電気素量です。これを古典力学と電磁気学、そして量子力学の入り口で必ず習うド・ブロイ波を利用して導出してみましょう。以下ではcgs単位系で説明していきます。

# いざ、物理の世界へ

## 古典力学、円運動している電荷に働く遠心力

以下の図のように、磁場中で等速円運動している電子(電荷$-e$, 質量$m_e$)を考えましょう。

![スクリーンショット 2019-05-31 午後10.54.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/31007585-2e04-f8a8-752a-c4bf2311d045.png)

円運動している電子に働く、遠心力の大きさは

```math
m_e \frac{v^2}{r}
```

と書かれます。ここで、$v$は電子の速度、$r$は円運動の半径です。

## 電磁気学、電子が磁場中を運動することにより働く力

高校物理のフレミングの左手の法則を思い出すと、電子に働くローレンツ力は

```math
-ev \frac{B}{c}
```

となります。cgs単位系なので、磁場の大きさが$1/c$倍されていることに注意してください。

## 再び古典力学、力の釣り合い

電子が等速円運動を行うためには、上の２つの章で説明した二つの力が釣り合っている必要があります。すなわち

```math
m_e \frac{v^2}{r} = e v \frac{B}{c}
```

です。これを式変形して

```math
m_e v = \frac{eB}{c} r
```

## 量子力学、ド・ブロイ波

量子力学では運動量$p$を持つ物質は、波数$k (= 1/\lambda)$の波として

```math
p = m_e v = \hbar k = \frac{\hbar}{\lambda}
```

と表されることが知られています(これは受け入れましょう)。ここで$\lambda$は波長を表します。これをド・ブロイの物質波と呼びます。

## 式変形

これらの数式から

```math
\frac{\hbar}{\lambda} = \frac{eB}{c} r \tag{2}
```

# 境界条件

量子力学から、重要な境界条件が発生します。それは「電子が一定の半径の場所で等速円運動しているなら、それは定在波であるべき」というものです(下図参照)。

![スクリーンショット 2019-05-31 午後10.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/20349a99-0187-13e3-c0e8-7fa97e431356.png)

もし電子が定在波でなければ、一周回ってきた波動関数と一周前の波動関数が干渉して、打ち消しあってしまいます。波動関数が打ち消しあうということは電子の存在確率がなくなってしまうことを意味しますので、電子が一個等速円運動をしているということと矛盾してしまいますね。
この条件から

```math
2\pi r = \lambda n \tag{3}
```

となります。ここで$n$は1波長の数、すなわち正の整数です。

# 磁束量子

(2), (3)式の変形を行うことによって

```math
\pi r^2 B = \Phi_0 n
```

という式を導出することができます。ここで左辺は半径$r$の円の面積 x 磁場ですから、これは磁束を表します。見事に磁束が量子化されている式を導くことができました。

# これをどのように量子コンピュータに応用したのか？

厳密には磁場の向きには、上向き・下向きが存在しますから、$n = 0, \pm 1, \pm 2 \cdots$のようにマイナスも取りうることになります。
D-Waveのような磁束量子ビットを原理として用いているものでは、$-\Phi_0$をスピンがダウン、$\Phi_0$をスピンがアップの状態として扱っているのです。

# 結言

古典力学、電磁気学、量子力学の根幹でありながら最初の方で必ず学ぶド・ブロイ波、そして境界条件からこうあるべき、という式から、磁束量子を導出することができました。
文系学生のプログラミング学習4日目

#JavaScript勉強

今日も引き続きJavaScriptを勉強しました。ドットインストールで「パスワードジェネレーター」という自動でパスワードを生成してくれるものです。

今回はif,for文を使ってランダムに数字やアルファベット、記号を使ったパスワード作成を作りました。ドットインストールのに習って作っているので出来るのは当たり前とは言え、「ここではこれを使うのだろうな」というのが分かってきたり、書いたコードを後から見返してなにをつくろうとしているのかが、少しづつ分かるようになってきました。

ドットインストールの無料で出来るものが残り少なくなってきたので、明日からは並行してprogateでRubyを勉強しようと思います。

とにかく実践あるのみですね。

終わり
Rubyで合体ナンプレを解いてみた-その１(導入)

今回は導入です。

Rubyの勉強を始めたのですが、何か目標をもってやりたいと思ったので、
数独・ナンプレを解くアルゴリズムを開発してみました。
[数独とは] (https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AA%E3%82%B6%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF)

こちらは作成中のサイトです。
[数独解答サイト] (https://www.sentohsharyoga.com/)

合体ナンプレを自動で解くアルゴリズムまで紹介できばと思っています。
よく使う！Gitコマンドまとめてみた

Railsチュートリアルを進めていて定期的にGitのコマンドを使うのと、最近業務でもGitを使う機会があったのでよく使用するコマンドをまとめてみました。
##add
ワーキングスペースからファイルなどをステージへ移動する

```
// ファイルをまとめて指定する
 git add .

// 識別子がhtmlのファイルをまとめて指定する
git add *.html

// ファイルを指定する
git add [ファイルパス]
```

##commit
ステージに追加された変更をリポジトリに保存する

```
// ファイルをまとめて指定する
 git commit .

// ファイルを指定する
git commit [ファイルパス]

// 直前のコミットを取り消す
git commit -a

// コミットメッセージを入力する
git commit -m "[コミットメッセージ]"
```

##push
ローカルリポジトリからリモートリポジトリへ変更を反映させる

```
// プッシュする
git push [リモートリポジトリ名] [ブランチ名]

// originリポジトリのmasterブランチへプッシュする
git push origin master
```

##clone
既存のGitリポジトリのコピーを取得する。リモートリポジトリをローカルリポジトリとして保存する

```
// クローンする
git clone [URL]
```

##init
リポジトリを新規に作成する。

```
// 初期化する
git init
```

##branch
ブランチを作成する

```
// ブランチを作成する
git branch [ブランチ名]

// ブランチの一覧を表示する
git branch

// ブランチ名を検索する
git branch --list '検索ワード'

// ブランチ名を変更する
git branch -m [変更前ブランチ名][変更後ブランチ名]

// ローカルブランチを削除する
git branch -d [ブランチ名]
```

##merge
マスターブランチに各ブランチで編集した作業を反映させる

```
// マージする
git merge [ブランチ名]

// コンフリクトが生じコミットが行われていない状態でマージを中断する
git merge --abort

// コンフリクトを解決しマージを再開する
git merge --continue
```

##checkout
作業ブランチを切り替える。指定したコミットの状態を現在の作業ツリーに展開する

```
// masterにブランチを切り替える
git checkout master

// 新規ブランチの作成と切り替えを行う
git checkout -b [ブランチ名]
```

##status
ファイルの更新状態などを確認する

```
// 全体の変更を確認する
git status

// 特定のファイル・ディレクトリの変更を確認する
git status [ディレクトリパスorファイルパス]
```

##fetch
リモートリポジトリから最新情報をローカルリポジトリに持ってくる

```
// フェッチする
git fetch [リモートリポジトリ名] [ブランチ名]

// originリポジトリのmasterブランチへフェッチする
git fetch origin master
```

##pull
git fetch と git merge を連続で実行する

```
// プルする
git pull [リモートリポジトリ名] [ブランチ名]

// originリポジトリのmasterブランチへプルする
git pull origin master
```

##reset
コミットした内容を取り消す

```
// 指定したファイルをステージングから削除
git reset [ファイル名]
```

## diff
2つのファイルを比較して違いなどを探す。マージ前などに行う。

```
// リポジトリの中にあるファイル全てを比較する
git diff

// 特定のファイルを比較する
git diff [ファイル名]
```

##stash
別のブランチに切り替えて作業をする際に変更を一時的に退避することができる

```
// 変更ファイルを退避する
git stash

// 現在のどの変更を退避しているかを確認する
git stash list
```

##終わりに
各コマンドの基本的な使い方をまとめることができました。Gitにもう少し慣れてきたら各コマンドごとにオプションをまとめてみたいです。
DockerCompose コンテナ間接続

##概要
Dockerコンテナ間で通信をしたい場合のDockerComposeの書き方です。
DB用のコンテナとWeb用のコンテナを分けて使う場合に使ってます。
今回、DBはPostgreSQLを使いますが、基本的にどのDBも同じはずです。

##実行環境
Centos 7.6

##DockerCompose

### docker-compose.yml
```
version: '3.7'
services:
  myapp-db:
    image: postgresql11:1.0.2
    container_name: myapp-db
    privileged: true
    command: /sbin/init
    networks:
      - mynet

  myapp-server:
    image: server-image:1.0
    container_name: myapp-server
    privileged: true
    command: /sbin/init
    depends_on:
      - myapp-db
    networks:
      - mynet

networks:
  mynet:
    driver: bridge
```

myapp-serverにはdepends_onでmyapp-dbを指定し、接続できるようにする。

###起動

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

### 確認

PostgreSQLを起動したあと、
Webのコンテナに接続し、接続コマンドで接続できるか確認する。
PostgreSQLの場合は下記を試す。

```
$ psql -h myapp-db -U postgres
```

接続できればOKです。
できない場合はdbにpingうってみて届いているかどうか確認してください。
もし届いている場合は、db側の設定が間違えている可能性があります。
例えば、起動していない、localhost以外からの通信を遮断しているなどが考えられます。
pg_hba.confで接続が許可されているか確認してみてください。

##終わりに
linkオプションで接続する方法もあるが、linkオプションはdeprecatedらしいのでもう使わないほうがいいかも。
docker-composeで起動できれば起動の手間が省けるのでいいですね。
[設計]要求から要件へのトレース手順について_要件定義

# はじめに

システム開発をするとき、どんな開発手法であれ最初に行う重要な作業に「要件定義」があると思います。
この要件定義の品質が、その後のシステム開発およびエンジニア達の命運を左右すると言っても過言ではないと個人的には思ってます。それくらい重要です。
リーダーが質の高い要件定義を準備し、メンバーとのコミュニケーションもしっかりしていたら、エンジニアはとても安心して開発できます。

今回は、こちらの書籍を読んで参考になった要件定義の仕方をご紹介します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84601/6eb47894-5899-16e3-0b5a-35fa689197e1.png)

# 要求と要件の違いを認識する

システム設計にあたり最初に行うべきことは、

- 「要求」に基づいて「要件」を固めること
- その過程でどのような分析・検討が行われ、意思決定されたかトレース（振り返り）する

「要件」がどのような経緯で意思決定されたかをトレースできることが重要で、この作業は今後の設計方針を決定づけるためにも大切です。

そして、システムに対する「要求」と「要件」の違いは以下のように定義されてます。

**「要求」 = ユーザがシステムで実現したいこと、つまり欲しい機能
「要件」 = 要求に基づき、制約を踏まえてシステムに盛り込むべきもの、つまり本当に要る機能**

この定義の違いはとても重要です。
これらを混合して要件定義をしてしまうと、システムの後戻りが発生したり、工数が大幅に増えて最悪デスマーチに陥ります。
こんなはずじゃなかった！！とならないために、この違いは常に意識するべきです。

つまり全ての「要求」が整理されて「要件」になり、然るべき制約の中で**実現可能な「要求」だけが「要件」として纏められるべき**です。


# 要求を丸呑みしないこと

上記を踏まえ、要件定義ではユーザの言うことを何でも丸呑みにして要件にしてシステムに実装しようとすると、結果的にシステムが破綻する恐れがあります。

繰り返しになりますが「要求」と「要件」は違うのです。
ユーザから引き出した要求に制約を加味して要件へと落とし込むことが、要件定義の最大のポイントです。
だから「要件定義」であり、「要求定義」ではないのです。

# 要求から要件へのトレース

次に要件に落とし込んだ手順や経緯、誰が意思決定したかなど、全員がトレースできることも重要です。
これは後から言った言わない問題や、チーム間での認識齟齬を減らすことにも有効です。
それらを踏まえて、具体的な「要件定義」の手順をステップ毎に解説します。

## step1 経営の要求を把握する

まず「要求」をヒアリングなどで把握して、その内容を「要求一覧表」とでも名付けた表に纏めます。
ここでは、経営からのビジネス要求を最優先に、トップダウンの意思を優先します。

## step2 要求の発生源を明確にする

要求について、発生部門および担当者を明確にします。
その際、その要求を満たすことが経営課題の解決につながるものを優先事項としてチェックします。

## step3 要求の背景にある課題を明確にする

step1、2で把握した要求の背景をきちんと認識して、課題や問題点を明確にします。

## step4 要求の目的、理由を明確にする

ユーザが問題としている事が、実際には問題ではない場合もあります。
あくまで経営課題の解決につながる要求について、原因や理由を明らかにします。

## step5 要求のランク付け

要求を洗い出した時点で、ひとまず以下の評価基準に照らして、それぞれ重要度合を5段階にランク付けします。
「5」が重要度が最も高いものとします。

考慮すべき点はこれらです。

- 経営およびビジネスに与える規模
- 緊急度
- 課題解決に要する規模

## step6 要件とすべき要求を選択する

例えば、次のような要求はすぐに要件とせず、差し戻すことも考慮します。

- システムで対応すべきはない要件

→社内の制度的制約・組織的制約・市場的制約

- システムの対象ではあるが、対応すべきではない

→既に対応中、もしくは対応することにより別案件に影響があるもの
→規模が大きい、他への影響も大きい、予算がかかる、納期まで時間がないもの

## step7 要件の確定

システムで実現すべき要件を定め、実現へ向けた対応方針を要件定義書としてドキュメント化してみます。

## step8 要件を要求に紐づけする

どの要求がどの要件で実現されるのか、トレースできるように一覧表へ纏めます。

## step9 要件と成果物の内容を確認する

可能であれば、後の工程で作成する成果物との間で、要件がどのように実現されたかを確認できるレベルまで、詳細かつ具体的に記載します。ただしこの作業のやる・やならい、粒度などは臨機応変で構いません。

## トレースできる一覧表のサンプル

書籍に掲載された、要求要件追跡書のサンプルイメージです。
またドキュメントとしてこの追跡書を作成する場合は、要件定義書に含めて作成し、管理することが望ましいです。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84601/72069f3d-3442-8487-21e3-dafd49540084.png)

# まとめ

- 「要求」と「要件」の違いをきちんと理解する
- 「要求」から「要件」へのトレースを可能にする
- 「要件」の実現によりプロジェクトの目的を果たせるか、メンバーのモチベーションを統率できるか確認する

# さいごに

今回ご紹介したのは、システム開発におけるほんの最初の一部分だけです。
ですが、この最初の要件定義がシステム開発においてはとても重要なので、敢えてピックアップしました。
これ以降の設計工程にも興味がある方は、「システム設計のセオリー」を読んでみて下さい。

この記事が少しでもお役に立てれば幸いです。
最後まで読んで頂き、ありがとうございました。
ELB使ってる人はすぐにKeepAlive Timeoutの値を確認しよう

## TL;DR
- ELBはクライアントからのリクエスト時に、クライアントとバックエンドとのコネクション2つを維持する
- 両方の接続について、**アイドルタイムアウト値はデフォルトで60秒**となっている
- バランシング先のNginxなどの**KeepAlive Timeout値は、ELBのアイドルタイムアウト値より大きくなければならない**
- もしELBのアイドルタイムアウト値より小さい場合、504 Gateway Timeoutエラーが返ってくる
- この**504エラーはALBのログには書き込まれない**ので、きちんとALBのステータスコードを監視するべき

## ELBのコネクション

図にするまでもないが、ELBにおけるTCPコネクションは以下のようになっている。

![elb-connection](https://www.plantuml.com/plantuml/png/0/PSr12eD038NXVKwH2mYkN9HI75tQIuoP1nr84z7OyxVQfTltFVZxBV8Q-riPEZVYPf2eRaHPmbSUjSA2H7qld9u3cHTmMhAyGFHNlZUFm_Z64x0ahHzmrsvqRAUTzmjJ3ok_z1S0 "elb-connection")

### KeepAliveとは
まずはKeepAliveについて振り返っておく。**KeepAliveとはクライアントとサーバー間での接続が有効であるかを確認するために一定周期で行う通信のこと**である。
そしてApacheやNginxなどのサーバーには、KeepAlive接続時のリクエスト待ち時間を設定できるKeepAlive Timeoutという項目がある。このKeepAlive Timeoutを60秒にした場合、KeepAlive接続中のクライアントから60秒間リクエストがなければTCPコネクションを切断するようになる。

ELBのアイドルタイムアウトというのも、このKeepAliveTimeoutと同一のものである。

## ELBのアイドルタイムアウト値より小さい場合の挙動
もしバランシング先のApacheのKeepAlive Timeoutが、ELBのアイドルタイムアウト値より小さい場合には504エラーが起こりうる。例えばELBのアイドルタイムアウト値を60秒、Apache側のKeepAlive Timeout値が15秒とする。

![elb-connection-bad](https://www.plantuml.com/plantuml/png/0/FSv12i8m40NG_PnYBX3GXIv4fD6Lr6Kla2O31gOpfPbuVjDMN7puyFxYTyN2OdLY91vTL16AbbNS6190YAOBFZYJ64JMcj2_xY2Q2FqSufi0TiMhkstMWclT52_uJ4n3daYhuVbGu0VxkdbFD7lEd__eU2e07Kbgfxu0 "elb-connection-bad")

上記のような場合で、クライアントから15秒間リクエストがない状態を考えてみる。Apache側はKeepAlive Timeout値が15秒なので、ELBとのTCPコネクションを切断する。しかしELB側はKeepAliveTimeout値が60秒以上を想定しているので、KeepAliveによる一定周期の確認前にリクエストが来てしまうと、Apache側から切断されてもう使えないTCPコネクションを利用しようとしてしまう。これによってELBは504 Gateway Timeoutエラーを返すのだ。

KeepAliveの確認の周期はなにかで定められている訳ではないが、1秒ごとに行われるのが一般的だ。（ALB側がどのような周期で確認しているかは分からないが）

## ALBのログには記録されない
上記によって起こる504エラーはALBのログとして残らない。そのためきちんとCloudWatchによって、ALBが返すステータスコードを監視しなければならない。

ALBには「HTTPCode_ELB_5XX_Count」と「HTTPCode_Target_5XX_Count」がある。前者はALB自体が返すステータスコードで、後者はターゲットグループつまりアプリケーション側が返すステータスコードを記録している。前者には後者である「ターゲットグループが返すステータスコード」は含まれていないので、**両方にアラートを設定して監視するのが望ましい。**

## 結論
サーバーはちゃんと監視しような…。
上の放置してたら1時間に1回ぐらい504エラーが出てた、なんてこともありえる。というか自分がそうだった。

### 各サーバーのKeepAlive Timeout 設定方法
- Apache: https://httpd.apache.org/docs/2.4/ja/mod/core.html#keepalive
- Nginx: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
- H2O: https://h2o.examp1e.net/configure/proxy_directives.html#proxy.timeout.keepalive
【PHP】大量のファイルがあるディレクトリ内から高速にファイルのパスを取得する

## コード

Linux 環境であれば、`exec()` と `find` コマンドとを組み合わせるだけです。

```php
$pathAry = [];
exec('find /path/to/dir -type f', $pathAry);

print_r($pathAry);
```

`exec('find ...', $array);` とすると、`$array` で結果を配列で受け取れる辺り、いかにも PHP らしいと思います。

--------------------------------------------------------------------------------

## 実用例

以下は、大量のファイルがあるディレクトリ内から、.htaccess ファイルを探し出し、その中身をファイルに書き出す例です。

```php:find_htaccess.php
#!/usr/local/bin/php
<?php
//-- findコマンドの設定
$findAry = [
    'find' => '/path/to/dir',    // 検索対象ディレクトリ
    '-maxdepth' => '4',          // ディレクトリを掘る深さ
    '-type' => 'f',              // ファイルのみを対象とする
    '-name' => '.htaccess',      // 検索対象ファイル名
];

//-- 実行結果保存ファイル
$resultPath = __FILE__ . '.result.txt';

//-- 実行結果保存ファイルの作成
if (is_file($resultPath)) {
    file_put_contents($resultPath, '');
} else {
    touch($resultPath);
}

//-- findコマンドを生成
$command = '';

foreach (array_map('escapeshellarg', $findAry) as $opt => $val) {
    $command .= "{$opt} {$val} ";
}

//-- findを実行しその結果を受け取る
$pathAry = [];
exec($command, $pathAry);

//-- 見つかったファイルの中身をファイルへ書き出す
foreach ($pathAry as $path) {
    file_put_contents(
        $resultPath,
        "▼{$path}\n" . file_get_contents($path) . "\n\n" . str_repeat('-', 60) . "\n\n",
        FILE_APPEND | LOCK_EX
    );
}
```

--------------------------------------------------------------------------------

## 使い方

```bash
$ chmod +x ./find_htaccess.php && ./find_htaccess.php
```

これ、PHP で書く必要ある？とか野暮な事は言わないよう(笑)

--------------------------------------------------------------------------------

### 余談

PHP から指定ディレクトリ内のファイルパスを取得する方法について、[軽くググってみる](https://www.google.co.jp/search?q=PHP+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA+%E3%83%91%E3%82%B9+%E4%B8%80%E8%A6%A7&ie=UTF-8)と…

- `glob()`
- `scandir()`
- `opendir()` ～ `readdir()`

…について書いてある記事が大半で、[DirectoryIterator](https://www.php.net/manual/ja/class.directoryiterator.php) に触れている記事すらあまり無いようです。


Linux 環境なら `exec()` と `find` コマンドとを組み合わせるだけですので、簡単な検索条件なら `glob()` 並の手軽さだと思います。しかも、`glob()` よりも遥かに高速です。（上記 4 つの中では `glob()` が最も遅い筈。）

もちろん、`find` コマンドを極めれば、もっと複雑な条件でも検索が可能ですが、記事の趣旨からそれるため、[ググった結果](https://www.google.co.jp/search?q=qiita+find+Linux&ie=UTF-8)でお茶を濁しておきます。
Cygwinを楽に更新する方法（setup.exeを含む）

# これは何？
Cygwinを更新する場合、ダウンロードした`setup-x86_64.exe`を起動すればいいんだけど、たまに「`setup-x86_64.exe`が古い」とメッセージがでるので、`setup-x86_64.exe`を含めて更新させるバッチファイル＆スクリプト。

# 必須パッケージ
Cygwin の curl

# バッチファイル
やっていることは次の３つ。

- ダウンロード先のパスの決定（「ダウンロード」フォルダ内）
- 下記ダウンロードスクリプトの起動
- ダウンロードした`setup-x86_64.exe`の起動

```update_cygwin.bat
set cygwin_path=%SystemDrive%\cygwin64
set setup_path=%USERPROFILE%\Downloads\Cygwin.setup-x86_64.exe

%cygwin_path%\bin\bash.exe --login %cygwin_path%\home\%USERNAME%\bin\update_cygwin.sh %setup_path%
%setup_path%
```

# スクリプト
上記バッチファイルで指定されたファイル名で`setup-x86_64.exe`をダウンロードするスクリプト。

```shell:update_cygwin.sh
#!/bin/sh

setup_path=`cygpath -u "$1"`

curl https://cygwin.com/setup-x86_64.exe -o $setup_path
chmod +x $setup_path
```
グラフ描画（Boost Graph Library + Graphviz  利用）

こんにちは。
[Boost Graph Library](http://www.boost.org/doc/libs/release/libs/graph/doc/index.html) ＋ [Graphviz](https://en.wikipedia.org/wiki/Graphviz) を使い、グラフ描画してみました[^1] [^2]。
![graphviz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/81101f36-a626-3d68-d801-e61b5785e20b.jpeg)

[^1]: なおもしも、 このコードで、```add_edge``` へ与える vertex 番号を連続させずスキップさせると、スキップされた孤立 vertex が生じます（例えばコード内の ```5``` を ```6``` へ置き換えると、孤立した ```5``` が描かれます）。
[^2]: "[How to use boost make_label_writer to write edge properties?](https://stackoverflow.com/questions/51138794/how-to-use-boost-make-label-writer-to-write-edge-properties)" (Stack Overflow) も参考になります。

```console
$ g++ -std=c++11 -I/usr/local/include graphviz.cpp
$ ./a.out; dot -Tpdf graphviz.dot -o graphviz.pdf
```

```graphviz.cpp
#include <boost/graph/graphviz.hpp>
#include <boost/range/adaptor/indexed.hpp>

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, int64_t, int64_t> graph_t;

int main()
{
    graph_t g;
    std::vector<std::array<int, 2>> edges = {{0, 1}, {0, 2}, {0, 3}, {1, 2}, {2, 1}, {3, 4}, {3, 5}};
    for(auto&& it : edges | boost::adaptors::indexed()){
        auto eid = it.index();
        auto u = it.value()[0];
        auto v = it.value()[1];
        auto e = add_edge(u, v, eid, g);
        ename[e.first] = std::to_string(eid);
    }
    std::string fname = "graphviz.dot";
    std::cout << "writing " << fname << '\n';
    std::ofstream file(fname);
    boost::write_graphviz(file, g);
    boost::write_graphviz(file, g, boost::default_writer(), make_label_writer(boost::make_assoc_property_map(ename)));
}
```
Laravel初心者がLaravelでテストコードを書くまでの勉強メモ（Laravelとは

## 背景

* 品質管理の一貫でLaravelで作成したwebサービスのテストコードをかけるようになりたい
* 品質管理の一貫でLaravelで作成したwebサービスをLaravel Duskを使ってテストをしてみたい
* とりあえずテストコードを書く。ではなくてきちんとLaravel全体の仕組みを理解しておきたい

## Laravelとは

* Laravel は、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークである。LaravelはMITライセンスの下でリリースされており、そのソースコードはGitHubにホスティングされている。
（[Wikipedia](https://ja.wikipedia.org/wiki/Laravel)より）
* 世界的に人気([GitHub](https://github.com/laravel/laravel)でのスター獲得数がPHPフレームワークの中で最も多い)なPHPフレームワーク
* Laravelをインストールするにはcomposerを使う

### MVCって

* Model、View、Controllerの略で、ユーザーインターフェイス（UI）を持つアプリケーションソフトを実装するためのデザインパターン
 * Model：メインロジック、データ連携
 * View：入出力
 * Controller：Model・Viewの制御

### Composerって

* PHPのパッケージ管理システム
* 開発に必要なライブラリをそれぞれインストールしてくる必要があるが、
composerがあればコマンド一発で必要なライブラリ群をインストールしてくれる


その他いろいろな記事を読んだが、とりあえず便利で簡単でなういPHPフレームワークらしい。
早速手元のWindowsPCでLaravelをインストールし、初期画面を出すまでをトライし次記事にまとめる。
React.js内でGoogle Mapの現在地を表示する

#やりたいこと
React.jsとGoogle Map APIを使って現在地を表示させる。

#準備
```
yarn add google-maps-react
```
react.jsの環境で使えるライブラリはいくつかありますが、色々試してみて、
[google-maps-react（https://www.npmjs.com/package/google-maps-react）](https://www.npmjs.com/package/google-maps-react)
というライブラリが使いやすかったのでこれを採用します。（似たような名称のものがいくつかあります）

#まずはGoogleマップをロード
下のコードをコピペで、東京駅にマーカーがセットされた状態でGoogle Mapが表示されます。
GitHubなど使う場合、APIキーは.envファイルなどの別ファイルに記入してください。

```js

import React, { Component } from 'react';
import { GoogleApiWrapper, Map, Marker } from 'google-maps-react';

class GoogleMap extends Component {
  render() {
    return (
      <Map
        google = { this.props.google }
        zoom = { 14 }
        center = {{ lat: 35.681236, lng: 139.767125 }}
        initialCenter = {{ lat: 35.681236, lng: 139.767125 }}
      >
        <Marker
          title = { "現在地" }
          position = {{ lat: 35.681236, lng: 139.767125 }}
        />
      </Map>
    );
  }
}

export default GoogleApiWrapper({
  apiKey: ("<Google MapのAPIキーをここにコピペ>")
})(GoogleMap);
```
#現在地を取得
下のコードをコピペで、現在地を表示してくれます。
`navigator.geolocation.getCurrentPosition()`を用いて、JavaScript側で現在地を取得しています。

```js

import React, { Component } from 'react';
import { GoogleApiWrapper, Map, Marker } from 'google-maps-react';

class GoogleMap extends Component {
  state = {
    lat: null,
    lng: null
  }

  componentDidMount() {
    navigator.geolocation.getCurrentPosition((position) => {
      this.setState({
        lat: position.coords.latitude,
        lng: position.coords.longitude
      });
      console.log(position.coords);
    },
    (err) => {
      console.log(err);
    })
  }

  render() {
    return (
      <Map
        google = { this.props.google }
        zoom = { 14 }
        center = {{ lat: this.state.lat, lng: this.state.lng }}
        initialCenter = {{ lat: this.state.lat, lng: this.state.lng }}
      >
        <Marker
          title = { "現在地" }
          position = {{ lat: this.state.lat, lng: this.state.lng }}
        />
      </Map>
    );
  }
}

export default GoogleApiWrapper({
  apiKey: ("<Google MapのAPIキーをここにコピペ>")
})(GoogleMap);
```

#ポイント
- `navigator.geolocation.getCurrentPosition()`を`componentWillMount`内に書いてる記事もありましたが、それだとうまく行かなかったので、`componentDidMount`内に書きました。
- Mapコンポーネントに`center`と`initialCenter`を両方記載してますが、どちらか片方だとうまく行かないことがありました。

#まとめ
今回はやりたいことを最小構成で実装しましたが、[ドキュメント(https://www.npmjs.com/package/react-geocode)](https://www.npmjs.com/package/react-geocode) を確認しながらいろいろ試してみると面白いです。

#参考
- https://developer.mozilla.org/ja/docs/Web/API/Geolocation/getCurrentPosition
- https://www.npmjs.com/package/react-geocode
picoCTF2018 writeup (Ext Super Magic)

自力では手も足も出ませんでした．
以下のWriteupを参考にしました．

- [picoCTF2018 250~275pt問題のwrite-up](https://kusuwada.hatenablog.com/entry/2019/03/13/012137#section1)

# 問題

ディスクイメージが与えられます．
中が壊れているので，修復してフラグをゲットしてほしいとのこと．

#　解く手順

1. ディスクイメージのsuper-blockを書き換える．
2. `debugfs`でJPEGファイルを取り出す．

##  ディスクイメージのsuper-blockを書き換える．

`file`でみてみると，全体としてはext2で，中にJPEGのデータが大量に存在します．
`binwalk`でJPEGを取り出しても，意味のない画像ばかりが抽出されます．

```bash
$ binwalk -D "jpeg:jpg" ext-super-magic.img 
```

ヒントに従って，`fsck`を実行します．
ext2なので，`fsck.ext2`になります．
しかし，スーパーブロックが壊れている旨が表示されます．
`e2fsck`を試すように言われますが，意味なし．

スーパーブロックが0埋めされているために，ext2だと認識できていないらしいです．
ext2では，スーパーブロックのoffset 56 にマジックナンバー 0xef53 が入ります．
したがって，バイナリエディタでイメージファイルを編集します．
Macを使用していたので，Hex Friendを使いました．
スーパーブロック自体のoffsetは1024なので，1024 + 56 = 1080 番目から2バイト分を書き換えます．

再度`file`で見てみると，ext2のイメージだと認識してくれました．

## `debugfs`でJPEGファイルを取り出す．

最後のヒントに従って，`debugfs`を実行します．
よく見ると，`flag.jpg`というファイルがあることがわかるので，取り出します．

```bash
$ debugfs ext-super-magic.img
debugfs: ls
(略)
debugfs: dump flag.jpg flag.jpg
debugfs: q
```

`flag.jpg`を開くと，上部に小さくフラグが書かれています．
Pardotフォームに郵便番号からの住所自動入力をサクッと導入する

Pardotフォームで郵便番号から住所の自動入力を設定する方法。
フォームハンドラーなら自由度高くカスタマイズができるけどPardotフォームでもそれくらいしたいよね。

ということで、JSプラグイン <a href="https://github.com/ninton/jquery.jpostal.js/" style="color:#f00">jpostal</a> を使って導入。

具体的な実装方法は以下の通り。
レイアウトテンプレート内に以下のコードを挿入するだけ。
設置箇所は `</body>`タグの上あたりがおすすめ。

## ソースコード

```html:既にjqueryが読み込まれている場合
<script type="text/javascript" src="//jpostal-1006.appspot.com/jquery.jpostal.js"></script>
<script type="text/javascript">
$(window).ready( function() {
	$('.zip > input').jpostal({
		postcode : [
			'.zip > input'
		],
		address : {
			'.state > input'  : '%3',
			'.city > input'  : '%4',
			'.address_one > input'  : '%5'
		}
	});
});
</script>
```

```html:jqueryが読み込まれていない場合
<script type="text/javascript" src="//code.jquery.com/jquery-2.1.0.min.js"></script>
<script type="text/javascript" src="//jpostal-1006.appspot.com/jquery.jpostal.js"></script>
<script type="text/javascript">
$(window).ready( function() {
	$('.zip > input').jpostal({
		postcode : [
			'.zip > input'
		],
		address : {
			'.state > input'  : '%3',
			'.city > input'  : '%4',
			'.address_one > input'  : '%5'
		}
	});
});
</script>
```


## 実装時の注意点

- デフォルト項目に実装することを想定しています。カスタム項目を使う場合はクラス名（ `.zip` `.state` `.city` `.address_one`）を使用するカスタム項目のIDに変更してください。
- 項目数を変更するカスタマイズ等は、[プラグインのページ](https://github.com/ninton/jquery.jpostal.js/)を参考にしてください。
- jqueryのバージョンが古すぎるとブラウザによっては動作しない場合があります。

## 備考
ちなみに、フォームハンドラーに実装するなら [yubinbango](https://yubinbango.github.io/) もおすすめ（Pardotフォームに導入するのも試したけど、仕様上ちょっと厳しかった）。
こちらはJSのコード書かなくていいので更にお手軽感があります。試してみてね。
Serversman@VPS with CentOS7をマトモに動かすまでの道程（2019年05月31日）

Serversman@VPSというVPSサービスをご存知だろうか？
ご存知だよね！HDDしか使えないから遅そうだけど、その代わりめっちゃ安く初期費用がかからないVPSです。
因みにStandardプランの実効メモリは２GBでした。

さておき、このVPS、もはやドキュメンテーションが維持されていないようで、マニュアルに書かれている通りのことができません。
まずはナゼかコンパネがなくなっているところから。
要するに、SSH接続以外の手段ではアクセスできない状況を自ら切り拓いて整地／舗装していかないとダメなんです。

昔は人気だったようで、多くのドキュメントがネットに転がっていますが、仕様変更やCentOSの進化などで使えないものもしばしば。
そこで、まとめてみようと考えました。



①コンパネのWebminをインストール
http://d.hatena.ne.jp/addition/20130329/1364523515
最新版を入れるには
yum install perl-Encode-Detect,perl-Net-SSLeay
が先に必要。
firewall-cmd --zone=public --add-port=10000/tcp
firewall-cmd --zone=public --add-port=10000/tcp --permanent
もインストール後に必要である。

①-2 interscriptはアップデートしてよい
昔は深刻な相性問題があったようだが、解消されたそう。
http://blog.livedoor.jp/blackwingcat/archives/1977599.html
/etc/yum.confを編集してinterscriptをアップグレードしよう。

②バックアップがしたい。
ServersMan@DISKが使えるはずだがダメ。サーバーを停止してからバックアップかけても「内部エラー」。最早打つ手がない。
⇒https://usado.jp/spdsk/2018/06/08/post-3884/
を参考に、
Epelを入れてからtimeshift
……と思いきや、Epelレポジトリがエラーになって死ぬ。
yum erase epel-release
（6月1日追記）
解決。まずは
https://easyramble.com/yum-clean-and-update.html
yum clean all
次いで
http://d.hatena.ne.jp/C_6B4A2B/20130427/1367073209

③依存性がどうのって言われたら……？
https://qiita.com/ichi_404/items/c9615f141d92d8e9722e

④我が愛しのphpMyAdmin
単にphpMyAdminを入れて解凍するだけ。この際だからFTPを開通させよう。
https://www.sakura-vps.net/centos6-setting-list/ftp-settings-for-sakura-vps/
を通す。迷ったら一旦
pkill vsftpd
で切ってからサービス再起動でやり直す。
FTPではrootで弾かれるので(503 denied)
http://everythingofneet.com/2017/08/28/vsftpd-root/
入れたら適当にバックアップ用のディレクトリを作って、webminのFilesystem Backupをやろう。
からの
https://zenlogic.jp/support/knowledge/phpmyadmin/install_01.html

phpmyAdminだが、今度はマックスアップロードサイズが2Mになってて使えない。
php.iniを編集
⇒http://rensabanet.com/wordpress-tips/tukai/11733/#ph04


⑤ルートディレクトリの変更
ドキュメンテーション通りにできる唯一の要素。
https://dream.jp/vps/support/manual/mnl_wordpress_03.html
ワードプレス版なら、
https://dream.jp/vps/support/manual/mnl_wordpress_02.html
MySQLのパスワードも変更した方がいいよね……

⑥Wordpressの移行
https://dogmap.jp/2013/01/15/wordpress-migration/
MYSQLのバージョン違いでutf8エラーになる。
https://wemo.tech/1899
が対処法だが、開いてみたら日本語部分が文字化けで不安に。互換モード使用で成功。

７　PHPのアップグレード
なんで5.4なんか入ってるんだ……ちなみにWordpressは４．０。
https://qiita.com/heimaru1231/items/84d0beca81ca5fdcffd0
php-mysqlがなくなることに注意。
yum install -y http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

8.MySQLの導入
PHPをアップグレードすると、内蔵のmariaDBが動かなくなる。
この際だからMySQLに入れ替えよう。
https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/
https://blog.apar.jp/linux/9868/#MySQL_80-2
【ラビットチャレンジ】 機械学習 第0章 機械学習とは

# 機械学習モデリングプロセス
## 1. 問題設定
- どのような課題を解決するか．
- ルールベースプログラムで解ければそれで解いても良い．（解くのが良い） 
- ディープラーニングのデメリットは，技術的ハードルが高いこと，テストが実施しにくいこと．

## 2. データ選定
- どのようなデータを使うか

## 3. データの前処理
- モデルに学習させられるようにデータを変換する．
    - データが抜けている場合（欠損値）の処理とか
    - 自然言語をフォーマットに落とし込むとか

## 4. 機械学習モデルの選定
- どの機械学習モデルを利用するか．
    - 線形回帰・非線形回帰
    - ロジスティック回帰
    - SVM
    - k-means
    - PCA
    - knn
    - **深層学習**

## 5. モデルの学習（パラメータ推定）
- パラメータの決め方．

## 6. モデルの評価
- ハイパーパラメータの選定．
- モデル精度を測る．

# 機械学習
- コンピュータプログラムを経験によって自動的に改善していく方法
- コンピュータプログラムは，タスクTを性能指標Pで測定し，その性能が経験Eによって改善される場合，タスクTおよび性能指標Pに関して経験Eから学習すると言われている．(トム・ミッチェル 1997)
- 学習用データセット(経験E)を利用してくんれんじたあとに，未知のデータについて正確に予測・分類できるアルゴリズムの能力を言う．