OmniAICreator/Qiita-1.07M huggingface dataset:
JustPDF5[作成]をコマンドライン(python3)で使う。

**JustPDF5[作成]をコマンドライン(python)で使う。20230221**(YYYYMMDD)
環境　windows11pro 64bit　/　python3.9(anaconda) /JustSystem JustPDF5

**結論**
**pythonのsubprocess.runの引数は、{}.format()を使うと成功**
**pythonでJustPdf5CmdCreator.exe実行すると、CMD制限文字数が8,191文字ではなく32,766文字にみなせると推定。**
**pythonでJustPdf5CmdCreator.exe実行すると、1アクション当たりのJustPDFの制限である500ページを突破し、2900ページのpdfを作成出来た。**

----------------
**1.JustPDF5の仕様**
JustPDF5を標準でインストールすると、"C:\Program Files (x86)\JustSystems\JustPdf5\Creator\JustPdf5CmdCreator.exe"
として、「JustPdf5CmdCreator.exe」がインストールされます。
これが、コマンドライン入力を担います。コマンドライン入力に関し、マニュアルに記載はなく、ヘルプに出てくるだけです。
当該ヘルプに、複数のpng-filesを1つのPDFにする場合は
JustPdf5CmdCreator.exe◇/combine◇"ファイルパス1"◇"ファイルパス2"◇・・・◇/out◇"出力先フォルダー" 
とコマンドを実行するとなっています。
◇は、半角スペース。◇と""とPath区切り記号(/)を、厳格に守ることでコマンドライン入力を受け付けます。
これ重要、◇と""とPath区切り記号(/)を、厳格に守る。
combineは、PDF形式以外の、たとえばpng_fileをPDF形式にしてから、結合させるという便利なものです。

**2.pythonでJustPdf5CmdCreator.exeを実行する考え方**
Pythonのsubprocess.runを使います。
ここで、問題なのは、結合対象の対象とするFileのFile-Pathを全てコマンドラインの中に埋め込むということになります。
つまり、subprocess.runの引数に文字列変数を入れ込むこととなります。
具体的には
subprocess.run(r'JustPdf5CmdCreator.exe◇/combine◇"ファイルパス1"◇"ファイルパス2"◇・・・◇/out◇"出力先フォルダー"')
となり、「"ファイルパス1"◇"ファイルパス2"◇・・・◇」の部分が文字列として入れ込む必要があります。
いろいろと。試行錯誤した結果、

画像fileがリストとして　"a001.png" "a002.png"...."a500.png"とある場合
リストをjoin関数で、１文に繋げる。それを{}.format()で入れ込むことで解決しました。


**3.pythonでJustPdf5CmdCreator.exeを実行した例**
　ファイル構成
Sドライブで実施
S:/03_PDFs_by_justPDF5 #作成したPDF-fileを保存するフォルダ
S:/04_main_work/test# test用のpngファイルを保存しているフォルダ。*連番.pngなります。
JustPdf5CmdCreator.exeは、**windows11の詳細設定でPathを記憶**させておきます。

 ` ` `
'''
creat PNG2PDF by JustPDF5
'''
import os
import subprocess

os.chdir('S:/04_main_work/test')　#JustPdf5CmdCreator.exeに渡すpng-filesにPathを記載しなくてすむように。
pngBasename=os.listdir('S:/04_main_work/test/') #png-filesのbasenameのみを取得します。
spng = '" "'.join(pngBasename)　#全てのpng-filesの名前を"◇"を区切り文字として、連結。◇は、半角スペース。
spng = '"'+spng+'"'    #spngの前後に"を追加
subprocess.run(r'JustPdf5CmdCreator.exe /combine {} /out "S:\03_PDFs_by_justPDF5" /imagecomp 1'.format(spng))
 ` ` `
{}.format()を使うことで、コマンドラインに埋め込むことができました。
最初の「r'」は、文字列をそのまま、CMDに渡す設定のようです。だから、{}もそのまま、文字として、持っていかれる心配もありました。最後の/imagecomp 1はpdf圧縮の程度で、数字の1は、JustPDF本体(GUI版)で設定します。
ここで、重要なのはパスの切り方です。特に、pythonのドライブは/で区切りますが、windowsは\です。


**3.pythonでJustPdf5CmdCreator.exeを実行した場合の制限事項**
JustPDFの仕様は500Filesまでの結合です。501Fileあるとすると、250filesと251files等に分ける必要があります。実際、エラーが出ます。JustPDFのコマンドラインのヘルプでも「指定できるパスは1度に500個までです。」と明記されています。
これって、CMDの文字数制限8191文字に関係してるのかなと思っていました。
ところが、pythonでJustPdf5CmdCreator.exeを実行した場合の文字数制限は32,766文字になるようです。pythonとの組み合わせの場合。
試験として200pixel*100pixelのpng-file(ファイル名は4桁連番、たとえば1234.pngで８文字。区切り文字" "を加えて11文字。)を結合させると
pdfで2900ページ、CMDに渡したと考えられるword数は31977で成功しました。
ちなみに、3000ページでは「WindowsEroor206_ファイル名が長すぎる」が出ました。
ちなみに、Windows Power automate DesktopでCMDスクリプトとしてJustPdf5CmdCreator.exeを実行すると、制限500個は出現しました。
Azureを何も知らずに開発した結果

一人現場だったので、誰も自分の暴走を止めることはできず、`誰かのせいにしたいが自分の顔しか思い浮かばない`

## ①SQLServer側の日時設定を変更できないことを知らずに、日時をDBで生成(自動入力)する

**マジでアカンかった…**
「現在時刻」や「今日の日付」のような値はブラウザorサーバで生成してDBに登録しましょう…DBのgetdate()のような自動入力に頼らない方が良いです。

AzureSQLの日時設定は変更できないため、SELECT時にUTCからJSTに変換する処理を漏れなく書くことになります。

なお、グローバルで使うシステムを開発するなら特に問題ありません。

## ②SQLServerのテーブル作成時に自動採番(AUTO INCREMENT)のIDENTITY設定をし忘れる

自動採番するカラムなのに、IDENTITYを設定し忘れると、後でALTERとかで変更ができないので、テーブルを再作成することになります。 ~~どうして。~~ 場合によっては漏れなく`SELECT MAX(列名)+1`で採番する処理を書くことになります。
https://www.ipentec.com/document/sql-server-set-column-to-identity

## ③AzureAppServiceにSPAのコンテンツをデプロイしても動作しなくてハマる
Nginxの設定が初期でSPAに対応していません。

`/etc/nginx/sites-enabled/default`のlocation /を書き換える必要があります。

下記に一例を載せておきます。
```
    location / {            
        root /home/site/wwwroot;
        index index.html index.php;
        try_files $uri $uri/ /index.php?$query_string;
    }
```

設定後、`nginx -s reload`も忘れずに。

## ④AzureAppServiceを再起動して環境を飛ばす

これはちゃんと英語のメッセージを読んでいなかった自分がダメなんですが…
/home以外にデータを保存すると、サービス再起動したときに全て消えます。
環境変数を後から追加して、気づきました。

## ⑤リソースやディレクトリをよく理解せずに変な場所に環境を構築する
どのディレクトリ、どのリソースに、なにを作成するか、キチンと確認しましょう…。これも場合によってはマジで沼になります。


----

時代の変化に合わせて開発方法やインフラ環境も大きく変化しますよね。

新しい方法を学ばずに「旧スタイルの開発手法や知識しか持ってないけど、なんとかなるやろ」って思って、こういう細かいことを確認せずに着手すると色んなところで地獄を見ることがあります。

Azureは取り返しのつかない要素が結構多いと思います。AWSやGCPもそうかもしれないけど、本番運用が始まってから気づくと、時すでに手遅れになることもあります。

なので、自戒の意味も込めてココにメモをしておきます。
CSVファイル利用（備忘録）

## ファイルダイアログ表示

