OmniAICreator/Qiita-1.07M huggingface dataset:
フィクションなどから拾う情報処理用語 その12 標的型メール (仮面ライダーV3)

仮面ライダーV3 第47話「待ち伏せ! デストロン首領!!」(脚本：伊上勝、監督：折田至、(C)石森プロ、東映))より

季節は正月。
少年仮面ライダー隊本部で珠純子はキレイな晴れ着を着ていた。
大好きな風見志郎に見せたかったのだろう。

珠純子「ほら、こんなに年賀状がいっぱい。」

珠純子は両手に届いた年賀状を持って入って来た。
そこには立花藤兵衛会長、風見志郎、珠シゲル、そして結城丈二がいた。

藤兵衛「おー、どれどれ。うーん。」
シゲル「すごいなあ。全部V3に来てる。」
藤兵衛「ライダーV3 = 少年ライダー隊だ。がんばらなくちゃな。」

なお、この中で風見志郎が仮面ライダーV3であることを知っているのは藤兵衛と風見志郎本人と結城丈二だけ。風見志郎の意向で珠純子には伏せられていたのである。当然、シゲルも知らなかった(はずだ)。

シゲル「がんばるぞ。」
藤兵衛「そうだ。」

全部V3宛のはずなのにシゲルは喜んで、さらには「がんばるぞ」と言っていた。
だが風見志郎は意に介していなかった。

志郎「その調子だな、シゲル。」

なお結城丈二はずっと座ったままだった。
というやりとりがあった後、

純子「結城さんに来てないかしら。」

と無邪気に言い出した。ここから話は思わぬ方向へ進むのである。

藤兵衛「うーん?」
結城「まさか。」

それがあったのだ。

藤兵衛「お、あった、あった。結城君に来てるぞ。」

結城丈二は怪訝な顔。

結城「は? おかしいなあ。」
シゲル「誰から?」
結城「うん。」

なお結城は右手だけ手袋をしていた。明らかにおかしな格好だが純子もシゲルも突っ込まなかった。彼の右腕は義手なのだが、そこまで純子とシゲルが知っていたかどうかは定かではない。いずれにしろ、ノーマライゼーションの先駆けだ。閑話休題。

結城「ん!? デストロン。」

なんと結城宛にデストロンから年賀状が届いていたのだ。
なお、少年仮面ライダー隊の位置は「セントラル・スポーツ」開店そうそう、デストロンから記念の花輪が届いていたので既にバレバレである。デストロン恐るべし。

結城「ヨロイ元帥。ふざけやがって。」

この名を見ただけで結城は興奮気味である。
それを察した(?)のか、風見志郎は

志郎「おい、ちょっと。」

結城宛の年賀状を取り上げた。

風見志郎「結城丈二
新年おめでとう。今年こそ
裏切り者は殺す。
デストロンを代表して。
ヨロイ元帥」

なおご丁寧にもデストロンのマークまで描かれていた。

藤兵衛「ご丁寧にも住所まで書いてあるぞ。」

思わず風見志郎は住所を読み上げてしまった。

志郎「横浜市中区山下町。ヨロイ元帥。」

と言うわけで風見志郎と結城丈二は年賀状に書かれた住所へミスミス行って、門の前でオートバイを止めた。

志郎「山下町205番地。」
結城「本当にあの中にヨロイ元帥がいるとでも言うのか!」

結城は大声で言った。かなり興奮しているようだ。

志郎「うん…ふ?」

自動車が走ってきた。横浜なのに練馬ナンバーである。
中にはデストロンの戦闘員とヨロイ元帥が乗っており、屋敷の中に入っていた。
別の入口があったようである。
それを物陰から風見志郎と結城丈二が見ていたが、結城の方が前のめりである。

結城「お、ヨロイ元帥!」

飛び出しそうになったので

志郎「待て。」

と止めた。

志郎「ヨロイ元帥はあの建物の中に入って行った。」

結城はうなずいた。

志郎「どんな罠があるか、様子を見ようじゃないか。」

と言うわけで志郎は屋敷の敷地に入って様子を伺っていたのだが

ヨロイ元帥の声「ようこそ。風見志郎。」
風見志郎「ヨロイ元帥。」
ヨロイ元帥の声「デーストロンの正月パーティー、参加するか?」
志郎「ふふふ。面白い。是非とも参加させてもらいましょうか。」

そう罠だったのである。あえて罠に乗った風見志郎。パーティーに参加した。

さて結城も屋敷の敷地に入っていたが

ヨロイ元帥の声「裏切者結城丈二。一人では恐ろしくて入ってこれんのか。貴様は裏切者。そしてその上に腰抜けだあ。」

それを聞いて結城はプッツンした。まあそれでなくても猪突猛進の性格である。これで京都大学を出たという設定なのだ。まあ科学的知識はそれなりにすごいが。

結城「くそ。ヨロイ元帥。行くぞ。ヤー。」

結城はライダーマンに変身した。
果たしてこのままで済むのか?
嫌な予感しかしないが続きは映像で。
GoogleAppsScriptで勤怠メールをボタン1クリックで送れるようにする

## 前提条件
- Google Workspace（旧 G Suite）を使用している。
- リモートワーク等で勤怠をメールで送信する習慣がある。
- 勤怠開始します、終了しますといった文面に日々の変化がないこと。

## 仕様
- GoogleSpreadSheet 上にボタンを描写する
- クリックすると送信前確認モーダルが開く
- YESを押すとメールが送信され、されたことがわかるモーダルが開く
- Noを押すとキャンセルされたことがわかるモーダルが開く

## 作業手順
#### GoogleSpreadSheet

スプレッドシートの挿入メニューの図形描写を選択肢し送信ボタンを作成する。
![スクリーンショット 2023-02-15 19.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116695/57878ac9-d6ae-7002-786e-4bed3f8fde3e.png)


#### AppsScript
スプレッドシートの拡張機能メニューの「Apps Script」を選択すると
別タブでAppsScriptが開く
※　スプレッドシートから開かないと疎通しないので注意

![スクリーンショット 2023-02-15 20.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116695/5c448525-809b-cd87-1798-11f6d6912b64.png)
- サンプルコードは以下
```actionscript:勤怠開始メール送信.gs
function sendStartMail(){
    const confrim = Browser.msgBox(
        "勤怠開始メール 送信", // モーダルのタイトル
        "メールを送信してもよろしいですか？", // モーダルの詳細
        Browser.Buttons.YES_NO // はい、いいえのボタンを表示
    )
    
    if(confirm === 'yes'){
        // メールを送信するスクリプト
        const address = '送信したいメールアドレス';
        const subject = '〇〇：勤怠開始します';
        let body = 'お疲れ様です。〇〇です。これより勤怠開始します。';
        const options = {};

        GmailApp.sendEmail(address,subject,body,options);

        // 送信完了を知らせるモーダルを表示
        Browser.msgBox(
            "送信完了",
            "スクリプトを実行しました。",
            Browser.Buttons.YES 
        )
    }
 
    if(confirm === 'no'){
        // 送信キャンセルを知らせるモーダルを表示
        Browser.msgBox(
            "送信キャンセル",
            "スクリプトをキャンセルしました。送信は行われていません。",
            Browser.Buttons.YES 
        )
    }
}
```
※　勤怠終了メールも作成する場合は新しく関数を作成

#### GoogleSpreadSheet

作成した送信ボタンを右クリックし、スクリプトの割り当て を選択
![スクリーンショット 2023-02-15 19.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116695/094b4e92-058f-9168-3908-26a8f195844d.png)

gsファイルの中で定義した関数名（sendStartMail）を設定。
![スクリーンショット 2023-02-15 20.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116695/18e18e81-365c-eb68-48a3-b797c35f45b6.png)

以上、スプレッドシート上のボタンを押すことで、
メール送信が行えるようになった。
![スクリーンショット 2023-02-15 20.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116695/c096b26f-54d9-5cb6-87fb-5f5df27c42c1.png)

## 応用例 
- 現在日時を取得し GoogleSpreadSheet に実行した直近の日時をログとして特定のシート、セルに自動反映する
- GoogleSpreadSheet上の特定のシート、セルから文字列を取得しスクリプトに反映。メールアドレスや名前、部署などをuniqueに変更する。

## Appendix

