OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでPCのカメラから画像情報を受け取りたい

#概要
Unity初心者です。備忘録を兼ねて書きます。
PC内蔵のカメラや外付けのカメラを使って、Unity上で画像情報を受け取りたいと思います。

#環境
- Windows 10
- Unity 2019.2.10f1

#手順
1.  必要なオブジェクトを置く
2.  スクリプトを書く
3.  アタッチする
  
##手順1 オブジェクトを置く
ここで置くオブジェクトは`Raw Image`と`Event System`と二つです。
###`Raw Image`を置く
`Raw Image`のドキュメントは[こちら](https://docs.unity3d.com/Manual/script-RawImage.html)から。
私の中での`Image`との違いとしてこちらは任意のテクスチャが使用できるので、今回のようにカメラを使いたいときとかにいいのかなと思います。
オブジェクトを置いたら、カメラに映る位置まで移動させておきます。
![スクリーンショット (111).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520217/e83be33c-3824-580c-4ccf-eb179dd8b405.png)
ヒエラルキーウインドウを右クリック⇒「UI」⇒「Raw Image」
###`Event System`を置く
`Event System`のドキュメントは[こちら](https://docs.unity3d.com/Manual/EventSystem.html)から。
これは入力を受け取ってイベント送信の処理しているものだと思います。
![スクリーンショット (113).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520217/a7f87dbe-84e7-6785-fd04-e7883069c8f7.png)
ヒエラルキーウインドウを右クリック⇒「UI」⇒「Event System」
##手順2 スクリプトを書く
まずはスクリプトを作成します。
![スクリーンショット (115).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520217/9f634cf7-d1a7-1b0b-77a1-296b6f155f7b.png)
プロジェクトウインドウを右クリック⇒「Create」⇒「C#Script」
ファイル名は「CameraTest.cs」にしました。

```c#:CameraTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//これをつけ加え忘れるとエラーが出ます

public class CameraTest : MonoBehaviour
{
    public RawImage rawImage;
    WebCamTexture webCamTexture;

    // Start is called before the first frame update
    void Start () {
        webCamTexture = new WebCamTexture();
        rawImage.texture = webCamTexture;
        webCamTexture.Play();
	}
}
```
##手順3 アタッチする
手順2でつくったスクリプトを手順1でつくったオブジェクトそれぞれにアタッチしていきます。
###RawImageにアタッチする
RawImageにスクリプトをアタッチします。
###EventSystemにアタッチする
EventSystemにアタッチした際は、**スクリプトのコンポーネント内の`Raw Image`を手順1で作ったRawImageに**します。

#実際の画像
これで完成です。実際動かしてみるとPC内蔵のカメラがあれば画像情報が取れているはずです。
![スクリーンショット (120).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520217/759dc72b-ef2f-3612-3c4f-d24bfc884c06.png)
動きもあまりラグなく反映されます。

#謝辞
今回はYOUNASHIPさんの[Unityでカメラ(PC/スマホ)を使う方法](https://younaship.com/2019/01/16/unity%E3%81%A7%E3%82%AB%E3%83%A1%E3%83%A9pc-%E3%82%B9%E3%83%9E%E3%83%9B%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/)を参考・引用させていただきました。ありがとうございます。
Blazorアプリで、文字列をハイライトする

Blazorクライアントアプリで、特定の文字列をハイライトさせてみます。
![d38dk-lrd17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/694067de-fd23-4fdf-fe10-7dc456e03fcf.gif)

#### 開発環境
Windows10 
Visual Studio 2019 Preview
.Net Core 3.1

## MarkupStringで、htmlコードを生成

Blazorクライアントアプリのデフォルトプロジェクトである`FetchData.razor`の`Summary`をハイライトしてみます。
入力エリアでテキストを入力しエンターキーを押すと、バインディングされた変数が評価され、入力された文字列をハイライトさせます。
C#のコードからhtmlコードを生成するときは、`string`型であると、htmlタグがそのまま表示されてしまうので、`MarkupString`型にしてあげます。

```html:FetchData.razor
@page "/fetchdata"
@inject HttpClient Http

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from the server.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    @*Summaryをハイライトする*@
                    <td>@(WrapHighlight(@forecast.Summary,HighlightString))</td>
                </tr>
            }
        </tbody>
    </table>

    //ハイライトする文字を入力
    <p>
        Highlight:
        <input type="text" @bind-value=@HighlightString />
    </p>
}

@code {

    // ハイライトのバインド用変数を用意
    private string HighlightString = "";

    // ハイライト用のhtmlを作成する
    // 文字をハイライトするタグをつけているだけ
    MarkupString WrapHighlight(string str,string keyword)
    {
        var ret = str;
        if(str.IndexOf(keyword) != -1)
        {
            var start_index = str.IndexOf(keyword);
            var skip_index = start_index + keyword.Length;

            ret = string.Format("{0}<span style=\"background: linear-gradient(transparent 0%, #ffff66 0%)\">{1}</span>{2}",
                str.Substring(0, start_index),
                keyword,
                str.Substring(skip_index)
                );
        }

        return (MarkupString)ret; 
    }

    private WeatherForecast[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json");
    }

    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public string Summary { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

```
FPGA内蔵メモリを使ったアキュムレータ(フォワーディングによるインターロックなしヒストグラム集計)

# はじめに
FPGAなどで画像処理などをしているとヒストグラム集計など統計情報を計算したくなる時があります。
そこでCPUの設計などで用いられるフォワーディングというテクニックを用いて、インターロックなしでメモリに値を集計するモジュールの説明をします。
RTLレベルでの話になりますが、ひょっとすると高位合成言語でも知っていればボトルネック除去に役立つケースがあるかもしれません。


# やりたいこと

やりたい演算をC言語で書くと下記のようになります。

```c
int mem[256];

void accumulate_to_mem(int addr, int data)
{
    mem[addr] += data
}
```

使い方としては例えば画像データの輝度ヒストグラムが欲しければ

```c
memset(mem, 0, sizeof(mem));
for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
       accumulate_to_mem(image[y*width + x], 1);
    }
}
```

のような感じの集計がやりたいわけです。

ここで accumulate_to_mem と同じ動作をするものをFPGAに効率よく実行するにはどういうRTLを実装すればいいかというのが今回の内容です。

# 何が課題なのか

やりたい演算は

```
 mem[addr] += data
```

といういたってシンプルな計算ですが、ここには3つの要素が含まれています。
いわゆる Read-Modify-Write という動作パターンになります。

1. メモリから値を読み出す
2. 値を加算する
3. 結果を書き戻す

この時にFPGAは1サイクルに1つの処理しかできません。
もちろん1個のデータ毎に3サイクルかけて計算しても良いのですが、しばし1サイクルに1データのスループットが必要になります。

そこでこの３つの演算を３ステージとしてパイイプライン的に計算したくなります。


しかしながらその際に、同じメモリアドレスに対する演算が3サイクル中に2つ以上出てくると、

***まだ先行する書き込まれていない古いデータを元に計算してしまう***

ということが起こります。
いわゆるRAW(read after write)ハザードと呼ばれるものです。


# 解決方法

解決方法は大きく2つ考えられます。

- ハザードが発生しそうになったら書き込み完了まで後続を待たせる(インターロック)
- 書き込み完了前の先行するパイプラインからデータを取得してくる(フォワーディング)

今回は後者のフォワーディングを行います。


# フォワーディングの動作

下記が、フォワーディングを加味したパイプラインの動作図です。

![forwarding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/1586e3cd-404f-1c7c-7de3-c852c05885a9.png)

3つの処理ステージに対して、1つ先、または2つ先のステージで同じメモリアドレスに対して処理を行っていた場合にその値を使うことで整合をとります。

# コード紹介

だいぶ前に書いたコードですが、このテクニックを使ったVerilogで書いた集計モジュールのコードが[こちら](https://github.com/ryuz/jelly/blob/master/rtl/library/jelly_ram_accumulator.v)となります。

コードの全体としては、FPGAのデュアルポートRAMを用いて、片方のポートを1ステージ目のREADに、もう片方を3ステージ目のWRITEに割り当てています。
また、メモリの読出しやクリアの為に片方のポートを横取りして、ダイレクトにアクセスできる機能も付与しております。

ソースコード(L114)の読み出しステージの段階で

```verilog
st1_fw_st2 <= st0_valid && st1_valid && (st0_addr == st1_addr);
st1_fw_st3 <= st0_valid && st2_valid && (st0_addr == st2_addr);
```

として、先行するステージが有効でかつ同じ同じアドレスかどうかを見ておき

ソースコード(L75)の部分で、メモリ読み出しの結果を

```verilog
always @* begin
    st1_rdata = st1_dout;
    if ( st1_fw_st3 ) begin st1_rdata = st3_data; end
    if ( st1_fw_st2 ) begin st1_rdata = st2_data; end
end
```

のように上書きしています。


# おわりに

最近は高位合成などの進歩も著しいので、いずれこのようなことを気にしなくてもよいようになってくるのかもしれませんが、並列プログラミングでもっと大きな単位でソフトウェアパイプラインを組む場合などでも概念としては同じですし、知っておくと案外応用の効く手法かも知れません。

いずれにせよ、Verilogなどの低レベル設計時にはまだまだ必要なテクニックかと思います。
PINGで死活監視するスクリプト

# はじめに

元々は[こちらのURL](http://www.kozupon.com/shell/shell2.html)（※既にリンク切れ）に掲載されていたPINGを実行するスクリプトをベースにして、死活監視用として使いやすい形に書き直したものです。

ちょっと監視が必要だけれども、Zabbixやmackerel、DataDogを使うほどではない...という時に役立つかもしれません。

# スクリプト

* PINGを5回実行して、100%パケットがロスした時にメールを飛ばす仕組みです。
 * メールの送信先を適宜変えて、Slackと連携させたりすると監視が楽になると思います。
* PINGに成功/失敗を問わず、結果は全てping.logに出力しています。
 * ログファイルが徐々に肥大化していくため、ログ出力が不要なら該当行をコメントアウトしたり、ログローテーションと組み合わせた方が良いと思います。
* あとはスクリプトをcrontabなど登録すれば、一定時間ごとにスクリプトが実行されるはずです。

```bash:ping_checker.sh
#!/bin/bash
​
IP_LIST=(172.17.12.143 172.17.11.130 172.17.15.81 172.17.15.82)
MAILTO='your_address@sample.com'
LOG_FILE=./ping.log
​
for ip in ${IP_LIST[@]}
do
  ping_result=$(ping -w 5 $ip | grep '100% packet loss')
  date_result=$(date)
​
  if [[ -n $ping_result ]]; then
    echo "[SEVERE] server inactive: $ip $date_result" >> $LOG_FILE
    echo $ip | mail -s "[ALERT] server down!! $date_result" $MAILTO
  else
    echo "[INFO] server active: $ip $date_result" >> $LOG_FILE
  fi
done
```

# 実行結果

* ログファイルには、サーバー単位（IPアドレス単位）でPINGの実行結果が記載されます。

```text:ping.log
[INFO] server active: 172.17.12.143 2019年 10月 24日 木曜日 20:54:39 JST
[INFO] server active: 172.17.11.130 2019年 10月 24日 木曜日 20:54:44 JST
[INFO] server active: 172.17.15.81 2019年 10月 24日 木曜日 20:54:49 JST
[INFO] server active: 172.17.15.82 2019年 10月 24日 木曜日 20:54:54 JST
```
JavaScript（ES2017 以降）でオブジェクトに Array のメソッドを適用する

ES2017 で導入された `Object.entries` は、オブジェクトを受け取って `[key, value]` の配列を返す。これを使うと、例えばオブジェクトに対するループ処理が簡単に書ける。

```javascript
const obj = {
  foo: 1,
  bar: 2
};
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} = ${value}`);
});
// foo = 1
// bar = 2
```

`forEach` だけでなく、`sort` でも `map` でも `filter` でもお好きなメソッドを使える。
nuxt+firestoreでチャットを作る際にメッセージにアイコンを表示させる

# やりたいこと

nuxt+firestoreでチャットを作り、メッセージしたユーザー情報とメッセージを紐付けてアイコン表示する。ユーザーはfirebase authでtwitter認証した。

# 仕様

* userをfirestoreに保存
* uidでuserとmessageをヒモづけ
* iconをtwitterauthのPhtoUrlから表示

# userをfirestoreに保存

最初firebaseauthの情報をとってこれないかなと思ったけどログイン中ユーザー以外の情報は難しそうだったのでlogin時にユーザー情報をauthからfirestoreに持ってくることに。ユーザー情報を別の場所に持ってくるの怖いので最小限に抑えて渡す。

![memo-69.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/7711e969-fc21-9aec-88ce-5eae6045c38e.jpeg)

こんなかんじでonAuthStateChangedでloginをキャッチしてlogin時にfirestoreに保存。最初signInWithRedirect時に保存しようと思っていたけどredirectされてしまうのでstateの変更をキャッチする方向にした。

```javascript
mounted: function () {
    firebase.auth().onAuthStateChanged(user => {
      var user = firebase.auth().currentUser
      var name, photoUrl, uid
      if (user != null) {
          uid = user.uid
          photoUrl = user.photoURL
          var db = firebase.firestore()
          db.collection('user').doc(uid).set({
            name: name,
            photoUrl: photoUrl,
            uid: uid,
            created: firebase.firestore.FieldValue.serverTimestamp()
          })
      }
  }
```

ちなみにmoutedなのでaddとかだと毎回追加されてしまう。setでuidを指定して上書きする形にする。

# uidでuserとmessageをヒモづけ

下記みたいな設計で紐付け

![memo-70.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/37aa68c9-da75-7c82-1a33-46685923d1c2.jpeg)

# iconをtwitterauthのPhtoUrlから表示

```javascript
    const db = firebase.firestore()
 db.collection('room').doc(this.room_id).collection('message').onSnapshot(querySnapshot => {
      querySnapshot.docChanges().forEach(doc => {
        var thatmessages = this.messages
        var user_icon_ref = db.collection("user").doc("user_id")
        user_icon_ref.get().then(function (userdoc) {
          var user_icon_url = userdoc.data()
          thatmessages.push({
            ...doc.doc.data(),
            id: doc.doc.id,
            user_icon: user_icon_url.photoUrl
          })
        })
      })
    })
```

messagesがforEach内にそのままだと渡せなかったのでthatmessagesに代入して経由している。
【サルが書く】treeが使えない環境で、findで一層目をtreeのように表示をしたい

### なぜかdockerコンテナ内でtreeのオプションが効かない......

そんな事がありました。

apt-getでtreeはインストールしたのですが、オプションが効かず、すべてのファイル、ディレクトリがtree表示されてしまいます。

そこで標準で組み込まれている `find` で同じようなことをしたい。しかも、一層目のファイル、ディレクトリのみを表示したい。


```bash
find . -maxdepth 1 | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
```

`-maxdepth 1` は `find` のオプションになります。
検索するときのオプションは適宜変更してください。

### 参考資料
[treeを使わずにfindでディレクトリツリーリスト表示]
(https://scribble.washo3.com/linux/tree%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%ABfind%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%84%E3%83%AA%E3%83%BC%E3%83%AA%E3%82%B9%E3%83%88%E8%A1%A8%E7%A4%BA.html)
【PHP】 アクセス権（public, protected, private)

PHP学習メモ

private $~ とか public function ~とかありますが、それぞれの違いは?

##public
どこからでもアクセス可能

##protected
そのクラスと、子クラス内からのみアクセス可能

##private
そのクラス内からのみアクセス可能

###まとめ
|アクセス権 | public| protected|private  |
|---|---|---|---|
|クラス内  |○ | ○ | ○ |
|子クラス内 |○ | ○  |  ✖️|
|クラス、子クラスの外| ○|  ✖️ |  ✖️ |
モデル検査ツールSPINをWindows10にオフラインインストールする

# Spinをダウンロード
- [ https://github.com/nimble-code/Spin]( https://github.com/nimble-code/Spin)からダウンロードする。
- ダウンロードしたフォルダをローカルPCの適当な場所に置いて、\Binの下を解凍してSpin.exeにリネームし、Spin\Binにパスを通す。

# cygwinをダウンロード/インストール
- [https://cygwin.com/install.html](https://cygwin.com/install.html)からsetup-x86.exeをダウンロードする(64bit-PCでも32bit版をダウンロードする)。
- setup-x86.exeをダブルクリックしてDownload without installingを選択
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/9f96405e-d909-d316-d5bb-8f9c40d5b1cb.png)
追加パッケージでbisonとgcc-coreが必要なので選択すること。

- setup-x86.exeをダブルクリックしてInstall from Local Directoryを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/7f039ff2-69f3-d792-6945-d0eca7a7aa92.png)
- インストール完了後cygwin\binにパスを通す。

# 関連ツールのインストール
- ActiveTCLのインストール：[https://www.activestate.com/products/tcl/downloads/](https://www.activestate.com/products/tcl/downloads/)からダウンロードしてインストールし、ActiveTcl\binにパスを通す。
- graphvizのインストール：[https://graphviz.gitlab.io/_pages/Download/Download_windows.html](https://graphviz.gitlab.io/_pages/Download/Download_windows.html)からダウンロードしてインストールし、パスを通す。
- Swarmのインストール：[https://github.com/nimble-code/Swarm](https://github.com/nimble-code/Swarm)からダウンロードし、ビルド
```
gcc -Wall -pedantic -o swarm swarm.c -lm
```
、ビルド結果(swarm.exe)をcygwin\binに置く。

# Spinの立ち上げ
- Spin\optional_guiにあるispin.tclをダブルクリックするとSPINを動かすためのGUIツールiSpinが立ち上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/580356a1-6731-1d6d-0a24-627ed2f00786.png)
分類タスクでコスト関数になぜCrossEntropyを使うのか

##はじめに
　深層学習を勉強していると、分類タスクにおいてはCrossEntropyを使うのだということを知る。とにかく深層学習を動かせればよく、単純な理解で良いという人は、モデルの出力をラベルに近づけるためだという程度で、なぜそれを使っているのかについての詳しい理由についてはすっ飛ばしてしまう。そこで、簡単にまとめてみた。
##CrossEntropyとは
　CrossEntropy(CE)とは、二つの確率分布$p$と$q$に対して以下のように定義される。
$$CE(p,q)\overset{def}{=}-\sum_{i=1}^{N}p_i\log{q_i}$$
分類タスクにおいては、$p$がラベルとして、正解クラスのインデックスを$c$とすると、$p_i=0\left(i\neq c\right)$なので、次のように書ける。
$$CE(p,q)=-\log{q_c}$$

##Kullback–Leibler divergence
　CrossEntropyが使われる理由を知るために、Kullback–Leibler divergence(KLDiv)を知る必要がある。これもCrossEntropyと似たようなもので二つの確率分布$p$と$q$に対して以下のように定義される。

```math
\begin{align}
KLDiv(p,q)&=\sum_{i=1}^{N}p_{i}\log{\frac{p_i}{q_i}}\tag{1}
\end{align}
```

　KLDivは、二つの確率分布が似ているほど小さくなる性質がある。完全に一致していれば0となる。詳しい説明が[こちら](https://qiita.com/TomokIshii/items/b9a11c19bd5c36ad0287)に書かれている。

##KLDivとCEとの関係
　(1)を展開すると次のように書ける。

```math
\begin{align}
KLDiv(p,q)&=\sum_{i=1}^{N}p_{i}\log{p_i}-\sum_{i=1}^{N}p_{i}\log{q_i}\\
&=\sum_{i=1}^{N}p_{i}\log{p_i}+CE(p,q)
\end{align}
```

　分類タスクにおいて、ラベルの確率分布$p$とモデルの出力$q$に対して$CE$を最小化させるので、一項目は定数となる。すると$p,q$に関して$CE$を最小化させることはKLDivを最小化させることと等しくなる!
　従って$CE$を最小化させることは二つの分布$p,q$を近づけることを意味する。
【PHP】コンストラクタ（ __construct() ）

PHP学習メモ

#コンストラクタ  __construct()
コンストラクタというメソッドを定義すれば、インスタンスを作った時にこのメソッドが自動的に呼ばれる。

```php
<?php
class Menu{

  public $name;

  public function __construct(){
    echo 'メニュー作りました';
  }

  public function order(){
   echo $this->name.'のオーダー承りました';
  }
}

$coffee = new Menu();
$coffee->name = 'Latte';
$coffee->order();
?>
```

###引数を渡すこともできる
上の例では、$coffee->name = 'Latte'でメニュー名を代入していますが、下記ではインスタンスを作る際にLatteというメニュー名を設定しています。

```php
<?php
class Menu{

  public $name;

  public function __construct($name){
    $this->name = $name;
  }

  public function order(){
    echo $this->name.'のオーダー承りました';
  }
}

$coffee = new Menu(Latte);
$coffee->order();
?>

```
Windowsのショートカット技：リンク先にプログラムを書くだけ

Windowsのタスクバーにフォルダーを置いて、そこをクリックするとすぐ起動しようとしても、フォルダーはタスクバーに登録を拒否される。
進入禁止マークが出ちゃうんだ。

いろんなクソブログに
>フォルダーを右クリックドラッグして、別の場所に置き、「ショートカットを作る」を選ぶとフォルダーへのショートカットが出来る。ショートカットはタスクバーに置けるから、それをクリックするとフォルダーが開く

とか書いているけど、それは***大ウソ***だから注意しよう。
確かにフォルダーのアイコンはタスクバーに固定されるように見える。
でも、それをダブルクリックしたとき開くのは、デフォルトのエクスプローラーで、初期画面は***お気に入り***になってしまうんだ！

ここで、本当に望む動作、つまり「ある決まったフォルダーを開くアイコン」をタスクバーに置きたければ、一工夫が必要だ！
さっき作ったショートカットを右クリックしてプロパティを開くと「リンク先」に`C:\foo\bar`とか書いている。
これは開きたい場所のパスだね。
このリンク先のフィールドを`explorer C:\foo\bar`と変えてやればいいんだ。先頭に「`explorer `」を入れてやればいいんだね。
するとアイコンもちょっと変わる。
これでタスクバーに貼り付ければオッケーだ。
（このちゃんとしたやり方も、他の人のブログに書いてあった。どのブログかわかんなくなったけど。。）

![60223809_2188586671249351_7755551986895814656_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/b504661c-4cde-6c1b-0d4f-390e8ca8ed3d.jpeg)


このショートカット技は他にも有効だ。

たとえばバッチファイルを書いてショートカットを作り、リンク先の`C:\foo\bar\baz.bat`を`cmd /c C:\foo\bar\baz.bat`に変えればバッチファイルを起動するショートカットになる。
他にも
- `xyzzy foo.txt`で、ファイルfoo.txtをエディタのxyzzyで開く
- `winword bar.docx`で、Word文書bar.docxをWordで開く
なんてことが出来る。

面白いのが`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" http://foobar.example.com/ --user-data-dir=C:\foobar`と書くこと。
デスクトップを右クリックして、新規作成＝＞ショートカットを選び、リンク先に上の呪文を入れてみよう。
（`foobar.example.com`の部分は好きなサイトにしてね！）

説明しよう。
`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"`はchromeの実行ファイルの絶対パスだね。
chromeにはPATH環境変数を通してないので、ここでは絶対パスを指定した。

次の `http://foobar.example.com/` は開きたいURLだ。
つまりショートカットをダブルクリックするとそのURLがいきなり開くってこと。
これは便利だね。

最後の`--user-data-dir=C:\foobar`が目玉で、これはChromeのインスタンスをもう一個作ってくれるんだ。
すでにブラウザーを開いて作業している場合も、そのブラウザーに別タブを開くのではなく、別ウィンドウにもう一つのChromeを起動してくれる。
ここで`C:\foobar`と書いたけど、事前にこのフォルダーは作る必要はない。
ただの「おまじない」で存在しないフォルダーを書けばいいみたいだよ！

**（この項終わり）**
実装にて知っててよかった記法や知識

TypeScript、C#を想定してますが、多くの言語で使えるはずです。

これらを覚えてから実装が楽になりました。

# 三項演算子

[条件 (三項) 演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)

if文の単一処理を簡潔に書ける記法。

ほとんどの言語で使えるので汎用性が高い。

例：変数hogeの値が0だったら変数fuga、0以外だったら変数piyoをreturnしたい。

## 普通のif文の場合(Typescript)

```typescript
sankoEnzanshi(hoge: number, fuga: string = 'hogeは0やで', piyo: string = 'hogeは0ちゃうで'): string{
	if(hoge === 0) {
		return fuga;
	}
	if(hoge === 1) {
		return piyo;
	}
}
```

## 三項演算子を用いると

```typescript

    sankoEnzanshi(hoge: number, fuga: string = 'hogeは0やで', piyo: string = 'hogeは1やで'): string{
    	return hoge === 0 ? fuga : piyo;
    }
```
## 構文解説

`hoge === 0 ? fuga : piyo`の `hoge === 0`の評価がtrueの時はこの節が`fuga`、falseの時は`piyo`として扱われます。

もちろん変数だけでなく、メソッドを呼び出すことも可能ですが、ここに複数の処理を書くのは可読性が落ちるのでやめましょう。あくまでも演算子です。

# Null合体演算子

[Null合体演算子 - Wikipedia](https://ja.wikipedia.org/wiki/Null%E5%90%88%E4%BD%93%E6%BC%94%E7%AE%97%E5%AD%90)

ある変数の値が<b>NullかNullではないか</b>で返す値を決定するのがNull合体演算子です。

はてなはてな演算子って僕は呼んでます。

C#を代表に、いくつかの言語で使えます。

OracleのSQLでいうNVLです。

デフォルト値を設定するときなどに便利です。

例：変数hogeがNullではないときはhoge、Nullの時はfugaをreturnしたい。

## 普通のif文の場合(C#)

```C#
static string NullGattaiEnzanshi(string hoge, string fuga)
{
	if(hoge == null)){
		return fuga;
	}else{
		return hoge;
	}
}
```

## Null合体演算子を用いると

```C#
static string NullGattaiEnzanshi(string hoge, string fuga)
{
	return hoge ?? fuga;
}
```

## 構文解説

hogeがnullだったらfuga、hogeに何らかの値が入っていたらそのままhogeがreturnされます。

# デフォルト引数

[デフォルト引数 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Default_parameters)

たいていの言語(JSはES2015以降)で使用できます。ただし、IEでは動きません。

引数がnullやundefinedの場合、デフォルト値を引数として扱うことができます。

実はしれっと三項演算子のところで使ってます。

## 普通に書くと

```typescript
defaultHikisu(hoge: number, fuga: string, piyo: string): string{
	if(fuga === undefined) {
		fuga = 'hogeは0やで';
	}
	if(piyo === undefined){
		piyo = 'hogeは0やで';
	}
	return hoge === 0 ? fuga : piyo;
}

this.defaultHikisu(0); // hogeは0やで
this.defaultHikisu(0, 'fugaに値を渡したで'); // fugaに値を渡したで
this.defaultHikisu(1, 'fugaに値を渡したで', 'piyoに値を渡したで'); // piyoに値を渡したで
```

## デフォルト引数を用いると

```typescript
defaultHikisu(hoge: number, fuga: string = 'hogeは0やで', piyo: string = 'hogeは1やで'): string{
	return hoge === 0 ? fuga : piyo;
}

this.defaultHikisu(0); // hogeは0やで
this.defaultHikisu(0, 'fugaに値を渡したで'); // fugaに値を渡したで
this.defaultHikisu(1, 'fugaに値を渡したで', 'piyoに値を渡したで'); // piyoに値を渡したで
```

# 配列、Listを扱うメソッド

[Array - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)

たいていの言語で使える。

C#のLINQが有名ですね。

TSを書いていてよく使うのは下記リンクに。

ただIEではいくつかのメソッドが使えなかったりします。



# Javascriptの暗黙的な真偽値

Javascriptを書くなら、この記事の内容は理解しとくと吉

[[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について - Qiita](https://qiita.com/phi/items/723aa59851b0716a87e3)

# 正規表現

文字列操作、チェックするときには欠かせない正規表現

ググればたくさん例が出てくるのでここでは割愛。たいていのパターンはググれば出てくるのでいい時代です。

[まれによく使う正規表現 - Qiita](https://qiita.com/ken97/items/9276f59f3148bb8fbe67)
CloudFormationでS3を作成する

CloudFormationでS3のバケットを作成。

Log保管用のバケットとコンテンツデータ（アップロード・添付ファイルなど）の保管用の二つのバケットを作ってみました。

## 方針

### Logファイル

- バージョニング（世代管理）はなし
- 180日後にGlacierに移行
- 移行後365日で原稿世代のデータは削除

### Contentsファイル

アップロードされたファイルや、静的ファイルの保管先に利用

- バージョニング（世代管理）あり
- バージョニングされたデータ（過去のデータ）は180日後にGlacierに移行
- 移行後365日でバージョニングされたデータ（過去のデータ）は削除



```yml:s3-sample.yml
AWSTemplateFormatVersion: 2010-09-09
Description: Create S3 for LifeCycle
Parameters:
  BucketNameLog:
    Type: String
    Default: xxxxxxxx
    Description: A name for the log bucket.
  BucketNameContents:
    Type: String
    Default: xxxxxxxx
    Description: A name for the contents bucket.
    
Resources:
  S3Log:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref BucketNameLog
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      LifecycleConfiguration:
        Rules:
          - Id: !Join ['-', [!Ref 'BucketNameLog', 'log-LifeCycle']]
            Status: Enabled
            Prefix: log/
            # 365日経過したら削除
            ExpirationInDays: 365
            # １８０日経過したらS3 clacierに移行する
            Transitions:
              - StorageClass: GLACIER
                TransitionInDays: 180
  S3Contents:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Ref BucketNameContents
      VersioningConfiguration:
        Status: Enabled
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256  
      LifecycleConfiguration:
        Rules:
          - Id: !Join ['-', [!Ref 'BucketNameContents', 'Contents-LifeCycle']]
            Status: Enabled
            # バージョニングされているデータは180日経過したらS3 clacierに移行する
            NoncurrentVersionTransition:
                StorageClass: GLACIER
                TransitionInDays: 180
            # バージョニングされているデータは365日経過したら削除する
            NoncurrentVersionExpirationInDays: 365
            
```
【VBA】特定の列にある客先名毎にシートを追加し振り分ける

受注した注文内容から客先別のリストを作る為、
客先別にシートを振り分けるマクロを作って欲しいとの要望があったので、サンプルコードを作りました。

列Bにある客先名をシート一覧にして、データをそれぞれ振り分けます。

シートオブジェクトdataSheetには、以下のような大本のデータが入ったシートを設けて下さい。

![シート振り分け1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/56949a20-452c-0f7c-7375-14e2f8317f58.png)

変数sortingColomnに振り分けたい要素がある列を指定します。
ここでは、列B「客先」を振り分けたいので、sortingColomn = 2　としています。
　　　　　　　　　↓
![シート振り分け3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/ea966b08-502b-2707-915f-a724b8618e14.png)



※このデータはCSVファイルを引用している為客先名もそれほど多くなく、スペルが違っていたりすることもないのですが、
同じ客先で大文字と小文字が混同していたり、客先名の数が膨大だった場合シート数もそれだけ多くなります。
なので手入力で作ったデータを振り分けた場合、シート数が数百になるなんてこともあり得るので注意して下さい。

その場合は新たに列を設けて振り分け№を指定する等することをお勧めします。

データのヘッダーが複数行ある場合は、
dataSheet.Range("1:1," & i & ":" & i).Copy 'ヘッダーを含む行のコピー　の部分を
dataSheet.Range("1:3," & i & ":" & i).Copy 等適宜変更して下さい。

```vb

Sub SortingSheetRow()

    Dim dataSheet As Worksheet
    Dim maxRow As Long, maxCol As Long 'ペースト元の最終行、最終列
    Dim pasteSheetMaxRow As Long 'ペースト元の最終行
    Dim addSheetName As String '追加するシートの名前
    Dim sortingColomn As Integer '振り分けたい名前が存在する列
    
    Set dataSheet = Worksheets("dataSheet")
    
    maxRow = dataSheet.Cells(Rows.Count, 1).End(xlUp).Row
    maxCol = dataSheet.Cells(1, Columns.Count).End(xlToLeft).Column
    
    sortingColomn = 2 '振り分けたい列を指定する
    
    Application.ScreenUpdating = False '描画停止
    
    dataSheet.Select
    
    'ヘッダーを除く行から開始する
    For i = 2 To maxRow
        addSheetName = Cells(i, sortingColomn).Value
        Select Case SheetSarch(addSheetName) '客先名のシートがあるか判定
        
        Case 1 'シートがある場合
            dataSheet.Rows(i & ":" & i).Copy
            Worksheets(addSheetName).Select
            pasteSheetMaxRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
            Rows(pasteSheetMaxRow & ":" & pasteSheetMaxRow).Select
            ActiveSheet.Paste

        Case 2 'シートがない場合
            dataSheet.Range("1:1," & i & ":" & i).Copy 'ヘッダーを含む行のコピー
            Worksheets.Add.Name = addSheetName '新規シートの追加
            Rows("1:1").Select
            ActiveSheet.Paste
        End Select

       dataSheet.Select
       
    Next
    Application.ScreenUpdating = True

End Sub


Function SheetSarch(sarchStr As String) As Integer
'ワークシートの名前を引数sarchStrの内容で検索する
    For Each i In Worksheets
        If i.Name = sarchStr Then
            SheetSarch = 1 'シートがある場合
            Exit Function
        End If
    Next
    SheetSarch = 2 'シートがない場合
End Function
```

#実行結果
実行すると、以下の画像のように客先毎にシートが追加され、データが振り分けられます。
![シート振り分け2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/2277c320-cc4d-55d1-ef1f-b974f0ba4998.png)
S3にバケットを作ってからアップロードできるようにするまで(個人で遊ぶ用)

久しぶりにバケットを作ったけど、初期設定をどうするか忘れていたので再度調べてメモしときます。
参考になればご自由にどうぞ。


## 取り敢えずこれを外します。

<img width="1439" alt="スクリーンショット 2019-10-26 23.15.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268028/86cc76a6-32db-c39d-778c-64cf36b17059.png">

あとアクセスコントロールリスト、CROSも設定します。

□アクセス権限->アクセスコントロールリスト
<img width="1439" alt="スクリーンショット 2019-10-27 8.22.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268028/7c249a90-3b68-82ef-ceb4-1c8ffdc72f4d.png">

□アクセス権限->CROS設定
[コピペ]

```
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedOrigin>https://sample.jp</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3600</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>


```

これでファイルはアップロードはokです。


## 読み取りもできるようにする

読み取りもできるようにするにはこれを設定します。

□アクセス権限->バケットポリシー
[コピペ]

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::YOURBUCKET/*"
        }
    ]
}
```

これで書き込み、読み取りはできるようになりました。ただこれだとパブリックアクセスで誰でもアクセスできてしまうので、バケット情報は門外不出にして個人で遊ぶ用に留めておいてください。:shamrock:
GASでChunkする

Laravelとかだと簡単にchunkできるけどGAS(JS)だと自作しないといけないっぽいので記述メモ。
イメージは金太郎飴

```js

/* IDでデータをまとめる */
function chunkDataById(data) {
  return data.map(function(s) {
    return s[ID_COLUMN_NUM-1]
  })
  .filter(function(x,i,self) {
    return self.indexOf(x) === i
  })
  .map(function(id) {
    var count = data.filter(function(d) {
      return d[ID_COLUMN_NUM-1] === id
    }).length
    return data.splice(0, count)
  })
}
```
JuliaBoxを初めて使うとき迷ったことなど

昨日からJuliaBoxの有料版を使いはじめた。無料版は登録していたが、ほとんど使わずにいた。せっかくなので、いろいろ試し始めたが、ときどきわからなくなりそうなので、メモを残す。
helpの記事からわかることだと思うが、実際に窮したことを書いているので、未来の自分に役に立つかも。

JuliaBoxはBrowserから使うので、OSに依存しないと思うが、今日はmacOS Catalina 10.15のSafariで使用。明日はWindows8.1のChromeを試すつもり。


0. juliabox月に14ドルに申し込んだ。10/26。
1. githubのリポジトリのmasterをあるlocal名でaddしたのだが、別のブランチにしようと思い、そちらをaddしたあと、先にaddしていたほうをdeleteしたところ、どうも追加・削除のループにはいってしまったように見える。addしたリポジトリがjuliaから見えなくなった。別名でaddして解決したように見える。
2. juliaのバージョンは1.2ではなく1.0.3が最新。有料にしたら1.2になるかと思ったがそうはならなかった。
3. packageのインストールは、julia1.0.3の場合using Pkgをしてから、Pkg.add("...")すればできていた。helpによるとjulia0.6の場合は、Dashboardのpackageなんとかかから登録するらしいが、Pkg.add()で追加したあと、こちらでinstallしたpackageが見えていたので、見るのは問題なさそう。
4. juliaboxの最初のpathは /mnt/juliabox 。cd("..")すると別の場所にいってしまい、わからなくなった。
5. githubのリポジトリをマウントするとき、リポジトリのパス、ブランチ、ローカルのディレクトリ名を指定する。ブランチは自動的に作ってくれないので、gitサーバ側で作ってからここで指定する。gitlabでも同じ。
6. Google Driveは、ユーザ名とローカルなパスを指定したような気がする。Driveのパスの指定が最初はわからなかった。
7. pdfとしてDLできる。ただしタイトルがリポジトリ名(?)になっていた。そこで編集のできるtexは?
8. texとしてDLできる。TexShopで修正しpdfを作れることがわかった。タイトルに日本語も書けた。latexでなくtex。
9. ipynbでDLして、ローカルのjupyter notebook(julia1.2)で開いてみたが、動いた。
　もともと1.2で作ったものなので動いて当たり前か・・・
　1.0.3と1.2の違いにひっかかるとエラーになるだろう。
10. slideとしてDLすると、notebookでの出力がスクロールバーつきのviewにとじこめられる
　ところを全てんかいしてくれるので、あるいみみやすい。(chromeでみた)
   でもこれはslideではないような・・・
11. DLにはたくさんのoptionがあるが、違いがわからない。どこにhelpがあるのだろうか。
12. google driveのマウントとか、gitのcloneは、notebookから見える。
samba 経由でファイルを保存するとタイムスタンプが10秒ぐらいずれる

CentOS7 において表題のような問題が発生してしまったので、解決方法を共有したいと思います。

## 解決方法

sambaサーバー側の /etc/samba/smb.conf の ```[global]``` セクションに以下を加える

```
[global]
    oplocks = No
```

## 解説

oplocks とは CIFS クライアントにおけるパフォーマンス向上を目的とした仕組みです。詳しい内容については MS の以下の記事を見てみて下さい。

 * [Oplock セマンティクス](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/ifs/overview)

うまく機能すれば有効なのかも知れませんが弊害も多いようです。デフォルトで有効になっているので、オフにする場合は前述の通りに設定します。

## 経緯とテスト

以下は samba サーバー上に存在する適当なテキストファイルを Windows 10 のメモ帳で開き、```Ctrl+S``` 押下で保存した瞬間を [inotify-tools](https://github.com/rvoicilas/inotify-tools/wiki) で観察した結果です。

```console
[develop@localhost 1]$ inotifywait -m /home/develop/test.txt |
> while read L;do echo `date`' '$L;done
Setting up watches.
Watches established.
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt OPEN
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt ACCESS
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt ATTRIB
2019年 10月 27日 日曜日 07:28:56 JST /home/develop/test.txt MODIFY
2019年 10月 27日 日曜日 07:29:07 JST /home/develop/test.txt CLOSE_WRITE,CLOSE
2019年 10月 27日 日曜日 07:29:07 JST /home/develop/test.txt ATTRIB
^C
[develop@localhost 1]$
```

ファイルのオープン (OPEN) と書き込み (MODIFY) は ```Ctrl+S``` の押下直後に発生していますが、クローズ (CLOSE_WRITE) は約11秒後になっています。このため保存直後に1度更新され、11秒後にさらに更新されます。「10秒ぐらいいいじゃん」という意見もあると思いますが、webpack の watch モードで2回トランスパイルされてしまったり、タイムスタンプ監視機能のあるエディタで「外部で更新されてます。再読み込みしますか？」等と聞かれてしまったりして何かと不便です。

そこで[smb.conf — Samba の設定ファイル](http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html)等を読んでみた所、ズバリの情報はありませんでしたが ```oplocks``` が怪しいのではないかと当たりをつけました。これをオフにして smb デーモンを再起動後、再び inotigy-tools でログを取りました。以下の通りです。

```console
[develop@localhost 1]$ inotifywait -m /home/develop/test.txt |
> while read L;do echo `date`' '$L;done
Setting up watches.
Watches established.
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt OPEN
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt ACCESS
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt MODIFY
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt ATTRIB
2019年 10月 27日 日曜日 07:29:32 JST /home/develop/test.txt CLOSE_WRITE,CLOSE
^C
[develop@localhost 1]$
```

書き込み (MODIFY) の直後にクローズ (CLOSE_WRITE) されるようになり、問題解決となりました。
ブラウザー上でも4桁のtabを入力したい

#TEXTAREAでTabキーを入力したい
ブラウザー上ではTabキーを打つとフォーカスが次の入力欄に移ります。当たり前ですよね。
なので仕方なくコピペでTabを入力したりします。それとTab幅は4桁にしてほしい（Qiitaの投稿欄も…）。
色分け表示のテキストエディターは各種ありますが、もっと軽いもので良いんです。

```html:tabbedText.html
<textarea></textarea>
<style>
textarea {
	-moz-tab-size: 4;	/* for Firefox */
	-o-tab-size: 4;		/* for Opera */
	tab-size: 4;
	font-family:monospace;
}
</style>
<script src="tabbedText.js" type="text/javascript"></script>
```

```javascript:tabbedText.js
textarea=document.getElementsByTagName('TEXTAREA');
for(i=0;i<textarea.length;i++){
	textarea[i].addEventListener('keydown', function(event){
		switch(event.key){
		case 'Tab':
			event.preventDefault();
			pos=event.target.selectionStart;
			val=event.target.value;
			val=val.substr(0,pos)+String.fromCharCode(event.keyCode)+val.substr(pos);
			event.target.value=val;
			event.target.selectionStart=pos+1;
			event.target.selectionEnd=pos+1;
			return false;
		default:
			return true;	// 通常の文字入力をさせる
		}
		return false;
	},false);
}
```
Arduinoでステッピングモーター操作　

Arduinoでステッピングモーターを動かす際のコードです。
コードとモーターの配線は以下のリンクを参考にしました。
https://makers.jpn.org/2018/06/30/post-926/

関数stepGo(回転方向,回転数,回転速度)にそれぞれ引数を入力し動かします。
引数HLは回転方向をbool型で指定して下さい。
引数revは回転数、です。

1.8度のステッピングモーターはrevが200で1回転するので、変数stepRotateを何倍するかで
回転数を指定できるようにしてあります。


```c++
const int ENEBLE = 6;
const int STEP = 5;
const int DIR = 4;

int stepRotate = 200; //1回転するステップ数

void setup() {
  pinMode(ENEBLE,OUTPUT); // Enable
  pinMode(STEP,OUTPUT); // Step
  pinMode(DIR,OUTPUT); // Dir
  digitalWrite(ENEBLE,LOW); // Set Enable low　→　Low状態でEnable

}

void loop() {
  //stepGo(回転方向,回転数,回転速度);
  stepGo(true,stepRotate*5,500); 
  delay(500);
  stepGo(false,stepRotate*5,500); 
  delay(500);
}

void stepGo(bool HL,int rev,int stepsecond){
  digitalWrite(DIR,HL);
  
  for(int i = 0; i < rev; i++)
  {
    digitalWrite(STEP,HIGH); 
    delayMicroseconds(stepsecond);
    digitalWrite(STEP,LOW);
    delayMicroseconds(stepsecond); 
  }
  
}
Laravel プロジェクト作成、実行　基礎知識　まとめ

前提
本格的にlaravelを使う上で最低限必要でありそうな知識をアウトプットします。
間違いがあれば指摘を頂けると幸いです。


環境　AWS Cloud9
##①プロジェクトの作成記述

・先ずはプロジェクトを作成したいディレクトリの作成

```
$ mkdir ディレクトリ名
```

・次にcd(change directory)で作成したディレクトリに移動

```
cd ディレクトリ名
```

・プロジェクトの作成

```
composer create-project --prefer-dist laravel/laravel プロジェクト名 "5.*"
```
"composer"はプロジェクトに必要なライブラリやパッケージを管理して、それをインストールする機能のこと。

"prefer-dist"はcomposerオプションの一つであり、ここではパッケージをdistからインストールすることを指す



```
$ ls
app      bootstrap      composer.lock  database      phpunit.xml  readme.md  routes      storage  vendor
artisan  composer.json  config         package.json  public       resources  server.php  tests    webpack.mix.js
```
$lsコマンドでインストールされたパッケージを確認することができる

##②Laravelの実行

・作成したプロジェクトがLaravelで起動するための確認記述

```
php artisan serve 
```


・実行結果がターミナルでURLとして表示される。ここではport番号を8080に指定してサーバーを起動

```
ec2-user:~/environment/mynews (master) $ php artisan serve --port=8080
Laravel development server started: <http://127.0.0.1:8080>
[Sat Oct 26 21:06:42 2019] 127.0.0.1:38086 [200]: /favicon.ico
```

RunningApplicationを実行して、結果この様にURLで表示されたら成功です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440408/71d84663-843c-72e4-8f58-62fd142e43eb.png)
データベースクラスタのロール（ユーザ）を確認する（PostgreSQL）

#はじめに
　ユーザを確認する方法はいろいろあります。今回はpsqlのメタコマンドを使う方法、情報スキーマを使う方法、システムカタログを使う方法の3つを紹介します。

#(1)psqlのメタコマンドでユーザを確認する
　一番簡単な方法です。以下のようにメタコマンドを実行することでデータベースのユーザを確認することができます。

**書き方：\du**

```sql

postgres=# \du                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 suzuki    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```

#(2)情報スキーマでユーザを確認する
　情報スキーマの**enabled_rolesビュー**を確認することで、ユーザを確認することができます。
　ちなみに、自分で作ったユーザ（今回の場合はsuzukiのみ）以外にもユーザ名が表示されています。これはもともとPostgreSQLが用意しているデフォルトロールというものです。

**書き方：SELECT * FROM information_schema.enabled_roles;**

```sql
postgres=# select * from information_schema.enabled_roles;
         role_name
---------------------------
 suzuki
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_read_server_files
 pg_write_server_files
 pg_execute_server_program
 pg_signal_backend
(9 rows)
```
#(3)システムカタログでユーザを確認する
　システムカタログの**pg_rolesビュー**を確認することでユーザを確認することができます。情報スキーマ同様、デフォルトロールも表示されます。

**書き方：SELECT * FROM pg_catalog.pg_roles;**


```sql
postgres=# select * from pg_catalog.pg_roles;
-[ RECORD 1 ]--+--------------------------
rolname        | pg_signal_backend
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 4200
-[ RECORD 2 ]--+--------------------------
rolname        | pg_read_server_files
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 4569
-[ RECORD 3 ]--+--------------------------
rolname        | suzuki
rolsuper       | t
rolinherit     | t
rolcreaterole  | t
rolcreatedb    | t
rolcanlogin    | t
rolreplication | t
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | t
rolconfig      |
oid            | 10
-[ RECORD 4 ]--+--------------------------
rolname        | pg_write_server_files
rolsuper       | f
・・・
```
#まとめ
　**psqlのメタコマンド\du**や、**情報スキーマのenabled_rolesビュー**、**システムカタログのpg_rolesビュー**を使うことでユーザを確認することができました。
　読んでくださり、ありがとうございました。

#参考
PostgreSQLのマニュアル（psql）
https://www.postgresql.jp/document/11/html/app-psql.html
PostgreSQLのマニュアル（情報スキーマのenabled-roles）
https://www.postgresql.jp/document/11/html/infoschema-enabled-roles.html
PostgreSQLのマニュアル（システムカタログのpg_roles）
https://www.postgresql.jp/document/11/html/view-pg-roles.html
ベイジアンニューラルネットワークとは

# はじめに
ベイジアンニューラルネットワークという単語をよく聞くけど，何か知らなかったので，調べてメモとしてまとめます．

今回は回帰問題でかつ $p(y|x), p(\theta)$ は共に正規分布に従う場合のみ考慮しました．
分類問題では正規分布ではなく，ソフトマックス関数が利用されたりしますが，記述しません．

参照
・[Edward - Bayesian Neural Network](http://edwardlib.org/tutorials/bayesian-neural-network)
・[Bayesian Learning for Neural Networks p15](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.446.9306&rep=rep1&type=pdf)

# 要約
内部パラメータ $\theta$ に事前分布 $p(\theta)$ を敷いたニューラルネットワークのこと．最初に教師データ $\mathcal{D}$ の学習を行うことで，新たな入力 $ x^* $ と内部パラメータから未知の出力 $ y^* $ を予測するニューラルネットワーク $f(x^*; \theta)$ を得る．積分消去を通して，関数表現 $f(x; \theta)$ から内部パラメータ $\theta$ を消去した $f(x|\mathcal{D})$ を得ることが目的．この積分消去において，学習後の事後分布 $p(\theta|\mathcal{D})$ を利用する．

# 記号の定義

```math
\begin{align}
教師データ:\ & \mathcal{D} = \{(x_n, y_n)\}_{n=1}^{N} \\
& x_n \in \mathbb{R}^d, y_n \in \mathbb{R} \\
ニューラルネットワーク:\ & f(x; \theta) \\
ニューラルネットワークの内部パラメータ:\ & \theta \in \mathbb{R}^M \\

\end{align}
```

# 仮定
```math
\begin{align}
内部パラメータの事前分布:\ & p(\theta)\sim  \mathcal{N}({\bf 0}, \sigma^2{\bf I}) \\
出力の事後分布(ニューラルネットワークの出力):\ & p(y|x,\theta,\sigma)\sim \mathcal{N}(f(x; \theta), \sigma^2) \\
出力の事後分布(積分消去後):\ & p(y|x,\mathcal{D},\sigma)\sim \mathcal{N}(f(x|\mathcal{D}), \sigma^2) \\
\sigma:\ & 事前に与える．ただし，推定する方法もある

\end{align}
```

# 学習の結果得られるもの
```math
\begin{align}
ニューラルネットワーク:\ & f(x; \theta) \\
ニューラルネットワークの内部パラメータ:\ & \theta \in \mathbb{R}^M \\
出力の事後分布:\ & p(y|x,\theta,\sigma)\sim \mathcal{N}(f(x; \theta), \sigma^2) \\
内部パラメータの事後分布の比例式:\ & p(\theta|\mathcal{D}) \propto p(\theta) \prod_n p(y_n|x_n,\theta)
\end{align}
```


# 積分消去後に得られるもの

学習の結果として得た内部パラメータの事後分布の比例式を利用して，モンテカルロサンプリングをするのが一般的．モンテカルロ積分によって，以下のような関数が得られる．一般に少数のデータに対して過剰適合しやすいニューラルネットワークをベイズ学習によって，うまく過剰適合を避けることができました．

```math
\begin{align}
出力の予測値:\ & f(x^*|\mathcal{D}) = \int f(x^*; \theta)p(\theta|\mathcal{D})d\theta \\
出力の事後分布:\ & p(y^*|x^*, \mathcal{D}, \sigma) = \int p(y^*|x^*, \theta, \sigma)p(\theta|\mathcal{D})d\theta \sim \mathcal{N}(f(x^*|\mathcal{D}), \sigma^2)
\end{align}
```
クリックしたオブジェクトの情報を取得する

Text等のObjectをクリックした時にコードを実行する、あるいはクリックされたObjectの情報を取得する方法（今のところ2Dのみ）

前提：オブジェクト（あるいは動的生成したプレハブなど）にスクリプトがアタッチされていること

###IpointClickHandlerの実装
マウスクリックを受け取るために、アタッチしたスクリプトにはインターフェースIPointerClickHandlerを実装する。以下は簡単な実装例。MonoBehaviourの他にIPointClickHandlerを継承している点に注意する。

```sample01.cs
using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class Clicktest : MonoBehaviour,IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("クリックされたら表示する");
    }
}
```

ここで、クリックされたらObjectの情報を変更する方法を考えてみる。（以下は、シーンビューに配置済みのUI.Textをクリックした数だけカウントアップする）

```sample02.cs
using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI; //UI.Textのために必要

public class Clicktest : MonoBehaviour,IPointerClickHandler
{
    Text ClickedTextObject;

    public void OnPointerClick(PointerEventData eventData)
    {
        //eventData.pointerPressメンバから
        //どのTextObjectがクリックされたか受け取る
        ClickedTextObject = 
        eventData.pointerPress.GetComponent<Text>();

        int temp = int.Parse(ClickedTextObject.text);
        temp++;
        ClickedTextObject.text = temp.ToString();
        }
    }
}
```

コツは、PointerEventDataのメンバ変数をうまく使うこと。
リファレンスを見るとlastPressでもいけそうなものだが、この場合はNullになってしまう。謎。

参考リンク：
[EventSystems.PointerEventData リファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/EventSystems.PointerEventData.html)
[メモ]Linux標準入力、標準出力、標準エラー出力の操作例

## ファイル記述子

```
0・・標準入力
1・・標準出力
2・・標準エラー出力
```

## 標準出力、標準エラー出力のリダイレクト

```
・結果をfile1に出力
$ ls > file1

・結果をfile1に出力
$ ls 1> file1

・結果をfile1に出力(追記)
$ ls /bin >> file1

・エラーのみfile2に出力
$ ls aaa.txt bbb.txt 2> file2

・標準出力、標準エラー共にbothに出力
$ ls aaa.txt bbb.txt &> both
```

## 標準入力のリダイレクト

```
・file1の内容を標準入力経由で読み込めるようにしてコマンド1実行
$ コマンド1 < file1

・file1の内容を標準入力経由で読み込めるようにしてコマンド1を実行し、出力結果をコマンド2が標準入力から読み込めるようにする
$ コマンド1 < file1 | コマンド2
```
良きエンジニアであるために ～正しそうで間違っているプラクティス～

## 概要
これまでの開発で正しそうで間違っている・・・と思ったものを今一度整理してみようという試みです。
新人教育など、開発のあり方を議論するネタにできないかなといった目的の個人的な備忘録です。
用語の解釈をあれこれ戦わせるためのものではありません。

* 社会システムなどのミッションクリティカルなミドルウェア開発
* 壊れた機械のような判断しかできないプロジェクトマネージャー下のプロジェクト
* 無知な人間が立てた見当はずれの企画が生み出す破綻プロジェクト

**まだ文章として洗練されていないので個人的な備忘録の段階です。まだ細々と直すと思います。(表現がアレな部分もあると思うし)**

## ルール志向

**誤ち**: とりあえず、ルールを作ってそれを盲目的に守らせること。

**必要だったこと**

* ルールより、ルールが必要になった理由に重きを置くこと
* ルールの遵守は、機械やシステムによってチェックする  
  そのシステムは、本来の目的を満たす範囲で継続的に更新できること

**補足**

* ルール志向のメリットは、スキルやセンスによらず、ほとんど誰でも実現はできる
  * 誰でもできることは、最終的にグローバルで見ると自動化が進む。それを人手でどうにかする組織は衰退に向かう
  * OSSやクラウドサービスが貧弱な時代は、それでも良かったがもう時代は変わっている
* ルールは開発上の保守・改善など何らかの **良き効果** を実現するための **実現手段** の一つに過ぎない  
  その時代に合わせて最善な手段を選択しなおせることが重要
* ルールを無くせば早くなることもありますが、それを推進した偽アジャイルプロジェクトがあって、ウォーターフォール開発が生まれる前にそうであったであろう、行き当たりばったりで作って壊しての原始的な開発になりました。ルールが存在した理由は忘れてはなりません。

## 良きコードに求めるもの

**過ち** バグがない(仕様どおり動作する)、社内の要望をもれなく満たすコード (不勉強な評論家)
あらゆる場所で結合度が低いコード

**必要だったこと**
コードが良きアーキテクチャの上に実装されていること。

* サービス無停止で継続できる (バグの影響が局所的などコントロール下にある)
* 将来的に変化する部分を、最小のコストでリリースできるモジュール構成である (環境の変化をコントロール下に置く)
  変化する部分と、変化しない部分を見極めたアーキテクチャ上で動くコード

**補足**

* もちろん、バグはない方がよい
  バグを量産し続けるコーダーを多数雇って何とか仕様どおり動くものが作れるかもしれないが
  スキルの低いコーダーの生み出すコードは、変更時にコスト高となることが多く、大抵使い捨て。
  顧客からみて、バグ修正、機能追加が遅いシステムに映りやすい。
* 利用者の要望に追従できないゴミシステムとなっても、 **良きコード** を生み出した人は短期的な評価制度と合わせてのし上がることがある
* 結合度
  本来結合しているべきものを分割すると、また統合するコードを書かなくてはならない。
  いわゆる不勉強な「(語源的な意味で)たわけ者」は、コードも組織も台無しにする。

## テスト
視野の狭いシステムテスト担当が非効率を生み出しているかもしれないという話。
マイクロサービス、テストの自動化、DevOps、ライブラリの充実化など少数の開発者で品質確保ができるようになると、際立つ話。

**過ち** メンテナンス工数を軽視すること。あらゆるものを自動化しようと試みること。
伝統的なテスト手法を盲目的に踏襲するプロジェクトが陥りやすい。
メンテナンス工数には、開発、サポート対応、機能追加などを含む。

**必要だったこと**

* シナリオに沿ったテストに重きを置く
  利用者がやりたいことを実現できるかを重視する。
* テストコードの粒度や結合を意識して、効率化を浸透させる
  * テスト観点、テストの目的、テストの効果を掘り下げてチーム全体で共有する
  * ユニットテスト、コンポーネントの結合テスト、システムテストなど、品質確保する工程と自動化の指針を開発担当のレベルで自動化のあり方と優先順位を明らかにする。

**補足**

* テスト自動化は、テストコードのメンテナンスも対で発生する
* シナリオに沿ったテスト、テスト観点による適切な粒度でを軽視して、完全なテスト自動化をしたら、大抵成長が止まる
  * 品質が高いと満足して、それを維持することは成長を阻むことがある
  * シナリオの部分は、システムの最終局面では大抵変更は不可能である
    ぼーっと設計の時間を過ごしても、プロセスを踏めばコードの品質は高まる。
    ただ、利用者に価値ある体験をもたらすかは別で、部門横断して価値を共有すべきである。
    どこか、1部門でも「ぼーっと」生きてるだけの現状維持部隊はすべての足を引っ張る

## ウォーターフォール開発・アジャイル開発

**誤ち** **ウォーターフォール開発** か **アジャイル開発** を適用することを **目的** とすること

**必要だったこと**

* 導入効果を目的として、実現手段は目的を達するもっとも効率の良い手段に置き換えられるようにすること
  それらは、開発手法をこれだ！と決めたら自然と実現されるものでもないと肝に銘じること

**補足**

* ウォーターフォール開発は、調整を最小にしなければならない場合に向く
  * 仕様変更で影響を受ける人たちが大量にいて、変更がスケジュールに大きな影響を及ぼす場合に有効なケースはある
  * 調整能力が欠如したプロジェクトマネージャー、顧客のシステム担当でも運営しやすい
    * 日本のような社員をクビにしにくい環境だと不都合なウォーターフォール開発の適用が度々行われたり、アジャイルの名を冠したウォーターフォール開発もどきが生み出されることもある (調整しないアジャイル開発はウォーターフォール開発よりたちが悪い。「君の名は」はデスマーチ開発だ。)
* 例えば、その日のうちに顧客の要望に応えられる機能追加を品質を維持したままデプロイすることをゴールとする
  アジャイル開発は重要なパーツになるだろう。ただ、それだけでは自然と実現されるものでない。
  そういったものがゴールであると言い続けなければ、その場所にはたどり着けないだろう。

## まとめ
全体を通して「人との関わり」が背後にあるような気がします。
ルール、コード、テスト、など **人によらず** 均一な結果を得るという意味で、見かけ上は人を廃している。

実のところ、各組織に色々と慣習はあるでしょうが、最適解は一つです。
グローバル経済では世界中が課題解決をしていますが、それを一番最適な方法で実現できる組織が生き残るだけです。

古い時代に作られたルールなどは必ずしも最適解ではなく、本質を失わない範囲で最適解に近づけていく必要があると思います。
どうしたらいいかなと俯瞰して考えてみると、人との関わりで発生する問題に着目すると非常に腑に落ちる気がするのです。
【UE4】「Compiling Shaders」の速度改善法

# 最初に

この記事はUE4にて「Compiling Shaders」が走る際の速度改善を試す方法の記事となります。間違いや更に良い方法があった場合にはそっとTwitter( [@ろっさむ](https://twitter.com/4_mio_11) )やコメント、修正リクエストなどでお知らせ頂けるととても有難いです。



## 作業環境

記事内で使用する作業環境は以下の通りとなります。

- Unreal Engine：4.23.1
- Visual Studio：Community 2017 or Community 2017 for Mac or Enterprise 2019



# まず「Compiling Shaders」が全然終わらない！

## →IncrediBuildをアンインストール

アンインストール手順

IncrediBuildのアンインストール手順は少し複雑なので一応残しておきます。

1. Visual Studio InstallerからインストールしているVisual Studioの`変更`を押下し、`インストールの詳細`内にある、C++関連のオプションで`IncrediBuild - ビルドのアクセラレーション`が有効になっていないか確認してください。なっている場合はチェックを外して変更を行ってください。
2. 次に`C:\Program Files (x86)`にある`IncrediBuild`フォルダ下にある`install`を起動します（ここでフォルダ移動などしてパスが異なる場合はC:\直下に置きなおしてください。じゃないとゴミが残ったり削除しきれません）。
3. ロゴマークなどが出てくる画面になりますので、Nextで進んでいってください。そうするとアンインストールする項目がでるはずなので、そちらを押下し、削除します（もし出ていない場合は一旦I、Installをし直してから再度お試しください）。
4. 念のためにPCの再起動をかけといてもいいと思いますが、これでUE4起動し、新規マテリアルを開いても無事シェーダーコンパイルが通るようになると思います。

## →IncrediBuildの無効化

無効化手順

1. `..\UnrealEngine\UnrealBuildTool`下にある`BuildConfiguration.xml`の記述内で、`bAllowXGE`という項目を無効にします。

```xml
<?xml version="1.0" encoding="utf-8" ?>
 <Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
     <BuildConfiguration>
         <bAllowXGE>false</bAllowXGE>
     </BuildConfiguration>
 </Configuration>
```

## →Avast Antivirusをアンインストール

shaderのコンパイルをブロックしている、という報告がいくつか発見できました。

心当たりがある人は一度アンインストールしてから検証してみてください。



## 速度向上その１（XGEShaderCompile）

XGEシェーダーコンパイルを無効にします。

ロックアップが発生しなくなり、可能な限りのCPUを使用してシェーダーをコンパイルすることができます。

`C:\Program Files > Epic Games\UE_xxx\Engine\Config\ConsoleVariables.ini`の `r.XGEShaderCompile= 0`をコメントから外す。



## 速度向上その２（Shader Compilerの優先度を上にする）

※こちらの方法は低スペックのPCで行わないでください。Shader Compilerの優先度を上げると他のプログラムの優先度が低くなって遅延やフリーズが発生する可能性があります。

`Engine > Source > Runtime > Engine > Private > ShaderCompiler > ShaderCompiler.cpp`を開いて、1770行目付近にある変数の値を変更します。

```c++
// int32 PriorityModifier = -1; //bellow normal
int32 PriorityModifier = 1; //bellow normal
```

こうすることでシェーダーコンパイル処理の優先順位が上がります。
condaのpython versionを変更する時の注意点


conda の python version を変更する時は `conda install python=xxx` するという記事をよく見かけますが、それだけだと悲惨な目にあうケースがあったのでメモ。

## 環境

* CentOS 7.7
* Miniconda3 4.5.12


## 詳細


まずは base 環境の python version を変更します。

```
$ conda install python=3.6.3
```

その後 conda コマンドを実行すると、 `ModuleNotFoundError` が発生＞＜

```
$ conda
Traceback (most recent call last):
  File "/opt/conda/bin/conda", line 7, in <module>
    from conda.cli import main
ModuleNotFoundError: No module named 'conda'
```

`conda env` `conda install` `conda create` ... あらゆるコマンドが使えなくなります。

これは、conda module の version が変更後の python と incompatible になってしまったためでした。

```
$ conda list | grep conda
# packages in environment at /opt/conda:
conda                     4.5.12                   py37_0
conda-env                 2.6.0                         1
```

なので、python version を変更するときは、以下のように conda も一緒に適合する version に変更してあげましょう。

```
$ conda install conda=4.5.12=py36_0 python=3.6.3
```

Bye,
Ubuntu で sudo apt install を実行した時 に404エラーが出た話

## 目的

- コマンド`$ sudo apt install`を実行した時に出た404エラーの解決方法をまとめる。

# エラー内容

```
$ sudo apt install linuxbrew-wrapper
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libllvm7
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
  build-essential dpkg-dev fakeroot g++ g++-7 gcc gcc-7 git git-man
  libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl
  libasan4 libatomic1 libc-dev-bin libc6-dev libcilkrts5 liberror-perl
  libfakeroot libgcc-7-dev libitm1 liblsan0 libmpx2 libpython-stdlib
  libquadmath0 libstdc++-7-dev libtsan0 libubsan0 linux-libc-dev make
  manpages-dev python python-minimal python-pkg-resources python-setuptools
  python2.7 python2.7-minimal
・
・
・
Err:1 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 python2.7-minimal amd64 2.7.15-4ubuntu4~18.04.1
  404  Not Found [IP: 160.26.2.187 80]
Err:3 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 python2.7 amd64 2.7.15-4ubuntu4~18.04.1
  404  Not Found [IP: 160.26.2.187 80]
Err:7 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 linux-libc-dev amd64 4.15.0-64.73
  404  Not Found [IP: 160.26.2.187 80]
・
・
・
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/p/python2.7/python2.7-minimal_2.7.15-4ubuntu4~18.04.1_amd64.deb  404  Not Found [IP: 160.26.2.187 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/p/python2.7/python2.7_2.7.15-4ubuntu4~18.04.1_amd64.deb  404  Not Found [IP: 160.26.2.187 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/l/linux/linux-libc-dev_4.15.0-64.73_amd64.deb  404  Not Found [IP: 160.26.2.187 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
```

## 解決方法

- 下記コマンドを実行した

```
$ sudo apt-get update
```

- linuxbrewをインストールする際は下記も実行

```
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>  ~/.bashrc
$ source ~/.bashrc
```