OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel いいね機能を追加しよう(1)

いいね機能では、いいねテーブルの更新前後で画面遷移は発生させずに、ハートの色といいね数表示を変化させるようにします。

これを実現するため、いいね機能ではクライアント(PCやスマホのブラウザ)からサーバー(Laravel側)へ通信する方法として、formタグではなくJavaScriptを使用します。

今回は、ハートを押された時のサーバーへの通信や、ハートの色やいいね数表示の切り替えといった一連の処理を効率的に開発できるよう、JavaScriptのフレームワークであるVue.jsを使用します。

## 1. Vue.jsをインストールする

Vue.jsをインストールします。

laravelディレクトリのpackage.jsonを以下の通り編集してください。

```
.
└──laravel
    └── package.json
```

```php:package.json

// 略
  "devDependencies": {
    "axios": "^0.19",
    "cross-env": "^5.1",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.13",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0", //-- 最後にカンマを追加
    //-- ここから追加
    "vue": "^2.6.11", 
    "vue-template-compiler": "^2.6.11"
    //-- ここまで追加
  }
// 略
```

編集が終わったら、laradockディレクトリで以下コマンドを実行してください

```
$ docker-compose exec workspace npm install
```

## 2. いいね機能のVueコンポーネントを作成する

次に、いいね機能を持つVueコンポーネントを作成します。

resources/jsディレクトリにcomponentsディレクトリを作成し、そこにArticleLike.vueを作成してください。

```
.
└──laravel
    └── resources
        └── js
            └── components
                └── ArticleLike.vue
```
```vuejs:ArticleLike.vue
<template>
  <div>
    <button
      type="button"
      class="btn m-0 p-1 shadow-none"
    >
      <i class="fas fa-heart mr-1"
      />
    </button>
    10
  </div>
</template>

<script>
</script>
```

現段階では、ハートのアイコンを持つボタンと、ダミーのいいね数だけで構成されるVueコンポーネントとなります。
Laravel で varcher 型を数値としてソートする (column-sortable)

##　やりたいこと
MySQL において varchar で定義されたカラムを数値型としてソートしたい。

### どういうこと？
varchar のカラムを order by すると、辞書順にソートが行われる。
例えば `100`, `2`, `99`, `11` というデータがあり、これを昇順に並べるたいとする。
通常は `2`, `11`, `99`, `100` と並ぶことを期待するが、 varchar の場合は `100`, `11`, `2`, `99` という順番になってしまう。
なので、これを期待する順序に並ぶようにしたい。

### 考えうる解決策
1. カラム数値型に変える
2. ゼロパディングする (例: `100`, `002`, `099`, `011`)
3. 対象のデータを数値型にキャストする

本稿では 3 を取り扱う。

## 前提条件等
### 環境
* PHP 7.3.4
* Laravel Framework 5.8.24
* mysql  Ver 14.14 Distrib 5.7.25, for Linux (x86_64)

### column-sortable
Laravel のソートを扱う拡張として `column-sortable` が既に導入してあるものとしてすすめる。
が、考え方と基本的なメソッドは Laravel のものなので、この拡張がなくても使える。

`column-sortable` のインストール方法や使い方はここでは扱わない。

### ソートしたいテーブル
カラム名: amount
型: varcher

## 実装
### モデルにソートのためのメソッドを追加する
```php
public function amountNumericSortable($query, $direction)
{
    return $query->orderByRaw('CAST(amount AS DECIMAL) ' . $direction);
}
```
メソッド名は接尾辞の `Sortable` が必須で、キャメルケースで命名する。
このルールを守ればなんでも良いが、既存のカラムと重複しないようにする。

`column-sortable` を使っていない人は `orderByRaw('CAST(amount AS DECIMAL) ' . $direction)` の部分を既存のクエリにくっつける。
`$direction` のところは `ASC`/`DESC` を指定する

### モデルにソートできるカラムとして追加する
```php
public $sortable = [
    'amount_numeric',
];
```
`$sortable` の変数が既にある場合は、その配列に `amount_numeric` を追加する。
命名は先に追加したメソッドの `Sortable` を取り除いた部分をスネークケースにする。

`column-sortable` を使っていない人は不要。

### View 側でソートの設定を変える
#### 変更前
```php
@sortablelink('amount', __('Amount'))
```

#### 変更後
```php
@sortablelink('amount_numeric', __('Amount'))
```

## おまけ
### null の対応
null を許可しているテーブルを昇順でソートすると、 null が先頭にくるので、これをこないようにしたい。
そういうときは `orderByRaw('amount IS NULL ASC')` を使用する。
組み合わせると以下のようになる。

```php
public function amountNumericSortable($query, $direction)
{
    return $query
        ->orderByRaw('amount IS NULL ASC')
        ->orderByRaw('CAST(amount AS DECIMAL) ' . $direction);
}
```

### 0 の対応
値が 0 の場合に後ろにしたいという、謎要件のとき。
`orderByRaw('amount = 0 ASC')` を使用する。

### どうして動く？
`amount IS NULL` は amount が `null` の時に `1` になり、`文字がある` 時に `0` になる(true = 1, false = 0 として扱われる)。
なのでこれを昇順に並べると、`文字がある` 時の方が `null` の時より小さいので、 `文字がある` 行が先に来る。
`amount = 0` も同様の原理。
リスクを正しく評価して背負う勇気

『見通しが立たない』・『変化を受け入れない（何も行動しない）』は、**最大のリスク**です。

これまで、私たちはリスクを最小化して失敗しないようにプロジェクトを進めることが必要であるとされてきました。
本当にそうなのでしょうか？
『石橋をたたいて渡る』という言葉があります。“堅牢な石橋であっても、さらにたたいて安全を確認してから渡る（用心の上にも用心する）”を指すことわざですが、プロジェクトの実施を渡るに例えると、絶対失敗は許されないという強迫観念から、渡る行為をやめてしまうような判断をする、もしくは先延ばしにする状況が増えているようです。
**『渡る前に、石橋をたたいて壊す』**です。
新規企画の段階で、リスクをてんこ盛りにして評価して没にするマネジメントが多く見受けられます。特に日本では評論家がもてはやされていて、行動することよりも、評価する方の声に左右されています。
**本来の評論家は、単なる評価一辺倒ではありません、評価しその改善点を提案し、共にゴールを目指すように支援できる方が、真の評論家という役割です。**

現在は、単なる足の引っ張り合いになっているように感じます。
私たちに求められる行動は、どれだけのリスクが存在し、それら個々の影響度と対策（仮説）を確り把握することです。把握したうえで、ステークホルダー全員でそのリスクを**皆当事者として背負っていく勇気**が必要で、ステークホルダーでも開発に直接関与できなくても、良きアドバイザーとして一緒に背負という姿勢が必要なのです。
それと実施計画面では、リスクを早期に顕在化して、試す機会や訓練する場を設けることです。
この場を活性化するには、**『心理的安全性』**は必要です。
心理的安全性はマネジメントレベルが確りと支え、開発チームふくめてステークホルダーが真のチームとした、チームビルディングが出来ている事が前提です。
**相互信頼と批判禁止がルールだけでなく行動として染みついている**ように促します。
大変かと思うかもしれませんが、この基礎をないがしろにしては、全員が同じようにリスクを背負う勇気が芽生えません。
特に**マネジメント層には『心のマネジメント』**が必須です。
最後に付け加えますが、リスクを次の四つの観点に分類して各々を詳細化する方法をお勧めします。
・ハイレベルな（抽象度が高い）機能要求
・品質特性要求（非機能要件的なものも含めます）
・技術制約
・ビジネス制約（予算・期日・競合他社・・・）
その後、リスクの評価を行い（単なる高・中・低ではなくてビジネスへの貢献・緊急・機会損失といった優先付け項目を独自に作ることをお勧めします）で整理して、実行計画や訓練計画に盛り込んでいきます。
JavaScriptでfalsyな値の一覧

#falsyな値とは
falsyな値とは、Booleanで真偽値に変換した場合にfalseになる値のこと。
※truthyな値は、trueになる値のこと。

#falsyな値の一覧
* false
* 0
* 0n
* ""
* null
* undefined
* Nan

#まとめ
変数の値がfalsyかどうかプログラムの中で確認することは多々あると思います。
そのときにfalsyな値かどうかを毎回、デバックで確認するのは手間なので覚えておくと便利です。
CartoonGANをiOS用に変換して、アニメ風自動変換してみました

2018年に発表されたモデルのTensorFlow2実装から変換します。
**写真をアニメ風に変換できる機械学習モデルです。**
なんとiOS上で使うことができます。
機械学習がモバイルで使えるとは、便利な時代になりましたね。

