OmniAICreator/Qiita-1.07M huggingface dataset:
Google UXデザイン：仮説ステートメントを定義する

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bddf54d2-10de-1b0d-0b37-21ba00cfb1df.png" width="800">

# 仮説ステートメントとは

[前回のプロブレム・ステートメント][problem]によって、問題が明確に定義されました。次は、仮説ステートメントを定義します。

[problem]: https://qiita.com/mapami/items/66a1c4014d4063c1d4b6

***<font color="MediumVioletRed">『UXデザインでは、問題に対する可能な解決策を仮説ステートメントとして書きます』</font>***　


# 仮説ステートメントの書き方

仮説ステートメントは、プロブレム・ステートメントと異なり、標準的な書き方があるわけではありません。

ここでは、if then文と呼ばれるものを使ってみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3e2ee5e5-cabd-9b46-9230-58eed561f79e.png" width="600">


***"アマルがジムのアプリをダウンロードすれば、好きなクラスを事前に予約することができる。"***

仮説文には定型文がないので、if then文ではなく、次のようにもっと柔軟な書き方もできます。

***"アマルは好きな授業を事前に予約できて、最初に申し込む機会を通知してくれるアプリが必要だ。"***

これらの例では、アマルのニーズを解決するために何が起こるべきかを推測し、仮説を立てているのです。

1つの問題文に対して、複数の仮説文がある状況に遭遇することがあります。それはそれでいいのです。ユーザーが直面している問題には、常に複数の解決策が存在するはずです。

UXデザイナーの仕事は、あなたの創造力と問題解決能力を駆使して、デザインするユニークなユーザーにとって最適な解決策を決定することです。

# さいごに

仮説を立てることで、リサーチで得た知見を製品のゴールへと絞り込み、ユーザーの欲求に焦点を当て続けることができます。 

デザインプロセスを進めていく中で、ユーザーのニーズについてより深く知るにつれ、仮説を再検討し、場合によっては調整することになるでしょう。

最適なデザインソリューションとなるよう、柔軟に対応してください。
ストリームにメモ（付箋）を付けてチームで共有する(SPSS Modeler データ加工逆引き9-4)

# ストリームにメモ（付箋）を付けてチームで共有する

![スクリーンショット 2022-10-03 13.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2523eb17-3149-b0ef-91d3-ee33b1e28c6c.png)

## 1.想定される利用目的

・ストリームにメモ（付箋）を付けてプロセスの注意事項をチームで共有する


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/stream_parameter_memo.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-10-03 13.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d214b954-26b7-8350-b909-82b006794d6f.png)
＊逆引き9-01Aで利用したスーパーノードを含むストリームです。

ノードを指定して右クリックで[新規コメント]を選択、または赤枠のボタンを押します。
![スクリーンショット 2022-10-03 13.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/69ae1904-58be-8574-2c68-433820862f57.png)

該当ノードにリンク付きで付箋（メモ）がつきました。
![スクリーンショット 2022-10-03 13.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/788a3446-522d-2746-fc35-e8cb03666256.png)

リンクの削除や接続はノード間のリンクと同じ操作です。
![スクリーンショット 2022-10-03 13.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bbbccbe0-6a20-424f-311d-0e38800a537a.png)

付箋や文字色を変えるために以下のメニューを選択します。
![スクリーンショット 2022-10-03 13.07.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d09595aa-80be-0b7e-fc11-7884225193fd.png)

[カスタムカラー]にチェックを入れて付箋の色（背景）と文字色（前景）を変更できます。
![スクリーンショット 2022-10-03 13.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/660588a3-7add-d41e-786f-5542f3b3650c.png)

付箋がピンクになりました。
![スクリーンショット 2022-10-03 13.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/722c97a0-40ff-ebd4-7ca0-6118c4b28a88.png)

赤枠ボタンのオンとオフで付箋の表示・非表示を切り替えられます。
![スクリーンショット 2022-10-03 13.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/53bd3f64-7b40-1df1-a05c-2cf5514c612f.png)

#### 注意事項

ノードの[注釈]タブでノード名称を[ユーザー設定]できる他に[キーワード]としてコメントを記述・保存することも可能です。

![スクリーンショット 2022-10-03 13.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7fcb0e24-2693-f393-4ef2-9367170dcbe4.png)


## 4.参考情報

#### スーパーノードを解説した記事

https://www.ibm.com/support/pages/spss-modeler%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E4%B8%8A%E3%81%AB%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E6%AC%84%E3%81%AE%E8%89%B2%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

https://qiita.com/kawada2017/items/01daa98cb5ec3fd61dd8

https://qiita.com/kawada2017/items/60e4d432d0e1963d0e4a


#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
スクラム初心者が経験した、劇的ビフォーアフター

### はじめに

* 約1,2カ月でチームがめまぐるしく変化し、改善できたことをまとめました。
* [デジタルバリュー](https://www.digitalvalue.co.jp/)に入社して約3ヵ月半がたち、アジャイルでの開発は初めて。
* フルリモート環境、チームはフロントとバック（筆者はバック）で分かれている。
* 参画した当初は私含めバックエンドチームは6名。（以前は3名）その2か月後増員することになり8名に。


### After：スクラムチーム内で改善できたこと
:::note info
デイリー時に５本指表明を取り入れスプリントのタスクを皆で協力して終わらせることができた
:::
:::note info
MIROを使ってMT時間、話し合いの時間を短縮することができた
:::
:::note info
振り返り時に今スプリントの良いなと思ったこと、感謝を伝える枠を設ける事で雰囲気が良くなった
:::
### Before：チームに参画した当初

その頃の正直な私の心情は・・

* 話し合いが白熱し、スクラムイベントでの話し合いが長い、とにかく長い
* イベント中や終了時、ダラダラと雑談してる時間も長い
* 雰囲気があまりよくない時がある、ちょっとぎすぎすしている？


『雑談するのはいいけど（私も好きなので、、）、やることをやってしまってから雑談すればいいやん。今そんな話してる場合ちゃうやろ・・』

『話が広がりすぎやし、あっちこっち行ったり来たりしてて、それ今考える事？それ今話し合う必要あるのか・・』

『イベントに時間をかけすぎて話してる人も、聞いてる人もエネルギー消費して自分たちで自分たちの首しめてるし、これ誰もハッピーじゃないやん』

『今めっちゃ空気悪い。。気まずいなあ。。』

とかとか思ってました！ｗｗ

でも入ってきたばかりでただでさえ慣れない事ばかり、私は未経験から転職し経験もまだまだ浅く
アジャイル、スクラム経験もない為どうしたらいいのか分かりませんでした。

※ちなみにこれは悪い部分だけピックアップしてるので良い所も沢山あります！！！笑
皆さんいい人やし、仕事楽しいって思ってました←（今も楽しい、職場・仕事が好きです:relieved:

### 1つ目の改善策、5本指表明を取り入れてみた

まず、今のデイリーってなんかすごくあっさりしててこれやってる意味あるんかな？
各自持ってるタスクが終わらないことを負担に感じていても言いずらいんじゃないか？
と思ったことがきっかけで何か良い方法はないかなーっと調べてみました。

そこで見つけたのが、5本指朝会の記事です。

https://www.ogis-ri.co.jp/otc/hiroba/others/ActivityPocket/fisttofive.html

簡単に言うと5段階で自分が抱えているタスクの状況を表現するためのもの
　　↓↓↓下記がそれを表にしたものです。※0はチーム内でスパイク用に追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2899739/158d3d4a-5bf6-b21a-ff84-8974347143f4.png)

これをデイリーで行うことによって、3～1本指の人はヘルプを出しやすくなり
5、4本指の人が助けたり、皆が共通の認識を持つことができるのですごく良いなと思いました！
実際に協力してタスクを終わらせることができたという実績もでき取り入れてよかったと思っています。

### 2つ目の改善策、MIROを使って話し合いの短縮

何かの議題が上がった際に今まではその場で話し合っていたのですが、
あまりにも時間がかかる、この話し合いに全員が参加する必要があるのかという事で

:::note info
議題が上がった際には、MIROに付箋を貼り1週間の期日を設け意見を募り
意見をまとめる人（1,2名程）が付箋を整理し共有する
:::
というやり方に変えました！

この方法で時間の削減、意見を言いずらい人も言える場に改善できました。

* これまでにでた議題たち
    * チームリーダーをたてるか？（リーダーが不在のため）
    * ファシリをはどのようにしていくか？（議論が白熱することが多いのはファシリがファシリとして機能してないのでは？という観点から）
    * 共通の振り返り（雑談）は必要かどうか？→これに関しては下記の記事で紹介しています

