OmniAICreator/Qiita-1.07M huggingface dataset:
Python + Selenium + Chrome でファイル保存まわり

# はじめに

Selenium (+ Chrome) でのファイル保存関係の方法をまとめます。

基本的操作: [Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)

以下の説明の一部はChrome依存です（PDFのダウンロード、ヘッドレスモードでのダウンロードなど）。

## 注意事項

- アクセス対象サイトの利用規約をよく読みます。
    - たとえばログインが絡むサイトなどは、機械的なダウンロードが禁止されていることもしばしばあります。（例：twitter）
    - 自分だけでなく、自分の所属するグループごと大きなペナルティを食らうこともあります。（例：電子ジャーナル）
- 著作権をよく理解・考慮する必要があります。
- サーバーの負荷もよく考えます。時間を十分空けながら処理をします。
    - 並列にダウンロードをするのは避けたほうがよいでしょう。
    - URLリストだけ取得しておき、あとで順にダウンロードしていくのもありでしょう。

# 現在ページのhtmlソースを取得

`driver.page_source` で現在のページのhtmlソースを取得できます。

```python
html = driver.page_source
with open('hoge.html', 'w', encoding='utf-8') as f:
    f.write(html)
```

# クリックでダウンロード

- クリックイベントでダウンロードが始まる要素を見つけておいて `.click()`
- `<a href...>` をたどるとダウンロードされるならば、`.get_attribute("href")` などで URL を取得してから `driver.get(<URL>)` も可
    - [get_attribute の使い方](https://qiita.com/memakura/items/20a02161fa7e18d8a693#by-class-name-%E3%82%84-by-tag-name)

# 直接ダウンロード

画像などを直接ダウンロードするには、`urllib.request.urlretrieve` を使うことができます。

画像 (img) 要素が `id="logo"` を持つならば以下のようになります。

```python
import urllib.request
# ... (省略) ...
url = driver.find_element_by_id("logo").get_attribute("src")
urllib.request.urlretrieve(url, 'logo.png')
```
# PDFダウンロードとファイル保存先変更

PDFはデフォルトではChromeで表示されてしまうので、ファイルとしてダウンロードできるようにし、ついでに保存先のフォルダを明示的に指定します。

```python
from selenium import webdriver
from pathlib import Path  # 絶対パスを簡単に取得できるように

dldir_name = 'download'  # 保存先フォルダ名
dldir_path = Path(dldir_name)
dldir_path.mkdir(exist_ok=True)  # 存在していてもOKとする（エラーで止めない）
download_dir = str(dldir_path.resolve())  # 絶対パス

options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {
    "download.default_directory": download_dir,
    "plugins.always_open_pdf_externally": True
})
# (1)
driver = webdriver.Chrome(options=options)
# (2)
driver.get("http://aaa.bbb.ccc/hoge.pdf")
```

注意事項にも書きましたが、機械的にダウンロードしてはいけない場合も多々あるので気を付けましょう。**たとえば電子ジャーナルなどは絶対ダメですし、すぐに検出されて機関ごと利用停止になります。**


# ヘッドレスモードでもダウンロード

デフォルトだとヘッドレスモードではファイルダウンロードができないようです．

まず上記コードの `(1)` にオプションを追加してヘッドレスモードにします．

```python
options.add_argument('--headless')
```

たしかにこれではダウンロードができません．
そこで、`(2)` の部分に以下のコードを入れてみます。

```python
driver.command_executor._commands["send_command"] = (
    "POST",
    '/session/$sessionId/chromium/send_command'
)
params = {
    'cmd': 'Page.setDownloadBehavior',
    'params': {
        'behavior': 'allow',
        'downloadPath': download_dir
    }
}
driver.execute("send_command", params=params)
```

参考: https://qiita.com/zkangaroo/items/1c4d4c11b06e7823e7fe

これでヘッドレスモードでもファイルダウンロードが可能になります。
ただ、注意事項の通り、多くのファイルの並列ダウンロードは避けたほうがよいです。
したがって、処理速度を速めるという意味でヘッドレスにする必要性は少ないと思われます。
【Spring】Java Configurationでよく見る 'あの' 気持ち悪いコードを読み解く。

## よく見る気持ち悪い（気持ち悪かった）サンプルコード
Qiitaや参考書なんかでSpringのアノテーションベースConfigurationのサンプルコードを見るとたまに出くわすこんなコード。

```java
@Configuration
public class Config {
	
	@Bean
	public Bean1 bean1() {
		return new Bean1();
	}
	
	@Bean
	public Bean2 bean2() {
		return new Bean2(bean1());//Bean1を2回newしてない？？？
	}

}
```
Bean2はBean1を引数にとってインスタンス化するのですが、Bean1を取得する手段がメソッド呼び出し。。。
初めて見たとき、「あれ？これコンテナに詰めたBean1とBean2のコンストラクタに渡したBean1が同一じゃ無いけどいいの？？？」って思ってそれから最近までずっとモヤモヤしてたんですが。。。

## ごん、お前だったのか
メソッドbean2の中でコンテナからBean1を引っ張って標準出力してみる遊びをしたところ、

```java

	@Bean
	public Bean1 bean1() {
		return new Bean1();
	}
	
	@Bean
	public Bean2 bean2(Bean1 bean1) {
		System.out.println(bean1);//コンテナからとってきたBean1
		System.out.println(bean1());//メソッドbean1のなかで再びnewしていると思われるBean1
		return new Bean2(bean1());
	}

```
```:結果
com.example.demo.Bean1@332b70df
com.example.demo.Bean1@332b70df
```
同じインスタンスじゃないか。確かに、メソッドbean2で呼び出したメソッドbean1内でnewしているはずなのに。
まさに野良狐だと思って撃ったら「ごん」だった兵十の気持ちです。

## 何が起こっていたのか
じゃあメソッドbean1の中で何が起こっているのか。
試しにConfigのコンストラクタでthisを標準出力してみましょう。

```java
	public Config() {
		System.out.println(this);
	}
```
```:出力
com.example.demo.Config$$EnhancerBySpringCGLIB$$74a9b1d8@6ac168f5
```
*EnhancerBySpringCGLIB*とは何でしょう、調べてみるとProxyのことらしいですね。
実は実行時に動くConfigインスタンスはSpringが勝手に（？）作ったProxyクラスのインスタンスでメソッドbean1はその独自クラスの中でOverrideされてるっぽいです。
つまり、オリジナルのメソッドbean1は1度しか呼ばれず、2回目以降は上書きされたメソッドがコンテナからBean1を返却していたということです。

## サンプルコードは間違ってなかった
気持ち悪いとか言ってしまい大変申し訳ありませんでした。
lazy_static! と docopt の組み合わせは最高

みんな大好き [`lazy_static!`](https://docs.rs/lazy_static/1.2.0/lazy_static/) ですが、これと command-line parsing を組み合わせるとすごい便利です。

# 問題点

コマンドライン引数をパースしたいけど、パースした結果をコードの色々な所からアクセスしないといけない。じゃどうするのか？

以下のようにパース結果への参照を渡しまくるという方法もありますが、

```rust
fn some_code(args: &Args, /* 他の引数 */) {
    ...
    some_other_code(args, ...);
}

fn some_other_code(args: &Args, /* 他の引数 */) {
    ...
}

fn main() {
    let args: Args = /* パースした結果 */
    some_code(&args, ...);
}
```

あまりよくないでしょう。

# そこで `lazy_static!`

パース結果を `lazy_static!` で包んで、初期化する際にコマンドラインをパースするコードを書けば、パース結果の参照を必要とせず、そのまま使うことができます。

```rust
lazy_static! {
    static ref ARGS: Args = {
        Docopt::new(USAGE)
            .and_then(|d| d.deserialize())
            .unwrap_or_else(|e| {
                println!("Failed to parse command-line arguments.");
                e.exit();
            })
    };
}

fn main() {
    match ARGS.flag_verbose {
        true => be_verbose(),
        false => (),
    };
}
```
UnityでVR上でも手軽にレベルデザインできるようになるらしいProBuilderの話

# 最初に

本記事はUnity2018におけるレベルデザインに有用な機能「ProBuilder」についてサクッと調べて備忘録として残しておこうと思ったメモ記事となります。

# ProBuilderとは？

**ProBuilder**(https://unity3d.com/jp/unity/features/worldbuilding/probuilder) とは3Dモデリングツールでもありレベルデザインツールでもある非常に優れた機能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/703c9df5-5e1a-1737-bdab-c9c843c5514e.png)


ProBuilderによって建物や地形、乗り物や武器などの3DCGをUnity内で直接作成することができます。また、トリガーゾーンやナビメッシュのカスタム作成も可能となっています。面白いですね。

基本的にはシンプルなジオメトリで構築するのが前提となっており、そのように最適化もされていますが、必要に応じてUV展開などが可能となっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/a5a67f03-97ab-a84d-4d31-7c66cd5c9d0a.png)
(Unity公式ページより：https://unity3d.com/jp/unity/features/worldbuilding/probuilder)
(または：https://www.procore3d.com/probuilder/)

この作成したデータはOBJ形式で出力も可能なため、他の3DCGソフトで取り込んで更に手を加えることも可能となっています。

この機能はUnity2018から標準搭載となっています。もちろん無料です。ちなみに元の価格は$102.60だったようです。

# Install方法

Unityエディタのメニューから`Window > Package Manager`を選択してください。「All」をクリックし、「ProBuilder」を選択して「Install」をクリックしてするだけでOKです。

# 無料化して標準搭載になったのはProBuilderだけじゃなかった

ProBuilder同様に、Unity標準で搭載となったレベルデザインの効率アップツールは他にもあります。

ProGulid
------

ProGridsは、オブジェクトのグリップ&スナップ配置の機能を提供します。その他にも便利オプションを色々兼ね備えているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/e9f30de7-65c5-e1e2-6ed9-ec051c4ba071.png)
(Unity公式ページより：https://www.procore3d.com/progrids/)

元の価格は$21.60だったようです。

Polybrush (Beta)
-------

Polybrushは一見Terrain Toolsのように見えますが、よりProBuilderと親和性が高く、メッシュの簡易編集を効率的に行えるツールだと思われます。このツールはインポートされたメッシュにも以下の機能を適応することができます。

- スカルプト系操作
- 頂点カラーの塗り
- テクスチャブレンド
- 任意のPrefabをブラシで配置

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/7c1801de-903c-f23d-11bb-eb9a469c1375.png)
(Unity公式ページより：https://www.procore3d.com/probuilder/)
(または：https://unity3d.com/jp/unity/features/worldbuilding/polybrush)

元の価格は$70.20だったようです。

# ProBuilder VR？

基本的にはProBuilderの機能をVR上で動かし、実際に見て確認しながらレベルデザインできたらいいよね！を実現する機能だと思われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/dbe8dfff-8925-05fe-be7e-d42f9e4a1cfc.png)


どうやらまだまだ開発の初期段階ですが一応公式サイト(http://www.procore3d.com/probuilder-vr/) から試すことは可能なようです。


# 実際に使用してみてる記事の一覧

- [Unity2018から標準搭載されるProBuilderを使ってみる](https://gametukurikata.com/mesh/probuilder)

- [UnityのProBuilderでレベルデザインする](https://qiita.com/medamap/items/6c74c0b156cbbd36e95e)


# 参考
- [【大ニュース】モデリングで有名なアセットがUnity公式から無償提供を開始しました 「ProBuilder」 / 「ProGrids」 / 「Polybrush (Beta)」](http://www.asset-sale.net/entry/ProBuilder_Polybrush_180216)
ビジネスに貢献するデータ収集・分析基盤をBigQueryとGCPで構築する

# この記事について
社内のデータベースや基幹システム(以下データソース)には、分析して活用する事で、既存ビジネスのパフォーマンス向上や、新たなサービスの創造につながるデータが散逸している可能性があります。
それらのデータを目的に合わせて再構成し、データ・ドリブンに意思決定をしていく為には、様々なデータソースから上がってくるデータを情報資産として蓄積・活用するための データウェアハウス(以下DWH) が必要となります。

この記事では [Google Cloud Platform(以下GCP)](https://cloud.google.com/) の各種サービスを活用して、既存ビジネスに貢献する為の「データ収集・分析基盤」のアーキテクチャ構築する方法を解説します。

# 完成イメージ
まずは完成イメージの説明です。
バッチ・ストリーム両対応で安全性とスケールを担保した [BigQuery](https://cloud.google.com/bigquery/?hl=ja) 中心の DWH アーキテクチャです。バッチ・ストリームの両方に対応しており、用途に応じて接続するデータソースを追加していける仕組みになっています。

<img width="975" alt="overview.png" src="https://qiita-image-store.s3.amazonaws.com/0/85999/9fb15802-4a17-1336-fac5-982d1d27457b.png">

### A. クローズドネットワークとGCPネットワークの接続
社内ネットワークやデータセンターなど、クローズドネットワークに存在するデータソースに安全にアクセスする為、 [Google Cloud Interconnect](https://cloud.google.com/interconnect/?hl=ja) または [Cloud VPN](https://cloud.google.com/vpn/docs/concepts/overview?hl=ja) を使って、GCPネットワークと社内ネットワークを接続します。

### B. データのバッチ取得
対象のデータソースから必要なデータを取得する為、大量データの転送に適したオープンソースのミドルウェア「[embulk](https://github.com/embulk/embulk)」を実行するサーバー群です。
複数人での運用を考慮し embulk は [Docker](https://www.docker.com/)コンテナ化。[Kubernetes Engine](https://cloud.google.com/kubernetes-engine/?hl=ja) に構築したクラスタ上で実行します。Dockerfile はGithubで管理され、リポジトリへのプッシュを検知すると [Container Registry](https://cloud.google.com/container-registry/?hl=ja) の Build Trigger によって自動的に [Cloud Build](https://cloud.google.com/cloud-build/?hl=ja) がコンテナを作成。Kubernetes Engine にデプロイします。
冪等性を担保する為、取得したデータは全て [Cloud Storage](https://cloud.google.com/storage/?hl=ja) に蓄積します。

### C. Amazon S3からのデータ取得
既に [Amazon Web Service(以下AWS)](https://aws.amazon.com/jp/) で何らかのシステムを構築している場合は Cloud Storage のネイティブ機能で提供されている「Cloud Storage Transfer」を使って、定期的に S3 から Cloud Storage にデータを転送する事が可能です。

### D. データ取得イベントの検出
「2. embulk」や「3. Cloud Storage Transfer」により Cloud Storage にデータが保存された時、そのイベントを [Cloud functions](https://cloud.google.com/functions/?hl=ja) が検知し [Cloud Dataflow](https://cloud.google.com/dataflow/?hl=ja) が自動的に実行されます。

### E. ストリームデータの取得
IoTデバイス や POSレジ Webサーバー のアクセスログなど、リアルタイムに発生するストリームデータを素早く収集して分析したい場合は [Cloud Pub/Sub](https://cloud.google.com/pubsub/?hl=ja) を利用します。
Cloud IoT Core や Compute Engine 等から取得したデータは一時的に Cloud Pub/Sub に保存され Cloud Dataflow に引き渡されます。
Cloud Pub/Sub はシンプルなAPIが公開されており POSレジ や 店舗のセンサー など、独自システムからのリアルタイムデータの収集も用意に実現する事が可能です。

### F. データの加工・BigQueryへインサート
システムに溜まっている生のデータ(以下RAWデータ)は往々にして重複やノイズが混ざっています。それらのRAWデータを分析に適した形式に変換する為、 Cloud Dataflow に集約し、適切に加工した上で BigQuery に保存します。
大量のデータを加工する為には多くのマシンリソースを必要としますが Cloud Dataflow を利用する事でデータサイズに応じたサーバーが自動的に選択され、短時間でのデータ変換が可能になります。

### G. データの活用
BigQueryに蓄積したデータは [Google Data studio](https://datastudio.google.com/u/0/navigation/reporting?hl=ja) や tableau 等の様々なBIツール、 BigQuery ML や Tensor Flow 等の機械学習ライブラリを利用して活用することが可能です。
具体的な活用方法については、この記事の範囲外なので、ここでは解説はしません。

# 次のステップ
- VPCの作成
- Cloud VPNの設定
- [Kubernetes Engineにembulkコンテナをデプロイ](https://github.com/kosukekurimoto/k8s-cronjob-embulk-blueprint)
- Cloud Storage のファイル検出用 Cloud Functions の設定
- Cloud Dataflow の設定

※この記事は作成途中です。反応が良ければ続きを書こうかなと思っています。 2018/12/30
ブロック転送命令でのメモリクリア

ブロック転送命令を使って、メモリのクリアをします。
この例では、8000番地から、2000hのメモリ空間をやってます。

```
  ld  hl,8000h
  ld  de,8001h
  ld  bc,2000h-1
  xor a
  ld  (hl),a
  ldir
```
1バイト違いの番地で、エントリを作る方法


相対ジャンプ命令(2bytes)の前に、
いらないレジスタにロードするオペコードを置きます。

```
; example 11h = LD DE,XXXX

entry0:
	db 11h
entry1:
	jr label1

    ;
	; code 0
    ;
```
常に地面に垂直にする。

```c#:vertical.cs
using UnityEngine;
using System.Collections;

public class Vertical : MonoBehaviour
{
    

    private void Update()
    {
        Setrotation();
    }

    private void Setrotation()
    {
        Ray ray = new Ray(transform.position, -transform.up);
        RaycastHit hit;
        Physics.Raycast(ray, out hit, 2);
        Quaternion rot = Quaternion.FromToRotation(transform.up, hit.normal);
        GetComponent<Rigidbody>().MoveRotation(rot * transform.rotation);
    }
}

```

これをさらに回転させるときは回転をtransform.rotation.EulerAngleでベクトルとして取得。
取得したベクトルを増減させる。
Quaternion.Euler(変化させたベクトル)を MOverotaroinのtransform.rotarionのところに入れる(rot * hoge)。

終わり。
値交換の一時変数を省略する方法。

xor を二回掛けたら元に戻るので、ビット演算の出来る言語で、
値の交換の時の一時変数を省略する方法。

```
/* 通常のスワップ */
t = a; a = b; b = t;

/* t 省略 */
a ^= b ; b ^= a ; a ^= b ;

```
[Unity]for文でButtonに引数付きAddListenerするときに詰まったときの話

#最初に
uGUIのボタンで電卓的な機能を再現しようとした時に、for分でScriptからButtonのOnClickEventにAddListenerしようとした時に詰まったのでメモ

#ダメコード
```Calucurater.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class Calucurater : MonoBehaviour {

    /// <summary>
    /// 数字の入力を受け取る
    /// </summary>
    [SerializeField]
    private List<Button> numberBtList;

    [SerializeField]
    private InputField display;

	void Start () {

        for (int _count = 0; _count < numberBtList.Count; _count++)
        {
            numberBtList[_count].onClick.AddListener(() => OnClickNumber(_count));
        }

	}


    private void OnClickNumber(int num)
    {
        UpdateDisplay(num.ToString());
    }

    /// <summary>
    /// 結果の表示
    /// </summary>
    private void UpdateDisplay(string st)
    {
        display.text = st;
    }

	
	// Update is called once per frame
	void Update () {
		
	}
}
```

上記のコードだと、どのボタンを押してもループで回したインデックスの値が渡されてしまった。

#動いたコード
```Calucurater.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class Calucurater : MonoBehaviour {

    /// <summary>
    /// 数字の入力を受け取る
    /// </summary>
    [SerializeField]
    private List<Button> numberBtList;

    [SerializeField]
    private InputField display;

	void Start () {

        for (int _count = 0; _count < numberBtList.Count; _count++)
        {
            var i = _count;//追加

            //iを引数で渡す
            numberBtList[_count].onClick.AddListener(() => OnClickNumber(i));
        }

	}


    private void OnClickNumber(int num)
    {
        UpdateDisplay(num.ToString());
    }

    /// <summary>
    /// 結果の表示
    /// </summary>
    private void UpdateDisplay(string st)
    {
        display.text = st;
    }

	
	// Update is called once per frame
	void Update () {
		
	}
}
```
ループ内で一度変数に入れなおしてから引数に渡すことで期待通りの動作が確認できた。
【Android】Dagger2でInjectするインスタンスの生存期間(カスタムスコープ)を指定する方法

# はじめに

Dagger2では`Inject`するインスタンスの生存期間(カスタムスコープ)の指定ができます。その方法が少々ややこしいので、メモがてら残します。
また、Dagger2については完全に理解していないので、間違っている点などがございましたら、ご指摘ください。 :bow:

※ 環境はAndroidでのDagger2利用を前提としており、言語はKotlinです。

# `@Scope`について

Dagger2には`@Scope`というアノテーションが存在します。一見、メンバやメソッドのスコープを制限するアノテーションにも見えますが、実際には`Inject`するインスタンスの生存期間を指定するアノテーションです。
そう聞くと、`@Scope`を`provide`メソッドに付与させるだけで、よしなにインスタンスの生存期間を決めてくれそうですが、実際はそのような事は無く、いろいろと設定が必要で、手順は以下の通りです。

1. `@Scope`を使用して、スコープを表すアノテーションクラスを作る
2. 生存期間を指定したい`provide`メソッドに、上で作ったアノテーションを指定する
3. その`provide`メソッドを持つ`Module`の`Component`に、上で作ったアノテーションを指定する

これで、`Component`の生存期間に`Inject`するインスタンスの生存期間を合わせることができます。
※`Componentの生存期間`とは**`Component.builder().build()`が呼ばれてから、`Componentインスタンス`の参照が外れるまで**の事を言います。

## 生存期間を指定する方法

今回はHogeクラスのインスタンスの生存期間をActicityの生存期間に合わせたいと思います。

### 1. `@Scope`を使用して、スコープを表すアノテーションクラスを作る

以下のようなアノテーションを作ります。
アノテーションの名前はスコープを表すような名前をつければ良いです。
今回はActivityの生存期間に合わせたいので、`ActivityScope`としています。

```kotlin
@Scope
@Retention(AnnotationRetention.RUNTIME)
internal annotation class ActivityScope
```

### 2. 生存期間を指定したい`provide`メソッドに、上で作ったアノテーションを指定する

`Hoge`のインスタンスを`Provide`するメソッドに`@ActivityScope`を付与させます。

```kotlin
@Module
class HogeModule{
    @ActivityScope
    @Provides
    fun provideHoge(){
        return Hoge()
    }
}
```

### 3. その`provide`メソッドを持つ`Module`の`Component`に、上で作ったアノテーションを指定する

今回はDagger2のAndroid拡張を使用しており、ActivityのComponentは`ContributesAndroidInjector`を使用して作成しているので、`Contribute`メソッドに`@ActivityScope`を付与させます。そうすると、`ContributesAndroidInjector`でSubComponentが自動生成され、Android拡張内で`MainActivity`生成時に自動でbuild()をおこなってくれるので、`@ActivityScope`は`MainActivity`の生存期間と一緒になります。
また、独自で`SubComponent`・`Component`を作成している場合はそれに`@ActivityScope`アノテーションを付与させれば良いです。

```kotlin
@Module
abstract class MainActivityModule{
    @ActivityScope
    @ContributesAndroidInjector(modules = [HogeModule::class])
    abstract MainActivity contributeMainActivity();
}
```

以上で、Activityの生存期間とHogeインスタンスの生存期間を揃えることができます。

## `@Singleton`について

Dagger2に元から存在する`@Singleton`ですが、実はこれはデフォルトで存在するスコープです。そのため、これを指定するだけでシングルトンになるわけではありません。一般的にはアプリケーションの生存期間と合わせて使用するため、`ApplicationComponent`に`@Singleton`アノテーションを付与させる事が多いです。そうすることで、`@Singleton`アノテーションを付与させた`provide`メソッドの提供するインスタンスはアプリケーションが破棄されるまで同じインスタンスを返します。

## 注意点

注意点として一つ、親コンポーネントと子コンポーネントに**同一のスコープを付与させられません**。例えば、`@Singleton`を付与させたコンポーネントの子コンポーネントに`@Singleton`は付与させる事は出来ません。

## まとめ

- Dagger2のカスタムスコープ指定は以下の手順で行うことが可能
  1. `@Scope`を使用して、スコープを表すアノテーションクラスを作る
  2. 生存期間を指定したい`provide`メソッドに、上で作ったアノテーションを指定する
  3. その`privide`メソッドを持つ`Module`の`Component`に、上で作ったアノテーションを指定する
- Android拡張を使用している場合は`Contributes`メソッドに`Scope`アノテーションを付与させる
- 親コンポーネントと子コンポーネントのスコープは同一にできない

# 参考
- [Dagger2のscopeの使い方を正しく理解する - Qiita](https://qiita.com/tsuyoyo/items/50edacbb544e383dac93)
- [Android: Dagger2 - Subcomponent vs. dependencies - Yukiの枝折](http://yuki312.blogspot.com/2016/02/android-dagger2-subcomponent-vs.html)
- [Android で Dagger を使う（その2 : subcomponent） - Y.A.M の 雑記帳](http://y-anz-m.blogspot.com/2017/07/android-dagger-2-subcomponent.html)
かけ算とわり算が直感的に量でわかる表（九九表・改）

#きっかけ
先日、Pythonで掛け算の概念がわかりやすい九九表を出力するプログラムを作成し、[記事にしました](https://qiita.com/akichika/items/ca0653740ce26e9d86c2)。

早速自宅でも自分の子どものために印刷したものをラミネートして風呂に貼って眺めていたのですが、これはどうやらわり算の概念も量的に捉えやすいのでは？と気づきました。
当たり前ですが、表の値を縦軸で割ると横軸の値になります。それがこの表であれば数値だけでなく量としても直感的にわかります。

#かけ算とわり算が直感的に量でわかる表

ということで、先日作成した表を縦横で色分けして、わり算についても直感的にわかりやすい（気がする）表を作りました（Python使うほどでもなかったのでExcelで単に縦横に青と緑のグリッドの色を付けただけ・・・）。

なお、わり算を意識し、九九ではなく10x10の表を標準にしています。本記事下部にExcel形式のものも置いてあるので、九九表が良い方は改変していただければと思います。


![MulDivTable10x10_JP.png](https://qiita-image-store.s3.amazonaws.com/0/33040/cc6ffd4b-233c-e105-8de5-d0dbdb197225.png)


# 使いかた
単純です。下記をご覧ください。
![2018-12-30_01h19_26.png](https://qiita-image-store.s3.amazonaws.com/0/33040/88c8001d-250e-ced3-d20a-64f7dfa236d6.png)

#各種ファイル形式でのダウンロード先

お好みで下記からダウンロードしてください。

###掛け算・わり算表（日本語タイトル）
[Excel](https://drive.google.com/file/d/1w1LmBoX_1njrgRQdbUfWE67j_b_Oe4yv/view?usp=sharing)
[PDF](https://drive.google.com/file/d/1saYNaZeSlwH7R3UPI_vXGk6xeFbfUw7X/view?usp=sharing)
[PNG](https://drive.google.com/file/d/1vBFWTe4KhaR3W5motHcrCW0Rpg5pLTUt/view?usp=sharing)

###Multiplication & Division Table（英語タイトル）
[Excel](https://drive.google.com/file/d/1gumtdBVxnkjWBZjgxPr4ifu11NbymZm9/view?usp=sharing)
[PDF](https://drive.google.com/file/d/1bJtksgRPmxyhq1XqT2L_qM2O4HxM29LM/view?usp=sharing)
[PNG](https://drive.google.com/file/d/1oWGfH1ZiG73H0aW9PdKMntZCrgufK0ul/view?usp=sharing)

#ライセンス

一応これらは[CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)で公開しますので、適宜いじっていただければ幸いです。
色・フォント・レイアウトなど好みやメディアに応じて適当に改変してください。

#Acknowledgement

元々の直感的な九九表を考えた方々やその他インスピレーションをいただいた方々に感謝します。
railsでbootstrap4を使用してるときの、フォームの横幅の指定

テキストフィールドなどに、以下のように指定して、フォームの幅を変更できる

` <%= f.text_field :title, class: 'form-control w-75 mx-auto'%>`

w-75の部分は、w-25、w-50、w-75、w-100を使用可。
数字は幅の比率(%)
メンテナンスプランをバッチで編集する

##はじめに
メンテナンスプランを作り方を手順書にするとメンテめんどいし、手順実行するときミスする可能性があるしでいいことないので、バッチ化することになった。バッチでメンテナンスプランを作成・編集することを書きます。

## 0．注意事項
#### (1) 例に出てくるＳＱＬやバッチについて
%LOGIN_NAME%→ログイン名
%LOGIN_PASSWORD%→ログインパスワード
%PLAN_NAME%→メンテナンスプランの名前
でそれぞれ読み替えてください。

#### (2) SSISのインストールに関して 
SSISに内包されているdtutil.exeというものを使います。
[このサイト](https://docs.microsoft.com/ja-jp/sql/integration-services/install-windows/install-integration-services?view=sql-server-2017)を参考にしてMicrosoft SQL Server Integration Services（SSIS）をインスコしてください。

##1．編集手順
####(1) メンテナンスプランを作成
SQL Server Management Studio（マネスタ）からＧＵＩベースでメンテナンスプランを作成します。
####(2) dtsxファイルのエクスポート
(1) で作成したメンテナンスプランの情報をdtsxファイルというXML形式のファイルでエクスポートするためのコマンドをコマンドプロンプトから実行します。

```bat
dtutil.exe /SourceS . /SourceU "%LOGIN_NAME%" /SourceP "%LOGIN_PASSWORD%" /SQL "Maintenance Plans\%PLAN_NAME%" /Encrypt FILE;Cleanup.dtsx;0
```

出力されたファイルにはなぜかSQL Serverのログイン情報が消えているので、手で追加します。

####(3) メンテナンスプランを実行するジョブの削除
ＳＱＬで削除可能です。sqlcmdからジョブを削除するSQLを実行しましょう。

####(4) メンテナンスプランの削除
以下のコマンドを実行します。

```bat
dtutil /SourceS . /SourceU "%LOGIN_NAME%" /SourceP "%LOGIN_PASSWORD%" /SQL "Maintenance Plans\%PLAN_NAME%" /DEL
```

####(5) メンテナンスプランのリストア
(2)で作成したdtsxファイルメンテナンスプランをリストアします。
以下のコマンドを実行します。

```bat
dtutil /FILE "%DTSX_PATH%" /COPY SQL;"Maintenance Plans\%PLAN_NAME%" /DestS . /DestU "%LOGIN_NAME%" /DestP "%LOGIN_PASSWORD%"
```

####(6) メンテナンスプランを実行するジョブを再作成する。
ＳＱＬで作成可能です。sqlcmdからジョブを作成するSQLを実行しましょう。

##2．ＴＩＰＳ
####マネスタのバージョン間の互換性について
マネスタのバージョンが「２００８」と「２０１４、２０１６」の間にはdtsxファイルの互換性がありませんでした。
また、マネスタのバージョンが２０１４と２０１６の間では、互換性がありますが、ログの出力先が違うため、注意が必要でした。
プロセスとスレッドとタスクの違いを知ってUnity非同期完全理解に近付く

# 最初に

本記事はUnity非同期完全に理解するための序章となります。

すでにタスク、スレッド、プロセスについて理解している方は次の目次から目的の記事を選択して頂ければと思います。

Unity非同期完全に理解するための歩み：
- 【Part0】タスクとスレッドとプロセスの違いを知って非同期完全理解に近付く ←今ココ！
- 【Part1】[Unity非同期完全に理解するための第一歩～非同期処理とは何か～](https://qiita.com/4_mio_11/items/3a0b06819d9591c5d410)
- 【Part2】[古来よりUnity非同期を実現していたコルーチンとは何者か？](https://qiita.com/4_mio_11/items/3030f9a39f59cd68f705)
- 【Part3】[非同期理解のためにasync/awaitとTaskの基礎を学んだ話](https://qiita.com/4_mio_11/items/f9b19c04509328b1e5c1)


# プロセス

私達が普段起動し使用しているゲームやツール等、それら**一つ一つのアプリケーションと、そのアプリケーションに対する「管理情報」をまとめたもの**が**`プロセス`**と呼ばれます。OSから見た時には、**プロセスが1つの実行単位**となります。

プロセス間は同じプログラムを使用していない限りは**メモリを共有しません**。つまりプロセスの数だけ**メモリは割り当てられていきます**。

↓プロセスについてもっと知りたい方はこちら↓
[【小ネタ】プロセスってなんだろう？という話](https://qiita.com/4_mio_11/items/4987be19c31df70bbf28)


# マルチタスク(又はマルチプロセス)

私達は普段からこの機能をスマホやPC等に搭載されているOSで使用しています。この機能があるおかげで、コンパイルを行いながらネットを見たり、音楽を聴きながらTwitterするような複数プロセスの同時実行が可能なのです。

ところでCPUは**1コアに対して一度に1つのプロセス**しか実行できません。ではどうやってマルチタスクを実現しているのでしょうか。

答えは難しくありません。マルチタスク機能によって**複数のプロセスを細かく切り替えること**で同時に動いているように見せているのです。



# スレッド

スレッドとはプロセス内に作られる並列動作が可能な**処理の単位**です。

シングルスレッドなら1プロセスに1スレッド、マルチスレッドなら1プロセスで複数のスレッドが動作しています。

スレッドは**プロセスに割り当てられたメモリを使用して**動作しています。スレッド同士では**メモリを共有**しているため、メモリの切り替えも含めたプロセスの切り替えに比べると、**スレッドの切り替えは高速に動きます**。ただし、メモリを共有しているということは、ほとんどのデータをスレッド同士で共有しているということで、同じ変数に対してスレッド同士が同時に値を書き換えようとする場合に**開発者側が意図していない状況になる**ことが殆どです。なので、マルチスレッドプログラムを開発するのであれば、このような問題が起きない(**`スレッドセーフ`**)ようなプログラムを意識する必要があります。
<br>

Unityでは、私達がゲームのメインに当たるプログラムを記述した際に、そのプログラムを実行するスレッドが**メインスレッド**となっています。もちろんゲームのメイン処理と同時に実行するスレッドを追加で作成することが可能です。

ただし、メインスレッドからはUnityのAPIを叩くことが可能ですが、それ以外の**ユーザーが作成したスレッドでは、UnityのAPIへアクセスができません**。なので、別スレッドには計算系の処理を任せ、その結果を用いた処理をメインスレッドで行うような用途がちょうどいいかと思われます。最近のUnityには***C# Job System***というマルチスレッドプログラミングのハードルをより下げてくれる機能が備わっているので是非一度確認してみてください。


→[「Unity2018.xで知っておきたいC# Job System機能の概要」](https://qiita.com/4_mio_11/items/39354a18425da7490b59)
→[【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング](https://www.slideshare.net/UnityTechnologiesJapan/cedec2017cjobsystem-unity)

↓スレッドについてもっと知りたい方はこちら↓
[【小ネタ】スレッドってなんだろう？という話](https://qiita.com/4_mio_11/items/f97a5ac374bd56b6bc22)

# タスク

さて、タスクに関してですが、タスクという言葉は曖昧です。タスクという言葉は以下の意味を持つことがあります。

1. プロセスと同じ意味で使われる。
2. スレッドのことを指す。
3. スレッドに割り当てられ、非同期に呼び出される実行単位。

C#ではタスクは⑶の意味を持つと思われます(async/awaitと結びつくTaskクラス)。タスクに基づいた並行処理では、タスクとスレッドは明示的に別々に管理されます。この場合のタスクは**スレッド上で実行されるため、スレッドが持つ強みと弱みを共有**します。

タスクとよく似た用語として**「ジョブ」**という言葉もあります。

ジョブはUnityにおける*C# Job System*では並列処理として、**別スレッドにお願いする処理の単位**を指します。



# 参考

- [イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜](https://moro-archive.hatenablog.com/entry/2014/09/11/013520)
- [意味の違いがわかる？ タスクとプロセスとスレッド](http://ascii.jp/elem/000/000/653/653041/index-4.html)
- [並列処理と並行処理の違い　CPUについて](https://hobik-site.blogspot.com/2018/03/cpu.html)
- [並行 (Concurrent) 、並列 (Parallel) 、非同期 (Asynchrony) の違い](https://moz.hatenablog.jp/entry/2018/04/10/175643)
- ゲームエンジンアーキテクチャ(文献)
- GPUを支える技術(文献)
- Optimized C++(文献)
【小ネタ】スレッドってなんだろう？という話

# 最初に

本記事は「スレッド」について少し掘り下げての解説記事となります。

プロセスについては→[【小ネタ】プロセスってなんだろう？という話](https://qiita.com/4_mio_11/items/4987be19c31df70bbf28)
並列処理・並行処理については→[【小ネタ】並列処理とは何か？そして並列処理と並行処理の違いとは？](https://qiita.com/4_mio_11/items/7f418ca661d9f5a2a39d)
非同期については→[Unity非同期完全に理解するための第一歩～非同期処理とは何か～](https://qiita.com/4_mio_11/items/3a0b06819d9591c5d410)

# スレッドとは？

スレッドとはプロセス内に作られる並列処理を行うための仕組みであり、**処理の単位**です。

シングルスレッドなら1プロセスに1スレッド、マルチスレッドなら1プロセスで複数のスレッドが動作しています。ただしその実行管理（スケジューリング）はOS側で行います。

スレッドは**プロセスに割り当てられたメモリを使用して**動作しています。スレッド同士では**メモリを共有**しているため、メモリの切り替えも含めたプロセスの切り替えに比べると、**スレッドの切り替えは高速に動きます**。ただし、メモリを共有しているということは、ほとんどのデータをスレッド同士で共有しているということで、同じ変数に対してスレッド同士が同時に値を書き換えようとする場合に**開発者側が意図していない状況になる**ことが殆どです。なので、マルチスレッドプログラムを開発するのであれば、このような問題が起きない(**`スレッドセーフ`**)ようなプログラムを意識する必要があります。

また、共有メモリへのアクセス速度は、非共有メモリへのアクセスより**何倍も遅くなります**。

# スレッドの使い方

ほとんどのOSがOS依存ライブラリでスレッドを用意します。ゲームエンジンなどでも基本的にはスレッドを用意できるAPIが提供されています。

スレッド制御用のAPIを使用することでスレッドの制御を開始、一時停止、終了を行わせることができます。またマルチスレッドであれば、全てのスレッドの処理が終わるまで待つこともできます。ただしスレッドをどのように実行させるかまでは制御できません。

## ゲームエンジンでのスレッド

ゲームエンジンではマルチタスク処理の方法の一つとして、エンジンのサブシステム毎にスレッドを割り当てて実行する方法があるようです。この場合、メインスレッドではメインのゲームループを処理しつつ、サブシステムの処理をコントロールして同期させます。

このようなアーキテクチャは基本的に、プロセスが動作対象とするハードウェア上にある何らかのスレッドライブラリによってサポートされています。PS3ならSPURS、UnityやUE4で開発するならエンジン側でAPIを用意してくれています。

# 昔のスレッド

昔、スレッドは「ライトウェイトプロセス」とも呼ばれていました。由来はUNIXであり、もともとUNIXにはプロセスしかなく、並列処理を行うためには一つのプロセスから子プロセスを作成していました。しかしこれでは環境をコピーするコストが大幅にかかり、切り替え速度も遅いため、高速で切り替えが可能で軽量なプロセスとしてスレッドが導入されました。Windowsはこれに習い、プロセスとスレッドを導入しました。

# 参考

- [イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜](https://moro-archive.hatenablog.com/entry/2014/09/11/013520)
- [意味の違いがわかる？ タスクとプロセスとスレッド](http://ascii.jp/elem/000/000/653/653041/index-4.html)
- ゲームエンジンアーキテクチャ(文献)
【小ネタ】プロセスってなんだろう？という話

# 最初に

本記事は「プロセス」について少し掘り下げた解説記事となります。

ただしOSによって異なる箇所(例えばどこのメモリを確保するか等)やMMUの話はまたそのうち別の記事として解説しようと思います。

スレッドについては→[【小ネタ】スレッドってなんだろう？という話](https://qiita.com/4_mio_11/items/f97a5ac374bd56b6bc22)
並列処理・並行処理については→[【小ネタ】並列処理とは何か？そして並列処理と並行処理の違いとは？](https://qiita.com/4_mio_11/items/7f418ca661d9f5a2a39d)
非同期については→[Unity非同期完全に理解するための第一歩～非同期処理とは何か～](https://qiita.com/4_mio_11/items/3a0b06819d9591c5d410)

# プロセス

私達が普段起動し使用しているゲームやツール等、それら**一つ一つのアプリケーションと、そのアプリケーションに対する「管理情報」をまとめたもの**が**`プロセス`**と呼ばれます。OSから見た時には、**プロセスが1つの実行単位**となります。

プロセスは、**アプリケーションのリソースを保持する機能**と、**アプリケーションの命令を実行する機能**を持っています。

アプリケーション中で割り込みが入った場合には、現在のプロセスで処理中のデータを失う事なく別プロセスへ切り替えるために、**CPUが現在の内部状態(レジスタやフラグなど)を保存**し、プロセスがすぐに**実行状態を読み込んで処理を復帰**できるようにします。この時に保存されたCPUの内部状態の事を**`コンテキスト`**と呼びます。コンテキストはプログラムの実行と共に変化し続けています。プロセスはこのコンテキストの保存領域を用意・管理し、適切なタイミングで保存・復帰を行います。これを**`コンテキストスイッチ`**と呼びます。

１つのCPUが一定時間毎にコンテキストスイッチを用いることで**複数のプロセスを同時に実行状態にする**ことができます。このような処理方法を**`マルチタスク(またはマルチプロセス)`**と言います。


# プロセスのメモリ確保

プロセス間は同じプログラムを使用していない限りは**メモリを共有しません**。それぞれ個別にリソースの割り当てが行われます。32bit版のWindowsでは、プロセスが利用できるメモリー空間は最大2GB(標準設定の場合)となっています。

プロセスはコアの数を増やすことでその分だけ並列処理を行うことができます。

プロセスから更にプロセスをforkして起動することも可能です。この場合**プロセス同士で親子関係ができ**、起動した側は「親プロセス」で起動された側は「子プロセス」と呼びます。この親子関係はセキュリティの設定や管理等にも使用されています。注意しておきたいのは、親子関係だとしても**お互い別々で仮想メモリ空間を使用し、実行タイミングも異なる**点です。

並列処理を行っているプロセスが同じプログラムを使用しているのであれば(例えば親子関係のプロセス)、**コード部分は共有で使用**されています。しかし変数部分のデータはそれぞれ異なるので、MMUという機能が**物理メモリ上には各プロセス毎に固有の領域**が確保し、その物理領域にアクセスするための仮想アドレスを用意してくれます。なので、同一プログラムのプロセスを複数使用していたとしてもメモリ圧迫には留意する必要があります。


# プロセスのメリットデメリット

## メリット

OSによってプロセス同士は関与していないため、一つのプロセスがクラッシュしたとしても、他のプロセスはそのまま実行を続けます。

## デメリット

スレッドに比べるとプロセス間の切り替えはメモリの切り替えを伴うため、遅くなってしまいます。


# 参考

- [イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜](https://moro-archive.hatenablog.com/entry/2014/09/11/013520)
- [意味の違いがわかる？ タスクとプロセスとスレッド](http://ascii.jp/elem/000/000/653/653041/index-4.html)
atcoder ABC113 C問題

競技プログラミングをする際、よく二つの値を保持することがよくあり(人の名前と年とか)、今回もそのようなデータ構造を使えないと解けない問題だったので、mapとはなんぞやというところから復習がわりにメモ。
https://atcoder.jp/contests/abc113/tasks/abc113_c

#mapとは
mapとは連想配列とも呼ばれており、キー(key)と値(value)を保持できるコレクション(後からサイズ可変可能なデータ構造)。keyの重複は許さない。

#mapの種類
HashMap 順番が適当
HashTable keyが降順
TreeMap keyが昇順

#今回の問題の解き方
今回は市の属する県の番号と、市の生まれた年が与えられ、生まれた年は重複しないことを考えると、生まれた年をkey、属する県をvalueとして、Treemapに入れていけば、生まれた年順にソートされるので、そこから配列で各県ごとの順番を更新していけば良い。また、6桁で左から0を詰めていく操作は、以下のようにする。

```java:例

System.out.println(String.format("%06d",  1);

```
```java:結果

000001
```





引用、参考
https://www.sejuku.net/blog/16055
http://kaworu.jpn.org/kaworu/2008-04-10-2.php
MacでChromeからカメラ、マイクにアクセスできないときに確認すること


## 概要

MacbookProからハングアウトを使いたいケースがあったが、カメラとマイクが有効にならずに焦った。
結論としては、システムの設定で明示的に許可をする必要があった。

## 環境

* macOS Mojave
* Google Chrome 最新版


## 事象

Chromeからハングアウトを使おうとしたとき、ビデオとマイクが有効にできない。Safariだと普通に使える。

## 確認すること
### 1. Google Chrome側の許可設定

「設定」 -> 「コンテンツの設定」 -> 「カメラ」（「マイク」）に移動し、
「許可」に「https://hangouts.google.com:443」があることを確認する。

ハングアウトを開いたときに、ブラウザの上の方に「許可しますか」的なことを聞かれるヤツ。許可すると、ここに設定されるっぽい。

### 2. Mac側の許可設定

「システム環境設定」　-> 「セキュリティとプライバシー」 -> 「プライバシー」 -> 「カメラ」（「マイク」）に移動し、「下のアプリケーションにカメラへのアクセスを許可。」に「Google Chrome」があることを確認する。


以上。
2018年だけどデスクトップマスコットを作りたかったんだ

デスクトップマスコット、いいですよね......
2018年も終わりますが「作業中に癒やしを得るためにはデスクトップマスコットしかない！」と思って作りました。

本体は [GitHub/electron-desktop-character](https://github.com/blue0513/electron-desktop-character) に置いておきます。PR 待ってます。

#### 前提条件

[Electron](https://electronjs.org/) を実行可能な環境であること

## What's This

ドラッグ可能なデスクトップマスコットを、スクリーンの最前面に配置できます。

![desktop.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/b04b20be-ed99-6f95-4b22-7ef076a9b642.gif)

## Setup

まず [GitHub/electron-desktop-character](https://github.com/blue0513/electron-desktop-character) を `git clone` します。

### 1. マスコットの画像を配置する

`character` ディレクトリに、表示したいお好みの画像を配置します。
(ex. `character/character0.png` と `character/character1.png`)

### 2. 設定を変更する

まず、`settings.json.sample` を `settings.json` にリネームします。
次に、`settings.json` 内の `images` の部分を先程配置した画像のパスに変更します。

例えばこんな感じ

```settings.json
{
  "images": [
    "character/character0.png",
    "character/character1.png",
    "character/character2.png",
    "character/character3.png",
  ],
  "width": 200,
  "interval": 2000
}
```

## Usage

以下のコマンドを実行してアプリを起動してください。

```sh
$ cd electron-desktop-character
$ electron .
```

デスクトップマスコットが最前面に表示されます！

## Advanced Usage

`settings.json` 内にはいくつかの設定可能な項目があります。

+ `width`: アプリケーションウィンドウの幅
+ `interval`: 画像切替のインターバル
【Laravel】コントローラー内で別のメソッドを呼び出し、その中で return redirect() してもリダイレクトできない

#コントローラー内で別のメソッドを呼び出す

コントローラー内であるメソッドから別のメソッドを呼び出すとき、呼び出されたメソッドの中でリダイレクト処理を実行しようとしてもできません。

例えば以下のようなケース。
（サンプル用に書きましたが、普通はこんな変な書き方はしないと思います。）

```SampleController.php
class UserController extends Controller
{
    function store($request)
    {
        $this->storeUser($request);
        return redirect()->route('user.index');
    }

    function storeUser(Request $request)
    {
        if ($request->has('name')) {
            // $request に name が存在する場合はユーザーを作成
            $user = new User;
            $user->name = $request->name;
            $user->save();
        } else {
            // $request に name が存在しない場合は直前のページへリダイレクトしたい
            return back()->withErrors(['msg', 'エラーです'])
                         ->withInput();
        };
    }
}
```

上記の例で、`$request->name` が存在しない場合はフラッシュメッセージ付きで直前のページへ戻るようなリダイレクト処理を書いています。

しかし、このリダイレクト処理は実行されることはありません。

#どうしてリダイレクトできないのか

`return back()` などとリダイレクト処理を書くと、その処理が実行された瞬間にリダイレクトされるような感覚がありますが（少なくとも自分の場合はありました笑）、これは単に RedirectResponse オブジェクトが返されているだけなのです。

store メソッドに対して RedirectResponse オブジェクトを返しただけでは、当然ながら何も起きません。
（上記の例ではそもそも storeUser メソッドの戻り値を受け取ってすらいません。）

リダイレクトを実行したいのであれば、**store メソッドの呼び出し元**に対して RedirectResponse オブジェクトを返すことが必要です。


以上、初心者的な発想で「とりあえず `return back()` すればリダイレクトしてくれるやろ」と思ってしまった自分に対する反省を込めて。
Rails・assert_selectの色々な指定の仕方

assert_selectには色々な指定の仕方がある。
assert_selectは柔軟でパワフルな機能で、他にも多くのオプションがあるが、レイアウト内で頻繁に変更されるHTML要素 (リンクなど) をテストするぐらいに抑えておくとよい。

|Code              | マッチするHTML        |    
|:-----------------|:------------------|
| assert_select "div" |  `<div>foobar</div>`|  
| assert_select "div", "foobar"  | `<div>foobar</div>` |
| assert_select "div.nav"| `<div class="nav">foobar</div>`|
|assert_select "div#profile"| `<div id="profile">foobar</div>` |
| assert_select "div[name=yo]"|`<div name="yo">hey</div>`|
| assert_select "a[href=?]", ’/’, count: 1 |`<a href="/">foo</a>`|
|assert_select "a[href=?]", ’/’, text: "foo"|`<a href="/">foo</a>`|

参考：[Railsチュートリアル](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#table-assert_select)
Ubuntu(Fcitx)でも日本語入力をトグルからON/OFFにする

Macでは日本語の入力がトグル式ではなく、スペースキーの左右のキーで制御されています。右がON、左がOFFとなっています。Windowsでもそのうちにこちらが標準になりそうですね。( http://www.itmedia.co.jp/news/articles/1812/26/news094.html )

UbuntuにおいてFcitxを利用してる場合には設定で行うことができます。

メニューから「Fcitx設定」をクリックし設定アプリを起動します。
* `Show Advanced Option` をクリックします
* 入力メソッドをオンに、オフにのキーを設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/24465be6-3e0d-1a33-84d1-ccc287ffeb5b.png)

* ALT/Winキーを入れ替えていますので画面では「Rsuper/Lsuper」になっています。（Macに近づけるため）これはキーボードレイアウトのオプションで行うことができます。
* Winキーをショートカットにすると、デスクトップマネージャーのメニューが先に反応してしまうのでそちらのショートカットをオフにしています。
ざっくり、Anacondaアンインストール

#はじめに

Hombrew導入時に[Anacondaの影響によるWaring](https://qiita.com/hanio820/items/df8bc3884398f93778c5)が出て躓きました。
結局、Anacondaが原因と判明。これをアンインストールすることになったので、その手順を簡単にまとてみました。

#環境
Mac OS Mojave Version 10.14

#Anaconda アンインストール手順
大きく4つのステップです。

[1. anaconda-cleanをインストール](#1-anaconda-cleanをインストール)
[2. anaconda-cleanを起動](#2-anaconda-cleanを起動)
[3. Homeフォルダ内のAnacondaファイル削除](#3-homeフォルダ内のanacondaファイル削除)
[4. PATHの削除](#4-pathの削除)

##1. anaconda-cleanをインストール

```$ conda install anaconda-clean```

```
 environment location: /root/anaconda3

  added / updated specs: 
    - anaconda-clean


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    anaconda-clean-1.1.0       |           py36_0           5 KB
    conda-4.5.8                |           py36_0         1.0 MB
    ------------------------------------------------------------
                                           Total:         1.0 MB

The following NEW packages will be INSTALLED:

    anaconda-clean: 1.1.0-py36_0

The following packages will be UPDATED:

    conda:          4.5.4-py36_0 --> 4.5.8-py36_0

Proceed ([y]/n)? y # yを入力

```
最後にyes/no聞かれるので、yesと回答してインストールします。

##2. anaconda-cleanを起動

```$ anaconda-clean```

```
Delete .conda? (y/n): y # yを入力
Backup directory: /root/.anaconda_backup/2018-07-13T095546
Delete .ipython? (y/n): y # yを入力
Delete .jupyter? (y/n): y # yを入力
Delete .theano? (y/n): y # yを入力
```

全てyesと回答して実行。

以上で、Anacondaの不要になったファイルが削除されクリーンな状態になります。
ターミナルでの作業は以上です。

##3. Homeフォルダ内のAnacondaファイル削除

pythonを起動すると、まだAnacondaがあるので、homeフォルダからAnacondaフォルダを削除します。

```$ python```

```
Python 3.6.0 |Anaconda custom (x86_64)| (default, Dec 23 2016, 13:19:00)
```

##4. PATHの削除

bash_profileを起動します。
bash_profileは、平たく言うと、開発環境や起動プログラムの設定を記述する為のファイルです。

```$ open ~/.bash_profile```

以下の様な記述のAnacondaパスを削除します。

```
# added by Anaconda3 4.3.1 installer
export PATH="/Users/hideki/anaconda/bin:$PATH"
```


#最後に


Pythonを起動してMac OS標準のPython2系が起動すればOKです。
つまり、Anacondaは起動していないことになります。

```$ python```

```
Python 2.7.10 (default, Aug 17 2018, 17:41:52) 
```
以上で完了です。お疲れ様でした。
[python]画質評価としてのPSNR

#PSNRとは - 類似度の指標である

PSNRとは, 簡単に言うと, 2枚の画像がどれだけ相違っているかを表す指標のことである. ここで「2枚の画像」がという点が一つの大事なポイントであり, 例えば1枚の画像だけをみて, それが画質が良い悪いを判断する指標ではないことは注意したい. あくまで, 相対的に画質を評価する際の指標であるのだ. このことを頭に置き, 定義を以下に述べていく.


扱う画像は8[bit]であるとする. このとき, 画素値は0から255の値をとるので, 画素値の最大値は255となる. よって, PSNRは次式で求められる. 

```math
PSNR  = 10\log_{10}\Bigl(\frac{255^2}{MSE}\Bigr)
```

この式におけるMSEとは平均二乗誤差のことであり、以下の式で算出される。

```math
MSE  = \frac{1}{Color × N} \sum_{i=0}^{Color}\sum_{j=1}^{N} E(i,j)^2 
```

ただし, Colorは画素を構成している色の数であるので3(i = 0でred, i=1でgreen, i = 2でblueとする), Nは全画素数, E(i,j)は2枚の画像間の, j番目の画素の色iにおける画素値の差とする. 

式で定義をするとややこしくなるが, 意味として考えると見通しが良く, 2枚の画像の画素値の差をRGB値それぞれで計算して, それの平均値を求めているに過ぎない. つまり, 2枚の画像の「相違が少ない」とMSEは小さくなり, 「相違が大きい」とMSEは大きくなる. よって, 「相違が小さい」ならばPSNRは「大きく」なり, 「相違が大きい」ならばPSNRは「小さく」なると考えられる. (分かりやすさのために「相違」という言葉を用いたが, この相違とは2枚の画像の画素値の差のことである. )

#PSNRの1つの使い所
前章の冒頭で, PSNRとはあくまで相対的な画質評価であると述べた. では, どこでPSNRを使えるのかと疑問を抱くと思われる. なので, このPSNRがどのような場面で活躍するのかを述べる. その1つとして, ある画像を圧縮し, その画像の画質評価をする際に役立つと言うことができるだろう. (画像を圧縮していくと, 当然ながらノイズが生じるので, PSNRの値は小さくなっていく.)

2019.8.31 訂正済み
(訂正前)画像を圧縮していくと・・・PSNRの値は「大きく」なっていく.
(訂正後)画像を圧縮していくと・・・PSNRの値は「小さく」なっていく.
#実際にPSNRを算出してみる

以下の3つの画像を提示する. 左から, (1)元画像, (2)74%圧縮画像, (3)92%圧縮画像, とする. ここで74%圧縮とは, 元の画像のデータ量を74%削減したという意味で用いている.

|元画像|74%圧縮 (PSNR : 40.0)|92%圧縮 (PSNR : 31.6)|
|---|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/285948/e2960b70-01da-ca8b-d2f4-8330133047c7.jpeg)|![](https://qiita-image-store.s3.amazonaws.com/0/285948/fad51608-fd1b-7335-2a59-d166e72e73eb.jpeg)|![](https://qiita-image-store.s3.amazonaws.com/0/285948/69315550-a6f0-0b09-929f-dbf5092b2fdf.jpeg)|

上の3つの画像を見れば, 元画像と比べ圧縮した画像は, 「主観的に」画質が落ちているように見えるだろう. このとき客観的な証拠としてPSNRを用いることができる. 

ここで, 次章に載せたコードを用いてPSNRを計算し, その結果を述べていく. (1)と(2)を用いて計算したPSNRが40.0, (1)と(3)ではPSNRが31.6となった. これより, (2)の方が(3)と比べてPSNRの値が大きいので, (2)の方が画質が良い(ノイズが少ない)と客観的に言うことができるだろう. 

#使用したソースコード
```python

import cv2
import numpy as np
import math

#画像の読み込み
Original  = cv2.imread('Original_Image.jpg') #元画像
Distorted = cv2.imread('Distorted_10.jpg')   #圧縮した画像

#画素値の読み込み
pixel_value_Ori = Original.flatten().astype(float)
pixel_value_Dis = Distorted.flatten().astype(float)

#画素情報の取得
imageHeight, imageWidth, BPP = Original.shape

#画素数
N = imageHeight * imageWidth 

#1画素あたりRGB3つの情報がある. 
addr = N * BPP

#RGB画素値の差の2乗の総和
sumR=0
sumG=0
sumB=0

#差の2乗の総和を計算
for i in range(addr):
    if(i%3==0):
        sumB += pow ( (pixel_value_Ori[i]-pixel_value_Dis[i]), 2 ) 
    elif(i%3==1):
        sumG += pow ( (pixel_value_Ori[i]-pixel_value_Dis[i]), 2 ) 
    else:
        sumR += pow ( (pixel_value_Ori[i]-pixel_value_Dis[i]), 2 ) 

#PSNRを求める
MSE =(sumR + sumG + sumB) / (3 * N )
PSNR = 10 * math.log(255*255/MSE,10)
print('PSNR',PSNR)
```
ディレクトリ配下のファイルの、1行あたりの文字数を求めるワンライナースクリプト

「1行あたりの文字数が80文字より多いソースコードの行を見つける」ということを実現するためのスクリプトです。

## スクリプト
```powershell
Get-ChildItem -Filter "*.cpp" -Recurse | ForEach-Object { $filename = $_.Name; Get-Content $_.FullName | ForEach-Object { $i = 0 } { $i++; [PSCustomObject] @{ filename = $filename; location = $i; length = $_.Length} } } | Where-Object { $_.length -gt 80 } | Sort-Object -Property length
```
## 簡単な解説
### ディレクトリ配下のファイルをワイルドカードで列挙し、

```powershell
Get-ChildItem -Filter "*.cpp" -Recurse | 
```

### 各ファイルの各行の文字数をオブジェクトにします。

```powershell
ForEach-Object { $filename = $_.Name; Get-Content $_.FullName | ForEach-Object { $i = 0 } { $i++; [PSCustomObject] @{ filename = $filename; location = $i; length = $_.Length} } } | 
```

### さらに、フィルタで80文字より多い行に絞ります。

```powershell
Where-Object { $_.length -gt 80 }
```

### 必要に応じてソートします。
```powershell
| Sort-Object -Property length
```

### 留意事項
- 文字列として数えているので、タブ文字は1文字です。
- ファイルのエンコーディングの扱いは手を抜いてます。決まっているのであれば `Get-Content`の引数に`-Encoding`をつければいいでしょう。
低コストでwebをリッチに見せたい【レイジーロード】

## 目的
webアプリやサイトを構築する時って、インタラクティブな演出（スクロールするとアニメーションする、クリックすると光るetc）を入れるとリッチだなって人は認識すると思うのですが、機能ではないので工数との兼ね合いもあって優先はされないものだと思います。

プラグインも良いんですが、機能編集とか面倒なので

- 低コストなら今後使われやすい
- 弱い分野なのでスキルアップできる
- 拡張が簡単
- 編集が簡単
- 今後サンプルとしてデザイナやディレクタに見せれた方がやりやすい(この動きどうですか？っていう提案ができる)

こんな理由で取り組んでみました。

## レイジーロード
参考：https://www.hoshinoresorts.com/recruit/
レイジーはjavascriptで表示領域内にコンテンツが来たら表示するっていう機能を作ってあげれば、あとはcssで簡単にリッチ感を出していけるかなと思ったので、今回はレイジーに取り組みました。表示される時のアニメーションの作成・編集を簡単にして、バリエーションを出したいと思います。

SEO観点では、プロジェクトではあんまり使われないですが、コンテンツを選べば大丈夫かと思います。
(display:noneはダメってよく聞くけど、opacity:0もダメなのかな）

## サンプル
https://codesandbox.io/s/m4m1ppy568

```.HTML
<!--index.html-->
・・・
<ul>
  <li><div class="item" data-scroll-anime="in_blur_up"></div></li>
  <li><div class="item" data-scroll-anime="in_blur_rotate_up"></div></li>
</ul>
・・・
```
スクロールした時、data属性のvalueをそのままclassに当てます。

```.css
/* css */

/* in_blur_up */
.item.isActive.in_blur_up {
  animation: in_blur_up 1s ease-in-out;
}

@keyframes in_blur_up {
  from {
    opacity: 0;
    filter: blur(10px);
    transform: translateY(25%);
  }

  to {
    opacity: 1;
    filter: blur(0);
    transform: translateY(0);
  }
}

```
data属性のclassがついた時、keyframesで1度アニメーションします

```.js
class scrollAnimation {
  constructor() {
    this.setParameter();
    this.setItemsInfo();
    this.bindEvent();
  }
  setParameter() {
    this.items = [];
    this.$item = document.querySelectorAll(".item");
  }
  setItemsInfo() {
    for (let i = 0; i <= this.$item.length - 1; i++) {
      const obj = {};
      const item = this.$item[i];
      obj.item = item;
      obj.offsetTop = item.offsetTop;
      obj.itemHeight = item.offsetTop + item.clientHeight;
      this.items = [...this.items, obj];
    }
  }
  bindEvent() {
    window.addEventListener("scroll", () => this.addAnimation());
  }
  addAnimation() {
    const scrollTop = window.scrollY;
    const scrollBottom = scrollTop + window.innerHeight;

    this.items.forEach(item => {
      if (
        item.offsetTop === 0 ||
        (scrollTop <= item.offsetTop && scrollBottom >= item.itemHeight)
      ) {
        item.item.classList.add("isActive");
        if (item.item.dataset.scrollAnime) {
          item.item.classList.add(item.item.dataset.scrollAnime);
        }
      }
    });
  }
}

new scrollAnimation();

```
objectを生成します。
itemとitemのy位置、y+itemの高さで登録します。
scrollイベントの中で、objectをeachして、画面内にアイテムがあれば、classを追加します。

scrollのなかで、eachしているので処理が重い部分を
どうにかしたいのが今後の課題です。


## 得た知識(めも)
①水平スクロールバー（表示されている場合）を含む、ブラウザウィンドウの ビューポート (viewport) の高さを返します。

```.javascript
var intViewportHeight = window.innerHeight;
```

②要素の高さ、幅の取得

```.javascript
var client_w = document.getElementById('box').clientWidth;
var client_h = document.getElementById('box').clientHeight;
```

③add class

```.javascript
element.classList.add("mystyle");
```

④data属性の取得

```.javascript
// data-name="tarou"だった場合
var name = document.getElementById('item').dataset.name;
// name = tarou
```

## 終わりに
todo:
パフォーマンスチューニング
foliumで一宮の場所を見る

#TL;DR;

引っ越しをしたので自分の場所の一宮がよくわからない。初詣に行こうと思う。
せっかくだから全国の場所も確認したかった。それだけです。

# 環境
Anaconda 64bit Python3

## 一覧の取得
Wikipediaの[**諸国一宮一覧**]
(https://ja.wikipedia.org/wiki/%E4%B8%80%E5%AE%AE#%E8%AB%B8%E5%9B%BD%E4%B8%80%E5%AE%AE%E4%B8%80%E8%A6%A7)を参照しました。

## csvへ加工

[Google スプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/)を利用して適当に加工しました。

``` csv
国名,社名,所在地
肥後国,阿蘇神社,熊本県阿蘇市
但馬国,粟鹿神社,兵庫県朝来市
安房国,安房神社,千葉県館山市
...
```

## Geocoding

今回はGoogleMaps APIを利用します。

API Keyを先に取得しておきます。下記サイトを参考に取得しました。
https://nendeb.com/276

pythonからGeocoding可能なモジュールがあったので利用しました。

``` shell
conda install -c conda-forge googlemaps 
```

コードは下記の通りです。

``` python
import csv
import googlemaps

# GoogleMaps API Key
api_key = '***' # 取得したAPI KEYを入力してください。
gmaps = googlemaps.Client(key=api_key)

# read csv
geo_loc = list([['site','lat','lon']])
with open('一宮一覧.csv', 'r', encoding='utf-8') as fp:
    reader = csv.reader(fp)
    header = next(reader)
    for row in reader:
        results = gmaps.geocode(row[1])
        for result in results:
            addr = result['formatted_address']
            location = result['geometry']['location']
            lat = location['lat']
            lng = location['lng']
            geo_loc.append([row[1], lat, lng])

# write csv
with open('geocoding_list.csv', 'w', encoding='utf-8', newline='') as fp:
    writer = csv.writer(fp)
    for line in geo_loc:
        writer.writerow(line)
```


## Mapping

Geocodingの結果を地図に落とし込みます。

``` shell
conda install -c conda-forge folium 
```

``` python
import folium

m = folium.Map(location=[36.003583, 138.000791],
               zoom_start=7,
               attr='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors')

with open('geocoding_list.csv', 'r', encoding='utf-8') as fp:
    reader = csv.reader(fp)
    header = next(reader)
    for row in reader:
        code = [float(row[1]), float(row[2])]
        folium.Marker(code, popup='<i>{}</i>'.format(row[0])).add_to(m)

m.save('ichinomiya.html')
```

## 結果
下記の通りとなりました。
https://porksteak3.github.io/IchinomiyaMap/ichinomiya.html

<img width="739" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/157364/04148b5b-e33d-8882-7a0a-a16275e59a52.png">


## おわりに
* 今回みたいに100以下ならサクッと表示されると思うんだけど1000以上になってくるとさすがに表示が重い
* Geocoding後の結果を精査してないので誤りがある可能性が高いです
ブロック要素とインライン要素について

## なぜこの記事を書いたのか

HTML、CSSの基礎を振り返ってた時にあやふやだったブロック要素・インライン要素をまとめておきたかったからです。

<br>

<br>

## ブロック要素とインライン要素について
ブロック要素・・・大枠で設定されている要素。特徴としては
・囲われた物の前後に改行が入る。
・囲われた文字の端まで背景色が広がる。
・h1タグやdivタグがこの要素を持っている。
![IMG_0034.jpg](https://qiita-image-store.s3.amazonaws.com/0/280579/bacaae20-80eb-9e95-bfa7-d53d47626bf3.jpeg)




インライン要素・・・改行などが入らない小さな要素。特徴としては
・背景色を設定しても、対象物のギリギリまでしか広がらない。
・名前通りコンパクトにまとめてくれる
・spanタグやa hrefなどがこの要素を持っている。
![IMG_0035.jpg](https://qiita-image-store.s3.amazonaws.com/0/280579/53950ac3-7802-989c-61dd-a9999c721e19.jpeg)

<br>
なお対象タグのclassやidにcssで
```display:inline;
display:block;
```
と書けば、インライン・ブロックの切り替えができる。
Linux RAID: RAID1 で取り残されたコンポーネントを全コピーすることなく復旧する

原理的にできそうだと思ってやったところ実際に成功した。
（特殊ケースなので参考になるか不明）

#前提
- Ubuntu16.04.1
- RAID1 のアレイ（2コンポーネントで構成）について、正常状態→1コンポーネントが（特にデータ含め壊れていないものの）正常に接続・認識されていない状態で、（運悪く）アレイがstartされてしまい、かつそのアレイに対しwriteがあった（「片割れ」発生後の差分は多くはない）
 - 上記の正常に接続・認識されなかったコンポーネントを「片割れ」と呼ぶことにする
- 「片割れ」のデータは片割れ発生直前時までは正常（であるはず）のため、そのデータをなるべく生かして復旧したい
 - 今回は「片割れ」がSSDで起こったため、そのSSDへの書き込みをなるべく減らしたいという思い
- HDDなど書き込みがあっても許容できるストレージ（安いストレージ; 空きストレージ）を持っている必要あり

#簡易手順
1. 空きストレージを mdadm --add して、resync 完了まで待つ（クローン元と呼ぶ）
2. アレイをstop、mdadm のモニタリングプロセスを殺す
3. クローン元から「片割れ」に対し、差分のみコピーを実施
4. クローン元を接続解除後、アレイをstart(assemble)する

#説明
- 普通に mdadm --add {アレイ} {「片割れ」} でいきなり復旧するとresyncがかかり「片割れ」に対し全部書き込みが発生してしまうので、その戦略はとらない
- なぜ中間のディスク(上記でいうと「クローン元」）を使用するのか? 
 -　実験環境にていきなり生存コンポーネントから「片割れ」に対し差分のみコピーを実施したが、それらを用いてうまくassemble できなかったため、やむを得ず
  - コンポーネントとなるパーティションの領域のなかに、実データ以外のメタデータとして、例えば「自分は何番のコンポーネント」とかの情報を持っている。生存アレイのクローンはその情報までクローンされてしまい、mdadm側がうまくassembleできないのではないかと推測
- 当然といえば当然ながら、アレイがルート(/)パーティションとなっている場合は、別ディスクのOSを準備してやったほうが無難（それ以外の方法は試していない）
    - アレイがルートパーティションの場合は、1. 〜3.は別ディスクOS上で実施し、シャットダウン後、4. を実施

- 3. の差分のみコピーのやり方について。適したツールとかあるかもしれないが、今回は以下のスクリプトで実施
    - ループ回数とかは環境により要見積り。必要数より大きくなるのは問題ない
    - 今回は使えるパーティションがなかったため中間ディスクとしてループバックデバイスを使用
        - 前準備概要: losetup でデバイス作って parted で全く同じサイズのパーティションを作る
 
    - 効率分析用の echo があるが消してよい
 
```bash
FROM=/dev/loop7p1
TO=/dev/sdh1

for i in $(seq 95800); do
        skips=$((i-1))

        FROM_MD5=$(dd if=$FROM bs=5M count=1 skip=$skips | md5sum | awk '{print $1}')
        TO_MD5=$(dd if=$TO bs=5M count=1 skip=$skips | md5sum | awk '{print $1}')

        result=$([ "$FROM_MD5" = "$TO_MD5" ]; echo "$?")
        echo RESULT $result $FROM_MD5 $TO_MD5

        if [ "$result" = 1 ]; then
                dd if=$FROM of=$TO bs=5M count=1 skip=$skips seek=$skips
        fi
done
```
WordPressのお引越し作業

WordPressのサーバーお引越しをしました。
運営していたWebサイトの売却が決定したので、売却先の契約しているサーバーに移行する必要がありました。

普段、サーバーサイドの操作は避けてきたので、レンタルサーバーの移行にも苦戦してしまいました（苦笑）
備忘録的に残しておきます。

# 引越しの流れ
1) 既存のレンタルサーバーからデータをエクスポートする
2) 既存のデータベースからデータをエクスポートする
3) 移行先のデータベースにデータをインポートする
4) 移行先のレンタルサーバーにデータをインポートする

ざっと、この流れです。
[All-in One WP Migration](https://wordpress.org/plugins/all-in-one-wp-migration/)というWordPress移行をめちゃくちゃ簡単にしてくれるプラグインがあるみたいですが、今回は記事数が200を超えており、GUIだけでの作業では無理があるかなと思い、断念しました。

# 既存のレンタルサーバーからデータをエクスポート
<img width="943" alt="スクリーンショット 2018-12-29 23.43.33のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/116375/530cd8fd-b5e9-dfeb-1114-39af3332c8ab.png">

データのエクスポートは、レンタルサーバーのファイルマネージャーや、WordPress管理画面からもできるみたいですが、普段よりCyberDuckで操作しているので、今回も普通にCyberDuckからローカルにダウンロードしてきました。

# 既存のデータベースからデータをエクスポート
<img width="1013" alt="スクリーンショット 2018-12-29 23.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/116375/eb2360f0-6cd0-b142-8d6a-f3e1df729a7c.png">

データベースはレンタルサーバーに入っているphpmyadminの管理画面からログインしてエクスポートしました。

# 移行先のデータベースにデータをインポート
<img width="987" alt="スクリーンショット 2018-12-29 23.51.24のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/116375/d439b456-d382-2a5b-80b7-f595c3c2291d.png">

当たり前ですが、まず移行先にデータベースを新規作成する必要があります。
この時、作成する際に下記の情報は書き留めておいてください。
① データベース名
② データベースユーザー名
③ データベース接続パスワード
④ データベースホスト名

# 移行先のレンタルサーバーにデータをインポート
<img width="1023" alt="スクリーンショット 2018-12-29 23.59.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/116375/f72df404-a971-0f71-febd-a7c76a11ab76.png">

作成したデータベース先に、既存のレンタルサーバーからインポートしてきたデータベースをインポートしていきます。サイズが大きすぎてか、途中でエラーが起こり、アップロードを中断してしまうようなこともありましたが、何度かやっているうちに全部入りました。

# 「wp-config.php」のファイルを編集
```PHP
/** WordPress のためのデータベース名 */
define('DB_NAME', '①データベース名');

/** MySQL データベースのユーザー名 */
define('DB_USER', '②データベースユーザー名');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', '③データベース接続パスワード');

/** MySQL のホスト名 */
define('DB_HOST', '④データベースホスト名');
```
ルートディレクトリにある「wp-config.php」を移行先で作成したデータベースの内容に合わせていきます。

# トラブルシューティング

今回見舞われてしまったのが下記の3つでした。

## データベース接続確立エラー

エラー文もなく、ただこれだけ突きつけられると凹みます。
先ほど、データベースの内容を更新した「wp-config.php」に下記のコードを加えてあげると、どこがエラーになっているかが分かります。

```PHP
define( 'WP_DEBUG', true );
```
自分の場合は、ファイルが全部きちんとアップロードされていなかったみたいでした。

## トップページ以外にいけない
<img width="1197" alt="スクリーンショット 2018-12-30 0.02.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/116375/d70822f6-20ed-49bc-6c4e-45e3dc3c8c77.png">

なぜか、トップページ以外を見ようとすると「404」になりました。
WordPressの管理サイト > 設定 から、何も触らず「変更を保存」をすると直りました。

## table_prefixを更新 
データベースの接頭尾を既存のデータベースに合わせてあげる必要があります。
作成したデータベースは「wp_」となっていましたが、既存のデータベースは「wp37cac6」となっていて、インポートしても一つも記事が表示されませんでした。「wp-config.php」の下記を更新されば直りました。

```PHP
$table_prefix  = 'wp37cac6';
```