OmniAICreator/Qiita-1.07M huggingface dataset:
Javascriptでバッチを作って実行する（Node.js）

知っている人には当たり前過ぎる情報なので、素通りいただければです。

思い返すと2年前はこれ全然知らなかったなー、、、とふと思ったので参考になる人がいるかもということで記事にしました。

個人的には、お手軽にプログラミングできるのでお勧めです。

# 前提
mac（Windowsでも環境構築すれば問題なく実行できます）

# 用語
## Node.js
- JavaScriptの実行環境
- `node test.js`とかで、JavaScriptをターミナルで実行可能になる
- 例えると`php test.php`のphpに当たるもので良いと思う
- メジャーバージョンよく更新されている=モダン？
    - 更新多いのでバージョン管理ツールを使うと便利（nodebrew, nodenv, anyenv 色々あります。)
        - 最近だとasdfを使って構築する記事をよく見ます

## npm

- Node.jsのライブラリのパッケージ管理ツール
- `npm install {パッケージ名}`とかで、カレントディレクトリに.node_modulesというディレクトリができて、その中にインストールパッケージが格納される
- インストールしたライブラリは、require('モジュール名')で、簡単に使用することが可能です

# 環境構築

## 1. Node.jsを入れる

Qiitaに環境構築の記事はたくさんあるので、適当に探してまねてください。
下記は記事書いてる時に検索で出てきた記事です。参考になれば。

