OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者必見】php 変数名の付け方

# ■はじめに
この記事は、まだPHPの学習中の筆者が書いています。
学習中、問題を解いているだけでも、様々なエラーにぶつかります。
私と同じように学習している周りは普通にできることも、私はできないの？とか、私向いてないじゃないかと思った時に、私は、時間がかかっても、変数名をつけるようになりました。
その結果、"型が違いいます"とういエラーを激減させることができました。
同じような境遇の方たちに、ぜひ読んでほしいです。

- [変数の命名規則について](#■変数の命名規則について)
-  -  [名前の記法ルール](#名前の記法ルール)
- [きれいな変数名を付けるための『５つのこと』](#■きれいな変数名を付けるための『５つのこと』)
-  [まとめ](#■まとめ)
-  -  [最初に工夫したこと](#最初に工夫したこと)
-  -  [最近変わった工夫の内容](#最近変わった工夫の内容)
-  -  [最近感じるようになったこと](#最近感じるようになったこと
)

# ■変数の命名規則について

コーディングは、後から修正するときに読みやすくするためのルールに則って行われます。
コーディング規約PSRの命名規則( https://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.php )には、次のものがあります。

・クラス名はパスカルケースで記述する。
・クラス定数名はコンスタントケースで記述する。
・関数名はキャメルケースで記述する。

一番よく使われる変数については規則を作っていないようです。
今回は、変数名についてです。

変数名は自由につけることができますが、分かりやすいコードを書くためにも、いくつか気を付ける点があるので、紹介します。
命名するときに気を付ける点は以下の通りです

変数の命名規則は4つある
　1. 規則１：「＄変数名」の形式で書く
         　　　　　　　変数名の先頭には「$」を付けます。
       　　　　　　 「なぜ？」「なんでつけるの？」
        　　　　　　　理由は『変数ですよ！』って一目でわかるようにするためです。
            
　　　2. 規則２：１文字目は「文字」or「＿」（※数はダメ！）
　　　　　　　　変数名の１文字目は「文字」or「アンダースコア(＿)」でつけましょう。
　　　　　　　　数字や(＿)以外の記号はNGです。
　　　　　　　　※アンダースコア(＿)は英数字     

　　　3. 規則３：2文字目以降は、数値を使っていい！
　　　　　　　　2文字目以降は、数値を使うことができます。
　　　　　　　　先ほど言っていたのは、「名前の先頭に付けてはいけない」ということです。

　　　4.規則４：「大文字」と「小文字」は区別される
　　　　　　　　PHPでは、大文字と小文字は区別されます。
　　　　　　　　例えば、「val」と「Val」は別物ということです。
　　　　　　　　ちなみにですが、「print」「sort」など、PHPにあらかじめ繰り込まれている関数は区別されません。 

# ■きれいな変数名を付けるための『５つのこと』

| No | 項目 | 良い | 悪い |
|:-:|:-:|:-:|:-:|
| 1 | 人目で分かる|score, birth|　 m,n |
| 2 |長すぎず短すぎず|password,name|pw,handle_name   |
| 3 |ローマ字はNG|name,age|namae,nenrei|
| 4 |紛らわしい見た目にしない|   |tel/Tel(大文字小文字の区別), user/user(１文字違い)  |


  長すぎず、短すぎず
むやみに省略するのはよくありません。
とはいえ、長すぎる変数名も良くありません。

## ■名前の記法ルール

| 記法| 概要 | 例 |
|:--|:--|:--|
|camelCase記法|先頭文字は小文字、その後、単語の区切りを大文字で表記|$username|
|Pascal記法|先頭文字も含め、すべて単語の頭文字を大文字で表記|$UserName|
|アンダースコア法|全ての文字は小文字/大文字で表し、単語の区切りは、アンダースコア(_)で表記（スネークケース記法ともいう|$user_name|

 どれを使ってもいいですが、PHPの世界では以下のように使い分けがされています。 
| 記法| 用途 | 
|:--|:--|
|camelCase記法|変数/関数|
|Pascal記法|クラス|  
|アンダースコア法|定数|   


一つのポイントになるのが、変数は通常たくさん作られることです。
つまり、その分名前をたくさん考えないといけなし、タイピングも多くなります。

このことから、変数名にはタイピングしやすいパスカルケースやスネークケースが選ばれやすい傾向にあります。変数が全部大文字だとタイピングしにくいですよね。私自身、PHPの学習効率を上げるために、変数に名前を付けるようになりました。私は、PHPの学習中でキャメルケースを使っています。理由は単純で変数名の１文字目が小文字の方が、入力候補が出るまでを考えて効率がいいからです。それと、PHPであらかじめ繰り込まれている関数に、スネークケースを使用されているので、関数と識別しやすいと思ってキャメルケースを使っています

# ■まとめ
### ■最初に工夫したこと
その変数の型を表すstrやintなどを先頭の単語にして、キャメルケースにする場合もあります。例えば、strNameという変数を作ると、それがstring(文字列)型で名前を入れる変数であることの想像がつくと思います。型が分かるようにするのはエラーを防ぐのに有効です。型の間違いによる不具合を防げるからです。例えば、string(文字列)型にしか使えない関数、array(配列)型にしか使えない関数などが多数存在し、その度に起きていたエラーも減って、実際に学習の途中で、変数の中身がstring(文字列)型なのかarray(配列)型なのか、助けられました。

### ■最近変わった工夫の内容
今は、変数名を見て、どんな処理をするのか想定しやすいように、型を表すstrやintなど変数名を付けるという考え方をやめて、型名の代わりに〇〇の距離や〇〇の時間など、の名前をつけて、要素が複数入っている array(配列)型には、語尾に複数形の「s」を付けるようになりました。
結果、中身がstring(文字列)型なのかarray(配列)型なのかだけではなく、foreach文などで扱いやすくなりました、

### ■最近感じるようになったこと
PHPであらかじめ繰り込まれている関数に、スネークケースを使用されているので、関数と識別しやすいと思ってキャメルケースを使っていますが、これから先、webサイトなどを作成したりしていくに向けて、スネークケースの方がアンダーバーを入れるのか入れないのか、いちいち迷う必要がなく、とにかく単語の区切りにはアンダーバーを使うということが分かって、楽なのではないかと考えされることもあります。実際にWordPressなどは、全てスネークケースで記述されているようです。
グルメ横断検索サービスのプロト版を作ってみた

## 概要
グルメ横断検索サイトを作ってみたのでその紹介

## システム構成
![スクリーンショット 2022-12-23 3.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/0fde4c74-9ccf-2a77-c16c-a17143f61085.png)

今回はサーバーレスな形にしてみたかったのでバックエンドはLambda(Ruby)で記述しており、API GateWayを通じてAPI提供しています。
Lambdaの方から各種サイトに情報を取りに行き、その結果を返却するようにしています。
(どうやって情報とっているかなどは過去の記事を読んでください...)
またフロントエンドはAplifyを用いてホスティングしていて中身はVueで記述しています。

## サービス紹介
画面のデザインはVuetifyに丸投げしていて、このようにエリアとキーワードを受け取れる様になっており、
![スクリーンショット 2022-12-23 3.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/400d685d-f3ea-1df9-7fa8-ddc5dbef78a2.png)

入力して検索を実行すると
|食べログ|ぐるなび|Retty|
|-|-|-|
|![スクリーンショット 2022-12-23 3.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/0e08fa6a-4829-2ca1-5bcf-052e0475d2c2.png)|![スクリーンショット 2022-12-23 3.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/b165f41c-b7f7-eb93-c75f-cfb626b26280.png)|![スクリーンショット 2022-12-23 3.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/dcac845d-3a89-d525-518f-2e94ed5cd5f5.png)|

このような感じで各種サイトで検索した結果がタブ切り替えで簡単に見れるようになっています。

## 今後の展望

今後の展望としては、
- GoogleMapAPIの情報も取得する
- 地図上でどの場所にあるのか見れるようにする
- 各サイトで取得する情報の拡張(レビュー数や星の数など)
- 詳細ページに遷移できるようにする

など考えています...
アドベントカレンダーの最終日にはリリースしたいなと....思ってます...多分...
GithubのNetwork Graphを使ってみよう

## Gitのツールって便利ですよね。
私自身は

https://www.sourcetreeapp.com/


を使っています。
どのbranchがどうなってーとか使いやすいし、見やすいと思って愛用しています。
しかしほかにもいろいろいいツールはあるので、プロジェクトによっては人によって使うものがまちまちかなと思います。
<hr>

## Githubには標準でNetwork Graphというものがあるらしい

* アクセスの仕方
（画面上部）Insights -> （遷移先画面左部）Network

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/1bee5313-f9ba-78bb-ef91-1581b97de4db.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/4f30fe6c-f35c-9dfa-4f54-c278bcab7b11.png)

* 画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/8c6b7ab2-f08c-b78e-4ad5-01e69d60cdc9.png)

誰がいつどのbranchにpushしたかなど見ることができます。

## toolの話、言語の話は宗教戦争に発展することも
というわけでわざわざツールを入れないという選択肢は戦争に巻き込まれない分強いかもしれない。

備忘録としてこの記事を記載する。
Visual Studio Code のJupyter Notebookの配色をカスタマイズする方法（そのままコピペ可）

自分が使っているテーマはJupyter Notebookまで綺麗に作り込まれているものではなかったので以下の方法で変更しました。
コメントは翻訳機にぶち込んでいるだけなので、わかりやすい言い方ではないです。わからないところは色を変更して試してみてください。(ごめんなさい)

↓ VScode公式が出しているカラーテーマをカスタマイズする方法をまとめたドキュメントです。
[Theme Color](https://code.visualstudio.com/api/references/theme-color)

# settings.jsonのWorkbench: Color Customizationsをいじる
Windowsの場合
ファイル ＞ メニュー ＞ 基本設定 ＞ 設定
macOSの場合
Code ＞ メニュー ＞ 基本設定 ＞ 設定

検索窓に`Workbench: Color Customizations`を入力して検索。
以下のようなものが出てくるはずなのでsetting.jsonで編集をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664302/0f438ff6-b20c-c08d-3387-6466a63b3c6b.png)
以下を追加する。(setting.jsonに何も書かれていないことを前提としたものです)
```json
{
    "workbench.colorCustomizations": {
        "notebook.editorBackground": "#000000", // ノートの背景色。
        "notebook.cellBorderColor": "#000000", // ノートブック セルの境界線の色。
        "notebook.cellHoverBackground": "#000000", // セルをホバーしたときのセルの背景色。
        "notebook.cellInsertionIndicator": "#000000", // ノートブックのセル挿入インジケータの色。
        "notebook.cellStatusBarItemHoverBackground": "#000000", // ノートブック セルのステータス バー項目の背景色。
        "notebook.cellToolbarSeparator": "#000000", // セル下部ツールバーのセパレーターの色
        "notebook.cellEditorBackground": "#000000", // ノートブック セル エディターの背景色
        "notebook.focusedCellBorder": "#000000", // セルがフォーカスされているときのセルのフォーカス インジケーターの境界線の色。
        "notebook.focusedEditorBorder": "#000000", // ノートブック セル エディターの境界線の色。
        "notebook.inactiveFocusedCellBorder": "#000000", // 主なフォーカスがエディターの外にあるときにセルがフォーカスされている場合のセルの上下の境界線の色。
        "notebook.inactiveSelectedCellBorder": "#000000", // 複数のセルが選択されている場合のセルの境界線の色。
        "notebook.outputContainerBackgroundColor": "#000000", // ノートブック出力コンテナーの背景の色。
        "notebook.outputContainerBorderColor": "#000000", // ノートブック出力コンテナーの境界線の色。
        "notebook.selectedCellBackground": "#000000", // セルが選択されているときのセルの背景色。
        "notebook.selectedCellBorder": "#000000", // セルが選択されているがフォーカスされていない場合のセルの上下の境界線の色。
        "notebook.symbolHighlightBackground": "#000000", // ハイライトされたセルの背景色
        "notebookScrollbarSlider.activeBackground": "#000000", // クリックしたときのノートブック スクロールバー スライダーの背景色。
        "notebookScrollbarSlider.background": "#000000", // ノートブックのスクロールバー スライダーの背景色。
        "notebookScrollbarSlider.hoverBackground": "#000000", // ホバリング時のノートブック スクロールバー スライダーの背景色。
        "notebookStatusErrorIcon.foreground": "#000000", // セル ステータス バーのノートブック セルのエラー アイコンの色。
        "notebookStatusRunningIcon.foreground": "#000000", // セル ステータス バーのノートブック セルの実行中のアイコンの色。
        "notebookStatusSuccessIcon.foreground": "#000000", // セル ステータス バーのノートブック セルの成功アイコンの色。
    }

```
## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [Theme Color](https://code.visualstudio.com/api/references/theme-color)
- [Visual Studio Code の配色を好き勝手にカスタマイズした（settings.json）](https://qiita.com/deren2525/items/6bc099ae8c05e3076055)

# おわりに
テーマを上書きする形でこれらの設定が追加されるはずです。
自分好みにカスタマイズできてテンションが上がった方は、その勢いのままいいねをお願いします^^
2022年にアフィリエイトで改善されたBybitインターフェース

親愛なるパートナーの皆様
いつもBybitをご愛顧いただき、誠にありがとうございます。 Bybit は、Bybit から最新の更新情報を送信して、メンバーと共有できるようにしたいと考えています。
bybitの新番組
賞金がほぼ 25 BTC + 8 x iPhone 12 Pro 無料オファーの個人取引コンテスト。 Bybit Xmas Merchandise Box (Bybit Sweaters、Exclusive Bybit Socks、Bybit Tumbler)、8 iPhone 12 Pro、または 25 の BTC コンテスト賞品を含む限定出版物を受け取りましょう!
コンテストは 2020 年 12 月 2 日から 2020 年 12 月 23 日 (UTC 午前 10 時) まで開催されます。 UTC 午前 10 時に利用できるようにするためのリンク。
ギフト センターは、報酬を $90 から $100 に更新しました。 ボーナスは、より多くの顧客に報酬を与え、タスクを実行しやすくします! Gift Center のアップデートの詳細については、こちらをご覧ください。
最大500ドルの入金ボーナス。 特別な $500 デポジット ボーナス プログラムは 2020 年 12 月 10 日に終了します。必要なデポジットに達すると、最大 $500 のボーナスを受け取ることができるように、Bybit のリワード ハブで WIN$500 というコードを顧客に入力させることができます。 以下詳細。
新製品
[NEW] Bybit インターフェースの改善。 古い UI から新しい UI に移行しました。 最速の実行システムで世界的に知られる Bybit がさらに効率的になりました! 新しいユーザー インターフェイスには、多くの速度改善が含まれています。
注文速度が以前より 50% 速くなりました
CPU とデータの負荷が以前より 50% 減少
取引ページでは、速度が以前より 400% 速くなりました
EMEA およびラテンアメリカ地域では、接続速度が大幅に向上し、500% 速くなりました
[NEW] まったく新しい革新的な Bybit アプリ。 コマンド実行時のプッシュ通知や背景ウィジェットは最新のBybitアプリで利用可能で、今回のアップデートでベトナム語に対応しました。 【近日公開】四半期先物。 Bybit の四半期先物は、資産に関連する次の価格を推測する人を契約します。 契約は、そのカレンダー サイクルなどのスポット価格に基づいて失効します。 主な利点は、多くの場合、ユーザーが資本金を支払う必要がないことです。 先物契約の詳細：こちらをご覧ください。
【準備中】サブアカウント。 ユーザーはまもなく Bybit でサブアカウントを作成できるようになります。 各サブアカウントには、個々のアカウント残高、権限、および個別のアカウント レコードが付属しています。
【近日公開】MetaTrader 4 (MT4) 統合 ,. 外国為替オプション トレーダーが最も使用するプラットフォーム。 これにより、実際の従来の外国為替トレーダーがより大きな市場機会にアクセスできるようになります。 Bybit は、MetaTrader 4 (MT4) に適合する最初で唯一の仮想通貨デリバティブ取引所です。 MT4 は、一般的に外国為替トレーダーを通じて、包括的なテクニカル分析、柔軟な取引フレームワーク、およびアルゴリズム取引ツールを計画するプラットフォームです。 この MT4 統合により、ユーザーにより豊かなエクスペリエンスを提供し、外国為替トレーダーが仮想通貨に参入し、ポートフォリオを簡単に多様化できるように努めています。
【近日公開】新しい取引ペア。 USDTを使用したADA / DOT / UNI / XRPは、近い将来に開始されます。 新しいコインをすばやく追加できるように体をアップグレードし、ユーザーの必要に応じて、長期的にアルトコインのペアの量を挑戦的に継続的に増やします。
いつものように、あなたの継続的なサポートとフィードバックは、男性と女性にとって大きな意味があります. 私たちは、信じられないほど最高のサービスと取引慣行を提供していると確信しています.
WooCommerce Social LoginでFacebookのボタンがズレる件


WordPressで、WooCommerce Social Loginというプラグインを使っている方から、Facebookのボタンが中央にずれてしまうとご相談を受けました。

下記の場所を修正したら、直りました。

ファイルの場所は、こちらです。
```php
wp-content/plugins/woo-social-login/includes/templates/social-buttons/googleplus.php
```
このgoogleplus.phpの中の16行目に、style=" width: 144px;"を追加します。

```php
<!-- show button -->
<div class="woo-slg-login-wrapper" style=" width: 144px;">
```
原因は、Facebookのボタンの下にあるGoogleのボタンで、見えない領域の幅が300pxとGoogleのボタンの大きさの二倍くらい出来てしまっていることです。

![スクリーンショット_20221222_141914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/c0d9bb92-7c69-b89c-2afe-07fd85ef2bd3.png)
Emacs 29に追加される--init-directoryオプション

Emacs 29では、​`--init-directory`​​オプションが追加されます。このオプションによって、起動時にプロファイル​(`user-emacs-directory`)​を切り替えるのが容易になります。

> &#x2013;init-directory=DIR        use DIR when looking for the Emacs init files.

たとえば、[Doom Emacs](https://github.com/doomemacs/doomemacs)を試用するのも簡単になるでしょう（2022年12月時点ではDoomはEmacs 29に非対応です）。

Emacs Lispパッケージを開発するときに、通常の環境に近い条件でテストをするのも容易になります。

これまでは、プロファイルを切り替えるために以下のようなツールが利用されてきましたが、今後は不要になります。

-   <https://github.com/plexus/chemacs2>
-   <https://github.com/alphapapa/with-emacs.sh>
Stimulus に入門してみた

Rails7 のデフォルトでインストールされる JavaScript フレームワーク Stimulus に入門してみます。

まずは公式のハンドブックやリファレンスを読みながら雰囲気を掴んでいこうと思います。

https://stimulus.hotwired.dev/

## Stimulus とは

HTML を中心に置いている JavaScript のフレームワークです。
React や Vue は空のページを作成してサーバーサイドから JSON を返し SPA を実現していますが、 Stimulus は通常のサーバーサイドレンダリングを強化するように設計されています。

Stimulus は Railsに依存しているわけではないですが、Rails7 にデフォルトで入っている Turbo と組み合わせるとSPAのようなUIを実現できます。

## 3つのコアコンセプト

Stimulus には3つのコアコンセプトがあります。

### コントローラー

コントローラーは DOM 要素と JavaScript オブジェクトを繋げます。`data-controller`属性でコントローラーのファイル名を指定します。
class属性が HTML と css を繋ぐとすれば、data-controller は HTML と JavaScript を繋ぐイメージです。

```html
<div data-controller="hello"></div>
```

```js:hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
}
```

### アクション

コントローラーで DOM イベントを処理するためアクションを書きます。`data-action`属性で`[イベント]->[コントローラ]ー#[メソッド]`で指定します。

```html
<div data-controller="hello">
  <button data-action="click->hello#greet">Greet</button>
</div>
```

```js:hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  greet() {
    console.log('Hello')
  }
}
```

### ターゲット

ターゲットで要素に名前をつけることができます。`data-[コントローラー]-target`属性でターゲット名を指定します。

```html
<div data-controller="hello">
  <button data-action="click->hello#greet">Greet</button>
  <span data-hello-target="output"></span>
</div>
```

```js:hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  static targets = [ "output" ]

  greet() {
    this.outputTarget.textContent = "Hello"
  }
}
```

## まとめ

今回はコンセプトだけ確認しました。小規模なアプリであれば、React や Vue を導入するよりはサーバーサイドレンダリングにした方が効率がよいこともあると思います。次回以降で細かな仕様やベストプラクティスを見ていきたいと思います。

## References

https://stimulus.hotwired.dev/

https://www.betterstimulus.com/
データサイエンスコンテストを開催するときに考えること

みなさん初めましてSolafune Techleadの光武といいます。
今回はじめてAdvent Calendar に投稿させていただくので何を書こうかなぁと思い、せっかくなら自分がやっているデータコンテストサイトSolafuneのコンテストを開催するときに考えることを書こうと思いました。

それでは行ってみましょう～

## 開催するときに考えること
データコンテストのアイディアは常に考えていますが、そのアイディアをいざコンテストにしようとしたときに以下のことを考えます
- そのコンテストの成果物が実際に使えるかどうか
- その問題に答えがあるかどうか、答えを作ることができるかどうか
- スコアに差が出るようなコンテストか
- 現実的にコンテストの結果が出せるかどうか
- コンテストとして面白いかどうか


### そのコンテストの成果物が実際に使えるかどうか
これはコンテストを考えるときにまず初めに考えることです。
多くのアイディアはそもそも応用先から思いつくこともあり検討しなくてもいい場合が多いんですが、まれに **「それ解けるけどなんに使うん？」** というのもあります。
もちろんそういった問題も面白いですが、基本的に私たちは応用先がある問題をコンテストにしようと思っています。

### その問題に答えがあるかどうか、答えを作ることができるかどうか
次に考えることはその問題に答えがあるかどうかです。
コンテストを開くうえでここの部分が結構難しく、
「この問題が解決できたらすばらしいし、応用先としてもいろいろ考えれるんだけどなぁ」
というものでもなかなかコンテストにできなかったりします。

たとえば
**【衛星データから雪崩の危険地域を推定する】** という問題を考えたとします。
この問題は雪崩が実際に起きた場所のデータが複数年分ないと、答えを作ることは難しいです。
さらにそのデータがあったとしても**実際に起きた場所と起きやすい場所は必ずしも一致するわけではない**ですし
危険度マックスだけどたまたま起こらなかったということもあるでしょう。
こういう問題はコンテストの答えとして正しい答えを用意できないためコンテストとして開催するには難しい問題となります。

個人的にはこういうアイディアもコンテストでできたら面白いなぁと思うのですが良い方法ありませんかね...

### 現実的にコンテストの結果が出せるかどうか
次に考えることはコンテストの結果が現状の技術で出せるのかどうかです。
衛星データの解像度が非常に低く数ピクセルしか映っていないような車を検出できるかというとそれはなかなか難しいですよね。

この問題は主に２つのことをやって技術的に可能かを考えています。
まず一つ目は**その技術に関係する論文を調べる** です。
その課題や技術に関する論文がなければその問題は現在の技術的に難しい場合が多いです。
論文があったとしても非常に限定的だったり特殊なデータが必要な場合、異常な量のコンピューターリソースを使用している場合(A100×100台とか)はさすがに酷すぎると考えて見送ったりします。

そして二つ目は**データを増やせないか調べる**です。
上の例だと低解像度の衛星データでやると不可能ですが、十分に車が見れるような高解像度の衛星データがあれば何の問題もなく開催することはできます。
そのほかにも一変数だけでは答えを出すことが難しくても２変数に増やせば答えを出すことができる可能性が上がります。
このようにデータを増やして結果が出せるようになるかを検討したうえでデータを増やすことができなかったり増やしても無理だと思ったら見送ります。

### スコアに差が出るようなコンテストか
応用性もある！結果も出せる！となったときに次に考えることがこちらになります。
こちらは一個前の課題とは逆に簡単すぎるコンテストの時に考えることが多いです。
データ数が非常に少ないにもかかわらずコンテストの問題が簡単である場合、参加者の多くがすぐに最適解に到達してしまってみんな満点を取ってしまいコンテストになりません。
特にここは評価関数の選び方などによって大きく変わるので評価関数を考えるときにスコアに差が出るような評価関数を考えて選んでいます。

### コンテストとして面白いかどうか
さて、ここまで考えたら基本的にコンテストを開催することはできます！
そして最後に考えることがやはり**コンテストが面白いかどうか** です！
ここではいろんなことを考えますが主に考えることは**いろんなアプローチをとれる**かどうかです。

やはりいろんなアプローチをとれるほうが面白いですし、いろんなアプローチを組み合わせたりして精度を上げていくことがコンテストの醍醐味だと思っています。
いろんな参加者がいろんなアプローチをすることで参加者同士でスキルアップにつなげてくれたらと思っていろいろなアプローチがありそうなコンテストを優先的に開催しています。
いろんなアプローチを試したり、自分だけのアプローチ方法を考案してくることを楽しみにしています。

### そして開催へ
以上のことを考えてコンテストを開催しています。
結局のところ参加者の皆さんが参加したい、参加して面白いと思ってくれるコンテストを常に考えてコンテストを開催しています。
参加者の皆さんあってのコンテストですからね。

## 最後に
Solafuneでは主に衛星データ、地理空間情報データを扱ったコンテストを開催しています。
衛星データとか地理空間情報データはいろいろなことに活用できる可能性がある一方で「難しそう」「扱いずらそう」などの理由から敬遠されがちです。
Solafuneでは衛星データに親しみやすくなるように面白いコンテストを開催していきますので今後ともぜひチェックをお願いします。
こういうコンテスト開いてほしいという意見も募集してますのでコメントからどうぞ！

[Solafune 公式サイト](https://solafune.com)

最後に宣伝になるんですがSolafuneでは一緒に衛星データで地球を解析する仲間を募集しています。
衛星データや地理空間情報データの解析、技術開発のプロジェクトとしてはこの上ない環境だと思いますので是非！
[Solafune 採用サイト](https://recruit.solafune.com/)
Unity公式が公開しているプログラミングパターンを読み取ってみた！～その2. OpenClosed(オープン・クローズドの原則)～

# はじめに
Unity公式がプログラミングパターンのデモを説明書と共に全12種公開していたので、1つずつ読み取っていきたいと思います！
英語の説明書でしたので間違った解釈をしているかもしれませんが、ご了承下さい！
最初の5種は、SOLID原則に沿ったデモとなっており、コードのみが公開されています。
残り7種は、Scene付きのデモが入っていますので、ZIPファイルをダウンロードして試してみてください。
今回は、2つ目のOpenClosed(オープン・クローズドの原則)についてです。

https://github.com/Unity-Technologies/game-programming-patterns-demo

https://resources.unity.com/games/level-up-your-code-with-game-programming-patterns

# 環境
OS : Windows10
Unity バージョン : 2021.3.8f1

# OpenClosed(オープン・クローズドの原則)とは
OpenClosed(オープン・クローズドの原則)は、クラスは拡張に対してはオープンでなければならないが、変更に対してはクローズでなければならないというものです。
要するに、機能拡張はいくらでもできるようにして、機能そのものの修正はできないようにするということです。
デモではよく目にする面積を求めるコードが掲載されていました。

### 悪いコード例
四角形と円の面積を求めるコードです。
```C#
public class AreaCalculator
{
    // 四角形の面積
    public float GetRectangleArea(Rectangle rectangle)
    {
        return rectangle.width * rectangle.height;
    }
    // 円の面積
    public float GetCircleArea(Circle circle)
    {
        return circle.radius * circle.radius * Mathf.PI;
    }
}

public class Rectangle
{
    public float width;
    public float height;
}

public class Circle
{
    public float radius;
}
```
これで十分に機能しますが、台形や平行四辺形の面積を求めたい時、更に新しいメソッドを作成する必要があります。
オープン・クローズドの原則を守るには、Shapeという基底クラスを作成し、四角形や円のクラスが基底クラスを継承するようにします。

### 良いコード例
```C#
public abstract class Shape
{
    public abstract float CalculateArea();
}
```
```C#
public class Rectangle : Shape
{
    public float Width { get; set; }
    public float Height { get; set; }

    public override float CalculateArea()
    {
        return Width * Height;
    }
}
```
```C#
public class Circle : Shape
{
    public float Radius { get; set; }

    public override float CalculateArea()
    {
        return Radius * Radius * Mathf.PI;
    }
}
```
```C#
public class AreaCalculator
{
    public float GetArea(Shape shape)
    {
        return shape.CalculateArea();
    }
}
```
これでAreaCalculatorクラスは、任意の形状の面積を取得できるようになりました。
変更の際はAreaCalculatorクラスに手を加える必要はなく、台形や平行四辺形の面積を求める機能拡張もShapeを継承するだけでよくなります。
つまり、面積を求める機能に修正を加えることなく、それぞれの形ごとにバグを見つけ出すことができます。
オープン・クローズドの原則を守ると長期的に新しいコードを追加することがより簡単になります。
# 参考

https://blog.unity.com/ja/games/level-up-your-code-with-game-programming-patterns
C++20でマクロレス名前付き引数を実現する

# 目標とする名前付き引数の構文
```c++
void func(Arg<"first", int> first, Arg<"second", int> second); // #1
void func(Arg<"second", int> second, Arg<"first", int> first); // #2
```
このような感じで欲しい関数をオーバーロードすることにより以下のような呼び出し方を許可したい。
```c++
func("first"_arg = 0, "second"_arg = 88); // ok #1が呼ばれる
func("second"_arg = 99, "first"_arg = 0); // ok #2が呼ばれる
```


# なぜC++20からなの？
C++20から、非型テンプレートパラメータとして条件はあるがクラス型が許可された。
そのため、1文字ずつ可変引数テンプレートで渡さずとも、文字列を非型テンプレートで直接受け取ることが可能になった。
```c++
template<typename CharT, std::size_t N>
struct basic_string_literal {
    CharT data[N];
    consteval basic_string_literal(const CharT (&str)[N]) {
        for (std::size_t i = 0; i < N; ++i) data[i] = str[i];
    }
};

template<basic_string_literal F>
struct S{};

int main() {
    S<""> s;
    S<u8""> u8_s;
    S<u""> u16_s;
    S<U""> u32_s;
}
```

これを使ってやりたい放題したいと思う。Boost Parameter Libraryもあるが、マクロによる構文を必要としているので、プリプロセッサに頼らないC++のみの機能でやることを目標にした。

# 解説
## 必要なもの

1. `_arg`のユーザ定義リテラル
2. `_arg`で生成したリテラルは`operator=`で渡された右辺の変数をバインドできる構造体でなければならない
3. 変数バインドした構造体が関数の引数に渡されるので、その型を簡単に書ける型エイリアス

## 実装
必要なもの(1)で変数テンプレートに文字列を渡すと`char (&)[N]`の形で渡されるので、文字列リテラルを構造体`basic_arg_name`で引き回せるようにしてやる。
```c++
template<typename CharT, std::size_t N>
struct basic_arg_name {
    CharT data[N];
    consteval basic_arg_name(const CharT (&str)[N]) { for (std::size_t i = 0; i < N; ++i) data[i] = str[i]; }
    constexpr operator std::basic_string_view<CharT>() const {
        return std::basic_string_view<CharT>{ data, N - 1 };
    }
};
```

この構造体`basic_arg_name`は文字列を使ったタグ程度としか機能しないので、必要なもの(2)を満たすような構造体`arg_storage_builder`を、ユーザー定義リテラル`_arg`は返す必要がある。

```c++
template<auto Name>
struct arg_storage_builder {
    static constexpr auto name = Name;
    template<typename T>
    constexpr auto operator=(T&& value) const {
        return arg_storage<T, name>{std::forward<T>(value)};
    }
};

inline namespace literal {
    template<basic_arg_name str>
    consteval auto operator"" _arg() {
        return arg_storage_builder<str>{};
    }
}
```

また、この地点では`arg_storage_builder`は実際に渡される引数の型や確保領域を持っていない。そのため`operator=`の引数に渡されたものの型と値を保持し、別の構造体に保存し関数に渡す必要がある。その構造体が`arg_storage`である。

```c++
template<typename T, auto Name>
struct arg_storage {
    using value_type = T;
    static constexpr auto name = Name;
    T value;
    arg_storage(T v) : value(v){}
    template<typename Cast, std::enable_if_t<std::is_convertible_v<T, Cast>, std::nullptr_t> = nullptr>
    constexpr operator arg_storage<Cast, Name>()&& {
        return arg_storage<Cast, Name>{static_cast<Cast>(std::forward<T>(value))};
    }
};
```
この構造体の`value`メンバ変数にアクセスすることによって`"name"_arg = value`の形で保存された値にアクセスすることができる。また、渡された値の型情報をそのまま保持しているので
```c++
int a = 0;
"arg_name"_arg = a;
```
このようにした場合では`operator=`は`arg_storage<int&, "arg_name">`を返すため、このままだと`func(arg_storage<int, "arg_name">)`のような型変換が可能なはずの引数に渡すことができない。
そのため`arg_storage`に型変換演算子のオーバーロードを追加してやることにより解決をしている。

最後に、引数の型に毎回`arg_storage<type, "name">`と書くのは面倒くさいので、`Arg<"name", type>`で書けるよう型エイリアスを作る。
```c++
template<basic_arg_name Name, typename ArgType>
using Arg = arg_storage<ArgType, Name>;
```

## コード全体

https://github.com/MurakamiShun/MacrolessNamedParameter
【Playdate】ゲーム内データをjsonで外部保存・読込する

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/c6fda334-5e01-89ff-6d99-9d5899f95d43.png)

Playdateではゲーム内データをjsonとして保存したり、読み込みしたりすることが可能です。
[前回](https://qiita.com/sada_lp1/items/3d0c643407d81b92f8d4)のHPとEXPを変更するプロジェクトを改造します。

まず、前回の`menu.lua`を変更します。

```menu.lua
-- 略 --

function Menu:init(_hp, _exp)
	Menu.super.init(self)
	if _hp == nil then
		_hp = 50
	end
	if _exp == nil then
		_exp = 5
	end
	hp = _hp
	exp = _exp
	self:draw()
end

function Menu:getData()
	return hp, exp
end

-- 略 --
```

Menuインスタンス生成時に`init`の引数に`hp`,`exp`代入できるようにします。
また、`hp`と`exp`を返す`getData`関数を用意します。

次に前回の`main.lua`を編集します。

```main.lua
-- 略 --

local menu = nil

local FILE_NAME <const> = "save_data" -- 保存ファイル名(.jsonファイル

local dataTable = {
	15, -- hp初期値
	3 -- exp初期値
}

function myGameSetUp()
	
	-- dataTable読み込み
	local data = playdate.datastore.read(FILE_NAME)
	if data ~= nil then
		dataTable = data
	end
	
	menu = Menu(dataTable[1],dataTable[2])
	
	-- メニュー: dataTable保存
	local systemMenu = playdate.getSystemMenu()
	local menuItem, error = systemMenu:addMenuItem("SaveData", function()
		dataTable[1], dataTable[2] = menu:getData()
		playdate.datastore.write(dataTable, FILE_NAME)
	end)
	
	local backgroundImage = gfx.image.new( "Images/background" )
	assert( backgroundImage )
	
	gfx.sprite.setBackgroundDrawingCallback(
		function( x, y, width, height )
			backgroundImage:draw( 0, 0 )
			
			gfx.setImageDrawMode(gfx.kDrawModeFillWhite)
			gfx.drawText(status, 20, 20)
			gfx.drawText("HP:"..menu:getHp().."/"..menu:getMaxHp(), 20, 36)
			gfx.drawText("EXP:"..menu:getExp().."/"..menu:getNextExp(), 20, 52)
			gfx.setImageDrawMode(gfx.kDrawModeCopy)
		end
	)

end
-- 略 --
```

`myGameSetUp()`関数内に`save_data.json`が保存してされていれば読み込み処理を実装します。
`playdate.datastore.read([jsonファイル])`でシステムフォルダ内に保存されたjsonファイルを読み込みます。

jsonファイルの書き込みはメニューボタンを押した時に表示されるメニューに`SaveData`という項目を追加し、選択すると書き込むようにします。
`playdate.datastore.write([table], [jsonファイル名])`でシステムフォルダ内に指定したjsonファイル名で保存します。
Simulatorの場合、jsonファイルの保存先は`PlayDateSDK/Disk/Data/[プロジェクト名]/[jsonファイル名]`となります。
![スクリーンショット 2022-12-23 0.34.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/3900d3d2-4a8b-5c89-e400-0cd922778b32.png)
Network Watcherの機能

●Network Watcher
ネットワークの監視やトラブルシューティングのためのサービスであり、Azure仮想ネットワーク内のリソースの監視や診断。メトリックの表示、ログの有効または無効化を行うためのツールおよび機能を提供。

●Network Watcherエージェント仮想マシン拡張機能
オンデマンドでの仮想マシンのネットわ０区トラフィックのキャプチャなど、高度な機能・特定の機能を使用するにはNetwork Watcherエージェント仮想マシン拡張機能が必要。
使用するタイミングで仮想マシンにインストールできるし、事前にインストールすることもできる。

●Network Watcherの機能
・監視ートポロジ
仮想ネットワーク内の全てのリソースや仮想ネットワーク内のリソースに関連づけられたリソース、およびリソース間の関係ｋ性を視覚的に表示できる。

・監視ー接続モニター
指定されたソースとターゲットについて、エンドツーエンドの総合的な接続監視機能を提供。

・ネットワーク診断ツールーIPフロー検証
仮想マシンから送受信されるパケットのプロトコルや方向、任意のIPアドレス、ポート番号を指定して、NSGでの通信の可否をシミュレーションできる。
IPフロー検証の機能は、NSGのトラブルシューティグに役立つ。

・ネットワーク診断ツールーNSG診断
IPフロー検証の詳細バージョンとして位置付けられている機能。

・ネットワーク診断ツールーネクストホップ
ネットワーク仮想アプライアンス(NVA)を介して2つのサブネット間の通信が行われる様にする場合など、通信経路を変更したいときは、ルートテーブルを作成してサブネットへの関連付けを行い、既定とは別のルート情報を使用する様構成する必要がアある。
ネクストホップ機能を使用すると、ルートテーブルの動作を確認できるため、ルートテーブルの検証やトラブルシューティングに役立つ。

・ネットワーク診断ツール-VPNのトラブルシューティング
オンプレミスネットワークとAzure仮想ネットワークを接続できる。
ただし、それには仮想ネットワークゲートウェイに加えてローカルネットワークゲートウェイ、接続リソースなど、いくつかのリソースを適切に作成して構成する必要がある。
VPNトラブルシューティングは、仮想ネットワークゲートウェイやその接続でのトラブルシューティングをおこなうために、ゲートウェイおよび接続の正常性を診断し、その診断結果を返す機能。
この機能を使用するには、構成済みの仮想ネットワークゲートウェイを選択するほか、ストレージアカウントおよびコンテナーの選択も必要。ストレージアカウントの選択が必要な理由は、VPNトラブルシューティングの詳細な診断結果をストレージアカウントに保存するため。

・ネットワーク診断ツールーパケットキャプチャ
Network Watcherによってリモートで開始することが可能な、仮想マシン拡張機能。この機能で、仮想マシンへのリモートデスクトップ接続やログインを行うことなく、仮想マシンで送受信されるパケットをキャプチャできる。
パケットキャプチャの構成時は、対象の仮想マシンやキャプチャデータの保存場所を指定する。場所にはストレージアカウントまたは仮想マシンのローカルファイル、あるいはその両方を選択することが可能。

・ネットワーク診断ツールー接続のトラブルシューティング
いわゆるネットワークが接続できないという一般的な状況下において、その問題の調査と原因の特定に役立つ。

・ログーNSGフローログ
NSGはファイアーウォール機能を提供し、送受信されるパケとを規則に基づいて許可または拒否するが、既定ではその動作は記録されていない。
NSGフローログは、NSGを使用したIPトラフィックに関する情報をログに記録する機能。つまり、NSGを介するトラフィックで使用された規則や、IPアドレス、プロトコル、ポート番号、アクションなどの情報をログとして記録できる。

※NSGフローログを使用するには、Microsoft.Insightsのリソースプロバイダーが登録されている必要がある
そのため、事前にリソースプロバイダーの管理画面でMicrosoft.Insightsの状態が「Registered」であることを確認する。
【ポートフォワーディング】WSL2＋Docker＋Python環境でJupyter Notebookをブラウザで操作する方法

# はじめに

この記事は、WSL/WSL2のUbuntuで動かしているDockerコンテナ内のPythonからJupyter Notebookをブラウザで操作する方法を備忘録としてまとめたものです。


# 接続概要図

Windows上で動作しているWSL2、WSL2上で動作しているDockerコンテナ、と２段階の接続ルートがあるため、コンテナ内で起動したJupyter NotebookをWindowsのブラウザで操作するにはひと手間必要です。

以下に接続概要図を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/10cbbf58-f0c5-b2cc-e7f6-008e42a6074f.png)


- Windows、WSL2、Dockerコンテナでそれぞれ自分の立場で自身を指すLocalhostがすべて同じ名前であることに注意してください。

図に示す通り、それぞれのポートを接続する処理が必要です。

| No | 操作 |
|:-:|:--|
|  ① |  Cドライブのマウントパス（/mnt/c）をコンテナ内にマウントし（/mnt/c/）、WSL2の8888ポートとコンテナの8888ポートを接続するようにDocker実行 |
| ②  |  Windows側からWSLへSSH接続（Windowsの8888ポートとWSLの8888ポートをポートフォワーディング） |
|  ③ | Dockerコンテナ内にインストールしたJupyter Notebookを実行  |
|  ↓ | ポートフォワーディングによってWindowsのLocalhostまでJupyterが飛んでくる状態になる  |
|  ④|  Jupyter実行時に出力されたLocalhost URLをそのままWindowsのブラウザに貼り付けて開く |
|  😊|  Cドライブに保存したNotebookを、WSL2上のDockerコンテナで動くJupyterで参照、実行できる |

それぞれのコマンドをまとめると、以下のようになります。

# ①Dockerコンテナ実行

Cドライブのマウントパス（/mnt/c）をコンテナ内にマウントし（/mnt/c/）、WSL2の8888ポートとコンテナの8888ポートを接続するようにDocker実行

```powershell:WSL2（ターミナル）
docker run --name XX -v /mnt/c/:/mnt/c/ -p 8888:8888 -d -it IMAGE bash
```

# ②SSH接続

まずは、Windowsから見えるWSLのIPアドレスを調べます。
```powershell:Windows（コマンドプロンプト／Power Shell）
wsl -e hostname -I
# xxx.xxx.xxx.xxx
```

Windows側からWSLへSSH接続します（Windowsの8888ポートとWSLの8888ポートをポートフォワーディング）

```powershell:Windows（コマンドプロンプト／Power Shell）
ssh -N -f -L 8888:localhost:8888 username@xxx.xxx.xxx.xxx
```

:::note info
**ポイント**
WSLのSSHサービスが起動していない場合は、以下のコマンドを実行してください。
```powershell:WSL2（ターミナル）
sudo service ssh restart
```
:::


# ③コンテナ内でJupyter実行

Dockerコンテナ内にインストールしたJupyter Notebookを実行

```powershell:WSL2（ターミナル）
jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root
```

# ④ブラウザにURL貼り付け＆Jupyter操作

今回はポートフォワーディング元/先ポートを全て8888ポートで統一しているので、単純にWindowsでJupyterを起動した時と同じように、表示されたLocalhostのURLをブラウザで開くだけです。


```
To access the notebook, open this file in a browser:
        ~~~~~~~~~~~~~~~~
    Or copy and paste one of these URLs:
        http://localhost:8888/?token=~~~~~~~~~~~~~~~~~
     or http://127.0.0.1:8888/?token=~~~~~~~~~~~~~~~~~
```

# 😊 Dockerコンテナで動かすJupyterをお楽しみください

あとはお楽しみください。
新しいメディアクエリの指定方法

今までのメディアクエリの記述の仕方は `min-width`と`max-width`で定義していましたが、比較演算子`=`、`>`、`<`が使用できるようになりました。

~~~ css
@media (min-width: 400px) {
/* スタイル */
}
~~~
このような書き方から
~~~ css
@media (width >= 400px) {
/* スタイル */
}
~~~
このようになりました。
他にも、タブレットサイズのみ指定したい場合、
~~~ css
@media (min-width: 768px) and (max-width: 1023px) {
  /* スタイル */
}
~~~
このような書き方から
~~~ css
@media (768px <= width <= 1023px )  {
  /* スタイル */
}
~~~
このような書き方に変わります。スッキリ書けて、可読性も上がるし、いいことだらけですね。
さらに、不等号だけの書き方にも対応したみたい。
下のコードは上のコードの条件と同じです。この書き方は、ちょっと分かりにくい？
~~~ css
@media (767px < width < 1024px )  {
  /* スタイル */
}
~~~

プログラムチックな書き方になり、CSSがさらに書きやすくなります。
でも僕は、SASSで書いているのであんまり関係ないかな。


### 参考

https://coliss.com/articles/build-websites/operation/css/media-query-range-syntax.html
なんとか大学生のうちに応用情報に合格できました

# はじめに
令和4年秋の応用情報技術者試験に合格していたので、自分がやったこととか諸々書き残しておきます。

# 経歴
- 大学の学部3年
- 学部は情報系
- 基本情報取得(令和3年7月)
- 応用情報受けるのは2回目(1回目は今年の春に受けた試験で不合格でした)

# 点数結果

<table>
    <tr>
        <td>午前得点</td>
        <td>85.00</td>
    </tr>
    <tr>
        <td>午後得点</td>
        <td>61.00</td>
    </tr>
</table>

<table>
    <tr>
        <th>問題番号</th>
        <th>分野</th>
    </tr>
    <tr>
        <td>問1</td>
        <td>情報セキュリティ</td>
    </tr>
    <tr>
        <td>問3</td>
        <td>プログラミング</td>
    </tr>
    <tr>
        <td>問5</td>
        <td>ネットワーク</td>
    </tr>
    <tr>
        <td>問6</td>
        <td>データベース</td>
    </tr>
    <tr>
        <td>問7</td>
        <td>組込みシステム開発</td>
    </tr>
</table>
記述系は苦手なので、答えが一意に決まる問題が多いテクノロジ系中心に選びました。しかしながら、ボーダーギリギリすぎてめちゃくちゃに心臓に悪かったです、、、

# 所感とか
勉強には<a href="https://gihyo.jp/book/2020/978-4-297-11799-3">令和03年【春期】【秋期】応用情報技術者 合格教本</a>と<a href="https://www.ap-siken.com/">応用情報試験ドットコム</a>を使用しました。

合格教本を一通り読んでインプットしたら、後はひたすら過去問道場で過去問を解いてました。
合格教本はわからない用語とかが出てきたときに使う辞書代わりに。

間違えた問題はexcelにまとめて、さっと見返せるようにしてました。

勉強は午後メインでやるといいのかなあという印象です。午前は過去問道場を電車とか乗ってるときにポチポチ解いてる程度でなんとかなりました。

選択問題に関して、設問3のプログラミングで爆死した記憶がありますが、他の分野の出来がわりとよくて耐えた感はあります、、、
ネットワークとかデータベースは答えが一意に決まる問題が多いので、中身を理解してしまえば安定した得点源にできるので個人的にはおすすめかなあと思っています。
（触ったことないと理解が難しいのかもしれませんが、、、）

# おまけ　自己採点結果
<table>
    <tr>
        <td>TAC</td>
        <td>71.00</td>
    </tr>
<tr>
        <td>itec</td>
        <td>64</td>
    </tr>
</table>

実際の結果「61.00」と比べると、結構なブレがあるなあと感じました。他の人の結果とか見てても、自己採点では8割取れてたけど、実際は6割ちょいとかあったので、あんまりこの点数を過信するのは危険かも。
cmdでMySQL（環境変数から

スクールでMySQL Workbenchを学んだが、「cmdでの操作は自分で調べてください」とのこと:sweat_smile:
なんだか悪戦苦闘したので、備忘録でまとめます。
（cmdってなんか怖くて。。。）

# 環境変数の設定
- `Windowsキー`と`R`で`sysdm.cpl`と入力
→`システムのプロパティ`を起動

- `詳細設定`の`環境変数`を開く
![スクリーンショット_20221222_181742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/5a3aa985-cc29-916a-9013-fd455d6e34f6.png)

- システム環境変数の`Path`を選択し`編集`
![スクリーンショット_20221222_182626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/1aad1a92-1c1a-7def-a254-a5a9d4ae797a.png)

- `新規`を押して、パスを入力
→インストール済みであれば大抵`C:\Program Files\MySQL\MySQL Server 8.0\bin`ですかね。自分でmysql.exeがあるか見てみましょう。

# cmdでの基本操作
```SQL:MySQLに接続
C:\>mysql -u root -p
Enter password: ********
```

```SQL:データベース一覧の確認
mysql> SHOW DATABASES;
```

```SQL:データベース作成
mysql> CREATE DATABASE データベース名 ;
```

```SQL:データベースの選択
mysql> USE データベース名 ;
```

```SQL:テーブルの作成
mysql> CREATE TABLE  テーブル名（任意） (
    ->   GENDERCD   VARCHAR(1)   NOT NULL   COMMENT '性別CD'
    ->  ,GENDERNAME VARCHAR(5)   NOT NULL   COMMENT '性別名'
     --カラム物理名  データ型   無ならNULL   カラム論理名
    ->  ,PRIMARY KEY( カラム物理名 )
    -> );
```
`->`が初めて出てきた時にすごくビビったw

```SQL:テーブルにデータ入力
mysql> INSERT INTO GENDER(GENDERCD, GENDERNAME)   VALUES ( '1', '男性' );
            --テーブル名(カラム物理名１, .....)※以下の様に省略可　 　
mysql> INSERT INTO GENDER VALUES ( '2', '女性' );
```
```SQL:SELECT例
mysql> SELECT * FROM GENDER;
+----------+------------+
| GENDERCD | GENDERNAME |
+----------+------------+
| 1        | 男性       |
| 2        | 女性       |
+----------+------------+
2 rows in set (0.01 sec)
```
```SQL:MySQL終了
mysql> QUIT;
```
抽象クラスと多態性の演習

# 問題
OnitaijiPolymoクラスを抽象クラスとして継承したクラスPeachBoy, Dog, Monkey, Kijiを作り、fightメソッドをオーバーライドしてください。Mainクラスではポリモーフィズムを用いて、各クラスのfightメソッドを呼び出してください。

```java:抽象クラス
package p_polymo;
//修飾子の後にabstractで定義
public abstract class OnitaijiPolymo {
	public abstract void fight();
}
```

```java:子クラス
package p_polymo;

public class PeachBoy extends OnitaijiPolymo {
	private String name = "桃太郎";
	
	@Override
	public void fight() {
		System.out.println(this.name + "は刀で戦った！");
	}
}
```
```java:子クラス
package p_polymo;

public class Dog extends OnitaijiPolymo {
	private String name = "犬";

	@Override
	public void fight() {
		System.out.println(this.name + "はかみついた！");
	}
}

```
```java:子クラス
package p_polymo;

public class Monkey extends OnitaijiPolymo {
	private String name = "猿";

	@Override
	public void fight() {
		System.out.println(this.name + "はひっかいた！");
	}
}
```
```java:子クラス
package p_polymo;

public class Kiji extends OnitaijiPolymo {
	private String name = "キジ";

	@Override
	public void fight() {
		System.out.println(this.name + "はつついた！");
	}
}
```

```java:メインクラス
package p_polymo;

public class Main {
	public static void main(String[] args) {
		OnitaijiPolymo[] onitaiji = new OnitaijiPolymo[4];
		onitaiji[0] = new PeachBoy();
		onitaiji[1] = new Dog();
		onitaiji[2] = new Monkey();
		onitaiji[3] = new Kiji();
		
		for(OnitaijiPolymo oni : onitaiji) {
			oni.fight();
		}
	}
}
//演算結果
//桃太郎は刀で戦った！
//犬はかみついた！
//猿はひっかいた！
//キジはつついた！
```
# 補足
- abstractで抽象クラスを定義
- 抽象クラスには必ず一つ以上の抽象メソッドを定義しなければならない。
- 抽象メソッドには処理を記載しない。（インスタンス化できないので）
- static、privateは抽象メソッドで定義不可
<br>

- 多態性（ポリモーフィズム）は以下の手順で行う
1 、子クラスでスーパークラス（ここでは抽象クラス）と同名のメソッドをオーバーライド
2 、子クラスのインスタンスをスーパークラス型の変数で管理
3 、各インスタンスをループ処理で呼び出し
PID制御を用いて推進力を求める [Unity]

PID制御を用いて推進力を求めるスクリプトを実装します。

# 実装
まず、PID制御で用いる比例ゲイン、積分ゲイン、微分ゲインをまとめて保持する構造体を定義します。

```CS:Gains.cs
using System;

/// <summary>
/// PID制御で用いるゲインを保持する構造体
/// </summary>
[Serializable]
public struct Gains
{
    /// <summary>
    /// 比例ゲイン
    /// </summary>
    public float P;
    /// <summary>
    /// 積分ゲイン
    /// </summary>
    public float I;
    /// <summary>
    /// 微分ゲイン
    /// </summary>
    public float D;


    public Gains(float p, float i, float d)
    {
        P = p;
        I = i;
        D = d;
    }
}
```

この`Gains`構造体を用いてPID制御の計算を行うクラスを実装します。

```CS:PidVector3Controller.cs
using UnityEngine;

public class PidVector3Controller
{
    public Gains Gains;

    private Vector3 intError;
    private Vector3 prevError;

    public PidVector3Controller()
    {
        Gains = new Gains();
    }

    public PidVector3Controller(float p, float i, float d)
    {
        Gains = new Gains(p, i, d);
    }

    public PidVector3Controller(Gains gains)
    {
        Gains = gains;
    }

    /// <summary>
    /// PID制御を用いて現在の座標から特定の座標へ移動するために必要な推進力を計算する
    /// </summary>
    /// <param name="currentPos">現在の座標</param>
    /// <param name="desiredPos">目標座標</param>
    /// <param name="deltaTime">前回呼び出しからの経過時間(Time.deltaTimeなど)</param>
    /// <returns>計算した推進力</returns>
    public Vector3 ComputeRequiredForce(Vector3 currentPos, Vector3 desiredPos, float deltaTime)
    {
        // 差分
        var error = desiredPos - currentPos;
        // 積分
        intError += error * deltaTime;
        // 微分
        var diffError = (error - prevError) / deltaTime;

        prevError = error;

        var requiredForce =
            Gains.P * error +
            Gains.I * intError +
            Gains.D * diffError;
        return requiredForce;
    }
}
```

# 使い方
こんな感じのスクリプトを用意して`PidVector3Controller`を用いて計算することで、対象にPID制御を用いて接近することができます。
注意点として、`Gains`で保持するパラメータは設計値なので、実験して適切な値を設定する必要があります。

```CS:PidSphere.cs
using UnityEngine;

[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))]
public class PidSphere : MonoBehaviour
{
    [SerializeField] private Gains gains;
    [SerializeField] private Transform target;

    private Rigidbody rb;
    private PidVector3Controller pidController;

    private void Awake()
    {
        TryGetComponent(out rb);
    }

    private void Start()
    {
        pidController = new PidVector3Controller(gains);
    }

    private void FixedUpdate()
    {
        // ※Time.deltaTimeはFixedUpdateで呼ぶとTime.fixedDeltaTimeと同値を返す
        var force = pidController.ComputeRequiredForce(transform.position, target.position, Time.deltaTime);
        rb.AddForce(force);
    }
}
```
学校や会社のファイアウォールやフィルタリングを回避したい

# はじめに
この記事に書いてある内容を実際に試した結果、あなたが何らかの被害を被ったとしてもそれはあなたの責任です。

# この記事の対象者
* 学校や会社のフィルタリングやファイアウォールを回避したい人
* 学校や会社のフィルタリングやファイアウォールを回避する方法を知って対策方法を考えたい人
# 方法
## VPNやProxyを使う
VPNを使えば通信が暗号化されるのでネットワーク管理者からの検閲を防げます。
ただ、学校や会社ではVPNに接続するためのポート自体が規制されていることが殆どです。
残念ながら規制されたポートを回避する事はできません。(出来たらファイアウォールソフトの脆弱性です)
なので規制されていないポートを使います。
例としてHTTPのTCP80やHTTPSのTCP443、場合によってはSSHのTCP22などが使えます。
(UDPは使えない場合が殆どです。)
これらのポートを利用するVPNやProxyを使うことでファイアウォールやフィルタリングを回避できます。
例えばProtonVPNやTorは基本的にTCP443を利用します。
ただ、有名なVPNサービスやTorへのアクセスは遮断される場合があります。
Torに関してはBridgeを使えば何とかなりますがTor自体の回線速度に難があるため、お勧めできません。
使っているルーターによってはDDNSの設定からVPNサーバーの構築まで出来るものがあるので、自宅回線をVPNとして利用することも可能です。

## WebProxyを使う
PHProxyやGlypeなどのWebProxyを使えばブラウザからフィルタリングを回避することが出来ます。
この方法だとHTTP通信以外のファイアウォールは回避できませんが、URLベースのフィルタリングであれば回避する事が可能です。
Googleで調べればこれらのサービスを見つけることが出来ます。
ReplitやRenderなどでultraviolet web proxyを使うのも良いでしょう。

#
どの方法も外部の代理サーバーを介して通信しているため、サーバーの運用者はいくらでも通信内容をのぞき見することが出来ます。(自分でVPNのサーバーを建てた場合は別ですが。)
利用するサービスは安全なものを使いましょう。
pythonを使った初心者のためのスクレイピング

# はじめに
バックエンドに興味が出ない自分だが、どうしても今後のためにバックエンドの勉強をしなければいけない。。。
ということで、まずは興味あることをバックエンドで使いそうな言語でやってみようという単純な考えに行き着いた自分は、とりあえずpythonを触ってみるのであった。
今回は副業でも利があるスクレイピングをやってみる。
# 実行環境
・MacBook Air (M1, 2020)
・macOS Monterey
・Python 3.10.8
・ChromeDriver(https://chromedriver.chromium.org/downloads)
・Selenium

# 条件
実際の簡単な案件を想定して下記のような条件で引っ張ってくる
> YouTubeの音楽部門の急上昇上位5件の動画タイトルを取得

まずはrobots.txtでwebスクレイピングできるかどうかを調べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077515/75b7c3ff-2338-2e54-e4e1-06b0cd4188fd.png)
ここに載っているものはURLのアクセスが許可されていないものなのでwebスクレイピングできない（知らなかった。。）
今回の対象は急上昇 `/trend` なので問題なし！

# 事前準備(Selenium, ChromeDriver)
URLにアクセスするため`Selenium`を使用します。
Selenium はざっくりいうと Web ブラウザの操作を自動化するためのフレームワークです。

まずは以下のパイプコマンドでSeleniumをインストール
```
pip install selenium
```

次にwebドライバのインストールです。今回はChromeを使用するためChromeDriverをインストールします
```
pip install chromedriver-binary==<Chromeバージョン番号>
```
参考

https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760

# スクレイピング
では実際にコードを書いていきましょう！
```python
from selenium import webdriver

# リクエストURL
YOUTUBE_URL_HOST = "https://www.youtube.com/"
REQ_URL = YOUTUBE_URL_HOST + 'feed/trending'

# ChromeDriverの格納場所
CHROME_DRIVER_PATH = '<ChromeDriverの格納場所>'

if __name__ == "__main__":

    # ChromeDriverでurlを起動
    driver = webdriver.Chrome(CHROME_DRIVER_PATH)
    driver.get(REQ_URL)
```

こちらでまず`REQ_URL`にアクセスできるので、実行するとChromeが起動してyoutubeの急上昇を開くところまでできます。

次にここからWebブラウザを操作して音楽タブをタップします。
タップの操作をするには以下
```python
  # 急上昇の音楽タブをタップ
  xpath = '<youtubeの音楽タブのXPath>'
  driver.find_element_by_xpath(xpath).click()
```
音楽タブのXPathを指定して`find_element_by_xpath().click()`
XPathの取得方法は下記を参照

https://aprico-media.com/posts/7777

スクレイピングしたいwebブラウザまでくることができたらあとは欲しい情報のclassやIdなどを指定して取得するだけです。
今回は動画タイトルが取得対象なので`id = 'video-title'`のtextを取得すれば良い（取得したい内容がどこの何に該当するかはwebページの検証で見てみてください）

id指定してListで取得するには以下の書き方でOK
```python
# 'video-title'の要素を全て取得
video_ranking_list = driver.find_elements_by_id('video-title')
```
このListのうち上位5件の動画タイトル（.text要素）を取得すればいいだけなので、今回は試しにprintで表示してみましょう。
```python
for video_data in video_ranking_list:
    title = video_data.text
    print(title)
    num = num + 1
    if(num == 5):
        break
```
ということで実行すればyoutube動画の急上昇（音楽）の上位5件の動画タイトルがコンソールに表示されるかと思います！

# まとめ
今回は超簡単にスクレイピングがお試しできる方法を紹介しました。
これによってバックエンドをやる気になったかというとそうでもないけど。。。
次回はSQLiteを使ってTBLに格納するところまでやろうかと思います。。。できたらまた記事を書きます
技術系同人誌執筆のすゝめ

# はじめに

こんにちは。今回は技術系同人誌執筆のすゝめということで、技術系同人誌について少し語っていきたいと思います。
本を書くのはちょっとハードルが高いなと思っている方にぜひ読んでいただきたい内容となっております。
（想定読破時間：3分）

## まず技術系同人誌ってなんやねん

### そもそも技術系同人誌イベントって何？説明しよう！

SEの皆々様に置かれましては日々スキルの自己研鑽に努めていることと思います。
ITの世界は幅が広く、アプリケーション層、OS層、ハードウェア層、ミドルウェア層・・・えとせとら
方言によって表現は微妙に異なるかもしれませんが、一口にIT業界としてくくるにはあまりにも広すぎます。
そんな中でも自分の強みのエリアを皆様お持ちだとは思いますが、自分のエリア外は謎の包まれていることも多いと思います。
自分の担当外の未開の土地はどれも刺激的だと思いませんか？（わけわからん謎の技術てんこ盛りってちょっと見てみたくありません？）
そういう、いつもだと目には触れないようなものに気軽に出会えるのが（技術書典などの）技術系同人誌のイベントだったりします。

### 出版本と同人誌

また、自己研鑽といえば出版されている本を読まれる方が多いのではないでしょうか。
（AmazonにてC言語で調べると6000件以上、Javaでも5000件以上あるようです）
本を読む理由は初学者で一から学びたいということや、中級者で実践的なスキルを付けたいことなど様々かなと思います。
そういう本も見ていて勉強になるから楽しいんですが、すっきりと書かれているイメージがあります。
それと比較して、いろんな人が自分の好きなもの（技術）に関して好き放題書かれている本、それが技術系同人誌です。
（オタク君が自分の推しについて早口で楽しそうに語るアレです）
イメージとしては、出版されている本は大学の講義、同人誌はフリーマーケットのような感じです。

### テーマパーク

そういう技術系同人誌があるイベントは「ITのテーマパークに来たみたいだぜ　テンション上がるなぁ～」（ひろし）という感じでいるだけでワクワクします。
何というかこう、好きなモノ（者・物）しかない空間のように思えたりして好きなものに囲まれている感覚になります。
というわけで皆様、一度はそういうイベントに参加してみてもらえると空気がわかると思います。

## 鉄は熱いうちに打て（一般参加した後は是非サークル参加を！）

参加者としてイベントに参加するとすごい刺激を受けまして、自分でも生み出してみたい！と思うと思うんですよね。 ~~ワイトもそう思います。~~
というわけで熱が冷めないうちに是非応募用紙をもらうことをお勧めします。こんなものは勢いです。

技術者として日々研鑽をする中で、きっとアウトプットをしてみたいと思ってると思うんです。
そう、Qiitaを日頃見ているそこのあなた！あなたもきっとそうです。アウトプットをするのは楽しいです。
Qiitaに記事を投稿したことがある人ならなおさらそうです。もう既に生み出している側の人間ですから。

## 嬉しさポイント

ここからは技術系同人誌を書いたことのある私がよかったな～と思ったことを書いていきます。

### 強制的に学べる

日々何となく過ぎていくと勉強の時間ってとりづらかったりすると思うんですよね。
でも、本を書かなくちゃいけないとなると否が応でも何かをインプットしなくちゃいけなくなります。
（日々インプットをしていて、アウトプットをするだけ、という人も恐らく学びなおす部分が出てくると思います。）
例えるなら「強制筋トレ機」です。強くなる理由を与えてくれるものです。

### フィードバックがもらえる

本を頒布するのはいろんな人からフィードバックをもらえる機会がもらえるということです。
QiitaやTwitterに投稿した時も「いいね」が付いたら嬉しいじゃないですか。それです。つまりそういうことです。

### 仲間が増えるよ！やったね！

~~おいやめろ~~
イベントを通すと、日ごろ接点のない人と関りができます。
つまり、友達が増えるということです。

### なによりかっこいい

「オレ、本書いてるんだよね」
って言ってみたくないですか？（内容はどうであれ）

## 障害となるもの

ここからは書かない理由について考えてみます。

### 紙の本として出すことの意義

このデジタルの時代に物理本とか・・・という気持ちもわかります。
そういう人は是非電子版でどうぞ。

いや、そういうこと（媒体形式）じゃないことはわかっています。
物理だろうが電子だろうが、形としてアウトプットすることの大切さを是非知ってほしいですねぇ

あとはほら、紙の温かさとかってやつですよ。（）

### 本の形式での作り方がわからん

本としての作り方がわからん？そういう方は後述の私の本を読んでください。（ダイレクトマーケティング）
ラズパイ持ってればだれでも本を作れるようになります。（ダイレクトマーケティング）

## おわりに

「技術系同人誌とはなにか？」「書く理由（はめっちゃある）・書かない理由（はないこと）」を説明してきました。
ごちゃごちゃ言わんととりあえず参加してみてください。

何より自分の好きなことを語るのはとても楽しいです。
それを自分で自由に表現できる空間（本）があるとしたら、遊ばない理由はなくないですか？

# 宣伝

実はここに書いてあるような内容についてもっとしっかり書かれている本がコミケで出るらしいですよ。
そうです、私が書いた同人誌です。来る2022/12/31（大晦日）に開催されるコミケにて頒布予定となっております。
場所は東京ビッグサイトの「土曜日 西地区 "し" ブロック 15a」です。お時間ご都合の作方はぜひ足をお運びください。お待ちしております。
（委託は考え中です。。。）

## 内容

前半は本記事書いたような「なぜ技術系同人誌を書くのか」という内容です。
ここに書いたのはそのほんの一部なので、興味を持った方は是非手に取ってみてください。

後半は実際にラズパイを使って以下のような執筆環境を構築します。
文字を書いたら勝手にPDFが出来上がったりウェブページとして見れたりします。
おまけにDockerとかTexとかも身についてしまう！お得！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/658e410a-0d36-e658-4305-9dad69343bb8.png)

「はじめに」と「目次」をサンプルページとして公開しますので、興味があれば読んでみてください。

https://github.com/aion0721/c101-info

また、コミケのサークル情報については以下です。

[サークル紹介ページ](https://webcatalog.circle.ms/Perma/Circle/10364281/)

では、よしなに！
子どもが体験するべき50の危険なことから学ぶ自分自身の伸ばし方

# はじめに

本記事はMDC Advent Calendar 2022の22日目の記事です。

https://qiita.com/advent-calendar/2022/mdc

今回は読書感想文と思ったことを記録したいと思います。

最近、以下の本を教えていただきまして早速拝読しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/e8a692f7-ad14-7e9a-aca9-b0f508aff141.png)

https://www.oreilly.co.jp/books/9784873114989/

# 概要

基本的には子育て本、ということなのですが、危険なことを体験するというものです。

> 本書は、さまざまな分野から選んだ50の活動を通して「本当の危険を見きわめる力」と「それに対処する力」を身につけるための書籍です。「ナイフを使う」「目かくしで1時間すごす」「強風の中で手作り凧をあげる」「やりを投げる」「ミツバチの巣を探す」「車を運転する」「指を瞬間接着剤でくっつける」などの活動を親子で行うことで、道具を使う技術、とっさの際の身体の使い方、テクノロジーと社会の仕組みなどに関して、体験にもとづいた知識を得ることを可能にします。大人の読者にとっても、子供のころの感覚を取り戻したり、気づかないうちに設けていた制限に気づくためのきっかけになることでしょう。

書籍サイトからの紹介文より引用しました。帯の左下、一番最初の例が「やりを投げよう」なのが非常に印象的です。洋書の翻訳本ということもありますが、普通に生活を送っていたら、やりは投げないな、、と思います。

帯にも書かれているように、危険を見極める力と対処する力を身につけます。体験すべき、と書かれていることがポイントですね。
本を読んだり、動画を見るだけではダメで、実際に体験しないと体・頭が反応できないのかなと思いました。

紹介サイトにも目次として書かれてましたので、50個を紹介しておきます。

> 01 9ボルト電池をなめてみよう
02 あられの中で遊ぼう
03 完ぺきなでんぐり返しを決めよう
04 フランス人のようにキスであいさつしよう
05 車の窓から手を出してみよう
06 釘を打とう
07 車を運転しよう
08 やりを投げよう
09 ポリ袋爆弾を作ろう
10 電気掃除機で遊ぼう
11 石を投げよう
12 ドライアイスで遊ぼう
13 紙コップでお湯をわかそう
14 電子レンジに変なものを入れてみよう
15 走っている車から物を投げよう
16 高いところから落ちてみよう
17 虫めがねで物を燃やそう
18 ひとりで歩いて帰ろう
19 屋根の上に立とう
20 ノコギリを使おう
21 目かくしで1時間すごそう
22 鉄を曲げよう
23 ガラスビンを割ろう
24 空飛ぶマシンを作ろう
25 太陽を見よう
26 かっこいい殺陣を学ぼう
27 パチンコを作ろう
28 木登りしよう
29 パフォーマンスに挑戦しよう
30 小川をせきとめよう
31 地下にもぐろう
32 タイヤを交換しよう
33 ゴミ箱に飛び込もう
34 家電品を分解しよう
35 ゴミの埋め立て地を見に行こう
36 友だちに毒を食べさせよう
37 強風の中で手作り凧をあげよう
38 つなわたりをマスターしよう
39 食洗機で料理をしよう
40 ミツバチの巣を見つけよう
41 公共の乗り物で街を横断しよう
42 レシピ本にさからおう
43 ナイフで削ろう
44 ロープスイングで遊ぼう
45 火遊びをしよう
46 指を瞬間接着剤でくっつけよう
47 ガラスを溶かそう
48 冷凍庫でビンを破裂させよう
49 野宿をしよう
50 なにかしよう

サイエンス、アウトドア、料理系など様々ですね。全部というわけではないですが、親子でやってみたいと思えるものだらけです。

# そこから自分にどう当てはめるか

社会人になると、組織のルールに沿って、とか周りはやってないから、、とかで自然と変な（？）経験はしなくなってきているのかなと思います。特に体を動かしたりすることはそうですね。
似たような経験としては、アクティビティや、旅行などはあると思いますが、私は過去行ったようなところに何度も行ってしまいます。

この本で学んだこととしては、新しい経験、環境に身を置くということをやっていかないと、自分自身伸びていかないというところもあるのかなと思いました。それはプライペートも仕事も一緒です。

# おわりに

危険なこと、というと怖いところもありますが、あえてそれをやる、体験するのは大事ではないでしょうか？
ブログ等で今年やりたい100のこと、みたいなものを書く人がいますが、来年は上記も参考にしつつ、書いてみようかなと思いました。

簡単ですが、以上です。
IFTTTについての初歩的な知識

# ジャンル
ワークフロー自動化 

# プラットホーム
1. ウエブ版

# 料金

1. Free
    - アプリ数 2
    - アプリの速度　標準
    - DIY または発行されたアプリ
    - アプリの実行は無制限
    - モバイルアプリへのアクセスは無料
    - シンプルなノーコード統合
1. Pro (350円/月)
    - アプリ数 20
    - アプリの速度　高速
    - アプリのマルチアクション
    - カスタマーサポート
1. Pro+ (700円/月)
    - アプリ数無制限
    - プロと同等の機能
    - 複数アカウントとの接続
    - 開発者ツール
    - 優先度の高いカスタマーサポート

　無料版だと、アクティブなアプレットは2つまでという制限があります。それ以上作成する場合は、以前のものをArchiveに入れ、非アクティブにする必要があります。

# 概要
　IFTTTとは、If This Then Thatの頭文字を取ったもので、数多くのトリガーとアクションを備えた自動化ツールです。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/370634df-a639-f8c1-fedb-326d3c7bff00.png"/>

　業務系のウエブサービスとの連携では、業務を自動化して作業効率をアップします。注目すべきは接続できるサービスの多さで、位置情報を使ったトリガーや、ラズベリーパイやMESHなどのIoT製品、アイロボットの操作など、スマートホームへの接続などが行なえます。

　作成したフローは公開することができるので、数多くの他の人が作ったフローを検索し、自分で使うこともできます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/24924fac-c043-66dc-2d73-8610183626a6.png"/>

　巷で人気になっているだけあって、たくさんのアプリを検索しているだけで、楽しめます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/4a756008-a339-131c-1527-1129879ffe8a.png"/>

　Blinkシステムっていうのは、ホームセキュリティ・システムのことなので、決してホーム・アローンのように、泥棒に対して致命的な攻撃を仕掛ける訳ではありません。多分。
　まずは、提供されているアプリを使ってみることから始めてみるがいいと思います。
AWS認定クラウドプラクティショナー合格に向けて Day21

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day20](https://qiita.com/Ayako_0224/private/524f29667eaa7f801246)

# AWS責任共有モデル
セキュリティに対してAWSとユーザーで責任範囲を分けて対応している
AWSの責任範囲...データセンター、AWSインフラストラクチャなど
ユーザの責任範囲...利用するAWSサービス、アクセス権限、構築したアプリケーションなど
## 継承される統制
ユーザーがAWSから完全に継承する統制
物理統制と環境統制がある
## 共有統制
### パッチ管理
AWSはインフラストラクチャのパッチ適用や修復に責任を負うが、ユーザーはOSやアプリケーションのパッチ適用に責任を負う
### 構成管理
AWSがインフラストラクチャデバイスの構成を保守するが、ユーザは独自のOS,DB,アプリケーションの構成に責任を負う
### 意識とトレーニング
AWSがAWS従業員のトレーニングを実施するが、ユーザーの従業員のトレーニングはユーザーが実施する
## ユーザー固有の統制
AWSサービスにデプロイするアプリケーションに基づいて、ユザーがすべての責任を負う統制

# IAM
AWS Identity and Access Managementの略
安全にAWSを使うための認証や許可の仕組み

## IAMポリシー
アクセス権限を付与するための設定ドキュメント(JSON方式)
- Effect (許可or拒否)
- Action (対象のAWSサービス)
- Resource (リソース)
- Condition (アクセス制御の条件)

## IAMユーザー
IAMポリシーで権限を付与されたユーザーのこと
- ルートアカウント(AWSアカウント作成時に作られるIDアカウント)
- 管理者権限(IAMユーザーの管理までできる)
- パワーユーザー(フルアクセス権限を有する)

## IAMグループ
グループとして権限をまとめて設定された単位のこと
組織単位でAWSを利用する際に便利

## IAMロール
AWSリソースに対してアクセス権限をロールできる

## 認証方式
利用するツールに応じて異なる
- アクセスキーID/シークレットアクセスキー
- X.509 Certificate
- マネジメントコンソールへのパスワード
- MFA(多要素認証)

## アクティビティの記録
目的に応じて様々なアクティビティを管理する方法が用意されている

- IAMアクセスアナライザー
- アクセスアドバイザーのService Lact Accessed Data
- Credential report
- AWS Config
- AWS CloudTrail

To be continued...
緯度経度から距離・面積の算出精度について

# はじめに
緯度経度から範囲内か検出する処理について記述したturfpyは
公式ドキュメントを確認すると距離や面積のように他の算出もできることがわかる
その精度についてまとめる

https://turfpy.readthedocs.io/en/latest/measurements/distance.html

https://turfpy.readthedocs.io/en/latest/measurements/area.html

# 確認方法
豊田スタジアムの縦と横の距離や面積を算出する
天然芝部分115m×78m
=面積:8970平方メートル
google mapで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632401/8d93274b-af03-584b-173b-14f6ef7fdd8b.png)
縦115メートル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632401/1ae39f0b-efa3-1a31-57c3-fc3310853233.png)
横78メートル
google mapの精度は良い

# 距離算出
turfpyで距離算出する
```python
# 縦
from turfpy import measurement
from geojson import Point, Feature
up = Feature(geometry=Point((35.085060714540326, 137.17072559325422)))
down = Feature(geometry=Point((35.08405221734936, 137.1710561065781)))
measurement.distance(up,down,units="m")
# > 90.09394736166121[期待値：115m]
# 横
left = Feature(geometry=Point((35.08450366860094, 137.1704693906022)))
right = Feature(geometry=Point((35.084674403537015, 137.17130142525738)))
measurement.distance(left,right,units="m")
# > 93.54724844615103[期待値：78m]
```
長く出るはずの縦が短くなる。
10m単位でずれる、精度は悪い。

# 面積算出
4端の緯度経度を指定して面積を算出
```python
from turfpy.measurement import area
from geojson import Feature, FeatureCollection

geometry_1 = {
    "coordinates": [[
        [35.08495757288702, 137.17033453483242],
        [35.08513216008627, 137.17114392284444],
        [35.08412708307099, 137.17146555796265],
        [35.083959294868194, 137.1706393577829]
        ]],
    "type": "Polygon",
}

feature_1 = Feature(geometry=geometry_1)
feature_collection = FeatureCollection([feature_1])

area(feature_collection)
# > 7935.377349566643[期待値：8970平方メートル]
```
こちらも精度が悪い

# 精度の良い方法
geopyというライブラリが精度が良い

https://geopy.readthedocs.io/en/stable/#module-geopy.distance

# 縦と横の距離算出→面積算出
縦と横の距離を算出して、積で面積を算出する
```python
from geopy.distance import geodesic

up = (35.085060714540326, 137.17072559325422)
down = (35.08405221734936, 137.1710561065781)
left = (35.08450366860094, 137.1704693906022)
right = (35.084674403537015, 137.17130142525738)

vertical = geodesic(up, down).m
# > 115.87357738551685[期待値：115m]
horizon = geodesic(left, right).m
# > 78.20522543208969[期待値：78m]
stadium_area = vertical * horizon
# > 9061.919241057036[期待値：8970平方メートル]
```
緯度経度を取得する際のクリック精度もあるが
距離の精度が１ｍ以内と良いので面積も近い値になる

# まとめ
turfpyの情報が少ないので
使い方の問題か、なぜ近い値が出ないかまでわかりませんでしたが
新しいライブラリは使用する前に
使いたい精度が出せるか確認する必要があるなと思いました