OmniAICreator/Qiita-1.07M huggingface dataset:
すぐ使えるファサードの設定（Laravel）

## 始めに
Laravelにて、ファサード（Facade）を使用することがあったので、
備忘録として記事にしました。

__ファサードとは__：staticメソッドみたいな感じ（どこでも使えるメソッドにする機能）
```PHP:適当なController.php
    // どこのController, ServiceでもTestFacadeクラスのtestメソッドが実行可能！
    TestFacadeClass::test();
```

## 環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 8.83.19 |
| __PHP__     | 7.3.10  |

## 流れ
1、ControllerかServiceにクラスを作成する
2、/app/Providers/AppServiceProvider.phpの設定
3、ファサード用ファイルを作成する
4、config/app.phpの設定

## 1、ControllerかServiceにクラスを作成する
今回はサービスにファサード化したいクラスを作成します。
```PHP:TestService.php
class TestFacade
{
    public function test()
    {
        Log::debug('testメソッドが処理されています。');
    }
}
```

## 2、AppServiceProvider.phpの設定
/app/Providers/AppServiceProvider.phpの設定をします。
```PHP:TestService.php
public function register() {
    app()->bind('TestFacade', App\Services\TestService);
}
```

## 3、ファサード用ファイルを作成する
```PHP:TestFacadeClass.php
use Illuminate\Support\Facades\Facade;

class TestFacadeClass extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'TestFacade'; // AppServiceProvider.phpで設定した名称
    }
}
```

## 4、config/app.phpの設定
```PHP:/config/app.php
'aliases' => [
    'TestFacadeClass' => \App\Facades\TestFacadeClass::class,
]
```
これで設定完了

## 使い方
```PHP:適当なController.php
    // どこのController, ServiceでもTestFacadeクラスのtestメソッドが実行可能！
    TestFacadeClass::test();
```

## 最後に
以上で、Laravel のファサード設定方法でした。
ご指摘、ご意見ありましたら、コメント欄にお願いいたします。
ありがとうございました。

## 参考URL
【Laravel】ファサードとは？何が便利か？どういう仕組みか？
https://qiita.com/minato-naka/items/095f2a1beec1d09f423e
GitHub GraphQL APIをつかってGitHubコメントを取得する

## はじめに
@iron-samurai さんの記事

[[Github API] レビューコメントを振り返るために、過去にもらった全コメントを引っこ抜いてJsonで吐き出してみた](https://qiita.com/iron-samurai/items/d84c65045f51415fa859
) 
を拝見し、自分もGitHubAPIを使って過去のコメントを一気に見たいと思いました。
本記事では、`gh`コマンドと`GraphQL`を使ってGitHubのコメントを取得する方法を記載します。

## GitHub APIとは？

> インテグレーションを作成し、データを取り出し、ワークフローを自動化するために、GitHubのREST APIで構築してください。

GitHubの様々な機能をAPIを使って行えるツールです。

## GitHub GraphQL APIとは？


> GitHubのGraphQL APIは、柔軟性と、フェッチしたいデータを正確に定義できる機能を提供します。

要はGitHub APIをREST形式ではなく、GraphQLでデータ取得をする方法になります。

## 環境整備
コマンド ラインから API 要求を行う場合、GitHub では、GitHub CLI を使用することをお勧めされています。
そのため、本記事でもGitHub CLI を使ってコメントを取得します。

```terminal
# ツールインストール
brew install gh

# 認証
gh auth login
```

MacOSではない方は以下の中からご自身の環境を選択して、GitHub CLIをインストールしてください。
https://github.com/cli/cli#installation


## クエリ

```sh
gh api graphql -F owner='組織名orアカウント名' -F name='リポジトリ名' -f query='
query($name: String!, $owner: String!){
  repository(owner: $owner, name: $name) {
    pullRequests(first: 1,orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        url
        title
        createdAt
        author {
          login
        }
        reviews(first: 10) {
          edges {
            node {
              comments(first: 25) {
                edges {
                  node {
                    databaseId
                    bodyText
                    diffHunk
                    createdAt
                    path
                    author {
                      login
                    }
                    replyTo {
                      databaseId
                      bodyText
                      diffHunk
                      createdAt
                      path
                      author {
                        login
                      }
                    }
                  }
                }
              }
            }
          }
        }
        comments(first: 10,orderBy: {field: UPDATED_AT, direction: DESC}) {
          nodes {
            createdAt
            bodyText
          }
        }
      }
    }
  }
}
```

### 対応する型

| クエリのオブジェクト | 型 |
|:-:|:-:|
| repository  | Repository  |
|  pullRequests | PullRequestConnection  |
|  reviews | PullRequestReviewConnection  |
| reviews.comments  | PullRequestReviewCommentConnection  |
| comments  | IssueCommentConnection  |

オブジェクトについて
https://docs.github.com/ja/graphql/reference/objects

## nodeとedgeの違い



### Node

> ノード はオブジェクトの総称です。 ノードは直接ルックアップすることもできますが、コネクションを通じて関連するノードにアクセスすることもできます。 スカラーを返さない `node` を指定する場合は、すべてのフィールドでスカラーが返されるまでサブフィールドを含める必要があります。

### Edge

> エッジは、ノード間のコネクションを表します。 コネクションに対してクエリを行うと、そのエッジをトラバースしてノードを取得することになります。 すべての `edges` フィールドには、`node` フィールドと `cursor` フィールドがあります。 



## commentとreviewコメントの違い

commentは**プルリクにつくコメント**


reviewのcommentは**ファイルにつくコメント**



## 参考
ghコマンドのインストール
https://docs.github.com/ja/rest/quickstart?apiVersion=2022-11-28
Amazon Kinesis

動画とデータストリームをリアルタイムで容易に収集、処理、分析ができるサービス。

## 特徴

### リアルタイム

ストリーミングデータをリアルタイムで取得、バッファ、処理するため、通常は数時間から数日かかるインサイトの生成を数秒から数分間で完了することができる。

### フルマネージド

インフラストラクチャを管理することなく、ストリーミングアプリケーションを実行することができる。

### スケーラブル

サイズの上限なくストリーミングデータに対応し、数千ものソースからのデータをとても低いレイテンシーで処理することができる。

## 4つの機能

### Amazon Kinesis Video Streame

分析、機械学習、再生、およびその他の処理のために、接続されたデバイスからAWSの動画を簡単かつ安全にストリーミングすることができる。

**特徴**

- デバイスからデータを安全にストリーミングするためのSDK
- HTTP Live Streaming(HLS)でのライブとオンデマンドの動画再生

**コスト**

従量課金制のため実際に使用した分の料金が発生する。

- ビデオストリームに取り込まれた、消費されたデータ一律で0.00850USD/GB
- HLSを使用してビデオストリームから使用されたデータは0.01190USD/GB
- 1ヶ月保存した場合のデータは0.02300USD/GB

### Amazon Kinesis Data Streame

サーバーレスストリーミングデータサービスであり、あらゆる規模のデータストリームを簡単にキャプチャ、処理、保存することを可能にする。

**特徴**

- サーバーレス
- 高い可用性と耐久性
- 低レイテンシー

**コスト**

2種類の容量モードがある

- オンデマンドモード
    - 書き込まれるデータと読み込まれるデータのGBごとに課金される
    - 料金は取り込み、および取得したデータの量に基づきアカウント内の各データストリームの1時間あたりの料金とともに請求される。
- プロビジョンドモード
    - 書き込みおよび読み取りリクエストレートに基づいて、アプリケーションに必要なシャードの数を指定する。
- シャード時間
    - データストリームの基本的なスループットの単位

### Amazon Kinesis Data Firehose

ストリーミングデータを確実にキャプチャおよび変換し、データレイク、データストア、および分析サービスに配信、抽出、変換、ロード (ETL) サービス。

**特徴**

- ほぼリアルタイムの新規データのロード
- データスループットの変動に対応する伸縮自在なスケーリング
- Apache Parquet または ORC 形式の変換

**コスト**

取り込みデータ量に対して料金が発生する。

- ソース取り込みとしての Direct PUT および KDS
- Vended Logs をソースとする取り込み
- 形式の変換
- VPC 配信
- Amazon S3 配信の動的パーティショニング

### Amazon Kinesis Data Analytics

Apache Flink を使用して、ストリーミングデータをリアルタイムで変換および分析できる最も簡単な方法。

**特徴**

- 柔軟な API
- AWS のサービスの統合
- アドバンスト統合機能

**コスト**

アプリケーションの実行に使用された Kinesis 処理単位 (KPU、Kinesis Processing Unit) の数に基づいて時間あたりの課金が発生します

- KPU
    - KPUは1vCPU/4GBメモリをセットとしたストリーム処理能力の単位のことで、ストリームのスループットや処理の複雑さに応じてスケーリングされます。

https://aws.amazon.com/jp/kinesis/
知ってて損しない@layerの話

## はじめに

こんな壮大なタイトルを書いていますが、私自身つい最近まで`@layer`の存在さえ知りせんでした。
なぜ知り得たかというと参画先のFEチーム内で、普段使っていない技術や知識を取り入れる取り組みとしてcodepenで実例を出しながら簡単なLTをする機会があったからです。

