OmniAICreator/Qiita-1.07M huggingface dataset:
[Shopify] ミニハック、商品一覧のデフォ並び順をカスタマイズしたい

ミニハックシリーズ（続かないかもしれない）

Shopify/Debutでストアー構築、商品一覧ページを出す際に画面に表示されるデフォ並び順を手動（＝ベストセラー）に指定したいということで、ミニハック。

# デフォ表示
下記のように商品一覧をクリックすると
デフォ、アルファベット順に並んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/5031fc09-9427-e195-0082-2b01f60cde06.png)

# Collection/allを作成する
ここのUrlを読み取ると collections/all ということで、
これを自分でカスタマイズしたい場合は all というコレクションを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/78e1da0b-1120-76a3-14cb-13bde0965cff.png)

コレクションページの下部分でhandleを指定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/f1cc8f25-f630-c362-56df-ac7ede9fe73f.png)

## 表示される商品の指定

とりあえず %を含む商品はなさそうなので、%を含まない商品すべてとします。ここは表示したい商品のロジックであればなんでもOKです。

## 並び順の指定
下記のように表示された一覧のデフォの並び順を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6bab1f08-24ac-5b1d-8222-d734b51e3ae5.png)

## 確認

そうすると商品一覧の並び替え順番が指定した通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/cf2fce96-2f6d-719a-164c-d5d4f8ff03d4.png)

# 募集

Shopify開発を一緒にするメンバー募集中。ガンガンご応募ください。 C#, Azure, Shopify こんなテックストックです。

プロマネも募集中です。詳細に関しては下記をご参照ください。
https://t-rnd.com/Jobs/
ラズビアンを確実にインストールする方法