https://qiita.com/annayamamoto/items/52487380572cf729939f

### 3つ目の改善策、チーム振り返り内に良かった所を褒めあう

この頃、話し合いも多く『ちょっと疲れるな』と思ったことが始まりです。

※下記画像は私のタイムスでのつぶやきです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2899739/5d6cf45f-2429-c107-6b03-31410661b5a1.png)
増員もあり、ばたばたしてたし改善しないといけないと力が入りすぎ
余計に問題点ばかりに目を向け過ぎていたのではと思っています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2899739/415d6a60-c750-8bfa-213b-fa7b277d7622.png)

私のタイムスのつぶやきにすぐ賛同してくださり、振り返り内でやろうと提案してくださいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2899739/317798ec-b4ad-1535-087c-992a0b226555.png)

実際にやってみることで、振り返りの雰囲気もさらに良くなったと感じていますし
褒められることを嫌がる人なんていないよな～って思うし
モチベが上がったり、改めて感謝の気持ちを伝えるってすごく大切だなっと感じました。

### 終わりに

* つぶやいたことに対して皆が賛同してくれたり、協力してくれたりチームの皆のおかげで改善できた。
* スムーズに進行できたり、チーム内で助けあったり雰囲気も良くなった。
* 人は変化を嫌うし面倒だと思う事もあると思いますが、皆さんの協力があり改善できた。
* スクラムに対してもっと興味がでてきたし、今後も改善改良を重ねたい。
* 皆一人一人が楽しい・働きやすい環境作り、良いチームで仕事できたらいいなと思いました。

##### ちなみに話

スクラムに対してここまで興味を持って提案できたり、考えるようになったのは
新規参画者にオンボーディングで私がスクラムの話をすることになったのがきっかけです。
そのおかげでさらに興味が深まった気がします。もともとスクラムに対して良いなと思ってはいたものの、やっぱり人に伝えないといけないと思うと自然と情報収集したり、学ぼうとするので教えるって一番良いアウトプットだと再認識できました。
WEB開発をやり始めてみる(HTML:基礎)

# 目的
以前、Rubyのスクールに通っていたので
今回もRubyをメインにして、WEB開発を行なっていきます。
インフラは、業務でやっているので開発側がどんなことを注意しないといけないのかが目的となっています。

# やってきたことメモ
## HTMLの基礎
![スクリーンショット 2022-10-18 8.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542333/b6387eea-2738-baa4-b171-f969fe51b86b.png)

<details><summary>入力コード</summary>

```ruby
<!DOCTYPE html>
<html lang="ja">
  <!-- コメントしたい時 -->

  <head>
    <meta charset="UTF-8">
    <title>はじめてのHTML</title>
    <style>
      h1 {
        color: red;
      }
    </style>
  </head>

  <body>
    <h1>はじめての見出し</h1>
    <p>はじめての段落</p>
    <p>
      1000 - 00014<br>
      あああああ<br>
      い良いいい<br>
      ううううう
    </p>

    <p>区切りの要素について</p>
    <hr>
    <p>区切り要素について</p>

    <p>リストについて</p>
    <ul>
      <li> りんご</li>
      <li> りんご</li>
      <li> りんご
        <ul>
          <li>みかんみかん</li>
          <li>みかんみかん</li>
        </ul>
      </li>
    </ul>
    <ol>
      <li> りんご</li>
      <li> りんご</li>
      <li> りんご</li>
    </ol>
    <dl>
      <dt>用語</dt>
      <dd>説明</dd>
      <dt>用語</dt>
      <dd>説明</dd>
      <dt>用語</dt>
      <dd>説明</dd>
    </dl>
    <img src="xxxxxxxx_logo.png" width="300" height="200" alt="広った画像">
    <a href="https://xxxxxxxx.com/">プログラミング入門</a>
  </body>

</html>
```
</details>

## vscodeの設定変更
+ 拡張機能「zenkaku」導入
+ 拡張機能「HTMLHint」導入
+ 設定 >> html.format.enable の有効化
+ 設定 >> html.format.indentinnerHtml の有効化(shfit+option+F)
+ 設定 >> tabsize「2」に変更
+ 設定 >> Render Whitespace 「all」
+ 設定 >> Render Control Characters 有効化

## HTMLの構文チェックについて
構文チェックが行えるサイトを使用して構文チェックができる
https://validator.w3.org/
## HTMLのグルーピング
![スクリーンショット 2022-10-18 8.45.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542333/86dc8457-c077-640f-488b-04dce02122ca.png)

<details><summary>入力コード</summary>

```ruby
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>グループ化の練習</title>
</head>
<body>
  <header>
    <h1>グループ化の練習</h1>
    <nav>
      <ul>
        <li><a href="#">エンジニアへの道</a></li>
        <li><a href="#">プログラミング入門</a></li>
        <li><a href="#">ニュース</a></li>
      </ul>
    </nav>
  </header>
  <main>
    <article>
      <h2>グループ化を学ぶのにおすすめのサイト10選！</h2>
      <p>グループ化を学べるサイトを10個紹介いたします。</p>
    </article>

    <section>
      <h2>関連記事</h2>
      <ul>
        <li><a href="#">関連記事1</a></li>
        <li><a href="#">関連記事2</a></li>
        <li><a href="#">関連記事3</a></li>
      </ul>
    </section>
  </main>

  <aside>
    <h2>広告</h2>
    <p>全ショップ対象エントリーでポイント５倍！</p>
  </aside>
  
  <footer>
    <p><small>&copy; 2020 Yuta Nakamura.</small></p>
  </footer>
  
</body>
</html>
```
</details>

section : セクションをグルーピング
header　：　セクションのヘッダー
footer　：　セクションのフッター
main　：　　文章のメインコンテンツ領域を示す
article ：　記事コンテンツ要素
asibe : 余談要素
nav : ナビゲーション要素
Lightning Loginのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