画像のようなファイルダイアログを表示
![](https://dobon.net/vb/dotnet/form/img/openfiledialog1.png)

```vb:vb.net
 Dim ofd As New OpenFileDialog()
'はじめに表示されるフォルダを指定する
'指定しない（空の文字列）の時は、現在のディレクトリが表示される
ofd.InitialDirectory = "C:\"

'[ファイルの種類]に表示される選択肢を指定する
ofd.Filter = "CSV ファイル|*.csv|すべてのファイル(*.*)|*.*"
'今回は、先ほど設定したフィルターの "CSV ファイル" が選択された状態でダイアログが開くようにします。
ofd.FilterIndex = 1

'タイトルを設定する
ofd.Title = "開くファイルを選択してください"

'ダイアログを表示する
If ofd.ShowDialog() = DialogResult.OK Then
    'OKボタンがクリックされたとき、選択されたファイル名を表示する
    Console.WriteLine(ofd.FileName)
End If
```

## CSVファイルの読み込み(C#でも利用可)

TextFieldParserクラスはMicrosoft.VisualBasic.FileIO名前空間にあるので、まずはMicrosoft.VisualBasicアセンブリへの参照を追加しておきます。
![](https://webbibouroku.com/Images/Article/textfieldparser-01.png)

```vb:vb.net
Imports System.Text
Imports Microsoft.VisualBasic.FileIO

Module Module1
    Sub Main()
        Using parser As New TextFieldParser("C:\work\test.csv",
                                            Encoding.GetEncoding("Shift_JIS"))
            ' カンマ区切りの文字を指定
            parser.TextFieldType = FieldType.Delimited 'フィールドが区切り形式であることを示します。
            parser.SetDelimiters(",") '区切り文字が(",")であることを示します。

            ' フィールドが引用符で囲まれているか
            parser.HasFieldsEnclosedInQuotes = True
            ' フィールドの空白トリム設定
            ' フィールド前後の空白文字を削除したくない場合にはTrimWhiteSpaceプロパティをfalseに設定する（デフォルトはtrue）
            parser.TrimWhiteSpace = False

            ' ファイルの終端までループ
            While Not parser.EndOfData
                ' フィールドを読込
                Dim row As String() = parser.ReadFields()
                For Each field As String In row
                    ' タブ区切りで出力
                    Console.Write(field + vbTab)
                Next
                Console.WriteLine()
            End While
        End Using
        Console.ReadKey()
    End Sub
End Module
```
[memo] JavaScript/TypeScriptで配列をreduceを使って連想配列に畳み込む

# はじめに

* JavaScript/TypeScript で `Array` を `reduce()` を使って連想配列(JavaScriptの普通のオブジェクト)に畳み込む方法がある
* 同様に Map オブジェクトに畳み込む方法もある
* そのうち忘れるはずなので、その時のためにメモを残しておく

## 何も考えず forEach で実装する

配列を処理/加工して、ハッシュマップや連想配列みたいなものにしたいことってあると思います。

前提として以下のような型やデータがあるとします。

```typescript
interface Info {
    name: string;
    id: string;
    // ...
}

type InfoMap = { [id: string]: Info };

const infos: Info[] = [
    { id: "1", name: "foo", /* ... */ },
    { id: "2", name: "bar", /* ... */ },
    { id: "3", name: "baz", /* ... */ },
];
```

ここで、`infos` をもとに `InfoMap` を作りたいとします。
何も考えないで実装すると、以下のようになると思います。

```typescript
const infoMap: InfoMap = {};
infos.forEach((info) => {
    infoMap[info.id] = info;
});
```

これでもいいんですけど、宣言的な感じじゃなくて、ちょっともやっとしますよね。

## reduce で実装

JavaScript の `Array` には `reduce()` という、畳み込み用のメソッドがあります。

配列の合計を求めるとか、最大値を求めるとかに使ったりすると思います。

```typescript
const data = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
const sum = data.reduce((a, b) => a + b, 0);
const maxData = data.reduce((a, b) => Math.max(a, b), Number.NEGATIVE_INFINITY);
```

上記の場合、配列要素と、畳み込み結果（および初期値）の型は同じ( `number` )になっていますが、実は違っていても大丈夫らしいです。

なので、以下のようにして連想配列に畳み込むことができます。

```typescript
const infoMap = infos.reduce<InfoMap>((map, info) => {
    map[info.id] = info;
    return map;
}, {});
```

ポイントは `return map;` が必要なあたりでしょうか。

ちなみにジェネリック型を明示しないで、以下のように初期値を `{} as InfoMap` とすることもできますが、やっぱり `as` を使うよりは型安全な上記の方が良いのかな(初期値は空オブジェクトなのであまり変わらないかもしれないけど)。

```typescript:as を使う方法
const infoMap = infos.reduce((map, info) => {
    map[info.id] = info;
    return map;
}, {} as InfoMap);
```

最近の JavaScript には Map オブジェクトというものもあるので、Map オブジェクトに畳み込む例もメモしておきます。

```typescript:as を使う方法
const infoMap = infos.reduce(
    (map, info) => map.set(info.id, info),
    new Map<string, Info>()
);
```

Map オブジェクトの場合、`set()` メソッドは、メソッドチェーンのために Map オブジェクトそのものを返すので、`return map;` みたいな処理を書かなくてよいので少しすっきりしていますね。

ただし、単純な `set()` 以外のことがやりたい場合には、`return map;` が必要になるので、注意が必要です。

## もっと簡単な方法（追記）

単に、連想配列、Map オブジェクトにするだけであればもっと簡単な方法があります。

連想配列にする場合

```ts
const infoMap = Object.fromEntries(infos.map(x => [x.id, x]));
```

Map オブジェクトにする場合

```ts
const infoMap = new Map(infos.map(x => [x.id, x]));
```

ただ、もっと複雑な集計等をしたい（例：配列には月ごとのデータがあって、連想配列には同一キーごとに期間内の合計を求めたい）場合には `reduce()` を使う必要があると思います。
（本記事は、そのあたりの説明が抜けているので注意してください。あとで見直すかも）

## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
php.iniの設定を一時的に変更する

## ini_set関数でphp.iniの設定が一時的に変更できる。

例えば、特定の処理の間だけphp.iniのmemory_limitを上げたい、といった場合、以下のようにして一時的に変更ができる。
処理が終わるとこの変更は破棄されて元の値に戻る。
```
ini_set('memory_limit', '1024M');
```

## ini_set関数では変更できない項目もある

全ての項目がini_set関数で変更できるわけではない。

わかりやすい参考記事様：

https://qiita.com/nagahama/items/7ab9dab0085faa480315

php公式：

https://www.php.net/manual/ja/configuration.changes.modes.php

https://www.php.net/manual/ja/ini.list.php
備忘録: vimでTypeScript(tsx)ファイルのカラースキーマ設定

# 通常使用している設定
```.exrc
set number
set tabstop=4
set hlsearch
nmap <Esc><Esc> :nohlsearch<CR><Esc>
"colorscheme pyte
"colorscheme color2
"vimのハイライト情報を表示する
"  http://cohama.hateblo.jp/entry/2013/08/11/020849
:runtime syntaxinfo.vim
"http://blog.nest-online.jp/16976
"https://github.com/itchyny/lightline.vim
":runtime lightline.vim

"http://qiita.com/tashua314/items/101f1bec368c75a90251
" ファイル名表示
set statusline=%F
" 変更チェック表示
set statusline+=%m
" 読み込み専用かどうか表示
set statusline+=%r
" ヘルプページなら[HELP]と表示
set statusline+=%h
" プレビューウインドウなら[Prevew]と表示
set statusline+=%w
" これ以降は右寄せ表示
set statusline+=%=
" file encoding
set statusline+=[ENC=%{&fileencoding}]
" 現在行数/全行数
set statusline+=[LOW=%l/%L]
" ステータスラインを常に表示(0:表示しない、1:2つ以上ウィンドウがある時だけ表示)
set laststatus=2

"独自のカラーパレットを設定
"colorscheme personal_env
```

# TypeScript(tsx)ファイルのカラースキーマ設定を行う
以下のカラースキーマを使用させていただいた。

https://github.com/leafgarland/typescript-vim

```
$ git clone https://github.com/leafgarland/typescript-vim.git ~/.vim/pack/typescript/start/typescript-vim
```
使用してみて気になったら調整するかも。
異世界で学ぶ！アジャイルワークショップ「スクラムでプロセス改善！」vol.3

*今回、スクラムに関するカンファレンスに**初参加**したので、
**イベント概要**、**参加してみての感想**、**今後のアクションアイテム**をまとめようと思います。*

# 今回参加したイベント #
[異世界で学ぶ！アジャイルワークショップ「スクラムでプロセス改善！Vol.3」](https://shiftevolve.connpass.com/event/270203/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link) 
主催:(株)SHIFT様

### agenda
```
自己紹介ワーク(20分間)
プロセス改善の説明(5分間)
ストーリーと説明(10分間)
ワークショップ(60分間)
振り返りの前の説明(3分間)
振り返り(12分間)
```

# 自己紹介ワーク #
**メンバー3人**、**SM1人**のチームに参加してきました。
これからワークを進めるにあたり、まずはメンバーを知るため自己紹介ワークを実施。

**発表内容**
* ニックネーム
* 職業
* 趣味
* 最近あった嬉しかったこと
* もし異世界に行ったらこんなことしたい

ここでそれぞれもメンバーの特徴やお互いの共通点を知れました。
(まさかのゴリゴリのSM推進担当の方がいたのはびっくり。。。)

## チームを象徴とするシンボルを作ろう！！ 
Miroの図形作成機能 「**Shapes**」の図形を用いて作成。

**ルール**
* 図形を変形させない。
* 色は変えてOK!

ここで早くも最初のチームワークを実施しました。
僕のチームでは自己紹介ワークの際、**スクラムによる心理的安全性の確保**に関する話が挙がりました。

そこで、決定したチームのシンボルは。。
![チームロゴ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707072/326fb411-964c-cd36-0890-34d884c9258c.png)
これに決定しました！
理由:暗闇の中にあるシンボルで辺りを照らし、**みんなが楽しめるような安全な環境を作りたい**と思ったから

# プロセス改善
短いサイクルでリリースすることで、いち早くFBをもらえることのメリットについて説明がありました。
要望~リリースまでの期間が短ければ改善のループをより早くできることを改めて理解できました。
これから行うワークでは、**プロセスを改善し開発スピードを上げる**ことにフォーカスしたワークを行う。

# ストーリー説明
異世界に転生した自分は、ある村に滞在することに。。
ある日村の占い師から村に**モンスター**が村へ襲来することを予言される。
モンスターは3種類存在するようで、**合計20体襲来する**と伝えられる。
自分はモンスターを迎撃するための「**ゴーレム**」を作り、モンスターたちを迎え撃つ。
初めはモンスターの合計数しか分からないものの、**偵察隊が2回に分けて情報を持ってくる**とのこと。

## ゴーレムとは
Miroの図形作成機能 「**Shapes**」にある図形を用いて作成する。モンスターたちを倒してくれる心強い味方である。

![ゴーレム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707072/4a9b6cd9-8675-68ae-8a7c-5fcfa2f043bb.png)


# ワークショップ

## 最初の作戦会議

決まったこと
* スケジュール、ゴーレム作成に必要な要件、ゴーレムの相性を確認。
* メンバーごとに担当するパーツを決定。
* 他は流れに任せて、手が空いた人は他の人のフォローをする。

## 最初のゴーレムづくり
役割を明確にし、自分の作業に集中できた。

## 偵察隊の追加情報(1回目)
**1種類のモンスターが多く襲来する**ことが判明。

## 振り返り(1回目)
* 多く襲来するモンスターの対策に集中。残った時間で他2種類を作成。
* 担当ごとに**所要時間の差**があった。
誰か苦手としている作業を持っている人がいないか議論。
実はメンバーの一人が**細かい作業をすることが苦手**ということが判明。。
**役割を変更**し、メンバー同士の負担を減らすことに決定。
* ゴーレム作成以外の作業分担
余っているパーツを削除する人を決定。

## 2回目のゴーレムづくり
役割を入れ替えたことで、作業効率が各段に上昇。1分ごとに作成できるゴーレムの数が倍へ。
しかし、ルーティーン化したことにより、途中作業ミスが発生。。
途中まで順調だったものの、大幅なタイムロスが発生。

## 偵察隊の追加情報(2回目)
**モンスター3種類それぞれの数**判明

## 振り返り(2回目)
* 作業効率が格段に上昇
* 作業ミスの問題分析
→ルーティン化した作業になってしまい、コミュニケーションが疎かになったことで発生してしまった。
* コミュニケーションの再活性化を計画
* 細かい作業アドバイス

## 3回目のゴーレムづくり
最後のゴーレムづくり。ここまで振り返りで出た案を基にゴーレムを作成。
**最後が一番作業効率良かった。。**

## 振り返り(最終)
* 要求に対し、95%達成と素晴らしい結果を残した。
* 作業に詰まった人を、手が空いた人が積極的にフォローしてた。

以上でメインワークは終了。

# 振り返りの前の説明
プロセスを改善することでのメリット。
より早く**FBをもらえる**ことで、**プロダクトの価値**を高められる。
FBをもらうためには、作業プロセスを改善することが重要。

# 振り返り(クロージング)
* ルーティーン化してしまった作業の中でこそ、気を付ける。
→当たり前を疑う！！
* メンバー同士で否定がなかったので、心理的安全性を保ちながらワークに取り組めた(アイディアが出しやすかった)。
* メンバー全員がスプリントごとに次回スプリントのためのアクションアイテム(プロダクトバックログ)を持ち帰っていた。

以上で終了。

# 感想
* スクラムの**イベント**を身近に体験できた。
* **スプリントレトロスペクティブ**の際に改善策だけでなく良かったことなどを共有したことで、**スプリントの品質がどんどん上がっている**ことを肌で感じた。
* 急な仕様変更(モンスターの数が判明)の発生に対し、**リファインメント**を実施したことにより、メンバー全員で**優先度**などの**共通認識**ができた。

# 今後のアクションアイテム
* スクラムのカンファレンスにもっと参加し、スクラムの知識を取得する。

* 周囲を巻き込み、スクラムを普及させる。

# 最後に
これからもスクラムのイベントに参加し、学んだことを自分の周りに広めたいと思います。
本イベントを主催してくださった、株式会社SHIFT様へ改めて感謝いたします。
juggling.imを開くとエディターを開くことができませんと表示される。

# 現象
IM-Juggling上でProjectNavigatorからjuggling.imを開いたときに、以下のエラーが表示される。
> エディターを開くことができません: An error occurred when parsing XML(application-module-list)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435389/9594e022-7ac1-a6cd-ac41-f960526d7fa5.png)
# 解決策
待つ。
進捗ビューに何かしら表示されているケースもあるが、「この時点では表示する操作はありません。」と表示されてるケースも多い。
5分ぐらい待ってみて、再度juggling.imを開くと開けるケースもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435389/0828c25f-9dd6-042e-28be-cc027cb49956.png)

もし、他の対処法をご存じの方がおられましたら、コメントいただけると幸いです。
【備忘録】undefined method `as' for #<〜::ActiveRecord_Relation:

Rails5.2からRails6.0への移行作業中に起きたエラー

Rails5.2時点でこんな警告が出ていました。
```DEPRECATION WARNING: Delegating as to arel is deprecated and will be removed in Rails 6.0.```

sql周りのメソッドでいくつか警告が出ていて、修正はしていたのですが見逃しがありました。
調べてみると 
> 以下のような警告の川が流れた際には、.arel をレシーバーとして明示的に指定する。

との記載があったため
```
.as('amounts')
↓↓↓
.arel.as('amounts')
```

このように変更。無事エラーは出なくなりました。

参考にさせていただいた記事
https://koic.hatenablog.com/entry/deprecation-warning-delegaging-arel-methods-in-rails-5-2
[忘備録]Laravel Pintについて＆ルールの確認方法

# Laravel Pint

Laravel専用のコード整形ツール

公式サイトがわかりやすく説明しているので、本記事で説明は省略

https://readouble.com/laravel/9.x/ja/pint.html

- Laravelのバージョンによっては標準搭載されているのでインストールは不要
- 搭載されていない場合は、`composer require laravel/pint --dev`でインストールする

## 使い方

### コード整形
```bash
./vendor/bin/pint -v
```

### コードスタイルチェック（整形はしない)
```bash
./vendor/bin/pint  --test
```


# Pintルールの定義

Laravelデフォルトのルールが準備されているので、定義しなくても使える。
ルールをカスタマイズする場合は、`pint.json`を作成してルールを記載する。

## `pint.json`の形式

```json:pint.json
{
    "preset": "xxxxxx",
    "rules": {
        "xxxxxx1": true,
        "xxxxxx2": false,
    },
}
```

- preset(プリセット)：あらかじめ定義されたルールのグループ
- rules(ルール)：個々のルール設定
- 特定のファイル／フォルダをルールの対象外にすることも可能（[こちら](https://readouble.com/laravel/9.x/ja/pint.html#excluding-files-or-folders)を参照)


## Preset(プリセット)

Laravel公式ページによるとPintが現在サポートしているプリセットは、`laravel`、`psr12`、`symfony` とのこと。
プリセットで定義したルールはGitHubから確認できる。

### Preset:`laravel`のpintルール

https://github.com/laravel/pint/blob/main/resources/presets/laravel.php

### Preset:`PSR12`のpintルール

https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/master/src/RuleSet/Sets/PSR12Set.php


## Pintのルール

ルールの定義やどのようにコード整形されるか以下のサイトから確認できる

https://mlocati.github.io/php-cs-fixer-configurator/#version:3.14

各ルールのExampleからBefor→Afterが確認できて、ルールの選定がしやすい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/1fd4fa7a-f6a4-8cb0-7597-3328100b34bf.png)
特定の文字列を指定フォルダーのファイルを再起的に検索して該当箇所を表示する

## やりたかったこと
- 現在のフォルダーの中の全てのファイルの中
- 拡張子がswiftの
- Dictionaryの定義を
- 見つけたらその行を表示

というのをやりたかった

## 結果としては下記のようなコマンドになった
```
grep -r -h -n -E "\[.* : .*\]" --include='*.swift' ./ 
```

## 下記を参考にした

grepのオプションと、使える正規表現が何があるか
https://bi.biopapyrus.jp/os/linux/grep.html

正規表現の詳細説明
https://userweb.mnet.ne.jp/nakama/
http://www.linux-cmd.com/grep.html
DjangoのAPI、CORSエラーを解決

```
No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

Djangoで作ったAPIを使おうとしたら、コンソールログに上記のようなメッセージが出る。

https://github.com/adamchainz/django-cors-headers

上記のライブラリをインストールして解決できる。
FlutterのThemeってなんですか？

## Themeとは？
色やフォントスタイルをアプリ全体に共有するためにthemeを使います。
これを使うことによりデザインの変更なども最小限の労力で行うことができます。

## Themeの使い方
Themeの使い方としては以下の２通りあります。
・アプリ全体のthemeを定義
・アプリの特定の色やフォントスタイルを定義したThemeウィジェットを使用

### アプリ全体のThemeを定義
アプリ全体でThemeを使えるようにするには、MaterialAppコンストラクタにThemeDataを定義します。
もしthemeがなければFlutterはデフォルトのthemeを作成します。
```
MaterialApp(
  title: title,
  theme: ThemeData(
    primaryColor: Colors.pink,
  ),
  home: const MyHomePage(
    title: title,
  ),
);
```

### アプリの一部の色やフォントなどを変えるには
アプリの特定部分の色やフォントを変える方法は以下の２通りあります。
・独自のThemeDataを作成
・親のthemeを拡張

#### 独自のThemeDataを作成
アプリのどの色やフォントスタイルも継承したくない場合は、ThemeData()インスタンスを作成し、Themeウィジェットにそれを渡します。
```
Theme(
  data: ThemeData(
    splashColor: Colors.blue,
  ),
);
```

#### 親のthemeを拡張
全てを上書きするのではなく、親のthemeを拡張する方がいい場合もあります。それを実装するにはcopywith()メソッドを使います。
```
Theme(
  data: Theme.of(context).copyWith(splashColor: Colors.blue),
);
```

## 参考
https://itome.team/blog/2019/12/flutter-advent-calendar-day12/

https://docs.flutter.dev/cookbook/design/themes

https://api.flutter.dev/flutter/material/ThemeData-class.html
Factoryタイプ？ナニソレ...。Laravel6→Laravel7へのアップグレードでハマりました

Laravel6.xからLaravel7.xにアップグレードし、PHPUnitを動かすとエラー。モデルファクトリの挙動が変わったよう。
公式に載ってないやつかな？と思ったらどうやらサラッと書いてあった[こちら、Factoryタイプ機能削除](https://readouble.com/laravel/7.x/ja/upgrade.html#factory-types)に関連していたみたい。

Laravel6までは

```
// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => factory(App\User::class),
        'hoge' => 'hoge',
    ];
}, 'hoge');
```
第三引数に文字列をセットできていました。
```
// モデルの保存
$post = factory(App\Post::class, 'hoge')->create();
```
そして保存時に第二引数にファクトリに記述した文字列を渡すことで、hogeの配列が保存されます。

この機能がLaravel7から廃止されたため、使えなくなりました。代替として[ファクトリステート](https://readouble.com/laravel/7.x/ja/database-testing.html#factory-states)を使います。

```
// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => factory(App\User::class),
    ];
});

// ファクトリステート
$factory->state(App\Post::class, 'hoge', [
    'hoge' => 'hoge',
]);
```
ファクトリステートを記述しておくと、呼び出し側(保存時)でstate('hoge')を呼び出すとデフォルトの配列に['hoge' => 'hoge']というレコードを追加した配列が作成できます。
```
// モデルの保存
$post = factory(App\Post::class)->state('hoge')->create();
```
以上、Laravel7へのアップグレードでハマった件でした。ファクトリタイプ機能は2016年10月からドキュメントに記載していません、とのことだったので油断していました。ガッツリ使用していたので大きめの修正になりました。

Factoryタイプについて調べても全然記事が出てこなかったのでこちらに備忘録として残しておきます。
この件がFactoryタイプで合っているのかもわかりません。
パディング vs マージン<初心>

### 全体把握
HTMLの要素の周りを
パディングが取り囲み、その周りをボーダーを挟み、その外側をマージが囲む。
### ２つの違い
要素の背景をパディング、**要素の内側**。
そして、ボーダーを境に
マージンが**要素の外側**。
となる。

--
[参考](https://blog.hubspot.com/website/css-margin-vs-padding)
📖「良いコード／悪いコードで学ぶ設計入門」（第２章 設計の初歩）を読んだ感想

## 前回の話
https://qiita.com/tomonac/items/c608d7afee03796e4db7

## 感想　（第2章 設計の初歩）
- 第１章の振り返りもありつつ、命名の重要性、クラス設計の重要性、変数の用途など「良いコード」「良い構造」にする為にどうすれば良いか理解することが出来ました。結局は、一貫性の無い書き方したり、その場しのぎの書き方すると時間が経った時に超難問として自分にブーメランで返ってくるから気を付けよう。。

![良いコード悪いコード.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3144766/092d55b7-6209-375c-599f-e28b7047e217.png)



**[ 学んだこと ]**

- 伝わらない変数名を使用しないこと。悪しき命名（技術駆動命名、連番命名）にしない。
  - 第三者がコードを見た時に、読み解くのに無駄に時間がかかることになる。
- 用途ごとに変数を用意する。使い回しをしない。
  - １つの変数で再代入を行いながら実装をすると、処理の流れによって値がどう変動していくか追うのが難しいし、バグを作ってしまう原因にもなる。
- １つのメソッドなどに全ての処理を実装しない。意味のあるまとまり単位で、メソッド化し分離させる。
  - メソッド化にすることにより、保守や修正しやすくなり、他の処理でも呼び出しができ共通化に繋がる。
- データと処理をクラスごとにまとめる。金額処理を実装する場合は、金額のクラス内にロジックを書くなど。
  - クラスごとにまとめることで、保守や修正しやすくなり、低凝集な構造（処理など共通化されいない、データ構成もバラバラの状態）にさせない。

## 次回
https://qiita.com/tomonac/items/0a135c2875eccd31e5a2
filebeat runでエラー error reading existing lockfile

# filebeatが起動しない
Windowsでfilebeatを動かそうとしたら下記のエラーが出て起動せず。
```
Exiting: cannot obtain lockfile: error reading existing lockfile: error reading pidfile from path C:\ProgramData\fileのパス\filebeat.lock
```
恐らくfilebeatを起動した状態でパソコンをシャットダウンしたせいで、
ファイルがロックした状態が残ってしまったと思われる。

# ロックを外す
タスクマネージャーでリソースモニターを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/c821b83f-9963-2e11-17af-0c9c718f2574.png)

リソースモニターでロックされたファイルを検索し該当のロックファイルを右クリックして、
プロセスの終了をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/4adc65f4-8c0b-173c-8593-7349fbe3aa8e.png)
Accessでフォームを全画面表示

# やり方

『境界線スタイル』を『なし』に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/127bda8c-a035-5f03-7353-2ea0555b22a7.png)

『ポップアップ』を『はい』に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5a89bb22-54a1-b72b-ec80-0785db6d63da.png)

