OmniAICreator/Qiita-1.07M huggingface dataset:
【Presto（TreasureData）】CONCAT関数のようにフィールドを結合する方法

## 初めに
- 業務で少しばかりSQLを使っています。非エンジニアのマーケティング職です。
- 今回Qiitaに初めて記事投稿しますので記事を読んでくださった皆様、よろしければFBお待ちしています。

## きっかけ
- 自社で扱っているDBが、MySQLではなくTREASURE DATAを使用しています。
- フィールドを結合したかったので、MySQLではCONCAT関数を使うのが分かり試したら動きませんでした。
- CONCAT関数と同じことをPrestoで実行したかったのですが、調べても出てこなったため、職場のエンジニアに聞いた事をアウトプットします。

## やりたいこと
- 複数のデータを1つのフィールドにまとめた状態として出したい

### 例
- 2つのテーブルを使用します。
- 倉庫テーブル(db.warehouse)

| id | warehouse_name |
| :--: | :--: |
| 1 | 東京 |
| 2 | 名古屋 |
| 3 | 大阪 |


- 商品テーブル(db.goods)

| id | goods_name | warehouse_id | instock_date |
| :--: | :--: | :--: | :--: |
| 1 | みかん | 3 | 2021-◯◯-△△ |
| 2 | りんご | 1 | 2021-◯◯-△△ |
| 3 | 桃 | 2 | 2021-◯◯-△△ |
| 4 | 柿 | 3 | 2021-◯◯-△△ |
| 5 | バナナ | 2 | 2021-◯◯-△△ |
| 6 | バナナ | 1 | 2021-◯◯-△△ |
| 7 | りんご | 2 | 2021-◯◯-△△ |
| 8 | 桃 | 2 | 2021-◯◯-△△ |
| 9 | 梨 | 2 | 2021-◯◯-△△ |
| 10 | ぶどう | 1 | 2021-◯◯-△△ |

### ゴールイメージ
- どの倉庫にどの商品が入っているのかをまとめて確認したい
- 3列目の```storage_goods```カラムで倉庫にある商品を連結させたい

| id | warehouse_name | storage_goods |
| :--: | :--: | :--: |
| 1 | 東京 | りんご,バナナ,ぶどう |
| 2 | 名古屋 | りんご,バナナ,梨,桃 |
| 3 | 大阪 | みかん,柿,桃 |

## 結論
- SELECT句に **```array_join(array_agg(db.goods.goods_name), ', ')```** を入れる事で解決出来ます。

### ゴールイメージのクエリ
```SQL
SELECT
    db.warehouse.id
    , db.warehouse.warehouse_name
    , array_join(array_agg(db.goods.goods_name), ', ') AS storage_goods
FROM
    db.warehouse 
JOIN
    db.goods
    ON db.warehouse.id = db.goods.warehouse_id
GROUP BY
    db.warehouse.id
    , db.warehouse.warehouse_name
```

- ※GROUP BY句でSELECTしたカラムをまとめてください。
    - GROUP BYしないと```array_join(array_agg(db.goods.goods_name), ', ')```の結合先が重複し、エラーになります。
- ※今回は2つのテーブルをJOINしていますが、1つのテーブル上で複数行を結合する際も同じです。
    - JOIN句を丸々削除して使ってください。

## おまけ
### 重複等削除
- 今回は結合する行に重複するデータはありませんでしたが、結合の際に重複を排除することが可能です。
- NULLがあるデータを削除する事も可能です。

| 条件 | クエリ |
| :-- | :-- |
| 重複削除 | array_join(array_agg(DISTINCT db.goods.goods_name), ', ')<br><br>DISTINCTを入れる |
| NULLを削除 | array_join(array_agg(db.goods.goods_name)　FILTER(WHERE db.goods.goods_name IS NOT NULL), ', ')<br><br>FILTER(WHERE name IS NOT NULL)を入れる |
| 重複削除＆NULLを削除 | array_join(array_agg(DISTINCT db.goods.goods_name)FILTER(WHERE db.goods.goods_name IS NOT NULL), ', ') <br><br>1行目と2行目を合わせて使用する|

### ```,```ではなく```/```で区切りたい
- 文末の```', '```を```'/ '```に変えると出来ます。
    - ```array_join(array_agg(db.goods.goods_name), '/ ')```

## 参考にさせていただいた記事
https://qiita.com/namachapanda20/items/50732125379178309e3e

https://qiita.com/y-ken/items/400b7c70c324ac67af02
【Python】ツイートを自動ファボするbotを自作してみた【cron】【完全自動化】





今回はPythonとMac標準搭載のCronを使って、
指定した語句を含むツイートを完全自動でファボするbotを開発したので、
こちらのノウハウを紹介する。

#背景

Twitter運用でテキトーにふぁぼすれば認知度増えて、
フォロワー増えんじゃねという仮説のもと、ツール作成を発案

最初は弟に作成を依頼していたが、私がエンジニア配属になったので勉強がてら自前作成することに...

##開発者のスキル


・文系私立大学出身
・開発当時のプログラミングスキルは開発未経験の初心者(Progateは一通り実施)
・もちろんAPIなどにはノータッチ
・現在はクラウドインフラエンジニアとして日々精進
・Twitter [@postkershaw](https://twitter.com/postkershaw)



#こんな方に読んでほしい
・Twitterの運用を少しでも自動化したい
・TwitterAPIを触ってみたい
・Pythonを使ってみたい
・プログラミングを始めたばかりで、実践的なコードを書いてみたい

#開発環境

OS : Mac 11.3.1
統合開発環境 : VS code
言語 : Python3, mac linux
TwitterのAPI使用

#本投稿の内容

・TwitterのAPI取得から自動ファボを実施するMACの設定方法まで
※あくまで自己責任での実施をお願いします。



#TwitterAPIの取得

自動ファボBotを作る上で**TwitterのAPI**が必要だということを有能な弟から事前に聞いていたので、ググってみたら魅力的な記事を発見！！

https://qiita.com/kngsym2018/items/2524d21455aac111cdee

ちょっと情報は古いけど、ここにある手順通りに進めたら無事申請できた（手順変わってたらすみません...)


#Pythonのコーディング

具体的なコーディング方法は以前noteの方に書いたので、こちらを参照していただけると幸い

https://note.com/postkershaw1228/n/n47087556b771



ちなみに

```python:favoriteのfile.py
for result in  reversed(search_results):
```

このように書き換えると投稿の早い順にソートを変更可能

#cronを使用し、ふぁぼの実行さえも自動化

macのターミナルを使用して、


```terminal:mac_terminal
crontab -e
```

を実行すると空のcrontabが出てくるので、

```terminal:mac_terminal
03 8 * * * python3 実行ファイルのpath
```
のようなコマンドを入れる(iを押してinsertモード)

意味としては、左から

03 = 分
8 = 時
* = 日付(アスタリスクだと毎日)
* = 月(アスタリスクだと毎月)
* = 曜日 (アスタリスクだと毎日)

今回はPython3を使用するので、python3と指定した

記入後は、escキー　→　「:wq」

```terminal:mac_terminal
crontab -l
```

こちらのコマンドを実行し、記述したコマンドが反映されていたら設定完了

crontabに関して、詳しくは下記参照
[crontabの書き方](https://www.server-memo.net/tips/crontab.html)
[cronにアクセス権を付与してない方向け](https://fremilli.com/mac-cron-python/)

しかし、cronで設定しただけだとパソコンがスリープ状態では動作しない...

自動でスリープ状態から起動する設定をする

「システム環境設定→バッテリー→スケジュール」を設定可能

起動またはスリープ解除と同時に、スリープになる設定も行うと良いかも

これら全ての起動に成功すると...

![スクリーンショット 2021-05-05 20.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/e7f2c2c0-d0ce-86b0-314a-d8e6ae09acce.png)

このような画面がターミナルに見える

You have new mailの内容をみたいなら

```terminal:mac_terminal
mail
```
を実行すると、cronからコマンドを実行したというログメール的なものが届く

#振り返り

AWSなどで24時間稼働するようなVMかサーバを立てないと
厳しいかなと思っていたが、自分のPCでも実行可能で大満足

結論: Pythonは怠け者の味方

ちなみに自動ファボを実施してフォロワーは殆ど増えていません
ツイッターって難しい...

よろしければフォローをお願いします　

Twitter [@postkershaw](https://twitter.com/postkershaw)

主にテクノロジー関連と株について呟いてそうろう
【初心者でもわかる】CSSだけで作る、端の丸い矢印(>)の作り方

#どうも、7noteです。CSSのみで、角のない矢印(>)の角が丸い矢印をつくります

矢印をアイコン画像などで作ってもいいのですが、cssを使って角丸にします。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/30b77428-9d25-136c-6913-56aacb49823b.png)

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9e1a1f46-c29c-1a7c-29da-ab61d2a10d96.png)


このタイプの矢印(>)のよくある作り方としては正方形の2辺をborderで作り、45度回転させるのが多いのかなと思います。
ですがこの方法では角がかくばってしまいます。

![sample_miss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/38ec1cee-f7aa-d4a1-cbdf-3a062a6d49c9.png)


なので違う方法を使って角の丸い矢印(>)を作っていきます。

## cssで角の丸い矢印(>)の作り方

```index.html
<div class="arrow"></div>
```

```style.css
.arrow {
  width: 200px; /* 適当な箱を作るための幅 */
  height: 80px; /* 適当な箱を作るための高さ */
  border: 1px solid #000; /* わかりやすいように線を引く */
  position: relative; /* 基準位置とする */
}

.arrow::before,
.arrow::after {
  content: ""; /* 疑似要素に指定必須 */
  width: 20px; /* 線の長さを指定 */
  height: 3px; /* 線の幅を指定 */
  display: inline-block; /* インラインブロックにする */
  border-radius: 2px; /* 線を角丸にする */
  background: #aaa;   /* 線の色を指定 */
  position: absolute; /* 相対位置に指定 */
  right: 10px; /* 右から10pxの位置に配置 */
}

.arrow::before {
  top: calc(50% - 8px);     /* 数値は微調整してください */
  transform: rotate(45deg); /* 45度回転させる */
}
.arrow::after {
  bottom: calc(50% - 8px);   /* 数値は微調整してください */
  transform: rotate(-45deg); /* -45度回転させる */
}
```

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/3830deb6-4cf5-e85a-ba87-74384b821a8e.png)