[論文](https://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf)
[変換済みCoreMLモデル:GitHub](https://github.com/john-rocky/CoreML-Models)
![Aug-29-2020 23-31-13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6f09bc27-bd6a-ddd7-4e01-8640280b0c6e.gif)
iOSでの実行結果
![cover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6452b0ec-f1eb-4066-36e5-6a2b5493f031.gif)

##モデルの変換

１、リポジトリをクローン。

```shell
!git clone https://github.com/mnicnc404/CartoonGan-tensorflow.git
cd CartoonGan-tensorflow/
```

２、必要なモジュールをインストール。

```shell
!pip install -r requirements_cpu.txt
!pip install git+https://www.github.com/keras-team/keras-contrib.git
!pip install coremltools==4.0b3
```

**3、テストスクリプトに変換スニペットを書き込んでしまいます。**

**＊インプットshapeは元のモデルでは (None, None, 3) になっていますがそのままだとCore MLでは(1, 1, 3)になってしまうので、明示的にサイズを指定しています。**

```python:cartoonize.py,line303
models.append(cartoongan.load_model(style))
mlmodel = ct.convert(models[0],inputs=[ct.ImageType(shape=(1,256,256,3),bias=[-1,-1,-1], scale=1/127)])
mlmodel.save(style + ".mlmodel")
```

Xcodeでの使用方法はこちらの記事と同じです。
[UGATITをCoreMLモデルに変換。【変換済みCoreMLモデルあり】iOSモバイル端末でディープラーニング画像変換](https://qiita.com/john-rocky/items/7d5f3928c584c8013d40
)
[CoreGANContainer](https://github.com/john-rocky/CoreGANContainer)を使うと、モデルをプロジェクトにドロップするだけで使えます。

＊モデルがBGRカラーでの出力になっていますので、RGB変換してあげてください。

```swift
extension CGImage {
    func toBGR()->CGImage{
        let ciImage = CIImage(cgImage: self)
        let kernelStr: String = """
        kernel vec4 swapRedAndGreenAmount(__sample s) {
        return s.bgra;
        }
        """
        let ctx = CIContext(options: nil)
        let swapKernel = CIColorKernel( source:
                                            "kernel vec4 swapRedAndGreenAmount(__sample s) {" +
                                            "return s.bgra;" +
                                            "}"
        )
        let ciOutput = swapKernel?.apply(extent: (ciImage.extent), arguments: [ciImage as Any])
        let cgOut:CGImage = ctx.createCGImage(ciOutput!, from: ciOutput!.extent)!
        return cgOut
    }
}
```

****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Laravel バリデーションルールsizeで文字数があっているのにバリデーションエラーが出る

# 目的

- バリデーションを実装中にバリデーションルール「size」で指定した文字数と一致しているのにエラーが出てしまう問題をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 問題のコード

- 郵便番号を保存する処理でビューファイルから送信された郵便番号データをチェックする処理を書いた。
- データ受け取り側のコントローラファイルのアクション部分の処理を記載する。（ビューファイルにはバリデーションエラーを出力する処理が施されている。）

    ```php
    public function update(Request $request)
    {
        // バリデーションルール記載
        $rules = [
            // 入力された郵便番号データが「空でない」「数値である」「文字長が7文字である」ことと確認するバリデーションルール
            'postal_code' => ['required', 'integer', 'size:7'],
        ]

        // バリデーションチェック
        $this->validate($request, $rules);
        
        return redirect(route('home'));
    }
    ```
- 「The postal code must be 7.」と言うバリデーションエラーがビューファイルに出力された。
- 文字数が7ではないと言うバリデーションエラーである。

# 原因

- バリデーションルールの指定をミスしていた。
- 「フィールドが数値で値の桁数を指定するバリデーションルールが別に存在する。
- `digits:桁数`でルールを記載することができる。

# 解決策

- バリデーションルール記載部分を下記の様に修正する必要がある。
- 下記の様に記載することにより入力データが「空でない」かつ「数値で桁数が7である」と言うルールが定義できる。

    ```php
        $rules = [
            'postal_code' => ['required', 'digits:7'],
        ]
    ```
Ruby ローカル環境構築について（Virtual BoxとVagrantとの互換性、コマンド入力）

プログラミングの勉強を進めるうえで、ローカル環境構築はスタートラインに立つ準備。
しかし、その初めの一歩でつまづきそうになったため、個人的備忘録として書き残す。
（つまづいている最中、「こんなことなら、windowsじゃなくてmac買っておけば」と後悔したけど、何とかなった＾＾；）

前提として、
windows10 64bit
hp pavilion のラップトップを使用。

1.Virtual Box(VB）とVagrant、それぞれ最新のバージョンをインストールした。
2. railsのインストール完了（ここは難なくできた。）
3. pcを再起動後、git-bashを起動。vagrant sshでアクセスを試みようとしたが、下記のメッセージが出たっきり反応なし。

　　A Vagrant environment or target machine is required to run this
　　command. Run `vagrant init` to create a new Vagrant environment. Or,
　　get an ID of a target machine from `vagrant global-status` to run
　　this command on. A final option is to change to a directory with a
　　Vagrantfile and to try again.

　ここで行き詰まる。
4.biosを起動（f10ボタン）して、環境構築enableであることを確認。
5.VBとVagrantのバージョンの互換性の問題と仮説を立て、バージョンダウンを図った。
 VB・・・4.3.12にバージョンダウン
 Vagrant・・・1.9.2にバージョンダウン
6.再度、vagrant up、vagrant sshを試み、何とか仮想環境にアクセスできた。

・・・どうやら、3.のメッセージは、git-bash起動後に「cd vagrant」で
ARM の識別情報 [MAIN ID]

[ARM の CPU 情報を得るためのデバイスドライバ](https://qiita.com/ikiuo/items/75e522699164d6e30585)などで取得できる MAIN ID の表

### Pre-ARM7
|PROCESSOR|MAIN ID|ID|
|:--|:--|:--|
|ARM3|4156030x|4156030|
|ARM600|4156060x|4156060|
|ARM610|4156061x|4156061|
|ARM620|4156062x|4156062|

### ARM7
|PROCESSOR|MAIN ID|PART|A|
|:--|:--|:--|:--|
|ARM7100|4104710x|710|0|
|ARM710a|4106710x|710|0|
|ARM710|4180710x|710|1|
|ARM720|4180720x|720|1|
|ARM740|41807400|740|1|
|ARM740|41817400|740|1|

### Post-ARM7
|PROCESSOR|MAIN ID|PART|A|
|:--|:--|:--|:--|
|ARM920|4112920x|920|2|
|ARM922|4102922x|922|2|
|ARM926|4106926x|926|6|
|ARM940|4102940x|940|2|
|ARM946|4104946x|946|4|
|ARM946|41059461|946|5|
|ARM966|41049660|966|4|
|ARM966|41x5966x|966|5|
|ARM968|4105968x|968|5|
|ARM11|410FB02x|B02|F|
|ARM1136|41x7B36x|B36|7|
|ARM1156|41xFB56x|B56|F|
|ARM1176|41xFB76x|B76|F|
|Cortex-A15|41xFC0Fx|C0F|F|
|Cortex-A17|411FC0Ex|C0E|F|
|Cortex-A32|41xFD01x|D01|F|
|Cortex-A35|41xFD04x|D04|F|
|Cortex-A5|410FC05x|C05|F|
|Cortex-A53|410FD03x|D03|F|
|Cortex-A55|41xFD050|D05|F|
|Cortex-A57|411FD07x|D07|F|
|Cortex-A65|411FD061|D06|F|
|Cortex-A7|410FC07x|C07|F|
|Cortex-A72|410FD08x|D08|F|
|Cortex-A73|41xFD09x|D09|F|
|Cortex-A75|41xFD0Ax|D0A|F|
|Cortex-A76|41xFD0Bx|D0B|F|
|Cortex-A76AR|410FD0E0|D0E|F|
|Cortex-A77|410FD0D1|D0D|F|
|Cortex-A8|41xFC08x|C08|F|
|Cortex-A9|41xFC09x|C09|F|
|Cortex-R4|41xFC14x|C14|F|
|Cortex-R5|41xFC15x|C15|F|
|Cortex-R52|411FD13x|D13|F|
|Cortex-R7|410FC171|C17|F|
|Cortex-R8|410FC18x|C18|F|

---
[ARM Developer](https://developer.arm.com/) にあるドキュメントから拾ってます。
RDKit で何となくSMILESを生成するのはそろそろやめよう

#概要
デフォルトオプションを理解せず、なんとなく Chem.MolToSmiles 使うのは、そろそろ卒業しようぜ。ということでまとめたメモ。

#環境
RDkit 2020.03.5  

#オプションの説明

| オプション | 説明 | 
|:-----------|:------------|
|iosomericSmiles|SMILESに立体化学に関する情報を含める。デフォルトはtrue|
|kekuleSmiles|SMILESでKekule形式（芳香族結合なし）を使用。 デフォルトはfalse| 
|rootedAtAtom|負でない場合、これはSMILESを特定の原子で強制的に開始する。デフォルトは-1|
|canonical|falseの場合、正規化されない。デフォルトはtrue。 |
|allBondsExplicit|trueの場合、すべての結合次数が出力SMILESで明示的に出力される。 デフォルトはfalse。 |
|allHsExplicit|trueの場合、すべてのHカウントが出力SMILESで明示的に出力される。 デフォルトはfalse。|


#やってみよう

rootedAtAtom以外の動作を確認するために、こんなメソッドを作成。

```python
def generate_smiles(old_smiles, isometric=True, kekule=False, allBondsExplicit=False, allHsExplicit=False, canonical=True):
    print(f"\n\ngenerate smiles {old_smiles}")
    print(f"prev smiles = {old_smiles}")
    old_mol = Chem.MolFromSmiles(old_smiles)
    new_smiles = Chem.MolToSmiles(old_mol, isomericSmiles=isometric, kekuleSmiles=kekule,
                                 allBondsExplicit=allBondsExplicit, allHsExplicit=allHsExplicit, canonical=canonical)

    print(f"new smiles = {new_smiles}")
```

## 実験対象のSMILES
立体情報と芳香環情報のある、こいつで確認していこう。

```
C[C@H]1COC2=C1C(=O)C(=O)c1c2ccc2c1CCCC2(C)C
```


## isometicSmilesをデフォルトのtrueからflaseに変えた場合

```
CC1COC2=C1C(=O)C(=O)c1c2ccc2c1CCCC2(C)C
```
お、立体情報が消えた。

## canonicalをデフォルトのtrueからflaseに変えた場合
```
C[C@H]1COC2=C1C(=O)C(=O)c1c2ccc2c1CCCC2(C)C
```
変更なし。元のSMILESがcanonicalだった可能性も。

## kekureSmilesをデフォルトのfalseからtrueに変えた場合
```
C[C@H]1COC2=C1C(=O)C(=O)C1:C2:C:C:C2:C:1CCCC2(C)C
```
cが大文字になりコロンが増えた。-と=が交互にってパターンじゃないのね。

## allBondsExplicitをデフォルトのfalseからtrueに変えた場合
```
C-[C@H]1-C-O-C2=C-1-C(=O)-C(=O)-c1:c-2:c:c:c2:c:1-C-C-C-C-2(-C)-C
```
単結合もちゃんと出ましたね。うーん、うるさい（笑）。

## allHsExplicitをデフォルトのfalseからtrueに変えた場合
```
[CH3][C@H]1[CH2][O][C]2=[C]1[C](=[O])[C](=[O])[c]1[c]2[cH][cH][c]2[c]1[CH2][CH2][CH2][C]2([CH3])[CH3]
```
暗黙水素があぶりだされましたね。さらにうるさい（笑）
    
#最後に、allBondsExplicitとallHsExplicitを同時にtrueにする(おまけ）
```
 [CH3]-[C@H]1-[CH2]-[O]-[C]2=[C]-1-[C](=[O])-[C](=[O])-[c]1:[c]-2:[cH]:[cH]:[c]2:[c]:1-[CH2]-[CH2]-[CH2]-[C]-2(-[CH3])-[CH3]
```
行間読めない人向け。

#参考
https://www.rdkit.org/docs/source/rdkit.Chem.rdmolfiles.html
【PHP/キャスト】型指定を意識する

##はじめに
PHPで実装する時、型指定は意識していますか。
PHPでは変数に文字列を入れればその変数はstring型になり、また整数を入れればint型になります。

>PHP は、変数定義時に明示的な型定義を必要と(または、サポート) しません。ある変数の型は、その変数が使用される文により定義されます。 これは、ある文字列を変数 var に代入した場合には、 var は文字列になることを意味しています。 ある整数値を var に代入した場合には、 その変数は整数になります。
引用：[PHP: 型の相互変換 - Manual](https://www.php.net/manual/ja/language.types.type-juggling.php)

なので変数の型が自動で決まるので意識していないという方もいるかと思います。
しかし予期せぬエラーが起きたり、TypeScriptなど型指定が厳密な言語で実装する時にも困らないようにするためだったりと日頃から型指定は意識しておきたいですね。

##キャストで強制的に型を変更する
PHPで型を変更したい時はキャストすることで可能です。
※キャストは割と強引な方法だと思いますので、例えばRequestで受け取った型がちゃんと正しいか確認した後とかに使う手段の1つだと思っておいてください。

使用可能なキャストは下記です。
>
- (int), (integer) - 整数へのキャスト
- (bool), (boolean) - 論理値へのキャスト
- (float), (double), (real) - float へのキャスト
- (string) - 文字列へのキャスト
- (array) - 配列へのキャスト
- (object) - オブジェクトへのキャスト
- (unset) - NULL へのキャスト

>引用：[PHP: 型の相互変換 - Manual](https://www.php.net/manual/ja/language.types.type-juggling.php)

例えば「01234」がstring型で定義されていた時にint型に変更したい時は、変更したい変数の前に`(int)`とつけるだけで大丈夫です。

```php:
$string = '01234';
$int = (int)$string;
echo $int;

//$intの結果は「1234」のint型になります。
//※int型なので「01234」と言う数字は不適で「1234」になります。
```

##おわりに
いかがでしたでしょうか。
どの言語を実装する時にでも困らないように型指定を考えながら実装することは良いかもしれませんね。
Linux (ユーザーの追加・削除について)

前回はユーザーについての解説を行いました。

こちらではユーザーアカウントの追加・削除について学んでいきましょう。
基本的にはrootでユーザー関連の操作を行いますので、前回学習した<b>su</b>/<b>sudo</b>コマンドを使用してユーザーの作成を行いましょう。

<font color=red>
<h1>useraddについて</h1>
</font>
さっそくユーザーの作成を行いましょう。<b>useradd</b>コマンドを使用します。

```
root    #  useradd neko
```

上記のコマンドを入力する事でnekoユーザーが作成されます。
ユーザーが作成された際は、<b>/etc/passwd</b>の中身を確認して
作成されているかの確認を行いましょう。

```
cat /etc/passwd
```

一番最後の行に、nekoユーザーが表示されます。

<font color=red>
<h1>passwdについて</h1>
</font>
作成したユーザーのパスワード設定を行いましょう。<b>passwd</b>コマンドを使用します。
こちらもroot権限が必要になります。

```
root    #  passwd neko
```

上記のコマンドでパスワード設定を行えます。
以降、ログインするユーザーを選択する際にnekoユーザーでログインする事が可能となります。

<font color=red>
<h1>userdelについて</h1>
</font>
ユーザーの削除は<b>userdel</b>で行います。
ユーザーのホームディレクトリも削除しますので、-r(remove)オプションも使用しましょう。
くどいですが、root権限で行います。

```
root    #  userdel -r neko
```

<b>/etc/passwd</b>を確認し、削除されているかの確認を行いましょう。

以上、、

<font color=red>
<ul>
<li>useradd</li>
<li>passwd</li>
<li>userdel</li>
</ul>
</font>

ユーザーについてでした。

次は→<a href="https://qiita.com/larcmiya/items/a79e8ab5b0f42fde6748">グループについて</a>
Singularityでdefファイルをリモートでビルドする方法 （MacOS向け）

## はじめに
この記事は、HPC向けのコンテナエンジンを非Linux環境（MacOS/Windows）のマシンで使う方向けです。とりわけ、自前でdefファイルを用意し、ビルドしてイメージファイルsifを作りたい方を対象としています。

想定されるのは、

- Singularity 3.3.0
- MacOS Calalina 10.15.6

です。上記のケース以外での動作の保証はできませんのでご了承ください。

## Remote Buildの方法

HPC向けコンテナエンジンのSingularityで作業を行う際には、イメージファイル（SIF）を配置する必要が生じるケースがあります（参考: https://sc.ddbj.nig.ac.jp/ja/guide/software/singularity ）
 
SIFは、自前で用意したDefinition File（def）をビルドすることで得られます。defファイルはDockerでいうところのDockerfileに相当します。自らでカスタマイズした環境でコードを動作させたい場合、defの用意とそのビルドは必須となります。

Linuxであれば、ビルドは、生成するイメージファイルをxxx.sif、ビルドするdefinitionファイルをzzz.defとすれば

```
$ sudo singularity build xxx.sif zzz.def
```

で可能です。MaxOSにおいては、ローカル環境でのビルドが（2020年8月時点では）不可能で、直接上の処理を実行すると、

```
FATAL:   Only remote builds are supported on this platform
```

と言われてしまいます。リモートのビルドは[Sylabs CloudのGUI](https://cloud.sylabs.io/builder)で実行することが可能ですが、コマンドを使ってのremote buildと比較して時間がかかってしまいます。そこで、コマンドのみでリモートビルトを行う方法を紹介します。

まず、[Sylabs Cloud](https://cloud.sylabs.io/home)にサインインします。Google/GitHub/GitLab/Microsoftのアカウントで入ることができます。

次に、コマンドライン上でリモートログインの設定をします。

```
$ singularity remote login
```

を実行し、認証のためにAPI Keyの入力が求められることを確認します。

![remote login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217132/22ba0804-b09c-2243-1961-5038398b7db3.jpeg)

となります。https://cloud.sylabs.io/auth/tokens に移動すると、Access Tokenの生成を求められるので、"Enter Label as an alias of Token"の欄に任意のLabelを入力して、"Create a New Access Token"を実行します。

![スクリーンショット 2020-08-29 10.51.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217132/5c6ccf0c-3261-dfd2-6f0e-a91a2f757d6e.jpeg)

しばらくすると生成されたTokenが表示されるので、コピーして先ほどのコマンドラインでの"API Key: "にペーストします。

認証が成功すれば、コマンドラインでのRemote Buildが可能となります。

```
$ singularity build --remote xxx.sif zzz.def
```

を実行することで、SylabsのGUIなしでRemote Buildができるようになります。

生成されたSIFをコードを実行する環境に配置することで使えるようになります。一度認証をしてしまえば、これ以降はこのコマンドだけでビルドが可能です。

## おわりに

MacOSユーザー向けにdefファイルのビルド方法を扱いました。Windowsでの動作検証等はできておらず、また任意のdefに対して確実にSIFの生成ができるという保証もできません。上で挙げた方法でうまくいかないケース等ありましたらお教えいただけますと幸いです。ご一読いただきありがとうございました。
テストコードを書くときに、ランダムで情報を生成したい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.導入方法</b>

<b>3.ニックネーム,email,パスワードの書き方</b>

<b>4.別の書き方</b>

<b>補足：日付/苗字・名前(漢字とカタカナ）の書き方</b>




<br>
1.結論
----------------------------------------
gem”faker"をgemfileに記載し、bundle installする。
そして、specフォルダにfactoriesフォルダを作り記載したいファイルを作ってプログラミングする。


2.導入方法
----------------------------------------
※ここではgem"rspec-rails",gem"factory_bot_rails"の導入の話は割愛します！その2つをbundle installしている前提でお話しします。"Rspec","FactoryBot"の記事を投稿した場合はこちらにもリンクを貼らせていただきます！
<br>
手順❶

```ruby:gemfileフォルダ
group :development, :test do
end 
```
の中に

```ruby
gem 'faker'
```
を記載。

<br>
手順❷

```ruby:ターミナル
％bundle install　
```
ターミナルでこのように記述します。

<br>

手順❸
specフォルダにfactoriesフォルダを生成し、
任意のファイルを作成。(Rubyであれば"モデル名.rb")
<br>
手順❹

```ruby:factories/***.rb
FactoryBot.define do
  factory :user do
------- ここより下に記載していきます------------


 end
end
```
<br>

3.ニックネーム,emailの書き方
----------------------------------------

 ```ruby
”----- ここより下に記載していきます--------”
```

の欄に

```ruby:factories/***.rb
nickname { Faker::Name.name }
email { Faker::Internet.free_email }
```
と記載することでランダムに生成することができます！
nickname,emailはDBのカラムと同じ名前になります。


 <br>
3.パスワードの書き方
----------------------------------------

```ruby:factories/***.rb
password = Faker::Internet.password(min_length: 6)
password { password }
password_confirmation { password }
```
min_length:6はgem"devise"の本来備わっているバリデーションに合わせています。
また２度入力するための"確認用パスワード"も記載しています。
<br>

4.生成されているか確認する方法
----------------------------------------
ターミナルで

```ruby:ターミナル
%rails c
```
とコンソールを開いてから

```ruby:コンソール
pry(main)>FactoryBot.create(:モデル名)
```
*pryなのはbinding.pryを導入しているためです。

下記のように入力するとニックネーム,emailの情報がランダムで生成されていることがわかります！
*パスワードはencrypted_passwordにより暗号化されます。

```ruby:コンソール
nickname: "Sen. Lou Schimmel", email: "earlean@yahoo.com"
```


<br>
4.別の書き方
----------------------------------------
gem"faker"を導入しないパターンですと、
このように書くこともできます！

```ruby:factories/***.rb
FactoryBot.define do
  factory :user do

  nickname              {"taro"}
  email                 {"kkk@gmail.com"}
end
end

```


<br>
補足.日付/苗字・名前(漢字とカタカナ）の書き方
----------------------------------------
結論から申しますと、

```ruby:factories/***.rb
FactoryBot.define do
  factory :user do
    transient do
      person { Gimei.name }
   end
   date { Faker::Date.backward }
   first_name { person.first.kanji }
   last_name { person.last.kanji }
   first_name_kana { person.first.katakana }
   last_name_kana { person.last.katakana }
 end
end

```
このように書きます。
ただ注意して欲しい事が１点あります。
gem"faker"にはランダムで漢字やカタカナ（振り仮名)を生成することができないので別途gem"gimei"というものをgemfileに記載し、bandle installします。

そして

```ruby:factories/***.rb
transient do
person { Gimei.name }
```
こうすることによりgemを自由に使用することができます。

実際に使用する際は
”person.”をいれて苗字と名前(”first”/”last”)で指定することができ、漢字とカタカナ(”kanji”/”katakana”)で指定できます。
特定電子メール法、電子消費者契約法、不正競争防止法、プロパイダ責任制限法

応用情報技術者平成30年秋期 午前問79

広告や宣伝目的の電子メールを一方的に送信することを規制する法律はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/abe5ee86-b80a-74f7-c498-af0817a4747b.png)


１、特定電子メール法は、　（俗称は迷惑メール防止法）
広告や宣伝など営利目的で送信される迷惑メール(特定電子メール)を規制し、電子メールの利用についての良好な環境を整備する目的で定められた法律です。

無差別かつ大量に短時間の内に送信される広告などといった迷惑メール、チェーンメールなどを規制し、インターネットなどを良好な環境に保つ為に施行された、日本における法律。

・チェーンメール（英語: chain letter）は、受信者に対して他者への転送を促す手紙（メール）[1]、特に巧妙な文面を用いて受信者に不特定多数への転送を促す手紙（メール）のこと[1]。

２、電子消費者契約法は、
ネット取引において誤操作による注文や申し込みで消費者が不利益を被らないように保護する目的で制定された法律です。

・ポイント１：
例えば商品1個を注文したつもりが、パソコンの操作を誤って11個と入力してしまった場合、消費者は民法の錯誤の規定（第95条）を活用して、事業者に契約の無効を主張することができます。

・ポイント２：
電子消費者契約法では契約成立時期を通知が到達した時点としました（到達主義）。

基本とは、消費者を保護するための法律と思っております。

３、不正競争防止法は、
事業者間の公正な競争と国際約束の的確な実施を確保するため、不正競争の防止を目的として設けられた法律です。

不正競争防止法（ふせいきょうそうぼうしほう、平成5年5月19日法律第47号）は、公正な競争と国際約束の的確な実施を確保するため、不正競争の防止を目的として設けられた、日本の法律である。経済産業省が所管する。

不正競争防止法では、保護する対象に対して、行為の規制（禁止）となる要件を定めることで、信用の保護など、設定された権利（商標権、商号権、意匠権等）では十分守りきれない範囲の形態を、不正競争行為から保護している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4f5f00d9-f115-b2ea-1dfd-695e4433fcc7.png)

・dead copy（デッドコピー）：完璧な模造品のこと


４、プロパイダ責任制限法は、
特定通信による情報流通によって権利の侵害があった場合に、その通信の提供者の損害賠償責任の制限および発信者情報の開示請求をする権利を定めた法律です。

「プロバイダ責任制限法」とは、正しくは「特定電気通信役務提供者の損害賠償責任の制限及び発信者情報の開示に関する法律」（平成14年5月27日施行）といいます。

この法律は、インターネット上で運営されるホームページや掲示板等で行われた情報の流通により、名誉毀損や権利侵害（プライバシー権、著作権、商標権等）があった場合に、

1. サービスプロバイダ、ホームページや掲示板等の管理者等の損害賠償責任を制限すること
2. 送信防止措置請求権
3. 発信者情報の開示請求権
を規定しているものです。


参照：
https://www.ap-siken.com/kakomon/26_aki/q79.html

特定電子メールの送信の適正化等に関する法律
https://ja.wikipedia.org/wiki/%E7%89%B9%E5%AE%9A%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E9%80%81%E4%BF%A1%E3%81%AE%E9%81%A9%E6%AD%A3%E5%8C%96%E7%AD%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%B3%95%E5%BE%8B

電子消費者契約法って、なに？
https://www.city.osaka.lg.jp/lnet/page/0000002409.html#:~:text=%E9%9B%BB%E5%AD%90%E6%B6%88%E8%B2%BB%E8%80%85%E5%A5%91%E7%B4%84%E6%B3%95%E3%81%A8%E3%81%AF%E3%80%81%E6%AD%A3%E5%BC%8F%E3%81%AB%E3%81%AF,%E3%82%92%E5%AE%9A%E3%82%81%E3%81%9F%E6%B3%95%E5%BE%8B%E3%81%A7%E3%81%99%E3%80%82

不正競争防止法
https://ja.wikipedia.org/wiki/%E4%B8%8D%E6%AD%A3%E7%AB%B6%E4%BA%89%E9%98%B2%E6%AD%A2%E6%B3%95

プロバイダ責任制限法について
https://www.sonynetwork.co.jp/corporation/isplaw/#:~:text=%E3%80%8C%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E8%B2%AC%E4%BB%BB%E5%88%B6%E9%99%90%E6%B3%95,%E6%97%A5%E6%96%BD%E8%A1%8C%EF%BC%89%E3%81%A8%E3%81%84%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%E3%82%92%E8%A6%8F%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82
バッチサーバーを ”Fargate化” しました

弊プロダクトでもバッチサーバーをFargate化しましたというお話。

*You can also check English subtitle 
https://qiita.com/e99h2121/items/513302e1cf1c9ad35367

-----
## 何がすごいの
**24/365 バッチサーバーを起動しておかなくても良くなります。**

-----
ジョブ同士の関係が限定的になるのでジョブ詰まりがなくなるかも。
とりあえずクラウドフレンドリーな弊プロダクトの大きな一歩（のはず）。

-----
試算では年額1社 ****円減 
:moneybag::moneybag::moneybag:

-----
## ここで唐突に
弊プロダクトバッチジョブ基盤の歴史

-----
### Ver.5x 

- 世界はクライアントとデータベースサーバーしかなかった。夜間バッチはC++のサービスから蹴られていた。

-----
### Ver.6x 

- 時は2000年代前半、アプリケーションサーバーを介し3層構造化。キュー管理サービスはそのAP Serverに同居。キューが詰まりだすと画面系もろとも（略

-----
### Ver.7x 

- 2010年代、キュー管理サービスはアプリケーションサーバーから機能分離。単独でメンテナンスできるようになったのはめちゃくちゃでかい。

-----
### Ver.8x 

- そしてバッチサーバーごとコンテナに載る。

-----

## 他所参考資料

Fargateでバッチサーバを作る
https://qiita.com/fnaoto/items/d6523786daa128ddfe60

> FargateはAWSのサービスで、Dockerコンテナを実行する基盤の一つです。

-----

> FargateではTaskやServiceを作るだけでコンテナを動かすことができます。バッチ実行時のみ課金されるので利用料を節約できます。
> 例えばECSだと、バッチ利用時にEC2インスタンスを起動し、利用後に停止するという手順が必要でした。

-----

> しかし、Fargateではインスタンスを管理する必要はなく、Taskが動いている時間だけ課金されます。

他

Fargateでサーバレスバッチ基盤を構築した話
https://engineer.crowdworks.jp/entry/2020/07/20/180014

-----

## 最も難しかったポイント

Fargate化までの技術的メモ (山田記事)

- [WindowsローカルのAWS SDKでJavaプログラムを動かすまで](https://qiita.com/e99h2121/items/7b153c12f61470ffdf48)
- [AWS SDK for Java 1.11.x と 2.x を共存させる](https://qiita.com/e99h2121/items/2dd857fc5bc20796d691)
- [AWS SDK で出会った例外](https://qiita.com/e99h2121/items/21cd273ac3b880e6b6ab)


-----

平たく言うと
ビルド何度かとめましたゴメンナサイ :bow: 

です。

-----
 
## 使い方（私信）
バッチサーバーコードにFargate の文字を含ませて振り分け設定すれば使えます。今ならyamada_n9/yamada_n9 でログインすれば全ジョブFargate起動になってるので触ってみてね :smiley_cat: 

-----

## 次回予告
Fargateでインターフェース系ジョブを動かしてみた




以上社内向けメモでした。
save!メソッド

フリマアプリを作成中、キーは取得できているのにデータが保存されない原因が分からなかった。メンターさんに質問したところ原因を探る方法を教えてくれたのでメモ。

# save/save!メソッドとは
データを保存するためのメソッド。

### saveメソッド
saveメソッドは、保存に成功したらtrueを、保存に失敗(バリデーションに失敗)したらfalseを返す。

### save!メソッド
save!メソッドは、保存に成功したらtrueを返すが、保存に失敗(バリデーションに失敗)したら例外が発生します。だから、保存できなかった場合の処理はrescue節で行う必要がある。


■私の場合、`binding.pry`を使用したところ、キーは取得できていたので、`@user.save!`を使って原因を探った。
↓保存できなかった時の記述

```
[8] pry(#<Users::RegistrationsController>)> @user.save!
   (0.2ms)  BEGIN
  ↳ (pry):12
  User Exists (13.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY '' LIMIT 1
  ↳ (pry):12
   (1.1ms)  ROLLBACK
  ↳ (pry):12
ActiveRecord::RecordInvalid: Validation failed: Email can't be blank, Email is invalid, Password can't be blank, Nickname can't be blank, Encrypted password can't be blank, Encrypted password is too short (minimum is 7 characters), Encrypted password is invalid, Familyname kanji can't be blank, Familyname kanji is invalid, Firstname kanji can't be blank, Firstname kanji is invalid, Familyname kana can't be blank, Familyname kana is invalid, Firstname kana can't be blank, Firstname kana is invalid, Birthday can't be blank
from /Users/httr_htm/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/validations.rb:80:in `raise_validation_error'
```
`ActiveRecord::RecordInvalid`以降に原因が書いている。


結果、正規表現の記述が原因だった。emailを`aa@aa.aa`の形式で設定していたのに、`aa@aa`と入力していたことにより、バリデーションで引っかかっていた。エラー表示を設定していたらもっと早く解決できたかもしれない。


[Rubular](https://rubular.com/)という正規表現をチェックするサイトを紹介してもらった。今後、活用していきたい。


#### 参照
[Railsのsave!メソッドの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/22082)
[Python] データフレームをリストにすると便利かもね

４．多数のデータフレームをリストにして扱う方法を試してみた。一般的な知識なのかもしれませんが、紹介されたものが無かったのでメモしておきます。
・通常はそれぞれに名前をつけて作業しますね。

    import pandas as pd
    df1 = ...
    df2 = ...
    df3 = ...
    df1,df2,df3を使った処理

多数のデータフレームを繰り返し処理するのは大変。そこで、リストの登場。繰り返し処理以外でも便利に使えますね。私は複数のデータフレームを読み込んで、マッピングする際などに使用しています。

    import pandas as pd
    df = []
    for i in range(3): 
        df.append(...)
    for i in range(3):
        df[i] = ...

初心者です。監修、よろしくお願いします。
クリエイティブコモンズ（Creative Commons　略称: CC）

応用情報技術者平成30年秋期 午前問78

クリエイティブコモンズの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9d078f26-22e9-990c-21f7-08d3a139fdd5.png)


１、クリエイティブコモンズは、　英: Creative Commons、略称: CC）
クリエイティブ・コモンズ・ライセンス（CCライセンス）を提供している国際的非営利組織とそのプロジェクトの総称です。

CCライセンスとはインターネット時代のための新しい著作権ルールで、作品を公開する作者が「この条件を守れば私の作品を自由に使って構いません。」という意思表示をするためのツールです。CCライセンスを利用することで、作者は著作権を保持したまま作品を自由に流通させることができ、受け手はライセンス条件の範囲内で再配布やリミックスなどをすることができます。

２、著作権法31条の規定
公共の図書館などにおいては，営利を目的としない場合に限り，一定の条件の下で著作物を複製し，利用者に提供することが許されるという規定

３、著作権法2条1項1号の定義
著作物とは，思想や感情を創作的に表現したものであり，文芸，学術，美術又は音楽の領域に属すものであるという定義

４、著作権法51条の規定
著作物の保護期間は，著作者の生存期間，及び著作者の死後少なくとも50年間とし，それ以降，著作権は消滅するという考え方
※2018年12月30日に改正著作権法が施行され、映画以外の著作物についての保護期間が50年から70年に延長されました（映画は元から70年）。2019年現在における著作権の原則的保護期間は、著作物の作成時点から著作者が生存している間及び著作者の死後70年となります。

参照：
https://www.ap-siken.com/kakomon/30_aki/q78.html

クリエイティブ・コモンズ
https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%A2%E3%83%B3%E3%82%BA#:~:text=%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%A2%E3%83%B3%E3%82%BA%EF%BC%88%E8%8B%B1%3A%20Creative,%E5%96%B6%E5%88%A9%E5%9B%A3%E4%BD%93%E3%81%AE%E5%90%8D%E7%A7%B0%E3%81%A7
Railsのログ出力をカスタマイズする

RailsのログにプロセスIDを出すようにしたかったのでログ出力の変更方法を調べました。

## 独自フォーマッターの作成
標準ライブラリのフォーマッター(Logger::Formatter)を継承してcallメソッドを上書きします。

```ruby:log_formatter.rb
class Logger::CustomFormatter < Logger::Formatter
  cattr_accessor(:datetime_format) { "%Y/%m/%d %H:%M:%S" }

  def call(severity, timestamp, _progname, msg)
    "[#{timestamp.strftime(datetime_format)}.#{format('%06d', timestamp.usec)}] (pid=#{$PROCESS_ID}) #{severity} -- : #{msg.class == String ? msg : msg.inspect}\n"
  end
end

```
今回は通常のログに加えて`(pid=#{$PROCESS_ID})`を追加しました。
[Logger::Formatter](https://docs.ruby-lang.org/ja/latest/class/Logger=3a=3aFormatter.html)


## ロガーの設定
Railsのロガーの設定で上記の独自フォーマッターを使うようにします。
下記のように、デフォルトの設定ではなくconfig.loggerに独自のロガーを設定した場合、設定したロガーに直接フォーマッターを設定しないといけないようです。

```ruby:application.rb
require_relative 'log_formatter.rb'

class Application < Rails::Application
...
config.logger = Logger.new
# config.log_formatter = CustomFormatter.new これは効かない
config.logger.formatter = CustomFormatter.new
...
end
```

デフォルトのロガーを使う場合はlog_formatterで独自フォーマットが反映されます。

```ruby:application.rb
require_relative 'log_formatter.rb'

class Application < Rails::Application
...
config.log_formatter = CustomFormatter.new
...
end
```

サーバーを起動してログを確認してみます。

```
[2020/08/27 15:04:53.914040] (pid=14046) INFO -- : Completed 200 OK in 531ms (Views: 26.0ms | ActiveRecord: 79.9ms)
```

プロセスIDがログに出力されました。

## 参考
https://guides.rubyonrails.org/configuring.html
Nuxt.jsで日時文字列またはDate型をフォーマットして表示

日時を好きな形式にフォーマットして表示したいとき、変換とか色々めんどうですよね。
そんな時に便利なライブラリが [dateformat](https://www.npmjs.com/package/dateformat) です。
今回 `Nuxt.js` のプロジェクトで使用しました。

# dateformat を利用可能にする

まずはインストールします。

```bash
npm i -S dateformat
```

どこからでも `dateformat` の関数を利用できるようにするため、 `plugins` ディレクトリ内に `dateformat.js` というファイルを下記内容で作成します。
injectを利用して、importしなくても利用できるようにしています。

```javascript:plugins/dateformat.js
const dateformat = (date, format) => {
  const dateformat = require('dateformat');
  return dateformat(date, format);
};

export default ({}, inject) => {
  inject('dateformat', dateformat);
};
```

続いて、 `nuxt.config.js` に設定を追加します。

```javascript:nuxt.config.js
  plugins: [
    '@/plugins/dateformat'
  ],
```

以上で準備は完了しました。

# 使用方法

下記のように呼び出しを行います。

```vue:index.vue
<script>
export default {
  methods: {
    
    // 日時文字列から変換（dateStringが日時文字列）
    hoge(dateString) {
      return this.$dateformat(new Date(dateString), 'yyyy年mm月dd日 HH:MM');
    },

    // Date型から変換
    fuga() {
      return this.$dateformat(new Date(), 'yyyy年mm月dd日 HH:MM');
    }
  }
}
</script>
```

簡単ですね！
DirectX12の CreateGraphicsPipelineState で E_INVALIDARG One or more arguments are invalid.が出た話

##解決した方法
プロジェクトファイルがある同じフォルダ内に
**dxil.dll**を入れたら直った。
このファイルは通常 
C:\Program Files (x86)\Windows Kits\10\Redist\D3D\x64
この中にあります。
同様に**dxcompiler.dll**このファイルも一緒に入れるとシェーダーのコンパイルでエラーになってる人は幸せになれるかもしれません。(同じ階層にあります)

コードはこんな感じです。

```C++
    // インプットレイアウト
    D3D12_INPUT_ELEMENT_DESC inputElementDesc[] = {
      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, pos), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA},
      { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT,0, offsetof(Vertex,normal), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA},
      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex,uv), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA}
    };

    // パイプラインステートオブジェクトの生成.
    D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc{};
    // シェーダーのセット
    psoDesc.VS = CD3DX12_SHADER_BYTECODE(m_Vs.Get());
    psoDesc.PS = CD3DX12_SHADER_BYTECODE(m_PsOpaque.Get());
    // ブレンドステート設定
    psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
    // ラスタライザーステート
    psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
    // 出力先は1ターゲット
    psoDesc.NumRenderTargets = 1;
    psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
    // デプスバッファのフォーマットを設定
    psoDesc.DSVFormat = DXGI_FORMAT_D32_FLOAT;
    psoDesc.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT);
    psoDesc.InputLayout = { inputElementDesc, _countof(inputElementDesc) };

    // ルートシグネチャのセット
    psoDesc.pRootSignature = m_RootSignature.Get();
    psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
    // マルチサンプル設定
    psoDesc.SampleDesc = { 1,0 };
    psoDesc.SampleMask = UINT_MAX; // これを忘れると絵が出ない＆警告も出ないので注意.

    ComPtr<ID3D12PipelineState> pipeline;
    HRESULT hr;
    hr = m_Device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pipeline));
    if (FAILED(hr))
    {
        throw std::runtime_error("CreateGraphicsPipelineState failed");
    }
    return pipeline;

```
線形計画法

応用情報技術者平成30年秋期 午前問76

工場Xでは，ある原料から3種類の製品A，B及びCを生産している。各製品の単位量当たりの製造時間と原料所要量及び利益額は表に示すとおりである。この工場の月間合計製造時間は最大240時間であり，投入可能な原料は月間150kgである。このとき，製品A，B及びCをそれぞれどれだけ作ると最も高い利益が得られるかを知りたい。この問題を解くのに適切な手法はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9fb61d2e-f2c7-7f75-0682-5bd9bb456ee7.png)


１、線形計画法は、
1次式を満たす変数の値の中で式を最大化または最小化する値を求める方法です。
在庫としてもつ原材料を使用して最大の利益を得るための販売量や、機械の稼働時間を最大限に生かして製造する製品など、限りある資源を最大限に活用したい場合にその組合せを得るために用いられます。

計算方法は、下記を参照しましょう。
線形計画法超入門：
https://qiita.com/Dason08/items/e1bafb9ddc766d1c8fd0


２、移動平均法は、
時系列のデータを平滑化することで売上予測などに用いられる手法です。

例：
移動平均法は、在庫に変化があるたびに平均単価を算出して売上原価とし、棚卸資産の評価額として取り扱うための計算法です。

例えば、期首が4月1日で、以後毎月頭に仕入れを行うケースを考えてみます。

4月1日（期首）……60個、単価200円（原価12,000円）
5月1日（仕入）……40個、単価240円（原価9,600円）
6月1日（仕入）……10個、単価260円（原価2,600円）

この場合、5月1日に移動平均法による計算を行います。計算式は以下のようになります。

（5月仕入額9,600円＋在庫12,000円）÷（仕入個数40個＋在庫個数60個）＝216円


３、最小二乗法は、
散布図にプロットされた複数の点を基に数学的に回帰直線を導く方法です

例：最小二乗法（直線）の簡単な説明
最小二乗法とは，データの組 (xi,yi) が多数与えられたときに，x と y の関係を表すもっともらしい関数 y=f(x) を求める方法です。

最も基本的な例（平面における直線フィッティング）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7c7a96b3-cb1c-0d5f-843e-6a6fa4a67878.png)



４、定量発注法は、
在庫を補充するための発注方式の一つです。

材料や部品を購入先に発注する場合、大きく２つの発注方式があります。
購入する材料や部品の特徴によって、発注のやり方を考える必要があります。
　・定量発注方式
　・定期発注方式


・定量発注方式とは、在庫量が前もって定められた水準（発注点）まで下がったとき、一定量（発注量）を発注する方式です。

・定期発注方式とは、あらかじめ、一定の期間、例えば、週に１回や月に１回のように、発注する間隔を定めておき、その都度現在の在庫量や需要量に応じて発注量を計算して発注する方式です。



参照：
https://www.fe-siken.com/kakomon/16_aki/q78.html

移動平均法
https://www.daikodenshi.jp/daiko-plus/production-control/moving-average-method/#:~:text=%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87%E6%B3%95%E3%81%AF%E3%80%81%E5%9C%A8%E5%BA%AB,%E6%B1%82%E3%82%81%E3%82%8B%E9%9A%9B%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82

最小二乗法
https://mathtrain.jp/leastsquares

定量発注と定期発注法
https://www.sk-koubai.com/hachu/ha02_tigai.html
メモ用のテキストファイルの日付つけをコマンドで

# date >> memo.txt
テキストファイルをメモにしていると、書き込んだ日付を書き込んでおきたいことがよくある。

``` plaintext
  1 2020_08_28
  2 日経平均株価が一時600円以上値下がり
  3 
  4 2020_08_29
  5 ９月以降、XX社のOOさんがプロジェクトに参加するらしい    
```

でも、いちいちタスクバー等に表示されてる日付を見て、それを手で写すのはめんどくさい

なんでdateコマンドでファイル末に書き込んでしまう
それですぐVimでメモすればいい

```terminal
~$ date >> tmp.txt 
```
```
  1 2020_08_28                                                                                                                                                                                
  2 日経平均株価が一時600円以上値下がり
  3 
  4 2020_08_29
  5 ９月以降、XX社のOOさんがプロジェクトに参加するらしい
  6 Sat 29 Aug 2020 09:41:21 AM JST
                                                                                                                                                                                             
```

とりあえず、メモがいつの情報なのかはこれで楽に書き込める
日常で使えるLinuxコマンド
ROS講座119 カメラ画像の色を補正する

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 18.04 |
| ROS | Melodic |
| OpenCV | 3.2.0|

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
過去の記事で色相で物体を検出するという例を作りましたが、これはカメラで正しい色を取得できていることが前提です。しかしカメラで取得できる色はカメラの性能や照明の条件でも変わってしまいます。そこでカメラ（と環境）の色校正を簡易的に行う方法をここで説明します。
原理としては「基準となる色」の物をカメラで撮ってどういう色として写るのかを調べて、各色（赤、緑、青）のゲイン値を求めます。
今回は「基準となる色」としてカラーチェッカーというものを使用します。ちゃんとしたもの([X-rite ColorChecker Classic](https://www.xrite.co.jp/allproduct/color-management/image-video-photo-data/colorchecker-classic.html))が良いですがそこそこ高いのでAliexpressで似たようなものを注文しました。カラーチェッカーには色とその色がRGBでどのように写るべきかというデータがついています。

# ソースコード
[color_rectify_tool.py](https://github.com/project-srs/ros_lecture/blob/master/cam_lecture/scripts/color_rectify_tool.py)

* カメラ画像が`/image_raw`として出ていることが前提です。
* 起動するとopencv2で生成した画面が出現します。カラーチェッカーをカメラに写したららクリックをします。その後写っているカラーチェッカーの4隅をクリックすると24点の測定点を自動で計算します。もう一度計算すると結果をHTMLで吐き出します。

# 実行

```shell:ツールの実行
rosrun cam_lecture color_rectify_tool.py
```

![cam_rectify2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/5744d969-a22e-daa3-7caf-e67e081e5992.gif)

実行後には以下のような結果になりました。Gianが大きい=本来の色よりも強く写っていると指します。
赤が弱く、青が強く写ってます。典型的な蛍光灯の傾向です。

![cam_recrify_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/30c33a9a-4788-b04c-835f-fe5bed4147d6.png)

# コメント
* 今回は24個すべてのゲインを測定して中央値の12個の平均を採用しました。もし用途があるならばそれに対応する色を中心に補正情報を作るのが良いでしょう。
* 補正値が出たので、元画像の色をgainで割るor色判定の判定地にgainを掛けるなどして使います。

# 参考
* [テンプレートライブラリ](https://qiita.com/mima_ita/items/5405109b3b9e2db42332#html%E7%94%A8%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)
* [python16進数表示](https://www.it-swarm-ja.tech/ja/python/python%E3%81%A716%E9%80%B2%E6%95%B0%E3%82%92rgb%E5%80%A4%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/1052315732/)
* [ブラウザで表示する](https://hibiki-press.tech/python/webbrowser_module/1884)
* [color checker](https://jp.mathworks.com/matlabcentral/fileexchange/38236-color-checker-chart)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
Node.jsでモジュールが認識されなかった話

Windows環境でNode.jsとwsを用いたシグナリングサーバを運用したくて使い始めてみたのですが、wsが見つからないという旨のメッセージが出る。
node.jsを入れなおそうが、wsをグローバルインストールしようが改善しなかったのでいろいろ調べてみると、どうにもパスのせいらしい。
どこかで自動的にパスを通してくれると見ましたが、それはnodeそのもののパスだけでモジュールまでのパスは自分で通さないといけないようで......


結果としてはシステムの詳細設定からプロパティに飛び、環境変数のユーザー環境変数にNODE_PATHという名前で、**C:\Users\ユーザー名\AppData\Roaming\npm\node_modules**を追加するだけで動作した。
node上で見れるモジュールの参照先には既に指定されていたのでパスの問題ではないだろうと思い、package.jsonとかいろいろ見ていたのですがもっと基本的な部分でハマっていましたとさ。
【SwiftUI】ForEachで追加したviewを識別する方法

#1. やりたいこと
　１つの画面にForEachで複数のviewを追加する。
　この時、複数のviewを識別し、それぞれの状態に対応した処理を実行する。
#2. 具体例
　SNSのタイムラインで、複数の投稿をForEachでlistに追加（リスト上で１行となる）することを想定。
　ここで、返信（吹き出し記号）をタップすると、その色が赤に反転するようにしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335850/e905d59f-c6d4-1a61-1965-def2044942a1.png)

```swift
// TimelineCell.swift

import SwiftUI

struct TimeLineCell: View {

    var replies = [TimelinePost]()
    var elementCount: Int

    init(replies: [TimelinePost]) {
           self.replies = replies
           elementCount = replies.count
           prepFlags()
    }

    @State var isReplied: [Bool] = [Bool]()
   
    mutating func prepFlags(){
        var initIsReplied: [Bool] = [Bool]()
        for _ in 0..<elementCount {
            initIsReplied.append(false)
        }
        _isReplied = State(initialValue: initIsReplied)
    }
    
    func symbolColor(_ isActive: Bool) -> Color {
       if isActive {
           return Color.red
       } else {
           return Color.gray
       }
    }

    var body: some View {
       return VStack(alignment: .leading){
           ForEach(replies, id: \.self) {reply in
           
               HStack{
                   if self.replies.firstIndex(of: reply) != nil {
                       Image(systemName: "bubble.right")
                           .foregroundColor(self.symbolColor(self.isReplied[self.replies.firstIndex(of: reply)!]))
                           .onTapGesture {
                               if let index = self.replies.firstIndex(of: reply) {
                                   self.isReplied[index].toggle()
                               }
                            }
                   }
                   Text(String(reply.replyCount))
               }
           }
        }
   }

}
```

#3. 課題
（１）返信記号を行ごと（ForEachのインデックス毎）に識別する必要がある（datasourceであるrepliesに固定値として与えると、ForEachの中でletになるため、タップジェスチャーで色などを変更できない）
→ 「ForEach<Data, ID, Content> * Data : コレクション」を採用した場合に、どのようにインデックスを取得するか？

（２）返信記号のタップを受け付けるために、インデックス毎にフラグ（isReplied: [Bool]）を用意し、Stateプロトコルに準拠する
→ Stateプロトコルは、Computed Propertyにできないし、初期化もできないが、初期値として、どのように"false"をappendするか？
（参考）[@Stateを付けたプロパティは、イニシャライザの中で値を変更しても必ず無視されます。](https://ja.stackoverflow.com/questions/63943/state%E4%BB%98%E3%81%8D%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AE%E5%80%A4%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%AA%E3%82%8B)
#4. 解決策
（１）今回は、以下のパターンを採用。前提として、リストの並び替えや削除を実装しないので、リスト表示後にインデックスが変わることがない。

```swift
Foreach(array) { item in
    let index = array.firstIndex(of: item)
}
```
（参考）[Getting the index in ForEach](https://developer.apple.com/forums/thread/118361)

（２）上述の参考リンクにあるように、State.init(initialValue:)と言うイニシャライザで初期化する
「確定する」の命名

# 選択肢

### commit

データベース用語でコミット(=確定する)という用語があります。
個人的には本命馬。
ただ、データベースと関係ない箇所で使うと「commit？」ってなって、単に「遂行する」の意味と勘違いされる可能性もあります。

### confirm

良さそうですが、「確認する」という意味も強そうです。
「相手に聞くことで」確定させるというイメージがあります。

### fix

エンジニア的には「微修正する」の意味が強そうです。

### establish

なんか建ててないですか？

### decide

なんかキメてないですか？

### determine

Google検索で真っ先にコレが出たけど、マですか？

# 試しに書いてみた

```PHP
// ユーザが登録処理を確定させる

$user->commitRegistration()

$user->confirmRegistration()

$user->fixRegistration()

$user->establishRegistration()

$user->decideRegistration()

$user->determineRegistration()

// というか以下に変えろというのはごもっとも
$user->register()


// バッチスクリプトによりポイントが確定する

$batch_script->commitPoint()

$batch_script->confirmPoint()

$batch_script->fixPoint()

$batch_script->establishPoint()

$batch_script->decidePoint()

$batch_script->determinePoint()
```

っていう記事を書きましたが、むしろ教えて下さい。。。
コメントお待ちしております。
WinMerge 最新版へのリンク

# WinMerge 最新版へのリンク

ググってもすぐに見つからないことが多いので自分用のメモ

## 最新版へのリンク

https://github.com/WinMerge/winmerge/releases/latest

## appveyor の CI リンク

https://ci.appveyor.com/project/sdottaka/winmerge
debian-linuxではPath問題は起きない

mac版/usr/libexec/path_helperがシステムを異常動作に導く #Mac - Qiita
https://qiita.com/shiro_usagi/items/a35f445e1c8d2293d123

一つ前の記事と同等の環境を作成しLinuxで試してみた。
macと同じPATH設定にしてある。

```
~ $ zsh --version
zsh 5.7.1 (x86_64-debian-linux-gnu)
~ $ echo $PATH   
/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/zzzzzzzz/bin
~ $ vim

/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/zzzzzzzzz/bin

続けるにはENTERを押すかコマンドを入力してください
```

vimは8.1

--
【Ruby】結局`!!`って何のために使うの？

####はじめに

ぐぐってもピンとこない、、、なくなくないみたいな日本語使ってる違和感がある、、、

という事で調べて見た僕なりの解釈で書きます

####`!`は論理演算子

論理演算子とはtrueかfalseを返す演算子の事

論理演算子には他には`and`や`or`等もある

`!`はオブジェクトを評価して

nilかfalseならtrueを返す

trueならfalseを返す

それが`!`

つまり否定の論理演算子
>例

>```
irb(main):018:0> !nil
=> true
irb(main):019:0> !false
=> true
irb(main):020:0> !true
=> false
```

####~~`!!`は否定の否定の論理演算子~~

*@scivola様より`!!`という単体の論理演算子がるあけわけではないとコメントいただきました上記は適切な表現では無いと思われますので修正させていただきます、ありがとうございます！*

####`!!`とは

`!`を二回繰り返す事により1回目の`!`で帰ってきたtrueかfalseをもう１回否定しています。

nilかfalseならfalseを返す

trueならtureを返す

つまり否定の否定をしている事になります
>例

>```
irb(main):025:0> !!false
=> false
irb(main):026:0> !!nil
=> false
irb(main):027:0> !!true
=> true
```


、、、とまぁこれだけだと余計になんのために使うのかわからないんですよね

なくなくない？みたいな日本語使ってる違和感と言いますか、、、

####答えは、論理演算子である。という事でした

論理演算子は評価して論理値オブジェクト（true,false）を返す

当然ですが、全てのオブジェクトの返り値が必ずしも論理値オブジェクトになるわけではありません。


```
irb(main):001:0> a = "あ"
=> "あ"
irb(main):002:0> a
=> "あ"
```
ですので、trueかfalseが欲しい時に`!!`を使わずに書くとこんな感じになります

```
irb(main):028:0> a = "あ"
=> "あ"
irb(main):029:0> a ? true : false
=> true
```

でも`!!` を使うと

```
irb(main):031:0> a = "あ"
=> "あ"
irb(main):032:0> !!a
=> true
```

これで二文字でかけちゃうんですね！
すごいスマート！！

これが僕の考えるメリットでした〜以上です！
Nuxt.js（vue.js）でhtml-loaderを使ってSVGファイルをインラインで呼びだしたらscopedが使えなかったメモ

CSSでstrokeなどの色味を変えるためにSVGをHTMLのコードとしてhtml-loaderを使って下記のように呼び出しました。

```vuejs
<template>
  <div class="hoge">
    <span v-html="icon" class="icon" />
  </div>
</template>
<script>
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      icon: require('!html-loader!sample.inline.svg'),
    };
  },
})
</script>
<style lang="scss" scoped>
.hoge {
  svg {
    width: 20px;
    height: 20px;
    stroke: #ccc;
  }
}
</style>
```

これでアイコンの色味が#cccになるだろうと思ったところ、スタイルが一向にあたりません・・・
なぜだと思いコードの中身を見たところ、html-loaderで呼び出したSVGにはscopedでつくはずの`data-v-hoge` が付与されていないことが判明。

![b549e0600e60cb1c61cd47b83d38817e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177417/e02113c4-0e3a-bb1f-f609-a0edb3ce6d45.png)

ひとまず下記のようにscopedつくつかないを分けて書くしかなさそうです。
html-loaderでも`data-v-hoge` がつくようにできるのかはまだ調査しないと分からない状態なので、何か情報を持ってる方いたら教えていただけると助かります。

```vuejs

<style lang="scss" scoped>
.hoge {
～そのほかの設定～
}
</style>
<style lang="scss">
.hoge {
  svg {
    width: 20px;
    height: 20px;
    stroke: #ccc;
  }
}
</style>
```

html-loader以外にもSVGをコンポーネントとして呼び出せるものがあるみたいなので、試してみようかと思います。
https://github.com/visualfanatic/vue-svg-loader

【追記】
下記で試してみた内容投稿しました。
[Nuxt.jsでvue-svg-loaderつかってインラインSVGを呼び出したら、SVGの中身が全然違うものになって困った件と暫定解決方法](https://qiita.com/judah/items/ff46eb615ef5b6a402f5)
ララベルで背景画像の固定

###背景画像の固定
背景画像を固定してあげると文字などの要素だけが動く感じになるのでレイアウトとしてもいい感じになるんじゃないかと思います！
###背景画像の固定のコード
背景画像の固定をするためには`background-attachment: fixed;`を使うと固定することができますが問題点があります
それはアイフォンではうまく動作しないことです
PCではうまく反映されてましたがアイフォンで確認したところ反映されてませんでした
なので今回はアイフォンでも対応できる方を紹介したいと思います

```app.blade.php
<style>
        body::before {
        content: "";
        background:url({{ asset('images/image02.jpg') }}) no-repeat center center;
        background-size: cover;
        display: block;
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        z-index: -1;
        transform: translateZ(0);
        }
</style>
```
・`images/image02.jpg`は自分の画像に合わせて変えてくださいね
###まとめ
うまくできましたでしょうか？
PCの方で確認をしたらアイフォンなどの方でも確認してみてくださいね！
Microchipのプログラミングサービス利用メモ(量産向け)

Microchipの量産用FWを書いてチップを出荷してくれるサービスが便利だったのでメモ。
組み立て工場でファームウェア書くのは手間だし、工場の品質によってはミスる可能性も高そうなので、チップベンダーがこういうことをやってくれると助かる。しかも結構安い。
本番では、 PIC16F18313-I/SNを用い、基板製造はSeeed Studioの予定なので、このチップをMicrochipからSeeedに直送し、実装してもらい、おわったら日本の組み立て工場に送る予定。


### 手順メモ
MPLAB IDEで、Main Project をビルドし、`abc.production.hex`を出力する。
IDEのOutputにロケーションが出る。

```

BUILD SUCCESSFUL (total time: 506ms)
Loading code from /Users/tatsuhiroiida/MPLABXProjects/arom2.X/dist/default/production/arom2.X.production.hex...
Loading completed
```

このHexには名前をつけておくとよさそう。GithubのTag名と合わせておくとか。そして、次回ビルドで上書きされないようにどこかに保存しておきます。

あと、このバイナリのチェックサムが後ほど要求されるので、ここでは、MPLAB X IPEを起動して、一度書き込みをしてその結果からチェックサムを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/c006e5ee-de56-41a5-3545-0c0750519b3d.png)


hex Fileをセットすれば、自動計算される。


Microchipのプログラミングセンターで、 `コードのアップロード/プログラムの作成` を選ぶ。
https://www.microchipdirect.com/programming

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/fc2fb624-bcdd-2190-8b50-bc012d73c7ce.png)





部品番号を任意に決められるので、その情報をSeeedに渡すBOMに記載しておく。
マーキングやラベルも選べる。が、当然追加料金がかかる。インクドットマーキングは安いので、こちらを選んだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/60dffa1d-eafc-6688-a4bd-f07daea6cbd8.png)



ですごいのは、検証発注とやると、FWを焼いたチップを数個試しに送ってくれる。しかも無料！
数日でタイから届いた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/51a8c8b1-8238-e262-379d-319f5dcc031b.png)

動作確認したが特に問題はなし。（この時点ではマーキングはされていなかった）

これで検証が完了したら、検証サンプルを承認とすればいよいよ量産部品の作成が開始される。（一旦ここまで）