OmniAICreator/Qiita-1.07M huggingface dataset:
QNAP NASにてDockerとradikool6を使ってみた

#１．目標
仮想化ってそもそも何？？？っていう素人がQNAP NASにて
Dockerとradikool6を使って、らじる★らじるを録音する環境を構築する

# ２．使用機器とか
QNAP:TS-251B-2G
QTS:4.3.6.0993
Container Station:2.0.356

# ３．インストール
###３－１．Container Station
AppCenterよりContainer Stationをインストール
###３－２．Radikool6のコンテナ検索とインストール
Container Stationの「管理」---「作成」を選択
イメージ検索欄に「radikool6」で検索
Docker Hubを選択---「ezdesign/radikool6」をインストール
インストールバージョンは「latest」を選択

# ４．コンテナの作成
作成開始前にコンテナの詳細設定を行う
###４－１．詳細設定

【環境】
名称及び値欄にパラメータ入力し「追加」する
![03 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/37d35199-0215-480f-008e-137659304024.jpeg)
ポイント：
Timezone を Asia/Tokyoにする
使用するにはIDとパスワードの指定が必要


【共有フォーマット】
NASの共有フォルダに録音ファイルが保存されるようにマウント設定する

事前に任意の共有フォルダ以下にサブフォルダを作成しておく
共有フォルダ名/Radikool6/data   : 各種データ
共有フォルダ名/Radikool6/logs   : ログ
共有フォルダ名/Radikool6/records   : 録音ファイル
![04 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/d0d6267a-f283-1c42-7804-ba7f00602723.jpeg)
※ホストからのボリューム欄はプルダウウンで選択。
マウントポイントは以下の通りに記述し「追加」した。
Container/Radikool6/data
Container/Radikool6/logs
Container/Radikool6/wwwroot/records

###４－２．コンテナ作成
すべての設定が完了したら「作成」ボタンを押下する
![05 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/a9291159-2b20-b634-90c8-1f8988b6f057.jpeg)
ダウンロード～インストール～コンテナ作成完了まで5分位かかった

# ５．コンテナ動作確認
![06 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/8e53cdd4-f07e-7947-08f4-f1d3b86296ca.jpeg)
リソースの「コンテナ」を開き、実行中タブに切り替え、コンテナが動作していることを確認する。

コンテナ名称のリンクをクリックし、「設定」---「詳細設定」---「詳細設定」---「ネットワーク」を開く
![08 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/0e537f5f-6dac-5899-1c32-f380e1256978.jpeg)

ポートフォワーディング設定項目のうち、ホストのポート番号をメモする。

# ６．アクセス
ブラウザを立ち上げサーバーにアクセス
http://NASのアドレス:【5.でメモしたポート番号】
設定したIDとパスワードでログインする。
公式によるとブラウザはChrome推奨であったが、firefoxで動作確認した。
radikool6の使用方法については、参考記事に詳細に記載してあるため割愛

# ７．録音中の挙動などの気づき
・超alpha版とのことですが、動作は非常に軽快です。
　またUIもシンプルで分かりやすいです。
・録音中にも関わらずライブラリの「ダウンロード」や「再生」ボタンを押してしまったところ、録音終了しても再生できないファイルになってしまった。
・共有フォルダには、【1a7064a1-058d-4cd8-a163-35fe52ed5ab6.m4a】 
のようなファイル名でファイルが作成されるため、ファイル名からは録音放送名を伺い知ることはできないが、TAG名は入力されている。
ブラウザより改めてダウンロード操作を行えば、ファイル名も付与される。

# ８．メモリ使用率の変化について
Qsync、HybridBackupSync、QVPN Serviceなどがメモリ食いでもともとから66%
Container Station+コンテナ1個で75%程度まで上昇
メモリの増設が必要そうなので検討します。
![14 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466152/b724cdc0-dbed-b2fa-f419-9b92693d282f.jpeg)

