OmniAICreator/Qiita-1.07M huggingface dataset:
ソースコードに変更があるたびに行単位のカバレッジをエディターに反映する

## はじめに

カバレッジの情報をリアルタイムでエディターに反映できるようにしたときのメモ。

## 筆者の環境

* yarn
* node.js 8.10
* nyc[^1]
* atom

## テスト実行時にカバレッジを出力する

### nyc をインストール

```
yarn add nyc --dev
```

### package.json に yarn test 実行時の script を書く

```package.json
  "scripts": {
    "test": "nyc -r lcovonly -r text mocha --recursive test/unit/**/"
  },
```

### テスト実行

```:テスト実行
yarn test
```

`coverage/` 配下にカバレッジが出力されるようになる。

```
λ tree coverage
coverage/
└── lcov.info
```

ターミナルの表示:

<img width="765" alt="スクリーンショット 2019-02-11 18.54.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/239145/f3703c7e-a89b-56ff-b3b1-786adf234a70.png">

## ソースコードに変更があるたびにテストコードを実行する

onchange[^2] をインストール

```
yarn add onchange --dev
```

これで、コードの変更を監視して、変更があるたびにテストを実行するようになる。

```bash
onchange lib/**/*.js test/unit/**/*.js -- yarn test
```

せっかくなのでyarn のscriptに登録する。

```package.json
  "scripts": {
    "test": "nyc -r lcovonly -r text mocha --recursive test/unit/**/",
    "watch": "onchange lib/**/*.js test/unit/**/*.js -- yarn test"
  },
```

## カバレッジの情報をリアルタイムにエディタに反映する

Atom の拡張に Coverage Merkers[^3] というのがあった。
ネイティブ拡張なので再ビルドの必要があるが、何かの拡張 package が node-gyp を使っているらしく、 Python 3.x 系だとビルドに失敗する。仕方ないので python 2.7 に切り替えてインストールする。

```
pyenv locla 2.7.15
apm install coverage-markers
apm rebuild
```

Mac の場合、 `Opt + Ctrl + O` で行単位のカバレッジの表示／非表示をトグルできる。。

Atom エディタの画面:

<img width="574" alt="スクリーンショット 2019-02-11 13.24.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/239145/a94ae0d6-862f-3e50-40ff-54738fccffe8.png">

テストコードがカバーされていない行の左側に赤い丸印がつく。

# 参考

[^1]: https://github.com/istanbuljs/nyc
[^2]: https://github.com/Qard/onchange
[^3]: https://atom.io/packages/coverage-markers
DockerでOracle11gを構築する

# はじめに
とある事情にてOracle11gの環境が必要になりました。
手持ちのMacBook1台で開発環境をFIXさせたいため、Dockerにて構築することにしました。

# 前準備
* Dockerは導入済みとします。<br>
[Docker for Macをインストールしてみた](https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68 "Docker for Macをインストールしてみた") が非常にわかりやすいと思います。
* Oracle.comのアカウントは作成済みとします。<br>
まだの方は
[Oracleプロファイルの作成](https://profile.oracle.com/myprofile/account/create-account.jspx "Oracleプロファイルの作成") から作成します。


# 構築作業

##GitHubからOracleのDockerイメージをダウンロードする

```
$ git clone https://github.com/oracle/docker-images.git

```

##Oracle本体をダウンロードする
Oracleのダウンロードサイトから、Oracle本体をダウンロードする必要があります。
今回は11gの「Linux x86-64」からダウンロードしてきます。


##Oracle本体をDockerイメージに配置する

Dockerで動かすOracleはシングル構成とRac構成が選択できます。
今回構築する環境は__シングル構成__とします。

ダウンロードしたOracle本体をzipファイルのまま、Dockerイメージにコピーします。
docker-images/OracleDatabase/SingleInstance/dockerfiles/に各バージョンごとにディレクトリがありますので、Oracle本体と対応したディレクトリに配置する必要があります。
11g以降のバージョンがDockerで利用できることがわかりますね。


```
$ ll docker-images/OracleDatabase/SingleInstance/dockerfiles/
total 16
drwxr-xr-x   8 oracle  staff   256  2 10 19:22 ./
drwxr-xr-x  10 oracle  staff   320  2 10 15:53 ../
drwxr-xr-x   9 oracle  staff   288  2 10 16:09 11.2.0.2/
drwxr-xr-x  18 oracle  staff   576  2 10 15:53 12.1.0.2/
drwxr-xr-x  16 oracle  staff   512  2 10 15:53 12.2.0.1/
drwxr-xr-x  16 oracle  staff   512  2 10 15:53 18.3.0/
drwxr-xr-x   8 oracle  staff   256  2 10 15:53 18.4.0/
-rwxr-xr-x   1 oracle  staff  5088  2 10 15:53 buildDockerImage.sh*
```

##イメージをビルドする

buildDockerImage.shを叩いてイメージをビルドします。
コンソールに「Successfully tagged oracle/database:11.2.0.2-xe」と出ればOKです。

```
$ docker-images/OracleDatabase/SingleInstance/dockerfiles/buildDockerImage.sh -v 11.2.0.2 -x -i

(中略)

Successfully built 763f697f8cfb
Successfully tagged oracle/database:11.2.0.2-xe


  Oracle Database Docker Image for 'xe' version 11.2.0.2 is ready to be extended: 
    
    --> oracle/database:11.2.0.2-xe

  Build completed in 120 seconds.
  

```

##コンテナを起動する
コンテナの起動直後にOracleのSYSユーザとSYSTEMユーザのパスワードがコンソールに表示されます。
コンソールログがガンガン流れるため、見失わないようにしましょう。

```
$ sudo docker run -p 1521:1521 --shm-size=1g --name oracle11 oracle/database:11.2.0.2-xe
ORACLE PASSWORD FOR SYS AND SYSTEM: XXXXXXXXXXXXXX
```

以下のメッセージがコンソールに表示されたら、Oracleが利用できる状態となります。

```
#########################
DATABASE IS READY TO USE!
#########################
```

この後も処理が続き、私の環境では結構エラーが出ていましたが、無視しても問題ありませんでした。

##起動確認

SQLPlusを使用して、作成したOracleDatabaseに接続してみます。

```
$ sqlplus system@localhost:1521

SQL*Plus: Release 12.2.0.1.0 Production on Mon Feb 11 13:13:27 2019

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

Enter password: 

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> 
```

できました！！！
rails serverにまつわるportとGemfileに関するエラーへの対処

#rails sができない
チュートリアルや記事を参考にしながら簡単なアプリケーションを作ろうとrailsを触っていました。
気がつくと`rails s`を行う際にエラーが出たりして実行できなくなっていました。
railsとrubyのversionがおかしくなっているのではないかと考えたため、以下の記事を参考にしてversionを整えようとしました。

[Homebrewのインストールとrbenvのインストールまで Mac編](https://qiita.com/is-lab/items/e0443b79da117ed48294)

無事にインストール・アップデートを行いましたが、以下のエラーが出現しました。

#portの問題

```
`initialize': Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE)
```

というエラーを得ました。
調べると、port 3000が既に使われているということです。

```
$ lsof -wni tcp:3000
```
これでportの状態を確認すると、

```
COMMAND PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    878   name   19u  IPv4         number      0t0  TCP *:hbci (LISTEN)
```
このPID 878が使われているようなので、

```
$ kill -9 878
```
で削除します。何もエラーが返ってこなかったら大丈夫です。次に進みます。

```
$ rails s 
```
をやっと行うことができました！

#Gemfileの問題

```
$ rails new app
$ rails generate model Task date:date title:string 
```
でアプリケーションの開発を開始しようとしたら以下のようなエラーが。

```
 `block (2 levels) in replace_gem': Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? can't activate sqlite3 (~> 1.3.6), already activated sqlite3-1.4.0. Make sure all dependencies are added to Gemfile. (LoadError)
```

解決策としてはエラーメッセージ通りにGemfileにsqlite3のversionについて書き足してあげましょう。

```ruby:Gemfile
+ gem 'sqlite3', '~> 1.3.6'
```

よし、これでいけるかと思い再びrails new　コマンドを打ちましたが今回は以下のエラーが。

```
 `search_for': Unable to resolve dependency: user requested 'did_you_mean (= 1.0.0)' (Gem::UnsatisfiableDependencyError)
```

dependencyの問題ということで以下のコマンドを。無事に解決できました。

 ```
$ bundle update
```
updateまで行う必要がありますね。


##参考サイト
[rails sしようとしたらAddress already in useと言われた](https://qiita.com/ebkn/items/7c3cdde49641ec5e5b61)
[Homebrewのインストールとrbenvのインストールまで Mac編](https://qiita.com/is-lab/items/e0443b79da117ed48294)
【Unity】インスペクタの表示を動的に変更する

## インスペクタのプロパティ変更に応じて、表示内容を動的に変更する。


チェックボックスの有無で、各設定の表示／非表示が切り替わるだけの、簡単なサンプル

- 動作結果
![20190211.gif](https://qiita-image-store.s3.amazonaws.com/0/203490/5bf9fa58-ea4a-4f92-99f2-b8d41616ff30.gif)


- GameObject側

```cs:HogeEditor.cs
using UnityEngine;
public class HogeObject : MonoBehaviour
{
    public bool EnableShadow = false;
    public ShadowSetteing Setteing = new ShadowSetteing();

    [System.Serializable]
    public class ShadowSetteing
    {
        public Color EffectColor;
        public Vector2 Distance;
        public bool UseAlpha;
    }
}
```


- Editor側

```cs:HogeObjectEditor.cs
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(HogeObject))]
public class HogeObjectEditor : Editor
{
    private HogeObject _target;

