OmniAICreator/Qiita-1.07M huggingface dataset:
WEB制作最新技術まとめ

WEB制作でモダーンなホームページ制作を目指して、
いろんなライブラリーを使ってみました。
せっかくなのでその感想と今後使ってみたいライブラリの紹介をしたいと思います。

## 最近マスターした技術：

1. アニメーション（SVGやDOMなど割となんでも）
https://greensock.com/gsap/
:clap_tone2: パフォーマンス！なんでもできる
:thumbsdown_tone2: 慣れるまで時間かかる、覚えないといけないことが多いい

2. 慣性スクロール
https://locomotivemtl.github.io/locomotive-scroll/
:clap_tone2: パフォーマンス！カスタマイズ性が高い。
:thumbsdown_tone2: ピードやラープなどの設定が可能ですが、ブラウザーによってスUXが大きく変わります。チェックしながら調整しないといけない。

3. 非同期画面遷移 : https://barba.js.org/
:clap_tone2: ページ遷移までアニメーションかけられる、ページ遷移がかなり軽くなる。vueやreactなどの知識がなくてもモダーンなWEBサイトが作れる。
:thumbsdown_tone2: ちょっと複雑、いろいろ気をつけないといけないことがある。Nuxtなどの方が開発スピードが速いかも。

## もっと使いたい、絶対マスターしたいライブラリー

1. WEBGL経由で3Dコンテンツを制作できる
https://threejs.org/

2. WEBGL経由でVRコンテンツを制作できる
https://aframe.io/

## さらに試したいライブラリー

1. CANVASのためのライブラリー
https://www.createjs.com/

2. 慣性スクロール（＆カスタムバーLOCOMOTIVEより機能が少なくてシンプルかも）
https://idiotwu.github.io/smooth-scrollbar/

以上です！
C# レシピ集

## 日付に関する操作
### 今日の日付、月初月末の日付
```C#
// 集計日
DateTime today = DateTime.Today;
// 月初め
DateTime monthStart = new DateTime(today.Year, today.Month, 1);
// 月終わり
DateTime monthEnd = new DateTime(today.Year, today.Month, 1).AddMonths(1).AddDays(-1);

// 日付挿入
挿入する箇所.Text = today.ToShortDateString();
```

## 数字に関する操作
### 最大公約数を求める
```C#
// ユークリッドの互除法 
public static long Gcd(long a, long b)
{
    if (a < b)
        // 引数を入替えて自分を呼び出す
        return Gcd(b, a);
    while (b != 0)
    {
        var remainder = a % b;
        a = b;
        b = remainder;
    }
    return a;
}
```
UnityのMessagePack for C#でCodeGenerator動かない時の対応方法

# 結論
暫定的には、.Net core sdk の3.1系を入れて、global.jsonをAssetsフォルダに追加しよう。
将来的には、MessagePack for C#ライブラリのアップデートを検討しよう。

# 原因
MessagePack for C#のCodeGeneratorは .Net core sdkの3.1系を前提に作られている。
しかし、.Net core sdkの最新は5.0系であり、またdotnet系コマンドは最新版を優先的に使おうとしてしまうせいでエラーが発生する。
エラー内容はこんな感じ（検索に引っかかるように記載）

```
Project Compilation Start:Assembly-CSharp
failed to get metadata of System.Threading.Tasks.Task`1
failed to get metadata of System.Threading.Tasks.Task
Fail in console app running on MessagepackCompiler.RunAsync
System.InvalidOperationException: failed to get metadata of MessagePack.MessagePackObjectAttribute
   at MessagePackCompiler.CodeAnalysis.ReferenceSymbols..ctor(Compilation compilation, Action`1 logger) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 58
   at MessagePackCompiler.CodeAnalysis.TypeCollector..ctor(Compilation compilation, Boolean disallowInternal, Boolean isForceUseMap, String[] ignoreTypeNames, Action`1 logger) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeAnalysis\TypeCollector.cs:line 280
   at MessagePackCompiler.CodeGenerator.GenerateFileAsync(Compilation compilation, String output, String resolverName, String namespace, Boolean useMapMode, String multipleIfDirectiveOutputSymbols, String[] externalIgnoreTypeNames) in D:\a\1\s\src\MessagePack.GeneratorCore\CodeGenerator.cs:line 61
   at MessagePack.Generator.MessagepackCompiler.RunAsync(String input, String output, String conditionalSymbol, String resolverName, String namespace, Boolean useMapMode, String multipleIfDirectiveOutputSymbols, String[] externalIgnoreTypeNames) in D:\a\1\s\src\MessagePack.Generator\MessagepackCompiler.cs:line 65
   at ConsoleAppFramework.ConsoleAppEngine.RunCore(ConsoleAppContext ctx, Type type, MethodInfo methodInfo, String[] args, Int32 argsOffset)
