OmniAICreator/Qiita-1.07M huggingface dataset:
【CLF】AWS認定試験で合格するためにやったこと【クラウドプラクティショナー】

# はじめに
去年、AWS Certified Cloud Practitioner と AWS Certified Solutions Architect – Associate と
AWS Certified Developer - Associate に受かったので、勉強法などを備忘録として残します。

## 受験前のレベル
・AWSサービスは、EC2、S3、cloudFront、RDSなどを業務で使ったことがあるだけ
・何回かAWSが開催しているハンズオンなどをやったことあるレベル

## 成果
勉強時間は15時間くらいで、合格点ギリギリの767点でした。
もっと取れると思っていたので、ギリギリ過ぎてビビリました。

## 勉強した内容
会社の同僚がとにかく【TechStock】をやれば良いということだったので、#1～#77セッションまでを2週しました。
そして模擬試験モードを5回くらいやってほぼ正答率100%だったので本番も楽勝だと思っていました。

https://techstock.jp/

## 反省点と感想
TechStock の各セッションをやりすぎて問題文と回答を暗記してしまって、回答の意味を完全に理解していなかったため
初見の問題が出ると途端に訳が分からなくなってしまいました。
もっと本質的な理解を深めるように、公式ドキュメントや試験ガイドを確認した方が良かった。。

CLF受験後、3週間後のSAAを受験する予定だったのでCLFでのダメダメさ加減に火がついて
SAAでは勉強方法を意識的に変えました。

## 参考にしたサイトなど
・[TechStock](URL "https://techstock.jp/")
ひたすら練習問題と模擬試験をやった

・[公式の試験ガイド](URL "https://aws.amazon.com/jp/certification/certified-cloud-practitioner/")
試験ガイドの出題範囲に記載されているサービス名をとりあえずすべて暗記

