OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】CSVファイル・アップロードのバリデーションが通らなかった原因

画面からCSVアイルのアップロードをする機能を作ることになり、何の躓きも無いまま実装したので、ちょっくら実行してみるかと動作確認したところ、

**バリデーションが通らない。。**

軽くハマったので、解決までの流れを書いておきます。

# 環境

今回はあまり環境とかバージョンは関係ないけれど

- Laravel5.4

# 最初に実装した内容（バリデーションが通らない）

## 画面側

```input.blade.php
<form action="/upload/csv" method="post" >
    {{ csrf_field() }}

    <div class="form-group">
        {{ Form::label('csv_file', 'CSVファイル', ['class' => 'col-sm label-required']) }}
        <div class="col-sm">
            <label class="custom-file">
                <input type="file" accept=".csv" class="custom-file-input" name="csv_file" id="csv_file">
                <label class="custom-file-label custom-file-control" for="csv_file" data-browse="参照">ファイル選択...</label>
            </label>
            @component('form_error', ['errors' => $errors, 'field' => 'csv_file'])@endcomponent
        </div>
    </div>

    <div class="col-sm">
        <button type="form" class="btn btn-info">送信</button>
    </div>
</form>
```

## フォームリクエスト

```CsvUploadRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CsvUploadRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'csv_file' => 'required|file|mimes:csv',
        ];
    }

    public function messages()
    {
        return [
            'csv_file.file' => 'CSVファイルを選択してください'
        ];
    }

    public function attributes()
    {
        return [
            'csv_file' => 'CSVファイル',
        ];
    }
}
```

## 動かしてみる

CSVファイルを選択して、送信ボタンをポチっと。

![Screenshot_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510032/67046ede-d6b5-8272-3731-fea5b609bb33.png)


何故だー。。


# 原因と修正

## 原因その１

最初のメッセージ見ると、`file`ルールで引っかかっている？そもそもアップロードできていない？

HTMLとかよくわかんないけど、記憶の片隅から「ファイルをアップロードする時って`<form>`タグの属性でなんか設定しなきゃいけなかったような気が」と思い出す。

・・・・・・。

`enctype="multipart/form-data"`だったかな？

ということで、修正しました。

### 修正内容

修正箇所だけ抜粋

```input.blade.php
<form action="/upload/csv" method="post" enctype="multipart/form-data">

〜〜省略〜〜

</form>
```

## 原因その２

二つ目のエラーメッセージを見ると拡張子(.csv)が認識されていない？
この仕組みは深く追ってないですが、どうやら`mimes`ルールの引数には`txt`も渡さないといけないようです。
そうすると「.txt」ファイルも許可することになりそうだけど、今回は妥協しました。

### 修正内容

修正箇所だけ抜粋

```CsvUploadRequest.php
〜〜省略〜〜

    public function rules()
    {
        return [
            'csv_file' => 'required|file|mimes:csv,txt',
        ];
    }

〜〜省略〜〜
```

# 参考記事

- <a href="https://qiita.com/shioharu_/items/8d61dc3d81c87396dc8f" target="_blank">LaravelでCSVファイルの中身のバリデーション</a>
Java8 Streamの重複チェック (Collectorを使ってきれいに書く)

重複要素を数える方法として、StreamをListにして長さを取得して、さらにSetに入れて長さを比較したりする方法があるが、あまりStream APIっぽくなくうれしくない。
Collectorを作ることでいい感じで書ける。

```java
static<T> Collector<T,?,Boolean> uniqueElements(){
    Set<T> set = new HashSet<>();
    return Collectors.reducing(true, set::add, Boolean::logicalAnd);
}
```
並列ストリームを扱う時はThread safeなCollectionを使うとよいです。

実際の使い方は以下の形; 

```java
@Test
public void testUniqueElements(){
    assertTrue(Stream.of("a","b","c").collect(uniqueElements()));
    assertFalse(Stream.of("a","b","b").collect(uniqueElements()));
}
static<T> Collector<T,?,Boolean> uniqueElements(){
    Set<T> set = new HashSet<>();
    return Collectors.reducing(true, set::add, Boolean::logicalAnd);
}
```

以上です。
[swift]文字列が半角数字かどうかを判定する

## コード

文字列チェックの記事は色々あるのですが、半角と全角がチェックできていなかったりと
正解はなんなのだ？？？と考えてしまったので記します！


```ruby:swift
import UIKit

class ViewController: UIViewController {
    
    let hanMoji: String = "01234"
    let zenMoji: String = "０１２３４"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if hanMoji.isAlphanumeric() {
            print("hanMojiは半角数字")
        }else{
            print("hanMojiは全角数字")
        }
        
        if zenMoji.isAlphanumeric() {
            print("zenMojiは半角数字")
        }else{
            print("zenMojiは全角数字")
        }
    }
}

extension String {
    // 半角数字の判定
    func isAlphanumeric() -> Bool {
        return self.range(of: "[^0-9]+", options: .regularExpression) == nil && self != ""
    }
}
```

```ruby:出力結果
hanMojiは半角数字
zenMojiは全角数字
```

正規表現ってなかなか慣れないんですよね・・・
アノテーションツール labelme を使ってsemantic segmentation用の学習データを作る

#目的
U-netでsemantic segmentationをするために学習データを作る。
私はubuntu18を使っているのですが、windowsで作業する人もいるので両方で環境構築しました。

また、結局使わないことになりましたが、webベースのsemantic segmentation editorもインストールして使ってみたので、そのインストール方法もおまけで末尾に