    private void Awake()
    {
        _target = target as HogeObject;
    }

    public override void OnInspectorGUI()
    {
        EditorGUI.BeginChangeCheck();

        _target.EnableShadow = EditorGUILayout.ToggleLeft("EnableShadow", _target.EnableShadow);
        if (_target.EnableShadow)
        {
            EditorGUILayout.LabelField("影の設定");
            _target.Setteing.EffectColor = EditorGUILayout.ColorField("色", _target.Setteing.EffectColor);
            _target.Setteing.Distance = EditorGUILayout.Vector2Field("距離", _target.Setteing.Distance);
            _target.Setteing.UseAlpha = EditorGUILayout.Toggle("透過", _target.Setteing.UseAlpha);
        }

        // GUIの更新があったら実行
        if (EditorGUI.EndChangeCheck())
        {
            EditorUtility.SetDirty(_target);
        }
    }
}
#endif
```
【Laravel】実行されたSQLを取得する

実行されたSQLを出力します。
SQLだけでなく、プリペアドステートメントや実行時間も出力されるので便利です。

>[Laravel 5.0 データベースの基本的な使用法](https://readouble.com/laravel/5.0/ja/database.html)

# ログの出力

```php
// ログを有効化
DB::enableQueryLog();

City::where('Name', '=', 'Kabul')->get();

// ログ出力
dd(DB::getQueryLog());

// ログを無効化
DB::disableQueryLog();
```

# 出力結果

```php
array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `city` where `Name` = ?"
    "bindings" => array:1 [▼
      0 => "Kabul"
    ]
    "time" => 6.46
  ]
]
```
dockerでnginx-proxy使用時の503エラー

久しぶりに投稿するとタイトルに悩む・・・

# エラー現象
`jwilder/nginx-proxy`を使用してドメインごとにコンテナ振り分けようとしたときに503エラーが出た

# 結論
先に原因書くと自分で`DockerFile`書いているときは、ファイル内に`EXPOSE 80`書かないとプロキシに認識されない。

# 経緯

## 1. エラー発生
ブラウザから見て503出たのでログを確認したところ、下記になっていた。
```
no live upstreams while connecting to upstream, client: *.*.*.*, server: domain.com, request: "GET / HTTP/2.0", upstream: "http://domain.com/", host: "domain.com", referrer: "https://domain.com/"
```

## 2. 原因調査

幸いにもすでに稼働中のほぼ同じ環境が手元にあったので比較しながら調査。
・確認項目
1. アプリ側のコンテナに入って、`curl http://localhost`　→　OK
2. `docker ps`の内容比較　→　NG:portsの記載が違う

正しい環境だと`80/tcp`があるのに問題環境だと何も記載がない

## 3. 原因

今回勉強がてら、centos7からhttpdとphpをまとめたDockerFileを作ってたんですがそこに`EXPOSE 80`がなかったのでエラーが出ていました。
開発環境だと`docker-compose.yml`にポート指定書いていたんで気づくのが遅れました・・・
好きなキャラクターにエアコンをつけてもらおう