・[AWS認定資格 クラウドプラクティショナーの教科書: 合格へ導く虎の巻 CloudTech制作委員会シリーズ Kindle版](URL "https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%90%88%E6%A0%BC%E3%81%B8%E5%B0%8E%E3%81%8F%E8%99%8E%E3%81%AE%E5%B7%BB-CloudTech%E5%88%B6%E4%BD%9C%E5%A7%94%E5%93%A1%E4%BC%9A%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-CloudTech%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%9B%B8%E7%B1%8D%E4%BD%9C%E6%88%90%E5%A7%94%E5%93%A1%E4%BC%9A-ebook/dp/B0B1HXPSH8
")
[色変 Atcoder 入茶しました!] 必要な知識、後悔とこれから 2023/4/29

# 目次
[1.はじめに](#はじめに)
[2.後悔など](#後悔など)
[3.使ったアルゴリズムなど](#使ったアルゴリズムなど)
[4.最後に](#最後に)

# はじめに

2023年　4月29日ユニークビジョンプログラムコンテスト　ABC300にて入茶することができました！！
いやぁ..本当に良かった....
結構勉強したので、それが報われたのが客観的な数値で表されるのはうれしいです
jefuo1st って名前でやってます↓

![スクリーンショット (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849641/e4bf38ca-07c5-fe0d-0e60-0f82dd59455d.png)

# 後悔など
自分はpaziaで初めてプログラミングを学び、競プロに出会いました。アルゴリズムなどを駆使して論理を組み立てていき回答する過程が凄く楽しいなと感じまして、やっていくうちに競プロ関連のサービスや機能が充実しているatcoderを見つけ、本なども買って読み漁ってました。ですが....
自分はネットで、入茶した人の記事にかいてある必要なアルゴリズムをある程度学んでからコンテストに参加しようかな。とか考えていました。　コンテストに参加し始めたのは３月からですが、勉強自体は実は1月から始めていたのです.....
それは全くの無駄でした。　
なぜならコンテスト中の1時間40分、そして後日に復習する　このセットが最も実力が伸びる期間だからです。
次のコンテストへのモチベーションも上がりますし、コンテスト参加回数少ないと獲得するレートにマイナス補正が掛かったりしますし、新しい知見を得るチャンスを何度逃してしまったことか　なぜか完璧主義者みたいな考え方をしてしまっていました。
これから競プロを始めるかたは、入茶した人の記事を読み漁るのは凄くためになると思いますが、僕と同じ道をたどらないで欲しいです。とりあえずコンテストに参加しまくっていただきたいです。


ここまでコンテストに参加してきて、過去問を解いてきて思ったことは、
Ａ～Ｃ問題はアルゴリズムを使う問題よりも、実装力や計算量を何とかして少なくする力を求める問題が多くて、アルゴリズムばかり勉強していた自分は結構時間を無駄にしてしまいました。これもコンテストに参加していなかったからですね...気づくのが遅れました
アルゴリズムはD問題から多いですね。
実装力の問題は特に数をこなしていかないと力がつかないと感じました。同じような問題が二度と出ないんじゃないかってぐらい特殊です。
ノートとペンを用意して頭の中を整理しながらコードを書いて行くと若干解きやすくなりますね。

復習に役に立ったのはNotionていうサービスでした。何かしらを得ることが出来たら、１問ごとにページを作って解説やら感想を書いたり、「復習」っていうタグをつけてもう一回解きたい問題を整理したり
「DP」「実装問題」とカテゴリ別に分けたりととても便利でした。

# 使ったアルゴリズムなど

アルゴリズムはあまり出ないと言いましたが、その中でも頻出のアルゴリズムはありました。

### DP （動的計画法）
基本的なレベルで大丈夫でした。

アルゴ式のDP　動的計画法 (1) イントロダクションと動的計画法 (2) 2次元の動的計画法をやりましょう
↓ 

https://algo-method.com/courses/27

Educational DPの　A～C

https://atcoder.jp/contests/dp/tasks

茶色程度のDP　過去問

https://atcoder.jp/contests/typical90/tasks/typical90_ax

https://atcoder.jp/contests/abc129/tasks/abc129_c

https://atcoder.jp/contests/abc289/tasks/abc289_d

https://atcoder.jp/contests/abc291/tasks/abc291_d

https://atcoder.jp/contests/abc286/tasks/abc286_d

### DFS　BFS　(グラフ)

深さ優先探索の問題はこのコードを最初に書きましょう(pythonの場合です...)↓　でないとREすることがあります。

```py
import sys
sys.setrecursionlimit(10 ** 7)
```

茶色に必要な知識としては、グラフとグリッドグラフの探索方法、連結成分、辺、サイクルなどの木の知識といったところでしょうか。以下のアルゴ式でそこら辺を一通り学べます。

アルゴ式の１～５章

５章の二部グラフはやらなくて良いかと　トポロジカルソートを始めとしたサイクル検出問題は茶色レベルにも出ることが確認できました。以下の過去問集に記載してます


https://algo-method.com/courses/19


茶色程度のDFS　BFS過去問

https://atcoder.jp/contests/abc289/tasks/abc289_b

https://atcoder.jp/contests/abc287/tasks/abc287_c

https://atcoder.jp/contests/abc292/tasks/abc292_d

https://atcoder.jp/contests/abc288/tasks/abc288_c

https://atcoder.jp/contests/abc213/tasks/abc213_d

一見グラフと関係にないように見えますが、トポロジカルソートなどでサイクル検出問題に落とし込む問題です↓

https://atcoder.jp/contests/abc285/tasks/abc285_d

https://atcoder.jp/contests/arc031/tasks/arc031_2

https://atcoder.jp/contests/joi2011yo/tasks/joi2011yo_e

https://atcoder.jp/contests/abc088/tasks/abc088_d

# 最後に

これからは緑を目指していく、または他のアプリケーションとか作っていこうかなと思いま！！！
php から pdf をページとして表示する


「LibreOffice で MySQL連動 PDF帳票を作る」
https://qiita.com/nanbuwks/items/d4696542760cf4b8a24a

ではスクリプトで pdf を作成しましたが、それの Webブラウザでのビューは iframe で行ってきました。


`mkpreview.php`
```
<!DOCTYPE HTML><HTML><HEAD><META CHARSET=UTF-8>
<TITLE></TITLE> <link rel="stylesheet" href="style.css"></HEAD><BODY>
<?php
$templatename= $_GET["use"];
$key= $_GET["key"];
exec("./mkpreview.sh ". $templatename."テンプレート.ods ".$key);
?>
<iframe src="<?php echo ($templatename); ?>テンプレート.ods.pdf#toolbar=0&view=FitV" name="sample" width="100%" height="700">
</iframe>
</BODY></HTML>

```


これをブラウザで以下のURLで呼び出すと、

`http(s)://(servername)/(path)/mkpreview.php?use=紹介状&key=21`

スクリプトで 「紹介状テンプレート.ods」 に key=21 の RDBMS データが反映されてた pdf が作成され、それが iframe で表示されます。

しかしながら、pdf だけ表示するのであれば iframe を使わずにブラウザに直接 pdf を送り込むのが都合がいいです。



# 環境

サーバ 
- Ubuntu 22.04
- Apache/2.4.52 (Ubuntu)
- php 8.1.2-1ubuntu2.11
ブラウザ 
- google chrome  112.0.5615.138


# コード

```
<?php
header('Content-Type: application/pdf');

$templatename= $_GET["use"];
$key= $_GET["key"];
exec("./mkpreview.sh ". $templatename."テンプレート.ods ".$key);

$filepath = $templatename."テンプレート.ods.pdf";
$filename = $templatename."テンプレート.ods.pdf";
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Length: ' . filesize($filepath));
readfile($filepath);

?>
```                                               
これをブラウザで以下のURLで呼び出します。

`http(s)://(servername)/(path)/mkpreview.php?use=紹介状&key=21`

ブラウザでは、以下のように表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7c3e7c7f-c34b-3044-7580-3a3afd7aebaf.png)

通常の pdf はこれでいいですが、今回はプレビューとしての表示なのでダウンロードや印刷は抑止したいです。ツールバーの表示を防ぐには、ブラウザから見る URL を以下のようにします。


`http://(servername)/(path)/mkpreview.php?use=紹介状&key=21#toolbar=0&view=FitV`

以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/152a1890-d76d-cb5e-f188-06e4aa50a3b3.png)
Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その１-Harukaの声以外を使って読上げる

# __Excel VBA（マクロ）でセルの内容を読上げ-その1__

動画にナレーションを入れるのに、無料の音声合成を使っていました。

ただ、いろいろな制約で、オンラインでの音声合成は不可。
無料ソフトでも、Admin権限を持たせてもらえないので、インストールも不自由。

したがって、
[Balabolkaのポータブル](http://www.cross-plus-a.com/jp/balabolka.htm)
を使っていました。
かなり、使えるソフトなのですが、Windowsの標準で入っているHarukaしか選択できないのが不満。
Windows標準機能のナレータでは、Ayumi、Sayaka、Ichiroも選択できるのに。

Excel2019が入っているＰＣなので、Excel VBA（マクロ）で、可能にする様にしました。

## 声を選択できるようにする ##
以下の設定で、声を変数に入れます。

~~~~diff_vb
    '声を入れるためのオブジェクト変数
    Dim HarukaVoice, AyumiVoice, SayakaVoice, IchiroVoice, ZirVoice As Object
    'SpeechAPIのSpVoiceおよびSpObjectTokenCategoryの変数
    Dim sapi, cat As Object

Private Sub voice_object()
    'SpeechAPIの設定
    Set sapi = CreateObject("SAPI.SpVoice")
    '読み手の分類設定
    Set cat = CreateObject("SAPI.SpObjectTokenCategory")
    '分類の参照先をSpeechフォルダからSpeech_OneCoreに変更
    cat.SetID "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False
    '読み手の名前を参照し、オブジェクト変数に収容
    For Each token In cat.EnumerateTokens
        'はるか
        If token.GetAttribute("Name") = "Microsoft Haruka" Then Set HarukaVoice = token
        'あゆみ
        If token.GetAttribute("Name") = "Microsoft Ayumi" Then Set AyumiVoice = token
        'さやか
        If token.GetAttribute("Name") = "Microsoft Sayaka" Then Set SayakaVoice = token
        '一郎
        If token.GetAttribute("Name") = "Microsoft Ichiro" Then Set IchiroVoice = token
    Next
    '英語のZirは、Speech_OneCoreに無いので、Speechの中の英語(409)を指定
    Set zirVoice = spi.GetVoices("language=409")(0)
    Set cat = Nothing
    Set sapi = Nothing
End Sub
~~~~

これで、<strong> voice_object </strong> をCallすることで、声を選択できます。

使い方：
~~~~diff_vba
Sub 読上げ()
    '話し手の設定
    Call voice_object
    '音声合成エンジン設定
    Set spai = CreateObject("SAPI.SpVoice")
    '読み手　一郎
    Set sapi.Voice = IchiroVoice
    '現在地の内容を読上げ
    sapi.Speak ActiveCell

    Set sapi = Nothing
End Sub
~~~~

[Balabolkaのポータブル](http://www.cross-plus-a.com/jp/balabolka.htm)
で可能だった、読上げスピードやピッチ（声の高低調整）をすることも可能です。
TTS（Text To Speech）で基準となっている内容で、前後に「\<Rate speed=""> \</Rate>」
「\<Pitch middle=""> \</pitch>」を置くことで調整可能です。
speed, middleの後の「””」の中には、-10～10の値が入ります。0が標準。

~~~~diff_vba
    '現在地の内容を読上げ
    sapi.Speak "<Rate speed="3"><Pitch middle="-5">" & ActiveCell & "</Pitch></Rate>"
~~~~

とすることで、速さが+3され、ピッチが5 低くなります。
ちなみに、ピッチについては、24で1オクターブ上下する規格になっています。
±10しか許されていませんが。

[その２ -読上げ内容を音声ファイルに保存する- へ続く](https://qiita.com/tom-sobue/items/319c1943df9dd30c081a)
【CakePHP3】ファインダー【新人がyoutube動画でPHP学習part7】

# １．はじめに
今回はファインダーとカスタムファインダーについて学習しました。
まず用語について、動画やcookbookを見て以下のように解釈しました。

[ファインダー]
テーブルのfindメソッドのことで、DBからデータをEntityとして取得するために使用する。
コントローラー内に記述する。

[カスタムファインダー]
テーブルにカスタムファインダーメソッドを定義し、コントローラーからfindメソッドで呼び出して使用する。よく利用するデータ取得の条件をカスタムファインダーメソッドとして定義することにより、メソッドチェーンで条件の掛け合わせができたり、クエリオブジェクトの再呼び出しが行えるので便利。

教材はチャンスラボ株式会社の公式YouTubeチャンネル。
https://www.youtube.com/@asterisk_cl_lab/videos

第１４回の動画を参考にしました。

【CakePHP3 入門】第１４回　ファインダーとカスタムファインダー
https://www.youtube.com/watch?v=Jy-U075SN0k

# ２．目次

１．はじめに
２．目次
３．ファインダーとカスタムファインダー
４．終わりに

# ３．【第１４回　ファインダーとカスタムファインダー】
ソースコードを書き換えて、ファインダーの使用方法を解説しています。

**１：４７～１：５７**
ファインダーの戻り値はクエリーの実行結果ではなくクエリーオブジェクトであるとのこと。
つまりどういうことでしょうか？
色々ググって下記のように解釈しました。
- クエリーの実行結果＝取得するデータ
- クエリーオブジェクト＝SQL文と対応するオブジェクト

「ファインダーで直接データを取得しているのではなくSQL文を構成している」といった意味に取れますね。
動画内の例のようにカスタムファインダーをメソッドチェーンで記述した場合は、複数のSQL文でデータ取得の条件を定めているということになるのでしょうか？

**１：５８～２：２０**
find()で使用できるオプションに触れています。
cookbookによると複数オプションを指定することもできるようで、それによりSQLのようにデータ取得の条件を絞ったりできるようですね。
![スクリーンショット 2023-04-27 092309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/fad3e713-0e9a-d78d-76a2-ee49b812814e.png)
>cookbook / データベースアクセス&ORM / データのロードにFinderを使う
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#custom-find-methods

**３：００～３：１４**
DebugKitのSQLlogを確認しています。
SQLlogを見るとファインダーで得たクエリオブジェクトがどのようなSQL文として実行されたのか結果を見ることができます。
便利な機能ですが、データを期待通りに扱えているのか確認するためにはSQLも押さえておかないといけませんね。

**３：１５～４：２７**
カスタムファインダーについて解説しています。
目的としては、「直近１ヵ月のデータを取得する」という操作をindexメソッドだけではなくviewメソッドなどでも使用するかもしれないので、操作内容をテーブルに記載してコントローラーのどのメソッドからも呼び出せるようにしましょう、ということですね。

カスタムファインダーを定義する場合はメソッド名をfindから始める必要があるとのことですが、これもCakePHPの規約ですね。今までフレームワークに触れたことが無かったので戸惑いましたが、今では規約に従った命名にも慣れてきました。

**４：２８～５：２０**
カスタムファインダーのメソッドチェーンについて実践しています。
条件の掛け合わせや使いまわしができて便利に感じますね。
ちなみに動画内の「直近1ヵ月」で「名前にマルオが含まれる」に該当するデータを参照した際のSQLlog画面は次の通りです。
![スクリーンショット 2023-04-28 111649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/19b6f83e-8e2d-de02-f1b0-928a5a7050c2.png)
SELECTやFROMの部分は重複せず、WHEREの部分は各条件がANDされています。
cookbookを読むと各条件をORとなるようにもできるようなので、色々な条件のSQL文を組み立てることができそうです。

# ４．終わりに
今回の学習で悩んだこと、感想など書き出したいと思います。

①find()ファインダーはクエリオブジェクトを生成するメソッド
カスタムファインダーで条件を使い回したり組み合わせることができるのは、ファインダーが都度SQL文を実行しているからではなく、SQL文と対応するオブジェクトを生成しているからです。最初、ファインダーは単にデータを参照しているのだとしか認識していませんでしたが、クエリオブジェクトを生成しているという点を強く意識するべきだと感じました。

②ORMについて
多くのオブジェクト指向言語にはORMという概念があり、CakePHPもその手法を使ってデータベースを操作しているようです。ORMはObjectRelationalMappingのことでオブジェクトとデータベースの対応を意味しており、今回学習したファインダーから生成されるクエリオブジェクトや、以前から扱っているEntity等のオブジェクトも、ORMの機能の一つと言っていいのではないでしょうか。
クエリオブジェクトってイマイチ理解できないなーと最初は思っていたのですが、ORMを先に知っていればもう少しスムーズに理解が進んだかもしれません。
そもそもCakePHPを学習する前に知っていれば、Entityに煩わされなくて済んだような、、、
逆にEntityで躓いたおかげでORMを調べたときに点と点が結ばれたような感覚になったのでしょうか。
動画内でも触れられていませんでしたが、おそらく「知ってて当然の知識」ということなのでしょう。もし僕の解釈に間違いがあれば是非正しい知識を教えてください！

余談
ORMについて調べているとPDO（PHP Data Objects）というものに遭遇しました。どうやらPDOもデータベースに関するものらしい、、、
寄道に寄道を重ね時間を掛けすぎているので、「PDOもある」ということだけ頭の片隅に留めておいて、必要な時が来たら調べ直すこととします。

以上、最後までご覧いただきありがとうございました。
Autosar Demonstrator 20230421

AUTOSAR DemonstratorのR22-11 の追加が20230421にあったらしい。　

# AUTOSQARでR22-11 でDemonstratorで検索した 18件

Explanation of Adaptive Platform Software Architecture, AUTOSAR 982 2022-11-24 *

https://www.autosar.org/fileadmin/standards/R22-11/AP/AUTOSAR_EXP_SWArchitecture.pdf

Application Interfaces User Guide, AUTOSAR 442 2022-11-24

https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_EXP_AIUserGuide.pdf

Specification of AUTOSAR Run-Time Interface, AUTOSAR 923 2022-11-24

https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_SWS_ClassicPlatformARTI.pdf

Safety Use Case Example, AUTOSAR 641 2022-11-24

https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_EXP_SafetyUseCase.pdf




# AUTOSQARでR22-11 で　Adaptive Demonstratorで検索した 14件

上記に＊で示したものを含む。　

Guidelines for the use of the C++14 language in critical and
safety-related systems, AUTOSAR 839, 2019-03-29

廃止になった文書がでてくる。なにしてくれちゃうの。AUTOSAR。

# AUTOSQARでR22-11 で　APを選択し、Adaptive Demonstratorで検索した 5件

Explanation of Adaptive Platform Software Architecture R22-11  AUTOSAR_EXP_SWArchitecture.pdf

Explanation of Adaptive Platform Design R22-11  AUTOSAR_EXP_PlatformDesign.pdf

Guidelines for the use of the C++14 language in critical and safety-related systems R22-11  AUTOSAR_RS_CPP14Guidelines.pdf

Specification of Communication Management R22-11  AUTOSAR_SWS_CommunicationManagement.pdf

Specification of Manifest R22-11  AUTOSAR_TPS_ManifestSpecification.pdf
BardとChatGPTの変化の予測：広告導入の可能性はある？

これからのAIの進化を考えました。

多くの人が利用しているBardとChatGPT。

おそらく広告がつくようになるでしょう。今の使い勝手は最高すぎますがこのまま無料のわけがない・・・。ChatGPTのように広告なしサブスクも出るのでは？

サイト自体、検索システムより負荷が重いために今のシステムの軽量化など課題はあるとは思いますが必然だと思います。（私の私見です）

質問に沿ったパーソナライズ広告は個人的に実際に見てみたい気もします。

もっと違ったモデルを構築するかもしれませんね

楽しみです
アウトプット大全を読んだ

# 学びを結果に変えるアウトプット大全

https://www.amazon.co.jp/%E5%AD%A6%E3%81%B3%E3%82%92%E7%B5%90%E6%9E%9C%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E5%A4%A7%E5%85%A8-Sanctuary-books-%E6%A8%BA%E6%B2%A2%E7%B4%AB%E8%8B%91/dp/4801400558

### アウトプットは行動（書く、話すなど）

## おすすめ度（10点）
8点
インプットが多すぎてアウトプットが少ないと感じていたので
改めて気づきが出来て良かった。
難しい内容ではないので、誰でもすぐに始められる内容が書いてある。
とにかくやってみるのが大事。

## 読んだ目的
自分の中でアウトプットが足らないと感じているので改善したい。
どのようなアウトプット方法があるのか知りたい。

## 意識して実践したい内容
### インプット３、アウトプット７の割合で

### 挨拶をする
気持ちのよい挨拶で相手を認識してコミュニケーションを図る

### 質問をする
良い質問をして議論を活発化させる

### プレゼンする
自分が理解した内容を発表して、相手に伝える
緊張を自分の力に

### 誰かに教える（説明する）
自分が理解した内容を相手に伝える
教えることで自分自体にも気づき

### 褒める、叱る
相手が調子に乗らない褒め方・・強化したい【行動】を具体的に褒める
叱るのは信頼関係が前提

### 手で書く
手を動かすことで記憶を定着させる

### 書き込む
記事やノートに書き込むことで、文章作成の練習とフィードバック
他の人に読んでもらうことを意識することで良りよい文章を作成する

### 完成させる
30％の出来で良いのでまず完成させる
残りの半分の時間を使って100点に仕上げる

### 決断する（ワクワクする方を５秒で選ぶ）
自分の直感を信じる
30分考えても5分考えても86%は結局最初と同じものを選ぶ
ワクワク感を大事にする

### やってみる
とにかくやってみる
やらないと始まらない
Wordpressの開発環境をDockerで作りたい

# 実行環境
macOS Ventura13.3

M2 Macbook Air

Docker Desktop Version4.19.0をインストール済み


# Docker Composeをインストール

Docker Desktopまずは公式からダウンロードしてインストール済みという想定なので、ない場合はインストールしておいてください。

次に、複数のコンテナを管理するためにDocker Composeをインストールします。
以下をターミナルへ打ち込んでください。

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

# プロジェクトフォルダを作る
Wordpressをインストールしたり、開発をする「場」になるプロジェクトフォルダを新規作成します。
その中に、docker-compose.ymlというファイルを新規作成して、開いたら以下のように書いてください。

```
version: "3.6"
services:
 wordpress:
   image: wordpress:latest
   container_name: wordpress
   volumes:
     - ./wordpress:/var/www/html
   environment:
     - WORDPRESS_DB_NAME=wordpress
     - WORDPRESS_TABLE_PREFIX=wp_
     - WORDPRESS_DB_HOST=db
     - WORDPRESS_DB_USER=root
     - WORDPRESS_DB_PASSWORD=password
   depends_on:
     - db
     - phpmyadmin
   restart: always
   ports:
     - 8080:80

 db:
   image: mariadb:latest
   container_name: db
   volumes:
     - db_data:/var/lib/mysql
   environment:
     - MYSQL_ROOT_PASSWORD=password
     - MYSQL_USER=root
     - MYSQL_PASSWORD=password
     - MYSQL_DATABASE=wordpress
   restart: always

 phpmyadmin:
   depends_on:
     - db
   image: phpmyadmin/phpmyadmin:latest
   container_name: phpmyadmin
   restart: always
   ports:
     - 8180:80
   environment:
     PMA_HOST: db
     MYSQL_ROOT_PASSWORD: password

volumes:
 db_data:
```

# コンテナを立ち上げる

先ほどまではどのディレクトリでコマンドを打っても問題ないのですが、今度はさっき作ったdocker-compose.ymlのあるディレクトリへcdしてから以下のコマンドを打ち込んでください。

```
$ docker-compose up -d
```

# wordpress
ブラウザで[localhost:8080/](http://localhost:8080/)にアクセスすると、WordPressのインストール画面が表示されます。WordPressのインストール画面に従って、インストール情報を入力してください。

ここで、一般的な使い方であるルートにインストールしたい場合は「WordPressのアドレス (URL)」と「サイトアドレス (URL)」は、http://localhost:8080です。

もしも他のDockerコンテナや、MAMP,XAMPのようなローカルサーバを立ち上げるソフトを使っていると、localhost:8080がすでに使われていて、コンテナが立ち上がらないという事象が発生します。

そんな時は、docker-compose.ymlのportsのポート番号を変更して、ポート番号が被らないようにすれば解決できます。

```
version: "3.6"
services:
 wordpress:
   image: wordpress:latest
   container_name: wordpress
   volumes:
     - ./wordpress:/var/www/html
   environment:
     - WORDPRESS_DB_NAME=wordpress
     - WORDPRESS_TABLE_PREFIX=wp_
     - WORDPRESS_DB_HOST=db
     - WORDPRESS_DB_USER=root
     - WORDPRESS_DB_PASSWORD=password
   depends_on:
     - db
     - phpmyadmin
   restart: always
   ports:
     - 8080:80 ←←← これです
```

データベースや、phpMyAdminも同様です。ポート被りでコンテナが立ち上がらない時は、**port**と書かれているところを変更すればいけます。

まぁ、そもそも体は一つしかないので、立ち上げておくコンテナは常に一つ、ローカルサーバを立ち上げるソフトも使わない、を徹底しておけば防げる事象なのですが。。。

最後に、MySQLのホスト名はdocker-compose.ymlにある通り、「db」、ユーザー名は「root」、パスワードは「password」になります。
M1 Mac で prisma generate などが(確率で)失敗する問題の解消

# どんな問題？
最近 prisma を利用しているプロジェクトの各種バージョンをアップグレードしたら、
以下のようなエラーで prisma 系コマンドが確率で失敗するようになってしまった。

意味がわからないが本当に確率で失敗する。
5割成功する日もあれば、1割しか成功しない日もあった。クソ謎。

```sh
$ npx prisma generate

> repit-server@0.0.1 prisma-generate
> prisma generate

Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
assertion failed [block != nullptr]: BasicBlock requested for unrecognized address
(BuilderBase.h:550 block_for_offset)
 [1]    69526 abort      npx prisma generate
```

# 原因と解決方法
[参考 issue](https://github.com/prisma/prisma/issues/17869#issuecomment-1473559574) によれば、 インストールされている node が x86 用のものだったことが原因。
Prisma 自体の問題ではないとのこと。

(nodenv 経由で) arm64 用 node のインストールを行うことで解決できた。


## 元の状態
```sh
$ node -v
v18.15.0
$ node -e 'console.log(process.arch)'
x64

# 現在の shell のモード
$ uname -mp
x86_64 i386
```

この状態で node を再インストールし直すと変わらず x64 版がインストールされたため、
shell を arm64 モードに切り替えてみる。

## 解決策
```sh
# ターミナルを ARM64 に切り替え
$ arch -arm64e /bin/zsh  
$ uname -mp
arm64 arm

# nodenv で対象のバージョンを(再)インストール
# darwin-arm64 版がダウンロードされればOK
$ nodenv uninstall 18.15.0
$ nodenv install 18.15.0
Downloading node-v18.15.0-darwin-arm64.tar.gz...
-> https://nodejs.org/dist/v18.15.0/node-v18.15.0-darwin-arm64.tar.gz
...

# arm64 版が入ったことを確かめてみる
$ node -e 'console.log(process.arch)'
arm64

# prisma バイナリを消すためにプロジェクトの node_modules をインストールし直し
$ rm -rf ./node_modules
$ npm i

# 上記実施以降は毎回 arch 切り替えは必要なし
$ npx prisma generate
```

意図したとおり arm64 node がインストールでき、prisma 系コマンドが 100% 成功するようになった！
(Mac)SourceTreeで'remote: Invalid username or password.'が出たときの対応

## remote: Invalid username or password.
Gitで認証情報を変更したときに、システム側で情報を更新しているのにSourceTreeからリモートにアクセスしようとすると`remote: Invalid username or password.`が発生します。
何度も対応していたりするので、自分用に備忘録として残しておきます。

## 対処法
SourceTreeに残っている認証情報を削除し、再度認証する。

### 1. 認証情報の削除
[Sourcetree remote: Invalid username or password](https://stackoverflow.com/questions/45622960/sourcetree-remote-invalid-username-or-password)
を参考に`~/Library/Application Support/SourceTree/userName@STAuth-bitbucket.org`を削除~~し、KeyChainからSourceTreeの認証情報（AccessKey）を削除。~~

### 2. SourceTreeでアカウント情報の再設定
~~SourceTreeの設定 → アカウント（存在すれば削除）
・認証タイプ：OAuth
・ユーザー名を入力
・アカウントを接続
・プロトコル：HTTPS~~

→ SourceTreeでfetchやpushする
→ 認証情報のダイアログが表示される
→ パスワードを入力して対応完了
![スクリーンショット 2023-05-01 11.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/e08aefaf-0df1-75d2-07f9-4d8f7ed89475.png)

:::note info
Note
~~アクセストークン使うようになってからSourceTreeの認証更に面倒くさくなったなぁ~~
:::
ABC 300 備忘録

## 概要
　今回はABC300（2023年4月30日21:00~22:40）のポイントと自分の実装について書いていこうと思う。

## A問題
https://atcoder.jp/contests/abc300/tasks/abc300_a
### ポイント
- 選択肢の番号とリストの番号が1ずれていることに注意する
- 選択肢をリストとして受け取り、答えと同じ値であるかどうかを判断
### 自分の実装
```Python:ABC_300_A.py
N, A, B = map(int, input().split())

C = list(map(int, input().split()))

ans_sum = A + B

for i in range(N):
    if C[i] == ans_sum:
        print(i+1)
        exit()
```
## B問題
https://atcoder.jp/contests/abc300/tasks/abc300_b
### ポイント
- 縦→横の変換である
- 縦横に動かした時のますの状態は元のマスに対して4方にマスを並行移動して繋げた際に始点をずらしたものに等しい
### 自分の実装
```Python:ABC_300_B.py
H, W = map(int, input().split())

A = list(list(input()) for i in range(H))

B = list(list(input()) for i in range(H))

A_rev = []

for num in range(2):
    for i in range(H):
        A_rev_i = A[i]
        for j in range(W):
            A_rev_i.append(A[i][j])
        A_rev.append(A_rev_i)

for i in range(H):
    for j in range(W):
        A_rev_new = [x[j:j+W] for x in A_rev[i:i+H]]
        if A_rev_new == B:
            print('Yes')
            exit()

print('No')
```
## C問題
https://atcoder.jp/contests/abc300/tasks/abc300_c
### ポイント
- 中心の点から斜め方向に伸ばした際の4隅が `#` となっているかどうかを判定
- 判定で条件に合わない時点でループをbreakし、バツ印のサイズを確定
### 自分の実装
```Python:ABC_300_C.py
H, W = map(int, input().split())

C = list(list(input()) for i in range(H))

N = min(H, W)

S = [0 for i in range(N+1)]

# 中心のマーク探し
for i in range(1,H-1):
    for j in range(1,W-1):
        # 条件を満たさない場合は次の候補へ
        if C[i][j] != '#':
            continue
        # 角のグリッドが#となるので、グリッドの範囲内に収まるように設定
        n = min(i,H-1-i,j, W-1-j)
        size = 0
        for k in range(1, n+1):
            if C[i + k][j + k] == '#' and C[i + k][j - k] == '#' and C[i - k][j + k] == '#' and C[i - k][j - k] == '#':
                size += 1
            else:
                break
        S[size] += 1
        
print(*S[1:])
```
## D問題
https://atcoder.jp/contests/abc300/tasks/abc300_d
### ポイント
- 相異なる素数の積の場合、$10^{12}$までの積ならば、高々考えるべき素数は$10^6$まで
- ３つの素数のうち最大である`c`の範囲を`a, b`により上限の範囲を絞ることが可能である（これはコンテスト中に気づくことができなかった）
### 自分の実装
　この実装だと`TLE`になってしまった
```Python:ABC_300_D.py
import math

# 素数 s を探す関数
def search_simple_number(num):
    simple_number = [2]
    for s in range(3, num):
        div_num = 0
        sqrt_s = int(math.sqrt(s))
        for div in range(2, sqrt_s + 1):
            if s % div == 0:
                div_num += 1
                break
        if div_num == 0:
            simple_number.append(s)
    return simple_number, len(simple_number)
        
N = int(input())

simple_number_list, length = search_simple_number(N)

if length <= 2:
    print(0)
    exit()

ans = 0
    
for i in range(length-2):
    for j in range(i+1, length-1):
        for k in range(j+1, length):
            a_square = simple_number_list[i] ** 2
            b = simple_number_list[j]
            c_square = simple_number_list[k] ** 2
            multi = a_square * b * c_square
            if multi <= N:
                ans += 1
            else:
                continue
print(ans)
```

## 感想
　今回はC問題まで自分としてはすんなりと解くことができた。D問題に関しては数学的な考察が足りなかったと感じている。後日やり直したい。
異なるアカウントにあるPowerVS同士をTransit Gateway経由で接続する

# はじめに

異なる拠点のPowerVS同士はTransit Gatewayで接続可能です。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-network-architecture-diagrams#network-reference-architecture-tgw

最近まで、Transit Gatewayに接続できるDirect Linkは、同じアカウントにあるものだけでした。そのため、同じアカウント内のPowerVS同士のみが相互に通信可能でしたが、下記のように、2023年4月に、別アカウントにあるDirect LinkもTransit Gatewayに接続できるようになったため、別アカウントにあるPowerVS同士もTransit Gateway経由で通信できるようになりました。
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-adding-cross-account-connections&interface=ui

# 環境と前提

アカウントAとアカウントBのPowerVSを接続してみます。Transit GatewayはアカウントA側にあるとします。

[環境]
アカウントA：PowerVSとTransit Gateway
アカウントB：PowerVS

この記事では、アカウントAのTransit GatewayとアカウントBのPowerVSの接続にフォーカスして記述します。
両方のPowerVSで、Cloud Connections（Direct Link）をTransit Gatewayタイプで作成済みで、アカウントAのPowerVSは同じアカウントAのTransit Gatewayに接続済みとします。

なお、今回の設定は、アカウントAとアカウントBの両方の管理コンソールにログインする必要があります。アカウントを切り替えながら実施しても良いのですが、2種類のブラウザを使ったり、1つをプライベートウインドウで開くなどして、両方のアカウントを同時に開いた状態にできると操作しやすいと思います。

# 接続操作

アカウントB側のDirect Link（Cloud Connections）のCRNを確認します。アカウントBにログインし、リソースリストの画面（ https://cloud.ibm.com/resources ）から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/74d17ce3-1dcf-5780-7950-bdd689de5ec2.png)

アカウントAのTransit Gatewayに接続を追加します。追加する接続のタイプをDirect Linkにすると、別アカウントにあるDirect Linkを接続できるUIが追加になっています。上記で確認した、アカウントBのDirect LinkのCRNを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/37a6cc14-57b6-5620-eea3-e6711e93bd7c.png)

アカウントAのTransit Gatewayで処理待ちのステータスになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/15f39b8e-4295-fcda-46d4-db2e5c11f06d.png)

アカウントBのTransit Gatewayの画面で、アカウントAのTransit Gatewayが表示されます。クロスアカウントの列にマークが付いており、このTransit Gatewayが別アカウント（アカウントA）に所属している事が分かります。また、承認待ちを示す青いベルのアイコンが名前の隣に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/f17ca69b-982f-015c-cc93-206d9c9d9cd3.png)

承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/8c58c534-f119-3c4a-a7c6-7e4d8cf23f3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/b64ae6c0-9368-cef5-0a2f-256f61fc98e1.png)

双方のアカウントのTransit Gateway画面で、アカウントBのDirect Linkへの接続が接続済みステータスになったことが確認できます。

アカウントA側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/cf88dfad-1fa8-1a8f-1a15-b33a0a6b7705.png)

アカウントB側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/d6661158-b2b2-3120-5b49-4d14de658170.png)

Transit GatewayのBGPレポートで、双方のDirect Link（Cloud Connections）からPowerVSのサブネットの経路が広告されていることが確認できます。なお、BGPレポートを生成できるのはTransit Gatewayを所有するアカウントA側からで、アカウントBでは生成されたレポートの参照のみ可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9d5f13cf-1f59-d3bd-9f9e-9f3dfb4c7b48.png)

これで、アカウントBのPowerVSがアカウントAのTransit Gatewayに接続された状態になりましたので、そのTransit Gatewayに接続済みのネットワーク（他アカウントのPowerVSやx86リソース）と通信可能になりました。

以上
Salesforceの主従関係と参照関係について徹底解説

こんにちは
本橋孝昭です


今回は主従関係と参照関係について解説致します

今回の内容は動画でも公開しています

https://youtu.be/cvMkX-L01b0

<iframe width="560" height="315" src="https://www.youtube.com/embed/cvMkX-L01b0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


主従関係、参照関係はSalesforceの基本的な内容ですね

認定アドミニストレーターの試験範囲でもこのように書いてますね


https://quip.com/5FXlAAIRTrqo/SALESFORCE-

オブジェクトマネージャとLightning アプリケーションビルダー:   20%

標準オブジェクトのアーキテクチャとリレーションシップモデルを説明できる。(例：標準オブジェクト、主従関係・参照関係/ルックアップ/連結オブジェクト、レコードタイプなど)

今回はこの主従関係、参照関係の違いについてまとめました

違いといえば色々ありますが、
ざっくり言うと５つくらいを覚えてしまえばいいのかと個人的には思います！

５つとはこちらです

![主従関係001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/60f7041f-8979-9ddb-2def-5878f00da3aa.png)


１つずつ解説しましょう


## 主従関係と参照関係の大きな違い1 親は必須か否か

まず大きな違いがこちらです
主従関係は必ず親が必須です
（子レコードを作成する際に必ず親レコードを紐づけないといけないです）

なお、参照関係は必ずしも親を必須にする必要は無いです

## 主従関係と参照関係の大きな違い2 セキュリティアクセスの違い


主従関係と参照関係の大きな違いの２つ目はセキュリティアクセスの違いです

すごく分かりやすく言えば
・主従関係の場合、特定のユーザに「親レコードは見せるが子レコードは見せない」という設定はできない

・参照関係の場合は「親レコードは見せるが子レコードは見せない」という設定は可能です

これだけだとちょっと考えにくいのですが、視覚的に分かりやすく言えば

・主従関係には子レコードには「所有者」という項目が無い
（親レコードのみ「所有者」項目がある。）

・参照関係には子レコードには「所有者」という項目がある
（親レコードと子レコードはそれぞれ「所有者」がある）

です

## 主従関係と参照関係の大きな違い3 親が削除されると子も必ず自動で削除されるか否か

次の大きな特徴はこれです

主従関係の場合、親レコードを削除すれば子レコードも自動で必ず削除されます

しかしながら、参照関係の場合は親レコードを削除しても子レコードは削除させないことは可能です（設定により自動削除も可能）


## 主従関係と参照関係の大きな違い4 積み上げ集計項目は作成できるか

積み上げ集計項目とは、主従関係の場合のみ作成できる項目です

子レコードの合計レコード件数などを親側に計算することが可能です

この積み上げ集計項目は、参照関係では基本作成できません
（※例外として取引先と商談は参照関係ですが取引先から商談の積み上げ集計項目の作成は可能ですが、このような事例は標準オブジェクトの特殊な場合のみです）



## 主従関係と参照関係の大きな違い5 親の作成数

最後の違いは親の作成数です
主従関係の作成は１つの子レコードに最大２つまでしか主従関係を作成することができません

参照関係関係の場合、最大40個まで１つのオブジェクトに作成することが可能です

なお、２つの主従関係のあることを連結オブジェクトといいます

図にするとこのようなものですね

![連結オブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2e690bce-3c37-98d7-4fc1-dc59a86f2349.png)



連結オブジェクトの詳細はこちらをご確認ください

https://trailhead.salesforce.com/ja/content/learn/projects/build-a-data-model-for-a-recruiting-app/junction-object-job-postings


引用こちら
＞連結オブジェクトとは、主従関係が 2 つあるカスタムオブジェクト


## まとめ
今回の内容をまとめます

## 1 主従関係と参照関係の違いは大きく5つ

![主従関係001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/db55875f-f2a7-da79-8b45-99b41e23e1b4.png)


## 2 連結オブジェクトとは主従関係が２つあること

![連結オブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/88aebd9b-cd82-ef9e-7e94-cfed153c4dec.png)


今回の内容はここまでです

今回の内容で不明点ございましたらご指摘いただければと思います
Git＆GitHubの基礎をまとめてみた①

チーム開発も終えて何となくGitとGitHubはわかってきたけど、まだモヤモヤが残っているため、頭を整理するためにも基礎的なところをまとめてみたいと思います。

# Gitとは
Gitはバージョン管理システムの一つ。
バージョン管理システムは、ファイルの集合に対して時間とともに加えられていく変更を記録し、あとで特定のバージョンを呼び出すシステムのこと。

## そもそもなぜバージョン管理をするのか
変更前の状態と変更後を分けて保存する必要に迫られる場合があるため。また、複数人で開発を行うときに同じファイルを上書きしてしまうといったリスクを防ぐため。

# リポジトリ
Gitは、プロジェクト全体を1つのスナップショットとして記録していく。そのスナップショットや、バージョン管理に必要なその他のファイルを保存する場所をリポジトリという。

# コミット
記録したスナップショットのそれぞれをコミットという。
また、スナップショットを記録する操作のこともコミットという。
コミット操作をおこなうと、プロジェクト内のファイルのすべてがスナップショットとしてリポジトリに保存される。このとき作成したコミットや保存したファイルにはハッシュ値が割り当てられ、コミットはファイルへのハッシュ値への参照を持つことになる。
コミットを選択すれば、そのスナップショットの状態に戻すことができる。

# ブランチ
コミットは枝分かれさせることができる。あるコミットの次に作られるコミットが一つとは限らないためである。その枝分かれをブランチという。

# マージ
枝分かれしたブランチは統合させることができる。その統合をマージという。

続きは②にまとめていきます。
ICOS上のアーカイブされたファイルをまとめて復元する

### はじめに
IBM Log Analysis (LogDNA)のアーカイブや、CIS(Cloud Internet Services)のログプッシュなどで大量のログをICOS(IBM Cloud Object Storage)に保管する際、コストを削減するために、古いログをアーカイブすることがあります。

例えば以下のようなアーカイブ・ルールを設定すると、3日以上経過したログはアーカイブされ、コストが削減されますが、代わりに即座にアクセスすることが出来なくなります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307720/46ba9bdb-a3c5-ba21-0a24-efb48d196417.png" width="800">

アーカイブされたファイルを参照するには、コンソールでは以下のオブジェクトの詳細画面を操作して、復元する必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307720/391e2629-fc83-e2b8-44f3-6085451509a8.png" width="900">

ファイルが複数存在する場合、コンソールからの操作ではまとめて復元することが出来ませんので、AWS SDK for Python (Boto3)を使用して一気に操作するツールを作ってみました。

### 確認した環境

+ アーカイブ・ルールが設定されたICOSバケット
    + アーカイブ方式は従来のもの （高速アーカイブは別途確認予定）
    + ライター以上の権限を持つ資格情報のAPIキー
+ (Python実行環境としての) Watson Studio
    + Python 3.10

### Pythonソース

事前の仕込みです。`duration_days`には、復元後にオブジェクトを使用可能にする期間を日数で指定します。
`bucket`に対象のICOSバケット名、`cloud_api_key`にライター権限以上を持つAPIキー、`target_date_path_list`に復元したいオブジェクトのプレフィックスをリストで、それぞれ指定します。

```python
# 環境設定
cloud_api_key = '********' # ICOSアクセスのためのAPI KEY
duration_days = 90   # 復元を維持する日数

# 復元対象のファイルが入ったバケットと、プレフィックスのリスト
bucket = 'bucket-logdna-archive'   # LogDNAアーカイブ保管先のバケット名
target_date_path_list = [  # 復元対象オブジェクト名（前方一致）
    'year=2023/month=04/day=24/',
]

# ICOS事前定義
from botocore.client import Config
import ibm_boto3

cosclient = ibm_boto3.client(service_name='s3',
    ibm_api_key_id=cloud_api_key,
    ibm_auth_endpoint="https://iam.cloud.ibm.com/oidc/token",
    config=Config(signature_version='oauth'),
    endpoint_url='https://s3.private.jp-tok.cloud-object-storage.appdomain.cloud')
```

上で指定した復元対象のオブジェクト名の一覧を入手し、表示します。

```python
contents = []

# 対象オブジェクト一覧を取得。
for target_date_path in target_date_path_list:
    marker = ''
    try:
        while True:
            response = cosclient.list_objects(Bucket=bucket, Prefix=target_date_path, Marker=marker)
            if 'Contents' in response:  # 該当する key がないと response に 'Contents' が含まれない
                contents.extend(response['Contents'])
            if response['IsTruncated'] == True:  # 1000件超える場合
                marker = response['NextMarker']
            else:
                break
    except Exception as e:
        print('以下のエラーでICOSにアクセス出来ませんでした。')
        print(str(e))

# 一覧表示
for item in contents:
    print(item)
```

入手したオブジェクトの一覧に対して、復元操作を実施します。StorageClassがGLACIERの場合、アーカイブされていると見なして復元を実施します。なお、復元が完了して使用可能になっているオブジェクトに対して同じ操作を行うと、期限が延長されます。

```python
# 取得した一覧のアーカイブを復元
for item in contents:
    print(item['Key'])
    # StorageClassがGLACIERの場合、アーカイブされていると見なして復元実施 （復元済みの場合は期限が延長される）
    if item['StorageClass'] == 'GLACIER':
        try:
            print(cosclient.restore_object(Bucket=bucket, Key=item['Key'], RestoreRequest={'Days': duration_days, 'GlacierJobParameters': {'Tier': 'Bulk'}}))
        except Exception as e:
            print(str(e))
    else:
        print('Not archived')
```

復元操作要求後は、非同期に処理が実施され、12時間以内にアクセス可能になります。なお、その間に上記の復元操作を行うと、以下のようなエラーになります。

```
An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress
```

これで大量の過去ログを突然集計する事態になっても安心です。
BeagleBone Black 備忘録

BeagleBone Black というのは Raspberry Pi のようなワンボード Linux マシンです。組み込み Linux の教科書の実験用ハードとして取り上げられていたので試してみました。次のような特徴があります。

* USB で開発機と接続するだけで使える。IP が自動設定され ssh や web やファイル共有でアクセス出来る。
* USB 経由でシリアル接続もできるので IP 接続がうまく行かない場合に使える。ただこれは起動後に有効になるので、ブートローダの操作はできない。
* FTDI USB to Serial cable を使えばブートローダの操作ができる。
* eMMC 内蔵なので SD Card が無くても動く。

以下メモです。

* 接続
    * USB で開発機と接続。電源は USB から取れる。
* SD カードの作成
    * https://beagleboard.org/getting-started に従う
    * balenaEtcher をインストール
    * Debian image (Buster IoT) をダウンロード
    * balenaEtcher を使って Debian image の SD カードを作成
* 起動
    * 電源を切った状態で SD カードを指す。
    * USER/BOOT ボタン (SD カードスロット近くのボタン) を押しながら POWER ボタンを押す。
* 接続
    * ログイン
        * user: debian
        * password: temppwd
    * USB シリアル
        * brew install picocom
        * picocom -b 115200 /dev/tty.usbmodemなんとか
        * 終了: Ctrl-a Ctrl-x
    * IP
        * ssh debian@192.168.6.2
        * ssh debian@beaglebone.local
        * http://192.168.6.2/ide.html
            * cloud9 の UI が表示される。
            * LED を表示する Python のサンプルもある。デバッグもできるらしく滅茶滅茶かっこいい。
    * デバッグシリアル
        * FTDI USB to Serial cable を J1 Serial Header Pins に以下のように接続
            * 1: Ground 黒
            * 4: Receive 私のやつだと緑
            * 5: Transmit 私のやつだと白
        * picocom -b 115200 /dev/tty.usbserial-なんとか
        * 特にドライバをインストールした記憶が無いが動いた。
        * 参考: https://docs.beagleboard.org/latest/boards/beaglebone/black/ch07.html#serial-header
        * ケーブルは大昔に買った https://www.amazon.co.jp//dp/B00K7YYFNM/ が使えた。
Reactチュートリアルをやってみた(新しいドキュメント)

## 教材

https://react.dev/learn/tutorial-tic-tac-toe


## はじめに

[前回の記事](https://qiita.com/acronhub/items/3f1ecd88b4922797f273)のコメントで教えていただいた、新しいドキュメントのチュートリアルを進めていきたいと思います
前回の書き方の違いなど記事にしたいと思います

## 開発準備

https://react.dev/learn/tutorial-tic-tac-toe#setup-for-the-tutorial

- チュートリアルに書いてある`CodeSandbox`を利用して開発環境を用意します

1. サイトのチュートリアルコードの右上にある`Fork`ボタンで自分のアカウントにスターターコードを派生させます
1. 画面、右上にある`Fork`ボタンで自分のアカウントにスターターコードを派生させます
1. 以下のような画面になれば準備完了です
![Tic-Tac-Toe-fork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/4c862fc4-ce29-b833-b7fa-b761713628f5.png)
1. 編集するファイルは`App.js`になります

## チュートリアルに書いてあるのを忠実に書き写す
内容を書いていくとチュートリアルの写経になってしまうので割愛しますが、調べた事を書いていきます

### メイン（スタート地点）の差異

- 前回
```js
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Game />);
```

- 今回
```js
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client"; < # ココでライブラリー内のメソッドを読み込んでます
import "./styles.css";

import App from "./App";

const root = createRoot(document.getElementById("root"));
root.render(
  <StrictMode>
    <App />
  </StrictMode>
);
```

- 少し違う書き方にはなっていますが同じ内容です
- 今回は`ReactDOM.`が省略されていますが、`import`を使って[Reactライブラリー](https://react.dev/reference/react-dom/client)を読み込んでいるからです
  - ライブラリーの中の`createRoot`を使えるようにしています

### import

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import

### useState

- 前回
```js
class Square extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: null,
    };
  }

  render() {
    return (
      <button
        className="square"
        onClick={() => this.setState({value: 'X'})}
      >
        {this.state.value}
      </button>
    );
  }
}
```

- 今回
```js
import { useState } from "react";

function Square() {
  const [value, setValue] = useState(null);

  function handleClick() {
    setValue("X");
  }

  return (
    <button className="square" onClick={handleClick}>
      {value}
    </button>
  );
}
```

- 大きく書き方が変わり、読みやすくなっている気がします
  - `this.`がなくなっています
  - `constructor`がなくなっています
  - ステートへの保存が、`value`を指定しなくてもよくなっています

https://qiita.com/shimajiri/items/55c1846dd3012ce3dfc8

## 完成

https://codesandbox.io/embed/tic-tac-toe-356p6z?fontsize=14&hidenavigation=1&theme=dark


Propsでの渡し方も、各変数ごとで記述出来ているので、1つのPropsから取得していたときよりもミスが起こりにくい気がします
なにより全体的に`this.`の記載が一切ないのと、何か読みやすくなっている気がします

## 最後に

この記事を書き始めてから、かなりの時間が経過してしまっていました
その間に、業務でReactに触れる機械がありReactの書き方に慣れてきたのもあり、昔との差分が上手にかけていない気がします
以前の書き方がもう書けないくらいで、今回の書き方に慣れてしまいました（笑）

ただ前回の内容が下地にあるからこそ、今回の内容が理解出来たので、前回の記事を書いて良かったと思います

まだフックには、今回利用していない`useEffect`とかもあるので、そちらも使ってみて感想を書いてみたいと思います
フローを使って開始日と終了日の期間に対して月に１つのレコードを作成する



+ [元の質問](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000PeT29)

**参考にした質問/回答**
+ [ある日付まで一括作成するフローを教えて下さい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OqJRJ)

:::note
決定要素の抜け先（要素に接続）を決定要素に戻すだけです。
:::

これはレイアウトを自由形式にしないとできないみたい

+ [Flow - creating multiple records with one record based on conditions](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A97BKSAZ)

:::note
It is possible in flow , create a loop with iteration equals to the difference in Months of start and end date and perform create records as many times for it. Try this and let me know for any issue. 

フローでは、開始日と終了日の月の差に等しい反復でループを作成し、その回数だけレコードの作成を実行できます。これを試して、問題があればお知らせください。
:::


まずは、開始日と終了日の月の差を計算しましょう。
以下の数式リソースで可能です。

CountMonth

```
IF( YEAR( {!StartDate}) = YEAR({!EndDate}) , MONTH({!EndDate}) - MONTH( {!StartDate}),
IF( MONTH({!EndDate}) > MONTH( {!StartDate}) , ( YEAR({!EndDate}) - YEAR( {!StartDate}) )*12 +  (MONTH({!EndDate}) - MONTH( {!StartDate}) ) ,
( YEAR({!EndDate}) - YEAR( {!StartDate}) -1)*12  + 12 + MONTH({!EndDate}) - MONTH( {!StartDate})   ))
```


試しに変数counterを作って、最初にこの変数にCountMonthを割り当てます。
決定要素でカウンターがゼロかどうかを判断します。ゼロの場合は終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c47a71d1-91cb-9b6a-f2c8-725b18a7d260.png)


ゼロでないときは処理を続けます。

カウンターと１つマイナスします。
またコレクション変数にここではカウンターの値を追加していますが、この案件ではレコード変数に必要な値をセットして、次の割り当て処理でレコードのコレクション変数にこのレコード変数を追加するといいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/50629734-b612-0671-01eb-ab9daacae8b8.png)


最終的にはこの処理を先ほどの判定処理でカウンターがゼロかを判定させます。

全体の流れは以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b1c73656-bb89-7861-8347-9bcdf4bf1639.png)

 

採取結果は最終の間違えですね。この画面の変わりにレコードのコレクション変数を使ってレコードを新規作成すればいいと思います。
注意点としては今の処理は複数回流すと同じ月のレコードができてしまうので問題です。
Apexを使えばupsertできるので、親のIdと年月の格納するフィールドを作っておいて、このフィールドをキーにupsertすれば重複は防げますが... フローではupsertできないみたいです。
https://ideas.salesforce.com/s/idea/a0B8W00000Gdf3zUAB/upsert-option-in-flow-builder

これを使えばできるかも...
https://unofficialsf.com/create-or-update-with-the-new-upsertrecords-action/
【AWS】EC2サーバ,FTPソフト接続マニュアル

<h2>はじめに</h2>

めっちゃ簡単、FPTソフトでAWS,EC2サーバーにSSH接続する方法

<h2>ちなみに</h2>
FTPソフトウェアは、ウェブ開発者やシステム管理者など、リモートサーバーとのファイルのやり取りが必要な人々にとって便利なツールです。

:::note
ファイルの転送: FTPクライアントを使用して、自分のコンピュータとFTPサーバーの間でファイルをアップロードやダウンロードすることができます。これにより、ウェブサイトのファイルをアップロードしたり、リモートサーバー上のファイルをダウンロードしたりできます。

ファイルの管理: FTPクライアントを使用して、FTPサーバー上のファイルやディレクトリを管理することができます。ファイルの作成、削除、移動、名前の変更などの操作が可能です。

サーバーへの接続: FTPクライアントを使用して、リモートサーバーに接続することができます。FTPサーバーのアドレス、ユーザー名、パスワードを入力して接続し、ファイルの転送や管理を行います。

セキュアな通信: 多くのFTPクライアントは、FTPサーバーとの通信を暗号化するためのセキュアなプロトコル（SFTPやFTPSなど）をサポートしています。これにより、データの送信や受信が安全に行われます。

自動化: 一部のFTPクライアントは、ファイルの自動転送や同期、バッチ処理などの自動化機能を提供しています。定期的なバックアップやファイルのアップデートなどを簡単に実行することができます。
:::

<h2>手順</h2>
1.AWSでEC2のパブリックDNSを確認<br>
2.FTPソフトの立ち上げ〜SSH接続<br>
3.まとめ

<h2>1.AWSでEC2のパブリックDNSを確認</h2>

:::note
パブリックIPv4アドレスでもFPTのSSH接続は可能だが、コンテナが起動する度に変わるので推奨しない。
パブリックIPv4DNSは、コンテナ起動有無でも変わらない。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045856/ad950b62-a813-34e8-3f8e-339274b12a8b.png)


<h2>2.FTPソフトの立ち上げ〜SSH接続</h2>

:::note 
一般的なFTPソフトウェアをいくつかご紹介します。

FileZilla: プラットフォームに依存せずに利用できる人気のあるFTPクライアントです。使いやすいインターフェースと多機能性が特徴です。

Cyberduck: macOSおよびWindows向けの無料のFTPクライアントです。シンプルなインターフェースで使いやすく、さまざまなプロトコルに対応しています。

WinSCP: Windows専用のオープンソースのFTP、SFTP、SCPクライアントです。直感的なインターフェースと高度な機能を提供しています。

Transmit: macOS向けの高機能なFTPクライアントです。美しいデザインと使いやすさが特徴で、多くのプロフェッショナルユーザーに支持されています。

CuteFTP: Windows向けの有名なFTPクライアントで、高度なセキュリティ機能や自動化機能を提供しています。
:::

私はCyberduckを利用しています。基本的なGUIは同じなので操作もほぼ同じだと思います。

1.FTPソフトを開き、新規接続作成からこの様な画面を開きます。
SFTP(SSHによる暗号化FTP)を選択し、3箇所を変更(サーバー、ユーザー名、SSH鍵)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045856/e0ae63c3-50e5-e592-ab97-da9037ecf7f9.png)

