OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressで会員限定のページを作る方法とhtaccessの使い方

みなさんこんにちは。
今回は、WordPressで会員限定のページを作る手順を説明します。

wordpressでプラグインのインストールや会員制を実現するためには、
「MemberPress」や「Restrict Content Pro」などのプラグインをインストールします。

基本的な流れ
1.会員グループの作成: 会員グループを作成し、会員に必要なアクセス権限を与えます。
2.会員限定ページの作成: 新しいページを作成し、そのページに会員限定のコンテンツを追加します。
3.アクセス制限の設定: 会員限定ページへのアクセス制限を設定します。これはプラグインによって異なりますが、通常は「設定」メニューから行います。
4.これらの手順に従えば、WordPress上で会員限定のページを作ることができます。







「MemberPress」

![aec56ee996f821ba3edfc2aa24524b6b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125675/16453db1-e06c-540a-8dc3-0a8c17675ae8.png)

MemberPressはWordPress上での会員制を実現するプラグインです。
インストール: WordPress管理画面から「プラグイン」を選択し、「新規追加」から「MemberPress」を検索してインストールします。

設定: インストール後に「MemberPress」メニューが追加されます。ここから「設定」を選択して、会員制システムを設定します。

会員グループの作成: 「会員グループ」メニューから新しいグループを作成します。グループにはアクセス権限、料金、ペイメントオプションなどが設定できます。
会員限定ページの作成: 新しいページを作成し、「MemberPress」メニューから「会員限定」設定を適用します。

アクセス制限の設定: 会員限定ページにアクセス制限を設定することができます。「会員限定」設定で、特定のグループにのみアクセス可能にすることができます。

これらの手順を踏めば、MemberPressを使ってWordPress上で会員制のページを作ることができます。
参考URL：https://memberpress.com/





「Restrict Content Pro」
![181f068ed40b5bec8e718a0064ed4790.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125675/7e50dc8d-c914-887a-b744-cb28cf017ed8.png)

Restrict Content ProはWordPress上での会員制を実現するプラグインです。

インストール: WordPress管理画面から「プラグイン」を選択し、「新規追加」から「Restrict Content Pro」を検索してインストールします。

設定: インストール後に「Restrict Content Pro」メニューが追加されます。ここから「設定」を選択して、会員制システムを設定します。

会員グループの作成: 「メンバーシップ」メニューから新しいグループを作成します。グループにはアクセス権限、料金、ペイメントオプションなどが設定できます。

会員限定ページの作成: 新しいページを作成し、「Restrict Content Pro」メニューから「会員限定」設定を適用します。

アクセス制限の設定: 会員限定ページにアクセス制限を設定することができます。「会員限定」設定で、特定のグループにのみアクセス可能にすることができます。

これらの手順を踏めば、Restrict Content Proを使ってWordPress上で会員制のページを作ることができます。
参考URL：https://restrictcontentpro.com/


htaccessの使い方


ページ単位でリダイレクトする場合は？
htaccessは、ページを削除したり、URLを変更した場合に設定します。
※「000.html」から「111.html」に転送する場合

RewriteEngine on
RewriteRule ^000.html$ https://www.〇〇.com/111.html [L,R=301]
ディレクトリ単位でリダイレクトしたい

ディレクトリごとにリダイレクトしたい場合は？
部分リニューアルやCMS変更などで、ディレクトリ構造を変更した場合に役立ちます。

※CMSについてGoogleで検索してみる

※「/000/」から「/111/」に転送する場合

RewriteEngine on
RewriteRule ^000(.*)$ /111$1 [L,R=301]

本日は、記事を読んでいただき、ありがとうございます。他の記事もご参考ください。
C言語で百の位までの位ごとの足し算をする方法

