OmniAICreator/Qiita-1.07M huggingface dataset:
自律移動ロボットを開発した話

# はじめに
高専に在籍している私の学科では、4年生になると小型自立移動ロボットを開発します。それも、どのような社会の課題を解決するのかから決めます。このような自由度の高いロボット開発は自分にとって良い体験になったので、開発記としてQiitaに残しておこうと思います。

# 目次
- 概要
- プログラムについて

# 概要
私たちのロボット開発では、アイデアやスライド発表などの表向きの部分を統括するプロジェクトマネージャ(PM)と、ロボット全体の技術面を統括するチームリーダ(TL)を筆頭に、メカ班、エレキ班、ソフト班に分かれ、担当の開発を行います。1班の構成員は8人程度です。4年生のうち、前期は1コマ、後期は4コマ(本来ならば前期2コマ、後期3コマ)と時間のある放課後を使って開発します。私は、TLになりソフト班に入って開発をしました。  
ロボット開発において、メカ、エレキ、ソフト各班は何をするのかを以下に示します。

### メカ
メカはロボットの外観を作る役割があります。アイデアにってはその実現に向けた機構作成もしなくてはなりません。基本的に加工前に設計書を作らねばならず、3DCADを利用して図面や外観図を作成します。
設計書が通ったら、作成する室内の工作機械や3Dプリンター、校内の工場の工作機械で部品の加工を行います。加工方法はレーザーやコンタマシンでの切断やボール盤での穴あけがメインで、旋盤をする班もあります。エレキ班が作成する回路基板を実装する穴もあけなくてはなりません。
メカ班は外装を作るので、できなければ他の班は動作テストをすることができません。よって、メカ班はスピードが大事になります。現実は基本的に他の班より遅れがちです。

### エレキ
エレキはロボットのマイコンのシールド基盤の作成と、基盤上のコネクタとセンサの配線を行います。必要ならば複数のセンサを基盤にまとめなければなりません。ロボットの大きさによっては、配線ケーブルも自作する必要があります。また、ソフト班に余裕がなければ、購入したセンサの動作確認プログラムも作ります。
エレキは設計書として、マイコン(Raspberry PiのGPIOピンやArduinoのピン)のピン番号とどのセンサをつなぐかを書かなければなりません。これをもとにソフト班はプログラムを作成します。
エレキ班は基本的には他の班よりも仕事が少ないです。自分の仕事が終わった場合は他の手伝いをすることが多いです。

### ソフト
ソフトはひたすらにコーディングかと思うかもしれませんが、実はそうでもありません。コーティングの前の仕様決めが案外面倒くさかったりします。メカ、エレキ班は図面や配線図といった作成に関するものを仕様書にまとめればいいのですが、ソフト班はどのようなモジュールを作るかに加えて、どのような動作をさせるのか、単体テストは何をするのかといった全体寄りなことも仕様書に書かなければなりません。
また、メカやエレキの作成の遅れの影響をもろに受けるので、終盤に忙しくなりがちです。


# プログラムについて
私はソフト班に所属したのでプログラムの技術面について説明します。プログラムははじめ直進や旋回といった最低限の走行や超音波センサやタッチセンサの値を読み取ることをできるようにした標準プログラムが渡されます。これを利用したり、一から作ったりして自分たちが作りたいロボットに合わせたプログラムを作成します。この標準プログラムについての技術的な概要を以下に示します。

### Arduinoプログラム
- 用途　・・・　モータのPID制御、PWM出力、アナログ入力、、Raspberry Piとの通信
- 言語　・・・　Arduino言語(Cに近い)

### Raspberry Piプログラム
- 用途　・・・　デジタル入出力、超音波センサとのI2C通信、Arduinoとの通信、数字認識
- 言語　・・・　C言語
- ライブラリ　・・・　標準ライブラリ、OpenCV、Wiring Pi、(pthread)

最近のロボットでは、ここにPythonプログラムを作成して、物体検知で何かアクションをするものが多くなっています。
私も、ここにPythonプログラムを作成し、Raspberry Piプログラムとソケット通信して情報のやり取りをするようにしました。また、Raspberry Piプログラムの一部をC++クラスベースに書き直し、さらに自分たちが必要な機能も追加しました。

# おわりに
今回は私が学校で作成しているロボット製作の概要について記事にしました。
どういうプログラムを作成したかなどの詳細については続きとして別の記事で書こうと思います。
rake aborted! Gem::LoadError: You have already activated rake 13.0.3, but your Gemfile requires rake 12.3.3.  の対処法

#事象

rails にてルーティングを調べようとrake routes を実行したら以下のエラーが出ました。

```
rake routes
rake aborted!
Gem::LoadError: You have already activated rake 13.0.3, but your Gemfile requires rake 12.3.3. 
Prepending `bundle exec` to your command may solve this.
```

うーん。なんだこれは。。。調べてみるとどうやらrake routesの前にbundle execを付ければ良いみたいです。


#対処方法

```
bundle exec rake routes
```

bundle exec を加えて再度やってみたら成功しました。
bundle execは、bundlerでインストールされたgemパッケージを使用してコマンドを実行します。bundlerとはプロジェクト内で使うGemのパッケージ管理ツールのことです。


#参考
以下の記事を参考にさせていただいております。

https://qiita.com/ARTS_papa/items/41e2868273dd344cd317


https://qiita.com/dawn_628/items/1821d4eef22b9f45eea8
【TypeScript】配列になったオブジェクトから、指定したプロパティのユニオン型を取り出す

細かすぎて伝わらないタイトル

## 問題

例えば以下のような場合、onClickの引数にはvalueが取りうる`'0' | '1' | '2'`に縛りたい。

```ts
const numberDict = [
  {value: '0', label: 'ゼロ'},
  {value: '1', label: 'ワン'},
  {value: '2', label: 'ツー'},  
]

const onClick = (newValue: '0' | '1' | '2') => {  // 引数の型を動的に指定したい
  setLabel(newValue)
}

onClick(numberDict[0].value);
```

## 解決

```ts
type NumberDictValues = Pick<typeof numberDict[number], 'value'>['value']
const onClick = (
  newValue: NumberDictValues
) => {
  onClick(newValue)
}
```

## 詳細

考え方を順を追って説明します。

### 変数の型を導き出す。
まずは`numberDict`の型を導出するため、`typeof`を使います。
`numberDict`は`as const`でwideningを阻止します。

```ts
numberDict = {/* 略 */} as const
typeof numberDict
```

### 配列を展開する
配列の展開をします。
`numberDict[number]`という書き方をすると、インデックスアクセスで得られる値の型を出せます。

```ts
typeof numberDict[number]
```