##解説

擬似要素のbeforeとafterの両方を使って作ります。
**イメージとしては、二本の細長い棒を角丸にしてそれぞれ回転させて配置し、矢印の形にしています。**
topとbottomのcalcの値を調整してきれいに重なる箇所を探してください。

## まとめ

もちろんCSSを使わずに画像にすれば角丸の矢印は簡単に作成できます。
もしくはアイコンフォントで作成する方法もあります。
さらにはSVGを使った方法なんかもあります。

・アイコンフォント → https://ionicons.com/

画像と比べると**読み込み速度や、管理の面でいうとCSSでかけた方がメリットが大きい**のでこの書き方も覚えておいて損はないと思います。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
VSCでリモートサーバー上のDockerを用いる3つの方法

一番直感的な操作はVSCではRemote-SSHでリモートサーバーに接続し、その上でRemote-Containerを利用することだが、現状のVSCでは実装されていない。VSCのドキュメントに替わりの方法として大まかに三通りの入り口が載っていたが、自分には最後の方法が一番使いやすそう。

# 1. Remote-SSHを用いる
https://code.visualstudio.com/docs/containers/choosing-dev-environment#_remote-machine

VSCのDocumentで第一に記載されている方法だが、
>The Docker extension supports debugging .NET Core-based and Node.js-based services running inside a container. Other programming languages are not supported at this time.

とのことで、__.NET Core-basedの言語か、Node.jsでしか使えない__よう。

#2. docker contextで切り替える

https://code.visualstudio.com/docs/containers/ssh#_set-up-ssh-tunneling

ssh-agentを設定した上で、SSH tunnelingを用いてremote Docker engineを指定したdocker contextを作成し、適宜切り替える。この場合、dockerコマンド自体のcontextが切り替わるので、ローカルマシン上のDocker engineを使用しようとすると毎度切り換えないといけない。

そのまま"Open folders in Containers"を実行すると、ローカルフォルダをマウントしようとしてエラーになる。Remote ExplorerやDocker extentionタブからすでに作成されているコンテナを選択し、Attach to containerでコンテナに入るのが良いか。

#3. docker.hostを利用する
https://code.visualstudio.com/docs/remote/containers-advanced#_converting-an-existing-or-predefined-devcontainerjson

ssh-agentの設定は2と同様に行い、settings.json内のdocker.hostを設定する。これはDOCKER_HOSTでdocker contextをオーバーライドするのと恐らく等価。空のフォルダを作ってワークスペース設定として設定すれば、ローカル／リモートなど__複数のDocker engineを同時に利用できる__。これは2.の方法にはない利点。

またこの方法では、ローカルマシンに"devcontainer.json"を作成することでローカルなDockerfileからコンテナ作成や、リモートマシン上のフォルダのマウントなどを設定することができる。
Ruby　ハッシュの生成方法

# hashについて
hashは、複数の関係性のある値を管理する際に使うもので、キーとバリューを要素に持つ値です。
配列とは異なり、順番ではなく、キーを使って値を管理する方式のことをキーバリューストアと呼びます。

# hashの生成方法
hashの生成方法はハッシュを宣言し、その中にキーとバリューをセットに代入します。

```ruby
変数 = {}
# 始めから要素を持った状態で生成することもできます。
変数 = { "キー１" => "バリュー１", "キー2" => "バリュー2", "キー3" => "バリュー3" }
```
ハッシュのキーには多くの場合、`シンボル`と呼ばれる文字列の先頭にコロン`:`をつけて宣言する値が使用されます。

```ruby
:文字列
```

文字列よりも、数値を扱うほうが処理速度が早くなるので、ハッシュのキーには、文字列よりもシンボルを使うことが多いようです。シンボルを使うと見た目は文字列ですが、数値として扱われます。
シンボルを使う場合は、以下の２通りの使用方法があります。

```ruby
hash = { :name => "inoki" }
hash = { name: "inoki" }
# 2つとも同じ意味
```
まとめると、ハッシュの生成方法には以下の３つの方法があります。

```ruby
hash1 = {"name" => "あん時の猪木"}
hash2 = {:name => "あん時の猪木"}
hash3 = {name: "あん時の猪木"}
# 全ておなじ意味
```

# シンボル化を行うメソッド
文字列をシンボル化するには、`to_sym`メソッドを使います。このメソッドを使うことでシンボルオブジェクトを返すことができます。

```ruby 
str = "inoki"
str = str.to_sym

str.class  # Symbol
```
メモ :　pod installがうまくいかない

2020年モデルのMacBookAirにCocoaPodsをインストールして、Firebase連携しようと思ったものの、pod installが失敗する。

iOSのバージョン？
手順にミスが有った？

わからなくて散々ネットサーフィンしたが、こちらの記事で速攻解決した。


ので、メモとして残しておく。

https://zenn.dev/akeome/articles/2433d792db022835c7e7
ネットワークのキホン

応用情報技術者試験の勉強のアウトプットとして、学んだことを書き連ねていきます。
本記事ではネットワークの概要、OSI参照モデル等をざっくり説明し、細かい深掘りは別途更新していきます。
#そもそもネットワークって？
ネットワーク(以下NWと略記)とは、**コンピュータ間で送受信する情報の伝送路の集合**のこと。
NWを利用することで地理的な制限を排除し、迅速な通信が可能になります。

NWはユーザの種類によって以下の二つに分類されます。

- インターネット<br>
世界中にあるNWが相互に接続された、世界で一番大きなNWの固有名称。利用者制限なし。
- イントラネット<br>
企業や団体のコンピュータやシステム等を接続したNW。関係者のみ利用可能。

##LANとWAN
NWは**構築する場所**によって、さらに以下の二つに分類されます。

- **LAN**(Local Area Network)<br>
一定の限定された敷地内で利用できるNW。自身で構築、運用するのが前提。
- **WAN**(Wide Area Network)<br>
地理的に離れた地域間を接続するNW。通信キャリアからサービスとして提供され、契約して利用する。

##OSI参照モデル・TCP/IPスタック
話は少し変わり、通信の歴史の話をしましょう。
コンピュータ通信が生まれた頃、NWは一つのベンダー(メーカー)の機器だけで構成されていました(シングルベンダーシステム)。シングルベンダーシステムの場合、他社のコンピュータをNWに組み込むことは想定されていなかったため、コンピュータ間の通信にはベンダー独自の**プロトコル**が使用されていました。通信における「プロトコル」は「通信するときの決まり事」みたいなニュアンスです。何事も約束や決まり事がないとごちゃごちゃしちゃいますよね。
しかし時代の流れと共に、他社のシステムとの接続が多くなり、システム間接続のために個々のプロトコルを開発することは、コスト的にも到底見合わないものとなっていきます。
このような背景から、プロトコルの**標準化**作業が進み始めます。

プロトコルの標準化作業は、

- **ISO**(International Organization for Standardization)：国際標準化機構
- **CCIT**(Consultative Committee for International Telegraph and Telephone)：国際電信電話諮問委員会

によって1970年代後半から進められました。
この結果生まれたのが皆さんご存知、**OSI**(Open System Interconnection：開放型システム間相互接続)です。OSIは、異なるベンダーのコンピュータ間で通信を実現するための仕組みを取り決めているもので、多くの事柄が取り決められています。
OSIの基本的な枠組みはOSI参照モデルを見ることで理解できます。

|Layer|名前|役割|
|--|---|               --|
|L7|アプリケーション層  |アプリケーションの操作方法に関する仕様|
|L6|プレゼンテーション層|データ形式の共通化|
|L5|セッション層       |通信の開始から終了までを制御|
|L4|トランスポート層    |データの分類・再組み立て|
|L3|ネットワーク層      |通信相手に対する経路決定|
|L2|データリンク層      |媒体を通して物理的な伝送を提供|
|L1|物理層              |システムに組み込むべきハードウェアの仕様|

ざっとこれだけ見てもNW初心者の場合「なんのこっちゃ？」となるので後日詳しく見ていきましょう。