【AWS】EC2サーバー構築、SSH接続
URL：https://qiita.com/Shohei2000/items/8b2cc9f2c32c513fc581

サーバー：パブリック IPv4 DNS(例：ec2-~~~~~~~~~~~~~~.amazonaws.com)
ユーザ名：ec2-user
SSH鍵：SSH鍵へのパス(上の記事で構築した人は、Desktop上に保管しているはず...)


<h2>まとめ</h2>

これだけでFTPソフトが利用できます！
ちょー簡単！
【Flutter】Pixel Perfectでデザインに忠実な実装をする（したい）


突然ですが、**Pixel Perfect** という表現を聞いたことがあるでしょうか？
私はもともとWebアプリ開発をしていた頃は良く聞いていたものの、モバイルアプリの領域に来てからは
聞く機会が少なくなりました。
特にFlutter開発だと、スピード最優先！のようなプロジェクトも多いのでデザイン半ばで実装していくケースも多いと体感しています。

話題を戻しますが、Pixel Perfectとは、「デザインや画像を実際のWebページやアプリなどに反映させる際に、1ピクセル単位で完全に合わせることを目指す技術や考え方」です。

ただし、Flutterはクロスプラットフォームの開発を採用しているため、様々なスマートフォン・タブレットに対してデザイン通り100%一致させることはかなり難しいと考えます。

