OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP】PHP_CodeSniffer でコードを整形する

## はじめに
チーム開発をしているときに各々のルールでコードを書いていたらいつのまにかコードがカオスに…。
なんてことないように同じルールにそってコードが整形されていったら便利ですよね。

PHPに `PHP CS Fixer` と `PHP_CodeSniffer` という **規約にそってコードを読み取ってくれるライブラリ** があります。
今回は `PHP_CodeSniffer` について導入手順と使用方法について見ていきます。
**(※ `PHP CS Fixer`、規約については後日執筆予定です。)**

## 目次

- [はじめに](#はじめに)
- [目次](#目次)
- [Installation](#installation)
- [Getting Started](#getting-started)
- [Usage](#usage)
- [使いやすいように](#使いやすいように)
    - [phpcs.xml](#phpcsxml)
    - [コマンド](#コマンド)
- [カスタムコマンドの追加](#カスタムコマンドの追加)
    - [コマンド](#コマンド-1)
- [おわりに](#おわりに)
- [参考文献](#参考文献)
    - [規約](#規約)
    - [GitHub](#github)
    - [Composer](#composer)


## Installation

codesniferを使用したいのは開発環境のみなので `-—dev` を付けます。

```php
composer require "squizlabs/php_codesniffer=3.*" --dev
```

https://github.com/squizlabs/PHP_CodeSniffer#composer


composer については以下参照。

https://qiita.com/suzu12/items/053c8dfe72ccf7c44df3


## Getting Started


`PHP_CodeSniffer` が導入できたのでプロジェクトで使用できるようになります。

`psr-12` にそって検知・整形をしいきます。

https://www.php-fig.org/psr/psr-12/

```sh
# 規約に反している箇所を検知
./vendor/bin/phpcs --standard=PSR12 [対象ファイル]
# 規約に沿って整形
./vendor/bin/phpcbf --standard=PSR12 [対象ファイル]
```

https://github.com/squizlabs/PHP_CodeSniffer#getting-started

## Usage

オプションなど詳細な使用方法はこちらです。

https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage


## 使いやすいように
上のコマンドを毎回打つのは面倒です。（覚えられませんし…）
そこであらかじめルールを書いた設定ファイルを用意し、それを使用して使えるようにしていきます。

### phpcs.xml

ルート直下にphpcs.xmlを作成。

```sh
touch phpcs.xml
```

`PSR12` に対応。

```xml:./phpcs.xml
<?xml version="1.0"?>
<ruleset name="Custom Standard" namespace="MyProject\CS\Standard">

  <description>PSR12</description>
  <!-- 対象ファイル -->
  <file>./</file>

  <!-- 除外したいファイル -->
  <exclude-pattern>./vendor/*</exclude-pattern>

  <!-- 色を付けてわかりやすく -->
  <arg name="colors"/>

  <!-- s: エラー時ルール表示, p: 進捗表示 -->
  <arg value="sp"/>

  <!-- 適用規約 -->
  <!-- PSR-12 PSR-1が前提となっているので -->
  <rule ref="PSR12"/>
</ruleset>
```

### コマンド

```sh
./vendor/bin/phpcs --standard=phpcs.xml 
./vendor/bin/phpcbf --standard=phpcs.xml 
```

## カスタムコマンドの追加
さらに簡単に使用できるように `composer.json` の `scripts` に追記していきます。



```php:composer.json
"scripts": {
        "phpcs": "./vendor/bin/phpcs --standard=phpcs.xml",
        "phpcbf": "./vendor/bin/phpcbf --standard=phpcs.xml"
}
```

https://getcomposer.org/doc/articles/scripts.md#writing-custom-commands


### コマンド

直感的に使用できるようになりますね。

```sh
composer phpcs
composer phpcbf
```

## おわりに
以上のような設定をチーム内で決めておくことで
規約に沿って開発をすすめることができます。
また、規約にそって書くという意識もチーム全体で芽生えるのかなと思いました。
このようにすることでコードレビューの際レビュワーも気にせず見れますし
可読性も上がっていると感じています！

## 参考文献

### 規約
- [PSR-12: Extended Coding Style](https://www.php-fig.org/psr/psr-12/)

### GitHub
- [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)

### Composer
- [Composerコマンドまとめ](https://qiita.com/suzu12/items/053c8dfe72ccf7c44df3)
- [Writing custom commands](https://getcomposer.org/doc/articles/scripts.md#writing-custom-commands)
今更始めるM5SickV その１ V-Training編

# はじめに
<!-- 発端や概要を記載 -->
今更M5StickVを触ったのですが、記事が古いものが多くて色々混乱したので、備忘録として残します。
この記事では簡単に物体認識ができるV-Trainingのやり方を説明します。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [事前準備・セットアップ](#Chapter1)
1. [いざV-Training](#Chapter2)
1. [結果](#Chapter3)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 事前準備・セットアップ
この[公式サイト](https://docs.m5stack.com/en/related_documents/v-training)を見るのが正解でした。
以下、セットアップの流れです。
※今回はKflash_GUIを使ってFirmwareを書き込みました。

* Firmwareのダウンロード
* Kflash_GUIのダウンロード
* Kflash_GUIを使って、Firmwareを書き込み
    * "権限がありません"とエラーが発生した場合は、M5StickVを冷ましてください。笑
* V-Trainingを実行するためのソースをダウンロードしてM5StickVにコピー
    * "Click here download boot-M5StickV"と書いてあるリンクからダウンロード

<a id="#Chapter2"></a>
# いざV-Training
① 対象の撮影
V-Trainingに必要な条件は次の通りです。

* 認識させる対象は3種類"以上"
* １種類あたり35枚"以上"の画像が必要
    * ここが肝です。似たような画像があると、V-Training時に除外されて35枚以下となりエラーとなるので、40枚近く撮影することをお勧めします。

②専用サイトでV-Trainingを実行
撮影後はSDカード上に生成された「train」「vaild」をPCにコピーして、１つのフォルダにまとめてZIPで固めます。
※hoge.zip配下に./trainと./vaildという構成にする必要があります。

ZIPに固めたら、公式の通り[このサイト](http://v-training.m5stack.com/)にファイルをアップロードします。
アップロード後、10分ぐらいすると結果がメールで届きます。
メールにはリンクが記載されて、そこからソースや資材がダウンロード出来るので、ダウンロードしてSDカードにコピーします。

<a id="#Chapter3"></a>
# 結果
背景によっては誤認識することが多いですが、認識してくれました。
※boot.pyを読み込まない（この認識画面にならない）時は、電源を落としてSDカードを抜き差しすれば治ります。

![IMG_1074.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/44d8c6fd-1bbc-a920-cb92-ed4949763f45.jpeg)

![IMG_1076.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/616ab2a1-ff52-a9d4-dcd8-c9694d2ed10e.jpeg)
![IMG_1080.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/2cd2788f-857f-3d33-d56b-92eee52a406d.jpeg)

<a id="#reference"></a>
# 参考文献
- [公式の解説サイト](https://docs.m5stack.com/en/related_documents/v-training)
- [スイッチサイエンスの解説](https://mag.switch-science.com/2020/06/30/m5stickv-v-training-1/)
HDD交換したいのに、同じHDDを使っていてどのケーブルを外していいか分からないときのコマンド

# 動機
家のServerにWDの2TB HDDが複数台つながっている。
1台動作が怪しくなったので交換のために外したいが、
どれをはずしていいか判別がつかなかった。
1台ずつ外す＆起動は面倒なのでLinuxコンソール上でどれを除いていいか明確にしたい

# 解決策
`hdparm`を実行する
でてきた「Serial Number」がHDDの表面に記載されているので判別し交換する。

```bash
# hdparm -I /dev/sd?|grep -E "Number|/dev"
/dev/sda:
        Model Number:       WDC WD10JPVX-08JC3T5
        Serial Number:      WD-WX51AB430xxx
/dev/sdb:
        Model Number:       WDC WD20EARS-00MVWB0
        Serial Number:      WD-WCAZA0810xxx
/dev/sdc:
        Model Number:       WDC WD20EARS-00MVWB0
        Serial Number:      WD-WMAZA3850xxx
/dev/sdd:
        Model Number:       ST8000DM004-2CX188
        Serial Number:      ZCT2Jxxx
/dev/sde:
        Model Number:       WDC WD20EARS-00MVWB0
        Serial Number:      WD-WCAZA0370xxx
/dev/sdf:
        Model Number:       WDC WD20EARX-00PASB0
        Serial Number:      WD-WCAZA9038xxx
/dev/sdg:
        Model Number:       WDC WD20EARS-00MVWB0
        Serial Number:      WD-WCAZA0366xxx
/dev/sdh:
        Model Number:       ST12000VN0007-2GS116
        Serial Number:      ZJV3Mxxx
```
[java入門]　finalについて簡易解説

# javaのfinalについて

  ・finalは修飾子の1つ。変化をさせたくない変数などに利用する。

#### finalとは
  修飾子の一つ。それが最後のものであることを表す。
  例）円周率のような値はどこであっても変わることのない定数なので一度代入されたなら決して変わって欲しくない。
  そのため最後の値という意味でfinalを使っていく。
#### 種類
  ・final変数：　一度しか値を代入することができない変数を宣言できる。
  ・finalクラス：　クラスにfinalをつけるとクラスを継承できなくなる
  ・finalフィールド：　フィールドはクラス変数とインスタンス変数にfinalをつけて宣言することができる。
  ・finalメソッド：　サブクラスでメソッドをオーバーライドできなくなる
[java入門]java継承とは



##java 継承とは

・あるクラスを作っているときにクラスの一部を変更して使い回す際に実装するもの。
 つまり、あるクラスで定義したプロパティとメソッドをそのまま受け継ぎつつ独自のプロパティやメソッドを差分として定具することが可能。
・継承元のクラスを「スーパークラス」と呼ぶ

サブクラスを継承して作成
--

```java
public class EmployeeDev extends EmployeeBase {
   public EmployeeDev() {
   }
   public EmployeeDev(String employeeName) {
     super.setEmployeeName(employeeName);
     super.setDivisionName(引数を指定);
   }
 }
```

・これでスーパークラスの「EmployeeBaseクラス」を継承したサブクラスの「EmployeeDevクラス」が完成した。

### 継承のメリット
 ・継承元のスーパークラスを変更すれば継承先のサブクラスまで変更反映される
   もちろん全てのプロパティやメソッドを使わず継承先のサブクラスをで独自のプロパティやメソッドの追加実装で必要以上の定義や修正をすることなく効率的な開発が可能になる。

 Java asListメソッド
・配列からリストに変換する

public static List asList(A...B)
A: 任意の型, B 変換する配列

 Javaには、言語仕様に組み込まれた仕組みとして配列が用意されているが作法的には、まずはコレクションフレームワークを優先して利用すべき。
 理由は以下の通りである。
   ・コレクションフレームワークの方が機能性にも優れ、用途に応じてさまざまなクラスが提供されている。
   ・クラスライブラリであることから他の、クラスとの親和性も高い
asListメソッドの機能はあくまで配列をコレクションフレームワークで利用できるようにリストの皮を被せるもの。
よってリストへの変更はそのまま元の配列にも反映されるが、追加/削除はUnSupportedOperationException例外になる。
AWS CLIでS3にファイルをアップロードする

# はじめに
サーバーレスアプリのフロントエンドをS3でホストしていて、ビルドファイルのアップロードに使ったコマンドのメモ

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [アップロード手順](#1-アップロード手順)
1. [おまけ](#2-おまけ)
1. [参考文献](#3-参考文献)


#1. アップロード手順
#### awscliをインストール & 設定 (awscliを使うのが初めての場合)
```
brew install awscli
aws configure
```
`aws configure` を実行するとアクセスキーとシークレットキーを聞かれるので自分のアカウントのキーを入力する


#### AWS上のS3バケットのリストを表示
```
aws s3 ls
```
設定がうまくいっているかと、自分がファイルをアップロードするS3バケットが存在するかどうか確認


#### アップロードしたいビルドファイルがあるフォルダーに移動
例

```
cd /dist
```

#### ファイルをアップロード
以下は `/dist`フォルダーのすべてのアップロードするときの例

```
aws s3 sync . s3://BUCKET_NAME/ --include "*" --acl public-read --cache-control "max-age=3600”
```






#2. おまけ
S3 + CloudFront + Route 53でフロントエンドアプリをホストしている場合は、ファイルのアップロードを反映させるために、CloudFrontのキャッシュを以下のコマンドでクリアする

```
aws cloudfront create-invalidation --distribution-id CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
```


<a id="#reference"></a>
#3. 参考文献
- [AWS CLI での高レベル (S3) コマンドの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html)
- [CloudFrontのキャッシュをAWS CLIで削除する](https://qiita.com/yamamoto_y/items/cddba970ba0785b98461)
WordPressのサイト解析サービス「WP-Search」β版を開発しました

WordPressのサイト解析サービス「WP-Search」のβ版を開発しました。
初めて開発したサービスなので、何かとイケテナイところもあるかもしれません。

![image-manuon-wp-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2180335/3ebf1767-cfb7-9589-383b-33e35620b300.png)

#WP-Searchの概要
解析したいサイトやブログのURLを入力するだけで、WordPress（ワードプレス）のサーバー、テーマ、プラグインなどの分析結果が表示されます。

#WP-Searchの使い方

1. 解析したいサイトやブログのトップページURLを入力します。
1. サーバー、テーマ、プラグインなどの分析結果が表示されます。

これだけです。

画像で説明するより実際に見てもらった方が早いので、以下からアクセスしてみてください。

　→ [WordPressのサイト解析サービス「WP-Search」](https://wps.manuon.com/)

#WP-Searchでできること
- **どんなサーバーを使っているか検出します。**
WordPress（ワードプレス）でよく利用されているレンタルサーバー、VPS、クラウドサーバーなどは、自動でカテゴリー分けされるようになっています。

- **どんなデザインテーマを使っているか検出します。**
WordPress（ワードプレス）でよく利用されている国産テーマは、自動でカテゴリー分けされるようになっています。

- **どんなプラグインを使っているか検出します。**
自動的にカテゴリー分けされるようになっています。
バックグラウンドで動作するようなプラグインは検出できません。

- **人気のサービスをランキングで表示します。**
解析されたサイトの中で、どのサーバー、テーマ、プラグインが人気なのかを表示します。
サイトの事例集としても利用できると思っています。

#WP-Searchの背景
海外製ですでに有名なツールがいくつか存在します。
- [IsItWP](https://www.isitwp.com/)
- [WHAT WORDPRESS THEME IS THAT?](https://whatwpthemeisthat.com/)
- [WPthemeDetector](https://www.wpthemedetector.com/)
- [WPSNIFFER](https://chrome.google.com/webstore/detail/wpsniffer-wordpress-theme/kihhefcbenhkjgjhchanjfhhflaojldn?hl=ja)

しかし、これらには以下のような不満がありました。

- 日本語に対応していない
- 人気ランキングが世界全体
- 検出精度が低い
- サーバー、テーマ、プラグインをすべて検出するためには、複数サイトにアクセスする必要がある

そのため、日本に特化することで、検出精度を高めて、見やすいサイトを目指しました。
その代わり、検出に少し時間がかかってしまっています。

#開発環境
- AWS
- CloudFront
- PHP
- JavaScript
- CSS
- HTML

#ブックマークレットにも対応
もし気に入っていただけたら、ブックマークレットにも対応しているので、登録しておいてもらえると嬉しいです。
ブックマークレットの登録方法も、リンク先に記載しています。
　→ [https://wps.manuon.com/](https://wps.manuon.com/)

#開発者について
Webメディア「マニュオン」を運営しているsuyaです。
　→ [https://manuon.com/](https://manuon.com/)
Twitterもやってます。
　→ [@suyasite](https://twitter.com/suyasite)
3日でできるSwift爆速学習法

#0から学ぶSwift
iOSプリで利用されるSwiftを0から学習をし始めて、3日で基本的なことを理解できるようになりました。
学習に使用したサイトをまとめたので、これからSwiftを習得したいと思う方はぜひ利用してみて下さい。
他の言語に比べると学習コストは低いし、独学でもできる難易度なのでオススメです。

#STEP1　アプリ作成

最初にしたのは、アプリの作成です。
こちらの記事を参考にTodoアプリを作りました。

https://qiita.com/pe-ta/items/8f474358d1dd789557f3

＜ポイント＞
Xcodeでプロジェクトを新しく立ち上げるのですが、
SwiftUIを使うかStoryboardを使うか選択する必要があります。
初心者はStoryboardから始める方が簡単みたいなので、そちらから進めましょう。

#STEP2　基本的なXcodeとSwiftの使い方
作ってみて、なんとなくXcodeやSwiftがどんな感じかを掴んだら
こちらでしっかりした知識を学びましょう。
ここまでやれば、ある程度Swiftの基本的な部分は理解できるようになったと思います。


https://www.youtube.com/watch?v=3v4OIds-OOg

今やYouTubeでも学習できるようになっているのはいい時代ですね。
有料の教材としてもいいような内容でした。
ここまでで基本的なところは大体理解できると思います。

#STEP3　Swiftの概念
Swift特有の概念みたいなものも色々あったりするので、
こちらを参考に分からない概念とかはググったり実際に使ってみたりするといいと思います。

[Swiftの文法まとめ](https://swift.codelly.dev/guide/swift%E3%81%A8%E3%81%AF/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9ESwift%E3%81%A8%E3%81%AF.html)


クロージャや循環参照はすぐに理解するのは難しいので、
Swiftを扱う中で少しずつ理解をしていければいいんじゃないかと思います。

##今後のSTEP
ざっくりと3STEPで紹介しましたが、自分の好きな順番でやってみてもいいと思います。
この先は何かアプリを作ってリリースするのが一番勉強になるでしょう。
あとはサンプルコードとかみて分からない概念を理解していく感じですかね。

もっとこういう教材で学習したほうが分かりやすいよとかあれば、ぜひ教えてくださると嬉しいです！
3Dプリント設計のためのBlender入門

プログラミングは PC 内だけの「ものづくり」ですが，3D プリンタに Arduino などのマイコンとセンサやモーターを組み合わせれば，実世界中で機能する，簡単な家電的なものも作れます．木工とかと違って「ソースコード」に対応する造形データが残り，それを修正して改善していくことも出来るのでエンジニア向けのようにも思えます．

私（研究者）は実験のためのちょっとした治具を作ったりするのに3Dプリンタを使っていますが，趣味（遊び）でもいろいろ変わったものを作っています．それらはすべて<a href="https://www.thingiverse.com/shiura/designs">Thingiverse</a>で公開しているので，ぜひよければ見てみてください．過去１年間の作品？を紹介した動画もあります（以下）．

<iframe width="800" height="450" src="https://www.youtube.com/embed/67kMFOxW4pc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

さて本題です．3Dプリンタで出力する物体の造形（設計）をどのソフトで行うか．Autodesk Fusion 360 も人気がありますが，平面図では表しにくい立体的な形状の造形には Blender も便利です．最近はかなり安定になり，使いやすくなっていると思いますし，最近は<a href="https://www.itmedia.co.jp/news/articles/2110/15/news110.html">Apple が Blender の開発を支援する</a>というようなニュースも出ています．そこでここでは，私がよく使っている Blender で，3Dプリント向けの寸法がきちんと決まった図形を造形する方法を説明します．といっても動画の紹介です．

<iframe width="800" height="450" src="https://www.youtube.com/embed/yj5hEU9_n2s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Blender はもともと CG 向けのソフトなので，わりとフリーハンドでも造形でき，そういう手順を説明したサイトが多いです．また，CG を作る上で必要な色や照明，アニメーション関係の解説も多いです．しかし造形だけなら割と一部の機能で完結しますし，CAD と同様に寸法の数値指定もできます．また，ある程度造形が進んできてからの寸法の微調整も可能です．Fusion 360 などのいわゆる「パラメトリックCAD」はより理詰めの設計が得意で，あとからの修正もより簡単ですが，条件設定の構成を間違えると行き詰まってしまったり，エラーが解決できなくなったりと難しい部分もあります．その点，Blender のような直接的な造形ソフトでは慣れればかなり早く思い通りの形状が造形できます．
bootstrap4 から bootstrap5 への移行メモ

# left/rightがstart/endに変更

クラス名にleftやrightがあるものは軒並みstart/endに変更
mr-1/ml-1とかもme-1/ms-1に変更

| bs4 | bs5 |
|:-:|:-:|
| ml-*  | ms-*  |
| pl-*  | ps-*  |
| mr-*  | me-*  |
| pr-*  | pe-*  |
| pr-*  | pe-*  |
| dropdown-menu-left | dropdown-menu-start | 
| dropdown-menu-right | dropdown-menu-end |

# input type="file"にもform-controlが適用
こちらは実装レイアウトがいろいろなので適宜改修。

# data-toggle="modal"などのdata属性値が変更
`data-toggle="modal"`は`data-bs-toggle="modal"`のように`bs`が付くようになる
dropdownも同様

# modal内のCloseボタン
以前の実装例
```html
      <div class="modal-header">
        <h5 class="modal-title">Title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
```
bs5では以下のようになる
```html
      <div class="modal-header">
        <button type="button" class="btn btn-close" data-bs-dismiss="modal" aria-label="Close">
        </button>
      </div>
```

# HTMLEditor(summernote)
bootstrap5は0.8.19から提供されているようだが
0.8.19(or 0.8.20)を入れるとnpm run dev(prod)でエラー

```bash:
ERROR in ./node_modules/summernote/dist/summernote-bs4.min.js 2:85-102
Module not found: Error: Can't resolve 'jQuery' in '/node_modules/summernote/dist'
```

app.jsに含めるのは現段階では無理っぽいので
node_modules/summernote/dist配下を
public/vendor/summernote/
のようにコピーしてからカスタム

# Datepicker
Bootstrap4ではTempus Dominusなどを利用していたが
Bootstrap5では脱jqueryになっているため別ライブラリのがよさげ
Bootstrap5ではないがjqueryなしのライブラリでは以下への置換
[flatpickr](https://flatpickr.js.org/)
tar.gzファイルのダウンロードから解凍保存をメモリ上で実施したい

## やりたいこと
tar.gzファイルを外部からダウンロードし、メモリ上で解凍。
解凍したファイルを任意のディレクトリに保存。（tar.gzファイルは保存しない）

## 実現方法
```python
import requests
import tarfile
import io

with tarfile.open(fileobj=io.BytesIO(requests.get('tar.gzの取得先URL').content)) as tarf:
    tarf.extractall('保存先ディレクトリ', members=tarf)
```
【学習記録②】Vueインスタンスについて

#はじめに
Vue.jsを最近勉強し始めたので学んだ文法などを備忘録としてメモしていこうと思います。

##Vueインスタンスの生成
Vueインスタンスを生成する場合は以下のように`new Vue`とし、`el`プロパティにVueテンプレートのどの部分へ適用するVueインスタンスなのかを、セレクタを指定することで示します。

https://jp.vuejs.org/v2/api/index.html#el

```html:index.html
<div id="app">
  <p>{{ message }}</p>
</div>
```

```js:index.js
new Vue({
  el: "#app", // <--上記htmlファイル内のid要素appの部分に適用する
  data: {
    message: 'こんにちは'
  }
})
```

また、`el`要素を使わずに`$mountメソッド`を利用する方法もあります。

```js:index.js
new Vue({
  data: {
    message: 'こんにちは'
  }
}).$mount('#app')
```

##リアクティブ
Vue.jsではインスタンスの生成時にdataプロパティに記載したオブジェクトのキーにgetter/setterを登録します。
これにより、変更された値を追跡することが可能になります。

https://jp.vuejs.org/v2/guide/reactivity.html

```html:index.html
<div id="app">
  <p>{{ message }}</p>
  <p>{{ message2 }}</p>
</div>
```

```js:index.js
let v = new Vue({
  el: '#app',
  data: {
    message: 'こんにちは'
  }
})

v.message = 'こんにちは1'
v.message2 = 'こんにちは2'
```

上記ではdataプロパティに記載していない`message2`も出力されているが...
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/14dba4f8-5e8e-874c-1097-31e0949a6b2e.png)

以下のようにボタンを追加して変更をしてみるとmessage2は変わりません。（変更の追跡ができていない）

```html:index.html
<div id="app">
  <p>{{ message }}</p>
  <p>{{ message2 }}</p>
  <button v-on:click="message2 = 'こんにちはボタン'">ボタン</button>
</div>
```
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/a1f8c41a-afcf-9893-468b-a321f3d1cf16.png)

※dataプロパティに登録しているmessageはもちろん変更されます。

```html:index.html
<div id="app">
  <p>{{ message }}</p>
  <p>{{ message2 }}</p>
  <button v-on:click="message = 'こんにちはボタン'">ボタン</button>
</div>
```
![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/1b4f71a8-a584-2f98-ac00-0bf04a9909ad.png)

##templateプロパティとrender関数
上記まではhtmlファイルにテンプレート構文を書いていましたが、こちらはVueインスタンスの方に書くこともできます。
その場合はtemplateプロパティ、もしくはrender関数を用います。

###templateプロパティを用いる場合

```html:index.html
<div id="app"></div>
```

```js:index.js
new Vue({
  el: '#app',
  data: {
    message: 'こんにちは'
  },
  template: '<p>{{ message }}</p>'
})
```
下記のように出力されていることが分かります。

![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/a5919832-0e0f-a4cd-d158-e5071ee6fbcb.png)

###render関数を用いる場合
render関数を用いる場合は上記のtemplateプロパティで記述したhtmlファイルはそのままに、jsファイルが以下のように書き換わります。出力結果は上記同様です。

```js:index.js
new Vue({
  el: '#app',
  data: {
    message: 'こんにちは'
  },
  render: function(h){
  	return h('p', this.message);
  }
})
```

https://v3.ja.vuejs.org/guide/render-function.html#h-%E3%81%AE%E5%BC%95%E6%95%B0

また、これらはDOMをそのまま返却しているのではなく、`仮想DOM`と呼ばれるものを返却しています。
https://v3.ja.vuejs.org/guide/render-function.html#%E4%BB%AE%E6%83%B3-dom-%E3%83%84%E3%83%AA%E3%83%BC
【JavaScript】関数とオブジェクト②　コールバック関数


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/338904737ed2849a1bd9

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.関数とオブジェクト

関数は**実行可能なオブジェクト**である
この点が他のオブジェクトと異なる

下記コードで確認すると

`````javascript
// helloと出力される関数を用意
function a() {
  console.log("hello");
}
// propには0を、methodでは「メソッド」と出力されるように設定
a.prop = 0;
a.method = function(){
  console.log("メソッド")
}

// 実行すると下記のようにそれぞれ出力される
// hello
a();
// メソッド
a.method();
// 0
console.log(a.prop);

// このように関数宣言によって宣言した関数を
// dot記法を使ってプロパティやメソッドが使用できる
// ()をつけると関数が実行される
`````

###2.コールバック関数

* 他の関数の**引数として**渡される関数
* 再利用性が高い

####使い方

````javascript
// コールバック関数
// 関数を定義
function hello(){
  console.log("hello")
}
// helloが渡ってくる関数を定義
function fn(cb){
  cb();
}
// 実行してhelloと出力される
fn(hello);
// オブジェクトだからhelloを渡せる
// 上記のfn(cb)にhelloの値が渡ってくることになる
// もちろん下記のように定義すてばconsoleでbyeが呼ばれる
function bye(){
  console.log("bye");
}
fn(bye)

// 上記のようなhelloやbyeのように渡された関数をコールバック関数と呼び、
// fn(cb)の内部で実行されている
`````

####コールバック関数が実行されるときに引数がある場合

```javascript
// 引数に名前を設定する
// helloの引数にnameを設定
function hello(name){
  // コンソールにhello + nameが出力される
  console.log("hello" + name);
}

function bye(){
  console.log("bye")
}

function fn(cb){
  // 引数に呼び出される名前を設定
  cb("Tom");
}

fn(hello);
fn(bye);

// 宣言する際の実引数と実行する際の仮引数が一致している必要はない
// だからbyeに影響を受けていない


// 無名関数でも定義が可能
// helloと実行される
fn(function (){
  console.log("hello");
})
// 引数を入れて実行することも可能
fn(function(name){
  console.log("bye" + name);
})
```

####よく使われるコールバック関数の実例

````javascript
// setTimeoutはJavascript側で用意されているWebAPIの１つ
setTimeout(hello, 2000);
// ここでは実引数がないため「hello undefined」と出力される
// 2000はミリ秒数　コンソールに２秒遅れて出力される
```````




今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
AWS Cloud9でターミナルを消してしまった時の対処法

解決策：
View→Consoleをクリック

![スクリーンショット 2021-10-17 10.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1432698/4d678775-0734-e58d-81a6-2b8a6489d28f.png)


焦ってしまいましたが、これだけでした。
Gitのリモートブランチをローカルでcheckoutしたときのエラー

# はじめに
リモートにあるブランチを使って開発をするために、ローカルに持ってくる方法

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [メインのコマンド](#1-メインのコマンド)
1. [エラー](#2-エラー)
1. [コメント](#3-コメント)
1. [参考文献](#4-参考文献)


<!-- 各チャプター -->
#1. メインのコマンド
既にローカルにリモートブランチの情報をfetchできていれば、このコマンドだけでリモートのブランチをローカルでcheckoutできる

```
git checkout -b local-branch origin/remote-branch
```
`local-branch` は自分がローカルで使う任意のブランチの名前でOK
`remove-branch` はローカルに持ってきたいリモートブランチの名前

#2. エラー
`fatal: 'origin/somebranch' is not a commit and a branch 'somebranch' cannot be created from it`

もしこのエラーが発生したら、ローカルにリモートブランチの情報をfetchできていない
リモートブランチの情報をローカルにfetchするコマンド

```
git fetch origin remote-branch
```
fetchコマンドを実行したらもう一度

```
git checkout -b local-branch origin/remote-branch
```

#3. コメント
リモートのブランチの情報をローカルにfetchするときに、以下のコマンドで全てのリモートブランチの情報をfetchできるはずが、何故かできなかったのでリモートブランチ名を明示してfetchしたらcheckoutできた

```
git fetch
```


<a id="#reference"></a>
#4. 参考文献
- [gitでリモートのブランチをローカルへ持ってくる](https://qiita.com/bitarx/items/ad47c9b91ae9c8272b3f)
Docker基礎 Dockerfileについて

Docker初心者がDockerfileについて勉強した時のメモです。

# Dockerfileとは?
- Docker imageの設計図 DockerfileからDocker imageを作る。
- Dockerfileという名のテキストファイル。
- INSTRACTION argument 形式で記載する。
- DockerfileはDockerfileという名前で必ず作る。

# Dockerfileのinstruction
## FROM
- ベースとなるイメージを決定する。
- DokerfileはFROMから書き始める。
- FROMの上にLayerが積み重なっていくイメージ。
- 指定するのは基本OSを指定することが多い。

```docker:Dockerfile
FROM ubuntu:latest
```
## RUN
- Linux コマンドを実行してくれる。
- RUNを使うことで好きなようにカスタマイズできる。
- RUN毎にLayerができる。

```docker:Dockerfile
FROM ubuntu:latest
RUN touch test
RUN echo 'hello world' > test
```

### Layerを最小限にするために
- DockerfileではRUN毎にimage Layerが作成されるので、RUNを連発するとdocker imageのサイズが大きくなってしまう。
- 解決策は、&&で繋げて1行にまとめる。バックスラッシュ( \ )で改行すると見やすくなる。

```docker:Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install\
  xxx\
  yyy\
```
`apt-get update` : 新しいパッケージを取得。
`apt-get install <package>` : <package>をインストール。

## cache 
- RUNで一度インスールしたパッケージは、インストール後まとめておくことで後から他のパッケージをRUNで追加した時キャッシュを使ってくれる。
- キャッシュを使うことで再度実行することなく追加したパッケージ分だけRUNを実行してくれる。

この場合、新しく`zzz`というパッケージを新しく追加。
※ `-y` はインストール時インタラクティブな質問に対して全てyesで実行してくれる。

```docker:Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \  
		xxx\
		yyy\
RUN apt-get install -y zzz
```
インストール後1行にまとめることで次回からキャッシュを使ってくれる。

```docker:Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
  xxx\
  yyy\
  zzz
```

## CMD
- CMDはコンテナのデフォルトのコマンド。
- 原則Dockerfileの最後に記述。

```docker
CMD ["実行可能なコマンド", "コマンドの引数1", "コマンドの引数2"]
```

```docker:Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
  xxx\
  yyy\
  zzz

CMD ["/bin/bash"]
```

### RUNとCMDの違いは？
- RUNはimage Layerを作るがCMDは作らない


## Dockerfileをbuildする

DockerfileをbildしてDocker imageを作る。

```terminal
$ docker bulid <directory>
```
buildするにはそのファイルまで移動してからbuildするのが一般的。
現在いる場所(current directory)の場合は`.`

```terminal
$ docker bulid .
```
buildしたimageはdangling image(noneで表示されるタグのついていないimage)なので名前をつけることができる。

```terminal
$ docker build -t <name> <directory>
```

## Dockerfile詳細
### $ docker buildの挙動
`build`時に指定したbuild contextをDocker demonに渡している。

### Docker demon
- コンテナやdocker imegeなどDockerオブジェクトと呼ばれるものを管理もの。
- クライアントはCLIツールを使ってDocker demonにコマンドを投げそれを解釈しDocker demonがイメージのビルドやコンテナの起動などを行っている。

### build context
- Dokerfileが入ったフォルダのこと。
- Docker imageをbuildする時、build contextをDocker demonに渡し、build contextの内のDockerfileと他のファイルを使ってDocker imageを作成する。
- 基本buildに使わないファイルはbuild contextに入れない。

続き

https://qiita.com/aaaasahi_17/items/e3b11af6d1ddbcc4602a

# 参考
https://www.udemy.com/course/aidocker/
よく行くおすすめの勉強場所TOP3

# はじめに
プログラミングの勉強場所って結構悩みますよね。
電源とwifi必須だし‥
僕自身自宅で勉強することが多いですが、今日は気分を変えて外で勉強しようと思った時によく行く勉強場所をランキング形式で紹介します！

## 3位 快活クラブ飲み放題カフェ
![快活.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/aa00ebb7-b910-da59-1578-9cb4658fa3a1.png)

### 料金
- 6時間：1000円(店舗によって違いあり)
- 9時間：1300円(店舗によって違いあり)

### 良いところ
- ドリンク飲み放題、アイス食べ放題、朝10時30分までパンとポテト食べ放題
- 席固定、各席に電源あり、wifi高速

### 悪いところ
- 漫画が読めるので誘惑が多い

### 解説
飲み放題カフェはいわゆるオープンスペースみたいな感じなんですが席が固定なので席を取られる心配がないですし時間指定なのでカフェみたいに長居しても平気。
店舗によってはパンとポテト以外にもおにぎりとかもあるらしい！
一応漫画喫茶なので誘惑が多いが最大の難点。休憩がてら漫画読み始めたら終わります 笑
あと結構静かなので自分のタイピングする音とか意外と響きます‥

[公式URL](https://www.kaikatsu.jp/)

## 2位 カフェドクリエ

![カフェドクリエ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/711ed07a-560e-8059-5f34-2b8be9c46588.jpeg)

### 料金
- コーヒー1杯 300円

### 良いところ
- 電源、wifiのある店舗が多い
- おかわりチケットが最強

### 悪いところ
- カフェだからやっぱりうるさいときはうるさい
- 荷物取られないか心配
- 長居しにくい

### 解説
勉強場所の定番カフェで僕がよく行くのはカフェドクリエです！ 都心にも店舗がちらほらあったはず！
カフェドクリエの最大の魅力はおかわりチケットです。コーヒーor紅茶を1杯頼むと次の1杯は半額になるというもの。
しかもおかわり対象は最初に頼んだもの以外で紅茶かコーヒー類ならOK。
なので、コーヒー2杯頼んでも500円位なのでコスパはめっちゃいいです！お金ない時はよくお世話になってます 笑
スタバにもおかわりチケットはあるけどスタバは確か対象がブラックコーヒーだけなのでコーヒーの飲めない僕にはカフェドクリエが最強だと思ってます。

[公式URL](https://www.pokkacreate.co.jp/)


## 1位 coin space

![コインスペース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/d372540c-39e1-a0dc-0ef7-e02d1b2a104f.png)

### 料金
10時間:1200円(店舗によって違いあり)

### 良いところ
- 席固定、電源、wifi完備
- 事前予約できる
- 事前登録なしでその場でドロップインもできる
- 安い

### 悪いところ
- 平日は混む

### 解説
デパート内にあるコワーキングスペースです。
10時間1200円で席固定、電源、wifi完備しかも事前に予約できる、月契約すれば10000円で使い放題、回数券と言うのもあり回数券を使えば10時間800円というコスパ面は最強。
難点はとにかく平日は混むところ。しかもビジネスパーソンが電話やらオンライン会議やらで結構うるさいです。
逆に土日はほとんど人がいないので超おすすめ！
僕は土日は基本コインスペースに行って10時間篭ってます 笑

[公式URL](https://coinspace.jp/)

# おわりに
勉強場所は色々なとこに行きましたが今はこの3つに落ち着いています。
皆さんのおすすめの作業場所もぜひ知りたいので共有してくれたら嬉しいです！
GASでごはんのアイデアを送ってくれるBotを作成してみた。

どうも、Pythonを主軸に開発を行っている学生エンジニアのirohasです。
今回は最近話題のGAS(GoogleAppsScript)を使用したLineBotを作ってみました。

<strong>使用したもの
・GAS(GoogleAppsScript)
・LINE Developers
・スプレッドシート
</strong>

コードは下記の通りです。

``` gohan.gs
// LINE Developerのアクセストークン
var access_token = "YOUR ACCESS TOKEN"
// リプライ先を特定するためのログ管理スプレッドシートID
var spreadsheet_id = "YOUR SPREADSHEET ID"
// ご飯リストのスプレッドシートID
var gohan_spreadsheet_id = "YOUR SPREADSHEET ID"

/**
 reply
 */
function reply(data) {
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };
  var text = "";
  
  if (data.events[0].message.text === "ご飯","ごはん","gohan","dinner","Dinner","Lunch","lunch","breakfast","BreakFast","Morning","morning") {
    // ご飯リストスプレッドシートを取得
    var gohan = SpreadsheetApp.openById(gohan_spreadsheet_id).getSheetByName("log");
    // A1セルから入力されている最終行まで一気に取得
    var gohanData = gohan.getRange(1, 1, gohan.getLastRow());
    // ランダムで候補を選ぶ
    var intRandomNum = Math.round(Math.random()*gohan.getLastRow());
    
    text = gohanData.getValues()[intRandomNum][0];
  }
  else {
    text = "「ご飯」って話しかけてね。"
  }

  var postData = {
      "replyToken" : data.events[0].replyToken,
      "messages" : [
        {
          'type':'text',
          'text':text + "はどうかな～",
        }
      ]
    };

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };

  return UrlFetchApp.fetch(url, options);
}

/**
 LINEからのPOST受け取り
 */
function doPost(e) {
  var json = JSON.parse(e.postData.contents);
  var data = SpreadsheetApp.openById(spreadsheet_id).getSheetByName('log').getRange(1, 1).setValue(json.events);

  reply(json);
}

```

ごはんのスプレッドシートは各自で作成し、好きな食べ物を格納していってください。
スプレッドシートIDは各々のスプレッドシートのURLを見て、"https://docs.google.com/spreadsheets/d/<strong>SPREADSHEET ID</strong>/edit#gid=0"の太字の部分をコピペして貼り付けてください。

<strong>・実行結果</strong>

![image0 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740730/7dab2a26-7930-8623-7709-7ded59da5f9d.png)

コードの19行目にて、BOTが反応するキーワードを複数用意したのでこのようにいろいろなキーワードに反応し、応答してくれます。
キーワードはいくつ作っても大丈夫なので好きなキーワードを入れて作成しましょう！


<strong>・最後に</strong>

GASで開発するのはまだ数回程度しか経験がありませんが、かなり便利だなという印象を持っています。
なによりLINEとの連携がすごく楽なのが魅力的ですよね！！！！
ニュースや天気予報など様々な分野を混ぜてマルチなBOTも作ることが出来そうなので次はそこらへんにもチャレンジしたいと思います！！！！
Laravel 8.X Sanctumが本番環境だと動かない message: "Unauthenticated." と返ってくる時の対処法

Laravel8 + Sanctum + Vue.jsでSPA認証を実装して個人開発をしている中で、ローカルでは動いていたのに本番では動かないという事態に陥ったので記録。

## ■詰まった点
Laravel Santumでログイン機能を実装
herokuで仮想本番環境としてデプロイをした結果 本番環境でloginができない
message: "Unauthenticated."　とAPIから返ってくる
正しくtokenが送れていないのかもしれないとフロントの送信部分を見るもおかしくなさそう...
## ■解決策
**Sanctumに関する環境変数を実行環境に合わせて変更する**のを忘れていた（というか知らなかった）
ルートディレクトリにある.envの環境変数 SANCTUM_STATEFUL_DOMAINSの値を本番環境のドメインに変更する

変更前

```php:.env
SANCTUM_STATEFUL_DOMAINS=localhost:8080
```

変更後(例herokuの場合)

```php:.env
SANCTUM_STATEFUL_DOMAINS=自分のドメイン.herokuapp.com
```

これで正常にログインすることができました。

### 参考記事
> [https://blog.capilano-fw.com/?p=6121 "Laravel 7.x Sanctumの使い方！実例"]
herokuを使ってデプロイしているアプリのデータベースをSequelProで可視化する！

作ったアプリをherokuを使ってデプロイしたはいいけど、データベースが...となったので、SequelProで可視化するためのメモを書いていきます。

#開発環境
* M1 Mac
* vscode
* ruby 3.0
* rails 6.1
* herokuにデプロイ済み

# いざデータベースの可視化

## step1
1. ターミナルより対象アプリのディレクトリに移動
1. ``heroku config``を実行![スクリーンショット 2021-10-17 9.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/60a9bd5d-1ad2-89e6-adc8-760cab3f1c8f.png)

CLEADB_DATABASE_URLに注目です！

## step2
SequelProに必要情報を記述していきます。
先ほど確認したCLEADB_DATABASE_URLは以下のような構造になっています。

```
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```

これらの情報を以下に記述！!
名前：わかりやすいもので
ポート：3306![スクリーンショット 2021-10-17 9.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/1413768a-0097-0537-28d7-42a5e5b8ed7f.png)

## step3
意外と忘れがちなので注意です！
1. 接続をテストして接続できることを確認する
2. お気に入りに追加する
3. 接続

以上で完了です！
【Godot】ピクセルパーフェクト（ドットバイドット）で2Dスプライトを表示する方法

# 概要
2Dスプライト画像を拡大するとぼやけて表示されることがあります。
これを解消する方法を紹介します。

![Godot_Engine_-_SinCurve_-_Player_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/b40076b4-1355-7e05-f727-b48fedc1fa94.png)

# ピクセルパーフェクトの設定をする

まず「ファイルシステム」から対象の画像を選択します。
そして、「インポート」タブをクリックします。
![Godot_Engine_-_SinCurve_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d8e4f4d8-cab7-6f51-704a-83e8262d98d5.png)

次に「プリセット」をクリックして、「2D Pixel」を選びます。
![Godot_Engine_-_SinCurve_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/dea9d92b-edd2-7c6d-014b-fd0370e3b8a0.png)

これは2Dピクセルパーフェクトにするためのプリセットとなります。
これを選ぶと「Filter」のチェックが外れています。これによりバイリニアフィルタリング（拡大したときにピクセルが補間される）の設定が無効となります。

「再インポート」をクリックして、変更を適用します。
![Godot_Engine_-_SinCurve_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/c55f79c1-0694-0885-67e4-7d690ab50aac.png)

するとバイリニアフィルタリングが無効となり、画像を拡大してもピクセルパーフェクトで表示されるようになります。
![Godot_Engine_-_SinCurve_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/6a6363a3-db27-63b4-9c9d-f5a8e10007cd.png)

## Fiter設定について

フィルタ(Filter)
> テクスチャのピクセルが画面のピクセルより大きくなると、このオプションは線形補間を有効にします。その結果、より滑らかな(ブロックの少ない)テクスチャが得られます。この設定は2Dおよび3Dで一般的に使用できますが、ピクセルパーフェクト(テクスチャの画素と画面の画素が1対1)なゲームを作成する場合は通常無効になっています。

# 参考

・Godot Docs > イメージのインポート
https://docs.godotengine.org/ja/stable/getting_started/workflow/assets/importing_images.html
レコード確認用のコード


匿名Windowで実行してデバックログでフィールドの内容を確認する


```
List<PermissionSetLicenseAssign> lst =
[SELECT Assignee.Id, Assignee.Name, Assignee.Alias, Assignee.ProfileId, Assignee.Profile.Name, PermissionSetLicense.MasterLabel FROM PermissionSetLicenseAssign];

for ( PermissionSetLicenseAssign tmp :lst){
    Profile pro = tmp.Assignee.Profile;
    system.debug(Logginglevel.INFO,'================>>> '+ pro.Name );   
}
```
Raspberry Pi で UART接続

【1960年生まれのおじさん日記】
 &emsp;60歳の定年退職後に再就職した現在の職場で ≪STM32(32bit汎用マイコン)≫でプログラム作成を
 &emsp;依頼され その後もRaspberry Pi でブロックチェーンを構築してと言われ 分からないことだらけ！
 &emsp;一応は、若いころから 製造業で働き 制御用ソフト や アプリケーションの作成をしたこともある
 &emsp;けれども・・・

 &emsp;この年齢になって Raspberry Pi でブロックチェーンの構築などするとは思わなかったおじさんの
 &emsp;メモ書き記録。間違いも多々あるかと思いますが、お許しください。

---
**はじめに**
Raspberry Pi4 と UART接続の手順を記す。
ここでは、PC(仮想COMポート) と Raspberry Pi4 を接続する例を記す。

---
**PC側の準備**
最近のパソコンは、COMポートを搭載していない。そのためUSBを COMポートに変換するデバイスを
使用する。私が用いたのは、DSD TECH製 SH-U09B (Silicon Labs CP2102を搭載) を用いた。
![2021-10-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/a3a505e7-47d5-48f0-d6c8-33c313465828.png)
Silicon Labs CP2102を用いた仮想COM ポート(VCP)の製品は、数多くある。
CP210x に対応したドライバーは、下記よりダウンロードしてインストールする。
[https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers](https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers)
![2021-10-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/444a00ee-4ccc-faa4-1671-38d5dd224f84.png)

尚、PC側でシリアル通信する場合には Tera Term を用いる。(説明略)

---
**Raspberry Pi4 の準備**
STEP1：[Raspbery Pi の設定] -> [インターフェース] より シリアルポートを有効にする。
&emsp;&emsp;&emsp;&emsp;シリアルコンソールを使う場合は、シリアルコンソールを有効にする。
![UART01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/a6f3cd53-c2eb-162e-a1bb-e6d4767d2f94.png)

![UART02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/595f7950-a45d-bf16-ed55-1863b52c7b45.png)

STEP2：通信ソフト (gtkterm) を下記の様にインストールする。
&emsp;&emsp;&emsp;&emsp;これにより [アクセサリー]-[Serial port terminal] から通信ソフトが使用出来る。

~~~
>$ sudo apt-get install gtkterm
~~~

![UART03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/6d2cf73c-0628-9088-705e-d3c1d39de6e8.png)

---
**Raspberry Pi4 と PC との接続**
Step1:Raspberry Pi4とPC側(仮想COM)をクロス (TX-RX / RX-TX) で接続する。
※[Raspberry Pi4のピン配置(https://pinout.xyz/)](https://pinout.xyz/)
![DSC_0040.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/2edb25f4-c4f6-6cb6-f185-137abc718905.jpeg)

Step2:Raspberry Pi4(gtkterm) と PC(Tera Term)を起動して通信を行う。
※通信のための設定を双方で合わせておく(gtktermの例を以下に示す)
![UART04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/d5076b80-90b4-728b-3d02-5bda68798d73.png)

---
☆2021年10月17日(日) 午前9時30分 初版 (Ver1.00) 作成

---
古いiMACをリストア

古いiMACをリストア

古いiMACを初期化してしまった場合

古いiMACでまともに動かなく居なったから、フォーマットを決意
（大事なデータはiCloudにバックアップ済み）
で、Command+Rを押しながらで初期化しようとしますが、
メニューで、OS Xインストールしかでない！
私に必要なのは、macOS Big Sur!

いろいろ試した結果。「option + command + R」でインターネットから復旧できました、ちなみに、WiFiだとなぜかネットワークエラーがでて、データが見つかりませんというとのこと、有線LANで接続して無事再インストールに成功しました。
Rails Cloud9からローカル環境へ（備忘録）

##初めて投稿！

AWSの無料期間がもうそろそろ終わるので、
Cloud9にあったプロジェクトをローカル環境に移管した。

まだまだ初心者のためいろいろと苦労したので、備忘録として記録。

------

##環境

・macOS BigSur 11.6
・Ruby 2.5.3
・Rails 5.2.6
・Homebrew 3.2.16

-----

##rbenvのインストール
Rubyのバージョン管理はrbenvとrvmがあるらしい。
色々調べてrvmは面倒そうだったので、rbenvをインストール

```
% brew install rbenv ruby-build
```

設定ファイルの記載方法を確認

```
% rbenv init 
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init - zsh)"
```
設定ファイルに書き込み（PASSを通すっていうのか？）

```
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```
設定を反映

```
% source ~/.zshrc
```

##Rubyのインストール

```
% rbenv install 2.5.3
% rbenv global 2.5.3
% rbenv rehash
% rbenv versions  
  system
* 2.5.3 (set by /Users/you/.rbenv/version)
  2.6.8
% ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin20]
% which ruby
/Users/you/.rbenv/shims/ruby
```
gemのアップデート

```
% gem update --system
```

##Railsのインストール

```
% gem install rails -v 5.2.6
```

##Rails動作確認
railsテストプロジェクトの作成

```
% mkdir rails
% cd rails
% rails new railstest
% cd railstest
% bundle install
```
サーバー起動

```
% rails s
```

http://127.0.0.1:3000/ にアクセス

![2021-10-16 7.31のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1200881/3f8d920a-3475-0e5d-36e4-a4189bd80fb1.jpeg)

やった！うまく起動した！

長くなったので、続きは次回に。
PHPと呪術廻戦で俺が学んだオブジェクト指向

こんにちは！
最近PHPでオブジェクト指向に関するカリキュラムを学習中なのでアウトプットしていきたいと思います。

# オブジェクト指向
「ある役割を持ったモノ」ごとにクラスを分けて、モノとモノとの関連性を定義していくことでシステムを作り上げるシステム構成の考え方のことです。まあ考え方のことですね。
読んでてここのあなたの捉え方違う！！！！って思ったらガンガンコメントください。

## クラスとインスタンス
私はクラスは「概念」だと捉えております。それに対してインスタンスは「概念」に紐つけられた実物かと。
例えば、呪術師という「概念」であるならば、伏黒恵や虎杖悠仁は呪術師という概念に紐つけられた実物。
漏瑚さんは呪霊という概念に紐つけられた実物や。

クラスには概念の中で定義される情報があります。
これをプロパティと言うんや。
呪術師クラスなら、「人間」「呪霊を祓う者」
呪霊クラスなら、「人間の負の感情の集合体」「呪力を持たない人間には見えない」
といった特徴があります。

これに加えて、メソッドというものもクラスの中に定義できます。
これは実際の動き、「できること」というイメージでいいです。
「攻撃する」「守る」「走る」といった機能です。

# PHPを使ったオブジェクト指向

PHPではクラスの中で定義された「攻撃する」「守る」といったメソッドのことを関数と呼びます。
メソッドがあることで引数によって処理結果がそれぞれ異なります。
そう、同じクラスによって生成されたインスタンスでも引数によって異なったものが生み出すことが
できるのです。

```php
<?php

class Magician{
  private $magician = [];

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

  public function getMagician(){
    echo $this->magician;
  }

  public function addMagician($magic){
    $this->magician .= $magic;
  }

  public static function getStaticMagician($str){
    echo $str;
  }

}

$shaman = new Magician('伏黒恵');

$shaman->getMagician();
echo '<br>';

$shaman->addMagician('十種影法術');
echo '<br>';

$shaman->getMagician();
echo '<br>';

Magician::getStaticMagician('呪術師');
echo '<br>';

?>
```
出力結果は以下の通りです。

![スクリーンショット 2021-10-17 7.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/ccbfe235-7fd6-b683-4472-d62cab5aa5b9.png)


オブジェクトをインスタンス化する時にnewで呼び出してオブジェクトの初期化をする```__construct()```はRubyで言うところの```initialize```メソッドみたいなものなのかな？

あと、static修飾子は最初わかりにくかったけど、Rubyでクラス変数に当たる部分でクラスの中で共通化する変数ってことで認識は合ってるかな？

Rubyの復習もしつつPHPとの違いも学べているので、すごくいい経験をしているなと感じます。
M5 Atom ＋ 触感デバイス開発モジュールを Bluetoothスピーカーとして使う方法（またはM5 Atom ECHOを出荷時の状態に戻す方法）

##はじめに
ビット・トレード・ワンから販売されている触感デバイス開発モジュールはM5 Atom LITEと組み合わせることで M5 Atom ECHOの音声出力部分とコンパチブルな構成になっています。したがって  M5 Atom ECHOの出荷時の状態であるBluetoothスピーカーとしても使うことができます。
#####＜試した環境＞
OS：Windows 10
使用ソフトウェア：Arduino IDE
使用ハードウェア：M5 ATOM Matrix
##Bluetoothスピーカーとして動かすための手順
Bluetoothスピーカーとするためのソースコードは
https://github.com/m5stack/M5-ProductExampleCodes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/91ee8c39-380e-1e70-9216-38f3c2446363.png)
の中の /Core/Atom/AtomEcho/Factory_BT_SPEAKER_Firmware/ にも入っているのですが

M5 Atom ECHOのドキュメントページ
https://docs.m5stack.com/en/atom/atomecho
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/72011593-2308-0cdf-3ed3-dd21d9c4aac9.png)

の中のEasyLoaderからM5 Atom ECHOを出荷時の状態に戻すためのアップロードプログラムがダウンロードできるので、これを使うと楽にBluetoothスピーカーとして機能させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/601be031-6d6d-2c6e-503d-aa424a59a04b.png)

Windows用とMacOS用があるのですがここではWindows用を使ってみます。

ダウンロードした EasyLoader_ECHO_Bluetooth_Speaker.exe というファイルをダブルクリックで起動するとこのような画面が出てくるので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/e394e1e1-51aa-d9a0-2de1-18b3449585ed.png)

M5 Atomを接続してCOMをM5Atomがつながっているポートを選択し[Burn]ボタンを押すと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/006ae9f8-4b8f-faba-50c9-c3038006fa73.png)
という感じで書き込みが始まって終了するとM5 Atom がBluetoothスピーカーデバイスになっています。

試しにM5 Atomに電源が入った状態でスマホのBluetooth設定を開くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1703667/8ba8c685-58bf-8232-f167-9e6a7c698fbf.png)
という感じにデバイスとして見えるのでペアリングすると無事 M5 Atomに接続した振動アクチュエータがスマホの音声出力で振動するようになりました。

##おわりに
触感デバイス開発モジュール“hapStak“ デジタル版はM5 Atomやモバイルバッテリーなど電源と組み合わせることでスタンドアロンで動作する触覚デバイスになります。Bluetooth Audioで振動させたい音を再生することでいろんなものを能動的な触感のあるオブジェクト(心臓の鼓動があるとか適切なタイミングで振動させるとか)に変えることができるようになります。
Pythonで第一世代のポケモンをすべてCSVに出力してみた。

どうも、Pythonを主軸に開発を行っている学生エンジニアのirohasです。
今回はPythonでよく使われているスクレイピングで開発を行ってみたので共有します。
*なお今回の記事はある程度スクレイピングの知識がある人向けですので、解説などはしません。

ある時、ポケモンの名前のデータが欲しいと思いサイトを見ていたのですが、皆さんご存じの通りポケモンはめちゃくちゃ数が多いので手作業でEXCELなどにまとめていては大変です。
そこでスクレイピングでEXCELに格納までやればよくね？となったので、とりあえずまずは第一世代のポケモンだけ出力するコードを作成しました。
全てのポケモンを出力するやつは暇なときにまた作ります。

それではまず、コードの全体像からです。

```python:index.py
import csv
from os import write
import urllib.request
from bs4.dammit import encoding_res 
import pandas as pd
from bs4 import BeautifulSoup

header = [ "name"]

url = "https://pokemondb.net/pokedex/national"
headers = {
        "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
        }
request = urllib.request.Request(url, headers=headers) 
html = urllib.request.urlopen(request)
soup = BeautifulSoup(html, 'html.parser')

div = soup.find("div", class_ = "infocard-list infocard-list-pkmn-lg").find_all("span", class_ = "infocard-lg-data text-muted")

with open("csv/pokemon_name.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(header)
    for pokemon in div:
        _name = pokemon.find(class_ = 'ent-name').text
        row = [_name]
        writer.writerow(row)

```

今回はポケモンの名前が英名で登録されているPokemon　Databaseさん<a>("https://pokemondb.net/pokedex/national")</a>の記事を利用させていただきました。
スクレイピングで取得した際に、アクセスが拒否られてしまったので"user-agent"を用いてアクセスさせていただきました。

コードを実行すると、指定フォルダにCSVが格納されるので、Pandasを使って確認します。

```python:reading.py
import pandas as pd

df = pd.read_csv("csv/pokemon_name.csv")
print(df)
```
出力結果は下記のようになりました。

```
           name
0     Bulbasaur
1       Ivysaur
2      Venusaur
3    Charmander
4    Charmeleon
..          ...
146     Dratini
147   Dragonair
148   Dragonite
149      Mewtwo
150         Mew
```

無事第一世代のポケモンがCSVに保存されていることが確認できます。
これにて完成です。

いやはや、スクレイピングってほんと便利ですね。
これからも大きなデータとか欲しいときはお世話になりそうです。
dockerコンテナからホストマシンのWindowsローカルのMySQLに接続に失敗したときの対処

docker環境のLaravelプロジェクトでWindowsにインストールしたMysqlへ接続しようとしたらエラー。

```
PDOException: SQLSTATE[HY000] [1130] Host 'host.docker.internal' is not allowed to connect to this MySQL server
```

ホストマシンとdockerではそれぞれ別のネットワークを利用しているため、MySQL側がlocalhostから接続しか許可していないとdockerコンテナ側からはDB接続ができません。

MySQL側の問題となります。権限付与で解決できます。
「WITH GRANT OPTION」が重要。MySQLの権限変更とか滅多に行わないので都度ググるハメになりますね:sweat_smile:

```
GRANT ALL PRIVILEGES ON *.* TO 'root'@'host.docker.internal' WITH GRANT OPTION;
```


そもそもdocker使ってるのにホストマシンでMySQL動かしてる時点で運用方法としておかしいんですが、こうして解決できるよ、と備忘録
'Identifiable' is only available in application extensions for iOS 13 or newer の直し方

###概要
備忘録です

###このエラーが起こってしまう原因
RealmSwiftのバージョンが最新じゃないから。
古いバージョンのRealmを使っているときに起こってしまう

###解決策
このエラーが起こっているディレクトリに対して、

````
pod update Realm RealmSwift
````

を行う。これを行うと、podfileの中のRealm, RealmSwiftのバージョンがアップデートされ、
ビルドが通るようになります。

###注意
自分のpodfile内を確認して、Realmの横に何か数字が書いてある時は、消しておく
これを書いてしまっていると、RealmSwiftのバージョンが固定されてしまい、
仮にさっきのコマンドを打ったとしてもアップデートされないので注意してください。
自分がまさにこれをやってしまってたせいでずっと治らなくて、何時間も無駄にしました。

###まとめ
誰かの役に立てば幸いです。

###参考
https://github.com/realm/realm-cocoa/issues/7460
Macの外付けUSBディスクがマウントできない時の対処法

# はじめに
MacBook Proを再起動したら外付けUSBディスクが認識されなかった。いろいろ調べた事を備忘録として記録しておく。OSは`Big Sur version 11.6`である。

# 1. 試した事
## USBケーブル抜き差し
Shutdownしてケーブルの抜き差しをしたがダメ。そこで他のUSBデバイスやUSBハブを全て外してみたがダメ。（ケーブルの抜き差しは電源OFFの状態でやること。）　　なぜケーブル抜き差しするかと言うとMacのように発熱する機器では金属の接触部分が微妙に熱膨張・収縮を繰り返すので徐々に接触不良を起こしたり、わずかな隙間ができてホコリが挟まって接触不良を起こす可能性があるから。

## SMCリセット
Apple公式サイトにやり方がある。結果としては解決できず。解決策としては一番期待したのだが、ダメだった。

## NVRAMリセット
Apple公式サイトにやり方がある。結果としては解決できず。NVRAMとUSBデバイスは関係ないので期待していなかったが、一応試してみた。

## ディスクユーティリティでのマウント
そもそも認識されてるのかどうかを確認するためにディスクユーティリティを見てみたら、マウントされてなかった。マウントをクリックしてみるが、Error 0でマウント失敗。ファーストエイドも失敗。少なくとも物理的には接続されているし、認識もしているようだ。

![Screen Shot 2021-10-16 at 1.18.43 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/cb7b929a-f22c-a6f8-683a-7a5f07d2d073.png)
![Screen Shot 2021-10-16 at 2.27.20 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/135639ea-a9d3-1acc-f3d9-ad4ee7e513b5.png)
![Screen Shot 2021-10-16 at 2.34.32 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/202bf9de-6be2-1228-c445-3620b954d7e9.png)


## 各種ディスク関係コマンド
以下の2つを試したがダメだった。
####  (1) fsck_hfsを試す。

```ruby:ターミナル
$ sudo fsck_hfs -fy /dev/disk3s2
Password:
** /dev/rdisk3s2 (NO WRITE)
Can't open /dev/rdisk3s2: Resource busy

$ sudo fsck_hfs -r -d /dev/disk3s2
Password:
Unable to open block device /dev/disk3s2: Resource busyjournal_replay(/dev/disk3s2) returned 16
** /dev/rdisk3s2 (NO WRITE)
Can't open /dev/rdisk3s2: Resource busy
```

#### (2) diskutilを試す。

```ruby:ターミナル
$ diskutil verifyVolume disk3s2
Started file system verification on disk3s2 (MyPassport)
Verifying file system
Volume is already unmounted
Performing fsck_hfs -fn -x /dev/rdisk3s2
File system check exit code is 8
Restoring the original state found as unmounted
Error: -69845: File system verify or repair failed
Underlying error: 8
```


# 2. ディスクリカバリーソフトで救済
Mac標準のツールやコマンドで解決できなかったが、ディスクユーティリティで認識はされているので、ディスクの論理障害と判断し、いろいろ検索していたら [EaseUS](https://jp.easeus.com/) という会社の [EaseUS Data Recovery Wizard for Mac](https://jp.easeus.com/mac-data-recovery-software/mac-drw-free.html) というツールを見つけた。無償版と有償版があるが、機能比較をみると単に論理的に壊れたファイルを修復するだけなら無償版で「RAWパーティションからファイルを復元」できるようなので無償版をダウンロードしてスキャン実行。

####対象ディスクをスキャン
ファイル数やサイズによるが、自分の場合はTimeMachineのファイルもあるからか、22時間（！）のスキャンが走った。予想残り時間が表示されるのであまりに長いようなら寝る前にでも仕掛けておけば良いだろう。
![スクリーンショット 2021-10-16 午後10.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/c971a767-9a2e-8274-55fa-38721e9ef84d.png)

####リカバリー実行
スキャンの途中で外部ディスクがマウントされていることに気づいた。一応、中身のファイルを別ディスクにコピーしてバックアップ後、EaseUSの復元機能を試してみたが、無償版では最大2GBまでしか復元できず、全く足りなかったので諦めた。マウントはできているし、中身も読めたので問題ないと思うが、論理的に壊れている可能性があるのでディスクユーティリティのFirst Aidで修復を走らせた。
![スクリーンショット 2021-10-19 午前10.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/ea1eb10f-8e3e-a675-7482-7cc3d9426980.png)


## 参考記事
[Solved: Mac Can’t Repair External Hard Drive](https://www.stellarinfo.com/blog/repair-mac-hfs-hard-drive/)
cron を使用した時間指定

<!-- =================================================== -->
# 概要
<!-- =================================================== -->
`GCP`や`Firebase`でスケジューラ関数を定義する場面で、**cron（クーロン）形式の時間指定**に出くわしたのでまとめました。

GUIですべて指定できればいいのですが、パターンが多すぎるのでcron形式で指定したほうが開発側も利用者側も手間が省けるのでしょうか:thinking:

:::note info
この記事は、以下の記事を抜粋したものです。
詳しく知りたい方は、こちらも併せて参照してください。
:::

https://www.server-memo.net/tips/crontab.html

:::note info
以下のサイトは、cronの<strong>書式チェッカー</strong>です。
:::

https://crontab.guru/

<!-- =================================================== -->
# ルール
<!-- =================================================== -->
### 書式
cronの時間指定は、5つのパラメーターによって定義します。

```shell
分 時 日 月 曜日
*  *  *  *  *
```

それぞれ値が取る範囲は、以下のようになっています。

| 項目 | 数値 |
|:-:|:-:|
| 分 | 0-59 |
| 時 | 0-23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 曜日 | 0-7（0,7=日, 1=月...） |



### 省略値（*）
`*`を指定した場合、各項目で設定できる全ての値を設定したことになります。

例えば、以下のようになります。

```shell
毎分実行する
* * * * *

0時の間、毎分実行する
* 0 * * *

毎時、10分に実行する
10 * * * *
```

### リスト・範囲・間隔の指定方法

| 指定方法 | 設定例 | 説明 |
|:-:|:-:|:-:|
| リスト | 0,10,20,30 | 「,」で区切ることで複数指定が可能 |
| 範囲 | 1-5 | 「-」で範囲指定が可能 |
| 間隔 | */10 | 「*/数値」で間隔を設定することが可能 |

例えば、以下のようになります。

```shell
毎時、0分、10分、20分、30分に実行する
0,10,20,30 * * * *

毎月、15日、30日の0時0分に実行する
0 0 15,30 * *

毎時、0～10分の間1分ごとに実行する
0-10 * * * *

毎時、10分ごとに実行する
*/10 * * * *

隔月の1日0時0分に実行する
0 0 1 */2 *
```

<!-- =================================================== -->
# 実例
<!-- =================================================== -->

### 毎時15分
```shell
15 * * * *
```

### 毎日AM 4:02
```shell
2 4 * * *
```

### 毎月10日のAM 6:15
```shell
15 6 10 * *
```

### 7月1日 AM 3:00
```shell
0 3 1 7 *
```

### 7月1日 AM 3:00
```shell
0 3 1 7 *
```

###毎週月曜日のAM 10:00
```shell
0 10 * * 1
```

###毎日AM 4:30とAM 9:30
```shell
30 4,9 * * *
```

###毎週月、金曜日のAM 3:00
```shell
0 3 * * 1,5
```

###毎日AM 3:00 4:00 5:00 6:00 7:00 9:00
```shell
0 3-9 * * *
```

###毎月10日のAM 3:15 4:15 5:15 6:15
```shell
15 3-6 10 * *
```

###10分ごと
```shell
*/10  *  *  *  *
```

###3時間ごと
```shell
0 */3 * * *
```

###AM 1:00 6:00 9:00 10:00 11:00
```shell
0 1,6,9-11 * * *
```
Flutter Flavor使用時のブレークポイントの有効化


#内容
Flavorを追加したら、VSCodeでデバッグ（ブレークポイント）できなくなってしまったので、設定の方法を残します。

#前提条件

すでにFlavorを追加していること。

#開発環境

PC : macOS Big Sur
エディター : Visual Studio Code

Flutter 2.5.1


#コマンド

Flavorを追加したときは以下のようなコマンドを入力して、実行するようになります。

```
flutter run --flavor staging

flutter run --flavor production
```

※run --flavor hogehoge のhogehoge部分はそれぞれのプロジェクトによる

コマンドから実行すると、ブレークポイントが使用できない。

#対応内容

launch.jsonを生成して、以下のような設定にする。

```launch.json
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "my-app production",
      "request": "launch",
      "type": "dart",
      "program": "lib/main.dart",
      "args": [
        "--flavor",
        "production",
      ]
    },
    {
      "name": "my-app staging",
      "request": "launch",
      "type": "dart",
      "program": "lib/main.dart",
      "flutterMode": "debug",
      "args": [
        "--flavor",
        "staging",
      ]
    },
  ]
}
```

launch.jsonのargsには　コマンドで入力していた、 run の後ろの引数を入力する。

flutterModeをdebugにすると、ブレークポイントが有効になる。

この状態で、F5でデバッグ実行が行えて、ブレークポイントも有効になる。

launch.jsonの生成方法は参考の2つ目の記事を参照してください。

#参考

https://flutter.dev/docs/development/tools/vs-code#run-app-in-debug-profile-or-release-mode

https://medium.com/@riscait/if-youve-created-a-flavor-environment-in-flutter-edit-the-launch-json-in-vs-code-acfc9d6313a9

https://github.com/Dart-Code/Dart-Code/issues/2339