他方、1983年にはペンタゴン(米国国防総省)が中心となり、標準プロトコル群として規定されたのが、**TCP/IP**。UNIXマシンに組み込まれたりと、多機能かつ使いやすいという観点から広く普及し、現在ではインターネットのデファクトスタンダードになっています。

|Layer|代表的なプロトコル|
|--|---|
|アプリケーション層  |HTTP/FTP/SMTP/POP3/DNS/Telnet...|
|トランスポート層    |TCP/UDP|
|**インターネット層**      |IP/ICMP/ARP|
|NWインタフェース層  |Ethernet/PPP...|

こちらも後日詳しい記事を更新していきます。こんなプロトコルがあるんだ～ぐらいの感覚で結構です。

OSI参照モデルとは異なり、L7～L5に相当する層がアプリケーション層として、L2～L1の層がNWインタフェース層として一括にまとまっています。さらにOSI参照モデルにおけるネットワーク層は、TCP/IPではインターネット層と定義されます。

OSIは国際標準ですが、TCP/IPはデファクトスタンダードとしてインターネットで直接利用しているため、より身近なプロトコルと言えるでしょう。

Qiita初心者なので拙文かもしれませんが、最後までご覧頂きありがとうございました。
【Vue.js】computedとmethodsの違い

## はじめに
仕事で使う事になったので1からVue.jsについて学んだ。ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

## computedとmethodsの違い
見た目の挙動は同じだが、動きには大きな違いがあるのでちゃんと使い分けないといけないのが`computed`と`methods`。
それぞれについてまとめると以下の表のようになる。
あるべきとしては関係のある部分が更新された時だけ変更されるべきなので`computed`を用いるのが正解。

| # | 説明 | 実行タイミング |
|:-:|---|---|
| computed | 動的なプロパティを定義できるプロパティ。<br>プロパティなので必ずreturnが必要。 | 依存関係（参照先の値）が更新された時だけ実行。 |
| method | メソッドを定義できるプロパティ。 | DOMが再描画されたときに毎回実行。 |

以下の動画のように`console.log()`を出すとその違いが良く分かる。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/762de24b-dc24-6584-6b3d-36f88adf1157.gif)
動画のソースコードは以下。

```html:sample.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <p>{{ counter }}</p>
        <button @click="counter += 1">+1</button>
        <p>{{ anotherCounter }}</p>
        <button @click="anotherCounter += 1">他の+1</button>
        <p>{{ lessThanThreeComputed }}</p>
        <p>{{ lessThanThreeMethod() }}</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                counter: 0,
                anotherCounter: 0
            },
            computed: {
                lessThanThreeComputed: function () {
                    console.log('computed');
                    return this.counter > 3 ? '3より上' : '3以下';
                }
            },
            methods: {
                lessThanThreeMethod: function () {
                    console.log('methods');
                    return this.counter > 3 ? '3より上' : '3以下';
                }
            }
        })
    </script>
</body>

</html>
```

※ちなみに`dataプロパティ`は動的なものは表現できず初期値を定義するだけに使われるので以下のような事はできない

```js:data-prop.js
new Vue({
  el: '#app',
  data: {
    counter: 0
    // lessThanThree: this.counter <-できない
    // lessThanThree: counter > 3 ? '3より上' : '3以下' <-できない
  }
})
```

## Vue.jsの勉強メモ一覧記事へのリンク
Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

- https://qiita.com/yuta-katayama-23/items/dabefb59d16a83f1a1d4
駆け出しpythonエンジニアのまとめ デザインパターンまとめ2(factory method)

# 趣旨
駆け出しエンジニアの備忘録の垂れ流し。
　※ 出典漏れがあればご指摘ください

> 出典: 
https://yamakatsusan.web.fc2.com/pythonpattern08.html
https://dackdive.hateblo.jp/entry/python-design-pattern/abstract-factory
https://www.oreilly.co.jp/books/9784873117393/

# factory methodパターン概要
基底クラス(Creatorクラス)にProductインスタンス生成を行うためのファクトリーメソッド(インスタンスを生成するためのメソッド)を定義するが、その生成処理が複数の複雑な手順となる場合、その手順はサブクラス側に定義する(template methodをインスタンスの生成に応用したもの。)
(createメソッドををdirectorとして別クラスに規定したらbuilderパターンになるのでは?)

## クラス図とシーケンス図
![W3sDesign_Factory_Method_Design_Pattern_UML.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382557/bc2cb975-c6fd-9c47-dc93-c6e9ee24bcf7.jpeg)


[wikipedia][wikipedia]より引用

## 実装方針
- Creatorクラスではファクトリーメソッド(create)を実装する。ファクトリーメソッド内で呼ばれる作成手順の規定のみ行う。
- Creatorサブクラスでは作成手順をオーバーライドする。
- ClientではCreatorサブクラスを呼び出し(生成し)、createを呼び出す処理を実装する
- Client側では呼び出すCreaterサブクラスの指定が必要。Creatorサブクラスを決定するメソッドがCreatorクラスにあると便利。

```python:実装例1
# factory側
class Creator:
 def create():
   return create_proc1()   
 
 @abstractmethod
 def create_proc1(self):
   pass

 @classmethod 
 def get_creator(cls, some_args):
     selected_class = get_class(some_args)  # クラスを指定するロジックを記載

     return selected_class()

class Creator1(Creator):
 def create_proc1(self):
   # 実処理を記載
   return Product1A(self)

# client側
def main():
 creator =  Creator.get_creator(choose_some_keywords_for_selecting_cls)
 product_1  = creator.create()

```

# abstract factoryと factory methodの違い
違いがよくわからなくなったのでしらべてみた
[Factory MethodパターンとAbstract Factoryパターンの2つの違い][Factory MethodパターンとAbstract Factoryパターンの2つの違い]
    - 生成するProductインスタンスの数(部品の数)が異なる(Abstract Factoryは複数の生成を考えやすい)
    - Abstract Factoryではインスタンスの生成をサブクラスが行い、Factory Methodでは基底クラスが行う。
    - Abstract Factoryでは１つのFactoryですべての部品を作るようなイメージ、Factory Methodは１つの部品に１つのFactoryで対応するイメージ
    -　個人的には、生成Productインスタンスが１つ、かつ、生成処理が複雑ならFactory methodを使うほうが、実装回数が減るので採用したい。それ以外の場合であれば、Abstract Factoryのほうが可読性が高そうな気もする。(コードをたどる際、毎回Factory methodを基底クラスまで見に行く必要があるので)。~~インスタンスの生成方法が頻繁に変更される可能性がある場合は、最悪createメソッドのオーバーライドで無理やり変えられるのでFactory methodがいい....?~~

## メリットと使い所
- メリット(Abstract Factoryと一緒)
    - インスタンス生成のロジックが、clientコードに依存しない(インターフェースに依存する)。
    - 作り方、作るもの、実際に作る、を別のモジュールに実装できる
- 使い所
    -  生成方法がほぼ共通の場合に効果がある
    -  生成Productインスタンスが１つ、かつ、生成処理が複雑なとき
    
>・クラスが，生成しなければならないオブジェクトのクラスを事前に知ることができない場合。
>・サブクラス化により，生成するオブジェクトを特定化する場合。
>・クラスが責任をいくつかのサブクラスの中の1つに委譲するときに，どのサブクラスに委譲するのかに関する知識を局所化したい場合。
引用元:https://yamakatsusan.web.fc2.com/pythonpattern04.html


[Factory MethodパターンとAbstract Factoryパターンの2つの違い]:https://www.macky-studio.com/entry/2019/06/19/234617#:~:text=Factory%20Method%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AF%E4%B8%80,%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%E5%90%8D%E5%89%8D%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%81Factory%20Method,%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
[wikipedia]:https://en.wikipedia.org/wiki/Factory_method_pattern
Deno in ARM64 Docker

# Deno を Docker で動かしたい、しかも Arm64 のマシン上で

## なぜ？
Apple M1 な Macbook 上で Remote Containers を使用してお勉強をしたい。
しかし、公式ではそもそも Docker image を提供していないし、Arm64 に至ってはバイナリファイルを提供していない。(Apple M1 用のバイナリはあるよ、Linux Arm64 バイナリがないんだよ、だから Docker では簡単に動かないんだよ)

## どうするの？