その中で、今回はデザインに極力合わせたり、デザインを見ながら実装しやすくするパッケージの紹介です。

https://pub.dev/packages/pixel_perfect


（参考）

https://youtu.be/L4G_ylrmKQ8

使い方はとても簡単で、`assets/image`のような階層に画像を配置し、あとはデザインを重ねたいウィジェットを`PixelPerfect`ウィジェットでラップするだけです

```Dart
return PixelPerfect(
  assetPath: 'assets/design.png', // path to your asset image
  scale: 1 // scale value (optional)
  child: Scaffold(
    ..
  )
)
```

公式にもありますが、こうして透明度を変えたり移動したりできて見やすいですね！


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/735195/787da9ff-86b4-df40-ac40-8baa4a07137d.gif" width="300" />

最終チェック用くらいに思っていただけたらいいのかなと。
【初心者】Djangoでデータベースのデータをutf-8でdump（バックアップ）する方法

# はじめに
先日、Djangoプロジェクトにおいて、データベースのデータをdumpした際に日本語のデータが文字化けしてしまいました。
本記事ではその時に実施したutf-8形式でdumpする方法を紹介します。

# 環境
以下の環境で動作を確認しています。
python version 3.7.1
Django version 3.2.16

# Djangoでdumpするコマンド
Djangoでutf-8形式にdumpするコマンドは以下です。
Djangoアプリのmanage.pyがある階層で実行します。