ここで紹介する`@layer`は、そのLTでCSSをピックアップするキッカケになったState Of CSSのFEATURES OVERVIEW（利用率の概要）で見つけました。

https://2022.stateofcss.com/en-US/

## カスケードとは
カスケードとは、スタイルを適用する際の優先順位を示したものです。
CSSファイル内に同様の記述がある場合や、複数ファイル読み込んでいた場合に、どのスタイルを適用すればいいのか判断する順序が決められています。

> 1. Origin and Importance
> 2. Context
> 3. Element-Attached Styles
> 4. Layers
> 5. Specificity
> 6. Order of Appearance

https://www.w3.org/TR/css-cascade-5/#cascade-sort

## カスケードレイヤー
カスケードにあるように、カスケードレイヤー(Layer)は詳細度（Specificity）や記述順(Order of Appearance)に影響されずに使うことができます。

## カスケードレイヤーの使い方
### レイヤーを定義する
カスケードレイヤーを使うためにまずレイヤーを定義する必要があります。
```css
@layer base {
    .test { color: red; }
}
```
上記のように`@layer`に加えてレイヤーの名前を記載し、カッコ内にCSSを記載します。
もしくは具体的なCSSは記載せずに、レイヤーを定義することも可能です。
```css
@layer base;
```
また、複数のレイヤーをまとめて定義することも可能です。
```css
@layer base, component, project;
```
この場合は後に書いたレイヤーであるprojectの優先順位が一番高くなるので、各レイヤーの順序を明確にできます。

### レイヤー使う上で注意すること
レイヤーは詳細度より優先されると書きましたが、それぞれ競合するスタイルをレイヤーに入れるとどうなるか見てみましょう。
通常のCSSであればこのようになります。
```css
/* 詳細度 0-1-1 */
p .sample { font-size: 12px; }

/* 詳細度 0-1-0 */
.sample { font-size: 16px; }

/* p .sampleの font-size:12px が適用される */
```
しかし、それぞれをレイヤーに入れると
```css
@layer test1 {
/* 詳細度 0-1-1 */
  p .sample { font-size: 12px; }
}

@layer test2 {
/* 詳細度 0-1-0 */
  p { font-size: 16px; }
}
/* レイヤーtest2の font-size:16px が適用される */
```
レイヤーが定義された順になるので、レイヤーの中の詳細度が低かったとしてもスタイルが適用されることになります。

また、レイヤーの定義で一番最後に定義したレイヤーの優先順位が一番高いと書きましたが、以下のようになります。
```css
@layer blue, red;
/* ここでレイヤーの順序を確立しているので、それぞれのレイヤーを逆に記載してもredが適用される */

@layer red {
    p { color: red; }
}

@layer blue {
    p { color: blue; }
}
/* pタグ内のテキストカラーはredになる */
```
レイヤー同士の優先度がどのようになるかはわかったところで、レイヤーを持たないスタイルと競合したときは以下のようになります。
```css
/* h1タグにtitleというクラス名を持つ */

h1 { color: green; }

@layer title {
    .title { color: red; }
}
/* この場合、h1タグのテキストカラーはgreenになる */
```
この場合はレイヤーを持たない（implicut layer）スタイルが最優先されます。

### レイヤーをネストする
レイヤーはネストすることもできます。
```css
@layer base {
    p { margin-bottom: 8px; }
}

@layer framework {
    @layer base {
        p { border: 1px solid #ddd; }
    }

    @layer theme {
        p { color: blue; }
    }
}
```
このとき、baseと、frameworkにネストしているbase(framework.baseとも表記できる)は別物になります。
すでに、レイヤーの優先順位を指定しているので、ネストを複雑にすると保守性が低くなってしまうのでご注意ください。

## まとめ
複数のCSSファイルの読み込みや`!important`の乱用、他にも様々な手法があるCSSは複雑化しやすいです。
詳細度によってより複雑に書き連ねていかないといけない部分が、それぞれのレイヤーを意識することで整理もしやすくより良い運用ができると思います。

また、デザインデータのレイヤーとも似た感覚があり、設計段階からより使いやすくなるかもしれません。

複雑化したものを一挙に改善できるほどの救いの手にはならないかもしれませんが、このような経験がある方には今後新しいものを作るときのひとつの方法として役立てたら嬉しいです！

## 最後に
この記事を書くために他のメンバーは何を寄稿しているのか読みに行った際、古川さんの記事でNIJIBOXがState Of CSSのスポンサーになっていることを知りました。
執筆前にState Of CSSのことは知っていたのですが最初は全然気付かず、改めてNIJIBOXのロゴが並んでいるのを見て感慨深かったです。

https://qiita.com/yosuke_furukawa/items/915d31aedc4c5ed25150

そして、新たな技術や知識を取り入れるよう時間を設けてくださったチームに感謝しています！
もっとみなさんのお役に立てる記事が書けるようにがんばります！

## 参考
[CSS Cascading and Inheritance Level 5](https://www.w3.org/TR/css-cascade-5/)
HTMLの学習要素まとめ

# HTML5プロフェッショナル認定試験に向けて
## HTML5プロフェッショナル認定試験に向けて勉強したことのまとめパート1
### canvas要素
Javascriptを使用して図を描画する
ビットマップ形式で劣化なし
PNG,Gif,JPEGなどの画像読みこみ可能

### ボックスモデル
HTML要素が占める領域
margin,パディングなど


### ユニバーサルセレクタ
*{}で記述
すべての要素を対象にスタイルをあてる

### Viewport
画面の表示領域
ブラウザの使用しているアプリの中でWEBサイトが表示されている領域のこと

### メディアクエリ
@media(){}で記述する

### セクション
- header
- footer
- section
- aside
- article

### フルードグリッド
画面をマスで区切って要素を配置するグリッドデザインと、
横幅を変えても要素の大きさとバランスを％で指定して調整するフルードデザインのハイブリッド

### GETメソッド
サーバ側から情報を取得する

### W3C
World Wide Web Consortium
HTMLやCSSなどWEB技術の標準化を行う非営利団体

### DOM3 EVents(UI Events)
ユーザからのマウスやキーボード操作によるイベント

### CSSスプライト
一枚の画像にボタンの画像を複数まとめるなど、複数の画像をなるべくまとめ、
表示範囲を指定して表示することでサイトの読み込みを早くする。

### iframe要素
インラインフレーム要素
HTMLの中にHTMLを入れ子にする

### paddingの指定
padding-top:10px(bottom,right,leftも同様に)
もしくは
値1つ→上下左右
値2つ→上下、左右
値3つ→上、左右、下
値4つ→上、右、下、左（上から時計回り）

### Ajax
Webブラウザ内で非同期通信を行いながらその結果をページの再読み込みなしに行える

### translate3d
transformプロパティに使用する関数の一種
XYZをまとめて移動

### リセットCSS
ブラウザデフォルトのCSSを打ち消すCSS
ブラウザ間の差異をなくすために作成する

### hyphensプロパティ
ハイフンによる改行方法を指定
none,manual,auto

### input要素type属性
もとからあったfileや
HTML5で追加されたnumber（数値)、email（メアド)、date（日付)、range（範囲指定)など

### DELETEメソッド
HTTPメソッドのひとつで、指定したデータの削除をサーバ側に求める

### WebWorker
ブラウザが実行するHTML,CSS,Javascriptとは別にバックグラウンドで処理を実行する
メインスレッドから呼び出し可能でいくつでも並行処理可
DOMの操作は不可

### MVCモデル
model:ロジック
view:表示、入力機能
controller:モデルとビューの橋渡し

### transition
アニメーションの移り変わり方（ゆっくり色が変化するなど）を指定できるCSSプロパティ
transition-propertyで適用
,で区切る

### グローバル属性
すべての要素で使用可能な属性
contextmenu:要素のコンテキストメニューを指定
contenteditable:要素の内容を編集可能かを指定
hidden:関連性がある要素かどうかを指定

### HTTPステータスコード
500:サーバ側で処理できない
503:サーバ側がメンテや過負荷で一時的に利用できない
400:リクエストが無効
301:リソースが永続的に移動した
302:リソースが一時的に移動している
403:アクセス禁止
200:リクエスト成功

### digest認証
HTTPの認証方法の一種
ユーザIDとパスワードをハッシュ化して送信する
※Basic認証では平文で送ってしまう
MD5でハッシュ化するが、古いハッシュアルゴリズムなため解析できてしまう点がデメリット


### Webフォント
CSS3で適用された端末のフォントではなくWeb上のフォントを読みこむ仕組み
端末のフォントを使用しないためどの端末でも同じようなデザインで見せれる


### strong要素
強い重要性を表す

### カスタムデータ属性
HTML5で追加されたオリジナルの属性
dataから始まる
名前の重複は×かつ文字列しか格納できないが、複数指定できる

### WebM
軽量高品質な動画形式
Web上での取り扱いに適している

### media source extensions
HTML5用のJavaScriptAPI
HTMLのmediaやaudioを操作する