『作業ウィドウ固定』を『はい』に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/26e33b61-3f38-56ed-8eea-02c6157b547a.png)

『読み込み時』のイベント登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70ca1375-5945-7f0d-6829-121e3bb309ea.png)

```vb:フォーム読み込み時イベント
Private Sub Form_Load()
    DoCmd.Maximize
    DoCmd.RunCommand acCmdAppMinimize
End Sub
```

『開くとき』のイベント ```Form_Open()``` でも指定可。

イベントは ```Form_Open()``` ⇒ ```Form_Load()``` の順で実行される。
また、 ```Form_Open()``` はキャンセルできるが、 ```Form_Load()``` はできない、という違いがある。

# フォームごとに設定が必要

別フォームを開いた時、全画面設定は引き継がれない。

例えば下記のようなことをすると…

```vb
DoCmd.OpenForm "全画面設定全くないフォーム"
DoCmd.Close acForm, "全画面にしているフォーム"
```

 ↓ こうなる。（全画面解除）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e63eb5f9-677c-24ff-de81-250218b7388a.png)

1つ1つのフォームに対して設定していく必要がある。

# 全画面ではなく最大化したい時

AccessのUI内で最大化したい時は下記参照。

https://qiita.com/waokitsune/private/69b54f022d2d04441b9c