#はじめに
この記事は、ラズビアンのインストールを何回やっても成功できなかった僕が**確実**にラズビアンをインストールする方法を調べてまとめた物です。
#ラズベリーパイが起動しない
電源を入れたし、SDカードも刺したし、HDもしっかり刺さっているのにラズパイの赤いライトが光るだけで起動しないと悩んでいる人やどうやってラズビアンをインストールすれはいいか分からないという人はぜひ最後まで見ていってください。
#SD Card ForatterとRaspberry Pi Imagerをインストールする
##工程1
このSD Card Foratterは完全にSDカードの情報をフォーマットするためのソフトなので、新品のSDカードやラズビアンをインストールしたことがないSDカードを使う場合はインストールする必要はありませんが、念の為SDカードの中身はカラにしてから次の工程に移って下さい。インストールするにはこの[サイト](https://www.sdcard.org/downloads/formatter/)に飛んで<img width="1440" alt="スクリーンショット 2020-07-06 15.12.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/eeeb87be-a1da-6c47-cbf2-5186cc4b01d0.png">上のような所までスクロールして、自分の使っているOSをクリックする。今回僕はmacを使っているので右をクリック。そうしたら利用規約のページに飛ばされるので一番下までいって**同意します**をクリック。少し待つとzipファイルがダウンロードされるので展開するとインストーラーが出てくるのでそれに従って進めるとインストールが完了する。アプリを開くと<img width="413" alt="スクリーンショット 2020-07-06 15.25.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/537ac830-6afb-43c3-8d10-3e770e31f564.png">
上のようなウィンドウが出て来るので、今回ラズビアンをインストールするSDカードを選択してフォーマットオプション設定が**クイックフォーマット**になっているかを確認してフォーマットを押すだけプロセスが終了したらこのアプリを閉じて次の工程に進んで下さい。

##工程2
このRaspberry Pi ImagerとはSDカードに任意のOSを書き込み専用ソフトです。今回はこれでOSをインストールして行きます。まず[ラズベリーパイの公式](https://www.raspberrypi.org/downloads/)にアクセスします<img width="1438" alt="スクリーンショット 2020-07-06 14.39.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/facca466-09e8-a179-2f06-f18c60877936.png">
そうしたら今回はmacを使うので黄色で囲んだリンクをクリックして下さい(ウィンドウズの人は一つ上のリンクをクリック)。そうしたら自動で*imager.dmg*がダウンロードされるのでそれを開いてインストールを進めて下さい。インストールが完了すると、<img width="679" alt="スクリーンショット 2020-07-06 14.51.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/271f0efa-7c41-e160-05f9-dae4e95d06ac.png">
このようなウインドウが立ち上がります。そうしたら今度は*Operating System*をクリックして、次にRasperry Pi OS(other)をクリック更に*Rasperry Pi OS Full*を選択します。最後に*SD Card*で任意のSDカードを選択して*WlRITE*をクリックしてあとは待つだけ。すべてのプロセスが終了したら、SDカードを安全に取り出したら準備は終了です。後はラズパイにSDカードを差し込み電源を入れたらラズベリーパイが無事に起動するはずです。

#それでも起動しなかった時にやる事
①エアダスターなどでホコリを飛ばす
②SDカードを変える(ラズパイを使うならSDカードは32G以上がおすすめ)
③SDカードを刺したり、抜いたり、電源を入れたり消したりを何回か繰り返す(これが一番おすすめ)

#最後に
最後まで見てくれてありがとう。これからはラズパイ関連の記事も書いていく予定なのでよかったら**フォロー**して下さい。もし間違いを見つけたら気軽にコメントで教えて下さい。
次の記事ですよけれは一緒に見て下さい！！
[ラズベリーパイを起動したらやるべき３つの事](https://qiita.com/lat-uni/items/20a2f15321111f09479a)
C# 並列処理 コピペ用 サンプルコード チートシート

このまま動作します。
コピぺ、編集して利用するためのコードの断片です。
自由に使って頂いて構いません。
#パターン1 - インデックス0から9までの並列処理
```C#
using System;
using System.Threading.Tasks;

// インデックス0から9までの並列処理。
Parallel.For(0, 10, i => {
    Console.WriteLine(i.ToString());
});
// 全ての並列処理が完了したら、処理がこの先へ進む。
```

#パターン2 - リストの内容で並列処理
```C#
using System;
using System.Threading.Tasks;

// リストの内容で並列処理。
var l = new List<String>{"a", "b", "c"};
Parallel.ForEach(l, s => {
    Console.WriteLine(s);
});
// 全ての並列処理が完了したら、処理がこの先へ進む。
```

#パターン3 - 繰り返しを使わない並列処理
```C#
using System;
using System.Threading.Tasks;

// 繰り返しを使わない並列処理。
// ここでは4つの処理を並列化しているが、処理数は自由。
Parallel.Invoke(
    () => {
        Console.WriteLine("a");
    },
    () => {
        Console.WriteLine("b");
    },
    () => {
        Console.WriteLine("c");
    },
    () => {
        Console.WriteLine("d");
    }
);
//全ての並列処理が完了したら、処理がこの先へ進む。
```
#パターン4 - 並列処理を立ち上げる
```C#
using System;
using System.Threading.Tasks;

// 並列処理を立ち上げる。
Task.Run(() => {
    Console.WriteLine("a");
});
// 処理の終了を待たずに、処理がこの先へ進む。
```

#パターン5 - 並列処理を立ち上げて、処理の終了を待ち合わせる
```C#
using System;
using System.Threading.Tasks;

// 並列処理を立ち上げる。
var t = Task.Run(() => {
    Console.WriteLine("a");
});

Console.WriteLine("b");

// 処理の終了を待ち合わせる所でこうする。
t.Wait();
```
#注意事項 - 並列処理内の例外は呼び出し元でキャッチされない
```C#
using System;
using System.Threading.Tasks;

Task.Run(() => {
    //並列処理内で送出された例外は呼び出し元でキャッチされない。
    //このように、並列処理内で対処すると良い。
    try
    {
        Console.WriteLine("a");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
});
```
[playframework]ファイルをプロジェクト内に含めてアプリケーションで読み込む方法

予想外に時間を要したのでメモ。

やりたかったことは、PDF作成時に利用する日本語フォント用ファイル(`*.ttf`)の読み込み。
（フォントファイルに限らず`txt`ファイルでも`xml`ファイルでも同様です。）

アプリケーションを実行するサーバのファイルシステムに配置して絶対パスで読み込む方法は避けたい（効率が悪い・不具合に発生しやすい）ので、ファイルをプロジェクトに含めたい。

様々な方法があると思いますが、一番簡単な方法としては`conf`ディレクトリの下に読み込みたいファイルを配置すること。

```
[project directory]
 |
 +--app
 |  |
 |  +-- controller
 |  |
 |  +-- views
 |
 +--conf
    |
    +-- *.ttf  ← ここ
```

こうすることで`ClassLoader.GetReousrce()`メソッドで取得できます。

```java
File file = new File(getClass().getClassLoader().getResource(ファイル名).getFile());
```

以下の方法は`getReourse()`メソッドで取得できませんでした。（結果がNULL）

- プロジェクトディレクトリの下に`resources`ディレクトリを作成してその下にファイルを配置。ビルド対象にする
- appディレクトリ下に`resources`ディレクトリを作成してその下にファイルを配置。
MacOS Catalina でpyenv install できない時の対処

# 備忘録として
MacOS Mojaveの時にも[似たようなエラー](https://qiita.com/zreactor/items/c3fd04417e0d61af0afe)　pyenv install で Module Not Found Error :Zlib　とかあったのですが、Catalina　でも似たようなエラーがあったのでメモ。


## エラー内容と対処法
```bash
BUILD FAILED (OS X 10.14 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083
Results logged to /var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083.log

Last 10 log lines:
  File "/private/var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083/Python-3.5.4/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083/Python-3.5.4/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083/Python-3.5.4/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/3h/68w9_bcx139176n71cbbbdg00000gn/T/python-build.20181003001910.1083/Python-3.5.4/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

がこんな感じであれば、

```
$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install {version}
```

で解決する。

<br><br><br>

**関連リンク**

https://medium.com/music-and-technology/macos-catalina-%E3%81%A7python3-5%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F-9480751e0416

https://teratail.com/questions/149770
【python】エネルギーデータをインタラクティブに可視化する簡単な方法【plotly.express】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/ffb89262-0903-460c-e2e4-c34746bec4f0.png)

# 概要
* pythonによるエネルギーデータ（電力量）を可視化します。
* Excelではなく、pythonのplotlyというライブラリを使用します。

# 入力データ
* 今回使用するのは、電力量データとタイムスタンプのみです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/a3a652e0-f803-2070-2ed4-322ebe0ed96f.png)

# ソースコード
```python
# ライブラリのインポート
import pandas as pd
import plotly.express as px

# sampleデータの読み込み
data = pd.read_csv('./sample.csv',encoding='shift-jis',index_col=[0],parse_dates=[0])

# データのリサンプリング（1日毎の合計）
data_month_sum = data.resample('D').sum()

# 線グラフの描画
px.line(data_frame=data_month_sum,
        x=data_month_sum.index,
        y='電力量',
        color_discrete_sequence=['yellow'])
```

# 実行結果
![plotly_line_20200706.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/436ee11e-996b-b2b8-b87c-7dbc65bceec6.gif)

# まとめ
* エクセルではできないインタラクティブなグラフを作成できる。
* 知っていれば、圧倒的に早く可視化でき、データを俯瞰できる。
vistaでquartus その15

#概要

vistaでquartusやってみた。
polyphonyでserialしてみた。


#環境

windows vista 32bit
quartus ii v13.0
polyphony v0.3.6
ep2c5t144ボード


#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/72c61ae1-0469-557e-b0ff-ca3e2ecdf27a.png)


#サンプルコード


```
from polyphony import testbench, module, is_worker_running
from polyphony.timing import clksleep
from polyphony.io import Port
from polyphony.typing import bit, uint8

@module
class a2z:
	def __init__(self):
		self.send = Port(bit, 'out', init=0)
		self.data = Port(uint8, 'out', init=0)
		self.append_worker(self.worker)
	def _wait(self):
		for i in range(100000):
			pass
	def worker(self):
		i = 97
		while is_worker_running():
			if (i < 122):
				self.data(i)
				self.send(1)
				clksleep(1)
				self.send(0)
				i = i + 1
				self._wait()

m = a2z()
```

#verilogコード


```
module test2(input clk, input rst, output tx);
	wire [7:0] data;
	wire send;
	tx2 tx2(.clk(clk), .rst(rst), .start(send), .data(data), .tx(tx), .busy(busy), .get(get));
	a2z_m m(.clk(clk), .rst(rst), .data(data), .send(send));
endmodule

```


以上。
ASP.NET Core MVC 3.1 雑記 「アクションメソッドをAjax呼び出しに限定する」

# はじめに
ASP.NET Core MVC 3.1 雑記となります。
自分が実際に使用したメソッドや手順を、
将来の自分に向けた備忘録として残しています。

### 今回の流れ

* Ajax呼び出しを判定するメソッドを作成
* Ajax呼び出しであるかを検証するアクションセレクターを作成
* アクションメソッドに適用

### 今回のゴール

* 特定のアクションメソッドをAjax呼び出しに限定できる

### 環境
<dl>
    <dt>IDE</dt>
    <dd>Visual Studio 2019</dd>

    <dt>言語</dt>
    <dd>C#</dd>
</dl>


# Ajax呼び出しを判定するメソッドを作成

`HttpRequest` クラスの拡張メソッドとして作成しました。
`Header`の「X-Requested-With」が "XMLHttpRequest" であればAjax呼び出しとみなします。
より良い判定方法があれば知りたいです。

```cs

    /// <summary>
    /// <see cref="HttpRequest"/> クラスの拡張メソッドを提供するクラスです。
    /// </summary>
    public static class HttpRequestExtensions
    {
        private const string AjaxRequestHeaderItem = "X-Requested-With";
        private const string AjaxRequestHeaderValue = "XMLHttpRequest";

        /// <summary>
        /// Ajaxによるリクエストかどうかを取得します。
        /// </summary>
        /// <param name="self"><see cref="HttpRequest"/></param>
        /// <returns>Ajaxによるリクエストである場合は true それ以外は false</returns>
        public static bool IsAjaxRequest(this HttpRequest self)
        {
            if (self == null)
            {
                throw new ArgumentNullException(nameof(self));
            }
            return self.Headers != null &&
                   self.Headers[AjaxRequestHeaderItem] == AjaxRequestHeaderValue;
        }
    }

```

# Ajax呼び出しであるかを検証するアクションセレクターを作成

上記の `IsAjaxRequest` メソッドを呼び出して検証します。

```cs

    /// <summary>
    /// Ajax呼び出しであるかを検証するアクションセレクターです。
    /// </summary>
    public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
    {
        /// <summary>
        /// <inheritdoc/>
        /// </summary>
        public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
        {
            return routeContext.HttpContext.Request.IsAjaxRequest();
        }
    }

```

# 対象のアクションメソッドに属性として付与

```cs

    [HttpPost]
    [AjaxOnly]
    [ActionName("filterIndex")]
    public IActionResult Index(string keyWord)
    {
        //省略
    }

```

これで、`AjaxOnlyAttribute`を付与したアクションメソッドはAjax経由でなければ呼び出せないようになりました。
【FileMaker】電話番号の最初の0(ゼロ)を取得したい

「電話番号の数字を取得したいんです。
でも、最初の０（ゼロ）が[GetAsNumber](https://fmhelp.filemaker.com/help/18/fmp/ja/#page/FMP_Help%2Fgetasnumber.html)だと取得できないんです。」

ウンウン、そうだね、取得できないね。

「え、だって、数字を取得するのって、GetAsNumberだから、これでいいんですよね？」

え、だって、数字で最初の0って認識されないっしょ。

「あー、、、、なんで？」

え、（会話がループ）

FileMaker業界にかかわらず、システム業界に来たばかりの新人さんと会話するとこんな会話に遭遇することが何回かありました。

結論から言うと、２つのポイントがあります。

# 最初から結論
1.電話番号や会員番号など、はじめに"０"をつけたデータが存在する使用の場合は、テキストタイプのフィールドにしましょう
2.最初のゼロを含んだ数字は、テキストとして処理しましょう

# サンプルで現象を確認してみる
「つまりは、数字があるテキストなんだよ」
と言う極論なんですが、下のサンプルを見ていきましょう。

このサンプルでは、テキストと数字タイプの二つのフィールドを設置しました。
<img width="547" alt="スクリーンショット 2020-07-06 14.21.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0d16767b-f109-31ce-3a96-e09e237f65da.png">

## GetAsNumberで数字を取り出した場合
テキストフィールドの電話番号を、GetAsNumberで数字を取得する計算式を計算フィールドに設定しました。
この時、忘れがちですが、「計算結果」も得たい結果に合わせることを忘れないでください。
<img width="1031" alt="スクリーンショット 2020-07-06 14.22.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/77da657e-7e3e-ab6b-18d7-6f3b97d6ee1c.png">

次に、数字フィールドの電話番号を、GetAsNumberで数字を取得する計算式を計算フィールドに設定してみます。
この計算フィールドの計算結果は「数字」に設定します。
<img width="1003" alt="スクリーンショット 2020-07-06 14.22.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/ed0a9d5f-a739-c401-3c0c-fcf32d7ef0b0.png">

レイアウトでは、数字フィールドの表示もコントロールしておきます。
何も設定しない「一般」だと、指数で表示されます。
<img width="821" alt="スクリーンショット 2020-07-06 14.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9862c541-ba16-c8bb-eb2b-176be241c325.png">

さて、結果です。
見事に、最初の"0"が抜かれてますね。
<img width="847" alt="スクリーンショット 2020-07-06 14.38.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/4e325724-0021-b7a0-2497-33c90ffb2280.png">
きっと相談しに来た新人さんも、こういう現象のことを言いたかったんでしょう。


# こうすると"0"が取得できるよ
色々とやり方はあると思いますが、オーソドックスな方法を二つ紹介します。

## やり方１：固定の文字を削除する
もし、会員番号や電話番号のように数字以外の文字が固定されている場合（例："-"）は、[Substitute](https://fmhelp.filemaker.com/help/18/fmp/ja/#page/FMP_Help%2Fsubstitute.html)関数で数字以外の固定の文字を削除するやり方があります。
この時も、計算結果をテキストにするのを忘れずに。
<img width="668" alt="スクリーンショット 2020-07-06 14.46.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b78fbdb3-5916-325d-3959-3f5689075101.png">

## やり方２：数字だけを取り出す
数字以外の文字が複数ある場合は、やり方１とは逆の発想で、[Filter](https://fmhelp.filemaker.com/help/18/fmp/ja/#page/FMP_Help%2Ffilter.html)関数で数字だけを取り出します。
この時も、計算結果をテキストにするのを忘れずに。
<img width="638" alt="スクリーンショット 2020-07-06 14.46.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0dbdaef1-057e-2b6d-c751-6e9abfc5bac8.png">

## 結果、、、
これらのやり方で実装すると、きちんと"0"が最初についたデータを抽出できていますね。
<img width="847" alt="スクリーンショット 2020-07-06 14.47.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/97c169cf-17af-79f6-2099-4a142c1fa5ab.png">

FileMakerに限らず、プログラミング言語を使った開発は、どれだけ手（この場合は関数）を知っているかがつまづかない実装の一つです。
インプットはたっぷりし、そのたっぷり入ったインプットがどこで使われると効果的なのかをたくさんアウトプットして覚えていってくださいね。（自分含め。。。）
【初心者向けチュートリアル】Boltを使用してUnityで簡単なゲームを作成する-4

こちらの記事では**Playerの左右反転～移動制限**までを行います。

#Playerの左右反転

前回のチュートリアルでPlayerの移動までが終わりましたが、
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/2b7f8816-2896-9c67-174e-f93fc8949159.gif)
Playerが後ろ歩きしてしまいますね。
このままだと少し不自然なので、移動方向によって画像が左右反転するようにしていきます。

前回のグラフにComparisonノーツを追加します。
Comparisonノーツは、AとBに入力された値の関係性を見てTrueかFalseのうちどちらかの値を返すノーツです。
![BoltGame - Game - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education _DX11_ 2020_07_27 13_23_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/f50baf95-1e43-d7f5-f058-6f78a3bfd047.png)
上の画像のような感じで、Aの部分にMultipyのA*Bの値を入れてください。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/44e97b86-1bdc-c209-db92-70b01a712b4d.png)
全体を見るとこんな感じです。Comparison(in Logic)ノーツのBは0のままでOKです。

次にSprite Renderer:Set Flip Xノーツを追加します。
SetFlipXはTrueかFalseの値を与えることによって画像のX軸を反転させるノーツです。
以下のように繋げてください。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/17dc2f99-39d3-d2bc-e3d5-41f6b63825ad.png)
処理の流れとしては、
・左右キーの入力を-1～1の値によって受け付ける
・その値が0以上であればtrueを返し、画像を反転する
といった感じですね。

再生してみましょう。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/d652152c-5c79-df16-4dae-6f913fe72b0c.gif)
ちゃんと移動方向に対して画像が反転していますね。

これでPlayerの左右反転の設定は完了です。

#Playerの移動制限

今のままだとPlayerが画面外まで走って行けてしまうので、移動可能範囲の設定をしましょう。
まず、現在のPlayerのX値を取得して制限をかけるところからやっていきます。
先のグラフにTransform:Get Positionノーツを追加してください。
GetPositionノーツは自分のX,Y,Zからなる現在位置を取得するノーツです。

次にここからXの値だけを抽出します。
Vector2:Get Xノーツを追加してください。
GetXノーツはXの値を格納しておけるノーツです。名前のままです。

次は制限の部分です。
Mathf:Clamp(Value,Min,Max)ノーツ(検索して一番上のもの)を追加します。
ClampノーツはValueに渡された値をMin(最小値)～Max(最大値)内で制限します。
Playerが画面端まで行った時のX値が大体-8～8くらいなので、MinとMaxにもそのように設定します。
それぞれ作成出来たら以下のようにつないで下さい。
![BoltGame - Game - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education_ _DX11_ 2020_07_06 14_03_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/6e3a8a14-5ba7-6e3a-c73d-2dcd93799ebe.png)
このままではまだClampで制御した値を作り出しただけにすぎません。
実際にこの値をPlayerの座標に反映させていきましょう。

Vector3:CreateVector3(X,Y,Z)ノーツを作成してください。
CreateVector3ノーツは新たにX,Y,Zからなる位置座標を作成するノーツです。
このXに制限したXの値を、Yに現在のPlayerのYの値を入れていきます。

次にVector2:Get Yノーツを追加します。
GetYノーツはGetXのY値バージョンですね。

次にTransform:SetPositionノーツを作成します。
SetPositionノーツはGetPositionノーツの逆で、与えた値を自分の現在位置に反映するノーツです。
これを以下のように繋げて、制限した値を現在のPlayerの現在位置に反映します。
![BoltGame - Game - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education_ _DX11_ 2020_07_06 14_24_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/fdb78e24-b3f2-7783-df03-dc0d0a16c020.png)
グラフ全体を見ると以下のような感じです。入り組んできましたね…
![BoltGame - Game - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education_ _DX11_ 2020_07_06 14_25_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/af397c38-2331-c027-319e-b0dc0d35c634.png)
ともかく再生してみましょう。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/66821da8-b525-7c15-3cf7-b1b903847517.gif)
ちゃんと画面端で止まってくれるようになりました！

これでPlayerの移動制限は完了です。

今回のチュートリアルはここまでです。お疲れさまでした！
次回は**アイテムの作成～Playerとの判定**までをやっていきます。
[【初心者向けチュートリアル】Boltを使用してUnityで簡単なゲームを作成する-5](https://qiita.com/mma/private/befdeb011cf8a43843b8)
dockerでvolume mountしたファイルがpermission denied

## やろうとしたこと
nginx(openresty)をdockerで起動し、ホストのディレクトリ(nginx.confなどが置いてある)をマウントしようとした。業務だったので、家でのように「とりあえずroot」とやるのは気が引けて色々調べた(結局今はrootになっているが)。

## 環境
CentOS 7.3
docker 1.13.1


## 困ったこと
マウント先のファイルの権限を正しく設定しても`ls`などで`permission denied`がでて、ファイルが読めない。

## 結論
- dockerコンテナ内でもuid, gidがホストと同じなら同一ユーザとみなされる
- ただし、SELinuxを知らずにやると権限があるように見えてもpermission deniedされる(今回)

## 確認したこと
まずは権限が本当にあっているのか確認[^1]。
コンテナ内でuser1(ホストと合わせる)という一般ユーザを作り、user1で色々実行できればいいなと思って調べた。
 
### Dockerfile
```Dockerfile:Dockerfile
FROM openrestyの何か

RUN useradd --disabled-password user1

# USER user1 を試したりも
```
### 確認パターン

| ファイル所有者(ホスト側) |      コンテナ実行者       |コンテナ内作業|    結果    | 備考|
|:------:|:----------:|:-:|:----------:|:---:|
| user1| root | マウント先ディレクトリでls|Permission denied |まぁわかる|
| root  | root |マウント先ディレクトリでls|Permission denied |ホストとコンテナのrootは同じだから本来いけるはず|
| user1   |  user1 |  -  |  nginx起動せず(コンテナexit) |nginxのstart権限がないのかも|
| user1| root |  `su user1`してからマウント先ディレクトリでls|Permission denied |同一ユーザだから[^2]本来行けるはず|
そのほか`chmod 777 -R <ディレクトリ>`も試しましたが同じですね。

## 今回の対応
コンテナ実行とかもろもろuser1でやるのは(そもそも起動もしないし)色々大変だろうと判断し[^3]、とりあえずrootでやることに(まず動作確認したい)。
それでもうまくいかずに調べていたら、CentOSなどはデフォルトでSELinuxというものが有効になっており、これが関係しているとのこと。ホスト側で`getenforce`コマンドの出力が`Enforcing`なら有効。有効だったのでこれを一時的に無効にする`sudo setenforce 0`を実行すると無事コンテナ内でマウント先のファイルが見られた。**`setenforce 0`は一時的で、OS再起動するとリセットされる**。
そして当然ながらセキュリティ関連のものを脳筋で無効にするのはいいことではなく、**docker公式がSELinuxとの併用を推奨している**との噂もありました(一次ソースに当たらない人)。

## 所感
dockerで権限があってるのにマウント先見られなかったらSELinuxを知るとよい。
できればSELinux有効で正しい設定をして今回の問題を解決したいものである。

[^1]: ホスト側のデフォルトユーザがrootではないのに、あまり意識せずにファイルなど生成していたため。
[^2]: `id user1`の結果がコンテナ内とホストで同じであることを確認。どちらも1人目の一般ユーザだからだと思うが、自動採番でともにuid, gid=1000。本当はユーザ作成の際に指定するべき。
[^3]: 調べたら案の定nginxの実行ファイルの権限を付与するだけでいいらしい。
初めてデプロイに使用したAWSのサービスをまとめてみた

# スクールで理解もせずにAWSを使っていたので、改めて自分で調べてみたからまとめたい

## 対象読者
- **おれ**
- デプロイしたくてAWSについてさらっと知りたい人
- AWSに詳しくて記事の間違いを訂正してくれる天使

## 参考資料
https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Amazon-Web-Services%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B0%8F%E7%AC%A0%E5%8E%9F-%E7%A8%AE%E9%AB%98-ebook/dp/B08147GCLS

## デプロイになんとか使用できたサービス一覧

- VPC
- EC2
- RDS
- EIP
- S3
- IAM
- Route 53

## まずAWSとはなんじゃらほい
**AWSとはクラウドコンピューティングを提供するサービス**です！
この文章を初めてみた時にはすでにアレルギーが発症したかと思いましたが、簡単にいうと
**いつでもどこでも好きなようにサーバーを作れるサービス**のことみたい。

## AWSの何がええのよ？
世の中にはサーバーを運用する方法として**オンプレミス**と**クラウド**が存在するみたい。
で、**オンプレミスの方法で運用すると自分で設計やら運用やらサーバー構成の変更やらが必要で、こんなことができるようになるには、スキルのある人じゃないと扱えへんような代物**やねんて。

それに比べて**AWSのようなクラウドは自分で管理とかメンテナンスをしなくても運用できるからめっちゃ便利！！！**ということらしい。

# 各サービスの説明


## EC2とはなんじゃらほい
**サーバーに必要なモノ一式をクラウドで借りれちゃうサービス**
サーバーに詳しくなくてもボタンをポチポチしていくだけで誰でも簡単にサーバーを用意できちゃうわけ。
EC2の中にWebサーバーであるNginxやらをインストールしてあげる。

## RDSとはなんじゃらほい
**RDMSであるAmazonAuroraに加えて、PostgreSQL、MySQL、MariaDB、OracleDatabase、SQLServerに対応し、メモリ、パフォーマンスが最適化されたサービス**
まとめるとRDSのおかげでデータベースが使えるよーってこと。

※補足：RDMSってなんやねん
略さずに書くと、**R**elational **D**atabase **M**anagement **S**ystemとなる。
データベースを操作するデータベース管理システムのこと。
データベースは「データの集合体」で、そのデータの「取り出し」「削除」「書き込み」等の操作をするためにはRDMSが必要になってくる。よく聞くのが**MySQL**とか**PostgreSQL**です。




## EIPとはなんじゃらほい
**EC2を停止・再起動しても同じパブリックIPアドレスを使るようにできるうサービス。**
EC2は、サービス停止後に再起動すると、パブリックIPアドレスが変わってまう。元のパブリックIPアドレスをブラウザから検索しても繋がらないようになっている。

**補足**：IPアドレス

- パブリックIPアドレスとはインターネット上で使われるIPアドレスで、サーバーにアクセスするためのアドレス
- IPアドレスは固定じゃなくて、流動的であることが一般みたい。なんでかは説明できまへん


## S3とはなんじゃらほい
**オブジェクトストレージサービス**のこと。。。。オブジェクトストレージサービスってなんやねん。
→オブジェクトストレージとは、インターネット上にデータを保存する場所のことだそうです。
S3がなくてもEC2で画像やらのデータを保存できるけど、EC2を停止させると画像のデータがなくなっちゃうみたいだから、EC2ではなく堅牢で使いやすいS3に保存しちゃえば、安心にデータを保存することができちゃうサービス


## IAMとはなんじゃらほい
**AWS上のサービスを操作するユーザと、ユーザのアクセス権限を管理してくれるサービス**
AWSのセキュリティを考えるうえで基本的なサービスなんやてさ〜。



## Route 53とはなんじゃらほい
**~.comのようなドメイン名で検索できるようにするサービス！！！**
サーバーへアクセスするためには住所の役割をしているIPアドレスが必要になってくる。なのでIPアドレスを入力すれば欲しいデータを持っているサーバーにアクセスできるけど、IPアドレスなんて覚えられない。
そこで、〜.comのようにドメイン名を取得して誰でも覚えやすいようにして、ブラウザから検索させているのよ。
当たり前にドメイン名を使って検索できているのは**DNS**というサービスのおかげなの。DNSちゃんがドメイン名に対応するIPアドレスを裏側で汗かいて探してきてくれるおかげで、覚えづらいIPアドレスを入力しなくてもドメイン名で検索できる便利すぎる世の中を創造してくれている。
AWS版のDNSのサービス名を**Route 53**と言うんだよ。

## VPCとはなんじゃらほい
これまでにサーバーの説明やらをしてきたが、こやつらはそもそもネットに繋がっていないとサーバーとして働いてくれない。。。そこで！ネットワークにつなげてやるためにVPCを使用するぜ！！！
VPCという自分のネットワークの領土の中にサーバーを置いてやることで外の世界と繋がることができるんだなー。
EC2とかRDSを作成してやる時にVPCを選択すればオッケーなり。








## 締め
サービス自体はうっっっっっっっっすら理解できたけど、デプロイに関してはめっちゃ難しい。
四苦八苦せずにデプロイできるようになりたい。
Railsで学ぶSQLインジェクション脆弱性

webセキュリティについて勉強中なので、学習内容を公開します
スカスカ記事ですがお許しください

#演習環境
- Ruby (2.6.6)
- Rails (5.2.4.3)
    - database adapter mysql2 (0.5.3)
- mysql (5.7.30)

記事投稿、コメント投稿、ブックマークなどが出来る演習用アプリ「TARGET」
GitHubリポジトリ https://github.com/Fumitaka1/target

#SQLインジェクション脆弱性とは
外部から受け取ったパラメータからSQL文を作成し、DBを操作しているプログラムに起こりうる脆弱性のこと
例　ユーザーの一覧を表示できるサイトがあります
![ユーザー一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496557/90af6f44-f720-6462-543a-44fafdf59d46.png)
'小'で検索するとユーザー名に'小'を含むユーザーが表示されます
発行されるSQL文　```SELECT `users`.* FROM `users` WHERE (name LIKE '%小%')```
![正常なクエリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496557/f7e09145-b56f-4ea9-5c3d-8bbe0e37d56d.png)

以下の攻撃用文字列で検索するとハッシュ化されたパスワードが表示されます。
&&') UNION SELECT 1, encrypted_password, 3,4,5,6,7,8,9,10,11 FROM target_development.users;#

発行されるSQL文　
```SELECT `users`.* FROM `users` WHERE (name LIKE '%&&') UNION SELECT 1, encrypted_password, 3,4,5,6,7,8,9,10,11 FROM target_development.users;# %')```
![パスワードを表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496557/5acff014-54f2-03eb-fbb2-bd8ae7887dce.png)
※攻撃文字列に必要なデータベース名やカラム名はinformaiton_schemaから取得可能です

#なぜ発生するのか
外部からのパラメータにSQLの特殊文字が含まれていて、想定外のSQL文が発行されることが原因
上記の例では
1.検索文字列の```&&')```によって正規のSELECT文が不正に終端される。
2.続きの文字列```UNION SELECT 1, encrypted_password, 3,4,5,6,7,8,9,10,11 FROM target_development.users;```がそのままSQLとして発行される。

演習用サイトでは外部からのパラメータをそのまま受け取ってSQL文を発行する脆弱な処理が含まれている

```users_controller.rb
  def index
    @users = User.where("name LIKE '%#{params[:q]}%'")
  end
```

#どう防ぐか
###1.外部からのパラメータに含まれる特殊文字を安全な文字に置き換える

```users_controller.rb
  def index
    sanitized_q = params[:q].gsub(/\'/,'\\\'') if params[:q]
    @users = User.where("name LIKE '%#{sanitized_q}%'")
  end
```

###2.プレースホルダを利用してSQL文を発行する

```users_controller.rb
  def index
    @users = User.where("name LIKE ?","%#{params[:q]}%")
  end
```

###RailsにはSQL特殊文字のフィルタが用意されている
- Model.find(id)
- Model.find_by_hoge(fuga)
- Model.where(hoge: fuga) ＃ハッシュを使うとプレースホルダと同等

##学んだこと
SQLインジェクションはよく知られた脆弱性であるため、フレームワーク側で対応策が用意されているが、外部パラメータからSQL文を作成する場合には十分注意を払う。
ORMのおかげでSQLを書く機会が少なかったが、この機会にSQLを掘り下げることが出来た。
ASP.NET Core MVC 3.1 入門 その２ 「MVCプロジェクトの基本構造」

# はじめに

本記事は将来の自分に向けた備忘録としての意味が強いです。
ASP.NET Core MVC 3.1 プロジェクトの基本構造について、自分が学んだことを記載します。
はじめて ASP.NET Core MVC で開発をする方にとって、「どこに何を書いたらいいかわからない」というのはよくある話だと思いますので、少しでも参考になれば幸いです。

### 前回の記事

[ASP.NET Core MVC 3.1 入門 その１ 「Hello World!」](https://qiita.com/yagi405/items/885fafd048716d371a18)

### 今回のゴール

* ASP.NET Core MVC 3.1 プロジェクトの基本構造を把握する
* CoCをという理念を知る

### 環境
<dl>
    <dt>IDE</dt>
    <dd>Visual Studio 2019</dd>

    <dt>言語</dt>
    <dd>C#</dd>
</dl>

# ASP.NET Core MVC 3.1 プロジェクトの基本構造

### ソリューションエクスプローラーを眺める

[前回の記事](https://qiita.com/yagi405/items/885fafd048716d371a18)で作成した「Web アプリケーション（モデル ビュー コントローラー）」テンプレートのソリューションエクスプローラーを眺めてみましょう。

こちらのテンプレートには、最初からMVCプロジェクトに必要な最低限の構成が用意されているので、各フォルダ/ファイルの概要について次項でまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/1227c4a5-7311-ed01-fb96-c7d2ee02b7b6.png)


### 各フォルダ/ファイルの概要

今回はルートレベルに限定して記載します。

| ファイル/フォルダ | 概要                                                                                                  |
|-------------------|----------------------------------------------------------------------------------------------------------------|
| wwwroot           | スタイルシートやJavascriptライブラリ、画像といった静的なファイルを格納するフォルダ。Webルートと呼ぶ。 |
| Controllers       | コントローラークラスを格納するフォルダ                                                                |
| Models            | モデルクラスを格納するフォルダ                                                                        |
| Views             | ビューテンプレートを格納するフォルダ                                                                  |
| appsettings.json  | アプリケーションの稼働に必要な各設定情報を管理するファイル                                  |
| Program.cs        | アプリケーションのエントリーポイントを担うクラス                                                      |
| Startup.cs        | アプリケーションが起動されるタイミングで実行されるメソッドを集めたクラス                              |

### Coc（設定より規約）

ASP.NET Core MVCは**CoC(Convention over Configuration)**という理念を取り入れて作られています。
和訳すると「設定より規約」となります。

何を言っているかというと、ASP.NET Core MVC では
各フォルダやファイルの名称,配置場所も重要になってきます。

例えば、本来であれば、開発者はコントローラーについて、
例えば以下のような事項を「**設定**」（決定）しなければなりません。

* 何をもってコントローラークラスとするか
* コントローラークラスをどこに配置するか 

しかし、ASP.NET Core MVC には以下の「**規約**」があります。

* 命名規則
    * コントローラーはクラス名の末尾を`Controller`とするか、`Controller`属性を付与しなければならない
* 継承関係
    * 通常コントローラークラスは「Microsoft.AspNetCore.Mvc.Controller」クラスを継承する
        - 前身のASP.NET MVC では必須 
* 配置場所(名前空間)
    * Controllersフォルダ配下
        - 前身のASP.NET MVC では必須 
        - Core MVC では、コントローラーの検出に名前空間は無関係ですが、お作法として

上記の規約に従うことで、開発者は決定しなければならない事項が減り、
アプリケーション固有の開発に力を注ぐことができるというわけです。

この仕組みを生かし、効率的に開発を進めていくためにも、ASP.NET Core MVC では、どこに何を作るべきかを把握しておく必要があります。
permission denied（パーミッション　ディナイド）とは？　

##概要
今日は自動デプロイの学習中に`permission denied`問題で悩み、権限系の知識が浅いと感じましたので復習を兼ねて詳しく調べてみました。

permissionとは英語で「許可や権限」を指し、deniedとは「否定の過去形で否定した」という意味を持ちます。つまり、`permission denied`とは「権限がありません」というような意味を持ちます。
そして、プログラミングにおけるpermissionは「誰に、どのような操作を許可するのか」という権限を規定する情報が設定されています。この情報のことを、パーミッションと呼びます。

##パーミッションを確認するには？
`lsコマンド`を` -lオプション`で実行します。
するとこんな感じの画面になるかと思います。

```:ターミナル
$ ls -l 
drwxr-xr-x. 20 root  root  2077 July  5 14:34 bin/cat
```
「d」はディレクトリを指し、rwxはr（読み込み）、w(書き込み）、x（実行）を表し、それぞれ左側から「オーナー」、「グループユーザー」、「その他ユーザー」を表しています。
したがって「rwxr-xr-x」のような表示になっています。
※この場合だと、オーナーには「全権限」があって、グループユーザーとその他ユーザーは「読み込みと実行」が可能で「書き込み」の権限がないと言われています。

##権限を変更するには？
`chmodコマンド`を指定します。chmodは「チェンジモード」と読みます。
書式は以下のようになります。
`chmod <8進数の数値> <ファイル名>`

|意味　	 |数字    |
|:-------|:------|
|読み取り(r)|	4|
|書き込み(w)|	2| 
|実行(x)   |	1|

例として、以下のようにコマンドを入力することで権限を変更できます。
今回だと2行目の`chmod 755 file.txt`の部分が当たります。

```:ターミナル
$ ls -l file.txt
-rw-r--r--  1 takuya  staff  0 Jul 12 18:58 file.txt

$ chmod 755 file.txt

$ ls -l file.txt
-rwxr-xr-x  1 takuya  staff  0 Jul 12 18:58 file.txt*
```
つまり、「755」というのは「7(4+2+1)5(4+1)5(4+1)」であり、ユーザには全てに権限を、グループとそののユーザには「読み込み」と「実行」する権限を与えているわけです。

##スーパーユーザー
ありとあらゆる操作が許可された強い権限を持つユーザがスーパーユーザです。ユーザ名がrootであることから「rootユーザ」とも呼ばれます。スーパーユーザはあらゆる操作が許可された強い権限をもつユーザであり、設定ファイルを変更したり、新しいアプリケーションをインストールしたりすることができますが、強い権限をもつだけにリスクも伴いますので、通常は一般ユーザでログインして操作し、必要な時だけスーパーユーザとして作業するといったことが大切になります。
コマンドとして`suコマンド`と`sudoコマンド`がありますが、違いは、`suコマンド`を実行したのちには、`exitコマンド`でsuperuser状態から抜ける必要があります。
また、`sudoコマンド`はrootユーザーに成り代わってコマンドを実行するのに対して、`suコマンド`はrootユーザーにそのまま成り代わって操作することを可能にするため、rootユーザーのパスワードが求められます。
JAVAでimmutableなクラスをつくる

##imutableとは

immutableとは**不変**のこと。
つまり、immutableなクラスとはインスタンスの中身が変わらない（＝書き換えられない）クラスのことです。
immudatableなクラスを書き換えるということは、インスタンスを再生産するということになります（繰り返し処理の中で何度もインスタンスが作られると古いインスタンスが溜まっていき、処理速度が遅くなるため、使い方は注意しないといけません）。immutableなクラスを利用する時には、中身を変更してないか、参照型の値を利用してないか等、確認する必要があります。

##immutableのメリット
immutableなオブジェクトは、作成時から状態が変わらないため、処理の途中で意図しない形に値が変化する心配はありません。
immutableなクラスで代表的なものに、Stringクラスがあります。

##作成時の条件
immutableなクラスを作るには、以下の4つの条件を満たす必要があります。

**1.クラスをfinalとして宣言**

**2.すべてのフィールドをfinalかつprivateにする**
クラスをfinalとして宣言、またはコンストラクタをプライベートにして、ファクトリメソッドでインスタンス生成

**3.setterを定義しない**
クラスをfinalとして宣言、またはコンストラクタをプライベートにして、ファクトリメソッドでインスタンス生成

**4.フィールドにmmutable(可変)なオブジェクトへの参照を含んでいない**


```Fruits.java
public final class Fruits {
    private final String color;
    private final int amount;

    public Fruits(String name, String, int age) {
        this.name = color;
        this.age = amount;
    }

    public String getColor() {
        return color;
    }

    public int getAmount() {
        return amount;
    }
}
```

変更しようとするとエラーになります。

```FruitsTest.java
@Test
public void fruitsTest() {
    final Person Fruits = new Fruits("Red", 28);
    // error
    // fruits.setColor("yellow");
    // fruits.amount(30);
}
```
コマンドプロンプトでProxyの設定をする

# これは何？
会社など、Proxy環境下において、
CMDからライブラリのインストールなどができない場合に。

# 必要な情報
- プロキシサーバのホスト名(またはIPアドレス)
    - 例: proxy.hogehoge.com
- 使用するポート番号
    - 例: 8080
- ユーザ名
    - 例: username
- パスワード
    - 例: password

設定する値は、

- 認証が不要なら、  
`http://proxy.hogehoge.com:8080`
- 認証が必要なら、  
`http://username:password@proxy.hogehoge.com:8080`

になる。
httpsの場合は`https://~`にすれば良い。

# 不揮発性
一度設定すれば、都度設定し直す必要が無い。
平文でパスワードを保存することになるので、セキュリティ的にはよろしくない。

環境変数として設定する。
（コマンドプロンプト→システムの詳細設定　から。）

| 変数 | 値 |
|---|---|
| HTTP_PROXY | http://username:password@proxy.hogehoge.com:8080 |
| HTTPS_PROXY | https://username:password@proxy.hogehoge.com:8080 |

# 揮発性
CMDを立ち上げる度にリセットされる方法。
一度設定すれば、cmdを閉じるまで持続する。

```
set HTTP_PROXY=http:username:password@proxy.hogehoge.com:8080
set HTTPS_PROXY=https:username:password@proxy.hogehoge.com:8080
```
# 確認方法
```
echo %HTTP_PROXY%
echo %HTTPS_PROXY%
```

# 参考
こちらの記事を参考に、不揮発性の設定と確認方法を追加しました。
[Windowsコマンドプロンプトで認証プロキシを突破する](https://qiita.com/hamham/items/cb658f5a8c74f35255be)
Chromeの皮を被ったFirefoxでskypeにアクセスする

# あらすじ

Firefoxで[Skype](https://www.skype.com/ja/)にアクセスします。その後、**オンラインでSkypeを使う**をクリックしましょう。すると・・・

![2020_0706_1313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/f27203ca-4ced-41c4-3fe1-dd0dff5ca98e.png)

Oops!!
実はFirefoxではSkypeにはアクセスできません。これはFirefox愛好家にはとても悲しい話です。ではどうすればよいでしょうか？

# User-Agentを偽ろう！
User-Agentとは、**どのブラウザを使ってサイトにアクセスしているか？**という情報です。イメージとしては身分証明書ですね。例えば、今私の使っているFirefoxのUser-Agentの情報は下記のとおりです。

```
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
```

このUser-Agentの情報をChrome等に書き換えると、サーバは「おや、Chromeブラウザがサイトを閲覧したいと言っているぞ！」となります。要するにChromeに**変装**するのです。これでskypeのサイトの目を欺きましょう。

## 1. User-Agent Switcher and Manager を入れる
Firefoxで[User-Agent Switch and Manager](https://addons.mozilla.org/ja/firefox/addon/user-agent-string-switcher/)というアドオンを追加します

![2020_0706_1325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/c4c865b3-c62c-8bdb-765a-6c524c86c931.png)

名前から想像できると思いますが、これはUser-Agentの情報を書き換えることが出来ます。このアドオンを使ってChromeに変装しましょう！

## 2. Chromeに変装する
(初期設定ならば)画面右上に![2020_0706_1330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/fa670641-a02d-3d2e-40a7-b3e9c5789367.png)のアイコンが出ていると思います。これをクリックすると以下のようなポップアップが出ます。

![2020_0706_1334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/57210b5b-6ca9-f47c-8c07-018f2036015a.png)

適当に一つ選択し、**Apply**を押します。これで変装は完了です。

## 3. さあ、Skypeの目を欺こう
[Skype](https://www.skype.com/ja/)にアクセスします。その後、**オンラインでSkypeを使う**をクリックしましょう。すると・・・
![2020_0706_1338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/5556e3ed-8ba0-4784-e5dd-5479102cc96d.png)
Easy Clap :smiling_imp:

# 参考
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent
Dockerのvolumeが使用中で消せない時

##使用環境

Windows10
Docker Desktop for Windows version 2.3.0.3

##トラブル内容

### Dcokerのvolumeが使用中で消せない

docker-compose.ymlでvolumeを指定してデータの永続化をした際など、環境を作り直したくてvolumeも消去したいのに、消去できなかった事があったので覚書

<img width="722" alt="無題１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619597/815bec44-388d-6784-ffbd-cf62512218f6.png">



- Docker-compose down -v で消そうと思ったけどvolumeが使用中で消せない
- docker volume rm -f 消したいvolume名 で消そうと思ったけどvolumeが使用中で消せない
- docker volume prune で消そうと思ったけどvolumeが使用中で消せない
- docker-compose ps やdocker psでも使用しているコンテナが見当たらない

**↑見えていないコンテナがありそうな気配**

## トラブル対処

強制的にコンテナを削除してみたら、volumeを握っていると思われるコンテナも消えて、無事volumeの削除もできました。

`docker container prune
docker volume rm -f 消したいvolume名`
Macでデュアルディスプレイのスクリーンショットを自動化する。

```
while true ; do  screencapture -x `date +%s`.png ; sleep 60; done
```

ターミナルに以上のコマンドを打てば、60秒ごとにスクリーンショットを撮ることができます。
-xでシャッター音を消しています。

参考サイト（そのままです。ありがとうございます！）
[Macで定期的にスクリーンショットを撮る](https://www.kilinbox.net/2016/03/mac.html)


その他オプションについては以下のサイトがわかりやすかったです。
[Mac スクリーンショットコマンド「screencapture」の使用方法まとめ](https://do-zan.com/mac-terminal-screencapture/)


---------------
上の手法だと、メインモニターしかスクリーンショットされません。よってデュアルディスプレイの方のスクリーンショットを撮りたい場合は、下の記事にしたがって、メインモニターをもう一つのディスプレイに移すことで、撮ることができます。

[【Mac】マルチディスプレイのメインモニターを切り替える方法](https://masatoshihanai.com/switch-main-monitor-fo-mac/)
ExoPlayerで再生中にイヤホンやbluetoothが外れた際に停止させるには

単発です　備忘録として

# 環境

```build.gradle
def exoplayer_version = "2.11.6"
implementation "com.google.android.exoplayer:exoplayer:$exoplayer_version"
```

# 実装

```sample.kt
private var player: SimpleExoPlayer? = null

// 中略

player?.setHandleAudioBecomingNoisy(true)
```
※ SimpleExoPlayerのinit処理部分は省略しています
※ バージョン2.11.0からある模様です

自前で実装するとなると[`ACTION_AUDIO_BECOMING_NOISY` intentをブロードキャストし処理](https://developer.android.com/guide/topics/media-apps/volume-and-earphones#becoming-noisy)する必要があるのでたったのこれだけですむとはとても便利ですね
SQLの基本的な文法まとめ①

SQLの基本的な文法について学び直しました。
自分のメモ用としても記録しています。


## データを定義する
 **DDL（Data Definition Language）**

- CREATE
- ALTER
- DROP

## データを操作する
**DML（Data Manipulation Language）**

- INSERT
- UPDATE
- DELETE
- SELECT

<br/>
:memo:　`；（セミコロン）`を`文末`につける
:memo:　`大文字`でも`小文字`にでもOK！

# データベースの構造の操作

### データベースの一覧表示

```
SHOW DATABASES;
```

### データベースの選択

```
USE データベース名;
```

### データベースの作成

```
CREATE DATABASE　データベース名;
```

# テーブルの構造の操作

### テーブルの確認

```
SHOW TABLES;
```

### テーブルの作成

```
CREATE DATABASE　テーブル名　（カラム名 カラムの型, カラム名 カラムの型, ...);
```

### テーブルの構造確認

```
SHOW columns FROM テーブル名;
```
### ALTER TABLE文

テーブルの構造の変更にて使用。

- カラムの追加
- カラムの修正
- カラムの削除

```
ALTER TABLE テーブル名 操作
```

### カラムを追加する

```
# 1つのカラムを追加する
ALTER TABLE テーブル名 ADD カラム名 カラムの型;

# 複数のカラムを追加する
ALTER TABLE テーブル名 ADD (カラム名 カラムの型, カラム名 カラムの型, ...);
```

### カラムを修正する

```
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```

:memo:　`カラムの型は変更していなくても、再度記述が必要`です。

### カラムを削除する

```
ALTER TABLE テーブル名 DROP カラム名;
```

# データの操作

### データを登録する

```
# 全てのカラムに値を登録する
INSERT INTO テーブル名 VALUES(値1, 値2, 値3);

# 特定のカラムに値を登録する
INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```
:memo:　文字列は`クォーテーションで囲む`。（ダブルクォーテーションでもOK)

### データを更新する

```
UPDATE テーブル名 SET 変更内容 WHERE 条件;

ex)
DELETE FROM books WHERE id = 2;
```

### データを削除する

```
DELETE FROM テーブル名 WHERE 条件;
```

<br/>
<br/>


SQLの基本的な文法まとめ②では、データベース内の検索について書きます。
お読みいただき、ありがとうございました🌸

<br/>
UserDefaultsを使った永続化について(保存されない場合がある)

iOS12.4.1
iPhone7で確認
最小限のプログラムでテストしたわけではないのでプログラム自体のバグの可能性もあり

以下のようなプログラムでUserDefaultsを使って保存した場合、isSaveがYESになっていて、再読み込みしてUserDefaultsに保存した値が変更されたことを確認したあとにXcodeでプログラムをストップして再起動させた際にデータが永続化されていないことがありました。

呼び出し側

```Objective-C
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [dataStore saveDatas]; // UserDefaultsで保存処理
}
```

保存処理

```Objective-C
    // 保存処理
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
    //NSDataに変換する
    NSData* baseDataData = [NSKeyedArchiver archivedDataWithRootObject:baseData];

    BOOL isSave = [defaults synchronize];
    NSLog(@"isSave:%d", isSave);

```

UserDefaultsの変更はメモリ上にキャッシュされていて実際に永続化(ディスクに書き込み)されるかどうかはシステム判断のようです。synchronize()を呼んだとしても同期されず永続化されていませんでした。
UserDefaultsを使った保存はお手軽ですが、本当に消えたら困るデータには使わないほうがいいのかもしれません。
ASP.NET Core MVC 3.1 入門 その１ 「Hello World!」

# はじめに

本記事は将来の自分に向けた備忘録としての意味が強いです。
ASP.NET Core MVC 3.1 について、自分が学んだことを記載します。

### 今回のゴール

* ASP.NET Core MVC 3.1 のプロジェクトが作成できる
* 作成したプロジェクトを実行する
* Hello World!

### 環境
<dl>
    <dt>IDE</dt>
    <dd>Visual Studio 2019</dd>

    <dt>言語</dt>
    <dd>C#</dd>
</dl>

# ASP.NET Core MVC 3.1 のプロジェクトを作成する
###「ASP.NET Core Web アプリケーション」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/dc76604a-eee8-a34f-bacb-1570300c9d20.png)

### 任意の「プロジェクト名」及び「ソリューション名」を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/5dcbb23b-188a-55ba-721e-7235b90147ba.png)

### テンプレートの選択

今回は「ASP.NET Core 3.1」「Web アプリケーション（モデル ビュー コントローラー）」のプロジェクトを選択します。
MVCテンプレートは、どこに何を書けばいいのか参考になるので、学習資料として優秀です。

場合によっては不要なファイルも含まれていたりするので、著者は「空」のテンプレートを利用することが多いですが、今回は初めてということで、最低限の構成が用意されているこちらのテンプレートを採用しています。
「空」のテンプレートからのセットアップ手順も後続の記事でアップします。

ASP.NET Core Identity のお話はまた別の機会とするので「認証なし」とします。
Dockerも今回は使いません。

* 認証なし
* HTTPS用の構成：True
* Dockerサポートを有効にする：False

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/966c9c9b-57c7-11c9-34af-8afceadb29e0.png)

### プロジェクトの作成完了
VisualStudioで以下のような画面が立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/bc481d8d-3d6b-4acd-0541-9e7848778347.png)


# 作成したプロジェクトを実行する

既にサンプルの画面が用意されているので、そのままF5キーを押下して実行してしまいましょう。

### 実行
ブラウザにそれっぽい画面が表示されれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544508/8288be7a-f13f-13a4-8ef7-6625f431e16c.png)
UnityでVSCodeを使用中、関数ジャンプや参照ができない！の解決方法

# この記事について
Unityを使ってる際、スクリプトを書くために用いてたVSCodeが`No definition found for`や`No reference found for`となってしまっていたので、解決した際の手順を記録。

## 本記事で使用している環境
- Microsoft Windows
Version 1903 (OS Build 18362,900)
Windows 10

- Visual Studio Code 
Version: 1.46.1



## 手順
1. Unityのプロジェクトで使ってるフォルダ内の、Assembly-CSharpと名がついてる拡張子がcsprojのファイルを削除。
    - `Assembly-CSharp-Editor.csproj`
    - `Assembly-CSharp-firstpass.csproj`
    - `Assembly-CSharp.csproj`


2. Unityのプロジェクトを開き、`Edit` > `Preferences`を選択。
`External Tools`の`External Script Editor`がVisual Studio Codeになっているのを確認。（他のエディターになっている場合は変更する。）
<br>

3. Unityの`Assets` > `Open C# Project`を選択し、VSCodeを開き直す。
<br>

4. Unityのプロジェクトで使ってるフォルダ内で、1.で消したAssembly-CSharpフォルダが新しく生成されているのを確認する。

5. `Ctrl + Shift + P`で`Unity Attach Debugger`が選択されているのを確認。


以上です。
これでVSCodeの関数ジャンプや参照が使えるようになりました。




## 最後に
今回はこのように解決しましたが、似たような問題の原因と解決方法が同じだとは限らないので、一例として捉えてください。
【備忘録】installしたモジュールをjupyter内で呼び出せない

#起こったこと
ターミナルで `$ pip install (モジュール)`を実行したにも関わらず、jupyter内でimport すると ModuleNotFoundErrorが出てしまう。
しかし、ipythonではimportできる。

#とりあえずの解決方法
色々とネットを調べているとanacondaとipythonは参照先が違うとのこと。
それを聞いて

```py
import sys
sys.path
```

を実行してやるとjupyterとipythonとでそれぞれ違うパスが表示されました。

と言うことはipythonに表示されているpathを追加してやればいいのではないかと言うことで

```py
import sys
sys.path.append('任意のpath')
```

を実行することでうまくimportできました！


#いちいちsys.appendしたくない方へ
~~この方法でとりあえずのところはモジュールをインポートして使うことはできましたが毎回これを実行するのは正直めんどくさい...
どなたか良い方法を知っておられましたらご教示くださいm(_ _)m~~

どうやらjupyterならjupyter_pathを通せば動くらしい
いちいちappendするのがめんどくさくて再びちゃんと調べてみました。

bashrcなどで

```
export JUPYTER_PATH="${JUPYTER_PATH}:/path/to/add/here/"
```
を追記したらsourceをしたのちにjupyterを立ち上げなおすとうまくimportできました。

#地味にはまったところ
ちゃんとexportしたのに何度jupyterを再起動してもうまく行かずはまっていました。
そのはまった穴は、sourceしたターミナルのウィンドウとjupyterを立ち上げるウィンドウがバラバラだったから...
あるウィンドウではsourceをしたのできちんと環境変数が設定されていたのですがjupyterを立ち上げていたウィンドウはsourceを実行する前に作っていたウィンドウだったのでそっちの環境変数JUPYTER_PATHの中身は空でした。

頭悪すぎる....
ということで皆さん、jupyterを立ち上げる前にechoなりで環境変数が空じゃないのを確認して、空ならちゃんとsourceしてから立ち上げましょうね
pythonにおける==、isの違い

pythonにある同じものかどうかを判断する方法は二つありますね。==とisです。戻り値はいずれもBooleanですが、それでは何が違うのか？というとことは気になるところです。

# 結論
簡単にいうと、isは両者のメモリローケーションを比較しているのに対し、==は単純に両者は同じ値であるかを見ています。それだけです。

# 例えば？
じゃコードを見てみて(ターミナルにてpython3を立ち上げる)


```shell
>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True
```

解説します。aにリストを代入、bにも同じくaを代入すると、同じメモリローケーションから引用していることがわかります。従い、これはisを使うとTrueです。
次に文字列操作の[:]を使ってリストを複製します。そうすると、コピーが出来上がるので、メモリ上は別物になります。従って、これはFalse。ということです。

実際にidを見てみると


```shell
>>> id(a)
4364243328
>>> 
>>> id(b)
4364202696
```
そうですよね。Falseになっていることから、idが異なるのは当然の話。

しかし、以下のコードのような例外があります。

```shell
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>>
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False
```

これは何を意味しているのかね？aとbは別々に数字を代入しているのに、上と下は結果が違うぞ。　
さて解説するよ。　
pythonはパフォーマンス改良のため、256などの小さい整数について違う処理をしています。そういった特別な整数は同じidで同じ場所へと格納しているそうです。そうすると、このように256ではisを使っても==を使っても同じTrueとなり、1000のような大きい数字についてはそうはなりません。

ということでした。いかがでしょうか。
ご指摘ありましたら、どうぞ突っ込んでください。

さてまたね
[Rails]A server is already running 


``A server is already running`` のエラーが出ました。

てやんでい。
別ウィンドウで、サーバー立ち上げているときに``rails s``すると上記のエラーが出ます。

が今回は、他にターミナルを開いていませんでした。
てやんでい..



ログをきちんと確認してみると

```
A server is already running. Check C:/shitsumonwa/tmp/pids/server.pid.
Exiting
```

とでている。

理由はわからないけど、手元でsystem testを全て確認した後なので、PC自体めちゃくちゃ重くなっていたけど、何か原因あるんか.. てやんでぇい。

#解決策: server.pidファイルを削除

 **server.pidファイルを削除**
``[Railsプロジェクトフォルダ名]\tmp\pids\server.pid``

**tmp**: キャッシュなど、一時的なファイルを格納されるディレクトリ

サーバー終了すると削除されるIDみたいなものが、サーバー起動時に生成されるみたいです。

ファイルの中身を見てみると、ランダムの値が記載されています。

```tmp/pids/server.pid
8266
```

サーバーを再起動すると、値が変わっています。

```tmp/pids/server.pid
8295
```





今回は、そのIDが残ったままだったので、``A server is already running``のエラーを吐いたみたいです。

以上で、``rails s``すると無事サーバーが立ち上がりました。

> [rails sをしたらtmp/pids/server.pidというエラーが出る件について](https://qiita.com/sakuraniumarete/items/ac07d9d56c876601748c)
[Railsドキュメント](https://railsdoc.com/rails_base)
amplify mock apiで起動するDynamoDB Localにオプションを渡す

# はじめに

Amplify Mockingは便利で`amplify mock api` と打つだけで以下のサービスがローカルで起動して利用できます。

- DynamoDB Loacl
- AppSync GraphQL API

Amplify Mockingで起動するDynamoDB Localに直接接続したい場合にどうすればいいのか調べました。

## Amplify Mockingで起動するDynamoDB Localに直接接続する

結論からいうと、以下のようにすれば接続できます。

```js
new DynamoDB({
  endpoint: 'http://localhost:62224',
  region: 'us-fake-1',
  accessKeyId: 'fake',
  secretAccessKey: 'fake',
});
```

`endpoint`のURLはDynamoDB Localなので（ローカルで起動するので） `http://localhost` です。ポート番号の`62224`が**デフォルト**です（詳しくはこの後で説明します）。
`region`, `accessKeyId`, `secretAccessKey` に指定する値は上記の値をそのまま指定してください。
[amplify-appsync-simulatorのDynamoDBDataLoader](https://github.com/aws-amplify/amplify-cli/blob/18f04d1fc0a1e3c630160d1d21f20f7c61e3c108/packages/amplify-appsync-simulator/src/data-loader/dynamo-db/index.ts#L5-L10) や [amplify-dynamodb-simulatorのindex.js](https://github.com/aws-amplify/amplify-cli/blob/24d8085325d435284b9c49a43592e61891fd72bc/packages/amplify-dynamodb-simulator/index.js#L207-L213) にハードコーディングされているので、常にこの値にしておく必要があります。

## DynamoDB Localのポート番号

DynamoDB Localのポート番号`62224`はあくまで**デフォルト**です。もし、`62224`が使えない場合には[他の空いているポートを使います](https://github.com/aws-amplify/amplify-cli/blob/18f04d1fc0a1e3c630160d1d21f20f7c61e3c108/packages/amplify-dynamodb-simulator/index.js#L104)。
AppSync SimulatorはDynamoDB Localが実際に起動したポート番号を使って接続するように書かれているので問題ありませんが、外部から直接接続しようとした場合、そのポート番号がわからないので困ってしまいます。

実は、Amplify Mockingで起動するDynamoDB Localにオプションを渡す方法が存在します。
それは `mock.json` というファイルを `amplify` ディレクトリに作成しておくと、その内容をDynamoDB Localの起動オプションとしてくれるというものです。

本来は [DynamoDB LocalにJAVA_OPTSを指定するために追加された機能](https://github.com/aws-amplify/amplify-cli/pull/3503) ですが、ポート番号も指定することができます。

例えば、次のように書いておけば、DynamoDB Localは `8888`番ポートで起動します(空いていないとエラーになります)。

```json:amplify/mock.json
{
  "port": 8888
}
```

当然、以下のような指定も可能です（というか、こちらが本来の目的に沿った書き方です）。

```json
{
  "javaOpts": "-Xms512M -Xmx512M"
}
```

## まとめ

- Amplify Mockingで起動するDynamoDB Localには以下のオプションで接続できる。

```js
{
  endpoint: 'http://localhost:62224',
  region: 'us-fake-1',
  accessKeyId: 'fake',
  secretAccessKey: 'fake',
}
```
- `mock.json`で起動するポート番号を指定することもできる。
高位合成言語Polyphony その9

#概要

polyphony、やってみた。
zundoko、書いてみた。

#サンプルコード


```
from polyphony import testbench, module, is_worker_running
from polyphony.timing import clksleep
from polyphony.io import Port
from polyphony.typing import bit, uint8

@module
class zundoko:
	def __init__(self):
		self.append_worker(self.worker)
	def worker(self):
		n:uint8 = 0
		r:uint8 = 234
		while is_worker_running():
			if (n < 4):
				r = r * 5 + 1
				r &= 0xff
				if (r < 127):
					print("zun")
					n = n + 1
				else:
					print("doko");
					n = 0
			else:
				print("doko kiyosi!!")

m = zundoko()

@testbench
def test(m):
	clksleep(3)
	print("ok")

test(m)


```

#python実行結果


```

doko
doko
zun
doko
doko
zun
zun
zun
doko
zun
doko
doko
zun
zun
zun
zun
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
doko kiyosi!!
ok
doko kiyosi!!


```

以上。
ニッチかもしれないフロントエンド向けGitHub Template

# GitHub Templateというのを見つけてしまったので
元々個人用のボイラープレート的なものとして、ちょいちょい使う構成を保存しておこうと思ったのが始まりでした。
ところがこんなのを見つけてしまったので。

「GitHubでは既存のRepositoryをTemplateとして、新しいRepositoryを作成することができる」
https://dev.classmethod.jp/articles/github-template-repository/

ということで個人で使う構成をテンプレートリポジトリとしてpublicにしましたので、こんな構成を使うという奇特な方はどうぞご利用ください。
同じような構成で作る場合の参考にしていただいてもいいと思います。
(実際動くまでにはそれなりに詰まったので)

### 共通条件

- IE11対応(一応サンプルソースでの動作確認済)
- dev/prodを同時出力(最近の仕事上その方が都合いいので)
- [Polyfill.io](https://polyfill.io/v3/)さん本当にありがとうございます
- babel様様
- scssを変換してPostCssでAutoprefixer


### 基本的なWeb構成
[template_webpack_web](https://github.com/quail-vortex/template_webpack_web)
[template_rollup_web](https://github.com/quail-vortex/template_rollup_web)

一般的かは知らない。
現時点でのディレクトリ構成は以下のような感じ(今後変更する可能性はある)

```
template/
├ assets/
│   ├ js/
│   └ css/
├ src/
│   ├ js_src/
│   │    ├ js_util/
│   │    │      └ util.js
│   │    └ main.js
│   └ css_src/
│        ├ css_util/
│        │      └ util.css
│        └ main.css
├ index.html
└ (config類)
```

### 基本的なWeb構成(だけどビルド分割)
[template_webpack_web_separate](https://github.com/quail-vortex/template_webpack_web_separate)
[template_rollup_web_separate](https://github.com/quail-vortex/template_rollup_web_separate)

JSとCSSを別のconfigで切ってある。
JSだけとかCSSだけ使う場合のピックアップ用。
構成は前項と同様。

### svelte構成
[template_webpack_svelte](https://github.com/quail-vortex/template_webpack_svelte)
[template_rollup_svelte](https://github.com/quail-vortex/template_rollup_svelte)

すごく楽なのでもっと広まるといいと思うsvelte。
現時点でのディレクトリ構成は以下のような感じ(今後変更する可能性はある)

```
template/
├ assets/
│   ├ js/
│   └ css/
├ src/
│   ├ svelte.js
│   └ App.svelte
├ index.html
└ (config類)
```

### 今後

必要に応じて増えたり変わったりするかもしれません。
合理的なツッコミは是非お待ちしております。
あと、タグに何を入れるべきか悩ましい。