### encrypted media extensions
ブラウザと著作権管理ソフト間でチャネルを作成する

### mpeg-dash
ネット上でストリーミング再生するためのHTTPベースプロトコル

### HLS
HTTP Live Streaming
Appleが独自開発した規格
Web上で動画や音声のストリーミングを行うためのプロトコル

### ファビコン
お気に入り登録時のアイコン
link要素で指定

### header要素
サイト名やロゴ、メニューなどを表示する
※headは表示されないので違いに注意

### WebStrage
ユーザーのローカル環境にデータを保存する仕組み
Key-Value型でデータを保存する

### img要素
src属性で画像を指定

### time要素

### background-size
背景画像の表示方法を指定するCSS
cover:コンテナいっぱいに表示　必要に応じて引き延ばし、比率が異なる場合は切り取られる
contain:比率を崩さず可能な限り大きく表示する　李パートの設定可能
auto:比率を維持して拡大縮小
文字列をchar配列に変換するサンプル

```sample.java
    public static void main(String[] args) {
        String str = "abc";
        char ch[] = str.toCharArray();
        System.out.println("ch[0] = " + ch[0]);
        System.out.println("ch[1] = " + ch[1]);
        System.out.println("ch[2] = " + ch[2]);
    }
```
実行結果
```
ch[0] = a
ch[1] = b
ch[2] = c
```
Leetcode 1971. Find if Path Exists in Graph

https://leetcode.com/problems/find-if-path-exists-in-graph/description/

## 難易度
### Easy

## アプローチ
### BFS

```java
class Solution {
    public boolean validPath(int n, int[][] edges, int source, int destination) {

        if(source == destination){
            return true;
        }

        ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            arrayList.add(new ArrayList<>());
        }

        for (int[] edge : edges) {
            int origin = edge[0];
            int dest = edge[1];

            arrayList.get(origin).add(dest);
            arrayList.get(dest).add(origin);
        }

        boolean[] isVisited = new boolean[n];
        Queue<Integer> queue = new LinkedList<>();
        queue.add(source);
        isVisited[source] = true;
        while (!queue.isEmpty()) {
            int now = queue.poll();

            for(int i = 0 ; i < arrayList.get(now).size();i++){
                int next = arrayList.get(now).get(i);

                if(next == destination){
                    return true;
                }
                if(isVisited[next]){
                    continue;
                }
                isVisited[next] = true;
                queue.add(next);
            }
        }
        return false;
    }
}
```
Dateクラスを勉強する

Dateクラスをnewする。
```sample.java
    public static void main(String[] args) {
        Date dt = new Date();
        System.out.println(dt);
    }
```
実行結果。現在日時である。
```
Mon Dec 19 19:04:46 JST 2022
```
日付ずらしは、Calendarクラスを使う。
```sample.java
    public static void main(String[] args) {
        Date dt = new Date();
        System.out.println(dt);
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);     //Date -> Calendar
        cal.add(Calendar.YEAR,1);
        dt = cal.getTime();  //Calendar -> Date
        System.out.println(dt);
    }
```
実行結果。翌年になっている。
```
Mon Dec 19 19:15:56 JST 2022
Tue Dec 19 19:15:56 JST 2023
```
最後にフォーマット
```sample.java
    public static void main(String[] args) {
        Date dt = new Date();
        System.out.println(dt);
        SimpleDateFormat fm = new SimpleDateFormat("yyyy/MM/dd");
        System.out.println(fm.format(dt));
    }
```
実行結果。見やすくなった。
```
Mon Dec 19 19:22:09 JST 2022
2022/12/19
```
[Looker Studio] 同じデータソースのとある値の総数とフィルタをかけた値とで計算する方法

この記事は [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) #6 22日目の記事です。

早いもので、今年ももう10日足らずとなりました。
本日ZOZOでは、忘年会的お祭り騒ぎであるZOZOCAMPが開催されます。
毎年「**そこまでやるのかZOZO**」と社内イベントに対する~~狂気~~熱意が感じられるメッチャ盛り上がるイベントですので、気になる方は [**Let's JOIN US!!**](https://corp.zozo.com/recruit/)

ということで今回は、先日データポータルから名称が変わった**ルッカースタジオ**（カタカナで書くとなんかしっくりこない）のTipsです。

# とあるデータソースのカラムAの総数と、フィルターをかけたカラムAの総数で計算をするには

以下のようなデータをもつデータソースがある場合、全ユーザーの注文総数（39）に対する、プレミアムユーザー（*is_premium_user = 1*）の注文総数（25）の割合を出すためには、どのような操作をすればよいでしょうか？

user_id|is_premium_user|count_orders
:-:|:-:|:-:
u000001|1|4
u000002|0|2
u000003|0|3
u000004|0|4
u000005|1|8
u000006|1|4
u000007|0|2
u000008|0|3
u000009|1|7
u000010|1|2

スコアカードで表現する場合、とても楽な操作で行えます。
対象となる２つの値（フィルターありなし、それぞれの総数）を表示したスコアカードを選択し、コンテキストメニューより「**データの統合**」を選択します。
すると、
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/f5784bbf-0486-2a65-506e-4536cdcb7c71.png">
自動的に、それらの値で計算されたスコアカードが生成されます。
データソースには「混合データ」が、指標には先に選択した値を使用した計算式がセットされています。（指標の名称は手動で変更しています）
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/b2859aba-0b77-af24-49ca-9774216cc92b.png">
この混合データとは何ぞやと中身を覗くと（「混合データ（1）」の左にあるペンアイコンをクリック）、**フィルターがかかっていないテーブルと、フィルターがかけられたテーブルとで結合**されているのが分かります。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/79122f3b-4a9f-815a-cf2f-adc3d41c4885.png">
余談ですが、ここでも指標名を変更できるので、元が同じ名称の場合、変更しておくと分かりやすいです。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/dd673613-1a5c-f340-b1fa-2058cd80def7.png">
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/6cc72773-4fb6-f492-3160-c9072bb653a9.png">
ちなみにこの混合データ、もちろんスコアカード以外でも使えますので、表で表現することもできます。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217369/9e143254-bbbf-6fbf-7464-c58ce372970d.png">

以上です。

それでは良いお年を（まだ早い）
maya python export fbx

```python
# -*- coding: utf-8 -*-
from maya import cmds 
import pymel.core as pm
import maya.mel as mel

PLUGIN = 'fbxmaya.mll'

def FBXExportMelEval(FullFilePath,selectBool=True):
    FullFilePath = FullFilePath.replace('\\', '/')
    mel.eval("FBXExportApplyConstantKeyReducer -v true")
    evalMelExport(FullFilePath,selectBool)
    sendCmd="end"
    return sendCmd
    
#import FBXWrapper as fw
def FBXWrapperssetting(FullFilePath):
    FBXWrapper.FBXExport("-f",FullFilePath,"-s")

def evalMelExport(FullFilePath,selectBool):
    selectSave=""
    if(selectBool==True):
        selectSave="-es"
    else:
        selectSave="-ea"
    evalstr='file -force -options "v=0;" -typ "FBX export" -pr '+selectSave+' "'+FullFilePath+'";'
    mel.eval(evalstr)

def PyMELExport(FullFilePath):
    pm.FBXExport("-f",FullFilePath+"_pymel_mel_FBXExport","-s")
    
def cmdsFBXExportSettingsExport(FullFilePath):
    cmds.FBXExport("-f",FullFilePath,"-s") #OK

def cmdFileExport(FullFilePath):
    cmds.file(FullFilePath+"_cmdfile", exportSelected=True, type="FBX export")
```
```
exportPath = r'J:\test_project\work\progress\mcp\20221219\output\test.fbx'
FBXExportMelEval(exportPath,True)
```
Amazon Aurora MySQL　2台構成(ライターインスタンス、リーダインスタンス)のスペックをあげてみた。

___
__Aurora MySQL　ライターインスタンス、リーダーインスタンスがある環境で、__
__インスタンスのスペックを上げたり、下げたりする方法を展開します。__
___

__【手順概要】__
__①リーダーインスタンスのスペックを上げます。(スペックを下げる事も出来ます。)15分ぐらいかかります。__

__②フェールオーバします。10秒ぐらいで完了します。__

__③もともと利用していたライターインスタンス(フェールオーバ後は、リーダインスタンスになっている想定)のスペックを上げます。(スペックを下げる事も出来ます。)15分ぐらいかかります。__

__【詳細】__
__①リーダーインスタンスのスペックを上げます。(スペックを下げる事も出来ます。)15分ぐらいかかります。__

__リーダーインスタンスを選択します。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/f10f6609-2ac0-e13a-59fc-baaf84390636.png)


__インスタンスを変更します。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/ddb6260a-f946-9100-efb7-5d12538df11a.png)


__スペックを上げたり、下げたりします。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/ad1e9bdc-6ed4-cbac-85b5-92d067117363.png)


__②フェールオーバします。10秒ぐらいで完了します。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/90b692d6-6b0b-4781-8438-491ce2577e2f.png)