# 参考サイトさん

https://tsware.jp/tips/tips_603.htm

https://oshiete.goo.ne.jp/qa/641110.html

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2604
Microsoft Access for Microsoft 365 MSO (バージョン 2212 ビルド 16.0.16026.20002) 32 ビット
拡張ドメインを有効した後にExperience Cloud siteが機能しない

# 質問

+ [Experience Cloud site stopped working after enabled enhanced domain](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgC7R)

SSL Connection Error

Error 26
[our custom domain url]
[time stamp ]
What happened?
The proxy failed to connect to the web server, SSL connection failed.
xxxxxx


It's best to refer to https://help.salesforce.com/s/articleView?id=sf.domain_mgmt_enable_https.htm&type=5 . Instead of using mydomain.my.site.com as the origin, it's best to use mydomain.my.salesforce.com as the origin.

https://help.salesforce.com/s/articleView?id=sf.domain_mgmt_enable_https.htm&type=5 を参照することをお勧めします。 mydomain.my.site.com をオリジンとして使用する代わりに、mydomain.my.salesforce.com をオリジンとして使用することをお勧めします。

 

If the org uses the Salesforce Edge, however, then we presently advise InstanceName.force.com as the origin, though we're planning to improve that experience in an upcoming release to be instance-less. If not using the Salesforce Edge, then it's more simply mydomain.my.salesforce.com.

ただし、組織が Salesforce Edge を使用している場合は、現在 InstanceName.force.com をオリジンとして推奨していますが、今後のリリースでそのエクスペリエンスをインスタンスレスに改善する予定です。 Salesforce Edge を使用しない場合は、より単純に mydomain.my.salesforce.com になります。

# 資料