# 【参考記事】
[Radikool---開発ブログ](https://www.radikool.com/)
[hiroの長い冒険日記---Synology DS218+ Dockerとradikool6で radiko記録](https://hiro20180901.hatenablog.com/entry/2018/11/26/060000)
ありがとうございました。
Microsoft Teamsの有効期限を設定する

Teamsの展開は悩みどころ。活用の面は置いといて、管理面でも悩みは尽きない。Teamsの作成を「ガチガチに管理するぞ」ということで申請式にしている組織もあるし、「どんどん活用してね」ってことで自由に作っていいよという組織と、どっちもあると思う。どちらを選ぶかは組織の考え方次第。私は自由に作って、どんどん活用すればいいと思う。

ただ、自由に作っていいよ式だと、困ることが2つある。
１つは、エイリアス。「部署名そのままのチーム名で作ったら、メールの宛先に配布リストと全く同じで困った」とか「一般名詞のエイリアスをTeamsにとられちゃって配布リストに使えなくなった」とかが起こってしまう。

その対策として、接頭辞をつけるルールを強制するのは結構有効。命名規則を強制するようにすれば、表示名にもエイリアスにも強制されるのでTeamsだと一目でわかるようになり、この問題は解消される。というので[Microsoft Teamsの命名規則](https://qiita.com/hisssa0102/items/1fcf0a35faec051360db)、と以前まとめてみた。

もう1つは、使わなくなったTeamsの扱い。作るのはみんな作ってくれるけど、削除なんてなかなかしてくれないし、それこそメンバーから離脱して放置とかも想像できてしまう。

とそんなことを考えて、外部のソリューションしかないかな、と思ってたらこんな気になる投稿が。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たしか一定期間経つと自動的に削除する機能あったような気がするので、特定の数チーム意外はそれを使う代わりに自由に作るのを検討してみてはと思うんですよねー折衷案で消されたくないチームだけ申請制にするとか。<br>sharepointのサイトやexchangeの配布グループの昔からの議題ですがw</p>&mdash; 目代昌幸 O365 MVP (@mokudai) <a href="https://twitter.com/mokudai/status/1151816114776596480?ref_src=twsrc%5Etfw">July 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

「有効期限を強制する」方法がある！？

そんな方法があるならぜひ使いたい、ということで調べてみたらありました。


Office 365 グループの有効期限ポリシーの構成
https://docs.microsoft.com/ja-jp/azure/active-directory/users-groups-roles/groups-lifecycle#set-group-expiration

というわけで、早速使ってみました。

#有効期限ポリシーを設定する

365管理センターではなく、AzureADからGUIで設定できる。
Azure Active Directory→グループ→有効期限から設定できる。

設定しておくと、少し前にチームの所有者に通知され、延長操作すれば延長されるが、放置したら削除される。素敵。

https://portal.azure.com/?l=ja.ja-jp#blade/Microsoft_AAD_IAM/GroupsManagementMenuBlade/Lifecycle

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/ec94f470-c872-b026-c750-c298cf9cc95d.png" width=50%>


有効期間は、180日か、365日か、カスタム。カスタムの場合は30日以上。
所有者がいないチームの場合の宛先は設定しないとダメっぽい。
対象のチームは、「全てのチーム」「選択したチームだけ」「設定しない」を選べる。

とりあえずは365日で、すべてのチームで試してみる。これでちゃんとユーザーが管理してくれる。削除されても一定期間は復元できるので、オンにするのがおススメ。


#名前付けポリシーを設定する

以前は、名前付けポリシーはPowerShellで設定してたけど、GUIでいけるようになっていた。
Azure Active Directory→グループ→名前付けポリシーから設定できる。

https://portal.azure.com/?l=ja.ja-jp#blade/Microsoft_AAD_IAM/GroupsManagementMenuBlade/NamingPolicy

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/2a9dc28a-40ad-768f-50d8-cd8fa49e8f5e.png" width=50%>

プレフィックス、サフィックス、禁止用語もここで設定できる。

プレフィックスはAADの属性からも設定できて、複数を組み合わせることも可能。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b719a6f0-5e63-9fca-bc1e-2ba885269bd3.png" width=50%>

接頭辞にTeamsと付けるだけでも区別がつくようになります。あと、管理者が作成する場合は命名規則が適用されないので、それはそれで注意が必要。

#まとめ

Teamsは、自由に作れてこそ浸透も活用も進むと思う。この2つだけでユーザーの自由度も、管理の手間も減る。おすすめです。


公式資料に、あれこれまとまってました。こちらもおススメです。

Microsoft Teams 導入ご参考資料
http://download.microsoft.com/download/1/8/1/1817774E-8A90-4D3F-99D4-9DC892356C8F/Microsoft_Teams_DLC.pdf
政党の意見の違いをPythonで可視化した。

## まとめ

明日は選挙なので、[ここ](https://seiji.yahoo.co.jp/senkyo/#l_party)に載っている政党ごとの意見をいろいろ可視化してみました。
政治的な意図は特にないので、とりあえず明日選挙行けよな!!

## PCA

とりあえずPCAが気になる。

### ・ソースコード

```python
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
import seaborn as sns
from scipy.stats import pearsonr
from sklearn.decomposition import PCA

plt.rcParams['font.family'] = 'IPAexGothic'

df = pd.read_csv("input.tsv", sep="\t", index_col=0)
df = df.replace({
    "賛成": 2,
    "やや賛成": 1,
    "選択なし": 0, # 若干ニュアンスが違うが、0扱い。
    "中立": 0,
    "やや反対": -1,
    "反対": -2
})
df = df.transpose()

# do pca
pca = PCA(n_components=2)
pca.fit(df.values.T)
explained_variance_ratio = [100.0 * v for v in pca.explained_variance_ratio_]
pc_coord = pca.fit_transform(df.values.T)
arrows = []
for i, feature in enumerate(df.index):
    feature_dict = {}
    feature_dict['name'] = feature
    feature_dict['x'] = pearsonr(df.values[i, :], pc_coord[:, 0])[0]
    feature_dict['y'] = pearsonr(df.values[i, :], pc_coord[:, 1])[0]
    feature_dict['len'] = np.sqrt(
        feature_dict['x']**2 + feature_dict['y']**2)
    arrows.append(feature_dict)

plt.scatter(x=pc_coord[:, 0], y=pc_coord[:, 1])
for x, y, text in zip(pc_coord[:, 0], pc_coord[:, 1], df.columns):
    plt.text(x, y, text)

for arrow in arrows:
    plt.arrow(0, 0, arrow["x"]*3, arrow["y"]*3, fc="red", ec="red", alpha=0.5)
    plt.text(arrow["x"]*3, arrow["y"]*3, arrow["name"])
# plt.savefig("pca.png")

```

### ・結果

![pca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217082/88b1b0a4-3334-b54d-d5ad-9dde0d07dcd4.png)

与党が固まっていること、野党は何パターンかある感じが掴み取れます。

## clustermap

これだけ単純なデータだったら、ヒートマップですべてが見られるような気もする。

`sns.clustermap`でheatmap&可視化してみます。

```python
sns.clustermap(df, cmap=sns.color_palette("coolwarm", 5))
```

![cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217082/e08a2b68-4b1d-c170-a45d-e17f64a27b49.png)

アベノミクス、消費税10%、議員定数削減あたりが与野党で温度感が違うことがわかります。

おわり。
MySQL WorkbenchでCloud SQLに接続する

# TL;DR

- インスタンスの詳細の接続タブの承認済みネットワークに **0.0.0.0/0** を追加する。(本来は接続元のIPアドレスを追加すべき)

![Screenshot from 2019-07-21 00-07-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/b36dd7d4-5bd3-36b7-9832-b5d3f35cc02a.png)

# Cloud SQLの作成からMySQL Workbenchで接続するまで(動画)

[![MySQL WorkbenchでCloud SQLに接続する動画](https://i.ytimg.com/vi/rsPSAUC1q9c/maxresdefault.jpg)](https://www.youtube.com/watch?v=rsPSAUC1q9c)
M5StackでWifiをAPとSTAとで使い分ける

## 概要
M5StackでWifiをAPとSTAとで使い分ける

M5Stackを既存のWiFi ネットワークのアクセスポイントに接続するときは、ステーションモード(STA)・子機モードを使う。
M5Stack自体をWifiのアクセスポイントとする場合には、アクセスポイントモード(AP)・親機モードを使う

## アクセスポイントモード(AP)・親機モード

M5Stack自体をWifiのアクセスポイントとする場合には、アクセスポイントモード(AP・親機モード)を使う

```
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>

const char *ssid = "yourAP";
const char *password = "yourpasswd";

void setup_wifi() {
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
}
void setup() {
setup_wifi();
}

void loop(){
}

```



## ステーションモード(STA)・子機モード

M5Stackを既存のWiFi ネットワークのアクセスポイントに接続するときは、ステーションモード(STA・子機モード)を使う。

```
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>

const char *ssid = "your_wifi";
const char *password = "yourpasswd";

void setup_wifi() {
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, passwd);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}
void setup() {
setup_wifi();
}

void loop(){
}

```
Unity+PlayFabでasync/awaitを使う方法

## 2019/09/16追記
こちらの記事は以下の環境で動作確認を行っています。
- Unity 2019.1.13 + IL2CPP + iOS 実機
- Unity 2019.1.13 + IL2CPP + Android 実機

## まえがき
Unity から PlayFab を利用するとき、コールバックのネストが深くなりやすく、結果としてコードの可読性が悪くなってしまうことが厄介だなと思っています。

下記のコードは PlayFab のログインのサンプルコードですが、Unity から PlayFab を利用する際は何をやるにもこのコードのようにコールバックで処理を継続していくのが基本です。

```C#
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

public class PlayFabLogin : MonoBehaviour
{
    public void Start()
    {
        PlayFabSettings.staticSettings.TitleId = "xxx";
        
        var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true};
        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
    }

    private void OnLoginSuccess(LoginResult result)
    {
        Debug.Log("Congratulations, you made your first successful API call!");
    }

    private void OnLoginFailure(PlayFabError error)
    {
        Debug.LogWarning("Something went wrong with your first API call.");
    }
}
```

async/await を使ったりしてもっとスッキリ書きたいなと思ったのですが、当然同じことを考える人はいるもので、フォーラムで[こんなやりとり](https://community.playfab.com/questions/23363/can-not-use-loginwithcustomidasync-with-unity-2018.html)がありました。

PlayFab には UnitySDK と CSharpSDK が別に存在するので、CSharpSDK を試してみたらどうかとのことです。

CSharpSDK はもともとサーバーサイドなどで使う想定のもののようですが、Unity も最新の C# が使えるようになったので、Unity でも動くんじゃないかということですね。

早速試してみようと思います。

## 手順
1. [こちらのページ](https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/c-sharp/)から CSharpSDK をダウンロードする
2. CSharpSDK-versioned\PlayFabSDK\source 以下のファイルを Unity のプロジェクトにコピーする
3. async/await を使ったコードに書き直してみる

```C#
using PlayFab;
using PlayFab.ClientModels;
using System.Threading.Tasks;
using UnityEngine;

public class PlayFabLogin : MonoBehaviour
{
    async Task Start()
    {
        PlayFabSettings.staticSettings.TitleId = "xxx";

        var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true };
        var result = await PlayFabClientAPI.LoginWithCustomIDAsync(request);

        var message = result.Error is null
            ? $"Login success! My PlayFabID is {result.Result.PlayFabId}"
            : $"Login failed... {result.Error.ErrorMessage}";

        Debug.Log(message);
    }
}
```

## 結果
特に問題なく動くようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/a367a9b0-f5f8-5ff9-0eb1-ec6e2b974775.png)

自分は Unity よりもサーバーサイド歴のほうが長いこともあって、async/await を使った書き方のほうが慣れているので、UnitySDK から CSharpSDK に切り替えて行こうかなと思いました。
.browserslistrcで対象ブラウザを指定する

.browserslistrcは、「AutoprefixerでCSSにどのベンダープレフィックスを付けるか」などを決める設定ファイルです。
Autoprefixer以外にも対応していてツールごとに設定を持たずに済むので、ツール間で対象ブラウザ設定の齟齬が起こるのを防げます。
ブラウザのバージョンを直接指定せず、カバー率や直近○年という方法で指定しておくと、ブラウザのバージョンアップや、新しいブラウザの登場、シェアの激変などへの手動での設定変更が不要になります。
.browserslistrcファイルではなく、package.json に記述することも可能です。

## 対応ツール
対応するツールは下記です。

* Autoprefixer
* Babel
* postcss-preset-env
* eslint-plugin-compat
* stylelint-no-unsupported-browser-features
* postcss-normalize
* obsolete-webpack-plugin

(https://github.com/browserslist/browserslist)
※typescriptの変換のターゲットは.tsconfigファイルのtargetに書きます。

## サンプル
.browserslistrcファイルのサンプルです。
プロジェクトルートに配置します。

```
last 1 version
> 1%
```

## 記述方法

###  デフォルト

|記述|意味|
|---|---|
|defaults|> 0.5%, last 2 versions, Firefox ESR, not dead|

###  特定のブラウザのバージョンを指定

|記述|意味|
|---|---|
|ie 6-8|IEの6～8|
|Firefox > 20|バージョン20より新しいFirefox|
|iOS 7|iOSのSafariのバージョン7|
|Firefox ESR|最新の「Firefox Extended Support Release」バージョン|
「>」以外に「>=」「<」も有効です。

###  browserslist-config-xxxx

|記述|意味|
|---|---|
|extends browserslist-config-google|browserslist-config-googleを使う|

###  ビジターのカバー率で指定
地域コードのリスト https://github.com/ben-eb/caniuse-lite/tree/master/data/regions

|記述|意味|
|---|---|
|> 5%|世界の使用状況統計を使用で5%以上|
|> 5% in US|アメリカの使用統計で5%以上|
|> 5% in alt-AS|アジア地域の利用統計で5%以上|
|> 5% in my stats|自国の利用統計で5%以上|
|> 0%|使用率が0%以上のブラウザ(全てのブラウザ)|

###  年で指定

|記述|意味|
|---|---|
|since 2015|2015年以降にリリースされたすべてのバージョン|
|last 2 years|過去2年にリリースされたすべてのバージョン|

###  最新版から過去何バージョンまでか指定

|記述|意味|
|---|---|
|last 2 versions|各ブラウザの最後の2つのバージョン|
|last 2 Chrome versions|Chromeブラウザの最新の2バージョン|
|last 2 major versions|最新の2メジャーバージョン|
|last 2 iOS major versions|iOSのSafariの最新の2メジャーバージョン|

###  アルファ版、ベータ版

|記述|意味|
|---|---|
|unreleased versions|アルファ版とベータ版|
|unreleased Chrome versions|chromeのアルファ版とベータ版|

### Node.js

|記述|意味|
|---|---|
|maintained node versions|すべてのNode.jsバージョン|
|node 10|Node.js 10.x.x|
|current node|Browserslistで現在使用されているNode.jsのバージョン|

### 除外
notキーワードを使います。

|記述|意味|
|---|---|
|not ie <= 8|ie8未満を除外|

### サポート状況
notと組み合わせて「not dead」として使う事になると思います。
使用例：last 2 versionsではIE10もサポートされてしまうので、IE10を除外するときなど

|記述|意味|
|---|---|
|dead|24ヶ月以内にアップデートされてないバージョンのブラウザ|


## 確認
https://browserl.ist/ で該当するブラウザの一覧をチェックできます。

.browserslistをプロジェクトルートに配置後は、下記のコマンドでも確認可能です。

```
$ npx browserslist
```
Dockerをnameオプション無しで起動してもウォズニアックは決して退屈にならなかった

Dockerを--name無しで起動すると、ランダムにコンテナに名前が割り当てられます。
が、boring_wozniakにはならないようになってます。

ソース
https://github.com/moby/moby/blob/master/pkg/namesgenerator/names-generator.go

```.go
if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
  goto begin 
}
```

遊び心というか、愛があっていいですね。
その他の面々の名前も全てコメントがありました。
DockerでPowerCLIとGotty動かしてブラウザからCLIでvCenter操作する

vCenterをPowerShellで操作できるツールであるPowerCLIをDockerで動かす。
さらにGottyを使って複数の人が気軽にPowerCLIを使えるようにする。

# TL;DR

* PowerShellがLinuxで動くようになったのでPowerCLIもLinuxで動かせるようになった
* Dockerで動かせるPowerCLIのイメージがvmwareから公開されている
* GottyでWebから使えるようにすることで誰でも気軽に使えるようにした
* PowerCLIの具体的な使い方は[公式ドキュメント](https://code.vmware.com/docs/9006/cmdlet-reference)を参照

# DockerでPowerCLI

[PowerCLI公式イメージ](https://hub.docker.com/r/vmware/powerclicore/)を``docker run``するだけで簡単にPowerCLIを使うことができる。オプションは適当に適宜付ける。

```bash
docker run -i --rm vmware/powerclicore:latest 
```

起動したあとは``Connect-VIServer``でvCenterに接続すれば``Get-VM``などでvCenterの情報を取得できる。
接続に使うアカウントの権限によって実行できるコマンドや範囲に制限がかかる。

# PowerCLIコンテナでGotty

コンテナ内にGotty本体とコンフィグファイルを配置し、最後にGottyを起動することで外部からブラウザでPowerCLIコンテナに接続できるようにする。
コンフィグファイルは必須では無いが、使った方がいろいろとカスタマイズできて便利

```Dockerfile:Dockerfile
FROM vmware/powerclicore:latest

RUN yum install -y gzip wget tar \
    && wget https://github.com/yudai/gotty/releases/download/v1.0.1/gotty_linux_amd64.tar.gz \
    && tar xzf gotty_linux_amd64.tar.gz \
    && yum remove -y gzip wget tar \
    && rm -f gotty_linux_amd64.tar.gz

RUN mv gotty /usr/local/bin/
COPY gotty_config /root/.gotty
CMD gotty -w pwsh
```

コンフィグ記載例
詳細は[こちら](https://github.com/yudai/gotty/blob/master/.gotty)を参照

```bash:gotty_config
preferences {
    font_size = 12
    copy_on_select = true

    clear_selection_after_copy = true
    enable_clipboard_notice = true

    ctrl_c_copy = true
    ctrl_v_paste = true

    enable_bold = true
}
```

# docker-composeで起動する

```bash:ディレクトリ構成
.
├── Dockerfile
├── gotty_config
└── docker-compose.yaml
```

```yaml:docker-compose.yaml
version: '3'
services:
  powercli:
    build: .
    ports: 
      - "8080:8080"
```

あとは``docker-compose up -d``を実行するとビルドが終わった後にPowerCLIとGottyが起動するので、ブラウザで``http://<サーバIP>:8080``にアクセスするとPowerCLIの画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116209/75b2c2ea-8b3e-d317-7ded-feb4ed9dd9f0.png)

vCenterを一人で使うことはあまりしないと思うので、このような方法で共用環境を作っておくと一人一人の手間が減って役立つと思う。
【Powershell版】バッチファイルで「既定のブラウザ」をシークレットモード(InPrivateブラウズ、プライベートブラウジング)で起動する

#概要

昔、[ここ](https://qiita.com/riafeed/items/794013bc012fbff3ff1d)でプライベートモードで既定のブラウザを起動するバッチファイルを書きましたが、
バッチファイルの文字列処理がアレすぎて無駄に長ったらしいものになってしまい、ちょっと使いにくそうな感じになっていたのでPowershellで書き直してみました。
(ついでにOpera、Vivaldi、Brave、ChromiumベースEdgeにも対応してみました)

Powershellコードの埋め込み、実行をバッチファイル一つで実現する方法につきましては[こちら](https://hake.hatenablog.com/entry/20180218/p1)を参考に少しだけ改造しました。

#使い道
このバッチファイル(?)をUSBメモリに入れておけば、いちいちショートカットキーの入力やメニューの選択をすることなく
バッチファイルをダブルクリックするだけでシークレットモードでブラウジングを開始できます。
ネットカフェや出先のPC等で履歴を残さずにブラウジングしたいときに便利なんじゃないでしょうか。


#コード(コピペして.batファイルとして保存すると使えます)

```powershell
@setlocal enableextensions enabledelayedexpansion & set "SELFPATH=%~dp0" & set "SELF=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

#設定

#ここにURLやファイル名を記述すると起動時に開くようになります(引数がない場合)
$openfile = ""
#$openfile = $env:SELFPATH + "\test.html"  #USBメモリに入れたファイルを指定する場合はこんな感じで

#引数がある場合は引数を適用
if($args.length -gt 0){
    $openfile = $args -join " "
}

#ブラウザ情報
$browserdata = @(
    @{"command"="LaunchWinApp.exe"; "option"="-private"; "execute"="shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"},
    @{"command"="msedge.exe"; "option"="--inprivate"; "execute"=""},
    @{"command"="iexplore.exe"; "option"="-private"; "execute"=""},
    @{"command"="chrome.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="brave.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="Launcher.exe"; "option"="--private"; "execute"=""},
    @{"command"="vivaldi.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="firefox.exe"; "option"="-private-window"; "execute"=""}
)

#初期化
$script:reg = ""
$script:execute = ""
$script:option = ""


#レジストリキーが存在しない例外をcatchするにはこのコードが必要らしい
$ErrorActionPreference = "stop"

#HKEY_CLASSES_ROOTは事前には登録されてないので登録する必要があるらしい
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null

try{
    #既定のブラウザのIDを取得
    $script:reg=Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\http\UserChoice" -Name ProgId
    $progid = $script:reg.ProgId

    #取得したIDを基にブラウザ本体のパスを取得
    $script:reg=Get-ItemProperty -Path "HKCR:\$($progid)\Shell\Open\Command"
}catch{
    #アンインストールしたまま既定のブラウザを変更していない等、
    #正しく既定のブラウザが設定されていない場合はレジストリの取得に失敗するので
    #強制的にWindowsであれば絶対入っているIEで起動するためにIEのパスを取得する
    $script:reg=Get-ItemProperty -Path "HKCR:\IE.HTTP\Shell\Open\Command"
}

#レジストリに記載のパスには余計な文字やオプション文字列が付いてるので取り除く
$progdata = $script:reg."(default)"

if($progdata.substring(0,1) -contains "`""){
    #""で囲まれてる場合は""の中がパス
    $progdata -match "`"([^`"]*)`"" | Out-Null
}else{
    #""で囲まれていない場合は最初のスペースまでがパス
    $progdata -match "(\S*)" | Out-Null
}
$script:execute = $Matches[0]

#パスのファイル名を基にブラウザを判別して起動オプションを設定
foreach($browser in $browserdata) {
    if($script:execute -match $browser["command"]) {
        $script:option = $browser["option"]
        if($browser["execute"] -ne "") {
            $script:execute = $browser["execute"]
        }
        break;
    }
}

#起動
Start-Process -FilePath $script:execute -ArgumentList "$script:option $openfile"
```
gulp-scssでimportを１度だけ行うために node-sass-once-importer を使用する

個別にscssを提出したいけど総括したscssも生成したい・・・みたいなケースのとき、`@import`は一度だけ行いたいケースがある。例えば

```scss:style.scss
@import "reset";

@import "components/**/*.scss";
```

```scss:components/hoge.scss
@import "reset";

.hoge {
  // なんか
}
```

成果物としては、総括した`style.css`と個別の`hoge.css`,`fuga.css`,`piyo.css` ... etc両方を提出したいが、`reset.scss`の読み込みは一度だけ行いたい・・・みたいなケースがあった。

通常のscssのコンパイルでは上記の２ファイルの例だと`@import` は２回実行されるため、 `style.css`下記のようになる

```css:style.css
/* http://meyerweb.com/eric/tools/css/reset/
   v2.0 | 20110126
   License: none (public domain)
*/
html, body, div, span, applet, object, iframe /* ... */

/* http://meyerweb.com/eric/tools/css/reset/
   v2.0 | 20110126
   License: none (public domain)
*/
html, body, div, span, applet, object, iframe /* ... */

.hoge {
  /* なんか */
}
```

[`node-sass` のオプションには`importer`というオプションがあり](https://www.npmjs.com/package/node-sass#importer--v200---experimental)、これに `node-sass-once-importer` を渡してやれば`@import`を一度だけ行うようになる。

例えば、gulp-sassでコンパイルする場合は下記のようにする。

```js
const gulp = require('gulp')
const sass = require('gulp-sass')
const onceImporter = require('node-sass-once-importer')

sass.compiler = require('node-sass')

gulp.task('sass', () => {
  return gulp.src('src/**/*.sass')
    .pipe(sass({ importer: onceImporter() }).on('error', sass.logError))
    .pipe(gulp.dest('dist'))
})
```

以下のようなコンパイル結果となる


```css:style.css
/* http://meyerweb.com/eric/tools/css/reset/
   v2.0 | 20110126
   License: none (public domain)
*/
html, body, div, span, applet, object, iframe /* ... */

.hoge {
  /* なんか */
}
```

（[gulp-sass-glob](https://www.npmjs.com/package/gulp-sass-glob)と用途が被るが） node-sass-once-importer は [node-sass-magic-importer](https://www.npmjs.com/package/node-sass-magic-importer) の子プラグインとなっており、こちらはフィルタリングなどの便利機能が存在するため、興味があるならこちらも確認されたい。
エディター付きのWebアプリを開発するときに便利なツールを紹介

## エディター付きのWebアプリを開発するときに便利なツールを紹介
結論から言うますと、こちらのリポジトリで公開されているスクリプトが便利です。
https://github.com/codemirror/CodeMirror

CodeMirrorは色々な言語・デザインテーマに対応したエディター機能をWebサイトに搭載できるJavaScriptです。

GitHubのスター数は18000を超えており、大変人気のリポジトリのようです。実際に使ってみたところ情報も豊富で便利でした。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Three.js 基本

# THREE.Sceneクラス
- 3Dの空間を表すクラス。3Dのオブジェクトはシーンにadd()メソッドを利用して追加することで表示できる。

# THREE.PerspectiveCameraクラス
- 3D空間を撮影するカメラ。視点を制御するために使用する。

# THREE.WebGLRendererクラス
- 3D空間のレンダリングを行う。レンダリングとは3Dオブジェクトを画面に表示すること。Three.jsではrequestAnimationFrameのタイミングに合わせて、レンダリングを行うように設定する。

## 参考
- https://ics.media/tutorial-three/quickstart/
FlutterでFirebase Pluginを追加した際に発生するビルドエラーの対応

## こんなエラーがおきました
FlutterでFirebaseを使用する際にはFirebase Pluginを使用するのが一般的です。
Pluginはpubspec.yamlのdependenciesにPluginの名前、バージョンを追記します。

```yaml:pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^0.4.0+6
```

これでAndroid Studioでビルドすれば無事導入完了・・・と思ったら、下記のようなエラーがでました。

```shell:ビルドエラー
D8: Cannot fit requested classes in a single dex file (# methods: 72501 > 65536)
FAILURE: Build failed with an exception.
```

## 原因
「a single dex file」
つまり、Androidの1つのAndroidのバイナリファイル内に含めることができるメソッドの数は65536までという上限があり、その上限を超過したためにビルドが失敗していました。

## 対処方法
Androidには1アプリケーションのdexファイルを複数に分割するMultidexという機能があります。こちらを有効にすることで上記エラーを回避できます。
対応はbuild.gradleに下記2件の設定を追加するだけです。


```gradle:build.gradle
android {
    defaultConfig {
        multiDexEnabled true            // 1.ここを追加
    }

    buildTypes {
        release {
           multiDexKeepFile file('multidex-config.txt')    // 2.ここを追加
        }
    }
}

```

## さいごに
Firebase Plugin１つだけの導入でこのエラーにぶつかるとは思っても見ませんでした・・・。

## 参考
https://github.com/flutter/flutter/issues/27682
https://github.com/flutter/flutter/issues/21009
https://developer.android.com/studio/build/multidex?hl=ja
Power BI Tips - 値によって画像の塗りつぶし範囲と色を変える

#概要
[前回](https://qiita.com/yossihard/items/0ade0778201b80727be2)、Power BIで値によって画像が変わるようにしましたが、
Infographic Designerでは画像やテキストの色や塗りつぶし範囲を、値によって変えることもできます。
で、画像の色を変えるときにいろいろ試行錯誤してわかったことの備忘録。

#やりたいこと
湿度の値によって、画像の色を変えるんですが、
値によって描画される範囲も変えたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/cf8c4ffd-ac41-3db9-da1d-719871e882c8.png)


#用意する画像
今回は、湿度のデータを使って、画像の色を変えようとしました。
用意した画像がこちら。

■色が変わるところの画像（画像１）
　この画像はPNG形式で、真中の黒いところ以外は透明色になっています。
　色を黒にしておくことがPointです。
![humidity_back.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/bea5bbde-11de-cddf-d60a-59c0e04ea45d.png)

■色が変わらないところの画像（画像２）
　この画像もPNG形式で用意しました。上の画像の輪郭ですね。色付き以外はこちらも透明色にしてます。
![humidity_front.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d1badd99-ed77-0e1b-96e3-5f0ff00cb693.png)


#Infographic Designerの設定
カスタムビジュアルのインポート方法などは、[前回](https://qiita.com/yossihard/items/0ade0778201b80727be2)の記事を参照してください。

Mark Designerを表示して、上記の画像を登録します。
※画像１の上に画像２が描画されるよう、レイヤーを設定してください。

画像１の設定を行います。
①Fill Percentageに参照するデータ系列（ここでは湿度）を設定します。
　必要に応じてMax Valueのテキストボックスも設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5c3a0ed9-c32b-20d7-8953-04c7c92bef40.png)


②FormatのValue TintのプルダウンメニューをCustom Colorに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5c213579-2f75-dffd-93bd-259ae8737dd9.png)

③Data-Bindingを行います。
　今回はこんな感じで値と塗りつぶしの色を設定。
　※データ系列はパーセント表示設定なので60%とか35%といった値が入っていますが、
　　中身は0～1なので、split pointの値も0～1で記述してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/fb8e5de8-ef9c-e783-fabf-5640dddb8803.png)

④値によって塗りつぶす際の方向を設定します。
　Fill Directionのプルダウンメニューから選びます。今回は「Buttom to Top」を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5809bc5f-10ae-4c65-3dff-94e8ae02e4bf.png)

⑤最後に、値によって塗りつぶされない領域の色を設定します。
　まずNon-Value TintをOnにします。
　今回は、白色にしたいので、白色を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/6d14c6de-3c30-cc39-bc08-826820a51dd1.png)

以上で設定は完了です。
※今回はテキストの色を変える方法は書いていません。これは後日。

#できたレポート
こんな感じで、値によって画像が変わったり、画像の中の色が変わったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/69d111d4-fe6a-a6c4-1990-45ec731f3cb7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c772b450-e120-c9e7-848c-5988ea0ab7ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/4c86277d-635c-c4a3-9fc4-2f325ef9f267.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a84e9403-5b19-6f81-e6c6-47a296920a49.png)
JavaScriptのソートを使うと9より80が先にくる

JSのソートについて調べる機会があったのですが、仕様を全然把握していなかったので、勉強がてらまとめました。

## javascriptのソートについて
ソートについて[Array.prototype.sort()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)をみてみると、どうやら数字ではなく文字列に変換したものを比較するらしい。
> compareFunction (比較関数) が与えられなかった場合、要素はそれぞれの文字列に変換したものを比較して辞書 (あるいは電話帳。数的でない) 順にソートされます。例えば、"80" は辞書順では "9" の前に来ますが、数的なソートでは 9 が 80 の前に来ます。

そのため、8と90の配列をソートする結果が下記のようになる。

```javascript
let array = [9, 80];
array.sort()
// (2) [80, 9]
```

## 数字としてソートしたい場合には？
公式からの引用ですが、これ1発でいけた！

```javascript
function compareNumbers(a, b) {
  return a - b;
}
numberArray.sort(compareNumbers);

// クロージャ使うパターン
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);
// [1, 2, 3, 4, 5]
```
googlehomeを使ってラズパイからＰＣ起動

etherwakeでラズパイからＰＣ起動に成功したので
googleHomeに「ＰＣつけて」とか指示をだして、ＰＣを起動したいと思い、環境構築。
以下を参考に構築しました。
https://code-life.hatenablog.com/entry/raspberry-pi-wol

この方はwakeonlanでのサンプルだったので
コマンド起動のsubprocess　を追加
import subprocess

以下記述を加工してhpwake.pyを作成。

```
#   send_magic_packet(mac)　ここを変更 
    print('Send Magic Packet: ' + mac)  
    cmd = 'sudo etherwake '
    cmdh = cmd + mac
    print(cmdh)
    subprocess.call(cmdh.split())
```

これで「ＰＣつけて」と言えばＰＣ起動しました。

さらにsystemdに登録。
$sudo nano /etc/systemd/system/hpwake.service

```hpwake.service
[Unit]
Description=hpwake
After=network.target

[Service]
Restart=always
Type=simple
ExecStart=/usr/bin/python3.7 /home/pi/hpwake/hpwake.py

[Install]
WantedBy=graphical.target
```

そして以下を実施
$sudo systemctl daemon-reload
$sudo systemctl start hpwake
$sudo systemctl status hpwake

起動時に登録をするように設定
$sudo systemctl enable hpwake

でもラズパイリブートするとエラーとなり動きません。
「まあいいか」ですましてます。
だれか教えて。

2020/6/13　
Beebotteサーバ側の問題でＳＳＬ接続でエラーとなり6/9ぐらいから動きませんでした。

```
Traceback (most recent call last):
  File "hpwake.py", line 34, in <module>
    client.connect(HOST, PORT)
  File "/usr/local/lib/python3.7/dist-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/usr/local/lib/python3.7/dist-packages/paho/mqtt/client.py", line 1100, in reconnect
    sock.do_handshake()
  File "/usr/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1056)
```

1883（非SSL接続）ポートとし、以下をコメントアウトしたら動いた。
    client.tls_set(CA_CERTS)  

セキュリティ問題ありとなります。ね。。。
【Python】requestsで取得したAPIからのレスポンスが「<Response [200]>」となる

# 事象

下記のようなPythonコードで`requests`でAPIから取得したレスポンスを`print`や`return`で表示しようとすると、

```python
import requests
r = requests.get(https://api.hoge.com/path?〜)
print(r)
return(r)
```

下記のような実行結果となり、期待されたJSON形式のレスポンスが取得できない。

```py
# print(r)の結果
<Response [200]>

#return(r)の結果
An error occurred during JSON serialization of response: <Response [200]> is not JSON serializable
Traceback (most recent call last):
  File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/var/runtime/awslambda/bootstrap.py", line 134, in decimal_serializer
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Response [200]> is not JSON serializable
```

# 解決策

`r`ではなく`r.text`とする。

```python
import requests
r = requests.get(https://api.hoge.com/path?〜)
print(r.text)
return(r.text)
```

# 参考

https://stackoverflow.com/questions/43354200/getting-response200-with-python-http-requests-instead-of-int
[cocoa][swift]NSUndoManager

<p>NSUndoManagerの利用は、Swiftで楽になったと思うが、その仕組みが見えにくくなったと思うので、Objective-Cの場合から説明する。</p>

<p>CocoaのUndoとRedoは、NSInvocationというクラスでNSObjectの子クラスとメソッドを保持し、それをNSUndoManager内のスタックで管理することで実現している。</p>

<p>なんらかの操作を行うと、Undoに必要なNSInvocationのインスタンスがUndoスタックに積まれていく。</p>

![undo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/1a06fcd9-5b4e-59a0-281a-0b1b6f7c2885.png)

<p>ユーザがUndoを行うと、Redoに必要なNSInvocationのインスタンスがRedoスタックに積まれていく。</p>

![redo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/fe74e1bd-7727-1567-585e-ad3882f615e3.png)

<p>Objective-Cのコードで、以下のようになる。</p>

<pre><code>- (void)makeItHotter
{
    temperature = temperature + 10;
    [[undoManager prepareWithInvocationTarget:self] makeItColder];
}
 
- (void)makeItColder
{
    temperature = temperature - 10;
    [[undoManager prepareWithInvocationTarget:self] makeItHotter];
}
</code></pre>

<p>makeItHotterで温度を10度上げて、makeItColderをNSUndoManagerに積む。</p>

<p>makeItColderでは、温度を10度下げて、makeItHotterをNSUndoManagerに積む。</p>

<p>これをSwiftを書く場合、積むメソッドのselectorを用意するのが面倒になるのだが、selectorを必要としないメソッドが用意されていた。以下のようになる。</p>

<pre><code>func makeItHotter() {
    var temperature = self.textField.intValue
    temperature = temperature + 10
    self.undoManager?.registerUndo(withTarget: self, handler: {
        vc in
        vc.makeItColder()
    })
    self.textField.intValue = temperature
}
 
func makeItColder() {
    var temperature = self.textField.intValue
    temperature = temperature - 10
    self.undoManager?.registerUndo(withTarget: self, handler: {
        vc in
        vc.makeItHotter()
    })
    self.textField.intValue = temperature
}
</code></pre>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/Temperature">https://github.com/murakami/workbook/tree/master/mac/Temperature</a> - GitHub<br />

【関連情報】
<a href="https://amazon.jp/dp/0321503619/">Cocoa Programming for Mac OS X</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
仙台CTF2018 For.3 マルウェア本体の特定 100

#問題

http://ctf.sectanlab.jp/2018/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0a5c9748-264b-02c7-ed55-7efb326f1e99.png)

#解いてみた

ファイルをダウンロードして、解凍します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5d0cc67e-75e3-9302-2419-95c88351760f.png)

UsersフォルダとWindowsフォルダとMFTファイルが入ってました。
自動実行の話なのでNTUSER.DATかSOFTWAREあたりをみたいですよね。

Registry Viewerでntuser.datを見てみます。

\Software\Microsoft\Windows\CurrentVersion\Run
を見てみるとそれっぽいのがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2c956306-183a-b5eb-7eba-010ec70e5d59.png)

これが答えでした。
LaravelでIDE補完されやすくする

intellij IdeaやphpstormなどのIDEでLaravelのコード補完がいまいちきかないのですが、[laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper)というツールを使用すればコード補完がされやすくなります。

今回はこのlaravel-ide-helperの導入方法についてご紹介します。（※今回の記事ではLaravel5.7以上を対象にしています。）

# composerでインストール

プロジェクトのルートディレクトリにて下記を実行します。

```
composer require --dev barryvdh/laravel-ide-helper
```

# コマンドを実行

下記コマンドでコード補完用の<strong>_ide-heler.php</strong>というファイルが生成されます。

```
php artisan ide-helper:generate
```

具体的にどう変わるかなどは詳細に記述するのは大変なので割愛しますが、これで劇的にコード補完されやすくなっていると思います。

他にもmodelのプロパティをDBから自動生成などもできますが、それについては別記事にて紹介します。
Laravelでvendor内の処理をオーバーライドする方法 


##実際にぶち当たった問題

https://github.com/yajra/laravel-oci8
yajra/laravel-oci8 に依存した実装でORACLE上の予約語カラムが含まれるクエリーを実行しようとすると失敗する。


```log:エラーログ例

[2019-07-20 15:06:06] local.ERROR: Error Code    : 904
Error Message : ORA-00904: "PASSWORD": 無効な識別子です。
Position      : 21
Statement     : update "M_USER" set "PASSWORD" = :p0, "UPDATED_AT" = :p1 where "NAME" = :p2
Bindings      : [*****************************,2019-07-20 15:06:06,hogeuser]

```





##原因
原因はver5.4まではクエリーを組み立てるときに予約語でないことを判別してカラム名を大文字に変換していたけど、ver5.5以降は問答無用で変換するようになってしまったためのようでした。
※エラーログに出ている大文字の『PASSWORD』が予約語でした。実際のカラム名は小文字で『password』

###比較
![190711_OracleGrammar.php比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/58cbe457-6a36-ab6d-4e70-2f8de888e8d6.png)


|ver|git|
|:-------|:---------------------------------------------------|
| 5.4 |https://github.com/yajra/laravel-oci8/blob/5.4/src/Oci8/Query/Grammars/OracleGrammar.php|
| 5.5 |https://github.com/yajra/laravel-oci8/blob/5.5/src/Oci8/Query/Grammars/OracleGrammar.php|



##対策
###(1) パッケージのオーバーライド版を用意
任意のディレクトリにパッケージ(yajra/laravel-oci8)を丸ごとコピーし配置

※任意のディレクトリ
[プロジェクトフォルダ]/app/VendorOverrides/
問題の[比較]箇所の処理だけ書き換える
※5.4の処理に置き換える



###(2) composer.jsonを以下のように追記する

```json:composer.json
"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "exclude-from-classmap": [
        "vendor\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
    ],
    "files":[
        "app\\VendorOverrides\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
    ]
},
```



###(3) コマンドを実行

```log:実行コマンド
composer dump-autoload
```





##参考
Laravel How to override vendor class file?
http://shyammakwana.me/php/laravel-override-vendor-classes.html
Flask Practices

目次
=====

1. [cookiecutter-flask を用いたプロジェクトの新規作成](https://qiita.com/coleyon/items/529c63d5e0c57ccfd247)
1. [VSCode を用いた Flask プロジェクトのコーディング支援設定と初回起動](https://qiita.com/coleyon/items/94f757c66968bea8a506)
1. [cookiecutter-flask ベースプロジェクトの育て方](https://qiita.com/coleyon/items/b83ab42305d2b74cdff3)
  1. [環境変数の育て方](https://qiita.com/coleyon/items/a6cc426edf6109db964c)
  1. コンテナの育て方
1. Flask-SQLAlchemy, Flask-Migrate による複数DBハンドリング
1. SQLAlchemy models のリバースエンジニアリング生成
1. ...
1. [A Oneラベル](https://www.a-one.co.jp/product/search/detail.php?id=31073)用紙向けQRラベル印刷してみる
1. Celery + Redis でリモート非同期タスクキューイングしてみる

概要
=====

Flask の学習中に調べて分かった入門者向けプラクティスを掲載します。当ページは表紙です。

私が学習の取っ掛かり始めで感じたのは、Flask は構成要素が Pluggable（選択肢が多くかつ疎結合）なためか、各要素の公式 Docs をきちんと調べても、得られた Snippets（実装例）が自分の例には合わない場合が結構あり、Snippets 同士のつなぎを調べる時間が多かった事です。

このため、背景説明と実行可能なコードをできるだけ添えます。

再現環境
=====

こんな構成でやっています。

* 開発環境
  * Win 10 Pro
    * [python 3.7.x Windows x86-64](https://www.python.org/downloads/windows/)
    * [node.js v10.x](https://nodejs.jp/)
    * Hyper-V
      * [Docker for Windows](https://docs.docker.com/docker-for-windows/)
* prod 環境
  * [Debian9 x64](https://www.debian.or.jp/)
    * [Docker Community Edition 18.x](https://docs.docker.com/install/linux/docker-ce/debian/)
    * [Docker Compose](https://docs.docker.com/compose/install/)

![panels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157638/012a501b-d0b3-6916-cb5c-515193d847cb.png)

赤丸部が記事範囲になる予定です。
対象環境がすんごく基幹系で社内向けっぽいですが実際そうなので、インターネットへ公開するWebサービス向けのノウハウは少ない。かもしれません。
よく使うコマンド入力を簡単にしよう

`alias` はコマンドを別名で登録できる便利なコマンドです。
頻繁に使用する長いコマンドは、`alias`に登録しておくと、簡単に実行できるのでおすすめです。

# よく使うalias
僕が登録している`alias`をご紹介します。
紹介というより、環境が変わった時でもすぐ使えるように保存しているだけですね。
普段`Docker`を使う場合が多いのと、バージョン管理ツールは`Git`を使っているので、
この２つのコマンドがメインになっています。

```
alias h='history'
alias a='alias'

alias dcb='docker-compopse build'
alias dcd='docker-compose down'
alias dcu='docker-compose up -d --build'
alias di='docker images'
alias dps='docker ps'
alias dpsa='docker ps -a'
alias drm='docker rm'
alias drmall='docker rm $(docker ps -a -q)'
alias drmi='docker rmi'
alias dvls='docker volume ls'
alias dvrm='docker volume rm'
alias dvrmall='docker volume rm $(docker volume ls -qf dangling=true)'

alias ga='git add'
alias gb='git branch'
alias gbd='git branch -d'
alias gbdd='git branch -D'
alias gcm='git commit -m'
alias gcam='git commit --amend -m'
alias gd='git diff'
alias gds='git diff --staged'
alias gdh='git diff HEAD^'
alias gf='git fetch'
alias gl='git log'
alias gm='git merge'
alias gmd='git merge develop'
alias gmm='git merge main'
alias gpl='git pull'
alias gps='git push'
alias gs='git status'
alias gsl='git stash list'
alias gsp='git stash pop'
alias gss='git stash save'
alias gt='git tag'
alias gw='git switch'
alias gwc='git switch -c'
alias gwd='git switch develop'
alias ll='ls -la'
```

# aliasの有効期限
ターミナルを閉じたり、ログアウトしたりすると、`alias`のの設定はすべてリセットされます。
永続的に登録しておきたい場合は、`~/.bashrc`に上記設定を登録しておいてください。
個人的なWindows10の環境構築

メインのマシンを久しぶりにWindowsにしたので、Windows上での開発や学習の環境を構築する際にとったメモ

# 方針

最近はRustの学習とUdemyでセキュリティ関連のコースを受講するのがメインのなので、下の2つができる状態にする

* Rustのコンパイルおよびデバッグができる
* Kali linuxが動く

RustについてはWindowsに直接インストールして開発するのではなく、WSLやVMにインストールしてVSCode Remoteで開発をおこなう

## インストールするもの

ここに記載のものは公式ページからインストーラを入手してインストールしたりストアから入手する

* Rust関連
    * VSCode
    * Ubuntu(WSL)
* Rust,Kali共通
    * VirtaulBox
    * Vagrant

# 手順

## Ubuntu(WSL)

WSL上でRustのコンパイルができるようにするまでの手順

1. build-essentailをインストール
2. Rustをインストール

なおWSLでは、デバッグに利用するLLDBで利用するシステムコールが実装されていないことが原因で、LLDBが正常に動作しないようなので、WSLでRustの環境構築はあまり得策ではなさそう
https://github.com/vadimcn/vscode-lldb/issues/177
WSL2ではLLDBも正常に動作するようなので、WSL2の安定板がリリースされた場合にはそちらを利用したほうが良いと思われる
https://github.com/Microsoft/WSL/issues/2028#issuecomment-502289733

### build-essentailをインストール

gccやgcdを利用できるようにするためにbuild-essentailをインストールする

```bash
$ sudo apt install build-essentail
```

### Rustをインストール

1.  [Rustの公式サイト](https://www.rust-lang.org/learn/get-started) に従ってWSL上で以下のコマンドを実行

```bash
$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env
```


## VirtualBox

VirtualBoxをインストールして諸々の仮想環境を整える。

### Kali Linux

Udemyのコースで指定されているためKali linuxのイメージは↓のページから入手する
https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/

### Ubuntu
イメージをダウンロードしてきてOSのインストールをするのが面倒なのでVagrantを利用する

WSL上のUbuntuが18.04のため、バージョンを合わせるためにVirtualBox上のUbuntuについても18.04とする
[VagrantCloudのページ](https://app.vagrantup.com/ubuntu/boxes/bionic64)に従い、Windowsのコマンドプロンプトにて以下のコマンドを実行

```
> vagrant init ubuntu/bionic64
> vagrant up
```

起動したVMにSSHで接続し、Ubuntu(WSL)で記した手順と同様に"build-essentail"と"Rust"をインストールする
併せてLLDBもインストールしておく

```bash
$ sudo apt install lldb
```

また、VSCodeからSSH接続するために、VirtualBoxへの接続に利用する秘密鍵を確認する
おそらく、ユーザディレクトリ下の".vagrant/machines/default/virtualbox/"の中に"private_key"が存在するはずだが、存在しない場合はコマンドプロンプトで以下のコマンドを実行して表示される"IdentityFile"が秘密鍵のパスとなる

```
> vagrant ssh-config
```

## VSCode

VSCode RemoteでWSLやVirtualBox上のUbuntuに接続できるようにする

### WSL

1. VSCodeに拡張のRemote-WSLを追加
2. Remote-WSLでWSLに接続（VScodeの左下の><となっている箇所をクリックして"Remote-wsl: New Window"をクリック）
2. Rust(rls)をインストール（この時、install in wslをクリックする）
3. WSL上にrlsに必要なものをインストールするか聞かれるのでyesとする

※ WSL上ではLLDBが正常に動作しないためLLDBの導入はしない

### VirtualBox
1. VSCodeに拡張のRemote-SSHを追加
2. VirtualBox上のUbuntuに接続するために設定ファイルを編集する
    3. WSLに接続するときと同様にVScode左下の><となっている箇所をクリック
    4. "Remote-SSH: open configuration file"をクリック
    5.  下のような内容を入力して保存
6.  VirtualBox上のubuntuに接続
    7.  VScode左下の><となっている箇所をクリック
    8.  "Remote-SSH: Connect to Host"をクリック
    9.  設定ファイルの"Host"に記載したホスト名が表示されるはずなので、それをクリック
2. VSCodeに拡張のRust(rls)を追加（この時、install in wslをクリックする）
3. WSL上にrlsに必要なものをインストールするか聞かれるのでyesとする
4. VSCodeに拡張のCodeLLDBを追加

```
Host Local-Ubuntu
    HostName 仮想マシンのIP（127.0.0.1）
    Port 仮想マシンの22番ポートにフォーワーディングしているポート（2222）
    User vagrant
    IdentityFile 秘密鍵のフルパス
```

以上でRustの環境構築とKali linuxの準備は完了
Countのカッコの中身って何書く？

最近、仕事中に話題になったので、調べてみました。
COUNTのカッコの中身って何書くのか？

# パターンはこんな感じ
今まで現場で見てきた内容に加えて、調べた内容を書いています。

- COUNT(*)
- COUNT(列名)
- COUNT(ALL 列名)
- COUNT(DISTINCT 列名)
- COUNT(0)
- COUNT(1)

COUNT(ALL 列名)、COUNT(DISTINCT 列名)は、現場で見たことが無かったです。
調べたら出てきました。

# じゃあ、違いは？
じゃあ、違いは？というと、実際に実行してみました。
＃ 久々に自宅のPCにOracleを入れてみましたが、いつのまにか、19cになっていたんですねｗ

こんなcount_testテーブル。

TEST_ID|TEST_VAL
|---|---
TEST1|TESTVAL1
TEST2|TESTVAL3
TEST2|TESTVAL2
 |TESTVAL4

で、以下のSQLを実行すると、

```
SELECT
     COUNT(*)                -- 「*」
    ,COUNT(test_id)          -- 「列名」
    ,COUNT(ALL test_id)      -- 「ALL 列名」
    ,COUNT(DISTINCT test_id) -- 「DISTINCT 列名」
    ,COUNT(0)                -- 「定数」
    ,COUNT(1)                -- 「定数」
FROM
    count_test;
```
こんな感じ。分かり易いように立てにしています。

|列名|件数|内容
|---|--:|---
COUNT(*)|4|NULL含めての件数
COUNT(TEST_ID)|3|NULLを除いたTEST_IDの件数
COUNT(ALL TEST_ID)|3|NULLを除いたTEST_IDの件数
COUNT(DISTINCT TEST_ID)|2|NULLを除いたTEST_IDをユニークとした件数
COUNT(0)|4|NULLを含めた件数
COUNT(1)|4|NULLを含めた件数

こう見ると、COUNT(*)、COUNT(0)、COUNT(1)は、一緒ですね。
後は、COUNT(TEST_ID)、COUNT(ALL TEST_ID)も、一緒ですね。
# そもそも、関数の仕様は？
オラクルの公式ページの関数を見てみると、
[SQL Language Reference: COUNT]
(https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/COUNT.html#GUID-AEF08B79-024D-4E3A-B362-9715FB011776)

「＊」か「expr」（式）を指定する感じですね。

# 結論
パフォーマンスを抜きに考えた場合、
NULLをカウントするかどうかで、選択が変わりますね。
### NULLをカウントする場合

- COUNT(*)

かな。

### 列に対して、カウントを取りたい場合

- COUNT(列名)
- COUNT(DISTINCT 列名)

かな。

パフォーマンスを考えた場合は？は、実行計画を見て考えるべき。
個人的には、「＊」で良いと思いますが。
SharePoint Onlineでユーザーの認証情報でREST APIにアクセスしたい

# 1. やりたいこと

- SharePoint Onlineでユーザーの認証情報でREST APIにアクセスしたい
- ユーザーのパスワードは分からない
- 一時的なツール用途
- 自動化は諦めている

# 2. やったこと

- ユーザーがSharePointにログインして以下のCookieを取得する

```
FedAuth
rtFa
```
- 何かしらのプログラムでREST APIにアクセスするときにFedAuth, rtFaをCookieに設定する

# 3. おまけ

- [SharePoint Online の認証](https://docs.microsoft.com/ja-jp/sharepoint/authentication)
- `SharePoint REST API ユーザ認証`みたいなキーワードでググっても見つからなかったからメモ

# 4. できたら

- 認証の部分を自動化できたら。。
- Seleniumでブラウザで認証させてCookieを取得してみようか。。
- [How to generate FedAuth / RTFA cookies to make sharepoint online requests when using PingIdentity SSO](https://sharepoint.stackexchange.com/questions/234195/how-to-generate-fedauth-rtfa-cookies-to-make-sharepoint-online-requests-when-u?noredirect=1&lq=1)
 - パスワードを入力してもらうならこんな感じか


おわり。
僕のラズパイ構成　Raspberry Pi 3 B +

![IMG_0605.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/47b18e1e-1803-a2ee-90fa-3e757b296eb6.jpeg)
こんな感じ
上段　RPZ-IR-Sensor Rev2.0接続
下段　HC-SR501人体赤外線感応モジュール接続
googlehomeと連携したり、色々やった履歴をこれから投稿していきま~す。
Elastic Beanstalk(Java) + Spring Boot + https

# 1. やりたいこと

- Elastic BeanstalkのJavaプラットフォームでSpring Bootを動かすときにhttpsで接続する

# 2. 前提

- LBでhttpsリスナーを設定済み
- 以下のような通信経路

```
LB(443) <-> Nginx(80) <-> Spring Boot(5000)
```

# 3. やったこと

- application.propertiesに以下を設定する
- [89.3 Enable HTTPS When Running behind a Proxy Server](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https)

```
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
```
- 環境変数の場合は以下のように設定する

```
SERVER_TOMCAT_REMOTE_IP_HEADER=x-forwarded-for
SERVER_TOMCAT_PROTOCOL_HEADER=x-forwarded-proto
```
- `server.tomcat.remote-ip-header`はリモートIPアドレスのためなので設定なくても動く
- 以下のAWSマニュアルにヘッダーについて説明がある
 - [HTTP ヘッダーおよび クラシックロードバランサー](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html)
 - [Elastic Load Balancing の詳細](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html)

## 3.1. なにもしなかったら...

- リダイレクトのときにhttpになってしまう
 - 認証後のページリダイレクトとか
 - PRGしたページとか

# 4. おまけ

- httpsでアクセスすると`Set-Cookie`に`Secure`が付いた
- httpトラフィックをhttpsにリダイレクト
 - [ELB の Classic Load Balancer で HTTP トラフィックを HTTPS にリダイレクトする方法を教えてください。](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html)
 - [Application Load Balancer のリスナー](https://aws.amazon.com/jp/premiumsupport/knowledge-center/redirect-http-https-elb/)
 - [[新機能]Webサーバでの実装不要！ALBだけでリダイレクト出来るようになりました！](https://dev.classmethod.jp/cloud/aws/alb-redirects/)


おわり。
ラズパイ　Windows11　リモート（ＶＮＣ）接続

Windows11とラズパイ１号機、2号機、Linux　MintのアクセスをVNCで接続
１．Windows11には　RealVncViewerをインストール
https://www.realvnc.com/en/connect/download/viewer/

２．但し、WindowsとLinux　Mint間でコピペできない為、以下で日本語版をインストール
古いですが、十分使えます。
https://www.vector.co.jp/soft/win95/net/se324464.html?srsltid=AfmBOoqT6N7StCpH7rcfOi_mCt5pHYwuNLHkhwy_uixuMX0hBKjvvmxm

３．高度なオプションの接続の編集でイーサ接続のＩＰを固定化する。
これは便利になったものだ。
ラズパイ2台と　Windows１０、Linux　Mintは有線ＬＡＮの構成。
インターネットはWi-Fiで切り分けている。

４．インターフェースの設定で「VNC」をＯＮにする。

５．WINDOWS11←→ラズパイにコピペとかする必要あるのでインターフェースの設定で
「I2C」をＯＮにする。
カッコイイNanoPi NEO2にしたい

##はじめに
　きっかけは、「NanoPi NEO2をかっこよく自立させたい。」
　ただ、それだけでした。

## 材料  
　M3規格のボルト　(3mm×40mm) ４個
　M3規格のナット　　　　　　　　4個

　M3規格のボルトは、ホームセンター等で入手できます。
　ボルトの直径が3mm以下なら他の規格でも問題ありません。

## 作り方 
　ヒートシンクのボルトとナットをはずします。
　M3ボルトとM3ナットに付け替えます。

##完成
![IMG_20190720_202432_654.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466195/e8576c3a-618e-127e-b93b-8f6eb0dddb43.jpeg)

## 解説
NanoPi NEO2のヒートシンクの穴は、M3規格のボルトでも通ります。
今回は長さ40mmのボルトを使用しましたが、自立させるなら30mmでも大丈夫です。

##効果
ヒートシンクが上面に来るので排熱性が向上します。
ケースのように囲まれていないので熱がこもりません。
NanoPi NEO2が自立するのでメンテナンス性が向上します。
M3規格のボルトの汎用性が高いので、他の工業製品やパーツ等と簡単に接続できます。
海外メンターからコードレビューを受けられる！「Exercism」のすゝめ

# Exercismとは
メンターからコードレビューを受けられるサービスです。

あらゆるプログラミング言語に対応しています。
GitHubアカウントで登録可能です。

[Exercism](https://exercism.io/)

# 良いところ
## 無料
それな。

## 英語を学べる
2019年7月現在、サービス自体に日本語版はありません。
コードレビューも海外メンターから受けるので、当然英語です。

しかし、翻訳ツールを使って適宜わからない単語を調べれば、ほとんど問題はないです。

英語を学べるのも良いですが、海の向こうの人たちとプログラミングについて語り合えるのが嬉しい。あと単純にカッコいい。

## 他人のコードが読める
- この実装、もっと良い書き方ないかな？
- 他の人はどういう書き方をしているんだろう・・・

課題完了後は他の人のコードが読めます。新たな発見があるかもしれません。

## UIが使いやすい
課題のダウンロードから提出までCUIで進められるのが良いです。
シンプルなサイトデザインも含め、1つのサービスとして素晴らしいと思います。

# 悪いところ

## 進み方が遅い
課題はメインの``core track``と、追加演習の``Extra exercises``に分かれています。

``core track``はメンターの承認を受けないと次の課題がアンロックされません。基本24時間以内にメンターからレビューを受けられますが、時間がかかる場合もあります。

自己判断で課題を完了することもできます。
が、一度完了させてしまうと、その課題について再度メンターと交流することができなくなります。

ちなみに``independent-mode``という設定でガンガン進めることもできますが、コードレビューの優先順位が下がるそうです。

[Mentored Mode vs Independent Mode](https://exercism.io/mentored-mode-vs-independent-mode)

## アルゴリズムはあまり学べない
まだ課題をあまり進めていないので断言はできませんが、アルゴリズムはあまり学べない印象です。
それより``組み込み関数を如何に上手く使えるか``が問われると思います。

課題を進めれば印象が変わるかもしれません。

## 課題の内容が分かりにくい
課題によっては、説明文だけでは内容がわからないものがあります。
具体的な仕様はテストコードから判断するしかありません。

テストコードを理解する練習にもなるので、逆にメリットかもしれません。

# 設定から課題完了まで
サイトでチュートリアルを見ることができますが、メモしておきます。

## exercismの設定
パッケージ管理システムの``Homebrew``を使用してインストールします。

```
$ brew install exercism
```

```
$ exercism version
exercism version 3.0.11
```

マイページから個別に割り当てられたトークンを確認できるので、それを設定します。
演習に必要なファイルは、ここで表示される``Workspace``に生成されます。

```
$ exercism configure --token=my_token

You have configured the Exercism command-line client:

Config dir:                       /Users/yuki/.config/exercism
Token:         (-t, --token)      my_token
Workspace:     (-w, --workspace)  /Users/yuki/Exercism
API Base URL:  (-a, --api)        https://api.exercism.io/v1
```

## 課題のダウンロード
```
$ exercism download --exercise=hello-world --track=php

Downloaded to
/Users/yuki/Exercism/php/hello-world
```

Workspace配下に言語毎のディレクトリ、その配下に課題毎のディレクトリが生成されます。

## テストツールのインストール
PHPを選択した場合、``PHPUnit``を使用することができます。
最初の演習時に設定します。

``wgetコマンド``を使える状態にしておきます。

```
$ brew install wget
```

Workspaceの場所を確認し、配下にある``phpディレクトリ``に移動します。

```
$ exercism debug | grep Workspace

Workspace: /Users/yuki/Exercism
```

PHPUnitをインストールします。

```
$ wget --no-check-certificate https://phar.phpunit.de/phpunit.phar
```

``phpunit.phar``に実行権限を付与します。

```
$ chmod +x phpunit.phar
```

## 演習
課題名のディレクトリが生成されているので、その中に``課題名.php``を作成し、課題を進めます。

``README.md``に課題の内容が書いてありますが、わからない場合は既存の``課題名_test.php``を読みながら詳しい仕様を把握します。

作成が完了したら、テストを実行します。

```
$ ./phpunit.phar hello-world/hello-world_test.php
```

## 提出
テストが通ったら、課題を提出します。

```
$ exercism submit /Users/yuki/Exercism/php/hello-world/hello-world.php
```

## コードレビュー
課題提出後、メンターからコードレビューがもらえるのでマイページで確認します。
修正がある場合は再度提出します。

メンターから承認が下りた後は課題を完了することができ、次の課題がアンロックされます。
どんどん進めていきましょう〜