```
$ python -Xutf8 manage.py dumpdata [アプリ名[.モデル名]] > [出力先] 
```
- -Xutf8：データをutf8形式で出力するオプション。
- [アプリ名[.モデル名]]：アプリ名のみを指定した場合は全てのモデルのデータを出力します。アプリ名.モデル名と指定した場合は該当のモデルのデータのみを出力します。
- [出力先]：dumpファイルの出力先になります。一般的には[アプリ名]/fixtures/ [ファイル名]を指定することが多いです。

# 実例
例として書籍管理アプリ(booksアプリ)における書籍カテゴリモデルのデータをdumpします。

```django:model.py
class Category(models.Model):
    """書籍カテゴリモデル"""
    name = models.CharField(verbose_name='カテゴリ名', max_length=50)
    class Meta:
        verbose_name_plural='Category'

    def __str__(self):
        return self.name
```

ターミナルで以下のコマンドを実行します。

```
$ python -Xutf8 manage.py dumpdata books.Category > books/fixtures/category.json
```
dumpファイルが無事生成されました。日本語も文字化けしていません。

```json:category.json
[
	{
		"model":	"books.category",
		"pk":	"1",
		"fields":	{"name": "文学・評論"}
	}	,
	{
		"model":	"books.category",
		"pk":	"2",
		"fields":	{"name": "人文・思想"}
	}	,
	{
        ・・・以下略
	}]
```