+ [ドメインの外部 HTTPS の有効化](https://help.salesforce.com/s/articleView?id=sf.domain_mgmt_enable_https.htm&type=5)

外部 HTTPS を有効にすると、Salesforce 以外のホストまたはサービスでドメインを提供することを Salesforce に通知できます。このオプションは、Salesforce ではなく独自のサーバまたはコンテンツ配信ネットワーク (CDN) アカウントを介してドメインを転送する場合に使用します。

ドメインで外部 HTTPS を有効にする前に、次の重要な考慮事項に注意してください。
+ このオプションは、独自のサーバまたは CDN で HTTPS に対応するドメインでのみ使用できます。Salesforce で管理されているドメイン (force.com、my.salesforce-sites.com、my.site.com のサブドメインなど) の HTTPS オプションを設定することはできません。
+ Sandbox 組織でテストするためにカスタムドメインを有効にして、HTTPS を有効にするには、Salesforce 本番組織でカスタムドメインを作成する必要があります。
レポートのエクスポートをトリガーにしたい


+ [自動起動フローでレポートのエクスポートをトリガーにしたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgCnjSAF)

:::note
flowでなくApexで同じことがしたいという質問/回答があります。

解答はApexトリガーではレポートのエクスポートを拾うことができないので、APIを使った独自のUIを作って実装するしかないと回答されています。

AFAIK  this is something which cannot be implemented reason being - A trigger only executes before or after the following types of operations:

+ insert
+ update
+ delete
+ merge
+ upsert


undelete on a record.It cannot be triggered on the click of a button which doesn't perform any of the above operations.
Probably you can work thrugh reporting APIs and create your own reporting UI and implement this functionality.

 

https://developer.salesforce.com/forums/?id=906F000000094IEIAY
:::
Oracle Analytics Cloud：ワークブックのサムネイルを保存しない

# はじめに
ワークブックの中のビジュアライゼーションの様子がわかりやすいように、デフォルトではサムネイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f1a2b8bd-0e7b-b016-4fd5-22a66175b215.png)

ワークブックに、このサムネイルを保存しないようにすることができます。
方法は
1. システム全体でサムネイルの保存をしないようにする
1. ワークブック単位でサムネイルの保存をしないようにする

の2つがあります。

# システム全体でサムネイルを保存しないようにする
コンソールメニューの「システム設定」に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/733962fa-5192-cb24-3c16-f98059324a5b.png)
「Security」セクションの「Save Workbook Thumbnail」をオフにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/163c387a-0257-0fe0-2df0-cf307138e879.png)

# ワークブック単位でサムネイルを保存しないようにする
ワークブックを編集モードで開き、「ワークブック・プロパティ」メニューを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5b2d5676-4654-9eb2-2f1a-ae9a76339adc.png)
「サムネイルの保存」を「オフ」にして、OKをクリックしワークブックを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9dca4c39-18bc-3cbf-cd73-7ca8a2aac535.png)

# サムネイルを保存していないワークブック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/18d45c69-ca48-a9e8-556a-4ad1bc7f5f77.png)

# 一度サムネイルを保存したワークブックの場合は・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e3a10bff-4c39-9972-1191-abcaf55d99ba.png)
サムネイル付きで保存したものの、後から気が変わってワークブック・プロパティでサムネイルの保存をオフにして上書き保存しました。
ところが、以前のサムネイルがそのまま表示されます。
どうやら、既に保存されているサムネイルを削除してくれるわけではなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f0b0287e-ba91-4839-8b4d-4ca5ee0baba7.png)
別名保存してみましたが、以前に保存済みのサムネイルも一緒に別名保存されてしまいました。（左が別名保存したワークブック）

# どうやったらサムネイルを表示しないようにできるか
対象のワークブックを編集モードで開きます。
「ワークブック・プロパティ」で「サムネイルの保存」を「オン」に変更します。
次に、キャンバスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7f053a8b-8751-42cd-26be-3487626c5fc5.png)
ワークブックを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e2eb7a4d-77d5-614a-f6a0-ffaaa790be2e.png)
追加したキャンバスを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ad1b5597-7dfd-bc2a-0048-0d8ec9b44d2c.png)
「ワークブック・プロパティ」で「サムネイルの保存」を「オフ」に変更します。
ワークブックを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/19e97091-97b8-4de3-ba8d-e956649a9a66.png)
先程作成した、ダミーのキャンバスがサムネイルとして保存され、見えてほしくないサムネイルを隠すことに成功しました。
Authenticatorの紐づけ解除により、ログイン不可


+ [Authenticatorの紐づけ解除により、ログイン不可になってしまった](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000O6VtI)

一度に接続できる認証アプリケーションはユーザログインあたり 1 つだけです。別のデバイスのアプリケーションに接続する場合は、現在のデバイスからアカウントへの接続を解除します。
 