[この人のを使え！](https://hub.docker.com/r/lukechannings/deno)

いやなら、自分でビルドしな！公式の手順通りにやればコンパイルできたよ。メモリは 7G くらいは必要だけどね。

## いつまで使うの？

[公式の進捗を待て！](https://github.com/denoland/deno/issues/1846)
Spring-Boot の REST API の仕様書を Springfox 3 から Swagger で生成する (Maven)

## 環境

* Java 11
* mvn

## 準備

### ひながた

[Spring Initializaer](https://start.spring.io) からWEBアプリを落としてくる

![2021-05-06 20.52.33 start.spring.io a72a30157c05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6817/48bccf34-69cd-467d-ca0a-c9b8ace4cd73.png)

### APIの口を書く

`DemoApplication` に直接書いてもいいけどちゃんと独立したクラスにしましょう。

```java:MyController.java
package com.example.demo;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class MyController {
  @GetMapping("/hoge")
  public String hoge(){
    return "hoge";
  }
}

```

### Springfox の追加

https://github.com/springfox/springfox
にあるように、以下の依存関係をMavenに追加する。「`dependency`」で探せばそれっぽいところがみつかるはず。

```xml:pom.xml
		<dependency>
				<groupId>io.springfox</groupId>
				<artifactId>springfox-boot-starter</artifactId>
				<version>3.0.0</version>
		</dependency>
```

### 起動してみる

なんとこれだけでうごくのである。 コマンドラインとか、Eclipse とか使ってる人は右クリックとか、とにかく `mvn spring-boot:run` を実行すると、(何かでポートが使われてなければ)8080番でサーバが起動する。

`http://localhost:8080/hoge` でAPIの応答が確認できる。

`http://localhost:8080/swagger-ui/` に行けば以下のような画面が見れる筈。

![2021-05-06 20.58.38 localhost 8673eb4d3455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6817/07e614b6-987d-5081-0f44-bcccf051bc5f.png)

ちゃんとクラス名まで拾ってくれる。尚API個別の説明とかは Springfox2 のアノテーションが使えるみたい。
リーダブルコードまとめ

備忘のためのメモです。

# 第一部　表面上の改善
### 第二章　名前に詰め込むべき情報

1. 明確な単語を選ぶ

    > 例えば、Getではなく、状況に応じてFetchやDownloadなどを使う。

2. 汎用的な名前をできれば避ける(tmpやretval等)

3. 具体的な名前を使って、物語を詳細に説明する

    >例えば、ServerCanStart()よりもCanListenOnPort（）のほうが明確だ。

4. 変数名に大切な情報を追加する

    >単位がつけるべき場合は、例えば、ミリ秒を表す変数名には後ろに_msをつける、またこれからエスケープが必要な変数名には、前にraw_をつける。

5. スコープの大きな変数には長い名前をつける

    >スコープが数画面に及ぶ変数には1~2文字の短い暗号めいた名前をつけてはいけない。短い名前はスコープが数行の変数につけるべきだ。

6. 大文字やアンダースコアなどに意味を含める

    >例えば、HTMLのidにはアンダースコア、　classにはハイフン。また、クラスのメンバー変数にはアンダースコア、ローカル変数にはハイフン。

### 第三章　誤解されない名前

最善の名前とは、誤解されない名前であり、他人が意図を正しく理解できるもの。例えば上下の限界値であればhmax_/min_、包括的範囲であればfirst/last、包含/排他的範囲であればbegin/endを使う。get()やsiza()には、軽量メソッドが期待されるので、あまり使わない(getが入ってる関数が重い場合、イメージと合わない)。

### 第四章　美しさ

一貫性と意味のあるやり方でコードを整理し、簡単にコードを読める様にする。以下は例。

1. 複数のコードブロックで同じ処理をしているなら、シルエットも同じようなものにする。
2. コードの列(左端とか)を整理すれば、概要が把握しやすくなる
3. 処理などの順番は、意味のあるものにして、常にその順番を守る。
4. 大きなブロックは空行を使って、論理的な段落に分ける。

### 第五章　コメントすべきこと

コメントの目的は、コードの意図を読み手に理解してもらうこと。
 
 1. コメントすべきではないこと
    - コードからすぐに抽出できること
    - 酷いコードを補助する補助的なコメント。この場合、補助コメントを書くのではなく、コードを修正する。 
 2. コメントすべき、自分の考え
    - なぜコードが他のやり方でなく、こうなっているのか
    - コードの欠陥を下記の様なコメントで補助する
        - TODO: 後でやる
        - FIXME: 既知の不具合があるコード
        - HACK: あまりきれいじゃない解決策
        - XXX: 危険、大きな問題がある
    - 定数の値が持つ「背景」
 3. コメントすべき、読み手への配慮
    - 読み手が「？」となる部分を予測しコメントをする
    - 平均的な読み手が驚く様な動作は文章化しておく
    - ファイルやクラスには「全体像」のコメントを書く。
    - 読み手が細部に捕われないように、コードブロックに概要コメントを記載する

### 第六章　コメントは正確で簡潔に

小さな領域にできるだけ多くの情報を詰め込んだコメントを書くコツは下記。

 1. 複数のものを指す可能性がある「それ」や「これ」などの代名詞を避ける。
 2. 関数の動作はできるだけ正確に説明する。
 3. コメントに含める入出力の実例を慎重に選ぶ
 4. コードの意図は、詳細レベルでなく、高レベルで記述する。
 5. よく分からない引数にはインラインコメントを使う。
 6. 多くの意味が込められている言葉や表現を使って、コメントを簡潔に保つ。

# 第二部　ループとロジックの単純化

### 第七章　制御フローを読みやすく書く

制御フローを読みやすくする為に、下記を意識する。

 1. 比較の条件を書く場合は、変化する値を左に、より安定した値を右に配置する。
 2. if/else文のブロックは、適切に並び替える。一般的には、肯定形・単純・目立つものを先に処理する。この基準は衝突する場合があるが、衝突しなければ基準を守る。
 3. 三項演算子、do/whileループ、gotoなどは、コードが読みにくくなるので、なるべく使わない。
 4. 深いネスト避ける。早めにreturnしてあげる。こうすることでネストを削除したり、コードをクリーンにできる。また、「ガード説=(関数の上部で単純な条件を先に処理をする)」を意識する。

### 第八章　巨大な式を分割する

巨大な式を一度に理解しようとしても難しいので、小さく分解すべし。説明変数(式の値を保有する変数)を利用することが簡単な分解方法で、下記3点が説明変数の利点。

 1. 巨大な式を分解できる
 2. 簡潔な名前で式を説明することで、コードを文書化できる
 3. コードの主要な「概念」を読み手が認識しやすくなる

### 第九章　変数と読みやすさ

プログラムの変数はすぐに増えるので、いずれ追跡できなくなる。変数を減らして、できるだけ軽量にすればコードは読みやすくなる。具体的な削減方法は下記。

　1. 邪魔な変数を削除する
　結果をすぐに使って、「中間結果」の変数を削除する
　
　2. 変数のスコープをできるだけ小さくする
　変数を数行のコードからしか見えない位置に移動する
　
　3. 一度だけ書き込む変数を使う
　変数に一度だけ値を設定すれば、コードが理解しやすくなる(const等)

# 第三部　コードの再構成

### 第十章　無関係の下位問題を抽出する

プロジェクト固有のコードから汎用コードを分離すべし。ほとんどのコードは汎用化できる。一般的な問題を解決するライブラリやヘルパー関数を作っていけば、プログラム固有の小さな核だけが残る。こうすることで、プロジェクトの他の部分から分離された、境界線の明確な小さな問題に集中できる。

### 第十一章　一度に一つのことを

読みにくいコードがあれば、そこで行われている処理を列挙し、外出し可能なものは、切り離すべき。

### 第十二章　コードに思いを込める

書いたプログラムは簡単に言葉で説明できる様にする。実際に声に出して、説明できなければならない(できないのであれば理解していない)。

### 第十三章　短いコードを書く

- 不必要な機能をプロダクトから削除し、過剰な機能を持たせない。
- 最も簡単に問題を解決できるような要求を考える
- 定期的に全てのAPIを読んで、標準ライブラリに慣れ親しんでおく(こういうものがあると知っておくことが非常に重要)

# 第四部　選抜テーマ

### 第十四章　テストと読みやすさ
テストコードも読みやすさが重要。テストコードの改善ポイントは下記。

- テストのトップレベルはできるだけ簡潔に。入出力のテストはコード1行で記載できた方がいい
- テストが失敗したらバグの発見や修正がしやすくなるようなエラーメッセージを表示する
- テストに有効な最も単純な入力値を使う
- テスト関数に説明的な名前をつけて、何をテストしているのかを明らかにする。
[Swit5]CIFilterを試してみた


CIFilterを[公式ドキュメント](https://developer.apple.com/documentation/coreimage/processing_an_image_using_built-in_filters)のコードを参考にして、画像の色を変更してみました。
[Core Image Filter Reference](https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIHueAdjust)を見ると、色々と出来そうだと感じました。
今後、他にも試してみたいと思います。

#環境
Xcode12.3
Swift5.3.2
macOS Big Sur 11.2.3

#元の画像
![スクリーンショット 2021-05-06 17.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/edec54ef-1b19-f93b-37fa-bcde383b20ea.png)

#画像をセピア色に変更
![スクリーンショット 2021-05-06 18.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/96228e57-4724-eaf6-82f0-9d2c5d1d5f80.png)

#セピア色にした時の全コード

```swift
import UIKit

class ViewController: UIViewController {

    let image = UIImage(named: "sydney.jpg")
    
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let originalCIImage = CIImage(image: image!)
        let sepiaCIImage = sepiaFilter(originalCIImage!, intensity: 0.9)
        self.imageView.image = UIImage(ciImage: sepiaCIImage!)

    }

    func sepiaFilter(_ input: CIImage, intensity: Double) -> CIImage? {

        let sepiaFilter = CIFilter(name: "CISepiaTone")
        sepiaFilter?.setValue(input, forKey: kCIInputImageKey)
        sepiaFilter?.setValue(intensity, forKey: kCIInputIntensityKey)
        return sepiaFilter?.outputImage
    }
}
```

#参照サイト
https://developer.apple.com/documentation/coreimage/processing_an_image_using_built-in_filters
https://developer.apple.com/documentation/coreimage/cifilter
https://qiita.com/shtnkgm/items/fb1425ef88d31fdad1d4
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIAccordionFoldTransition
STM32L010と内蔵ADCで電圧をソフトウェアシリアルに出力 3.300Vまで


目的
主にNJL7502Lの微小な電圧を測る。

説明
主な変更点は、電圧表示の計算式を次の計算式にした

adcの値(4096)に6600掛けて8192で割ると3300にピッタリなる。

どして、こうなったは、STM32L010を参照

![serial_adc_010_2_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5ab431d4-611f-c946-b986-1838255892e9.jpeg)


```c++

//電圧

#include "mbed.h"

//10k6Ωの上側　下側フラグ　1は上側 0は下側
#define DO_UP  0

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

#define UART_DELAY 96 //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9);
DigitalOut TX(PA_2);

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    l_num=b;
    a=DVI10(l_num);
    b=l_num-(a*10);

    ch_hex_a_b[0] = '0' + a;
    ch_hex_a_b[1] = '0' + b;
    ch_hex_a_b[2] = '0' + c;
    ch_hex_a_b[3] = 0;

    return(ch_hex_a_b);
} //ch_hex_a




//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
        
    TX=1;
    TX=0;//START
    wait_us(UART_DELAY);

    for(int ii=0;ii<8;ii++){
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);
             
    return(0);
    
} //pc_putc

//文字列の表示
int pc_printf(char *str1) {

    int ii = 0; //ループカウンター
    while(str1[ii]!=0){
            
        //一文字出力
        pc_putc(str1[ii]);ii++;
                        
    } //while

    //戻り値
    return(0);
}

int main() {

    //ポートをhiにする 初期化
    TX=1;
    
    //無限ループ
    while(1) {
    
        //adcの読み込み 0から4096
        int s = (adc_vbat.read_u16()>>4);
    
//        pc.printf("\r\n -S=%d",s); //767

        //電圧に変換 ex 3.300 -> 3300 mVを出力
        s=(s*6600)>>13;

//        //s = 3300;
//        pc.printf("\t c=%d",s); //767

//小数点以上と小数点以下を分ける iiは1の桁 sは小数点以上の桁
int ii = s;
if     ( ii >= 3000 ) { ii = (ii - 3000); s = 3;}
else if( ii >= 2000 ) { ii = (ii - 2000); s = 2;}
else if( ii >= 1000 ) { ii = (ii - 1000); s = 1;}
else                  {                 ; s = 0;}

//        pc.printf("\t t=%d %d",s,ii); //767
//        pc.printf("\r\n"); //767 リターン


        //電圧の小数点以上の表示
        ch_hex_a( s*10 );
        ch_hex_a_b[0] = '+';
      //ch_hex_a_b[1] = '0' + s;
        ch_hex_a_b[2] = '.';      
        pc_printf(  ch_hex_a_b  );

        pc_printf(  ch_hex_a(ii)  );
                
        //リターン
        pc_printf(  "\r\n"  );

        //1秒の待ち
        wait_ms(1000);
        
    } //while

} //main

//容量削減
void error(const char* format, ...){}



```
Unityで作成した大容量プロジェクトをGitLabにアップロード

#概要
この記事はUnityで作成した大容量プロジェクトをGitLabにアップロードするための手順を簡潔にまとめたもの
初心者なので、不備があってもご容赦いただけると幸いです。

#この記事を記載しようと考えた経緯
元々GitHubにアップデートをしようと思ったが、無料で使用できる容量ではオーバーしてしまい右往左往していたところ、GitLabを知り備忘録として記事にした

#事前準備
● gitlabで新規プロジェクトを作成
● .gitignoreファイルをアップロードしたいプロジェクトに挿入
（挿入場所はAssetsと同じ階層）

Unityをgitにアップロードする際に必要と言われている.gitignoreのテンプレートは( https://github.com/github/gitignore )を参考にしました


#アップロード手順(ターミナルで実行)
```
1 git init
2 git remote add origin [自分が作成したプロジェクトのURL]
3 git add .
4 git commit -m “適当なコメント”
5 git push origin master
```

5でエラーが出た場合は以下6,7を実行し、再度5を実行

```
6 git fetch
7 git merge --allow-unrelated-histories origin/master
```
Python実践データ分析100本ノック：ノック71でNetworkXError

# 結論
`decorator`のバージョンを`4.3.0`に落とす

## エラー詳細

```
NetworkXError                             Traceback (most recent call last)
<ipython-input-1-55dde0c34e24> in <module>
     18             G.add_edge(str(i),str(j))
     19 
---> 20 nx.draw_networkx(G,node_color="k", edge_color="k", font_color="w")
     21 plt.show()

-----------------
NetworkXError: random_state_index is incorrect
```

## 解決方法

`decorator`のバージョン確認

```
$ conda list
```

```
decorator                 5.0.6              pyhd3eb1b0_0
```

`decorator`のバージョンを`4.3.0`に指定してインストール

```
$ pip install decorator==4.3
```

`decorator`のバージョン再確認

```
decorator                 4.3.0                    pypi_0    pypi
```

## 参考記事

[https://github.com/microsoft/CyberBattleSim/issues/4](https://github.com/microsoft/CyberBattleSim/issues/4)
Rを手に入れよう

# この記事では
　この記事では、統計解析ソフト***[R](https://www.r-project.org/)***を手に入れることを目的とします。
　文系の学部生でも、ひょんなことから統計学を学ぶ必要があります。かく言う私も、文学部で統計学の授業が必須でした。
　この記事は、
　　　統計学を勉強しなきゃいけない！R？あーる？とかいうプログラミングも、苦
　　　手な数学もやらなきゃいけない！ぎゃーーーー( ;∀;)
　という叫びを鎮魂するためのレクイエム第一章として、まずはソフトウェアの入手方法から紹介します。

# さっそく入手
　Rのインストールは、[こちら](https://cran.ism.ac.jp/)がリンクになります。
　ご自身の作業環境（Linux, Mac, Windows）に適したものを選んでくださいね。

　次のページに進んだら、「install R for the first time」をクリックしましょう。あとは、誘導に従ってください。

# インストール完了！
　お疲れ様でした！
　インストールしたRを開いてみると、「R Console」なるものが開かれたかと思います。コンソールとは、作業をする場所のことを表します。つまり、ここで計算を行っていくわけですね。
　他にも、[R Studio](https://www.rstudio.com/products/rstudio/)や[Jupyter](https://jupyter.org/)を使うこともできます。興味がある方は、こちらも触ってみてくださいね。

---
##### おしまい
　この記事では、Rのインストール方法を紹介しました。
　数学が苦手だから文系に行ったと言う方も少なくはないでしょう。ただ、自然科学にせよ、人文科学にせよ、真実に限りなく近づくための手段として、統計学の概念的な部分に触れておくことは重要であると思います。
　授業だけではよくわからない知識を、これから補っていければと思います。
MicronautのWebアプリケーションをAzure App Serviceで動かす

Azure App ServiceでSpring Boot以外にどんなWebフレームワークが動かせるのか？これまでいくつか試してきました。
- [HelidonのWebアプリケーションをAzure App Serviceで動かす](https://qiita.com/kikutaro/items/cb92d6d5b2c8e22c8427)
- [QuarkusのWebアプリケーションをAzure App Serviceで動かす](https://qiita.com/kikutaro/items/33be8b3e00ad9eb37b41)
- [Vert.xのWebアプリケーションをAzure App Serviceで動かす](https://qiita.com/kikutaro/items/c3af93fba5bbdb91e147)

今回は[Micronaut](https://micronaut.io/)です。最初に[Micronaut Launch](https://micronaut.io/launch/)でプロジェクトを作成しました。選択した項目は以下のとおりです。

![2021-05-06_11h04_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/b0697046-fe2d-5c34-c3f7-5f3eede2c4cb.png)

# ローカル環境での実行

Micronaut Launchで作成したプロジェクトを解凍して、[こちらのドキュメント](https://docs.micronaut.io/latest/guide/#creatingServer)に従ってHelloControllerを追加します。

```java
package com.example;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/hello") 
public class HelloController {

    @Get(produces = MediaType.TEXT_PLAIN) 
    public String index() {
        return "Hello World"; 
    }
}
```

ビルドします。

```
mvn clean package
```

実行します。

```java
java -jar target/*.jar
```

起動しました。

![2021-05-06_17h22_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f5957a78-da58-0afa-8b1b-1e55d992346d.png)

localhost:8080にアクセスすると以下のような表示になります。
![2021-05-06_17h23_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/8044e5d0-5f99-357f-18d3-f0e6581bea36.png)

localhost:8080/helloにアクセスするとHelloControllerの結果が返ります。
![2021-05-06_17h23_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/eef46249-80d2-bef6-86d2-917bd3502f47.png)

これをAzure App Serviceにデプロイしていきます。

# Azureでの実行
最初にAzure CLIでログインしておきます。

```
az login
```

次にpom.xmlのbuildセクションに以下を追加します。

```xml
<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-webapp-maven-plugin</artifactId>
    <version>1.14.0</version>
</plugin>
```

以下コマンドを実行します。

```
mvn com.microsoft.azure:azure-webapp-maven-plugin:1.14.0:config
```

今回はlinux、Java 11を選びました。

ビルドしてデプロイします。

```
mvn clean package
```

```
mvn com.microsoft.azure:azure-webapp-maven-plugin:1.14.0:deploy
```

デプロイできたら実際にアクセスしてみます。

![2021-05-06_13h05_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/84f14a92-6292-b832-b721-e0d3b5e03027.png)

問題なく表示されました。色々なJava Webフレームワークを試してきましたが、ほとんどのものをApp Service上で動かせる気がします。
0からはじめるスクラム開発

# 突然ですがスクラム始めました

先月から、~~予算がない弱小チーm~~私の所属する開発チームがスクラム開発を始めたので、そのことを記事にしたいと思います。※参考までにコストも記載してます。

# まずはお勉強
スクラム開発歴半年ほどの私がスクラムマスターをすることになりました。
スクラム経験があると言っても、人に説明できるほどではなかったので改めて勉強しなおすことにしました。

#### ・SCRUM BOOT CAMP THE BOOK(約2500円)
翔泳社さんから出版されている、スクラム初心者向けの本です。架空の開発チームを例にスクラムが説明されていて、イラストも多く実際の開発のイメージがしやすかったです。初心者にも分かりやすい内容だったのでメンバーにも読んでもらいたかったですが、リモートワーク中なので貸し借りできず断念・・・。

#### ・スクラムガイド（無料）
有名な文献ですね。スクラムのルールや役割について細かく説明されているので、ふとした時に読み返してます。
https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf

#### ・いちばんやさしいアジャイル開発の教本（Kindle Unlimitedなら無料）
たまたまKindle Unlimitedで無料（※2021/4/30現在）だったので読みました。（まだ読み途中なので、GW中に読みたいな・・・。）

# メンバーへの教育
簡単なパワポスライドを使って説明しました。が、説明してもやってみないことには理解は難しそうでした。「習うより慣れろ！」ということで、イベントごとに都度説明しつつスプリントを1週間にしてとにかくサイクルを回して覚える！スタイルでいきました。

# プロジェクト管理ツール（Officeが入ってるPCなら無料）
プロダクトバックログ、スプリントバックログはExcelで管理しています。色々ツールはあるのですがまずはExcelで始めてみることに。

# プランニングポーカー（無料）
こちらのサイト使ってます。
https://hatjitsu.toolforge.org/

# スプリントレトロスペクティブ（無料）
GoogleJamboardを使ってます。ペイントソフトでKPTの背景画像を作って設定してます。（今見たら、Tryの右ちょっと線はみ出てる・・・／(^o^)＼！？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318640/6ca15c23-95eb-9763-f0f1-9a151359b510.png)

# さいごに
始めて1か月以上経ちましたが、自チームオリジナルのルールを作ったり、自分たち流のスクラム開発を作ることが出来てます。突然始めたスクラム開発でしたが、普段物静かな後輩も振り返りで問題提起をしてくれたり嬉しい変化もありました。
もしスクラムをやってみたいと思う方は、完璧にスクラムのルールに沿わなくても、スクラムマスターが独学でも良いと思うので、是非挑戦してみてください。この記事が少しでも誰かの参考になればと思います。
Unityでandroid向けVRゲームを作成する際の備忘録

Unity初心者がVRゲームを作成するにあたりぶち当たった問題をつらつらと書き記していきます。
※順次追記していきます。

■環境
　Unity：2021.1.5f1
　URP：11.0.0
　Cardboard XR Plugin：v1.5.0
　試験端末：HUAWEI P30 lite

■ぶち当たった問題
　１，URPのテンプレートからプロジェクトを作成すると端末上で何も表示されない
　２，シェーダーがガンマ色空間用にカスタマイズされていない？
　３，SpotLightやPointLightのModeをRealTimeにするとAndroid端末上でのみ影が表示されない

■問題点1:URPのテンプレートからプロジェクトを作成すると端末上で何も表示されない
写実的な絵のゲームを作成したい場合、URPを使用するという選択肢があります。

https://learn.unity.com/tutorial/introduction-to-urp

モバイル端末アプリケーションにも推奨されており、URPのサンプルプロジェクトを開くと十分に写実的な映像が見られます。
※さらに写実的な映像を作成したい場合はHDRPの使用が推奨されている。

とりあえずこのサンプルプロジェクトをVR化することを第一ステップとしようと思い、下記を参考にビルドを行いました。

https://developers.google.com/cardboard/develop/unity/quickstart

cardboardサンプルプロジェクトは正常に動作したのですが、URPのテンプレートからプロジェクトを作成してビルドした場合、真っ黒な画面が表示されるだけのアプリが出力されました…


・cardboardサンプルプロジェクトとの比較
ということで原因を調査しました。cardboardサンプルプロジェクトとURPサンプルプロジェクトの設定と比較して差分がある部分をひたすらチェックしていくというアナログな手段で調査しました。
※ググり方が悪かったのか問題点そのものの解決策は見つからなかったです。

以下の2点を変更するとVRアプリとしては正常に動作するようです。
　①Project Setting→Player→Other Setting→Color Spare→Gamma
　②Main camera→Camera→Rendering→Post Processing→チェック外す

①android端末はリニア色空間に対応していない？

https://github.com/googlevr/gvr-unity-sdk/issues/676

上記投稿は2017年ですが依然として問題があるようです。
少なくともHUAWEI P30 liteでは2021/05/06現在対応していないようです。
※Oculusなどでは対応していそう？

嘆いていても仕方がないのでガンマ色空間でゲームを作成する方針とします。

②Post Processingは非対応？
Post Processingを有効にするとUnityのロゴマークの画面から遷移しませんでした。
こちらもどうやら非対応もしくは一部のポストプロセスが干渉してしまっていると思われます。


■問題点2：シェーダーがガンマ色空間用にカスタマイズされていない？
シェーダーについてはまだ全く勉強していない状態なのでそういうものなのかもしれませんが、"Universal Render Pipeline/Lit"で描写したときに影が濃すぎるように感じます。
"Lit"がガンマ色空間想定されていない、もしくはガンマ色空間は"そういうもの"、のどちらかかと思います。


・リニア色空間設定時：
![Qiita_linearPreview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1452331/ae8916f9-3e0a-cdde-bb6b-923138ab953c.png)

・ガンマ色空間設定時：
![Qiita_gammaPreview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1452331/98b0a19d-1d43-6929-2c34-24d6cbdcbb11.png)

※画面奥のSpot Lightの設定は、Mode = baked、Intensity=10にしています。
　Mode = Mixed or Realtimeにすると黒い影は発生しません。

リニア色空間への変更は問題点1で不可であり、影の濃さや色調をPost Processingで設定することも同様に問題点1でできないので、シェーダースクリプトを書き換えることでどうにかできないか模索中です。素人ながらSimpleLit色々を弄ってみましたがいい感じにはならず。BakedGIをうまいこと弄れればそれっぽくなりそうな感じはします。
もし解決策ご存じの方いたら教えていただきたいです…

追記)
Intensityの設定が間違っていました。右の壁に描写されている影をみれば分かりますが、ガンマ色空間とリニア色空間での光の強さ(Intensity)は数値が同じでも実際に見える強さは異なります。
BakedGIはBaked Global Illuminationの略。Unity Learnに色空間とGIを含めた説明がありました。
https://learn.unity.com/tutorial/introduction-to-lighting-and-rendering



■問題点3：SpotLightやPointLightのModeをRealTimeにするとAndroid端末上でのみ影が表示されない
Preview上では影が見えるのですがAndroid端末上では見えません。
Sun Sourceに設定しているDirectionalLightはRealtimeでも影を表示します。
原因調査中…

追記1 2021/05/08)問題点2追記、問題点3追記
追記2 2021/05/08)問題点2追記
システムクロックとハードウェアクロックの違い

## 勉強前イメージ

そもそもあるって知らなかった

## 調査

### システムクロックとは

OSが管理する時計がシステムクロック。
OSがファイルの管理などに使用します。
NTPからの情報を元にシステムクロックを管理します。

### ハードウェアクロックとは

システムクロックはOSで管理されていますが、メモリ上で管理されているため
再起動するとデータが無くなってしまいます。
ですので、OSをシャットダウンしても時刻情報を保持するのがハードウェアクロック。
ハードウェアクロックはマザーボードに実装されます。
OS起動時はハードウェアクロックを参照します。

### 各時間の確認方法

- ソフトウェアクロックの確認方法

`date` コマンドを使用します。

```
[root@localhost ~]# date
2021年  5月  6日 木曜日 20:34:08 JST
```

- ハードウェアクロックの確認方法

`hwclock` コマンドを使用します。

```
[root@localhost ~]# hwclock
2021年02月03日 17時58分52秒  -0.575354 秒
```

## 勉強後イメージ

多分前にやったんだろうけど忘れてるかも・・・
いつも見てるのはシステムクロックの方なのね。

## 参考

- [「ハードウェアクロック」と「システムクロック」](https://linuc.org/study/knowledge/442/)
- [パソコンの時計　ハードウェア クロックとシステム クロック](http://park12.wakwak.com/~eslab/pcmemo/clock/)
Shopify 商品一覧ページへ特定の商品を表示させない方法

# 商品一覧ページへ特定の商品を表示させない方法
今回お客様の要望で、会員ページには表示させたいが、商品一覧ページには表示させない方法はないかと要望をいただき実装してみました。
その際に時間がかかったので、皆様の参考になればと思い記事にしてみました。

# 結論
```
{% for product in collection.products %}
  {% if product.tags contains '特定のタグ' %}{% continue %}{% endif %}
  <!-- 以下に商品一覧のコード -->
{% endfor %}
```
一行で終わります。
ファイルの中のcollection.liquidを探し、その中から
```{% for product in collection.products %}```
を探し出して、そのfor文直下に
```{% if product.tags contains '特定のタグ' %}{% continue %}{% endif %}```
を投入してあげるだけ
（表示させたくない商品に共通のタグを付けてください。その共通のタグを特定のタグの部分に入れます。今回は会員ページのみで表示させたいので、customerにしました）


# タグの説明
```
{% for product in collection.products %}
{% endfor %}
```
こちらはfor文です。
collectionに含まれるproductをproductに入れています。

for文　https://shopify.dev/docs/themes/liquid/reference/tags/iteration-tags

```
{% if product.tags contains '特定のタグ' %}
{% endif %}
```
こちらはｉｆ文
商品のタグ（product.tags）に特定のタグが含まれている（contains）時はと言う意味になります。

if文　https://shopify.dev/docs/themes/liquid/reference/tags/control-flow-tags#if
contains　https://shopify.dev/docs/themes/liquid/reference/basics/operators#contains


```
{% continue %}
```
こちらは現在のループをスキップさせるタグです。

continue　https://shopify.dev/docs/themes/liquid/reference/tags/iteration-tags

全体を通すと、
コレクションの中の商品の商品タグに特定の商品を含む場合、ループをスキップさせて
と言う意味になります。

# 失敗談
私は始め次の様なコードを書いていました

```
        {% assign nocustomer_products = "" %}
        {% for product in collection.products %}
          {% unless product.tags contains "customer" %}
            {% assign nocutomer = nocustomer | append: "," %}
            {% assign nocutomer = nocustomer | append: product %}
          {% endunless %}
          {% assign nocutomer = nocustomer | remove_first: ',' %}
          {% assign nocutomer = nocustomer | split: ','%}
        {% endfor %}

        {% for product in nocustomer%}
          <!-- 以下に商品一覧のコード -->
        {% endfor %}
```

まず、商品一覧からcustomerタグを含む商品を取り出した配列を作り、それを一覧表示しようとしていましたが、porductのみでは配列にうまく入れることができずに、表示できませんでした。
（しかもforを２回とか商品点数が多くなると読み込みに時間がかかりそう…）


# まとめ
商品一覧に特定の商品を表示させたくない場合
collection。liquidファイルの```{% for product in collection.products %}```直下に
```{% if product.tags contains '特定のタグ' %}{% continue %}{% endif %}```を入れる
特定のタグの部分はセクションのschemaを使って値を変更出来る様にしてあげると便利そうですね！
開発のお役に立てれば幸いです！

今回参考にした記事はこちら　https://community.shopify.com/c/Shopify-Design/How-to-hide-a-product-from-a-collection-using-liquid/td-p/367792
Git Stashで作業を一時避難

実務で作業を途中でコミットしたくないけど、他のブランチで作業しないといけないということがあり、
git stashを使って作業を一時避難しました。

<h1>git stashコマンドで作業を一時避難</h1>
<pre>
git stash
git stash save
//saveはつけてもつけなくても良い
</pre>
ワークツリーやステージでの変更内容をstashという場所に一時的に避難させることができる。
なので、ワークツリーやステージでの変更が消えます。

実際にやってみます。。
ファイルを変更し、git status　を行うと下記のように変更が確認できます。
![スクリーンショット 2020-11-08 19.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/2420ecd2-ed78-8649-f427-1cabd6a482d1.png)

<pre>
git stash -u
//一時的に避難させる
</pre>

下記コマンドで確かめると、変更が消えています。
<pre>
git status
</pre>
![スクリーンショット 2020-11-08 19.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/6e7a034c-01bb-e8c5-b867-c17c73cfae3e.png)
<h1>避難した作業を確認</h1>
因みに、避難した作業を確認することができます。
<pre>
git status list
//避難した作業を表示
</pre>

![スクリーンショット 2020-11-08 19.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/06a91584-265b-0ce4-6b58-df22e999abb1.png)

こんな感じで、確認できます。。
git stashを何度も行うと、stash@{0},stash@{1},stash@{2}と生成されていきます。
最新のstashは｛0｝になります。
<h1>避難した作業を戻す</h1>
避難した作業を戻してみます。

<pre>
git stash apply stash@{0}
//避難した作業を戻す
</pre>
![スクリーンショット 2020-11-08 19.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/d7a1b2b5-064b-653d-5106-e810c85e67ba.png)

はい！変更が戻ってきました。
<h1>避難した作業を削除</h1>
stashすると、どんどん溜まっていきます。
なので、削除しましょう。

<pre>
git stash drop stash@{0}
//避難した作業を削除
git stash clear
//避難した作業を全削除
</pre>

上記、コマンドを実行し、git stash list を行うとstashした作業が消えていることがわかります。
stashが溜まり、一気に削除するときはgit stash clearをしましょう。

stashした作業が消えるだけで、作業内容は消えないので安心して使ってみてください。。

実務でとても便利だと感じたのでshareします。

以上
laravel sailで簡単に実行環境を作る

laravelを動かす環境はHomestead,laradockなど色々ありますが、sailってどんなもんだろうということで使ってみました。

構築環境:
macOS BigSur 11.2.3
Docker version 20.10.0, build 7287ab3
docker-compose version:1.27.4, build 40524192

# sailインストール方法

２つ方法がある

## 方法１．curlコマンドによるプロジェクト作成＋sail環境作成

プロジェクト作成と一緒にsail環境も入れたい場合はcurlインストールで作成できる

```
# withパラメタ指定がない場合は`mysql,redis,meilisearch,mailhog,seleniu`がデフォルト
$ curl -s "https://laravel.build/アプリ名" | bash

# with引数を指定することで一緒にインストールするものを選べる(指定できるワードは方法2参照)
$ curl -s "https://laravel.build/アプリ名?with=pgsql,memcached" | bash
```

## 方法２． 既にあるlaravelプロジェクトにcomposer requireしてsail環境作成

create-project済みの環境にインストールする場合はこちら

```
# プロジェクトに移動してcomposer require
$ composer require laravel/sail --dev

# 必要な環境を以下コマンドで作成する
$ php artisan sail:install

# 以下のようなメッセージが表示されるので必要な機能を`,`区切りで入力する
 Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] mailhog
  [7] selenium
 > 1,4
# 間違った場合は再度`php artisan sail:install`すれば良い
```

### ２つのインストール方法に違いはある？

違いがあるかな?ということで２つのプロジェクトをdiffしてみたところ以下の違いがあった

- .env

|設定|curl install|composer require|
|:--|:--|:--|
|APP_KEY|設定済み|未設定|
|APP_URL|プロジェクト名.test|localhost|
|DB_DATABASE|プロジェクト名|laravel|

これはsailというよりcurlインストール方式の違いだと思う
composer requireはAPP_KEYが未設定なので`php artisan key:generate`しないと動かせないので注意

- composer.json

|設定|curl install|composer require|
|:--|:--|:--|
|larave/sail|^1.0.1|^1.5|

composer requireはバージョン指定しなかったので当然ながら最新が入っていた
curl installはそもそも設定されたバージョンなのか1.0.1だった

どちらの方法でもあとは以下のコマンドでdockerを起動でき、`http://localhost`で画面が見れる

```
# 起動 (sailコマンドについては後で記載）
./vendor/bin/sail up -d
```

create-projectした際は.envの修正が必要だったがAPP_KEYのみでほぼ触ってないに等しい状態で動かせるのがすごい

以降は方法２で作った環境で確認

---

# sailコマンドについて

docker-composeコマンドとは別にsailコマンド覚えなきゃいけないのかなーって思ったら、`sail help`するとdocker-composeのヘルプが出る・・・！
それに以下のようなコマンドがあり、ほぼdocker-composeと同じように見えた

```
# 起動
./vendor/bin/sail up -d
# 停止
./vendor/bin/sail down
```

こんな命令をするとホスト側からdocker内にコマンドを流すことも出来た

```
# docker内でmigrate
./vendor/bin/sail artisan migrate

# docker内のphp versionを表示
./vendor/bin/sail php --version
```

sailコマンドってどういうものなの？ということでリポジトリを見てみる(2021/5/5時点)
https://github.com/laravel/sail/blob/1.x/bin/sail

## docker execしてコマンドを流す機能

sailコマンドの引数$1を見て、docker-compose execしてコマンドを流してくれる以下がある。

```
php,composer,artisan,art,test,dusk,dusk:fails,tinker,node,npm,npx,yarn,mysql,mariadb,pgsql,shell,bash,root-shell,share
```

artisan以外に気になったものだけピックアップすると

- mysqlとmariadbは同じmysqlコマンドだけどdocker execする名前が違うから別に分けられてる
- shell,bashは同じ機能
- root-shellはroot権限でのbash実行になる

## docker-composeにコマンドを流す

docker execしてコマンドを流してくれる上記以外の場合はそのままdocker-composeコマンドに流すようになっている。(sail helpはこれに該当した）

なのでdocker-composeのbuildも使えるので、sailをdocker-composeに読み替えて使うことが出来る

## alias設定

そんな便利なsailコマンドだけど./vendor/bin/sailを一々打つのは面倒なのでalias設定をしておくと便利

macの場合:~/.zshrcに以下を設定しておく

```
alias sail='bash ./vendor/bin/sail'
```

---

# 結論

- さくっと環境を作りたい場合に便利
    - 細かい.envを設定しなくても動かせる環境が出来る
- sailコマンドによるdocker内にコマンドを流すのが簡単
    - docker exec -it xxxx bash しなくていいんだ・・・！

あまりに簡単に環境が作れるので、これからlaravel学習する人には特におすすめかも。
migrateしてしまったモデルとテーブルの削除方法

#はじめに
モデルを作成してマイグレーションしてから、作成されたモデルとテーブルを削除する必要があったので、その時の手順を残しておきます。

#削除手順
①モデル作成時のファイルを削除する。
②削除用のファイルを新規作成する。
③削除用のファイルに削除したいテーブルを記載。
④マイグレーションして、削除を行う。

①モデル作成時のファイルを削除する。
まず以下を入力して、該当モデル作成時のファイルを削除します。
今回は、クチコミサイト作成時商品にカテゴリを付与したいと考えたので、categoryモデルを作成して、categoriesテーブルが作成されていると仮定します。

``` ruby:
rails destroy model category
```


②削除用のファイルを新規作成する。
次にテーブル削除するために新規でマイグレーションファイルを作成します。(GI上では削除できないため)
以下を記載します。

```
rails generate migration 任意のファイル名
```
ファイル名は後に削除するので何でも構いません。
ここでは、「delete_category_table」としておきます。


③削除用のファイルに削除したいテーブルを記載。
マイグレーションファイルを開いて、以下を記載します。

``` ruby:delete_category_table.rb
class DeleteCategoryTable < ActiveRecord::Migration[5.2]
  def change
   drop_table :categories 　←drop_table :削除したいテーブルを記載
  end
end
```


④マイグレーションして、削除を行う。
最後はマイグレーションして、テーブルの削除を反映させます。

```
rails db:migrate
```

以上となります。



#終わりに
当初はテキストエディタ上で右クリック→deleteで削除した気になっていました。
当然それではきちんと削除されている訳なく…。
しっかりと根本から削除する必要があるのだなと学びました。
STM32L010と内蔵ADCで電流をソフトウェアシリアルに出力 330.0uAまで　10kΩ上側または10kΩ下側


目的
主にNJL7502Lの微小な電流を測る。

説明
主な変更点は、電圧表示の計算式を次の計算式にした

adcの値(4096)に6600掛けて8192で割ると3300にピッタリなる。


どして、こうなったは、STM32L010を参照

![serial_adc_010_2_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/24de123f-62e6-09b9-5252-924be23970ce.jpeg)



```c++

//電流

#include "mbed.h"

//10k6Ωの上側　下側フラグ　1は上側 0は下側
#define DO_UP  0

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

#define UART_DELAY 96 //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9);
DigitalOut TX(PA_2);

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    l_num=b;
    a=DVI10(l_num);
    b=l_num-(a*10);

    ch_hex_a_b[0] = '0' + a;
    ch_hex_a_b[1] = '0' + b;
    ch_hex_a_b[2] = '0' + c;
    ch_hex_a_b[3] = 0;

    return(ch_hex_a_b);
} //ch_hex_a




//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
        
    TX=1;
    TX=0;//START
    wait_us(UART_DELAY);

    for(int ii=0;ii<8;ii++){
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);
             
    return(0);
    
} //pc_putc

//文字列の表示
int pc_printf(char *str1) {

    int ii = 0; //ループカウンター
    while(str1[ii]!=0){
            
        //一文字出力
        pc_putc(str1[ii]);ii++;
                        
    } //while

    //戻り値
    return(0);
}

int main() {

    //ポートをhiにする 初期化
    TX=1;
    
    //無限ループ
    while(1) {
    
        //adcの読み込み 0から4096
        int s = (adc_vbat.read_u16()>>4);
    
//        pc.printf("\r\n -S=%d",s); //767

        //電圧を電流に変換 ex 330.0uA -> 3300 uAの十倍を出力
        if(1 == DO_UP) { s=4095-s; }
        s=(s*6600)>>13;

//        s = 3300;
//        pc.printf("\t c=%d",s); //767

//小数点以上と小数点以下を分ける iiは10の桁 sは1の桁
int ii = s;
if     ( ii >= 3000 ) { ii = DVI10( (ii - 3000)  ) + 300; }
else if( ii >= 2000 ) { ii = DVI10( (ii - 2000)  ) + 200; }
else if( ii >= 1000 ) { ii = DVI10( (ii - 1000)  ) + 100; }
else                  { ii = DVI10( (ii       )  )      ; }
s = s - (ii*10);

//        pc.printf("\t t=%d %d",ii,s); //767
//        pc.printf("\r\n"); //767 リターン
    
        pc_printf(  ch_hex_a(ii)  );
        
        //電流の小数点以下の表示
        ch_hex_a( s*10 );
        ch_hex_a_b[0] = '.';
      //ch_hex_a_b[1] = '0' + s;
        ch_hex_a_b[2] = 'u';      
        pc_printf(  ch_hex_a_b  );
        
        //リターン
        pc_printf(  "\r\n"  );

        //1秒の待ち
        wait_ms(1000);
        
    } //while

} //main

//容量削減
void error(const char* format, ...){}



```

![serial_adc_010_2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8b5aa7b3-8d1d-80b5-6d23-21c256f18519.jpeg)
TSでReactの環境構築中に出た "error Cannot use JSX unless the '--jsx' flag is provided." を解消する


## 症状
```
src/app.tsx:10:17 - error TS17004: Cannot use JSX unless the '--jsx' flag is provided.

10 const element = <h1>Hello, world</h1>;
```
Typescriptを使ってReactの環境を作っているときに発生したエラーです。

## 結論：下記のいずれかで治ると思います
1.使用しているtypescriptのバージョンを4.1以上にする
2.tsconfig.json で compilerOptions.jsx = react-jsx とする

### 1.使用しているtypescriptのバージョンを4.1以上にする
詳細は「[VScodeでTSを使うと出るCannot use JSX unless the '--jsx' flag is provided. ts(17004)を解決する。](https://qiita.com/Neitworks/items/f8db28770761cbf33262)」などをご参照ください。
なお、自分の場合はこれでは直らなかった。というより、エラー発生時点で既に4.1以上を使っていた。そんなときは下記2を試してみましょう。

### 2.tsconfig.json で compilerOptions.jsx = react-jsx とする
```json:tsconfig.json
{
  "compilerOptions": {
    "jsx": "react-jsx",
  }
}
```
参考：["Error: Cannot use JSX unless the '--jsx' flag is provided" when using "extends"](https://github.com/atom/ide-typescript/issues/52#issuecomment-362297385)

自分の場合はこれで治った。
v-else

先ほどはtrueの時の表示だけですが、
falseの場合の表示もさせてみます。

ここで使うのが
v-else
-

```vuejs
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="app">
<p v-if="ok">OK</p>
<p v-else>NG</p>
</div>
```
```vuejs
new Vue({
  el: '#app',
   data: {
   ok: false
 }
})
```

![20210506-201222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/b217811e-830a-09d9-108e-386673dbf0a7.png)

v-elseはv-ifの直後に使うこと。
UIStoryboard

#■UIStoryboard
プロパティメソッド

``` swift
//どのUIstoryboardなのか？
init(name: String, bundle storyboardBundleOrNil: Bundle?)

//例 Mainって言うUIStoryboardやで
let storyboard = UIStoryboard(name: "Main", bundle: nil)
```

``` swift
//どのUIviewContorollerなのか？
open func instantiateViewController(withIdentifier identifier: String)

//例: Main.storyboardのStoryboardID:CodeってつけたUIViewControllerやで
let CodeView = storyboard.instantiateViewController(withIdentifier: "Code")
```

``` swift
//どのUIviewContorollerなのか？
   open func instantiateInitialViewController() -> UIViewController?

//例: MainStoryboardのFirstViewControllerやで
   let CodeView = storyboard.instantiateViewController() as! FirstViewController
```

#■縮めてまとめて書く

``` swift
 UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController() as! FirstViewController
```