# 参考サイト
- [公式ドキュメント](https://docs.djangoproject.com/en/3.2/ref/django-admin/#dumpdata)
- [stack overflow](https://stackoverflow.com/questions/64457733/django-dumpdata-fails-on-special-characters)


# 終わりに
RDMSに依存せずにDjangoでdumpできるのは非常に便利！
WebP非対応ブラウザでの画像表示を確認するには

:::note warn
この手法は残念ながらFirefox 119から使えなくなったようです。
@ice-creamerさん、ありがとうございます！
:::

# 結論

Firefoxで `about:config` を開き、 `image.webp.enabled` を `false` にしましょう。

# WebP非対応ブラウザ

今やほとんどのブラウザがWebPに対応したことで、WebP非対応の古いブラウザでの表示確認が逆に難しくなりました。

- IE
- macOS 10以前のSafari
- iOS 13以前のSafari

この辺りがWebP非対応ブラウザですが、古いブラウザを使って確認して…というのはお客さんにおすすめできないので違う方法を考えます。

# Firefox

Firefoxを開いて、アドレスバーに`about:config`と入力すると、 **注意して進んでください！** と物々しい警告が表示されますが、**危険性を承知の上で使用する** を押してください。

![Cursor_と_高度な設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/3f200c04-0b47-5a11-9eea-c2df49fe36d4.png)

`設定名を検索` の部分に `webp` と入力し、 `image.webp.enabled` の値を `false` に変更します。

![高度な設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/be382f55-3287-8e13-2362-6cefcd8e9179.png)

左右の矢印のようなボタンを押すと値が変わります。

![高度な設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/99431f0f-ee17-6095-e204-d20da515631e.png)

これでOKです。**Firefoxが一時的にWebP非対応ブラウザに逆戻り**しました。

WebPに対応したページを表示し、画像が表示されればWebP非対応ブラウザでも画像の表示は問題ありません。念のため、`ウェブ開発ツール`で画像のタイプを確認するのもよいでしょう。

:::note info
WebP対応にはHTMLの`picture`要素を用いた出し分けと、サーバー側で`Accept`ヘッダを元にした出し分けがありますが、どちらの方法にも対応しています。
:::

表示確認が終わったら、`image.webp.enabled`の値は忘れず`true`に戻しましょう。`戻る`ボタンでも操作できます。

![高度な設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/a67dca35-617f-08c5-9678-c29786436824.png)

# Chromeにはないの？

同様のオプションをChromeでも探したのですが、見当たりませんでした。

`chrome://flags`に`Lens Optimized Image Formats`という項目があります。でもこれはGoogleレンズ関連機能のようです。

Chromiumのソースコードも少し読んでみましたが、WebP対応はハードにコーディングされていました。

https://chromium.googlesource.com/chromium/src.git

AVIF対応はまだマクロでOFFにできるようでしたが、**「WebPはもう絶対やめない」** という強い意思が感じられました。

# それでもChromeやSafariをWebP非対応にするには

HTTPリクエストヘッダを書き換えることのできるブラウザ機能拡張があります。

https://docs.requestly.io
https://docs.modheader.com/using-modheader/about-modheader

これらを使って、`Accept`リクエストヘッダを例えば`*/*`に変更すると、サーバーに対してはWebP非対応ブラウザのふりをすることができます。

![Notification_Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/f82e4fea-38f5-2eb2-cf71-b68e77df0c28.png)

でもこの方法は`picture`要素による出し分けには対応していません。

今のところFirefoxを使うのが手軽で確実のようです。
Salesforceでフローを作成しよう～リストビューから一括削除ボタンを作成しよう

こんにちは
本橋孝昭です

今回は
・リストビューに「一括削除ボタン」を配置してリストビューにチェックが入ったレコードを削除する

というフローを作成しようと思います

今回の内容は動画でも公開しています

https://youtu.be/lrAbpskRGlM

<iframe width="560" height="315" src="https://www.youtube.com/embed/lrAbpskRGlM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>



これをすれば以下の画像のようにリストビューから
・一括削除ボタン
が表示されるので、リストビューからチェックを入れてボタンを押すとそのチェックを入れたレコードが一括で削除可能です

![削除01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/24256c8d-5e91-8d0f-4b75-d2b381b44277.png)

こちらについてどのような設定をすれば見ていきましょう

今回は例としてリードオブジェクトに削除ボタンを配置し一括削除を行います

設定は大きく２つです

### ステップ１　画面フロー作成
### ステップ２　リードオブジェクトの編集（ボタン作成、リストビュー編集）


まずはフロー作成から見ていきましょう


## ステップ１　画面フロー作成

まずは画面フローを作成しましょう

フロー概要はこちらです

![フロー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/505801ee-fb48-fb20-c28e-65682a117f34.png)

フロー作成の前に、まずはこちらの変数
ids
を作成しましょう
![フロー12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b00f1ec4-fe02-ca12-1b9b-ed750e5fee50.png)


レコード取得はこちら

![フロー13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/32060460-fc54-e940-399c-2680cb8a24d6.png)


レコード削除はこちら

![フロー14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9353b690-e84f-17d3-24e8-68c5eac4f436.png)


これでフロー作成は完了です
今回フロー名は

DeleteLead

とします

次にリードオブジェクトマネージャーの設定です

## ステップ２　オブジェクトマネージャー編集（ボタン作成、リストビュー編集）

ボタン作成の詳細はこちらです

![ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fc472a08-f1e9-4974-2588-4591b8a65ebe.png)

ポイントとしては

・リストボタンに設定
・構文は
/flow/　+フロー名
（今回のフロー名はDeleteLeadなので　/flow/DeleteLead）

です


最後に
リストビューボタンレイアウトを編集し先ほどのボタンを選択し保存しましょう

![リストビュー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/20084adc-5e59-79cc-42a1-34e8a157cb47.png)


以上で完了です。お疲れ様でした！