+ [多要素認証の問題のトラブルシューティング](https://help.salesforce.com/s/articleView?id=000386089&type=1)

上記を考慮すると、現在のデバイスからアカウントへの接続を解除する必要があるのではと思います。

+[ユーザのアカウントからの Salesforce Authenticator の切断](https://help.salesforce.com/s/articleView?id=000386089&type=1)


新しい電話、または Salesforce Authenticator の新規インストール
接続済みアカウントを以前にバックアップした場合は、設定を復元できます。復元方法については「Salesforce Authenticator モバイルアプリケーションでの接続済みアカウントの復元 」を参照してください。

そうでない場合は、Salesforce Authenticator を一度 [切断] した上、再設定してから、今後のために (オプションで) バックアップをオンにします。
 
+ [Salesforce Authenticator のトラブルシューティング](https://help.salesforce.com/s/articleView?id=000380378&type=1)

-----------------------------------
Salesforce Authenticator 切断のトラブルシューティングを拝見しましたが、「1. Web ブラウザの Salesforce アカウントから開始します。」から操作が始まっています。

しかし、その操作をするにはそもそもログインしなければならず、Authenticatorでワンタイムパスワードが作れないためログインができない…という状態になってしまっております。


承認方法を選択することはできるのですが、「Salesforce Authenticator」か「認証アプリケーション」の２つしか選べず、どちらの方法でもパスワードを生成できない状態です。
（１枚目から２・３枚目の画面に分岐する） 

承認せずにログインするか、またはログインせずにAuthenticatorを切断する方法はございますでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9f67d4c3-eb4d-f83a-7a20-feb38fae3a76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2775e82e-b514-2299-ce1d-ff90855865fb.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ae662fe1-8be9-9243-b96a-f74b38cddb1a.png)


-----------------------------

もし管理者様がログインできないということであれば、弊社テクニカルサポートまでお問い合わせ頂くことをお勧めいたします。

+ [Salesforce カスタマーサポートへの問い合わせ](https://help.salesforce.com/s/articleView?id=000384365&type=1)
Partner Account Layout Error in TrailHead challenge


# Make sure to remove the items that the challenge is asking you to remove from the right Page layout and add the required items to the right layout. There are Customer Account layout, Account layout, and Partner Account layout.

+ [am stuck on this create account page layouts](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg68U)

:::note
It seems there was a minor typo in the name of the Account Record Type that was causing the error. It should have been "Customer Account", instead it was "Customer Account,". There was an additional "," at the end of the name.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5af5b006-0d17-c019-3642-059fddded99d.png)
:::


+ [Create an account page layout task.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JfYZh)

何で解決したかはよく分からん

+ [ページレイアウトの割り当てでCustomer Accountが見当たりません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ph7HuSAJ)

:::note
１つ前の単元でレコードタイプを作成しているハズなんですが...

検証ロジックには関係ないのかもしれませんね。

https://trailhead.salesforce.com/ja/content/learn/projects/customize-a-salesforce-object/create-record-types

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f36da8b5-b1ab-fd24-ef37-b8922a5bed24.png)


1つ前の単元を行ったのは少し前でして、その後にハンズオン組織を新しくしたことが原因かもしれません。レコードタイプを確認したところ何もありませんでした
前の単元をやり直したら操作できました！ありがとうございました！
:::

+ [【未解決】Customize a Salesforce Object Customize Record Pages - when i get to "Activate the Customer Account Page" i don't get ""Customer Account record type"" in step 9 i got only Master](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akDbnSAE)

これもレコードタイプを作ってないだけどは思うけど、話が通じないみたい。ダメだな
フィクションなどから拾う情報処理用語 その32 隠蔽体質(仮面ライダーBLACK RX)

仮面ライダーBLACK RX 第14話「ひとみちゃん誘拐」(脚本：江連卓、監督：松井昇、アクション監督：金田治と村上潤 (C) 石森プロ、東映)より

マリバロンはガロニア姫の養育をしている。ガロニア姫はクライシス皇帝の血を引く人だ。そして

マリバロン「ムーロン博士。姫君のうなじにホクロが。」

ムーロン博士「マリバロン様、このホクロこそがクライシス皇帝陛下の姫君の証なのであります。私達が調べたところ、クライシス皇帝陛下の姫君は必ず同じ場所にホクロがあるのでございます。」

マリバロン「うん、そうか。それなら良い。」

が、その時、事件が起きた。なんとチャップが薬品の入った瓶を落としてしまったのだ。で恐ろしいことにこの些細なミス(に見えたのだが…)が原因でガロニア姫が死亡してしまった! 当然、マリバロンは激怒し、このミスをしたチャップに

マリバロン「この愚か者!」

と叫んでぶっ殺してしまった。直後に我に帰ったマリバロンはなんとこんなことを言い出した。

マリバロン「秘密にするのじゃ。このことがクライシス皇帝陛下にわかれば私一人の命を差し出すだけでは治らぬ。ジャーク将軍をはじめ、我ら4大隊長悉く処刑されるのは目に見えている。良いか皆のもの。誰にも口外してはならんぞ。もし口外する者あらば。」

あのチャップのようにすると言いたいわけだ。うーむ。気持ちはわかる。でもこれはやっては行けないこと。マリバロンのこの行動は短慮だと言い切れる。これは日本では良くある話だろう。でもそんなこと、マリバロンにはわかるわけがない。さらにこんなことまで言ってしまった。

マリバロン「もうチャップ同様、私が処罰する。」

あーあ。ダメだこりゃ。だが、自分の過失を隠蔽するため、マリバロンはこの後、とんでもない行動に出るのだ。4話連続で。隠蔽するために一生懸命、間違った努力をするわけなのだ。これは南光太郎や佐原茂や佐原ひとみにとっては災難だったが、と同時にありとあらゆる幸運な事態に遭遇するキッカケともなり、最終的にクライシス帝国が滅びるあの最終回に繋がってしまうから、そう言う意味でもマリバロンの行動は浅はかだったと言い切れる。でもこの時点でマリバロンも南光太郎も佐原茂も佐原ひとみも視聴者も、もしかしたら脚本を書いた江連卓さんも、気づかなかっただろう。

でガロニア姫の替え玉を拵えるというトンデモない作戦をマリバロンは発案し。

マリバロン「探し出すのじゃ。ガロニア様と同じ月、同じ日に生まれた子、同じうなじにホクロのある6歳の女の子を探し出し、それにガロニア姫にまつりあげるのじゃ。それしか手立てはない! 急げ、チャップ達。手分けをして探し出すのじゃ。」

あーあ。冷静な視点で見ればこれは短慮と言い切れるが、この場にいた人にはわかるわけがない。自分達も当然処罰の対象になるからだ。そんな目に遭いたくはないに決まっている。なので誰も反対せず、このトンデモない作戦を実行してしまった。江連卓さんの脚本、そして松井昇さんの演出は巧みだ。

だが、そんな条件に合う人がなかなか見つかるわけがない。大勢の女の子が攫われた。ところがところが。そんな条件に合致する人がいたのでだ。それが佐原ひとみだった。うーむ。マリバロンは大喜び。だが、佐原ひとみを替え玉にした事が最終的にはマリバロンの悪事が破綻する最大の理由になり、更には最終的にはクライシス帝国敗北の要因となってしまうのだが、それは先の話である。

マリバロンの悪事はジャーク将軍にもしっかりバレてしまった。でジャーク将軍はマリバロンのところへやってきた。寝ているのは佐原ひとみ。マリバロン、窮したか、と思った途端、全ての事情を知っているはずのジャーク将軍はこう言い出した。

ジャーク将軍「このお方がガロニア姫か。クライシス皇帝のたった1個の細胞から、こんな美しい姫君がお生まれになるとはまさに奇跡だ。」

そう。ジャーク将軍はマリバロンの犯行に協力すると宣言したのだ(後でわかるが)。続けてこういう会話が続く。

ジャーク将軍「マリバロン、よくやったぞ。さぞかし、皇帝陛下もお喜びになるだろう。」

マリバロン「は。ありがたきお言葉。」

この時点で少なくともマリバロンとムーロン博士は何かを察したが

マリバロン「それでは皆様、姫の成長に差し障りがあってはなりません。謁見はこれまで。お引き取りを。」

一旦、ジャーク将軍は他の隊長を引き連れて部屋を出た…が、一人で戻り、マリバロンにこう告げた。

ジャーク将軍「マリバロン、ムーロン博士から事情は全て聞いたぞ。」

マリバロン「(当然狼狽えて)それでは、ガロニア姫の一件を…」

思わずムーロン博士を見るマリバロン、顔を背けるムーロン博士をしっかり映す松井昇監督の演出は巧みだ。

マリバロン「(崩れ落ちて)ああ。全ては私の過ち。どんな罰でもお受けいたします。」

流石に覚悟を決めたマリバロンだったがジャーク将軍の話には続きがあった!

ジャーク将軍「ガロニア姫はここに健やかにおわすではないか。」

え!? (少なくともこの時点では)佐原ひとみでしょ。そうマリバロンも視聴者も思ったはずだ。

マリバロン「なんともうされました?」

ジャーク将軍「この娘こそまさしくガロニア姫だ。」

マリバロン「しかし将軍…」

ジャーク将軍「(マリバロンの言葉を遮って)マリバロン、余は許す。お前は直ちにその娘を連れて奇跡の谷へ行け!」

なお端折ったが、奇跡の谷とは人間の女の子でも急激に成人にさせる事ができるという凄い場所。怪魔界にある。と言うことはその逆も…それはおいおいわかるだろう。

さてジャーク将軍は南光太郎の動きを封じるためにデスガロンを差し向けたが、これがまたトンデモない誤算となってしまった。なぜならデスガロンがこんなことを南光太郎こと仮面ライダーBLACK RXに勢いもあってか言ってしまったからだ。

デスガロン「RX、冥土の土産に教えてやろう。ひとみは既にお前の手の届かない世界に飛び立ったぞ。」

仮面ライダーBLACK RX「なに!? それではひとみちゃんは怪魔界に連れ去られたと言うのか!」

しっかりバレてしまった。毎回思うのだが、悪の組織の皆さんはなぜペラペラと作戦の内容を話してしまうのだろうねえ。まあ倒せると思って油断して喋ってしまうのだろうが、この短慮がこの作戦、いや、クライシス帝国の命運自体を決めてしまった。江連卓さんの脚本はやはり凄い。と言うわけで後の流れはおおよそ予想がつきつつ次回へと続く。
Oracle Cloud Infrastructure (OCI) API Gateway Firebase Authorizer

シリコンバレーのDeveloperWeek2023 HackathonでOCIを使ってOverall winnerとSponsor Prizeを獲得しました。
OCIの各種PaaSサービスを使ったサーバレスアーキテクチャを組んだので、まとめておきたいと思います。
https://github.com/Contact-IoT-Digital-Signage

## 今回の記事の内容
OCI API GatewayでFirebase Authと連携して認証を組む方法

## 環境
OCI https://cloud.oracle.com/

## Firebaseのトークンを検証するFunctionsの作成
firebaseのトークン検証にはadmin sdkを使います。
firebaseのconfigファイルjsonを、func.pyと同じディレクトリに突っ込んで、`fn deploy`します。
認証の可否は`active`というパラメータをjsonで返すことで、api gatewayの方でHTTPレスポンスとして返却してくれます。
firebase_adminはrequirements.txtに`firebase-admin`と書いておくことで`fn deploy`のときにインストールされます。

```python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import auth
import io
import json
import logging

from fdk import response

cred = credentials.Certificate("firebase_admin_sdk_config.json")
firebase_admin.initialize_app(cred)

def handler(ctx, data: io.BytesIO = None):
    id_token = json.loads(data.getvalue())['data'].get('authorization', '')

    try:
        decoded_token = auth.verify_id_token(id_token)
        uid = decoded_token['uid']

        return json.dumps({
            "active": True
        })
    except:
        return json.dumps({
            "active": False
        })
```

## API Gatewayの設定
Function Argumentsの設定は以下のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/9a34a4a2-7dd9-0473-c60f-49e26eac1fe0.png)

また、RouteごとにAuthorizationの設定ができないので、設定ごとにdeploymentを作ることになりそうです。
例えばこれは、認証ありのAPIと認証なしのAPIを、Deploymentでわけた例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/0c7c10c0-7534-e3ba-63bf-07296faedc13.png)

## まとめ
OCIのGatewaysに認証を設定する方法をまとめました。
OCIにはAWS CognitoのようなID管理サービスがないので、今回の記事のようにFirebaseと組み合わせるのがお手軽かと思います。

質問、ご指摘歓迎します。
WindowsへのRubyインストール

WindowsにRuby3.2をインストールします。

PC:Windows 10 Home、64 ビット オペレーティング システム、x64 ベース プロセッサ

まずは既存のRubyのバージョンを確認。

```ruby:コマンドプロンプトにて
$ ruby -v
```
```ruby:実行結果
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]
```

MacではHomebrewを使ってインストールしましたが、Windowsは、RubyInstallerからインストールしてみます。

# RubyInstaller