+ [How to add Lightning Login to your Salesforce Account](https://www.performa-it.co.uk/how-to-add-lightning-login-to-your-salesforce-account/)
+ [詳細：Lightning Login への登録](https://qiita.com/Keiji_otsubo/items/652da1e56192018e8f48)

# 設定手順

+ [Lightning Login の有効化](https://help.salesforce.com/s/articleView?id=sf.security_ll_enable.htm&type=5)

権限セットで各ユーザに割り当てる場合
システム権限の中にあるLightning Login ユーザを有効にする。

# パスワードの更新

+ [Lightning Loginを用いる組織でのパスワード更新について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HlqFc)

パスワード有効期限が切れた状態でLightning Loginによるログインを試みた場合、ログイン自体は成功しますがその後にパスワード変更画面に遷移します。

このパスワード変更画面では新しいパスワードのみ入力するため、古いパスワードを忘れていても問題ありません。（古いパスワードと同じパスワードの設定はNGです。）

なのでユーザにはLightning Login後の画面でパスワード変更画面が出た場合は画面に沿って新しいパスワードを入力するよう伝えれば十分だと思います。

# 通知が来ない？

+ [Lightning Loginの通知が来ない、来ても承認画面にならない事象が数台のiPhoneで発生](https://qiita.com/Keiji_otsubo/items/84009979a13f7d49d020)

通常、同時刻に「多要素が必要です」と「成功」、若しくは「Lightning Login が必要です」と「成功」のログが有りますが、「成功」のログは無く、他のメッセージは無い状態です。

現象が出た端末だと、Salesforce Authenticatorを使用して生成した確認コードでもエラー(確認コードが無効であるか、期限が切れています。もう一度入力してください。)になり、ログイン出来ませんでした。

Salesforce Authenticator からアカウントの削除を試みましたが、全台で「アカウントの削除が出来ませんでした」となりアカウントの削除は出来ませんでした。

スマホから Salesforce Authenticator を一旦削除し、再度インストールしバックアップパスコードで復元を行うことで、Lightning Login 出来る状態に戻りました。

# Error

+ [Your verification attempt has timed out. Try again](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifbmd)

:::note
found it: had to install the latest version of the authenticator app, something about notifications no longer supported in the version I had (although v3)

見つけました：最新バージョンの認証アプリをインストールする必要がありました。通知に関する何かが、私が持っていたバージョン（ただしv3）ではサポートされなくなりました
:::

+ [Lightning Login Config 設定の問題を解決するにはどうすればよいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MXdV90AL)


ユーザーに Lightning ログインが設定されました。しかし、Lightning ログインに登録できません。必要な権限セットを割り当てた後、ユーザーを Lightning ログインに登録しようとすると、セッション タイムアウト エラーが返されます。ユーザーの詳細ページを確認すると、Lightning ログインの表示は空白 (登録なし) です。ただし、同じ権限セットを別のユーザーに割り当てると、ユーザーの詳細ページの Lightning ログインの横に [登録] が表示されます。
開発PCのメモリ容量と生産性の関係性について

下記の記事で書いたコメントが絶妙に手の込んだものになってしまったので、せっかくなので記事にしてしまえ。

https://qiita.com/sasaki_hir/items/a00215b7dfe2c3279a0b

私はWeb系エンジニアで、いまはNode.jsを中心に触っています。
極端な例ですが、私が貸与されている開発PCは8GBのビジネスパソコンです。
下記のような非生産的タスクがたびたび必要になります。

* VSCodeで作業できるようになるまで待つ（アプリを温める） - 2分程度
* ブラウザクラッシュからの再起動 - 1分程度
* メモリ容量不足でサーバープロセスが起動しないため、閉じるアプリを選定 - 2分程度
* ServerlessのOutOfMemoryErrorでのテスト中断→プロセス再起動 - 3分程度

あと、下記は常日頃です。

* マウスクリックから反応するまで数秒待つ
* タイピングにキーボードが付いてこないので誤字る→チャット編集
* 単体テストを起動して終わるまで待つ（ブラウザすら触れない）

SSDへのスワッピングは常に発生してますし、むしろそれが無いと作業が出来ない。
（寿命は半分以下だと思います）

ざっくり、私が勝手にイメージするPCメモリ容量と生産性の関係をグラフにしてみました。
8GBを1としたときのイメージですが、log曲線を描くと思います。
※ 4GBは作業にすらならないので 0 です。

![PCメモリ容量と生産性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403994/8680c254-6c59-33ce-410e-72cb434b9f43.png)

これに関して、開発言語、フレームワーク、開発規模、プロセス数、年代などが数値に影響すると思います。

最後になりますが、企業側からしてもエンジニアに言い訳をする要素を与えているので、
lose - lose の関係になると思っています。
React.js 学習備忘録①~基本事項~

Reactの学習を始めたので、自分の中で情報を整理するためにも記録を残しておく。

# JSX記法
・HTMLのような構造だが、JSと併用が可能
・閉じタグが必要
・JS部分は{}で囲う
・拡張子は.jsx
・レンダリングする際、returnする内容は1つのタグで囲う必要がある
・その際は何も記述しないタグで囲うのが一般的 <>jsxの内容</>
・class名はclassNameとする
```App.jsx
export　const App = () => {
    const hoge = 'huga';
    return(
    <> //HTMLでは出力されない
      <input/> //1つのタグからなる要素も閉じタグ代わりの/が必須
      <div className="App">　//HTMLでは <div class="App">と出力
        {hoge} //HTMLではfugaと出力される
      </div>
    </>
    );
};
```

# コンポーネント
・Reactを構成する部品
・コンポーネントを組み合わせてページを作っていく
・コンポーネント名の最初は大文字
・クラスコンポーネントと関数コンポーネントがある（今はほぼ関数コンポーネント）
・インポートしたコンポーネントをタグとして使用が可能
```src/components/Child.jsx
export const Child = () => {
    return(
    <> 
      <div>
        子コンポーネント
      </div>
    </>
    );
};
```
```App.jsx
import { Child } from "./components/Child";

export const App = () => {
    return(
        <>
            <div>
                親コンポーネント
            </div>
            <Child /> //子コンポーネントと出力
        </>
    );
};
```

# イベント
・キャメルケースで設置 onClick,onChangeなど

```App.jsx
import { Child } from "./components/Child";

export const App = () => {
    const onClickAlert = () => alert();
    return(
        <>
            <button onClick={onClickAlert}> //クリックすることでアラート表示
                アラート表示
            </button>
        </>
    );
};
```

# Props
・コンポーネントに渡される引数
・親側はコンポーネントタグに プロップス名=値 で子に渡す
・子側は () => {} の（）内でまとめて受け取る
```SelfIntroduction.jsx
export const SelfIntroduction = (props) => { //props名はなんでもOK
    const {firstName, lastName} = props;
    return(
        <>
            <p>私の名前は{lastName} {firstName}です。</p>
        </>
    );
};
```

```App.jsx
import { SelfIntroduction } from "./components/SelfIntroduction";

export const App = () => {
    return(
        <>
            <SelfIntroduction firstName='太郎' lastName='山田' /> //私の名前は山田 太郎です。と出力
            <SelfIntroduction firstName='花子' lastName='山田' /> //私の名前は山田 花子です。と出力
        </>
    );
};
```

# state
・コンポーネントが持つ状態
・useStateを使用することで値を更新する
・useStateはuseState()とすることで、変数名、変数を更新する関数(set変数名)を定義する
・useState()の()内で初期値を定義できる
```App.jsx
import { useState } from "react";

export const App = () => {
    const [ number, setNumber] = useState(0);
    const onClickIncrement = () => {
        setNumber(number + 1);
    };
    return(
        <>
            {number} //初期値として0が出力
            <button onClick={onClickIncrement}>インクリメント</button> //クリックする度にnumberの値がインクリメントされて更新
        </>
    );
};
```

何かミスやアドバイス等ありましたら、コメント頂けると幸いです。

次回：[再レンダリングについて](https://qiita.com/_takenoko/items/cd74f5c90f468f793b44)
Codeforces Round #828 (Div. 3) E-Divisible Numbers - ある数で割り切れる数の探し方(値域の決まっている２数の積)


# 問題
- $a,b,c,d$の4つの数が与えられます。$a < x \leq c$,$b < y \leq d$であり、$ab$で割り切れるような数$x$,$y$を求めてください。どれを出力しても良いです

# 考え方
題意より、$x \cdot y \equiv  0 \pmod{a \cdot b } $となるような$x$, $y$を求めればよく、整数$k$に対して$a \cdot b \cdot k = x \cdot y$はこれを満たします。$k$は$k = k_1 \cdot k_2$と任意の整数の積で表してよいです。

次に、$a \cdot b = e \cdot f$となる整数$e$, $f$を考えます。$e$は整数であることから$a \cdot b$を割り切れる数であるので$a \cdot b$の約数です。また、$f= \frac{a \cdot b}{e}$で示せます。$a \cdot b$の約数はこれは$a$と$b$ぞれぞれから約数を1つずつ選んだ時の積の集合と一致します。
- 例を挙げます。$a=3$, $b=4$としたとき、$a=3$, $b=2 \cdot 2$ で、$a \cdot b = 12 = e \cdot f$となるようなeは$1, 2, 4, 6, 12$が考えられます。これは$a$の約数$1,3$と$b$の約数$1,2,4$の集合の積となるます

ここで、$a \cdot b \cdot k = e \cdot f \cdot k = (e \cdot k_1) \cdot (f \cdot k_2) = x \cdot y$ として、$x =  (e \cdot k_1)$, $y = (f \cdot k_2)$で表します。$k_1$, $k_2$は任意の整数をとれるので、$x$は$e$の倍数で、$y$は$f$の倍数です。$e$を列挙すれば、$e$は$f$から求められるので、$a < x \leq c$,$b < y \leq d$となる倍数を適当に選べば良いです。任意の組み合わせを1つ表示すればよいので、例えば、最も小さい数字を選んでよいです。

# 実装
- 補題として、ある数$a$以上の最小の$m$の倍数は次のように求められます。$ \lceil \frac{a}{m} \rceil m $。切り上げはceil(a,b) = (a+b-1) // bの式を使うと高速に計算できます
- $e$は$a$の約数列挙と$b$の約数列挙を行いその積とします。$f$は$e$から算出します。
- $e$, $f$から$x$, $y$を求めます。これは上記の式を用いて$a+1$, $c+1$以上の数を1つ選べばよいです。

```Python
ceil = lambda a, b: (((a) + ((b) - 1)) // (b))

def make_divisors(n):
    divisors = []
    for i in range(1, int(n ** 0.5) + 1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    # divisors.sort()
    return divisors

q = int(input())
for _ in range(q):
    a, b, c, d = map(int, input().split())
    ab = a * b
    res = [-1, -1]
    DivAs = make_divisors(a)
    DivBs = make_divisors(b)
    for DivA in DivAs:
        for DivB in DivBs:
            e = DivA * DivB
            f = ab // e
            x = ceil(a + 1, e) * e
            if not (a < x <= c): continue
            y = ceil(b + 1, f) * f
            if not (b < y <= d): continue
            res = [x, y]
    print(*res)
```

https://codeforces.com/contest/1744/submission/176813706
Python,Ruby,PHP,Java,JavaScript,PerlのC言語拡張の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,PerlのC言語拡張の比較

# Python

https://qiita.com/pocokhc/items/836a3596df5facd00824https://qiita.com/nabion/items/594fb3316583130a636e

# Ruby

https://qiita.com/suketa/items/ab6b88093de4a54b3b06

# PHP

https://qiita.com/takeyoshi-k/items/2a993eefbe06be047eff

# Java

https://qiita.com/tobita_yoshiki/items/0400f7e393fc0ba2d0cb

# JavaScript

https://qiita.com/mokomium/items/5733a2578327b09c2fe6

# Perl

https://perlzemi.com/blog/20100809127859.html
Macでeksctlを利用してAmazon EKSのクラスターを構築する

# はじめに
[eksctl](https://eksctl.io/) を利用して、Amazon EKSのにクラスターを構築する方法です。
学習する際にクラスターを簡単に作れるので、便利です。
Mac環境を想定しています。

# 環境設定
1.  kubectlをインストール

    ```sh
    brew install kubectl 
    ```
1.  eksctlをインストール

    ```sh
    brew tap weaveworks/tap
    brew install weaveworks/tap/eksctl
    ```

# 実行環境の準備
1.  AWS CLIの設定
[AWS CloudFormationを動かすためのAWS CLIの設定](https://qiita.com/miyabiz/items/fed11796f0ea2b7608f4)を参考にしてください。

# EKSの構築

1.  AWSで利用できるEKSのバージョンの確認

    ```sh
    aws eks describe-addon-versions --query 'addons[0].addonVersions[0].compatibilities[*].clusterVersion'
    ```

1.  EKSクラスターを構築する

    ```sh
    eksctl create cluster \
        --name {クラスタ名} \
        --version $(aws eks describe-addon-versions --query 'addons[0].addonVersions[0].compatibilities[1].clusterVersion' --output text) \
        --region ap-northeast-1 \
        --nodegroup-name workers \
        --node-type t3.medium \
        --nodes 2 \
        --nodes-min 1 \
        --nodes-max 4 \
        --ssh-access \
        --ssh-public-key ~/.ssh/{公開鍵} \
        --managed

    ```

1.  EKSクラスターを削除する

    ```sh
    eksctl delete cluster \
        --name {クラスタ名}
    ```
2022/10/18主にITとかセキュリティの記事

Fortinet社製品の管理画面の認証をバイパスする脆弱性CVE-2022-40684に関連した調査(10/14)
https://security.macnica.co.jp/blog/2022/10/fortinetcve-2022-40684.html

米CISA、レッドチーム演習の可視化ツールを公開 - 意思決定など支援
https://www.security-next.com/140603

Pマーク事業者の事故報告は3048件 - 前年度比約15％増
https://www.security-next.com/140528

FacebookのJavaScriptエンジン「Hermes」に脆弱性
https://www.security-next.com/140597

SQLインジェクションで情報流出＆脅迫メール、株式会社ルネ(10/14)
https://cybersecurity-jp.com/news/73141

警察庁、北朝鮮ハッカー攻撃非難　暗号資産業者に注意喚起(10/14)
https://news.goo.ne.jp/article/kyodo_nor/nation/kyodo_nor-2022101401001532.html

「早く復旧してほしい」那覇市の図書館、貸し出し停止続く　「何の目的で攻撃しているのか」市民ら憤りの声も　ランサム被害(10/16)
https://ryukyushimpo.jp/news/entry-1600475.html

Minecraftサーバ、マルウェアMiraiの亜種から大規模なDDoS攻撃受けていた(10/16)
https://news.mynavi.jp/techplus/article/20221016-2482289/

DeFIプロトコル「Mango Markets」、ハッカーとの間での和解案を承認 ｜ 4700万ドルを「バグバウンティ」に(10/15)
https://jp.cointelegraph.com/news/mango-market-s-dao-forum-set-to-approve-47m-settlement-with-hacker

DC『ブラックアダム』ポストクレジットシーン映像がSNSに流出 ─ 各社が削除対応に追われる(10/16)
https://theriver.jp/black-adam-leaked/

さっきまで使えてたのに…　通話音がしないスマホ、何者かが解約　しかも銀行口座から１千万円引き出されていた(10/16)
https://news.goo.ne.jp/article/kobe/nation/kobe-20221016016.html

紙の健康保険証を2024年秋に廃止できるか、マイナ保険証への完全移行に3つの課題(10/17)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07257/

「脱PPAP」騒動を振り返る、パスワード付きファイルの何が問題だったのか(10/17)
https://xtech.nikkei.com/atcl/nxt/info/18/00037/101700071/

フォーティネット製品の新たな脆弱性を突く攻撃をIIJが検出、日本は数千台に影響か(10/17)
https://xtech.nikkei.com/atcl/nxt/news/18/13935/

DX需要を取り込む企業は？ソフトウエア市場の業界地図(10/17)
https://xtech.nikkei.com/atcl/nxt/column/18/02186/100300010/
競プロの計算量概算用VSCode拡張機能(Competitive Calculator)

# TL;DR
空の行に数式を入力し、macOSでは`Cmd+Alt+c`、Windowsでは`Ctrl+Alt+c`を押すと概算の計算結果が表示されるVSCode拡張機能です. `2^25`や`5C3`や`10!`などといった記号を含むものも計算できます.

https://marketplace.visualstudio.com/items?itemName=trombiano1.vscode-compcalc

#### 使用可能な演算一覧
| 演算子      | 演算子 |                      |
|----------------|:---:|---------------------------|
| 足し算       | + |                           |
| 引き算    | - |                           |
| 掛け算 | * |                           |
| 割り算       | / | 結果が小数の場合は小数点以下が切り捨てられます。|
| 組み合わせ       | nCr | 大文字小文字は不問です。 |
| 階乗       | n! |  |
| 対数(底2) | log(n) |括弧が必須です。結果が小数の場合は小数点以下が切り捨てられます。 |
| 括弧       | () |  |

※入力の空白は全て無視されます。


# 仕様・使用例など
最近ときどき[AtCoder](http://atcoder.jp/)というサイトで競技プログラミングをしているのですが、思いついた解法が実行時間制限に間に合うかどうかの計算がVSCode内で完結できるとエレガントだなと思い、今日少し時間があったのでVSCodeの拡張機能を作ってみました。

https://marketplace.visualstudio.com/items?itemName=trombiano1.vscode-compcalc

例えば2²⁰₁₀C₅をパパッと計算したいとき、新しい行に

```
2^20*10c5
```

と入力してmacOSでは`Cmd+Alt+c`、Windowsでは`Ctrl+Alt+c`を押すと

```
2^20*10c5 = 264,241,152
```

と結果が出ます。この例では実行時間制限に間に合わなそうですね。

JavaScriptのBigInt型で計算しているので、用途はよく分かりませんが`10000!`とか`10000c5000`とかも平気な顔して計算します。


# その他
## 数式の構文解析
例えば`1+2*3`を左から読んで実行してしまうと答えが`9`になってしまい、括弧なども使えません。

再帰を使えばできそうだなぁ、でもかなり面倒だなぁ、などと思いながら調べていたところ、[操車場アルゴリズム](https://ja.m.wikipedia.org/wiki/操車場アルゴリズム)というものに行き当たりました。

このアルゴリズムでは、数と演算子を保持するスタックを用意して左から数式を読んでいき、次に読んだ演算子の優先順位がスタック最後尾の演算子の優先順序よりも低い場合にはそうでなくなるまでスタックの演算子を潰していきます。

今回はこのアルゴリズムを実装して入力を逆ポーランド記法に変換し、その後簡単なスタックマシンで結果を計算しています。[math.js](https://mathjs.org)などを使った方が楽だったかもしれません。

https://ja.m.wikipedia.org/wiki/操車場アルゴリズム

https://ja.wikipedia.org/wiki/逆ポーランド記法


## VSCodeの拡張機能開発について
こちらは`npm`さえインストールされていればpublishするところまで全く難しくなく、とてもスムーズに開発できました。

https://qiita.com/HelloRusk/items/073b58c1605de224e67e

## おわりに
VSCodeの拡張機能開発は初めてでしたが、とても開発が楽で3時間程度で完成してしまいました。また何か思いついたら作ろうと思います。
Qiitaの記事にみるKaggleとSIGNATEの違い

1年前、機械学習の研修に参加しました。せっかく学んだことは忘れないうちに実践せなあかんとKaggleを考えてはみたものの、英語が大の苦手で、日本に似たようなものはないんかと探して出会ったのがSIGNATEでした。そして今になってQiitaでタグ検索という調べ方を知りました。いろんな記事があります。ついでにKaggleとSIGNATEを比較検証してみました。使ったツールはNode-REDとQiita APIです。

## 1.タグ数の違い
まずは[SIGNATE]から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/262692e5-3b75-caf0-e5b8-0d5d5aecc624.png)
|  https://qiita.com/api/v2/tags/SIGNATE  |
| :--- |

記事の数は88個。縁起よろしいですやん。して
次は[Kaggle]。[KaggleAPI]は同じようなものやし割愛します。
|  https://qiita.com/api/v2/tags/Kaggle  |
| :--- |

記事の数は･･･<font color="red">1201</font>?!　やるやないかい、さすがは世界のKaggle様や。せやけどSIGNATEかてまだまだ負けてへんで。

## 2.最近の記事の投稿状況
設立はKaggleが2010年で、SIGNATEは2017年。記事の総数が違うのは仕方がないんやと思います。それやったら最近1年間の記事数で勝負ですわ。それぞれタグ付けされた最近1年間の記事でストックは5以上。あ、またフローが同じでこれではNode-REDの勉強にはなりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/262692e5-3b75-caf0-e5b8-0d5d5aecc624.png)

今度はKaggleから。
|  https://qiita.com/api/v2/tags/Kaggle  |
| :--- |

結果は25件。毎月2本のペースでKaggleに関する記事がアップされてる感じですね。

では、SIGNATE。
|  https://qiita.com/api/v2/items?page=1&per_page=90&query=tag%3ASIGNATE+created%3A%3E2021-10-18+stocks%3A%3E4  |
| :--- |

え?!　1本。調べてみたらストック数5以上のハードルが高かったせいで、記事は14本アップされていました。まあ、利用者数の違いということですかね。

## 3.最後に
SIGNATEに登録して半年。最近コンペティションの数が少ないような気もしますが、新しいのが出たら積極的に参加して、今後はQiitaに記事を載せたり質問をしたりして盛り上げたいと思います。
なぜ親クラスのデストラクタは仮想関数にしなければならないのか

***追記***
追記をここに示していきます。
コメントにて、間違いを教えていただきました。（2022/10/19）→ 追記１

**はじめに**
私がC++で継承について勉強していた時に、ある人に「親クラスのデストラクタには仮想関数にしないといけないらしいよ」と言われたので、それはなぜなのか調べました。

**検証**
まず、仮想関数にではないデストラクタで結果を見てみました。
~~~
#include <iostream>

#include "Parent.h"
#include "Child.h"

int main()
{
	std::cout << "メインが実行されました";;

	// Parentのインスタンス
	Parent* abc;

	abc = new Child;

	delete abc;
}
~~~
~~~
class Parent
{
protected:

public:

	Parent()	{ std::cout << "Parentの「コンストラクタ」が実行されました"; }
	~Parent()	{ std::cout << "Parentの「デストラクタ」が実行されました"; }
};
~~~
~~~
class Child : public Parent
{
private:

public:

	Child()	 { std::cout << "Childの「コンストラクタ」が実行されました"; }
	~Child() { std::cout << "Childの「デストラクタ」が実行されました"; }
};
~~~
実行してみた結果...
~~~
メインが実行されました

Parentの「コンストラクタ」が実行されました

Childの「コンストラクタ」が実行されました

Parentの「デストラクタ」が実行されました
~~~
となりました！
ここで、一つ呼ばれていない処理があります。
Childのデストラクタですね。
では次に、Parentのデストラクタを仮想関数にしてみます。
~~~
class Parent
{
protected:

public:

	Parent()	{ std::cout << "Parentの「コンストラクタ」が実行されました"; }
	virtual ~Parent()	{ std::cout << "Parentの「デストラクタ」が実行されました"; }
};
~~~
実行結果は...
~~~
メインが実行されました

Parentの「コンストラクタ」が実行されました

Childの「コンストラクタ」が実行されました

Childの「デストラクタ」が実行されました

Parentの「デストラクタ」が実行されました
~~~
呼ばれました！
仮想関数にしなければいけないのは子クラスのデストラクタを実行させるためだったのでしょう。

**おわりに**
今回は親クラスのデストラクタを仮想関数にしなければいけない理由について探っていきました。
このページで紹介しているのはあくまで、一学生である私が試したものであるため、本来の理由は違っているかもしれませんのでお気を付けください。

***参考資料***
未定義について
https://trap.jp/post/538/

***追記１***
Childクラスのデストラクタが呼ばれていないのは、宣言の時にParentクラスのポインタで宣言しているため、デストラクタ実行の際にParentのデストラクタが参照されます。それが原因で、そのデストラクタが仮想関数でないと、Childのデストラクタを参照できないとのことです。
理屈的には、いつもの仮想関数の使い方と同じですが、デストラクタや、コンストラクタの呼ばれ方が厄介なだけに難しくなっています。

***追記２***
未定義動作についてですが、C＋＋では人によって手元の結果が変化したりする動作があります。
その場合、動作の種類として三つの種類が定義されていて、そのうちの未定義動作というのは企画で動作が定められていないようです。
実行結果が毎回変わったりする場合は未定義動作を疑うべきだそうです。
Pythonに パラメータとして日付を渡してみました - 第二弾

## 概要

データ分析において、データ抽出に日付を指定したくなります、、、、そんな理由でサクッと作ってみました。の第二弾！ Azureの請求データを CostManagement から取得するときに年月日を範囲として指定するときの利用を想定しています。

ちなみに、[第一弾の記事はこちらになります](https://qiita.com/turupon/items/022cc53a086edb8e58d0)

### 実行環境

macOS Monterey 12.3.1
python 3.8.12

### 実行プログラム

```python:QueryTimePeriod.py
from datetime import *
import argparse

# パラメータ日付の確認
def check_time_period(fm_tp, to_tp):
    try :
        fm_datetime = datetime.strptime(fm_tp, '%Y-%m-%d')
        to_datetime = datetime.strptime(to_tp, '%Y-%m-%d')

        if to_datetime < fm_datetime :
            print("Error ---> 開始日 ≦ 終了日 ")
            return False
        else :
            return True
    except ValueError as e :
        print("ValueError = ", e)
        return False

# 画面表示
def period_to_display(fm_tp, to_tp):
    print(fm_tp)
    print(to_tp)
    print("")

# メイン
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='パラメータに年月日を渡す')
    parser.add_argument('-f', '--fm', type=str, required=True, help='データを取得する開始日(yyyy-mm-dd)')
    parser.add_argument('-t', '--to', type=str, required=True, help='データを取得する終了日(yyyy-mm-dd)')
    args = parser.parse_args()

    if check_time_period(args.fm, args.to) == True:
        print("OK", "\n")
        period_to_display(args.fm, args.to)
    else :
        print("NG", "\n")
```

### プログラムのHELP表示
 
```
$ python QueryTimePeriod.py -h
usage: QueryTimePeriod.py [-h] -f FM -t TO

パラメータに年月日を渡す

optional arguments:
  -h, --help      show this help message and exit
  -f FM, --fm FM  データを取得する開始日(yyyy-mm-dd)
  -t TO, --to TO  データを取得する終了日(yyyy-mm-dd)
```

### プログラムの実行（正常）
 
```
## From日付とTo日付を同日定義
$ python QueryTimePeriod.py -f 2022-09-25 -t 2022-09-25
OK 

2022-09-25
2022-09-25


## From日付とTo日付に異なる日付を定義
$ python QueryTimePeriod.py -f 2022-09-25 -t 2022-09-30
OK 

2022-09-25
2022-09-30
```

### プログラムの実行（異常）

```
## From日付のみ（To日付のみ）指定
$ python QueryTimePeriod.py -f 2022-09-25              
usage: QueryTimePeriod.py [-h] -f FM -t TO
QueryTimePeriod.py: error: the following arguments are required: -t/--to


## 間違った日付フォーマットで定義
$ python QueryTimePeriod.py -f 2022-09-25 -t 2022/09/30
ValueError =  time data '2022/09/30' does not match format '%Y-%m-%d'
NG 


## 存在しない日付を定義
$ python QueryTimePeriod.py -f 2022-09-25 -t 2022-09-31
ValueError =  day is out of range for month
NG 


## From日付よりTo日付が過去として定義
$ python QueryTimePeriod.py -f 2022-09-25 -t 2022-09-14
Error ---> 開始日 ≦ 終了日 
NG 
```

### まとめ

これでAzureの請求データを期間指定で取得するための準備は完了です。また、[ここの説明](https://learn.microsoft.com/ja-jp/rest/api/cost-management/query/usage?tabs=HTTP#querytimeperiod) から 時分秒の指定 がなくとも 日付のみ でその日の 23:59:59 までのデータをすべて取得できるようです。
async,await,Task<T>,Task

## 同期メソッド

### メソッドの中で非同期メソッドを使う

以下のようにする

```csharp
int Method(){
    var result = Task.Run(()=>{
        // ここで非同期メソッドを呼び出す
        return service.AsyncMethod();
    }).GetAwaiter().GetResult();
    return result;
}
```

### メソッドの中で非同期メソッドを使わない

非同期以前の書き方でよい

```csharp
int Method(){
        return service.AsyncMethod();
}
```

## 非同期メソッド

### メソッドの中で非同期メソッドを使う

メソッドを `async` で修飾し、非同期メソッド呼び出しに await をつける。戻り値は Task&lt;Tresult> か void なら Task とする。

```csharp
async Task<int> Method(){
    var result = await service.AsyncMethod(); 
    return result;
}
```


### メソッドの中で非同期メソッドを使わない

`async` にせず、戻り値を Task&lt;TResult> とし、Task.FromResult(value) か Task.CompletedTaskを返す。

```csharp
Task<int> Method(){
    var result = service.Method(); 
    return Task.FromResult(result);
}
```
C#で処理時間を計測する方法

# C#で処理時間を測ろう

とある日の業務で、
「この処理にかかる時間を測ってほしい」という要望が来ました。

思ったより実装に時間がかかりましたが、
実際にコードでは以下のようになります。

```C#:test.cs
//開始時間の取得
DateTime start = new DateTime();
start = DateTime.Now;

//終了時間の取得
DateTime end = new DateTime();
end = DateTime.Now;

//差分を取得
TimeSpan logTime = end - start;

//結果を出力
Console.WriteLine("測定結果：{0}秒",(logTime.TotalMilliseconds/1000)); 

```

# まとめ
TimeSpan.TotalMillisecondsでミリ秒を取得できるので後は、
秒数に変換するために1000で割ってあげれば完成です。

DateTime型同士を減算すると、TimeSpanが返されるみたいです。
そこに気付けず沼にハマってしまいました・・・。
調べていくうちに出会った
この言葉ですっきりしました。
DateTImeは時刻を表すオブジェクト。
TimeSpanは時間を表すオブジェクト。

最近サボり気味でしたが、これから頑張って投稿していこうと思います。

最後に自分がプロジェクトリーダーとして参画した製品の宣伝だけしておきます。(笑)
M365を使っている会社様向けのチャットボットになっています。
技術的には面白いものをいっぱい扱っているのでいつかQiitaでも記事にしたいと
思います。
[HolaBotについて](https://www.mahty-solutions.com/holabot)
Ubuntu 18.04 にArduPilot SITLシミュレーターをインストール

この記事では、Ubuntu 18.04 にArduPilot SITLシミュレーターをインストールする手順とトラブルを共有します。

# ArduPilot SITLとは
ArduPilotのドローン実機なくても、開発とテスト検証できるシミュレーターソフトウェアSITL Simulator (Software in the Loop)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/83aa7139-0339-3a8b-267d-f4b8621b17cf.png)


https://ardupilot.org/dev/docs/sitl-simulator-software-in-the-loop.html#sitl-simulator-software-in-the-loop

# インストール手順

Clone ArduPilot repository¶
```
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
```

Install some required packages¶
```
Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile
```

compile
```
./waf configure --board sitl
./waf copter
```

# SITLを起動

```
cd ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py -w
パラメータの書き込み更新完了後、Ctrl-Cで上記コマンドを終了します。
再度sim_vehicle.pyを実行します。
../Tools/autotest/sim_vehicle.py --console --map

指定したHomepointで起動する場合、-l オプションで緯度経度を指定して起動できます。
-l CUSTOM_LOCATION, --custom-location=CUSTOM_LOCATION
                    set custom start location (lat,lon,alt,heading)

../Tools/autotest/sim_vehicle.py --console --map -D -l 35.6844910,139.7121530,15,5
```

# トラブル

「Tools/environment_install/install-prereqs-ubuntu.sh -y」のインストール途中で下記エラー発生しました。

TypeError: 'encoding' is an invalid keyword argument for this function

```
  Using cached dronecan-1.0.16.tar.gz (97 kB)
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ePZxjD/dronecan/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ePZxjD/dronecan/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-kK64Ti
         cwd: /tmp/pip-install-ePZxjD/dronecan/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-ePZxjD/dronecan/setup.py", line 19, in <module>
        with open("README.md", "r", encoding = "utf-8") as fh:
    TypeError: 'encoding' is an invalid keyword argument for this function
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
WARNING: You are using pip version 20.3; however, version 20.3.4 is available.
You should consider upgrading via the '/usr/bin/python -m pip install --upgrade pip' command.
```

デフォルトでは、python2.7になっているの原因です。python3.7等のバージョンに切替必要です。

```
$ /usr/bin/python -V
Python 2.7.17

$ ll /usr/bin/python
lrwxrwxrwx 1 root root 9  4月 16  2018 /usr/bin/python -> python2.7*

sudo rm -rf /usr/bin/python

sudo ln -s /home/k-koh/miniconda3/bin/python /usr/bin/python

$ /usr/bin/python -V
Python 3.7.0
```
連想配列内の1つの値(配列)のみ階層を深くする方法

## 概要
業務で連想配列内の一部の値のみ、階層を深くする必要のある実装を行う必要がありました。今までは、`パターン1`のやり方で実装しておりましたが、`リーダブルコード`を読んでから、質が高く綺麗で分かり易いコードを書くにはどうしたら良いんだ考えており、`パターン1`の書き方は絶対に使いたくありませんでした。
なかなか、色々な記事を調べてもヒットしなくて途方に明け暮れておりましたが、急に閃いて実装ができました。
もし、同じ様な悩みをお持ちの方がいらっしゃるかもしれないと思い、記事に残しました。

```php
// パターン1(以前までの書き方)
$test['sample']['level1']['level2'] = 'test1';
$test['sample']['level1-1'] = 'test2';
$test['sample']['level1-1-1'] = 'test3';
```

- 連想配列内に`key`と`value`を記述配列を用意するだけで、1つだけ階層の深い連想配列を分かり易い書き方で表現できます。
 ```php
// パターン2(新しい書き方)
$test['sample'] = [
    'level1' => ['level2' => 'test1'],
    'level1-１' => 'test2',
    'level1-１-１' => 'test3',
];
```

## まとめ
- 基本的な事ではあるかもしれないですが、ご参考になれば幸甚です。

## 参考記事
- [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?adgrpid=52747835709&gclid=CjwKCAjw-rOaBhA9EiwAUkLV4m2VRwdGn2SN7_tvtcJpBqNuxLEitaFB1g05VFGfvY_LnUG5rbi4bxoC4sMQAvD_BwE&hvadid=611266707015&hvdev=c&hvlocphy=1009423&hvnetw=g&hvqmt=e&hvrand=10210010586750040134&hvtargid=kwd-334307148361&hydadcr=16038_13594017&jp-ad-ap=0&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&qid=1666023971&qu=eyJxc2MiOiIxLjk1IiwicXNhIjoiMC43NiIsInFzcCI6IjAuODgifQ%3D%3D&sr=8-1)
sarコマンド、sadfコマンドについて

●sarコマンド
sadcコマンドが収集した様々な情報を表示するコマンド。
sadcコマンドはcronの設定により定期的に実行され、収集した情報は「/var/log/sa/saXX」ファイルに書き込まれる。（「XX」は数字で日付を表す。）
「-f」オプションで読み込むログファイルを指定。ログファイルを指定しない場合は、当日のログファイルが利用。

※表示間隔と回数を指定すると連続して最新の状態を表示。

sar [オプション] [表示間隔(秒) [回数]]

オプション
・-u CPU使用率を表示
・-P 番号|ALL 指定したCPUの使用率を表示
・-r 物理メモリの使用状況を表示
・-S スワップ領域の使用状況を表示
・-b ディスクI/Oの情報を表示
・-n DEV|EVEV ネットワークI/Oの情報を表示。(DEVは正常,EDEVはエラーパケットについて)
・-f ファイル名　データを取り出すログファイルの指定

■sarコマンドはsadcコマンドで保存したバイナリデータをテキスト表示するコマンド。
定期的な実行を比較的簡易に導入できる/usr/lib/sa/sa1,/usr/lib/sa/sa2というスクリプトが用意されており、sa1はsadcの定期的な実行を、sa2はsarの定期的な実行を設定できる。


●sadfコマンド
sarコマンドで収集したデータは、sadfコマンドを使って様々な形式に変更できる。
sadfコマンドは、sarコマンドのオプションを指定して渡し、結果の出力を整形できます。

sadf [オプション] [対象データ] -- [sarのオプション]

主なオプション
・-j JSON形式で出力
・-x XML形式で出力
・-H ヘッダ情報を表示


●netstat
ネットワークの状態に関する情報を表示するコマンド。
「-s」オプションを使用するとプロトコル毎にパケットの送受信に関する情報を表示
vueのライフサイクルのまとめ

vueの学習をしている際に、
vueのライフサイクルについて学習したのでまとめます。

1.Vueインスタンスの生成(new vue が生成された際)

(前) beforeCreate = リアクティブデータが初期化される前に呼び出される
(後) created       リアクティブデータが初期化された後に呼び出される

2.DOMへのマウント(生成されたVueインスタンスがDOMにマウントされる、コンポーネントがHTMLの要素に反映される)
(前) beforeMount   DOMにマウントされる前に行われる
(後) Mounted       DOMにマウントされた後に行われる

3.データの変更/画面の更新(vueインスタンスのdataが変更、propsで渡されているデータが親で変更されたタイミングで
DOMを自動的に更新し再描画する)
(前) beforeUpdate　DOMが更新される前に行いたい処理
(後) Update = DOMを更新した後に行いたい処理

4.Vueインスタンス破棄(v-ifやv-forなどの機能によりインスタンスが表示されなくなる(破棄)されるタイミング
(前) beforeDestroy = vueインスタンスが破棄される前
(後) Destroy = vueインスタンスが破棄された後
中学1年生がブックマーク拡張機能作ってみた

## 初めに
こんにちは、
前回の国旗のまとめサイトを作ってみたっていうのがすごい好評だったので
今回は、chrome拡張を作ってみました！
コードはこちらです！

https://github.com/sugoruru/chrome-expansion-tab-edit

使用言語:javascript
開発環境:windows11-VSCode
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783198/a145aced-0942-feed-f6e8-13ffaee3dcf8.png)
～完成はこんな感じです～
# 作り方
今回はindexedDBを活用してみました
indexedDBの取得ー書き込みー削除を使って簡易的に
ブックマークをわかりやすくできるものを作成しました！
それと、今回ロゴを表示するにあたってこちらのapiを使ってみました

https://logo.clearbit.com

こちらのサイトのパスにURLを入れるとそのサイトのロゴが出てくるというものです。

## 作ってみた感想
前使っていたブックマーク拡張機能は制限が少しあって使えない部分もあったのですが、
自作するとそれがなく、それがすごいメリットだと思いました！
この拡張機能は３時間程度で作ったのでまだまだ改善の余地はありそうです！

それと、この前つまずいたgithubへのデプロイがすぐにできたのが成長を感じられました～

あとは、前と同様、UIのシンプルさを大切にしました！

これからも不定期で作ってみた記事を投稿するので見守っていただければと思います！
今回も短いですがこれで終わります、
ありがとうございました～
DMM apiの使い方（自分のデータベースを作る方法）

※本記事は成人向けのサイトに使った技術についてです。
<h2>実現したかったこと</h2>
DMM apiではソートできないものがあったので独自のデータベース（以下DB）を作りたかった。

例：女優apiでできない誕生日での抽出など
<h2>実装環境</h2>
・mixhostレンタルサーバー
・Wordpress（テーマcocoon）使用
・FileZilla Clientでphpファイル設置
<h2>使用言語</h2>
・SQL
・php
・javascript
<h2>javascriptでやること</h2>
概要：phpとDMM apiの橋渡し
<pre>function main(){
宣言省略


for(let k=1 ; k<”総女優人数” ; k=k+100|0){
・

let url = "”DMM apiにアクセスするためのurl”";
・
fetch(url).then( function(response) {
  return response.json();
}).then(async function(json) {
・
for (let i = 0 ; i < json.result.actress.length ; i++) {
・
act_id=json.result.actress[i].id;if(act_id==null){act_id=""};
name=json.result.actress[i].name;if(name==null){name=""};
ruby=json.result.actress[i].ruby;if(ruby==null){ruby=""};
bust=json.result.actress[i].bust; if(bust==null){bust=""};
cup=json.result.actress[i].cup;
waist=json.result.actress[i].waist; if(waist==null){waist=""};
height=json.result.actress[i].height; if(height==null){height=""};
birthday=json.result.actress[i].birthday; if(birthday==null){birthday=""};
blood=json.result.actress[i].blood_type; if(blood==null){blood=""};
、、


//phpファイルを指定してパラメータ状に値を渡す
let urlphp='https://masanblog.net/”phpファイル名”/?actid='+act_id+'&name='+name+'、、、、;
　
fetch(urlphp).then(function(response) {
 
}).then(function(jsonphp) {

});

　




}//for
})//json
};//k
};//main
</pre>
<h3>javascriptを細かく解説</h3>
やっていることは単純で

1. fetch通信を利用してDMM apiを呼び出し変数Aに欲しい値を代入
2. fetch通信を利用して自ドメインのphpファイルを読み出しパラメータで値を受け渡す

をしているだけです。

ちなみに他の方法をしってる方。ご教授ください！この方法はDB一行分を一回の通信としているため結構時間がかかるのです。

<h2>phpでやること</h2>
 概要：受け取ったデータをSQL文を使用してDBに挿入
<pre>
$act_id = $_REQUEST['actid'];
//以下省略
　
try {
//DBに接続
$pdo = new PDO(
'DB名'
'ユーザー名'
'パスワード'
// レコード列名をキーとして取得させる
[PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
　
// SQL文をセット
$stmt = $pdo->prepare('INSERT INTO act (act_id,name,ruby,、、) VALUES(:act_id,:name,:ruby,:bust、、、);
 　
   // 値をセット
$stmt->bindValue(':act_id', $act_id)
以下省略
　
// SQL実行
$stmt->execute();
}catch(PDOException $e) {
//エラー処理
echo $e->getMessage();

}finally {
    // DB接続を閉じる
    $pdo = null;
}

</pre>
※phpファイルはテキストファイルを作った後に拡張子をphpに変更することで作成できる
<h3>phpを細かく解説</h3>

1. 受け取ったデータを変数に代入（$act_id = $_REQUEST['actid'];
1. PDOを使用してDBと接続
1. $pdo->prepareを利用してSQL文をセット
1. bindValueでSQL文の変数に値をセット
1. $stmt->execute();でSQLを実行しDBに一行追加
1. DB接続を切断

<h2>phpファイルの設置場所</h2>
FileZillaを使用

public_htmlの直下に設置





以上となります。
<h2>まとめ</h2>
javascriptはともかくphpやsql、通信と言われると警戒するかもしれませんが効率をあまり求めないのであれば一つ一つの部品はネット上に紹介されています。今回の記事もその一つとして参考になれば幸いです。
<h2>サイトについて</h2>
<a href=https://masanblog.net/av-actress-pictorial-book/>fanza女優図鑑</a>はfanzaサンプル動画のコンテンツの一つです。<br><br>
 fanzaサンプル動画はポップアップで出演女優・サンプル画像が一発で探せたり、女優図鑑ではカップ検索・誕生日検索など様々な検索ができます。<br><br>
どちらかというとスマホ用です。（改めまして、成人向けなので注意してください。）
<br><br>
次回は作ったDBの使い方です。
[UE4]TextをBindを使用せずに更新する

# 0.始め


UE4でTextをBind使用せずに更新したい！！！！！！！！

ゲームを制作していると「プレイヤーのHP」や「制限時間」など
int or floatを画面上に表示したい場合があると思います。
(自分がUEを初めて触った時このやり方がわからず2週間ぐらい悩みました...)

今回は更新する方法を記事としてまとめてみます。
(自分用のメモを兼ねて...)

他に「こんなやり方があるよ！」などご意見がございましたらコメントにてよろしくお願いします！

# 1.実装
実装はシンプルに！
「今回はプレイヤーのHPを減らし、Textを更新する」を目標にやってみます。
実装は以下の通り![記事1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/0519a801-1491-ca10-b10d-8f7be0148966.png)

簡単ですね！

# 2.結果
実際の動きを見てみましょう。
Spaceキーを押すと10ダメージを受ける想定です。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/505a83a1-2464-26b6-ae12-a0e260a0063a.gif)

# 3.解説?
レベル内のBPで初期化をして、スペースキーに反応して計算結果を反映している感じです。
実際のゲームになると

・HPからDamageを引いて0以下か？を判断して適切な処理をいれる
・更新がかかった時に「増加」「減少」を判断してアニメーションを変えてみたり

上記のような処理を入れるとより良いUIになると思います。

![記事2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/779db4f1-f835-e04d-fa15-f21eb10b6b4f.png)


# 4.その他
タイトルに書いてあるBindですがこれ毎フレーム更新が入るみたいです。
毎フレームはさすがに余計なので" 必要な時に必要な処理を呼ぶ "
これを心がけて実装したいですね。
Azure Logic Apps から起動した FastAPI の BackgroundTasks の完了をタイムアウト時間制約を超えて見守り続ける

非同期なタスクが作成された場合の話です。
タスクを受け取った web server が 202 を返して、クライアントは 202 を以って処理を完了する(タスクの終了までを見守らない)パターンって結構あると思います。
今回は上記のパターンではなく、"クライアントからタスクが完了するまでを見守り続けること"を FastAPI の BackgroundTasks と Azure Logic Apps で検証して、Logic Apps のタイムアウト時間制約を超えて見守り続けることができたことに関して書きます。

# 前提: Azure Logic Apps の HTTP リクエストのタイムアウト時間に関して
マルチテナントだと 2 分でタイムアウトします。
https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-limits-and-config?tabs=azure-portal#timeout-duration

# タイムアウト時間を超えて見守る"ポーリング アクション パターン"

詳しくは [このlearn](https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-create-api-app#perform-long-running-tasks-with-the-polling-action-pattern) を見て欲しいのですが、要点は

- クライアントからの HTTP リクエストの設定で非同期設定を ON にする
    - ![スクリーンショット 2022-10-17 14.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/38e0710c-9ba2-f297-f389-c3ca550b8e51.png)
- タスクを受け取った際、web server から 202 のステータスコードと "タスクのステータスが分かるURL" を返させる
- クライアント は "タスクのステータスが分かるURL" がステータスコードを200を返すまでポーリングし続ける
- "タスクのステータスが分かるURL" が 200 を返すと、Azure Logic Apps の HTTP リクエストの結果も成功になる

です。

web server (FastAPI) 側の実装は以下のようにしました。
BackgroundTasks の実装は [こちらの記事](https://qiita.com/juri-t/items/91e561509aa7ca6e7d38) を流用させて頂いております :bow_tone2:

```python
# import は省略します

class Job(BaseModel):
    job_id: int
    def __call__(self):
        jobs[self.job_id] = self
        try:
            for _ in range(300):
                sleep(1)
            del jobs[self.job_id]
        finally:
            print("時間のかかる処理が終わりました")

jobs: dict[int, Job] = {}

@app.post("/api/{job_id}/", status_code=status.HTTP_202_ACCEPTED)
async def start(job_id: int, background_tasks: BackgroundTasks):
    t = Job(job_id=job_id)
    background_tasks.add_task(t)
    return JSONResponse(
        status_code=status.HTTP_202_ACCEPTED,
        content={},
        headers={"Location": f"https://example.com/api/{job_id}/"},
    )

@app.get("/api/{job_id}/")
async def get_status(job_id: int):
    if job_id in jobs:
        return JSONResponse(
            status_code=status.HTTP_202_ACCEPTED,
            content={},
            headers={"Location": f"https://example.com/api/{job_id}/"},
        )
    else:
        return JSONResponse(status_code=status.HTTP_200_OK, content={"message": f"{job_id}は実行していません"})

```

# Azure Logic Apps から HTTP リクエストを送ってみた結果

Azure Logic Apps から HTTP リクエストを送ってみた結果、 5分後に成功となりました。
- ![スクリーンショット 2022-10-17 14.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/bd3097ec-ea35-5ede-2821-2a1911345a13.png)

# 余談
202 のステータスコードを受け取った場合、location ヘッダーのURLを見てポーリングを続ける のはRFCなどで決められた挙動なのかどうかが気になりました。調べてみると、RFCの202の仕様の解釈をめぐり、皆さん議論を重ねているみたいです:information_desk_person:

- https://tex2e.github.io/rfc-translater/html/rfc7240.html の 4.1. 「応答非同期」設定
- https://stackoverflow.com/questions/26199228/is-the-use-of-location-header-in-http-202-response-rfc-compliant
node js基礎終わり。

<h1>htmlだと面倒な複数作業が一気に効率化した</h1>
プログラミングチュートリアルさんというyoutubeに動画を載せている方がいて簡単なお天気アプリの作成からnodejsのデプロイ方法を載せていたので復習もかねて見てみる。楽しそう。早く実際に何か物を作りたい。

<br>話はずれるが、よくapp storeやgoogle playで見かけるいわゆる“くそげー”の制作に関する面白い話を聞いた。映画が理論的に「何時間何分の時にこういう行動を起こす」と人は最も感動するといった具合に、ある程度くそげーも論理化されて作成されてきている話を聞いたので、一度作成してみたい。日本人向けに作るならappstoreで、上位にあるゲームのプログラムを覗いてマネするのがよさそう。
VSCode 1.72のリリースノートでこれいいなと思った機能

少し前にVSCode 1.72がリリースされました。
リリースノートに毎回軽く目は通しているのですが、今回は自分が使いそうな機能でいいなと思った機能を紹介します。

https://code.visualstudio.com/updates/v1_72

# ファイルのツールバーから不要なものを隠す

どうやって使うかはこちらの動画を見てください。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_hide-actions-from-tool-bars)

拡張機能を追加していくと、開いているファイルのタブの横に出てくるツールバーがいっぱいになってしまいます。
必要だから追加してるんですが、ツールバーから使わない機能もありますよね。
そのときにアイコン自体のコンテキストメニューを表示すると、アイコンを隠すメニューが表示されるようになりました。
使いたい機能だけ残せるので便利ですね！
なお、非表示にした機能はリセットすることで再度表示することができますのでご安心を。

# ドラッグでのエディタのスクロールスピード改善

エディタ内でドラッグしたときに画面外にカーソルを持っていくとエディタがスクロールしてたのですが、スクロールスピードがアップしました。
地味にありがたいですねー。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_improved-autoscroll-behavior)

# ホバーで表示されたツールチップのスティッキー表示

エディタ内でコードにホバーしたときにツールチップが表示されることがあると思いますが、微妙にカーソルがずれるとツールチップが非表示になって不便でした。
これが多少カーソルが外れたところに動いても非表示にならないようになりました。
こちらもイライラポイント解消ですね。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_improved-hover)

# 拡張機能の更新通知

拡張機能タブで更新が通知されるようになりました。
更新にリロードが必要なものはリロードボタンが表示されます。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_extensions)

# プロジェクト内の検索結果がツリー表示対応になりました

こちらもどうやって使うかは↓の動画を見てください。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_tree-view-find-control-improvements)

プロジェクト内で検索すると検索結果がリストで表示されていましたが、ファイルへのフルパスが長すぎると省略されてしまってホバーしたりしないとどのファイルかわかりませんでした。
これがツリー表示されるようになってどのディレクトリのファイルかわかりやすくなってます！
ホント助かります。ありがたや～

# ターミナル関連

VSCode内のターミナルでGitコマンドを使用する時に便利なヘルパー機能が追加されました。
QuickFixっていう名前の機能っぽいですね。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_terminal-quick-fixes)

## GIT SIMILAR COMMAND

Gitコマンドを打ち間違えたときに、正しそうなコマンドをサジェストしてくれます。
コマンドの打ち直しが簡単になりますね。

## GIT CREATE PR

ブランチを最初にプッシュしたときにPRを作成するリンクが表示されます。
運用によっては初回プッシュで即PR作ることは少ないかもしれないですが便利ですねー。

# Markdown内のリンクをバリデーションしてくれる

Markdown内のリンクでファイルが無かったり、リンクが間違っているときにエラーメッセージが表示されるようになりました。
こちらは`"markdown.validate.enabled": true`というようにオプションを設定しないと有効にならないようです。
[リリースノートへのリンク](https://code.visualstudio.com/updates/v1_72#_markdown-link-validation)


以上ですが、かゆいところに手が届く修正が色々あって更に便利になりましたね！