[参考](https://qiita.com/kobanyan/items/0927f6e649e84f2df6d8#%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AE%E5%9E%8B%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99)

### オブジェクトの値を抜き出す
最後にオブジェクトから値だけを抜き出します。
`{}['key']`という書き方で`key`でアクセスできる値をユニオン型で取得できます。

```ts
typeof numberDict[number]['value']
```
Flutter TDD Clean Architecture Course その14 - UI

[こちらのチュートリアル](https://resocoder.com/2019/10/29/flutter-tdd-clean-architecture-course-14-user-interface/)学習のアウトプットをします。

今回UIを作成してチュートリアル完了となります。

---

# BlocProvider
- BlocをUIに提供するため`BlocProvider`を使う

```number_trivia_page.dart
class NumberTriviaPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Number Trivia'),
      ),
      body: BlocProvider(
        builder: (_) => sl<NumberTriviaBloc>(),
        child: Container(),
      ),
    );
  }
}
```

# UI作成

- `Placeholder`ウィジットを使ってアウトラインを作成できる

<img width="300" src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/f4dcf985-b412-c73a-b7aa-74ce37992c02.png'>

## State変化による再描画
- `BlocBuilder`を使って再描画する

```number_trivia_page.dart
..
// Top half
BlocBuilder<NumberTriviaBloc, NumberTriviaState>(
  builder: (context, state) {
    if (state is Empty) {
      return Container(
        // Third of the size of the screen
        height: MediaQuery.of(context).size.height / 3,
        child: Center(
          child: Text('Start searching!'),
        ),
      );
    }
    // We're going to also check for the other states
  },
),
```

## Event発行
- `RaisedButton`の`onPressed:`にてEvent発行するメソッドを指定する

```dart
BlocProvider.of<NumberTriviaBloc>(context)
       .add(GetTriviaForConcreteNumber(inputStr));
```

# 学んだこと
- UIの構成を作る際に`Placeholder`を使うと便利
    - ただし仮のオブジェクトを配置してしまっても早いとも思う
- ディレクトリ内のclassを全部importする場合、`export`文を使うと良い
- キーボードを表示させた際に画面が崩れる場合、`SingleChildScrollView`等でwrapするとよい

---

以上でチュートリアル完了です。

- 基本的にチュートリアルのコードを動かしてみるのが良いと思います。
- [第1回](https://qiita.com/maria_mari/items/8fdd92af13a36c663360)に概要があるのでそちらもご参照ください。
(Android) DataBindingを使って静的テキストを表示させてみる

## はじめに
DataBindingの勉強として記録しておく。
今回はテキストを表示するだけの初歩中の初歩。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/5d60538a-a36d-a64a-1ef5-81d16def3067.png">


## DataBindingの導入
appのgradleに以下を追加

```java:build.gradle
android {
    dataBinding {
        enabled = true
    }
}
```
## バインドするクラス(User)を用意

```java:User.java

public class User {
  private String name;
  private String email;

  public User(String name, String email) {
    this.name = name;
    this.email = email;
  }

  public String getName() { return name; }
  public String getEmail() { return email; }
}
```
## layout設定
### ポイント
* xmlファイルのルートをlayoutタグでくくる。
　⇒ 自動的にxmlファイル名に応じたBindingクラスが作られる。
　例： activity_main.xml => ActivityMainBinding
* 使用するオブジェクトをdataタグ内で記述
    * variable nameは任意の名前
    * type = "com.example.プロジェクト名(小文字).バインドするクラス名"(今回はUser) 
* Viewからバインドオブジェクトのプロパティにアクセスするため、@{}でくくって記述
    * 例： @{user.name}でUser.javaのgetName()にアクセス
    * @{}の中身はnullを許容するようになっており、nullの場合でもNullPointerExceptionが発生することはない。



```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Binding Objects -->
    <data>
      <!--  userという名前(任意)で、Userクラスオブジェクトとの結びつきがされる  -->
      <variable name="user" type="com.example.databinding.User" />
    </data>

    <!-- View -->
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.email}" />
    </LinearLayout>
</layout>
```
## オブジェクトをバインドさせる
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    private User user = new User("Taro", "taro@test.com");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Bindingのインスタンスを取得
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        // xmlのuserとMainActivityのuserを紐付ける
        binding.setUser(user);
    }

```

## おわりに
次は動的に表示させる実装をしてみたいと思う。
next: [DataBindingを使ってテキストを動的に変更する](https://qiita.com/kilalabu/items/3cded5e7c560de2ed05c)
## 参考サイト
https://qiita.com/Omoti/items/a83910a990e64f4dbdf1#step0-%E5%B0%8E%E5%85%A5
ありがとうございました
Pardot のプロセスオートメーション (Pardot Lightning アプリケーション) ⇒ セグメンテーションルールの使用 (Pardot Lightning アプリケーション)

１．セグメンテーションルールを過去にさかのぼって実行するとはどういう意味ですか?
２．セグメンテーションルールで実行可能なすべてのアクションは何に関連していますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/c9c56f8e-f9fa-5719-c763-ac0993988ade.png)
iPhoneで誤って削除した連絡先を復元する方法

　iPhoneの重要な連絡先を誤って削除しましたか？通話履歴が削除されたり消えたりしていませんか？ <a href="https://jp.bitwar.net/course/iphone/2771.html">iPhoneで誤って削除した連絡先を復元する方法</a>は？

　iPhoneで誤って削除した連絡先をすばやく簡単に復元するために、Bitwar iPhone Data Recoveryを使用する簡単な方法があります。

　iPhone 6、7、8、X、iPhone 11、iPad、または使用しているAppleデバイスから削除された連絡先を取得することは大きな問題です。 なぜなら、連絡先アプリ自体を使用して復元することはできないからです。ただし、他のソリューションやサードパーティの連絡先リカバリアプリケーションを使用して、iPhoneやMacで削除された連絡先情報を取得することができます。


<strong>削除された連絡先を復元する方法</strong>

<strong>方法1：削除した連絡先をバックアップから無料で復元する</strong>

　削除された連絡先をバックアップから復元することが、最も簡単で最速の方法です。ただし、メッセージがいつ受信/送信されたか、いつバックアップしたかを知る必要があります。連絡先を受信した時刻がiCloudまたはiTunesでバックアップされた時刻よりも早い場合は、この連絡先に戻すことができます。ただし、最初にiCloudまたはiTunesにバックアップした場合は、連絡先を受信します。その後、失われた連絡先を復元することはできません。

　注：失われた連絡先やその他の情報をiTunesまたはiCloudから簡単に復元できます。ただし、注意が必要です。このリカバリは、新しく生成された連絡先を含む、電話機で新しく生成されたすべてのファイルをカバーするためです。したがって、利益と損失を計算する必要があります。既存のデータを失うことなく失われた連絡先を復元したい場合。これは少し難しいですが、方法1をスキップして方法2を試す必要があるだけです。


<strong>コンピューターなしでiCloudから連絡先を復元する</strong>

　iCloudからの連絡先リカバリもiOSの最も簡単な方法の1つであり、iPhoneで操作を実行するだけで済みます。

　まず、設定を開く必要があります。

　1、「設定」＞「一般」＞「リセット」を開き、「すべてのコンテンツと設定を消去」をタップします。これにより、現在iPhoneで所有しているすべてのファイルが削除され、バックアップを復元することを選択できるように再度セットアップできるようになります。

　2、その後、「Appとデータ」設定に到達するまでiPhoneを再起動しました。

　3、「Appとデータ」画面で「iCloudバックアップから復元」をタップし、Apple IDでサインインします。

　4、「バックアップを選択」を選択し、iCloudで使用可能なバックアップのリストから選択します。

　5、復元後、iPhoneには削除された連絡先を含め、その日のすべてのファイルが含まれます。


<strong>iTunesバックアップから連絡先を復元する</strong>
　
　iTunesを使用してiPhoneをコンピュータに接続し、定期的に同期する場合は、削除した連絡先をiTunesから復元できます。 iPhoneを同期すると、iTunesは単一のバックアップファイルエントリを作成します。したがって、復元する場合は、これらのバックアップを使用して復元するだけで済みます。


　iPhoneをiTunesに接続した後、それを選択します。次に、「iPhoneを復元」をクリックします。ウィンドウが表示され、復元するバックアップを選択できます。適切なバックアップを選択し、「復元」をクリックして完了します。


<strong>方法2：サードパーティのデータ復元ソフトウェアを使用して、削除された連絡先を復旧する</strong>

　バックアップがない場合、またはバックアップされていない情報を失いたくない場合は、サードパーティのデータ復元ソフトウェアを使用して、削除された連絡先を復元できます。ただし、最初にスマートフォンの使用を中止してください。これは、携帯電話がこれらのメッセージを受信する可能性を減らすためです。何らかのアクションを実行すると、携帯電話のストレージデバイスに新しいデータまたはログが生成される可能性があるため、復元する古いデータを上書きします。

　詳しくは、「<a href="https://jp.bitwar.net/course/iphone/2771.html">iPhoneで誤って削除した連絡先を復元する方法</a>」をご参照ください。
Docker Desktop をインストールし起動するまで（Windows10）


Windows10環境にDocker Desktopをインストールし起動するまでの手順メモになります。

## 1. WindowsUpdate より Windows10 20H2へアップグレードを行う

既にバージョン20H2にアップグレードされている場合は、必要ありません。

## 2. WSL2の導入

###  2-1. Linux 用 Windows サブシステムを有効にする

管理者としてPoworshellを開き、次のコマンドを実行

```
PS C:\windows\system32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.572

イメージのバージョン: 10.0.19042.685

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

### 2-2. 仮想マシンの機能を有効にする

```
PS C:\windows\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.572

イメージのバージョン: 10.0.19042.685

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

このタイミングで<b>「PCの再起動」</b>を行う


### 2-3. Linux カーネル更新プログラム パッケージをダウンロードする

http://aka.ms/wsl2kernelmsix64

へアクセスしダウンロードファイル(wsl_update_x64.msi)をダブルクリックし実行する

### 2-4. WSL 2 を既定のバージョンとして設定する

```
PS C:\windows\system32> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```

### 2-5. Linux ディストリビューションをインストールする

Microsoft Store を開き、希望する Linux ディストリビューションを選択します。
(ダウンロードに時間がかかります。)

Microsoft Store
https://aka.ms/wslstore

Ubuntu 20.04 LTSを選択
https://www.microsoft.com/store/apps/9n6svws3rx71

### 2-6. 新しいディストリビューションを設定する

Ubuntuを起動し、ユーザー、パスワードを設定する

パッケージの更新を実行

```
> sudo apt update && sudo apt upgrade
```

上記設定についての参考情報
https://docs.microsoft.com/ja-jp/windows/wsl/user-support

## 3. WSL2の確認

```
PS C:\windows\system32> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2
```
VERSIONが２になっている

## 4. Docker Desktop For Windowsインストール

https://hub.docker.com/editions/community/docker-ce-desktop-windows

Get Docker For Windowsをクリック
ダウンロードファイルを実行しインストールする

インストーラーの画面で「Enable WSL 2 Windows Features」にチェックされている
ことを確認

Windowsをログオフ・ログインすることで
Docker Desktop For Windowsが起動される。
完了しました。

---
参考情報：
WSL2の導入とWindows 10 バージョン 20H2へのアップデート
https://blog.tagamy.com/archives/223

Windows Subsystem for Linux に関するドキュメント
https://docs.microsoft.com/ja-jp/windows/wsl/

Windows Subsystem for Linux 2(WSL 2)をセットアップしてみた
https://dev.classmethod.jp/articles/how-to-setup-wsl2/

Docker Desktop for WindowsのバックエンドとしてWSL2を使用する
https://dev.classmethod.jp/articles/docker-desktop-for-windows-on-wsl2/
Salesforce Spring ’21 以降で削除されるゲストユーザーの編集・削除権限を回避して、ゲストユーザーで編集・削除を実行する方法

この記事はSalesforce 開発者向けブログ投稿キャンペーンへのエントリー記事です。
[Salesforce 開発者向けブログ投稿キャンペーン 第4弾 開催のお知らせ](https://developer.salesforce.com/jpblogs/2020/11/salesforce-developers-blog-4th/)
> [2] Salesforce のコーディング開発

# 概要
* **Salesforce Spring'21でゲストユーザの下記権限が削除されます。**
    * 編集
    * 削除
    * すべてのデータの変更
    * すべてのデータの参照

* **非推奨ではありますが、どうしてもゲストユーザに編集・削除を実行させたい場合のプラクィス紹介になります。**
* **組織での動作検証を必ず行ってください。**
* **こちらの方法は2020/12時点での対処方法です。今後のアップデートでこちらの記事で紹介した方法が対応不可になる可能性があります。**

### 参考
* [Salesforce Winter '21 リリースノート_ゲストユーザのオブジェクト権限の変更からのオプトアウト (以前にリリースされた更新)](https://releasenotes.docs.salesforce.com/ja-jp/winter21/release-notes/rn_networks_opt_out_obj_perms_cruc.htm)

> Spring ’21 リリース以降では、ゲストユーザに「編集」、「削除」、「すべてのデータの変更」、「すべてのデータの参照」の権限を割り当てることはできなくなります。

# HowTo

1. 編集・削除を行いたいオブジェクトのId + 編集したい項目がある場合は対象の項目も含めてクエリします。
2. クエリしてきたオブジェクトを``オブジェクト.clone(false, true, true, false)``でクローンし、インスタンス変数で保存します。<br>※クローンする際にはclone(preserveId, isDeepClone, preserveReadonlyTimestamps, preserveAutonumber)のpreserveIdをfalseに設定し、クローンされるオブジェクトのIdをクリアにします。クリアしない場合は編集・削除を実行できません。<br>([Apex 開発者ガイド - SObject クラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_sobject.htm))
3. クエリしたオブジェクトIdをインスタンス変数で保存します。<br>(Visualforce画面などではクローンしたオブジェクトを編集させてください。)
4. Update or Deleteする際には、インスタンス変数に保持しているオブジェクトIdを再度クローンしたオブジェクトに設定し直してUpdate or Deleteを実行してください。


### サンプルコード
```java

public without sharing class XXXXX {
public Account acc { get; set; }
private Id accId;


    private static void queryAccount(Id param) {

        List<Account> accList = [
            SELECT
                Id,
                Name
            FROM
                Account
            WHERE
                Id = :param
        ];
        if (accList.isEmpty()) { return; }
        this.accId = objList[0].Id;
        this.acc   = objList[0].clone(false, true, true, false);

    }


    private static void updateAccount () {

        this.acc.Id = this.accId;
        update acc;

    }
}
```

# 備考
もし何か修正点がございましたら、コメントでご教授いただければ幸いです。
【Java】文字列をString型からbyte型に変換する方法

#プログラミング勉強日記
2020年12月28日
今日はJavaで文字列をbyte型に変換する方法を知ったのでそれをまとめる。

#byte型とは
　プリミティブ型のひとつで、8ビットまでの値を格納する。1ビットは0または1なので、1byteでは00000000から11111111までのビット配列を表現できる。byte型は符号つきで負の値もとるので、 -128 から 127 まで値をとる。
　画像ファイルや音声ファイル、文字列も内部ではbyteの集合体なので、byte型変数を単体で扱うというよりも、byte配列としてバイナリデータの集まりとして、利用されることが多い。

#String型からbyte型に変換する方法
　getBytes()メソッドを使用する。getBytes()メソッドは文字列をbyteの集合体に変換して、byte配列として返す。

```:基本的な書き方
str.getBytes("エンコード");
```

```java:サンプルコード

public class Sample {
  public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException {

    String str = "変換したい文字列";
    byte[] def = str.getBytes();
    byte[] utf8 = str.getBytes("UTF-8");
    byte[] utf16 = str.getBytes("UTF-16");

    System.out.println(Arrays.toString(def));
    System.out.println(Arrays.toString(utf8));
    System.out.println(Arrays.toString(utf16));

  }

}
```

```:実行結果
[-27, -92, -119, -26, -113, -101, -29, -127, -105, -29, -127, -97, -29, -127, -124, -26, -106, -121, -27, -83, -105, -27, -120, -105]
[-27, -92, -119, -26, -113, -101, -29, -127, -105, -29, -127, -97, -29, -127, -124, -26, -106, -121, -27, -83, -105, -27, -120, -105]
[-2, -1, 89, 9, 99, -37, 48, 87, 48, 95, 48, 68, 101, -121, 91, 87, 82, 23]
```

#参考文献
[Javaで文字列をString型からbyte型へ変換する方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/22173)
【Laravel】ログインしていない(未認証)場合にログイン画面へリダイレクトする

#【Laravel】ログインしていない(未認証)場合にログイン画面へリダイレクトする

###使用環境
* XAMPP 7.3.18 (PHP 7.3.18)
* Laravel Framework 6.20.7
* windows 10

##背景
ログインセッションが切れたとき(未ログイン)にも特定のページが表示されていたため、ログインセッションが切れたらログイン画面へリダイレクトしたい。

##対処方法
###その1：コントローラーを使用する
使用するコントローラー内に```__construct``` を記述する。
middlewareのauth設定により、使用するControllerを経由して行われる処理はすべて認証によるアクセスの制限が行われる。

```php
  public function __construct(){
    $this->middleware('auth');
  }
```
[Laravelのログイン認証の基本(Authentication)を完全理解する](http://reffect.co.jp/laravel/laravel-authentication-understand)

###その2：ルート(route)を使用する
* 複数ある場合

```php
  Route::group(['middleware' => ['auth']], function() {
    // your routes
  });
```

* 単数の場合

```php
  Route::get('****', function () {
    // Only authenticated users may enter...
  })->middleware('auth');
```

[ユーザーがログインしていない場合はログインにリダイレクトLaravel](https://www.it-swarm-ja.tech/ja/laravel/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88laravel/1051491867/)
QiskitでVQE初歩

# VQE初歩
以前の記事で、Quantum native dojo 5-1 VQE初歩を、qulacsで実装しました。

[QulacsでVQE初歩](https://qiita.com/notori48/items/c39632f69e6312921a2a)

今回はこれをqiskitに書き換えてみました。
simulatorはstatevector_simulatorを使います。statevector_simulatorについては、
[Qiskitでトロッター分解を用いた量子シミュレーション (statevector__simulator編)](https://qiita.com/notori48/items/396d7148482e005ba507)

# スクリプト

```python
pip install qiskit pylatexenc
#必要なモジュールのインポート
from qiskit import IBMQ, QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
from qiskit.qasm import pi
from qiskit.tools.visualization import plot_histogram, circuit_drawer
import numpy as np
from qiskit.quantum_info.operators import Operator, Pauli

#Observable (Hamiltonian)
pauli0 = Pauli(label='II')
pauli1 = Pauli(label='IX')
pauli2 = Pauli(label='IZ')
pauli3 = Pauli(label='XI')
pauli4 = Pauli(label='XX')
pauli5 = Pauli(label='XZ')
pauli6 = Pauli(label='ZI')
pauli7 = Pauli(label='ZX')
pauli8 = Pauli(label='ZZ')

obs_op = (-3.8505/2*Operator(pauli0)-0.2288/2*Operator(pauli1)-1.0466/2*Operator(pauli2)-0.2288/2*Operator(pauli3)+0.2613/2*Operator(pauli4)+0.2288/2*Operator(pauli5)-1.0466/2*Operator(pauli6)+0.2288/2*Operator(pauli7)+0.2356/2*Operator(pauli8))
obs = obs_op.data
print(obs)


from qiskit.quantum_info.analysis import average_data
from qiskit.quantum_info import Statevector
backend = Aer.get_backend('statevector_simulator')

# 2-qubitの回路
n = 2
# Variational circuit のパラメータ数
n_param = 6;

def TwoQubitPQC(phi):
  
  #Variational circuit
  circuit = QuantumCircuit(n)
  circuit.rx(-1*phi[0],0)
  circuit.rz(-1*phi[1],0)
  circuit.rx(-1*phi[2],1)
  circuit.rz(-1*phi[3],1)
  circuit.cx(0,1)
  circuit.rz(-1*phi[4],1)
  circuit.rx(-1*phi[5],1)
  #circuit.draw('mpl')
  results = execute(circuit, backend, shots=1024).result()
  result_statevec = Statevector(results.get_statevector())
  return result_statevec

def cost(phi):
    ExpectVal = np.real(TwoQubitPQC(phi).expectation_value(obs_op)) #discard imaginary part
    return ExpectVal
import scipy.optimize
import matplotlib.pyplot as plt

cost_val = [] #コスト関数の変化を保存するための関数

#この関数がiteration ごとに呼ばれる。
def callback(phi):
    global cost_val
    cost_val.append(cost(phi))

init = np.random.rand(n_param)
callback(init)
res = scipy.optimize.minimize(cost, init, method='Powell', callback=callback)

plt.plot(cost_val)
plt.xlabel("iteration")
plt.ylabel("energy expectation value")
plt.show()
print(cost(res.x))

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/ce6228ac-5f66-2d2b-f0e9-93443e7b171a.png)

厳密解は -2.8626207640766816 らしいので、あっていそうです。

# 解説
qulacsのコードを書き直すだけでしたが、期待値計算のところで計算誤差に起因したエラー（虚部）が出てきてしまうので、np.real() で破棄しています。
これをしないと動きません。
他は、特に困ったことはなかったかな。

# 結論
qulacsでもqiskitでも動くよ。
次は実機実行したいですが、オブザーバブルの期待値計算がちょっと面倒です。
1つ1つ座標変換が必要。その理由は以前の記事で書いています。
[Qiskitで任意オブザーバブルの期待値計算をする方法](https://qiita.com/notori48/items/0bdeba72b8010e800cc8)

VQE　というと難しそうですが、量子計算の部分をブラックボックス（関数）として考えれば
単に古典的な最適化ソルバーへ突っ込んで終わりですね。
Amazon RDSとは

## 勉強前イメージ

AWSで使えるDBのサービス
mysqlとかpostgreSQLとかあった気がする

## 調査

### Amazon RDS とは

Amazon Relational Database Service の略でAWSで使えるリレーショナルデータベースです。
RDSで使えるRDBMS(Relational DataBase Management System : DBのソフトウェア(mysqlとか))は、6つ利用できます。

### そもそもリレーショナルデータベースとは？

行と列で構成された、関係性データベースと呼ばれるデータベースのこと。
最も普及しているデータベースシステムの1つで、単にデータベースといった場合はリレーショナルデータベースを指すことが多いです。
リレーショナルデータベースを制御するソフトは、RDBMSと呼ばれます。
オープンソースベースの `MySQL` や `PostgreSQL` 、Oracle Database や Microsoft SQL Server などがある。

### RDSで使えるRDBMSは？

#### 全部で6種類

- Amazon Aurora
- Postgre SQL
- MySQL
- MariaDB
- Oracle
- Microsoft SQL Server

![RDS · AWS Console 2020-12-28 16-20-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8ecbd4b8-0f6c-c084-64a5-f54ffed8b1fc.png)


#### Amazon Aurora

Amazonが提供しているリレーショナルデータベース。
MySQLと互換性のあるバージョンとPostgreSQLと互換性のあるバージョンがあり、
MySQLの最大5倍、PostgreSQLの最大3倍 高速であると記載があります

#### Postgre SQL

MySQLと人気を二分するオープンソースのリレーショナル型データベース。
Postgre SQLは多機能なので、Webシステムのバックエンド処理に向いています。

#### MySQL

最も広く利用されているソフトウェアのひとつで、シンプルなデータベースでの利用に適しています。

#### MariaDB

MySQLをもとに作られたデータベースで、操作性や使用方法はMySQLによく似ています。

#### Oracle

世界で最初に採用されたRDBMSで、最も多く利用されています。
行レベルロック、読み取り一貫性、堅牢性、移植性が優れています。

#### Microsoft SQL Server

Microsoft社が提供しているRDBベースMSです。
Windowsとの相性が良いので、WindowsサーバーやMicrosoft系の開発言語を使っている企業で多く利用されています。

### Amazon RDSの特徴

- コスト

RDSは初期費用は必要なく、稼働させた分だけ料金が発生する従量課金のため、短期間の利用でも最低限の料金で利用できます。

- DBの管理が不要

インストール作業などの運用の負荷が削減できます。

- 高可用性を実現

RDSには `Single-AZ配置` と `Multi-AZ` の2種類があります。
Multi-AZを利用すると自動で複数のアベイラビリティゾーンにマスターDB、スレーブDBが分散配置されます。
またDBのレプリケーションが省け、フェイルオーバーもRDSに任せることができます。

### Amazon RDSの機能

- ソフトウェアの自動パッチ作業

デプロイで使用するリレーショナルデータベースソフトウェアに最新のパッチが適用され、常に最新の状態が維持されています。
パッチを適応するタイミングを指定することもできます。

- リードレプリカが作成される

読み取り頻度の高いデータベースに対して伸縮自在にスケールアウトできます。
レプリカを複数作成することにより、全体の読み込みスループットを向上させることができます。

- 自動バックアップがされる

自動バックアップ機能によってデータベースとトランザクションログをバックアップし、
保持期間内の任意の時点 (最大 5 分前まで) に遡ってデータベースインスタンスを復元できます。

- 暗号化をすることができる

暗号化することによりAmazon RDSのデータを安全に保管することができます。


## 勉強後イメージ

RDSの中に色々mysqlとかAuroraがあるってことか。
あとリードレプリカがよくわからんかったけどいっぱいDBが作られるってイメージなんかな？
軽く作ったことはあるけど、ちゃんと構築したことはなかったな。。。。

## 参考

- [リレーショナルデータベース](https://www.otsuka-shokai.co.jp/words/relational-database.html)
- [AuroraかRDSどちらを選ぶべきか比較する話をDevelopers.IO 2019 in OSAKAでしました #cmdevio](https://dev.classmethod.jp/articles/developers-io-2019-in-osaka-aurora-or-rds/)
- [Amazon RDS の特徴](https://aws.amazon.com/jp/rds/features/)
- [Amazon RDSとは](https://hacknote.jp/archives/39907/)
- [Amazon RDS](https://qiita.com/leomaro7/items/9ac81ae543689a15b322)
- [Amazon RDSってなに？](https://www.acrovision.jp/service/aws/?p=316)
- [AWSのデータベースAmazon RDSとは？](https://business.ntt-east.co.jp/content/cloudsolution/column-23.html)
AWS SDK for JS version3でクレデンシャルを取得する記述

# 概要

- 処理内でアクセスキーIDやシークレットアクセスキーを利用する場面で、実行環境からクレデンシャルを取得したいことがあります
- まだプレビューですが、AWS SDK for Javascript version 3で試してみました
    - https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html
    - https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/index.html
- 最後にv2 での動作も示しました


# 環境1 （ローカル環境）

- Ubuntu20.04 on WSL2
- AWS CLI v2設定済み

## モジュールインストール

- v2では `aws-sdk` モジュールに集約されていましたが、sdk v3では細かくモジュールが分けられているようです
    - 必要なモジュールのみを組み込むことでサイズ的にも実行（ロード）速度にも貢献する感じでしょうか

```
npm install @aws-sdk/credential-provider-node
```

## コード

```javascript
const { defaultProvider } = require('@aws-sdk/credential-provider-node');

(async () => {
    const credential = await (defaultProvider())();
    console.log(credential);
})();
```

- デフォルト動作の場合は下記の順序で走査、最初に該当する有効なクレデンシャルを返すようです
- 本番環境の場合はどの情報を採用するのかよく確認が必要ですね
    1. 環境変数 `AWS_PROFILE` で指定されたセクションを ~/.aws/credentialsから読み取る
    2. 環境変数 `AWS_ACCESS_KEY_ID` `AWS_SECRET_ACCESS_KEY` で指定された値
    3. ~/.aws/credentials の `default` セクション
    4. [インスタンスメタデータ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)
 

## 実行結果

~/.aws/credentials の `default` セクション参照パターン
（値はマスクしています）

```
$ node credential.js
{
  accessKeyId: 'AKI*****************',
  secretAccessKey: '****************************************',
  sessionToken: undefined
}
```

環境変数 `AWS_ACCESS_KEY_ID` `AWS_SECRET_ACCESS_KEY` を指定したパターン

```
$ AWS_ACCESS_KEY_ID=accesskey AWS_SECRET_ACCESS_KEY=secretkey node credential.js
{
  accessKeyId: 'accesskey',
  secretAccessKey: 'secretkey',
  sessionToken: undefined,
  expiration: undefined
}
```

# 環境2 （AWS Lambda環境）

Lambda環境へはモジュール `@aws-sdk/credential-provider-node` が含まれませんので、Layersとしてデプロイして確認しました

- https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-layer-aws-sdk-latest-version/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/93657537-f33d-f228-8fc7-e52430143c84.png)


# sdk v2の場合

- 環境変数 `AWS_PROFILE`、 `AWS_ACCESS_KEY_ID` `AWS_SECRET_ACCESS_KEY` を指定した場合も同じ用な挙動になります

```javascript
const aws = require('aws-sdk');

console.log(aws.config.credentials.accessKeyId);
console.log(aws.config.credentials.secretAccessKey);
```

```
$ node credentialv2.js
AKI*****************
****************************************
```
error: failed to push some refs to [URL]　エラーの対処法

Herokuにデプロイしようとした時に出たエラーです。
エラーが出てデプロイができない状態でした。
しかし、とても初歩的なミスでした・・・。

## error: failed to push some refs to [URL]　エラーの対処法
_結論！Gitにコミットしてなかった！_

```:ターミナル
git add .
git commit -m "コメント"
```

にて解消！以上！

## まとめ
Procfileを先にコミットして、肝心な本体のgit add .とgit commitを忘れていました。
皆さんはこんなミスはしないと思いますが、同じようなエラーが出た時に参考になればと思います。
入社一年目に教わったシステムエンジニアの振舞い方

まず、自分で判断せず事業部に一回ずつ確認を取る事かな。
不安なら事業部に見せる前にリーダーに資料を作って、こう言うスケジュールとこう言う手順でやりたいですが良いですか？
と言う資料を先に作っておこう。

確か俺が移転の際にスケジュール書いたけど、あれも移転日を先に決めて逆算した物でリーダーから何か言われる前に書いてあるんだよね。

こんな大掛かりじゃなくても良いけど、4ページと5ページを先に作って

誰が
どう言うタスクを
何時までに

この3本の軸を持って資料を作る。

結局はさ、理解出来なきゃ共有出来ないって事だね
最終的にどうなりたいかって趣向もあるけど、自発的にこうしたい。って言う事をやっていくのであれば
計画とスケジュールと内容を人に伝える資料を作る事だね。

まだ独り立ちは難しいと言う事はみんな理解しているし、自分で自分で。って言う成長する貪欲さは良い所だけど一人でやった結果間違っていましたって言うのはNG

前の時もリーダーが言ってた通りで、誰かに確認してもらう事で自分では見えていないミスを指摘してもらうって事だからね。

多分、プログラマって言う仕事ならば手だけ動かせば良い。
だけど、それ以上の上流工程であるシステムエンジニアになるには、今やるべき開発だけじゃなくて依頼された人に
システムが掛かる工数や仕事を資料にする事ってのが第一歩。

PGは自分がやる仕事の理解
SEはこれから開発仕事の共有
【kintone】×【M5StickC-Plus】物理的にボタンぽちっとしてレコードを登録してみる

今回は、IoT？に挑戦してみたいと思います。

M5SitickC-Plusを買いました～ﾊﾟﾁﾊﾟﾁ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/40288050-6acb-da0a-cf4d-cb55f516c58d.png" width=300px>

「M5StickCPlus」の情報はこちら↓
https://docs.m5stack.com/#/en/core/m5stickc_plus

最近、Scratchにハマっているので、ビジュアルプログラミングのUIFlowで始めてみました。
設定のドキュメントはこちら↓
https://docs.m5stack.com/#/en/quick_start/m5stickc_plus/m5stickc_plus_quick_start_with_uiflow

初期設定ができな～いと、色んなサイトを参考にしてましたが、結局公式ドキュメントが最強でしたw
英語にも慣れないとなー👀

# レコードを登録するプログラムをつくる
フィールドはこんな感じ↓

|フィールドコード|フィールド種類|
|:-:|:-:|
|test|文字列(1行)|

APIトークンを作成しておいてください（レコード追加権限で）

# UIFlowでプログラミング

## 画面のほう
Labelを配置します。フォントがデフォルトだと日本語表示できなかったのでとりあえずUnicode16選んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/52138bb9-c836-e7d0-e800-13f18e1a3246.png)

## プログラミングのほう
**HttpRequest用のブロック**も用意されていて、中に色々書くだけです。
ボタンAというのはM5と書かれた部分です。ぐいっと押すとボタンになってます。

ちなみに、ブロックを見つけるのが大変で、JavaScriptのアレはブロックではどれなんだ！？
というハマり方をしましたw


以下はプログラムの全体像。
※同じkintoneアプリを作成したなら・・・サブドメイン、APIトークン、アプリIDの変更だけで、
M5StickC-Plusポチで登録できるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6acad81e-6693-3de0-c336-be819e02df95.png)

「マップ」というのはJavaScriptでいうところのオブジェクトという感じです。
右下の＋を押してkeyとvalueを追加できます。
入れ子にするのが大変👀
こういうのはコード手書きするほうが楽！
※実はPythonで書くこともできます。


↓URLやHeadersやDataはこちら２つのリンク先を参考に入力します。
https://developer.cybozu.io/hc/ja/articles/202166160#step1
https://developer.cybozu.io/hc/ja/articles/201941754#step7

Dataには登録したいレコードの情報を書く感じです。リクエストボディというやつです。

## 実行！
ボタンをポチッとするとこんな感じに表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1063f031-dd6e-5d34-777f-a1fe4c5184de.png" width=300px>

## kintoneのほう
そしてこちらはkintoneのアプリ。息子にボタン連打されて無駄にレコードが増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/05fcff0d-db67-20f5-ea30-7d0348ca4628.png)

# まとめ
今回はkintoneというよりはM5StickC-Plusのお話でした。が、初期設定がとっても大変でした。
ハマリポイントをあげておくのでなにかのヒントになると幸いですm(_ _)m

* ドライバーがどこにあるかわからない　→　CP2104 Driverだよ。→　https://m5stack.com/pages/download
* APIKeyはどこ？　→　全ては　M5Burner　でプラットフォーム更新してからだ！

買うだけ買って詰んで終わりとかにならなくてよかったですε-(´∀｀*)ﾎｯ
銀行マーケティングデータのサンプル「Bank Marketing Data Set」の構造

# やりたいこと

http://archive.ics.uci.edu/ml/datasets/Bank+Marketing

でダウンロードできる銀行マーケティングのサンプルデータセットである「Bank Marketing Data Set」の構造を調べる。



# 対象

* 機械学習のモデル実装者でマーケティングデータの分析等に関わっている人。
* 金融系のマーケティングデータセットを扱う人。
* モデリングの前にデータの内容をしっかり理解しておきたい人。


# データの入手

下記サイトからダウンロードできる。
http://archive.ics.uci.edu/ml/datasets/Bank+Marketing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/52c8ac66-e118-08ce-9b4d-4954505e4ec9.png)

下記からzipをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/383b6bac-0693-5831-fa29-aa638bdff86b.png)


# データの構造

下記のzipをダウンロードできる。

* bank-additional.zip
* bank.zip


それぞれの構造は以下の通り。



## bank-additional.zip

bank-additional/ フォルダ配下

* bank-additional.csv
* bank-additional-full.csv
* bank-additional-names.txt

## bank.zip


bank/ フォルダ配下

* bank.csv
* bank-full.csv
* bank-names.txt


# bank.csv

エクセルで開くと、下記の感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/d5afe083-3e99-6879-1278-e5b9b8fb480e.png)


# bank.csv のカラム構造






bank.csv には下記のカラムが含まれる。

* age
* job
* marital
* education
* default
* balance
* housing
* loan
* contact
* day
* month
* duration
* campaign
* pdays
* previous
* poutcome
* y

各カラムの説明は
bank-names.txt
に記載されている。

# カラム詳細


### age

顧客の年齢。数値型。


### job

顧客の職業。文字列型。

* admin : 管理者
* unknown : わからない
* unemployed : 失業者
* management : マネージャ
* housemaid : メイド
* entrepreneur : 起業家
* student : 学生
* blue-collar : ブルーカラー
* self-employed : 自営業
* retired : 引退
* technician : 技術者
* services : サービス


### marital

顧客の婚姻状況。

* married : 既婚
* divorced : 離婚（離婚または未亡人）
* single : 独身


### education

顧客の教育レベル。

* primary : 初等教育
* secondary : 中等教育
* tertiary : 高等教育


### default

デフォルト（債務不履行）の有無。
yes / no


### balance

残高。ユーロ（数値）で表した年間平均残高。



### housing

住宅ローンの有無。
yes / no


### loan

個人ローンの有無。
yes / no



### contact

顧客へ最後に連絡した際の連絡手段。

* telephone : 固定電話
* cellular : 携帯電話
* unknown : 不明

### day

顧客へ最後に連絡した日付。


### month

顧客へ最後に連絡した月。


### duration

顧客への最後の連絡で接触した時間（秒数）。



### campaign


現在のマーケティングキャンペーンにおける顧客への連絡回数（最後の連絡を含む）。



### pdays


以前のマーケティングキャンペーンにおける顧客への最終連絡日からの経過日数。-1は以前の連絡が無かったことを示す。




### previous

以前のマーケティングキャンペーンにおける顧客への連絡回数。




### poutcome

以前のマーケティングキャンペーンの結果。

* failure : 失敗
* success : 成功
* unknown : 不明
* other : その他


### y

顧客は定期預金を購入したか？
yes / no


# データの使い方

たとえば決定木分析の場合、下記のような実装で分類できる。


```python
import pandas as pd
import numpy as np
import pydotplus
from sklearn.tree import export_graphviz
from sklearn.tree import DecisionTreeClassifier as DT
from IPython.display import Image
train = pd.read_csv("bank-full.csv",delimiter=";")
y = train["y"]
trainx = train.iloc[:,0:15]
trainxd = pd.get_dummies(trainx)
clf3 = DT(max_depth=3, min_samples_leaf=500)
clf3.fit(trainxd,y)
export_graphviz(clf3, out_file="tree_clf3.dot", feature_names=trainxd.columns, class_names=["0","1"], filled=True, rounded=True)
graph = pydotplus.graphviz.graph_from_dot_file('tree_clf3.dot')
Image(graph.create_png())
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/01ce0a2f-75db-937c-32ac-2136e3243131.png)
[Swift] TableViewCellのStyleをCustom以外にする

#はじめに
私はこのTableViewCellのStyleをCustom以外にした時、Cell内の部品へのアクセスの仕方が分からずに詰まりました。
今回はその解説を書いてみようと思います。
一回分かれば簡単ってやつです。
#Style変更のやり方
TableViewCellを選択すると、赤枠の箇所にStyleがあるのでそこから変更できます。
![スクリーンショット 2020-12-28 16.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/9aa79b3c-c78d-a0c7-f9f5-38b41f1ef6ea.png)
#Cell内の部品へのアクセス
cellを生成するので`cellForRowAt`の中に書いていきます。

定数cellを定義し、`tableView.dequeueReusableCell(withIdentifier: , for: )`を使ってcellの再利用をします。

Identifierを指定し、それに紐付いたcellを再利用することになります。

そしたら、そのcellにアクセスできるようになるので、

`cell.textLabel?.text = "abc"`のように部品を指定して処理を書いていきます。

このStyleの場合、左の部品名はtextLabel,右の部品名はdetailLabelとなっています。

```swift
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
        cell.textLabel?.text = "abc"
        cell.detailTextLabel?.text = "def"
        
        return cell
    }
```

numberOfRowsInSectionの数を４にしてみたので、

実行結果はdequeueReusableCellで指定したIdentidierのcellが４つ生成されています。
![スクリーンショット 2020-12-28 16.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/080e1a5b-fb96-f6f1-7f86-4a0779414c93.png)
ハッシュ・キー・バリューとは

【ハッシュ】とは、配列と同じで複数の要素を格納する箱みたいな物です。

【ハッシュ】の説明の前に配列の説明をしておくと、配列は箱の中身を取り出す時に「0」、「1」、「2」〜のように、
インデックスを指定して取り出します。

【バリュー】の場合ではインデックスに、【キー】（自分で決めることができる文字列）を指定して【バリュー】と呼ばれる要素を指定して、箱の中身を取り出すことができます。

今回はお菓子お例にして【ハッシュ】の概要を見てみましょう。

```bash

#ハッシュ＝お菓子　キー＝お菓子名　バリュー=価格
お菓子 = {"うまい棒" =>　"10円", "ポテトチップス" => "100円", "ハリボーグミ" => "150円"}
put お菓子["うまい棒"]
　↓
10円　（出力結果）

```

これで【ハッシュ】（お菓子）の中にある【キー】（お菓子名）を指定して【バリュー】（価格）を取り出すことができました。
【備忘録】railsチュートリアル3章のbundle installが出来ないときの対処

【環境】
windowsPC
aws cloud9にて実行

railsチュートリアル3章のbundle install時にエラーが出て詰まったので備忘録的として記録。

【経緯】
bundle install実行時、bundle updateを促すエラーが表示されたため、指示通り実行したところ、下記のエラー表記。

An error occurred while installing pg (1.1.4), and Bundler cannot continue.
Make sure that `gem install pg -v '1.1.4' --source 'https://rubygems.org/'` succeeds before bundling.


【試したこと】
ググるうちにrailsチュートリアルではpgは使わないとの記述を見つけた(テキストのすぐ下にも書いていた)ため、再度bundle install --without productionを実行。しかしこちらもエラー。

bundle update --without productionと実行してみるもUnknown switches '--without'とのこと。同様の手がupdateには効かないことを学ぶ。

その後、再度bundle install --without productionを実行したところ、インストール成功。

どれがハマって成功したのかイマイチよくわかっていないものの、今後同様の状況に陥った時の対処法の一つとしたい。
「sudo ln -s」「ln -s」とは？

linuxの、コマンド「ls」の解説が書かれています。こちらへどうぞ。

・http://linuxjm.osdn.jp/html/GNU_fileutils/man1/ln.1.html
・https://wa3.i-3-i.info/word11183.html
・https://wa3.i-3-i.info/word14607.html
QulacsでVQE初歩

# VQE
Quantum native dojo 5-1のVQE練習
https://dojo.qulacs.org/ja/latest/notebooks/5.1_variational_quantum_eigensolver.html#VQE%E3%81%A8%E3%81%AF
はnumpyで書かれています。

`以下ではnumpyを使ったVQEの実装例を示す。（もちろん、Qulacsでも簡単に実装できるので、余裕のある読者はチャレンジしてみてほしい`

やってやろうじゃないの。
これをQulacsで書いてみます。

なお、先人の実装例もいくつかあります。Qiitaの”VQE”タグで探すといいですよ。
[【Quantum Native Dojo】QulacsでVQEを実装してみた【5-1】](https://qiita.com/nori_autumn/items/c2d679bfe55b2f79d85d)

# スクリプト

```python

pip install qulacs

from qulacs import QuantumState,QuantumCircuit,PauliOperator, GeneralQuantumOperator, ParametricQuantumCircuit
from qulacs.gate import Identity, X, Y, Z, H, RX, RY, CNOT
import numpy as np

# 2-qubitの回路
n = 2
# Variational circuit のパラメータ数
n_param = 6;

# Hamiltonian
operator = GeneralQuantumOperator(n)

coef = -3.8505/2
Pauli_string = "I 0 I 1"
pauli = PauliOperator(Pauli_string,coef)
operator.add_operator(pauli)
# Pauli operator can also be added directly from coefficients and strings
operator.add_operator(-0.2288/2, "I 0 X 1")
operator.add_operator(-1.0466/2, "I 0 Z 1")
operator.add_operator(-0.2288/2, "X 0 I 1")
operator.add_operator(+0.2613/2, "X 0 X 1")
operator.add_operator(+0.2288/2, "X 0 Z 1")
operator.add_operator(-1.0466/2, "Z 0 I 1")
operator.add_operator(+0.2288/2, "Z 0 X 1")
operator.add_operator(+0.2356/2, "Z 0 Z 1")

def TwoQubitPQC(phi):
  state = QuantumState(n)
  # |00>に初期化
  state.set_zero_state()
  
  #Variational circuit
  circuit = ParametricQuantumCircuit(n)
  circuit.add_parametric_RX_gate(0,phi[0])
  circuit.add_parametric_RZ_gate(0,phi[1])
  circuit.add_parametric_RX_gate(1,phi[2])
  circuit.add_parametric_RZ_gate(1,phi[3])
  circuit.add_gate(CNOT(0,1)) #note
  circuit.add_parametric_RZ_gate(1,phi[4])
  circuit.add_parametric_RX_gate(1,phi[5])

  circuit.update_quantum_state(state)  
  return state

def cost(phi):
    ExpectVal = operator.get_expectation_value(TwoQubitPQC(phi)).real
    return ExpectVal

import scipy.optimize
import matplotlib.pyplot as plt

cost_val = [] #コスト関数の変化を保存するための関数

#この関数がiteration ごとに呼ばれる。
def callback(phi):
    global cost_val
    cost_val.append(cost(phi))

init = np.random.rand(n_param)
callback(init)
res = scipy.optimize.minimize(cost, init, method='Powell', callback=callback)
plt.plot(cost_val)
plt.xlabel("iteration")
plt.ylabel("energy expectation value")
plt.show()
print(cost(res.x))

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/44587164-1340-ac99-4609-dfd9d0ff0e0c.png)


厳密解は -2.8626207640766816 らしいので、あっていそうです。

# 解説
numpyのコードをほぼ書き直すだけですが、qulacs上での変分回路は

```python
  circuit = ParametricQuantumCircuit(n)
```

と書かなければいけないことに注意。

# 結論
VQEの初歩をQulacsで実行した。
次はqiskitで。
Datadogエージェントのインストールとログ転送

#1.はじめに
Datadogのインストール手順とログ転送手順の備忘録です。
インスタンスはApacheのWebサーバを想定しております！

#2.公式ドキュメント
今回の手順のベースは公式に書かれています。読みやすい。
https://docs.datadoghq.com/ja/agent/


#3.作業開始
##3-1.エージェントのインストール
公式に倣い、インスタンスにsshして以下のコマンドを実行。
実行ディレクトリは任意だったはず。API KEYはUIから確認可能です。

```
$ ssh インスタンス
$ DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=ご自身の環境のAPI KEY bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)"
```

##3-2.datadog-agent.yamlの編集
エージェントをインストールすると`/etc/datadog-agent`ディレクトリが作成されます。
この中にエージェントのコンフィグ一式が入っており、`datadog-agent.yaml`のAPI KEYは初期設定だとブランクなので追記します。

```
$ cd /etc/datadog-agent
$ sudo vi datadog.yaml

10 api_key: ご自身の環境のAPI KEY（英数字の羅列）
```

追記後にファイルのオーナーとグループをrootから`datadog-agent`に変更。

```
$ sudo chown dd-agent:dd-agent datadog.yaml
```

##3-3.エージェントの起動
インストール時点ではエージェントが停止しているので起動します。
エージェントがActiveになるとDatadogにデータが流れ始めるので、あとはUIを良い感じにします。

```
$ sudo service datadog-agent status
$ sudo service datadog-agent start
```

エージェントの設定状況が見たい場合は以下のコマンドで確認可能。

```
$ sudo datadog-agent status
```

#4.ログ転送
##4-1.datadog-agent.yamlの編集
ログを転送する場合は`datadog-agent.yaml`に以下の設定が必要です。
本手順ではApacheディレクトリに配置したアクセスログ`access.log`をDatadogに転送します。
ディレクトリやパスはご自身の環境に読み替えてください。

```
$ cd /etc/datadog-agent
$ sudo vi datadog-agent.yaml

415 logs_enabled: true
```

##4-2.conf.yamlの作成
apache.dディレクトリに移動し、conf.yaml.exampleをコピって`conf.yaml`を作成します。
この辺りの設定は公式を読むと理解が深まると思います。
https://docs.datadoghq.com/ja/integrations/apache/#containerized

```
$ cd /etc/datadog-agent/conf.d/apache.d
$ cp conf.yaml.example conf.yaml
```

作成後はviで345行目に以下を追記。
公式に構文が載っていますので必要に応じて参照してください。

```
$ sudo vi conf.yaml

345 logs:
346   - type: file
347     path: /access.log　#置いてあるディレクトリのフルパス
348     source: apache
349     service: apache　#ご自身の環境のサービス名など
```

##4-3.パーミッションの変更
ファイルのオーナーとグループをrootからdatadog-agentに変更します。

```
$ sudo chown dd-agent:dd-agent datadog.yaml
```

##4-4.エージェントの再起動
変更後にエージェントの再起動で`conf.yaml`を読み込んであげるとログ転送が開始され、UIの`Logs`から閲覧が可能です。

```
$ sudo service datadog-agent status
$ sudo service datadog-agent restart
```

#5.おわりに
ログ転送はドキュメントの読み込みが必要でしたが、特にハマりはしませんでした。
インストールは本当にONE-STEPですw
公式は偉大だ！

本記事が読んで頂いた方のお役に立てますと幸いです。
形態素解析の結果を利用してTF法により特徴抽出をする

### はじめに
本記事では、文書分類器を実装するための特徴抽出方法としてのTF(Term Frequency method)法について解説する。

#### 1. 形態素解析
文書分類では、文書内の単語の情報を利用する。日本語は英語のように単語の区切りが明示された分かち書き言語ではなく、非分かち書き言語であり、そのため、文書内の各文を単語に分割する必要がある。文を単語に分割し、各単語の品詞を推定することを形態素解析という。

ここでは、オープンソース形態素解析ソフトウェア MeCab(めかぶ)を使う.
• http://taku910.github.io/mecab/

#### 2. 特徴抽出
分類問題を扱う際、一般に、データ中の、分類に利用する情報のことを特徴量と呼び、この特徴量をデータから抽出する作業を特徴抽出と呼ぶ。
文書の分類では、文書中の単語が特徴量として利用される。

文書内の各単語の出現頻度は、しばしば、単語の重みとして利用される。この重み付け法をTF法(Term Frequency method)と呼ぶ。TF 法では、出現頻度の高い単語ほどその文書において特徴的な単語であるとみなす。なお、単語の並び、出現順序は考慮されないことに注意。

#### 3. 実装コード
```python:tf.py
import MeCab as mc
from collections import Counter
import sys
import fileinput
from pathlib import Path

def mecab_analysis(text):
    t = mc.Tagger("-Ochasen")
    t.parse('')
    node = t.parseToNode(text)
    output = []
    while node:
        if node.surface != "":
            word_type = node.feature.split(",")[0]
            if word_type in ["形容詞","動詞","名詞","副詞","助動詞","記号","助詞"]:
                output.append(node.surface)
        node = node.next
        if node is None:
            break
    return output

if Path(sys.argv[1]).exists():  
    for line in fileinput.input():  
        if line:
            line = line.replace('"', '')
            line = line.replace('\\', '')
            words = mecab_analysis(line)
            counter = Counter(words)
            for word, count in counter.most_common():
                if len(word) > 0:
                    print("%s:%d "%(word, count),end ="")
            print("")
        else:
            break
```

####4. 実行方法 
#####対象ファイル
```plaintext:test.txt
コンパクトで部屋の隅に立てかけておいて、使いたいときにすぐに使えます。吸引力もすばらしく、こんなにホコリがあったの？と驚きます。値段も手頃、お勧め商品です。
こちらのレビューを見て購入を決めました。うちの掃除機は日立製（昨年購入）なのに吸い口に合わず、付属のアタッチメントでなんとかくっついているという感じです。でもグラグラなので当然かけている最中に何度も外れてしまいます。確かに布は吸い込まずに布団に掃除機をかけることはできますが、同じ日立製なのに合わないなんてがっかりしました。どれ位ほこりがたまるか楽しみで、新しい紙パックに取り換えてから掃除をしてみました。一通りかけ終わり、紙パックの中をのぞいてみましたがたまっていませんでした。グラグラだからほこりを吸い込んでいないのでしょうか？またまたがっかりです。

```
各行がそれぞれ入力文書となる。

#####実行方法
次のようにしてコマンドを実行する。

```sh
python3 tf.py test.txt > output.txt
```
第一引数に対象ファイルを与え、TF法により特徴抽出がされた結果をここではoutput.txtに出力している。

#####出力

```plaintext:output.txt
に:3 、:3 。:3 の:2 て:2 ます:2 も:2 コンパクト:1 で:1 部屋:1 隅:1 立てかけ:1 おい:1 使い:1 たい:1 とき:1 すぐ:1 使え:1 吸引:1 力:1 すばらしく:1 こんなに:1 ホコリ:1 が:1 あっ:1 た:1 ？:1 と:1 驚き:1 値段:1 手頃:1 勧め:1 商品:1 です:1 
て:8 。:7 に:7 の:6 を:6 た:5 まし:4 、:4 掃除:3 は:3 な:3 で:3 が:3 購入:2 機:2 日立:2 製:2 合わ:2 ず:2 いる:2 です:2 グラグラ:2 かけ:2 ます:2 ない:2 がっかり:2 し:2 ほこり:2 か:2 紙:2 パック:2 み:2 い:2 こちら:1 レビュー:1 見:1 決め:1 うち:1 （:1 昨年:1 ）:1 吸い:1 口:1 付属:1 アタッチメント:1 なんとか:1 くっつい:1 という:1 感じ:1 ので:1 当然:1 最中:1 何:1 度:1 も:1 外れ:1 しまい:1 確か:1 布:1 吸い込ま:1 布団:1 かける:1 こと:1 でき:1 のに:1 なんて:1 どれ:1 位:1 たまる:1 楽しみ:1 新しい:1 取り換え:1 から:1 一:1 通り:1 終わり:1 中:1 のぞい:1 たまっ:1 ませ:1 ん:1 でし:1 吸い込ん:1 でしょ:1 う:1 ？:1 またまた:1 
```
特徴抽出結果が出力されている。
ローカルのjsonデータをphpからjavascriptに渡すときのSyntaxError解決策


javascriptでテスト用のjsonデータをローカルから読み込む必要があったのですが、ajaxを使用してローカルファイルを読み込もうとすると、クロスドメインによるエラーが発生します。
参考リンク：[JavaScript のクロス ドメイン (Cross-Domain) 問題の回避と諸注意](https://tsmatz.wordpress.com/2011/06/24/jsonp-cross-domain/)

そこで、一旦phpでjsonデータを読み込んでからjavascriptに渡そうとしたのですが、今度は、
「Uncaught SyntaxError: '' string literal contains an unescaped line break」
が発生しました。

どうやら、テストデータを作成するときに、最終行に改行が入っていたみたいです。
phpのrtrim関数を使用して除去したところ、うまくいきました。
参考リンク：[phpマニュアル "rtrim"](https://www.php.net/manual/ja/function.rtrim.php)

```php:json_php2script.php
<?php
        $url="data.json";//読み込むjsonファイルを指定
        $json_php = file_get_contents($url);//jsonデータの読み込み
        $json_php = rtrim($json_php);//rtrimで改行を除去
?>
<script>
let json = JSON.parse('<?php echo $json_php; ?>');//phpからjavascriptへjsonを渡す
</script>
```
Python3.7でmysql.connectorとsshtunnelで接続する

#概要
Python3.7でMySQLにSSH接続しようとしてらハングアップしてマハッタのでその時のメモ

#試したこと
Paramikoを利用してUbuntuサーバで稼働しているMySQLにログインしようとしたらハングアップした。Web検索したらsshtunnelをmysql.connectorを利用したら簡単にできると書かれたいたのでトライ。サンプルコードを試したがMySQL接続でハングアップする。

ハングアップする原因を調べたら「server.daemon_forward_servers = True」を設定するようにと書かれたいた。しかし設定してもハングアップする。なお、sshtunnelプロジェクトのページには次なようなことが書かれている。要するにこの設定は不要とのこと。

```
Remove useless daemon_forward_servers = True hack for hangs prevention (is not fully backward compatible)
```

更にWebを調べたらpymysqlでは正常に接続できると書かれたある。しかしpymysqlでは他の問題があるため今回はmysql.connectorを利用することにした。

#対策
mysql.connector.connect()に「use_pure=True」パラメータを指定したら接続できた。

```
import mysql.connector
from sshtunnel import SSHTunnelForwarder

    with SSHTunnelForwarder(
            ('＜サーバIP＞', 22),
            ssh_username="＜サーバログイン用ユーザ名＞",
            ssh_password="＜サーバログイン用パスワード＞",
            remote_bind_address=('127.0.0.1', 3306)) as server:
        db_connect = mysql.connector.connect(
            host='127.0.0.1',
            port=server.local_bind_port,
            user='＜MySQL用ユーザ名＞',
            password='＜MySQL用パスワード＞',
            database='＜接続するデータベース＞',
            use_pure=True
        )
        db_curs = db_connect.cursor()
        sql_cmd = f"SELECT * FROM nic_devices WHERE mac_address='{mac_address}'"
        db_curs.execute(sql_cmd)
        result = db_curs.fetchall()
        db_curs.close()
        db_connect.close()
        print(result)
```

以上
502 Bad Gatewayの解決方法

### 環境
* Rails 5.2.3
* Capistrano
* EC2
* Nginx
* puma

### エラー内容
デプロイ後、ブラウザにてアプリを再読み込みしたところ、「502 Bad Gateway」が表示された。

### 解決方法
EC2インスタンスを再起動する事で、解決できました。

手順
1. AWSにログインする。
2. EC2へアクセスする。
3. インスタンス画面へアクセスし、インスタンスを選択する。
4. 「インスタンスの状態」の「インスタンスを再起動」を実行。


以上
Unity ShaderGraph レシピ #9 半透明

#シェーダーグラフで半透明
![スクリーンショット 2020-12-28 15.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/1a1ffa87-0400-b6c7-3d4c-ff4b7592d205.png)

#作り方
知らないとAlpha値設定したのに半透明にならなくて混乱するので説明します。

### 1.MasterノードのAlpha値が透明度

![スクリーンショット 2020-12-28 15.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/d4efde15-1334-3a4f-52e4-6a79ba8c3ad1.png)

しかし、ここに値を入れただけだと不透明のままです……。
![スクリーンショット 2020-12-28 15.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/921db860-9c72-df8e-f3c5-30d5c88b2e31.png)


### 2.Masterノードの設定からアルファブレンドの設定
Masterノードの右上の歯車アイコンを押して設定変更します。
![スクリーンショット 2020-12-28 15.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/298f76e5-89dc-9543-e0cb-0a35107b8db8.png)

Surfaceの項目をTransparentに指定することでアルファブレンディング設定が有効になります。
ブレンドタイプ（通常の半透明、加算半透明等）はBlendの項目で指定します。


###完成！
![スクリーンショット 2020-12-28 15.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/1a1ffa87-0400-b6c7-3d4c-ff4b7592d205.png)


---
その他のレシピは[ShaderGraphレシピ一覧](https://qiita.com/Teppy/items/73fc6141751a62f5265d)にまとまっています
22日目：ゴーカートから学ぶ乗り物VCIの作り方

この記事はアドベントカレンダー「[【VCI】テーマパーク を作ろう](https://adventar.org/calendars/5855) 」の記事です。

# 今回の内容
今回はゴーカートを作っていこうと思います。
<img width=60% src="https://media.discordapp.net/attachments/407897870876934147/793000541470588928/2020122815194688.jpg?width=720&height=405">

ボタンを押すとどんどん加速し、ボタンから手を離すと止まるようにします。

今回は学ぶ技術は以下となります。
　・オブジェクトの正面方向を取得する方法
　・オブジェクトに速度を設定する方法

# Unity概要
Unityは特に新しい設定はありません。乗る部分とハンドル部分は別々のVCIで作り、Jointでつなげています。
ほかの設定はどうするのがベストわかりませんでしたが、試行錯誤の結果今回は今回は以下のようになりました。
　・カートのisGravityをON
　・カートのConstraintsのFreezeRotationのx,zをON
　・カートのMassを100に変更(こうした方が体などに押されて飛びにくくなるかもと思い設定。実際のところは不明？)
コースは特に何もしてないです。
　
<img width=60% src="https://media.discordapp.net/attachments/407897870876934147/792996021462368256/unknown.png">

# コードの作成
今回作成する処理には、「オブジェクトの向きを取得」して「その向きにオブジェクトの速度を設定」するという流れとなります。
　・[ExportTransform](https://virtualcast.jp/wiki/vci/script/reference/exporttransform)
この中でGetForwardとSetVelocityを使用します。


コードは以下のようになります。

``` lua
local kartSpeed= 0

function updateAll()
  local kart = vci.assets.GetTransform("Kart")
  kart.SetVelocity(kart.GetForward()*kartSpeed)
end

function onUse(use)
  --ボタンを押したら加速する
  if use == "Controller_Kart" then
    kartSpeed = kartSpeed + 1
  end
end

function onUngrab(target)
  --ボタンを離したら停止
  if target == "Controller_Kart" then
    kartSpeed = 0
  end
end
```

実際に動かすと以下のようになります。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ゴーカート追加したので記事書きました！操作性は難ありです！٩( &#39;ω&#39; )و <a href="https://t.co/LK4tAaMnAx">https://t.co/LK4tAaMnAx</a> <a href="https://t.co/paEqs0UAw5">pic.twitter.com/paEqs0UAw5</a></p>&mdash; ＃らいと（きょろ、ちょべりば→ぐ） (@lightjug) <a href="https://twitter.com/lightjug/status/1343445647807016961?ref_src=twsrc%5Etfw">December 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 補足
今回は移動の方法として速度を設定する方法を取りましたが、他にも以下のような方法があるかと思います
　・毎フレーム位置を移動する(SetPositionで移動)
　・物体に力を加える(addforceを使用)
それぞれ長所短所が在ると思うので内容に応じて使い分けるといいと思います。(正直私もよくわかってないです)
また、他にも方法があれば教えていただきたいです。


# 終わりに 
いかがでしたでしょうか？
今回はカートという地面に接する物を作りましたが、もちろん空をとぶようなものを作成することも可能だと思います。
(もしかしたらそちらのほうがカートよりも楽かもしれません)
次回は花火を作成予定です。２回に分ける予定です。
Vueのインスタンスプロパティを学習する【作成中】

[インスタンスプロパティ](https://jp.vuejs.org/v2/api/#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)