OmniAICreator/Qiita-1.07M huggingface dataset:
iOS14用のURLスキームをQRコードで作成してみる

最近はQRコードで簡単にWiFiの接続設定ができたりして、すごく便利になりました。この機能を使いもっと便利にならないかと思い調べてみました。その際のメモを残します。

#簡単な原理

このQRコードを調べていくと、以下のような流れでアプリ起動までを行っていました。
1. カメラアプリ（コードスキャナーアプリ）から画像（QRコード）を取り込む
2. 画像（QRコード）を文字列（URLスキーム）に変換する
3. 文字列（URLスキーム）を実行する
4. 該当するアプリが起動する

#QRコードの作成

QRコードはpython3を使える環境であれば、下のコードで簡単にQRコードを作成できます。`qrcode`は`pip`コマンドなどでインストールしておいていください。

```python:make_qr.py
import qrcode
img = qrcode.make('URLスキームの文字列')
img.save('保存したいファイル名')
```

#URLスキーム

URLスキームはプログラム言語みたいに色々できるかと思いましたが、残念ながら大したことはできなさそうです。（調べ方が足りないかも？）
自分が調べた中で使えそうなURLスキームの例を下に記載します。なお動作はiOS14.5のみで確認しました。

|アプリ名|記入方法（[ ] は入力しません。）|QRコード例|
|:---|:---|:---|
|電話|tel://[電話番号]|![tel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/8450ece7-fef9-1abe-798b-3fc364acea86.png "tel://090xxxxxxxx")|
|メッセージ(SMS)|sms://[電話番号]&body=[メッセージ]|![sms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/8f740839-3d3a-f7ee-0f4a-58358b7537a6.png "sms://090xxxxxxxx&body=test")|
|メール|mailto:[メールアドレス]?subject=[タイトル]&body=[本文]|![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/e67e92a3-423d-b2cb-1d8a-6468d2a6b47f.png "mailto:xxx@xxx.xxx?subject=title&body=test")|
|設定-Wifi|WIFI:T:[WPAもしくはWEP]:S:[ネットワーク名(SSID)]:P:[パスワード];;|![wifi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/74319512-c513-6479-b3c6-e03c925d7101.png "WIFI:T:WPA;S:testSSID;P:password;;")|
|Google Maps|comgooglemaps://?center=[緯度],[経度]|![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/f91700fa-34d6-ec41-686c-ddf77a6aa800.png "comgooglemaps://?center=35.681,139.767")|

#最後に

色々探したのですが、WiFi接続設定より便利なものは見つかりませんでした。（思いつきませんでした）便利なURLスキームが見つかりしだい追加していきます。
量子力学　自由粒子の確率密度分布の時間発展をプロットしてみた

# はじめに
量子力学を考える上で、粒子の波動関数を考えることは非常に重要なテーマです。ここではプロパゲータを用いた波動関数の表現から波動関数を考えていきます。
今回は波動関数が
・ガウス分布（正規分布）の初期状態（一次元調和振動子の基底状態など）
・ハミルトニアンがある時刻$ t_0 $で自由粒子になった場合
の確率密度分布の時間発展をプロットしてみます。（一次元）

## 具体的な条件式

初期状態
$$ \Psi(t_0,x)= \left( \frac{1}{\sqrt{\pi} \Delta} \right)^\frac{1}{2} \exp \left[-\frac{x^2}{2\Delta^2} \right] $$
$$ (分散:\Delta^2) $$
ハミルトニアン
$$ \hat{H} = \frac{\hat{P}^2}{2m} $$
積分核
$$ \left(\frac{m}{2\pi i\hbar T}\right)^\frac{1}{2} \exp \left[\frac{im(\Delta x)^2}{2\hbar T} \right] $$
$$ (T=t-t_0,\Delta x = x-x_0) $$

確率密度分布
$$ \frac{m\Delta}{\sqrt{\pi}\left(m\Delta^2 + i\hbar T\right)} \exp\left[ -\frac{m\Delta^2x^2}{(m\Delta^2)^2+(\hbar T)^2} \right] $$
## コーディング
定数は形に依存しないので
$$ \hbar = \Delta =\pi = m =1 $$
と考えてコードを書く

```c
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

def _updateAnimation(frame):
    plt.cla()
    plt.ylim(-0.1,1.01)
    t = frame
    x = np.arange(-1*10,10,0.1)
    y = function(x,t)
    xline  = [0 for i in x]
    plt.plot(x,y)
    plt.plot(x,xline,color="black")
    t = round(t, 2)

def function(x,t):
    a = 1/(1+t**2)
    b = np.power(a,1/2)
    f = b*np.exp(-a*np.power(x,2))
    return f

def main():
    fig = plt.figure()
    params = {
        'fig':fig,
        'func':_updateAnimation,#グラフ更新する関数
        'interval': 100,#更新間隔
        'frames': np.arange(0,6, 0.05),#フレーム番号を生成するイテレータ
        'repeat': True,#繰り返しの有無
    }
    anime = animation.FuncAnimation(**params)
    anime.save("plot.gif", writer = 'imagemagick')
    plt.show()

if __name__ == '__main__':
    main()
```

## 出力結果

![plot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016200/7eaba64c-5792-8c42-844b-3090047043cd.gif)

## 考察
当然ながら時間経過とともに確率密度分布の裾ひろがって行きます。
このようにディラックのブラケットを用いた議論で考えた量子力学が系の状態変化をよく記述できていることが確認できました。

[追記]
波動関数の時間発展を見ても波動関数は単なる情報でしかないので実際に物理と照らし合わせるのであれば確率密度$ \left| \Psi(t,x) \right|^2 $ をプロットした方が評価として妥当でした．
[Nuxt]slotの中でcomponentを呼び出す[vuetify]

### 結論:divで囲む
一応Vuetifyを使っていますが別に普通のslotでもいいと思います。

```vuejs:sample.vue
<template>

      //コンポーネントは表示されない
      <v-radio value="ce" class="mb-2">
        <template v-slot:label>
          <MyComponent /> //←コンポーネントを使いたい
        </template>
      </v-radio>

      //コンポーネントが表示された
      <v-radio value="ce" class="mb-2">
        <template v-slot:label>
          <div><MyComponent /></div>  //←<div>などで囲む
        </template>
      </v-radio>

```
APIテストツール" Talend API Tester"が良かった

協力会社さんのバックエンドエンジニアの方がこちらのツールを使っており、調べてみたところ予想外に便利だったので記事を書きます。

Chromeの拡張機能[Talend API Tester](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm)は、HTTPやREST APIの動作確認が簡単に行えます。

他のAPIテストツールとして、(自分が知る限りでは) Postmanなどが有名かと思うのですが、
①環境変数をglobalに設定でき、変更が容易。ログイン毎に値が変わるような変数も手間なく取り扱える。
②一人の環境で作ったエンドポイントやクエリパラメータ等の情報を、JSON化して簡単に他のメンバーの環境へインポート可能(しかも、swaggerやPostmanでの環境も簡単に再現可能！)

という点で、より便利なクライアントツールかと思っております。

これから当ツールの扱い方を解説するのですが、その中で上記①②の再現方法も言及します。


# 基本的な使い方

##### (1) 環境変数を設定する

画面右上のここで、BASE_URLやaccess-tokenといった環境変数を、キーバリュー形式で保存可能です。
ローカル/ステージング/本番環境でホスト名が違ったりするときには、ここでBASE_URLのvalueの値を書き換えれば都度切り替えられます。
他にも、ログインする度に値が変わる要素(access-tokenや、user_idなど)についても、ここで値を書き換えることで完結できます。
ここで設定した変数は、(2)の箇所で${BASE_URI}といった形式で呼び出せます。

(※)ここの記事では"QiitaEnv"という名前で環境を作っておりますが、もちろん環境は複数個作れます


![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_246556_393ba72c-631f-96dd-cc48-7f1df2c0db5b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/c26fd3e7-e9a3-2fb3-baf9-809a1cc1f38a.png)


##### (2) リクエストを作成する
下記の画像を見ていただければ、おおよその概要は把握いただけるかと思います。
　(一) METHODをGET/POST/PUT/DELETEから選択
　(二) SCHEME(URL)を書く
　(三) (必要があれば)QUERY PARMETERを設定
　(四) (必要があれば)HEADER情報を記載(※)(1)で設定した環境変数を呼び出し

こちらで送信して問題がなければ、"Save"ボタンを押して保存することで、次回以降も同じリクエストをそのまま飛ばせます。


![スクリーンショット 2021-05-03 22.24.30 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/f5db15bf-d8ac-eec2-0090-33ca5ac8ab0f.png)


# 環境のIMPORT/EXPORT

自分のローカルで作った環境を、JSON形式にして容易に他の人のローカルでも再現可能です。



(一) 画面右下の"Export"ボタンを選択
![スクリーンショット 2021-05-03 22.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/c7bd9029-571a-7a45-d114-d8ff9b8f38fb.png)


