OmniAICreator/Qiita-1.07M huggingface dataset:
Keener systemでロケットリーグ大会(RLCS)でのレートを求める。

# はじめに
この記事では、レーティングシステムである、Keener's method(Power Rating)を紹介する。
そして、この方法を使ってロケットリーグのレーティングを求めてみる。

（この記事は[Colleyのレーティングシステムについて](https://qiita.com/takenakadx/items/c16d1515a08251dc552f)の続きである。）
# Power Ratingについて
## コンセプト
Power Ratingは次の2つのルールを満たすようなレーティングシステムである。

- あるチームの強さは戦ったチームと相手チームの強さによって決定されるべきである。
- あるチームの強さはそのチームのレートに比例するべきである。

## レートの求め方
### 1.依存統計量を考える
まず初めに、チームiとjが戦った際のどの統計データがチームの強さに依存するかを考える。
ここでは、簡単のためにチームiがチームjから取ったスコアを$ S_{ij} $として、$ S_{ij} $にチームの強さが依存すると仮定する。

### 2.ラプラスの継承の法則を適応する。
ラプラス継承のの法則を適応して、$a_{ij}$を次のように定義する。

``` math
a_{ij} = \frac{S_{ij} + 1 } { S_{ij} + S_{ji} + 2}
```

### 3.必要に応じて、Skewing・Normalizationをかける
必要に応じてこれらを適応する。
- ``Skewing``
one-side gameのような一方的な試合があった場合に次の関数$h(x)$を適応する事でone-side gameの効果を薄めることができる。

``` math
h(x) = \frac{1}{2} + \frac{sgn(x-1/2) \sqrt{|2x - 1 |}}{2}
```

``` math
a_{ij} = h(a_{ij})
```

- ``Normalization``
すべてのチームが同じ試合数を行っていなかった場合に、試合数が多かったチームの強さが過大評価されたりしないようにするために、Normalizationをかける必要がある。

``` math
a_{ij} = \frac{a_{ij}}{n_i}
```

ここで、$n_i$はチームiの試合数である。

注意しなければならないのは、``Skewing``にもNormalizationの効果がある為、Over Normalizationしないように気を付けることである。

## 4.作成した行列から固有方程式を求める。
作成した行列($A = \lbrace a_{ij} \rbrace$)を利用して、次のような固有方程式を立てる。

``` math
A \vec{x} = \lambda \vec{x}
```
ここで、$\vec{x}$はレート、$\lambda$はレートと強さの比例係数である。
## 5.レートを求める。
4.で作成した固有方程式を解いて固有値・固有関数群$\lambda_i,\vec{x}_i$を求める。

さらにこの中で、次を満たすようなものを見つけてくる。

``` math
\lambda \in R_{++}, \lambda \ge | \lambda_i | , \vec{x} > \vec{0}
```

なお、これが存在することは、Perron-Frobenius theoremによって保障されている。

## 6.レートを見やすい形に
5.で見つけたレートにnormalizationをかけ、100分率にする

``` math
\vec{r} = \frac{ \vec{x} }{ \Sigma_i^n x_i} * 100 [\%]
```
# 例題
私の大好きなゲームである[ロケットリーグの世界大会からのデータ](https://liquipedia.net/rocketleague/Rocket_League_Championship_Series/Season_X/Spring/North_America/3)を利用して、レートを求めてみようと思う。

今回用いるのはRLCSのSpring(North America)のグループAのリーグ戦である。

GroupAのRound 1からRound 5までの試合結果からレートを導出すると次のようになった。
|   順位  |  チーム名   |  レート[%]  |
|  -----  | ----------  | --------- |
|    1    |     V1     |   29.037   |
|    2    |    RGE     |   23.575   |
|    3    |    OXG     |   21.617   |
|    4    |     SQ     |   16.482   |
|    5    |    VOLT    |   9.288    |

今回は、normalizationとSkwingの両方をかけてレートを導出した。
# まとめ
今回はKeenerの方法でレートを求めた。
求めたレートは、RLCSのリーグ戦の順位をしっかり、再現していることを確認できた。
OCI 無償セキュリティ機能 保護インスタンスを利用してみた

### 最初に
OCIには無償で利用できるセキュリティサービスが数多くありますが、今回はその中の保護インスタンスを利用してみました。
保護インスタンス機能を使用することでコンピュートのファームウェア・セキュリティを強化して悪意のあるブートレベルのソフトウェアから保護することが可能となります。

### 保護インスタンスで利用されるコンポーネント

|コンポーネント|内容|
|:---|:---|
|セキュアブート|UEFIの機能、PC の起動 (ブート) 時に悪意のあるソフトウェアが読み込まれないように設計されたセキュリティ機能。|
|測定ブート|セキュアブートを補完する機能。最初のブートで測定されたベースラインを基準にチェック。（VMのみ対応でベアメタルを利用できない)|
|TPM(Trusted Palatform Module|デバイス上で様々なセキュリティ機能を提供するためのモジュール。|

### 利用前提
これは利用する中で分かったのですが、全てのインスタンスで利用できるわけではありません。
インスタンス作成画面で盾アイコンがあるものだけが利用可能対象となります。
※仮に保護インスタンス利用可能なインスタンスであっても作成後に有効化することはどうやら不可のようです。作成時に有効化しておく必要があるようです。

### 保護インスタンスの作成
インスタンスの作成画面より、イメージとシェイプの両方に盾アイコンがある組み合わせの場合、拡張オプションより、保護インスタンス機能を有効化できます。
※薄いチェックなのですが、測定ブートを有効化すると他2つも自動的に有効化されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/0e89306d-6012-9522-cc54-048ebdf5f4cf.png)

イメージ(=OS)についてはWindowsOS以外すべて対応しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/bc276725-a467-1d2b-aae8-6380c019c7b9.png)

Shapeは(2022年5月時点では)"専門と前世代"欄にあるIntelのものが対応しておりました。
※Intel,AMD問わず、最新のFlexタイプ(=CPUとメモリをユーザで自由に調整できるもの)が対応していないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/8a80fe8c-7f0e-0035-f61f-db723756de42.png)

インスタンスを作成するとインスタンス名の横に盾マークが表示されます。
起動後の初回は黄色アイコンとなっているので、"保護インスタンス"タブより、"ゴールデン測定のリセット"を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/d39ebda7-dff3-b47b-8b10-51cf223221e2.png)

以下のような盾の中にチェックマークが入ったアイコンになれば正常に保護インスタンスが機能しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/2098fefc-204a-acc0-b14e-c9167176d429.png)

### ベースラインの変更
検証のため、ssh接続にて先ほど作成したインスタンスのカーネルのバージョンアップを実施することで先ほど実施した"ゴールデン測定"のベースラインから外れるように更新してみます。

```
yum update
```

更新完了後にインスタンスを再起動しみると、盾アイコンが赤く状態になることが確認できます。
赤いアイコンは対象インスタンスで、セキュア・ブートまたは測定ブートの検証が失敗したことを示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/a4a66e43-3fcb-777b-965e-477139aa53d6.png)

今回は意図的にカーネルバージョンを上げて、ベースラインから外したので、再度"ゴールデン測定のリセット"を実行し、ベースラインをカーネルのバージョンアップをした状態にしました。
それにより、アイコンが正常に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/61a80390-55f9-1428-07a6-406bf0fd81a5.png)

今回は保護インスタンス機能の動きを確認するため、カーネルのバージョンアップを実施しましたが、こういった作業を実施していないのにも関わらず、赤の異常アイコンになっていた場合は原因追及など実施する必要があるのだと思います。(何かしらの攻撃をされた可能性もあるかもしれません)

### 最後に
現状、保護インスタンスを有効化するためには特定のインスタンス・タイプしか選択できないのが残念ポイントですが、今後のアップデートで対応範囲が広がればと思います。
特に保護インスタンスは設定が非常に簡単なので念のため実装しておいても良いのでは感じました。
OCIは多くのセキュリティ機能があり、それらが無償であることも良い特徴の1つだと思っているので、他の機能についても色々情報収集をしようと思います。
脆弱性スキャンは無償で利用できるかつ、簡単に実装できる機能ですので、興味があれば是非利用してみてください。

