OmniAICreator/Qiita-1.07M huggingface dataset:
ReactのJestのテストでエラー Warning: An update to Link inside a test was not wrapped in act(...).

#背景
業務でReactのテストをJestで作成した際、「An update to Link inside a test was not wrapped in act(...)」というエラーにかなり悩んだのでその解決策をまとめておく。

#開発言語 (バージョン情報)
React.js (17.0.2)
Next.js (11.1.2)
TypeScript (4.4.3)
Jest (27.2.2)

#解決策

解決策は色々あるみたいですが、今回は私が解決できた方法になります。
他の解決策も知りたい方は下記「参考」よりご覧ください。

```typescript:sample.spec.tsx
it("test 1 sec", () => {
  jest.useFakeTimers();
  const sampleText = render(<MyComponent />);
  jest.advanceTimersByTime(1000);
  expect(sampleText).toMatchSnapshot();
});
```

#参考

https://davidwcai.medium.com/react-testing-library-and-the-not-wrapped-in-act-errors-491a5629193b
Chmodコマンドについて調べてみた

##chmodコマンドとは
+ ファイルのパーミッションを設定するコマンド。
+  具体的には、```ls -l```コマンドで出力される```-rw-r--r-- ```の部分を指す
+ 基本形は ```chmod オプション　ファイル名```
+ オプションの設定方法は数字による設定と、アルファベットを使った設定の２種類ある。

##パーミッションの読み方
```-rwxr--r-x ```の１０文字は
###ー,rwx,r--,r-x に分けられる

最初のーは、ファイルの種別を表す。

| 種別 | 意味 |
|:-----------|------------:|
|     -      |ファイル|
|d           | ディレクトリ|
|l           |シンボリックリンク| 

２文字目から４文字目（rwx）は、所有者のファイル権限を示す
５文字目から、７文字目(r--)は、所有グループのファイル権限を示す
８文字目から１０文字目(r-x)は、その他のユーザーのファイル権限を示す

rwxそれぞれには、以下の意味がある。

| 記号 | 意味 |詳細|
|:-----------|------------:|:-----------|
|r|読み取り権限|ファイル、ディレクトリの中身を参照できる。（ls findなど）|
|w|書き込み権限|ファイル、ディレクトリの作成、更新、削除ができる（mkdir touch rm mv など）|
|x|実行権限|ファイル、ディレクトへのアクセス。ディレクトリへの移動ができる（cd など）|

以上のことを踏まえて、いくつか例を挙げる。確認していただきたいです。
<details><summary>`-rwxr--r--`の場合</summary>
ファイルの権限を示す
所有者は、読み取り、書き込み、実行の全ての権限を持っている
所有グループ、その他のユーザは、読み取り権限のみ持っている
</details>


<details><summary>`dr--r--r--`の場合</summary>
ディレクトリの権限を示す
全てのユーザーは、読み取り権限しかない
</details>

##数字による権限設定
```
$ ls -l　
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt

$ chmod 764 hoge.txt

$ ls -l
-rwxrw-r--  1 user group      9  1月 1 00:00 hoge.txt

```
上記のコマンドは、ファイルの権限の確認　→ 変更　→ 確認の順にコマンドを実行している

`chmod 764　 hoge.txt`の`764`の部分でパーミッションを変更しているが、このことについて詳しく説明する。

数字は、７、６、４、で分けられる。
+ ７の部分は、所有者の権限。
+ ６は、グループの権限。
+ ４は、その他のユーザーの権限を示している

そして数字は、下の表の合計値を示している。

| 数字 | アルファベット | 意味 |
|:-----------|------------:|:------------:|
| 4       | r        | 読み込み権限         |
| 2       | w        | 書き込み権限       |
| 1       | x        | 実行権限         |

以上のことを踏まえて、例をいくつか挙げます。確認していただきたいです。

```chmod ７５５ hoge.txt```の場合

````
ls -l
-rwxr-xr-x  1 user group      9  1月 1 00:00 hoge.txt
````
所有者は、全ての権限を、持っている
グループとその他のユーザーは、読み込みと実行権限を持っている

```chmod ７００ hoge.txt```の場合

````
ls -l
-r--r--r--  1 user group      9  1月 1 00:00 hoge.txt
````

所有者は、全ての権限を、持っている
グループとその他のユーザーは、何も権限を持たない


##アルファベットによる権限の設定
アルファベットで指定する場合は、以下のようになる

```
$ ls -l　
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt

$ chmod u+x hoge.txt

$ ls -l
-rwxr--r--  1 user group      9  1月 1 00:00 hoge.txt

```

アルファベットで設定するときは、```chmod + 変更対象 +　 変更方法 + 　変更内容 +　ファイル名```
が基本形になる

変更対象とは、以下のことを指す

| アルファベット |  意味 |
|:-----------|------------:|
| u       | 所有者        |
| g       | グループ        |
| o       | その他のユーザー        |
| a       | 全てのユーザー        |

変更方法とは、以下のことをさす

| アルファベット |  意味 |
|:-----------|------------:|
| ＝       | 指定した権限にする        |
| ＋       | 指定した権限を加える       |
| ー       | 指定した権限を減らす       |


変更内容とは以下のことを指す

| 記号 | 意味 |
|:-----------|------------:|
|r     　     　|読み取り権限|
|w           |書き込み権限|
|x           |実行権限|
【MySQL】only_full_group_byのエラーが出たとき


1. `cd /usr/local/etc`
2. `vim my.cnf`
3. `sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION` に書き換える。
4. （brewで管理してたら） `brew services restart mysql`

久々に遭遇すると忘れてるので備忘。。。
RDSが突然不安定になったらバーストバランス(Burst Balance)も疑う

統計データを過去2年分再集計（大きめデータ対象に多数のクエリを実行するのでI/O負荷=High）していたらCloudWatchアラームが届いて｢あー､バーストバランス｡痛い目にあったなぁ｣と懐かしくなったので記事化｡