[Raspberry PiとArduinoでエアコンIoT化]
(https://qiita.com/yossy-h/items/acca370c2849701135aa)の拡張版です。
ただツイートしただけではシステムが動いてるのか分からないしなによりちょっと寂しいので、Botを使って好きなキャラクターに反応してもらおうということでやってみました。今回は家にいるバーゼラルド(画像参照)にエアコンをつけてもらうという設定でやっていきます。Theオタクって感じだ
![DzGHAC4UUAEEHIz.jpg](https://qiita-image-store.s3.amazonaws.com/0/136842/a9c31931-7214-8212-3ee3-7b961450a2f9.jpeg)

#やること
ハードウェアに関しては前回終えていていじる必要は無いので、Node-RED上であれこれやるだけで済みます。
<img width="569" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/c3117bbf-4e9f-be7e-c137-e8595a69c22b.png">
これが暖房起動の全体像です。
<img width="387" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/e784301a-34f6-a582-3723-19abb8bc701b.png">

twitter(入力)ノードは特に前回と変わりませんが、トリガーになるワードをそれっぽく変えてみました。
<img width="394" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/35e40c10-7354-5024-9f2a-8c2ae71ef7dc.png">
switchノードもそれに合わせて修正。
<img width="387" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/3d0a74cf-b066-5d6e-98a1-2ca4597156d4.png">

functionノードなのですが、ここでBotにツイートさせたい内容をmsg.payloadに入れておきます。twitterでリプライの形にするために@xxxxxx、スペース、お好きな内容といった感じにしましょう。
<img width="376" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/8476b406-eafd-0acf-4052-9e3e72d28fdc.png">
文頭に@xxxxxxをつけただけではユーザーに対するリプライになるだけなので、ここでトリガーとなるツイートに対して返信できるようにしておきます。
<img width="383" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/54c9a108-e82f-7fe2-3f25-a25d9649176b.png">

最後にtwitter(出力)ノードに繋げることでmsg.payloadの中身をツイートします。ここでのTwitter IDは自分のアカウントではなくBotのIDなので注意して下さい。
execノードは特に変更しなくていいです。
#動かしてみた
<img width="471" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/136842/98ccca35-6d56-0306-0e47-1d99b0ea082b.png">
yeah～

参考
[Node-REDのTwitter botでリプライ形式にする]
(https://qiita.com/techstrom/items/e196fc21a5a66f65286f)
[フレームアームズ・ガール バーゼラルド]
(https://www.kotobukiya.co.jp/product/product-0000002070/)
RxJavaのintervalでonPauseで停止、onResumeで再開させる

## やりたいこと
`Observable.interval`を使って５秒おきにViewを操作させるアプリがあったとする。
アプリがバックグラウンドになればView操作を停止、フォアグラウンドならView操作を再開させたい。
これをRxJavaで実装してみた。

## コード

```java
private AtomicBoolean resumed = new AtomicBoolean();
private AtomicBoolean stopped = new AtomicBoolean();

private void start() {

    Observable.interval(5, TimeUnit.SECONDS)
      .observeOn(AndroidSchedulers.mainThread())
      .takeWhile(new Predicate<Long>() {
          @Override
          public boolean test(Long aLong) throws Exception {
              return !stopped.get();
          }
      })
      .filter(new Predicate<Long>() {
          @Override
          public boolean test(Long aLong) throws Exception {
              return resumed.get();
          }
      })
      .subscribeWith(new DisposableObserver<Long>() {

          @Override
          public void onNext(Long aLong) {
              logger.d("onNext " + aLong);
              // ここに動作させたい処理
          }

          @Override
          public void onError(Throwable e) {
              logger.e(e.getMessage());
          }

          @Override
          public void onComplete() {
              logger.d("onComplete");
          }
    })
}

@Override
public void onResume() {
    super.onResume();
    resumed.set(true);
    stopped.set(false);
    start();
}

@Override
public void onPause() {
    super.onPause();
    resumed.set(false);
    stopped.set(true);
}
```

## 感想
希望する動作をしてくれてはいるが、本当はKotlin＋Coroutineで実装したかった。
今回はJavaという制約があったので仕方ない。

## 参考リンク
- https://medium.com/mindorks/auto-viewpager-slider-using-rxjava2-fb1da80878bf
- https://stackoverflow.com/questions/35419062/how-to-stop-and-resume-observable-interval-emiting-ticks#
LaravelのDIでサービスコンテナを使って環境ごとにクラスを使いわける

開発環境の時はslackにさせたい(orさせたくない)とか、動作確認を簡単にするために艦初環境ではバリデーションをゆるくしたいなど、環境ごとに処理を分けたいことがあると思います。
直接コードの中に環境ごとの分岐を書くこともできるのですが、テスタブルではなくなるので、外からクラスを渡せるようにコンストラクターインジェクションを行い、環境に応じたクラスを使い分ける方法とテストコードについて書きます。

## 環境ごとに使いたいクラスを用意する
今回はシンプルにproductionの処理とそれ以外の環境での処理を分けるようにします。処理の内容は環境ごとに違う文字列を返すだけです。

### production用クラス


```Services/Message.php
<?php

namespace App\Services;

class Message
{
    public function makeMessage()
    {
        return 'message';
    }
}
```

### その他用のクラス
先ほどのクラスを継承させて、開発環境などで使われるfakeのクラスを作成しました。

```Services/FakeMessage.php
<?php

namespace App\Services;

class FakeMessage extends Message
{
    public function makeMessage()
    {
        return 'fake message';
    }
}
```

実際には通知先を変えるとか特定の処理を行わないとかもう少しこのクラス内でやることが変わるはずですがシンプルに。

## 呼び出し元
コンストラクタの引数にMessageクラスを渡せるようにしておきます。

```Services/Notification.php
<?php

namespace App\Services;

class Notification
{
    private $messageService;
    
    // インスタンス生成時にMessageクラスを渡せるようにする
    public function __construct(Message $messageService)
    {
        $this->messageService = $messageService;
    }
    
    public function send()
    {
        // どこかに通知をしたとする
        return $this->messageService->makeMessage();
    }
}
```

## サービスコンテナに追加をする
環境ごとにクラスを使い分けたいので、サービスコンテナに記載します。
どのクラスを使うかは、configファイルから取得をします。

元のクラスがMessgeクラスでそれを継承しているクラスがFakeMessageなので、デフォルトではMessageクラスを使用して、使うクラスが指定されている場合のみそのクラスを使うようにします。


```app/Providers/AppServiceProvider.php
public function register() {
    if (!$messageClass = config('app.message')) {
        // configで指定されていないので、Messageクラスを使う
        $this->app->bind("App\\Services\\Message", "App\\Services\\Message");
    } else {
        // Messageクラスの代わりにconfigで指定されたクラスを使う
        $this->app->bind("App\\Services\\Message", "App\\Services\\$messageClass");
    }
}
```

こちらの部分で、`configディレクトリ`の`app.php` のkeyが`message` の値を取得しています。

```php
config('app.message')
```

### 新しくProvidersディレクトリ内に作成する場合
新しくファイルを作成する場合には、app.phpのprovidersに作成したクラスを追加します。

```config/app.php
'providers' => [
    App\Providers\NewProvider::class, // 追加
];
```

### config
.envファイルから値を取得します。

```config.app.php
'message' => env('MESSAGE_CLASS', ''),
```

下記envファイルからその環境で使うクラス名を指定します。(localやstagingなども同様に)

```.env.testing
MESSAGE_CLASS=FakeMessage
```

ここまでで環境ごとに使い分けられるようになりました。
各環境ごとにクラスを分ける場合にはenvファイルに追加すれば環境ごとに変えられます。

## テストコード
そのまま使用をするとtestingの環境として実行されるため、本番環境で動くコードのテストが行えません。
そのためコンストラクタインジェクションで本番環境で実行されるクラスを渡すようにします。


```test/Unit/NotificationTest.php

<?php

namespace Tests\Unit;

use App\Services\Message;
use App\Services\Notification;
use Tests\TestCase;

class NotificationTest extends TestCase
{
    public function testNotification()
    {
        // FakeMessageではなくMessageクラスを使用する
        $notification = new Notification(new Message());
        $this->assertEquals('message', $notification->send());
    }
}
```
【python】openpyxlを使ったマージしたセルのコピー

openpyxlを使ってpythonでエクセルを操作する処理を書いていたのですが、マージされたセルのコピーがシンプルにいかなかったので、その方法を覚え書きしておきます。

```Python
#ブックを開く。
newBook = px.load_workbook("オリジナル.xlsx");
#シートを開く。
newSheet = newBook.get_sheet_by_name("Sheet1");
#シフトする行数。
shiftRow = 9;
#マージされている全セルの範囲情報を使って、ループを回す。
for merged_cell in newSheet.merged_cells.ranges:
	if merged_cell.min_row >= 32 :
		#一旦マージを解除する。これが肝。
		newSheet.unmerge_cells(merged_cell.coord);
		#コピー先のセルの結合範囲情報を作成する。
		newCellRange = copy.copy(merged_cell);
		#コピー先のセルの結合範囲情報をずらす。ここでは9行(shiftRow)分ずらしている。
		newCellRange.shift(0, shiftRow);
		fmt = "{min_col}{min_row}"
		#コピー元のコードを作成。
		copySrcCoord = fmt.format(
			min_col = get_column_letter(merged_cell.min_col),
			min_row = merged_cell.min_row );

		#コピー先のコードを作成。
		copyDstCoord = fmt.format(
			min_col = get_column_letter(newCellRange.min_col),
			min_row = newCellRange.min_row );
		#セルの値をコピー。
		newSheet[copyDstCoord].value = newSheet[copySrcCoord].value;
		#書式があるならそれもコピー。
		if newSheet[copySrcCoord].has_style :
			newSheet[copyDstCoord]._style = newSheet[copySrcCoord]._style;
			
		#マージして完成！
		newSheet.merge_cells(merged_cell.coord);
		newSheet.merge_cells(newCellRange.coord);
```
肝はいったんマージを解除しないとコピーできないということです。
もっと簡単な方法があったら誰か教えてください。
AWS メディアサービスの概要と使いどころ

#AWSメディアサービスとは

AWSが提供しているAWSElementalを主軸とした映像メディア系のサービス群
何を提供しているかは以下を見ればわかるのだが、自身の理解も含めてどんなことができるのか噛み砕いてみた
https://aws.amazon.com/jp/media-services/

大きく３つが可能
1. OTT（オーバザ・トップ）ビデオ配信
2. ブロードキャスト配信
3. メディア変換サービス


OTTビデオ配信は、ライブ映像やビデオファイルなどをインターネットを介して、顧客に映像配信するサービス。

ブロードキャスト配信サービスはOTTとの違いが難しいが、ライブ映像を多地点に同時に提供する
ライブビューイングなども可能（OTTでも可能と思うが）

メディア変換サービスはわかりやすく、元のビデオファイルをMP4やHLSなどのビデオ形式および適切な解像度などに変換し、ビデオ提供をしやすくするサービス
FFMpegで実施していたことがサーバレスで可能

上記から、AWSメディアサービスを使うと
・YoutubeやNetfilxなどのビデオ配信（ライブ含む）
・AmazonVideoなどのVOD（ビデオオンデマンド）サービス
・映画館などで実施しているライブビューイング（youtubeライブなども同等）
・ビデオ変換/ダウンローダサービス（FFMpeg相当のビデオ変換）
ができるようになる

割と初期投資が必要そうな内容を手軽にサービスとして組み込んで始められる
またはすでに提供している業者もサーバレスとしての拡張性やクラウド特有の使った分だけの料金コストになることも魅力の１つと言える

次からはAWSメディアサービスの概要とどこで使うかをざっと記載する

#AWSメディアサービスの概要
##MediaConvert
大規模なブロードキャストやマルチスクリーン配信向けのビデオオンデマンド (VOD) コンテンツを簡単に作成
⇨繰り返しになるがFFMpegによる変換と同等のことをサーバレスに実施できる。ビデオファイルをMP4やHLSなりに変換して提供。AWSメディアサービスの中で最もわかりやすく使われそう。
老舗サービスとなるElastic Transcoderとできることはだいたい同じでの比較は別途詳細に実施したいが、とりあえずはMediaConvertを使うべき。AWSが力を入れて機能拡張をしていくのはこちらなので。
これを書いた時点ではざっくり音声のみのHLS作るなどかゆいところでまだElastic Transcoderが優位なこともある模様。

##MediaConnect
高品質なライブ動画伝送サービス。
放送事業者が伝送のために利用している、衛星ネットワークやファイバー接続の代わりに安定した伝送を提供できる
⇨放送事業者のためのライブ伝送サービス。ライブビューイングなどを利用する事業者は利用してということか。放送事業者や映画館など品質を確実に担保する映像サービスを提供する事業者以外に利用するところが思いつかない、、

##MediaLive
ブロードキャストとマルチスクリーンビデオ配信のために入力をライブ出力に変換する
RTP/RTMP/MP4⇨HLS/Microsoft Smooth/RTMP/UDPなどのメディア出力に変換
⇨ライブストリーミングよる映像配信を手軽に実施する場合に利用。
 AmabaTVみたいなインターネットTV局みたいなサービスが使いどころか

##MediaPackage
インターネット配信に向けた信頼性の高い動画の作成と保護を行う
ライブ映像をマルチデバイス向けに加工、DRM保護などを行える
今の所HLSのみインプット対応の模様。CloudFrontの配信用ディストリビューションも同時作成可能
⇨ライブ映像をサービスとして提供するための加工、配信に利用
 MediaLiveやMediaConvertとなどとセットで使うことが前提に見える

##MediaTailor 
ビデオストリームにターゲット広告を個別に挿入
⇨ビデオに広告を手軽に挿入しマージできる。動画で広告サービスを実施するときはやりやすい

##MediaStore
メディア向けに最適化された AWS ストレージサービス
⇨メディア用S3と考えればよさそう。容量、アクセスにあわせてスケールする。大規模配信向け

##Kinesis Video Streams
Elementalサービスではないけど、おまけ的に
分析、機械学習 (ML)、再生、およびその他の処理のために、接続されたデバイスから AWS へ動画を簡単かつ安全にストリーミングする
⇨映像分析のためのバイパス。配信のためにも使えはしそうだが、映像を渡してその先で分析や学習するための利用を推奨している
SageMakerでの映像分析やRekognition Videoでの機械学習など

#メディアサービスの使い所
いろんなサービスがあるのはわかったが、じゃあどういう風に連携して使うのかについて
サービス提供例をまとめてみた
いままで物理機器やOSSソフトウェアに頼っていたところをAWSサービスに置き換えて、スケーリングを任せられる感じが良い

##VoD変換配信サービス
GUI⇨S3アップロード⇨Lambdaでキック⇨MediaConvert変換⇨CloudFrontで配信
みたいな構成で利用
video再生クライアントはなんでも良いけど、Video.JSなど

![awsmedia1.png](https://qiita-image-store.s3.amazonaws.com/0/31435/eaaf2ace-b22f-6b1f-55c5-e3de462418e8.png)

##ライブビューイングサービス（インターネットTVサービス）
ライブソース取り込み⇨（MediaConnect）⇨MediaLive⇨MediaStore⇨CloudFrontで配信のような構成で利用

![aws2.png](https://qiita-image-store.s3.amazonaws.com/0/31435/d35e8dd5-0666-571d-060d-55890b5edeea.png)


インターネットTVなどを実施したい場合
・複数形式に変換やDRMなどのコンテンツ保護を入れたい場合はMediaPackageを利用
・広告を入れたい場合はMediaTailorを利用
・ライブではなくビデオファイルを利用する場合、上記のVOD変換形式などでビデオを作成しつて利用

##防犯カメラ分析
映像ソースをKinesisVideoStreamsに取り込み⇨機械学習のSageMakerや映像分析RekognitionVideoのサービスに渡して分析

![aws3.png](https://qiita-image-store.s3.amazonaws.com/0/31435/d36cd394-07ac-ed63-f89e-0979a578f170.png)

#まとめ
メディアサービスはAWSの中でも、ニッチよりなサービスと思うが
映像関連はメディア系、教育系などにニーズは多々あると思われるため今後も使い方を学んでいきたい。
Chromebook に Google Cloud SDKをインストールする

ChromebookにGoogle Cloud SDKをインストールする手順の説明。最近はChromeOS上でLinuxを動作させることができるため、簡単にインストールすることができる。

# 手順の概要

- ChromeOS でLinuxを有効化させる
- ターミナル上から、Google Cloud SDKをインストールする
- Python2.7系をインストールする

## 環境
- 執筆時点（2019/2/11）ではChromeOSのLinux機能はベータ版で提供されている。
- 本記事の内容は以下の環境で実施した。
    - 機種：ASUS Chromebook Flip C101PA
    - OSバージョン: 71.0.3578.127

# ChromeOS でLinuxを有効化させる
[Chromebookのヘルプ](https://support.google.com/chromebook/answer/9145439?hl=ja)に記載の手順でLinuxをインストールする

- chromebookの「設定」を開く
- [Linux（ベータ版）] で [オンにする] を選択。
- 画面に表示される手順に従う。10分ほどでインストールが完了し、ターミナルが起動する。

# ターミナル上から、Google Cloud SDKをインストールする

[GCPのヘルプ](https://cloud.google.com/sdk/downloads?hl=ja)の「対話型インストーラ」の項目どおりにインストールする。

- Chromebookでターミナルを起動する
- ターミナルに次のコマンドを入力する
```
curl https://sdk.cloud.google.com | bash
```
- シェルを再起動する
```
exec -l $SHELL
```
- gcloud init を実行して gcloud 環境を初期化
```
gcloud init
```

```
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init
```


# Python2.7系をインストールする

gcloudコマンドはPython2.7系で実装されているため、apt-getでインストールする

- Chromebookでターミナルを起動する
- ターミナルに次のコマンドを入力する

```
sudo apt-get install python2.7
```
【Laravel】既存テーブルのマイグレーションファイルを作成する

Laravelで既存のテーブルを使用したい場合は、マイグレーションファイルを自分で用意する必要があります。

それを自動化するパッケージがあったので、ご紹介します。

# 使用パッケージ
``migrations-generator``というパッケージを利用します。

>[migrations-generator](https://github.com/Xethron/migrations-generator)

参考記事です。
>[Laravelで既存のDBからmigrationsファイルを作成する「migrations-generator」](https://qiita.com/busyoumono99/items/a7173ad6b9b041da09dd)

# 開発環境
- PHP 7.3.2
- Laravel 5.7.25
- Composer 1.8.3 

# 手順
## マイグレーションファイルの生成
worldデータベースにある下記テーブルのマイグレーションファイルを生成します。

- city
- country
- countrylanguage

手順は``README``に書かれています。
その通りに実行します。

```
$ composer require --dev "xethron/migrations-generator"
```

Laravel既存のテーブル``users, password_resets``を除いて、マイグレーションファイルを生成します。

```
$ php artisan migrate:generate --ignore="users,password_resets"

# 省略

 Do you want to log these migrations in the migrations table? [Y/n] :
 > Y

Migration table created successfully.

 Next Batch Number is: 1. We recommend using Batch Number 0 so that it becomes the "first" migration [Default: 0] :
 > 0

# 省略
```

これで、以下のマイグレーションファイルが生成されました。合わせて外部キーのマイグレーションファイルも生成されています。

- 2019_02_10_224508_create_city_table.php
- 2019_02_10_224508_create_country_table.php
- 2019_02_10_224508_create_countrylanguage_table.php
- 2019_02_10_224509_add_foreign_keys_to_city_table.php
- 2019_02_10_224509_add_foreign_keys_to_countrylanguage_table.php

## Modelの設定

試しにcityテーブルを扱うCityモデルを作成します。

```
$ php artisan make:model City
```

テーブル名が「city」のため、Modelにテーブル名を明示する必要があります。
以下、公式サイトからの引用です。

>他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。

参考記事です。

>[Laravelで「Base table or view not found: 1146 Table」エラーが出るときの対処法](https://qiita.com/igz0/items/d14fdff610dccadb169e)

```City.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
    protected $table = 'city';
}
```

これでテーブルが使用できるようになりました！
GO#5.1   マルチプレクサ続き

#http.Handleについて

##http.HandleはDefaultServeMuxに、ハンドラを付加してくれるメソッドです。

`http.Handle == http.ServeMux.DefaultServeMux.Handle`と同じと捉えていいぽい。

こうして自分で作ったハンドラ関数、ハンドラをDefaultServeMuxにぶちこんでる。(表現汚いですよね、わかってま
す)

##ハンドラの定義は(誤魔化しなし)
ServeHTTPという名前がついてる。
第一引数がhttp.ResponseWriterで第2引数が*http.Requestって形になってるもの。


でも実際書かれてるものは

```go:hello.go
...

func hello(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "hello")
}

```

みたいな形がおおいいとおもいます。

え、ServeHTTPって名前の関数じゃないじゃん！！って思いますよね。

##ここからハンドラ関数がハンドラになるまでを説明したいと思います。

GO言語には、HandlerFuncという名前の関数があります。
このHandlerFunc、helloという関数をメソッドhelloを持つハンドラに変換してくれます。
(FuncToHandlerって名前の関数だったら分かりやすかったのにね笑)

```go
func hello(w http.ResponseWriter, r *http.Request){
  fmt.Fprintf(w, "hello")
}
func main() {
  server := http.Server{
   Addr: "127.0.0.1:8080"
  }
 http.HandleFunc("/hello", hello)
 server.ListenAndServe()
}
```

出てきましたね、HandleFunc
##HandleFunc
ここでhttp.HandleFuncがやってくれてることは、
関数helloをハンドラに変換して、そのハンドラをDefaultServeMuxに登録してくれてます。
そして、そのハンドラをURLの"/hello"と紐付けてくれてます。
KotlinとThymeleafでハマったこと

## 背景
- [前回書いた記事](https://qiita.com/yut_arrows/items/38b49fb774e62f9df8b2)でThymeleafを使った簡単なアプリケーションを実装した
- その際にisNewというbooleanの変数をDTOに定義して、Thymeleafからアクセスしようとしたが、なぜか取得できなかった

## ソース
- ソースは以下の感じ
- isNewというフラグで画像の表示をするか判定してるだけ

```top.html
<div style="float: left; margin: 5px" th:each="image, index:${imageResources}">
　　　　<span th:if="${image.isNew}">
　　　　　　　　<img th:src="@{img/new.png}" style="width:30px; height:30px">
　　　　</span>

```
- 下がtop画面に表示させるためのレスポンスクラス

```LgtmTopResponse.kt
class LgtmTopResponse {
    var imageUrl = String()
    var imageName = String()
    var imageLgtmUrl = String()
    var updateDatetime = Date()
    var isNew = false

    fun buildWithEntity(lgtmEntity: LgtmEntity,baseDate :Date) : LgtmTopResponse{
        return LgtmTopResponse().apply {
            imageUrl = lgtmEntity.imageUrl
            imageName = lgtmEntity.imageName
            imageLgtmUrl = lgtmEntity.imageLgtmUrl
            updateDatetime = lgtmEntity.updateDatetime
            isNew = lgtmEntity.updateDatetime.after(baseDate)
        }
    }
}
```

###このまま実行すると怒られた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/5c1615bc-eb44-aded-895e-8a8e73095908.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/28bb26e8-b900-9793-987d-5fc4c574e164.png)

##原因と対策

- 原因としては、kotlinでisNewというプロパティがコンパイルを実行すると、newという変数名に変換されてしまうっぽい
- なので、Thymeleafからはisを外したプロパティ名でアクセスすれば動く 
- もしくはメソッドアクセスみたいな感じで、isNew()でも動くっぽい
- どっちで書くのが良いのかはまだわかってないです

###ソースを修正


```top.html
<span th:if="${image.new}">
　　　　<img th:src="@{img/new.png}" style="width:30px; height:30px">
</span>
```
または、こっち

```top.html
<span th:if="${image.isNew()}">
　　　　<img th:src="@{img/new.png}" style="width:30px; height:30px">
</span>
```

##まとめ

- Javaでつくったアプリケーションのサーバー側をKotlinに書き換える際に、フロントを全くいじらなくて良いという訳ではなさそう
- is〇〇って名前はちょいちょい使うので、これはちょっとイケてないなーと思った
- とはいえ、Kotlinはやっぱり楽しい

##参考リンク
[Thymeleaf で isXxx プロパティを参照するとエラーになる
](http://nosix.hatenablog.com/entry/2016/12/07/152426)
Windows10からRuby環境をアンインストールするメモ

#環境

- Windows 10 Home (ver.1803)
- RubyInstaller2を使ってRubyをインストール済み

#Rubyのアンインストール

Windowsの`設定`→`アプリ`→`アプリと機能`から「ruby」で検索。
バージョンは異なるかもしれませんが以下のようなアプリが見つかります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/2d4bf2ac-5e52-4eac-8f8a-f441d44ed39d.png" title="" alt="image.png" width="60%" height="" >

クリックしてアンインストールを選びます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/92ba254d-a7d4-c6bd-5f4f-9633f7b43e68.png" title="" alt="image.png" width="60%" height="" >

#インストール先のディレクトリを削除
デフォルトではCドライブの直下に以下のような`Ruby ***`というディレクトリがあるので、これを削除します。
しかし、Rubyアンインストール直後だと「他のプロセスによって開かれています」みたいなメッセージが出て削除できないことがあるので、一度ログオフするか再起動するかしてから削除します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/c247b7bc-fcc7-6524-2476-69b209b66d38.png" title="" alt="image.png" width="60%" height="" >

これでRuby環境のアンインストールが完了です。
Linux(Ubuntu18.04.1)でGitBucketを実行してみる(Linux初心者)(その①)

# Gitでプルリクエストを使いたいのでLinux初心者が順に環境構築してみた。

## プルリクエストをするにはGitHubを使えるようにしたい。
- 社内で使えるか確認したところ、部課長を納得させる説明が必要とのこと。(ソースを社外に置くリスクやら、社内ポリシーに沿った運用方法等…)
- Gitすら知らないステークホルダーたちに対して利点とリスク、はたまた運用方法まで縛られるのは時間の無駄と判断
- ほかにやりようがないか調査すると、社内LAN内で動かせるタイプもあるのを確認。

## 社内に環境構築できるタイプにしよう
- 候補はGitLab,GitBucket
- 両方ともLinux上で動くソフトウェア
- Linux触ったことないな、GitLabは何やら構築が難しい？GitBucketはJavaがあれば簡単に動く？なるほど。教育コストが少ないLinux-GitBucketでやってみよう。

## Linuxの選定
- CentOS?RedHat??
- Ubuntu?
- Windows10のHyper-Vのクイック作成機能にUbuntuってのがある
- UbuntuはデスクトップPCとしてLinuxを使う場合にオススメ
- CentOSはサーバとしてLinuxを立てる場合にオススメ
- よし、Ubuntuってのにしてみよう

## Hyper-Vクイック作成でUbuntuをセットアップ
- 全部英語...
- 日本語にするには...パッチをインストールして...  
 ⇒なぜか知らないがコマンドを見様見真似してるうちにUbuntuが動かなくなる。
- 日本のチームが作ったUbuntuがある！？  
 「Ubuntu Desktop 日本語 Remix」「ubuntu Japanese Team」
- https://www.ubuntulinux.jp/home

## GitBucketを見様見真似でインストールしてみる
---
### Javaをインストールする必要がある。以下のコマンドを実行する。

   `add-apt-repository ppa:webupd8team/java`  
   `apt-get update`  
   `apt-get install oracle-java8-installer`  

### いきなりわからないので調べながら実施。

- [add-apt-repository]  
   ubuntuはaptitude(apt)を使ってパッケージ管理している。その公式リポジトリは「etc/apt/sources.list」　　
   非公式なリポジトリは「add-apt-repository」を使って追加することができる。　　
   追加したリポジトリは「etc/apt/sources.list.d」にある。
- [apt-get update]  
   apt-get で パッケージを取得してインストール／アップデートすること。  
   update  で サーバからパッケージリストを入手する。   
- [apt-get install oracle-java8-installer]  
   install で パッケージをインストールする。

### じゃあ、実行。

- **エラー： root で実行する必要があります**  
  管理者ってことかと思ってみると  
  ubuntuはrootを初期構築時に作らないとのこと。  
  CentOS等だと[su rootのパスワード]でrootに昇格できるとか。(rootになってると $ が # になるとか)
  ubuntuの場合はsudoを使って毎回実行するという記載を発見。試しに以下構文を実行  
  [sudo add-apt-repository]  
  ユーザのパスワードを聞かれたのでうまくいってると判断。続行する。

- apt-get install oracle-java8-installerが途中で止まって焦った
  72%で10分くらい停止。あああああ。って思って対処法を調べまくってたらいつの間にか失敗を検知して再ダウンロードを始めてた。すごい。

## 次はGitBucketをダウンロードする。以下のコマンドを実行する。

   `wget https://github.com/gitbucket/gitbucket/releases/download/4.30.1/gitbucket.war`  
   ※releasesのページに飛んでバージョンがいくつになってるか確認してから実行すること。

### わからないので調べながら実施。

- [wget]  
  HTTP／HTTPSなどを介してデータをまとめて取得するコマンド。windowsにもあるみたい。  
  もしかしてこれ使えば自動ダウンロードのソフトウェアとか作れるのかな？  
  面白そう。後で調べてみよう。
- 好きなフォルダに配置するのだがフォルダが作れない。  
  権限がないのだとわかりsudo mkdirする。  
  そのフォルダにも権限がない。  
  **よくわからないので少し調査。**  
  (今回はダウンロードフォルダにダウンロード)

## 次はGitBucketを単体で実行する。以下のコマンドを実行する。

   `java -jar gitbucket.war`

## 起動を確認するためにhttpで接続する。

   http://localhost:8080.gitbucket

## 今回はここまで。

   とりあえず動くところまで行ったので一旦終了。
Angular Material でテーマカラーをカスタマイズする方法

## 概要
Angular Material でテーマカラーを独自に設定する方法の備忘録。

### 前提
2019年1月1日時点の情報です。また、以下の環境になっている前提です。

- Angular CLI： 7.0.6
- Node.js： 10.15.0
- npm： 6.4.1
- Angular Material の導入が完了していること

Angular Material の導入方法については、「[こちらの記事](https://qiita.com/tomy0610/items/cb12347a44015a443105)」を参考にしてください。

尚、テーマカラー変更方法について、公式リファレンスは「[こちら](https://material.angular.io/guide/theming)」

## 手順

アプリ全体の共通スタイルを定義するファイルに、以下のとおりに追記

```scss:src/styles.scss
/* ::::: テーマカラーのカスタマイズ ::::: */

// テーマ操作関数をライブラリからインポート
@import '~@angular/material/theming';

// Angular Material の共通スタイルをインクルード
@include mat-core();

// 色定義： オプションは hue カラーパレットで色コード指定, 参照: https://material.io/design/color/ and https://material.io/tools/color/
$my-app-primary: mat-palette($mat-light-blue, 800);
$my-app-accent:  mat-palette($mat-cyan, 600);
$my-app-warn:    mat-palette($mat-pink, 500, 900, A100);

// テーマとして色定義をまとめる
$my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn);

// カスタムテーマを適用
@include angular-material-theme($my-app-theme);

/* ::::: アプリ全体のスタイルを以下に指定 ::::: */

html, body { height: 100%; }
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }

```

## 結果

アプリを起動してデザインを見てみる。

### 変更前

<img width="1552" alt="スクリーンショット 2019-02-11 11.27.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/ff8a3b15-f083-df65-9643-6226c200a14d.png">

### 変更後

<img width="1552" alt="スクリーンショット 2019-02-11 12.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/a6313cf9-c24f-03ea-e157-4ad56735c353.png">

ちゃんと `primary`, `accent`, `warn` のカラーリングが変更された。
laravelでのデバック出力

```
<?php

-- 画面に出力
dump($var);

-- 画面に出力 + die
dd($var);

-- ファイルに出力 ※strage/logs/laravel-y-m-d.log
logger($var);

```

# めも
他にもいろいろありそうですが、調査しきれず。
Chromeのアドオンを使って海外アニメを字幕付きで見てみた

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。

#RWBYが見れない
僕はRWBYという海外アニメのファンです。
ですが、Volume5(5期ですね)までは、Youtubeで無料で公開されており、日本語の字幕も付いていたのですが、Volume6から[Rooster teeth](https://roosterteeth.com/)の公式チャンネルの公開動画が全て日本で見られなくなってしまったのです。
これは非常に困りました、僕の英語のヒアリング能力で何とかRooster teethで公開されているVolume6（言うまでもなく全編英語です）を自力で翻訳・解釈できたら良いのですが、恐らく1年くらい時間をかけてしまいます。
そこで、
https://rwby.fandom.com/ja/wiki/%E3%82%A8%E3%83%94%E3%82%BD%E3%83%BC%E3%83%89
このURLに記述されている方法を使い、RWBYの公式動画に字幕を付けてみます。

#テスト結果
(![Screenshot from 2019-02-11 12-08-05.png](https://qiita-image-store.s3.amazonaws.com/0/320820/799022f7-18db-035c-abeb-83a5f817547b.png)
上手く行きました！
アドオン「Substical」を使用することで、字幕付きでRWBY Volume 6を見られるようになりました！

#まとめ
元の英文・英語のセリフを翻訳してくれている方に感謝です。
自分も、こういった海外アニメ・ドラマ・映画の翻訳ができるようになるまで英語力を高めます。
【Java】リダイレクトされた最終URLを取得する方法


# 概要
あるURLをリクエストするとリダイレクトされる場合があります。リダイレクトされた最終のURLを取得する方法のメモです。

## コード

ライブラリにはokhttp3をつかう

リダイレクトされた最終URLを取得するクラス

```java:RedirectFinalUrlResolver.java
package example;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class FinalUrlResolver {

    private OkHttpClient mClient = new OkHttpClient.Builder()
            .addNetworkInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    return chain.proceed(chain.request());
                }
            })
            .build();

    public String get(String url) throws IOException {
        final Response r = mClient.newCall(new Request.Builder().url(url).build()).execute();
        return r.request().url().toString();
    }
}

```

**実行する側のクラス**

```java:Example.java
package example;

import java.io.IOException;

public class Example {

    public static void main(String[] args) throws IOException {
        FinalUrlResolver o=new FinalUrlResolver();
        String url="https://qiita.com/settings/account";
        String finalUrl=o.get(url);
        System.out.println("original url="+url);
        System.out.println("final url="+finalUrl);
    }
}
```

## 依存関係(maven)

以下をpom.xmlに追加する

```xml
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.13.1</version>
</dependency>
```

## 実行結果

**Example.java**を実行すると、リダイレクトされた最終のURLが取得できた。

```shell
original url=https://qiita.com/settings/account
final url=https://qiita.com/login?redirect_to=https%3A%2F%2Fqiita.com%2Fsettings%2Faccount
```
【Laravel】allメソッドを使うとtoSqlメソッドが使えない

クエリビルダを使用すると、``toSqlメソッド``で実行されるSQLを取得することができます。

しかし、``City::all()``のようにallメソッドを使用した場合は、toSqlメソッドを使うことができません。

以下のエラーが出ます。

```
Method Illuminate\Database\Eloquent\Collection::toSql does not exist.
```

エラーメッセージの通りなのですが、原因を探ってみました。

# allメソッドの場合

```test.php
$sql_all = City::all();
var_dump(get_class($sql_all));
// エラー発生
var_dump($sql_all->toSql());
```

オブジェクトのクラス名を取得すると、``Illuminate\Database\Eloquent\Collection``クラスが使用されていることがわかります。

addメソッド自身は、スーパークラスである``Support\Collection``クラスに定義されています。

しかし、両クラスともtoSqlメソッドが定義されていません。
これが原因でした。

```Illuminate\Support\Collection.php
/**
 * Get all of the items in the collection.
 *
 * @return array
 */
public function all()
{
    return $this->items;
}
```

さらに、``getメソッド``を使用した場合も同じエラーが出ます。

```test.php
$sql_builder = DB::table('city')->get();
var_dump(get_class($sql_builder));
// エラー発生
var_dump($sql_builder->toSql());
```

上記のコードではEloquentを使用していないので、オブジェクトのクラス名は``Illuminate\Support\Collection``になります。

エラーの理由は上記と同じです。

# toSqlメソッドの場所
当のtoSqlメソッドが定義されているクラスは、Builderクラスになります。

```Illuminate\Database\Query\Builder.php
/**
 * Get the SQL representation of the query.
 *
 * @return string
 */
public function toSql()
{
    return $this->grammar->compileSelect($this);
}
```

# whereメソッドの場合

whereメソッドを使用する場合は、toSqlメソッドが使用できます。

オブジェクトのクラス名を確認すると、``lluminate\Database\Eloquent\Builder``クラスが使用されていると確認できます。

これはtoSqlメソッドが定義されているクラスと同じです。

```test.php
$sql_where = City::where('Name', '=', 'Kabul');
var_dump(get_class($sql_where));
// 出力される
var_dump($sql_where->toSql());
```

コアファイルを読む良いきっかけになりました。
VMD-Liftingやってみた。その２

#概要

VMD-Liftingが魔法なので、やってみた。
threeで、描いて、ffmpegでmp4化して、VMD-Liftingでvmd化してみた。

#threeで、描いて、ffmpegでmp4化した。

http://jsdo.it/ohisama1/YxEQ

#動画

https://www.youtube.com/watch?v=oDmuyH19oM8

#VMD-Liftingでvmd化した物を表示。

http://jsdo.it/ohisama1/05Vn


以上。
GO#5     ハンドラ、ハンドラ関数、マルチプレクサ のメモ

#GOプログラミング実践入門

※自分なりにまとめてみました。間違ってたらじゃんじゃん指摘してください。

##サーバー作成

ハンドラとかマルチプレクサは'net/http'のライブラリの魔法です。

`http.ListenAndServe("ネットワークアドレス",nil)`でサーバーを作成できる。
第2引数はリクエストを処理するハンドラを呼び出す。
ネットワークアドレスが'""'の場合デフォルトのポート80になる。
ハンドラがnilの場合デフォルトの'DefaultServeMux'になる。←これがマルチプレクサってやつらしい。

##ハンドラとハンドラ関数ってなに？？
###結論から言うとハンドラ関数はハンドラのように振る舞う関数です！
じゃあそのハンドラって？？

`ServeHTTP(http.ResponseWriter, *http.Request)`

の形のやつをハンドラっていいます。(ちょっと誤魔化しました。)

###ハンドラはURLによってする処理を決めるという認識だと思います。(railsでいうcontroller)

##ここまでをまとめてみます。
`ListenAndServeの第2引数がハンドラ。`
`このハンドラのデフォルト値はDefaultServeMux`

###ここで、ハンドラがマルチプレクサ？？意味わからんてなった方もいると思います。安心してください。僕もです笑

構造、インスタンスの関係がこんな感じらしいです。

##'Handler > ServeMux > ServeHTTP > DefaultServeMux'

言葉で言いますと、

```go
ServeMuxは構造体Handlerのインスタンス(構造体はrailsで言うmodelみたいな感じですかね)。
ServeHTTPはServeMuxのメソッド(railsでいう`ServeHTTP.ServeMux`で呼び出せる的な？？)
DefaultServeMuxはServeMuxのインスタンス。
```

となります。

では#マルチプレクサについて見てみましょう。

##マルチプレクサの仕事
'リクエストを特定のハンドラに転送するURLのマッチング処理'
【Ruby】変数を文字列に入れ込む

<h1>変数に文字列を入れ込む</h1>

Ruby初心者のメモ書きです。

```ruby:qiita.rb
name = "田中"
name2 = "斎藤"
puts "こんにちは、#{name}さん！"
puts 'こんにちは、#{name2}さん！'
#結果
こんにちは、田中さん！
こんにちは、#{name}さん！
```

シングルクオートで囲むと、変数は展開されずにそのまま出力される！！
Angular Universal の Web サーバを Express でサクッと作る方法

## 概要
Angular Universal の Web サーバ部分を、簡単な疎通など確認するためにとりあえずサクッとコピペするための備忘録

### 前提

以下の必要なモジュールは、型定義ファイル（`@types/*` でインストール）含めインストールされていること

- express
- express-engine
- @nguniversal/express-engine
- @nguniversal/module-map-ngfactory-loader

## Express で Web サーバを作成

以下の通り、Express を使って Web サーバを作成する

```ts:server/web-server.ts
// 以下の２インポートは最初に呼ばれる必要がある
import 'zone.js/dist/zone-node';
import 'reflect-metadata';

import * as express from 'express';
import { join } from 'path';
import { ngExpressEngine } from '@nguniversal/express-engine';
import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';

const webServer = express();
const PORT = process.env.PORT || 3000;
const CLIENT_DIST_PATH = join(process.cwd(), 'dist/demo-app'); // TODO: パスをビルド先フォルダ名に合わせる
// 動的に生成される dist ファイルため、require() のままにしておく
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require(join(process.cwd(), 'dist/demo-app-server/main')); // TODO: パスをビルド先フォルダ名に合わせる

// テンプレートファイル名で拡張子が省略された場合のデフォルト拡張子を設定
webServer.set('view engine', 'html');
// テンプレートファイルを置くパスを設定
webServer.set('views', CLIENT_DIST_PATH);
// レンダリングに利用するテンプレートエンジンに Angular Express エンジン を登録
webServer.engine('html', ngExpressEngine({
  bootstrap: AppServerModuleNgFactory,
  providers: [ provideModuleMap(LAZY_MODULE_MAP) ]
}));
// サーバサイドレンダリングされる静的ファイル
webServer.get('*.*', express.static(CLIENT_DIST_PATH));

// 全ての API ルートは このルーティングを使用
webServer.use('/api/*', (req, res) => {
  console.log('[API が呼び出されました]');
  const response = { test1: 'aaa', test2: 'bbb' };
  res.status(200).send(response);
});

// 全ての通常ルートは Universal エンジンを使用
webServer.get('*', (req, res) => {
  console.log('[通常ルートが呼び出されました]');
  res.render('index', { req, res });
});

// Node サーバ開始
webServer.listen(PORT, () => {
  console.log(`Node server is listening - http://localhost:${PORT}`);
});
```

## 起動確認

### 起動スクリプト修正

以下のとおりに、package.json のスクリプトを修正

```ts:package.json
:
  "scripts": {
    "start": "node ./dist/server/web-server.js",
    "build": "npm run build:client && npm run build:server",
    "build:client": "ng run demo-app:app-shell:production",
    "build:server": "tsc --project server --outDir dist --allowjs true",
  },
:
```

以下のコマンドでビルド、アプリ起動

```bash
# ビルド
npm run build

# 起動
npm run start
```

以下の点をチェックし、問題なく動いていればOK。

- ビルド完了後、以下のディレクトリと中身がルートディレクトリ配下に生成されているか
 - dist/common（クラサバ共用ファイル群）
 - dist/demo-app（クライアントのソースコード）
 - dist/demo-app-server（Universal 対応で作ったやつ）
 - dist/server（Express および API ロジック用ファイル群）
- Web ブラウザにアクセスし、以下の挙動が行われるか
 - `http://localhost:3000` でアクセスするとホーム画面が表示され、コンソールには `[通常ルートが呼び出されました]` と標準出力される
 - `http://localhost:3000/api/aaa` でアクセスすると、画面に `{"test1":"aaa","test2":"bbb"}` と表示され、コンソールには `[API が呼び出されました]` と標準出力される
 - `http://localhost:3000/api` でアクセスすると、URLは `http://localhost:3000` となり、画面は何かしらの HTML で画面表示がなされ、コンソールには何かしらのエラーログが標準出力される（存在しないページへのアクセスエラー）
jsdoで、はやぶさ2

#概要

jsdoで、はやぶさ2、描いてみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/g/F/Q/gFQX.jpg?t=1549851806)

#参考にしたページ

https://qiita.com/mkunu/items/7f82fef8e06b6274a5a7

#成果物

http://jsdo.it/ohisama1/gFQX

以上。
「知的複眼思考法」アウトプット

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。
今回は、「知的複眼思考法」を読了したので、アウトプットを行います。


#複眼思考
「知的複眼思考法」は、冒頭から強烈な言葉を私達に投げかけてきます。
曰く、「考える」とはどういうことなのか。
「自分で考えろ」という人たち、「自分で考えて解決しなさい」と言ってくる人たちが、「考える」ということをどれだけ実践できているのか。
そういった言葉を、著者は私達に問いかけます。
その後、自分たちが普段行っていることは「単眼思考」であり、「複眼思考」を身に付けるべきだ。と著者は説きます。
複眼思考とは、その名の通り物事を複数の目線で見るだけではなく、自分たちが常識だと思っていること、疑問を抱かないことにも思考を巡らせてみるべきだ、という思考法です。
著者は東京大学で講義を行う際、最初の講義で一本のビデオを見せるそうです。
そして、プリントを配りそれに対する感想文を書かせる。
後日、「A」「B」「C」「D」と一つ一つのプリントにアルファベットを書いて、学生に返します。
生徒は、そのアルファベットを「自分の感想の評価」と思い込んでしまい、一喜一憂する光景が見られるそうです。
でも、そのアルファベットに意味はありません。「自分の感想の評価」と学生が思い込んでしまっているだけなのです。
このように思考してしまうことこそ、「単眼思考」と言えます。
自分たちは、小学校の頃からアルファベットで評価することに慣れきってしまっています。
ですから、BはCよりも評価が高い、AはBよりも評価が高い、と思い込みがちなのです。
著者の「複眼思考」は、このような「当たり前」に疑問を持ち、思考するべきだと私達に教えてくれるのです。
以上が、自分が「知的複眼思考法」を読んで得たアウトプットです。

#まとめ
プログラミングには論理的思考の他にも、複眼思考のような思考力が必要です。
複眼思考を身に付けて、ネット上に溢れている様々な情報を、複数の視点で物事を見られるようにするのが今後の目標となりました。
微分を忘れたときのための3分で読める記事。

##まず
微分は、グラフの__ある点__の接線の傾きを求める操作と考えます。

##接線は置いといて

傾きを求めるには、yの増加量/xの増加量をします。

(1,1)と(2,4)を通る直線の傾きは

```math
\frac{1-4}{1-2}=\frac{-3}{-1}=3
```

といった具合。

##増加量が限りなく小さいと限りなく接線に近づきます。

__限りなく__近いだとか、__限りなく__小さいということを表現するためには、

$\lim$を使います。記法は

$\lim_{d \to c}cd=c^2$

だとか

```math
\lim_{d \to 0}2d+4=4
```

だとか。

（この記法に関する詳細な説明はしません。感覚で分かれ）

##limを使って限りなく小さい増加量

いろんな方法がありますが、ここでは

$\lim_{h \to 0}\frac{(1)^2-(1+h)^2}{(1)-(1+h)}$

とします。

計算すると

```math
\begin{align}
&\lim_{h \to 0}\frac{(1)^2-(1+h)^2}{(1)-(1+h)}\\
&=\lim_{h \to 0}\frac{1-1+2h+h^2}{1-1+h}\\
&=\lim_{h \to 0}\frac{2h+h^2}{h}\\
&=\lim_{h \to 0}2+h\\
&=2
\end{align}
```

これが実数を用いて計算した結果。
ですが、1やらなんやらは`ある点`の一つに過ぎないので__xに置きなおして__計算してみましょう。

```math
\begin{align}
&\lim_{h \to 0}\frac{(x)^2-(x+h)^2}{(x)-(x+h)}\\
&=\lim_{h \to 0}\frac{x^2-x^2+2xh+h^2}{x-x+h}\\
&=\lim_{h \to 0}\frac{2xh+h^2}{h}\\
&=\lim_{h \to 0}2x+h\\
&=2x
\end{align}
```

よって $y=x^2$の__ある点$x$__の接線の傾きは$2x$であると求まりました。

##導関数

この、微分（限りなく小さい増加量での傾きを得る計算を）した結果得られるものを

導関数と言います。導関数の表現は調べればわかる。調べて。

##こんな面倒な長々とした式をいちいち計算するのか…？

微分公式があります。

$()'$は括弧内の導関数という意味。

x以外は定数。

```math
\begin{align}
(x^a)' &= ax^{a-1}\\
\\
(a)' &= 0\\
(a+x)' &= 1\\
(a･f(x))' &= f'(x)
\end{align}
```

など、あとは調べろ。
GitHubで複数のアカウント使い分けたい時のやり方

個人用、会社用とGitHubのアカウントが複数ある人向け。昔設定したのにもう忘れてしまったのでメモ。

#現状確認

 ```Bash
shuka@saito ~ $ cd ~/.ssh/
shuka@saito ~/.ssh $ ls
id_rsa.pub id_rsa
```

秘密鍵・公開鍵が1ペアで存在していますね。

#もう1つの鍵を生成

既にある鍵のペアを1つのアカウントに利用するとして、もう1つのアカウントを紐付けるための秘密鍵・公開鍵を生成します。

```Bash
shuka@saito ~/.ssh $ ssh-keygen -t rsa -C "cancolle_sub@pfcolle.com" -f github_sub_id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in github_sub_id_rsa.
Your public key has been saved in github_sub_id_rsa.pub.
```

#あとはsshのconfigを編集して終わり

```
shuka@saito ~/.ssh $ vim config
```
#~/.ssh/configの内容（例）

```
# github_office
Host github-saito
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

#github_private
Host github-shuka
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/github_sub_id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```


このあと、ディレクトリ毎にGitの情報を変更したい場合（例えば、会社用は本名、プライベート用は個人みたいな）は下記の記事をご参照ください。

[Gitでの名前を使いわけたい人向けメモ](https://qiita.com/wonder_zone/items/f0f630ca010195c4be3f)

#参考文献
[【メモ】githubの複数アカウントにSSH接続するための設定手順 ｜ DevelopersIO](https://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)
#Twitter の #API で、タイムラインから、省略なしのテキスト全文 + Media画像付きツイートの一覧を取得して #Github に使える #Markdown を取得する #python スクリプトの例

#Twitter の #API で、タイムラインから、省略なしのテキスト全文 + Media画像付きツイートの一覧を取得して #Github に使える #Markdown を取得する #python スクリプトの例

# Script

```py
# https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline.html

import json, config
from requests_oauthlib import OAuth1Session

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)

url = "https://api.twitter.com/1.1/statuses/user_timeline.json" #タイムライン取得エンドポイント

params ={
  'count' : 200, # 取得数
  'trim_user' : True, # ユーザー情報を除く
  'exclude_replies' : True, # リプライを除く
  'tweet_mode' : 'extended' # 拡張モード

}
res = twitter.get(url, params = params)

if res.status_code == 200:
    timelines = json.loads(res.text)

    for line in timelines:
        print('# ' + line['full_text']) # ツイートの最初の行を見出しにして、 Markdown で良い感じにマークアップ
        if 'media' in line['entities'].keys():
          for media in line['entities']['media']:
            print("![image]("+media['media_url_https']+')') # 画像URLをMarkdownの埋め込み形式に
else:
    print("Failed: %d" % res.status_code)


```

# Example

```
#エンジニア ってそういう仕事。

#記録 https://t.co/ZglUMvib3S
![image](https://pbs.twimg.com/media/Dy4_pOSVAAEHIY0.jpg)
# Amazon神棚リスト。

Amazonのほしい物リストは、名前が良くない問題。

ねだってるみたいに聞こえる。

主従逆転しよう。

プレゼントする側が、むしろ低い身分。それは何。

神への奉納。これしかない。

Amazon供え物リスト。もしくはAmazon神棚。

いかが。

#記録 https://t.co/GdlxMFHWw1
![image](https://pbs.twimg.com/media/Dy477HhUUAAEacs.jpg)
# アロンアルファ・エンジニアのアロンアルファ。

#エンジニア はサービス同士を連携させる接着剤。

さらに、その人間同士を結ぶチームや、プロジェクトや、会社は、より縦横無尽な、ネットワーク。

いつも思い描く、蜘蛛の巣。脳細胞の世界。

プログラマの集合もまた、巨大な生き物として動く。 https://t.co/ErWhNMyRRz
# 恋愛は別れ際が大事。

夜のサンマルクカフェ。閉店時間が訪れ、この雰囲気に対して、ややけたたましい声で、退店せよと告げる店員さん。

振られる予感はしたけれど、言い方はだいじにしよう。全ての思い出の結論が変わる。

スターバックスの女神みたいに、丁寧な物腰で、切り捨てて欲しい。

#記録 https://t.co/uUfrP23mXF
![image](https://pbs.twimg.com/media/Dy44spsUcAII7wW.jpg)
# Twitterでフォローを迷う時。

興味関心をそそるツイートに、色のない雑談や宣伝が紛れていると、フォローを迷う。

パーソナリティが伝わるものではなく、アクセントがなく、ただemptyが感じられてしまうもの。

最高に面白いテレビ番組に、CMが6割紛れてるみたいな感覚。

#記録
```

# Ref

[PythonでTwitter API を利用していろいろ遊んでみる - Qiita](https://qiita.com/bakira/items/00743d10ec42993f85eb)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/575








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JWTについて

JWTについて。
かなりざっくりとした内容です。

参照：[詳しめの記事](https://tools.ietf.org/html/rfc7519)

JWT(ジョット)と読むみたいですね。
Json Web Tokenの略で、認証機能で使われる形式です。

>   JSON Web Token（JWT）は、コンパクトでURLセーフな表現方法です。
   両当事者間で譲渡されると主張する。JWTにおける請求
   JSONのペイロードとして使用されるJSONオブジェクトとしてエンコードされます。
   Web署名（JWS）構造、またはJSON Webの平文として
   暗号化（JWE）構造、クレームをデジタル化することを可能にする
   メッセージ認証コードで署名または完全性保護
   （MAC）および/または暗号化された。

と記述されてます。二者間でやりとりができる/JSON形式で/保護と/暗号化がされるクレームって感じですね。

このクレームとは、「二者間の一方に関するひとまとまりの情報」のことです。

クレームのやりとりについて、セキュリティを強化したやりとりをする認証というイメージを持っていただければ大丈夫です。


認証機能ではJWTベースのトークンを使われているものもあるようで、どういう種類のクレームのやりとりが行われるのかに注目していくと理解度が深まりそうですね^^
Ubuntu18_04でMT4と、DeepLearning環境を構築

今回は、近い将来に構築するであろう、Server環境について、実運用を兼ねて実験的にローカル環境で構築を行ってみる。

# やりたいこと
- ServerはVPSサーバをレンタル(を想定)
- MT4を動かせる環境
- OSはUbuntuを前提(ネットを見たらMT4も、DeepLearningの構築実績が多そうだったから)

# VPSサーバの選定
過去に何度もやってきているが、時代は変わる、、、そんなこんなで2019年、改めてVPSサーバを調べてみた。
ちなみに、現在は、ABLENETの[Win1](https://www.ablenet.jp/vps/service/plan_fee.html)と言うプランでMT4を1つ動かしている。
以前は、2つ契約をし、多いときはそれぞれ5枚ずつぐらい運用していたが、色々あって今の状態に。
月額1,600円(年払い用)だが、この費用も抑えたいので、「やりたいこと」に記載した条件となった。

## いくつかあったが、費用面とスペックで下記に絞った
### お名前.com　VPS(https://www.onamae-server.com/vps/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141272/926339d3-e97f-6bec-624a-b12919ca242d.png)

### GMOクラウド(https://vps.gmocloud.com/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141272/43e402f5-a3c8-8935-08ee-d4b31a82bb5e.png)

### WebAREA(https://web.arena.ne.jp/vps-cloud/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141272/083bad97-4641-5e3e-3dac-e72efce834f7.png)

これらのスペックと料金を調べたところ、2コア、4コアではGMOクラウドの月額が少ないことがわかったが、初期費用が、、、と言うのが気になった。
これらの他、https://www.gamehuntblog.com/entry/vps-compare-recommendation のサイトを参考に調べたが、とりあえず、現在の料金より安く、スペックアップを望む程度として、
お名前.com VPSの2コアのプランを前提に環境を構築してみる。

# VMware
仮想環境と言えば、VMwareと昔は思っていたのだが、最近、VirtualBOXもちらほら見え隠れしている。が、VirtualBOXは32bitしかインストールできず(私が知らないだけだろうが)、コアも変更できそうなのに、変更できなかったので、使い慣れたVMwareにした。

しかし、インストール時に、例の問題が、、、
Hyper-Vの問題は、( https://soma-engineering.com/cloud/vmware-workstation/error-poweron-vm/2018/05/04/ )この辺のサイトを参考にさせていただき解除

# Ubuntu
## Let's Install
さて、まずはUbuntuのInstall。
UbuntuのDownloadは、( https://www.ubuntulinux.jp/download )からISOファイルをダウンロードして、VMwareからインストール

## wine
次に、MT4を動かすためにwineなどをインストールする
まぁ、基本的にコピペですべてを済ませてきたので、今回もググって実施
( https://bitcoin-with.com/ubuntu_mt4_install/ )

- ubuntuにsshをInstallして、ローカルのWindowsからVMwareに接続できるようにする

```bash
sudo apt install -y net-tools ssh
service ssh start
```
- puttyなどを使って、sshでVMware上のUbuntuに接続
- UbuntuにwineをInstall. 文字化け対策も一緒に施す.

```bash
sudo dpkg --add-architecture i386
sudo apt install -y wine-development winetricks
winetricks
' このあと、https://symfoware.blog.fc2.com/blog-entry-2228.htmlを参考に色々やってみた
```
- 普段TitanFXを使っているので、VMware上でTitanFXのサイトからMT4をDownload.
- VMwareのコマンドプロンプト上でwineと打ったあとに、DownloadしたexeファイルをD&D

とりあえず、これでUbuntuでMT4を動かすことができた!!

# 最後に
忘れちゃいけないのが、Ubuntuログイン時のMT4の自動起動。
Windowsと違って、OSのパッチに伴い再起動することは少ないと思うが、ログイン時に自動起動するように設定
(https://sicklylife.jp/ubuntu/1804/help/startup-applications.html)

# 追伸(2019/03/02)
## 実は本番サーバでの環境構築に手こずっていました(お名前.com VPS)
と言うことで、お名前.com VPSを月額契約し、そこでMT4を動かそうとしました。
上記の通り、一度、VMWareで構築しているので、同じIMAGEを使って、同じ手順でやれば、、、と思ったもののうまく行かず、日々が過ぎていました。

ただ、新たに構築のページを見つけ、無事、開通しました。
http://yallalabs.com/linux/how-to-install-wine-4-ubuntu-18-ubuntu-16/
こちらを手順通り実施して、wine4.0の環境が構築できました。
proxy問題も解消されていて、本当にハッピーでした。