>別のセキュリティ機能についても調べてみたので興味のある方はご参照ください。
[OCI 無償セキュリティ機能 脆弱性スキャンを利用してみた](https://qiita.com/kazunishi/items/e7cac07d531d114ce40a)

### 参考
マニュアル：https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/shielded-instances.htm
【BizRobo!】【DA】ComponentにAutomation IDを使用するリスク

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、DAのステップで何かのサイトをクリックするなどのステップを追加した際に、
Componentに自動指定される「Automation ID」について記事にします！
末永く安定稼働させる為には必要な事になりますので、知識の一つとして知っておいて頂ければと思います！

## Tips概要
DAステップを作成した際に、以下の様にComponentへ「Autometion ID = ****」みたいに設定される事があります。
ただし！Autometion IDについては、変更されてしまう可能性があるのです！！
どんな状況でなどの、再現性については把握できていないのですが、
今まで、実務でロボットを作成している際に、最初は問題なく稼働できたのに、
別日で稼働を試していると、うまく進まないという事が発生し、原因を確認するとAutometion IDが変更されていた状況でした。
![ComponentにAutomation IDを使用するリスク①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/2a9afd8d-a880-6f6c-1400-c5992b7a35eb.png)

## Tips詳細
対策は簡単です。
Automation IDで設定されているステップを確認し、
他に設定できそうな属性がないか、画面下記のHTML形式で表示されている部分から探しましょう！
大体は、「name」属性などに、「name=ファイル名」などが記載されているので、
編集[automationId="1043"]➡編集[name="ファイル名"]という感じで置き換えてみましょう！
ステップを進めてみて、通過すればOKです！

## まとめ
今回は、Automation IDでComponentを設定してしまうリスクについて、ご説明しました！
細かい事ですが、忙しい時に急にロボットが止まり、うぅ！ってなるぐらいであれば、
開発時は少し面倒ですが、最初から修正して作成する方が後々、楽だと思いますので、
さぼらず、やってみましょう！！
強化学習re2　Pytorchはインストールされています。

PFRLは、pytorchを使います。
colaborateryには、pytorchがプレインストールされているので、そのまま使えます。gpuも使えます。
早速、試してみます。
```
import torch
print(torch.__version__)
```
1.11.0+cu113

pytorchは、torchと入力します。気を付けましょう。アンダーバーは２つです。
colaborateryには、numpyもpandasもmatplotlibもインストールされています。
また、GPUモードだと、cupyもプレインストールされています。
```
import numpy as np
print(np.__version__)
```
1.21.6
【Salesforce】apex:repeatで表示している項目を取得して値も設定したい

# 問題

apex:repeatで表示している項目を取得して値も設定したい

# 解決策

```HTML:test.page

<apex:includeScript value="jqueryを読み込む" />

<apex:repeat value="{!testList}" var="test">
    <!-- html-data-idを設定する -->
    <apex:inputField value="{!test.test__c}" html-data-id="testid"/>
</apex:repeat>

<!-- 取得用ボタン -->
<button id="button" type="button">
    取得
</button>

<script>
    $('#button').on('click', function() {
        $("表示しているtableなどのID").find("input[data-id='testid']").each(function() {
            $(this).val('なにか設定したかったらここへ');
        });
    });

    // 表示しているtableなどのID = #tableid
    // apex:XXXXなどのtableなら = $Component.tableid
</script>

```

# 参考リンク

[【jQuery】複数の要素に対して繰り返し処理をする（each・for）](https://www.task-notes.com/entry/20140725/1406216933)

[Visualforce コンポーネントのカスタム HTML 属性の設定](https://developer.salesforce.com/docs/atlas.ja-jp.236.0.pages.meta/pages/pages_html_features_pass_through_attributes.htm)

[【jQuery入門】find()で子要素を取得する手法まとめ！](https://www.sejuku.net/blog/37474)
【IBM Application Gateway】リクエストログ/監査ログをJSON形式に変更する

# はじめに
過去の記事で、IBM Cloud Log Analysisに保管された監査ログをうまく検索できなかったため、IBM Application Gatewayのコンテナコンソールに出力されるリクエストログ、監査ログの形式をJSON形式に変更してみました。

過去の記事
- [【IBM Application Gateway】IBM Cloud Log Analysisへリクエストログ/監査ログを出力する](https://qiita.com/fitz/items/2b565454efbfde82faea)
- [【IBM Application Gateway】IBM Cloud Log Analysisからリクエストログをエクスポートする方法について](https://qiita.com/fitz/items/3bfbae98408d4eccb5e1)

# 1.IBM Application Gateway設定変更について

ログのフォーマットを変更するに、[JSON Logging](https://docs.verify.ibm.com/gateway/docs/yaml-logging-json_logging) を参考に設定を追加します。

```
logging:
  request_log:
    format: "%h %u %a %t %m %r %s %b"
  tracing:
    - file_name: /var/iag/trace.log
      component: pdweb.debug
      level: 9
    - file_name: /var/iag/trace.log
      component: pdweb.http.transformation
      level: 5
    - file_name: /var/iag/snoop.log
      component: pdweb.snoop
      level: 9
  transaction:
    file_name: trans.log
    max_file_size: 1024
    max_files: 5
    compress: false
  ###追加###
  json_logging: true
  ########
  components:
    - audit.authn
    - audit.azn
```

# 2.IBM Cloud Log Analysisでのログ出力確認

IBM Cloud Log Analysisで出力結果を確認したところ、リクエストログ、監査ログがJSON形式で出力されました。

![qiita (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/ae291f9e-d5ac-a0de-d7dc-1c978d2ef4e0.png)

リクエストログはINFOレベルで出力されていました。
```
May 25 18:17:47 iag-1-m6xz7 iag INFO {"instant":{"epochSecond":1653470267},"threadId":"0x582e7700","level":"INFO","loggerName":"request-log","content":"172.xxx.xxx.xxx unauthenticated 172.xxx.xxx.xxx  25/May/2022:09:17:47 +0000 GET GET \/home HTTP\/1.1 302 4359"}
```

監査ログはAUDITレベルで出力されました。
```
May 25 18:17:47 iag-1-m6xz7 iag AUDIT {"instant":{"epochSecond":1653470267},"level":"AUDIT","outcome":"0","originator":{"blade":"iag","component":"authn","event_id":"101","location":"iag-1-m6xz7"},"target":{"resource":"7","object":"","url":""},"authntype":"oidc"}
```
レベルで絞り込み表示できます。
```
infoレベルを絞り込み表示
> level:info

auditnfoレベルを絞り込み表示
> level:audit
```
![qiita (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/78b5b121-a268-bb74-8b03-a0366976aecb.png)


# 3.Traceログのフォーマット確認

Trace.logはJSON形式に変換されてはいませんでした。

```
利用したコマンド
> oc get pods
> oc rsh pod名
> cat /var/iag/trace.log
```
![qiita (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/30a4be57-3581-6403-187a-1fc1077f5bda.png)


# 最後に
IBM Application GatewayのログをJSON形式に変更する方法についてご紹介いたしました。
IBM Cloud Log Analysisにログ保管する場合は、JSON形式のほうが検索など利便性が高いと感じました。
Git バージョン管理を始める　Gitの管理下におく

# リポジトリを作る
```
git init
```
.gitというディレクトリができ空のレポジトリを作成する。
そうして.gitを作成する際はプロジェクトのトップのディレクトリでこのコマンドを入力する必要がある。
なのでファイルがないもない状態で```git init```をしてはいけない。
```必ずトップのディクトリを作成した後にgit initを入力```する。

# 何もファイルのない状態からの流れはこうだ。
```
mkdir myProject
cd myProject
git init
```
ファイルを作成、そのファイルに移動、そこで```git init```を入力。

# 演習
1.myProjectという名前のディレクトリを使って、その中にcdし、そこでgit initしてリポジトリを作成しよう。このプロジェクトをmyProjectと呼ぶことにする。
```
*********::@mbp ~ % mkdir myProject
**********@mbp ~ % ls
.
.
.
myProject
*********@mbp ~ % cd myProject
***********@mbp myProject % git init
Initialized empty Git repository in /Users/*********/myProject/.git/
```
これで成功！
2.作られた.gitディレクトリの中にcdして、どんなファイルやディレクトリがあるか見てみよう。
```
***********@mbp myProject % cd .git
***********@mbp .git % ls
HEAD		hooks		refs
config		info
description	objects
```
中身に何もないと思っていたが何かあった。
その中の中身も見たHEAD,config,description以外には中にファイルがあった。
タイポかもしれない。

# ファイルやディレクトリを管理下に入れる
## ファイルやディレクトリをステージに入れる
```
git add ファイル...
git add ディレクトリ...
```
作業ツリーにあるファイル(又はディレクトリ)を```ステージする```

### ```ステージする```とは
チェックインすること
ファイルの今の状態を保存しておきたい時ファイルの内容をバージョン管理システムに入れる行為

仮にREADMEというファイルをステージするには
```
git add README
```
とする。

### ディレクトリをステージする場合
そのディレクトリ以下にある全てのファイルをディレクトリをステージに入れる。

### 空のディレクトリをGitは管理しない
Gitは空のディレクトリを管理しない。
そうしたい場合は、
・そのディレクトリにダミーのファイルを入れる
・.gitignoreファイルを入れてステージする
どちらの場合もファイルの中身は空でいい。

# プロジェクトの全てのファイルとディレクトリをGitの管理下におく
```
git add .
```
既にプロジェクトのファイルやディレクトリが作業ツリーにある場合、作業ツリーのトップでおこなとタイトルのようになる。
ただしこれには欠点がある。
それは余計なものまでGitの管理下に入ってしまう。
## 思ったこと
余計なものまでGitの管理下に入ってしまうのは一体なぜダメなのだろうか？
まぁ余計なものは入ってほしくはないが...

# 演習
以下のような内容を持つファイルREADMEをmyProjectの中に作り、それをgit addでステージしよう。
```
***********@mbp myProject % vim README
***********@mbp myProject % git add README
```
```i```を入力　書き込み
```vim
This is a test project.
```
```esc```を入力　書き込み終了
```:wq```で内容を保存
RubocopでRails/Presence: Useと指摘を受ける

RuboCopで下記の指摘を受けました。

```
Rails/Presence: Use self.カラム名.presence || "hogehoge" instead of self.カラム名.present? ? self.カラム名: "hogehoge".
```
```rb
# 指摘を受けたソース
self.カラム名.present? ? self.カラム名: "hogehoge"
```
どうやら、presentメソッドではなく、
presenceメソッドというものを使いなさいと指摘されているようです。

下記記事によると、
presenceメソッドは、
オブジェクトが存在すればそのオブジェクトを返し、
存在しなければnilを返したい場合にとても便利なショートカット
…とのこと。

https://techracho.bpsinc.jp/hachi8833/2021_02_26/62326

カラムが存在しない場合は、"hogehoge"という文言を返したいので、
下記ソースに修正。
二回カラム名を書く以前のソースよりシンプルになりました。
```rb
self.カラム名.presence || "hogehoge" 
```
Nuxt.jsで無限スクロール

# やりたいこと

* データは10件ずつ取得したい
* 上にスクロールして、表示されているデータより前の10件のデータを取得する
* なくなるまで無限スクロールしたい

# 結論

`vue-infinite-loading`というのがよさそうだったので、これで実装しました。

## vue-infinite-loadingを導入

```
yarn add vue-infinite-loading
```

## 実装する

```js
<template>
  <div>
    <v-list
      v-if="Object.keys(newsList).length > 0"
    >
      <v-list-item
        v-for="(data) in newsList"
        :key="data.id"
      >
        <v-list-item-content>
          {{ data.title }}
        </v-list-item-content>
      </v-list-item>
    </v-list>

    <infinite-loading
      ref="infiniteLoading"
      spinner="bubbles"
      direction="top"
      @infinite="infiniteHandler"
    >
      <div slot="error">エラーが発生しました。</div>
      <div slot="no-more"></div>
      <div slot="no-results"></div>
    </infinite-loading>
  </div>
</template>

import InfiniteLoading from 'vue-infinite-loading'

export default {
  components: {
    InfiniteLoading
  },
　　　　　computed: {
    ...mapGetters('modules/news', [
      'newsList',
      'firstNewsId'
    ])
  },
  infiniteHandler ($state) {
      if (process.client) {
        setTimeout(() => {
          if (Object.keys(this.newsList).length > 0) {
            if (Number(this.firstNewsId) !== Number(Object.keys(this.newsList).slice()[0])) {
              this.$emit('addNews', Object.keys(this.newsList).slice()[0])
              $state.loaded()
            } else {
              $state.complete()
            }
          }
        }, 200)
      }
    }
}
```

そのユーザーに表示されるべきデータを取得し、規定のIDになるまで取得するようにしています。

```js
this.$emit('addNews', Object.keys(this.newsList).slice()[0])
```

で、`addNews`に現在取得済みの一番小さいIDを渡して、APIで前の10件を取得する処理を書いています。

`$state.loaded()`で、取得継続して、
`$state.complete()`で終了。

上にスクロールしたいときは
`direction="top"`
とすると良いらしい。

エラー発生時やこれ以上表示するものがない時のメッセージは↓で設定してやる。

```js
<div slot="error">エラーが発生しました。</div>
<div slot="no-more"></div>
<div slot="no-results"></div>
```

データ取得中のローディングは↓で設定可能。
`spinner="bubbles"`

`process.client`は、documentがundefinedだとエラーが出たので入れています。
【Flutter】pushNamedの画面遷移にアニメーションをつける方法

# はじめに
自分のプロジェクト内で、pushNamedで画面遷移をする際の遷移の仕方（アニメーション）を設定したかったんですが、
通常のNavigator.pushと違い、少しめんどくさく、調べてみてもあんまり説明等が充実していなかったので書きます。
注）この記事はflutterよわよわの私が言っていることで、方法はこれだけではないと思うので、あくまで参考程度にしてください！

そんなやり方しなくてももっといい方法あるよ！

とか

ここはこうしたほうがいいよ！

などのあれば教えていただけると嬉しいです。

# まず一般的なNavigator.pushを使ったアニメーションの実装の仕方が知りたい方

こちらに一般的な画面遷移について詳しく書いてあるのでご覧ください↓

https://www.flutter-study.dev/recipe/transition

自分が今回使う方法で画面遷移のアニメーションをつける方法では一般的なNavigator.pushでの画面遷移でも簡単に実装できるようになる方法だと思っているので、よければ最後まで見ていってくれると嬉しいです。

# pushNamedを使った画面遷移でのアニメーション実装

# ステップ1
`page_transition`というパッケージを使う
https://pub.dev/packages/page_transition/install
こちらからインストールしてあげてください。
# ステップ2
`main.dart`のルーティングの設定のところをいじっていきます。
```dart:main.dart
routes: <String, WidgetBuilder> {
      '/1': (BuildContext context) => page1(),
      '/2': (BuildContext context) => page2(),
      '/3': (BuildContext context) => page3(),
    },

    //ここにアニメーションをつけて画面遷移をさせたい遷移先のページのパスを設定する
    // 今回の場合はpage4()というページに画面遷移させるという想定で処理を書いていきます。
    onGenerateRoute: (settings) {
        switch (settings.name) {
          case '/4_animation':  //遷移先のページのパスを指定
            return PageTransition(
              child: page4(),  //遷移先のページ指定
              duration: Duration(milliseconds: 150), //遷移スピード
              reverseDuration: Duration(milliseconds: 150), //帰ってくる際の遷移スピード
              type: PageTransitionType.bottomToTop, //遷移のアニメーションの仕方（今回は下から上）
              settings: settings,
            );
          default:
            return null;
        }
      },

    home: page1(),
```
コードの内容としては'/4_animation'というパスのケースではアニメーションの設定がしてある`PageTransition`を返すようにしています。
1番大事なアニメーションの仕方の指定は`type:`で指定でき、今回は下から上の画面遷移（bottomToTop）にしています。遷移のtypeについては
fade
rightToLeft
leftToRight
topToBottom
bottomToTop
scale (with alignment)
rotate (with alignment)
size (with alignment)
rightToLeftWithFade,
leftToRightWithFade,
leftToRightJoined,
rightToLeftJoined,

があります。詳しくは[こちら](https://pub.dev/packages/page_transition)をみてみてください。

# ステップ3

画面遷移の処理を書く

```dart:animation_example.dart
Navigator.pushNamed(
              context, 
              '/4_animation', //遷移したいページのパスを指定する
             // argumentsで次の画面に値を渡す場合
              arguments: Arguments(...),
            );
```

これでアニメーションをつけて画面遷移することができるようになります！
参考になれば幸いです。

# 最後に

pushNamedの画面遷移だけじゃなくて、一般的なpushでも簡単にアニメーションを実装することができるのでぜひ使ってみてください

今回使用したパッケージ
https://pub.dev/packages/page_transition

参考にした記事等↓
https://stackoverflow.com/questions/53670706/flutter-navigator-pushnamed-custom-route-animation

https://www.youtube.com/watch?v=_R3E_aof69c&t=202s
discord.py(2.0.0) 備忘録

discord.pyであれこれしたい時のためのものと自分が探すのが時間かかったものとか。
今後も何かあったら更新します。
# 2.0.0での新機能
## スラッシュコマンドを作る
```py
import discord
from discord import app_commands
from discord.ext import tasks
guild=discord.Object(#サーバーid)
client=discord.Client(intents=discord.Intents.default())#intentsは確か必須になりました。
tree=app_commands.CommandTree(client)
@client.event
async def on_ready():
  await tree.sync(guild=guild)
  loop.start()
@tree.command(guild=guild)
async def test(i):
  await i.response.send_message("a")
```
discord.ext.commands.Bot()を使っている場合、
`tree=client.tree`とすれば良い。
## text_input
```py
import discord
from discord import app_commands
from discord.ui import Modal, View, text_input
from discord.ext import tasks

intents = discord.Intents.default()
client = discord.Client(intents=intents)

tree = app_commands.CommandTree(client)


TEST_GUILD = discord.Object(#here your guild_id)


@client.event
async def on_ready():
    print(f'Logged in as {client.user} (ID: {client.user.id})')
    print('------')
    loop.start()
    await tree.sync(guild=TEST_GUILD)

class M(Modal):
    a = text_input.TextInput(label='a', placeholder='a', max_length=20, required=True)
    b = text_input.TextInput(label='b', style=discord.TextStyle.paragraph, required=True)

    def __init__(self):
        super().__init__(title='Test')

    async def on_submit(self, interaction:discord.Interaction):
        await interaction.response.send_message(f'{interaction.user}\n{self.a.value}\n{self.b.value}')

@tree.command(guild=TEST_GUILD, description="test")
async def test(interaction: discord.Interaction):
    await interaction.response.send_modal(M())
```
# 既存のもの
## コマンドのエラーを受け取る
```py
@client.event
async def on_command_error(ctx,e):
  cmd=ctx.invoked_with#呼び出されたコマンド
  if isinstance(e,discord.ext.commands.CommandNotFound):
    await ctx.send("コマンドが見つかりませんでした")
```
## メッセージの画像を取得
```py
#…on_messageなど
    attachments=message.attachments
    for attachment in attachments:
      await attachment.save(f"{i}.{attachment.filename.split(".")[-1]}")
```
## メッセージの返信先
`discord.Message.reference`は`discord.ReferenceMessage`を返すので注意。
`discord.Message`は返しません。
`ReferenceMessage.resolved`で`Message`に。
```py
#…on_messageなど
ref=message.reference
message=ref.resolved
#……
```
【BizRobo!】月末の日付を抽出する

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、月末の日付を抽出する方法について記事にします！
ロボットで使用する為の、営業日カレンダーデータベースなどを独自で作成していれば、
必要ないステップではあるのですが、データベースがなく月末にロボットを稼働させたいといった要件が来た場合、ロボット上で月末の日にちを抽出する必要があります。

そういった場合に、参考になれば幸いです。


## Tips概要
月末の日にちを出す方法は、言われてみれば！みたいな方法なのですが、
ロボットが稼働した月の「翌月1日」をステップで抽出します。
そこから、1日マイナスするだけです！
では、以下で説明していきます。


## Tips詳細
まずは、月末の日にちを格納する変数を作成します。
![月末を抽出する①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/4ba34285-be56-66f1-d7f5-8d66ea5b5a88.png)

次に、「変数の割り当て」ステップを作成し、値の部分を「コンバーター」に変更します。
![月末を抽出する②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/b6542ec5-a8de-01bf-a4ca-a89dcb27c93e.png)

コンバーターにて以下の設定を追加します。
![月末を抽出する③.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/f14e9692-9c32-0902-59ea-750139859753.png)

##### ▼評価：now()
➡エクスプレッションで現在の日付を抽出します。
![月末を抽出する④.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/d4de7409-2e55-81f4-f7b2-e02e63b651d7.png)

##### ▼Add 1 month
➡上記で抽出した現在の日付から1ヶ月プラスします。
![月末を抽出する⑤.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/1a1140e8-3a39-59af-0556-f8ef0c564796.png)

##### ▼日付の書式設定 yyyy-MM-01 HH：mm：ss]
➡日付の書式設定でプラスした月の1日を抽出します。
　(「HH：mm：ss」まで書式設定しておかないと、次の手順で実施するマイナス1日が出来ません)
![月末を抽出する⑥.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/8ed6272a-43d4-6a1d-ecf3-e482c657cae8.png)

##### ▼Suctract 1 day
➡上記で抽出した日付から1日マイナスし、月末を抽出します。
![月末を抽出する⑦.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/83953ef5-321b-9113-b9e1-9ec27dd42519.png)

抽出された日付を変数に格納すれば、月末の日付を使用する事が出来ます。

## まとめ
今回は、月末の日付を抽出する方法について記事にしました。
そこまで頻繁に使用する内容ではないのですが、
ロボット要件によっては、使用する可能性はあると思いますので、役に立てれば幸いです！
VBA_04_Dictionary_Exists_Worksheet_Cells_Sample

Keyword
---
Dictionary
Exists
Worksheet
Cells

Sample Code
---
```vb:20220526
Public Sub MySample20220526()

    Dim mySheet As Worksheet
    Dim myDicList As New Dictionary
    Dim i As Long
    Dim myStrFileName As String: Dim myStrFileSize As String
    Dim myStrKeyword1 As String: Dim myStrKeyword2 As String
    
    myStrKeyword1 = "SecretNote.xlsx"
    myStrKeyword2 = "DeathNote.xlsx"
    
    Set mySheet = ThisWorkbook.ActiveSheet
    
    For i = 3 To 14
        
        With mySheet
            myStrFileName = .Cells(i, "C").Value
            myStrFileSize = .Cells(i, "E").Value
        End With
        
        If Not myDicList.Exists(myStrFileName) Then
            myDicList.Add myStrFileName, myStrFileSize
            
        End If
        
    Next i
    
    If myDicList.Exists(myStrKeyword1) Then
        MsgBox myStrKeyword1 & vbCrLf & _
                myDicList.Item(myStrKeyword1)
    End If
    
    If Not myDicList.Exists(myStrKeyword2) Then
        MsgBox myStrKeyword2 & "は存在しません"
    End If

End Sub
```

Sample Data
---
![無題4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672288/a8894a90-d072-ff39-de20-861a6e85a31e.jpeg)
平均寿命を予測するのに適した曲線は？ ～JMPの「曲線のあてはめ」を利用して～

増川 直裕

**■今後の平均寿命を予測するには**
下のグラフは、男性、女性別に平均寿命を示したものです。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/d1b6b16f-ad51-202a-360c-a756a8f86539.png)
データの出典
[**図表1-2-1　平均寿命の推移｜令和２年版厚生労働白書－令和時代の社会保障と働き方を考える－｜厚生労働省 (mhlw.go.jp)**](https://www.mhlw.go.jp/stf/wp/hakusyo/kousei/19/backdata/01-01-02-01.html)

平均寿命は、男性、女性とも年ごとに上昇しており、2019年では、女性87.45歳、男性81.41歳となっています。

これをもとに本ブログでは、<font color="Red">年と平均寿命の関係を示すモデルをあてはめ、今後の平均寿命を予測することを考えてみます。</font>

プロットされている点を眺めてみると、直線的に増加しているというよりは、曲線的に増加している印象を受けます。そのため曲線のモデルをあてはめるのが良さそうですが、どのような曲線をあてはめるのが良いでしょうか？

世の中には、曲線的に変化していく現象が多くみられますが、それらの曲線的現象は非線形な理論式で説明できることがあります。このように理論式が分かっている場合は、その式をデータにあてはめれば良いのですが、理論式が分からないときは、<font color="Red">データに考えられる曲線をいろいろあてはめてみて、あてはまりの様子を考察するのが良いでしょう。</font>

**■平均寿命データに、さまざまな曲線をあてはめ**
JMPでは、「**曲線のあてはめ**」という機能があり、JMPで用意しているさまざまな曲線をあてはめ、あてはまりの良さを比較できます。

以下が、あてはめられるモデルの一覧です。ここでは、上記の平均寿命データに、ロジスティック3P, 4P、 Gompertz 3P, 4P の4つのモデルを同時にあてはめてみます。（3Pや4Pは、それぞれ推定するパラメータの数が3つ、4つであることを示しています。）
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/110b6dab-2699-984a-e6e3-1e6d72573f13.png)
あてはめることができるモデルの詳細（グラフ、式など）は、JMPのマニュアルに掲載しています。
[**「曲線のあてはめ」プラットフォームの統計的詳細 (jmp.com)**](https://www.jmp.com/support/help/ja/16.2/?os=win&source=application#page/jmp/model-formulas.shtml#)

**■モデルの比較**
4つのモデルがあてはめられると、次のように「モデルの比較」のレポートが表示されます。
![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/40840136-fdb2-ae48-1843-eb7cade14983.png)
このレポートでは、適合度統計量としてAICc　（小さい標本サイズのときを考慮してAICを調整した統計量）が小さい順に上から下へとモデルが並べられています。AICcは値が小さい方があてはまりが良いと解釈するので、上にあるモデルほどあてはまりが良いことになります。この例では、Gompertz 3P モデルが、他の3つのモデルと比較して、最も良いモデルということになります。

そのため、「Gompertz 3P」のレポートを参照すると、モデル式や、パラメータ推定値、プロット点にモデルをあてはめたグラフなどが表示されます。グラフを参照すると、女性（赤色）、男性（青色）ともに、データに良くあてはまっていることがわかります。
![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/931cb4ad-b06e-1e9d-1f21-b2ef874dfe40.png)
ここであてはめた Gompertz 3Pは、3つのパラメータをもつ”ゴンペルツ曲線”という曲線です。<font color="Red">ゴンペルツ曲線は、成長曲線ともいわれ、最初の時点では増加率が高く、後の方の時点になると増加率が減少していく現象を表すときに用いられる曲線です。</font>今回取り上げた寿命のデータも、1990年あたりまでは平均寿命がどんどん上昇していき、それ以降は若干鈍化しており、今後の伸びはさらに鈍化すると予想されるので、ゴンペルツ曲線が示す特性に合っているともいえるでしょう。

**■将来の平均寿命を予測**
このあてはめた曲線をもとに、2040年の女性、男性の平均寿命を予測してみます。

JMPでは、予測プロファイルを用いて、横軸の年を”2040”に、性別を”女性”、”男性”に設定すると、2040年における性別ごとの平均寿命の予測値が表示されます。
![pic5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/fe21bf36-a067-54ea-87b9-53030c900150.png)
Gompertz　3Pモデルを用いた2040年の平均寿命は、女性89.85歳、男性83.48歳です。この予測値は、先に示した厚生労働省のページに記載されている2040年における将来推計にある女性89.63歳、男性83.27歳と近い値になっています。

男性、女性とも、およそ20年後には、平均寿命は2歳ほど伸びることが予想されるのです。それは人類の進歩なのかもしれませんが、出生率が急激に増加しない限り、さらなる高齢化が進むことになりそうです。

**■JMPについて**
JMP（ジャンプ）は世界中のエンジニア、データアナリストに選ばれているインタラクティブで可視的なデータ分析ツールです。
Capybaraで非表示要素がdisabledであることを確認するテストでハマりました。

# 概要
タイトル通り、Capybaraで、hogeという非表示要素がdisabledであることを確認するテストではまりました。


(1)```expect(page).to have_field '#hoge', disabled: true```と書いた場合は、そもそもlocatorに```#hoge```と書いたのが原因でテストが落ちたぽい。

```
     Failure/Error: expect(page).to have_field '#hoge', disabled: true

       expected to find field "#hoge"
       Note: It appears you may be passing a CSS selector or XPath expression rather than a locator. Please see the documentation for acceptable locator values.

        but there were no matches
```

(2)```expect(page).to have_field 'hoge', disabled: true```と書いた場合は、hogeというvisibleな要素を探したけど見つからなかったというエラーになったので、もしかしてこのhogeというのは非表示要素なのかも？とここで気づく

```
     Failure/Error: expect(page).to have_field 'hoge', disabled: true
       expected to find visible field "hoge" but there were no matches. Also found "", which matched the selector but not all filters.
```

(3)```expect(find('#hoge', visible: false)).to be_disabled```と修正する。

hogeという非表示要素を探してから、その要素がdisabledであることを確認したらテストが通った。

## 参考にした記事
[非表示要素はCapybaraのfindで検索対象になるのか](https://qiita.com/upinetree/items/4d4022c90ce32b68c38d)


[使えるRSpec入門・その4「どんなブラウザ操作も自由自在！逆引きCapybara大辞典」](https://qiita.com/jnchito/items/607f956263c38a5fec24)

ありがとうございました😊
Noto Sansって何？

前回の投稿から2年以上間隔が空いてしまった。

プライベートで動画編集作業やら、業務でもバタバタしていたというのが理由ですが、

もやもやをすっきりさせるため、なんでも良いから週1で記事を書く癖をつけよう…。

そういえば、最近企画的な仕事でフォントにこだわる人が増えている…。

私も、色々注文されることが多い、Noto sansフォントについて備忘録を書いておこう。

# Noto Sansについて
すべての道はWikiPediaに通じる。とのことで、まずはWikiPediaでしらべる。

https://ja.wikipedia.org/wiki/Noto

Google が開発したフォントで、豆腐（白い□）を無くす事（No tofu）という意味で

Notoとしたらしい。

なるほど。

Noto Sans CJKは、Chinese Japanese Koreaの頭文字をとってつけられたもので、読んで字のごとく、中国語、日本語、韓国語を担っているフォントだとの事。

# Google Font
Googleのフォントについては、下記のURLで色々表示を確認できるみたい。

https://fonts.google.com/


---
色々業務で行き詰っているので、業務時間中にさぼってみました。

もっと記載したい内容があるのですが、それは又別の機会に。
mac zip作成 パスワード付き

# 背景
自端末がmacOSであり、たまに仕事柄パスワードをつけてzipファイルをやりとりすることがある。
しかし、その場しのぎで対応していたため、毎回調べ物で同じミスをして、同じ修正をしていたため、非効率と感じ、記事化することにした。
# 目的
macでパスワード付きzipを作成する。
# 事象
「ただパスワード付きzipコマンド打てば、できるんでしょ？」
そう思った方いらっしゃると思います。
実は、そのままだとうまくパスワード付き圧縮ができないパターンがあります。
## パスワード付き圧縮ができないパターン
・Finder上でファイルを圧縮して、そのファイルに対してzipcloakコマンドを使ってパスワードを付与した場合
この場合、圧縮は成功。しかし、受取手がパスワード解凍する際にうまく開けないという事象が起きます。
# 圧縮コマンド実行
下記のどちらかで圧縮した場合、成功します。
```java:パスワード付き圧縮コマンド
zip -e -r encrypt.zip /Users/[ユーザー名]/Downloads/sample //コマンド実行時のパスと圧縮したいディレクトリが別の階層にある場合
zip -e -r encrypt.zip sample //コマンド実行時のパスと圧縮したいディレクトリが同じ階層にある場合
```
`オプションの解説`
`-e :暗号化する`
`-r :ディレクトリ内のファイルを再帰的に扱う`

注意点：
ただ、/Users/[ユーザー名]/Downloads/sampleというディレクトリ構造をそのまま保った状態で
zip化されてしまう。

下記で実行すると、sample/test.txtというディレクトリ構造で圧縮ができます。
今回は/Users/[ユーザー名]/Downloads/というフォルダは不要だったので、こちらで対応しました。
```java:ディレクトリ指定でパスワード付き圧縮
zip -e -r encrypt.zip sample/ -i sample/test.txt
```


# 参考

https://i-tsunagu.com/mac/zip-encrypt/

https://oki2a24.com/2013/09/16/zip-specified-files-while-maintaining-directory-structure/

https://hikari-blog.com/mac-command-zip-password/

https://atmarkit.itmedia.co.jp/ait/articles/1607/25/news021.html
access2000の作法 その2

# 概要
access2000の作法、調べてみた。
formを作って、menuとする。

# フォームを作る手順。

- 作成>フォームデザインを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド0_Click()
  msgbox "ok"
End Sub
```

- フォーム１を閉じる
- 保存する
- menuで保存
- フォームを表示
- セキュリティの警告、コンテンツを有効をクリック
- menuをダブルクリック
- コマンド０をクリック
- okが表示される

# access起動時、menuが開くようにする手順

- Accessのオプション画面を開き、「現在のデータベース」を選択します。
- Access起動時に開くフォームを指定するため、「フォームの表示」に「menu」を設定します。




以上。
強化学習re１　書き直しはcolaboratery

3年前に書いた記事の大部分は動かず、新たに書いた方がいいので、全面的に書き直します。
これは、強化学習初心者で、ある程度のプログラミングの知識とPythonに習熟している人向けです。

# 2019年以降に起きた変化
 一番大きな変化は、Preferred Networksがchainerの開発を止めたことです。これに伴い、chainerRLも更新されなくなりました。
　chainerRLはPFRLとして復活しました。こちらを使います。
https://github.com/pfnet/pfrl
releaseを見ると、2020年7月にv0.1.0を公開しています。
中身は、、、chainerがpytorchになったくらいで、ほぼ同じ形式のようです。今後、詳しくチェックします。

次の大きな変化は、Colaborateryの有償化と利便性向上です。
月額1072円で、最長24時間の連続使用も可能になり、メモリーも大幅にアップ。GPUもかなりレベルアップしました。へなちょこ機械学習ならば、自分でGPU組むのがあほらしくなります。

最後に機械学習の大きなトレンドは、自然言語処理のtransformerに移っています。BERTの登場は、飛躍的に言語処理の精度を向上させました。強化学習のトレンドは弱いです。

# reでやること
　colaboratery+OpenAI+PFRLで、もう一度やり直そうと思います。chokozainerRLでやったようなことはしないかもしれません。

# colaboratery　proの現況チェック
　無償版の方は、同じようにチェックしてください。(2022年5月26日) 
```
import sys
print(sys.version)
```
3.7.13 (default, Apr 24 2022, 01:04:09) 

```
import gym
```
gymはインポートできます。

pfrlはimportできるでしょうか？
```
import pfrl
```
できないので、pip　installします。

```
!pip install pfrl
import pfrl
```
これで、とりあえずの準備はできました。
動的なWebデザインを無料で学ぶ方法(恐らく2024年まで使える)

## はじめに
最近、Webデザインの勉強をしています。勉強方法は、本を読んだり、オンラインの学習サイトで写経したりすることです。今はある程度、HTMLやCSSが書けるようになって、動くデザインを勉強中です！
今回は勉強している中で、[**動くWebデザインアイデア帳**](https://coco-factory.jp/ugokuweb/)というおすすめサイトに出会い、是非ご紹介したいので記事を執筆します。

+ **動くWebデザインアイデア帳でできるようになること**
    + プルダウンメニュー、ローディング
    + スライドショー、検索
    + などなど**19種類以上のWebデザイン**が学べる
## おすすめのWebサイトとその理由
[**動くWebデザインアイデア帳**](https://coco-factory.jp/ugokuweb/)というサイトです！
↑↑↑
（クリックしてくれたら、公式サイトにとびます）
+ おすすめする理由は3つ
    + 1つ目：**よく見る機能やデザイン**がたくさん説明されている
        + ローディング、画面遷移、スライドショーなど19種類
        + 応用も含めれば、その倍以上はある
    + 2つ目：**サンプルコード**が用意されている
        + HTML, CSS, JavaScriptすべてのコードが見れる
        + **コードの中に日本語コメント**があり、コードが読みやすい
    + 3つ目：**説明がわかりやすい**
        + 作り方のステップが解説されている
        + 書籍があるので、そちらも参考にできる（ただし有料かつ優良）
## 注意点：2024年までかもしれない...
公式サイトによれば、

>【コード使用に関しての注意とお願い】
>動くWebデザインアイデア帳のサイトは、書籍に明記している通り「3年間の期限付き」です。
（※書籍の売れ行き次第で変わります。）

とあります。書籍が発売されたのが2021年2月27日と7月31日なので恐らく**期限が2024年7月いっぱいまでだと思われます**。なので、期限があるということに注意して使ってください！

最後まで見てくださりありがとうございます。少しでもお役に立てていれば幸いです。
もし誤りや質問があったら気軽にご指摘をいただければ。
## 参考文献
[動くWebデザインアイデア帳](https://coco-factory.jp/ugokuweb/)
access2000の作法

# 概要

access2000の作法、調べてみた。
まずは、mdbを作る。

# 環境

windows 10 64bit
access 2007

# mdbを作る手順

- 作成で空のデータベースをdatabase1で保存する。
- データベースに名前を付けて保存で、Access 2000 データベースと互換性のある形式で保存します。


以上。
ChromebookにKiCAD6.0.4 を入れてみた

# 概要
ChromebookにKiCADを入れるには、設定>デベロッパー>Linux開発環境でLinux開発環境をONにし、`sudo apt install kicad` で入れることができたが、バージョン5.1.9のものしか使えなかった。
そこで、Debianのバックポートパッケージを使用することでバージョン6.0.4を導入できそうだったので、やってみた。

# 環境
ハードウェア:ASUS Chromebook Detachable CM3 (CM3000)
OS:ChromeOS ver:100.0.4896.133
Linux開発環境のバージョン(debian) 11.3

# ChromebookのLinux開発環境をONにする。
Googleの公式サポートにやり方が載っているので、割愛する。
[Chromebook で Linux をセットアップする-Google Support](https://support.google.com/chromebook/answer/9145439?hl=ja)

# Debianのバックポートパッケージを導入する
Debianのバックポートパッケージを導入するために、まずはaptのソースリストにバックポートパッケージを追加する。

```
sudo nano /etc/apt/sources.list
```

ここで、コマンドnanoが見つかりません的なエラーが出た場合、テキストエディタnanoが入っていないので、`sudo apt install nano`でnanoを導入する。(いちおうChromebookのLinux環境には標準でvimというテキストエディタが入っているが、私は操作に慣れていないのでnanoを使用する。)

sources.listが開いたら、一番下に以下の記述を追加する。
```
deb https://deb.debian.org/debian bullseye-backports main contrib non-free
```
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386155/c9a0b83d-baf9-dfec-88f5-9fa7c09c5066.png)

追加できたら、Ctrl+OしてEnterを押して保存したあと、Ctrl+Xで閉じる。

次に、aptをアップデートする。ターミナルに次の記述を追加する。
```
sudo apt update
```

アップデートの後、アップグレードを行う。

```
sudo apt -t bullseye-backports upgrade
```

これでdebianのバックポートパッケージが使えるようになった。

# KiCADをインストールする。
バックポートを使う関係で、通常のコマンドとは少し違うコマンドで導入する。
```
sudo apt install -t bullseye-backports kicad
```

これでkicad6.0.4がインストールされた。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386155/1b621b9a-d81e-6769-4eb4-ad12b0693719.png)

# 使ってみた感想
私の環境では重いと感じた。また、部品検索時の検索ボックスに文字が表示されないなど、不具合もあった。
安定性を求めるならkicad5.1.9のほうがいいのかもしれない。
【Salesforce】バーコードスキャナーで読み込んだバーコードから検索したい

# 問題
バーコードスキャナーで読み込んだバーコードから検索したい

# 解決策

```HTML:test.page

<!-- ここに読み込んだバーコードを入れる -->
<!-- onkeypressの場合、「ひらがな」入力だと動かない -->
<apex:inputText value="{!barcode}" onkeydown="return handlerEnterKeyPress(event, '{!$Component.検索ボタンのID}')" />

<!-- 検索ボタン -->
<apex:commandButton id="検索ボタンのID" action="{!Apexの処理}" value="検索"/>

```

```javascript:test.js

function handlerEnterKeyPress(e, buttonId){
    
    // e.codeに分別できる値が入っている
    // キービードからEnterを押下した場合は"Enter"
    // 読み込み後、Enter起動のバーコードスキャナーが読み込んだ場合は"NumpadEnter"
    if(e.code == "Enter" || e.code == "NumpadEnter"){
        // 検索ボタンを押下して、バーコードからレコードを取得する
        document.getElementById(buttonId).click();
        return false;
    }
    // 他の入力は処理を行わない
    // 例えば、KeyAやKeyWなど
    return true;
}

```

# 参考リンク

[onkeydown属性 onkeypress属性 onkeyup属性](https://w3g.jp/xhtml/dic/onkeydown)

[押したキーのキーコードを取得](https://shanabrian.com/web/javascript/keycode.php)
win11WSLのUbuntuがストアに2つある件について

## ストアにて

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/7102ea7c-7f92-8de6-e44c-75f823c2a448.png)

これと

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/4095b4df-8298-0092-c1d2-859550227a2d.png)

これ。

## 実際に両方入れてみた

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/1006908a-6a91-047d-d706-8bf8bb6017dd.png)


ペンギンマークじゃないほうはデフォルトでUbuntuっぽい配色

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/39942c3d-d10d-d9e1-4ca1-a81f73bc08bd.png)

## HOMEまでおなじ

中身は全く同じと思われる。

## 結論

なんなんだこれ？
TextFieldで数字,英語,記号だけを入力させたい時

# 内容
アカウント登録などのフォームを制作する際に、メールアドレス、パスワードなどの
TextFieldに、入力できる値を制限したい場面を想定しています。

# 方法
### 数字のみ
数字のみは**inputFormatters**で用意されていて、以下の記述を足すことで簡単に設定ができます。
```Dart
TextField(
    keyboardType: TextInputType.number,
    inputFormatters: [FilteringTextInputFormatter.digitsOnly]
)
```

### 英字,記号など
**FilteringTextInputFormatter.allow()** : 一致するものを許可
**FilteringTextInputFormatter.deny()**  : 一致しないものを許可

```Dart
inputFormatters: [
    FilteringTextInputFormatter.allow(
    RegExp(r'[a-zA-Z0-9@_-.]')),
],
```
FilteringTextInputFormatter.allow()で正規表現を利用します。
以下では数字、小文字,大文字の英数
アットマーク、アンダーバー、ハイフン、ピリオドを対応させています。
繋げて書いて反映されるので**空白**や**カンマ**などの区切りを間違えて入れないようにしましょう。

Dartにおける正規表現の詳細はこちら ↓
[Flutterで正規表現を用いたemailのvalidationを実装](https://www.kamo-it.org/blog/regular_expression/)

## 任意の処理を持たせたい時
一致しない入力にエラーを表示させたい場合などは**TextInputFormatter.withFunction**を
用いることで任意の処理を持たせることができます。
```Dart
TextInputFormatter.withFunction((oldValue, newValue) =>
 RegExp(r’^[a-zA-Z0–9]+’).hasMatch(newValue.text) ? newValue : oldValue)
```

## 参考リンク
[TextFieldで入力文字を制限したい](https://medium.com/@kichiemon/textfield%E3%81%A7%E5%85%A5%E5%8A%9B%E5%86%85%E5%AE%B9%E3%82%92%E5%88%B6%E9%99%90%E3%81%97%E3%81%9F%E3%81%84-flutter-b70e51538e77)
URI.encodeでundefined method 'gsub' for nil:NilClass

# この記事のまとめ

- `URI.encode`メソッドの引数にnil渡すと`undefined method 'gsub' for nil:NilClass` エラーが出る
- `URI.encode`ではnil避けがされない
- `URI.encode`自体が非推奨なので`URI.encode_www_form_component`を使おう

# 実際に起こった問題

- `URI.encode`メソッドで、URLをエンコーディングしようとした
- しかし500エラーが発生した。
- スタックトレース見ると、`undefined method 'gsub' for nil:NilClass` が出ていた

該当コード：

```ruby
url = post.url
post.url #nil 

URI.encode(post.url)　#undefined method 'gsub' for nil:NilClass
```

# 対応

- `URI.encode_www_from_component`を代わりに使おう
   - 実は`URI.encode`自体もう使うなと言われているらしい。
      - https://qiita.com/jnchito/items/dc9285884b2349833fad 
   - `URI.encode_www_form_component`を使う場合は、nil入れてもnilが返ってくる

```ruby 
URI.encode(nil) # => NoMethodError: undefined method `gsub' for nil:NilClass
URI.encode_www_form_component(nil) # => ""
```

- 何かしらの諸事情でURI.encodeを使う場合、nilよけして使うしかないかも。
【Shopify】商品発売予告アプリ「Coming soon」で実現できたこと

# はじめに
本記事は Shopify アプリである「商品ページ発売予告アプリ｜リテリア Coming soon」を使用して実現できたことを記したものです。使用してみた感想としては、**「Shopify において発売前の商品をアピールしたい場合には利用する価値あり」** と思いました。以下に詳細を記します。

なお、本記事は以下のアプリの解説記事になります。

https://apps.shopify.com/shopify-application-314?locale=ja&from=qiita

# このアプリで実現できたこと
**発売前の商品を宣伝できる画面を作成**できました。
左がアプリを使用した画面です。
![使用イメージ](https://i.gyazo.com/a1e561b18da37c76fa6f747d901d2083.png)
発売前の商品ではありますが、

* **発売予定日時**
* **発売までのカウントダウン**
* **発売までのカートボタン**
* **商品説明**

の4つを表示することができました。
Shopify 公式にはこのような Coming Soon 機能が無いため、これらの機能を利用することで、発売前であっても**商品をより効果的に宣伝できる**ことが期待されます。
以下、各機能でカスタマイズできたことを紹介します。

## 発売予定日時

表示する文章を変更できました。

(例 1)
![発売予定日時1](https://storage.googleapis.com/zenn-user-upload/c4400954ddc5-20220516.png)
(例 2)
![発売予定日時2](https://storage.googleapis.com/zenn-user-upload/72cbbd5e4423-20220516.png)
日時や曜日は以下のフォーマットから選択できました。

【日時】

* `2022年1月1日`
* `2022/1/1`
* `1月1日`
* `1/1`

【曜日】
* `（日）`
* `日曜日`
* `日`
* `Sun`
* `Sunday`

## 発売までのカウントダウン
表示する文章を変更できました。

(例 1)
![カウントダウン1](https://i.gyazo.com/8cdf650e4ef045d3ffd0254db90504c5.gif)
(例 2)
![カウントダウン2](https://i.gyazo.com/99cf29a84224c277bcf2ebf359d224ce.gif)

## 発売までのカートボタン
カートボタン内のテキストおよびサイズを変更することができました。
また、色も自由に変更できました。
サイトの雰囲気に合わせて好きな色が選べるのは嬉しいですよね。
![カートボタン](https://storage.googleapis.com/zenn-user-upload/971468fde928-20220516.png)

## 商品説明
発売前の商品に説明文を追加できました。
画像だけでは伝えきれないアピールポイントを記載するのに便利です。

# 終わりに
以上、「商品ページ発売予告アプリ｜リテリア Coming soon」を使用して実現できたことを紹介しました。
アプリ各機能の詳細な設定方法は「はじめに」に貼ってあるリンクから確認することができます。より詳しく知りたい方はそちらを参照してください。
また、アプリに興味のある方は、以下のURLから覗きに行ってみてください。
それでは、ここまでお付き合いいただきありがとうございました。

https://apps.shopify.com/shopify-application-314?locale=ja&from=qiita
【未経験からエンジニア】プログラミングスクールは意味あるのか？


私は建設業から開発エンジニアへ転職しました。
転職のために利用したプログラミングスクールについて、皆さんに共有したいと思います。
今後、ITエンジニアへの転職を考えている方は是非読んでいってください。

大前提として
<strong>プログラミングスクールは転職活動で使うポートフォリオのために利用します。</strong>
プログラミングを１から教わりたいという方は大損しますので気をつけてください！！

# 結論

いきなりですが結論です。
プログラミングスクールは転職に<strong>有効です！</strong>
ただし、<strong>料金が高額なスクールは避けましょう</strong>

私自身、プログラミングスクールに70万円払いました。後悔しています。


## プログラミングスクールの利点は？
- プロに自分の作ったプログラムを評価してもらえる
- 幅広い情報を取り入れられる
- 競争相手がいるためモチベーション維持に繋がる

この三つのみです。


#### プロに自分の作ったプログラムを評価してもらえる
プログラミングスクールに通う最大の利点です。
独学だとどうしても意識しずらい基本（コードのインデント、DBアクセスのN+1問題 等）を指摘してくれるのでポートフォリオの質を格段に上げてくれます。

#### 幅広い情報を取り入れられる

個人で情報収集を行っていると、メディアで多く取りあげられている情報に偏りがちです。
例えば、”モダンな企業に入るならRuby”,"最近はGoが主流"とかです。
スクールでは経験者や卒業生のリアルが聞けるので、情報の偏りを整える事ができます。
私自身、講師がスキマ時間に教えてくれたAWSやLINEAPIで作ったモノが意外に好評でした。


#### 競争相手がいるためモチベーション維持に繋がる

周りの作品を見て自分のレベルが測れるので大切です。
プログラムは一つのモノを数か月単位で作り続けるのでモチベーション維持が難しいです。
一緒に頑張る人が見えるのはとても有効です。

## どんなスクールがいいの？

- オリジナルのプログラム作成を支援してくれる
- 専属のメンターまたは講師がつく
- 価格が安い


#### オリジナルのプログラム作成を支援してくれる
教材に沿って全員が同じものを作るタイプのスクールはおススメしません
そこで作ったモノはポートフォリオとして役に立たないからです。
絵師として働きたい人が、ネットでダウンロードしてきた画像をプロフィール欄に掲載しているようなモノです。
<strong>大切なのはオリジナリティがどの程度加えているかです。

#### 専属のメンターまたは講師がつく
自分の作成しているプログラムを把握してくれている人が必要です。
そして自分の能力を把握している人でないと、質問をしても良い回答が返ってきません。

#### 価格が安い
あくまでもプログラミングスクールは補助として利用するべきです。
<strong>個人で学習するの事が重要です。</strong>
そのため、スクールには20万前後が妥当な金額だと思います。



# こちらの記事も
https://qiita.com/Ryu-Yasuda/items/d40a948155ba4edf763c
vercel にページを作成する方法

vercel に次のようなページを公開する方法です。next.js を使っていないページも公開できます。
https://qiita.vercel.app/
![vercel_may26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/419fe2f7-f5f7-fb9c-3c41-5565d43eaf03.png)

GitLab に　次のようなプロジェクトを作成
https://gitlab.com/ekzemplaro/qiita/
![gitlab01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e632198d-7c38-3760-9c60-ac62f9ad65c1.png)

フォルダー構造

```text
$ tree
.
├── README.md
├── go_upload.sh
└── public
    ├── display_table.js
    ├── go_get
    ├── hello.html
    ├── index.html -> qiita.html
    ├── qiita.css
    ├── qiita.html
    ├── qiita.js
    ├── qiita_out.json
    ├── read_fetch_table.js
    └── style.css
```

データを更新するスクリプト

```bash:go_upload.sh
git add --all
git commit -m "Commit on May/26/2022 AM 09:00"
git push -u origin master
```

パイプラインで、GitLab でもページが公開できます。
https://ekzemplaro.gitlab.io/qiita/
![gitlab02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3757b3c5-7b09-ee84-995b-e0ed76639ea0.png)

## vercel で　新しいプロジェクトを作成
![vercel02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c89a02db-8368-3fc0-01d4-c3103f465d0a.png)
GitLab　のプロジェクトを選びます。

![vercel03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7a488cad-a38d-69a8-54cc-38fd396a3465.png)
「ミノ駆動本」読書感想文

# 話題のあの本を買ってきました

#### [良いコード／悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方](https://gihyo.jp/book/2022/978-4-297-12783-1)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/206bfad6-750d-c1e2-9dbf-df138ee96873.jpeg" width="400" alt="良いコード／悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方">

買ってきました、ミノ駆動本。
普通に本屋に売ってました。

ただ、正式タイトルを覚えておらず、一生懸命「ミノ駆動本」を探していたので、なかなか見つかりませんでした。
そのため、最初は間違って「ノミ駆除法」という本を買ってしまいました。

> ワイ「ええと、ミノ駆動本、ミノ駆動本、どこや・・・？」
> ワイ「あった！・・・ん？」
> ワイ「**ノミ駆除法**・・・ちょっと違うか？」
> ワイ「いや、ノミってのは、多分**バグ**のことを指してるんやろうから」
> ワイ「**バグを取り除く方法**が書いてあるはずや」
> ワイ「よし、購入や！」
> ワイ「さっそく読んでみよか」
> ワイ「なになに、ノミ防止用の首輪をペットにつけて・・・？」
> ワイ「いやリアルなノミの駆除法やないかい！」

嘘です。
普通に買えました。

# ここから感想文

### めっちゃ読みやすい。分かりやすい。
今まで買った技術書の中で、一番読みやすくて分かりやすいです。
それって「学びやすい」「つらくなく学べる」ってことなので、読み手としてはメッチャありがたいです。

この読みやすさには、**執念**を感じました。

> ミノ駆動さん「バグを生みにくく、変更しやすいソフトウェア作りが重要なんや・・・！」
ミノ駆動さん「でも、それがなかなか周りの人間に伝わらへん・・・！」
ミノ駆動さん「この伝え方もダメ・・・！」
ミノ駆動さん「あの伝え方もダメ・・・！」
ミノ駆動さん「ぐぬぬ・・・！」
ミノ駆動さん「ほな、ここまで分かりやすく読みやすく説明すればええのやろ！」

そんな執念を感じてしまいました（勝手な想像です）

# あの爆殺動画の書籍化？

元々は「あの爆殺動画シリーズを書籍化しませんか？」というお話だったらしいです。

https://twitter.com/MinoDriven/status/1127539251761909760?s=20&t=f_hA1IbCvrCrwqCgLY94jg

この動画シリーズもすごいですよね。

> ミノ駆動さん「ここまで面白くて、分かりやすければ・・・」
> ミノ駆動さん「流石に伝わるやろ！！！」

そんな執念を感じます（勝手な想像です）

伝えるための工夫、まじでリスペクトです。

# ここから本の内容
### オブジェクト指向的な、クラス設計の話が多い

「バックエンドの人たちって、こんな風に考えてるんや」って感じで、メチャクチャ勉強になりました。

ワイはフロントエンドエンジニアなので、TypeScriptばっかり書いていて、クラスって普段ほとんど書きません。
なので「値オブジェクト」すらよく知りませんでした。
（TypeScriptにもclass構文は一応ありますけどね）

フロントエンドエンジニアって、割とワイみたいな人が多いと思います。

とっても勉強になるので、オススメです。

### 具体的な話が多い
どの説明も、全部サンプルコードがあります。
なので・・・

> 「なるほどー、そういう考え方が大事なんやー」
> 「でも・・・具体的にはどんな場面で使えるんやろ？」
> 「その考え方でコードを書くと、具体的にどんなコードになるんやろ？」

#### ↑こうなりません。全部コード書いてあります。

タイトルの通り、まさに「良いコード／悪いコードで学ぶ」って感じです。

### もうちょっと上流っぽい話も

具体的なコードの書き方より、もう少しだけ上流っぽい感じの「モデリング」みたいな話も書いてありました。

現実世界の「解決したい問題」を抽象化して図に起こす、みたいなやつです。

「現実世界のモノと一対一でクラスを作るだけでは、落とし穴がある」的な話が興味深かったです。
この辺もあまり考えたことがなかったので、学びがありました。

## フロントエンドの話はない

「フロントエンドで明日から使えるテクニックが満載！」っていう本ではありません。
「フロントエンド版ミノ駆動本」もあったらいいのな、って思いました。

でも、考え方が流用できそうな部分はありました。
「イミュータブル（不変）」だったり「副作用」だったり「参照透過性」だったり。

あとは、命名の話とか、他にもいろいろ。

# 総評
好き。

# 新しい記事もよろしくやで
- [6歳娘「パパ、条件によって変わる型を作りたいの」](https://qiita.com/Yametaro/items/9b2f0ab2037450004816)
100日後くらいに個人開発するぞ！day033

## 今日はレスポンシブデザインとメディアクエリを学んだ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/2c8d5d38-4671-95ec-4722-862815296fe5.png)

## 今日の学び

### レスポンシブデザインとは
* レスポンシブデザインは画面のサイズに合わせて最適なレイアウトを組む仕組み
* レスポンシブデザインを適用してないとスマートフォンやタブレットの画面でコンテンツの一部が隠れてしまう

### メディアクエリ
* メディアクエリ…ブラウザの画面サイズに応じてCSSのスタイルを設定する方法
* メディアクエリの書き方
    * `@media(条件){…}`で記述し指定した条件下で{}内のCSSが適用される
        * 例：画面幅が500px以下の場合にh1の文字の色を青にする
            * `@media(max-width:500px;){h1{color:blie}}`


### メディアクエリの条件
* 画面幅が〇〇px以下の場合を条件で指定する方法
    * `@media(max-width:〇〇px;){…}`
* 画面幅が〇〇px以上の場合を条件で指定する方法
    * `@media(min-width:〇〇px;){…}`

### ブレイクポイントとは
* `max-width:〇〇px`や`min-width:〇〇px`で指定するとき〇〇pxの部分をブレイクポイントと呼ぶ

### 画面幅によってコンテンツの幅を変えたい場合
* 例：1000px以下の時に「item」の幅を画面の半分にする
    * `@media(max-width:1000px;){.item{width:50%;}}`

### paddingやborderでレイアウトの崩れを直す方法
* 全要素のCSSに`*{box-sizing:border-box;}`を指定することでpaddingやborderによるレイアウトの崩れをなくすことができる
    * `*`は全ての要素を指定できる
*`box-sizing:border-box;`はpaddingやborderも含めたwidhtを要素の幅として認識させるCSS
【ショートカット】Visual Studio CodeでCSS, JavaScriptファイルを読み込む

マイクロソフトが開発している多機能エディタ、Visual Studio CodeでCSS, JSファイルを読み込ませる方法。ショートカットで、楽にいきましょう。

### ①CSSファイルを読み込みたい場合

`link:css`


### ②JavaScriptファイルを読み込みたい場合

`script:src`



エディタの動きとしては以下のようなかんじになります。
②のJavaScriptファイル導入を例に挙げます。

「script:src」と入力。（←script:を入力するだけで候補出てくる）
![scriptsrc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/e9c72dbc-df44-913d-6c05-fb1a05195f15.png)

<script src=""></script>と表示されることを確認。
![scriptstc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/615daec3-f2a3-ff5a-f78a-3ede4c08f31e.png)

「""」の中に、自分の読み込ませたい対象のJsファイル名を記述する。
（今回は、main.jsを使用している)
![scriptstc3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/96523ea7-a56c-22be-018d-58a719c3be35.png)


あとがき
こんなこと忘れないだろうと思ってたけど、VSCodeを久々に触っていたら見事に忘れていたので備忘として残しておきます。メモ大事。
Linuxにてファイルの中にある日付データ置換(python)

# 概要
今回はテキストファイルの中に指定されている日付を一括で置換するコードを紹介いたします。

# ファイルのディレクトリ情報
テキストファイルが格納されているディレクトリは以下の通りです。
※ファイル名の形式が「ファイル名年月日.json」に指定されています。
~~~
/ 
|
-----month=01
     |
     ----DAY=01
         |
         ----XX20250101.json
     ----DAY=02
     ----.
     ----.
     ----DAY=31
-----month=02
-----month=03
-----.
-----.
-----.
-----month=12
~~~

# ファイルの内容
次のファイルのように登録日時項目に指定されているデータから日付のみ変更になります。

~~~
#################
cur20200101.json
#################
{"name":"田中","age":"46","gender":"1","reg_date":"2020/01/01 15:33:25"}
{"name":"鈴木","age":"32","gender":"1","reg_date":"2020/01/01 16:18:12"}
{"name":"水島","age":"52","gender":"1","reg_date":"2020/01/01 17:48:45"}
~~~

# ソース
次のコードをコピーして適当なファイル名に保存しましょう。

~~~
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

path = "./"

cur_path = os.getcwd()

for submonthdir in os.listdir(path):
    if submonthdir != 'test.py':
        for subdaydir in os.listdir(cur_path + "/" + str(submonthdir)):
            for filename in os.listdir(cur_path + "/" + submonthdir + "/" + subdaydir):
                dd = filename.replace('cur','')
                dd = dd.replace('.json','')
                fn = dd #ファイルの日付部分を取得
                dd = dd[0:4] + "/" + dd[4:6] + "/" + dd[6:8] #日付形式に編集
                dst = "2025" + "/" + dd[5:7] + "/" + dd[8:10] #日付形式に編集
                print(dd)
                print(dst)

                #ファイルの内容を変数に文字列として設定
                filedir = cur_path + "/" + submonthdir + "/" + subdaydir + "/" + filename
                with open(filedir) as reader:
                    content = reader.read()

                #日付を置換
                content = content.replace(dd,dst)

                #既存ファイルを削除
                os.remove(filedir)

                #ファイルの編集内容を新しいファイル名に保存
                with open(cur_path + "/" + submonthdir + "/" + subdaydir + "/" + filename.replace(fn,dst.replace('/','')),'w') as writer:
                    writer.write(content)

~~~

# 実行
次の内容通りに実行されます。

~~~
pi@raspberrypi:~/work/month=01/day=01 $ cat cur20200101.json 
{"name":"田中","age":"46","gender":"1","reg_date":"2020/01/01 15:33:25"}
{"name":"鈴木","age":"32","gender":"1","reg_date":"2020/01/01 16:18:12"}
{"name":"水島","age":"52","gender":"1","reg_date":"2020/01/01 17:48:45"}
pi@raspberrypi:~/work/month=01/day=01 $ cd ..
pi@raspberrypi:~/work/month=01 $ cd ..
pi@raspberrypi:~/work $ ls
'month=01'  'month=02'  'month=03'  'month=04'  'month=05'  'month=06'  'month=07'  'month=08'  'month=09'  'month=10'  'month=11'  'month=12'   test.py
pi@raspberrypi:~/work $ python test.py
2020/01/01
2025/01/01
pi@raspberrypi:~/work $ cd month\=01/day\=01
pi@raspberrypi:~/work/month=01/day=01 $ cat cur20250101.json 
{"name":"田中","age":"46","gender":"1","reg_date":"2025/01/01 15:33:25"}
{"name":"鈴木","age":"32","gender":"1","reg_date":"2025/01/01 16:18:12"}
{"name":"水島","age":"52","gender":"1","reg_date":"2025/01/01 17:48:45"}
pi@raspberrypi:~/work/month=01/day=01 $ 
~~~

# 終わりに
ディレクトリとファイルの日時が正しく指定されているのが前提になります。
今回はawsのLinux環境でテストデータファイルの日付変更が必要だったので、
python言語がデフォルトで入っていました。
今日はここまでです。ありがとうございます。
Services Setup の画面から検索できない設定


[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


不思議です。

[Unable to find External Services in quick find box](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HjqSISAZ)

通常のSetupからは検索できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/45dfa42a-5667-59e4-8483-9f014fae42c2.png)

無い？　何で...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2658144c-f255-50af-181c-cc4ae48b6da5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/47b83d88-2395-cf7c-0b42-d074c9ee22a8.png)