#環境
windows10
Gforce 1050ti
メモリ8GB (この環境でlabelmeを使うと度々固まるので増設します…）


ubuntu18.04
Gforce 1080ti
メモリ 8GB×2

#lablmeのインストール

[github] https://github.com/wkentaro/labelme
基本このInstallation通りにやりました。

#windows

anacondaが必要なのでpython3.7verをインストールしておきます。
[Anaconda] https://www.anaconda.com/distribution/
環境PATHは推奨されてないけどチェックしておいたほうが便利

コマンドプロンプトかPowershellを開いて以下のコマンド

```
conda create --name=labelme python=3.6
pip install labelme
conda install pillow=4.0.0
```

おわり。

後はlabelmeとコマンドを打てば起動します。

```
labelme
```

#ubuntu18.04

私のubuntuちゃんにはpython2系と3系の両方があるので、python3でインストールします。

```
sudo apt-get install python3-pyqt5  # PyQt5
sudo pip3 install labelme
```

おわり。

このコマンドでlabelmeのGUIが起動します。

```
labelme
```

ラベル名を一括で設定する方法は分かりませんでした。
どのファイル編集すればいいんだろ？

囲い終わるとポップアップでラベルの入力画面が出てくるので、そこでラベル名を入力できます。
1度入力すれば記憶され、次からはそれを選べるようになります。

いっぱいラベルがある場合は面倒かもしれません・・・


#簡単すぎて書くまでもなかった

のでsemantic segmentation editorのインストールについて

#semantic segmentation editorのインストール

こちらはLinuxかOSXのみ対応のweb上でアノテーションできるツールです。
ただ社外秘のデータなどを扱う場合は、サーバーを立てるかした方がよいかもしれません。

[gituhub] https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor


以下のコマンドでMeteorをインストール

```
curl https://install.meteor.com/ | sh
```
するとこんな形で返ってきます。途中パスワードを求められます。

``` 
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7784    0  7784    0     0   8978      0 --:--:-- --:--:-- --:--:--  8978
Downloading Meteor distribution
######################################################################## 100.0%

Meteor 1.8.1 has been installed in your home directory (~/.meteor).
Writing a launcher script to /usr/local/bin/meteor for your convenience.
This may prompt for your password.
[sudo] okubo18 のパスワード: 

To get started fast:

  $ meteor create ~/my_cool_app
  $ cd ~/my_cool_app
  $ meteor

Or see the docs at:

  docs.meteor.com

```

次にsemantic-segmentation-editorのソースコードをDLして解凍しておきます。
https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor/releases
DLしたディレクトリでアプリケーションを起動。

```
tar -zxvf semantic-segmentation-editor-1.1.4.tar.gz 
cd semantic-segmentation-editor-1.1.4
meteor npm install
meteor npm start
```
ここで結構時間がかかりました。
**http://localhost:3000**にアクセスするとtar.gzファイルと一緒にDLされたサンプルファイルのアノテーションができるようになっています。



#settings.json

これを編集すれば参照するディレクトリやラベルの色、名前が変更できます。



#おわりに

最終的にlabelmeを選んだ理由は、

- UIがシンプルで使いやすそう
- web版じゃない（機密データがあるので）
- 出力が.jsonファイルだけど.pngに変換する機能がある


U-netの学習には、教師データとしてpngの画像が必要だったので、1番下は重要ポイントでした。
semantic segmentation editorは自動でpng画像は保存されるものの、画像のヘッダーを調べると、アノテーション情報が含まれて無さそうだったが微妙ポイントでした。
.jsonファイルとセットで使わないといけないのかな？
でも、肝心の.jsonファイルは自動で保存されない仕様になっているっぽく、わざわざ表示させてコピペしなきゃいけない感じ。

設定を変えれば色々できるかもですが、面倒なのでやめました。
Docker Compose セットアップ

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

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！

今回の記事では、「Docker Compose セットアップ」についてまとめてみました。



#Dockerとは
まずDockerとは何かについて説明していきたいと思います。
Dockerとは、コンテナ型の仮想環境を作成・配布・実行するためのプラットフォームです。
Dockerでは単一のOS上で複数のコンテナを実行することができます。
そのためVirtualBoxなどの仮想マシンと比較して、より軽量で高速に起動・停止が可能となります。
例えばUbuntuのDockerイメージと、CentOSのDockerイメージからそれぞれコンテナを生成するとします。
するとそれらの仮想環境は単一のOSで制御できるので、処理速度が早いまま２つの仮想環境を扱えるといった感じです。


#Docker Composeのセットアップ
まずはプロジェクトディレクトリを作成します(ここでは明示的に`~/Docker`としておきます)。
続いてプロジェクトディレクトリに`Dockerfile`を生成し、以下の内容をコピー&ペーストします。

```shell:~/Docker
$ cd Docker
$ touch Dockerfile
$ vim Dockerfile
```

```Dockerfile:~/Docker/Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

次に`requirements.txt`をプロジェクト内に生成し、以下の内容をコピー&ペーストします。

```shell:~/Docker
$ touch requirements.txt
$ vim Dockerfile
```

```txt:~/Docker/requirements.txt
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
```

続いて`docker-compose.yml`を生成し、以下の内容をコピー&ペーストします。

```shell:~/Docker
$ touch docker-compose.yml
$ vim docker-compose.yml
```

```yml:~/Docker/docker-compose.yml
version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

次にDjangoプロジェクトを作成し、所有権の変更を行います。

```shell:~/Docker
$ sudo docker-compose run web django-admin startproject composeexample .
$ sudo chown -R $USER:$USER .
```

またDATABASEへの接続を以下の設定で行います。

```python:~/Docker/composeexample/settings.py
# DATABASEの部分を以下のように変更。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```

あとは以下のコマンドを実行し、ブラウザで http://localhost:8000 にアクセスします。
Welcomeページが表示されていれば成功です。

```shell:~/Docker
$ docker-compose up

# サービスの終了。
$ docker-compose down
```



# まとめ
今回はDjango Composeのセットアップについてまとめてみました。
参考URL: https://docs.docker.com/compose/django/

わからない専門用語があった場合は、その都度ネットで検索すると。より理解が深まるかと思います。
【C#】CSV 出力時にシングルクォーテーションを含める

業務で必要だったので調べまくりました。
今のところ、日本語記事がないっぽかったので、書いてみます。
[CsvHelper](https://joshclose.github.io/CsvHelper/) 使ったやり方です。使わない場合は自分で調べてくださいm(_ _)m

## 通常パターン
```Program.cs
public class Program
{
    public void Run()
    {
        var csvData = ...; // Csv のデータ

        using (var ms = new MemoryStream())
        {
            using (var sw = StreamWriter(ms, Encoding.GetEncoding(932)))
            using (var csv = new CsvWriter(sw))
            {
                csv.Configuration.HasHeaderRecord = false;
                csv.WriteRecords(csvData);
                sw.Flush();                   
            }
        }
    }
}
```

```Person.cs
public class Person
{
    public string Name { get; set; }
    public string Age { get; set; } = string.Enpty;
}
```
こんなデータを入れてあげると

|Name | Age|
|---|---|
|どいつま | | 
|やざわにこ | 18


出力としてはこうなるはず。
> どいつま,
> やざわにこ,18

通常はクォーテーションで囲われません。


## 強制的にクォーテーションで囲う
Mapping とかせずに、 `CsvWriter` の `Configuration` 設定で簡単に囲うことができます。

```cs

using (var ms = new MemoryStream())
{
    using (var sw = StreamWriter(ms, Encoding.GetEncoding(932)))
    using (var csv = new CsvWriter(sw))
    {
        csv.Configuration.HasHeaderRecord = false;
        csv.Configuration.ShouldQuote = (s, context) => true;
        csv.WriteRecords(csvData);
        sw.Flush();                   
    }
}
```
この一文を追記してあげればOKです。
`csv.Configuration.ShouldQuote = (s, context) => true;`

ただし、このままの出力だと
> "どいつま",""
> "やざわにこ","18"

デフォルトがダブルクォーテーション設定になっています。

```cs

using (var ms = new MemoryStream())
{
    using (var sw = StreamWriter(ms, Encoding.GetEncoding(932)))
    using (var csv = new CsvWriter(sw))
    {
        csv.Configuration.HasHeaderRecord = false;
        csv.Configuration.ShouldQuote = (s, context) => true;
        csv.Configuration.Quote = '\'';
        csv.WriteRecords(csvData);
        sw.Flush();                   
    }
}
```
`Ouote` で囲う文字を指定してあげることができます。
多分囲う文字は、1文字しか指定できなかった…はず。(違ってたらごめんなさい)

`Configuration` が結構幅広く設定できるようでした。
区切り文字とかも、`Delimiter` で変更可能なので、わざわざ Mapping しなくても使えそうで、CsvHelper 汎用性高いなって思いました。


参考：https://github.com/JoshClose/CsvHelper/issues/1187
Flask環境　個人的メモ

# 概要

これは完全感想なので、誤った情報が含まれます。日本語があじゃぱーなのは気にしないでください。

# 一覧

- ローカル PC
- GCP
- NAS(Synology)


# ローカル PC

デバッグではローカルPCにて実行するのは前提。ネットワークが建屋内であれば、適当なPCを見繕って使用すると良い。

# GCP

基本的にGCE(Google Compute Engine)を使用することになる。GAE(Google App Engine)を使用すると、サーバレスになるが、Google StrageやGoogle Functionを組み合わせて使用するため、厳密に設計が必要となる。
この場合、以下のようなメリットがある。

- スケーラブルな運用
- サーバ管理が不要（これはサーバレスで組んだ場合であるが、管理不要なのはハードウェアでのみ。ソフトウェア的な管理は今まで通り必要）
- システムの停止が容易


# NAS

ローカルネットワークでは、ローカルPC同様の運用が可能。外部公開においてもいくつか方法が提供されているようである。サーバ管理は必要になり、スケーラブルな運用はできないが、運用方法はオンプレミスなサーバになるので、これについてはネット上に多くの情報があるので、特に問題はない。


# 全体所感

ローカルにしてもNASにしても管理が面倒なので、できるならばクラウドを利用する方が良い。ただ、メモリを多く使用するものであると、ランニングコストが高くなりがち。資金面での折り合いがつくのであれば、必ず使用するべきである。そうでない場合はサーバレスにしてやらないといけない。

ここで、GCPのみを引き合いに出しているのは、個人的にAWSを使いたくないからです。AWSはサービスの名前が分かりづらいのであまり採用したくない。
GitHub Actions で GitHub Package Registry にあるパッケージをインストールするときに認証エラーが出たときの解決方法 (npm)

GitHub Actions で GitHub Package Registry にあるパッケージを`npm install`するときに認証エラーが出たときの解決方法を２つまとめました。

`Unable to authenticate, need: Basic realm="GitHub Package Registry"`とかでずっこけてる人向けです。

# ざっくり

## setup-nodeを使ったやり方

これが一番簡単`NODE_AUTH_TOKEN`を忘れないように！

```yaml:workflow.yml
- name: Use Node.js v10
  uses: actions/setup-node@v1
  with:
    node-version: '10.x'
    registry-url: 'https://npm.pkg.github.com/'
    scope: '@owner'
- run: npm ci
  env:
    NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

## ~/.npmrc に直接書き込む

複数追加するときにはこれが良さそう（？）
`ubuntu`と`mac`はこれで大丈夫だけど`windows`はまた違う（コマンドプロンプトあんまり分からない）

```yaml:workflow.yml
- run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> ~/.npmrc
- run: echo "@owner1:registry=https://npm.pkg.github.com/" >> ~/.npmrc
- run: echo "@owner2:registry=https://npm.pkg.github.com/" >> ~/.npmrc
```

# 参考

- [Configuring NPM for use with GitHub Package Registry](https://help.github.com/en/articles/configuring-npm-for-use-with-github-package-registry)
- [actions/setup-node: Set up your GitHub Actions workflow with a specific version of node.js](https://github.com/actions/setup-node)
- [npm-auth-gpr/index.js at master · jgierer12/npm-auth-gpr](https://github.com/jgierer12/npm-auth-gpr/blob/master/index.js)
- [Installing npm packages from the GitHub package re... - GitHub Community Forum](https://github.community/t5/GitHub-Actions/Installing-npm-packages-from-the-GitHub-package-registry/td-p/30559)
date変換時の生成時の速度比較

性能の観点で見る場合
simpleDsteFormat
DateTimeFormatter
との差は、

使用する環境にもよって違いは出るが、
1万回ではそこまで差異が出ない模様、
大量のデータを使用する場合、差異が出てくる。

原因としては、
simpleDsteFormatはスレッドセーフではないので、毎回生成する。
DateTimeFormatterはスレッドセーフなので、毎回生成ずる必要がない。

単純に書くと、
simpleDsteFormatは呼び出されたら、毎回生成。
DateTimeFormatterは、一回のみの生成。

生成する時間が問題かなと。
g++ (GCC) が対応している言語規格(std値) を確認する方法

## サポートしている 言語規格一覧の確認

* [[GCC][C/C++] GCCのサポートしている規格を一覧表示 - Qiita](https://qiita.com/koara-local/items/8c1c6acfc35646f43e3f)

```sh
g++ -v --help 2>/dev/null | grep -E "^\s+\-std=.*$"
```

## 言語規格の指定方法

```sh
export CXXFLAGS="-std=gnu++98"
```


## ABI互換性

* [GCC のアップグレード - Gentoo Wiki](https://wiki.gentoo.org/wiki/Upgrading_GCC/ja)

### どの言語規格を指定すればよいか

> GCC(より具体的には、libstdc++)は、ABIの安定性を保証するために労を惜しみませんが、この保証はlibstdc++の中のC++のすべての部分に及ぶわけではありません。公式には、3.4以降のバージョンにおいて、GCC/libstdc++はC++98/C++03 ABIの安定性のみを保証し、それ以上ではありません。このことはC++11に依存するパッケージに関しては重大です。GCCはC++11 ABIの安定性の保証をバージョン5.1以降でのみ提供しています。これは、gccのバージョン(マイナーバージョンであっても)の変更(4.7.3 -> 4.7.4など)はC++11のコードからビルドされたバイナリにABI破壊をもたらす、ということを意味しています。 

ということから、C++98 か C++03 、そしてGCC5.1以降では C++11 を指定することも良いようですね。

江添さんがC++11について本を出されたのは久しぶりのメジャーアップデートだったからなのでしょう。 [本の虫: C++11参考書の公開：C++11の文法と機能](https://cpplover.blogspot.com/2013/10/c11c11.html)

* 昔は C++11 は C++0x と呼ばれていた。
* C++14はC++11のマイナーアップデート。
* C++17 は メジャーアップデート

なお C++11の文法と機能 について [C++11: Syntax and Feature](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#)で読むことができる。

### GCC 4.1 / GCC 5.1

> そう、C++です、ほとんどの非互換はC++ ABIの中で生じるためです。もしあなたがGCC 4.1やGCC 5.1へアップグレードした場合、おそらくABIの問題に直面することになるでしょう。

> これを防ぐには、GCC 3からGCC 4.1へのアップグレードの場合はlibstdc++.so.5に、GCC 4からGCC 5.1へのアップグレードの場合はlibstdc++.so.6に対して(略)
xml 作成方法


- gem 'builder' install
- データのブループ化


```ruby
require 'builder'

builder = Builder::XmlMarkup.new



builder.result do

  builder.profile do
    builder.name "test_name"
    builder.age 22
  end

  builder.settlement do
    builder.uid "uid-0802222-2222"
    builder.credit_type "visa"
    builder.last_3 "098"
  end
end

p builder

```


```
➜  test ruby sample.rb
<result><profile><name>test_name</name><age>22</age></profile><settlement><uid>uid-0802222-2222</uid><credit_type>visa</credit_type><last_3>098</last_3></settlement></result><inspect/>
```
Linux Mint を使っていたら動かなくなった：Disk full

# Linux Mint が通常起動できなくなった。

### 以下のような経緯があったが、結局　timeshift を削除した
たぶん linux mint にデフォルトで入るようだが、要注意だ。
単一の大きなディスクを使う場合は、有用で無害なのかも。

### 経緯
Disk　空き容量がなくなっていることに気づく。
色々調べると、
/timeshift
の下がでかい。
結局
/timeshift/snapshots/2019-...
ディレクトリを　rm -rf して、
無事復旧。

なお、調査途中で空きを確保するため
/swapfile
を消してしまったので、
これは
sudo fallocate -l 1G /swapfile
で復旧させた。

しかし、その後も timeshift がディスクを食らうのが止まらない。
通常外のマウントしている箇所を exclude すればよいとの記事もあったが、
　timeshift
　　settings
　　　Filters
　　　　Add Folders
で設定しても変化なし。

結局、 timeshift を削除した。

もともと、データは別パーティションに置いて別にバックアップしてるので、
これは要らない。
GoDaddyの中間証明書をインストールする（wmo.int用）

SSL証明書の話ってなんか検索が難しいんですよね。GoDaddyとやらの宣伝したいわけじゃないんですけどメモ。

# 動機
wget とか w3m で https://www.wmo.int/ にアクセスすると、
`ERROR: cannot verify www.wmo.int's certificate, issued by 'CN=Go Daddy Secure Certificate Authority - G2,OU=http://certs.godaddy.com/repository/,O=GoDaddy.com\\, Inc.,L=Scottsdale,ST=Arizona,C=US'`
みたいなことを言って死にます。見ての通り証明書を発行した中間証明書が信頼されていないので進めなくなったわけですね。

GoDaddy とやらのルートCA証明書は Firefox だとか ubuntu の ca-certificates パッケージにも入っているので、まあ信用していけないものではないでしょう。ただその次の段階の中間証明書が俺の /etc/ssl/certs に入っていないから wget が死ぬだけの話。

技術的には、サイト管理者に言って中間証明書とサイト証明書をひっつけて apache から送るようにしてもらうのが一つの方法ですが、まあちょっとサイトの性質上意味がある会話ができるまでの時間がどれだけになるやらわかりません。

# 証明書の入手と検証

CNでぐぐると証明書置き場 https://ssl-ccp.godaddy.com/repository?origin=CALLISTO がでてきます。CN と違う名前でリンクが貼ってあるので困りますが、まあヤマカンで https://ssl-ccp.godaddy.com/repository/gdig2.crt.pem を落としてみると CN があっています。

```
$ wget https://ssl-ccp.godaddy.com/repository/gdig2.crt.pem
$ openssl x509 -text < gdig2.crt.pem | grep CN
        Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certi
ficate Authority - G2
        Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certs.godad
dy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2
```

名前だけじゃなくて手持ちルートCA証明書にも合っています。CRL とかチェックするのはどうしたもんかと思うが、まあ最低限全くの偽物をつかまされているわけではない。

```
$ openssl veritfy < gdig2.crt.pem
stdin: OK
```

# 証明書のインストール（ubuntu）

RedHat 系なら /etc/pki でしたっけ。忘れました。

```
$ sudo cp gdig2.crt.pem /etc/ssl/certs/Go_Daddy_Secure_Certificate_Authrity_-_G2.pem
$ openssl x509 -hash -noout < gdig2.crt.pem
27eb7704
$ sudo ln -s /etc/ssl/certs/Go_Daddy_Secure_Certificate_Authrity_-_G2.pem /etc/ssl/certs/27eb7704.0
```

まあこれで wget が動くようになったのでよし。
CircleCIでrailsアプリのimageをアップグレードしたらmysqlに接続できなくなった話

# 概要

railsのアプリでrubyのバージョンを上げようと思って`.circleci/config.yml`のimageを変更したらmysqlに接続できなくなってちょっとはまったので共有しておきます。

# 結論

* `mysql-client`パッケージ名が`default-mysql-client`に変わったので変更する。
* `bundle install`のキャッシュの消さないと`mysql-client`のパッケージが変わったので接続できない。

# やったこと

config.ymlを以下のように変更してpush。


※ config.ymlは関係ない部分を省略してます。

```diff:.circleci/config.yml
version: 2.1
jobs:
  build:
    docker:
-   - image: circleci/ruby:2.6.1-node-browsers
+   - image: circleci/ruby:2.6.3-node-browsers
    - image: circleci/mysql:5.7-ram
    steps:
    - run:
        name: Install depencies
        command: |
          sudo apt-get install -y mysql-client
    - restore_cache:
        keys:
        - cache-bundle-{{ checksum "Gemfile.lock" }}
        - cache-bundle-
    - run:
        name: bundle
        command: |
          bundle install --jobs=4 --retry=3 --path vendor/bundle
    - save_cache:
        paths:
          - ./vendor/bundle
        key: cache-bundle-{{ checksum "Gemfile.lock" }}
```

CirclCIで`Install depencies`のところでこんなエラーでこけました。

```
Package mysql-client is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'mysql-client' has no installation candidate
Exited with code 100
```

[こちら](https://yourmystar-engineer.hatenablog.jp/entry/2019/07/15/140644)が参考になりましたが、パッケージ名が`mysql-client`から`default-mysql-client`に変わったので変更します。

```diff:.circleci/config.yml
version: 2.1
jobs:
  build:
    docker:
    - image: circleci/ruby:2.6.3-node-browsers
    - image: circleci/mysql:5.7-ram
    steps:
    - run:
        name: Install depencies
        command: |
-         sudo apt-get install -y mysql-client
+         sudo apt-get install -y default-mysql-client
```

これでインストールは成功しますが、今度は`bundle exec rails db:migrate --trace`してるところで下記のようなエラーで止まります。

```
#!/bin/bash -eo pipefail
bundle exec rails db:migrate --trace
rails aborted!
LoadError: libmariadbclient.so.18: cannot open shared object file: No such file or directory - /home/circleci/test_dir/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.so
/home/circleci/test_dir/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `require'
/home/circleci/test_dir/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `block in require'
...以下長いバックトレース
```

`mysql-client`が変わったので`bundle install`をやり直して`mysql2`の`native extensions`コンパイルをやり直さないといけません。`bundle install`は時間がかかるので大抵の人がキャッシュしてると思います。多分皆さんここではまるんじゃないかと。

今回はキャッシュの名前を変更して対応しました。

```diff:.circleci/config.yml
    - restore_cache:
        keys:
-       - cache-bundle-{{ checksum "Gemfile.lock" }}
+       - cache-bundle-v1-{{ checksum "Gemfile.lock" }}
-       - cache-bundle-
+       - cache-bundle-v1-
    - run:
        name: bundle
        command: |
          bundle install --jobs=4 --retry=3 --path vendor/bundle
    - save_cache:
        paths:
          - ./vendor/bundle
-       key: cache-bundle-{{ checksum "Gemfile.lock" }}
+       key: cache-bundle-v1-{{ checksum "Gemfile.lock" }}
```
Azure Monitor for VMsがSouth Central US・East Asia・Central Indiaリージョンで利用可能に！（2019/10/18更新）

ミスって削除してしまったので、再投稿です。
# はじめに
この記事はマイクロソフトが2019/10/16に発表した["Azure Monitor for VMs is now available in South Central US, West US, Central US, North Central US, East Asia, and Central India regions"](https://azure.microsoft.com/en-us/updates/azure-monitor-for-vms-is-now-available-in-several-new-regions/)の要約記事です（※ほかの関連記事との兼ね合いでこの記事は削除されました）。  
この記事では、始めに今回の発表のハイライトを紹介し、Azure Monitor for VMsの基礎的な内容について述べていきます。  

# 今回の発表のハイライト
Azure Monitor for VMsが世界中の18のリージョンで利用可能になりました。  
これにはパフォーマンスグラフと依存関係マップ機能が含まれています。  

# Azure Monitor for VMsとはなにか
Azure Monitor for VMsではAzure 仮想マシンおよび仮想マシン スケール セットの大規模な監視することができます。  
具体的には、WindowsやLinuxの仮想マシンのプロセスや、リソース及び外部プロセスとの依存関係を監視することにより、仮想マシンのパフォーマンスや正常性が分析されます。  

監視がサポートされているのは、オンプレミスまたは別のクラウドプロバイダーでホストされている仮想マシンを対象にしたパフォーマンス・アプリケーションの依存関係です。  
次の3つの主要な機能により、詳細な分析情報が提供されます。  

- Azure VM の論理コンポーネント：事前に正常性基準を構成し、その基準を満たすと通知が届きます
- パフォーマンス グラフ：ゲスト仮想マシンOSから主要なパフォーマンスメトリックが表示されます
- 依存関係マップ：さまざまなリソースグループおよびサブスクリプションから該当の仮想マシンと相互接続されているコンポーネントが表示されます

# おわりに
現在、以下のリージョンで利用可能だそうです。

- South Central US
- West US
- Central US
- North Central US
- East Asia
- Central India

詳細な内容につきましては[こちらのAzure Monitor for VMsのドキュメント](https://docs.microsoft.com/ja-jp/azure/azure-monitor/insights/vminsights-overview)をご覧ください。  
この記事は[こちらのQiita](https://qiita.com/ss_33_sss/items/b042197e32320d084eee)にも投稿されています。
Rails チュートリアル　第2章　まとめ

目的　
scaffoldというすでに枠が大方出来上がっているモノを使って、MVCの挙動を知ること

データベースを作成する
1.データベースに（変更を指示する）ファイルを作成

```ruby
rails g scaffold（ここがmodelになったり、controllerになったりする） 
User(model名) name:string(column名:型) email:string
```
2.作ったモデルをデータベースに反映させる

```ruby
rails db:migrate
```

モデルは単数形（User)にすることが慣習

第1章よりも詳しくMVCの挙動を確認する
MVC
1. ブラウザからのリクエスト。
このリクエストはURLの入力やリンクをクリックした時に行われる

2.リクエストがルーティングに届く。
ルーティングでは、そのリクエストを、URLに基づいてコントローラとアクションに振り分ける
get /user（URL) => user#index(controller#action) のような形で
config/routeで行われる

3.振り分けられたUserコントローラのindexアクションが発動する
今回であれば、

```ruby
def index
    @user = User.all 
end 
```
なので、UserモデルのデータベースからUserの情報（例えばname)をすべて取得して(User.all)、それを変数に代入する(@user =)、という動作が発動する。

4.コントローラーは、コントローラ名とアクション名からビューを検索して（apps/views/users/index.html.erb)、取得したユーザー情報をビューに送る

5.ビューは送信された内容をHTMLに変換して、コントローラに送り返し、それをコントローラはブラウザに返す、そしてブラウザでHTMLが表示される
GitHubのアカウント登録から初めてのプッシュまで試してみる

GitHubへのアカウント登録から初めてソースをアップするまでの流れです。


## GitHubへアカウント登録します

以下のサイトの「GitHubへ登録する」ボタンからアカウント登録します。

https://github.co.jp/


## リポジトリを作成します

GitHubへログインして、画面左側のRepositoriesの「New」ボタンからリポジトリを作成します。

 - Repository name：リポジトリの名前を指定します。
 - Description (optional)：リポジトリの説明を指定します。任意です。
 - Public or Private：外部へ公開するか、公開しないかです。

リポジトリを追加する時にこのリポジトリのURLを指定するのでメモしておきます。
Repositoriesからこのリポジトリを追加した時に表示されるURLがそれです。

## gitをインストールします

今回はUbuntuで開発してるのでUbuntuでの操作となります。

```
# gitをインストールします
$ sudo apt-get update
$ sudo apt-get install git

# インストールの確認のためにバージョンを表示します
$ git --version
git version 2.17.1
```

## gitの設定をおこないます

```
# ユーザーの名前を指定します
$ git config --global user.name [name]
# ユーザーのメールアドレスを指定します
$ git config --global user.mail [mail]

# 設定を確認します
$ git config --global --list
user.name=[name]
user.mail=[mail]
```

## gitの初期化から、ソースのコミットまで

GitHubにあげたいソースはmyprojectにあるものとします。

```
# プッシュしたいソースのあるフォルダに移動
$ cd myproject
# gitの初期化
$ git init
# ソースをバージョン管理に追加
$ git add .
# ソースのコミット
$ git commit -m "first commit"
```

## リポジトリの追加からプッシュまで

```
# リポジトリを追加
$ git remote add origin <URL>
# リポジトリの確認
$ git remote -v
origin  https://github.com/~ (fetch)
origin  https://github.com/~ (push)

# プッシュ
$ git push origin master
```

## リポジトリの確認

GitHubのリポジトリを確認してソースが登録されていれば成功です。

以上です。
アプリケーション内で使用される画像の保存場所

## 設置場所
Railsではアプリケーション内で使用される画像の設置場所が２つある。

- `public` ディレクトリ
- `app/assets/images` ディレクトリ

## 書き方に注意
- `app/assets/images` ディレクトリに配置した画像ファイルは`/assets/画像ファイル名`で参照
  - 例：　`<img class="about-img" src='/assets/records.png'>`
- CSSの場合
  - 例：　`background: image-url(’画像パス')`

## 結論
特に理由がない場合は、`app/assets/images` ディレクトリに画像を設置する。

## 参考にさせていただいたURL
https://techblog.kyamanak.com/entry/2017/10/13/003818
https://www.javadrive.jp/rails/template/index11.html#section2

## 余談
progateではトップページの背景画像ファイルをpublicフォルダに格納していた。
理由は分からない。
C++ Builder 10.2 Tokyo > Performance > TStringList > [34秒]の追加処理を[4秒]に高速化 (TeeChartのベクター出力処理において)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

### 概要

- PDF出力処理の自前実装をしていた
    - TeeChartの系列含めた内容をPDF出力
- TStringListへPDFの内容を記載していき、最後にファイル出力 (SaveToFile())
- 最終的に生成されるPDFの行数
    - 99458行
- 系列の出力処理で処理時間がかかっている
    - 合計処理時間: 34秒
- 系列の出力処理を変更したところ高速化できた
    - 合計処理時間: 4秒

### 実装(概要) > 高速化前: 34秒

高速化前のプロダクトコードの概要を示す。
Note: 名前は非公開のため一部変更している。

```cpp 
	std::unique_ptr<TStringList> wrkSL(new TStringList);
...
	// 系列以外の内容をwrkSLに追記
...
	// 系列の内容の出力	
	//
	for(int si=0; si < kNumSeries; si++) { // si: series index
		addlen = XXX::AddXXX_graph_eachSeries(Chart1, si, wrkSL.get());
	}
```

### 実装(概要) > 高速化後: 4秒

高速化後のプロダクトコードの概要を示す。
Note: 名前は非公開のため一部変更している。

```cpp 
	std::unique_ptr<TStringList> wrkSL(new TStringList);
...
	// 系列以外の内容をwrkSLに追記
...	
	// 系列の内容の出力
	//
	//   高速化のため、wrkSLに足さずにこちらに一度足したものをwrkSLに足す
	std::unique_ptr<TStringList> srsSL(new TStringList); 
	for(int si=0; si < kNumSeries; si++) { // si: series index
		// addlen = XXX::AddXXX_graph_eachSeries(Chart1, si, wrkSL.get());
		addlen = XXX::AddXXX_graph_eachSeries(Chart1, si, srsSL.get());
		wrkSL->Add(srsSL->Text);
		srsSL->Clear();
	}
```


## 高速化の理由 (推測)

今回の高速化の理由として2つの可能性が考えられる。
過去の実装の経験からは、要素の多いTStringListへのAdd()の回数を減らすことがパフォーマンス改善に大きく貢献している、と思われる。

### 1. 要素のアクセスの改善

TStringListのAdd()の内部的な処理は分からないが、要素のはじめからアクセスする処理が含まれるのではないかと思われる。
配列処理をポインタ処理に変更することで、要素の先頭からのアクセスでなく最後尾からのアクセスになる。それにより処理の高速化をしている例は本で読んだことがある。


> 引用: プログラミングでメシが食えるか!? by 小俣光之 (こまたみつゆき)さん
> p117
>
>ポインタを使用して書き直すと、若干ですがより高速になります。配列アクセスは、毎回「配列の先頭アドレスにアクセスしたい場合のオフセットを加える」という演算をしながらアクセスします。これに対してポインタを使用すると、このような連続処理ではポインタの差し先を１つ進めるだけで、アクセスする場所はすでに決まっているので演算が不要なためです。

```c
int count;
char  buf[4096];
char  *ptr;   // 高速化ポイント

for(ptr=buf, count=0; *ptr!='\0'; ptr++) {
	if (*ptr=='.') {
		count++;
	}
}
```

ワーク用srsSLを使うことで、このアクセス処理は走査する回数が減るため改善が見込まれるが、それが実際にどれくらいの効果かは個別計測はできない。

### 2. 要素数が少ないTStringListでの処理による改善

要素のアクセスとも関係するかもしれないが、TStringListのような重いオブジェクトを扱う時、要素数が増えるにつれ処理性能が落ちる。
処理性能を落とさないためには、負荷の少ない状態で追加処理を行う。
ワーク用srsSLに対するAdd()処理は要素が少ないため負荷が小さく、その結果を一回のAdd()で要素の多いwrkSLに追加したのはその観点から。


### 関連

- [C++ Builder 10.2 Tokyo > FastReport > TfrxLineViewerで線を引く > performance:20万本の描画は不可能](https://qiita.com/7of9/items/2d16bfe53196ddddf59a)
- [C++ Builder XE4 > 文字列操作 > 文字列の抽出方法 3つの処理比較 > 1:TStringList使用 2:Pos()使用 3:charとポインタ操作](https://qiita.com/7of9/items/6f14d54275b5a502e1af)
- [C++ Builder XE4, 10.2 Tokyo > TMemo > TStringList型のリストをTMemoに割当てる実装 > TMemo.Assign()など | link:パフォーマンス](https://qiita.com/7of9/items/d489614007707d9e5ae0)
- [c++ builder > TStringListの上限 > TStringList can hold up to 134,217,728 strings (MaxListSize+1). ](https://qiita.com/7of9/items/ff03617330c05628b74c)
【備忘録】rsyslogの出力が止まった時の対応

# 環境
CentOS Linux release 7.3.1611 (Core)
systemd 219
rsyslog 7.4.7-16.el7

# 事象

rsyslogによるログ出力が一部止まった。

#やったこと

rsyslogをデバッグ実行すると下記が出力されていた。

```

/usr/sbin/rsyslogd -n -d

　7204.120717564:7fc48c3df780: Called LogError, msg: warning: ~ action is deprecated, consider using the 'stop' statement instead

```

/etc/rsyslog.d/21-cloudinit.confに~が書かれていることが問題らしいので、修正した。


（変更前）

```

# comment out the following line to allow CLOUDINIT messages through.
# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog
& ~

```

（変更後）

```
# comment out the following line to allow CLOUDINIT messages through.
# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog
& stop
```

状況変わらず。
/var/log/messagesを見るとjournaldがなんか駄目になっているっぽい

```
systemd: Starting Cleanup of Temporary Directories...
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:26] Failed to replace specifiers: /run/log/journal/%m
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:28] Failed to replace specifiers: /run/log/journal/%m
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:29] Failed to replace specifiers: /run/log/journal/%m
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:32] Failed to replace specifiers: /var/log/journal/%m
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:34] Failed to replace specifiers: /var/log/journal/%m
systemd-tmpfiles: [/usr/lib/tmpfiles.d/systemd.conf:35] Failed to replace specifiers: /var/log/journal/%m
systemd: systemd-tmpfiles-clean.service: main process exited, code=exited, status=1/FAILURE
systemd: Failed to start Cleanup of Temporary Directories.
systemd: Unit systemd-tmpfiles-clean.service entered failed state.
systemd: systemd-tmpfiles-clean.service failed.

```

試しにjournaldを再起動してみると、起動しなくなった。。。
systemdでなくコマンドで起動してみると下記が出力された。

```

/usr/lib/systemd/systemd-journald
 Failed to get machine id: No such file or directory

```

machine idなんて知らんので、調べてみると/etc/machine-idというファイルが原因らしい。
なので、systemd-machine-id-setup実行しサーバrebootを実行。

直った。

#感想

サーバはVMコピーで用意してもらったものなので、ここまで不具合があるものかと思いつつ、
知らないことが多々あったので面白かった。
結局何が根本原因だったのかはこれから調べる予定。
ListResoueceBundleを用いたリソース・バンドル作成手始め

#はじめに

　java Goldの勉強の最中で、情報の外部化・propertiesファイルのあれこれについて、サンプルコードを用いて理解したいと考え、統合開発環境下でコードを記述、実行してみました。

　しかし、いくらやってもMissingResoueceExceptionが出ます。

　なぜなのか…。

　実行時エラーとにらめっこしながら試行錯誤した結果、注意すべきポイントを知ることが出来ました。以下、備忘録です。

#サンプルコード
```MyResource.java
package com.example.Locale.properties;

import java.util.ListResourceBundle;

public class MyResource extends ListResourceBundle{

	private final static String resources[][] = {
	        {"helloworld", "Hello, World!"},
	        {"key","This is MyResource's key!"}
	    };
	@Override
	protected Object[][] getContents() {
		return resources;
	}
}
```
　上のコードに記述した"key"を実行クラスで取得したいと思います。

※クラスを用いたリソースバンドルを作成する場合、ResourceBandleのサブクラスであるListResoueceBundleやPropertyResourceBundleを継承する必要があります。

また、ListResourceBundleは抽象クラスのため、抽象メソッド『getContents』の実装が必須です。

#実行クラスにおける注意点

1.クラスファイルがどこに配置されるかを意識する

　例えば、以下のようなサンプルコードが示されていたとします。

```java
ResourceBundle rb = ResourceBundle.getBundle("MyResource");
```
しかし、これではうまく取得できませんでした。

小一時間調べた結果、勉強で使っている黒本([徹底攻略 Java SE 8 Gold 問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Gold-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-809/dp/4295000035/ref=asc_df_4295000035/?tag=jpgo-22&linkCode=df0&hvadid=288845875882&hvpos=1o1&hvnetw=g&hvrand=1789597220371198337&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028851&hvtargid=pla-524507079079&psc=1&th=1&psc=1))の解説文に、ヒントが載っていました。


>[注意]
>リソース・バンドルとなるクラスが**パッケージに含まれている**場合にはパッケージ名での修飾を忘れないようにしましょう。

即ち、getBundle内に記述すべき名前は、パッケージ名を含めた完全修飾名でなければならなかったのです。

上に挙げたコードでは、MyResourceクラスはデフォルトパッケージに居なければなりませんでした。しかし、実際にはパッケージ内で定義していたため、ファイルを移動するか、括弧内を完全修飾名で記述する必要があります。

以下、完全修飾名で記述した実行クラスの一部と実行結果を載せます。

- 実行クラス

```Main.java
//リソースクラス名は完全修飾名で記述する。
		ResourceBundle rb = ResourceBundle.getBundle("com.example.Locale.properties.MyResource");
		String message = rb.getString("key");
		System.out.println(message);
```

- 実行結果

```
This is MyResource's key!
```

#あとがき

　心身の問題があって実際現場で働いている身分ではない為、誤った内容・古めかしい内容になっているかもしれませんが、今後も気づいたことやわかったことがあれば備忘録としてメモしていきたいと思います。

実体験や指摘等、何かあればコメントいただけますと嬉しいです。

　以上、ご拝読ありがとうございました。
plunt uml クラス図書き方


## 始め方

```
@startuml

@enduml
```

## メソッドたち

- title

```
title <size:18> Todo機能クラス図 </size>

```

- クラス
 
```

class ユーザー << (C,#FF7700) User >> {
  
  ID <<id>>
  名前 <<name>>
  登録日時 <<created_at>>
  更新日時 <<updated_at>>
}

```


- メモ

```
# 公式
Note 位置 of 対象のクラス（名前一致）

end Note


# 例
Note bottom of User
userは。。。だよ

end Note
```

- リレーション関係


```
1対1

"1" -- "1"

1対多

"a" -- "*"

多対多

"*" -- "*"

ユーザー "1" -- "*" 商品


```
Peppermint Linux：EmacsのM-x shellのプロンプトにPeppermint Terminalと出てウザい＜＝解決

**環境：**Peppermint 10でbash
**症状：**.bashrcでプロンプトをカスタマイズすると、Terminalではちゃんと反映されるが、EmacsでM-x shellとしたときに反映されない。特に「Peppermint Terminal」と表示されるのが邪魔
**原因：**/etc/bash.bashrcというのが設定を上書きしていた
**対策：**`$ sudo mv /etc/bash.bashrc /etc/backup.bash.bashrc.backup` と変名し、このファイルはもう使わないことにした

以下の記事を参考にさせてもらいました。
[[Linux]環境変数の読み込み順番](https://qiita.com/yunzeroin/items/480a3a677f78a57ac52f)
Rust で wasm-pack するときの準備

# 概要

wasm 関係の記事を書くときにいちいち準備から書きたくないのでまとめました。

# wasm-pack をインストール

※cargoが必要です

```shell
$ cargo install wasm-pack
```

# クレートを作成

クレートを作成し、そのディレクトリに移動します。

```shell
$ cargo new --lib [クレート名]
$ cd [クレート名]
```

この時点でのディレクトリ構成（一部省略）：

```
[クレート名]
　├cargo.toml
　└src
　　└lib.rs
```

## webpack 等のインストール

※npmが必要です
※yarn等を使う場合は適宜読み替えてください

絶対に必要ではありませんが、動作確認などで使います。
すでにサーバーがあるなら、webpack-dev-server はお好みで。

```shell
$ npm init
$ npm install -D @wasm-tool/wasm-pack-plugin html-webpack-plugin webpack webpack-cli webpack-dev-server
```

この時点でのディレクトリ構成（一部省略）：

```
[クレート名]
　├cargo.toml
　├package.json
　├package-lock.json
　└src
　　└lib.rs
```

# webpack.config.js の作成

クレートのルートディレクトリに webpack.config.js というファイルを作り、以下のように記述します。

```javascript
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    resolve: {
        extensions: [".js"]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: path.join(__dirname, "./src/index.html")
        }),
        new WasmPackPlugin({
            crateDirectory: path.join(__dirname, "./")
        })
    ]
};
```

この時点でのディレクトリ構成（一部省略）：

```
[クレート名]
　├cargo.toml
　├package.json
　├package-lock.json
　├webpack.config.js
　└src
　　└lib.rs
```

# その他、必要なファイルの作成

[クレート名]/src に index.js と index.html を作成し、それぞれ以下のように記述します。

index.js：

```javascript
import("../pkg");
```

index.html：

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
</head>

<body>
    <div id="app"></div>
</body>

</html>
```
この時点でのディレクトリ構成（一部省略）：

```
[クレート名]
　├cargo.toml
　├package.json
　├package-lock.json
　├webpack.config.js
　└src
　　├index.html
　　├index.js
　　└lib.rs
```

# その他、設定の作成

package.json の `scripts` に `"start": "./node_modules/.bin/webpack-dev-server"` を追加します。

この時点での package.json の例：

```json
{
  "name": "[クレート名]",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "./node_modules/.bin/webpack-dev-server"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "^1.0.1",
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.39.3",
    "webpack-cli": "^3.3.8",
    "webpack-dev-server": "^3.8.0"
  }
}
```

# cargo.toml の編集

各記事の内容に従ってください。
[Vue.js] NEW表示を作る

アイテムなどを登録した時に、一時的に「 NEW! 」などの表示をつけたくて作成してみました。

最初は、JavaScriptで試行錯誤していましたが、調べていくうちに処理が複雑だということがわかり今回は、DATA型を扱いやすくなるmoment.jsを使用しました。

###moment.jsのインストール
npmを使ってインストールします。
`$ npm install moment`

ライブラリ
[moment.js](https://github.com/moment/moment/)

日付を比較するためdiffメソッドを使用します。第二引数に単位を入れるとその単位で比較した値を返すみたいです。

```sampleComponent.vue
<template>

<span v-if="newMarkFlag && diff == '0'" class="new-mark">
 NEW!
</span>

</template>

<script>
import moment from 'moment'
export default {
props: {
 item: {
       type: Object,
       require: true
       }
 },
 data: function () {
  return: {
           newMarkFlag: false,
           date: moment(), //momentオブジェクトを取得して現在の時刻を取得
           updated: this.item.updated_at,
           dayDiff: "",
          }
 },
 beforeMount: function () {
    this.mounted()
 },
 methods: {
    mounted: function () {
      this.newMarkFlag = true;
      //現在の時刻とupdated_atの時間を比較
      this.dayDiff = this.date.diff(this.updated, 'days');
    }
  }
} 
</script>

<style>
.new-mark {
 color: #b91d19;
}

</style>
```

diffの確認はvue.jsのデバッグツール(vue-devtools)などで確認できます。
参考サイト
>https://beyondjapan.com/blog/2017/06/vue-devtools/

consoleに出力しなくてもデータの確認ができるようになります。

これで確認してみると [ diff： 値 ]で確認できるようになります。

今回は、updateしてから1日間はNEW表示させたい場合。
`this.dayDiff = this.date.diff(this.updated, 'days');`

こうすると差分が２４時間以内の場合は diff: 0
updateから一日たつと　diff: 1 などの値が返ってくると思います。
*diffが０の場合、newMarkFlagをtrueにする。*
`<span v-if="newMarkFlag && diff == '0'" class="new-mark">
 NEW!
</span>`
これで、updateから２４時間だけNEWが表示されるようになります。


NEW表示を作成するだけで丸一日以上かかってしまったのでメモに残しておきます。

###参考 moment.js 使い方
>https://daiki-sekiguchi.com/2018/09/01/nodejs-how-to-use-moment-js/
【marginをマイナス値で指定】htmlで「ボタンの中にボタン」を作る方法！（ピアノの白鍵と黒鍵を作ってみた）

#（前置き）buttonタグだけでピアノを作りたい！⇒白鍵と黒鍵の重なりをどうしよう？#

htmlには「button」というタグがあって、＜button＞~＜/button＞という簡単な記述でボタンを作り出すことができます。これを使って、ブラウザでピアノを作ってみることにしました！

とりあえず、「ド」の鍵盤を作ってみました。

```piano.html
<html>
<head>
<link rel="stylesheet" href="piano.css">
</head>
<body>

<div align="center">

<button id="do">ド</button>

</div>

</body>
</html>
```

＜div align="center"＞＜/div＞で囲んだ要素は、ページの中央に表示されます。
鍵盤がページの真ん中にあった方が見栄えがいいので使ってみました。

続いて、cssでボタンの幅と高さを指定していきます。
ピアノの鍵盤と言えば、真っ白縦長の長方形ですよね！

```piano.css
#do
{width : 80px;
  height : 400px;
  font-size : 20px;
  background-color : #ffffff;
  border-color : #000000;}
```

実際に表示してみると
<img width="697" alt="ド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/07a9cd7a-08f2-63fb-06e3-eb7b80e2b4b8.png">

いい感じですね。
続いて「ド#」を作ります。同じようにbuttonタグで

```piano.html
<html>
<head>
<link rel="stylesheet" href="piano.css">
</head>
<body>

<div align="center">

<button id="do">ド</button>
<button id="dos">ド#</button>

</div>

</body>
</html>
```

cssで黒鍵の色、形を指定します。
黒鍵と言えば、白鍵よりちょっと小さくて黒いですよね。

```piano.css
#dos
{width : 64px;
  height : 320px;
  font-size : 20px;
  background-color : #000000;
  color : #fffafa;}
```
こんな風に指定して、表示してみると…？

<img width="568" alt="ド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/1d933d34-2e80-8b76-c0a1-18ce5ba8bf04.png">

思ってたんと違う。2点ほど問題がありますね。
①上端ぞろえになっていない
②黒鍵と白鍵が重なっていない

①を解決するためには、cssに次のような付けたしをしてあげましょう！

```piano.css
#do, #dos
  {display: inline-block;
    vertical-align : top;}
```

メインでやりたいことは「vertical-align : top;」、つまり
「『ド』の鍵盤と『ド#』の鍵盤を両方とも**上端揃え**で表示してよ！」
という指示なのですが、このvertical-alignは本来テキスト要素用の書き方らしく、単独ではボタンなどのボックス要素に対して効いてくれません。
そこで「display: inline-block;」を足してあげるというわけですね。

この部分は私自身もまだ理解が浅いので、しっかり理解出来たらまた別の記事に書こうと思います。

ともかく、vertical-alignを設定してあげることで、表示は
<img width="536" alt="ド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/2ceac2ef-b183-2d58-5098-5b369dfc2469.png">

無事、上端揃えになりました！
次に、「黒鍵と白鍵が重なっていない問題」を解決していきます。

#（本題）marginタグでボタンとボタンを重ねよう！

html・cssでは「margin」という値を指定することができます。
margin は、「要素と要素の間の空白」の長さのことです。
<img width="896" alt="ド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/8e098d37-ad41-4503-7b20-87cbc969a282.png">

marginは、上下左右をそれぞれ指定することができます。

上側：　margin-top：○○px;
下側：  margin-bottom：○○px;
右側：  margin-right：○○px;
左側：  margin-left：○○px;

そして、marginには**負の値を設定することもできます**！！
marginがマイナスならば、要素同士は重なることになります。

なので、黒鍵を白鍵に重ねるには、重ねる側の「ド#」にcssで次のような付けたしをしてあげます。

```piano.css
#dos
  {margin-left : -20px;}
```

表示してみると、
<img width="555" alt="ド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/467ab2c6-f55d-7743-c25b-a375c44a6aec.png">

白鍵と黒鍵が重なって、ピアノらしい見た目になりました！

以上です。
「marginは負の値も設定できる」ことを知らずに私はハマってしまいました。
htmlに取り組むどなたかの助けになれば嬉しいです。
#Rails + #rspec で it の中身が複数あるとエラーが内容分かりにくくなるのでデフォルトで aggregate_failures を有効にする 

# rails_helper

```rb
RSpec.configure do |config|
  # https://qiita.com/jnchito/items/3a590480ee291a70027c
  config.define_derived_metadata do |meta|
    meta[:aggregate_failures] = true unless meta.key?(:aggregate_failures)
  end
end
```

# spec

```rb
require "rails_helper"

describe do
  it do
    expect(true).to be false
    expect(true).to be true
    expect(true).to be false
  end
end
```

# aggregate_failures を指定した時の例

落ちた箇所複数が分かる

![image](https://user-images.githubusercontent.com/13635059/67055793-6b51a280-f184-11e9-9a47-29643f7c7bba.png)


# aggregate_failures を指定しなかった時の例

最初に落ちた場所しか分からない

![image](https://user-images.githubusercontent.com/13635059/67055810-7c9aaf00-f184-11e9-8c7d-a7c7e91f07d2.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【備忘録】デジタルデータについて考え見る

#目的
デジタルを理解する


#参考動画
[しくみキーワード：　デジタル　【音声無し】（デジタルとは？からメリットまでを動画で理解できる！）](https://www.youtube.com/watch?v=3y1Rz8pcdPk&feature=youtu.be)


#デジタルとアナログの違い
アナログは、ありのまま
デジタルは、順序よく上がるイメージ


#デジタルのメリット
>単純で扱いやすい。
不正確なのが、感覚的には気にならないレベル

不正確なのが、感覚的には気にならないレベルって大事な概念

#文字、画像、音がデジタルデータ（数値）に変換されるまでの過程

文字→文字コード（数値）

画像→画素に細かく分解→3原色（赤・緑・青）(RGB)の光量に分解→画素データ（数値）などで表現

音→音波を超細かく分ける→座表面上の点を表現し、認識する→各点の座標（音圧レベル）（数値）を記録

これらのことから、機械には音、画像、文字をデジタルデータに変換するための***ものさし***がある

#機械が、10進数アナログデータよりも2進数デジタルデータを好む理由
***データには、電気のように安定しないものがある。***

もし、機械が0~9の10進数のものさしを使って、安定しないデータを認識するとき、データが4~5の間を行き来してしまうので、機械は混乱してしまう、4なの？5なの？どっち？みたいな:scream:
***そのため時間がかかる***

2進数0,1の物差しを使用すると、
***もっとも変動しにくい状態を0,その一線を超えた状態を全て1とする***認識することで、
安定しないデータも対応しやすくなる！

#デジタルデータの保存
>磁気、電気、反射の２つの状態を並べることでデータを残す

これあまりピンっと来なかった

#データは必ず劣化する
>アナログデータやデジタルデータは保存場所の状態や、ケーブル、電波で伝送中の信号波の大きさは、時間と共に必ず劣化する。

アナログものさしは、データが劣化したら`８`→`７`になったり、`６`→`５`で認識してしまうけど、
デジタルものさしは、0か1でしか判断しないため、データ劣化しても`0`→`0`,`1`→`1`と判断する

#足し算
2つアナログデータを足し算するのは、処理が早いが、劣化しやすく、ノイズが出やすい

デジタルデータは、0か1なので簡単に足し算することができる

#ビットとバイト
***半角英数は8ビット***
8ビットの２進デジタルデータを***1バイト***と数える


#まとめ
***機械には、データを測るためのものさしが存在する***
クラスライブラリ内の対象をマイグレーションする

#環境
windows10
visualstudio2017

ソリューションに含まれるプロジェクト
{
ASP.Net Core MVCプロジェクトSampleSolution.MvcApp,
それを補助するコマンドプロセッサ用(IDDD本を参考)クラスライブラリSampleSolution.CommandStack
}


#問題
EntityクラスおよびDbContext継承クラスをクラスライブラリに置いて、
マイグレーションを使いたいという状況に遭遇しました。
とりあえず
クラスライブラリにそれらを置いた状態で`Add-Migration InitialCreate`を実行しました。
が、失敗しました。
`Add-Migration InitialCreate -v`として、エラーの詳細を出力してみたところ、
Startupクラスが存在せず、そこに`service.AddDbContext~`などのメソッドも置けていないので、
エラーが発生しているのだとわかりました。

Startupクラスを置こうにも、クラスライブラリなので不可能です。

解決できたので忘備録として残します。

#解決(手順)
###1.MVCプロジェクトのStartupクラス(もしくはそれから呼び出されるクラス)に以下のコードを追加します。

```Startup.cs
services.AddDbContext<SampleContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("SampleString"),
                    assembly => assembly.MigrationsAssembly(typeof(SampleContext).Assembly.FullName));
            });
```
`assembly => assembly.MigrationsAssembly(typeof(SampleContext).Assembly.FullName)`という部分ですが、
ここで対象とするDbContextの存在するプロジェクト(アセンブリ)を指定しています。

###2.パッケージマネージャーコンソール上で以下のコマンドを実行します。

```
 Add-Migration InitialCreate -Project SampleSolution.CommandStack -StartupProject SampleSolution.MvcApp -Context SampleSolution.CommandStack.SampleContext
```
すると、DbContextの存在するプロジェクトに`Migrations`ディレクトリが作成され、Migration対象とすることができたことが確認できます。

###3.NugetPackageをインストールし、`Migration`ディレクトリ内のファイルにusingでインポートする
Microsoft.EntityFrameworkCore.SqlServerなど適宜インストールしインポートします。


#参考リンク
[Assemblyについてのイシュー(GitHub)](https://github.com/aspnet/EntityFrameworkCore/issues/5900)
C言語でforeachを実装したけど納得いかない

#目的
C言語にforeachはない
なら作るしかない

とりあえずforeachもどきができたのでまとめる

#foreachとは
リストや配列の値を最初から順番に見ていく関数
Pythonのforはそもそもこの形

```python
for x in array:
    #xにリストの最初から値が入る
```

Javaでは拡張for文という名前で亜種のように扱われている

```java
for(int x : array){
    //xにリストの最初から値が入る
}
```

この関数が__C言語にはない__
あるのは普通のfor文のみ
C++やC\#にはある

#方針
実装にあたって__define文__を使い、マクロ関数で実装する
配列の最初から最後までを走査するような動作
なるべくシンプルに、他の言語と使用感があまり変わらないように

#実装
以下のようなdefine文を考えた

```c
#define foreach(x, list) for(x=list; x-list<sizeof(list)/sizeof(list[0]); x=x+1)
```

要するにforeach()と書かれた部分を置き換えるだけ
この1文だけ挿入することで実行可能

以下実行例

```c
#include<stdio.h>
//foreach定義
#define foreach(x, list) for(x=list; x-list<sizeof(list)/sizeof(list[0]); x=x+1)

void main(){
  int array2[5]={2,5,3,7,2};
  int* y;
  foreach(y, array2){
    printf("%d\n", *y);
  }
  return;
}

//2
//5
//3
//7
//2
```

変数としてあらかじめ宣言したポインタを使用する
ので値を見るときはアスタリスクをつける必要あり

一行追加するだけで使えるなかなか便利なものに
追加したdefine文も割とシンプルに書けた

#ここで気づいた
他の言語のforeachは__値渡し__である
上で作ったのは__参照渡し(のようなポインタ渡し)__である
参照渡しでもいい気はするがなるべく近づけたい
元の値が変わる恐れがあるのもやはり良くないのではないかと考えた

#改めて実装
値渡しになるよう色々考えて次のようにした


```c:foreach.h
#define foreach(x, list) for(x=list[0], foreachcounter=0; foreachcounter<sizeof(list)/sizeof(list[0]); x=list[++foreachcounter])
int foreachcounter;
```

defineで置き換える考えは変えず
ファイル名の通りヘッダファイルとして読み込んで使用する形式に

実行は以下の通り

```C
#include<stdio.h>
//foreach読み込み
#include "foreach.h"

void main(){
  int array[5]={2,5,3,7,2};
  int x;
  foreach(x, array){
    printf("%d\n", x);
  }
  return;
}

//2
//5
//3
//7
//2
```

・ポインタを使う必要がない
・導入が簡単
・ヘッダファイルとして秘匿されている
・使用感は他の言語に結構近い
・値渡しになっている
方針に沿ったものになったはず
型を揃えればdoubleやcharでも問題ない

#所感
__色々と納得いかない__
以下理由

__・変数宣言を行っている__
わざわざ配列の長さをカウントするための変数を宣言したのが目立つ
別の方法でカウントできないか思いつかなかった
結果的にグローバル変数と化している


__・内部で宣言できない__
他の言語(上記のJavaなど)では~~for内のみのスコープの変数を宣言できる~~
変数の宣言と引数指定を同時に行える

```java
//　↓ここで宣言できるようにしたい
for(int x : array){
    //xにリストの最初から値が入る
}
```
今回は外部で宣言しなければならない
単純にやり方が分からなかった


#まとめ
使えるには使えるはず
もう少し改良したい
npm publishせずにパッケージに同梱されるファイルを確認する方法

.npmignoreや、.gitignore、そしてpackage.jsonの`files`フィールドの設定がどのように作用しているかを確認する方法。

次のコマンドを実行すると、パッケージを公開(publish)せずにどのファイルがパッケージに含まれるかを確認することができる:

```bash
npm pack --dry-run
```

実行結果の例:


```
npm notice
npm notice 📦  koa-path-prefix-router@1.0.0
npm notice === Tarball Contents ===
npm notice 344B  lib/index.js
npm notice 236B  lib/Option.js
npm notice 845B  lib/PathPrefixResolver.js
npm notice 1.3kB lib/Route.js
npm notice 770B  package.json
npm notice 195B  lib/index.js.map
npm notice 270B  lib/Option.js.map
npm notice 835B  lib/PathPrefixResolver.js.map
npm notice 1.2kB lib/Route.js.map
npm notice 142B  README.md
npm notice === Tarball Details ===
npm notice name:          koa-path-prefix-router
npm notice version:       1.0.0
npm notice filename:      koa-path-prefix-router-1.0.0.tgz
npm notice package size:  2.3 kB
npm notice unpacked size: 6.1 kB
npm notice shasum:        5c87c389484903326ad67c34493c85852efe1a95
npm notice integrity:     sha512-hDxcatoFQciSa[...]Rm40FFkjTcQww==
npm notice total files:   10
npm notice
koa-path-prefix-router-1.0.0.tgz
```

この出力結果の`=== Tarball Contents ===`にリストアップされたファイルがパッケージに同梱されるので、そのリストを目視で確認する。


## 参考

* [npm-developers | npm Documentation](https://docs.npmjs.com/misc/developers#testing-whether-your-npmignore-or-files-config-works)
Chatwork Input Toolsが便利

最近はslackを利用しているProjectも増えてきましたが
Chatworkを使っている現場もまだまだあると思います。

Chatworkでテキスト整形する時に[code]や[info]などのタグが使用できますが、
手動で入力するのは手間な時ありますよね？

そんな時はChromeの拡張機能で
``Chatwork Input Tools``
が便利です。

## Chatwork Input Tools
https://chrome.google.com/webstore/detail/chatwork-input-tools/iaemcpeoioekjbbephpefmdoncmpdcdc?hl=ja

![chatworkinputtools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/80206142-8cfb-9e77-23d8-af7fd5a225b6.png)
GASでA1セルに更新日付を表示させる

<img width="359" alt="スクリーンショット 2019-10-18 10.40.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255372/ec05e763-46bd-963b-c7b8-4cdbe66e58f5.png">

みんなで更新する書類で最終更新者が誰か？いつか？が必要なときに使う


```
function insertLastUpdated() {
  SpreadsheetApp.getActiveSheet()
    .getRange('A1') //挿入したいセル
    .setValue(
      '最終更新: ' + Utilities.formatDate(new Date(), 'JST', 'yyyy年MM月dd日HH時mm分') + //日時フォーマット
      ' by ' + Session.getActiveUser().getEmail() //更新したユーザーアカウント
    )
    .setFontColor('red'); //文字色
}
```