(二)
自分のローカル環境を、プロジェクト単位(ここではsample1, sample2)で選択しJSON化してダウンロードできます。
![スクリーンショット 2021-05-03 22.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/f8bbd868-3f3d-1168-5915-baf67e3f3eb7.png)


(三)
他のメンバーのローカルで"IMPORT"ボタンを選択　→ "Import API Tester repository"を選択し、(二)で作成されたJSONをIMPORTすることで、一瞬で環境を再現できます。
(自分は使ったことがありませんが、ここでswaggerやPOSTMANのデータをインポートする事も出来るようです)


![スクリーンショット 2021-05-03 22.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/af57acdf-b74f-70c1-feab-4f0bdd3f5574.png)

# まとめ
今まで、APIのテストをするときは逐一webアプリからAPIを呼び出したり、ターミナルでベタ打ちでテストしていたのですが、このツールを知ったから効率が飛躍的に向上しました。
エンジニアとして実務経験1年半ほどになりますが、まだまだ自分の知らない事だらけです…
自分が今、普段の業務の中で膨大な時間をかけている作業の中にも、圧倒的に時間を削減できるものがまだまだあるんだろうなあと思います。もっと勉強せねば…
Mac で iTerm2 から Linux に接続して locale のエラーに遭遇したときの対処法

## エラー
```
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```

## 解決策
自分の場合，iTerm2 の locale variable の自動設定機能が悪さをしていた．
iTerm2 の Preferences から，Profile タブ Terminal の項目にある "Set locale variables automatically" を無効化する．
Action_textのテキスト内で画像保存する方法

初めての投稿です。

railsのAction_textを使ってAWSのS3に画像を保存する方法を探していて、自分で忘れないようにここに残します。

### 環境
rails 6.0.0

開発しているアプリは単なるメモアプリですが、以下のように編集されたメモがJavaScriptで自動保存されるようにしています。