# 目的
・何も検索しないで解けるようになりたい。
・[AtCoderの問題分けてみた](https://qiita.com/emioiso/items/1e0b800e201963f7f409)
# 注意
Atcoderの[abc187_A - Large Digits](https://atcoder.jp/contests/abc187/tasks/abc187_a)のネタバレあり。
# 解法
・四則演算 と 条件分岐を使う。
(他にもあると思うけど気が向いたら探す)
# ACしたコード
```C
#include <stdio.h>
int	main(void)
{
	int	a;
	int	b;

	scanf("%d%d",&a,&b);
	// printf("%d %d\n",a,b);

	// printf("%d\n",a / 100);			//100の位
	// printf("%d\n",(a / 10) % 10);	//10の位
	// printf("%d\n",a % 10);			//1の位

	int suma = 0;
	int sumb = 0;
	suma = a / 100 + (a / 10) % 10 + a % 10;
	sumb = b / 100 + (b / 10) % 10 + b % 10;

	if(suma >= sumb){
		printf("%d\n", suma);
	} else {
		printf("%d\n", sumb);
	}

	return (0);
}
```
# 参考にした記事まとめ
[位を出力する方法](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12137149037)
カードゲームロジック

<h1>カードゲームロジック</h1>

<h2>概要</h2>
paizaのゲームのプログラムが思ったより難しくて、偉い時間がかかったので、<br/>
消すのももったいないので、ノートとして記録してみる。

https://paiza.jp/poh/hatsukoi/challenge/hatsukoi_clothes5

設問はこちら。
難しいので、この設問では、1人1枚という制限が付けられていたけど、それだと面白くないので、何人でも計算できるように、上位互換でのロジックで組んだ。

playersを変更すれば何人でも計算できる。設問の場合は52にする必要がある。

簡単な内容は、配られたカードを一定のルールでカードを出していくと、どの順番にクリアしていくか。というもの。

<h2>動作コード</h2>

こちらで動作確認が出来る。

https://paiza.io/projects/-EYjojosn5-siWVZi41z7g

<h2>コード</h2>

```Javascript
    const players = 52;
    const power = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2']; // カードの強さの純
    const cards = lines[0].split(' ');
    
    let havings = [...Array(players)].reduce((a, c, i) => { a['r' + i] = []; return a; }, {});   // 各プレイヤーが持っているトランプ
    
    cards.forEach((o, i) => havings['r' + i % players].push(o)); // 初期カードを配る
    
    let rank = [];                      // ランキング(上がった順番)
    let share = null;                   // 場
    let i = 0;                          // 現在のターンのプレイヤIDのindex
    let roundCount = 0;                 // 一周回っている数
    
    while (Object.keys(havings).length > 0) {
        // プレイヤーが全員いなくなるまで続ける
        const id = Object.keys(havings)[i];
        
        if (roundCount >= Object.keys(havings).length) {
            // 一周回った
            share = null;
            roundCount = 0;
        }
         
        if (share == null || power.findIndex(e => havings[id][0] == e) > power.findIndex(e => share == e)) {
            share = havings[id].shift();
            roundCount = 0;

            // あがり
            if (havings[id].length == 0) {
                rank.push(id);
                delete havings[id];
                i = (i - 1) % (Object.keys(havings).length); // 消した場合はindexは動かない
            }
        } else {
            roundCount++;
        }
        
        i = (i + 1) % (Object.keys(havings).length);
    }
    
    const finalRank = rank.map(o => +o.replace(/[^0-9]*/, '') + 1); // 上がる順番のID
    const oppositeRank = finalRank.reduce((a, c, i) => { a[c] = i + 1; return a; }, []).filter(o => o != null);

    console.log(oppositeRank.join('\n'));
```

<h2>あとがき</h2>

遅くなった原因として反省点はいくつかある。<br>
主に見通しの甘さ。

<h4>連想配列にすべきカード情報(havings)を配列にしていた。</h4>
最初はカード情報を保持するだけなので、配列で十分かと思っていたが、持っているカードが0になった時に、ゲームから降りるために、havingsから削除していた。すると、indexが狂ってしまうので、しばらくindexの位置を再計算するなど、試行錯誤していたが、もうわけわからんくなってきたので、連想配列に切り替えた。indexではなくidで削除や索引するように組みなおした。最初から連想配列で組んでいればもっと早く解決できたと思う。

<h4>誰もカードを出せなくなった時のリセットタイミング(roundCount)を回数にすべき所を、idにしていた</h4>
今度は逆に、idで管理していたが、これが逆にロジックを難しくしてしまった。カードを出した時に、自分のidをroundCountに書いていたが、これだとカードを出した次のステップで1周してしまったとプログラムが勘違いしてしまうため、皆そのまま全員上がってしまった。flagを立てても良いけど、あまり使いたくないので、別の方法にした。</br>
プレイヤー人数より多く誰も上がらない回数ループした場合にリセットするように変更した。

ああ、疲れた。
EEATを獲得するためにすること

近年、新たに【経験者】という評価概念が加わり、SEOを高める上で必要になってきたEEATという考え。

WEBサイトを運営する上でSEOでもユーザーを獲得したいなら、Googleが定めたこの考えを一つでも、いえ、できれれば全てにおいてクリアにしていきましょう。

具体的に、どのように対策し、ウェブサイトを運営しながらGoogleに良いサイトであるとアピールすれば良いのでしょうか？具体的に説明しいます。

Experience（経験）
これはクエリに対して実際に経験した方にインタビューする、また自ら経験してその体験談をページ作りに反映させましょう。

Expertise（専門性)
そのクエリや、サイトが扱うテーマの専門家になるか、専門家の監修やレポートを掲載しましょう。また専門家の発表・発言したコメントを引用することも最低限できることの一つでしょう。

Authoritativeness（権威性）
これはどちらかといえばドメイン単位で必要ともいえます。法人ドメインや、運営しているサイトで自社サービスやアイテムがあるとなお良いです。また権威のある人物やサイトから被リンクをもらえるよう心がけるのも一つの手です。その他、学校やNPO法人、財団など社会的意義のある団体などもこれに該当するでしょう。

Trust（信頼性）
匿名での投稿や、匿名が基本となるようなコンテンツは避けましょう。誰がそれを発言したのか？行ったのか？誰が発信しているのか？などをしっかりと明記することが大切です。
ITパスポート試験は一夜漬けできるのか？学習から探るその可能性。

ITパスポート試験は、IT業界の職業人のみならず、今後のIT社会を生きる人々にとって求められる知識を広く浅く問われる試験です。
>[ITパスポート試験](https://ja.wikipedia.org/wiki/IT%E3%83%91%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E8%A9%A6%E9%A8%93 "ITパスポート試験 Wikipedia")
>対象者像は「職業人が共通に備えておくべき情報技術に関する基礎的な知識をもち、情報技術に携わる業務に就くか、担当業務に対して情報技術を活用していこうとする者」。

## 要約
もともとの知識量と記憶力の良さがあれば、一夜漬けは可能できる可能性は０でない。
足切りラインを超えればよいので、自信満々マンはぜひ挑戦してみてください。

### この記事の目的
この記事は、2023年2月にITパスポート試験を受験した私の感想戦として、学習内容やその効果を共有するものです。これから受験する方のお役に立てば嬉しいというのが半分、次に目指す基本情報技術者試験に向けた自らへの教訓として書き残すのが半分。よろしくおねがいします。

### この記事の対象者
* IT業界に対する知識がほとんどなく、ITパスポート試験から始めようと考えている方。
* 基本情報技術者試験から受験するつもりだが、ITパスポートの様子も知りたい方。

### 試験学習前の知識量
- 試験を受けるまで、IT業界への知識はほとんど0。かろうじて、テクノロジ系が少しわかる程度の知識量でした。（家庭的なハードウェアやネットワークの知識くらい。）
- 過去問を見てもほとんどわかりらない状態。

## 学習時間と結果
1月から学習を初めて、2月5日に受験。学習時間は1日平均2時間程度、計50時間程度でした。
合格結果は一月先のため、確定はしていませんが、点数は合格基準を上回っていました。

## 学習活動
### 学習計画
　まずはじめに、学習計画と目安の受験日を決めました。世間的な学習期間を調べてみると「1〜2週間」や「一夜漬け」などの意見も見られましたが、現状過去問がまったく解けなかったのと、試験のための勉強というよりは、網羅的に情報に触れながら気になるトピックは都度学習したかったため、余裕を見て1ヶ月としました。
　ネットの過去問などに触れてみて「要点を押さえれば大丈夫そう」という方は、1〜２週間程度で十分かもしれませんが、私のように「全然わからん」もしくは「じっくり学習したい」という方は、余裕ある計画を立てつつも、あえて先に受験日を決めて自分を追い込むのもおすすめです。
　私は対策テキスト＆過去問題集をもとに学習を始めたため、先にパラパラとページをめくりつつ、苦手分野と得意分野をそれとなくわけながら、その項目ごとの目標学習時間も立てました。
　結果的にも、目標学習時間に対する実学習時間によりその項目に対する理解度を図ることができたため効果的と感じました。

### 対策テキスト読み込みとアウトプット環境の構築　35時間
対策テキストを読みながら、キーワードをまとめていきました。最初は、ノートにペンで学習していましたが、途中からは、NotionにまとめつつZorbiに連携し、アウトプット用のフラッシュカードも作りながら学習を進めました。

https://zorbi.com/

これが非常に便利で、隙間時間にスマホアプリからサクッと学習をアウトプットすることができました。私は学習がインプットに偏りがちなきらいがあり、意図的にアウトプットを増やそうと思い導入しましたが個人的には正解でした。

### 過去問から試験傾向の把握　10時間
　次にテキストの過去問題集に取り組みながら、問題の形式と傾向の把握を行いました。また、検索すればすぐに出てきますがネット上の過去問サイトで問題を解きながら、自身の弱点と得意を確認し、その都度学習を行いました。
　これが、ポイントであったように感じます。出題内容に対する守秘義務があるため言及しませんが、このフェーズはより短くし、公式のシラバスを参考にしながら要点を振り返ったほうが個人的には良かったように感じます。試験では「これ〇〇ゼミでやったとこだ！」となる回数よりも圧倒的に、「あの内容のそこが問われるか」みたいな感じが多いように感じました。
　全くの無意味ではなく、参考にする情報源や試験のタイミング、内容により差は出るかと思いますが、あくまで過去問は過去問。よく出るものは抑えておこう。みたいな感じでライトに抑えて行けば全体の学習時間も短縮できたように感じます。公式のシラバスを見ながらポイントを整理するのも重要だと思います。

### 苦手の振り返りと最終まとめ　5時間
　私は、マネジメント系の出題範囲を苦手に感じていたため、それを中心に全体的な苦手分野を克服しつつ、計算問題、略語など確実に点の取れそうな問題を落とさないようにまとめました。
　合格基準は、全体で600点以上、各分野300点以上と足切りラインがあるため、得意分野はほどほどに苦手分野にフォーカスしてまとめてから、試験に臨みました。この時点で過去問はある程度余裕であったため少し慢心していました。

## 試験
受験前ボク「120分か。少し遊んでやるか。ｺｷ」
受験中ボク「ｶﾁｶﾁｶﾁｶﾁ....（アカン）」
受験後ボク「なぜこの点数が取れた」

てな感じでした。結果8割以上は取れたのですが、問題に戸惑うことがあり、自分の点数に不安を感じながら、帰宅後に結果をダウンロードし、2、3度確認しました。
　直前で、過去問が解けたことでやや慢心してしまったため、焦りましたが、問題内容にびびりながらも、しっかりと解答することができました。
　振り返ると、苦手分野を直前に抑えれたところと略語や用語説明のような内容を自信を持って取ることができたのが大きかったです。過去問慣れした気持ちで挑むと少し難しいかもしれません。

## 結論
### 慢心ダメ絶対
　以上が、ITパスポート試験の感想戦でした。
　次は基本情報技術者試験を受けようと思いますが、ITパスポートで触れた問題がシラバスに含まれるため、ITパスポート試験の学習も活かせそうで良かったです。どの言語を選択するか悩みますが、気が向いたらC言語とかにしてみようかなと思います。実際どの言語が割合多いんでしょうね？
一夜漬け？私には無理でした。
LuaファイルをTextAssetに対応する

# はじめに
ちょっとしたADVパートを実装する事になったため、実験がてらLuaを採用しようという話になり着手したのがきっかけです。
正直なところ、規模や内容的にCSVやxmlでも良かったとは思っていますが、後学のためにも採用しました。

# Luaを使うための手段はいくつかある
いざ使うとなった時、流石に１から全て自前で実装するのは骨が折れので、調査をしていくつか候補を出しました。

- [xLua](https://github.com/Tencent/xLua)
- [UniLua](https://github.com/xebecnan/UniLua)
- [MoonSharp](https://www.moonsharp.org/)

最終的には上記の3つに絞られた上でインポートの容易さなどからMoonSharpを採用することになりました。

# 実際に動かしてみて
公式ドキュメントのチュートリアルを見ながら実装をすすめた結果以下の点が気になりました。

- デフォルトでは"Assets/Scripts"以下のluaファイルしか読めない
- ソリューションエクスプローラーで設定が必要
- UnityにTextAssetとして認識させるため、拡張子を.txtに書き換える必要がある

ファイルの配置は独自のスクリプトローダーを実装することで改善はできそうでしたが、後者は無理そうでした。
ファイルの設定をいちいち書き換えるのは面倒ですし、拡張子を.txtに書き換えるとVSCodeなどでインテリセンスが働かなくなるので論外でした。

# .luaをTextAssetとしてインポート
妥協する案や、なんとか対応する案を検討した結果として、[ScriptedImporter](https://docs.unity3d.com/ja/2019.4/Manual/ScriptedImporters.html) を使い.lua拡張子のファイルをTextAssetとしてロードし、DoString で実行する方向に決めました。
これにより、Unityが公式にサポートしていない拡張子を処理できるようになります。

これを [LuaImporter.cs](https://gist.github.com/RabitBox/e5e6a3ee50272c068c1c71f6c6b0e3e5) という名前で保存し、適当な場所に置けば、luaファイルをTextAssetとして扱えるようになります。

``` csharp: LuaImporter.cs
using UnityEngine;
using UnityEditor.AssetImporters;
using System.IO;

[ScriptedImporter(1, "lua")]
public class LuaImporter : ScriptedImporter
{
	public override void OnImportAsset(AssetImportContext ctx)
	{
		var text = File.ReadAllText(ctx.assetPath);
		TextAsset textAsset = new TextAsset(text);
		ctx.AddObjectToAsset("Main", textAsset);
		ctx.SetMainObject(textAsset);
	}
}
```

ScriptedImporter は [Unity 2020.3](https://docs.unity3d.com/ja/2020.3/Manual/ScriptedImporters.html) 以降に正式サポートされた機能な点にご注意ください。
RollingHashクラスをPythonでつくったよ。

## 例題

https://atcoder.jp/contests/abc284/tasks/abc284_f

https://yukicoder.me/problems/no/2204

## つくったコード


```Python 
"""RollingHash

・つかい方
    rh = RollingHash(S): インスタンス生成
    rh.get(l, r): hash(S[l, r))

・めも
    1つ目のインスタンス生成で係数cfを決めてしまうから、
    たくさんインスタンスつくっても整合性がとれてる。

・参考URL
    https://qiita.com/keymoon/items/11fac5627672a6d6a9f6
"""

import random


class RollingHash:
    def __init__(self, S: str):
        le = len(S)
        if RConst.cf == 0:
            RConst.cf = random.randrange(1 << 31, RConst.Mod)
        if len(RConst.rui_cf) <= le:
            RConst.make_rui_cf(le)
        self.hash_arr = [1]
        for el in S:
            self.hash_arr.append(RConst.calc_mod(
                RConst.mul(self.hash_arr[-1], RConst.cf) + ord(el)))

    def get(self, l: int, r: int) -> int:
        "hash(S[l..r))"
        return RConst.sub(self.hash_arr[r],
                          RConst.mul(self.hash_arr[l], RConst.rui_cf[r - l]))


class RConst:
    Mask30 = (1 << 30) - 1
    Mask31 = (1 << 31) - 1
    Mod = (1 << 61) - 1
    cf = 0
    rui_cf = [1]

    @staticmethod
    def calc_mod(x: int) -> int:
        xu, xd = x >> 61, x & RConst.Mod
        ret = xu + xd
        if RConst.Mod <= ret:
            ret -= RConst.Mod
        return ret

    @staticmethod
    def sub(a: int, b: int) -> int:
        if a < b:
            return a + RConst.Mod - b
        return a - b

    @staticmethod
    def mul(a: int, b: int) -> int:
        au, ad = a >> 31, a & RConst.Mask31
        bu, bd = b >> 31, b & RConst.Mask31
        mid = ad * bu + au * bd
        midu, midd = mid >> 30, mid & RConst.Mask30
        return RConst.calc_mod(((au * bu) << 1) + midu + (midd << 31) + ad * bd)

    @staticmethod
    def make_rui_cf(x: int):
        l = len(RConst.rui_cf)
        for _ in range(x - l + 1):
            RConst.rui_cf.append(RConst.mul(RConst.cf, RConst.rui_cf[-1]))

```


## 使いかた
```Python
rh = RollingHash("ABCDEFG")
rh2 = RollingHash("FCDEABG")

assert rh.get(2, 5) == rh2.get(1, 4)
assert rh.get(0, 2) == rh2.get(4, 6)
assert rh.get(0, 3) == rh2.get(4, 7)  # ←これは成り立たないのでエラーになる
```

## ACコード
https://atcoder.jp/contests/abc284/submissions/42305802

https://yukicoder.me/submissions/882436
PHP で 映画 CRUDアプリを作った

1ヶ月半ほど PHP・MySQL の基礎学習してきました。その成果の一つとして表題のアプリを作りました。検索時の参照データベースに「TMDb」の API を使用しました。自分が映画が好きな点と、説明的なデザインが少ない本国のポスターは見ていてテンションが上がるので「見てよし、使ってよし」なアプリを目指しました。

## アプリ概要
### 検索/表示機能
映画のタイトルを入力すると、検索ワードに共通する映画ポスターとタイトル（日・英）を表示。
![スクリーンショット 2023-02-05 23.02![スクリーンショット 2023-02-05 23.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/5808e73d-467e-e42c-8378-1f4dac938a2b.png)
.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/969230b4-7b5b-9339-10d3-146f2bc73847.png)
![スクリーンショット 2023-02-05 23.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/6d2241bf-4ba7-4ff5-24f8-e21a105aa720.png)
### 更新/削除機能
検索したかった映画を選ぶと自分のデータベースに保存・表示・編集・削除できる仕組みです。API から提供されたあらすじだとわからない場合があるので、自分用にメモを追加できたりもします。
![スクリーンショット 2023-02-05 23.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/9e877c31-53c3-2abd-63b2-d3f18c87f137.png)
詳細画面の背景は、ポスター以外に映画のワンシーン写真を使っています。
![スクリーンショット 2023-02-05 23.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/3729bcff-cb78-78d5-8c08-fc8dfdd57a03.png)
### 目標として
- できる限り短い期間で動くアプリにする
- データベースと連携して登録・表示・更新・削除という基本操作を主軸にする（CRUD という言葉を最近知ったので使ってみました。 
- 自分が使いたいものにする
- デザイン（見た目）よりも機能に注力する
- ポスター上に操作用のアイコンなどを付与しない（個人的に重要）

を土台にアプリのテーマを考え、映画の閲覧データ管理を思いつきました。

### 学んだことと
- 仕様時に API ドキュメントの読み込みと理解、何がどこまでできるかを理解してから選定する
- GET と POST によるリクエストとレスポンス
- データベースの物理削除と論理削除の存在と bit 型
- 日付 Data型 の初期値に 0000-00-00 はNG,1900-01-01 にする
- tailwinds css （手入力ですが）
- もっと他のアプリを使って使い勝手や画面遷移を体験する

### 苦戦したこと、していること
- 目標としていた映画の配給国ポスターではない
API 取得時に言語を選択できるが、英語にするとOverview が英語になりわかりにくい。日本語にするとOverviewは日本語になるがポスターも日本版になってしまう。まだ API ドキュメントを理解しきれていないので、ひとまず日本版で保存することに。。
- tailwinds css
bootstrap で PHP に集中しようと思っていたはずが、挑戦欲が出てしまって2〜3日ほど時間をかけてしまった。でも、少し理解できたと思います。が、こういった使い方（手動）本来はしないんだろうなと。
- API キー env 管理
composer を入れないとできないのか、それ以外に方法はないか知りたい。Nuxt と Netlify 連携の際に、API キーの扱いを以下で学んだ後、PHP/MySQL に集中したのでそこの知識が曖昧。公開してみたいんですがひとまずはここを空欄にして Github に挙げておきます。
[プロフェッショナルWebプログラミング Vue.js](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%ABWeb%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Vue-js-%E5%B1%B1%E7%94%B0-%E5%85%B8%E6%98%8E/dp/4295200247)

### やりたいこと
- MVCアーキテクチャでの作り直し
ページが少ないのとまだこの考えが理解しきれていないのもあって、できてません。が、これから自分で育てていく過程で「管理しやすさ」の考え方を自分にインストールしておきたいなと思ってます。
- 機能を増やす
APIで読み込みできるデータをドキュメントをよく読んで理解できたら、抽出機能など使いやすさにつながる改善をしていきたいと考えてます。
- データベース設計
機能が増えてくるとデータをどう作るかが抽出や検索しやすさ（SQLの描きやすさ）につながるんだなと思いました。基礎文法だけだとあまり想像できなかったんですが、こうやって何か作ってやりたいことを実行してみてわかってきた所です。

### 期間：約14日
- 検討調査・フロント：6日
- PHP/MySQL プログラミング:6日
- 動作検証、修正：2日（ブラッシュアップ中）

仕様検討や設計に時間をかけずに見切り発車で作り始めました。フェーズ毎に明確に何日というよりは行きつ戻りつで進行しました。API とは？という所から始まり、英語ドキュメントを読んで試してみるところで四苦八苦し、tailwinds というこれまでのCSS設計頭から上手く回らず苦戦しました。ですが、好きな映画とそのポスターを眺められるだけでも作っている過程でテンションが上がる上に、何年も見ていない映画をたまたま検索で引っかかって再会できて喜びもひとしおです。
普段、アプリをあまり使ってなかったので操作性など学ぶことがありますが、初めて自力でウェブアプリを作れたので大変嬉しいです。周りの人に使ってみてもらってフィードバックもらいたいと思います（API キー涙）。
ここまでお読みいただき、ありがとうございました。
「Permission 'iam.serviceAccounts.signBlob' denied on resourceエラー」の解決方法

# はじめに

Firebase Functionsで次の処理を定義していました。

```shell
const bucket = this.storage.bucket(bucketName);
const file = bucket.file(fileName);
file.getSignedUrl({
    action: 'read',
    expires: '03-09-2491',
});
```

# 権限エラーの発生

そして、該当の呼び出し可能関数を実行した結果、次のようなエラーが発生しました。


```shell
Permission 'iam.serviceAccounts.signBlob' denied on resource (or it may not exist).
```

# 解決方法

`プロジェクト名@appspot.gserviceaccount.com`というプリンシパルに対して`サービス アカウント トークン作成者`のロールを付与することで解決しました。

Firebase Functionsの呼び出し関数で上記のエラーが発生したため、`firebase-adminsdk-xxx@プロジェクト名.iam.gserviceaccount.com`に対してロールを付与すべきかと思ったのですが、すでにそのロールは付与済みだったにも関わらずこのエラーが発生していました。

そのため、いろいろ調べてみた結果、`プロジェクト名@appspot.gserviceaccount.com`というプリンシパルに対してロールを付与することで解決することがわかりました。

# 参考にした記事

https://stackoverflow.com/questions/57564505/unable-to-assign-iam-serviceaccounts-signblob-permission

https://future-architect.github.io/articles/20190708/
macOS アプリ チェックリスト

新のマック(M2 Pro 14" 2023)ついて手に入りましたので一応インストールアプリの記事としてメモーします

# 必要のもの

## Browser
- Mozilla Firefox //Safari replacement (use China Tencent QQ as Website safty check provider see
https://9to5mac.com/2023/01/26/apple-china-website-censorship-hong-kong/) 
- Google Chrome

## ノートかメモー
- Obsidian
- Bear

## ノートかメモー
- Obsidian
- Bear

## 文字編集用, IDEかdevelop tools
- Visual Studio Code //The best Editor at this planet(Free)
- PhpStorm
- iTerm2 // build-in Terminal replacement!
- Docker Desktop //Container running tools
- Parallels Desktop //Windows and Linux base VM
- Xcode(Git)

## ツール
 - Alfred //10x faster than build-in spolight
 - Shottr //biild-in Screen Shot replacement
 - RunCat //let you know what your macOS was busy
 - Microsoft Remote Desktop
 - Keka //compressing app.(7-zip in MS Windows replacement

# なければマネー稼げないもの
- Sourcetree //Git GUI app
- RustDesk //Remote helpdesk
- Bitwarden //Password managment tools
- Line //IM
- Telegram //IM
- Signal //IM
- Discord //IM

# あれば良いもの
- Setapp(Paid)
- Cyberduck

# なくても構わないもの
- Syncthing
- Macs Fan Control
- MarkText //markdown editor
- MonitorControl 
- Waterfox //Firefox base browser!
- WireGuard //VPN client
[Vue]画面スクロールに合わせてバックグラウンドのalphaを調整

# 経緯
フロント何もわからんない...OSSにコントリビュートして武者修行してみよう。

# 要件
1度何となく作ってPR出してみたら「要件不足してたから定義するね」って言ってくれた。優しい。詳細は以下。
- At the top of the page the header has full opacity (as it does in your case)
- The user scrolls down -> the header disappears completely (0.0 opacity)
- The user scrolls up -> the header appears, and if the page isn't at the top then we'd have an opacity of 0.5 or - so for just the background of the header
    - The logo and buttons would have full opacity, just the background would be a bit transparent

# 実装
内容は英文の通りなので割愛。
- opacityで実装しようとしていたんだけど、opacityは強制的に子も親の値を継承してしまうらしい。
    - ヘッダー上に描画されるボタン類(子要素)も一緒に透明化してしまっていた。
    - **そんなときはrgbaのaで調整すればいいとのこと。**[参考](https://qiita.com/ririli/items/f1275af0e9979f29fa01)
- スクロール時のoffsetを常にキャッチ。更新前の値と比較して、スクロールダウン、アップに応じてheaderOpacityを更新する。


```vue.js
<template>
  <header
    ref="header"
    class="header-container sticky top-0 z-10 drop-shadow-md"
    :style="{
      'background-color': `rgba(22, 27, 34,${headerOpacity})`,
    }"
  >
    <div>
    　　〜省略〜
    </div>
  </header>
</template>

<script lang="ts">
import { Ref } from "vue";

export default {
  setup() {
    const headerOpacity: Ref<number> = ref(1);
    const prevScrollY: Ref<number> = ref(0);

    onMounted(() => {
      window.addEventListener("scroll", handleScroll);
    });

    onUnmounted(() => {
      window.removeEventListener("scroll", handleScroll);
    });

    function handleScroll(): void {
      const scrollY: number = window.scrollY;

      if (scrollY > 0) {
        if (scrollY > prevScrollY.value) {
          headerOpacity.value = 0;
        } else headerOpacity.value = 0.5;
      } else {
        headerOpacity.value = 1;
      }
      prevScrollY.value = scrollY;
    }

    return { headerOpacity };
  },
};
</script>

<style scoped>
.header-container {
  transition: 1s;
}
</style>

```

prevScrollY(直前のスクロール値)はどうやって管理した方がいいのだろうか(´・ω・｀)

# 追記
スクロール量のモニタリングは標準で備わっているwatchを利用した方がいいのでは？とのコメントをいただきました！
仰る通りだと思います！ありがとうございます！
bundle installしたらエラーが発生した！


# 問題
bundle installをしたら、下記のエラーが発生した
```
To see why this extension failed to compile, please check the mkmf.log which can
be found here:

/Users/◯◯/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-21/2.6.0/racc-1.6.2/mkmf.log

extconf failed, exit code 1

(中略)

An error occurred while installing racc (1.5.2), and Bundler cannot continue.
Make sure that `gem install racc -v '1.6.2' --source 'https://rubygems.org/'` succeeds before bundling.
```

# 調べたこと
mkmf.logを見ろって書いてあるのでログを見てみたところ、下記のエラーがありました。
```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

google先生に助けてもらったところ、
どうやらOSアプデのせいでXcode Command Line Toolが消えてしまったらしい。

# 対処方法
Xcode Command Line Tool のインストールをする

```
xcode-select --install
```

無事にbundle installが通って解決！

# 最後に
最初はmkmf.logの場所にうまく辿れなくてネットを彷徨っていたのですが、
vscodeで該当のパスをクリックしたらあっけなくログを開いてくれて拍子抜け・・・
でもそこからはサクッと解決に至れたので良かった！
OSアプデの度にこの事象が発生するようなので、次回からはもう大丈夫！

# 参考サイト
https://blog1.mammb.com/entry/2019/12/03/225607
Node-RED MCUのセンサーデバイスで取得したデータをクラウド上のNode-REDで永続化・可視化してみた。

# はじめに

以前、Node-RED MCUのセンサーデバイスで取得したデータをクラウド上のNode-REDのDashboardで表示するサンプルを作ったが、Dashboardで表示したデータは消失(揮発)してしまうため、今回はデータを永続化し、可視化する機能を追加してみました。

https://qiita.com/kitazaki/items/da3a2e4a16b8a971b840

# 構成

ローカルネットワーク(おうちIoT)のラズパイ、または、クラウド上でNode-REDを動かし、Node-RED MCUから受け取ったデータをinfluxdbへ永続化し、chronografで可視化します。

![スクリーンショット 2023-01-24 18.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2413d27b-4b2a-3201-3b92-9b7b1834717c.png)

# 前提条件

- デバイス
  - M5Atom lite
  - Unit ENVⅢ
- ラズパイ
  - Raspberry Pi4
- クラウド
  - OCI(Oracle Cloud Infrastructure)

# 手順

## Node-RED MCU

![node-red-mcu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3b3e6c79-c322-8322-dccf-bc668db522f5.jpeg)

## クラウド

### Node-REDをdockerで起動する

Node-REDとMQTT Broker(Aedes MQTT Broker)を動かします。
Node-REDはポート:1880で起動するため、ホスト側でポート:80でアクセスできるようにします。

```bash
$ sudo docker run -d -p 80:1880 -p 1883:1883 -v /home/ubuntu/.node-red:/data nodered/node-red:latest
```

### iptablesを変更する

dockerコンテナ環境(Node-RED)からホスト上のinfluxdbへアクセスするため、iptablesで通信を許可します。

```bash
$ sudo iptables -I INPUT -i docker0 -j ACCEPT
```

### influxdbをインストールする

```bash
$ sudo apt install -y influxdb influxdb-client
```

正常に起動していることを確認します。

```bash
$ sudo systemctl status influxdb
```

### influxdbのテーブルを作成する

influxコマンドでCLIへログインし、sensorという名前でデータベースを作成します。

```bash
$ influx
Connected to http://localhost:8086 version 1.6.4
InfluxDB shell version: 1.6.4
> create database sensor
```

データ格納されているか確認します。
Node-REDからM5Atomという名前でテーブル(measurements)が作成されています。

```bash
> use sensor
Using database sensor
> show measurements
name: measurements
name
----
M5Atom
> select * from M5Atom
name: M5Atom
time                humidity           temperature
----                --------           -----------
1674536180151641473 28.639658197909515 26.970702677958343
1674536185137529500 28.95399404898146  26.95735103379873
1674536190139970097 29.187457084000915 26.95735103379873
1674536195146578443 28.91279468986038  26.970702677958343
1674536200137016984 28.78919661249714  26.943999389639117
1674536205137830977 28.91279468986038  26.95735103379873
...
```

### chronografをインストールする

```bash
$ wget https://dl.influxdata.com/chronograf/releases/chronograf_1.10.0_amd64.deb
$ sudo dpkg -i chronograf_1.10.0_amd64.deb
```

正常に起動していることを確認します。

```bash
$ systemctl status chronograf.service
```

外部からグラフを確認する場合、ポート:8888を開放するか、ngrokでトンネル経由でアクセスします。

```bash
$ ngrok http 8888
```

### Node-REDフロー

右上のメニューから「パレットの管理」→「ノードの追加」で
node-red-contrib-influxdb
を追加します。

![oracle_node-red.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9e72f21d-5997-b14a-975d-55f9ff0eb52f.jpeg)

![influxdb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ed578c96-b525-d7bd-e2c2-360c95a9ef3a.jpeg)

### chronografのグラフ表示

![スクリーンショット 2023-02-05 23.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/5b6647df-c7a8-a050-c444-f64085a05221.png)
ChatGPTで出力が途中で途切れてしまうときの解決法

# はじめに
いま話題のChatGPT、なんとソートなどの簡単なプログラムコードだけでなく、複雑なコードまで書いてくれます。すごい。
しかし、あまりに長いコードの出力をお願いしてしまうと途中で出力が終わってしまいます。そんなときに残りの部分のコードを全て出力してもらう方法についてご紹介します。

ChatGPT : https://chat.openai.com/chat 



# 忙しい方へ

結論だけ言うと、「 続きは? 」と言えば続きの出力をしてくれます。とっても簡単です。





# 実際にやってみる
今回は、試しに機械学習のコードを出力してもらいます。


とりあえず、PyTorchをCIFAR-10を分類するモデルのコードを書くように頼んでみます。
すると、下のように出力してくれるのですが、途中で出力が終わってしまいます、、
![スクリーンショット 2023-02-05 22.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884446/49e47fe6-7dba-76b8-ed66-5d61759a744f.png)

![スクリーンショット 2023-02-05 22.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884446/345efa41-da8f-dbc7-e51d-fb2408e4546a.png)

やっぱりさすがに有料版じゃないと全てのコードは見せてくれないのか、、と思っていたのですが、
試しに 「 続きは? 」と返してみたところ、、

![スクリーンショット 2023-02-05 22.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884446/cb31de4d-4277-16e9-9a29-dbe7fa9da800.png)

こんなにあっさり教えてくれました！
無料版でも全部見れるなんて、、OpenAIさんありがとう、、
<br>



前回書いたChatGPTの記事 : [ChatGPTでニューラルネットのコードを書かせてみたらすごかった](https://qiita.com/0Kizw5B6S6Zi7Da/items/28fc13aec5cceca84e6c) 
よかったらぜひ見てみてください。

最後までご覧いただき、ありがとうございました。
RAMとROMについてまとめてみた（基本情報とかでよく出るやつ）

# RAM
RAMはRandom Access Memory の略。RAMは読み書きができて、電源を消すとデータが消える（揮発性）といった特徴があります。PCの電源が落ちて、データが消えちゃった！！というのは揮発性の例ですね。

## RAMの種類
RAMにはSRAM、DRAMの二種類があります。それぞれの特徴を挙げます。
### SRAM
* とても高速
* 高価で高集積には向かない
* キャッシュメモリなど、高速性が必要とされるメモリに使われている
* 1ビットの情報を記憶できるフリップフロップ回路で構成される

### DRAM
* SRAMより安く、高集積が可能である
* クロック同期型のSDRAM は主記憶装置に使われている
* 電荷を蓄えることができるコンデンサで構成される。コンデンサは自然に放電するため、一定時間ごとに書き込みを行う「リフレッシュ」が必要である

# ROM
ROMはRead Only Memory の略。ROMは読み込みのみできて、電源を切ってもデータが消えない（不揮発性）といった特徴があります。ROMの代表例はゲームのソフトです。ゲームのソフトって読み込むだけで、こちらが書き換えたりはしないですよね。具体的にイメージするとわかりやすいと思います。

## ROMの種類

### マスクROM
* 工場で一回だけ書き込むことができ、ユーザーは書き込めない
* ゲームのソフトや電卓のプログラムに使われている

### フラッシュメモリ
* 電気的に繰り返し書き込みができ、電源を消してもデータが消えない
* 電気的な書き込みには制限があり、何度も繰り返し書き込むことは向いていない
* USBメモリやBIOSの補助記憶装置に使われている

# 最後に
この記事は「うかる! 基本情報技術者 [午前編] 2022年版 福嶋先生の集中ゼミ」を参考に書きしました。
https://www.amazon.co.jp/gp/product/4532415632/ref=dbs_a_def_rwt_bibl_vppi_i11
Python学習、残り日数計算

こんにちはkmdです。
今回はyoutube等で学習用として紹介されていた日数計算について挑戦してみました。

問題）
今年があと何日あるかを
本日の日付から算出して
「今年はあと何日」と
出力するプログラムを作る

```
import datetime

nenmatsu = datetime.date(2023, 12, 31)
today = datetime.date.today()
hikaku = nenmatsu - today

print('今日は', today)
print('今年は残り', hikaku.days, '日です')
```

前回のじゃんけんに比べ非常に難易度を落としたのですが、やはりじゃんけんのプログラムは一番最初に行うには難易度が高かったと感じました。

実行結果は
```
今日は 2023-02-05
今年は残り 329 日です
```
まだできないのですが、todayのデータをリストか何かに格納してもっと美しく出力できると思いました。

前回の「初めてのPython、じゃんけんゲーム備忘録」でコードを見てくれた方がいたおかげで、修正してくれた内容を見て次はループ処理についての問題に挑戦していきたいと思いました。

なんだかんだ2023も一か月たってしまいましたね…
今年はPythonを扱えるようになるのと、血圧を下げる努力を！
怠らないように頑張ります！！
[Python] flet.colorsで簡便に利用できる色の一覧

<h2>blend_mode=flet.BlendMode.SRC </h2>

実際の色の見え方はBlendモードに依存します。
デフォルトのBlendモードはMODULATEで、各要素のbgcolorの見え方がPageなどの大要素のbgcolorに影響されます。
BlendモードをSRCとした場合はPargeのbgcolorによらずbgcolor本来の色が表示されます。
ただしBLACK87などはSRCモードではBLACKと同じ真っ黒として表示されるようです。

ここではSRCの場合の色の見え方をまとめました。
各Blendモードの処理についてはFlutterの公式ドキュメントをご覧ください。
https://api.flutter.dev/flutter/dart-ui/BlendMode.html

<h2>結果</h2>

![List_of_Flet_Colors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841874/7d9f334d-7b8e-f706-6f2d-452091a64d41.png)

<h2>コード</h2>

```
import flet as ft

def main(page: ft.Page):
    colors   = [c for c in dir(ft.colors) if not c.startswith('_')]
    rows     = []
    row      = []

    for n,c in enumerate(colors):
        color = eval('ft.colors.'+c)
        cont  = ft.Container(bgcolor=color, width=126, height=21, blend_mode=ft.BlendMode.SRC)
        text  = ft.Text(c, size=9, text_align=ft.TextAlign.RIGHT, color=ft.colors.WHITE)
        col   = ft.Column(controls=[text,cont], spacing=0)
        if n%14 == 14-1:
            row.append(col)
            rows.append(ft.Row(row))
            row = []
        else:
            row.append(col)

    page.add(ft.Column(controls=rows))
    page.title = 'List of Flet Colors (blend_mode=ft.BlendMode.SRC)'
    page.bgcolor = ft.colors.BLACK
    page.update()
        
ft.app(target=main)
```
NOW()

# insertで行を加えようとした。
```
INSERT INTO tables(name, created_at, updated_at) 
VALUES ("A", 2023-02-05, 2023-02-05);
```
```[22001][1292] Data truncation: Incorrect datetime value: '2016' for column 'created_at' at row 1.```

どうやらdatetimeの値が正確ではないらしい。
どうすればいいかを探していたところ。

# NOW()
```
INSERT INTO timestamp_n_datetime(ts,dt)
VALUES(NOW(),NOW());
```
# 出典
https://www.mysqltutorial.org/mysql-datetime/#:~:text=INSERT%20INTO%20timestamp_n_datetime(ts%2Cdt)%0AVALUES(NOW()%2CNOW())%3B

### 気づき
多分MYSQLのチュートリアルだと思われる。
これを使えばどうやら今のdatetimeの値を得ることができるらしい。

# 感想
エラーが出ずに成功した。
よかった。
まだこんなことも知らない。でも知ることができてよかった。
GitとGithubについて初心者が学んだことと基本コマンドシート

# tl;dr
* GitとGithubは完全に別物(GUIがあることからGithubに目が行きがちだが、Gitの基本を学ぶのが良い)
* 学んだことは, Staging, Commit (Githubへのmerge), 機能を足していくときはどんどんbranchを作って分けていくようにします
* コードを書いて機能を追加していくときには、Branchをどんどん分けていく。そうしないと間違いが起こったときに戻りづらく、レビューもしづらい ex. feature-A, feature-B ... etc.

## 基本的なコマンド
|COMMAND|ACTION|
|:----|:----|
|Shortcuts| |
|git init|gitを初期化|
|git status|各ファイルの状態などを確認|
|git add *|add FILENAME にてfileをstagingする|
|git commit|stagingしたファイルをコミットする。メッセージページを抜け出すのは Esc > :wq!|
|git commit -m "COMMENT"|メッセージページに入らずに、そのままコメントを書けるパターン|
|git push|remote (Github)にpushする|
|git fetch|remote (Github)をlocalに持ってきて、差異を判別する|
|git merge BRANCHNAME|上記fetchしたbranchをローカルのbranchにMergeする|
|git pull|fetchとMergeを一気にやる。個人開発で内容把握しているとかでない限りは、fetchして確認した方が良さそう|
|git log|git の過去ログを確認|
|git log graph|git の過去ログをグラフ状態で確認。閉じるにはq|
|git reflog|git の過去ログを消えてしまったものも含め確認|
|git diff|ファイルのUpdate箇所をチェック|
|git diff HEAD|HEADが現在あるファイルとの違いをチェック|
|git checkout BRANCHNAME|指定したbranchに移動|
|git branch|存在するbranchを確認|
|git checkout -b BRANCHNAME|新しくbranchを作成し、そこに移動する|
|git reset OBJECT|指定した過去のOBJECTに状態を戻す。Defaultは(--mixed)となり、戻る地点までのCommitはStaging前の状態に戻る。ローカルファイルは変更されない|
|git reset --soft OBJECT|指定した過去のOBJECTに状態を戻す。--softの場合、pointerが指定したObjectまで戻るが、Commitやローカルファイルはそのまま|
|git reset --hard OBJECT|指定した過去のOBJECTに状態を戻す。--hardの場合、戻る地点までのCommitはStaging前の状態となり、ローカルファイルも変更される|
|git reset HEAD~NUMBER|git resetの書き方違い。現在のHEADから数えて何番目に戻るかを数字で指定できる|
|git revert|git resetと似ているが、違いとして、resetは戻ることにより、logを消す。revertは消さない。通常はrevert推奨とのこと|


## 今回やってしまったこと
今回そもそもどういう事象が起こって、Gitを調べてみることになったのかをメモ的に残します。

### 今回起こっていたこと
`test` branchを作ってコードを書いていたはいいが、そのままずっと`test` branchを更新し続けました
![main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/1afc6caa-effb-1be8-1913-4792e43c1ed1.png)

### 今回起こっていると思っていたこと
Githubにて`test` branchをmergeしていたため、Localでもmergeされているものだと思ってしまっていた。そのため、`git log`を見たときに`main`が想定した場所に存在せず、混乱してしまいました
![main (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/e4617d7b-3499-77a8-81a2-94b43f511336.png)

### 修正後
* `git reset`を使い、追加機能ごとにbranchをわけました。実際は練習用に個人開発しているだけなので、無理やり`merge`することも可能だったが、せっかくの勉強の機会と思い理想と思う形まで変更しました。
* 途中、`conflict`が発生し、解決しないといけなくなりました。機能ごとに疎の状態で開発することが大切なんだと感じました。Object Oriented Programingの`カプセル化`にも通ずるものがあると思いました。
![main (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/31d57fec-8d18-765b-2e8e-92c2216dcb05.png)

### Last comments
* 今回、意図せずしてGitを学習することになりましたが、今までなんとなく使っていたコマンドの意味がわかったのは良かったです。
* またこれまで使っていなかった`branch`や名前だけ知っていた`conflict`について学べたのも有意義だったと思います。
* 機能ごとに分けることによって、レビューもしてもらいやすく、またコードを書くときもどの機能を追加しているのか、意識しやすくなるため、個人開発でもやるべきだと思いました。
Salescloud Consultant 学習メモ⑤

<h3>クイックアクション</h3>
モバイルでユーザの操作性を高める機能

<h3>メールインテグレーション</h3>
Outlook or Gmailのメールアドレス　→　取引先責任者/リードを表示

アクション　→　レコード作成

<h3>Lightning Sync/Einstein活動キャプチャー</h3>
SF　↔　MS or Googleのメール/カレンダー　➡　データを同期

<h3>トピック　＃（ハッシュタグ）　キーワード</h3>
共通のテーマを検索、リンクから一覧を表示できる機能

<h3>Chatter不在通知</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995724/cc2ab2e1-61ff-c821-b665-82da511691e4.png)



<h3>Chatterファイルの共有</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995724/0c2ae332-d840-4a5d-7bd0-22416b34ac82.png)

<h3>外部IDを使用した連携の仕組み</h3>

外部システムのIDをSFのカスタム項目（外部ID)に対応付ける

<h3>Salesforce Connect</h3>
SFの組織外に保存されているデータの表示、検索、変更を可能にするフレームワーク

※リアルタイムに外部システムのデータにアクセス
浮動小数点に関するテストコード(Swift)

# 浮動小数点に関するテストコード(Swift)

浮動小数点は実際の小数とは異なり、誤差が生じます。ですので、テストで沼にハマります。

例えば、以下のテストコードは失敗します。

```Swift
let value = 5.11 - 5.10
XCTAssertEqual(value, 0.01)
```

`value`と`0.01`は一致しません。エラーメッセージを眺めると、

```
XCTAssertEqual failed: ("0.010000000000000675") is not equal to ("0.01")
```

`value`は、`0.010000000000000675`になっているようです。コンピュータ上では、浮動小数点の計算には誤差が付きまといます。

そんな時は、[XCTAssertEqual(_:_:accuracy:_:file:line:)](https://developer.apple.com/documentation/xctest/2919914-xctassertequal)を利用しましょう。

例を示します。

```Swift
let value = 5.11 - 5.10
let epsilon = 0.0001
XCTAssertEqual(value, 0.01, accuracy: epsilon)
```

`accuracy`に、許容可能な最大誤差を設定します。今回は`0.0001`を設定しました。ですので、テストは通ります。
CloudFront+S3+Route53の構成で「wwwあり・なし」のドメインを運用する時の設定

## シーン

* S3バケットにHTML/CSS/JSなどの静的ファイルを配置して、CloudFrontで配信する構成を作りたい。
* 配信時のドメインは独自ドメインを使いたい。
* ドメインは「wwwあり」「wwwなし」のどちらも使えるようにしたい

## 設定

各サービスの設定時に、以下を気をつけておけば問題ない。

### CloudFront

* オリジンドメイン
    * `対象のS3バケット` を選択
* S3バケットアクセス
    * `Origin access control settings` を選択
* ビューワープロトコルポリシー
    * `Redirect HTTP to HTTPS` / `HTTPS only` のどちらかを選択
* カスタム SSL 証明書
    * ACMで発行した証明書を選択
* 代替ドメイン名 (CNAME)
    * 「wwwあり」「wwwなし」の２件とも登録

上記以外は基本的にデフォルト設定で問題ない。

### Route53

* レコード
    * wwwなし用のCloudFrontディストリビューションに対して、Aレコード（エイリアス）を登録する
    * wwwあり用のCloudFrontディストリビューションに対して、Aレコード（エイリアス）を登録する

## CORSの設定

JSONやJavascriptでCORSエラーになるため、以下の設定も必要。

### CloudFront

* キャッシュキーとオリジンリクエスト
    * `Cache policy and origin request policy (recommended)` を選択する
    * キャッシュポリシーに `Elemental-MediaPackage` を設定する
    * オリジンリクエストポリシーに `CORS-CustomOrigin` を設定する
    * 任意のレスポンスヘッダーポリシーを作成する
        * 特定のOriginのみを許可するポリシーを作成する
    * レスポンスヘッダーポリシーに、上記で作成したポリシーを設定する

## 最後に

wwwありの設定が抜けていたために、AWSにサイトを移行したあと、wwwありURLでアクセスできなくなっていたことが発端で、調査・設定に至りました。
現在は、無事、どちらのURLでもアクセスできるようになり、一安心です。。
Chrome 等で同じファイルをダウンロードした後に重複したファイルを一括削除する 

# ダウンロードフォルダに重複ファイルがたくさんある。。
ストレージの容量を圧迫するのでまとめて削除したい。

## 環境
macOS Monterey 12.6.1


### 削除前に削除していいのか確認したほうがいいですよね？

※ダウンロードリンクをクリックした時にすでにダウンロードしていると「xxxx(N).拡張子」で保存されてしまいますよね？

```
find ./ -name "*\(*"

.//.aaa (1).pdf
.//aaa (1).pdf
.//.bbb (1).rar
.//bbb(1).rar
.//.ccc(1).rar
.//ccc(1).rar
```

###  ざくっと消してしまいましょう

```
find ./ -name "*\(*"  -exec rm -rf {} \;
```

* xargs は使ってません

# 基本バスっと消えて元に戻せないので気をつけてください！
モジュールバンドラとは

# はじめに



#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>


モジュールバンドラについて学んだことを書いていきます。



# 具体的な内容


# モジュールバンドラとは何か


複数のモジュールを一つにまとめて、依存関係を解決して、まとめるものを言います。



# モジュールバンドラで何ができるのか


複数のモジュールを一つにまとめることで、HTTPリクエスト回数を減らすことができます。
一度に処理できるリクエスト数に限りがあるため、回数を減らすことが表示速度の、パフォーマンスの観点で優れていると言えるからです。


## その他にできること


CSSにブラウザごとのprefixを付与する。

JavaScriptでモジュールのインポート。

パッケージマネージャーをnpmで一本化。

node.js のモジュールをブラウザ上で使う。
　→node.js 向けに作られたモジュールもインポートできる




# まとめ


JavaScriptの足りない部分を補う形で色々なツールが生まれたんだと知ることができた。
調べると新しいワードが特にフロントエンドで出てきたので引き続き学習を進める。
ジェネリクスを簡単にアウトプット

## はじめに
ジェネリクスを利用すれば複数の型においても汎用的な処理を実装できる。また、ジェネリクスのコンセプトとしては入力値の型も任意にすることによってプログラムの汎用性をさらに高めるものである。尚、今回はジェネリクス「関数」を例にして記載する。

## 詳細
- 超簡単に言うと　IntやStringなど型に捉われず汎用的に型の定義や処理を実装できる
- ジェネリクスの基本定義
    - func 関数名<型引数>(引数名: 型引数) -> 戻り値の型 { 関数の呼び出しに実行される文 }
        -  戻り値にもジェネリクスを定義できる。
```swift:Swift
//Tというジェネリクスを引数に取り、Tというジェネリクスを返す
//<T: AdditiveArithmetic>が意味するのは、「AdditiveArithmeticプロトコルに準拠したあらゆる型」と言う意味。加算などを可能にするプロトコル。
func sum<T: AdditiveArithmetic>(a: T, b: T) -> T {
    return a + b
}
print(sum(a: 1, b: 2)) //3
print(sum(a: 1.5, b: 1.5))//3 <<< 少数の計算もできる



//ジェネリクスが出てくる以前はオーバーロードで対応していた（上記ソースコードに倣って）
func sum(a: Int, b: Int) -> Int {
    return a + b
}
print(sum(a: 1, b: 2))

func sum(a: Double, b: Double) -> Double {
    return a + b
}
print(sum(a: 1.5, b: 1.5))
```

## おわりに
何かご指摘事項がございましたらぜひコメント欄でご教授ください。

## 参考記事
[AdditiveArithmetic | Apple Developer Documentation](https://developer.apple.com/documentation/swift/additivearithmetic)

[[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)　](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者：片岡 巌
出版社：技術評論社
印刷/製本：日経印刷株式会社

## 開発環境
- Xcode-13.4.1
- Swift version 5.7
「ラズパイでフライトトラッカーを作ってみよう」　自分用メモ（更新中）

<h1>Flightradar24というサイトを知っていますか？</h1>


https://fabcross.jp/news/2023/20230202_raspberrypi_flighttracker.html

飛行機の運行情報をリアルタイムで追跡することができるサイトです。
ラズパイと放送型自動従属監視（ADS-B）受信機があれば航空機と通信して情報を取得できるようです。
なんだか旅行気分が味わえそうなのでやってみようと思いました。




<h1>やり方</h1>

具体的な方法は下記サイトに載っていました。英語版だったのでDeepL翻訳を駆使しながら進めます。

https://www.raspberrypi.com/tutorials/build-your-own-raspberry-pi-flight-tracker/


<h1>詰まったこと（更新中）</h1>

<h2>問題１　ラズパイを起動してもログインできない</h2>

ラズパイ起動時にFlightradar24が起動するのですが、ログインができません。
ユーザ名：pi
パスワード：raspberrypi
でログインできませんでした。

<h2>対策１　Raspberry Pi ImagerのOS選択時にzipファイルを選択する</h2>

Flightradar24のラズパイ用OSをダウンロードした後に、自分で解凍していました。
zipファイルのままRaspberry Pi Imagerに入れるように修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107172/fbcc69ac-e02f-79f2-75b6-f4073a9562b5.png)

<h2>問題２　wifiの設定ができない</h2>

参考サイトではRaspberry Pi ImagerでSDカードにOSを書き込んだ後に、wifiの設定をしていました。
「 Next, navigate to the boot drive to see its contents. Find the file named “wpa_supplicant.conf” and open it with your preferred text editor.
（次に、起動ドライブに移動し、その内容を確認します。wpa_supplicant.conf」という名前のファイルを見つけ、お好みのテキストエディタで開いてください。）」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107172/1ab2bcd7-e835-e3cd-7964-17f68776fc98.png)


この部分の意味が分かっていませんでした。

<h2>対策２　SDカード内直下のwpa_supplicant.confファイルを編集する</h2>
SDカードに書き込んだ後、SDカード内のwpa_supplicant.confファイルでwifi設定をすればOKです。
該当ファイルはDドライブ直下にあります。
問題１の時はこのファイルが存在しなかったので、zipファイルでないと書き込み時にファイル漏れが出るのかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107172/e3d0521f-db17-3df9-ac10-fce0babe8125.png)


<h3>（2023.02.05　現在ラズパイでFlightradar24の設定をしています。随時更新します。）</h3>
Visual Studio で .NET MAUI が表示されない

# 原因
Arm64 版の Visual Studio では .NET MAUI ワークロードがサポートされていない
# 動作環境
M1 Mac、Parallels 上の Windows11
# 経緯
.NET MAUI のワークロードをインストールするためにインストーラーを探してみると…ない！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123726/e4fbc43f-1cb4-97bc-0956-f36d4a7ccc94.png)


Visual Studio の再インストールや Preview 版をインストールするも表示されず…
そこで見つけたのがこちらの記事

https://learn.microsoft.com/ja-jp/visualstudio/install/visual-studio-on-arm-devices?view=vs-2022

Arm64 デバイスの Visual Studio でサポートされているのは一部のワークロードのみで、.NET MAUI や Python などのワークロードはサポートされていないようです。
Mac の M1 チップは Arm アーキテクチャのため、Visual Studio に .NET MAUI をインストールすることができません。
# Arm64 とは？
ARM社が開発したCPUのアーキテクチャの一つです。CPU のアーキテクチャはメーカーによって違いがあり、IntelのCPUにはx86やx64、ARM社はARMアーキテクチャが採用されています。

# 今後
こちらのスレッドによると、Arm64 版 Visual Studio でも .NET MAUI のサポートが検討されているようです。今後のアップデートに期待です。

https://developercommunity.visualstudio.com/t/Arm64-support-for-NET-Maui/10107707?q=%5BARM64%5D&stateGroup=active&ftype=idea&sort=relevance

# 参考
- [「ARM64とは」 e-Words](https://e-words.jp/w/ARM64.html)
poetryで利用するpythonをバージョンアップする

## やりたいこと
poetryで利用するPythonのバージョンを`3.10`->`3.11`にバージョンアップしたい！
## 前提
アップデートする開発環境は以下です。
- `Python`
    - `docker`を利用し特定バージョンのPythonを導入
- `poetry`
    - `container`上で導入
    - `poetry config virtualenvs.in-project true`を設定し、プロジェクトディレクトリの中に`.venv`として仮想環境を作成

## アップデート手順
### 1. `Dockerfile`のアップデート
FROM句を下記の通り変更します。
```diff_docker
- FROM python:3.10
+ FROM python:3.11
```

### 2. `poetry.toml`のアップデート
依存バージョンを下記の通り変更します。
```diff_toml
[tool.poetry]
name = "sample"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
- python = "^3.10"
+ python = "^3.11"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```

### 3. `.venv`の削除
プロジェクトディレクトリ内に存在する `.venv` ディレクトリをまるごと削除します。

```
sample
├── .venv <- このディレクトリを削除
├── main.py
├── poetry.lock
└── pyproject.toml
```

:::note warn
`.venv` を削除しない場合 `poetry` 実行環境にバージョンアップ前(`3.10`)の環境が利用されます
`poetry update` など行う際、`EnvCommandError`が発生するので注意してください！
-> `pyproject.toml` と `.venv` のバージョンが異なるのでエラーが出るのは当然...
:::

### 4. `poetry install` を行い、バージョンアップ後の `.venv` を作成
プロジェクトディレクトリ直下に移動し、下記のコマンドを実施します。
```bash
poetry install
```
コマンドが一通り実行されると、下記のように `3.11` の環境が格納された `.venv` ディレクトリが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146452/eed0bdbb-7a0f-a2c7-1ff0-c5dea287ab7a.png)

これで`Python`のバージョンアップが完了しました！

## 終わりに
「`Dockerfile`と`pyproject.toml`だけ書き換えれば、すぐにアップデートできるだろう」とおもっていたら、割とハマってしまって時間を使ってしまいました。。。
`poetry` で仮想実行環境が設定されていることを意識していなかった、自分の理解不足によるものだったな、と思いました。
便利なものほど仕組みをちゃんと理解していないと、めちゃくちゃ簡単なところでハマる教訓を得ることができました！

## 参考
- [Petry documentation](https://python-poetry.org/docs/)
    - 公式のドキュメントです（英語）
- [Poetry documentation (ver. 1.1.6 日本語訳)](https://cocoatomo.github.io/poetry-ja/)
    - 公式ドキュメントの日本語訳版です。
    - バージョンは少し古いですが、基本的なオプションなどは変わっていないのでめっちゃ便利です！
仮想ネットワークアプライアンスを導入するときは、スループットだけではなく「ネットワークフロー数」も確認しましょう

## はじめに

　Microsoft Azure にファイアウォールのネットワーク仮想アプライアンス（NVA）を導入後、通信が遅延したり、パケットロスが起きるという事象が発生しました。ネットワークトラフィック量は NVA 製品のカタログスペックを下回っており、CPUやメモリなどの使用率も問題が無いにも関わらずです。結論としては、Azure 仮想マシンの __ネットワークフロー数の制限__ に引っかかっていたということでした。

## ネットワークフロー数の制限とは

　Azureの仮想マシンには、ネットワークフロー数に関する制限があります。

> 　現在、Azure のネットワーク スタックでは、1 つの VM について合計 100 万個のフロー (50 万個の受信と 50 万個の送信) がサポートされています。 

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-machine-network-throughput

　ネットワークフロー数は、ネットワーク接続数との関連性が高い概念ですが、セッション数と同等ではありません。TCP の three-way handshaking でいうところの、 SYN, SYN+ACK がそれぞれ 1フロー とカウントされます。このフローについて、 Inbound、Outbound それぞれの方向に関して、50 万個までのアクティブなフローがサポートされるという制限があります。一瞬でもフロー数が 50 万に達すると、通信の遅延やパケットロスが発生する可能性があります。

　仮想マシンでどのくらいのネットワークフロー数が発生しているかは、 Azure Portal から確認することができます。仮想マシンのメトリックで、 __Inbound Flows__ や __Outbound Flows__ を選んでください。

　また、NSGフローログでも確認することができます。NSGフローログの詳細は以下をご参照ください。

https://learn.microsoft.com/ja-jp/azure/network-watcher/network-watcher-nsg-flow-logging-overview

　ただし、NSGフローログで確認できる値は、実際の数とは異なる可能性があります。
> 　ユーザー定義の受信 TCP ルールの問題:ネットワークセキュリティグループ (NSGs) は ステートフルファイアウォール として実装されます。 ただし、現行のプラットフォームの制限により、受信 TCP フローを制御するユーザー定義ルールはステートレスな方法で実装されます。 これに起因し、ユーザー定義受信ルールに制御されるフローは終了しなくなります。 また、これらのフローのバイト数やパケット数は記録されません。 結果として、NSG フローログ (および Traffic Analytics) で報告されるバイト数とパケット数は、実際の数とは異なる可能性があります。 

https://learn.microsoft.com/ja-jp/azure/network-watcher/network-watcher-nsg-flow-logging-overview#nsg-flow-logging-considerations

## メトリックでのネットワークフロー数の確認方法について
　Azure Portal でネットワークフロー数を確認できることは前述の通りですが、その確認方法について一つ注意点があります。

　ネットワークフロー数の制限は、アクティブなフロー数に関するものであるため、確認すべきはアクティブなフロー数の推移です。

　NICが一つである仮想マシンについては、メトリック __Inbound Flows__ あるいは __Outbound Flows__ で __集計__ を __最大値__ に設定すれば確認することができます。

　しかし、NICが複数ある仮想マシンでは、その見方では確認したい値となりません。 __最大値__ の場合、複数の NIC の中で、最もフロー数が多い NIC に関する フローの最大値が表示されてしまうためです。ネットワークフロー数の制限は、NICごとではなく、仮想マシンごとの制限であるため、すべての NIC のアクティブなフロー数を合計した値を確認する必要があります。結論としては、 __集計__ を __合計__ にし、 __時間の粒度__ を __1分__ にして見る必要があります。

　注意点として、 __集計__ を __合計__ にすることは、 NIC の合計と、単位時間当たりの合計という２つの合計の意味があります。そのため、 時間の粒度 を 5分など、1分より大きい値とした場合、 その時間の合計値が表示され、アクティブフロー数の推移を確認するという目的には合わなくなります。

　この仕様は、 2023年１月 現時点で Microsoft のドキュメントに記載はありません。Azure の技術サポートの方に教えていただいたことでわかりました。実際に、手元の検証環境でフロー数を確認した際、 NIC が一つの仮想マシンでは、 __最大値__ で確認できる値と、 __集計__ を __合計__ にし、 __時間の粒度__ を __1分__ にした値は等しくなりました。一方で、NIC が複数ある仮想マシンの場合は、 __最大値__ で確認できる値と、 __集計__ を __合計__ にし、 __時間の粒度__ を __1分__ にした値は、後者の方が多いという結果でした。

　まとめると以下です。

__仮想マシンのアクティブなフロー数を確認する方法__
| 仮想マシンのNICの数 | 集計 | 時間の粒度 |
|--|--|--|
| 1つ | 最大値 | 任意の時間で確認可能 |
| 2つ以上 | 合計 | 1分 |

## おわりに
　この事象が起きたプロジェクトでは、NVA 1台ではネットワークトラフィックをさばききれないということが分かったため、間に Azure Load Balancer を入れ、複数台の NVA で負荷分散する構成に変更することとなりました。

　NVAの場合は、その機能の特性上、ネットワークフロー数が多くなることが予想されます。トラフィックが多くなる場合は、NVA をスケールアウトできる構成にすることをおすすめします。

　また、このようなネットワークフロー数の制限について、現時点では Azure でしかドキュメントでも仕様を確認できていませんが、AWS や Google Cloud 等ほかのクラウドでも同様の事象が起こりうると想像されます（※違っていたらご指摘ください）。クラウドに NVA を導入する際には、事前にフロー数も確認いただければと思います。
[Identity-Aware Proxy] Cloud Run で公開したサービスに対して、IAM で定義したユーザのみアクセスを許可する



特定メンバーのみ Web アプリにアクセスできる仕組みが欲しいと思い、Identity-Aware Proxy による IAM（Google アカウント）認証を試してみました。  
IAM でメンバーを統合管理できる、且つ、IAM 上でロールの付与/削除するだけでメンバーへのアクセス制限ができるので、運用コストも掛からないです。


（最近、仕事で記事を書く機会があり、その際、この記事をストックしたままだったことを思い出したので、これを機に公開）

# Identity-Aware Proxy とは
- 認証機能
- ユーザとアプリケーション間の通信を仲介する
- 脱 VPN を実現する手段の一つ
- IAM と連携してアクセス制御できる
- 現状、App Engine/Cloud Run/Compute Engine/Kubernetes Engin で公開されたサービスに適用できる

以下は Cloud Run サービスへ適用する際の構成です。※ [公式](https://cloud.google.com/iap/docs/concepts-overview?hl=ja#how_iap_works)引用
![architecture](https://user-images.githubusercontent.com/55335212/194704640-58540cca-e0a9-409e-8d64-b4c08aa91878.png)

## Identity-Aware Proxy 適用後のイメージ
公開されたサービスにアクセスすると、Google 認証画面が表示され、
![result-01](https://user-images.githubusercontent.com/55335212/194704650-52ba213c-c7d6-4d85-808b-afddb7881ab0.png)

ログインを試みると、権限が無いメンバーに限りアクセスエラーになります。
![result-02](https://user-images.githubusercontent.com/55335212/194704656-7180c616-7aac-4808-a208-0cce6ea42997.png)

# 手順
1. Cloud Run サービスのデプロイ
1. Load Balancer の作成
1. Identity-Aware Proxy の設定
1. IAM の定義

前提として、以下は完了している想定で進めます。
- 公開するサービス用の静的 IP アドレスの予約
- 公開するサービス用の DNS の設定（A レコードの追加）



# Cloud Run サービスのデプロイ
## イメージ Push
~~~bash
gcloud config set project PROJECT_ID
gcloud builds submit --tag=asia.gcr.io/<PROJECT_ID>/<IMAGE_NAME>
~~~

## デプロイ
~~~bash
gcloud run deploy <SERVICE_NAME> \
   --image=asia.gcr.io/<PROJECT_ID>/<IMAGE_NAME> \
   --port=<PORT> \
   --region=asia-northeast1 \
   --ingress=internal-and-cloud-load-balancing \
   --allow-unauthenticated
~~~
- --port=<PORT>
    - デフォルトでは 8080 ポートになるので、適宜変更する。
- --ingress=internal-and-cloud-load-balancing
    - Cloud Run サービスへのネットワークアクセス制限の設定です。Load Balancer を経由して、Cloud Run サービスへのアクセスを許可します。
- --allow-unauthenticated
    - 未認証アクセスを許可します。これにより、Cloud Run 側でリクエストの認証を行わないようになります。代わりに、Identity-Aware Proxy で認証させます。

# Load Balancer の作成
冒頭の構成図の通り、HTTPS Load Balancer を経由させます。

## フロントエンドの構成
![flow-01](https://user-images.githubusercontent.com/55335212/194704680-27bd3e08-39f3-4d26-bab3-cd5e34e1b5d7.png)
![flow-02](https://user-images.githubusercontent.com/55335212/194704689-0941e285-3494-4592-aaf9-d01511d3d025.png)


以上でフロントエンドの構成は「完了」です。

## バックエンドの構成
![flow-03](https://user-images.githubusercontent.com/55335212/194704698-dfbdfdf3-bc79-498d-ab5e-ac2647f55cbd.png)
![flow-04](https://user-images.githubusercontent.com/55335212/194704699-c3ccd1d5-f5d1-4d77-a1fc-f43a0f42e6e7.png)


以上で Load Balancer の作成は「完了」です。
証明書のステータスが「ACTIVE」になるまで待つ。
![flow-05](https://user-images.githubusercontent.com/55335212/194704709-91334581-5841-4bbe-8b88-9f9fad044cae.png)


# Identity-Aware Proxy の設定
Identity-Aware Proxy のコンソールに遷移すると、作成した Load Balancer のバックエンドが一覧に表示されるので「IAP」の有効化を行います。
![flow-06](https://user-images.githubusercontent.com/55335212/194704717-953cafd6-eda1-4e1f-82c8-cf2e81ba2193.png)


# IAM の定義
アクセスを許可したいメンバーに対して、「IAP で保護されたウェブアプリ ユーザー」ロールを付与すれば完了です。
![flow-07](https://user-images.githubusercontent.com/55335212/194704723-1c3892cb-df9f-4ff3-99ed-9e88f053efc5.png)

# Ref
- [Identity-Aware Proxy](https://cloud.google.com/iap?hl=ja)
FS.comのネットワークスイッチでTrunkポートにNative VLANを設定する方法

# 前提
通常L3スイッチ標準のNativeVLANは1番が指定されている。しかしながら、機器管理用のVLANを別途に設定した際にそのVLANをNativeVLANに設定することが多い。Cisco製のCatalystであれば、
```
switchport trunk native vlan XXX
switchport trunk allowed vlan XXX,XXX,XXX
switchport mode trunk
```
というふうに設定するだけなのでお手軽だが、FS.com製のスイッチは少し設定内容が複雑なうえ日本語のドキュメントが見当たらなかった。

# 設定方法
```
 switchport trunk vlan-allowed XXX,XXX,XXX
 switchport trunk vlan-untagged XXX
 switchport mode trunk
 switchport pvid XXX
```
ポイントは`vlan-untagged`と`pvid`のどちらも適用しなければならない点である。

書いている自分自身もネットワークでよくわかっていないことが多いので何か間違っていたらすみません。
Parquet形式のファイルを作りたい

### 遭遇した問題

PySparkで以下の様に書いて実行しても何故かdf.parquetという名の空フォルダが作成されてしまいました。
```python:
df.write.parquet('path/df.parquet')
```

そこで、少し手間ですがjupyterでpandasを使いParquet形式のファイルを作成することにしました。
```python:
#ライブラリをインポート。
import pandas as pd
#CSVファイル読み込み。
df = pd.read_csv('path/df.csv')
```

ここでいきなり

```python:
df.to_parquet('path/df.parquet')
```

と書いて実行してもうまくいかず、次の準備が必要でした。

```python:
!pip install pyarrow
```

これで先のコードを実行するとうまくParquet形式のファイルを作成できました。

作成したファイルをPySparkで読み込むには以下の様に書けば大丈夫です。

```python:
Df = spark.read.parquet('path/df.parquet', header=True, inferSchema=True)
```