参考：[https://qiita.com/uhooi/items/1fd481bfaf1459e29f6a](https://qiita.com/uhooi/items/1fd481bfaf1459e29f6a)

## 2.プロジェクトフォルダ作る

```bash
mkdir batch
cd batch
```

## 3.node環境構築

```bash
npm init
```

色々聞かれるので全部エンターで大丈夫です。

package.jsonってファイルができます。

4. ライブラリインストール（お試し）

```bash
npm install uuid
```

pacakge.jsonのdependencyという項目に、インストールしたライブラリ情報が自動追記されます。

```bash
"dependencies": {
  "uuid": "^8.3.2"
},
"devDependencies" {}
```

※プログラムの動作上必要なものは、dependencies、nodeのモジュールをツールとして使用時などはdevDependenciesにそのパッケージ情報が入ります。

# コーディング
## 1.ファイル作成

```bash
vi index.js
```

```bash
const { v4: uuidv4 } = require('uuid');
console.log(uuidv4());
```

## 2. 実行

```bash
node index.js
```

```bash
bb0550f3-84d3-444e-b6c2-8928e12eabcb
```

以上。

# まとめ

Node.js自体の環境構築は、書いている記事が多数あったので割愛しましたが、そこが済めば、

1. フォルダ作って
2. npmコマンドちょこっと打つ

だけで実行環境が簡単にできます。
ライブラリも豊富で、簡易ツールも簡単に作成できます。

また、非同期並列処理も手軽に描けるので、aws-sdkを使ったawsサービスの利用とかとの相性も良いです。

使った事ない方は、触れてみる事をお勧めします!
バックログ (MVP) 重要

親会社の社長が後任に席を譲った。会長になるらしい。それに伴い、役員人事も実施された。僕らの管掌役員は凄腕のやり手と噂の鈴木さんになったそうだ。噂によると、思い切った舵取りをするタイプで、期待の薄いプロジェクトをどんどん廃止して、効果の高そうなプロジェクトに集中するという、いわゆる V 字回復とかリストラ職人とか、そーゆー冷徹で剛腕な人らしい。僕らのプロジェクトがどうなるのか、日々、不安に過ごしていた。そんな、ある日、鈴木役員から呼び出された。彼は笑顔で切り出した。

役員「なんでも君のところは、期待の新ビジネスを立ち上げるそうぢゃないか。システムも開発中と聞いているよ。」

お、優しそうな笑顔だ。噂と違って、ちゃんと話を聞いてくれる人っぽいぞ。

役員「できているところまでで構わないから、ちょっと見せてくれないかい?」
PO「わかりました。富井くん、デモはできるかい。」
富井「マシンはあるので、デモはできます。できますけど…。」
PO「では役員にお見せしなさい。」
富井「…いいんですね? …わかりました。」

カチャカチャ…

富井「準備できました。プロジェクターに映します。」
役員「期待の新ビジネス、楽しみだねぇ〜。 ^^」
富井「では始めます。まず、ログイン画面です。ユーザー ID とパスワードを入力します。」
役員「ふむふむ。」
富井「ユーザー ID に不正な文字を入力すると、エラーメッセージが出ます。」
役員「細かいところは飛ばしていいよ。コアなところを見せてくれないか?」
富井「コアですか…。データベースはこうなってます。パスワードはハッシュ値を保存しているので、パスワードの漏洩対策はできてます。」
役員「…なるほど。セキュリティにも配慮しながら開発してくれているんだね。ありがとう。もっと先を見せてもらおうか。」
富井「…デモできるのはここまでです。」
PO「あれ? もうちょっとデモできるだろう? ユーザー登録機能は前回のスプリントで終わってただろ?」
富井「今回のスプリントでテーブル構成が変わったので、手元の環境では、デモは動かないんです。」
役員「…。デモしてくれてありがとう。なるほど、動くのはログインとユーザー登録ということだね?」
PO「はい。順調に開発は進んでいます。」
役員「なるほど。状況は分かった。デモしてくれてありがとう (どうやら、競争力のある機能はまだ開発できてないようだ。このプロジェクトを廃止しても大きな損失にはならないな)。」

---

1. Viable … 存続し続けられる
2. **動くソフトウェアこそが進捗の最も重要な尺度です。** (*"アジャイル宣言の背後にある原則"* より)
Interfaceを満たしているかcompile時に確認

# Overview
ライブラリのコードを読んでいたところ、
`var _ Setter = (*Cmd)(nil)` 
こんなコードがあったので、[effective go](https://golang.org/doc/effective_go)をもとに、なんの意味があるのか確認。

# Detail
[Interface Checks](https://golang.org/doc/effective_go#blank_implements) のセクションに記載がある。

- `Cmd` structが、`Setter` interfaceを満たしているか確認。もし`Setter`の実装が変わり`Cmd`の実装も変更していないと、`var _ Setter = (*Cmd)(nil)` の部分でcompilerによりエラーになり`Setter`の実装が変わったことが気づける。
- blank identifier(`var _ Setter`) にする理由は、`setter`にキャストする`(*Cmd)(nil)`を使わないため。そのためcompilerのエラーをださせないので、blank identifierとなっている。
- `(*Cmd)(nil)`これは、interfaceの要求を満たしているかチェックするためだけなので、新たにメモリを確保する必要がない、というかする意味がないので、`nil`を`*Cmd`にキャストしている。
AWSの用語集

#AWSの用語集
##概要
AWS内のサービスについて自分の調べたものを記録したかったのでこの記事を作成しました。

##ネットワーク

###[Internet Gateway](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)

###[Nat Gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)


###[VPC](https://aws.amazon.com/jp/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&vpc-blogs.sort-order=desc)

> 定義した論理的に分離された仮想ネットワークで AWS リソースを起動できるようにするサービス

AWS内に自分用のIPアドレスを確保できる。


###サブネット
AWS用語ではないがメモ。AWSでは用途別にsubnetを作成し、VPCで確保したIPアドレスからIPを割り当てることができる。


参考: [IPアドレスとサブネットマスクをまとめて表記する](https://www.atmarkit.co.jp/ait/articles/0701/06/news014.html)


##[開発者用ツール](https://aws.amazon.com/jp/products/developer-tools/)

###[AWS CodeCommit](https://aws.amazon.com/jp/codecommit/)

> プライベート Git リポジトリをホストする、安全で高度にスケーラブルなマネージド型のソース管理サービス

要はGitHubのソースコード管理する部分みたいなもの

###[AWS CodeBuild](https://aws.amazon.com/jp/codebuild/)

> ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる完全マネージド型のビルドサービス

ソースコードのビルド、テスト用のサービス

###[AWS CodeDeploy](https://aws.amazon.com/jp/codedeploy/)

> さまざまなコンピューティングサービスへのソフトウェアのデプロイを自動化する、フルマネージド型のサービス

デプロイする用のサービス

###[AWS CodePipeline](https://aws.amazon.com/jp/codepipeline/)

> 完全マネージド型の継続的デリバリーサービスで、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パイプラインのリリースを自動化

継続的デリバリー/インテグレーション(CI/CD)をサポートするサービス。
CodeDeploy、CodeBuildを一連の流れとして記録、何かのイベント(例えばCodeCommitのpushなど)で発火できるようにできる。

###[AWS CodeStar](https://aws.amazon.com/jp/codestar/)

> アプリケーションを迅速に開発および構築して AWS にデプロイできます

webアプリケーションの基礎を作ってくれるサービス。サービスの初期の初期、アイディアの段階でとりあえずプロトタイプとかサクッとつくるのに便利そう
SQL 基礎 Part1

#SQLとは

データベース言語であり、データ分析などを行います。
データ分析とはデータベースに保存されているデータを統計の知識を使って活用します。


##データベースとは

データベースとはテキストや数値などをデータとして保存するツールです。
表でデータを保存しており、表のことをレコード、縦の列をカラム横の列をレコードと言います。

##クエリ

クエリとはデータベースに送る命令のことを言います。
データベースからデータを受け取る時はSELECTと言います。
どのカラムのデータを取得するか選びます。

SELECT カラム名
FROM テーブル名; を使い、どのテーブルのどのカラムを取得するか指定します。
最後のセミコロンまでがクエリです。

もし複数のカラム名を取得する時はコンマで区切りましょう。
全部のカラム名を取得する時は*を使いましょう。

##WHERE

SELECTでカラムを決定します。そして、FROMでテーブルを決定します。
その後で、レコードを決定する時はWHEREを使います。

WHERE　カラム名　　＝ "データ";

カラムによってデータ型が決まっていますが、まずは3つだけ覚えましょう。
テキストはダブルクォーテーションかシングルクォーテーションを使います。
数値は何も付けなく、日付もダブルクォーテーションかシングルクォーテーションを使います。

比較演算子を使ってデータに宣言をすることもできます。

##LIKE演算子

WHERE カラム名 LIKE 文字列
LIKEは〜のようなという意味で、似たようなデータを取ってくることができます。
その時に使うのが、ワイルドカード(%~%)です。
これによって〜を含むデータを取ってくることができます。

ワイルドカードですが、〜%だと前方一致と言って〜で始まるデータを取ります。
％〜だと後方一致と言って〜で終わるデータを取ります。

##NOT演算子

〜以外のデータを取るためにはNOTを使います。
WHERE NOT　カラム名 LIKE < 1000;
この場合だと1000以下以外のデータを引っ張ってきます。

##NULL

NULLとは中身が何か分からない時に使います。
NULLのデータを取得する時はIS NULLを使います。
データが入っている、NULLでは無いデータを取る時は
IS NOT NULLを使います。NULLの時は=は使えません。

##AND OR演算子

ANDを使うことでWHEREに複数の条件を付けることがあります。
WHERE 条件1 AND 条件2；のようにします。

ORはWHERE 条件1 OR 条件2だとどちらかの条件が
当てはまるデータを取ってきます。

##ORDER BY

カラムを並び替えする時はORDER BYを使います。
ORDER BY カラム名 並べ方；
並べ方は2種類あります。ASCとDESCです。ASCは昇順で、小さい数から大きい数に並びます。
DESCは降順で大きい数から小さい数に並びます。

##LIMIT

LIMITを使うことで、最大いくつのデータを取るかを制限できます。

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
使わないコンテナとディレクトリを削除する方法

Dockerで環境構築しててポートが被ったりするたびに.envを書き換えるのもいいけど、とにかくコンテナがごちゃごちゃしてイヤな時、ディレクトリごと消して再出発したいときに使う呪文の順番


`docker ps` 
稼働しているコンテナを確認（停止しているものも見たい場合は末尾に-aを付けて）

`docker stop [containerID]` 
コンテナを指定して止める（複数消したい場合はIDごとにスペース空ければ一気に消せる）
止めておけばとりあえずlocalhostのポート被りは起こらないはず

`docker rm [containerID]` 
必要に応じてコンテナ削除

`cd ../`
ディレクトリ移動

`rm -r [directory]` 
ディレクトリ削除（無理そうならfinderから消してヨシ！）

<hr>

*imageもコンテナも全部消したいときに使う呪文

https://qiita.com/suin/items/19d65e191b96a0079417

`docker-compose down --rmi all --volumes --remove-orphans`
Windows 10で日本語入力ができなくなった時の対処：IMEの再起動

Windows 10で、何かのきっかけで日本語入力ができなくなることがある。PCを再起動せずにIMEだけを再起する方法を紹介。

## 1. Windows Power Shellを管理者権限で起動する.
Menu上のWindows Power Shellで右クリックすると「管理者権限で起動」のオプションが出てくるので、それで起動する。

## 2. 下記でIMEのプロセスを特定する. 

```
PS C:\WINDOWS\system32> tasklist | Select-String ctfmon
ctfmon.exe                   10632 Console                    1     54,408 K
```

ここで、Select-Stringはunix の grepに相当するコマンドで、入力された複数行の文字列のうち、指定された文字列を含む行のみを表示する.

## 3. プロセスをkillする. 

```
PS C:\WINDOWS\system32> taskkill /pid 10632
成功: PID 10632 のプロセスに強制終了のシグナルを送信しました。
```

新しいIMEプロセスは自動的に起動され、日本語入力が正常に戻る.
【あべちゃんのフロントエンド塾】課題２を通して学んだこと

# はじめに
今回の課題は**「お天気アプリを作ろう」**でした。

課題１のポートフォリオサイト作成に比べて、個人的に格段に難しく感じました。

正直、全然課題を進めることが出来なくて途中で「無理かも」と思っていたのですが、グループ内で質問をすることでなんとか前に進めたように思います。

# 作成したアプリについて
![スクリーンショット 2021-07-21 18.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1472874/0de7ad39-9ff0-22dc-23c0-c63a6acfbdad.png)
この写真のように、地名を検索するとその地域のお天気情報を取得・表示してくれるアプリを作りました。


# HTTP通信とは


HTTPとは`HyperText Transfer Protocol`の略で、クライアントとサーバーの間でハイパーテキストを転送するための通信プロトコルです。

HTTPの仕組みは、クライアントがサーバーにHTMLファイル等を要求し、サーバーがクライアントに要求されたHTMLファイル等を返すことでブラウザにWebページが表示されています。

クライアントがサーバーに要求することをリクエストと呼び、サーバーがクライアントに返答することをレスポンスと呼びます。


# RESTAPIとは

・RESTは「RESTの4原則に沿ったシンプルな設計思想」のことで、

　　①統一インターフェース
　　②アドレス可能性
　　③接続性
　　④ステートレス性

　の4つ。

・これらに沿ったシステムを「RESTfulなシステム」という。
・「REST API」と「RESTful API」は、呼び方の違いだけと思って良い。

### 統一インターフェース
統一インターフェースは、あらかじめ定義・共有された方法でやり取りされること。

Webの場合、例えば「GET・POST・PUT・DELETE等のHTTPメソッドでやりとりする」とか「やり取りするデータはJSON形式にしよう」といったものになります。

データの形式にはXML等もありますが、近年は軽量なJSON形式が使われることが多い。

### アドレス可能性

アドレス可能性は、全ての情報が一意なURI（識別子）を持っていて、提供する情報をURIで表現できることです。

このURIは`Uniformed Resource Identifier`の略で、Webの場合は通常URLで与えられます。

### 接続性

接続性は、やりとりされる情報にはハイパーリンクを含めることができる、というものです。

１つのリンクから別の情報にリンク(接続)することができて、RESTfulなシステム同士なら円滑に情報連携を行うことができます。

### ステートレス性
ステートとは「状態」のこと。これがレスなので「状態がない」ということになります。

つまり、RESTでは「やりとりが１回ごとに完結する」と理解することができます。

これは、前のやり取りの結果に影響を受けないのでシンプルな設計にできるというメリットがあります。(セッション管理が不要など)

### WebにおけるRESTの４原則の例

　①HTTP通信で、JSON形式でやりとりするよ → 統一インターフェース
　②このURLの情報ください → アドレス可能性
　③ハイパーリンクを含んだページをあげる → 接続性
　④さっきの情報をくださいと言われても... → ステートレス性

#### 参考
https://tech.012grp.co.jp/entry/rest_api_basics

# 自身が今回の課題をこなす上で苦労した点
「APIを叩いてデータを取得する」という作業が、思った以上に理解に苦しみました。

*「取得したデータがどのようになっているのか、どこにデータが入っているのか」*
*「データを別のコンポーネントで使うにはどうすればいいのか」*

など、コンポーネント間でのやり取りの仕方が、全くイメージ出来ませんでした。

# 苦労した点をどのように克服したか
克服する上で役に立った方法は、大きく分けると以下の２つになります。


1. **３０分悩んでもわからないところは、素直に質問する。**
1. **console.logで細かく状況を確認する**



課題をはじめたとき、分からないことが多すぎて、もはや「何を質問したらいいのかわからない」という状況になってしまいました。

「一つ聞いたところで、またすぐにわからないことが出るから、周りに迷惑をかけるのではないか」と思い、なるべく自分で理解できるように頑張っていました。

しかし、自分では全然どうしようも出来ない状態になってしまっていたので挫折しそうでした。

そんな時、あべちゃんとの月１の対談の中で*「どんどん質問してください。ここはそのための場所なので」*というふうに言って頂けました。

それからは、大体３０分ほど分からない状態が続いたら質問するようにしたところ、質問することで自身の考えもまとまるし、あべちゃんやグループのメンバーからアドバイスを貰えることで少しずつ前に進むことが出来るようになりました。

2つ目のconsole.logの重要性も、今回の課題で気づくことが出来ました。

APIを叩いてデータを取得した場合、そのデータが配列の中にいくつも入っていたりするので、逐一確認していく必要がありました。

また、関数がきちんと動作しているのかなどの確認も`console.log`で細かく行っていきました。

小さなミスが重なることで、エラーが複雑になってしまうため、ひとつひとつ丁寧に実装を進める重要性を改めて感じました。

# 参考サイト
https://www.youtube.com/watch?v=tPK0nDpnu98&t=3s

https://tyotto-good.com/blog/avoid-useeffect-mistakes

https://techplay.jp/column/469

# まとめ

今回は、はじめて触れるものがたくさんあり、本当に大変でした。

useEffect, async/await, axios, APIなどなど、まだまだ使いこなせていないものばかりですが、なんとなく使用するための感覚はつかめたように思います。

ひとまず形にはなったのですが、まだまだ詰めるところはたくさんありそうなので、引き続きブラッシュアップしていこうと思います。
UnityにGoogleAdMobを入れてみたがbuildでエラーが起きる

###UnityのゲームにGoogleAdMobで広告バナーを入れてアプリを収益化しようと入れてみたが…


環境
Unity2019.1.5f1
GoogleAdMobpackage:5.4.0
※6.0.2のバージョンではUnity2019で使うと色々大変だったのでやめた

####エラーが出る前の手順
色々参考にしUnity2019.1.5f1にGoogleAdMobpackage5.4.0で公式に書いてあったスタートガイドの通りにやってみたがビルドした、そこでエラーが384件も出て通らなくなった。

####やってみたこと
Assets>extemalDependencyManager>AndroidResolver>ForceRecolveをやってみたが解決せず
Unity2019.1.5f1を入れなおしてみたがエラーで解決せず

####解決した方法
もう一度エラーログを見てみて
Assets>extemalDependencyManager>AndroidResolver>ForceRecolveをした時にログに
エラーログはとるの忘れてしまったのでうろ覚えで

```
フェッチに失敗しました。
色々エラーが出て

中文に
JAVA_HOMEにパスがが設定されてません、ほにゃらら

この後にまた色んなエラー

```

それでPCのシステム環境変数にJAVA_HOMEを新規で入れてpathにJDKの中のbinファイルを通して再度やってみたら
成功しました！
その後にプロジェクトをビルドしたらDONEと出てAPKが出来たー！

###・まとめ
色々ネットで漁ってるとUnity2019.1.5f1はOpenJDKがついてないらしいく追加モジュールのAndroidbuildsupportにも付いてないみたいだ(Unity2019.4はOpenJDKが付いてる)、でもインストールする時にUnity側で自動的にパスを通してくれると聞いた記憶が・・・
よくわからないけど解決できて広告が付けられるようになったからまあよかった
エラーが出てもビビらないで何を怒られてるかしっかり読み解く事が大事だと教わった
Dockerコンテナにラベルを設定する

# ■labelsを設定

```docker-compose.yml
version: '3.7'
services:
  app:
    container_name: app
    labels:
      - test.container.type=web
```

例えば、コンテナに`test.container.type`というキーで`web`という値を設定します。

設定すると何が出来るのか？

設定すると`docker ps`にフィルターをかけることも可能になります。

# ■起動中のコンテナ一覧から抽出を行う

```bash
docker ps -f 'label=test.container.type=web'
```

上記で`test.container.type`というキーで`web`が設定されているコンテナのみの一覧が表示されます。
とりあえずバージョン管理しつつGoを利用してみる


Go言語を触って見たかったのでローカルで環境を作成しました。
その際に行ったことを備忘録として残しておきます。

# 環境設定
今回はgoenvを利用してGoのバージョンを管理していきたいと思います。
（普段はrbenvを利用しているので馴染みのあるenv系のソフトにしました）

### goenvのダウンロード
まずはgoenvのダウンロードです。

```
$ brew install --HEAD goenv
$ goenv -v
goenv 2.0.0beta11
```

`--HEAD`をつけているのはgoenvの２系を利用するためです。
2021/7/12現在、普通にインストールすると１系になってしまい、goのバージョンが`1.12beta`までしか利用できません。自分は１.１６以上で利用したかったので上記のようにしています。

### goenvのPATHを通す
自分.bashrc`を利用しているのでbashrcに以下を追記します。

```bash:.bashrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval "$(goenv init -)"
```

追記できたらターミナルを再起動するか、`source ~/.bashrc`で変更を反映します
### goのダウンロード
次にローカルにGoの特定バージョンをダウンロードしていきます。

```
$ goenv install -l
.
.
  1.15.13
  1.16.0
  1.16beta1
  1.16.1
  1.16.2
  1.16.3
  1.16.4
  1.16.5

$ goenv install 1.16.5

$ goenv global 1.16.5
```

今回は他にgoを利用しているプログラムがないのでグローバルの設定も1.16.5にしています。
プロジェクトごとに変更したい場合は、対象のディレクトリで`goenv local {version}`を実行すれば`.go_version`というファイルができるのでそのバージョンに固定できます

以上。

あとは`go version`で変更されているか確認すれば終了です。
Reverse Proxyを使用したコンテナへのアクセスにIP制限を設定（Apache）

## ■条件

* `Reverse Proxy`を使用し、各種コンテナに振り分けている
* IP制限は各コンテナで行う
* WEBサーバはApache(2.4)を使用している
* 各コンテナのIPアドレスは「172.16.0.xxx」と仮定
* ホスト側のIPアドレスは「192.168.10.xxx」と仮定

## ■`Reverse Proxy`を気にせずIP制限をした場合

```apache
<VirtualHost *:80>
    ServerName www.local.com
    ServerAlias www.local.com *.local.com
    DocumentRoot /var/html

    <Directory "/var/html">
        Require all denied
        Require ip 192.168.10.100
        Require ip 192.168.10.101
    </Directory>
</VirtualHost>
```

上記の設定は「192.168.10.100」と「192.168.10.101」からのアクセスのみを許可したい場合の設定です。
ですが、<font color=red>「192.168.10.100」からアクセスを行ってもエラー</font>となります。

`Reverse Proxy`を使用している場合、IPアドレスが「172.16.0.xxx」となる為、「Require ip」と条件が一致しません。
元のIPアドレスは`X-Forwarded-For`などに設定されています。

では、どのように設定すれば`X-Forwarded-For`で制限を指定することが出来るのか？

　　**<font color=DeepSkyBlue>mod_remoteip</font>**

で解決することができます。

## ■mod_remoteipを使用してIP制限をした場合

```apache
<VirtualHost *:80>
    ServerName www.local.com
    ServerAlias www.local.com *.local.com
    DocumentRoot /var/html

    RemoteIPHeader X-Forwarded-For
    <Directory "/var/html">
        Require all denied
        Require ip 192.168.10.100
        Require ip 192.168.10.101
    </Directory>
</VirtualHost>
```

**<font color=DeepSkyBlue>RemoteIPHeader</font>** を記載します。
※`Directory`の中には記載できません

上記のように`RemoteIPHeader`を設定した後、`Require ip`で比較されるIPアドレスは`X-Forwarded-For`になります。

## ■Debianで「mod_remoteip」を有効にする

```bash
a2enmod remoteip
```

## ■Alpineで「mod_remoteip」を有効にする

```sh
sed -i -e 's/#\(LoadModule remoteip_module\)/\1/' /usr/local/apache2/conf/httpd.conf
```

## ■関連
https://qiita.com/error484/items/d5ff9da8385ea2ee720a
cakePHP4 Authenticationプラグイン　ログイン認証と機能・表示切り分け

Every Qiita #19
のんびり独学初学者の毎日投稿チャレンジ 19日目
今回は・・・
cakephpでログインユーザ認証の備忘録です。

###ログイン認証の実装
[公式チュートリアル](https://book.cakephp.org/4/ja/tutorials-and-examples/cms/authentication.html)でログイン周りを実装します。

```php5:UsersController.php
   // ログイン認証不要アクションの設定
    public function beforeFilter(\Cake\Event\EventInterface $event)
    {
        parent::beforeFilter($event);
        $this->Authentication->addUnauthenticatedActions(['login','home', 'add','logout']);
    }
    public function login()
    {
        $this->request->allowMethod(['get', 'post']);
        $result = $this->Authentication->getResult();
        if($result->isValid()){
            $redirect = $this->request->getQuery('redirect',[
                'controller' => 'Users',
                'action' => 'index',
            ]);
            return $this->redirect($redirect);
        }
        if($this->request->is('post') && !$result->isValid()){
            $this->Flash->error(__('メールアドレスかパスワードが違います'));
        }
    }

    public function logout()
    {
        $result = $this->Authentication->getResult();
        if($result->isValid()){
            $this->Authentication->logout();
            return $this->redirect(['controller' => 'Users', 'action' => 'home']);
        }
        return $this->redirect(['controller' => 'Users', 'action' => 'home']);
    }
```
コントローラーはAuthenticationを継承しますので、ログイン不要アクションはbeforefilterに追加します。
`$this->Authentication->getResult();`こちらでログイン認証を確認します。

###ログインしているか確認
`$this->Authentication->getResult()->getData();`
上記でログインユーザか認証してますので、こちらを条件分岐で使用。

```php
 $result = $this->Authentication->getResult();
    if($result->isValid()){
        $current_user = true;
    }else{
        $current_user = false;
    }
  $this->set(compact('current_user'));
```

$current_userのboolでログイン・非ログイン用でヘッダーの表示を変えていきます。
【Ruby】3つの：（コロン）の意味

```ruby
validates :content, presence: true, length: { maximum: 50 } 
```

* `:content` 先頭のコロンはシンボル
* `presence:` メソッド内の後ろコロンはキーワード引数
* `length:` メソッド内の後ろコロンはキーワード引数
* `maximum:` ハッシュの内側で後ろコロンはシンボルをキーにしたハッシュ
【今日の学びメモ】Chrome でブラウザキャッシュの期限を確認する


- デベロッパーツールを開く
- **Network** タブに移動
- **Name** 下の確認したい要素を選ぶ
- **Headers** を選択
- **Response Headers** の **cache-control** を確認
- キャッシュの期限が秒数で書かれている

![スクリーンショット 2021-07-21 22.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748993/b4307618-35fd-889f-fb97-3651db339107.png)

ブラウザキャッシュの話を聞く機会があったのでメモ。
Javaで書くフィボナッチ数列

<h2>Javaで書くフィボナッチ数列

Javaを使ってフィボナッチ数列を生成するプログラムを作成しました。



```java:コード

public class Fibonacci {
	public static void main(String[] args)
	{
		int f0,f1,f2;
		
		f0 = 0;
		f1 = 1;
		
		System.out.println(f0);
		
		while(f1 < 100000)
		{
			System.out.println(f1);
			
			f2 = f0 + f1;
			
			f0 = f1;
			
			f1 = f2;
		}
		
	}

}

```

```java:結果

0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
```
【Git】チームから学ぶGitの使い方　gitignore編

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

*　.gitignoreを知りたい方


#目的

* .gitignoreに記述して管理から外すファイルを記述する

#実際の手順と実例
###0.前回までの流れ

https://qiita.com/nao0725/items/b394dd5906badb1aac2a



###1. .gitignoreとは？？
* gitとはバージョン管理システムです。RPGでいうセーブポイントです（初学者の勝手な解釈です笑）

* gitは対象のファイルを管理していますがすべて対象ファイルというわけではなく、不要なファイルや管理の対象外にしたいファイル等も存在します。

* .gitignoreに記述することで管理の対象外にすることができます！

* .gitignoreは**rails new アプリケーション名**で作成されます。


###2.　記述するファイル例

```
/db/*sqlite3
````
このファイルがあると必ずコンフリクトが起きるので記述

```
.DS_Store
```
Macbook Userはコンフリクトが起きるので上記も追加すべき！

コンフリクトの記事はこちら

https://qiita.com/nao0725/items/cc0cd8a047100a0dccd9


###3.チーム開発における設定順

.gitignoreは最初の方に設定すべし！！

1. rails new アプリケーション名
1. git init
1. gitignoreを記述（上記の２つのコード）
1. ControllerやModel、Routingを記述
1. リモートにPush
1. チームメンバーがクローンして開発スタート！


次回は５番６番の流れにも触れていきます！
余弦定理「2020年度広島大学数学【１】」をsympyとwolframalphaでやってみたい。

オリジナル

https://qiita.com/moootoko/items/02a1bafb057c47c17cae

公式サイト

https://www.hiroshima-u.ac.jp/nyushi/gakubu/kakomon/koukai/r2_iz

2020年度 広島大・理系数学[1]より

https://www.hiroshima-u.ac.jp/system/files/147013/m5_r2_02.pdf#page=4

# 問題

https://mathexamtest.web.fc2.com/2020/202010721/2020107210100mj.html#top-0102


# やって思ったこと
？？？？？？　7行目の+piを教えて下さい。よろしくお願いします。


# SymPyで
以下サイトに、ソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/


```python
from sympy import *
var("a b t bt PAB L")
AB=sqrt(a**2+b**2-2*a*b*cos(t))
print("# (1) AB=",AB)
S=Rational(1,2)*a*b*sin(t)+AB*(AB/3)
print("# (2) S =",S)
bt=solve(diff(S, t),t)[0]+pi
M=S.subs(t,bt)
print("# (3) M =",M)
print("#     sin(θ)=",sin(bt),"cos(θ)=",cos(bt))
PAB=(Rational(1,2)*a*b*sin(t))
L=solve(Rational(1,2)*AB*L-PAB,L)[0]
L=L.subs([(a, 16),(b, 25),(t, bt)])
print("# (4) L =",L)
#
#Pycharmの結果
# (1) AB= sqrt(a**2 - 2*a*b*cos(t) + b**2)
# (2) S = a**2/3 + a*b*sin(t)/2 - 2*a*b*cos(t)/3 + b**2/3
# (3) M = a**2/3 + 5*a*b/6 + b**2/3
#     sin(θ)= 3/5 cos(θ)= -4/5
# (4) L = 80/13
#
#sympyliveの結果
# ('#(1) AB=', sqrt(a**2 - 2*a*b*cos(t) + b**2))
# ('#(2) S =', a**2/3 + a*b*sin(t)/2 - 2*a*b*cos(t)/3 + b**2/3)
# ('#(3) M =', a**2/3 + a*b*sin(2*atan(1/3))/2 + 2*a*b*cos(2*atan(1/3))/3 + b**2/3)
# ('#    sin(\xce\xb8)=', sin(2*atan(1/3)), 'cos(\xce\xb8)=', -cos(2*atan(1/3)))
# ('#(4) L =', 400*sin(2*atan(1/3))/sqrt(800*cos(2*atan(1/3)) + 881))
```

# wolframalphaで
勉強中

# 参考
大学入試 数学電子図書館＞2020年度 広島大・理系数学

https://www.densu.jp/hiroshima/20hiroshimaspass.pdf
ラズパイでNode-Redをインストールする

## インストール
apt install でnode.jsとnpmとnode-redをインストールします。

``` bash
sudo apt install nodejs npm nodered -y
```

## 起動
以下のコマンドで起動できます。
`Ctrl+C`で停止します。

``` bash
node-red
```

## サービスとして起動

### 起動
以下のコマンドで起動できます。
`Ctrl+C`でプロンプトに戻りますが停止しません。

``` bash
node-red-start
```

### 停止
以下のコマンドで停止します。

``` bash
node-red-stop
```

## 自動起動

### 自動起動を登録
以下のコマンドで自動起動を登録します。

``` bash
sudo systemctl enable nodered.service
```

### 自動起動を解除
以下のコマンドで自動起動を解除します。

``` bash
sudo systemctl disable nodered.service
```

### Node-Redにアクセス
ラズベリーパイでNode-Redを起動し、PCブラウザのアドレスバーに{ラズベリーパイのホストネーム}:1880を入力します。
※ラズベリーパイの初期の干すストネームはraspberrypiです。
例:`raspberrypi:1880`
ラズベリーパイのデスクトップからアクセスする場合は`localhost:1880`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/18a27399-91c5-5334-70a8-d2501476b040.png)

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
【MySQL5.7】rails db:create しようとしたら、 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (38)　になった時の解決法

#動作環境
Mac Big Sur 11.3.1
Rails 6.1.4

#経緯
久しぶりにRailsの勉強をしてみようと思って rails db:create しようとしてみたら、タイトルのエラーが出現しました。
似たような記事はたくさんありますが、すぐに解決できなかったので、解決方法を記録しておきます。

#解決方法
一度MySQLをアンインストール

```
brew uninstall mysql
```
関連するところの削除

```bash
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```
再度MySQL5.7のインストール

```bash
brew install mysql@5.7
brew services start mysql@5.7
brew link mysql@5.7 --force
```
パスを通す

```bash
#zshの場合
echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

#bashの場合
echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
```

bundle config を実行

```
bundle config --global build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

database.yml の内容を修正する

```yaml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  #socket の内容を修正
  #socket: /var/lib/mysql/mysql.sock
  socket: /tmp/mysql.sock
```

#参考にしたサイト
[mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）](https://qiita.com/carotene4035/items/e00076fe3990b9178cc0)
[【MySQL】pid not foundもしくはpermission deniedの対応方法](https://qiita.com/spaghetti_man03/items/36b73edd9d1e666ae0c0)
[Mac MySQLをきれいにアンインストールしてからインストールする](https://e-joint.jp/639/)
Swiftにおけるアクセス修飾子について

#・Swiftにおけるアクセス修飾子
・アクセス修飾子には、公開範囲が広い順に以下のものが用意されている。

・デフォルトはinternal

| アクセス修飾子|       アクセスレベル|
|:-----------------:|:------------------|
| open         |              モジュール内外のすべてのアクセスを許可 | 
|        public    |            モジュール内外の全てのアクセスを許可するが、モジュール外ではクラスを継承したりオーバーライドしたりすることはできない |  
| internal        |同一モジュール内のアクセスのみを許可 |  
| fileprivate      |  同一ソースファイル内のアクセスのみを許可 |     
| private             |             対象の要素が属しているスコープ内のアクセスのみを許可 |   

では、実際に利用してアクセスレベルを確認する



```swift 

class SomeClass {
    
//オーバーライドを許可する場合
   open var a = "a"

//オーバーライドを許可しない場合
    public var b = "b"

//同一モジュールならOK
    internal var c = "c"

//同じファイル内ならOK
    fileprivate var d = "d"

//定義したスコープ内ならOK
    private var e = "e"
    
}

var some = SomeClass()
some.a // "a"
some.b // "b"
some.c // "c"
some.d // "d"

//アクセス修飾子がprivateのためエラーになる
some.e // 'e' is inaccessible due to 'private' protection level

```
macでpythonインストール

## 方針
初心者にpyenvは要らない

https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7

```zsh
brew info python
brew install python #3系の最新をインストール
```

```zsh:~/.zshrc
export PATH=/usr/local/bin:$PATH
```

```zsh
 which python #/usr/bin/python
python -V #2.7.16
python3 -V #3.9.6
```

```zsh:~/.zshrc
export PATH=/usr/local/opt/python/libexec/bin:$PATH
python -V #3.9.6
```


### 参考
https://qiita.com/ms-rock/items/72b8f1abc661c539bb09

https://kitigai.hatenablog.com/entry/2019/10/06/042527
[Rails]正規表現 一覧

# はじめに
本記事は、よく使用される正規表現を紹介します。
基本的に暗記する必要はありませんが、
どのような`理論`で判別されるのかは把握する必要はあります。

# 表記一覧
|パターン|内容・意味|
|----|----|
|[a-z]|[ ]で囲まれた文字の１つに当てはまる|
|\d|数字に当てはまる|
|{n,m}|直前の文字が少なくてもn回、多くてもm回のものに当てはまる|
|.|改行以外のどんな１文字にも当てはまる|
|+|直前の文字の１回以上の繰り返しに当てはまる|
|\A|直後の文字が先頭にある文字列に当てはまる|
|\z|直前の文字が末尾にある文字列に当てはまる|
|[ぁ-んァ-ヶ一-龥々]|[ ]に囲まれた「かな」「カナ」「漢字」のいずれかに当てはまる|
|?=|直後に設定した文字が続く文字列に当てはまる|
|*?|直前に設定した文字が０回以上続く文字列をチェックし、?の直後の文字が出た際にその１文字を返す|

# 説明
####`\A、\z、\d`

```ruby
irb(main):001:0> code = "9876-543210"

irb(main):002:0> code.match(/\A\d{4}[-]\d{6}\z/)
=> #<MatchData "9876-543210">
```
先頭4文字(\A)が数字（\d）
末尾6文字(\A)が数字（\d）
＊特に電話番号や郵便番号が多いイメージです。

####`[a-z]、[ぁ-んァ-ヶ一-龥々ー]`

```ruby
irb(main):001:0> name = "サンプラザ中野"

irb(main):002:0> name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/)
=> #<MatchData "サンプラザ中野">

irb(main):003:0> name = "Sunplaza中野"

irb(main):004:0> name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/)
=> nil
```


####`?=`

```ruby
irb(main):001:0> name = "ビアードパパ"

irb(main):002:0> name.match(/ビアード(?=パパ)/)
=> #<MatchData "ビアード">

irb(main):003:0> name = "ビアードママ"

irb(main):004:0> name.match(/ビアード(?=パパ)/)
=> nil
```

# 終わりに
本記事を書いていると楽しくなり、気づけば２時間でした。
特に覚えるものではありませんが、このような形で投稿するとアウトプットになるので、
投稿しました！！

暇な時にまた書きたいなと思います！！
private(set)について

##・いつ使うか？
・取得をpublic、設定をprivateにしたい場合に利用される。

```swift 
struct SomeStruct {
    
    private var setterName = "okadai"
    
    public var getterName: String {
        return setterName
    }
}

var some = SomeStruct()

//getterはpublicのため値の取得ができる
some.getterName // "okadai"

//setterはprivateのため値を変更しようとするとエラーになる
some.setterName = "New Name" //setterName' is inaccessible due to 'private' protection level


```

##・しかし、この書き方だと少し面倒
Swiftでは、もっと簡潔に取得をpublicに、設定をprivateにする方法が用意されている。
それが、以下のようなアクセス修飾子である。

```swift 
private(set)
```

実際に書き換えてみる

```swift
struct SomeStruct {
    
   private(set) var name = "okadai"
    
}

var some = SomeStruct()

//取得はpublicになっているため値の取得が可能
some.name

//設定はprivateになっているため値を変更しようとするとエラーになる
some.name = "New Name" //Cannot assign to property: 'name' setter is inaccessible
```

このように、private(set)という書き方をすることで、簡潔に取得と設定でアクセスレベルを指定することができる。
【Minecraft統合版】コマンド解説 〜中級者向けその１〜

統合版Minecraftコマンド解説
今回は中級者向けの解説をしていきます。

手打ちしているのでタイプミスや構文ミス、スペルミスがあるかもしれません。その場合はご指摘願えるとありがたいです。

##バージョン情報
・統合版（Windows10版・Switch・PS4）
・ Ver. 1.14.7

##はじめに
コマンドに多く触れてもらうために作成しています。今回は中級者向けの解説をしていきます。あくまで自分の基準で初心者・中級者などを決めています。ご了承ください。初心者向けの記事もぜひご覧ください。

[初心者向けコマンド解説](https://qiita.com/soutaisitai/items/6c340e91d5330b138d70　 "初心者向け")
##目次
- scoreboardコマンド
- tagコマンド
- gameruleコマンド

##scoreboardコマンド
scoreboardコマンドは名前の通り、スコアを記録することができます。統合版では使える幅がまだ狭いですが、それでも応用すればたくさんの機能があります。

現時点でのscoreboardコマンドでできることの大きなものは、
・チーム分け
・点数を記録する
・サイドバーに表示する
・ネームプレートの下に表示する（マルチの場合で見ることができる）

他にもできることは多くありますが、今日は主にこれらについて説明します。

scoreboardを作成する

```
scoreboard objectives add 任意の名前 dummy
```
これでscoreboardのオブジェクトができました。
また、

```
scoreboard objectives add 任意の名前 dummy 表示される名前
```
でも作成することができます。
任意の名前というのはオブジェクトの名前で通常他のプレイヤーが知ることはありません。英字などで分かりやすい名前にするのをお勧めします。
表示される名前というのはサイドバーやプレイヤーのネームプレートの下に表示される名前です。他のプレイヤーがすぐに分かる名前がいいと思います。
どちらとも日本語・英語どちらも使用できます。

今回は二人のプレイヤーがいるとして点数を記録していくものを作成します。
先ほど作成したオブジェクトに二人を追加します。

```
scoreboard players add "プレイヤー名" "オブジェクト名" "スコア"
```
オブジェクト名は先ほど作った「任意の名前」の部分と同じものを入力してください。
スコアの部分は最初は　0 で構いません。
（””の部分は入力しないでください）

構文例
　Qiitaというプレイヤーを実験というオブジェクトにスコア0で入れる場合

```
scoreboard players add Qiita 実験 0
```

全員を入れる場合は@aなどを使用しても構いません。

＠aなどの使い方については下の記事を参照してください
[初心者向けコマンド解説](https://qiita.com/soutaisitai/items/6c340e91d5330b138d70/　 "「@」の使い方")

今回は簡単にコマンドブロックの上の感圧版を踏むと点数が１増えるものを作成します。
コマンドブロックに以下の内容を打ち込みます。

```
scoreboard players add "プレイヤー名" "オブジェクト名" 1
```

構文例
　Qiitaというプレイヤーが実験というオブジェクトに所属し、一点ずつ加算する場合

```
scoreboard players add Qiita 実験 1
```

これで感圧版（コマンドブロックに設置したレバーでも可）を踏むと点数が一点ずつ加算されるようになりました。

点数を画面の右側に表示することができます。

```
scoreboard objectives setdisplay sidebar "オブジェクト名"
```
これで画面右側に表示されます。 


![スクリーンショット 2021-07-21 20.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683497/1b64c6e9-d775-3eb1-5884-d26435f5c70f.png)


プレイヤーネームの下に表示する方法を紹介します。

```
scoreboard objectives setdisplay belowname "オブジェクト名"
```
この時注意するのは二つともプレイヤーをスコアボードに追加した状態でのみ表示されます。
ネームプレートの下に表示されるのはオブジェクト名と点数です。
![2021-07-21_20.49[55]のコピー_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683497/61f897e9-cc0c-cdf5-a5c8-de250db14944.jpeg)

scoreboardは応用するとたくさんの使い方があります。自分がコマンドを組むときにほぼ必ず使うレベルです。
この話は上級編で書くことができればと思っています。

##tagコマンド
tagコマンドはscoreboardと似たようなものですが少し違います。しかし、同じようなものと思ってもらって構いません。（矛盾？？）

tagはその名の通りプレイヤーにtagをつけ、区別することができます。同じtagのプレイヤーのみtpすることなどもできます。
scoreboardコマンドよりもすぐにチーム分けをすることができますが、他のプレイヤーにscoreboardコマンドのように表示することはできません。

主な構文
tagコマンドはプレイヤーにtagをつけるのと作成するのを同時にすることができます。

```
tag "プレイヤー名" add "タグの名前"
```
これでタグの作成と同時にプレイヤーにタグをつけることができます。

tpコマンドの発展形になりますが、特定のタグのみtpする場合は

```
tp @a[tag="タグの名前"] "座標"
```
と打ちます。
これはscoreboardの場合でも使用できます。

```
tp @a[score="スコア名"] "座標"
```
で特定のスコア名に入っているプレイヤーをtpできます。

##gameruleコマンド
これはワールドの設定ができるコマンドです。
主に使うものとしては
延焼のON/OFF
時間が進む/進まない
モブがスポーンする/しない
モブがアイテムを落とす/落とさない
プレイヤーが死んだときにアイテムを落とす/落とさない
などがあります。

gameruleコマンドについてはまとめたものを記事にして出そうと思います。
様々なサイトで紹介されているのでそちらをご覧ください。

gamerule一覧
↓
準備中

##最後に
記事が思ったより長くなりました。ここまで読んでる人はおそらくいないと思うので、特に大事なことは書きません。
これからも記事を読んで、もし良いと思ったらLGTMのボタンを押してください。
中級編その２・ gamerule一覧　 Coming soon
GoogleDeveloperアカウントの登録

・Unityで作ったアプリをグーグルアプリに出してみたいと思ったので、Googleデベロッパーアカウントを登録するした時にあった事を記事にしてみました、これからグーグルデベロッパーアカウントを作る方の参考になれば幸いです。

####１、グーグルデベロッパーアカウントに作るためにグーグルアカウントを作る
これはいたって簡単です、グーグルアカウントを新規作成します。

####２、グーグルデベロッパーアカウントを作るためにサイトにアクセスする
これは二通りあります
方法１：普通にGoogle先生で検索して**GoogleDeveloperアカウント**と検索すると出てきますので出てきたのをクリックするだけです。
方法2：もう一つはGooglePlayのトップサイトに行って一番下に**デベロッパー**と書かれてるのがありますのでそこをクリックするとAndroidデベロッパーサイトに飛びます、そして上のタブにGooglePlayあるので押してGooglePlayconsoleを起動するというボタンがありますので押します。

####３、アカウントを作成するために基本情報を入力する
そうすると基本情報を登録する画面になります
アカウントに使う名前（公開用）※後々変更可能
連絡先メールアドレス
個人用か企業・団体かの選択
必要な情報を入力して次に行きます

####４、登録料を払う
クレジットカードかデビットカードの番号を入力して支払いボタンを押す
問題なければお支払いが完了してGMailの方に領収書が送られる。

※**Vプリカ**で出来るという古い記事があり試してみたが**ダメ**でした、自分は親を説得して使わせていただきました。

####アカウント登録完了
ほかの人によるとアカウント作成に時間がかかるという事が書かれてましたがすぐ作られて入れました。


まとめ
案外すんなりと、登録ができてよかったです、感想としてはデビットカードは今後作っておいたほうが良いなと思いました。
Numbaでアレイのスライスを取得する際の注意点

## 前置き
pythonでの処理を高速化するために、numbaを普段から利用しています。
今回は多次元アレイのスライスを取得する際に、どの次元に対してスライスを取るかでパフォーマンスが変わってしまう問題を取り上げます。

## 1. 環境
```bash
$ sw_vers                
ProductName:    macOS
ProductVersion: 11.4
BuildVersion:   20F71
$ system_profiler SPHardwareDataType
    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir10,1
      Chip: Apple M1
      Total Number of Cores: 8 (4 performance and 4 efficiency)
      Memory: 16 GB
...
$ python -V               
Python 3.9.6
$ pip show numba | grep Version
Version: 0.53.1
$ pip show numpy | grep Version
Version: 1.21.0
```

## 2. テスト内容
各次元の長さが等しい三次元アレイを特定の次元方向にスライスし、スライス処理の時間に差があるかを確認します。以下がテストコードになります。

```python

import time

import numpy as np
import numba
import tqdm
import matplotlib.pyplot as plt

@numba.njit
def dim3_0(arr: np.ndarray):
    size, _, _ = arr.shape
    arr_r = np.zeros((size, size))
    for i in range(size):
        arr_r += arr[i,:,:]
    return arr_r

@numba.njit
def dim3_1(arr: np.ndarray):
    size, _, _ = arr.shape
    arr_r = np.zeros((size, size))
    for i in range(size):
        arr_r += arr[:,i,:]
    return arr_r

@numba.njit
def dim3_2(arr: np.ndarray):
    size, _, _ = arr.shape
    arr_r = np.zeros((size, size))
    for i in range(size):
        arr_r += arr[:,:,i]
    return arr_r


if __name__ == '__main__':
    size = 80
    arr_test = np.random.rand(size, size, size)
    dim3_0(arr_test)
    dim3_1(arr_test)
    dim3_2(arr_test)
    fnc_lst = [dim3_0, dim3_1, dim3_2]

    size_init = 10
    size_step = 10
    nsteps = 50
    num_iter = 10
    time_arr = np.empty((nsteps, len(fnc_lst), num_iter), dtype=np.float64)
    for i in tqdm.tqdm(range(nsteps)):
        size = size_init + size_step * i
        arr = np.random.rand(size, size, size)
        for j, fnc in enumerate(fnc_lst):
            for k in range(num_iter):
                st = time.perf_counter()
                fnc(arr)
                time_arr[i, j, k] = time.perf_counter() - st

    x = np.arange(size_init, size_init + size_step * nsteps, size_step)
    plt.loglog(x, np.median(time_arr[:, 0], axis=1), label='dim3_0')
    plt.loglog(x, np.median(time_arr[:, 1], axis=1), label='dim3_1')
    plt.loglog(x, np.median(time_arr[:, 2], axis=1), label='dim3_2')
    plt.xlabel('arr size')
    plt.ylabel('execution time [s]')
    plt.legend()
    plt.show()
```

### 3.結果

![myplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779581/39374f22-535d-0f62-9612-abf1f90894d8.png)

横軸：各次元のアレイの長さ, 縦軸：各関数の実行時間です。

### 4.考察

テストコードで定義した3つの関数(dim3_0,1,2)は3次元アレイを1,2,3の各次元方向にスライスし、for文でその方向に対して加算を行う。
加算処理の回数は共通であること、また、アレイは乱数で初期化していることから、加算に要する時間はどの関数でも同じであると考えられます。したがって、関数の処理時時間の差はスライスの処理に起因するものと考えられます。
図からはほとんどの場合で1次元目のスライスを取得するのが最も早いことがわかります。
また、アレイが長く(大きく)なるにしたがって、処理時間の差は広がる傾向にあります。

### 5.結論
numba.jit,njitでデコレートした関数の中で、アレイのスライスを取る際は、一次元目に対してスライスを取るようにするのが無難。
ラズベリーパイにRaspberry PI OSをヘッドレスでインストールする

## 環境
- Windows 10を使用
- RaspberryPi3+にインストール(4を未所持のため)
- EtcherでmicroSDカードにインストール
- ヘッドレスで設定、運用

## 目次
- [ダウンロード](#ダウンロード)
- [インストール](#インストール)
- [初期設定](#初期設定)
- [ネットワーク設定](#ネットワーク設定)
    - [SSHの有効化](#sshの有効化)
    - [Wi-Fi設定](#wi-fi設定)
    - [SSH接続](#ssh接続)
- [初期設定](#初期設定)
    - [raspi-config](#raspi-config)
    - [パスワード変更](#パスワード変更)
    - [ローケルの変更](#ローケルの変更)
    - [タイムゾーンの変更](#タイムゾーンの変更)
    - [アップデート](#アップデート)
    - [raspi-configの終了](#raspi-configの終了)
    - [パッケージの更新](#パッケージの更新)
- [終わりに](#終わりに)

## ダウンロード
[こちら](https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit)のページから`Download`をクリックしてzipファイルをダウンロードしてください。
## インストール
- ダウンロードしたファイルをmicroSDカードに書き込みます。  
- 今回はEtcherを使用します。[こちら](https://www.balena.io/etcher/)からダウンロードしてインストールしてください。
- Etcherを起動したら`Flash from File`をクリックしダウンロードOSのzipファイルを選択します。  
- 真ん中のインストール先を確認し、違う場合は`Change`で変更してください。
- 正しいインストール先が選択された状態で`Flash`をクリックしてください。
- しばらく待ってインストールが完了したらEtcherを閉じてください。

## ネットワーク設定
### SSHの有効化
- インストール直後おそらくWindowsがmicroSDカードを認識していないと思うので一度microSDカードを指し直してください。  
- microSDカード(boot)が表示されたら開き右クリックで新規作成→テキストドキュメントをクリックし作成されたファイルをsshファイルをsshに変更してください。(ssh.txtにならないように注意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/7cc5e652-f87b-7f3f-889e-adce54cd8c80.png)


### Wi-Fi設定  
イーサネットに繋いで運用する場合は飛ばしてください。

- microSDカード(boot)にwpa_supplicant.confを作成し内容は以下にします

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="接続先のSSID"
    psk="接続先のパスワード"
}
```

パスワードは平文で保存されます。後でハッシュ化できますが今回は割愛します。

### SSH接続
- microSDをRaspberryPiに指し電源をつなげ起動ま完了するまでしばらく待ちます。
- コマンドプロンプトかpowershellを起動し以下のコマンドでRaspberryPiと接続します。

```
ssh pi@raspberrypi
```

- yes/no?と聞かれるのでyesと入力します。
- もう一度`ssh pi@raspberrypi`を入力するとRasPiとSSH接続されパスワードを聞かれるので、初期パスワードの`raspberry`と入力するとログインできます。

## 初期設定
### raspi-config

- 以下のコマンド入力するとraspi-configが表示されます。

```
sudo raspi-config
```

### パスワード変更
- 1を選択してパスワード変更してください

### ローケルの変更
- 4を選択
- I1を選択
- `ja_JP.UTF-8 UTF-8`に合わせてスペースキーで選択しエンターを押して確定します。
- システムのロケールを聞かれるので`ja_JP.UTF-8`を選択します。

### タイムゾーンの変更
- 4を選択
- I2を選択
- Asiaを選択
- Tokyoを選択

### アップデート
- 8を選択するとアップデートが開始されます。

### raspi-configの終了
- 右キーを押して`Finish`を選択しraspi-configを終了します。
- 再起動するか聞かれたら再起動します。
### パッケージの更新
以下のコマンドでパッケージを更新します。

```
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
```

## 終わりに
OSのインストールと簡単な初期設定は以上になります。

## 関連記事

- [RaspberryPiにSambaをイントールしてファイルサーバを作成](https://qiita.com/loach/items/36825623bc9277b08b71?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px" ></a>
OpenStack とは

## 勉強前イメージ

クラウドの型みたいなやつ・・・・？

## 調査

### OpenStackとは

AWSのようなクラウドを実現するためのソフトウェアでOSSなので、無料で使用することができます。
物理のサーバの物理の部分のリソースを仮想化によって複数の仮想マシンに分けることで、
低レイヤー(ストレージ・ネットワーク)までコントロールできる環境を構築します。
OpenStackを利用するとAWSやAzuruなどのクラウドを自社管理の環境下で実施することができます。

### メリット

- OSSである
- クラウド環境に必要な統合的に管理する機能が豊富にある
- 主要なディストリビューションがデフォルトで搭載されている

### 各機能

- Compute
	- PJ名 : Nova
	- 仮想マシンの作成や管理を行います。
	- 物理環境で言えば、サーバの部分になります。
- Object Storage
	- PJ名 : Swift
	- データの保存や読み出しを行います。
	- 物理環境で言えば、ストレージの部分になります。
- Image Service
	- PJ名 : Glance
	- 仮想ディスクイメージファイルの保存や編集を行います
	- 物理環境では、DVDやCDのイメージディスクになります。
- Dashboard
	- PJ名 : Horizon
	- Web管理するためのインターフェースになります。
	- 物理環境では相当するものがなく、仮想環境をwebで確認できるものです。
- Identity
	- PJ名 : Keystone
	- ユーザー認証を管理します。
	- 作業ユーザなど一元管理を行います。
- Virtual Network Service
	- PJ名 : Quantum
	- 仮想ネットワークを管理します。
	- 物理環境で言えばRouterやSwitchの部分になります。

## 勉強後イメージ

仮想化のアプリケーションなんてあるの知らなかった・・・
しかもOSSなのね

## 参考

- [オープンスタックをわかりやすく解説します！その内容から具体的な機能までご紹介します。](https://www.geekly.co.jp/column/cat-technology/1911_001/)
- [OpenStackとは](https://www.designet.co.jp/faq/term/?id=T3BlblN0YWNr)
macOSでのYubiKey 5Ciのセットアップ



YubiKey 5CiのmacOSでのセットアップの自分用メモ



# 手順まとめ

1. YubiKey Managerをインストール
2. プライバシーの入力監視の設定で YubiKey Manager を追加して許可を与える




# 1. YubiKey Managerをインストール


YubiKey Manager | Yubico
https://www.yubico.com/support/download/yubikey-manager/



# 2. プライバシーの入力監視の設定に追加

追加しないと以下のようなエラーが出る

```failed connecting to the YubiKey. Make sure the application has the required permissions```


設定の具体的な仕方は下記サイトから

Troubleshooting "Failed connecting to the YubiKey. Make sure the application has the required permissions." in YubiKey Manager – Yubico
https://support.yubico.com/hc/en-us/articles/360016648939-Troubleshooting-Failed-connecting-to-the-YubiKey-Make-sure-the-application-has-the-required-permissions-in-YubiKey-Manager

上記サイトから引用

```
1. Quit out of YubiKey Manager completely (YubiKey Manager > Quit YubiKey Manager, or press ⌘+Q on your keyboard with the YKM window in focus).
2. Open System Preferences.
3. Click Security & Privacy.
4. Click the Privacy tab.
5. Scroll down until you see Input Monitoring and select it.
6. Click on the padlock in the lower-left corner and authenticate so you are able to make changes.
7. Click the + button.
8. In the window that appears, select Applications in the left column if it is not already selected, then scroll down to and select YubiKey Manager. Click Open.
9. Make sure YubiKey Manager now appears in the list of apps with Input Monitoring permission with its box checked.
10. Click the padlock again to prevent further changes.
11. Once this has been done, you should be able to open Applications > OTP after reopening YubiKey Manager.
```


# その後

あとは、アプリケーションごとに違う。
複数枚投稿した画像の1枚だけを表示する

#はじめに

![スクリーンショット 2021-07-21 20.22.40（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/b042a5ab-faeb-552b-a9e6-c270fddfc572.png)

複数枚投稿の機能を実装し、投稿一覧ページは画像を一枚だけにしたいと思いました。
どのようにしたかアウトプットしていきます。

#現在の記述内容

```model.rb
class Model < ApplicationRecord

 #複数枚を記述
 has_many_attached :images

 with_options presence: true do
 #バリデーション内容省略
 validates :images #画像がないと投稿でいない
 end
end
```

```model_controller.rb
class ModelController < ApplicationController

  def index
    @model = Model.includes(:user).order("created_at DESC").page(params[:page]).per(5)
  end

  def new
    @model = Model.new
  end

  def create
    @model = Model.new(model_params)
    if @model.save
      redirect_to root_path
     else
      render :new
    end
  end
  private
  def model_params
                          #複数枚画像は配列に入るため下記のように記述
    params.require(:model).permit(images: []).merge(user_id: current_user.id)
  end
end
```

#どのように表示するか

複数枚投稿は配列の中に画像が入ります。

```erb
<%= image_tag model.images[0], class: "review-img"%>
```


配列の最初は必ず0なので`model.images[0]`になります。
エクセル、空っぽのシートを見つける

エクセル、空っぽのシートを見つける

・すべてのシートをナメて、空のシートを見つけたい
・UsedRangeで、行・列いずれかが１でないものは、空ではない（はず）
・UsedRangeで、行・列いずれも１で、かつ、セル（１，１）が空なら、空のはず
・画像などが一つもない（Shapes.Count = 0）なら空のはず

という条件にしてます。


```vb:sample.bas
Sub 空っぽのシートを見つける()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim sht As Variant

  For Each sht In ActiveWorkbook.Sheets
        If sht.Visible <> xlSheetHidden Then
      sht.Select
      
       'Debug.Print sht.Name

        shtnm = sht.Name
        
        r = Sheets(shtnm).UsedRange.Cells(ActiveSheet.UsedRange.Count).Row
        c = Sheets(shtnm).UsedRange.Cells(ActiveSheet.UsedRange.Count).Column
        
        If r = 1 And c = 1 And _
            Sheets(shtnm).Cells(r, c).value & "" = "" And _
            Sheets(shtnm).Shapes.Count = 0 Then
            Debug.Print shtnm & " is Null"
        Else
            Debug.Print shtnm & " is not Null"
        End If
        'Sheets(shtnm).　と　sht.　どっちでも動く
      End If
  Next
  'ActiveWorkbook.Sheets(1).Select

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub
```


※参考

【エクセル】全シートのカーソルを左上にそろえる　#ジョーク
https://qiita.com/santarou6/items/b4a556a49d1c5b7960e4
Journey Builder の基本 ⇒ Journey Builder アクセス権の設定

１．マーケティング担当者は、Journey Builder を使用して、どのようなキャンペーンを設計できますか?
２．Journey Builder ツールを使用するデジタルマーケティングマネージャーに付与する必要があるデフォルトのユーザーロールは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/9b9f550e-3af4-4b0f-0edf-f4cd6a1ceebe.png)
信頼区間と信用区間

## 0. 前書き

信頼区間とベイズ信用区間について考える.
ここで簡単のため真の分布を$q(x)=\mathcal{N}(x\ |\ \mu_0,\sigma)$とし,
サンプルを{$X_i$}$^n$とし,ベイズの予測モデルを$p(x|\mu)$,事前分布を$\phi(\mu)$とする.

また,これは常に考えるべきことであるが,数式そのものより数式の意味をしっかり捉えることはとても大事であると私は考える.

(誤っている箇所があればご指摘お願いいたします.)

## 1. 信頼区間 1-α の定義
真の分布上の確率において,サンプルによる推定量$(L(X^n),U(X^n))$の範囲に,真のパラメータ$\mu_0$が含まれる確率が$1-\alpha$の区間のことをいう.
つまり,

```math
P_{X^n\sim q^n}(L(X^n)\leq \mu_0\leq U(X^n))＝ 1-\alpha.
```
の状態である($q$は中心極限定理等で仮定し計算する.一般的に両側の広がりが等しくなるように,$L(X^n)+U(X^n)=2\bar{X}$とする).

## 2. ベイズ信用区間 1-α の定義
事後分布${\rm pos}(\mu|X)=\frac{\phi(\mu)\prod p(X_i|\mu)}{\int \phi(u)\prod p(X_i|u) du}$上の確率において,サンプル,事前分布,予測モデルに依存する推定量$(L(\*),U(\*))$の範囲に,サンプル$X$が与えられたとき$\mu$が含まれる確率が$1-\alpha$の区間のことをいう.
つまり,

```math
P_{\mu|X^n \sim {\rm pos}}(L(*)\leq \mu \leq U(*))= 1-\alpha.
```
の状態である(事後分布はいつでも計算できる,今回の場合も$L(\*)+U(\*)=2\mathbb{E}_{\rm pos}[\mu]$とするのが一般的である).

## 3. 何が違うの

### 3.1. 信頼区間
 前者では,${X^n}$を確率変数としてみて区間を考える.というのも,心持ちとして,$\bar{X}$が揺らぐからこそ,現在得られたサンプルが真の分布$q$に対してどの程度,信頼してよいデータであるのか気になることにあるからだ.
 結局,真の分布上のあるサンプルを一つ持ってきた際に信頼区間$[L(X^{n}),U(X^{n})]$に1-$\alpha$の確率で真のパラメータ$\mu_0$が入っていることを主張している.

### 3.2. 信用区間
 後者では,$X^n$を定数とし,あるデータが与えられた際の事後分布上のパラメータが存在する確率が高い区間を考える.というのも,心持ちとして,信用できるパラメータの区間を考えパラメータがどういう区間に存在するか気になることにあるからだ.
 結局,あるデータが与えられた際に,事後分布上のあるパラメータ$\mu$を一つ持ってきた際に1-$\alpha$の確率で$[L(\*),U(\*)]$に入っているということを主張している.つまり,求めたいパラメータ$\mu_0$も1-$\alpha$の確率で$[L(\*),U(\*)]$に入っているということを主張できる.

(ただし,事前分布や予測分布がテキトーであると,事後分布上に求めたいパラメータ$\mu_0$を含んでいなかったり,事後分布上において,${\rm pos}(\mu_0|X^{n})$が限りなく小さい可能性があるため(これは$\mu_0$が未知のため,飽くまで可能性のお話)あらかじめ情報量規準を用いて予測分布や事前分布が適切であるか確認する必要がある)

## 3.3. まとめ

上記の二点において,結局どちらの心持ちをとっても良いのだが,

- 信頼区間は,真の分布上の確率を考える.
- 信用区間は,事後分布上の確率を考える.

という違いを考慮し物事を考える必要がある(例[^1]).

## 4. 余談
しばしば,信頼区間は母平均を予測する際に用いられる.というのも,真の分布がわかっていなくても,その平均は中心極限定理から容易に正規分布に近似できるためである.逆に,一般的に母平均を求めてもあまり価値のない分布(混合正規分布や混合ポアソンモデル,その他諸々のモデル)では,この区間の意義をあまり感じることはできなかった.そのため,信頼区間は母平均のような,サンプルによる分布が正規分布であるとわかっている状況に限り使えると感じ,そのことに気をつける必要があると感じた.また,解釈として,真の分布から複数のサンプルサイズ$n$の複数のサンプル数を持ってきての確率の話をしているため,少し入り組んでいると考えられる.

一方で,信用区間は予測分布と事前分布の評価が適切であるかをWAICやWBICなどを用いて考慮した上で考えると,あらゆる状況(信頼区間で考えられない状況も考えられる状況も含む)で信用できるパラメータ区間を算出できると考えられるため広く使える可能性があると感じた(ここで情報量規準を用いず,意味のわからない事前分布や予測分布を持ってきてしまうと,その結果も意味のないものになってしまうため,情報量規準を用いてモデルや事前分布がどの程度適切であるか,確かめる必要がある).また,解釈としても,信用区間の方がパラメータの確率分布を考えているため,解釈しやすいと考えられる.


[^1]: [信頼区間を正しく理解してますか？確信区間との違いって何ですか？ @katsu1110 accessed by 7/21/2021](https://qiita.com/katsu1110/items/4e8529f01a1389c03712)
(エクセルVBA) バイナリファイルを読んで、テキスト（１６進）で書き出す


バイナリファイルを読んで、テキスト（１６進）で書き出す


```vb:sample.vbs

'/-------------------------------------
'バイナリファイルを読んで、テキスト（１６進）で書き出す
'/-------------------------------------
Private Sub sample_read_binary_file_out_text_file()

Dim filenum As Integer
filenum = FreeFile
Dim filename As String
filename = "sample.zip"
Open ThisWorkbook.Path & "\" & filename For Binary As #filenum

Dim filenum2 As Integer
filenum2 = FreeFile
Dim filename2 As String
filename2 = "filename.txt"
Open ThisWorkbook.Path & "\" & filename2 For Output As #filenum2

Dim value As Variant
    Dim i As Integer
    i = 1
    Do Until EOF(filenum)
        value = AscB(InputB(1, #filenum))
        'Line Input #filenum, value
        If value <> "" Then
        'Debug.Print Right("00" & Hex((value)), 2)
        Print #filenum2, CStr(Right("00" & hex((value)), 2)); vbTab;
        i = i + 1
        If i > 16 Then
            Print #filenum2, ""
            i = 1
        End If
        End If
    Loop

Close #filenum2
Close #filenum

End Sub

```
cypress アロー関数と通常の関数の書き方で挙動が異なる件について

最近cypressを使い始めてアロー関数と通常の関数の書き方で挙動が異なる件で少しハマってしまったので一応メモ。

# 失敗例
以下が自分の失敗してたサンプルの書き方になります。beforeEachフックでusers.jsonのalias「users」を定義し、this.usersでアクセスしたところundefinedになってしまう。。

```cypress/integration/sample.js
describe('詳細ページのテスト', () => {
    beforeEach(() => {
        cy.fixture('users').as('users')
    })  

    it('モーダルのテスト', () => {
        //モーダルを開くボタンをクリック
        cy.get('[data-testid=modal_open_btn]').click()
        //モーダルを開いた後メールアドレスを入力欄に記入
        cy.get('[data-testid=modal_input]').click()
            .click()
            .type(this.users.email) //ここでなぜかメールアドレスを取得できない
        //確認ボタンが押せるようになっていることを確認（インラインバリデーションしている前提）
        cy.get('[data-testid=confirm_btn]').click()
            .click()
            .should('be.enabled')
    })  
})
```

```cypress/fixtures/users.json
{
  "username": "テストユーザー",
  "email": "testuser@sample.com"
}
```

上記のテストを実行すると

```
error TypeError: Cannot read property 'users' of undefined
```

と怒られてしまいました。

# 成功例
原因が分からなかったので色々問題を切り分けて考えていくと、以下のようにアロー関数ではなく通常の関数の書き方で書くと取得できることに気が付きました。

```cypress/integration/sample.js
describe('詳細ページのテスト', () => {
    beforeEach(() => {
        cy.fixture('users').as('users')
    })  

    it('モーダルのテスト', function() { //⇦ ここを変更
        //モーダルを開くボタンをクリック
        cy.get('[data-testid=modal_open_btn]').click()
        //モーダルを開いた後メールアドレスを入力欄に記入
        cy.get('[data-testid=modal_input]').click()
            .click()
            .type(this.users.email) //ここでなぜかメールアドレスを取得できない
        //確認ボタンが押せるようになっていることを確認（インラインバリデーションしている前提）
        cy.get('[data-testid=confirm_btn]').click()
            .click()
            .should('be.enabled')
    })  
})
```

ちゃんと[公式ドキュメント](https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Avoiding-the-use-of-this)を見るとアロー関数で定義した関数内から定義したaliasにthis.*でアクセスできないことが記載されてました。
アロー関数を使う場合はまた違うデータへのアクセス方法が記載されているので是非そちらも参考にしてみてください（個人的にはthisの方がシンプルに書けて好き）。

ただ、cypressで採用しているライブラリのMochaのドキュメントではアロー関数を使用することは推奨していないとのことです（https://mochajs.org/#arrow-functions）。