[![Image from Gyazo](https://i.gyazo.com/4777d6aa45d1743f9be0455aeeb9d96e.gif)](https://gyazo.com/4777d6aa45d1743f9be0455aeeb9d96e)

## 実装方法

まず、AWSでバケットを作成していることを前提としています。

保存したいバケットを選択→アクセス許可と進んでいくと下の方にCross-Origin Resource Sharing (CORS)というところがあります。

編集するをクリックして以下を記述します。

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
```



...終わりです。笑

その後、localで確認します。
[【更新：解決😆】【Rails】ActionTextでアップロードした画像の保存先がローカルから変更できない😥](https://qiita.com/whitia/items/56dfe162793cd38b341e)

この方の追記を参考に画像をドラッグ&ドロップした後にAction_textの通常の画像添付機能を使ったら、その後はどちらの方法でも保存できるようになりました。

謎です...

ですが、僕はできましたので是非やってみてください。笑
Phalconをdocker imageに詰め込みたいとき

# 前提

* DockerHubにあるfpmイメージをベースとして考えています。(debianベース)
* Phalcon4です。psrを入れる辺りを消せば3系でも使えたと思います。

# とりあえず先に結論

素直にソースからビルドしましょう。(正しくはPhalconをCの形式にビルドされた後のソース)

以下は私が作っている[docker image](https://github.com/fagai/docker-php)からphalconの本質的なインストール部分だけ持ってきたものです。

```dockerfile
# install phalcon
RUN pecl install -s psr \
 && docker-php-ext-enable psr \
 && pecl clear-cache \
 && curl -LO https://github.com/phalcon/cphalcon/archive/v${PHALCON_VERSION}.tar.gz \
 && tar xzf v${PHALCON_VERSION}.tar.gz \
 && docker-php-ext-install -j$(nproc) ${PWD}/cphalcon-${PHALCON_VERSION}/build/php7/64bits \
 && rm -rf v${PHALCON_VERSION}.tar.gz cphalcon-${PHALCON_VERSION}
```

色々試していたのですが、これが確実です。。。

少し前だともっとめんどくさくて、zephirのパーサーから入れないと駄目な感じでしたので、良くなったほうです。

<details><summary>もっとめんどくさかった頃(クリックで開く)</summary><div>
当時書いてたやつなので、ちょいちょい最適化されてないところもありますが。。。

```dockerfile
# install php-psr
RUN pecl install psr && docker-php-ext-enable psr

# install zephir-parser
RUN curl -LO https://github.com/phalcon/php-zephir-parser/archive/v${ZEPHIR_PARSER_VERSION}.tar.gz \
    && tar xzf v${ZEPHIR_PARSER_VERSION}.tar.gz \
    && docker-php-ext-install ${PWD}/php-zephir-parser-${ZEPHIR_PARSER_VERSION} \
    && rm -rf php-zephir-parser-${ZEPHIR_PARSER_VERSION} v${ZEPHIR_PARSER_VERSION}.tar.gz

# install phalcon
RUN curl -LO https://github.com/phalcon/cphalcon/archive/v${PHALCON_VERSION}.tar.gz \
    && tar xzf v${PHALCON_VERSION}.tar.gz \
    && cd cphalcon-${PHALCON_VERSION} \
    && curl -LO https://github.com/phalcon/zephir/releases/download/${ZEPHIR_VERSION}/zephir.phar \
    && php zephir.phar fullclean && php zephir.phar compile \
    && docker-php-ext-install ${PWD}/ext \
    && cd .. \
    && rm -rf v${PHALCON_VERSION}.tar.gz cphalcon-${PHALCON_VERSION}
```
</div></details>


# 色々試した

いまはpearのライブラリも結構更新されるようになって、phalconのreleaseにもpearパッケージのソースがつくようになったりしてます。

そこで、peclで入れれないのかと試したのですが、途中でコンパイルが止まって最終的にコンパイル失敗になってしまうようでした。ディストリビューションによってはうまく動くのかも知れません。。。(私がやろうとしたのはdebianのbuster)

他にPackageCloudというサービスにもphalconのリポジトリはあります。
https://packagecloud.io/phalcon

こちらで試しに入れようとしましたが、うまく入ったかな？とおもって`apt-cache`コマンドでインストール出来るパッケージを探してみましたが無いことになってしまったので断念。

`ppa:ondrej/php`とかも試してみようかとしましたが、そもそもppaがUbuntu用だったし、GPGのエラーが出たりといろいろ苦戦してしまい、結局入れれそうにありませんでした。。。

# 自分で用意するのが面倒な人に

自分の方で作っているイメージがあります。それを元にしてもいいと思います。
phalconはセマンティックバージョニングなのでメジャーバージョンとしてしかバージョンを付けてないですが。。。

https://github.com/fagai/docker-php


# 最後に

結果的に、ソースからビルドして入れるのが最適だという結論になったのですが、もしもっと簡単に入れれる方法があったら教えてほしいです。。。
AWS Iot EduKit Lチカの処理

[AWS Iot EduKit の Lチカ](https://edukit.workshop.aws/jp/blinky-hello-world.html)を手順通りにやってみて確かに、

- MQTT Test Client で、デバイスから送信されるメッセージを表示
- デバイスがサブスクライブしているトピックを、コンソールの AWS IoT MQTT クライアントからパブリッシュすることで、LED バーの点滅を開始または停止

することができました。まとめに、[デバイスで何がおきていたか](https://edukit.workshop.aws/jp/blinky-hello-world/conclusion.html#デバイスで何がおきていたか)は説明がされていますが、いまいち煙に巻かれたような感じがしました。

AWS Iot EduKit は、「[セキュアエレメント使うといいよー」というのを感じてもらうためのキットで、Blinky-Hello-Worldさえ動けば、EduKitの意義は達成](https://qiita.com/ma2shita/items/dda457d178486ac0b94f) 」という方もいらっしゃいますが、Arduino IDEを使わずに、esp-idf のプラットフォームでFreeRTOSを使っているのもポイントのはず。

ということで、[ソースコード](https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/tree/master/Blinky-Hello-World) を読み解いて、Lチカのプログラムの処理をシーケンス図に書いてみました。処理の全てを記載しているのではなく、デバイスの動きと、シリアルコンソールのメッセージを見ながらであれば、わかる程度の粒度としています。

# 前提

- [AWS Iot EduKit](https://edukit.workshop.aws/jp/) の 「[2. Lチカ](https://edukit.workshop.aws/jp/blinky-hello-world.html)」 までを、やってみたことがあること

# シーケンス図
まずは、いきなりシーケンス図から。

![Cloud Connected Blinky.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226137/c4960b11-296e-bf99-ece3-9977efc612bd.png)

もし、間違いありましたら直します。

# 登場人物
シーケンス図に出てくる登場人物は、

  <dl>
  <dt>Wifi AP</dt><dd>WiFiアクセスポイント</dd>
  <dt>ATECC608</dt><dd>クライアント証明書入りセキュアエレメント</dd>
  <dt>AWS IoT</dt><dd>AWS IoT Core</dd>
  <dt>MQTT Task</dt><dd>MQTT タスク</dd>
  <dt>Blink Task</dt><dd>LED点滅タスク</dd>
  <dt>Display Task</dt><dd>画面表示タスク</dd>
  <dt>main</dt><dd>メインタスク</dd>
  </dl>

です。

# タスクの動き
メインタスクで、Wifi接続を行ない、画面表示タスク、MQTTタスク、LED点滅タスクを順に起床します。実際は、タッチパネル処理のタスクも起床されますが、省略しています。

MQTT タスクで、

- セキュアエレメントからクライアント証明書を取り出し
- AWS IoT Coreに接続
- トピック << CLIENT_ID >>/# をサブスクライブ
- トピック << CLIENT_ID >>/blink を受け取るごとに、LED点滅タスクを resume / suspend 
- 3秒ごとに、トピック(「Hello from AWS IoT EduKit なんちゃら」)を2回パブリッシュ

LED 点滅タスクで、

- タスクの先頭で suspend
- あとは、左右のLEDを交互に点灯

という具合です。

#まとめ

なので、最初はLEDが消えています。その後、MQTTトピックを受け取ると、LED点滅タスクが resume するのでLチカします。もういちどMQTTトピックを受け取ると、LED点滅タスクが適当なタイミングで suspend するので、消灯するのではなく左右のLEDのいずれかが点灯することとなります。
Pythonで株価の東証の銘柄コード一覧を取得して、東証1部、2部、TOPIXに整理


# 東証の銘柄コードの取得と市場ごとの整理

[JPX](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)に一覧のexcelがあるため、これをダウンロード

pandasで読み出して市場や指標ごとに取り出します.

## 株関連の前提

大丈夫かと思いますが、大事なポイントを書き下しておきます.

- 4桁の銘柄コードになります. 何番代かで業界が異なります.
- このExcelに東証1部、2部、TOPIXで選ばれるもの、当たり前ですが日経平均225のものも全て含まれます. (しかし日経平均225に含まれるものは別途取得必要)
- TOPIX100はCore 30とLarge 70、TOPIX500はそれにMid 400、TOPIX 1000はそれにSmall 1、TOPIXはSmall 2を加えたものとなります

# 環境
Google Colaboratoryにて確認.

# コード

```python
import pandas as pd

##東証から上場企業の一覧を取得
!wget 'https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls'

codelist = pd.read_excel("./data_j.xls")

## 各市場を整理
firstSectionCodeList = codelist.loc[codelist["市場・商品区分"] == "市場第一部（内国株）"]
secondSectionCodeList = codelist.loc[codelist["市場・商品区分"] == "市場第二部（内国株）"]
mothersCodeList = codelist.loc[codelist["市場・商品区分"] == "マザーズ（内国株）"]
jasdaqStandardCodeList = codelist.loc[codelist["市場・商品区分"] == "JASDAQ(スタンダード・内国株）"]
jasdaqGrowthCodeList = codelist.loc[codelist["市場・商品区分"] == "JASDAQ(グロース・内国株）"]

## TOPIXを整理
topix100CodeList = codelist.loc[codelist["規模区分"].isin([ "TOPIX Core30" ,  "TOPIX Large70" ])]
topix500CodeList = codelist.loc[codelist["規模区分"].isin([ "TOPIX Core30" ,  "TOPIX Large70"  ,  "TOPIX Mid400" ])]
topix1000CodeList = codelist.loc[codelist["規模区分"].isin([ "TOPIX Core30" ,  "TOPIX Large70"  ,  "TOPIX Mid400", "TOPIX Small 1"])]
topixCodeList = codelist.loc[codelist["規模区分"].isin([ "TOPIX Core30" ,  "TOPIX Large70"  ,  "TOPIX Mid400", "TOPIX Small 1", "TOPIX Small 2"])]

```

実際に値を確認すると以下のようになる

```python

firstSectionCodeList[["コード", "銘柄名"]]

```

![fs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849090/4ad2e5b0-04f8-7ec7-f791-8913f4716828.png)
【Swift】UIWindowのmakeKeyAndVisibleとisHiddenの違いについて


#makeKeyAndVisibleとは

```swift
func makeKeyAndVisible()
```

>This is a convenience method to show the current window and position it in front of all other windows at the same level or lower. If you only want to show the window, change its isHidden property to false.

現在のウィンドウを表示させ、同じレベルかそれ以下の他のすべてのウィンドウの前に位置させるメソッド。ウィンドウを表示するだけの場合は、isHiddenプロパティをfalseに変更するとされています。この場合はwindowとして表示させるのみで、位置に関しては関係しません。

#isHiddenとは
```swift
var isHidden: Bool { get set }
```

このプロパティの値をtrueに設定すると、レシーバーが非表示になり、falseに設定すると、レシーバーが表示されます。既定値は false です。ウィンドウの対応するビューを非表示にすると、そのビューの次の有効なキービューが新しい最初のレシーバーになります。

これらを確かめてみたのが次です。画面が表示された後に、Dispatch.main.asyncメソッドで3秒後に戻しています。KeyWindowに表示されているのは、ボタンを押した直後の画面です。

https://twitter.com/i/status/1389188002635681792



#keyWindowとは

```swift
var keyWindow: UIWindow? { get }
```

>This property holds the UIWindow object in the windows array that is most recently sent the makeKeyAndVisible() message.

このプロパティは、windows配列の中で、直近に`makeKeyAndVisible()`メッセージが送られたUIWindowオブジェクトを保持します。
gimpがwslで動いた

#内容
　怪我の功名でwslでxwindowが動いてた
#内容
* windows updateがあった
* 調べたら勝手にinside preivewの21370がupdateされていた
* inside preivewはもう、やめにつもりだったのになあ・・とがっがり
* でもまてよ、新しい [WSLg](https://kledgeb.blogspot.com/2021/04/wsl-222-linux-guiwslg.html)ってやつを試してみるか
* ではbashとして、wslに移行して・・
* gimpとコマンドを打つと・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/45811746-4520-b0e2-83da-b3f8f925718b.png)

* 起動しちゃいましたね・・すっげーー！
* ますます、windowsなんだか linuxなんだかわからん状態になっている・・
* このまま、どんどん、２つを融合するんすかねえ？
Phalconの本家ソースはどこにあるのか

こんばんは。
[Phalcon PHP Framework](https://phalcon.io/)という元はPHPの拡張で書かれたフレームワークがあります。
このフレームワークはZephirと呼ばれるPHPライクな感じで書く言語で書かれています。

## なぜこの記事を書いたのか

残念なことに、phalconのドキュメントは更新が遅いので新しく入った機能を使いたくなった場合、ドキュメントだけでは分からないので結局PRなどからzepのソースを読むことになるのです。

また、少し関係ないですが公式のドキュメントも日本語化されている方はページによってはmarkdownが崩れていたりと辛かったりします。(結局英語ドキュメントを見たほうが良いことに)

なお、Phalconは予定では6からPHPソース版がリリースされるので、今後は読むのは楽になると思います。

## ソースはどこにあるのか

ソースは以下にあります。

https://github.com/phalcon/cphalcon

2021/05/03現在、このリポジトリのphalconディレクトリにコアコードが置かれています。


## 読み方

まあ実際にzepという拡張子(Zephir言語で書かれたもの)は結構PHPライクなもので書かれているのでそこまで困らないと思います。(内部ソースを見るに、phpの関数も呼べるようです。)

ちょっとメソッドを少し見てみましょう。Logger.zepのlog関数です。

```php
/**
 * Logs with an arbitrary level.
 *
 * @param mixed  level
 * @param string message
 */
public function log(level, message, array context = []) -> void
{
    var intLevel;

    let intLevel = this->getLevelNumber(level);

   this->addMessage(intLevel, (string) message, context);
}
```

phpdocみたいなのも書かれていますし、まさにPHPみたいな感じです。
ただし気になるところとして、`var`と`let`があります。

`var`は動的変数の定義です。Zephirでは変数定義が必要です。
そして、`let`は変数の初期化に使われます。

一応、一緒に初期化することも出来ますが(`var a = "aaa"`)、phalconのソースではあまり見受けられません。

Zephirのドキュメントは以下にあります。

https://docs.zephir-lang.com

## ちょっと面倒なこと

これはphalconのソースなのですがphalconに問題があったときに、phalconに問題があるのか、zephirに問題があるのかを追っかけないと分からないです。(つらい)

PHPの拡張であるものの、PHPとは若干異なる次元で動いてるためReflectionなどに影響があるときがあります。

## 普段の開発では

普段の開発だと、毎回毎回ドキュメントを追っかけることは流石にきついので、phalconには`ide-stubs`と呼ばれるIDE用のスタブがライブラリとして存在します。(LaravelのIDE helper的なやつです)

https://github.com/phalcon/ide-stubs

このide-stubsは、zephirのソースにある
[https://github.com/zephir-lang/zephir/blob/development/Library/Stubs/Generator.php](https://github.com/zephir-lang/zephir/blob/development/Library/Stubs/Generator.php)
が生成を行います。

現状では自動で生成してpushされるような状態になっていないので、最新のものが出たとしても待つ必要があります。
また、zephir側の静的解析が雑な関係で部分的に返却する型や引数の情報がコアソースと異なる場合があるので注意しましょう。(早く色々解決してほしい)

しかしながら無いよりはすごく助かるスタブなので、もしphalcon使っていて入れてない人は入れたほうが良いでしょう。
はちみーのうたオートマトン書いてみた

こんにちは！バイオインフォマティクス系オタク会社員のroadricefieldです！今日はGW暇なので以下の𝐴𝑣𝑒𝑛𝑡𝑎𝑑𝑜𝑟さんのTweetのトーカイテイオーの「はちみーのうた」オートマトンをPythonで書いてみました．  

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">はちみーのうた <a href="https://t.co/aBgprfFVFQ">pic.twitter.com/aBgprfFVFQ</a></p>&mdash; 𝐴𝑣𝑒𝑛𝑡𝑎𝑑𝑜𝑟 (@aventador_770_4) <a href="https://twitter.com/aventador_770_4/status/1389067192176680961?ref_src=twsrc%5Etfw">May 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```python
import sys

class AutoUmaton:
    kashi = ["はちみー", "をなめるとー", "あしがー", "はやくーなる"]
    state = 0
    def transition(self, ip):
        print(self.kashi[self.state])
        if self.state == 0:
            if(ip):
                self.state = 1
            else:
                pass
        elif self.state == 1:
            if(ip):
                self.state = 0
            else:
                self.state = 2
        elif self.state == 2:
            if(ip):
                self.state = 3
            else:
                pass
        elif self.state == 3:
            if(not ip):
                self.state = 0
            else:
                pass

def main():
    try:
        S = list(map(int,list(input())))
    except:
        print("トレーナー！入力がちがうよ！！", file=sys.stderr)
    Teiou = AutoUmaton()
    for i in S: Teiou.transition(i)

main()
```  

入力例  

```
000100011
```  

出力例  

```  
はちみー
はちみー
はちみー
はちみー
をなめるとー
あしがー
あしがー
あしがー
はやくーなる  
```  

クラスを作るいい練習になったと思います．  

おしまい
Effective Java(第3版) 項目6 不必要なオブジェクトの生成を避ける

可能であれば、新しいオブジェクトを生成せずに、再利用したほうが良い、という内容です。

# 記載内容
## 不変なオブジェクトの再利用
オブジェクトが不変であれば、常に再利用できる。

極端な例として、以下の様なインスタンス生成は意味がない。

```java
String s = new String("foobar");
```

## ファクトリメソッド
コンストラクタを使用すると、(言語仕様のために)新しいオブジェクト生成が必須になるが、
ファクトリメソッドはオブジェクト生成を避けられる可能性がある。
例として、基本データ型のラッパークラスは、常にファクトリメソッドを使用することで、
不要なインスタンス生成を避けられる可能性がある。

## インスタンス生成が高負荷なオブジェクト
正規表現のコンパイル結果であるPatternインスタンス等、生成が高価なインスタンスを繰り返し生成するのを避ける必要がある。
そのため、繰り返し使用する正規表現に対して、String.matchesを使用するべきではない。

## アダプター
アダプターは、あるオブジェクトが保持しているデータへアクセスするための、代替のインタフェースを提供するパターン。
あるオブジェクトに対するアダプターは、1つのインスタンスを再利用できる。
例として、MapインタフェースのkeySetメソッドは、Setを返してはいるが、毎回同じインスタンスを返しても問題ない。
それらのSetは同じMapに紐づいており、Mapの更新がすべてのSetに反映される。
このSetのインスタンスが複数あっても無意味なので、1つのインスタンスを再利用したほうが良い。

## ボクシング
自動ボクシングは、基本データ型とラッパークラスを区別せずにプログラミングできるように見せかけているが、
見せかけであり、ラッパークラスのインスタンス生成により、パフォーマンスに影響する場合がある。
そのため、意図しない自動ボクシングに注意する必要が有る。

## 防御的コピー
防御的コピーが必要なケースでは、既存のオブジェクトを再利用してはならない。
防御コピーが必要なケースで、オブジェクトを再利用したい場合のペナルティは、
不必要なインスタンス生成によるペナルティよりもはるかに重大な影響を及ぼすことがある。

# 考察
不必要なオブジェクト生成を避けるのは当然なのですが、
実際には考えるべき内容が多い項目と思います。

## コンストラクタとファクトリメソッド
自分でクラスを作る場合、何も考えなければコンストラクタを提供しますが、
不変クラスを作る場合、ファクトリメソッドの提供を考えるべきと思います。
実装当初は単に内部でコンストラクタを呼んでreturnするだけかも知れませんが、
将来的にキャッシュ等でインスタンス生成を削減できる可能性があるためです。

ただ、どのクラスでもファクトリメソッドを提供するとなると、実装の手間が増えますし、
使用する側もインスタンス生成方法が分かりづらいというデメリットがあります。
そのトレードオフを考え、ファクトリメソッドを提供するべきかを考える必要が有りそうです。

ただ、一度コンストラクタを提供してしまうと、既存コードを修正しないと、
ファクトリメソッドの使用を強制できないのが難点です。

## ライブラリ内でのインスタンス生成が高負荷なオブジェクトの生成
インスタンス生成が高負荷なオブジェクトの生成は避けたいのですが、
知らずにライブラリ内で高負荷なインスタンス生成を行ってしまう可能性があります。
標準ライブラリであれば、JavaDocの記載を確認することで避けることが出来ますが、
JavaDocが不十分なライブラリ(もしくは他のプログラマが作成したクラス)を使用している場合、
避けるのが難しいケースが有りそうです。

また、逆のパターンとして、同じ区切り文字(1文字)で、String.splitを繰り返し使用する場合、
Patternインスタンスを生成、再利用すると、逆に遅くなります。
これは、String.split内で、1文字の区切り文字に対する最適化が行われており、
Patternを使用せずに実装されているためです。
(JavaDocに記載は無いですが、適切な最適化だと思います)

そのレベルで自分が使用するクラスを認識するのは、コストもかかりますので、
全てのクラスを知り尽くす、というわけにもいきません。
十分なJavaDocが記載されていれば良いですが、全てのクラス(そして全てのプログラマ)に
それを求めるのも難しいというのが実情と思います。

最終的には、性能測定で問題がある場合、プロファイリング等で不要なインスタンス生成を確認し、
修正を行っていく、という対症療法的な手法になってしまいそうです。
aws認証情報が正常に読み込まれずThe security token included in the request is invalidになる


いろいろ調べたものの、自分のケースはなかったので書きます。

## 原因
いろいろ調べた結果、自分のケースはOSの環境変数自体の値が優先して読み込まれていて、`~/.aws/credential`の情報を参照してくれていないことが原因でした。

`aws configure list`で確認すると、 `~/.aws/credential`に記載された情報が読み込まれていません。

過去に環境変数を設定したものがありまして、そちらが読み込まれてます。
（typeがenvとなっています）

```
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************hoge              env
secret_key     ****************hoge              env
    region                <not set>             None    None
```

## 解決法

```
export AWS_ACCESS_KEY_ID=
```
AWS_ACCESS_KEY_IDに空文字を設定しました。

```
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************piyo shared-credentials-file
secret_key     ****************piyo shared-credentials-file
    region                <not set>             None    None
```

これで大丈夫になりました。

## その他

環境変数をunsetしてみたのですが、`aws configure list`は変わりませんでした。

```
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
```
PHPは日本語のクラス名でもautoloadできる

テーブル名もカラム名も日本語のデータベースにORMを使おうとすると、エンティティクラス名が日本語になってしまったので、そもそも日本語のクラスってautoloadできるのか？というのを実験してみました。

## 環境
> ubuntu 20.04
> php 8.0

## 成果物
リポジトリは[こちら](https://github.com/isanasan/TestJapaneseClassName)

## ディレクトリ構造
````bash
.
├── composer.json
├── composer.lock
├── src
│   ├── Foo
│   │   └── Baa
│   │       └── 日本人.php
│   ├── bootstrap.php
│   └── test.php
└── vendor
````
## 日本語のクラスを用意
````php:日本人.php
<?php

namespace Isanasan\Test;

class 日本人
{
    public function あいさつ()
    {
        echo 'こんにちは' . PHP_EOL;
    }
}
````

## autoloadの設定
````json:composer.json
{
    "require": {
        "php": "^8.0"
    },
    "autoload":{
        "psr-4": {
            "Isanasan\\Test\\":"src/Foo/Baa"
        }
    }
}
````

## 呼び出し側
````php:test.json
<?php

namespace Isanasan\Test;

require_once __DIR__ . "/bootstrap.php";

$japanese = new 日本人();

$japanese->あいさつ();
````

## 実行結果
````bash
% php ./src/test.php
こんにちは
````

## まとめ
無事、日本語のクラスのautoloadとついでに日本語メソッドの実行の確認ができました。
「テスト駆動開発」をPHPで写経してみた

## モチベーション
エンジニアをやっていると何を学んで何を学ばないのか、どういう順で学んでいくのか、という悩みはあるあるだと思います。
筆者はたまたま、[これ](https://ajito.fm/13/)を読んだのと合わせて、[これ](https://ajito.fm/13/)を聞いた時に今の自分に丁度良さそうだと感じたので早速やってみました。
使用言語には迷ったのですが、現職のメイン言語であるPHPを使いました。
## 成果物
https://github.com/isanasan/php-tddbook
4月1日に写経を開始してだいたい毎日約一時間ずつ作業を進めて完走できたのが4月30日なので、正味作業時間は30時間程度だと思います。
## ハマったところ
### オブジェクトの型キャスト
第三章のvalueObjectパターンを適用するところで、引数をObject型で受け取ってキャストするのをphpでどうやるのか悩みました。いろいろ調べてこちらの記事を読み
https://budougumi0617.github.io/2020/01/29/php-cast-original-class/
「キャストのためにわざわざメソッド生やさなきゃダメなの？」となりましたが、筆者はキャストを行わず任意の型を引数で指定する実装にしました。
### hashMapを使う
第十四章の為替レートを保持する仕組みをhashMapで実装しているところで、phpでどのように実装するか悩みました。ここではphpの配列を使って単純に実装しました。phpの配列はなんでも入れられるし、便利な組み込み関数がたくさんあるのでこういう時にやくにたちます。
### testMethodの動的な呼び出し
第十八章の、テストケース名を問い合わせて戻ってきたオブジェクトを関数として実行する処理をphpでどうやるのか分からず悩みました。この部分はググり方から検討がつかなかったので、同じようにTDD本をphpで写経している人のリポジトリを探して参考にしました。
https://github.com/shin1x1/book-tdd-php
[PHPの現場](https://php-genba.shin1x1.com/)でおなじみの新原さんのリポジトリを見付けてありがたく参考にさせていただきました。ここは結局call_user_func()で一発でした。
### assert()が例外を投げてくれない
同じく十八章のassert()を使ってテストの失敗を検知する実装でassert()が例外を吐いてくれませんでした。ここはドキュメントを読んで、php.iniに
> zend.assertions = 1

を設定して解決しました。
## まとめ
普段なにげなくコードを書いていて、自分のパフォーマンスが良いときもあれば悪いときもあるという感じなのですが、TDDという具体的な手法に則ってプログラミングすることで一皮剥けそうだなという気がしています。とはいえ日頃から実践して身につけてはじめて役に立つものだとも思うので、当面は意識的にTDDを実践してみようと思います。
【Linux】関数の戻り値を変数に格納する【Bash】

#初めに
インタラクティブな関数の戻り値を変数に格納する情報が少なかったので、備忘録的に。

#Bashの関数の戻り値について
Bashの関数の戻り値は終了ステータスを返却します。
正常終了だったら「0」を返却するのが一般的です。

#文字列を返却
関数の戻り値に文字列を扱いたい場合は標準出力を利用するのが~~一般的です。~~でもないようです。
※コメントで説明してくださっていますので必読。

```php:test.sh
#!/bin/bash
function test () {
        echo "hello world"
}
result=$(test)
echo "${result}"
```
実行結果

```
$ bash ./test.sh
hello world
```

#インタラクティブな関数の場合
ここからが本題。

キーボードからの入力値を扱う関数の場合は、echoコマンドを利用して入力案内等を出す場合が多いと思います。

```php:test2.sh
#!/bin/bash
function test () {
        echo -n "please enter a number: "
        read result
}
test
echo "your number is ${result}"
```
実行結果

```
$ bash ./test2.sh
please enter a number: 111
your number is 111
```
##問題点
上記の方法には問題点があります。

キーボードからの入力値を「result」というグローバル変数に格納している部分。
関数「test」の実行結果をechoコマンドで表示していますが、
関数内の変数「result」を関数外でも扱うのは関数化の意味がないとも言えます。

ではキーボードでの入力値を標準出力で返却し、変数に格納する形にしてみます。

```php:test3.sh
#!/bin/bash
function test () {
        echo -n "please enter a number: "
        read input
        echo "${input}"
}
result=$(test)
echo "your number is ${result}"
```
実行結果

```
$ bash ./test3.sh
111
your number is please enter a number: 111
```
Bashを実行しても何も表示されないので、とりあえず数字を入力してみるとこのように表示されました。
関数の結果を変数に格納する場合、全ての標準出力が変数に格納されるので入力案内も変数に格納されてしまいます。
他の言語を経験してからBashを使うようになるともどかしい部分ですね。

##標準エラーを利用する
解決方法は単純で、関数内で表示したい標準出力を全て標準エラーにしてしまえば、
変数には格納されず表示されます。

```php:test4.sh
#!/bin/bash
function test () {
        echo -n "please enter a number: " 1>&2
        read input
        echo "${input}"
}
result=$(test)
echo "your number is ${result}"
```
実行結果

```
$ bash ./test4.sh
please enter a number: 111
your number is 111
```

##別の方法
標準出力全てをエラーにしていくのが煩わしいという方は、関数化してもいいかもしれません。
関数「to_error」は第1引数を標準エラーで出力してくれます。

```php:test5.sh
#!/bin/bash
function to_error () {
        echo -n "${1}" 1>&2
}
function test () {
        to_error "please enter a number: "
        read input
        echo "${input}"
}
result=$(test)
echo "your number is ${result}"
```
実行結果

```
$ bash ./test5.sh
please enter a number: 111
your number is 111
```
あまり煩わしさは変わっていませんね。

#まとめ
インタラクティブな関数の戻り値を変数に格納する方法をまとめてみました。
すごく一般的な関数の使い方な気がしますが、調べてみると全然情報がないのが不思議でした。
それとも聞くまでもないようなことなのでしょうか。。。
個人的にはこのやり方は力技過ぎてあまり好きではありませんが、しょうがないみたいです。
【初心者でもわかる】CSSで鏡文字にする方法

#どうも7noteです。鏡文字の作り方を解説

CSSで鏡文字を作る方法を解説します。
文字を反転させれば鏡文字になるので、**反転させるためにtransformを使います。**

transformの中でも2つの方法で反転を再現することができます。


## 鏡文字の作り方

###・`scaleX()`を使った方法

```style.css
span.mirror {
  transform: scaleX(-1);
  display: inline-block;
}
```

![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/2157982a-53af-0290-8583-572e0e06ff89.png)

###・`rotateY()`を使った方法

```style.css
span.mirror {
  transform: rotateY(180deg);
  display: inline-block;
}
```

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/bf9640ba-deac-b4f5-364b-d1a06c3fc061.png)



## 解説

**※インライン要素には効かないので注意！**


左右に反転させるにはscaleもしくはrotateを使います。

scaleは本来大きさを変更するものですが、値がマイナスになると反転するので等倍のマイナス値を指定することで反転ができます。


rotateは回転をさせるときに使います。y軸(縦)を中心に回転させ、文字を反転させます。

## まとめ

２つの方法を紹介しました。
どちらの方法でも簡単なので、好きな方でいいかなと思います。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
APIについてまとめた

APIと一言で言っても、よく使うWeb API以外にも様々な場面で使われていて、場面場面で微妙に意味が違うからずっと腑に落ちない部分があったので、今一度きちんと整理しました。

## APIとは：
ソフトウェア同士がやりとりをするための決まり事
APIを**提供する側**と**使う側**の２者が必ず存在し、双方がやり取りするための決まり事

WebAPIを例にとると、アプリケーションの機能を外部から利用できるように、提供側（バックエンド）が呼び出し可能な関数を用意して公開する。

使う側（フロント）は提供された関数を呼び出し、データの取得、書き換えなどを行い連携する。

Webアプリの開発現場ではフロントエンドとバックエンドが開発前にAPIのインターフェース、つまりはリクエスト、レスポンスの決まりごとを話し合って`合意形成`し、その決まりごとに準じて開発を進めていくのが一般的。

## APIの種類：
Web APIだけではなく色々な種類があります。
**・OSが提供するシステムコールAPI**
印刷機能など

**・プログラミング言語が提供するAPI**
-JavaScriptであればfetchなど、

**・アプリケーション、ライブラリが提供するAPI**

**・Webサービスが提供するAPI**
HTTPプロトコルでネットワーク経由でやり取りするAPI


## API仕様書
APIは`使い方の仕様やルール`と`機能`の２つで１セットとも言われてます。
仕様や使い方を文書化するのにOPEN APIなどが使われている。

よくフロントエンドの開発で複数のコンポーネントで使われる同じ様な関数は、どこからでも呼べる様にUtilsファイル等にまとめる共通化をしますが、API化は関数をインターネット経由で別のプログラムから呼べる様にする事かなと思いました。

だから、Web APIは「ネットワーク越しに利用できる関数」とも言われています。


## まとめ
・サーバーアプリケーションの機能をネットワーク経由で外部から利用できる様にする事をAPI化。
・HTTPやHTTPSなどを使ってデータを送受信するため、同じ言語で開発されたアプリケーションでなくても連携できる。
・REST APIの場合、URLそのものが関数名で引数を渡す事で結果が変化する。
・レスポンスデータの形式は最近はJSON。一昔前はXMLが主流だった。
・非同期処理なんで、AJAX形式で利用される事が多い（AXIOSも）
・データを常に同じ様に返す、データベース管理上の理由でAPIを２つ叩いてフロント側で結合して使う様なことは多々ある。REST APIだとエンドポイントを増殖させすぎない為。
・PC、アプリなどで様々なデバイスで同じ機能を共通して使うことができるので、開発しやすいという利点がある。
・企業が公開してるWeAPI（有名なのはGoogleMapAPI、ぐるなびAPIなど）を使ってサービス開発を行うことも多い。しかしGoogleMapAPIは無料だったのが従量課金制になったり、食べログAPIがサービス終了したりと企業のWebAPIに依存するのは少し問題もある。
C++，OpenCVでgetAffineTransform()を使った時のエラーについて

#はじめに
当記事は備忘録代わりのようなものであるため参考になるかは分からない．ただ，プログラム初心者が陥るようなエラー内容である可能性が高いため，初学者にとってはヒントになるかもしれない．

#目次
1.環境について
2.cv::getAffineTransform()について
3.今回起こったエラー内容について
4.結論

#1.環境について
・Visual Studio 2017, 2019
・OpenCV 3.4.13
・使用言語 : C++

#2.cv::getAffineTransform()について
まず，タイトルにある「getAffineTransform()」というOpenCVの関数はざっくり言うとアフィン変換を施す関数である．
では，この関数に渡す引数について記述する．はじめにOpenCV 2.2の記述から記す．


```
// OpenCV 2.2の記述
Mat getAffineTransform(const Point2f src[], const Point2f dst[]);

/* 実際に使うとこうなる */
vector<Point2f> src;
vector<Point2f> dst;

for (int i = 0; i < 3; i++)
{
    // src, dstに値を格納するコードを記述
}
Mat TransMatrix = getAffineTransform(src, dst);

```


Point2f型の配列(src)を，同じくPoint2f型の配列(dst)に変換する変換行列をTransMatrixに格納する．src, dstの要素が3つなのは三角形の頂点座標をそれぞれアフィン変換によって変形を施すためである．（詳しい内容については「アフィン変換」で検索してほしい）

続いて，OpenCV 3.0以降（3.0~4.5.2で確認）において追加された？記述を記す．


```
// OpenCV 3.0~の記述
Mat cv::getAffineTransform(InputArray src, InputArray dst);
```


InputArrayとあるのだから型は何でもよいのだろう，と思っていた．実際にVisual Studio 2017, 2019で記述したときのスクリーンショットを示しておく．
![getaffine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1417377/7c02bb90-dbf5-e85c-d6a5-fbf6f654859e.png)

図より，「cv::Mat cv::getAffineTransform(cv::InputArray src, cv::InputArray dst)」と表記されているのが分かるだろう．このように記述されていたものだからのこのこと何も考えずにint型の配列を引数として渡してしまった．（図で言うと，青字のt1Rect, t3Rectという配列）

#3.今回起こったエラー内容について
長々と書いてきたがようやく本題である．次に今回のエラー内容を示す．

**OpenCV(3.4.13) Error: Assertion failed (src.checkVector(2, CV_32F) == 3 && dst.checkVector(2, CV_32F) == 3) in cv::getAffineTransform, file C:\build\3_4_winpack-build-win64-vc15\opencv\modules\imgproc\src\imgwarp.cpp, line 3407**

エラー内容は，
**src, dstに格納されている値は要素を２つ持っていてかつCV_32F(つまりfloat型）である必要があり，それらを３つ用意してくださいね，**
である．

**なるほどね．**

Visual Studio上で（InputArray src, InputArray dst）の方の関数が表記されていたからそれに従ったのに，古い方の関数で動いてしまったせいでこんなことになっているのである．ちゃんと(const Point2f src[], const Point2f dst[])と書いてくれていれば，「あぁなんか知らないけどfloat型にしないといけないのね」，と理解して対応できたのだ．

さらに言うと，このエラーの質の悪いところは**コンパイルが通ってしまう**ということである．

そもそもの話だが，OpenCVのバージョンが3.4.13でちゃんと（InputArray src, InputArray dst）の方の関数が用意されているのにも関わらず，なぜ古い方で動いていたのだろうか．不思議でならない．

#4.結論

どうやらVisual Studio 2017, 2019上でcv::getAffineTransform()を入力するとOpenCV 2.2の関数が採用されるらしい．
したがって引数に渡す配列は必ず**float型にして配列の要素は3つ**にすることが必要不可欠である．

#参考文献
・OpenCV 4.5.2
https://docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga47069038267385913c61334e3d6af2e0
最終閲覧日：2021年5月3日

・OpenCV 2.2 documentation >> 画像の幾何学変換
http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html
最終閲覧日：2021年5月3日
Microsoft Graph で使える Delta Query とは

[ブログからの転載](https://1bed.allright.life/?p=3531)

## 経緯

前回、Delta Query を使って差分取得を試してみたが、改めて Delta Query のドキュメントをななめ読みしたメモ

* [前回の記事](https://1bed.allright.life/?p=3499)

## Delta Query の仕様

### Delta Query とは

Delta Query の説明は公式ではこのように記載されている

> デルタ クエリを使用すると、アプリケーションは、要求ごとにターゲット リソースをすべて読み取ることなく、新しく作成、更新、または削除されたエンティティを検出できます。Microsoft Graph アプリケーションはデルタ クエリを使用して、変更をローカル データ ストアと効率的に同期させることができます。

### Delta Query でデータアクセスするには

Delta Query でのフローはこんな感じ

* パターンA：初回、データをすべて取得する必要がある時
  1. Microsoft Graph の目的のリソースで Delta Query を使ってリクエストを送る
  2. deltaLink URL が返ってくるまで nextLink URL でリクエストを送る

* パターンB：初回、データをすべて取得する必要がない時
  1. Microsoft Graph の目的のリソースで Delta Query を使い、パラメータに `$deltaToken=latest` をつけてリクエストを送ると deltaLink URL が返ってくる

* deltaLink URL 取得後の動作
  1. delta Link URL でリクエストを送ることで、変更点が返ってくる
  2. パターンB の 2 を繰り返すことで次の deltaLink URL を取得

### リクエストクエリーで個人的な注目点

あくまで個人的にこんな感じ ※詳しくは公式ドキュメントを読んで♪

* クエリパラメーターを使って絞り込みなどを行いたい時には、初回のリクエスト時にパラメーターをつける
* 特定の変更を追跡するために $select クエリパラメーターを使う
  - 選択されていないプロパティが変更されてもレスポンスにデータが入ってこない
  - manager と members もサポートされる
* `$filter` で特定のユーザーやグループの変更を追うことが可能
  - $filter でサポートされているのは、特定のオブジェクトを追跡する `$filter=id+eq+{value}` のみ
  - フィルター処理の上限は 50
* ユーザーとグループでは、クエリーパラメーターでは、`$expand` , `$top` , `$orderby` はサポートされていない

### レスポンスで個人的な注目点

あくまで個人的に（ｒｙ

* 更新されたは少なくとも更新されたプロパティを持つ ID が返る
* 削除されたインスタンスは ID と `@removed` オブジェクトが返る
  - reason が changed の時は削除されているが、deletedItems から復元可能
  - reason が deleted の時は完全に削除され、復元不可能
* 1 つのエンティティが複数回変更された時、レスポンスに複数回含まれる可能性があり、統合は不可能
  - 複数回返ってくる可能性を考慮する必要がある

### 状態トークンって消えないの？と気になる

気になるのが deltaLink の状態トークンが消えることはないか？というところだけど、そこはこの辺りに気をつける必要がありそう

* リセットがかかることがある
  - リセットがかかった時には、応答コード 410 と空の deltaLink が送られてくる模様
  - ターゲットテナント内部のメンテナンスなどで起きるので防ぎようがないので、可能性を考慮する必要がある
* トークン期間がある
  - Directory オブジェクトは 7 日
  - Education オブジェクトは 7 日
  - Outlook エンティティは上限はなしだが、内部的なキャッシュ容量を超えたら古いトークンは削除される
    ※ハッキリと理解できていない...

## 参考

* デルタ クエリを使用して、Microsoft Graph データの変更を追跡する  
  https://docs.microsoft.com/ja-jp/graph/delta-query-overview
* user: delta  
  https://docs.microsoft.com/ja-jp/graph/api/user-delta?view=graph-rest-1.0&tabs=http
やりがちなif文でのエラーに気をつけよう！ (今日のPython Day3)

# 0.はじめに
　いよいよ3日目ですね。今日と明日頑張れば3日坊主にはなりません。GW中、何もやることなくYouTubeでダラダラ動画を見続けているそこの大学生もPythonを一緒に学ぼう！

　毎日1問、Pythonの問題を出題します。出題範囲は特に定めていませんがはじめの1ヶ月くらいは『入門Python3　第2版』の第1～11章までのことが分かれば解ける問題にしたいと思います。「こういう問題を作って欲しい」などのリクエストがございましたら初心者ながら頑張って作問します。また「別解を思いついた」、「間違えを見つけた」などがありましたら遠慮なくコメント欄にて教えて下さい。記事を執筆している当人もこの記事を読んでくださった方も新たなことを学ぶことができるので。


# 1. 問題
　太郎君は得点が60点以上なら「合格」, 60点未満なら「不合格」と表示するプログラムを作ろうとした。しかし、エラーが出てしまった。太郎君に代わってプログラムを直そう。

#2. 解答

```python
# 太郎君がつくったプログラム
score = 60
if score >= 60
    print("合格")
else:
    print("不合格")
```

#3. ヒント
```python
# 吐き出されたエラー
if score >= 60
                  ^
SyntaxError: invalid syntax
```

#4. 解答

```python
# 太郎君がつくったプログラム
score = 60
if score >= 60:
    print("合格")
else:
    print("不合格")
```

#5. 解説
　末尾のコロン「:」が必要です。自分はよくコロンを打ち忘れるかセミコロン「;」を誤って打ちます (JISキーボードだと「;」と「:」が隣り合っている上に押す指がどちらも右手小指だから)。「くれぐれも気をつけましょう。」と言いたいところですが、エラーが出たら諦めてその都度対処しましょう。

#6. まとめ
・if文ではコロンの打ち忘れに気をつけよう！

#7. おまけトーク
　GW中、何もやることなくYouTubeでダラダラ動画を見続けているそこの大学生とは自分のことです。最近はエンジニアチャンネルの「あるある動画」にハマっています。

[エンジニアチャンネル](https://www.youtube.com/results?search_query=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB)
【rails】seed.rbを作成する

# seed.rbを書いてみる。

```
category = Category.create!(
  category_name: "food"
)

sale_status = SaleStatus.create!(
  sale_status_name: "sale"
)

product_status = ProductStatus.create!(
  product_status_name: "on-sale"
)

product = Product.create!(
  product_name: "sample_product",
  price: 1000,
  description: "サンプル製品です。",
  delete_flag: false,
  category_id: category.id,
  sale_status_id: sale_status.id,
  product_status_id: product_status.id
)

Purchase.create!(
  purchase_price: 1000,
  purchase_quantity: 1,
  purchase_company: "架空社",
  product_id: product.id
)
```

雑ですけど、自分のメモように。

seedは、書く順番が大切。
親から子へ、上から下に書く。
オブジェクト指向

#概要
オブジェクト指向についての概念を理解するために、まとめた記事になります。
個人的な見解があるため、間違っている箇所がありましたら優しくわかりやすく助言をいただけると嬉しいです。

#オブジェクト指向とは

プログラムが大規模になっても効率よく開発できるようにするために使われます。
例えば、あるプログラムのコードを書いているとします。どんどん、プログラムが大きくなるに従ってコード量もかさむことになります。プログラムが大きくなるに従い、人間が管理するのが難しくなります。そして、システム障害に繋がります。そこでオブジェクト指向を使い効率的にプログラムを書くために考えられた概念です。


#RPGで考えてみた



![スクリーンショット 2021-05-03 20.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/3106c358-32df-d15e-d6fd-c3130c507eef.png)

#クラス
テンプレートとなるクラスがあります。そのクラスから実体化したインスタンスを作り、データを扱います。
インスタンスでは、クラスで定義された関数を使うことができます。

#カプセル化

ハリーとヴォルデモートが戦います。
ハリーの攻撃力は20です、ヴォルデモートのHPは100です。
インスタンス化されているハリーとヴォルデモートのプロパティにある関数。外部とのインターフェースになる値や関数を一部公開します。
そして、残りを隠蔽します。
そうすることで、中の処理を書き換えたとしても他の場所には影響が出ません。


![スクリーンショット 2021-05-03 20.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/81a29bef-5157-72c0-b38b-376e1eb52f53.png)

#ポリモーフィズム(多能性)

魔法使いクラスでは、魔法を使うと定義されています。
魔法を使うというメソッドは同じものを使い、実際の処理は違うものを使う。同じ関数を同じように使うが、中身の処理はそれぞれに任せる。
関数を上書きすることで、こうした挙動を実現することができます。
leetcode shell 三問シェル問題

１、file.txtというテキストファイルを与えたら、このファイルの10行目だけを印刷してください。
例:
file.txtに次のようなものがあるとします。
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

スクリプトは10行目を表示します：
Line 10

```bash
sed -n '10p' file.txt
```

２、file.txtファイルを与えたら、その内容を転置します。
各列の数は同じで、各フィールドは' 'で区切られていると仮定することができます。
例:
file.txtファイルの内容が次のようになっているとします。
name age
alice 21
ryan 30

出力すべき:
name alice ryan
age 21 30

配列に格納して再出力:

```bash
cat file.txt| awk '{
    for(i=1;i<=NF;i= i + 1)
    if (data[i] != "") data[i] = data[i] " " $i 
    else data[i] = $i 
} END {
    for(str in data)
        print data[str]
}'
```

３、テキストファイルwords.txtの各単語の出現頻度を統計するためにbashスクリプトを書きます。

簡単のために、次のように仮定してみましょう。

words.txtには小文字と' 'だけが含まれている。
それぞれの単語は小文字だけで構成されている。
単語間は1つまたは複数のスペース文字で区切られています。
例:

words.txtの内容を次のようにする。

day day is sunny the the
the sunny is is

スクリプトは出力する必要があります(語順の降順):

the 4
is 3
sunny 2
day 1 

説明:

同じ語数の単語を並べ替える問題は心配しないでください。それぞれの単語の出現頻度は一意です。

集計したら順番に並べて、アウトプットする。

```bash
cat words.txt | xargs -n 1 | awk '{
    if($1 in data)
        data[$1] = data[$1] + 1
    else
        data[$1] = 1
} END {for(str in data) print data[str],str}' | sort -rn | awk '{print $2, $1}'
```
sys.modulesに登録しないでモジュールをロードする方法

`sys.modules`に登録しないでモジュールをソースファイルからロードし、そのモジュールを変数にアサインして、そのモジュールの利用をその変数を通してのみの利用に限定したい場合、`importlib`のクラスや関数を駆使した下記の方法があるようです。[参考](https://stackoverflow.com/questions/19009932/import-arbitrary-python-source-file-python-3-3)リンク先に紹介されていました。モジュール名は識別子として利用できない文字列も付けられるようです。

```python
import importlib.util
from importlib.machinery import SourceFileLoader
loader = SourceFileLoader("<unnamed module>", path="samplemodule.py")
spec = importlib.util.spec_from_loader(loader.name, loader)
mod = importlib.util.module_from_spec(spec)
loader.exec_module(mod)
```

```python
>>> mod
<module '<unnamed module>' from 'samplemodule.py'>
```

参考
* https://stackoverflow.com/questions/19009932/import-arbitrary-python-source-file-python-3-3
__setattr__よりpropertyのsetterを優先させたい場合

`__setattr__`は、属性への代入をカスタマイズするためのスペシャルメソッドですが、`property`のsetterよりも優先順位が高いです。したがって、下記のように、`x`にsetterが定義されていても、`x`への代入文では`__setter__`が呼ばれており、メンバ変数`_x`は作成されていません。

```python
class Foo:

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    def __setattr__(self, key, value):
        pass