__③もともと利用していたライターインスタンス(フェールオーバ後は、リーダインスタンスになっている想定)のスペックを上げます。(スペックを下げる事も出来ます。)15分ぐらいかかります。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/122ac3b8-0556-e75d-a19f-46d937984c8a.png)


__インスタンスを変更します。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e4cdcde6-f15a-d57e-5361-cab8946e015b.png)


__スペックを上げたり、下げたりします。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/f1393123-ea6a-16f1-3166-7675c0d424d2.png)
【写経】未経験エンジニアの自己学習備忘録 / VSCodeでSpringBoot開発 編

今回は『とにかく動かせ‼︎プログラミング応援チャンネル』さんの
『VSCodeでSpringBoot開発』を半写経形式で視聴・学習していきます。

https://www.youtube.com/watch?v=6sS2Eco1y1U&list=PLKGspLlIkheJuDe3rLDBFetEHy_RX5xwo

今後記述していく内容はレクチャーではなく、
未経験エンジニアが無知な姿を無様に晒しながら
悪戦苦闘する過程を記録するだけのものなので
参考記事としては非推奨です。
ABC151 D Maze Master

https://atcoder.jp/contests/abc151/tasks/abc151_d


```
from collections import deque

h,w = map(int,input().split())

s = []
for i in range(h):
  s.append(input())
  
q = deque()

steps = [0] * h*w 

# スタートの位置は決まってないので
# スタート位置を決める 
for i in range(h):
  for j in range(w):
    # i,jからスタートする
   
    # 訪れたところ
    visited = [[False for j in range(w)] for i in range(h)] 
    step = 0
    # スタート地点をqに追加する。
    q.append((i,j,step))

    # スタート地点が壁でないかを判別する。
    if s[i][j] == "#":
      continue
      
    while len(q) >= 1:
     　　# qの先頭を取り出す
      y,x,step = q.popleft()

      # 現在の地点が壁でないか判別
      if s[y][x] == "#":
        continue
      # 行ったことのある場所でないか判別
      if visited[y][x]:
        continue

      visited[y][x] = True
      # 最大歩数を更新する
      steps[i] = max(steps[i],step)

      # 移動さきが壁でないかを判別し
      # 上に移動
      if y-1>=0:
        q.append((y-1,x,step+1))
      # 下に移動
      if y+1<h:
        q.append((y+1,x,step+1))
      # 左に移動
      if x-1>=0:
        q.append((y,x-1,step+1))
      # 右に移動
      if x+1<w:
        q.append((y,x+1,step+1))
     
    
print(max(steps))

```
Kotlin初心者がKotlin上級者になるためにマスターしたい要素

本記事はCocone Advent Calendar 2022の20日目の記事となります。

# はじめに
こんにちは。サーバーエンジニアをしているYです。
この記事では、Kotlin初心者がKotlinらしい書き方を模索しながら感じた、「Kotlin上級者になるために是非マスターしたいKotlinの要素」について紹介いたします。

自分がKotlinを扱い始めたのは約半年前。それまで主に扱っていたのはC++とJavaで、Kotlinはおろか、いわゆるモダンな書き方のJavaもほとんど扱ったことがありませんでした。
そんなわけで、今まで for(int i = 0;  i < list.size(); i++) とか書いてた人間がKotlinに触れることになりました。
自分にとっては全く新しい言語！
ですが、書こうと思えばただJavaのキーワードを変換しただけのようなコードも書けてしまうのがKotlinです。
幸い自分が今のプロジェクトに参画した時には、既に偉大な先人たちが書いたKotlinらしいコードが存在していましたので、それらを参考に「Kotlinらしいコード」を模索する日々が始まりました。

それから約半年。ようやくKotlinに慣れてきたなと感じている現在、同じようにこれからKotlinに触れる方がKotlinらしいコードを書くにはどうすれば良いか、その手がかりになるような紹介ができればと思っています。

# Kotlin上級者になるためにマスターしたいKotlinの要素
Kotlinには様々な特徴があります。書き方にも特徴がありますが、言語としての特徴は「簡潔で安全」であることです。
つまり、「より簡潔で、より安全なコード」が「Kotlinらしい書き方」ということになります。
そんな「Kotlinらしい書き方」をするために、自分が重要だと感じた要素を紹介していきたいと思います。

## val
すごく基本的な要素なのですが、個人的にはKotlin上級者への第一歩だと思っている要素です。
Kotlinでは変数の定義する際に、値の再代入が可能な「var」と再代入不可の「val」のどちらかのキーワードを付ける必要があります。
そして、なるべく「val」を使うのが良いとされています。再代入ができなければ想定外の値が入るような事故が減るということですね。
Kotlin初心者だとそんなこと可能なのかと思ってしまいますが、後に挙げるコレクション操作やif式などを駆使していると、初期値の代入だけで済むパターンがほとんどです。
つまり、いかにvalで済むように考えることで、自然とKotlinらしい書き方を模索することができます。
（でもこだわり過ぎて複雑になるくらいならvar使った方が良いと思います。そのさじ加減も難しいですね）

## コレクション操作
KotlinにはMapやListなどのコレクションを操作する関数がたくさん用意されています。検索、集約、変換……操作の内容は様々です。
そんなコレクションの操作は連結して書くことが可能なので、関数を知っていれば複雑な操作も連結させて1行で書くことができます。
そして1行で書ければ「val」を使うことができて、より簡潔で安全なコードになります。
というわけで、たくさんのコレクション操作関数をいかに使えるがKotlinらしいコードを書くことに繋がります。

ちなみに、コレクションを操作する関数の数は優に50を超えます。めちゃくちゃ多いですね。
関数によっては書き方が複数ある場合もあるので、それらも使いこなせればより書き方の幅が広がります。
まずはよく使う関数から覚えて、少しずつ色んな関数を覚えていきたいですね。


## if・when式
個人的に一番「なんじゃこりゃ」と思った書き方がif式です。その名の通り、ifを式として使い値を返すことができます。
（代わりに三項演算子がないのでなるほどと思いました。）

if式を使うと、条件によって値が変わる変数への代入が、1行で書けるようになります。1行で書けるのでvalが使えて（以下略）というわけです。
また、PairやTripleを使えば最大3つまで値を返せるので、同じ条件で複数の値への代入も可能です。

```:Tripleで3つの変数を一気に設定
    val (hoge, fuga, aaa) = if (isFlag) {
        Triple("a", "b", "c")
	} else {
        Triple("x", "y", "z")
    }
```

whenはJavaのswitch文の代わりとして紹介されることが多いですが、個人的にはSQLのcase式に近いと思っています。
switch同様、値による条件分岐が可能です。さらにwhenは、引数を省略することで式による条件分岐も可能です。（この辺がcaseっぽいなと思うところ）
ifの代わりに使えば処理が簡潔になる場合があります。


## エルビス演算子（?: ）、セーフコール演算子（?.）
KotlinにはNull Safetyという特徴があり、nullを許容する変数かどうかは予め指定し、許容するならそれを想定した書き方をしなければいけません。
if(obj != null) のようなif文の代わりにエルビス演算子やセーフコール演算子を使うことで、null許容のオブジェクトに対する操作を連結して書くことができるようになり、簡潔なコードになります。


## スコープ関数
スコープ関数は、あるインスタンスに対して何かしら複数の操作を行う際に用いられます。
apply, also, let, run, with の5種類があり、作成したインスタンスの初期値設定や、null許容のオブジェクトに対する操作などを簡潔に書けるようになります。
それぞれの関数で、呼び出し元への参照の仕方と戻り値が異なるので、用途に合わせて使い分けられるようになりたいところです。


# おわりに
いかがでしたでしょうか。
今回はKotlin初心者向けということで、どれもKotlinに触れ始めたらすぐに出会う初歩的な要素ばかりだったかと思います。ですが、個人的にはそれらをいかに組み合わせて使いこなせるかが熟練度だと思っているので、今回このような形で紹介させていただきました。
自分も今回の記事を書くために色々調べながら「あぁあの処理はもっとこういう書き方ができたな」と改善の余地を見つけることができました。
みなさんもぜひ、より簡潔・安全なKotlinらしいコードを模索してみてください。

それでは、良いKotlinライフを！
Appiumはじめの一歩（Android版）

# はじめに

Appiumの[Getting Started](https://appium.io/docs/en/about-appium/getting-started/index.html)を進めていたのですが思ったよりも動かすのに苦労したので手順をまとめておきました。
GettingStartよりも簡単に動く（はず！）

https://appium.io/


# 環境

私が用意した環境は以下の通り
- node v16.16.0
- npm 8.11.0
- Java 11
- Android Studio 2021.2.1

# AndroidStudioのセットアップ

こちらに従ってインストール・セットアップを済ませます。以下が動くことを確認してください。
- adbコマンド
    - appiumを動かすときにadbコマンドを利用するため必要になります
- エミュレータの起動
    - ひとまずなんでもOKです。

https://appium.io/docs/en/about-appium/getting-started/index.html

# Appiumのインストール＆起動

```shell
npm install -g appium
```

正しくインストールできたか否かはappium-doctorをインストールしてappium-doctorコマンドを実行します

```shell
npm install -g appium-doctor
```

```shell
appium-doctor --android
```

appiumを起動します

```shell
appium
```

うまく起動すると以下のようなログが出力されます

```
C:\Users\uzres\products\appium-sample\appium-java-sample>appium
[Appium] Welcome to Appium v1.22.3
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
```

# エミュレータを起動します

公式で提供しているサンプルアプリケーションはAndroid Version 8（古い・・・）で動くものなので起動する手順に注意が必要です。

DeviceManager　- Create deviceを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/892ec1a5-9360-97cb-a65a-eb1f8ed72b6a.png)