- [Apps Script Reference](https://developers.google.com/apps-script/reference/document）)

https://developers.google.com/apps-script/reference/document
javaの可変長引数に関する注意点[備忘録]

初投稿です。

Javaのプログラミング資格で学習中で気づいたことに、備忘録として残します。
コード解読してから、java APIで該当のメソッドを調べたときに、メソッドがなかなか見つからない、そんな時、以下の場合があるかもしれません。

今後も追加情報があれば、更新致します。

メソッドの定義側の引数
1.可変長引数のみ
2.固定長引数のみ
3.固定長引数と可変長引数
の3パターンでオーバーロードされているtest1メソッドに対して、
呼出側で
1.引数なし
で呼び出した場合の挙動。

続いて、
メソッドの定義側の引数
3.固定長引数と可変長引数
呼出側で
1.固定長引数のみ
で呼び出した場合の挙動。

についてコードで整理しました。

```A.java
public class A {
  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.test1());//test1 Object... args
    System.out.println(a.test2("test2"));//test2 String s, Object args
  }

  String test1(Object... args) {
    return "test1 Object... args";
  }
  String test1(String s) {
    return "test1 String s";
  }
  String test1(String s, Object... args) {
    return "test1 String s, Object... args";
  }

  String test2(String s, Object... args) {
    return "test2 String s, Object args";
  }
}
Salesforce認定アソシエイト試験の公式練習問題解説してみた-02

こんにちは

Salesforce認定アソシエイト試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回は
認定資格試験の準備: Salesforce 認定アソシエイト＞
Salesforce エコシステムについて学ぶ

の問題2問目を解説します

https://trailhead.salesforce.com/ja/content/learn/modules/cert-prep-salesforce-certified-associate/learn-about-the-salesforce-ecosystem?trailmix_creator_id=strailhead&trailmix_slug=prepare-for-your-salesforce-certified-associate-credential

今回の内容は動画でも解説しています


https://www.youtube.com/watch?v=-3H8Z-3RypM

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


![コミュニ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/725e4005-be62-dad7-6aa8-43bd02a5de7a.png)

正解はCです

Experience Cloudは非公開のWEBサイトを作成してパートナーと情報連携が可能となります
https://www.salesforce.com/jp/products/experience-cloud/overview/


Aについて
Marketing Cloud Account Engagementは以前はPardotと呼ばれていた製品ですね


2022年からPardotはMarketing Cloud Account Engagementと瀬品名が変更されました

https://www.salesforce.com/jp/blog/2022/04/next-gen-marketingcloud-vision-product-names.html

こちら旧Pardotはマーケティングで活用できる瀬品ですね




Bについて
Commerce Cloudは、Web、ソーシャル、モバイル、店舗などショッピングのあらゆる場面で一貫したカスタマーエクスペリエンスを提供できるSalesforceの製品です
https://www.salesforce.com/jp/gdpr/commerce/

## 他の認定アソシエイトの勉強方法について

他の勉強方法についてはこちらをご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b
フィクションなどから拾う情報処理用語 その11 確率 (仮面ライダー)

仮面ライダー 第41話「マグマ怪人ゴースター 桜島大決戦」(脚本：伊上勝、監督：山田稔、技斗：高橋一俊、(C) 石森プロ、東映)より

時は1972年1月8日。

ヨーロッパで死神博士率いるショッカーの軍団と戦っていた本郷猛はその前週の1972年1月1日(つまり元日)には日本に舞い戻り、九州で一文字隼人と共闘していた。盆と正月に帰ってくるのは「ライダー世界を律する法則」のようである。閑話休題。

本郷猛と一文字隼人は達治少年と知り合った。達治は岩に座って泣いていた。

本郷猛「坊や、どうしたんだ。坊や、腹でも痛いのか?」
一文字隼人「男のくせにメソメソするな。」

達治は言った。

達治「母ちゃんが、どっか連れて行かれたんだ。」
隼人「お前のお母さんが?」
本郷「坊や、詳しく話してみないか。」

その頃、五郎は(多分)桜島を歩き回っていた。

五郎「隼人にいちゃーん。大変なんだよー。隼人にいちゃーん。どこ行っちゃったんだろなあ。」

なぜ本郷の名を呼んでいないかと言えば答えは簡単、全く会っていないからである。
五郎が本郷猛と会うのは一文字隼人が南米へ発った頃。
一文字隼人が南米に発つまで本郷は立花藤兵衛とも顔を合わせなかった。
またヨーロッパでの元助手のエミとミカにも本郷は会わなかった。
滝とは(なぜか)アフリカから日本に来た時に顔を合わせているが。
もっとも手紙を立花レーシングクラブに出してはいた。
ただ五郎、ユリ、エミ、ミカが仮面ライダーの正体を知っていたかどうかは微妙である。
緑川ルリ子は本郷猛の意向で本郷猛が改造人間であることなどは伏せられていた。
史郎と野原ひろみがどうだったかまでは知らない。
閑話休題。

さて達治から話を聞いた一文字隼人と本郷猛は

隼人「くっそー。ショッカーのやりそうな手口だ。」
本郷「うん。」

一文字隼人は駆け出したが

本郷「待て、隼人。」

と呼び止めた。

隼人「どうして止める?」
本郷「止めやしないが追跡は一人でいいだろう。」

じゃあ隼人を呼び止める必要はなかったのではないか?
まあ隼人は納得した。

隼人「わかった。じゃあどうやって決める? お前と俺。」

本郷はニヤニヤしながらポケットからコインを取り出した。

本郷「好きな方。」
隼人「おいおい。両方表なんてコインを使うんじゃないだろうなあ。」

本郷は笑顔のままこう言った。

本郷「俺を信用しろよ。」

隼人はなおも怪訝な表情のままこう言った。

隼人「よーし、表だ。」

ニヤッと笑ったまま、本郷はコインを上に投げて右手を使って左手の甲にコインを受け止めた。出たのはウラだった。残念がる隼人。ニヤッと笑う本郷。

本郷「残念だったなあ。」
隼人「俺はあの坊主を家まで送る。落ち合う場所は?」
本郷「桜島の展望台にしよう。」
隼人「よし。坊や、おいで。」

達治が隼人のところに駆け寄った。

隼人「滝や親父さんにも連絡をつけておくか。」
本郷「ああ。」

隼人は達治を連れてオートバイに乗った。

隼人「頼んだぞ。」

隼人が走り去るのを見送りながら

本郷「一文字。悪く思うな。お前の言った通り、コインは両方ともウラだ。」

つまり表が出る確率はハナから0だったわけである。本郷は一文字隼人のウラをかいたのである、文字通り。本郷のIQは600。それだけ高いから…ちょっと待て、本郷。一文字隼人が「ウラ」(出る確率は当然100%)と言ったら、どうするつもりだったのだ?

このモヤッとする感じはこの話の展開の伏線だった…と言うわけではありません。
フィクションなどから拾う情報処理用語 その10 完全一致 (仮面ライダー)

仮面ライダー 第93話「8人の仮面ライダー」(脚本：伊上勝、監督：山田稔、技斗：岡田勝、(C) 石森プロ、東映)より

時は1973年の正月。
ショッカーは滅んでゲルショッカーになっていた。
だが「ショッカーからゲルショッカーに変わってもご都合主義は健在。ライダー世界を律する法則は不変であった。」と言うのは『仮面ライダー大研究』で月村了衞さんが仮面ライダー 第81話「仮面ライダーは二度死ぬ!!」(脚本：伊上勝、監督：山田稔、技斗：岡田勝、(C) 石森プロ、東映)を評して述べた言葉。
当然の事ながら作風もぶれなかった。
閑話休題。

さて番組も佳境に入っていた。
ゲルショッカーと戦うアンチショッカー同盟が登場し、ショッカー首領の正体に関するテープの攻防戦が行なわれていた。アンチショッカー同盟は立花藤兵衛と滝和也に協力を求め、彼らもそれに応じて協力していた。そこにショッカーライダーが紛れ込んでいたのを、藤兵衛も滝もアンチショッカー同盟の皆さんも気づいていなかった。
ところで組織名はゲルショッカーになったのに何故「アンチショッカー同盟」だったり「ショッカー首領」だったりするのかは「ショッカーからゲルショッカーに変わってもご都合主義は健在。ライダー世界を律する法則は不変であった。」と言う名言が全てを物語っているので突っ込んではいけないお約束だ。
でショッカーライダーは仮面ライダーになりすましてアンチショッカー同盟のコンピュータで偽テープを読ませた。
するとコンピュータは爆発した。
なぜテープを読ませたら爆発するのかが謎だが「ご都合主義は健在」だからだろう。
建物の外に避難した藤兵衛、滝、アンチショッカー同盟の皆さんは「仮面ライダー」が無事かどうかを案じたが

ショッカーライダー「私は無事だ。」
藤兵衛「おう。無事だったか。」

視聴者は皆、藤兵衛がこんなことを言うのかを不審に思うかもしれないが、これも無理はないと思う。
ショッカーライダーは本郷猛と同じ声を出せる(単にアフレコで藤岡弘、が声をあてているだけだが)し、ヘルメットの色は同じ。線も2本。パッと見は本郷猛が変身した仮面ライダーに見えてしまうのだ。ただしマフラーや手袋やブーツの色は黄色だし、目も黒い縁取りが入っている。映像で見ても肩越しの後ろ姿はマフラーしか差分がないのである。部分一致して誤認してしまうのも無理はない…かもしれないねえ。

ショッカーライダー「何も知らずにスイッチを入れていれば一人残らずやられていた。」
滝「ライダー、一体、本物のコンピューターテープはどこなんだ?」

と言うや否や、その質問に意外な人物が答えた。

一文字隼人「本物はこれだ。」

滝と藤兵衛が後ろを振り向くと、そこに帽子とサングラスをかけて革ジャンを着た男がやってきた。思わずアンチショッカー同盟の木暮が言った。

木暮「あなたは。」

一文字隼人はゆっくり近づいた後、サングラスを取りながらこう言った。サングラスは不要だったのではないのか?

隼人「南米のアンチショッカー同盟が俺を選んだ。」
滝「一文字!」
藤兵衛「隼人!」

思わぬ再会に喜ぶ滝と藤兵衛。ショッカーライダーは無言だ。

隼人「正月くらいは生まれ故郷で過ごしたいんでね。」

そう。放送日は1973年1月6日である。

滝「いやあ。びっくりさせるな。」

それはショッカーライダーも同様である。
動揺を抑えるため直立不動である。
隼人、滝、藤兵衛の3人はしばらく笑った。
その後、

隼人「木暮さん、これを。」
隼人は木暮にテープが入ったトランクを渡そうとした。

木暮「ありがとう。」

その時、ショッカーライダーが割って入った。
声は本郷猛と同じままである。

ショッカーライダー「それを俺が預かろう。」

だがショッカーライダーをジッと見た一文字隼人はこう指摘した。

隼人「ライダー、いつから、そのマフラーを?」

そう、一文字隼人はショッカーライダーの姿が仮面ライダーの姿と完全一致していないことに気づいていたのである。
それを聞いて滝も藤兵衛も気づいた。

滝「そういえば。」
藤兵衛「お前、まさか。」

だが時既に遅し(?)
ショッカーライダーはトランクを奪い、逃げた。

隼人「待て!」

待てと言われて待つようなショッカーライダーではない…と思ったら滝が飛びついた。
振り返ったショッカーライダー相手に身構える一文字隼人と滝和也。
ショッカーライダーは本来の声でこう言った。

ショッカーライダー「少しばかり気づくのが遅かったぞ。一文字、はるばるの運び役、ご苦労。ショッカーライダーが頂戴したぜ。」
隼人「ショッカーライダー、それをむざむざと渡すわけにはいかん!」

果たして本物のテープはどうなるか。そしてショッカー首領の正体は判明するのか。
それは映像で確認してほしい。
「ショッカーからゲルショッカーに変わってもご都合主義は健在。ライダー世界を律する法則は不変であった。」を体現する話なのであーる。
【Bing】Bingの検索画面のUIが欠陥すぎたけどAdblockPlusインストールしなおしたらなおった

**2023/02/18追記
[Adblock Plus](https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb?hl=ja)をアンインストールしたあとインストールしなおしたらなおりました。
[詳しくはコメントで](https://qiita.com/rana_kualu/items/6f0bdcf56949f119f4d7#comment-36bade1e9f4f780f39c3)。**

[Bing](https://www.bing.com/)のAI検索を試そうと思ったんですが、順番待ちになったんですよ。
半日過ぎても使える気配がありません。

調べてみたところ、どうやら『セット Microsoft の既定値 お使いの PC で』をすれば順番を飛ばせるらしい。
やったね。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/e70ff43c-fea2-9227-a5bf-4b120d52069f.png)

フィッシング詐欺ですら最近はもっと上等な日本語を使うぞ。
なんだよこれは。

さて、この規定値とやらが何かというと[Microsoft Bing Search エンジン](https://chrome.google.com/webstore/detail/microsoft-bing-search-for/hkecabaloghleaicfhefejdijblljpco)というChromeプラグインのようです。
これをインストールするとよいらしい。

インストールしたら検索エンジンが強制的にBingに変えられてしまいました。
なお、その状態でGoogleに行こうとしたらGoogleとBingの戦争が始まりました。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/57226660-8681-ecfa-f83b-df4a015b5aa0.png)

まあ検索エンジンくらいどちらでもいいか、と思ったんですがそれが大間違い。
Bing検索はとんでもない欠陥でした。

なにが欠陥って[これ](https://www.bing.com/search?q=%E4%B8%B8%E4%BB%81+%E3%81%9F%E3%81%91%E3%81%AE%E3%81%93%E3%83%A9%E3%83%BC%E6%B2%B9%E3%81%8D%E3%81%8F%E3%82%89%E3%81%92)。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/728835b5-d0d3-d14e-2ca5-3f9be575e346.png)

リンク先(というか広告枠か否か)によって挙動が異なるという最低最悪のUI。
広告枠はCtrl+クリックもShift+クリックも効かず、それどころか右クリックすら受け付けず、絶対に現在のタブでの遷移を強制させられるという非常に劣悪なUI。
それでも、全てのリンクにおいてそのような挙動であれば、悪いとはいえまだマシですが、なんと広告枠でないリンクは普通にCtrl+クリックもShift+クリックも右クリックも有効です。

同じ見た目で異なる動きはやめろって言ったよね？

誰か一人でも反対しなかったのかこのクソ挙動。
いくらAIがすごかろうが、さすがにこんな欠陥品は使ってられないのでGoogle検索に戻しました。


ちなみに謎の検索ワードは[これ](https://www.otsukemono-marujin.com/products/detail.php?product_id=36)です。
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/80471305-ede9-e949-8928-2d99fe5d357d.jpeg)

美味い。
フィクションなどから拾う情報処理用語 その9 部分一致 (仮面ライダー)

仮面ライダー 第72話「吸血モスキラス対二人ライダー」(脚本：鈴木生朗、監督：山田稔、技斗：岡田勝、(C) 石森プロ、東映)より

立花レーシングクラブの一行は前回の有馬温泉に引き続き関西をバスで旅行していた。
なお、本郷猛と滝和也は別行動である。
また一文字隼人は本郷と入れ替わるように南米へ旅立ってしまった。
重傷を負った藤岡弘、の傷が癒えた事を受けて毎日放送はダブルライダーを前面に押し出したかったのだが、佐々木剛が「元々は藤岡君の番組だったから」と固辞したのが理由である。
閑話休題。

バスは紀伊勝浦に着いた。
有馬温泉から移動したのだからかなりの長旅だと思うが川崎の生田付近在住の彼らから見れば誤差であろう。
今回の宿はそこである。
ナオキとミツルは昆虫採集に出かけた。
しかし、夕方になっても戻ってこない。
そこで藤兵衛達は宿の番頭とともに探しに行ったのだが、
熊野那智大社で事件は起きた。
と書いたが、よく考えたら徒歩で移動したのだから登場人物は皆、健脚だ。
藤兵衛、ユリ、ユリの友人ヨッコ、そしてこれまたユリの友人チョコは参道(だろう)で番頭の白骨死体を発見。

モスキラス「ブールヨイーン! 来たな。」

モスキラスが木の上から現れた。

立花藤兵衛「やっぱりショッカーの仕業か。」
モスキラス「貴様達も番頭のようにしてやる。」
立花藤兵衛「逃げろ!」

藤兵衛は逃げて熊野那智大社に着いた。
戦闘員まで現れて絶体絶命のピンチ。

とそこへ仮面ライダーがやってきた。
だがよく観ると何かが違う。
改造サイクロンを駆り、手袋とブーツは赤色。
体の線はぶっとい1本である。
有馬温泉で戦った仮面ライダーは
新サイクロンを駆り、手袋とブーツは銀色。
体の線は細い2本線であった。
別人である。
しかし、ショッカーの連中も藤兵衛達もそこまで注意して見なかった。
まさに非常事態だったからだ。
冷静な視聴者と違って、そこまで注意する余裕などなかった。
全体の様子が似ているので部分一致し、
本郷猛が変身した仮面ライダーだと誤認したのである。
もっともユリ達が本郷猛や一文字隼人が仮面ライダーと知っていたかどうかはこの時点では不明だが。
それは兎に角

モスキラス「来たな、ライダー。」
藤兵衛「よし。みんな、逃げろ。」

形勢逆転。仮面ライダーの加勢もあって色々あった後、モスキラスは退散した。

藤兵衛「ちきしょう、逃したか。ライダー。どこ行くんだ?」

仮面ライダーが鳥居の柱をぐるっとまわると

一文字隼人「お久しぶりです。」
藤兵衛「隼人! お前だったのか! どうしたんだ?」

突然の再会に驚きつつ喜ぶ藤兵衛。

隼人「ショッカー南米アマゾンの奥地で作った改造人間モスキラスを日本へ送り込んだという情報をキャッチして追ってきたんです。」

本当の理由は東映から(夏枯れ対策として)出てくれと佐々木剛が頼まれたからである。閑話休題。

藤兵衛「そうだったのかあ。いや、俺達は夏休みを利用して遊びに来たんだがな、まさかこんなところにショッカーが現れるなんてえ。」
隼人「奴らは太平洋を臨むこの紀伊半島の南端に基地を作ろうとしてるんです。」
藤兵衛「なるほど、そうか。」

とここまで聞いて藤兵衛は思い出した。

藤兵衛「あ、しまった。」
隼人「どうしたんです?」
藤兵衛「ナオキ達が危ない。」
隼人「え?」

一文字隼人は当然ナオキとミツルとは面識がない。
かくして一文字隼人も(自分からすすんで那智まで来たとはいえ)藤兵衛達の受難に巻き込まれることになってしまったのであった。
@StateでdidSetは使うな。 (SwiftUI)

## 内容
`@State`のpropertyの変更を検知するときは、didSetを使ってはいけない。[onChange(of:perform:)](https://developer.apple.com/documentation/swiftui/list/onchange(of:perform:))を使え。という話です。

## きっかけ
[swift-developers-japan](https://swiftdevelopers.jp/)で
`@State`にdidSetを書いちゃダメという記事を見たが自分で実際に書いたらdidSetが呼ばれた。本当にダメなのか？
という趣旨の質問があり、あまり理解できていなかったので調べた。

## なぜ`@State`でdidSetを使ってはいけないか
`@State`のdidSetは呼ばれないことがある。
いつ呼ばれていつ呼ばれないかというと、
```swift
@State var num: Int
@Binding var binding: Int
_binding = $num
```
で定義されているとして
```swift
num = 10 // didSet呼ばれる
_num.wrappedValue = 15 //　呼ばれない
binding = 2 //　呼ばれない
```
という感じになります。

~~これは[@StateのwrapperValue](https://developer.apple.com/documentation/swiftui/state/wrappedvalue)がnonmutatingでwrappedValueを更新しても`@State`の値自体は変更されないためのようです。~~
mutaitngのsetterを持つproperty wrapperを自作してwrappedValueの値を直接更新したら、同様にdidSetは呼ばれませんでした。

これは、property wrapperを使っているからで、wrappedValueの値を変更してもそのproperty wrapperを適用しているproperty自体は変更されないためのようです。


## ではどうする？
[onChange(of:perform:)](https://developer.apple.com/documentation/swiftui/list/onchange(of:perform:))を使う。
試してないですが、iOS13では.onReceive(Just(selection))で同様のことができるみたいです[link](https://stackoverflow.com/questions/56550713/how-can-i-run-an-action-when-a-state-changes)
フィクションなどから拾う情報処理用語 その8 なりすまし (仮面ライダー)

仮面ライダー 第26話「恐怖のあり地獄」(脚本：伊上勝、監督：折田至、技斗：高橋一俊、(C) 石森プロ、東映)より

ここは立花レーシング倶楽部。
テレビのニュースであちこちの道路で謎の陥没事故が起きていることを報じていた。
それを五郎、立花藤兵衛、一文字隼人、そして滝和也の4名が観ていた。

立花藤兵衛「うーん。だいぶ臭うなあ。」
一文字隼人「でしょ、親父さん。」
藤兵衛「うん。」
滝「素人の調査じゃショッカーの尻尾は掴めっこねえ。」

振り返った五郎がこう言った。

五郎「わかった。そこでお二人の活躍ってわけだねえ。」

というわけで一文字隼人と滝和也…だけではなく、なんと空手初段(というだけ)のユリの3人がオートバイを走らせていた。巧みなカメラワークで誤魔化しているが、この中でオートバイの免許を持っていたのは(当時)千葉治郎のみかもしれない。それが証拠に滝和也のみがノーヘルでオートバイを運転し、滝のみオートバイをちゃんと運転する場面が映っている。それは兎に角、滝は多摩川の堤防の上に着いた。

滝「やれやれ。この辺りは何にも起こりそうもねえや。一休みするか。」

滝はオートバイから降りて伸びをしたが、それを隠しカメラが撮っているのに気づいていなかった。
そこへ一文字隼人とユリが通りかかり、オートバイを「停めた」のである。ただ3人とも上半身しか映っていないので隼人とユリが実際にオートバイを運転していたかどうかは不明である。閑話休題。

滝「おう。そっちはどうだ。」
隼人「いや、ダメだ。」

先ほどの隠しカメラがまた映った。

隼人「じゃ、ドライブインでも行くか。」
滝「おう。」

3台のオートバイは発進したが素顔がわかるのは滝のみである。
オートバイが立ち去ったのを観て

赤戦闘員「イー!」

先ほどの隠しカメラを持って立ち上がった。

さてドライブインでは

ユリ「あー、うー、うーん。つまんないなあ。あたし折角スリルを味わえると思ってドッキリコンだったのにー。」

何しに来たのだろうか、この人は。呆れて一文字隼人がこう返した。

隼人「何がドッキリコンだ。何もないのが一番さ。さ、戻ろうか。」

なおもユリは不満そうだったが3人とも立ち上がった。

滝「(お金を)ここに置いとくよ。」

ウエイターがやってきて礼を述べたのだが、彼の目的はそれだけではなかった。
ウエイターは一文字隼人と滝和也がオートバイを発進させるのをしっかり観た。
佐々木剛はオートバイを運転できるようになったようである。
それに対してユリはオートバイを発進させるのに手こずっているようである。
ウエイターは隠しマイクを回収した。

さてウエイターは中に入った。すると部屋の中にはゾル大佐と(おそらく)先ほどの赤戦闘員がいた。

ウエイター「ゾル大佐。滝和也の声をテープで録音しました。」

滝の写真を手にしたゾル大佐は言う。

ゾル大佐「滝の写真。そして声。この2つが揃えば完璧だ。敵の中に味方を潜入させる。そのやり方で俺は中近東におけるショッカーの邪魔をことごとく破ってきた。この俺が日本に来た以上、必ずショッカーの敵仮面ライダーを始末。」

ただ滝が写っているのは両腕から上の部分だけ。そして滝の声は

滝の声「ここに置いとくよー。」

だけである。それだけでゾル大佐は滝和也そっくりに変装してしまった。アルセーヌ・ルパンや怪人二十面相顔負けの変装術である。余談だがゾル大佐を演じる宮口二郎は天知茂の弟子。天知茂が土曜ワイド劇場の美女シリーズで変装術を披露するのはもう少し後の話である。閑話休題。

さて近くの道路が通行禁止になっていた。
そこを「滝和也」の乗るオートバイが無視して突破。
当然、その場にいた警官がパトカーと白バイで追いかけた。
「滝和也」はいつもの造成地までオートバイを走らせて止まった。
白バイとパトカーが止まり、「滝」を捕まえようとしたが、「滝」はそのままオートバイで警官2名をはねてしまった。残りの警官2名とも「滝」は格闘。しこたま殴って倒してしまった。
「滝和也」は「俺の顔をよーく観ておけ。」と顔を見せつけた。そして逃げていく「滝」を見て

警官「ちくしょう。」

と悔しがるのであった。

一方、そんなことが起きたとは知らない一文字、滝、ユリの3人。雷が鳴ったので停まった。

滝「雲行きが怪しくなったな。」
隼人「雲行きばかりじゃなさそうだぜ。」

すると

ユリ「雨が降ってきたのかと思ったら、砂よ。」
滝「ホントだ。」

そこで一文字隼人はこう言った。

隼人「滝、引き返して、向かってくる車をストップさせるんだ。」
滝「よし。」

すると

ユリ「交通整理ね。あたし一度でいいからやって見たかったんだ。かっこいいもん。」

一文字隼人の言葉が傑作である。

隼人「この呑気なお嬢さんをお連れして早く戻れ。」

それはないだろうと滝は聞いた。

滝「隼人、お前は?」
隼人「何が起きるか、この目で確かめてくる。」

こうして隼人は滝とユリと別れた。
さて滝とユリは交通整理をしていた。そこへやってきたのは先ほどのパトカーだ。

警官「君、こんなところで勝手に何をしている?」

やたらと高圧的な警官である。

ユリ「この先は危険よ。おまわりさんだって通行禁止よ。ねえ、滝さん。」
滝「この2キロ先で道路の陥没があったんです。」

滝、なぜそんなことがわかるのだ?
まあ紙面の関係で端おったが仮面ライダーが確かに地獄サンダーと戦闘をしていたのでウソはついていない、結果的には。
だが顔が傷だらけの警官は滝を見て気がついた。

警官「き、貴様!」
滝「俺…ですか!?」
別の警官「殺人および公務執行妨害で逮捕する。」

なんと逮捕令状なしで滝を連れ出そうとしていた。

ユリ「あー。」
滝「なんだよ。何すんだよ。」
警官「白々しい。とぼけてもダメだ。」
ユリ「何したって言うのよ。」
別の警官「先で我々に暴行した犯人だ。」
滝「何かの間違いだ。俺は関係ない。」
警官「黙れ。取り調べればわかる。署に連行する。」
滝「本気で俺を捕まえる気か?」
警官「抵抗するのか。」
滝「何かの間違いだ。よし。調べればわかることだ。行きましょう。」
ユリ「滝さん。」
滝「隼人に伝えてくれよな。へっちゃらだよ。」
警官「来るんだ。」

滝を乗せてパトカーは立ち去った。

ユリ「あーん、待って。あーん。」

果たして滝の運命やいかに。続きは映像で。
Micropythonデバイスにパッケージをインストール

# Macからパッケージをインストールする。
Mac上のPythonにパッケージをインストールする場合はpipを利用するが、usbデバイスのmicropythonにパッケージをインストールする場合、mipを利用する。
1. Macのpipデータベースをアップデート
    python3 -m pip install --upgrade pip
2. リモートのデバイスをコントロールするためにまずmpremoteをインストール
    python3 -m pip install mpremote
3. リモートデバイスにパッケージをインストール
    mpremote connect デバイスファイル mip install パッケージ名
        デバイスファイルはmicropythonと接続に使用するデバイス
    mpremote connect /dev/cu.usbport mip install ssd1306

4. 確認
    mpremote connect デバイスファイル  ls /lib
# Thonnyのコンソールでパッケージのインストール
esp32のようなネットワークインターフェースをもったデバイスはコンソールにアクセスできれば、パッケージをインストールできる。

* micropythonデバイスにmpremoteでmipをインストール
    mpremote connect /dev/cu.xx mip install mip
* Thonnyのコンソール上では、モジュールをインターネットに繋いだ上で
    import mip
    * micropython-libからインストールする場合
        mip.install("パッケージ名")
    * インターネット上のファイルは
        mip.install("URL")




# パッケージ
micropython gitリポジトリの
* /lib/micropython-lib/micropython
* /lib/micropython-lib/python-ecosys
IntelliJショートカットメモ


| アクション | コマンド |
|:-|:-|
|行削除|cmd + delete|
|ファイル内置き換え|cmd + R|
|ファイル内検索|cmd + F|
|現在行の複製|cmd + D|
|オートフォーマット実行|opt + cmd + L|
|行移動|opt + shift + ↑／↓|
|タブ移動、切り替え、変更|shit + cmd + ]/[|
githubでIssuesを作成し、ブランチを作成する方法

## はじめに
今回チームで開発をしていく中で、githubにあるIssuesを使ってタスクを可視化させている
ブランチを作成し、紐付けることがかんたんにできるのでそれをやっていく

## Issuesを作成する
### githubの画面上にある`Issues`を押し、Issuesを作成していく
![スクリーンショット 2023-02-15 18.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/c3f6869c-f7d5-3aff-8dc9-0e502b440516.png)


### 画面右側にある`New Issues`を押し、実際に作成する
![スクリーンショット 2023-02-15 18.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/14a6aa21-4b64-df5f-5f60-9ae755b00287.png)

### 入力欄が現れるので必要事項を書き入れていく
![スクリーンショット 2023-02-15 18.24.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/afb6a573-72f6-5993-4f75-f4bbb88529c2.png)

この際、わかりやすいようにバックエンドなら[BE]やフロントなら[FE]など書いてあげると良さそう。

### ブランチ作成は右側の`Development`から作成する
必要事項を入力したら、右側にあるDevelopmentからブランチを作成してあげる。
ブランチに関しては、`Issue番号-わかりやすいブランチ名`というふうにしてあげると良さそう。
例) `28-be-webtest-userapi`

### ローカルリポジトリにもブランチを作成する
Issues作成後ブランチ作成まで完了すると、モーダルが出現し、ローカルリポジトリに打つコマンドが出てくる。
それをコピーし、ローカルリポジトリにもブランチを作成してあげる。
```terminal
git fetch origin
git checkout 28-be-webtest-userapi
```

以上
Nuxt3 の Compotision API ( script setup ) で config を使う書き方

# nuxt.config.ts

```js
export default defineNuxtConfig({
  runtimeConfig: {
    public: {
      foo: "bar"
    }
  }});

```

# Compotision APIでの書き方

```js
const config = useRuntimeConfig()
const foo = config.foo
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Windows版XAMPP Control Panelの終了時にxampp-controll.iniのアクセスが拒否されるエラーの回避方法

# 概要

Windows 11にXAMPP(Apr 6th 2021)をインストール後、XAMPP Control Panelを閉じた時に次のようなメッセージが表示される状況を回避する方法を書きます。

:::note alert
Error: Cannot create file "C:\xampp\xampp-controll.ini". アクセスが拒否されました。
:::

![スクリーンショット 2023-02-15 180011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1318796/98ea5678-dd30-fec5-6351-2ab34da3efff.png)

## 対象環境
- XAMPP(Apr 6th 2021)
- Windows 11 Pro(22H2)

# 対処方法
XAMPPのインストーラからXAMPP Control Panelを初回起動すると、xampp-controll.iniが管理者権限で作成されてしまい、その後、標準ユーザでの書き込み権限がなくなってしまうことが原因だと思います。

「xampp-controll.ini」のEveryoneのアクセス許可をフルコントロールに変更します。

1: エクスプローラでローカルディスク(C:)の「xampp」フォルダにある「xampp-controll.ini」のプロパティを開きます。

![スクリーンショット 2023-02-15 180230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1318796/f14a7f63-0683-bf99-bad1-de93b6b4e727.png)

2: 「xampp-controll.iniのプロパティ」画面で「セキュリティ」タブを開き、画面中央の[編集]ボタンをクリックする

![スクリーンショット 2023-02-15 180117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1318796/23c38af7-af18-f066-0c99-7760df17b13c.png)

3: グループリストから「Everyone」を選択し、「アクセス許可」欄の「フルコントロール」項目で「許可」をチェックします。その後、[OK]をクリックします。
(おそらく「変更」だけでも良いと思います)

![スクリーンショット 2023-02-15 180142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1318796/e43f4dff-5863-ecf6-5d2c-cb98172aa61c.png)

4: アクセス許可を設定後は、[Quit]ボタンをクリックしてもエラーメッセージは表示されなくなります。
【TechCamp】受講を終えてからの感想

# はじめに
- 本記事は、個人の感想や定量的でない内容が含まれたりします。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。

# この記事は誰向けの記事か？
- プログラミングスクールの受講を考えている人
- TechCampを受講している人
- TechCampを受講し終えた人

# 私自身について
私は30歳の元ITエンジニア（2023年2月時点）です。以前の職場では、製造業向けのアプリケーション開発現場で約2年、製造メーカーの社内SEとして約2年勤めていました。そのため未経験というわけではなく、経験者という立ち位置で参加させていただきました。元々は仕事と並行しつつ、Webアプリケーションの開発経験を積めるスクールに通いたいなと考えていたのですが、脳の疾患に罹患し、仕事をリタイアしてしまいました。完治するかは未定ですが、今後もITエンジニアとして仕事をしていきたい、という思いもあり、TechCampへ参加することにしました。

# 受講プラン
私が受講したプランの情報は以下のとおりです。
- 短期集中プラン（10週間）
- 2022年9月〜11月
- 134期 Bチーム ９名（受講開始直後は12名いたものの、途中で3名脱落しました）
- 約66万円の支払いに対して、実質33万円で受講（厚生労働省指定講座  専門実践教育訓練給付制度の対象）
- macbook air 16万円
- 実質的に約50万円近くかかっています ※時期やキャンペーン等により、費用は変わります。

# プログラミングスクールとしてなぜTechCampを選んだか
プログラミングスクールとしては色々なスクールがありますが、それぞれのスクールでは、アドバイザーによる事前面談が用意されているので、話を聞いてみて、自分の事情に応じて決定すれば良いと思います。なお私は以下の観点からこのTechCampを選びました。
- Webアプリケーションの開発を経験したかった
- オンライン形式で受講が可能かどうか
- 未経験の方たちと関わり合うことができるかどうか

1つ目として、Webアプリケーションの開発を一度経験したかったことが選定の1つでした。前職では、ITエンジニアとして仕事をしていたものの、直接Webアプリケーションを開発した経験がありませんでした。昨今は、WindowsアプリケーションよりもWebアプリケーションの需要が高まっていたので、この経験は必須だと考えていました。また独学でHTML、CSS、JavaScriptを勉強していたものの、CSSがよくわかりませんでした。このCSS（デザイン）を理解するために、参加したと言っても過言ではないです。

2つ目として、オンライン形式で受講が可能かどうかが選定の1つでした。私自身は療養のために、地方にある実家で生活するしかなかったので、必然的にオンラインで受講できるスクールを選ぶ必要がありました。

3つ目として、人と関わり合うことができるかどうか、ということを選定の1つにしていました。離職して、1年以上近く経っていたので、あまり会話ができませんでした。まずは、話し合いができる場が設けられているスクールがいいと考えていました。

上記、3つの条件を選定した結果、私はTechCampを選ぶことになりました。

# 受講後の感想
今回、TechCampへ参加したことは、結果としてよかったと考えています。そう考えているのは、次のとおりです。
- Webアプリケーションの開発実務の経験を積むことができ、自分のできることの幅を広げることができた

元々、私はITエンジニアとして仕事をしていた経験はありますが、Webアプリケーションを自ら作り、世界へ公開するための技術は持ち合わせていませんでした。より具体的には、スタンドアロン型のシステムの開発実務の経験はあるものの、クラウドなどを用いた実務経験はありませんでした。（社内SEとして仕事をしていた時は、クラウド関連に関わったものの、発注者という立場で開発を発注していたこともあり、実務経験はありませんでした）そのため、Webアプリケーションはどのような考えのもとで、開発されていて、どのように実装・運用されているのかということは知りませんでした。
しかし今回、TechCampへ参加したことで、開発の実務経験を積むことができたことは大きな経験だったと考えています。TechCampを受講していなければ、自分のWebアプリケーションをサービスインに向けて、準備することはなかったでしょう。

# 経験者から見たTechCampはどうだったか？
私のように多少、仕事で経験がある者がTechCampを受講した場合、スキル向上に繋がると考えています。一方で、未経験者がTechCampを受講した場合は、スキルの向上に繋がるかと問われると、必ずしもそうとは言い切れない、と思えます。あくまで未経験者にとって、このTechCampの受講はITエンジニアになるためのきっかけと、とらえておく方が良いと思います。

# 受講したことで手に入れたもの
- HTML CSS JavaScriptの概念理解と開発スキル
ただしRails上で開発した経験になるので、Railsではない環境で開発するのは、逆に苦難に感じる。
- Rubyのプログラミング開発スキル
未経験ではないので、すんなりとスキルを手にいれることができたのではないかと思う。ただしハッシュという概念は初めてだったので、これからも要勉強です。
- MVCの概念
応用情報技術者試験を挑んだ際も、MVCに関する問題がありました。しかし今回受講したことで、テキストで勉強しただけでは、全然理解できていなかったことに気づきました。今ではほぼ完璧にその概念を掴み取ることができたのは、非常に大きいです。
- AWSを勉強するためのきっかけ
AWSに関するカリキュラムはほとんどありませんでした。しかしそのきっかけを得ることができたと考えています。自分のオリジナルアプリケーションを公開するためのインフラツールとして利用させていただき、今も勉強させていただいています。
- 仲間
これまで関わってきたことのなかった業界で仕事をしていた人と関わることができ、さまざまな刺激を受けました。現在もみんな、就職活動で苦戦しています汗

# まとめ
- どのプログラミングスクールを受講するかどうかは、この記事を読んでいるあなたの事情に合わせて、決めるとよい
- 経験者から見たTechCampは、自分のできることの幅を広げることのできる機会を得られる（おもにRuby on Railsに限定）
- 未経験者から見たTechCampは、ITエンジニアのデビューとしてのきっかけとしての機会を得られる
- 基本的にRuby on Railsを通じたWebアプリケーションの開発スキルが手に入る
UbuntuでDualshock3コントローラを使う


# はじめに
askubuntuに投稿された[この記事](https://askubuntu.com/questions/913599/how-to-connect-dualshock-3-controller-ps3-sixaxis-gamepad-on-ubuntu-16-04)を日本語で要約したものになります。

# ソースコードのインストール
```
sudo apt-get install dialog build-essential pyqt4-dev-tools libusb-dev libbluetooth-dev python-dbus -y
wget https://github.com/RetroPie/sixad/archive/master.zip -O sixad-master.zip
unzip sixad-master.zip
cd sixad-master
make
sudo make install
```

# 設定

１. コントローラをUSBケーブルでPCに接続

２. 初期ペアリングのためのコマンドを実行
```
sudo sixpair
```

３. ペアリングに成功すると以下のように表示される
```
Current Bluetooth master: XX:XX:XX:XX:XX:XX
Setting master bd_addr to XX:XX:XX:XX:XX:XX
```
このXX:XX:XX:XX:XX:XXは各BluetoothデバイスのMACアドレスである。

４. PCからコントローラを外して以下のコマンドを実行
```
sudo sixad -s
```

５. PSボタンを押して接続

# 2回目以降
2回目以降の接続は４.と５.を行えばよい
どうしても消せないThumbs.dbを削除する方法

教えていただいたのでメモ代わりに。

Windowsで作業していると
なぜかどうやっても削除することのできない
**Thumbs.db**
が出現することがある。
まったくもって勘弁していただきたいものだ。

そんな頑固な**Thumbs.db**を削除する方法を伝授してもらったので
共有させていただく。

用意するのは notepad.exe これである。
各種エディタでも良い。
手順は次の通りだ。

1. **Thumbs.db**をメモ帳で開く
2. 書かれている内容を全て削除する
3. 上書き保存し、メモ帳を終了する。 

これだけだ。

ショートカットキーで表すと、
Ctrl+A、Ctrl+X、Ctrl+S、Ctrl+W
これだけである。

これを行えば、頑固な**Thumbs.db**が見事削除できるのだ。
是非やってみてほしい。
apt-keyが非推奨になったけどAnsibleではどう書けばいいのか

# `apt-key`が非推奨になったけどAnsibleではどう書けばいいのか

## TL;DR
- `get_url`でgpg keyを適切な場所に置く
    - `/etc/apt/trusted.gpg.d`は望ましくない
    - 適切な場所として`/etc/apt/keyrings`や`/usr/local/share/keyrings`が考えられる
        - `apt_repository`のrepoで`[signed-by=<パス>]`を指定する
- テキスト形式の鍵は`*.asc`、バイナリ形式の鍵は`*.gpg`という名前で保存する

## 環境
- Debian 11

## 背景
`apt-key`コマンドは非推奨であり、Debian 11とUbuntu 22.04の次のバージョンから消えるらしいです。

[`apt-key`のmanpages](https://manpages.debian.org/unstable/apt/apt-key.8.en.html)より
> Use of apt-key is deprecated, except for the use of apt-key del in maintainer scripts to remove existing keys from the main keyring. If such usage of apt-key is desired the additional installation of the GNU Privacy Guard suite (packaged in gnupg) is required.
> 
> apt-key(8) will last be available in Debian 11 and Ubuntu 22.04.


個人的に運用しているAnsible playbookにてdockerとkubernetesのインストールを`apt_key`モジュールで行っていましたが、
これを使わない方法に改めることにしました。

調べてみると[`/etc/apt/trusted.gpg.d`に鍵を置く例](https://www.jeffgeerling.com/blog/2022/aptkey-deprecated-debianubuntu-how-fix-ansible)が見つかりましたが、
これは[`apt-key add`と同じように他のリポジトリでも有効になってしまうので望ましくありません](https://blog.n-z.jp/blog/2022-07-04-apt-key-signed-by.html)。
そこで、別の場所に鍵を置き、sources内の`signed-by`で鍵を指定します。

鍵の置き場所として、[Docker Engineの公式インストール手順](https://docs.docker.com/engine/install/debian/)、[kubeadmの公式インストール手順](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl)ではいずれも`/etc/apt/keyrings`を使っているので、ここを使用することにします。


## テキスト形式の鍵
DockerのGPG keyはテキスト形式で配布されていました。
公式手順では`gpg --dearmor -o /etc/apt/keyrings/docker.gpg`によって、バイナリ形式に変換してから格納していますが、
`.asc` (ascii armor)という拡張子で保存すればそのまま使えます。

従って、Ansibleでは次のようにします。
```yaml
- name: Add docker gpg key
  get_url:
    url: https://download.docker.com/linux/debian/gpg
    dest: /etc/apt/keyrings/docker.asc
    mode: '0644'
    force: true

- name: Add docker apt repository
  apt_repository:
    repo: deb [arch={{ deb_architecture[ansible_architecture] }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/{{ ansible_system | lower }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable
    state: present
```
architectureを指定するために、次のような変数を用意し、playbookから参照できるようにします。
```yaml
deb_architecture: {
  "armv6l": "armhf",
  "armv7l": "armhf",
  "aarch64": "arm64",
  "x86_64": "amd64",
  "i386": "i386"
}
```

- architectureの指定は[こちら](https://stackoverflow.com/questions/58169348/how-is-the-architecture-fact-called-in-ansible)を参考にしました

## バイナリ形式の鍵
kubernetesのGPG keyはバイナリ形式でした。
従って、`*.gpg`という拡張子で保存します。

```yaml
- name: Add kubernetes gpg key
  get_url:
    url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
    dest: /etc/apt/keyrings/kubernetes-archive-keyring.gpg
    mode: '0644'
    force: true

- name: Add kubernetes apt repository
  apt_repository:
    repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main"
    state: present
```

## その他
`apt-key`には関係ないですが、失効した鍵があると`apt update`時に失敗するので、鍵の更新を`apt update`が走る前に行っておく必要があります。
`apt`モジュールで`update_cache: true`になっている場合や、`apt_repository`モジュールのデフォルト動作で`apt update`がかかるのを見落としがちなので、気をつけます。
AWS CLIを使ってAWSを操作するときに使う認証情報【プロファイル登録】

AWS CLIの初学者用の記事です。
<!-- ================================================= -->
【前提】
=
<!-- ================================================= -->
```
CLIインストール済み。
IAMを作成済み。
MACを使用中。
```
<!-- ================================================= -->
プロファイル登録
=
<!-- ================================================= -->
①ターミナルを起動

②「aws configure」と入力し、Enter

③「AWS Access Key ID」と出るので、IAMユーザーのアクセスキーをコピペし、Enter

④「AWS Secret Access Key」と出るので、シークレットアクセスキーをコピペし、Enter

⑤「Default region name [ap-northeast-1]: 」と出るので「ap-northeast-1」を指定し入力
　※使用するリージョンを入力

⑥「Default output format [json]: 」と出るので、「json」を指定し入力
　※使用するフォーマットを入力

プロファイルの登録完了！

<!-- ================================================= -->
登録の確認作業
=
<!-- ================================================= -->

①Finderを開く

②command + shift + .　を押してドットファイルを表示し、「.aws」を探して開く

③「credentials」ファイルがあるので開くと、登録したプロファイルを確認できる。
※登録する際「aws configure」だけで登録すると[default]で登録される。
　追加登録する際は、「aws configure --profile xxxxx」のように「xxxxx」の部分に指定したい名前を登録することができる。
[Android] [Kotlin] TabLayoutと（Horizontal）RecyclerViewを仲良く共存させる方法

![06b26b96-6dd5-4cbd-af52-9db9c5550397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/e3383f52-5f4d-1124-2144-ddde9d688937.png)

### 実現したこと
TabLayoutでの画面切り替えとHorizontalなRecyclerViewでのリストスクロールの両方を実装したいけど、
スクロールしようとすると画面が切り替わったりして、うまくスクロールできない！仲良くして！！
ってなったので、それを解決するべく方法を見つけましたので、共有します。

レイアウトも見たい方は、
https://qiita.com/shinmai333/items/8bdd5a72c0f86348bd02
こちらから見れます。
全く一緒のレイアウトで、Fragmentの中身にHorizontalなRecyclerViewを乗っけただけです。
ソースコードやレイアウトはまあまあ適当に作ってありますので、ご了承くださいませ。


### ソースコード
```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val viewPager : ViewPager2 = findViewById(R.id.viewPager)
        val tabLayout : TabLayout = findViewById(R.id.tablayout)

        val adapter = ViewPagerAdapter(supportFragmentManager, lifecycle)
        viewPager.adapter = adapter
        TabLayoutMediator(tabLayout, viewPager) { tab, position ->
            val relativeLayout = LayoutInflater.from(this)
                .inflate(R.layout.tab_item, tabLayout, false) as RelativeLayout
            val tabTextView : TextView = relativeLayout.findViewById(R.id.tab_title)
            tabTextView.text = adapter.getTabTitle(position)
            tab.customView = relativeLayout
        }.attach()
    }
}
```

```SampleFragment.kt
class SampleFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_sample, container, false)
        setView(view)
        return view
    }

    private fun setView(view: View) {
        val parent : MainActivity = activity as MainActivity
        val rv : RecyclerView = view.findViewById(R.id.rv)
        val adapter = RecyclerAdapterList()
        rv.layoutManager = GridLayoutManager(parent, 2, RecyclerView.HORIZONTAL,false)
        rv.adapter = adapter

        // これを書くことでTabLayoutとRecyclerViewが仲良しになります
        rv.addOnItemTouchListener(object : OnItemTouchListener {
            override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
                val action = e.action
                when (action) {
                    MotionEvent.ACTION_MOVE -> rv.parent.requestDisallowInterceptTouchEvent(true)
                }
            return false
            }
            override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
            override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
        })
    }
}
```

最近よくRecyclerViewを扱っているのですが、たくさん問題点が出てきて苦戦してます。
もし役に立てそうな実装を見つけたら、また投稿したいと思います。
ありがとうございました。
[CVAT]大量の画像(数千〜数万枚)をアタッチする

## 概要

- クラウドストレージ(Amazon S3)からアタッチするのが良い
- manifest.jsonlの生成までの速度は、おそらくディスクI/Oに依存している

### CVATとは？

- [CVAT](https://github.com/opencv/cvat)とは、intel謹製の画像・動画アノテーションツールです。CVATの説明についてはこの記事では割愛します。

### たくさんの画像をアノテーションしたい

- 数万枚（~5MBを5万枚とか）の画像をアノテーションしたい、という課題がありました。
- Web上に上がっている記事を見る限り、[これ](https://dev.classmethod.jp/articles/annotate_objects_in_image_with_cvat/)とか[これ](https://zenn.dev/yag_ays/articles/8f7b489e9e3e43)とかCVATそのものの紹介記事はあるのですが、GitHubの公式のissueを見ても、「えと、当方は数万枚とか一気に上げないといけないんですけど・・・」と良い記事が見当たらず、試行錯誤することになりました。ということで、この記事を書いて情報を共有する次第です。

### 環境

- CVATサーバ: CVATはEC2のインスタンスタイプr6i.2xlargeで運用。versionは2.2.0です。
- 前準備サーバ: 別途、manifest.jsonlを生成するためにEC2のインスタンスタイプc5.2xlargeを使用し、ここにcvatをcloneしてmanifestファイルを生成しています。
- 画像データの流れは、
    - ローカルHDDからAmazon　S3に画像数万枚の入ったフォルダをupload
    - 前準備サーバでフォルダを作り、[goofys](https://github.com/kahing/goofys)でS3バケットをアタッチ。manifestファイルをS3バケット内で直接作成。
    - あとは、CVATのGUIからS3をアタッチして、完了！

### ボトルネック
- この作業でのボトルネックは、ローカル→S3へのアップロードでした。AWS CLIの設定値もいじったのですが、大して効果がありませんでした。

```shell
ssaitoh@ubuntu123:~$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
s3 =
    max_queue_size = 10000
    max_concurrent_requests = 100
    multipart_chunksize = 16MB
    multipart_threshold = 64MB
    max_bandwidth = 100MB/s
```

- manifest.jsonl自体は、時間がかかるとはいえ、EC2にS3をアタッチして7~8it/sは出ました。また、複数スレッドで別々のフォルダのmanifestファイルを作っても、特に速度低下はありませんでした。
- ローカル(MacBookPro 2019, 2.6 GHz 6コアIntel Core i7, RAM32GB)のSSD内に画像ファイルを置いてmanifest.jsonlを生成すると、10~11it/s程度だったので、こちらもディスクI/Oが原因なのかもしれません。
- 一旦S3に画像ファイルとmanifestファイルを上げてしまえば、CVATのGUI上でアタッチするのはあまり時間はかかりませんでした。3万枚程度でも、1〜2分で終わり、エラーが出ることはありませんでした。

### なぜローカルフォルダから直接CVATに上げないの？

- 数枚〜数百枚程度ならおそらくGUI経由で行けるのですが、数千枚〜になるとCVATが500エラーや413エラーを返してきますし、その上一からやり直しになります。数千枚〜のオーダーで画像を上げる際は、Amazon S3経由をオススメします。

### なぜローカルフォルダでmanifestファイルを作らないの？

- ファイルが合計で1TB以上もあり、とても自分のマシンの中に置いておきたくなかったからです。ファイルの実体は会社のサーバールームのファイルサーバにあり、私はリモートワークで100km以上離れたところにいるため、自分のマシンに持ってくるとVPN回線を圧迫します。
- そのため、サーバールーム内のLinuxマシンでS3にアップし、EC2でmanifestファイルを生成しました。
- なお、サーバールーム内のLinuxマシンでmanifestファイルを作ってもよかったのですが、こちらはファイルアップロードに専念してもらう、ということで役割分担をしました。

おわり
ROSでLRF（UTM-30LX・UTM-30LX-EW）を使う

# ROSパッケージのインストール
``` terminal
 $ sudo apt install ros-noetic-urg-node
```
「noetic」の部分は使用してるROSのディストリビューションによって適宜書き換えてください。

# 接続
## UTM-30LX（USBタイプ）

LRFをPCのUSBコネクタに接続
LRFの給電用コネクタにDC12V（±10%）を供給
LRFの接続されているポートに権限（今回は/dev/ttyACM0）を付与
``` terminal
sudo chmod a+rw /dev/ttyACM0
``` 

## UTM-30LX-EW（イーサネットタイプ）
LRFをUSBとLANの変換コネクタを介してPCに接続
LRFの給電用コネクタにDC12V（±10%）を供給

### ネットワークの設定
　UTM-30LX-EWはデフォルトでは「192.168.0.10:100940」でデータの送受信を行う．ただし，これはプライベートIPアドレスの中でもwifi接続時によく割り当てられるIPでもある． wifi接続している状態で，URGに「192.168.0.10」が割り当てられると，URGの接続先がルータでもない限りはIPが干渉して上手くネットに接続できなくなることがある．そのため，他のプライベートIPである 「172.16.x.x」 をURGに割り当てることでネット接続を両立することができる．

以上を前提とすると有線設定のIPv4の設定は以下のようにする．
IPアドレス：	172.16.0.x　（xは10以外の数値）
サブネットマスク：255.255.255.0
ゲートウェイ：172.16.0.1
なお，以下の画像では172.16.0.15としている．
<p style="text-align:center;">
<img width="600" src="https://img.esa.io/uploads/production/attachments/12898/2020/11/14/32945/ac71b8c1-b703-4a1e-9b15-d537ad4bf0cf.png"><br>
</p>

## 動作確認
``` terminal1
 $ roscore
```

- USBタイプのとき
``` terminal2 (UTM30-LX)
 $ rosrun urg_node urg_node _serial_port:="/dev/ttyACM0"
```

- イーサネットタイプのとき
``` terminal2 (UTM30-LX-EW)
 $ rosrun urg_node urg_node _ip_address:="172.16.0.10
```

``` terminal3
 $ rviz
```
rvizにて「Fixed Frame」を「laser」にして「/scan」トピックを読む
それっぽい点群が出てればOK
<p style="text-align:center;">
<img width="600" src="https://img.esa.io/uploads/production/attachments/12898/2020/11/14/32945/047f2ae5-9d53-4428-9de2-5a9f350687a5.png"><br>
</p>

# 参考
https://www.youtube.com/watch?v=3R62bqTjrgQ
https://daily-tech.hatenablog.com/entry/2018/08/18/164620
https://blog.browniealice.net/post/how_to_use_urg/
Railsで新規アプリケーションを作成

## はじめに
アプリケーションを新規作成する時の最初の手順を備忘録として記録しておきます。
## ターミナルで新規作成
**【ターミナル】**
```terminal
% rails _(railsのバージョン)_ new (アプリケーション名) -d mysql
```
## 文字コードの変更
必要があれば、文字コードを変更しておきます。

**【config/database.yml】**
```diff_ruby
default: &default
    (省略)
- encoding: utf8mb4
+ encoding: utf8
    (省略)
```
※文字コードを変更するのは何故か？
utf8：1〜3バイトまで対応
utf8mb4：1〜4バイトまで対応
文字化けを起こす可能性があるので、変更する必要がある場合が存在します。

## データベースの作成
ターミナルにて、データベースの作成を行います。

**【ターミナル】**
```terminal
% rails db:create
```

## ローカルホストで挙動確認
最後に、ローカルホストで、新規作成したアプリケーションが正しく作成されたかどうか確認します。
```terminal
% rails s
```
ブラウザにて「localhost:3000/」と入力します。
以下のような画像が表示されていれば、成功です。

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

## 最後に
初の記事投稿ということもあり、ここまで読んで頂きありがとうございます。
誤字・脱字、間違い等がございましたら、コメント宜しくお願い致します。
chatGPTの使える場面

文脈を考慮してくれるグーグルという点でかなり革命的なGPT.

あいまいさが残ってもいい回答に対してはかなり使えます。
変数名を考えたり、コードにコメントをつけたりなど。
ただ、100％の正確性が必要なものにはまだ使えないので、人間のチェックはまだまだ必要ですね。

個人的に使えると思ったもの。

## 枕詞をつける
プロのエンジニアとしてふるまってください。
と最初につけるとさらにデータがよくなるらしい！？

## この機能を実行するのに必要なステップを5段階にわけてください。
こうすると、機能が細分化されて

## 下記のJavaコードをRubyで書き直して。

Code: """
List<String> filteredList = new ArrayList<>();
for (String element : list) {
    if (element.startsWith("A_") || element.startsWith("B_")) {
        filteredList.add(element);
    }
}
return filteredList;
"""


## 下記はPyTorchを使ったPythonのコードです。何をしているか説明してください。

Code: """
for epoch in range(20):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs.float()/255.0)
        loss = criterion(outputs, labels.view(-1,1).float())
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
"""


## 下記のTypeScriptのコードにコメントを付加してください。

Code: """
<<ソースコードを貼る>>
"""


## 下記のTypeScriptの関数に対するjestを使ったテストコードを出力してください。

Code: """
type Person = {
  name: string;
  age: number;
};

function isArasa(person: Person): boolean {
  return person.age >= 28 && person.age <= 32;
}
"""
YoomのStripeアプリで、任意のAPIを呼び出すアクションを作る方法

YoomやZapierなどのIPaaSサービスを利用することで、複数のサービスを連携させたワークフローを自動化することができます。

![スクリーンショット 2023-02-07 15.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/f2648937-d437-ab5d-8941-31d057d6ad72.png)
https://yoom.fun/

## Stripeアプリを利用するには、シークレットAPIキーが必要

Yoomが提供するさまざまなアプリには、Stripeも含まれています。

![スクリーンショット 2023-02-07 15.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/07066898-91b4-9223-7f67-248a1a9f126d.png)

アプリを利用できるようにするには、StripeダッシュボードからシークレットAPIキーまたは制限付きAPIキーを取得し、[アクセストークン]に設定しましょう。

https://intercom.help/yoom/ja/articles/5679573-stripe%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%A2%E3%83%97%E3%83%AA%E7%99%BB%E9%8C%B2%E6%96%B9%E6%B3%95

:::note 
より安全にStripeアカウントを運用したい場合、シークレットキーの代わりに制限付きAPIキーを発行して利用することをお勧めします。
https://stripe.com/docs/keys#limit-access
:::

## 「アクション」一覧にないAPIを利用するには、「カスタムコネクト」を利用する

YoomのStripeアプリでは、顧客データの作成などのアクションが事前に用意されています。

![スクリーンショット 2023-02-07 15.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/257a02ba-06ba-5c73-adfb-43702f5f95de.png)

もし引数の設定をより詳細に行いたい場合や、一覧にないAPIを呼び出したい場合は、[カスタムコネクト]を選択しましょう。

### 設定画面で、呼び出すAPIを登録しよう

[カスタムコネクト]の設定画面では、呼び出すAPIの設定を行う画面が表示されます。

![スクリーンショット 2023-02-07 15.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5915a973-728a-bc0a-98df-1a12338c9e95.png)

ここで呼び出したいAPIのURLやパラメータを設定しましょう。

https://stripe.com/docs/api

:::note
**Content-Typeは、`application/x-www-form-urlencoded`**
StripeのAPIを呼び出す際のContent-Typeは、`application/json`ではなく`application/x-www-form-urlencoded`を指定しましょう。
:::

### POST / PUT / DELETEのパラメーターは「ボディーパラメーター」

GET以外のAPI呼び出しでは、パラメーターをボディーパラメーターにJSONで設定します。

![スクリーンショット 2023-02-07 15.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8430e3eb-fd19-aeda-7047-43282c300749.png)

`{{リソース名}}`で、前のフローの戻り値や入力値などを利用できます。

### GETのパラメーターは「URLパラメーター」

GETリクエストでは、ボディの代わりのURLパラメーターに値を設定します。

![スクリーンショット 2023-02-07 15.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/927be5cb-e982-4719-a556-9a75c3c41a5d.png)

どちらのケースでも、前のフローの戻り値（アウトプット）を利用する際のヒントが表示されます。

## IPaaSを活用して、請求業務やサブスクリプション管理などを効率化しよう

YoomのようなIPaaSを利用することで、これまで複数のアプリを同時に開いて操作していたワークフローなどを自動化できます。

![スクリーンショット 2023-02-07 15.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3f9c5e37-dc69-019c-86cb-d26d113b1000.png)

YoomやZapier、CDataなどとStripeを組み合わせたワークフローの自動化を、ぜひお試しください。
フィクションなどから拾う情報処理用語 その7 全網羅テスト (イナズマンF)

イナズマンF 第7話「大決戦! ウデスパー対イナズマン!!」、第8話「ウデスパー兄弟! クロスハリケーン!!」(両方とも脚本：上原正三、監督：塚田正煕、技斗：高橋一俊、(C)石森プロ、東映)より

デスパー軍団の参謀ウデスパー(声：岩名雅記)はイナズマンに敗れ去った。
ゼーバーイナズマンフラッシュの直撃には耐えたのだが、皮肉にも「自らの猟犬」だった女サイボーグ・ミスワンに託し(て紆余曲折の末にイナズマンの元に渡っ)た渡五郎抹殺用ペンダントの攻撃を受けてバラバラに砕け散ったのだ。
なお場所は東映生田スタジオ制作作品ではお馴染みの三浦半島の剣崎である。

戦い終わり、死亡したミスワンをお姫様だっこしながら歩く渡五郎。後ろに続くのはインターポール秘密捜査官の荒井誠。渡五郎の頼れる相棒だと子供心に思った、揉み上げの人である。服装はカウボーイに似ている。渡五郎と荒井誠はデスパー兵士がウデスパーの破片を拾い集めるのを目撃した。

荒井誠「奴ら、一体何をしているのだ?」
渡五郎の心の声「ウデスパーの破片を集めている。一体どうするつもりなんだ?」

さてデスパー軍団のアジトでは

ガイゼル総統「ウデスパーは我がデスパー軍団の誇りだ。だからウデスパーは死なない! ウデスパーよ。お前に復讐の時を与えよう。お前はウデスパーα、ウデスパーβとして蘇るが良い。そして戦うのだ。イナズマンを倒し我が帝国を打ち立てるまで。」

功を焦ってウデスパーを闇討ちにし、渡五郎をミスミス逃すという失態を冒したハンマーデスパー(声：渡部猛)にプッツンして彼の頭を杖で殴り飛ばした(なんと頭は首から外れて床に落ちた)時とは大違いである。それだけガイゼル総統はウデスパーを信用していたのだ。子供心にガイゼル総統は恐かった。

村越伊知郎「強敵ウデスパーは倒したが、ここにさらに強力なロボット戦士が誕生しつつある。その名はウデスパーα、ウデスパーβ。ガイゼルの改造室では凶悪な大計画が進行しているのだ。」

そして次の回になった。

ガイゼル総統「ウデスパーα。ウデスパーβ。」

と呼ぶや否や、ウデスパーα(声：渡部猛)とウデスパーβ(声：岩名雅記)が登場した。

ガイゼル総統「お前達はデスパー軍団の名誉ある戦士ウデスパーの分身だがウデスパーよりさらに優れた能力を持たせてあーる。まずお前達2人の使命はにっくきイナズマンを討ち、私の頼りある両腕となることだ。」

このセリフだけでガイゼル総統の期待が相当高い事がわかる。なおウデスパーの名前の由来は腕である。また右腕にも掛けられている。閑話休題。

ウデスパーαとウデスパーβ「ガイゼル総統に忠誠を誓います。」
ガイゼル総統「ジェットデスパーを使い、まずイナズマンの力を知れ!」

こうしてジェットデスパー(声：青森伸)とともにウデスパー兄弟は出動することになったのだが作戦会議の場で事件は起きた。

ウデスパーβ「ジェットデスパー、お前、どうやってイナズマンを倒すつもりだ。」
ジェットデスパー「は。私には必殺兵器があります。これ(左腕についたもの)です。この凍結銃さえあればイナズマンと言えども問題ではありません。」

凍結銃が武器なのにジェットデスパーという名前になっているのは謎かも知れないがそれは映像で確認してほしい。まさにジェット機を連想させる姿で名は体を表している。閑話休題。

ウデスパーα「えーい、生ぬるいわ!」

ウデスパーαは左腕についた万力でジェットデスパーの凍結銃を殴り飛ばした。
ものすごく興奮している。
ウデスパーαほど興奮していなかったウデスパーβは聞いた。

ウデスパーβ「ウデスパーα、お前の考えを聞こう。」

ウデスパーαの答えは

ウデスパーα「奴を倒すにはもっと暴力的かつ破壊的戦略が必要だあ。」
ウデスパーβ「というと?」
ウデスパーα「ミサイルだよ、ミサイル。」

あまりにも短絡的な言葉にウデスパーβはこう聞き返した。

ウデスパーβ「なに?」
ウデスパーα「奴が潜んでいそうなところに片っ端からミサイルを撃ち込むのだ。絨毯爆撃こそ最良の方法なり。」
ジェットデスパー「なるほど。ウデスパーα参謀殿の方法にも一理ある。」

まあジェットデスパーの立場ではこう言わざるを得なかったであろう。
だが

ウデスパーβ「私は反対だ!」
ウデスパーα「なんだと!」
ウデスパーβ「イナズマン一人を探すためにデスパー軍団の貴重なミサイルを無駄使いする事は愚かな事だ。」

声の人でわかる通り、ウデスパーの知謀を受け継いだのはウデスパーβのようである。ウデスパーαはかつて功を焦ってウデスパーを闇討ちにしたハンマーデスパー同様の単細胞だったのだ。だが単細胞の人にああいう言い方は良くない。当然、ウデスパーαは激怒し逆ギレ。

ウデスパーα「ええい、愚かとは何だ!」

まさにプッツンしたウデスパーαはウデスパーβと掴み合いの喧嘩を始めてしまった。
上司同士の喧嘩を見かねて部下は

ジェットデスパー「まあ、まあ、まあ、ウデスパーα参謀殿。」

喧嘩を止めに入ったのだが

ウデスパーα「うるさいわい。」

突き飛ばされてしまった。
初っ端からこれでは先が思いやられるのだが、ジェットデスパーは何とか立ち上がった。

ウデスパーα「どっちの方法を取るか、二人の勝負で決めよう。来い。」
ウデスパーβ「もっと冷静になれ、ウデスパーα。どの方法にするかはジェットデスパーに決めさせれば良い。」
ウデスパーα「ええい。良かろう。」

ウデスパーαは渋々ながら納得したようで

ウデスパーα「ジェットデスパー、決めろ。」

その投げやり気味な問いに対する哀れな部下ジェットデスパーの答えは

ジェットデスパー「私の作戦でやってみたいと思います。」

まあそうなるのも当然であろう。愚かな全網羅テストはこうして回避されたのであった。

めでたし。めでたし?
フィクションなどから拾う情報処理用語 その6 リスク対応の先延ばし (仮面ライダー)

仮面ライダー第20話「火を吹く毛虫怪人ドクガンダー」(脚本：山崎久、監督：山田稔、技斗：高橋一俊、(C)石森プロ、東映)より

毛虫怪人ドクガンダーは山の中で仮面ライダーのライダーキックを受けて滝壺に落ちた。
直後に繭が川面に浮き出て流れていった。

仮面ライダー「あ、あれは。ドクガンダーが繭の中に入ってしまったのか。」

下流へと流れていく繭を茫然と見るだけの仮面ライダー。
直後に画面が切り替わり、一文字隼人、立花藤兵衛、そして立花レーシング倶楽部のメンバーがオートバイにまたがっていた。ドクガンダーが荒らしまわった山村から立ち去るのだ。巧みなカメラワークでバイクが走り去る場面が流れたが、一文字隼人を演じる佐々木剛とバイクの運転台に乗っていた山本リンダがバイクの免許を持っていたかどうかは不明である。少なくとも佐々木剛は仮面ライダーの撮影直前はオートバイの免許を持っていなかった。
それは兎に角、一行は、これまたドクガンダーに殺された(と思われる)小泉教授の助手吉岡助教授と遭遇。とその時、オートバイを止めた一文字隼人は

一文字隼人「あ。」

先ほどのドクガンダーの繭が流れていくのをしっかりと見た。

一文字隼人「あれはショッカーの繭だ。」

一文字隼人に吉岡は声をかけた。

吉岡「どうも、おせわになりました。」
一文字隼人「小泉教授はお気の毒なことをしました。」

一文字隼人はなおも川に目をやったのだが続けてなんとこう言うのであった。

一文字隼人「じゃ、麓までお送りしましょう。」

この短慮が結果的に吉岡に多大な迷惑をかけることになるのだが、それは次回の話。無責任極まりないナレーションがこう締めくくる。

中江真司「ショッカーの改造人間ドクガンダーは巨大な繭になった。この繭はどんな力を持って仮面ライダーに挑戦するか。」
PowerBIからRedshift Serverlessに接続する

# はじめに

PowerBIからインターネット経由でRedshiftに接続してみます。

なかなか良い手順がネットで拾えなかったのとRedshiftのパスワードをSHA256でsalt付きで生成する方法も見つからなかったので合わせてメモしておきます。

ちなみにRedshift Serverlessと書きましたがRedshift Spectrum（つまりS3へのクエリも）への接続も確認できました。

# Redshiftの設定

インターネット経由でRedshiftに接続するにはパブリックアクセスを有効にする必要があります。

ネットワークとセキュリティの右側にある編集ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8d9820b8-745e-1be0-21c5-afac2421d7af.png)

「[パブリックにアクセス可能]をオンにする」にチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8f41f9a1-a2f3-d1e2-88e1-d6c337d33481.png)

反映まで少し時間がかかります。私の場合は2,3分程度でした。

# ユーザとグループの作成、権限付与

Redshift QueryEditorを使ってユーザ・グループを作っていきます。

まずはグループを作って権限を付けていきます。今回はXXXスキーマへのSELECT権限だけを付けました。

```sql
CREATE GROUP powerbi_group;

GRANT usage on schema XXX to group powerbi_group;

GRANT select on ALL TABLES IN SCHEMA XXX TO group powerbi_group;
```

次にユーザを作ってグループに所属させていくわけですが、今回はSHA256でSalt付でパスワード生成してみたいと思います。P@ssw0rdというところはお好きなパスワードに変えて実行してください。


```python
import random
import binascii
from hashlib import sha256


def generate_salt(digit_num):
    DIGITS_AND_ALPHABETS = "0123456789abcdef"
    return "".join(random.choices(DIGITS_AND_ALPHABETS, k=digit_num))

salt = generate_salt(64)
salt_binary = binascii.unhexlify(salt)
print('sha256|',sha256(b"P@ssw0rd" + salt_binary).hexdigest(),'|',salt, sep='')
```

こんな文字列が出力されると思います。

```
sha256|7d15a616d178444ef8f7b52aec5b04dd81eed2b9ecc48ca7b68816c6765ac94c|7be5dc609f1d337eaf61187274dcfc4a82effea558bd2ffbacd384e230960e6e
```

この文字列を使ってCREATE USER文をつくっていきます。

```sql
CREATE USER powerbi PASSWORD 'sha256|7d15a616d178444ef8f7b52aec5b04dd81eed2b9ecc48ca7b68816c6765ac94c|7be5dc609f1d337eaf61187274dcfc4a82effea558bd2ffbacd384e230960e6e' in group powerbi_group
```


# PowerBIから接続する

PowerBIを開き「データを取得」→「詳細」をクリックしRedshiftを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/499c60b5-960b-c203-4c3d-ab9d3440b4aa.png)

RedshiftのServer, Databaseを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/7a5d0c25-d706-92ba-6cfe-430c567e6282.png)

「ユーザー名」と「パスワード」を入力します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/030a5ad7-24f4-cf40-6f62-15dd9ea64ca9.png)

テーブルをクリックしてデータがプレビューできていれば権限の設定もばっちりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/2ad4a335-b2c8-714c-cbd6-2ac5575639cc.png)

今回は扱うデータが多いのでDirect Queryを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/578348fd-5d24-00fb-f5f9-db686667893e.png)

あとはこんな感じでいつも通りグラフを作っていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/351db14d-4f21-a7cb-b9c5-cb14eb687a76.png)

# 参考

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CREATE_USER.html
三層スキーマ

# スキーマとは？
データベース設計においては```データベースのデータ構造やフォーマット```のこと。

# データベース設計のステップ
* 外部スキーマ
* 概念スキーマ
* 内部スキーマ

スキーマのレベルを表す。

## 外部スキーマ(テーブルやビュー）
データベースがどのような機能とインタフェースを持っているかを定義するスキーマ
```ユーザーから見たデータベース```です。

データベースだけでなく、```画面のユーザーインターフェースや入力データ```など、```ユーザーから見える```システムの姿の一部

### ビュー
* SQLの観点から見るとテーブルと同じですが、テーブルのようにデータは持たず、テーブルに対するSELECTを持っています
### 出典
https://www.shoeisha.co.jp/book/detail/9784798135168

* ```複雑な操作を要するSELECT文をビュー化```しておくことで、上位レイヤーのアプリケーションのアプリケーションのプログラミングを簡潔に行える。

## 概念スキーマ（テーブル定義）
```データベースに保持するデータの要素```及び、```データ同士の関係```を記述するスキーマです。
```開発者から見たデータベース```です。

```データベース設計において重要な位置を占める```ことになります。

## 内部スキーマ（データの物理的配置）
```どのようにDBMS内部に格納するかを定義```するスキーマです。
```DBMSから見たデータベース```です。

```あらゆるデータは最終的に「ファイル」の形で管理```されるわけで、その```「ファイル」で表現される```世界だ、と考えていただけたら良いでしょう。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704

# 感想
ここはもう一回勉強することになりそうだ。
概念スキーマについてもこれからだ。
`content_for` で数値が表示されてなかった


## 最近 slim ちゃんと使ってないな

と苦手意識を持ってやっていたらハマった．
ちなみに Rails は 6.1 です．

```ruby
eval error: invalid codepoint 0xXXXX in UTF-8
```

初めは何かわからなかったけど，絞り込んだら，
`content_for` 辺りに何かありそう．

```ruby
irb> content_for(:var1, 55500)
eval error: invalid codepoint 0xD8CC in UTF-8
```

ということで，7.0 で修正された内容が関係ありそう．
とりあえず，自分で，`.to_s` するか．

```ruby
irb> content_for(:var1, 55500.to_s)
nil
irb> yield(:var1)
"55500"
```

## まとめ

- ちゃんとエラーが出てくれてありがたい

## Refs

- https://github.com/rails/rails/pull/42123
- https://github.com/rails/rails/blob/7-0-stable/activesupport/CHANGELOG.md