```

```python
>>> f = Foo()

>>> f.x = 3

>>> f.x
AttributeError: 'Foo' object has no attribute '_x'
```

`x` propertyのsetterを機能させたい場合、`__setattr__`の中で、次のようにすることができます。

```python
class Foo:

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        object.__setattr__(self, "_x",  value)

    def __setattr__(self, key, value):
        if hasattr(type(self), key):
            attr = getattr(type(self), key)
            if isinstance(attr, property):
                if hasattr(attr, 'fset'):
                    attr.fset(self, value)
                else:
                    raise AttributeError("%s is read-only" % key)
            else:
                raise AttributeError("%s is not a property" % key)
```
このように`__setattr__`を定義すると、下記のようにsetterが機能します。

```python
>>> f = Foo()

>>> f.x = 3

>>> f.x
3
```
`f.x = 3`の文で、`__setattr__`では、
`hasattr(type(self), key)`で、`Foo`が属性`x`を持つかどうか、
`isinstance(attr, property)`で、`Foo.x`がプロパティオブジェクトであるか、
 `hasattr(attr, 'fset')`で、そのプロパティオブジェクトがsetterをもつかがチェックされていて、
`attr.fset(self, value)`で実際にsetterを呼んでいます。

注意しなければならないのは、`x`のsetterの定義中で、単純に`self._x = value`としてしまうと、カスタマイズした`__setter__`が呼ばれてしまうので、デフォルトの代入動作を行うため、`object`の`__setattr__`を明示的に呼ぶようにしています。

**参考**
* https://stackoverflow.com/questions/15750522/class-properties-and-setattr
ループバックアドレス とは

## 勉強前イメージ

127.0.0.1のことだよね・・・？

## 調査

### ループバックアドレス とは

予約された特殊なIPアドレスで、自分自身を指すIPアドレスです。
IPv4ではループバックアドレスは `127.0.0.1` が一般的に使われますが
127.0.0.1 ～ 127.255.255.254 の範囲内であればいくつでもよいです。
IPv6では::1になります。

### centosでループバックアドレスの確認方法

コマンドラインで `ip a` で確認できます。
以下のようにループバックアドレスが指定され、`127.0.0.1/8` と記載されています。

```
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
```

試しに127.0.0.1 と 127.0.0.2 にpingを打ってみると、どちらも疎通できることがわかりました。

```
[root@localhost ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.063 ms
```

```
[root@localhost ~]# ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2) 56(84) bytes of data.
64 bytes from 127.0.0.2: icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from 127.0.0.2: icmp_seq=2 ttl=64 time=0.024 ms
64 bytes from 127.0.0.2: icmp_seq=3 ttl=64 time=0.058 ms
```

digも叩いてみましょう
localhostは 127.0.0.1 で返ってきます。

```
[root@localhost ~]# dig localhost +short
127.0.0.1
```

### `localhost` とは？

よく `localhost` も自分自身を指しますが、こちらはホスト名になります。
`/etc/hosts` の中で指定されています。

```
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

## 勉強後イメージ

あまりループバックアドレスについて調べたことなかった・・・
よくよく見たら ip a の中に 127.0.0.1/8 って書いてあったのに
ループバックアドレスは 127.0.0.1だけだと思ってた。
調べてよかったー

## 参考

- [ループバックアドレス 【loopback address】 127.0.0.1](https://e-words.jp/w/%E3%83%AB%E3%83%BC%E3%83%97%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9.html)
- [ローカル・ループバック・アドレス（127.0.0.1）とは？](https://www.atmarkit.co.jp/ait/articles/0610/14/news021.html)
ざっくりとAPIについてまとめてみた

##はじめに
はじめてYouTube Data APIを使用したアプリを作成したが、そもそもWeb APIとは何かをあまり知らないので自分なりに調べてまとめてみました。

##Web APIとは

API(Application Programming Interface)の略。
APIを公開することで他のソフトウェア同士と機能の共有ができる。
Web APIはHTTPプロトコルを用いてネットワーク越しに呼び出すシステム間、アプリケーション間のインターフェイスのこと。

つまり__「自分のサービスに、他人の便利な機能を借りてくることができる」__ということになる
またAPIを公開することで自分のサービスを人に使ってもらうこともできる。

##メリット
<dl>
 <dt>・開発費の削減</dt>
<dd>自分で１から機能を作る必要がなく開発の効率化と開発の時間短縮ができる。</dd>
<dd>例：クレジットカード決済機能を導入するのにクレジット決済APIを利用する。</dd>
<dt>・セキュリティの向上</dt>
<dd>FacebookやTwitterのAPIを取得しログイン機能を設定することで、会員登録機能を作らなくてもセキュリティの高いサービスを利用でき、自分のサービスのセキュリティを向上させることができる。</dd>
<dd>例：Facebookアカウントで自分のサービスに登録できるようにする。</dd>
<dt>・最新の情報を利用できる</dt>
<dd>自分のサービスの情報を更新しなくても常に最新の情報を手に入れることができる。</dd>
<dd>例：最新の天気予報を手に入れ表示させる。</dd>


##Web APIの例
<dl>
<dt>・Twitter API</dt>
<dd>Twitterデータを取得したり、ツイートしたりできるAPI。</dd>
<dt>・Facebook API</dt>
<dd>Facebookデータを取り込んだり、取り出したりするためのAPI。</dd>
<dt>・YouTube Data API</dt>
<dd>YouTubeを操作する。動画、チャンネル検索や動画のアップロードなどができる。</dd>
などなど他にもたくさんある。

##RESTful APIとは
RESTの原則に則って構築されたWebシステムのHTTPでの呼び出しインターフェイスのこと。
細かい部分はちょっと難しいので割愛。

##流れ
①必要な情報を入力する。
②API経由でリクエストを投げる。（HTTPリクエスト）
③HTTPリクエストに基づいた情報がHTTPレスポンスで返ってくる。
④さっきの情報を表示させる。
Dataform公式がオススメするディレクトリ構成

Dataformを導入したときに戸惑うのがディレクトリ構成をどうするか。
自分もこれに迷っていたので資料を探していたところ、公式のオススメが紹介されていたのでまとめる。
https://docs.dataform.co/best-practices/start-your-dataform-project

## 公式がオススメするディレクトリ構成
Dataformがオススメするのは以下のような構造。
![folder_example copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243464/3312bbfe-57aa-5e79-b8fc-ddd99909721d.png)

それぞれのフォルダーごとに次のような使い方を想定している。

- `definitions/sources`
    - 後の工程で使いやすくするためにデータソースに対して軽い整形を行う。例えば異なるテーブル間で同じカラム名が使われるようにしたり、データ型を統一したりする。
- `definitions/staging`
    - 最終的に出したい指標（KPIなど）を出しやすくするために、 `sources` の異なるテーブルを結合し、整形を行う。 
- `definitions/reporting`
    - `staging` フォルダーのデータを元に、集計関数を使いながら見たい指標（KPIなど）を出す。
STM32L010と内蔵ADCで電流を測る 330.0uAまで　10kΩ下側


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

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

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

```c++

s=(s*6600)>>13;


```

ソース

```c++

// 電流の測定 10kome max330.0uA

#include "mbed.h"

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

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

#define ADDR_LCD    (0x7C)   //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010

char    data_read[8];   //i2cバッファー

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

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] = '@';
    ch_hex_a_b[1] = '0' + a;
    ch_hex_a_b[2] = '0' + b;
    ch_hex_a_b[3] = '0' + c;
    ch_hex_a_b[4] = 0;

    return(ch_hex_a_b);
} //ch_hex_a

int ii;  //ループカウンタ
int s;   //アナログ読み取り値

int main()
{
    //printf("767\r\n"); //767
    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);wait_ms(2);
    } //for
    
    //無限ループ
    while (1) {
        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);wait_ms(2);

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);

//        s = 4096;
//        printf("-\n\r"); //767
//        printf(" A=%d",s); //767
        
        //電圧を電流に変換 ex 330.0uA -> 3300 uAの十倍を出力
        s=(s*6600)>>13;

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


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

//        printf("\t t=%d %d\r\n",ii,s); //767
        
        //温度の小数点以上の表示
        i2c.write(ADDR_LCD, ch_hex_a( ii ) ,4);

//printf("%s",ch_hex_a( ii )); //767

       //温度の小数点以下の表示
        ch_hex_a( s*10 );
        ch_hex_a_b[1] = '.';
      //ch_hex_a_b[2] = '0' + s;
        ch_hex_a_b[3] = 'u';
        i2c.write(ADDR_LCD, ch_hex_a_b ,4);

//printf("%s\r\n",ch_hex_a_b); //767

        //1秒待つ
        wait_ms(1000);

    }//while

}//main

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


```
もうコードフォーマットを気にしたくない!! ~EmacsでのWeb開発環境~

`eslint` や `prettier` を導入して何も気にせずきれいなコードを

# 環境
私の作業環境はこちらです

- macOS BigSur 11.2.3
- GNU Emacs 27.1
- Node.js v14.4.0

# 必要なツールのインストール
`eslint` と `prettier` はEmacsから呼んで使いたいため、グローバルにインストールします

```
$ npm install -g eslint
$ npm install -g prettier
```

# Emacsの設定

まずはWebフロントファイルを編集する際の major-mode をインストールします
以下のファイルを編集するときに web-mode に切り替わるように設定しています

- .js
- .vue
- .ts

また、普段はインデントレベルを `4` に設定しているのですが、フロントエンド開発の際はインデントレベルが `2` になるように設定しています

```emacs-lisp
(use-package web-mode
  :mode
  (("\\.js\\'" . web-mode)
   ("\\.vue\\'" . web-mode)
   ("\\.ts\\'" . web-mode))
  :custom
  (web-mode-markup-indent-offset 2)
  (web-mode-css-indent-offset 2)
  (web-mode-code-indent-offset 2)
  (web-mode-part-padding 0)
  )
```

以下が `eslint` と `prettier` を扱うパッケージです
特にパッケージの設定はいじっていません
双方 `web-mode` になった際に起動されるように設定しています

```emacs-lisp
(use-package flymake-eslint
  :config
  (add-hook 'web-mode-hook
            (lambda ()
              (flymake-eslint-enable))))

(use-package prettier
  :config
  (add-hook 'web-mode-hook
            (lambda ()
              (prettier-mode))))
```

# まとめ
上記の設定でコーディング中はファイル保存契機で `eslint` と `prettier` が走り
コードフォーマットやlintチェックを行ってくれます

特に何も気にしなくても、一定のルールでコードが整形されたり、ErrorやWarningに気づけるのでとても楽です