Pixel3aを選択してみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/31b2e9ec-3a9a-ec9f-836d-3a8dfec434e5.png)

Android 8はOreoなのでこれを選択します。（ダウンロードしていない場合はダウンロードします）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/762d322c-4e39-9f2d-ecd7-8c9c9876c2fe.png)

名前を適当に変更してFinishを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/c4c949c6-a352-d2de-50ca-d0b7d4cf0cb6.png)

作ったエミュレータで再生ボタンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/04731ad7-c19c-8eea-6b22-8088c0aaa9a5.png)

端末が起動してくるはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/9e1af26f-3533-ff0b-ac26-7c3b7e7e98d5.png)

# テストの実行

今回はアプリをインストールし、TOPページのスクリーンショットを撮ってみます。

ソースはこちらからcloneしてください。

https://github.com/uzresk/appium-java-sample

公式が提供しているサンプルアプリをダウンロードし`appium-java-sample/src/test/resources/apps`に保存します

https://github.com/appium/appium/blob/1.x/sample-code/apps/ApiDemos-debug.apk

テストを実行します。エミュレータを見ていると実際にappiumが動いてる様子が見れるはずです。

jp.gr.java_conf.uzresk.appium.sample.FirstTest

ルートディレクトリに`screenshot.jpg`ができていれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/3471c432-cbc0-886c-986a-aa480512c638.png)

# 補足

## エミュレータにアプリを手動でインストール

adbコマンドでインストールが可能です。エミュレータに正しくインストールできるか確認してもよいでしょう。

```
adb install ApiDemos-debug.apk
```

## アクティビティ起動失敗時のトラブルシューティング

https://appium.io/docs/en/writing-running-appium/android/activity-startup/

## エミュレータでDiskが一杯

appiumを動かしていると以下のようなエラーが発生

```text
android.os.ParcelableException: java.io.IOException: Requested internal only, but not enough space
```

Emulatorを停止し、「WipeData」をクリックするとデータを消せる。
（Emulatorはウィンドウの×ボタンを押せば止まります）
Bing検索結果からリスティング広告を削除する方法

### リスティング広告とは
ブラウザで検索したときに上の方に出てくる広告です。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511520/cd1c78bd-8e39-0589-b0ff-6d52450ee179.png)
いつも「そうなんだけど、そうじゃない。」と思ってましたが、これって広告だったんですね。
chromeの拡張機能を検索しているのに、chrome自体をおすすめされても…