```

既にこの問題は認知されており、現時点ではアルファですが対応版もリリースされてはいます。
https://github.com/neuecc/MessagePack-CSharp/releases/tag/v2.3.58-alpha

なので、将来的にはライブラリのアップデートで完結する話なわけですが、
まだアルファだから導入したくない OR 都合上アプデできない、という人向けの対応が今回の話です。

# 暫定対応
## 導入済みSDK確認
まず自分のローカル環境を確認するため、コマンドプロンプトで下記を実行してください。

```
dotnet --list-sdks
```
これで3.1系が入ってるなら問題ないんですが、入ってない場合はインストールする必要があります。

## .Net core sdk 3.1系インストール
https://dotnet.microsoft.com/download/dotnet/3.1

**Build apps - SDK**の最新をインストールしてください。
インストール後、コマンドプロンプト再起動して、導入できたか確認しておくと良いと思います。

## Assetsフォルダ下に global.json を追加

```global.json
{
  "sdk": {
    "version": "3.1.0",
    "rollForward": "latestFeature"
  }
}
```
https://docs.microsoft.com/ja-jp/dotnet/core/tools/global-json?tabs=netcore3x

設定項目詳細は上の記事を読んでください。
簡潔に説明すると、3.1.xxx に該当する.Net core SDKを使うよって指定です。
チーム開発だと、PCごとに入ってるバージョン違ったりすると思うので、こうしました。
（※可能であれば揃えたほうが良いとは思います）

とりあえず自分の環境ではこれで動きました。
WindowsでWebP画像を作成する

## 環境

- Windows 10 64bit

## 前提

本記事のやり方はPowershellの最低限使用できることを前提にしています。

## 事前準備

### 1. 公式サイトからツールをDLする

https://developers.google.com/speed/webp/download

![スクリーンショット 2021-05-27 111549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267610/c868b03b-0515-4974-0bea-ad3daff34e53.png)

### 2. 解凍し、フォルダへ格納する

以下のディレクトリに解凍したフォルダを格納する。

```
C:\Program Files (x86)
```

![スクリーンショット 2021-05-27 112012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267610/27b9b358-a1e2-4129-451d-12e037d3b982.png)

### 3. 環境変数を通す

Windowボタンから「環境変数」と検索すると「環境変数を編集」とでてくるのでクリックすると以下の画面が立ち上がる。

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267610/c5d5b5d1-ca9a-ded3-9c8c-705734a1b433.png)

Pathをダブルクリックし、新規で以下の値を追加する。

```
C:\Program Files (x86)\libwebp-1.2.0-windows-x64\bin
```

### 4. Powershellで以下を実行してみる

```
$ cwebp -h
$ dwebp -h
$ gif2webp -h
```

helpコマンドがでてきたら成功

少し長かったがここまでで準備完了

## 画像をwebpに変換する

JPGやPNGをwebpに変換するには以下のコマンドを利用する

```
cwebp {元となる画像} -o {出力したい画像}
```

例：

```
cwebp fileneme.png -o filename.webp
```

## 参考リンク

https://blog.codecamp.jp/seo-measure-webp
[Webを支える技術] JSONについて

# JSONとは
JavaScriptの記法を使ってデータを記述できる便利なデータ記述言語です。
多くの言語で使われるデータ記述言語で、主に設定ファイル、データの受け渡し、データの保存などに使われます。
JSONの定義については、こちらの記事が詳しいと思います。

https://qiita.com/momonoki1990/items/cd9a65498c2b16b0ed55

## 記述方法
基本的には、変数が要らなくなったJavaScriptのオブジェクトの書き方です。

```json:sample
{
  "browsers": {
    "firefox": {
      "name": "Firefox",
      "pref_url": "about:config",
      "releases": {
        "1": {
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
      }
    }
  }
}
```
例引用

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON

> JSON は、オブジェクト、配列、数値、文字列、真偽値、そして null をシリアライズする構文です

のように、オブジェクトにプロパティを書いて、その中身を記述できます。

```json:JSONで記述できる書き方
{
  "name": "micchili",
  "live": true,
  "money": 10000,
  "hairetu": [
    "a",
    "b",
    "c",
  ],
  "object": {
    "a": "a",
    "b": false,
    "c": 1,
  },
  "hairetuAndObject": [
    "js": {
      "javascript": "javascriptは最高",
    },
    "ruby": {
      "rails": "ruby on railsは最高"
    }
  ]
}
```

また、プロパティを数値にこともできます。

```
{
  "data": {
    1: {
      name: "micchili",
    }
    2: {
      name: "mil",
    }
  }
}
```

この場合、データを取り出す際には配列のように取り出します。

```javascript:数値のデータの取り出し方
console.log(data[1].name, data[2].name);
```

このように、データの受け渡しに非常に便利な汎用性の高いデータ記述言語がJSONです。
Neural Network Console 2.1.0のprotobufエラー

久しぶりにNNCを使おうと、新しいバージョン(NNC2.1.0)をダウンロードして解凍・起動したらプラグインアップデートで
AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'
とのエラーが出て止まってしまい、学習も出来なかった。(別のPCでは大丈夫でした）

以下のサイトを参考にprotobufのアップデートを試みたところNNCの起動に成功したので記録を残す。
https://stackoverflow.com/questions/61922334/how-to-solve-attributeerror-module-google-protobuf-descriptor-has-no-attribu

NNCのプロジェクトや評価タブを右クリックしてMore Toolsからコマンドプロンプトを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/8fb768ac-bd47-6844-c9d6-da72fb7037d4.png)

pip list などでNNC210の隔離環境であることを確認した後

```
pip install --upgrade protobuf
```
pip checkでtensorflowとの咬み合いに若干問題があるようだが学習と評価が出来るようになった。
UbuntuでBoot-repairをしてもGNU GRUBのMinimal bash...画面が起動時に出る場合の対処法

# 前提
CSM:有効 (Non uefi)
マシンにUbuntu**のみ**インストールしたい
Ubuntu 18.04LTS
Boot repairで修復できなかった

# 事象
・Ubuntuインストール後に
Minimal bash like line editing is supported...となり、grubのコマンドラインが出てくる
**exitと入力すればUbuntuを起動できるが、そもそもgrubの画面は欲しくないのでこれをなくしたい**

・Boot repairも試したが、UbuntuをUEFIモードでインストールしてと言われて、Boot repairでは修正できない。

https://help.ubuntu.com/community/Boot-Repair

・UEFIでなくCSMでインストールしたい

# 対処法
Ubuntuを"Erase Disk and Install Ubuntu"のオプションを選んで再インストールする。
これでディスクのパーティションなどが完全にフォーマットされます。
これ以外のオプションでは症状は治りませんでした。

# なぜこれでいけたのか？
これまでOSインストールでパーティションが混在しややこしくなっていた可能性。
"Erase Disk and Install Ubuntu"で完全にディスクをクリーンにすることで、完全に無の状態からUbuntuをインストールできたためと思われる。


# 教訓
**長い間使っていたクラスタをアップデートするときは可能な限り無に近い状態に戻す**
パーティションがマシンによって色々な分けられ方をしている可能性があるので、とにかくディスクを無の状態にする
これにより、後々Ansibleとかで自動セットアップするときにパーティションの問題でplaybookが思うように動かない、などを防止できる
**クラスタの環境はハードウェアに近い部分はなるべく一致させる（パーティション）**
ADX2でアクショントラックのパスを確認するスクリプト

#はじめに
ADX2のアクショントラック利用していると
アクショントラックがどこ参照しているんだっけ？
ってことが一度はありますよね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/b5bf9145-4a5e-5883-8209-94fb42daa3c8.png)

こんな感じでアクショントラックのコメントに参照しているパスを表示するスクリプト（[ADX2ロボット機能](https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_api.html)）を紹介。

#使い方
アクショントラックまたはその上位のオブジェクトを選択して実行

#スクリプト アクショントラックのコメントに参照キューのパスを書き込む

``` MDS_ZSetActionTrackComment.py
# --Description:[tatmos][Set]アクショントラックのコメントに参照キューのパスを書き込む
import sys
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug
import cri.atomcraft.preview as acpreview
import cri.atomcraft.view as acview

# 選択しているアクショントラックを得る
actionTracks = acproject.get_selected_objects("ActionTrack")["data"]
if not actionTracks :
    # アクショントラックが選択されていない場合は、選択項目の下のアクショントラックを探す
    # 選択項目を取得
    parent_objs = []
    for parent_type in ["CueSheet", "CueSheetFolder", "CueFolder", "Cue"]:
        parent_objs.extend(acproject.get_selected_objects(parent_type)["data"])

    # 選択項目以下のアクショントラックを取得
    actionTracks = []
    for parent_obj in parent_objs:
        actionTracks.extend(acproject.find_objects(parent_obj, "ActionTrack")["data"])

if not actionTracks :
    acdebug.warning("コメントに参照キューのパスを書き込むアクショントラックを選択してください.")
    sys.exit()

#アクショントラックのコメントにパスを書き込む
for actionTrack in actionTracks:
    actionTrackPath = acproject.get_value(actionTrack, "TargetObject")["data"]
    comment = "\"{0}\"".format(acproject.get_object_path(actionTrackPath)["data"] )
    acdebug.log(comment)
    acproject.set_value(actionTrack, "Comment", comment)

```

#おわりに
参照しているアクショントラックをCraft上で選択するとかスクリプトでできるとありがたいので、機能強化に期待しつつ

環境：Craft 3.45.00



#スクリプト　リンクキューのパスをコメントに書き込む
似たようなケースでリンクキューもあるかと思うので書いたもの

``` MDS_ZSetLinkCueComment.py
# --Description:[tatmos][Set]キューリンクのコメントに参照キューのパスを書き込む
import sys
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug
import cri.atomcraft.preview as acpreview
import cri.atomcraft.view as acview

# 選択しているキューリンクを得る
cueLinks = acproject.get_selected_objects("CueLink")["data"]
if not cueLinks :
    # キューリンクが選択されていない場合は、選択項目の下のキューリンクを探す
    # 選択項目を取得
    parent_objs = []
    for parent_type in ["CueSheet", "CueSheetFolder", "CueFolder", "Cue"]:
        parent_objs.extend(acproject.get_selected_objects(parent_type)["data"])

    # 選択項目以下のキューリンクを取得
    cueLinks = []
    for parent_obj in parent_objs:
        cueLinks.extend(acproject.find_objects(parent_obj, "CueLink")["data"])

if not cueLinks :
    acdebug.warning("コメントに参照キューのパスを書き込むキューリンクを選択してください.")
    sys.exit()

#キューリンクのコメントにパスを書き込む
for cueLink in cueLinks:
    targetPath = acproject.get_value(cueLink, "LinkCueSynth")["data"]
    comment = "\"{0}\"".format(acproject.get_object_path(targetPath)["data"] )
    acdebug.log(comment)
    acproject.set_value(cueLink, "Comment", comment)
```

# 使いどころ
キューリンクやアクショントラックのあるキューを他のキューシートへ移動した時に、
リンクが切れてしまう場合があって、
こんな感じで、コメントにパスがあると、修復しやすい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/d93ebd4c-5f69-0526-fbad-66faee23cc8c.png)
firebase-tools の update 後に --version で TypeEerror

# 環境

firebase CLI

$ firebase --version
8.18.1

# なにをしたのか

Firebase の Firestore のルール検証を行うために、Local Emulator Suite をインストール。その後、Terminal に以下のメッセージが表示されたので、「新しいバージョンでたのかー」程度の認識で、興味本位で実行。

```terminal
   ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   │                                                                                                                     │
   │                                          Update available 8.18.1 → 9.12.0                                           │
   │                    To update to the latest version using npm, run npm install -g firebase-tools                     │
   │   For other CLI management options, visit the CLI documentation (https://firebase.google.com/docs/cli#update-cli)   │
   │                                                                                                                     │
   │                                                                                                                     │
   │                                                                                                                     │
   ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
```bash
$ npm install -g firebase-tools
```

# どうなったか

インストールできたか確認すると、TypeError が表示され、バージョンすら表示されず。

```bash
$ firebase --version
***\nvm\v15.3.0\node_modules\firebase-tools\node_modules\@google-cloud\pubsub\build\src\pull-retry.js:24
    google_gax_1.grpc.status.DEADLINE_EXCEEDED,
                      ^

TypeError: Cannot read property 'status' of undefined
    at Object.<anonymous> (***\nvm\v15.3.0\node_modules\firebase-tools\node_modules\@google-cloud\pubsub\build\src\pull-retry.js:24:23)
    at Module._compile (node:internal/modules/cjs/loader:1102:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1131:10)
    at Module.load (node:internal/modules/cjs/loader:967:32)
    at Function.Module._load (node:internal/modules/cjs/loader:807:14)
    at Module.require (node:internal/modules/cjs/loader:991:19)
    at require (node:internal/modules/cjs/helpers:92:18)
    at Object.<anonymous> (***\nvm\v15.3.0\node_modules\firebase-tools\node_modules\@google-cloud\pubsub\build\src\message-stream.js:23:22)
    at Module._compile (node:internal/modules/cjs/loader:1102:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1131:10)
    at Module.load (node:internal/modules/cjs/loader:967:32)
    at Function.Module._load (node:internal/modules/cjs/loader:807:14)
    at Module.require (node:internal/modules/cjs/loader:991:19)
    at require (node:internal/modules/cjs/helpers:92:18)
    at Object.<anonymous> (***\nvm\v15.3.0\node_modules\firebase-tools\node_modules\@google-cloud\pubsub\build\src\subscriber.js:28:26)
    at Module._compile (node:internal/modules/cjs/loader:1102:14)
```
※一部マスキングしてます（***）

# どうしたか

firebase-tools の バージョンをダウングレード。

```bash
$ npm install -g firebase-tools@^8.18.1

$ firebase --version
8.20.0
```

# 結論

よく分かってないのに、脳死でコマンド run はダメ絶対
任意のディレクトリにインストールしたgccを使ってBoostライブラリをビルド＆インストールする方法

# はじめに

gcc 11.1.0を`/opt/gcc-11.1.0`にインストールして、それを使ってboost 1.76.0をビルドしようとしてはまってしまいました。その解決策を残しておきます。

- OS : RHEL 7.9
- gcc : 4.8.5（パッケージマネージャでインストール）、11.1.0（ソースコードからビルド）
- python : 3.6（パッケージマネージャでインストール）

# 手順

まずboost 1.76.0をダウンロードして解凍します。

```console
cd ~/Downloads
wget https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.gz
tar zxf boost_1_76_0.tar.gz
```

次に`b2`を古い方のgcc (v4.8.5)を使ってビルドします。`PATH`にgcc 11.1.0へのパスを加えていないので、自動的にデフォルトのgcc 4.8.5を使ってビルドされます。ここまでは[Boostライブラリのビルド方法 - boostjs](https://boostjp.github.io/howtobuild.html)と同じです。

```console
cd boost_1_76_0
./bootstrap.sh
```

次にboostのビルドに必要なパッケージをインストールします。

```console
sudo yum install libicu libicu-devel python3 python3-devel
```

解凍したboostディレクトリ内の`tools/build/example/user-config.jam`をboostディレクトリ直下にコピーします。

```console
cp tools/build/example/user-config.jam .
```

コピーした`user-config.jam`の最後に以下の内容を加えます。ディレクトリパスやpythonのバージョン等は適宜自分の場合に読み替えてください。

```:user-config.jam
# Configure gcc
using gcc : : /opt/gcc-11.1.0/bin/g++ : <cxxflags>"-I/opt/gcc-11.1.0/include -L/opt/gcc-11.1.0/lib64" <linkflags>"-Wl,-rpath -Wl,/opt/gcc-11.1.0/lib64" ;

# Configure python
using python : 3.6 : /usr/bin/python3 : /usr/include/python3.6m : /usr/lib ;
```

以上で準備ができたのでビルドします。`/opt/boost-1.76.0`にインストールするとして`--prefix`を設定しています。

```console
./b2 toolset=gcc \
  --build-dir=build \
  --prefix=/opt/boost-1.76.0 \
  --user-config=user-config.jam \
  stage
```

エラーが出ていなければビルドが成功しているのでインストールします。

```console
./b2 toolset=gcc \
  --build-dir=build \
  --prefix=/opt/boost-1.76.0 \
  --user-config=user-config.jam \
  install
```

# 最後に

こういうの面倒だから、本当は各自が`vcpkg`とかを使って自分が使うライブラリをローカルインストールしたほうがいいですね。
rails6でjQeryを確実に導入する方法

# 背景
railsに画像スライドショーのslickなどのプラグインを導入する際に、
jQeryの導入が必須になり、ただ導入するだけかなり時間がかかってしまったため、
忘れない様にという自分のためと、同じレベルの方が苦労しなくていいように作成します！

# やりたいこと
・slickなどの画像スライドショーツールをrubyで使用したい
・そのためにjQueryを導入したい

# 動作環境
rails (6.0.3.7)

# 手順
①jQueryのインストール
②Webpackの設定
③application.jsの設定
④動作確認

# ①jQueryのインストール
Rails5以前の導入方法ではjquery-railsというGemをインストールするのが基本のようですが、
Webpackerで管理する際はyarnコマンドを使用してインストールします。
＊私はこの時点で間違えていました＊

rails6以降
```
yarn add jquery
```

# ②Webpackの設定
config/webpack/environment.jsファイル内に下記を記述する。

```config/webpack/environment.js
const { environment } = require('@rails/webpacker')
// 以下追記
const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)
// ここまで
module.exports = environment
```

# ③application.jsの設定
javascript/packs/application.jsにrequire('jquery')を記述する

```javascript/packs/application.js
//中略

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
// 追記
require('jquery')

//中略
```

# ④動作確認
なんでもいいのでjQuryの記述をして検証ツールで確認してみる。
私は、Javascrypt ディレクション内にtest.jsというファイルを作成し、下記コードを記述しました。
例

```test.js
$(function() {
  console.log("OK");
});
```
下記のように検証ツールで問題なく表示されたら導入成功！！
[![Image from Gyazo](https://i.gyazo.com/a35df25f69539091c54a739169812623.png)](https://gyazo.com/a35df25f69539091c54a739169812623)


##注意
最後の導入テストフェーズで、test.jsを作って記述する際は、
javascript/packs/application.jsにrequire('../test')を記述して作成したファイルを読み込ませる必要があります！！

```javascript/packs/application.js
//中略

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require('jquery')
// 追記
require('../test')

//中略
```

#振り返り
過去の記事を参考にし、gem'jquery-rails'でbundle成功したので導入できてないことを全く疑ってませんでしたw
slickやswiperなどいろんなスライドショーのプラグインを試したが軒並みエラーが出たので途方に暮れていました。
その時、コンソールで動作テストをしたときに、jQueryの記述が読み込まれないことに気づきました。。。
もしかして導入方法が違うのか？と調べた時に[Rails6でのjQuery導入方法](https://qiita.com/tatsuhiko-nakayama/items/b2f0c77e794ca8c9bd74)という記事に出会い、無事導入するに至りました。

もう少し早く、テストコードで試していればよかったのですが、
bundleの下記表記を信じて疑わなかったです。

```
Bundle complete! 26 Gemfile dependencies, 101 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

slickなどの使用方法はまた別の記事で書きますー！
AWS ご利用開始時に最低限おさえておきたい10のこと

**AWS ご利用開始時に最低限おさえておきたい10のこと**

https://pages.awscloud.com/JAPAN-event-OE-At-least-10-basic-2020-confirmation-639.html

> 初心者には難しい
初回はざっくりで良いので目を通す程度でOK
何度も見返すべき資料
AWS Well-Architected Frameworkがどんなものなのか理解できていればOK

概要

- toB向けの利用における注意点の紹介ウェビナー
- AWS Well-Architected Frameworkは何か
- AWS Well-Architected Frameworkに基づくベストプラクティスに即して注意点を紹介

## はじめに

AWSを利用する上で最低限抑えておきたい設定などを理解する
↑ その為にAWSのベストプラクティス集を活用する
= それはつまり " AWS Well-Architected Framework " の集大成
→ ビジネスの成功率を上げる

### 目次

1. AWS Well-Architected Framework (W - A)
全体像を理解する

2. AWS ご利用開始時に最低限おさえておきたい
    1. セキュリティ5項目
    2. 信頼性5項目
    3. コストの最適化3項目
3. まとめ

よく聞くお客様からの声
オンプレミスでの経験は豊富だが、クラウド最適化のノウハウがない...
→ オンプレミスの知識は役に立つ + α クラウドの知識を追加しよう

## 1. AWS Well-Architected Framework (W - A)

AWS Well-Architected Framework (W - A)とは？
システム設計・運用の"大局的な"考え方とベストプラクティス集
バッドノウハウ グッドノウハウをまとめたドキュメント
W-Aも進化し続けている　(10年以上の経験が詰め込まれている

クラウドでの一般設計原則 6個ある　← 迷った時に立ち戻る

ベストプラクティスを理解
→ 判断材料 = リスクや改善点を顕在化させる

W-Aの活用方法
W - Aでレビュー → 改善計画 → クラウドの最適化( 次のワークロードに生かす)

## 2. AWS ご利用開始時に最低限おさえておきたい

46項目のレビュー項目がある。その中でも「**特に優先度が高いのに見落とされがちな項目**をチェック」

### (1)セキュリティ5項目 (5/11)

**SEC1　ワークロードの認証情報と認証をどのように管理していますか？**
AWSルートアカウント
メールアドレスと設定したパスワード
アカウントの全てのサービスやリソースに完全なアクセス権を持つ
⇄ MFA(他要素認証)を設定し、極力使用しない。

IAMとは
個IDを払い出して、各人々に配布して利用してもらう

**SEC2　AWSサービスへの人為的なアクセスをどのように管理するか**
IAMユーザとIAMグループを用いて、最小限の権限を付与する
IAMユーザ - 必要最低限の権限を追加する, その都度追加, 期限を設定
IAMグループ - 重複する権限をまとめ、その中に所属させる

**SEC3　AWSサービスへのプログラムによるアクセスをどのように管理するか**
認証情報をハードコーディングせず、IAMロールを活用する
IAMロール：認証情報を扱う
git-secrets という機能も便利やで（多分git guardian的立ち位置

**SEC4　ワークロードのセキュリティイベントをどのように検知し、調査していますか？**
セキュリティ関連のログを取得し、一元的に管理する
→　AWS CloudTrail：全ての操作ログを確保する
オンプレミスにはないクラウドの強い機能
アプリケーションのログも活用した方がいい
Amazon GuardDuty 疑わしい動きを検知して通知できる機能

**SEC6　ネットワークをどのように保護していますか？**
各レイヤーで保護設定を行う
二重三重でセキュリティを付与する（アプリケーション, サーバーなど

### (2)信頼性2項目 (2/9)

**REL6　どのようにデータをバックアップしていますか？**
バックアップ取得・定期的な理科場テストでRTO・RPOを活用
各サービスのバックアップ機能を活用する 手動・自動

**REL7　システムがコンポーネントのエラーに耐えるように設計していますか？**
マルチAZまたは複数のリージョンでシステムが実行されている、疎結合なアーキテクチャを採用
障害を監視し実動的に監視するシステムがある
キーワード：単一障害点を排除する

### (3)コストの最適化3項目

**COST2　AWS使用料とコストをどのようにモニタリングしていますか？**
請求ダッシュボード・AWS Cost Explorer
IAMユーザで請求情報とコストダッシュボードへのアクセスを許可する[ルートユーザーにて]
AWS Cost Explorerをオンにする[ルートユーザーにて]
AWS Budgets 事前に設定した閾値を超えた場合通知

**COST5　コスト目標を達成するためにインスタンスアイプとサイズをどのように選択していますか？**
メトリクスに基づきサイジング
AWS CloudWatchでリソース状況を確認する
使用率が安定している場合(高すぎ・低すぎ) → インスタンスタイプの見直しを検討 ex.) m 5 . large など

**COST6　コスト削減の為に料金モデルをどのように選択していますか？**
理由率を基に購入オプションを検討・リージョン毎の価格差を考慮する
コンプライアンスやレイテンシーなどのビジネス要件を考慮しつつ、リージョン毎を考慮する
購入オプション ex.) オンデマンドインスタンス/リザーブドインスタンス/スポットインスタンス

### おまけ

AWSのサポートプラン というものがある。

## 3. まとめ

本セクションはAWS Well-Architected Framework (W-A)の中の、優先度の高い特定の項目を紹介。
これらのベストプラクティスを活用するのが最も効率的。
オラクルDB　LIKE句　でバインンド変数を使う

## 開発環境とやりたいこと
---開発環境
言語：C#
RDMS：オラクルDB

---やりたいこと
バインド変数を用いてLIKE検索

## 実装できなかったコード
``` C#
//～～省略～～
conn = DbConnect();

string sql = string.Empty;
       sql += "SELECT * from テーブル名";
       sql += "where カラム名 like '%:parameter%'";

using (cmd = CreateSelectCommand(sql, conn))
{
    cmd.BindByName = true;
    cmd.Parameters.Add("parameter", フロントから受け取るパラメーター名);

    using (da = new OracleDataAdapter(cmd))
    {
        da.Fill(ds, 接続するテーブル名);
    }
}
//～～省略～～
```
### なぜ実装でいなかったのか？？
`sql += "where カラム名 like '%:parameter%'";`原因はここの行です。
正確には`'%:parameter%'`ここですね。
かりに今回バインドされた変数が`hogehoge`だったとしたらこのようにしょりされてしまいます。
`sql += "where カラム名 like '%''hogehoge''%'";`
これでは当然うまくいきません。
僕の頭の中では`sql += "where カラム名 like '%hogehoge%'";`このように行くと思っていたんですけどね、、

### なぜこのよなうな処理になるのか？？
仮にバインドされる変数が`hogehoge`ではなく`--hogehoge`だった場合を考えてみましょう。
ここではっと来た人がいるかも知れません。

そうです。もしバインド変数に`--`が入っていた場合に文字列として扱わないとコメントアウトされてSQLが動かなくなってしまいますね！！

## 最終的に実装したコード
``` C#
//～～省略～～
conn = DbConnect();

string sql = string.Empty;
       sql += "SELECT * from テーブル名";
       sql += "where カラム名 like :parameter%";

using (cmd = CreateSelectCommand(sql, conn))
{
    cmd.BindByName = true;
    cmd.Parameters.Add("parameter", "%" + フロントから受け取るパラメーター名) + "%";

    using (da = new OracleDataAdapter(cmd))
    {
        da.Fill(ds, 接続するテーブル名);
    }
}
//～～省略～～
```

バインドした後に加工されてしまうのでバインドされる前に出力したいようにセットしてあげようということでこのように実装することで期待する動作が確認できました！！
レスポンシブルwebデザインとは・macOSのversionを確認する方法

➀レスポンシブルwebデザイン
　どんな機器や画面でもwebデザインを見やすく表示すること。

②macOSのversionを確認する方法

'sw_vers'

実行した結果

```ruby:ターミナル
user1noMacBook-ea:~ user1$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G8022
```

参考文献
https://www.kagoya.jp/howto/webhomepage/responsive/
https://qiita.com/niwasawa/items/1b12ad162abb7f84eff9
google広告極めようぜ

google広告って毎回仕様変わっちゃうよね。


# キャンペーンと広告グループって何？

キャンペーン => 大カテゴリ
広告グループ => 中カテゴリ (複数作れる)

みたいな感じ

# 検索キーワードを見る

赤枠でフィルタがかかっていると何も表示されないので注意

![keyword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/5d3a6d4a-a051-65dd-2c33-d92c4c898e09.png)


# アセットを編集

![hen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/c32fd0f9-1718-9fe6-0bab-a2a2bf61706e.png)

ここでできるだけ、広告文等を追加しておくのがコツ。

# chatgptで広告分を作成する際のウルテクプロンプト

```
# 洗脳

あなたは、プロの広告文章ライターです


# したいこと
宣伝したいサービス: [あなたのサービス]
目的: google広告に出稿に広告を出稿した際、ユーザーの増加が最大限期待できる文章

# 制限
文字数 : 全角40文字以上45文字まで
文章構成 : 数字も使って煽るような書き方で


# アピール内容

誰でも
簡単に
儲かる
女性客多い
女優も使っている


# 出力

上記文章を3つ書いて下さい
```



# 1日の最大予算を変更

予算の右側にある、ペンアイコンをクリックする
ポップアップされるので、1日の最大予算を入力

![saidai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/3a96e2f2-bed7-dfab-4d94-b87d97727353.png)

# google広告に質問した内容

# 広告審査が不承認になったんだけど

自分で確認して問題がなければ問い合わせてね。
AIが誤審する場合もあるのでその場合は人力で審査します。
=> 結果承認されました

# いろんな広告文を試していいの？

いいよ。原則として広告が不承認になったとしても試したからアカウント停止ってのはあんまりないから安心してね。

以上
Azure FunctionsのTimerTrigger（など）をMac環境で動かす

## Azure Functions のTimerTriggerをVSforMacで作る

HTTPTriggerだと何も気にせずVSのみで完結するのだが、他のTriggerはAzure Storage Emu.が必要
しかもそれをちゃんと知らずに動かすとよくわからんエラー吐いてしまう、という落とし穴あり。
（なんかそれに関する警告とか出してくれればいいのに…）
ちなみにこんなエラー↓
`The listener for function 'Function1' was unable to start.
Microsoft.Azure.Storage.Common: Connection refused.
System.Net.Http: Connection refused.
System.Private.CoreLib: Connection refused.`
verboseフラグとかつければもっと詳細に出るかもしれないが。

### Azuriteを入れる

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite#run-azurite-from-a-command-line

こういうことだそうな。
Azuriteを入れて動かしておかないとHTTPTrigger以外のAzure Functionsはちゃんと動かない。
なので、上のページに従ってAzuriteを入れる。
（最近はMSのドキュメントでもVSCode前提の記事が多い、ちゃんとVS前提の記事もほしいんだが…）

#### npm install -g azurite　で良いと思う

Dockerイメージとかあるけどサクッと入れれるnpmにした。
開始方法はこちら
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite#run-azurite-from-a-command-line
パスの書き方はmacに合わせること。

まだ手動で開始しないといけないらしい。

Azuriteを起動していたらちゃんと動くようになった。

 
## 追加）HTTPTrigger以外のものをHTTPで呼び出す
TimerTriggerを手動で動かせないので、デバッグやりにくい…
と思っていたが、こういう方法があるみたい。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-manually-run-non-http
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash#non-http-triggered-functions
このあたりを参照
デプロイ後でもHTTP経由でアクセスできるみたい。（Headerにキーは必要）

ローカル実行中なら以下のようなURLになる。
`http://localhost:{port}/admin/functions/{function_name}`
portはデフォルトなら**7071**
【SQL】DISTINCT, 四則演算

#はじめに
今回は、取得したデータを加工するにはどうすればよいかをみていこうと思います。

#DISTINCT
重複するデータを除くことができます。
DISTINCTはSELECTに指定します。
以下のようにすることで、usersテーブルのnumberカラムから重複するデータを除きます。

```SQL
SELECT DISTINCT(number)
FROM users
```
![ScreenShot 2021-05-27 9.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/8d2f947e-2371-ad29-342c-dc512f39962a.png)

#四則演算
以下のようなテーブルのpriceを全て税込にした表を作りたいと思います。

![ScreenShot 2021-05-27 9.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/de3cddc9-b3bc-cbfb-65c8-e92b2156cc85.png)

```SQL
SELECT number, name, price, price * 1.10
FROM foods;
```

![ScreenShot 2021-05-27 10.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/1b204738-df65-616b-142f-1876c961e137.png)

他にも足し算は`+`, 引き算は`-`, 割り算は`/`を使います。


#おわりに
少しずつ難しくなっていきますが、がんばりましょう！
【ワンライナー】半角スペースを含むファイル名をアンダースコアに置換する

## なぜ必要だったか

`株式会社 テスト.png`のようなファイル名を `mv`で一括処理する時にファイル名に半角スペースが入っていたので、

`mv 株式会社 テスト.png` とコンピュータに解釈され、`株式会社`というファイルはないと怒られた。なのでファイル名の半角スペースを削除しておきたかった。

## 手順

[rename](https://qiita.com/shuhei/items/cf1ddf373d1f83d5d667)コマンドを、`Homebrew` でインストールします。（Mac以外の方は適宜読み替えてください）

```
$ brew install rename
```

下のコマンドでカレントディレクトリ以下の、ファイル名の半角スペースをアンダースコアに置換します。

```
$ find . -type f | rename "s/ /_/;"
```


## 結果

無事 `株式会社_テスト.png` というファイル名に置換できました。
白背景・黒背景でも「コントラスト比4.5:1」を確保できる色の例

# 背景色の候補

* `white` （＝ `#fff` ）
* `black` （＝ `#000` ）

# どの背景色候補にも コントラスト比4.5:1 を確保できる色の例

* (グレースケール上) `#767676`
* (Rのみ) `#ee0000`
* (RGのみ) `#7a7a00`
* (Gのみ) `#008800`
* (GBのみ) `#006cff`
* (BRのみ) `#d000d0`

※「Bのみ」の色では、どの背景色候補でも コントラスト比4.5:1 を確保できる色を見つけられず。

# コントラスト比の確保確認に用いた、ありがたい資料・ツール

* [waic.jp - WCAG2.0 解説書 : 1.4.3 コントラスト (最低限)](https://waic.jp/docs/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html)
* [HEX Contrast Ratio Calculator](https://hex-crc.dskd.jp/)

## 参考

前述のツール 「HEX Contrast Ratio Calculator」 で試すための、カラーセット連想配列：

```
[
{"front":"#767676","back":"#ffffff"},
{"front":"#767676","back":"#000000"},
{"front":"#ee0000","back":"#ffffff"},
{"front":"#ee0000","back":"#000000"},
{"front":"#7a7a00","back":"#ffffff"},
{"front":"#7a7a00","back":"#000000"},
{"front":"#008800","back":"#ffffff"},
{"front":"#008800","back":"#000000"},
{"front":"#006cff","back":"#ffffff"},
{"front":"#006cff","back":"#000000"},
{"front":"#d000d0","back":"#ffffff"},
{"front":"#d000d0","back":"#000000"}
]

```

[eof]
Spring boot で謎のエラーが起きた時の対処法

Eclipseで作成したSpringプロジェクトで、時々プロジェクトフォルダーのエラーが消えないという現象が起きました。
しかし、フォルダーを開いても原因のファイルは見つからなかったり、Spring Boot アプリケーションを実行してもなにもエラーがなく動きます。エラーログも吐きません。

今回、現場でのエラーだったためキャプチャはありませんが備忘録として残します。

対処法は以下の3つです。
①Mavenの対処
 プロジェクトフォルダーを右クリック＞実行＞Maven Clean
 プロジェクトフォルダーを右クリック＞実行＞Maven install

②プロジェクトの対処
 プロジェクトフォルダーを右クリック＞リフレッシュ
 プロジェクトタブ＞Clean

③ ①も②も試して解決しなければ
 プロジェクトフォルダーを右クリック＞Maven＞プロジェクトの更新
 ①と②を実行する

この3つを行うことでエラーは消えました。
もし参照プロジェクトがある場合は、エラーが出ていなくても上記の手順を行ってみてください。
原因は分からないままなので、またこの現象が起きたら調査してみたいと思います。(原因がわからないので再現が難しい…)
【GoogleCloud】グループについて

BCEを確認したら、適用対処のグループに「classroomの教師」というのが出てきたので、調べた
＝＝＝
classroomの教師はデフォルトでできるグループみたい　
https://support.google.com/edu/classroom/answer/6071551?hl=ja

https://groups.google.com/all-groups　→右上のClassroomクリック→右上の９つの丸から「グループ」クリック
ここで新しいグループを作ってみた
BCEの画面で選択できるようになっていた
おそらくグループアドレスみたいな感じだと思う
　そのレベルで制限できる

グループを削除したい場合は、作成したグループを選択して画面一番下までいく
aibo（ERS-111）の電池（ERA-111B）の復活チャレンジ #2

https://qiita.com/ABK28/items/68143f632133f07084cf
の続きです。

#バッテリーの再改造

すぐに止まっちゃうってことは、動き出すときにたくさん電力を使うことで、一気に放電しちゃって、そこで保護回路が働いて、止まっちゃうのではないか？と想像して、電池容量を増やすことにしました。

とは、言っても、保護回路付きの１８６５０電池にしたため、そのままでは、4本は入りません。

思い切って、ケースの はじっこ を切り取って、電池を飛び出させる作戦にします。

###最初のバーション
↓↓↓↓↓
![IMG_5823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/7fe4e7cf-2e4d-7f43-2851-9825b6080af3.jpeg)


###再改造バージョン
↓↓↓↓↓
![IMG_5849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/ef547614-85d8-5ec5-c80f-d1799ab12448.jpeg)

バッテリを入れるところのフタで無理やり、電池を押さえてる感じです(^^)


#動くかな？

歩きました！
バッチリ！

###と思ったら？？

5分くらいは、うろうろします。
やったー、って思ってたら、ピロロロって鳴って、寝ちゃいました。

電池を外したら、とても熱かった。
熱くなって止まったのかな？？

#今回は、ここまで

電池が冷えたころ、起動すると、また5分くらい歩きます。
とりあえずは、復活ってことで・・。

情報ある方、教えて下さいー。
サーバの弱点を知れ　nmap  Vs  密偵を迎撃せよ　PortSentry

#youtubeに動画あります

https://youtu.be/LBA3yRB_0bE


#サーバの弱点を知れ　nmap  Vs  密偵を迎撃せよ　PortSentry

1.nmapのインストール
yum -y install nmap

2.ポートスキャンの実行
nmap -sV 192.168.2.109
-sV … バージョン検出

☆対策☆
・不要なポートを閉じる
・PortSentry で迎撃

1.下準備
apt update
apt upgrade
reboot

2.インストール
apt -y install portsentry
※デフォルトだとログに吐き出すのみ

cd /etc/portsentry/
vi portsentry.conf
BLOCK_UDP=”1”
BLOCK_TCP=”1”
KILL_HOSTS_DENY=”ALL: $TARGET$ DENY”

vi portsentry.igneer
nmapを許可するサーバを指定

3.再起動
/etc/init.d/portsentry restart
[面接対策]面接で聞かれる質問事項について

#はじめに
面接で聞かれそうな初歩的な質問内容について少ないながらまとめました。

#質問内容

##Rubyと他のプログラミング言語の違いを説明してください
							
私が思うに以下の点をあげることができれば問題ないかと思います。

- 国産のプログラム言語のため日本語文献が多いこと
- 記述量が少なくてソースコードの可読性に優れ、保守性の高いプログラムを制作することができること
- RubyはPHPやPerlとは違い、初期のリリース時からオブジェクト指向が考慮されていた純粋なオブジェクト指向言語
- スクリプト言語のためJavaやC言語と違いコンパイルする必要がないこと

##オブジェクト指向とはどんなものか
難しい言い方はたくさんあるかと思いますが、自身も理解できてない状態なのであれば以下のように初心者に説明するつもりで伝えるといいのではないかと思います。
「オブジェクトとは、ざっくりいえばデータとメソッドをまとめたもので、これらを使い「モノ」を組み立てるように表現して、コンピュータを動作させて動かすプログラミングの概念」と言えばいいのではないでしょうか。

正確な100点であると言うより自分なりの理解を示し、それがおおよそ正解していることが重要なのではと感じます。


##Cookieが何かで仕組みについて教えてください

Cookie（クッキー）は、Webページなどで、ブラウザに情報を保存するための仕組みの1つです。
クライアントコンピュータが、あるWebサーバーに初めて接続した際に、Webサーバーがクライアントコンピュータの中に、そのWebサーバー専用のCookieファイルを作成し、次回、クライアントコンピュータが同じWebサーバーに接続したときには、WebブラウザがそのCookieをWebサーバーに送信するといった仕組みをとります。

##クラスとインスタンスの違いを教えてください

クラスはインスタンスの元となる雛形のことであり、インスタンスはクラスから作成された実体のことです。車でいうと、設計図がクラスで車そのものがインスタンスにあたります。

##アプリケーションサーバーとWebサーバーの違いはなんですか

Webサーバはブラウザからリクエストを受け取ったり、レスポンスを返したりします。一方、アプリケーションサーバーは、そうしたリクエストに対して作成したプログラムを実際に動かすサーバーです。ただの静的なコンテンツだけの表示であればアプリケーションサーバーは必要としません。

##バブルソートとはなんですか？簡単に説明してください

隣り合う要素の大小比較と並べ替えを繰り返すことで、全体を並べ替えるやり方で、並んだものを降順あるいは昇順に並び替えます。

#おわりに

簡単にまとめました。
これが絶対に正解というわけではないのでご注意ください！！
また、もっとこうした方がいいといったアドバイス等がございましたらご指摘くださると幸いです
【laravel 8】 undifined type 'Validator' エラー解消

# はじめに
laravel8で投稿機能のコントローラを実装していたときに出た`undefined type 'Validator'`エラーの解決方法についての記事です。

# 環境

PHP 8.0.6
laravel 8.42.1


# エラー内容

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;
use Validator;    // ここ

class PostController extends Controller
{
    public function store(Request $request)
    {
　　　　　　　　　　(省略)

        $validator = Validator::make($form, $rules, $message);

　　　　　　　　　　(省略)

    }
}

```

↑の`use Validator`のところをネットの記事を参考に色々と変えてみても↓のようにValidatorが未定義と言われてしまいました。

![undefined_validator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381842/dc6d9ae7-6748-6a2f-e556-5635a9d26014.png)


# 解消方法

色々な記事を漁ってもうまく行かず、最終的に公式ドキュメントで調べてみたら

```php
use Illuminate\Support\Facades\Validator;
```

laravel8では↑を使うようでした。。。

# まとめ

新しいバージョンこそ公式ドキュメント大事。。。
【動画あり】Metasploitで脆弱性をついてサーバを乗っ取る

#youtubeに動画あります
https://youtu.be/Us6eQ4kse6g

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924512/4d09c072-a335-207f-f7fd-c263204636a4.png)
【PHP】json_enode()で配列がオブジェクト型に変換されるのを阻止したい！

PHPで都道府県一覧をjsonで返却するAPIを作成した時に躓いたので、備忘として。
## はじめに
配列の中にオブジェクト型のKeyValueを格納したいい感じのjsonを作りたい時って、ありますよね？

```json
{
    "prefs": [
        {"1":"北海道"},
        {"2":"青森県"},
        {"3":"岩手県"},
        ︙
    ]
}
```
このような構造にすれば、受け取り側でオブジェクトの順序が入れ替わることがないのでいい感じです。ただ、実際にPHPでこれを実装しようとしたところ以下のようになりました。

```php:sample.php
$prefs_array = array('prefs' =>
    [
        '1' => '北海道',
        '2' => '青森県',
        '3' => '岩手県'
    ]
);
$prefs_json = json_encode($prefs_array);
```
```json:$prefs_json
{
    "prefs": {
        "1":"北海道",
        "2":"青森県",
        "3":"岩手県",
        ︙
    }
}
```
あれっ…これいつものjsonフォーマットや。これだとオブジェクトの順序の保証がされないのでなんとかしたいですね。

## 解法
json_encode()で変換する対象の配列を1次元配列ではなく**2次元配列**にします。

```php
$prefs_array = array('pref' => 
    [
        array('1' => '北海道'),
        array('2' => '青森県'),
        array('3' => '岩手県'),
    ]
);
$prefs_json = json_encode($prefs_array);
```
こうすることで最初に提示したjsonフォーマットが作成できます。

## 参考
https://dev-lib.com/php-json-array/
【動画あり】ダークウェブに安全に潜入してみた

###※youtube動画でも解説してます
https://www.youtube.com/watch?v=4krFUk_xQcY
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924512/3594d8b8-7b01-04fc-694a-844065c38905.png)
DNS rebinding attack とは？

## 勉強前イメージ

DNSの応答を利用して、その人になりすます的な攻撃？

## 調査

### DNS rebinding attack とは

DNSを使用して同一生成元ポリシーを回避して、重要な情報など取得する攻撃である
`同一生成元ポリシー` というのは `あるオリジンで読み込まれたリソースが異なるオリジン(クロスオリジン)のリソースへの通信・アクセスに制約をかけるもの` で、
要するに、 `DNSを使用して別のオリジンにデータを送信してデータを取得する` 攻撃です。

### 例

例としては、
フィッシングメールなどで被害者に偽サイトに誘導、偽サイトに悪意のあるスクリプトを設置しておいて
再度アクセスさせるとDNSが別IPを返し、そのサイトで入力された情報を悪意のあるサイトへ送信する方法である。

図としては以下になります。
ここでは、偽サイトと本物サイトを例としてますが、全部がそうじゃないと思います。

まず登場人物のご紹介

- 被害者 : データを盗まれる被害者
- 偽サイト : 偽サイト.com で、IPは a.a.a.a
- 本物サイト : 本物サイト.com で、IPは b.b.b.b

![2021-05-26 Untitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f29afdee-cea6-23f8-c004-e669ef9ac863.png)


1. 被害者をフィッシングサイトなどの誘導で 偽サイト.com にアクセスさせる
2. DNSサーバは 偽サイト.com のIPアドレスは a.a.a.a と返す
   ただし、このときのTTL値は1秒などとても短い期間にしておく
3. 被害者は a.a.a.a の 偽サイト.com にアクセス
4. 偽サイト.com は 被害者に悪意のあるJavaScript を送る
   送られた被害者は、 `偽サイト.comにアクセスし、得た内容はa.a.a.aに送信させる` スクリプトを設置される
5. 再度 偽サイト.com にアクセスしようとしたらDNSキャッシュが切れてIPアドレスが分からなかったので、再度DNSサーバに問い合わせ
6. DNSサーバは  偽サイト.com のIPアドレスは b.b.b.b と先ほどとは違う本物サイトのIPアドレスを返す
7. 被害者は a.a.a.a の 偽サイト.com(実情は本物サイト.com) にアクセスを行い、ログインなどし重要情報を入力
8. 7で入力した値は 4の `偽サイト.comにアクセスし、得た内容はa.a.a.aに送信させるスクリプト` により 偽サイト.comに送信され、重要情報が盗まれる

## 勉強後イメージ

元々のイメージとは違ったね....
調べたらなるほど？ってなるけど思いつく人すごいなーって思う(小並感)
DNSサーバ側で1回目はTTL値1sでこのIP、2回目はTTL値変えてこのIP、みたいなのどうやってんやろ

## 参考

- [設計から考える「かんたんログイン」の限界(4) 脅威3 DNSリバインディング](https://www.gsx.co.jp/tts/activity/110111.html)
- [DNS Rebindingを悪用してインターネットからプライベートネットワークへの攻撃](https://nanashi0x.hatenablog.com/entry/2018/07/23/210000)
Pythonのビルトインスコープについて

Pythonには「ビルトイン」というスコープもあることを知ったので、学んだことをまとめておきたいと思います。

## ビルトインスコープとは
筆者みたいにPython未経験で他言語の経験がある場合、**ローカルスコープ**と**グローバルスコープ**はピンとくる方も多いと思うのですが、これとは別に「**ビルトインスコープ**」というものがあります。

先にスコープの範囲を図で表すと以下のような感じになります。
![ビルトインスコープ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/999df107-ba8e-6297-d858-8dbd2e5aa97b.png)

名前からするとグローバルが一番広い（外側）ように思えてくるのですが、そうではなくてビルトインが一番広いというのは個人的にはハマりポイントかなと思います。

このビルトインスコープですが、具体的にどんなスコープなのかと言うと「**複数のファイルをまたがったスコープ**」となります。
実際に簡単なプログラムを書いて確認していきたいと思います。

以下は、`main.py`でfooモジュールをインポートして、show_score 関数を参照しているコードになります。

```python:foo.py
score = 100 # グローバル

def show_score():
  print('score: ', score)
```
```python:main.py
import foo

foo.show_score()
```
```bash:実行結果
python main.py
score:  100
```

main モジュールを少し書き換えてみます。
score は foo モジュールでのグローバル変数なので、main モジュールから参照する場合は、foo モジュールを経由する形になります。

```python:main.py
import foo

print(foo.score)
```
```bash:実行結果
python main.py
100
```

さらに、main モジュールを少し書き換えてみます。
すると、`scoreは定義されていません`エラーが発生しました。
score は foo モジュールでの変数であり、main モジュールの変数ではないため、エラーになっているようです。

```python:main.py
import foo

print(score) # fooモジュールのscore変数を参照したつもり
```
```bash:実行結果
python main.py
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(score)
NameError: name 'score' is not defined
```

**グローバル**という言葉の印象からすると`print(score)`で参照したいところですが、エラーになってしまいます。

## builtins モジュール

上記のエラーを回避する方法として、score を「ビルトインスコープに登録する」があります。
グローバルからビルトインにスコープを広げて、他モジュールから直接参照できるようにするイメージです。
ビルトインスコープへの登録は、`builtins`モジュールを利用すれば実現できます。

```python:main.py
import foo

print(score) # 「foo.」なしにscoreを参照できる
```
```python:foo.py
import builtins

builtins.score = 100

def show_score():
  print('score: ', score)
```
```bash:実行結果
python main.py
100
```

builtins モジュールをインポートし、score をビルトインスコープに登録しています。
上記のエラーがなくなったことを確認できるかと思います。

ただし、何でもかんでもビルトインスコープに登録してしまうと、かなり危険なコードになってしまうためくれぐれもお気を付けください。

ちなみに、上記コードにも登場した print 関数ですが、これはビルトインスコープに存在しています。
そのため、`モジュール名.print()`みたいに書く必要がないのですね。

## 補足
本記事ではビルトインスコープに注力したかったため触れていませんが、実は他にも「エンクロージングスコープ」というスコープもあるようで、興味のある方は調べてみてください。


## 参考ページ
- [Pythonのスコープについて](https://note.crohaco.net/2017/python-scope/)
- [［Python入門］関数のローカル変数とスコープ：Python入門（2/3 ページ） - ＠IT (atmarkit.co.jp)](https://www.atmarkit.co.jp/ait/articles/1905/24/news019_2.html)
- [【Python入門】スコープを理解してコードの読解力を上げよう](https://blog.codecamp.jp/python-scope#:~:text=%E2%96%A0%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E2%96%A0,open()%20%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%AD%E3%80%82)
try-catch-finally文を利用した例外処理について

# try-catch-finally文を利用した例外処理について
Javaでは実行に発生したエラーを例外と呼びます。  
例外が発生した場合、Java上で例外に対する処理を記述していない場合、プログラムはそこで強制終了します。  
下記のコードは意図的に例外を発生させ、実行結果を確認しています。  

```JAVA
public class Main {
	public static void main(String[] args) {
        int[] test = {1,2,3};
        for(int i = 0; i <= 3; i++){
            System.out.println(test[i] + "回目のループ")
        }
        System.out.println("ループ終了");
    }
}
```
実行結果

```
1回目のループ
2回目のループ
3回目のループ
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at test.Test.main(Main.java:5)
```
例外(ArrayIndexOutOfBoundsException)発生時にプログラムが強制終了し、"ループ終了"が表示されていない事が分かります。  
# 例外処理
次は例外に対する処理を記述し、例外が発生してもプログラムが強制終了しないようにしてみます。  
例外に対する処理文は次のような構文になります。

```
try{
    例外が発生する可能性がある処理
}catch(例外のデータ型 変数名){
    指定された例外が発生した場合に実行する処理
}finally{
    例外の有無に関わらず実行する処理
}
```
この構文を利用して最初のコードを書き直してみます。

``` JAVA
public class Main {
	public static void main(String[] args) {
        try {
            int[] test = {1,2,3};
            for(int i = 0; i <= 3; i++){
            	System.out.println(test[i] + "回目のループ");
            }
        } catch(ArrayIndexOutOfBoundsException e) {
        	System.out.println("例外発生");
        } finally {
        	System.out.println("ループ終了");
        }
        System.out.println("try-catch-finally外の処理");
    }
}
```
実行結果

```
1回目のループ
2回目のループ
3回目のループ
例外発生
ループ終了
try-catch-finally外の処理
```
例外発生後にfinallyブロックに記述された処理が実行され、try-catch-finally文外の処理も実行されている事が分かります。  
# メソッド内での例外処理
この記述方法ではtry文の中で発生した例外しか検知できず、try文で呼び出したメソッド内で発生した例外を検知する事ができません。  
try文で呼び出したメソッド内で発生した例外を検知させる場合はメソッドの定義時にthrows文を設定する必要があります。  
先ほどのコードの`for文`をメソッド化してthrows文を利用した例外処理を行ってみます。

``` JAVA
public class Main {
	public static void main(String[] args) {
        try {
            int[] test = {1,2,3};
            method(test);
        } catch(ArrayIndexOutOfBoundsException e) {
        	System.out.println("例外発生");
        } finally {
        	System.out.println("ループ終了");
        }
        System.out.println("try-catch-finally外の処理");
    }
    static void method(int[] test) throws ArrayIndexOutOfBoundsException {
        for(int i = 0; i <= 3; i++){
        	System.out.println(test[i] + "回目のループ");
        }
	}
}
```
実行結果  

```
1回目のループ
2回目のループ
3回目のループ
例外発生
ループ終了
try-catch-finally外の処理
```
メソッド内で起こった例外がtry内で検知されている事が分かります。  

## まとめ
- JAVAの実行時に発生したエラーを例外と呼び、例外に対する処理を行わないとプログラムがそこで強制終了してしまう。
- try-catch-finally文で例外処理を行う事ができる。
- メソッドにThrows文を追加することで、メソッドを呼び出した部分で例外を検知できる。
Macで外付けHDDがマウントできないトラブルから回復した話

# 状況

- Macでバックアップ用の外付けHDDにトラブル
- HDDがマウントされない
- ディスクユーティリティの First Aid 機能が使えない
- ターミナルのfsck、fsck_hfsコマンドも効かない

検索しても上記から復旧したという話はなかなか出て来ず、一旦詰みました。

そして、同じ症状で困っている方に試して欲しいのが下記です。

# 扇風機でHDDを冷却する

外付けHDDが熱をもっていませんか？
自分のケースではトラブルの原因はこれでした。
外付けHDDの温度が手にもてる程度でしたが熱くなっており、
小型の扇風機で冷やしたところ無事復活しました。
盲点でした。
ハミング距離による類似画像の検出

#はじめに
類似画像の検出方法はいくつかありますが、今回はハミング距離による検出方法について記載します。
備忘録を兼ねて記事を書きますが、コメント等は随時いただけると助かります:bow:

#ハミング距離について
ハミング距離というのは、簡単に言うと、ビットの違いを数えたものです。
同じ長さのビット列を比較し、値が違う箇所を数えると、それがハミング距離になります。

例えば、以下の２つのデータにおけるハミング距離は「3」です。

```
データ１　：　1000100111
データ２　：　0100100110
```

#ハミング距離の求め方
類似画像を検出する際、一般的には、各画像のハッシュ値を取得して、そのハミング距離を求めます。

例えば、画像１、画像２のハッシュ値が以下だった場合

```
画像１　：　58FA9F3AA8AD958AEA6
画像２　：　70FA9D3AA8AD952AAA4
```
以下の２つを使うと、楽に求められます。

・排他的論理和（XOR）
・ビットのカウント

「排他的論理和(XOR)」というのは、２つのデータを比較して、ビットが同じ箇所に0、違う箇所に1を立てる演算方法です。

||排他的論理和(XOR)の例|
|:-:|:-:|
|データ１|０１００１００１１０１０１１０１|
|データ２|１１０１１００１００１０１１０１|
|XOR|１００１００００１０００００００|

このXORのビット列について1が立っている箇所を数えたらいいのですが、プログラム上で計算するより、SQLを使った方が楽です。

先ほどの画像１、画像２のハッシュ値について、ハミング距離をSQLを用いて求めると

```
select bit_count(0x58FA9F3AA8AD958AEA6 ^ 0x70FA9D3AA8AD952AAA4)
```

これだけで済みます。
このSQLの実行結果は「5」なので、画像１と画像２のハミング距離は「5」となります。

どこまでを類似画像と定義するかは要件によって異なるので、検証を重ね、適切な閾値を導いてください。

# 注意点
上記のように、画像をハッシュ化すれば、類似画像の検出を行えます。

しかし、ここで気をつけないといけないのは、ハッシュ化の方法。
やり方によっては、異なる画像で同じハッシュ値になることもあります。

私が見かけたのは、画像をリサイズして大きさを揃え、モノクロ化してハッシュ値を求める方法。

ほとんどの画像では異なる値になりますが、一部の画像においては、見た目が全く違うのに同じハッシュ値になってしまいます。中には、イラストとテキスト画像が同じハッシュ値なんてことも。（たまたま見つけて調査に至りましたが、実際にありました）

どのくらいの精度を求められるかによって、ハッシュ値の求め方もどれを採用するべきか異なります。
（詳しくないので）ここでは言及しませんが、ハッシュ化の方法についても、検証を重ねて採用してください。

# 最後に

あまり使うケースが無い知識かと思いますが、なんらかのタイミングで、この知識が役立つ時が来れば幸いです。

色々と挑戦して、スキルアップを楽しみましょう！
【Javascript】Nullish Coalescing Operator(??)合体演算子を試してみる

#初めに
合体演算子について学習した内容をまとめてみました。

前回の記事：

https://qiita.com/redrabbit1104/items/e002b51e109e120ed6d4
https://qiita.com/redrabbit1104/items/e9b687c6c6d13fbf7c2a

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

#Nullish Coalescing Operator(Null合体演算子）
論理演算子。nullish（nullに近いもの）をcoalescing(合体させた）operator(演算子）のこと。ここでnullishとは「null」と「undefined」を意味します。<b>この「null」と「undefined」を合体させたケース（nullまたはundefinedの場合)を探して、もしその値があれば評価せず、それ以外の値は評価する演算子です。</b>

# 使ってみる
まずは、falsy values（NaN,false,0n,'',null,undefined)の場合、結果はどうなるか試してみました。

```javascript
    let numFruits = NaN;
    console.log(numFruits ?? 10);
    //NaN

    numFruits = false;
    console.log(numFruits ?? 10);
    //false

    numFruits = 0n;
    console.log(numFruits ?? 10);
    //0n

    numFruits = '';
    console.log(numFruits ?? 10);
    //

    numFruits = null;
    console.log(numFruits ?? 10);
    //10

    numFruits = undefined;
    console.log(numFruits ?? 10);
    //10
```
nullとundefinedを除いたその他のfalsy values(NaN,false....など）は全て評価され処理が終わります。falsy valuesを探しにいく「&&演算子」と似ています。

```javascript
    let numFruits = NaN;
    console.log(numFruits && 10);
    //NaN

    numFruits = false;
    console.log(numFruits && 10);
    //false

    numFruits = 0n;
    console.log(numFruits && 10);
    //0n

    numFruits = '';
    console.log(numFruits && 10);
    //

    numFruits = null;
    console.log(numFruits && 10);
    //null  <---ここが違う(??演算子の場合10）

    numFruits = undefined;
    console.log(numFruits && 10);
    //undefined  <---ここが違う(??演算子の場合10）
```

# なぜ使うのか
parkというオブジェクトに木の数が格納されているnumTreesの値を調べる場合、or演算子を使ってtruthy valuesの場合にはその値を表示させ、それ以外の場合にはdefault値を表示させたい時を考えてみました。

```javascript

 const park = {
      numTrees: 0,
    }

    const trees = park.numTrees || 10;
```
木の数が0なので0の値を表示してほしいですが…
![スクリーンショット 2021-05-27 7.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/4fbf37cc-6649-35d5-7ba3-f02af4166278.png)
結果はの10です。これは望んでいた結果とは違いますね。
それでnull合体演算子(??)を使ってみました。

```javascript
 const park = {
      numTrees: 0,
    }

    const trees = park.numTrees ?? 10;
    console.log(trees);
```
コンソールを確認してみると、
![スクリーンショット 2021-05-27 7.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/324e1f4f-cbf1-1215-5675-65ebe93c5862.png)
0という値が表示されました。

# まとめ
null合体演算子(??)は「nullとundefined」以外のfalsy valuesを探しにいき、その値が見つかればShort-Circuitが起こり処理（短絡評価）が終わる。 ||演算子で0が評価されない問題を解決してくれる便利な演算子。

#　参考サイト
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
https://qiita.com/HelloRusk/items/ac116f29cceb3899ec01
Unityの¥n(エスケープシーケンス)って何文字扱いなの？Char型に入れるとどうなるの？

　ノベルゲームみたいに、テキストを一文字ずつ表示する関数を作っていて、` string型`の変数を使って` ToCharArray() `で１文字ずつにバラして、・・・と書いていたのですが、改行のエスケープシーケンス(今回は` ¥n `)の扱いがわけわかめだったので、ちょっとだけ` ¥n `君について調べました。
　初心者の書いた拙い文ですが、読んでもらえるとうれしいです。
#調査方法
・適当なスクリプトを書いて` Debug.Log() `で出力させます。
#知りたかった事
・` ¥n `は何文字？
・` Char型`に入れるとどう格納されるの？
・¥nという文字列で出力されたりしない？
(= `"¥" + "n"`とみなされたりしない？)
#結果
**今回使用したスクリプト↓**

```c#:TextAnimate.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TextAnimate : MonoBehaviour
{
    private string str;
    void Start()
    {
        //エスケープシーケンスがどう出力されるか見たかっただけ
        Debug.Log("aaa¥nbbb");
        //こっちの変数を使って調べる
        string originstr = "aaa¥nbbbbb";
        //文字列の長さを調べる
        Debug.Log(str.Length);
        //originstrの中身を、一文字ずつ配列に入れる
        char chars[] =originstr.ToCharArray();
        //１文字追加するたびに現在の文字列を出力する
        for (int i = 0; i < 8; i++)
        {
            str += chars[i].ToString();
            Debug.Log(str);
        }
    }
}
```

**実行結果(の写し)**
(本当はスクショ貼りたかった)↓

```
aaa
bbb
↓
9
↓
a
↓
aa
↓
aaa
↓
aaa

↓
aaa
b
↓
aaa
bb
↓
aaa
bbb
↓
aaa
bbbb
```
どうやらoriginstrの最後の文字のbは出力されてないみたいですね。
#わかったこと・考察
・`¥n `はこのひと塊で**一文字分として数えられる**。
・だから、**`¥n `は`Char型`に入れる**ということを確信してもいいのではないか。
・`¥n `を代入加算すると、**ふつうに改行してくれる**。
・余計な機能書く必要なさそうだ！やったぜ！！！(個人の話)
#最後に
　二文字で一文字としてみなされるって不思議ですね。なにはともあれ、これで私は安心して制作に戻れそうです(・∀・)ﾔｯﾀｾﾞ
Slack: reacji channeler（リアク字チャンネラー）でreacjiの転送先を確認する


reaction + 字 = reacji リアク字。

https://qiita.com/akira-hamada/items/11f72b0cd92544129c33

reacjiとは何？は上の記事を参照されたし

> 1. SlackのReacji Channelerページで[Add to Slack]ボタンをクリックし、Sklackチームへのアクセスを許可してReacji Channelerを有効にする
2. Slack上で `/reacji-channeler :+1: #thanks` コマンドを入力してReacji Channelerを有効にする
    この例だと、 :thumbsup: されたあらゆる投稿が `#thanks` ページに通知されます
    

だが、このreacji皆が使いだしてくると自分の発言に謎のリアクションがつき、あれ、この発言どこかに転送されたかな？などということが起こる。その際。
`/reacji-channeler help` で以下出ることに気づけなかったのでごく簡単にメモ。

> You can list all the reacji that are set up to send to channels with `/reacji-channeler list`.
> And remove a reacji's assignment to send to a channel with `/reacji-channeler remove :emoji:`.


## `/reacji-channeler list` リアク字を確認する

`/reacji-channeler list` で、全リアク字の設定がリストされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/62c8add2-51b5-9c26-a3a3-79c0c273bd91.png)




## 基本

https://slack.com/intl/ja-jp/help/articles/360000482666-Slack-%E7%94%A8%E3%83%AA%E3%82%A2%E3%82%AF%E5%AD%97%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%A9%E3%83%BC

冒頭の help コマンドでおわかりの通り、
`/reacji-channeler remove :emoji:` で、リアク字を削除できる


以上、ハッピーメッセージング！
どなたかのお役に立てばさいわいです。
楕円と点の当たり判定(JavaScript)

楕円とは、「ある二点からの距離の和が常に一定である点の集合」である。
この「ある二点」を焦点と呼び、「一定」の値は長軸（縦横のうち長い方の幅）の長さとなる。
即ち、横に長い楕円（回転はしない）に限れば、中心の座標、焦点同士の距離、長軸の長さ、という3つの情報から楕円は一意に定まる。

そんな楕円に対して、ある点から当たり判定をけしかけたい。
やることは単純で、点と二焦点との距離の和が横幅より小さければ点は内部にあり、大きければ点は外部にある。

```js:script.js
//点(x1,y1)が楕円[中心(x2,y2), 焦点から中心までの距離f, 横幅w]の内部にあるかどうかを判定する関数
function detectEllipseCollision(x1, y1, x2, y2, f, w){
    if(hypo(x1,y1,x2+f,y2) + hypo(x1,y1,x2-f,y2) <= w){
        return true;
    } else {
        return false;
    }
}

function hypo(x1, y1, x2, y2){//二点(x1,y1), (x2,y2)の距離を返す関数
    return Math.pow(Math.pow(x1-x2,2)+Math.pow(y1-y2,2), 1/2);
}
```

こいつをなんやかんや上手いことやれば、楕円と円、楕円と楕円、回転楕円における当たり判定も実装できる（はず）。