[![Image from Gyazo](https://i.gyazo.com/affbe477d54bd20a9a1b5578d436fd72.png)](https://gyazo.com/affbe477d54bd20a9a1b5578d436fd72)

# ポイント

- RDSのストレージに汎用SSDを選択して､サイズが小さいボリュームサイズ（例えば100GBとか）で運用しているRDSはバーストバランスが枯渇（0%）すると突然､激重になる｡
    - 普段はIOPS性能が3,000 IOPSまでバーストされているので気づかない
    - 100GBだと300 IOPSまで性能が落ちる｡
- バーストバランス枯渇するのはある日突然｡データ増とアクセス増で徐々に忍び寄るのが怖い｡
    - この時､CPUやメモリはむしろ余裕がある（参考スクショを末尾に掲載）
    - ので､バーストバランス枯渇問題を知らないと原因特定に時間を要する
- Webアプリのバックエンドだと不安定な挙動となる
    - リクエストの全てがエラーになるわけではない｡
    - 一部はサクサク動く｡一部は遅く｡一部は接続エラーとなるのでややこしい
    - コンバージョンが平時より少なくなるがそこそこあるので､コンバージョン監視が役に立たずに発見が遅れる

# 参考記事

以下が､原因がわからずに冷や汗かいていた時に救われた記事.感謝です｡

- [RDSで急にパフォーマンスが悪くなったらIOPSを確認！ - Qiita](https://qiita.com/mk34/items/28ccb7a3e84964d79203)

上記の記事が公開されたときは｢残り｣を確認するすべがなかったようですが､現在はメトリクスが存在してRDSコンソールでモニタリング可能です｡

キーワード｢バーストバランス/Burst Blance｣がわかってしまえば色々と有用な情報があります｡以下はAWS公式｡

- [汎用 SSD ストレージ > I/O クレジットおよびバーストパフォーマンス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Storage.html#Concepts.Storage.GeneralSSD)

```
汎用 SSD ストレージのパフォーマンスは、ボリュームサイズの影響を受けます

汎用 SSD ストレージを使用すると、DB インスタンスは 540 万 I/O クレジットの初期 I/O クレジットバランスを受け取ります。
この最初のクレジットバランスは、30 分間で 3000 IOPS のパフォーマンスバーストを維持するために十分です。

ボリュームは、ボリュームサイズの各 1 GiB あたり 3 IOPS というベースラインパフォーマンスレートで、
I/O クレジットを取得します。
例えば、100 GiB の SSD ボリュームの場合、ベースラインパフォーマンスは 300 IOPS になります。
```


- [Tips：RDSでのIOクレジットバランスの考え方（汎用SSDボリューム） | DevelopersIO](https://dev.classmethod.jp/articles/rds_gp2_iocreditbarance/)
- [AWSのサービスを使う場合はバーストを必ず意識する](https://www.deep-rain.com/programming/infrastructure/1408)

# 対策

## クエリチューニング

弊社が枯渇に見舞われたのは､あるサービスの本番運用からちょうど1年経過した頃｡

ユーザビリティを向上させる改修（その画面を表示した場合に自動で一覧データ取得）を行ってからしばらくしてからです｡
表示するデータは最大50件ですが､検索対象となるテーブルは50万件くらいあり､Indexが効かない抽出条件があり､それによりIO負荷が高まるといったものでした｡

（やや場当たり的ですが）検索条件のデフォルトに｢直近3ヶ月｣という条件を設定することで回避しました｡

## CloudWatchアラーム

徐々に忍び寄ってある時に突然大問題として顕在化するのが怖いところです｡
CloudWatchアラームで監視してしきい値（下図は50%）を下回ったら､関係者に通知するようにしました｡

[![Image from Gyazo](https://i.gyazo.com/9b113ca13f96f19daf5df9e48609fe86.png)](https://gyazo.com/9b113ca13f96f19daf5df9e48609fe86)

# 参考/スクリーンショット

バーストバランスが枯渇した場合のメトリクスがどのようになるかスクショを記載しておきます｡

## バーストバランス

問題が発生した時にバーストバランスのメトリクスです｡期間は2週間｡

徐々に忍び寄っている（日中に減って､夜間に回復）のが､よくわかります｡
原因となった改修から2週間経過して顕在化しました｡

[![Image from Gyazo](https://i.gyazo.com/ffce03e322bb7bfcfcdeb7888e2efaec.png)](https://gyazo.com/ffce03e322bb7bfcfcdeb7888e2efaec)

## Total IOPS

バーストバランスが枯渇すると同時に､IOがバーストしなくなった（=ベースラインにはりつき）のがわかります｡

[![Image from Gyazo](https://i.gyazo.com/190f105589fef42fe8814b780cc388eb.png)](https://gyazo.com/190f105589fef42fe8814b780cc388eb)

## メモリ

余裕あります｡

[![Image from Gyazo](https://i.gyazo.com/ae541162bd2e21c98dc0d3124a8a9f94.png)](https://gyazo.com/ae541162bd2e21c98dc0d3124a8a9f94)

## CPU

IOで詰まっているのでCPUは余力あります｡（最初､CPUクレジットを疑ったので､原因特定が遅くなりました）

[![Image from Gyazo](https://i.gyazo.com/b2c8779ebd227c7dcca0f52a0fcefe40.png)](https://gyazo.com/b2c8779ebd227c7dcca0f52a0fcefe40)
動画を超解像してみたい　iOSでやってみた

#CoreMLで動画を超解像してみました

#動画を超解像したらおもしろいんじゃないか

#動画をCoreMLの超解像モデルにかけてみる
今回は1フレームずつ超解像にかけてみるという力技に挑戦します。

#Step

１、CoreML-Modelsから超解像モデルをダウンロード

https://github.com/john-rocky/CoreML-Models

```swift
lazy var srrequest: VNCoreMLRequest = {
    let model = srmodel().model
    let vnModel = try! VNCoreMLModel(for: model)
    let request = VNCoreMLRequest(model: vnModel)
    request.imageCropAndScaleOption = .scaleFill
    return request
}()
```

２、SemanticImageで動画フレームを処理

https://github.com/john-rocky/SemanticImage

```swift
semanticImage.applyProcessingOnVideo(videoURL: url, { ciImage in
    let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
    try! handler.perform([self.request])
    let result = request.results?.first as! VNPixelBufferObservation
    let pixelBuffer = result.pixelBuffer
    let srImage = CIImage(cvPixelBuffer: pixelBuffer)
    return srImage.resize(as: ciImage.extent.size)
}, { err, processedURL in

})
```

#結果
<img src="https://user-images.githubusercontent.com/23278992/151477153-ab251b74-227a-4a50-bd0c-239c3e75401b.gif">

<img src="https://user-images.githubusercontent.com/23278992/151477305-a3d1d9cf-2202-441b-aa4c-ce79ff52cf2b.gif">

今回は元動画サイズにリサイズしていますが、超解像モデルは画像サイズも大きくしてくれるので、4Kのような動画を作ることも可能かと思います。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Draw.ioに組み込みのアイコンセットがすごかったのでsvgの取得方法を共有

# Draw.ioに組み込みのアイコンセットがすごかったのでsvgの取得方法を共有

## はじめに

以下の記事でも簡単に紹介されていますが、Draw.ioのアイコンセットはすごい。衝撃でした。

[VSCodeでDraw.ioが使えるようになったらしい！](https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e#%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95)

ただ、パワポに使いたいときにはアイコンのsvg単体でほしいと思います。
このsvgの取得方法を共有します。

## 注意事項

2022/1時点の情報です

各アイコンは発行元の利用規約を守って利用してください。

## svgの場所

vscodeの拡張機能のフォルダにsvgが眠っています。

たとえばAzureのアイコン


C:\Users\(ユーザ名)\.vscode\extensions\hediet.vscode-drawio-1.6.4\drawio\src\main\webapp\img\lib\azure2

Analyticsはこんな感じ（右端にアイコンのプレビューが見えます。小さくてごめんなさい）

![2022-01-28-11-15-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a4d6a180-9fbc-ae03-8164-3326b689398d.png)


※エクスプローラで画像をプレビューできるようにPower Toysを入れています。

### 参考

公式のアイコンを簡単に

Azure
https://docs.microsoft.com/ja-jp/azure/architecture/icons/
Power BI(draw.ioにはないかも）
https://github.com/microsoft/PowerBI-Icons

Power Toys
https://docs.microsoft.com/ja-jp/windows/powertoys/
Azure ダッシュボードが便利

# はじめに

Azureでいろいろな環境を行ったり来たりするとき 
特定のリソースのメトリックを閲覧したいときなどに
Azure ダッシュボードを使えばAzure のホームページ的に利用できて便利でした。

## 実際にダッシュボードを使ってみる

用意されたタイルに必要なタイルを貼り付けるだけで良いみたい
「ARMアクション」タイルを使ってAzure REST APIの呼び出しを設定しておけば、仮想マシン停止をワンクリックで出来たりするみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/42abf386-cdc7-1bc8-a942-f784c84677a3.png)

## 作ったダッシュボード

まずは良く使うリソースをダッシュボードに用意するだけやってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/a00fddbd-7549-5c93-46df-e249b2014f98.png)

## まとめ

使い方によっては結構便利になりそう
[py2rb] type クラスの動的定義

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# type (Python)
```python
    @classmethod
    def _make_chain(cls, sequence_maker):
        if isinstance(sequence_maker, type):
            tp = type('%sChain' % sequence_maker.__class__.__name__, (cls,), {
                'sequence_maker': sequence_maker
            })
        else:
            tp = type('FunctionChain', (cls,), {
                'sequence_maker': staticmethod(sequence_maker)
            })
        return tp
```
https://www.shoeisha.co.jp/book/detail/9784798163642

独習Python 516p

ここでの`type`はメソッドの雛型を利用して、クラスを動的に定義しています。
# Class.new (Ruby)
```ruby
class MC
  def self._make_chain(sequence_maker)
    if sequence_maker.instance_of?(Class)
      tp = sequence_maker.class.to_s.concat('Chain')
      tp = Class.new(self) {
        def sequence_maker
          puts 'Instance Method'
        end
        define_method(sequence_maker.to_s, instance_method(:sequence_maker))
      }
    else
      functionChain = Class.new(self)
      functionChain.define_singleton_method(sequence_maker) do
        puts 'Class Method'
      end
      return functionChain
    end
  end
end

MC._make_chain(String).new.String
MC._make_chain('aa').aa

# output
Instance Method
Class Method
```
`Class.new(superclass)`でクラスを生成。
インスタンスメソッドは、`define_method`で名前を変更。
クラスメソッドは、`define_singleton_method`で生成。

https://docs.ruby-lang.org/ja/latest/method/Class/s/new.html

https://docs.ruby-lang.org/ja/latest/method/Module/i/define_method.html

https://docs.ruby-lang.org/ja/latest/method/Object/i/define_singleton_method.html

https://qiita.com/y4u0t2a1r0/items/8e19ca364ecba5c67ee5

https://qiita.com/hogucc/items/6ab8c5974725970d011c

やっていることはシンプルですが、ちゃんと動作するか心配。
# メモ
+ Python の type を学習した
+ 百里を行く者は九十里を半ばとす
iOS版SafariでGreasemonkey（クライアントサイドスクリプト実行）っぽいことをする

# はじめに

iOSのショートカットでJavaScriptが実行できるのを知ってますか？
ググってみたんですがショートカットがいまいち周知されてないのもあって
あまり知られていない機能のような気がします。

ショートカットって何？という方
→https://time-space.kddi.com/mobile/20191120/2783

JavaScriptが実行できるということは・・・
なんでも！
やれるということ！

つまりかつて人気だったGreasemonkey（ユーザスクリプトによる拡張機能）が
工夫次第でっぽいものが再現可能です。

Greasemonkeyって何？という方
https://ja.wikipedia.org/wiki/Greasemonkey

今回は簡単にCSSを自由に変更する例をご紹介します。
QiitaトップページのQiitaロゴを消してみましょう！

# 環境
- iPhone SE2
- iOS 15.1
- Safari

# ショートカットの作成
まずはアプリのショートカットを起動します。

![IMG-3406.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/3e1f53f2-d7ad-3b07-7e03-058ca693720f.png)


右上の＋ボタンを押下して新規ショートカットを作成します。

ショートカット作成画面が開いたら右上の（何ボタンというんでしょう？）ボタンを
押下して「共有シートに表示」をONにします。

![IMG-3409.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/b9369bb7-6d90-dc64-53fc-690c66e9af81.png)
![IMG-3410.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/7aeac6c4-9fb6-9f90-3c11-9422f3d377e3.png)


続いて「アクションを追加」を押下します。

![IMG-3411.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/c5549a75-9cc5-6106-08f2-32d119165399.png)

すべてのアクションから「WebページでJavaScriptを実行」を選択します。

![IMG-3412.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/c6dccd62-e6f5-8a3b-c759-97b656b4630b.png)
![IMG-3413.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/d069f769-62b2-3606-a112-5555b961a086.png)


追加されたアクションのJS部分を以下に書き換えます。

```js
var result = [];
document.getElementsByClassName("st-NewHeader_start")[0].style.display = "none" ;

// completionを呼び出して終了
completion(result);
```

![IMG-3414.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/2cb4e086-30b3-47b6-253e-35d181f87609.png)


completion(result)は必須なので無いとエラーになるため注意しましょう。
ショートカットは適当な名前を付けておいてください。
（例ではJSテストとしています）

# ショートカットの実行
それでは作成したショートカットを実行してみましょう。
Qiitaにアクセスします。

![IMG-3415.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/8b9bcd24-c29c-afc1-8cc5-207a336b2c7f.png)


共有ボタンを押下して作成したショートカットを選択します。
これでQiitaロゴが消えるはずです！

![IMG-3416.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/580c451c-457d-7f6e-0def-abbee6b89e11.png)
![IMG-3417.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/b75462d4-e96d-2150-1e21-59b1b98fcfdc.png)


無事Qiitaロゴが消えましたね。

# おわりに
っぽいものはできますが、いちいち共有ボタンから実行しないといけないのがネックです。
今回は簡単なJavaScriptでしたが可能性はまだまだあるような気がしてます。
（ただ脆弱性も含んでる気もします）
もっと面白いことをやりたいのですが思いつかず。
Dynamics 365 Finance and Operations ~ 2022年 Wave1（Finance編） ~

[前回](https://qiita.com/TaichiKayama/items/de5431dc8e20a765e4b6)の続きで、2022年 Wave1 D365 のモジュールのうち、Finance の部分をまとめました。内容がまだ明らかになっていないものも多いので、速報の日本語訳程度だとお考え下さい。

https://docs.microsoft.com/en-us/dynamics365-release-plan/2022wave1/finance-operations/dynamics365-finance/planned-features

#コア系の機能
|機能  |メモ  |GA  |注目度　　|
|:---|:---|:---:|:----:|
|New vendor invoice management experience|仕入先請求書の処理が中央集中的に管理できるようになるので、使う人の使用性と効率性が上がる|-|○|
|Vendor invoice OCR – advanced configurations for OCR service|元々、仕入先請求書はOCRからの出力の受け口としてエンティティや例外処理の[機能](https://docs.microsoft.com/en-us/dynamics365/finance/accounts-payable/vendor-invoice-automation)があるが、より柔軟な設定が可能になる（請求書フィールドの編集・信頼スコア・手動レビューの有無）|-|◎|
|Vendor invoice OCR – deployment wizard for vendor invoice OCR Integration|仕入先請求書は、あくまでOCRからの出力の受け口としてエンティティや例外処理の機能があるというものになるため、実際のOCR処理自体はAzureのForm recognizerやRead APIとか、3rd PartyのOCRソリューションが必要。そのソリューションの展開が楽になるらしい。|-|◎|
|Vendor invoice OCR – vendor invoice OCR hub|OCR仕入先請求書の処理も中央集中的に管理できるようになる|-|◎|
|Vendor invoice OCR – business rules in staging area|OCRで請求書を読み取る際に十分なデータがない場合に、データを補完させるようなビジネスロジックを仕込める|-|◎|
|Enhancements around ledger settlements|元帳決済の機能強化（・年度締めでは期首の未決済トランザクションのみが含まれる・未決済トランザクションの"詳細"を保つことができ、未決済分を翌期に決済するのが楽になる etc.）|2022/4|◎|
|New button added to view settlement voucher|決済バウチャーの中の全トランザクションを確認できるボタン|2022/4|○|
|Post in batch for bill of exchange related journals|為替手形に関わる仕訳帳をバッチ処理転記することができる|2022/4|○|
|Reverse reconciled advanced bank reconciliation|銀行勘定調整を元に戻すことができる|2022/4|○|
|Validate vendor bank account before submitting vendor payment journal to workflow|仕入先へ支払処理する前に、その仕入先の銀行口座が大丈夫か確認するロジックが働く|2022/4|○|
|Allow positive asset depreciation|不勉強でイメージがわかないのですが、正の減価償却（貸方）によって、簿価 > 取得価額みたいなことが起きるので、それを許容してくれるらしい|2022/4|○|
|New vendor invoice data entity for OCR integration|仕入先請求書OCRの[機能](https://docs.microsoft.com/en-us/dynamics365/finance/accounts-payable/vendor-invoice-automation)のエンティティが強くなったらしい（雑）|2022/4|○|
|Subscription billing – recurring contract billing|サブスクのリカーリング請求について、柔軟な価格設定ができ、また顧客ごとに請求をまとめることができる|2022/4|◎|
|Subscription billing – revenue allocation|製品ごとに収益の配分を決めることができる|2022/4|○|
|Subscription billing – revenue and expense deferrals|ASC606およびIFRS15に準拠するよう、収益認識プロセスの中で、履行のタイミングを管理してくれる|2022/4|○|
|Financial tags|レポートや元帳決済時のフィルタのために、総勘定元帳に対して最大15個のfinancial tagをつけられる。Financial tagは、Financial Dimensionと違い、再利用性がないものにつけるようにする。|2022/7|◎|
|General ledger year-end enhancements – specify balance sheet dimensions and year end close micro-service|年度締めのパフォーマンスが改善された|2022/7|◎|
|Ledger settlement automation|総勘定元帳の借方と貸方のトランザクションを自動的に照合し、それらを決済済みとしてマークすることにより、経理担当者は、関連するトランザクションに手動でマークを付けて決済する必要がなくなる|2022/8|◎|

#グローバリゼーション（ローカライズ）系の機能
わからない＆ニッチなお話なので、割愛しますｗ
Certbotコマンドだけを使った認証更新の手順

##概要
certbotコマンドのみを使って、apacheに登録されているバーチャルホストのドメインに対してhttps接続できるようにする。

以下の環境の話です
Ubuntu 20.04 LTS
Apache Apache/2.4.41(Ubuntu)
certbot 0.40.0

## Apacheの設定
今回はcertbotのapacheプラグインを利用するため、Apacheではhttp通信ができる程度の設定をしていれば良い。

```conf:/etc/apache2/sites-enabled/website.conf
<VirtualHost *:80>
    ServerName website.com
    ServerAdmin admin
    DocumentRoot /var/www/website/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

## certbotを叩く

```bash
$ certbot

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: website.com
2: website2.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/websote.com.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

```

すでにApacheプラグインが入っていれば勝手にApacheプラグインを使うものとして動作する。
ここで対象のドメインを指定すると、それぞれのドメインに対しwebsite-ssl.confが作成され、https側の設定がされる。
かなり便利なのでおすすめする。

# おまけ

複数のドメインを指定した場合、あとから指定した方はここで指定しただけでは後ほど certbot renew の対象にはならないので、各種設定が終わった後に

```bash
$ certbot certonly -d website2.com
```

のように追加で設定する必要があるので注意。
C# 初心者向け 非同期処理のやり方

# 非同期処理とは
C#でGUIアプリを作成していると、重い処理を実行しているときにGUIが固まってしまいます。
これは、GUIを更新しているスレッド（以下、UIスレッド）が処理を実行していてGUIの更新まで処理しきれていない状態になっています。
また、固まっているときは「応答なし」と表示されてしまいなんとも言えない動作になってしまいます。。。

そこで非同期処理の出番です。
非同期処理とは、別のスレッドを作成してそちらで重い処理などを行うことでUIスレッドでGUIの更新をしつつ処理を進めていくことができます。
そのためGUIが固まることなくバックグラウンドで処理を進めたり、複数のスレッドで処理をすることで通常よりも速く処理をすることができます。

# 非同期処理のやり方
ここでは初心者向けということで既存の関数を非同期処理する方法を記載していきたいと思います。

## 引数、戻り値なしの場合
例えば、以下のようなコードがあったとします。

```cs
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HeavyMethod();

            MessageBox.Show("完了しました。");
        }

        private void HeavyMethod()
        {
            //重い処理の代わりとして10秒待つ
            Thread.Sleep(10000);
        }
    }
```

上記の例ではボタン押下時のイベントで重い処理HeavyMethod()を実行しており、
その実行中はGUIの操作は受け付けません。

ここから非同期処理に変換しておこうと思います。
まずはHeavyMethodを非同期で処理するHeavyMethodAsyncを作成します。

```cs
        private Task HeavyMethodAsync()
        {
            return Task.Run(() => HeavyMethod());
        }
```
* 非同期メソッドは「~Async」と命名します。これは非同期メソッドであることを明確にするためです。
* Task.Runメソッドを使って別スレッドで実行します。引数はラムダ式で記載しています。
* 戻り値をTaskにします。

次にHeavyMethodAsyncを呼び出すbutton2の押下イベントを作成します。

```cs
        private async void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;        //クリックイベントを2重で呼び出されないようにするため

            await HeavyMethodAsync();

            MessageBox.Show("完了しました。");

            button2.Enabled = true;         //Enableをtrueに戻す
        }
```
* HeavyMethodAsnycを呼び出すときはawaitをつけて呼びだします。awaitを付けることでHeavyMethodAsyncの完了を待つことができます。  
この時、UIスレッドは空いた状態になりますのでGUIの操作をすることが可能です。  
もしawaitを付けないとHeavyMethodAsyncの完了を待たずにMessageBoxが表示されることになります。（これはこれで並列処理をするときに使います。）
* awaitを使用するために関数の宣言でasyncを付けます。
* 非同期処理をすると重い処理をしているときにGUIが操作できてしまうので、2重で処理させないためにbutton2のEnableプロパティを操作して処理の実行中はクリックできないようにします。

## 引数、戻り値ありの場合
もし、処理に引数、戻り値がある場合は以下のような記述になります。

```cs
        private int HeavyCalculate(int x, int y)
        {
            //重い処理の代わりとして10秒待つ
            Thread.Sleep(10000);
            return x + y;
        }

        private Task<int> HeavyCalculateAsync(int x, int y)
        {
            return Task.Run(() => HeavyCalculate(x, y));
        }

        private async void button3_Click(object sender, EventArgs e)
        {
            button3.Enabled = false;        //クリックイベントを2重で呼び出されないようにするため

            int x = 1;
            int y = 2;
            int ans = await HeavyCalculateAsync(x, y);

            MessageBox.Show($"完了しました。\n答えは{ans}です。");

            button3.Enabled = true;         //Enableをtrueに戻す
        }
```
* HeavyCalculateAsyncの戻り値はTask\<TResult>になります。intの場合はTask\<int>になります。
* 呼び出す側は通常の関数のように戻り値を取得できます。

# 注意点
* Task.Runで別スレッドで実行しているときは、GUIの操作を行うことができません。例えば、TextBoxのTextプロパティを変更することはできません。GUIの操作は必ずUIスレッドに戻ってから（await以降）行ってください。
* 非同期で処理中はGUIが操作できるため他のボタン押下して不具合が出ないように気を付ける必要があります。

# まとめ
以上のような手順で既存の処理を非同期処理することができました。
今回は初心者向けということで単純に既存の関数を非同期にする方法を記載しましたが、今後は上級者向けの記事も作成していきたいと思います。
非同期処理・並列処理はよく理解せずに使用するとバグの原因になるので初心者の方は注意して使用してください。
SageMaker で TensorFlow Keras のログ（進捗状況）が正しく表示されない

## はじめに

機械学習を実行するとき、手元に高価な GPU マシンが存在しないので、
よく SageMaker のトレーニングジョブを利用しています

https://aws.amazon.com/jp/sagemaker/

とあるモデルを SageMaker で学習したとき、ログを見るとこんな状態になってしまいました
※被害が分かりやすいように120文字で折り返しています

```
Epoch 4/10
#015 1/15 [=>............................] - ETA: 13s - loss: 0.4645 - accuracy: 0.9688#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#015 2/15 [===>..........................] - ETA: 10s - loss:
 0.4206 - accuracy: 0.9844#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
0#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
0#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
....
```

これが延々続きます

本来であれば、以下のように表示され、プログレスバーが進むはずです

```
Epoch 4/10
1/15 [=>............................] - ETA: 13s - loss: 0.4645 - accuracy: 0.9688
```

ローカルの Docker では問題なくプログレスバーが動いているのに、何故 SageMaker だとうまく動かないのでしょうか

## 実行環境

- ローカルのDocker: 20.10.9
- コンテナのベースイメージ: tensorflow/tensorflow:2.7.0-gpu
- SageMaker のインスタンスタイプ: ml.g4dn.xlarge

学習の実行コード（抜粋）

```python
model = tf.keras.Sequential(

...

model.fit(
    train_generator,
    epochs=10,
    verbose=1,
    steps_per_epoch=steps_per_epoch,
    validation_data=valid_generator,
    validation_steps=validation_steps,
    callbacks=[cb_es],
)
```

TensorFlow の Keras を利用しています

## ログの抑制

調べると、 TensorFlow の Issue が出てきました

https://github.com/tensorflow/tensorflow/issues/24328

Keras がプログレスバーを表示するとき、バックスペース文字を使っており、
これがインタラクティブ（対話的）でない環境 = SageMaker のトレーニングジョブでは __#010__ として表示されてしまうようです

ノートブックで操作しているわけではなく、ログとして出力されているので仕方ないですね

解決策、というか妥協案ですが、
現状では `model.fit` の引数で `verbose=2` を渡し、進捗表示を少なくするしかないようです

https://keras.io/ja/models/model/

> verbose: 整数．0，1，2のいずれか．進行状況の表示モード．0 = 表示なし，1 = プログレスバー，2 = 各試行毎に一行の出力．

`0` で全く表示がないのは流石にログの意味がないし進捗が分からなくなるため、
`2` で各エポック終了時の値だけ出すようにします

```
Epoch 4/10
15/15 - 13s - loss: 0.6037 - accuracy: 0.8660 - val_loss: 0.4044 - val_accuracy: 0.9479 - 13s 869ms/step
```

## おわりに

ログとしてはエポック毎に出ていれば十分なので、
SageMaker のトレーニングジョブでは `verbose=2` にするのが良さそうです
■Redmine メールによるredmineチケット起票に関するスクラップブック



# メールによるredmineチケット起票

http://guide.redmine.jp/RedmineReceivingEmails/

https://redmine.jp/faq/issue/mail-handler-keywords/

https://d.palmtb.net/2012/03/17/164700.html

---
# その他

https://blog.katsubemakito.net/redmine/issue-create-php

https://blog.enjoyxstudy.com/entry/2018/11/18/000000
IncidentManagerを試してみる

# はじめに
2021/5にIncidentManagerなるサービスがAWSから発表されていました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/05/introducing-incident-manager-aws-systems-manager/

インシデント管理のサービスということで、触ってみた所感を書いてみようと思います。
(SSMのサービスの一種のようです。)

## サービス概要

AWS上で運用しているサービスのインシデントを管理できるサービスです。

CloudWatch AlarmまたはEventBridgeイベントでアラートを上げることにより、IncidentManager上にインシデントとして起票できるようです。

インシデントが起票されたら、IncidentManagerは事前に設定しておいた「対応プラン」に基づいてアクションを実行します。ここで通知を行ったり、SSM RunBookを実行してリカバリアクションを行ったりします。

また、[OpsCenter][link-1]と統合されており、OpsCenter経由でJira Service DeskやServiceNowといったサードパーティのインシデント管理ツールとも同期できるようです。

https://docs.aws.amazon.com/ja_jp/servicecatalog/latest/adminguide/config-servnow.html

イメージ
![Qiita_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/326eeadc-9f0f-567c-4ac2-82a3bb0b7c98.png)


## 料金

1月当たり1対応プランにつき7USD
その他SMS,音声メッセージに課金あり

https://aws.amazon.com/jp/systems-manager/pricing/

## 触ってみる

サービスに対するヘルスチェックが失敗した場合インシデントの起票を行い、通知を行う想定で作成します。

### セッティング

4段階の設定があるようです。

- 全般設定
    - IncidentManagerのデータをレプリケーションするリージョンを決定します。
- 連絡先の詳細
    - インシデントが発生した場合の通知先の連絡先を登録します。SNSのサブスクリプションのようなイメージです。
- エスカレーションプラン
    - インシデントが発生した場合の通知をどうするか設定します。ステージが定義できて「この人が承認するまで次の人には通知しない」といったこともできそうです。
- 対応プラン
    - インシデントの対応を決定します。インシデントのメモ書きや(実行する場合)Runbookの設定、通知先の設定などが行えます。

![image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/3f0726e3-8729-01cb-afe7-fc230f8dead1.png)



### 対応プランを作成する

サービスに対する外形監視が失敗した場合を想定して対応プランを作成します。
「インシデントのデフォルト」項目から、インシデントのタイトル、影響度、詳細を記載できます。

![image_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/ec938278-9eb8-8735-4703-85ed804b5794.png)

その他上記で設定したエスカレーションプランやChatBotで通知を送ることが出来たり、インシデントが発生した際に実行するランブックを定義できたりします。

### Alarmを作成する

Alarmから起票するように設定するには、Alarm作成画面の最下部にある「SystemsManagerアクション」から設定を行います。

![image_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/2059e6eb-8ff4-04d9-d94d-794b29f66f3e.png)

## インシデント起票

Alarmが異常状態に遷移すると、Incident Manager上から起票されることがわかります。

![image_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/582df47a-c9e9-fe4e-5ee9-8d7abe8559a3.png)

インシデントの概要を見ると、対応プランのメモ書きとCloudWatch のイベント情報が閲覧できます。

![image_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/d51ec7c0-113b-2b98-3fec-c620aa0b5b90.png)

登録していたメールアドレスに通知が発報されることを確認しました。
当該インシデントを「解決」とすると、インシデントは解決済みに移動されます。

# まとめ
Incident ManagerはSSMの機能の一つでCloudWatch AlarmかEventBridgeからインシデントを作成し、管理する機能でした。
これによりaws上で実行しているサービスのインシデント管理を行えるようになりました。
運用時のインシデント管理方法として候補に挙がるかなと思います。

# 番外：解決済みのインシデントの削除

マネコンから解決済みのインシデントは削除できませんでしたが、CLIから削除することができました。

```
aws ssm-incidents delete-incident-record --arn <Incident-record-arn>
```

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ssm-incidents/delete-incident-record.html



<!--- 以下リンク --->
[link-1]:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/OpsCenter.html
ReactのJestのテストでエラー The error below may be caused by using the wrong test environment

#背景
業務でReactのテストをJestで作成した際、「The error below may be caused by using the wrong test environment」というエラーにかなり悩んだのでその解決策をまとめておく。

#開発言語 (バージョン情報)
React.js (17.0.2)
Next.js (11.1.2)
TypeScript (4.4.3)
Jest (27.2.2)

#解決策
テストファイルの冒頭に以下のコードを記述する。

```typescript:sample.spec.tsx

/**
 * @jest-environment jsdom
*/

```

#参考

https://qiita.com/mame_daifuku/items/79b6a5a1514a3f067e1a
[Rails] rspecで個人的に使うよく使うマッチャ

よく使うやつをまとめておいて迷わなくすることが目的。

# 一覧

マッチャ|用途
---|---
eq|内容の完全一致をチェック。``match``も同じ挙動をするが、文字数少ないのでこっち使う。<br>オブジェクトが同一かまでチェックしたいなら``be``だが、こっちはそうそう使わない。
match_array|``「チェック対象が配列」かつ「順番問わず全要素の中身が全て一致を確認したい」``ときに使う。
include|``「チェック対象が配列」かつ「指定した要素が含まれるかを確認したい」``ときに使う。
contain_exactly|``「チェック対象が配列」かつ「指定した要素群が含まれるかを確認したい」``ときに使う。
change|``<処理>を実行することによる何かしらの変化を確認したい``ときに使う。例えば「``expect(<処理>).to change(<レシーバ>, :<メソッド名>).by(<期待結果>)``」とかくと、「``<処理>を実行したとき<レシーバ>.<メソッド名>の結果が<期待結果>と一致するか？``」というチェックになる。

(意外となかった)
googleアカウントでログイン（OAuth認証）で少しハマった

## 概要

需要は少ないと思いますが、ハマる人もいるかもしれないと思ったので覚書。
下記は、googleアカウントでログインのサンプルコードです。
ここで、コールバック関数**onSignIn**の定義に**let onSignIn = function(){...}** を使用すると、コールバック関数が呼ばれなくなりました。
詳細は、下記詳細をご覧ください。

```sample.html
<html>
<head>
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <meta name="google-signin-client_id" content="<用意したクライアントID>">
</head>
<body>
    <div class="g-signin2" data-onsuccess="onSignIn"></div>
    <script>
        function onSignIn(googleUser) {  //"let onSingIn = function(googleUser){"は使用できない
            var id_token = googleUser.getAuthResponse().id_token;
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'test.php');
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.onload = function() {
                console.log('Signed in as: ' + xhr.responseText);
            };
            xhr.send('idtoken=' + id_token);
            window.location.href = 'index.php';
        }
    </script>
</body>
</html>
```


## 詳細

```sample.js
function onSignIn(googleUser) {...}  //OK

var onSignIn = function(googleUser){...}  //OK

let onSignIn = function(googleUser){...}  //NG
```

## 原因


**スコープ範囲**か**呼び出し順**の関係だと思うけど。
素直にサンプル通りに書けと言うことなのか。
設定で何かやらかしたのかと思って、焦った。

## その後

googleに報告したところ、[issue tracker](https://issuetracker.google.com/issues/216698452?pli=1)に登録されました。
結論としては、**機弱性には関係ないから、そちらで何とかしてね（ハート**だそうです。
【Django】№02.現在時刻datetime.nowの表示方法をview内で変更してテンプレートに表示させる

##経緯
view.py内でdatetime.nowで現在時刻を取得し、それをajaxでテンプレートに表示させるというところまでは№01で実装できた。今度はその表示形式を変更したい。

&nbsp;
##採用した方法と条件
・django.utils.dateformat.formatで日時の文字列表現をするという方法を採用
・現在の表示は「2020/09/04　09:27:0513598」
・目的の表示は「2020年09月04日 金曜日　09:27:05」


&nbsp;
##今回不採用にした方法
####strftime 関数に任意のフォーマット文字列を渡すことで、同じ datetime オブジェクトから様々の形にフォーマットする方法

参考）https://python.keicode.com/lang/format-datetime.php

```ruby:record_app/views.py
class c_AjaxView(View):
    def get(self, request):
        d = datetime.datetime.now()　　#　ここで一旦現在時刻を呼び出す
        dt_now = d.strftime('%Y/%m/%d %A %H:%M:%S')　# その現在時刻の表記を変更する
        return HttpResponse(dt_now,request)　　　　　# 表記を変更した変数を渡す
i_ajax = c_AjaxView.as_view()

```

⇒この場合、「2020/09/04 Friday 09:27:05」と表示された。（もともとは、2020/09/04　09:27:0513598だった）

⇒できれば日本語で表示したい。/を年に変更してもダメだった（何も表示されなくなった）

&nbsp;
##今回採用した方法は、<br>django.utils.dateformat.formatを使用する方法
参考）https://tokibito.hatenablog.com/entry/20110916/1316133659

```ruby:record_app/views.py
from django.utils import dateformat　　#変更①

class c_AjaxView(View):
    def get(self, request):
        d = datetime.datetime.now()
        dt_now =dateformat.format(d, 'Y年n月d日 l H:i:s')　#変更②　（lは、ｴﾙの小文字。曜日を表す。「曜日」を付けなくてもいい）
        return HttpResponse(dt_now,request)
i_ajax = c_AjaxView.as_view()
```

###⇒　2020年09月04日 金曜日 09:27:05　と表示された！！
【Django】№01.テンプレート表示した現在時刻をAjaxで毎秒自動更新させる


##経緯
・Djangoで勤怠打刻ページを作る際、現在時刻をテンプレートタグ{% now "H:i:s" %}を使って表示していた。
・でもこの場合、テンプレートを表示させた瞬間の現在時刻が表示されたままとなってしまう。
・そこで、javascriptで現在時刻を取得してカウントアップしていく方法をとったが、やはりサーバーから現在時刻を取得して、毎秒テンプレートに現在時刻を表示させるという方法に変更したい。となった。

##今回採用した方法と条件
・Ajaxを使用して現在日時を毎秒サーバーから取得してテンプレートに表示させる方法。
・現在日時の表記方法は日本語表記（2020年08月30日　日曜日　15:31:20）にする。
・テンプレートに表記する時、”2020年08月30日 日曜日”　と　"15:31:20”　は、それぞれにCSS装飾を行える形とする。


#手順①　Ajax通信先の処理viewを１つ作る
参考）https://qiita.com/kakimochi/items/4e95c9e4d1e4b00ec05a


```ruby:record_app/views.py

#　ajax用view
class c_AjaxView(View):
    def get(self, request):
        dt_now = datetime.datetime.now()
        return HttpResponse(dt_now,request)
i_ajax = c_AjaxView.as_view()
```
ここで作ったのは｢i_ajax｣という名前のクラスView。
datetime.nowで現在時刻を取ってきて、dateformat.formatで表示させたい表記方法を指定。
それを変数に入れて、HttpResponseで返すという処理。
この結果がテンプレートに表示されるようになる。
&nbsp;

&nbsp;
#手順②　アプリ側のurls.pyに、i_ajaxを指定する

```ruby:record_app/urls.py
#　下記１行を追加
path('i_ajax/',views.i_ajax,name='i_ajax'),
```
④で通信先のurlを指定するので、この設定が必要


&nbsp;
#手順③　テンプレートの時刻を表示させたい場所にdivを設置
```ruby:record_app/templates/record_app/test.html
<div id="datetime_auto" style="text-align:center;"></div>
```
ここに、現在時刻が表示されるようになる。
このdivにidを付与しておく。
今回は、datetime_autoという名前のidとした
&nbsp;


&nbsp;
#手順④　テンプレートの　body閉じタグ直前に、Javascriptを記載する

```ruby:record_app/templates/record_app/test.html
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script>
        function get_time() {
            // Ajax通信処理
            $.ajax({
                // リクエスト送信先URLの設定
                url: '{% url "record_app:i_ajax" %}',　　# ここで、i_ajaxViewを呼び出している。
                // 非同期通信フラグ（trueは非同期）
                async: true,
                // Ajax通信成功時にレスポンスデータ受け取り&処理実行
                success: function(data) {　　　　　　　　
                    document.getElementById("datetime_auto").innerHTML = data;
                }
            });
        }
        // 1秒ごとに実行する
        $(document).ready(function() {
            setInterval(get_time, 1000);
        });
    </script>
```
javascriptで実行させている処理は下記のとおり。
・Ajax通信したいクラスview(①)のurlを指定
・その通信に成功したら
・③のidに結果を返す
・この処理を１秒ごとに実行する

&nbsp;


####ここまでの実装で、ブラウザでは下記のように表示されるようになりました♪
####秒数が１秒ごとに最新に自動更新されて表示されます。
###「2020/08/30　15:30:589762」

&nbsp;
&nbsp;
ですが、本当は･･･
「2020年08月30日　日曜日　15:31:20」という表示にしたいので、ここから少しカスタマイズさせていきます。
『現在時刻datetime.nowの表示方法をview内で変更してテンプレートに表示させる』に続く。
&nbsp;
&nbsp;
IoT Hubのデータレイクへの出力（メッセージルーティング）を利用する際に注意すること

# IoT Hubのメッセージルーティングを利用する際に注意すること

## はじめに

知らないとやってしまいそうなので共有します。（というかやってしまった）
※今回の記事はDocsに思いっきり書いてあることです。きちんと読まないとですね

## 事象

以下のようなラムダアーキテクチャを構成する場合、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5b9bdb28-921e-37c2-90ff-dda34c6b68e4.png)


こんな感じでルーティングを組むと、コンシューマーグループなどからの読み取り＝ホットパス（赤線）/ウォームパス（オレンジ）が停止します。（読み取れなくなるというのが正しい？）

![2022-01-28-10-18-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4887861c-d92c-92b6-bd75-811ed247f34e.png)


## 対処

eventsエンドポイントをへのルーティングを作成しましょう。

![2022-01-28-10-20-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/45b38bb1-e898-ccdc-3d60-a1062186664b.png)




## おまけ

https://github.com/ryoma-nagata/iot-dashboard
シェル　バックグラウンドジョブの終了通知をオフにする方法

## 前提知識

### ジョブとプロセス

UNIXにおいて、OSが一元管理している仕事をプロセスと呼びます。ジョブはシェルによって管理される仕事の単位です。

シェルはシェル経由で起動したコマンドをジョブという単位で扱い、状態を把握しています。

| 分類 | 管理主体 | 説明 | コマンド |
| - | - | - | - |
| ジョブ | シェル | シェルが起動したコマンドひとつひとつをジョブという単位で扱い、管理する。 | jobs |
| プロセス | OS | OSによって一元管理される仕事の単位。 | ps |

`ジョブ制御 (job control)`によってフォアグラウンドや、バックグラウンド、サスペンドの処理に変更を加えたりすることができます。

### ジョブのオプション一覧

ジョブ制御の設定変更には主にsetコマンドが使用されます。

setoptコマンドで一覧を表示することができます。

```shell
❯ setopt
combiningchars
histignorealldups
histignoredups
histreduceblanks
interactive
login
monitor
nonomatch
promptsubst
sharehistory
shinstdin
zle
```

詳しくはzshのmanに載っています。

[zsh: 16 Options](https://zsh.sourceforge.io/Doc/Release/Options.html#Options)

bashのbuilt-inのsetコマンドの説明も参考になります。

[Man page of BASH](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)

## the MONITOR optionとは

本題です。ジョブの通知をオフにするには、モニターオプションを変更する必要があります。

> If the MONITOR option is set, an interactive shell associates a job with each pipeline. It keeps a table of current jobs, printed by the jobs command, and assigns them small integer numbers. When a job is started asynchronously with ‘&’, the shell prints a line to standard error

[zsh: 10 Jobs & Signals](https://zsh.sourceforge.io/Doc/Release/Jobs-_0026-Signals.html#Jobs-_0026-Signals)

インタラクティブシェルではデフォルトで設定されているオプションです。

## setコマンド

シェルのオプション設定をするコマンドです。`-`と`+`で設定を指定します。

|option | 引数がある場合 | 引数がない場合 |
| - | - | - |
| -A | 指定された引数を含む配列に設定されます。 | 名前が指定されていない場合、すべての配列がそれらの値とともに出力されます。 |
| +A | 指定された引数がその配列の初期要素を置き換えます。 | 名前が指定されていない場合、すべての配列は値なしで出力されます。 |

[zsh: 17 Shell Builtin Commands](https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands)

この記事も見やすいです。
[【 set 】コマンド（応用編1）――ファイルの上書きやシェルの終了、ジョブ終了後の通知動作を変更する：Linux基本コマンドTips（207） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1805/17/news034.html)

今回はモニターオプションをオフにしたいので以下のコマンドを実行します。

```shell
set +m
```
Android Studioでpush通知のアイコンを設定する

Firebase Cloud MessagingからAndroidへPush通知を送った際、アプリがバックグラウンドにある時はカスタムアイコンが表示されませんでした。後から考えてみれば文章をよく読んでなかっただけなのですが、性格上またやらかしそうなので忘備録としてまとめてみました。


##はじめに
push通知でカスタムアイコンを使用するためには、android studioにおいてアイコンを設定する必要があります。何も設定しないと、デフォルトの四角いアイコンが表示されます↓(これはこれでかわいい)。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629808/97f48480-7909-b8f2-1904-a3f577810fd7.png" width=50%>



カスタムアイコンの実装方法は、大まかに
①128×128pxの透過画像(png形式)を用意する
②android studioにおいてその画像を通知用のカスタムアイコンとして設定する
に分けられます。

①については、~~面倒くさいので~~偉大なる先人の知恵をお借りしたほうが正確かと思いますので説明は省略します([この記事](https://qiita.com/kokogento/items/9e91075855779285e6ac)あたりを参考にしてください)。

私がハマったのは②です。

ビルドも成功し、一見うまく行きました。
が、アプリがフォアグラウンドにいるときだけカスタムアイコンが表示され、アプリがバックグラウンドにいるときは、デフォルトの四角アイコンが表示されていたのです。


##うまくいった実装方法

結論から言うと

```xml:AndroidManifest.xml
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_name"/>
```
とすれば良いです。
android:resource以下はカスタムアイコンが入っているフォルダ名/ファイル名です。なお、.pngという拡張子は必要ありません。


##ダメだった実装方法
はずかしながら、上手くいかなかった実装方法を。

①FirebaseMessagingService内でsetSmallIcon()をする

```kotlin:MyFirebaseMessagingService

class MyFirebaseMessagingService: FirebaseMessagingService() {

    //中略
   
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
  
        //中略

        var messageBody: String? = ""
        var messageTitle: String? = ""
        if (remoteMessage.notification != null) {
            messageBody = remoteMessage.notification!!.body
            messageTitle = remoteMessage.notification!!.title
        }
        sendNotification(messageTitle!!, messageBody!!)
    }

    private fun sendNotification(messageTitle: String, messageBody: String) {

        //中略
      
        val notificationBuilder: NotificationCompat.Builder = NotificationCompat.Builder(
            this,
            channelId
        )   .setSmallIcon(R.drawable.ic_stat_name)//←コレ！
            .setContentTitle(messageTitle)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent)
    }
}
```
よくよく考えてみれば、FirebaseMessagingService()のonMessageReceivedはアプリがフォアグラウンドにあるときに呼ばれるメソッドですね（[公式](https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ja)。アプリがバックグラウンドにある際に四角アイコンになったのも納得。


***
②AndroidManifestのmeta-data android:nameに自分のアプリ名を入れる

```xml:AndroidManifest.xml
<meta-data android:name="com.example.myApp.default_notification_icon" android:resource="@drawable/ic_stat_name"/>
```
自分でやっておいてなんですが...アホかな。
***
③AndroidManifestのmeta-data android:nameに"smallIcon"を入れる

```xml:AndroidManifest.xml
<meta-data android:name="smallIcon" android:resource="@drawable/ic_stat_name"/>
```
どっかの記事で見た。昔の実装方法なんかな。



**push通知を理解して、ぜひより良いAndroidライフを！**
※ココ間違っとるよ〜〜とか、より良い実装方法あんで〜〜とかありましたら、ぜひコメントくださいまし。
ReactのJestのテストでエラー Warning: Each child in a list should have a unique "key" prop.

#背景
業務でReactのテストをJestで作成した際、「Warning: Each child in a list should have a unique "key" prop.」というエラーでかなり悩んだのでその解決策をまとめておく。

#開発言語 (バージョン情報)
React.js (17.0.2)
Next.js (11.1.2)
TypeScript (4.4.3)
Jest (27.2.2)

#解決策
map関数でループしている箇所について、1行毎にkey属性を付与する。
「key={index} 」だと型不一致のエラーになるため「key={index.toString()} 」とする。

```typescript:sample.tsx
{datas &&
  datas.map((data, index) => (
    <InformationRow
      key={index.toString()}  // この行を追加
      information={data}
      rowIndex={index}
      onClickButton1={onClickButton1}
      onClickButton2={onClickButton2}
    />
  ))
}
```
[py2rb] itertools.islice

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# islice (Python)
```python
    def _get_by_slice(self, slc):
        self.reset()
        value = list(islice(self, slc.start, slc.stop, slc.step))
        return value
```
https://qiita.com/shihono/items/1613f7c6c1b096256bd3

分かりやすい記事。
# どうする (Ruby)
```ruby
def islice(iterable, *args)
  start = args[0] || 0
  stop = args[1] || Float::INFINITY
  step = args[2] || 1
  cnt = 0
  if iterable.is_a?(String)
    it = iterable.split('').to_enum
  else
    it = iterable.to_enum
  end
  start.times do
    it.next
    cnt += 1
  end
  loop do
    yield it.next
    cnt += 1
    step.pred.times do
      it.next
      cnt += 1
    end
    if stop < cnt
      break
    end
  end
end
```
`enum`と`yield`を利用して、`islice`メソッドを作成するのが手っ取り早そう。

```ruby:exma.rb
s = 0..10
ans = []
enum_for(:islice, s, 0, 3).each do |x|
  ans << x
end
p ans
ans.clear
enum_for(:islice, s, 2, nil, 3).each do |x|
  ans << x
end
p ans
ans.clear
enum_for(:islice, s, nil, nil).each do |x|
  ans << x
end
p ans
s = (0..)  # 無限大
ans.clear
enum_for(:islice, s, nil, nil).each do |x|
  break if x > 8  # ようさそう
  ans << x
end
p ans

s = 'abcdefghij'
ans.clear
enum_for(:islice, s, 0, 3).each do |x|
  ans << x
end
p ans

s = 'a'..'j'
ans.clear
enum_for(:islice, s, 0, 3).each do |x|
  ans << x
end
p ans

# output
[0, 1, 2, 3]
[2, 5, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8]       
["a", "b", "c", "d"]
["a", "b", "c", "d"]
```
途中で打ち切る遅延評価パターンが便利そう。
もしかしたら、`Enumerable#lazy`辺りで実装可能かもしれませんが。
# メモ
+ Python の islice を学習した
+ 百里を行く者は九十里を半ばとす
AIやシミュレーション技術を活用したマテリアルズ・インフォマティクス（MI）について


# はじめに

こんにちは。(株) 日立製作所の [Lumada Data Science Lab.](https://www.hitachi.co.jp/products/it/lumada/about/ai/ldsl/index.html) の文景厚（むん）です。

今回は、私がデータサイエンティストとして活動する中で、多くのデータを扱う研究開発現場のDXを実現する「材料開発ソリューション」について、調べてみました。日立のAI研究者の取り組みをご紹介できればと思います。

## 材料開発ソリューションとは

近年、国際的にも新材料の開発競争は激化し、より短時間・低コストでの材料開発が必須となってきています。日立は、材料開発における DX を推進し、研究成果を最大化する支援をするために、AI やシミュレーション技術などを活用したマテリアルズ・インフォマティクス（MI）を基軸とするソリューションサービスを 2017 年よりご提供しています。


![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685256/fcba01fd-b0d6-4b50-40c9-6fba08ca7b27.png)

「マテリアルズ・インフォマティクス」は、機械学習に加え、物性理論、実験、シミュレーション、データベース、クラウド、セキュリティー・・・など、さまざまな分野の技術により成り立っており、日立の AI 研究者は、お客さまの研究開発現場の DX を実現するため、日々さまざまな技術開発をしています。

日立の AI 研究者が開発した技術が、実際にどのように活用されているのでしょうか。


## 研究開発の現場でお客さまが抱える課題

これまで個々の研究者のスキルや経験に頼ることの多かった研究開発の現場では DX の取り組みに様々な課題がありました。お客さまの課題を例に挙げて、解決に向けた取り組みを紹介します。

## お客さまの課題①：「新製品開発に時間・コストを要していた」

新製品の開発には、大量の実験データを必要とするなど、多くの時間やコストがかかることが課題として挙げられます。

一般に、有機材料開発において MI を適用する場合、エタノール(CH3CH2OH)などの化学式は文字情報であり、AI では簡単に扱うことができませんでした。そこで、化学式から化学的特徴を計算し数値化した「記述子」と呼ばれる特徴量で表し、これらの記述子から材料性能を AI に予測させる方法が取られてきました。ところが、この記述子は化学式に逆変換できないため、要求性能を満たす最適な記述子が分かっても、そこから化学式を特定することは容易ではありません。したがって、有識者が AI の予測性能値をもとに大量に提示された化学式の中から有望と思われるものだけを選別し、それらの候補を実験して材料性能を評価、新材料の化学式を特定する手法がこれまでの主流でした。しかし、いかに精度よく性能を予測できたとしても、そもそも予測対象の化学式を性能とは無関係に用意していたのでは、飛躍的な効率改善は見込めません。


## 解決に向けた取り組み

課題を解決するための取り組みとして、少量の実験データでも高性能材料の化学式を高確率で自動生成するAIを開発しました。開発したAIの特徴を次に説明します。

- 特徴 1：2 つの AI に異なる役割を与えて、学習したあと入れ子型に組み合わせることで、少ない実験データでも高性能材料の化学式を高確率で生み出す仕組み（**入れ子型AI**）。




- 特徴 2：化学式を変換した数値情報に対し、内側の AI が材料性能に寄与する成分を分離・調整する仕組み（**成分の分離・調整AI)**


![0628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685256/50db0bdb-ad9b-95ce-4347-249dedccb9af.jpeg)




## 期待できる効果

開発したAI技術を活用した場合に期待できる効果として次の3点が挙げられます。

- **事前の膨大な実験不要、少量の実験データでも利用可能**
- **人には思いつかない高性能な材料候補を自動生成**
- **実験回数を削減し新材料開発期間を短縮**

開発技術の効果検証として、三井化学の過去の材料開発データ（実験データ）で検証。高性能材料の開発に必要な実験試行回数の削減に効果がありました。

> 三井化学株式会社（以降、「三井化学」）と日立は、日立が開発したAIを活用したMI技術を、実際の新材料開発に適用する実証試験を開始しました。この実証試験に先立ち、日立の開発技術を三井化学が提供した過去の有機材料の材料開発データで検証したところ、高性能な新材料の開発に必要な実験の試行回数が従来のMIと比較し約1/4に削減され開発期間を短縮できることが確認できました。
>
> 引用：[ニュースリリース：2021年6月28日：日立 (hitachi.co.jp)](https://www.hitachi.co.jp/New/cnews/month/2021/06/0628.html)



## お客さまの課題②：「研究者が持つ知識の明文化に時間を要していた。」

研究者が肌感覚で持っているデータ化されていない経験則や知見(=暗黙知)には重要な情報が含まれています。
その知識を共有するためには、明文化が必要ですが、知識の明文化作業には時間を要することが課題となっていました。

## 解決に向けた取り組み

課題を解決するための取り組みとして、研究者の頭の中にある知見の文書化作業を支援するための技術を開発しました。


### 暗黙知の知識化

統合データベース上にある過去データ（実験・シミュレーション結果）の分析に基づき、AI が研究者の頭の中にしかない知見（=暗黙知）を引き出す問いかけや新たな着想の示唆など、知的生産性向上を支援するガイダンスを実施し、研究成果のさまざまな分野での応用やさらなるイノベーションの加速を支援します。
例：AI による自動的なガイダンスに従い、「はい/いいえ」の回答や簡単な穴埋めに回答すると、暗黙知を整理した文案が自動生成される。


![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685256/b394af06-dac4-b1c0-9d52-7d06da5f5a78.png)


## 期待できる効果

- **人財の流動性が高まっても知的財産権を組織に残すための文書作成を効率化(=形式知化)**
- **知識が明文化されることで、研究者・組織間の知識共有を円滑化**



# おわりに

どうでしたか？研究開発DX実現に向けた課題と、それを解決するための技術や取り組みについて少しでも感じていただけたでしょうか？

事例として挙げた詳細については、「[国際ナノテクノロジー総合展・技術会議](https://www.nanotechexpo.jp/main/)」「[材料開発ソリューションWebサイト](https://www.hitachi.co.jp/Prod/comp/app/mi/)」でご覧いただけます。
英語　either

#概要
　Deeplearningの動画を見ていて、自分が感じたこと、そして今後の話・・・
　きっかけになった動画は下記のもの。内容は匿名の論文に対して、Googleの担当者が加担しているのではないかと推測している。動画の中身はさておき、今回は自分の英語能力に関してのお話
（この時点で関係ないと思われたら、時間の無駄なので無視してください）

https://www.youtube.com/watch?v=TrdevFK_am4

#英語の発音
　序文のところを動画の作者が読み上げている(5:40あたり)
```In vision, attention is either applied in conjunction with convolutional networks.```

　少し聞き流してみたが、自分の頭に全く入ってこない。音は聞けるのであるが、どうも文章がしっくり入らない感じになる。試しに文章で読んでみると、中身は結構簡単で一発で頭に入ってきた。
　これはどうしたことなのかと思い、2回目を一文ずつ聞いてみると、```either```の部分を、アイザーと言っているではないか！！
　そら分からんわ！　学校ではイーザーとしか習っていない。そんな単語が入った時点で、俺の脳回路は一気に遮断してしまっている。
#調べたこと
　ネットで調べると、なんとeitherには、イーザー、アイザーの発音があるらしい。
https://eigo.plus/eigohatuon/either

　挙句の果てには、こんなことが書いてある。
```イーザーでもアイザーでも、どちらが正しくてどちらが間違いということはありません。ご自身の覚えやすい方、発音しやすい方を使うと良いでしょう```
　発音チェックすると、USとUKで発音が違っている（やはり英国なまりは曲者である）
https://dictionary.cambridge.org/ja/pronunciation/english/either

　アイザーなんて言われると、アイアイサーと間違えてしまいそうである。
```アイ‐アイ‐サー【aye aye sir】 《米国軍隊などでの上官への返事として》了解。かしこまりました。```
https://www.quicktranslate.com/blog/2014/08/%E3%80%8C%E3%82%A2%E3%82%A4%E3%82%A2%E3%82%A4%E3%82%B5%E3%83%BC%E3%80%8D%E3%81%AE%E8%AA%9E%E6%BA%90%E3%81%A8%E3%81%AF%EF%BC%9F/
#課題感
　こんなことが氷山の一角で、自分が学んでいる英語自体が、かなりうさん臭くなってきた。
今の学校教育も、こんなことを教えていないのであれば、はっきり言ってダメダメである。

#今後の方向性
　ＡＩを活用して、日英の発音の違いを、頻出単語順にソートして、まとめることで、自分の英語能力を大幅に向上できる可能性がある。

#余談
　英語は一応、表音文字ではあるが、その読み方は必ずしも万国共通ではないらしい。そもそも話し言葉は、日本語でも関西と関東で違うので、おそらく外人から言わせれば、同じことだと言われるかもしれないが、そもそも漢字の読み方が、関西と関東で違うことは、そんなには無いだろうとは思うけど
Power BIの地図で場所がずれるときに確認すること

# Power BIの地図で場所がずれるときに確認すること

## はじめに

地図ビジュアルで若干はまったので共有します。

## 地図の位置がおかしい

あるPower BI レポートで地図のビジュアルを利用した際、こんな事象が起きました。

### 「State Province」を場所に設定

このような形で、地図上に売上数量を表現するレポートを作成していました。

![2022-01-28-09-14-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d2c56d90-0d25-510b-5f42-d99f9064553d.png)

このように集計グループ化対象にした州の名称が地図にきちんと解釈されています。

### 「州」に列名を変えて場所に設定したとき

元が英語のサンプルデータなので列名を州と置き換えたところ・・・

![2022-01-28-09-26-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/62ad6f31-c591-d88b-070e-70d8743edf62.png)


表示される場所が変わりおかしな表示になっています。

### 「都道府県」に列名を変えて場所に設定したとき

ためしに都道府県という名称にしてみると、正常な表示に変わりました。
面白い挙動です。

![2022-01-28-09-16-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3b2d6d47-cdbe-e6f1-bd78-a3bcbebbea05.png)


## 対処方法

列のデータカテゴリを適切に設定しましょう。

![2022-01-28-09-17-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/711a5c77-b256-3957-0fb1-9553710674f2.png)


「州または都道府県」に変更します。

![2022-01-28-09-17-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/31fc4bd0-ba56-8494-b22a-653e0abd35e3.png)


列名が州でも適切な表示になりました。

![2022-01-28-09-17-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/36d233a4-c5fb-b292-4443-7d96e71cabf4.png)


## 仕様上の記載

本件は以下の記載があります。

>Power BI Desktop では、データ フィールドに データ カテゴリ を設定しておくと、フィールドを正確にジオコーディングできます。 データ ビューで、目的の列を選択します。 リボンで [モデリング] タブを選択し、 [データ カテゴリ] を [住所] 、 [市区町村] 、 [大陸] 、 [国/地域] 、 [市区郡] 、 [郵便番号] 、 [州] 、または [都道府県] に設定します。 これらのデータのカテゴリは、Bing で日付を正しくエンコードするために役立ちます。 詳細については、「Power BI Desktop でのデータ分類」を参照してください。 SQL Server Analysis Services に接続中の場合、SQL Server Data Tools (SSDT) を使用して Power BI 以外のデータ分類を設定する必要があります。

[データセットで: 基になるデータセットを向上させるためのヒント](https://docs.microsoft.com/ja-jp/power-bi/visuals/power-bi-map-tips-and-tricks#in-the-dataset-tips-to-improve-the-underlying-dataset)

Power BI はいろいろとよしなに解釈して設定してくれる箇所が多いですが、限界はあるので適切に使うためにはこういった仕様を理解することが重要というお話でした。
PHP の DAO とは

## 勉強前イメージ

読むときは正直よくわからんで見てた。
クラスとかまとまってるイメージ？

## 調査

### PHP の DAO とは

Data Access Object の略で、デザインパターンの一種になります。
データベースでアクセスする際のロジックを集約したクラスのことです。
業務ロジックとデータを取得するのを分離するために考えられました。
要するにデータベースへのアクセスはDAOを使用して行われています。

また、DAOのクラスはテーブルごとに作成するようです。
そのためSQLを変更する際はDAO見たら一覧で確認することができますが
複数クラスから参照されている場合影響範囲の調査が難しいところがあります。

## 勉強後イメージ

DAOを変えるだけで変更できるのは楽よね。
DBに接続する際はDAOを書かないといけないのか。

## 参考

- [DAOの悪夢 - PHPでデータベースを扱う(1)](http://blog.tojiru.net/article/273342235.html)
- [【PHP】DAOとはなにか](https://forse.hatenablog.com/entry/2016/02/27/214505)