### Stylebotで削除
Chromeの拡張機能Stylebotを使ってリスティング広告を削除できます。
（なのでChrome拡張機能が使えるブラウザならなんでもOKだと思います、今回はVivaldiです）
[Stylebot Chromeウェブストア](https://chrome.google.com/webstore/detail/stylebot/oiaejidbmkiecgbjeifoejpgmdaleoha?hl=ja)

基本的な操作はこちらのサイトを参考にさせていただきました↓。
[【Bing】検索結果の広告記事を非表示にする方法　ナポリタン寿司のPC日記](https://www.naporitansushi.com/bing-advertising-hide/)

### 書き込むCSSコード
 ```
#b_results>li.b_ad {
  display: none;
}

.b_algo:has(> h2) {
  display: none;
}
 ```
![ｂ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511520/a0010963-9199-f82c-ffb8-bcc12aeb6895.png)

参考サイトのコードに追加した5行目以降を追加しただけですが。
（5行目にエラーがでてますが、機能はします。理由はわかりませんでした。）

![北海道-おすすめ-検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511520/958f7ffa-d329-7ecc-574d-ea13d5adf550.png)
無事、リスティング広告を削除できました。

### 純粋な検索結果を最上部に表示したい場合
上記のコードでリスティング広告は削除できましたが、まだオプション的な情報が表示されており、未だに純粋な検索結果が下の方にあります。
なので、以下のコードに書き換えると

 ```
#b_results>li.b_ad {
  display: none;
}

.b_algo:has(> h2) {
  display: none;
}

.b_vtl_deeplinks {
  display: none;
}

.b_mop {
  display: none;
}
 ```
![北海道-おすすめ-検索 (ｇｓ1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511520/12e63659-bb9c-5d03-2034-9230ba24dbfc.png)

余計な情報を削除して、純粋な検索結果を最上部に表示することができました！
というか、広告が多すぎて1ページ目には検索結果が3件しかないことがあるんですね…

### 最後に
途中で検索内容が変わったことに今気づきました。内容の本筋には関係ないので大丈夫だと思います。
今回のコードはすべてのリスティング広告に対応できるわけではないですが、まぁその都度対応していけば大丈夫なんじゃないかと思います。
あと、CSSが適用できればいいのでBingだけじゃなくてGoogle検索などにも有効なんじゃないかと思います。
Calendarクラスを勉強する

Calendarクラスをnewする
```sample.java
    public static void main(String[] args) {
        Calendar cl = new Calendar(2022,1,1);
    }
```
静的エラーとなる。
```
Calendarクラスはabstractです。インスタンスを作成することはできません。
```
代替策。getInstanceする
```sample.java
    public static void main(String[] args) {
        Calendar cl = Calendar.getInstance();
        System.out.println(cl);
    }
```
実行結果
```
java.util.GregorianCalendar[time=1671442947261,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=4,DAY_OF_MONTH=19,DAY_OF_YEAR=353,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=42,SECOND=27,MILLISECOND=261,ZONE_OFFSET=32400000,DST_OFFSET=0]
```
とても長いので抜粋。現在時刻、現在日付が入ってる。
現在日付は2022/12/19。月は-1。
```
YEAR=2022,MONTH=11,DAY_OF_MONTH=19
HOUR_OF_DAY=18,MINUTE=42,SECOND=27
```
日付をセット、翌年ずらし。
```sample.java
    public static void main(String[] args) {
        Calendar cl = Calendar.getInstance();
        cl.set(2023,4,3);
        System.out.println(cl);
        cl.add(Calendar.YEAR, 1);
        System.out.println(cl);
    }
```
実行結果（抜粋）。
```
YEAR=2023,MONTH=4,DAY_OF_MONTH=3
YEAR=2024,MONTH=4,DAY_OF_MONTH=3
```
いまさらAI学んでみた（第４回）

# はじめに
こんにちは、株式会社ジールの[@Suguru-Terouchi](https://qiita.com/Suguru-Terouchi)です。
身の回りがバタバタしてて投稿が遅くなってしまいました。

[いまさらAI学んでみた（第１回）](https://qiita.com/Suguru-Terouchi/items/9fdd86bde61658d06e2d)、[いまさらAI学んでみた（第２回）](https://qiita.com/Suguru-Terouchi/items/bf66da44cf0160e55dc5)、[いまさらAI学んでみた（第３回）](https://qiita.com/Suguru-Terouchi/items/1b41224059f34439b583)と続いて第４回目になります。
これまでで機械学習の手法である「教師あり学習」と「教師なし学習」について学んできました。

今回は手法としては最後になる「強化学習」について書いていきたいと思います。

# 強化学習ってなに？
強化学習について学ぶ前に「教師あり学習」と「教師なし学習」についてざっくりおさらいしましょう。
「教師あり学習」　・・・　データと答えを同時に与えて学習する手法
「教師なし学習」　・・・　答えのないデータから特徴や法則を見つけ出す学習手法

覚えてましたか？その手法の名前と一緒に考えると簡単ですよね。
では、これ以外の学習手法ってなにか想像できますか？

・・・
・・・

はい、出来ませんよね、、えっ、出来た？・・・そんな貴方は天才です。
想像出来なかった、そこの貴方も大丈夫です、一緒に学んでいきましょう。

それでは本題の強化学習について知っていくために活用事例から入った方が理解しやすいと思います。
有名なところで言うと「AlphaGo（アルファ碁）」という囲碁AIや自動お掃除ロボットのRo〇mbaさん、これから実用化が期待されている自動車の自動運転システム等があります。

囲碁AI（こんなドンピシャなイラストがあるなんて[いらすとや](https://www.irasutoya.com/)様、ハンパないっす。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/3858c9aa-4ead-9209-a248-45c376869762.png)

残念ながら私は囲碁をやったことがないので、我が家で絶賛活躍中のRo〇mbaさんを例に見ていきたいと思います。
（すみません、本当は別のメーカーです。。）

自動お掃除ロボットというくらいなので、部屋の掃除をするのがお仕事だと思いますが、それだけで良いのでしょうか？
もしかしたら毎日のお掃除が半日くらいかかってしまうかもしれません。それだと困りますよね。

それぞれのご家庭によって、部屋の広さや間取り、家具の配置など様々だと思いますが、
それらをカメラやセンサーなどを駆使して、掃除し忘れなく、効率的な掃除をするために強化学習が利用されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/0b15b1b2-04e2-ac42-b41a-66be984318bc.png)

この例では掃除をするという機能を持ったロボットが自ら試行錯誤を行っていくなかで、
どのようなルートで掃除をしたら効率良く掃除が出来た（最高得点）か？を学習していく、これが強化学習ということですね。

自分で学習して成長していくようで、なんだか ~~オラ、ワクワクすっぞ！~~ 将来性感じますよね。

# AWS DeepRacer
これで強化学習の概念は分かってきたかなと言うところでもう少し踏み込んでいきたいと思います。

強化学習を学んでいく中で個人的に興味を持っているもので、[AWS DeepRacer](https://aws.amazon.com/jp/deepracer/)というサービスがあります。
簡単に紹介するとラジコンカーを用いたレース競技ですが、操作するコントローラーはなく、強化学習を利用した自律型駆動マシンとなっています。（科学の力ってすげー）

少し話が逸れてしまいましたが、このDeepRacerのワークショップがこれから強化学習を学習する人の学習教材として、
とても良いと感じたのでご紹介したいと思います。

https://catalog.us-east-1.prod.workshops.aws/workshops/03f7e662-e3b1-4c5b-8fbe-b6af0c00c7b2/ja-JP/1-introduction

# おわりに
いかがでしたでしょうか。個人的には強化学習が一番興味あります。

第４回で機械学習の基礎の部分は終了になります。
次回はまだ検討中ですが、少し実践を交えた内容にしていきたいと思います。

# データ活用をサクッと始めるなら！
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
 
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
【Laravel9】いつのまにulidを生成できるようになったんだ

## 概要
Laravel9から文字列ヘルパ項目にulid生成が増えてる(strの上)

- Laravel8
![スクリーンショット 2022-12-19 18.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/4f5ecc41-4833-9395-e6a8-bbe4325da6a5.png)


- Laravel9
![スクリーンショット 2022-12-19 18.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/6ec35850-5c1f-a1fc-0069-7951d9397bb0.png)


### Str::ulid()

Str::ulidメソッドは、ULIDを生成します。

```php

use Illuminate\Support\Str;

return (string) Str::ulid();

// 01gd6r360bp37zj17nxb55yv40

```

https://readouble.com/laravel/9.x/ja/helpers.html#method-str-ulid

各ユーザーに固有のランダム文字列を与えたい時にuuidだと長すぎるなぁと思ってたので嬉しいです。
> ライブラリを使えば主キーにuuidやulidを使える様でしたが、Laravel9から主キーをuuidにできるようになったみたいです
GitHubの特定リポジトリのリリース情報をSlackに通知する

## はじめに
GitHubの特定リポジトリのリリース情報をSlackに通知する方法を書きます。
特定リポジトリのリリース情報を追いたい場合等に使用します。

## 前提
- Slack に GitHub のアプリケーションが既に追加されていること

## 通知設定
今回は、Sentry の公開リポジトリのリリース情報がSlackに通知されるよう設定していきます。
[getsentry/sentry](https://github.com/getsentry/sentry)

- Slackの通知したいチャンネルで、releases が購読できるよう設定

```zsh:コマンド
/github subscribe <リポジトリ> releases
```

```zsh:コマンド例
/github subscribe getsentry/sentry releases
```

- デフォルトで issues, pulls, commits, release, deployment の全てが購読されてしまうため、 releases 以外の購読を解除

```zsh:コマンド
/github unsubscribe <リポジトリ> issues,pulls,commits,deployments
```

```zsh:コマンド例
/github unsubscribe getsentry/sentry issues,pulls,commits,deployments
```

## 通知設定解除
以下のコマンドを実行すると、releases の購読を解除することができる。

```zsh:コマンド
/github unsubscribe <リポジトリ> releases
```

```zsh:コマンド例
/github unsubscribe getsentry/sentry releases
```


## 参考
- [Slack ワークスペースにアプリを追加する](https://slack.com/intl/ja-jp/help/articles/202035138-Slack-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
- [integrations/slack](https://github.com/integrations/slack#subscribing-and-unsubscribing)
- [Slack チャンネルに GitHub の特定リポジトリのrelease を通知する](https://shunyaueta.com/posts/2022-01-27/)
【WIndowsバッチ】「 1」(半角スペース+数字)の扱い

Windowsバッチで「test 1」のように(半角スペース+数字)を含む文字列をechoしようとしても上手くいかない場合がある。

```bat:test.bat
@echo off
setlocal enabledelayedexpansion

set OUTPUT_PATH=".\output.txt"
set INPUT_TEXT_0="test 0"
set INPUT_TEXT_1="test 1"
set INPUT_TEXT_2="test 2"
set INPUT_TEXT_3="test 9"
set INPUT_TEXT_4="test 10"
set INPUT_TEXT_5="test 11"
set INPUT_TEXT_6="test 99"
set INPUT_TEXT_7="test a"

call :OUTPUT_TEXT !INPUT_TEXT_0!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_1!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_2!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_3!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_4!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_5!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_6!
call :OUTPUT_BLANK
call :OUTPUT_TEXT !INPUT_TEXT_7!
call :OUTPUT_BLANK

pause
goto EOF

:OUTPUT_TEXT
echo [OUTPUT_TEXT_1]%~1
echo [OUTPUT_TEXT_1]%~1>> !OUTPUT_PATH!
echo [OUTPUT_TEXT_2]"%~1"
echo [OUTPUT_TEXT_2]"%~1">> !OUTPUT_PATH!
echo [OUTPUT_TEXT_3]%1
echo [OUTPUT_TEXT_3]%1>> !OUTPUT_PATH!
exit /b

:OUTPUT_BLANK
echo.
echo.>> !OUTPUT_PATH!
exit /b

:EOF
```

```text:コンソール出力
[OUTPUT_TEXT_1]test 0
[OUTPUT_TEXT_1]test
[OUTPUT_TEXT_2]"test 0"
[OUTPUT_TEXT_3]"test 0"

[OUTPUT_TEXT_1]test 1
[OUTPUT_TEXT_2]"test 1"
[OUTPUT_TEXT_3]"test 1"

[OUTPUT_TEXT_1]test 2
[OUTPUT_TEXT_1]test
[OUTPUT_TEXT_2]"test 2"
[OUTPUT_TEXT_3]"test 2"

[OUTPUT_TEXT_1]test 9
[OUTPUT_TEXT_1]test
[OUTPUT_TEXT_2]"test 9"
[OUTPUT_TEXT_3]"test 9"

[OUTPUT_TEXT_1]test 10
[OUTPUT_TEXT_2]"test 10"
[OUTPUT_TEXT_3]"test 10"

[OUTPUT_TEXT_1]test 11
[OUTPUT_TEXT_2]"test 11"
[OUTPUT_TEXT_3]"test 11"

[OUTPUT_TEXT_1]test 99
[OUTPUT_TEXT_2]"test 99"
[OUTPUT_TEXT_3]"test 99"

[OUTPUT_TEXT_1]test a
[OUTPUT_TEXT_2]"test a"
[OUTPUT_TEXT_3]"test a"

続行するには何かキーを押してください . . .
```

```text:output.txt
[OUTPUT_TEXT_2]"test 0"
[OUTPUT_TEXT_3]"test 0"

[OUTPUT_TEXT_1]test 
[OUTPUT_TEXT_2]"test 1"
[OUTPUT_TEXT_3]"test 1"

[OUTPUT_TEXT_2]"test 2"
[OUTPUT_TEXT_3]"test 2"

[OUTPUT_TEXT_2]"test 9"
[OUTPUT_TEXT_3]"test 9"

[OUTPUT_TEXT_1]test 10
[OUTPUT_TEXT_2]"test 10"
[OUTPUT_TEXT_3]"test 10"

[OUTPUT_TEXT_1]test 11
[OUTPUT_TEXT_2]"test 11"
[OUTPUT_TEXT_3]"test 11"

[OUTPUT_TEXT_1]test 99
[OUTPUT_TEXT_2]"test 99"
[OUTPUT_TEXT_3]"test 99"

[OUTPUT_TEXT_1]test a
[OUTPUT_TEXT_2]"test a"
[OUTPUT_TEXT_3]"test a"
```

半角スペースを挟んで1桁の数字は数値として認識されるためか期待通りの出力にならない。また1桁の数字でも1とそれ以外で出力が変わる。
半角スペースを挟んでも2桁以上の数字、もしくはアルファベットなど文字列として認識されるものであれば期待通りに出力される。勿論、ダブルクォートで括る(既に括られている場合はサブルーチン側で外さない)ことで回避は可能。
Laravelで新規開発するとき用のメモ

#  Laravelの標準機能

- FormRequest
- ApiResource
- Policy
- FeatureTest（UnitTestは無理せずできる範囲で）
- langファイル（エラーメッセージなど）
- [Observer](https://readouble.com/laravel/8.x/ja/eloquent.html)
- FakerとSeeder
- [Preventing Lazy Loading](https://laravel.com/docs/8.x/eloquent-relationships#preventing-lazy-loading)（N+1をエラーにしてくれる）
- Laradock
- [自動トランザクション](https://laracasts.com/discuss/channels/laravel/using-dbtransaction-automatically-in-all-controllers?page=1&replyId=570476)

# サードパーティ製パッケージ

- [nunomaduro/larastan](https://github.com/nunomaduro/larastan) （静的解析ツール）
- [friendsofphp/php-cs-fixer](https://packagist.org/packages/friendsofphp/php-cs-fixer)（formatter）
- [hotmeteor/spectator](https://github.com/hotmeteor/spectator)(OpenAPIに沿ったFeatureテストが簡単に実装できる)

# その他

- PHP 8.x
- Laravel 9.x
- CI, CD
- [命名規則](https://xqsit.github.io/laravel-coding-guidelines/docs/naming-conventions/)
- [Laravelベストプラクティス集](https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md)
- [なんちゃってクリーンアーキテクチャ](https://zenn.dev/mpyw/articles/ce7d09eb6d8117)
- 全てのクラスにBaseClassを作成し、共通化はそこで行う（BaseControllerなど）
- docsフォルダを作り仕様をmdで残す（Controllerごとがいいのかな？）
- トランザクション処理のMiddlewareを作る（[参考](https://laracasts.com/discuss/channels/laravel/using-dbtransaction-automatically-in-all-controllers?page=1&replyId=570476)）

# Database

### 新規テーブル作成時

テーブルを作成する際は以下のコマンドを使う

```
php artisan make:model User --all
```

### テーブル（カラム）変更時

`modify_テーブル名_table_日付 --table=テーブル名`で統一する。
命名を統一させたいが同じクラス名を宣言できないため日付を入れる。

```
php artisan make:migration modify_users_table_20221201 --table=users
```
謙遜するChatGPT

# ChatGPT

無料で使えます。
Googleアカウントと電話番号の登録が必要です。
https://openai.com/blog/chatgpt/

# 会話

私
あなたはなぜそんなに自然な日本語を喋れるのですか？

ChatGPT
私は人工知能の言語モデルであるため、文章を入力すると自然な日本語を出力することができます。
私は、大量のテキストデータをもとに学習させることで、自然な日本語を生成する能力を持っています。

私が使用されている言語モデルは、OpenAIのGPT-3というモデルです。
GPT-3は、大量のテキストデータをもとにトレーニングされた超大型の言語モデルで、自然な日本語を生成する能力が高く、文章を入力すると、人間が書いたかのような自然な日本語を出力することができます。

私は、GPT-3をもとにして、さらにカスタマイズされて作られています。
そのため、GPT-3をもとにしてさらに自然な日本語を生成することができるようになっています。

私
すごいですね

ChatGPT
ありがとうございます。
私は、人工知能の言語モデルとして、文章を入力すると自然な日本語を出力することができるようになっていますが、人間と同じように思考したり、感情を持ったりすることはできません。
私は、プログラムによって構築されたものであり、人間と同じように考えることはできません。
そのため、人間のように自然な日本語を生成することができるだけであり、人間のように思考したり感情を持ったりすることはできません。

# 感想 

いや、まじですごすぎるんだが、、、

# ChatGPT (再掲)

無料で使えます。
Googleアカウントと電話番号の登録が必要です。
https://openai.com/blog/chatgpt/

ほんとおもしろいので、絶対やってください
C#.NETのexeでdllファイルを別フォルダーにまとめる

# 概要

dll多くなるとビルド先が ↓ こんな風になっちゃう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/96af3f83-de5d-9b88-1b9b-88ca9012ec4c.png)
「exeどこやねん…」ってなっちゃう。

 ↓ こういう風にすっきりさせたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/abb480f7-9345-160a-cb17-2bd11e35e966.png)
（dllファイルはbinフォルダーにまとめる）

# ビルドイベント

ビルド時のフォルダー作成やdllファイルの移動については下記。

https://qiita.com/waokitsune/items/c847a8d1ed47af70d7d8



# exeの設定

ただdllファイルをまとめるだけではダメ。（exe実行時に例外）
『dllファイルがどこにまとまってるか』を設定ファイルに書いてあげる必要あり。

App.configを作成して....
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/4d0de404-d26f-a076-3057-19850be97f14.png)


App.configに…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ba97fbd1-d318-92e6-9219-f5df8d5d903a.png)

下記追加。

```xml
<probing privatePath="bin" />
```

追加する場所（階層）は ↓ ここ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6ad3087e-589a-4c59-d8e2-afc9df276f8d.png)

dllをまとめるフォルダーは『bin』以外の名前でもOK。


# 参考サイトさん

https://qiita.com/float-on-mk-9/items/166ccb7a1fed53783a0e

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft Visual Studio Community 2022 Version 17.4.2
VisualStudio.17.Release/17.4.2+33122.133
Microsoft .NET Framework Version 4.8.04084
新卒一年目エンジニアがAWS SAA (C03)を取得した学習方法

こちらは[新人エンジニアにすすめたい、あなたの勉強法をシェアしよう！ by Udemy Advent Calendar 2022](https://qiita.com/advent-calendar/2022/udemy)の記事です。



## 概要
新卒一年目のエンジニアがAWS認定資格のSolution Architect Associate (SAA)に合格するために行った学習方法について本記事で共有いたします。

これから認定資格に向けて学習される方の参考になれば幸いです。

## 前提 （筆者のスキルレベル）
AWS　SAAを取得する前の筆者の技術的知識・スキルレベルは以下となっております。

- 基本情報技術者試験取得済み
- AWS経験は**実務4ヶ月**
- 学生時代のAWS経験はLambda関数やS3バケットを作成した程度
- 大学の専攻は非情報系（文系学部）

## 学習期間

**勉強期間**
約2ヶ月

**1日の勉強時間**
平均2時間程度 (夜は疲れてるので朝に勉強してました)
試験1週間前は+2時間くらい


## 学習教材
学習教材として**Udemy**で2つの教材を活用していました。

①知識インプット用
②問題集

以上の二つの教材を交互に繰り返すことによって、知識の定着を図りました。

### 知識インプット用

https://www.udemy.com/course/aws-associate/

こちらはAWS SAAで出題される各リソースの概要を学ぶインプットとして活用していました。
**ハンズオン形式**で学習を進めることができるので、実際に手を動かしながら各リソースの作成・設定手順を覚えることができ、実務にも役にたつ内容となっております。
また、講義の中でS3のストレージクラスやALBの設定項目など、試験で出題される内容が整理された表でまとめられているので、時間がない時にさっと復習する時にも便利です。


### 問題集

https://www.udemy.com/course/aws-knan/

知識を定着させるために、ある程度インプット学習が進んだ段階で問題集に着手しました。
最初は5割程度しか取れませんでしたが、間違えたところを復習したり、気になったところを**AWS公式ドキュメント**等で確認するなどすることによって徐々に点数を伸ばすことができました。

上記の教材には高難易度の問題集が収録されていますが、（個人的に）**実際の試験と同等レベル**くらいの難易度だと感じました。
試験直前に8割以上取れると良いと思います。


## 合格するためのポイント

### 早めに問題集を解きまくる
ひたすらインプット学習をしても、知識はなかなか定着しないものです。
ある程度講義を視聴したら、**「問題集を解き、間違えたところを復習する」** というサイクルをひたすら繰り返すことが大事です。
最初は全然点数が取れないかと思いますが、反復することによって効率よく知識の定着を図ることができます。

### ハンズオンに時間をかけすぎない
学習教材のハンズオンコンテンツは各サービスの概要を掴むには良いですが、**時間がない時は飛ばしても大丈夫**かと思います。
AWS SAAの試験では実際にコンソールを動かすことはありませんし、知識があれば解けるといった出題内容なので、時間がかかるハンズオンをやるよりは講義資料を読みこんでざっと概要を掴むのが良いです。

### 公式ドキュメントも読む

学習を進める中で疑問に感じたことは、公式ドキュメントを読んで調べることをお勧めします。
公式ということもあり**最新の情報**が書かれており、信頼性が高いです。

「AWSの公式ドキュメントはちょっと読みづらい・・」というときは公式の説明を読みつつ、分かりやすくまとめられたブログ等と一緒に読んで理解を深めるのも良いでしょう
**（情報が古い記事もあるので注意）**

***

とりあえずひたすら問題集を解いて、100点を取れるまで何度も反復をするといったことを意識すれば、合格の可能性はぐっと高まります。
AWS認定資格の合格を目指している方々、ぜひ頑張ってください m(_ _)m
データ民主化を進める上で大事な3つの事

この記事は[モチベーションクラウドシリーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs)の投稿です。

:::note info
テックブログのお知らせ
弊社ではテックブログもやっております。宜しければこちらもどうぞ！
https://link-and-motivation.hatenablog.com/
:::


# はじめに
私達のチームではデータサイエンティスト・データエンジニアとして、自社のSaaSプロダクトのお客様の利用状況等のデータを用いて解約予測を行うモデルを作成し現場のコンサルタントに予測結果を公開、顧客価値向上のためのPDCAの材料にしてもらっています。

> - このような取り組みはSaaSビジネスにおける顧客のカスタマーサクセスを目指す上で非常に重要で、一般に「ヘルススコア」と呼びます
> - 国内だとSanSanさんが特にこの領域で先進的な取り組みを共有されており、僕たちもよく参考にさせていただきました([こちら](https://blog.allstarsaas.com/posts/saascs-health-score)を参照)


# 課題
しかし、それまでの文化や慣習をいきなり変え、これまで見てこなかった種類のデータを元にしたPDCAを行う様に組織や人の心理を変えることはなかなか難しいものです。
我々もせっかくヘルススコアを作ったはいいものの、組織に浸透させ、実際に現場のコンサルタントの皆さんに使って頂き価値につなげるまでには長い年月の中でたくさんの失敗を重ねてきました。

例えばこんな感じ

> 私:「精度高くお客さんの解約予測出来るモデル出来ました！ あなたの担当するお客さんが辞める確率XX%です！　なんとかしてください！」
> 現場のコンサルタント：「お、おう（最近担当者の方にお会いした時そんな素振りもなかったし、そんなはずないんだけどな、、）」

> 私:「ダッシュボード作りました！！ 使ってください！！」
> 現場のコンサルタント：「ありがとうございます！(とはいえ使うのMustではないよね。使わなくていいかー)」



# やったこと
こういった状況に対して、打った打ち手は以下の3つです。

**1. Quick Winを目指す**
**2. 徹底したホワイトボックス化**
**3. お互いの限界を認識し、役割の握り直し**


## 1. Quick Winを目指す 
DXを進める上でも重要と言われていてご存じの方も多いかもしれませんが、**まずは小さな部署で初期に成功体験を出そう！** ということです。
導入当初は全社で導入しようとしてヘルススコア作ってはいたものの、スコア自体の信頼感を全体に波及させることが出来ず、活用しきれていませんでした。
なのでまずは部署を絞って、違和感が減るようにロジック/ダッシュボードを小さく改善するということを地道にやって、信頼を得る事が大事だと思います。
僕らの場合もある特定のエンタープライズ向けの部署で、顧客の状態をCSとCSMお客様の状況の認識をすり合わせるMTGに参加させてもらって、スコアの違和感だったりをヒアリングして地道に改善を進めました。
今回のヘルススコアで言えば、具体的には解約率に困ってるチームとか、データ活用とかに積極的なチームにターゲットを絞ることが重要でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642699/6e1277a4-2603-d522-64f6-2d10d2adc853.png)



## 2. 徹底したホワイトボックス化
**「ただ単に予測精度を上げることのみ」** を目的においてモデリングを行うと、NN系やlightgbm等の木構造のモデルなどを採用し、アンサンブルさせ、、たくなりますが、ぐっと堪える事が大切な場面もあります。
**なるべく精度も出るが、説明可能性の高いモデルを活用しましょう。**
現場のコンサルタントが結果を見たときにひと目で「なぜこの予測結果になるのか」が説明できなくなる可能性が上がるためです(複雑なモデルにすることで予測精度の向上は見込めますが、解釈可能性とのトレードオフになります)

ここ数年[lime](https://homes.cs.washington.edu/~marcotcr/blog/lime/)や[shap](https://shap.readthedocs.io/en/latest/example_notebooks/overviews/An%20introduction%20to%20explainable%20AI%20with%20Shapley%20values.html)等、機械学習モデルを局所的に解釈する技術も発展しており我々もこれらを使うことで「精度と説明可能性のトレードオフが解決するのでは！？！?」と胸を躍らせ試してみることも行いましたが、毎日のPDCAを行う際にshapのグラフをいちいち見て、、というのは今回のケースでは現実的ではなかったため断念した過去がありました。

こういった背景を経て現在は[numpyro](https://num.pyro.ai/en/latest/index.html#introductory-tutorials)を用いた確率モデルを採用しています。詳しい背景・変遷は別記事(今後公開予定！多分！)で解説します！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642699/60c4a765-6cfd-a504-84cd-687d3f1b2979.png)


## 3. お互いの限界を認識し、役割の握り直し
浸透が上手く行っていなかったときは、お互いの精度だけに目が行ってしまってしまいます。
我々：「ヘルススコアの方が正しい」
CSM(現場のコンサルタント)：「私の感覚の方が正しい」
とそれぞれが思っているって感じです。
ただその状態から、**「ヘルススコアも、もちろんCSMの感覚も完璧じゃないし限界がある、互いに補完しあおう」** という共通認識が生まれたことが一番重要だったなと思っています。
ここまで行くのは大変でしたが、どちらかが検知出来たが、もう片方が検知出来なかった例を一緒に見ながら、精度を向上させるために取り組んで行ったことで少しづつ進んだ感があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642699/47cd014b-1837-b5ee-ea03-d724ce15de4f.png)


# 最後に
いかがだったでしょうか。
今回はヘルススコアの活用に関するナレッジとしてご紹介しましたが、データ活用・データの民主化等、新しい文化を埋め込むことを推進する際には共通して重要になってくることだと考えています。
新しい文化を作るのは非常に難しいですが、そこに向き合ってこそ本当の意味で価値が出せるのかなと痛感したこれまででした。
これからも **「ただ良いモデルを作る人」** ではなく、 **「データサイエンスで実際に価値が出るまでやりきる人」** を目指していきたいと思います。
では、みなさんも良いデータ活用ライフを！
Introduction To Pega Platform を受講した

## そもそもPegaとは
- 今流行りのローコードツール。
  - ローコードツールの有用性、無用性についてはここでは割愛。
- Pegaそのものの日本語の情報は以下を参照されたい。

https://www.pega.com/ja

## 資格との違い
- CertificationとCertificateの違い。
  - 前者は試験に合格すると貰え、後者はトレーニングコースを修了すると貰える、
    - 日本は科挙の文化の影響のせいか、Certificationの方が評価されやすいように感じる。
- 終了するとPegaのMyPageにバッジが貰える。
  - これでPegaについて知っている、と帳面上は言う事が可能。
    - 経験がある、と言えるかどうかはまた別。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/724c537c-f6c6-8166-c618-d1340ae1815c.png)


## 受講について
- 前提条件
  - アカウントは既に作成済みのものとする。
- 以下のページの下部に日本語用の入り口があるのでそこから実施する。

https://academy.pega.com/ja/mission/introduction-pega-platform/v5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/64bce9f4-9052-5af4-c5a8-406727c8eb4c.png)

上から順番に受けていけばよろしい構造になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/7c411204-3580-74ea-887e-ea0906844a3d.png)

一つのモジュールは講座と小テストで構成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/c9db66c1-c1f8-a687-a5e5-d5d53372a7d5.png)

- 小テストは何回間違えても良い。
- 全部のモジュールを終えると上述の通りバッジが貰える。


## 雑感
- ローコードツールとは何なのかが分かった。
  - あくまでも概要が分かる程度。
  - Introduction だけではApp Studio, Dev Studioを使っての具体的な作業まで進まないので。
- 実際に開発をする、という話であれば最低でもLow-Code App Builder, Low-Code App Builder Extendedあたりまで受講しないと意味がないように感じる。
  - それでも足りない、という話はあるが、その議論はしない。
- 欧米諸国の考え方よろしく、ビジネスアナリスト、システムアーキテクト、データアナリストと分業化されているので、それと共に後続のコースが分かれていくが、日本の開発現場ではそんなにきれいに分業化されることはないのでは、と思う。
  - It's not in my job description. （その仕事は私の職務内容書のうちに入っていません。）と言えるかどうか。
  - ジェネラリストやπ型、T型人材が好まれるとかそんな話。

以上。
writing-modeについて調べる

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 20日目です。

writing-mode プロパティについて調べます。

## writing-modeプロパティについて

https://developer.mozilla.org/ja/docs/Web/CSS/writing-mode

縦書きか横書きか設定できる。
また、言語の書字方向にも左右される。

### 書字方向について

日本語や英語なら左書き `ltr`
アラビア語やヘブライ語なら右書き `rtl`

### とりうる値

- `horizontal-tb` - 横書き
    - ltr なら左から右
    - rtl なら右から左
- `vertical-rl` - 縦書き
    - ltr なら2行目が左側に来る
    - rtl なら2行名が右側に来る
- `vertical-lr` - 縦書き
    - ltr なら2行目が左側に来る
    - rtl なら2行名が右側に来る
- `sideways-rl` - 縦書き
    - ltr なら下から上に流れる
    - rtl なら右に倒す
- `sideways-lr` - 縦書き
    - ltr なら上から下に流れる
    - rtl なら左に倒す

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/writing-mode
    - に掲載されたサンプルが普通にわかりやすかったのでサンプル作るのやめます。。
    - （rtl の文章むずかしいわ）
    - 多言語対応ほんと難しいけど必要ならちゃんと時間をかけてやるべきだなと思いました（感想）