[公式のページ](https://www.ruby-lang.org/ja/downloads/)によると、
>Windowsマシンでは、RubyInstallerといったツールが使えます。

とのこと。早速「Ruby+Devkit 3.2.1-1 (x64) 」をダウンロード。
exeを実行して、何も考えず、画面に沿ってインストールしてみた。

3分後

![スクリーンショット 2023-02-21 071042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210126/13ae5642-fd0e-c84b-b850-80f10655b4ba.png)

インストールできたっぽい。

```ruby:コマンドプロンプトにて
$ ruby -v
```
```ruby:実行結果
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x64-mingw-ucrt]
```
これでRuby3.2がWindowsにインストールできました。

# Hello World

テキストファイルで、

```ruby:テキストファイル
puts "Hello World"
```
```ruby:実行結果
C:\Rubyscript>ruby Hello.txt
Hello World
```

できました。

irbもできました。

![スクリーンショット 2023-02-21 072338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210126/07f66cf7-725d-769b-975a-9610c5e51209.png)
[Unity]MixamoのアニメーションをUnityに取り込んで動きが変だった時の対処方法

# 概要
Mixamoで用意したアニメーションをUnityで設定してみると、動いてはいるけれど少しだけ動きが変な時があります。
・ キャラクターの向きが正面を向いていない
・ アニメーションを続けているとキャラクターの位置がだんだんズレていく
・ キャラクターを走らせていると変な体制でアニメーションしてる
こういう時の解決方法です。

# 本文
Projectウィンドウのfbxファイルを選択して
![スクリーンショット 2023-02-21 6.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/56a4cba6-72c4-df3a-751d-f57aaaba159d.png)
InspectorでAnimationを選び以下のように設定します。（Loop Timeはアニメーションによって適宜切り替えてください）
最後にApplyを押して決定したらアニメーションが正しく動くようになると思います。
![スクリーンショット 2023-02-21 6.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5779bced-33d9-1628-9fb3-55e36a391de9.png)
# 補足
AnimatorのApply Root MotionをOFFにすることでも挙動を改善できる時があります。
（この方法はAnimationによる位置の変化をTransformの座標に適用するかどうかを切り替えるものです。OFFにすることでAnimationで位置が移動してもTransformは最初の場所から移動しなくなります）

![スクリーンショット 2023-02-21 7.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b1b87c1a-bf56-1fd0-426b-037eaa54cb47.png)
Zoom Video SDK Token生成 Python

## 概要
WebブラウザでZoom Video SDKを利用したので、ドキュメントが若干薄かったToken生成部分をまとめます。
公式ドキュメント: https://marketplace.zoom.us/docs/sdk/video/auth/

## 概要
pythonを使ってトークン生成する場合、jwtのライブラリが必要です。
PyJWTを使うのがおすすめです。`pip install pyjwt`
```python
import jwt
headers = {
    'alg': 'HS256',
    'typ': 'JWT'
}
payload = {
    'app_key': f'{app_key}',
    'tpc': f'{tpc}',
    'version': 1, # 固定
    'role_type': 0,
    'iat': current_time, # 現在時刻 秒単位unixtime
    'exp': current_time + 7200 # 有効期限2時間、最大48時間
}

token = jwt.encode(payload, sdk_key, "HS256", headers)
```

### 属性について
- app_key
Zoom Developerのページから確認できる、SDK Keyのことです。
- sdk_key
Zoom Developerのページから確認できる、SDK Secretのことです。このキーは安全な場所に保存してください。
- tpc
tpcはセッションを一意に識別するためのキーです。`client.join()`の引数に指定する`topic`と一致している必要があります。一意になるように、日時などを付加するといいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/a98b371c-88f9-6bef-dc27-37e35872e78c.png)
- role_type
ロールタイプは1か2を指定しますが、1は参加者、2は管理者です。
２の管理者を指定すると、`leave`の引数に`true`を指定することでセッションを強制終了したりできます。
`await client.leave(true);`

## `client.join()`に失敗する場合のトラブルシューティング
1. tpcとtopicが一致していない
1. 有効期限が切れている

## まとめ
以下のプロジェクトで利用したので、SDKの細かい使い方などはソースコードを参考にしてください。
https://github.com/Contact-IoT-Digital-Signage

質問、ご指摘大歓迎です。
MySQLの色々その１MyISAMとInnoDB

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はMySQLの色々その１として、MyISAMとInnoDBについて更に詳しく調べてみましょう！
![インスタスライド_202302031.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1be3e076-c1fd-0770-87e4-80bedd3a2edb.gif)

# MySQLとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/a0fd0cff-1881-34ad-c621-48ca836ccc2a.png)
無料データベースの中では人気トップ

# ストレージエンジン
MySQLのストレージエンジンでは、

MyISAM
- シンプル、高速に動作し大容量テーブルに向いているがトランザクションにあまり向いてない（ロックが荒い）

InnoDB
-トランザクションをサポート、クラッシュ時のリカバリに対応が少しパフォーマンスが悪い

# どちらを使う
CreateDatabaseの時に指定できる

AWSのRDBでは、両方サポートされています

AWSのAuroraでは、InnoDBしかサポートされてません

デフォルトはInnoDB

今後は、InnoDBを使うことが奨励されています

# まとめ
ーDBMSでは、MySQLが人気

ーストレージエンジンにMyISAMとInnoDB

ーInnoDBがデフォルトで奨励

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Zoom Cloud Recording Webhookの使い方(Python)

シリコンバレーのDeveloperWeek2023 HackathonでZoom Video SDKを使ってOverall winnerとSponsor Prizeを獲得しました。
その際、クラウドレコーディングからのEventhookを利用したので、実装方法についてまとめます。

## やったこと
Cloud Recordingの完了Webhookを使ってレコーディングされたファイルをダウンロードする。

## 環境
- Zoom Cloud
- Zoom Video SDK
- インターネットにデプロイされたPython製のAPI

## Cloud Recordingとは
Zoom Video SDKで、
`zoomClient.getRecordingClient().startCloudRecording();`
を呼び出すことで、Zoom Cloudにレコーディングデータを保存することができます。有料です。
レコーディングデータには、
- 音声のみのデータ
- 動画データ

が含まれます。以下のようにWeb画面からレコーディングデータをダウンロードすることもできますが、APIやWebhook経由でダウンロードURLにアクセスすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/75809d51-759a-800d-5fe6-e999869b9e0b.png)

## Webhookについて
https://marketplace.zoom.us/docs/api-reference/webhook-reference/

Webhookでは、例えばCloud Recordingの開始や終了などをトリガーとして、指定したURLにダウンロードURLやトークンなどの情報を送ることができます。(POST)
今回は、Cloud Recordingの完了イベント（reacording.complete）をトリガーとするように設定しました。
これを使えば、レコーディング完了から指定URLにイベントを発行してAI処理を回す、などのオートメーションが可能です。

## WebhookのValidate
Webhookでは、宛先URLを指定の方法で検証する必要があります。
初回以外にも、定期的に検証リクエストが飛んでくるのですが、タイムアウトが３秒と短いので**アクセス数が少なくCold Startが遅いAPIを使う場合、３秒以内に終わるように工夫する必要があります。**

## Validationコード(python)
```python
import hashlib
import hmac

SECRET_TOKEN = os.getenv("SECRET_TOKEN")

def handler(data):
    body = data.body # get the http request body
    event_type = body.get("event", "")
    if event_type == "endpoint.url_validation":
        plain_token = body["payload"]["plainToken"]
        encrypted_token = hmac.new(bytes(SECRET_TOKEN, 'ascii'), bytes(
            plain_token, 'ascii'), hashlib.sha256).hexdigest()
        response_json = {
            "plainToken": plain_token,
            "encryptedToken": encrypted_token
        }
        return response_json
```

SECRET_TOKENはZoom Video SDKのこの部分から取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/2f3d8e0a-d3b7-7f41-b0df-4d2f6e803a14.png)

あとはドキュメント通りにValidateを実装するだけですが、if文で「"endpoint.url_validation"」を判断してValidateを動かすといいでしょう。
HTTPレスポンスとして、response_jsonの内容を返す必要があります。

## クラウドレコーディングのダウンロード
本題のクラウドレコーディングのダウンロードにはdownloadURLとtokenを利用します。
全部Webhookのリクエストに含まれていますのでそこから取得していきます。
それぞれwebhookのリクエストbodyから以下のように取得できます。
```python
download_token = body['download_token']

recording_files = body['payload']['object']['recording_files']
audio_only_file = [x for x in recording_files if x['file_extension'] == "M4A"][0]
download_url = audio_only_file['download_url']
```

ダウンロードURLとトークンが揃ったら、ダウンロードアクセスを行います。
```python
opener = urllib.request.build_opener()
opener.addheaders = [('Content-Type', 'application/json'), ('Authorization', 'Bearer: {}'.format(download_token))]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(download_url, ダウンロード先ファイルパス)
```

Bearerトークンにdownload_tokenを設定して、ファイル取得のリクエストをかけてください。


## まとめ
Zoom Cloud RecordingをWebhookでトリガーしてレコーディングファイルをダウンロードする方法を解説しました。
日本語の情報は少ないと思うので参考になれば幸いです。
質問、指摘があればお願いします。
Qiita Daily Survey memo 2023.02.21

# Qiita Daily Survey memo 2023.02.21

Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [自分で描いた絵を手書きでcss化する遊び](https://qiita.com/kotomo16/items/8c00178c7ae89052cb78)

kotomo (kotomo16) さんの記事。

アスキーアートを作るツールのように、自動的にcssを生成する内容か…と思いきや、かなり気合の入った、力付くで絵をcssにする記事でした…。

記事を開く前「いや…どうやってやるんだ…？」と思って開きましたが、やはりそんな夢のようなツールはなく…。

曲線を描くツールなどを紹介してくださっており、そのツールを使って描いていらっしゃるようですが…そういう話ではないクオリティです。

記事内で作成されているcssのイラストは、非常にクオリティが高く、一見の価値アリです。

## [プログラマのためのChatGPT活用 - コーディング編 -](https://qiita.com/devneko/items/0dc9fd8b37419d9e369c)

Shinji Yamada (devneko) 様の記事。

毎日毎日追いかけている How To Use ChatGPT の記事で、コーディングの際の使い方を共有していただいています。

ChatGPTの記事はいくつか読んでいますが、コーディング関係のことがまとまっており、また現場で使っていらっしゃることが感じられる内容でした。

記事内で特になるほど！となったのは、関数名やダミーデータ作成です。

命名系はうーん…うーん…と、頭を悩ませることが多く、「こんな感じの関数の名前考えて」で関数名をレコメンドしてくれるのは助かります。

また、ダミーデータも何でもいいけど…というデータなので、お願いしてさくっと作ってもらえるのはとても嬉しいですね。

今ホットなChatGPTの記事でとても興味があるので、共有していただけて嬉しいです！

試してみます…！
【Express入門】ミドルウェアとは？

## はじめに　ミドルウェアとは？
・クライアントからのリクエストに対してのフィルター
例）認証など
## 実践
```server.js
const express = require("express");
const app = express();

// ミドルウェア関数
const myLogger = function (req, res, next) {
    console.log(req.originalUrl);
    next();
};

// ミドルウェアの実行
app.use(myLogger);
```
注意点：ミドルウェアを使う際には、ルーティングの一番前に記述しないと、ミドルウェアが起動しない

## さいごに
・ログイン認証などに使えそう！


参考記事

https://expressjs.com/ja/guide/writing-middleware.html

参考動画

 https://youtu.be/Zk7tpzaKv0U?t=1388
2023/2/21主にITとかセキュリティの記事

ソニー銀行などのフィッシングメールが急増(2/19)
https://www.zaikei.co.jp/article/20230219/710463.html

ハリーポッターの新作ゲーム、もうサイバー犯罪に悪用される(2/18)
https://news.livedoor.com/article/detail/23730159/

暗号資産ウォレット狙う新種のランサムウェアとクリッパーマルウェアに注意(2/19)
https://news.mynavi.jp/techplus/article/20230219-2594166/

サイバー犯罪に関する相談増　去年富山県内(2/19)
https://news.yahoo.co.jp/articles/27abdb76a198396971c50db7006b88c91e2c1512?source=rss

「記憶にない」137万円の引き出し指示か　暴力団の男を不正アクセス容疑で逮捕　沖縄県警など合同捜査本部(2/19)
https://ryukyushimpo.jp/news/entry-1665214.html

イーロン・マスクのような“情報オリガルヒ”は後に「IT時代の最初の誤り」と記憶される(2/19)
https://news.yahoo.co.jp/articles/20c9fdaf42805b5cfb4fc98744cebd8446c34f22?source=rss

「ベンダーと病院はリスク情報の共有を」、電子カルテをランサムウエアから守るには(2/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02362/021600005/

改正電気通信事業法の施行で日本でも「必須科目」に、ガバメントアクセスとは何か？(2/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02299/021500004/

日本IBMがセキュリティー体感できる新施設、制御系もカバー(2/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07691/

データマネジメント機能を包含、Snowflakeは他のDWHと何が違うのか(2/20)
https://xtech.nikkei.com/atcl/nxt/column/18/01924/020200015/
Pythonでデータの可視化を学ぼう（2023.2.21）

# 概要
Pythonは、データの可視化にとても優れた機能を持っています。Pythonを使えば、グラフやチャートを簡単かつ美しく作成することができます。本記事では、Pythonでデータの可視化を行う方法について説明します。

# Matplotlibを使ったデータの可視化
Matplotlibは、Pythonでグラフを描画するためのライブラリの1つです。Matplotlibを使うことで、データの可視化を簡単に行うことができます。

# インストール方法
Matplotlibをインストールするには、ターミナルやコマンドプロンプトで以下のコマンドを実行します。
``` 
pip install matplotlib
```

# サンプルコード
以下は、Matplotlibを使って折れ線グラフを描画するサンプルコードです。

```Python
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.show()
```

上記のコードでは、x軸の値とy軸の値をそれぞれリストで定義しています。そして、plt.plotメソッドを使って、折れ線グラフを描画しています。最後にplt.showメソッドを呼び出すことで、グラフを表示することができます。

# 棒グラフの描画
次に、Matplotlibを使って棒グラフを描画する方法について説明します。

```Python
import matplotlib.pyplot as plt

x = ["A", "B", "C", "D", "E"]
y = [20, 35, 30, 25, 40]

plt.bar(x, y)
plt.show()
```

上記のコードでは、x軸の値とy軸の値をそれぞれリストで定義しています。そして、plt.barメソッドを使って、棒グラフを描画しています。最後にplt.showメソッドを呼び出すことで、グラフを表示することができます。

# Seabornを使ったデータの可視化
Seabornは、Matplotlibを基にした高度なデータの可視化を行うためのライブラリです。Seabornを使うことで、より美しいグラフを作成することができます。

# インストール方法
Seabornをインストールするには、ターミナルやコマンドプロンプトで以下のコマンドを実行します。
```
pip install seaborn
```

# サンプルコード
以下は、Seabornを使ってヒストグラムを描画するサンプルコードです。

```Python
import seaborn as sns

tips = sns.load_dataset("tips")
sns.histplot(data=tips, x="total_bill", hue="smoker", multiple="stack")
```

上記のコードでは、Seabornに付属するtipsデータセットからデータを読み込み、sns.histplotメソッドを使ってヒストグラムを描画しています。xパラメータには、x軸のデータとなるカラム名を指定し、hueパラメータには、色分けをするカラム名を指定しています。

# Plotlyを使ったデータの可視化
Plotlyは、Pythonでグラフを描画するためのライブラリの1つで、インタラクティブなグラフを作成することができます。

# インストール方法
Plotlyをインストールするには、ターミナルやコマンドプロンプトで以下のコマンドを実行します。

```
pip install plotly
```

# サンプルコード
以下は、Plotlyを使って散布図を描画するサンプルコードです。

```Python
import plotly.graph_objects as go

fig = go.Figure(data=go.Scatter(x=[1, 2, 3, 4, 5], y=[2, 4, 6, 8, 10], mode='markers'))

fig.show()
```

上記のコードでは、go.Scatterクラスを使って散布図を作成しています。xパラメータには、x軸のデータを指定し、yパラメータには、y軸のデータを指定しています。そして、modeパラメータには、マーカーの種類を指定しています。

# まとめ
Pythonには、MatplotlibやSeaborn、Plotlyなど、様々なデータ可視化ライブラリがあります。本記事では、それらのライブラリを使って、グラフやチャートを簡単に作成する方法について説明しました。データの可視化を行うことで、ビジネスや研究などの分野で、データ分析の効率化や可視化の精度向上につながることが期待されます。
【Express入門】Pugを使った動的ファイルの表示

## はじめに　

### Pugとは？
> Pugとは「パグ」と読み、HTMLを効率的に書くための記述方法です。

https://and-ha.com/coding/what-is-pug/

https://qiita.com/takeshisakuma/items/fdcf456d8250e6dafc7b

### 動的ファイルとは？
・フロントエンドとバックエンドで呼び出されたファイル（見る人やタイミングによって表示内容が異なる）
・html/css/JavaScpipt/imgなど

### ついでに静的ファイルとは？
・フロントエンドのみで表示されたファイル（誰がいつサイトを訪れても同じ内容が表示がされる）
・html/css/JavaScpipt/imgなど

https://www.e-infonet.jp/casestudy/column.html?itemid=271&dispmid=981

## 目的
・動的ファイルを表示する

## 実践
前提
・expressのインストール
```
npm install express
```

1　Pugのインストール
```
npm install pug --save
```
2　ディレクトリ内にviewsフォルダを作成
3　動的ファイルを作成（index.pugの作成）
```index.pug
html
  head
    title= title
  body
    h1= message
```
4　server.jsにてルーティングの処理

```server.js
const express = require("express");
const app = express();

// 動的ファイルの読み込み
app.set('view engine', 'pug')

//　ルーティング
app.get('/', (req, res) => {
  res.render('index', { title: 'Hey', message: 'Hello there!' })
})
```

## おわりに
動的ファイルを表示するには、ルーティングも書かなきゃいけないのか！
まだ深くまで理解できてない説
けど、公式ドキュメントやQiitaなどで調べられる力がついてきた！

#### 参考記事(公式ドキュメント)

https://expressjs.com/ja/guide/using-template-engines.html

#### 参考動画

https://youtu.be/Zk7tpzaKv0U