OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud Functions(PHP)を使用して、CSVファイルのデータをBigQueryへ転送する

# はじめに

CloudFunction(PHP)を使用して、Cloud Storage内に配置したCSVファイルのデータをBigQueryへ転送する方法をまとめました。

CSVファイルのデータは前回の記事の方法で用意しました。
・[Cloud Functions(PHP)を使用して、Cloud SQLのデータをCloud Storageへ転送する](https://qiita.com/n-watanabe-iret/private/8d0c16755fe903cdb394)

## 使用サービス
- Cloud Functions
- Cloud Storage
- BigQuery

## やろうとしていること
- Cloud Storageに配置したCSV読み込み → BigQuery転送


## ソース

```PHP:Function 2
use Google\CloudFunctions\CloudEvent;
use Google\Cloud\Storage\StorageClient;
use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

function function2(CloudEvent $cloudevent)
{
    // BigQuery へのアクセス準備（事前にコンソール側でデータセットやテーブルの作成は済ませておく）
    $bigquery = new BigQueryClient([
        'projectId' => 'test_project', // project名
    ]);
    $dataset = $bigquery->dataset('test_dataset'); //データセット名
    $table = $dataset->table('test_table'); //テーブル名

    // CSVファイル内の(\N = NULL)の設定
    $options = [
        'configuration' => [
            'load' => [
                'nullMarker' => "\N"
            ]
        ]
    ];
    // 読み込むcsvファイルを指定
    $uri = "gs://test_bucket/test.csv";
    // オプション等を設定
    $loadConfig = $table->loadFromStorage($uri, $options)->writeDisposition('WRITE_TRUNCATE');
    // csvデータのBigQueryへの転送処理
    $job = $table->runJob($loadConfig);

    // ExponentialBackoff処理
    $backoff = new ExponentialBackoff(10); //リトライ数を設定
    $backoff->execute(function () use ($job) {
        $job->reload();
        if ($job->isComplete() === false) {
            throw new Exception('Job has not yet completed', 500);
        }
    });

    // 実行結果の検証
    $info = $job->info();
    if (isset($info['status']['errorResult'])) {
        // エラー処理など
    }
}

```

今回Cloud Functionsの実行は、イベントタイプをCloud Storage（google.storage.object.finalize）にして対象のバケットにファイルが格納されると起動するようにしています。

CSVファイル内のカラムにNULLが存在する場合は「\N」で設定されていることを前提に、BigQueryClientのloadFromStorageにオプションを設定しています。

BigQueryへの転送は、処理に時間が掛かることもあるので、実行が失敗した時のために<b>[Exponential Backoff](https://cloud.google.com/iot/docs/how-tos/exponential-backoff)</b> でのリトライ処理を入れています。

実行するCloud Functionsとは別のプロジェクトのBigQueryへ転送したい場合は、Cloud Functionsのサービスアカウント（のメールアドレス）を別プロジェクトのIAMにプリンシパルで追加する必要があります。
権限は下記で動きますが、必要な権限のみに絞る方が良いと思います。
・BigQuery ジョブユーザー
・BigQuery データ編集者
ESP32-WROOM-32とDHT11温度および湿度センサー測定モジュール

# 外見
![DHT11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738176/e279bd6b-12b4-427d-e324-b5ca9b3d1301.jpeg)

# ピン説明
1.VDD(3.3~5.5v DC)
2.DATA
3.GND

# 性能
1.湿度の測定範囲：20~90% rh
2.湿度測定の精度：±5% rh
3.温度測定範囲：0~50℃
4.温度測定の精度：±2℃
5.動作電圧：3.3~5.5V DC

# 開発環境
・Visual Studio Code(ver 1.69.2)
・PlatformIO(Core 6.1.1  home 3.4.2)
　[追加ライブラリ]DHT sensor library

# ソースコード(ほぼサンプルコードのまま)
・使用するピン
　32:DATA

```diff_c
#include <Arduino.h>
#include <DHT.h>

#define DHT11_DATA_PIN 32

DHT dht(DHT11_DATA_PIN, DHT11);

void setup() {
  Serial.begin(115200);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}
```
husky と lint-staged  完全に理解した 

## モチベーション

Gitリポジトリにコミットするソースコードの質を保つために[husky](https://github.com/typicode/husky) と [lint-staged](https://github.com/okonet/lint-staged)を組み合わせて、 [gitのpre-commitイベント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF#_%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%95%E3%83%83%E3%82%AF) で リンターやフォーマッターを適用します。

`.git/hooks/pre-commit` ファイルがないのに、動作しているのが気になっていたので、動作の仕組みを調べた結果です。

## 3行まとめ

1. huskyが動作しているリポジトリで `git config -l |grep core.hookspath` を見ると、 Git の フックスクリプトのパスが *.husky* ディレクトリになっている。
1. Gitのフックスクリプト *.husky/pre-commit* があり、 pre-commitで `yarn lint-staged` を実行している
1. *package.json* ファイルの `lint-staged`(https://github.com/okonet/lint-staged#packagejson-example) に実行するリンターやフォーマッターを定義している

## 仕組み

### 動作確認に使用したバージョン
- Node.js: 14.18.3
- yarn: 1.22.17

### 1. Gitのフックスクリプト

Gitリポジトリの操作で コミット前、コミット後、リベース前などのイベントが発生した時にカスタムスクリプトを実行するための仕組みです。コミットに注目すると、下の4つのイベントがあります。

1. pre-commit: コミットメッセージが入力される前に、コードの検査などを行う。フックスクリプトが0ではない値を返すと、コミットが中断される。
1. prepare-commit-msg: コミットメッセージのデフォルトメッセージが作成され、エディタが立ち上がる直前に実行される。コミットメッセージの自動生成などに利用できる。
1. commit-msg: コミットメッセージを入力して、エディタがコミットメッセージを一時ファイルに保存した後に実行される。「issueの番号が必須」等のコミットメッセージの検査に利用できる。フックスクリプトが0ではない値を返すと、コミットが中断される。
1. post-commit: コミットの手続きが全て完了した後に実行される。通知などに利用できる。

### 2. Gitのフックスクリプトをhuskyで管理する

huskyの導入時や husky導入済みのプロジェクトで npmのパッケージをインストール時に *git config core.hooksPath* が *.husky* 設定されます。
```bash:husky導入時
$ yarn add --dev husky
$ npx husky install
``` 

```bash:husky導入済み
$ yarn install
```

`git config` で値を確認することができます。
```bash
$ git config -l |grep core.hookspath
core.hookspath=.husky
```

また、huskyを導入したら、 `npx husky install` が適宜実行できるように package.json に スクリプトを定義します。

```json:package.json
{
    "script": {
        "prepare": "husky install"
    }
}
```

### 3. pre-commit時に実行する lint-staged を呼び出す

Gitの *pre-commit* イベントの準備ができたら、呼び出される lint-staged をインストールし、huskyのフックスクリプトに lint-staged の実行を追加します。

```bash
$ yarn add --dev lint-staged
$ yarn husky add .husky/pre-commit "yarn lint-staged" 
```

フックスクリプト *.husky/pre-commit* の中をみると、 lint-staged の実行が追加されていることがわかります。

```bash:.husky/pre-commit 
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

yarn lint-staged
```

### 4. lint-staged で行うことを定義する

*package.json* に必要とするリンターやフォーマッターの実行を定義します。今回は、 [phpstan](https://phpstan.org/) と [phpcs](https://github.com/squizlabs/PHP_CodeSniffer)を実行します。

```json:package.json
{
    "scripts": {
        "phpstan": "php -d 'memory_limit=1024M' vendor/bin/phpstan analyze",
        "phpcs": "php vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php fix"
    },
    "lint-staged": {
        "*.php": [
            "yarn phpstan",
            "yarn phpcs"
        ]
    }
}
```

## 動くもの

GitHubにあります。

https://github.com/yumemi-makiyama/phpstan-and-phpcs-for-laravel
Javascript 変数 (初学者の学習メモ)

# Javascript 変数の学習メモ

### 変数の基本

- 変数(let)、定数(const)はデータにあだ名をつけるみたいな機能
(昔はvarも使用されていたが、varはもう使わない為、覚えなくてよい) 


- 変数、定数は使い方が３つある
    1. 宣言→ あだ名をつけること
    2. 代入→ あだ名に対して値をひも付けすること
    3. 参照→ あだ名にひもづいている値を使うこと

- 変数(let)は、再代入できる、再定義できない。(先に宣言だけして、後から代入することができる。)
- 定数(const)、再代入できない、再定義できない。(宣言と値の代入はセット。)

- 変数の名前は、```「 Unicord文字(記号以外の文字)、数字、$、_ 」```が使える。
(日本語も使えるが、非推奨)
- 同じスコープ内で、同じ変数名を定義することはできない ( スコープについては後に記載)

```javascript:変数 let
let x = 20; // 宣言、xの値を代入
let y = 30; // 宣言、yの値を代入

console.log(x); // xをコンソールに出力 = 20
console.log(x * y); // x * yをコンソールに出力 = 600

x = 7; // 変数xを再代入

console.log(x); //xをコンソールに出力 = 7
```

```javascript:定数 const
const x = 20; // 宣言、変数xの値を代入
const y = 30; // 宣言、変数yの値を代入

console.log(x); // xをコンソールに出力 = 20
console.log(x * y); // y * yをコンソールに出力 = 600

x = 7; // 変数xを再代入  → エラー！
```
### 有効範囲

- スコープとは変数の名前や関数などの参照できる範囲を決めるもの。スコープの中で定義された変数はスコープの内側でのみ参照でき、スコープの外側からは参照できない
- { と }で囲んだ範囲をブロックと呼ぶ
- ブロック内で宣言された変数は、スコープ内でのみ参照でき、スコープの外側からは参照できない
- 同じスコープ内で、同じ変数名を定義することはできない

```javascript:例-1
{const x = 20;} 

console.log(x); // xをコンソールに出力 → エラー！
```
→ブロックスコープ内で定義した変数なので、スコープの外からの参照できない
```javascript:例-2
{
  let x = 20;
  console.log(x); // xをコンソールに出力 → OK
} 
```
→ブロックスコープ内で定義し、スコープ内で参照しているのでOK
```javascript:例-3
{
  const x = 20;
  console.log(x); // 20と出力
  {
    const x = 30;
    console.log(x); // 30と出力
  }
} 

const x = 40;
console.log(x); // 40と出力
```
→それぞれのスコープで宣言しているため、それぞれ別の値が出力される
```javascript:例-4
{
  const x = 20;
  console.log(x); // → エラー！
  const x = 30;
  console.log(x); // → エラー！
} 
```
→同じスコープ内で、同じ変数名を定義することはできないので、エラーになる。

### constの値が再代入できる場合もある

MDNによると、「定数の中身がオブジェクトの場合、オブジェクトの内容（プロパティなど）は変更可能です。」とあるように、オブジェクト内の値に関しては、再代入が可能になる。

つまり、参照型(オブジェクトや配列)では、値を格納している参照値を変更せず格納された値を変更できるため、下記のように、格納された値のみを変更することができる。

```javascript:constの再代入できる例
// オブジェクトの中身の変更の場合

const example = {name:"田中" , age:36};
// example =  {name:"佐藤" , age:36};  // エラー
example.name = '佐藤';  // OK

console.log(example.name); // 佐藤

// 配列の中身の変更の場合

const example = ['A', 'B', 'C'];
// example = ['エー', 'ビー', 'シー'];  // エラー
example[0] = 'エー';  // OK

console.log(example[0]); // エー
```
### まとめ
基本の部分ですが、重要な部分だと思いメモとして残しました。
最初、constは「定数なので、再定義、再代入できない」のにも関わらず、スコープ外で同じ名称の宣言をした際に使えてしまうことに引っかかりましたが、ブロックとスコープの意味を調べることで、「有効範囲」を確認することで、理解が深まったように感じます。また、
nextjs+contentful+typescript+stripe+supabase+Vercel×→Netlify+TailwindCSS+Material-uiで簡単にサブスクリプション可能なブログ機能付きのホームページを作ったが…

# 概要
タイトルの通りでnextjsとその他いろいろなサービスを使ってホームページを作りました。

一人で作成したので、いろいろガバガバなところが多いです。

どちらかというと実用性よりも、自分の新しい技術の学習を進めるためにいろいろ試しに使ってみたといった感じなので、ベストプラクティスからは程遠いので、参考程度にしていただければなと思います。

### 技術選定についての続き

[TypeScript・React　技術選定編　１](https://qiita.com/edegp/items/4bd29dc028d96f774f1e)

[Next.js・~~Vercel~~→Netlify 技術選定編　2](https://qiita.com/edegp/items/4e2de4445a41c1147b45)

[Stripe・Supabase 技術選定編　3](https://qiita.com/edegp/items/5732dce702460a28aa03)

### 追記
記事をまとめていて、Vercelは商用利用禁止だったことに気づきました💦（まだ利益0だから許して）
なのでVercelからNetlifyに移行しました
移行方法について書いたので良かったら[見てみてください](https://qiita.com/edegp/items/4e2de4445a41c1147b45)

独自ドメインにしました！（2022年7月31日）
技術選定編２のURL間違えてました

#### 作ったものはこちら↓
ANful公式ホームページ　↓

https://anful.jp

ANful　LP　↓

https://anful.jp/lp

ANful　会員登録　↓

https://anful.jp/subscription

github　↓

https://github.com/edegp/anful

![Screenshot 2022-07-03 at 23-07-30 anful.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604384/939dda32-71fd-82ea-77c2-02ceb8b64c79.png)



## 背景
ぱっと何をやっているのかわかりづらく、以前このサイトについて説明を求められたときに、自分も技術についての理解が甘かったので、うまく説明できず良さを分かってもらえませんでした。

なので、始めの記事でこのサイトの概要を示したうえで、
次以降の記事で使用した技術を一から何なのかを説明していきたいと思います。

## このサイトは何なのか
ウェブサイト作成サブスクリプションを登録できるサイト
（ウェブサイト作成サブスクリプションについては次回以降の記事で）

## このサイトの意義
世の中にウェブサイト作成サービスは山ほどありますが、日本ではウェブサイトが比較的大きな企業で採用されることはありますが、飲食店などの比較的小さな規模の事業者だとあまり採用されていません。そこで、あまりPCが得意でない方でも簡単に申し込みできるようなサイトを作れたらいいなと思いこのサイトを作成しました。

## このサイトはどんなサイトなのか

このサイトの意義を達成できるように、
LPの閲覧→会員登録→ヒヤリング項目の記入→クレカでの支払い→申し込み完了画面
までが1つのサイトでできるようになっています。
クレカでの支払いまでは画面の遷移もないので、スマホでの閲覧もストレスフリーです。


## どのように実現したのか

<dl>
<span> 言語 </span>
<dd><strong>(なんちゃって)Typescript<strong></dd>
<span>フレームワーク</span> 
<dd><strong>Next.js</strong></dd>
<span>CMS</span> 
<dd><strong>Contentful</strong></dd>
<span>決済機能 </span> 
<dd><strong>stripe</strong></dd>
<span>会員管理のデータベース</span>
<dd><strong>supabase</strong></dd>
<span>ホスティングサービス</span>
<dd><strong>Vercel</strong></dd>
<span>UIライブラリ</span>
<dd><strong>Material-ui</strong></dd>
<span>CSS フレームワーク</span>
<dd><strong>Tailwind CSS</strong></dd>
</dl>

## ストラクチャー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604384/00e60a6a-e909-d7be-01b1-669cfc17ccec.png)


使用技術やその選定に関してはの解説は次回以降の記事で書こうと思います。


## 作った感想
技術選定はとりあえず、おもしろそうな技術を全部使ってみよう言う感じで、いろんな技術を使ったので、インプットがかなり大変でした。
一方で、何かの教材をもとに作ったわけではないので、コードの仕組みについて自分で考えることがかなり多かったので、自分の成長につながったと思います。
膨大なインプット量だったので、あまり一つ一つの技術について、理解が追い付いていないので、次回の記事から一つ一つじっくりと解説しながら理解を深めていきたいと思います。

### 次回は技術選定・デザインについて

## 続き
TypeScript・React　技術選定編　１

https://qiita.com/edegp/items/4bd29dc028d96f774f1e

Next.js・~~Vercel~~→Netlify 技術選定編　2

https://qiita.com/edegp/items/4e2de4445a41c1147b45

Stripe・Supabase 技術選定編　3

https://qiita.com/edegp/items/5732dce702460a28aa03
Ubuntu20.04でMySQL5.7のクライアントを使う

普通にaptでインストールしようとするとMySQL8.0になってしまうが、MySQL5.7が欲しい時にどうするか。

## MariaDBを入れる

めっちゃお手軽。
ただ、Aurora MySQLとの相性(?)で謎の挙動があったりして困った。

https://nibral.hateblo.jp/entry/2020/01/17/215718

## Docker

これは1つの解決方法

```bash
$ docker run -it --rm mysql:5.7 mysql -h $hostname -u $user -p
```

ただし、ファイルを扱ったりするには良い感じにVolumeマウントする等、工夫が必要になる。
日本語を直打ちすることも出来ないっぽい。

## MySQL公式パッケージを入れる

ぎりぎり(?)うまくいった。

```bash
$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb
$ sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
$ apt-cache policy mysql-client
mysql-client:
  インストールされているバージョン: (なし)
  候補:               8.0.29-0ubuntu0.20.04.3
  バージョンテーブル:
     8.0.29-0ubuntu0.20.04.3 500
        500 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages
        500 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu focal-security/main i386 Packages
     8.0.19-0ubuntu5 500
        500 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu focal/main i386 Packages
     5.7.38-1ubuntu18.04 500
        500 http://repo.mysql.com/apt/ubuntu bionic/mysql-5.7 amd64 Packages
$ sudo apt-get install mysql-client=5.7.38-1ubuntu18.04
```

mysql-apt-config_0.8.12-1_all.deb 以外では、MySQL8.0しか選べない

https://repo.mysql.com
【Angular】*ngForで最初、最後、奇数、偶数の要素判定

# はじめに
forループで最初と最後だけ要素判定して処理を変更したいとかよくありますよね。
私も実装している中で、どうやって実装しようとパッと思いつかない時があります。
今回はAngularの*ngForで最初、最後、奇数、偶数の判定をどうするか備忘録もかねてまとめました。
※*ngForを更に知りたい方は参考文献に公式ドキュメントを載せてますのでご確認下さい。

# バージョン
- Angular: 9.1.11
※バージョンの確認方法ですが`ng version`で確認できます。
> アプリケーションのAngularバージョンを確認するには、プロジェクトディレクトリ内で、
`ng version`コマンドを使用します。
> 
参考：[あなたのAngularバージョンを確認する](https://angular.jp/guide/updating#%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AEangular%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)

# 各判定方法
各判定方法で共通して使用するcompoent。
```tsx:judge.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-judge',
  templateUrl: './judge.component.html'
})
export class JudgeComponent {
  numberArray: number[] = [1, 2, 3, 4, 5];
  constructor() { }
}
```

## 最初
```html:judge.component.html
出力結果：
<div *ngFor="let element of numberArray; first as isFirst;">
  <p *ngIf="isFirst">{{ element }}</p>
</div>
<!-- 
  出力結果：
  1
-->
```

## 最後
```html:judge.component.html
出力結果：
<div *ngFor="let element of numberArray; last as isLast;">
  <p *ngIf="isLast">{{ element }}</p>
</div>
<!-- 
  出力結果：
  5
-->
```

## 奇数
```html:judge.component.html
出力結果：
<div *ngFor="let element of numberArray; even as isEven;">
  <p *ngIf="isEven">{{ element }}</p>
</div>
<!-- 
  出力結果：
  1
  3
  5
-->
```

## 偶数
```html:judge.component.html
出力結果：
<div *ngFor="let element of numberArray; odd as isOdd;">
  <p *ngIf="isOdd">{{ element }}</p>
</div>
<!-- 
  出力結果：
  2
  4
-->
```

# 注意点
*ngForでループする時、*ngForを記載している開始タグから終了タグまでがループされる。
下記は実際に出力されるHTMLです。
```html
<div *ngFor="let element of numberArray">
  <p>{{ element }}</p>
</div>

<!-- 実際に出力されるHTML -->
<!-- 
  出力結果：
  <div>
    <p>1</p>
  </div>

  <div>
    <p>2</p>
  </div>

  <div>
    <p>3</p>
  </div>

  <div>
    <p>4</p>
  </div>

  <div>
    <p>5</p>
  </div>
-->
```
MacのPowerPoint 図形をepsに変換する

# これは何か?

最近，TeXの文章を書いていて，図を eps で挿入する必要がありました． macOS Monterey 12.4 です．
特に，図の大きさより大きく出力されたり，縦横が回転して手間取ったので，ここに記述しておきます．

# 前提

TeX環境は，MacOSここを見ながら構築しました．VsCode で書いています．

https://qiita.com/rainbartown/items/d7718f12d71e688f3573

# 使うもの

- PowerPoint ... 図を描く道具
- LaTeX 環境（上記）
- ps2eps 上記でインストールされる，PostScriptを eps に変換するツール．

# 手順

1. PowerPoint で絵を描く
1. 印刷で，いくつか設定をして， PDF ボタンから， PostScript を選択
1. コマンドラインで， ps2eps を叩く
1. 出来上がった .eps ファイルを .tex 文書に挿入する

# 要点となること

## PowerPoint の印刷の設定
![powerpointsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51055/e7244c52-0db6-e211-64bc-0bd012819dc4.png)

1. 選択したスライドのみを印刷
1. 印刷の向きは「縦」とする
1. PDF から PostScript を選択

## ps2eps

PowerPoint から印刷されたデータは， pstest.ps とする

```shell
% which ps2eps
/Library/TeX/texbin/ps2eps
% ps2eps -B pstest.ps
% ls
pstest.ps    pstest.eps
```

オプションは， -B は BoundingBox を再計算するオプションで，これがないと，出力されたページサイズ（例えばA4)全体が .epsに含まれてしまう．

## ハマりそうなこと

PowerPoint にページ番号などが含まれていると，そこも含めて出力，BoudningBox 計算してしまうので，注意．

以上です！
【Qiita】Organizationがあっさり作られてしまった話と過去記事のリンクについて

# とうとう会社所属のアカウントになりました
ちょっとしたことで検索してみたり、時には投稿してみたりと私用で日頃よく使っていたQiita。
個人的にエンジニアの人には重宝するツールだと思ってるので「ぜひ会社でも」とつぶやいてたんですが、<B>とうとう会社のOrganization出来てしもた!!!
</B>

Organizationだとメンバーになってるユーザーの書いた記事がOrganization内に掲載されるので、社内向けでも活用できますよね。

# ところで、Organizationのメンバーとなる前のQiitaの記事ってどうなるの？
前に投稿してた記事が<b>（社内では）</b>それなりに好評だったらしく、それをOrganization内に表示してほしいらしい。

## Organizationのメンバーになった直後の状態
Qiita様のとても寛大な機能のおかげで、過去に投稿した記事はOrganizationに表示されない仕様でした。

# Organizationに載せたときはどうしたらいいの？
これは本当に簡単で、たったこれだけの手順となります。


### 1.過去記事を開く
![スクリーンショット 2022-07-21 18.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728559/26d70b38-c474-cf1c-bc44-93d1b3178913.png)


### 2.「編集」をクリック
※画像がでかいかもしれん
![スクリーンショット 2022-07-21 18.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728559/a1954045-d2e3-7c60-725b-5fdfe4789227.png)


### 3.「内容を確定」から「Organizationの紐付け」の選択
プルタブで選択ができるようになってるので、ここでOrganizationに紐付けるかどうかを選択できるようです。
![スクリーンショット 2022-07-21 18.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728559/d49f569a-c1ff-a4c3-d9c7-c9f23bd2d4e8.png)
本当にこれだけなので、他に説明しようがありません。

# こんなに簡単に連携を選べるなら楽しく投稿できるかもしれん
といっても業務として行ってるものではないので、今まで通り個人用のメモのようなポップな使い方をさせてもらいます。
isNaNはTRUEじゃないの？

## 今回記事を記述した背景
☆isNaNを書いてつまづいた人へ。
暇だったのである問題を解いていました。
問題の内容は
入力した引数が
＊数字だったら5枚する
＊数字ではなければ”ERROR”という文字を返す
という簡単な問題を作っていました。
## 記入したコード
```js
function num(input){
  if(isNaN(input)){
  	console.log(input * 5)
  }else{
  	console.log('error')
  }
}

num(3);
```
＊numの中身が数字だったら→numを5倍するなので、3を入れたら15になるかとおもいきや、、errorになってしもーた。
### isNaN(input)は、数字かどうか判断するものだと思っていました。。

## 原因

### isNaN() 関数の性格な意味は引数が NaN (非数) かどうかを判定します。
つまり、
非数NaNであればTrue
そうでなければFalse
## 修正
```js
function num(input){
  if(!isNaN(input)){
  	console.log(input * 5)
  }else{
  	console.log('error')
  }
}

num(3);
```
isNaNの前に否定を表す!を入れましたとさ！
皆様、私は色々と勘違いしておりました。ご指摘ありがとうございます。
Eclipse自動フォーマット

Javaの場合
・すべての行をフォーマット
・編集した行をフォーマット
![自動フォーマット.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097113/a405d6e2-356d-7419-6ddf-66395205c1dc.png)
Recoil で永続化したら事故りかけた

## Recoil 超便利！

Recoil は Meta 社が配布する React の State 管理ライブラリだ。

https://github.com/facebookexperimental/Recoil

React で State のバケツリレーにうんざりしていた私には便利すぎた。本日時点で、0.7.4 と experimental なライブラリであり、現在猛烈に開発が進んでいるが、とにかく便利だった。

```recoil-persist``` で永続化したらリロードしても使える。超便利！と、なんでもポンポン入れて開発していた。


## Recoil ちょっと怖い

便利便利〜！と使っていたが、永続化が永続すぎて（？）、ちょっと怖い。state がブラウザ閉じても残ってるって何？どこに保存されてるの？まぁブラウザやろうな…となって、初めて何やってるか調べた。

<b>localStorage</b> に保存されていた。<b>生</b>で…

```typescript
recoilPersist({
  key: 'recoil-persist',
  storage: sessionStorage,
})
```

こんな風にすれば、sessionStorage に保存できるが、そういうことじゃない。
生で入ってる。わぁ JSON 形式で分かりやす〜い。ちょっと書き換えてみよう。

## Recoil は用法と用量を守って

Recoil は永続化すると、その情報が localStorage/sessionStorage に生で保存されるので、見られては困るようなものは入れてはいけない。ログインしたユーザの情報（名前とか）は Recoil で永続化しておいたら便利そうな気がするけど、例えば、```isAdmin: true``` などというような権限系の情報が入っていて、それでアクセス制限してたとすると、それはご自由にお入りください、だ。

ツールを分からんまま使ってはいけない。とは言え、Recoil は超便利なので、Recoil で永続化して良いもの、ダメなものをきちんと分類して使いましょう。気づかずリリースしてたら大事故になってたかも。引き継ぐことを念頭に、README に注意喚起しておく。
データからCSVを作る

```
package design.controller;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class TestYou {

	/*CSV出力パス*/
	public static final String CSV_FILE_PATH = "C:\\csv\\";
	/*CSV出力パス*/
	public static final String CSV_FILE_NAME = "CSV_PRINT_TEST";
	/*CSVHeader*/
	public static final String CSV_FILE_HEADER = "ColumnA" + "," + "ColumnB";

	private void makeCsv() {
		File f = new File(CSV_FILE_PATH + CSV_FILE_NAME);
		try {
			FileOutputStream fos = new FileOutputStream(f);
			// BOMつきCSV文字化け防止
			fos.write(0xef);
			fos.write(0xbb);
			fos.write(0xbf);
			OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
			BufferedWriter bw = new BufferedWriter(osw);
			PrintWriter pw = new PrintWriter(bw);
			// CSVのヘッダ作成
			pw.println(CSV_FILE_HEADER);
			// CSVの内容作成
			pw.println("test1" + "," + "test2");
			pw.println("test3" + "," + "test4");

			bw.close();
		} catch (FileNotFoundException e) {
			System.out.println("File Not Found");
		} catch (IOException e) {
			System.out.println("IOException");
		}
	}

}

```
項目ずれ、共通css定義したスタイル Overwrite 

css 定義箇所（共通）：./common.css(6711,2) スタイル　👇
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654080/6fa8a118-35a5-6a8b-1535-e04c7dfd81a8.png)

.float-right {
    float: right !important;
}

共通css修正はできないので、個別画面で修正するようにします。

例：「値の削除」ボタンのclass ="btn btn-default float-right btn-1"の場合

各画面に以下のコードを追加して該当スタイルを取り外します。

$(".btn.btn-default.float-right.btn-1").attr("class", "btn btn-default btn-1");

修正後は以下の感じになります👇
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654080/dbb152f4-d7bc-7d6d-67b7-e019cd0e08d4.png)
PostgreSQLが壊れたのを直した際に得た知識をメモる

詰まったので得た知見だけまとめておく。

## dockerコンテナ内のpsql

Postgresqlサーバーが起動しているDockerコンテナがローカルで起動している。自分のローカルマシンのlocalhostの5432ポートはこのコンテナの5432ポートにポートフォワーディングされている。

このサーバーにpsqlコマンドで接続するには `psql -h 127.0.0.1 -p 5432 -U user_name -d database_name` というように、ローカルホストとポート番号5432を指定してやる必要があった。

これはpsqlコマンドは指定がないと自分のマシンのUNIXドメインソケットを使用して接続をしようとするから。多分。


## ローカルで`brew services start postgres`する


- `brew services postgres start`で起動する。
   - 内部的には多分`/opt/homebrew/opt/postgresql/bin/postgres -D /opt/homebrew/var/postgres`が走っている。(ps auxで確認した)
   - つまり、多分 postgresの[データベースファイル](https://www.postgresql.jp/document/13/html/storage-file-layout.html)は多分`/opt/homebrew/var/postgres`。
   - 多分ログは `/opt/homebrew/var/log/postgres.log`に吐かれている。
- ドメインソケットは 多分`/tmp/PGSQL.5432`と`/tmp/PGSQL.5432.lock`??
laravel テストアサーション 指定Eloquentモデルが削除論理されていることを確認する

# 概要

- laravelのテストのアサーションにて指定Eloquentモデルが論理削除されたことを確認するアサーションをまとめる。

# チェック方法

- `assertSoftDeleted`で確認する事ができる。
- 下記のように記載する。

    ```php
    $this->assertSoftDeleted(Eloquent);
    // もしくは
    $this->assertSoftDeleted(table: テーブル名, data: ['カラム名' => 値]);
    ```

- 公式ドキュメントの例を借りると下記の様になる。下記の場合処理に成功していればテストが通る。

    ```php
    use App\Models\User;

    $user = User::find(1);

    $user->delete();

    $this->assertSoftDeleted($user);
    ```

- 当該のアサーションの実装箇所を見たら下記のように記載されていた。

    ```intractsWithDatabase.php
    /**
     * Assert the given record has been "soft deleted".
     *
     * @param  \Illuminate\Database\Eloquent\Model|string  $table
     * @param  array  $data
     * @param  string|null  $connection
     * @param  string|null  $deletedAtColumn
     * @return $this
     */
    protected function assertSoftDeleted($table, array $data = [], $connection = null, $deletedAtColumn = 'deleted_at')
    {
        if ($this->isSoftDeletableModel($table)) {
            return $this->assertSoftDeleted(
                $table->getTable(),
                array_merge($data, [$table->getKeyName() => $table->getKey()]),
                $table->getConnectionName(),
                $table->getDeletedAtColumn()
            );
        }

        $this->assertThat(
            $this->getTable($table), new SoftDeletedInDatabase($this->getConnection($connection, $table), $data, $deletedAtColumn)
        );

        return $this;
    }
    ```

- そのためどうやら`assertDatabaseHas`と同じようにテーブル名とデータ名でレコードを特定しても論理削除チェックしてくれる。
- 例えば「usersテーブルのidが1のレコードが論理削除されているか」の確認は下記のように記載する。

    ```php
    $this->assertSoftDeleted(table: 'users', data: ['id' => 1]);
    ```



# 参考文献

- [https://readouble.com/laravel/8.x/ja/database-testing.html#assert-deleted](https://readouble.com/laravel/8.x/ja/database-testing.html#assert-deleted)
Rancher Desktop で Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?と言われる

## 現象

Rancher Desktopを起動済みで、`docker build`等をしようとすると、以下のように
Dockerデーモンが動いてないと言われる。

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

## 原因

Rancher Desktop起動時にAdministrative Access Required の
`Always run without administrative access`
を、`Always run administrative access`に空見してチェックボックスをチェック入れてしまっていた。
（withoutって入っとるやんけ〜〜〜）

![スクリーンショット 2022-07-21 18.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32691/0e239190-e743-c111-c942-8ac7771d801b.png)



## 解決策

Rancher Desktop起動時にAdministrative Access Required の
`Always run without administrative access`にチェックを入れない。

![スクリーンショット 2022-07-21 18.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32691/760480a6-ca68-30f8-f9b6-18efb0f64ac4.png)

`docker ps`とかしたらちゃんと動いた。よかった。
MVVM Architecture with Android

# 概要
アーキテクチャ：アプリーケーションやソフトウェア開発をする上での設計手法
意識することで開発者はある程度同じ構造で開発することができレビューも行うことができる

アーキテクチャが存在しないとどうなる？
ActivityやFragmentの処理が膨らみ可読性が低くなる
LifeCycleの破棄時などに処理が再実行されCPUやメモリへの負荷が大きくなる
→よってUIをモデルで操作して永続なデータとして保持することを推奨されている

MVVMは大規模なアプリのアーキテクチャに向いている


View → ViewModel → Model
の依存関係がある
※矢印の向きには意味があり向いていない方向の層のことを知らない
（VVMMモデルって覚えた方が楽そう...）

### メモ
よく見るMVVMのモデル図がGoogleのアーキテクチャのドキュメントから消えている気がするのですがComposeが主流になりつつある中でアーキテクチャも変化しているんですかね？
理解深まったら記事更新します、詳しい方教えてください


# View
### 担当

画面の表示や更新
- ViewModelのLiveDataをObserveしてUIを表示させる
 
ユーザーの入力処理の受付
- clickメソッドなどを受けViewModelのデータ処理メソッドを呼び出すなど

# ViewModel
### 担当
両者の間を仲介して互いの状態変更を通知、反映させる役割を担う
- Model層からView層にデータを受け渡す
- 受け渡しなので双方向矢印な気もするがView層がViewModel層を参照している

ViewModelからView層の操作をしてはいけない
- メモリリークやnullポインタの可能性が出る
- Repositoryとの結びつけのためのDIはHiltが推奨されている

UIの状態保持
- 双方向データバインディングする必要があるものは MutableLiveData
- 単方向でよいものは LiveData
- Viewのライフサイクルに依存しないため状態を存続できる


# Model
### 担当
データの管理や保存、外部との入出力などの内部的な処理を担う
- APIやデータベースへのアクセスを管理するクラス
- 処理をわかりやすくさせるdata class



# 追記
Android Study JamでCompose勉強中なのでCompose含めたアーキテクチャに対して理解が深まれば再度追記します

参照
https://developer.android.com/jetpack/guide?hl=ja
https://zenn.dev/dd_sho/articles/5f32ce2942cbd2
Ubuntu 22.04 + WSL2でGenie「systemd-sysusers.service loaded failed failed Create System Users」

# Ubuntu 22.04 + WSL2 + Windows11でGenieをインストール後、エラーが発生し起動しなかったのでメモ

まず、こちらのページを見ながら設定したところ「genie 起動 -> 成功」のところで、記載と異なるエラーが発生
https://hiro20180901.hatenablog.com/entry/2022/03/10/070000

## エラー内容
```
Starting genie:
Waiting for systemd....!!!!!!!(略)

Timed out waiting for systemd to enter running state.
This may indicate a systemd configuration error.
Attempting to continue.
Failed units will now be displayed (systemctl list-units --failed):
  UNIT                     LOAD   ACTIVE SUB    DESCRIPTION
● systemd-sysusers.service loaded failed failed Create System Users

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
1 loaded units listed.
```
問題となった部分：「systemd-sysusers.service loaded failed failed Create System Users」

## 対処方法
* こちらのファイルを開く
```
$ sudo vi /usr/lib/systemd/system/systemd-sysusers.service
```

* 末尾の3行をコメントアウトし、さらに1行追記
```
# LoadCredential=passwd.hashed-password.root
# LoadCredential=passwd.plaintext-password.root
# LoadCredential=passwd.shell.root
LoadCredential=
```

* その後、念のため、wslを再起動
```
> wsl.exe --shutdown
```

* Ubuntuを起動してGenieを実行したところ、無事動作
```
$ genie -s
Waiting for systemd....!
```
laravel テストアサーション テーブルのデータを確認する

# 概要

- laravelのテストコードのアサーションにて任意のデータを含むレコードがテーブルに存在するか確認するアサーションについてまとめる。

# チェック方法

- `assertDatabaseHas`を用いてチェックを行う。
- 例えば「usersテーブルにidカラムが1かつ、emailがtest@example.comのレコードが存在することの確認」をする場合下記のようになる。

    ```php
    $this->assertDatabaseHas(
        table: 'users',
        data: [
            'id' => 1,
            'email' => 'test@example.com',
        ]
    );
    ```

- レコードが存在していた場合、当該アサーションは合格となる。
- ちなみに`assertDatabaseMissing`を用いると指定したカラムの情報のレコードが存在しない場合アサーションは合格となる。

    ```php
    // usersテーブルにidカラムが1のレコードがなければアサーションは合格になる
    $this->assertDatabaseMissing(
        table: 'users',
        data: [
            'id' => 1,
        ]
    );
    ```

# 参考文献

https://readouble.com/laravel/8.x/ja/database-testing.html#assert-database-has

https://readouble.com/laravel/8.x/ja/database-testing.html#assert-database-missing
Google Cloud Professional Data Engineer を取得しました

# Google Cloud Professional Data Engineer を取得しました

2022/7 に Professional Data Engineer を受験し、合格しましたので、そのとき実施した学習方法をまとめます。

## 受験前の経験など

3月に Professional Cloud Architect を取得しており、Google Cloud の各サービスの概要は理解しています。

https://qiita.com/ysmmb12/items/5327480781f28416685f

Data Engineer の試験範囲の分野（データパイプライン、機械学習モデルなど）については未経験でした。

## 学習方法

### Coursera

https://www.coursera.org/professional-certificates/gcp-data-engineering-jp

試験範囲の基礎は Coursera で学習しました。
コース1-5は各コーステーマの学習、コース6は試験に向けて必要な観点を学習します。

### Google Cloud Skills Boost（旧 Qwicklabs）

https://www.cloudskillsboost.google/

ちょうどキャンペーンで一か月無料クレジットをもらったので、クエストを3つ行いました。

 - [Perform Foundational Data, ML, and AI Tasks in Google Cloud](https://www.cloudskillsboost.google/quests/117)
 - [Engineer Data in Google Cloud](https://www.cloudskillsboost.google/quests/132)
 - [BigQuery for Data Warehousing](https://www.cloudskillsboost.google/quests/68)

Coursera のコース内のラボと重複するものもありますが、手を動かしたい派におすすめです。
ちなみに、上2つは試験ガイドに載っているクエスト、3つ目はGCPUGのイベントきっかけで登録したクエストです。

### 公式模擬試験

試験概要ページから受験できる模擬試験を3回受験しました。
ちょうど試験内容の切り替えの時期だったのか、1回目と2回目以降で模擬試験の内容ががらっと変わりました。

1回目の受験ではクラウドエースさんの解説記事を参考にさせていただきました。

https://cloud-ace.jp/column/detail269/

2回目以降は公式の解説で見直しを行いましたが簡単な説明のみなので、参考として掲載されている公式ドキュメントの読み込みに時間をかけました。


### Udemy 模擬問題

https://www.udemy.com/course/google-cloud-professional-data-engineer-s/

3セットとも正答率が80%以上になるまで繰り返しました。
一部解説に不備がありますが、試験範囲がまんべんなく網羅されているので試験対策としてとても役にたちました。
本番の試験では、この模擬問題からまったく同じ問題や似た観点の問題がいくつか出題されたので、解説と公式ドキュメントを読み込み、問題で問われている内容をしっかり理解しておくことが重要だと思います。

## 受験

テストセンターで受験しました。
Professional Cloud Architect と同様、点数や正答率は非公開で、試験後のアンケートに回答したあとに「合格」と表示されました。
2日後に正式な合格通知が来ました。

## 受験した感想

模擬問題より一歩踏み込んだ問題が多かったように感じました。
模擬問題だと、「問題：Aという課題を解決するにはどうすればよいか？」→「答え：Bという機能を使う」だったのが、
受験時の内容は「問題：Aという課題を解決するためにはBをどう使うか？」という風に、模擬問題では答えになった内容が問題文の中に含まれていました。
わたしは「AといえばB！」と、キーワードで覚えてしまいがちなのと、
WHY の部分は理解するまで調べていましたが HOW に関しては答えとして重要でなければ目を通すだけだったので、
次回以降は HOW の部分もきちんと把握しようと思いました。

以上です。
どなたかの参考になれば幸いです。
laravel テストアサーション テーブルのレコード数を確認する

# 概要

- laravelのテストコードのアサーションにて特定のテーブルのレコード数を確認するアサーションをまとめる。

# チェック方法

- `assertDatabaseCount`アサーションを用いてチェックを行う。
- 「テストコードの処理の結果usersテーブルに1レコードが存在すること」を確認したい場合下記のように記載する。

    ```php
    $this->assertDatabaseCount(table: 'users', count: 1);
    ```

- 満たしていればテストが通る。

# 参考文献

- [https://readouble.com/laravel/8.x/ja/database-testing.html#assert-database-count](https://readouble.com/laravel/8.x/ja/database-testing.html#assert-database-count)
【Rails】Herokuにデプロイしたら検索機能(LIKE関数)が使えなかった【PostgreSQL】

# 環境
Ruby: 2.6.5
Ruby on Rails: 5.2.4.2
heroku: 7.60.2
PostgreSQL: 14.1

**開発環境**
Cloud9
SQLite3: 3.7.17

# 問題
Cloud9で開発後、herokuにデプロイし、ECサイトの商品検索機能を使ったところ、次の画面に遷移しました。
![スクリーンショット 2022-07-19 18.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/7aac804a-a2dd-1bcd-5077-cc586a1c5829.png)

```
We're sorry, but something went wrong.
If you are the application owner check the logs for more information.
```
開発環境では動いていたのに、、、


# 原因
`heroku logs -t`コマンドでログを見ると、以下のエラーとヒントが吐かれていました。


```
ERROR:  operator does not exist: bigint ~~ unknown
```
```
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
```

型のキャストをする必要があるようです。
調べてみると、PostgreSQL8.3から、自動キャストがなくなったということです。
参考:[PostgreSQL: Documentation](https://www.postgresql.org/docs/8.3/sql-expressions.html)

今回はLIKE関数を使っている部分にint型のカラムがあり、text型にキャストできなくてエラーになったようです。


# 解決
ドキュメントに書いてある通り、`CAST ( expression AS type )`という書き方をし、無事解決することができました。

```diff_ruby
- scope :search_carts_by_ids, -> (ids) { where("id LIKE ?", "%#{ids}%") }
+ scope :search_carts_by_ids, -> (ids) { where("cast(id as text) LIKE ?", "%#{ids}%") }
```
[C#]レジストリに登録する

レジストリの値を変える

    /// <summary>
    /// レジストリ登録
    /// </summary>
    public class SetRegistry
    {
        private static RegistryKey regKeySystemQR;

        public static void String(string sRegKey, string value)
        {
            regKeySystemQR = Registry.LocalMachine.OpenSubKey(%サブキー文字列%, RegistryKeyPermissionCheck.ReadWriteSubTree);
            regKeySystemQR.SetValue(sRegKey, value, RegistryValueKind.String);
            regKeySystemQR.Flush();
        }

        public static void DWord(string sRegKey, int value)
        {
            regKeySystemQR = Registry.LocalMachine.OpenSubKey(%サブキー文字列%, RegistryKeyPermissionCheck.ReadWriteSubTree);
            regKeySystemQR.SetValue(sRegKey, value, RegistryValueKind.DWord);
            regKeySystemQR.Flush();
        }
    }
機械語のアドレス指定方式

# オペランド部のメモリのアドレス
プログラムカウンタから参照して命令を取り出し命令レジスタに記憶させる。
命令の中身は命令部とオペランド部が存在する。
```何を（オペランド部)どうしろ(命令部）```という記述になっている。
しかしオペランド部には必ずしもメモリのアドレスが入っているわけではない。
例えば対象アドレスが入っているメモリアドレスが入っているメモリアドレスが書かれてあることもある。
このように何らかの計算によってアドレスを求める方式を```アドレス修飾（アドレス指定)```

## 気づき
命令のオペランド部には必ずメモリのアドレスが入っているわけではない。
それを求める計算方法がいくつかあるのか。
確かレジスタの種類で計算方法が違うものがあったような。

## 即値アドレス指定方式
オペランド部に、```対象となるデータそのもの```が入っている方式を```即値アドレス指定方式```という。
メモリへの参照は行われない。
### 気づき
どんな時に使われているのだろう?
メモリからCPUに行って作業すると思っていた。
この場合だとメモリを使わずに作業していることにならないのだろうか？
今後に注目。

## 直接アドレス
オペランド部に記載しているアドレスが、```そのまま実行アドレスとして使える```方式を直接アドレス指定方式という。

### 気づき
これは今までの命令レジスタがメモリから取ってくる。
今までの習ってきたことかな。
これは何となく馴染む。

## 関節アドレス指定方式
命令のオペランド部に```対象のデータが入っているメモリアドレス```をが記載されている。
それが実行アドレスになっている。

### 気づき
回りくどいな。
どうしてこういう2度手間をするのだろうか？
何らかの利用があると思う。これから期待だ。

## インデックス（指標）アドレス指定方式
オペランド部の値に、```インデックス（指標)レジスタの値を加算```することで実行アドレスを求める。
連続したアドレスを扱う時に用いるレジスタ。配列型のデータ処理などで使います。
インデックスレジスタ内のどの値を使用するかを示しています。
インデックス番号とオペランド部が記載されている。

### 気づき
これも期待だ。
とりあえず配列を扱うときはこの方式で実行アドレス（有効アドレス)を導き出すのか。

## ベースアドレス指定方式
オペランド部の値に、```ベースレジスタの値を加算```することで実行アドレスを求める。
ベースレジスタはプログラムがメモリ上にロードされた時の、先端アドレスを記憶しているレジスタ。
プログラム先頭アドレスからの差分をオペランド部にで指定する。

https://medium-company.com/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E6%8C%87%E5%AE%9A%E6%96%B9%E5%BC%8F/#i-7
これも見た。

### 気づき
説明でオペランド部に既に入っている値なんで５０なのか
プログラム先頭アドレスからの差分とは何なのか？
それがわからない。
しかしペースレジスタの値とオペランド部の値を足して実行アドレスを導き出すことはわかった。

## 相対アドレス指定方式
オペランド部の値に、```プログラムカウンタの値を加算```することで実行アドレスを求める。

### 気づき
これはペースアドレス指定方式と似ている。
プログラムカウンタとペースレジスタの違いだ。
あと足すという観点からインデックスアドレス指定方式にも似ていると思っている。

## 気づき
いろんなアドレス指定方式を勉強した。
理解できないものはたくさんあったけどこれから頑張ろうと思う。（これしか言えない）
完全に理解できるその時を願って

出典 キタミ式イラストIT塾 基本情報技術者 令和03年
"s3:DeleteObject*"をポリシーに組み込まない場合の挙動

## What's This

"s3:DeleteObject*"をポリシーに組み込まない場合、
S3バケットに同名のファイルをアップロードしたら、元のファイルが上書きされるか調査した時のメモです。

あくまでメモなので、参考にされる場合は、公式ドキュメント等の副読的な感じで読まれると幸いです。

## やってみた

```
# ロールに適用したポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject*",
                "s3:ListBucket",
                "s3:GetObject*"
            ],
            "Resource": [
                "arn:aws:s3:::`S3 Bucket`",
                "arn:aws:s3:::`S3 Bucket`/*"
            ]
        }
    ]
}
```

```
# S3バケットに、同名のファイルをアップロードした場合、元のファイルが上書きされるか確認
$ aws s3 ls s3://`S3 Bucket`
2022-xx-xx xx:xx:xx     xxxxxx test-image.png

# 適当に同じ名前のファイルを作成
$ touch test-image.png

# アップロードしたとき、上書きされるか
$ aws s3 cp ./test-image.png s3://`S3 Bucket`
upload: ./test-image.png to s3://`S3 Bucket`/test-image.png
```

日時から、上書きされていることを確認。

![スクリーンショット 2022-03-09 15.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/0443ecdb-76de-4157-aded-85e071b638ab.png)

![スクリーンショット 2022-03-09 15.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/eca92356-f5fa-38e8-f15f-a5791cb99b9f.png)

念の為、上書き前後で中身も変わっているか確認

```
$ date | tee date.txt
2022年 3月 9日 水曜日 17時00分10秒 JST

$ cat date.txt
2022年 3月 9日 水曜日 17時00分10秒 JST

$ aws s3 cp ./date.txt s3://`S3 Bucket`
upload: ./date.txt to s3://`S3 Bucket`/date.txt
```

S3 GUIでダウンロードして中身を確認。

![スクリーンショット 2022-03-09 17.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/2785685f-ef5e-5fd2-f790-b84627594361.png)


```
$ date | tee date.txt
2022年 3月 9日 水曜日 17時07分32秒 JST

$ aws s3 cp ./date.txt s3://`S3 Bucket`
upload: ./date.txt to s3://`S3 Bucket`/date.txt
```

S3 GUIでダウンロードして中身を確認。

![スクリーンショット 2022-03-09 17.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/975cc664-e281-783a-40d2-a0cdccae65fc.png)

中身も変わっていることを確認。
OpenSSL で cer 形式の証明書を pem 形式に変換する (Windows)

# LINE WORKS の SSO では pem 形式の証明書が必要です

LINE WORKS を SP とした SSO を設定する場合、pem 形式の証明書が必要となります。
しかし、Microsoft Azure AD では pem 形式の証明書を発行することができないようです。

Microsoft Azure AD で証明書 (未加工) をダウンロードしたのち OpenSSL で pem 形式の証明書に変換する方法を解説します。

# 事前準備

既に Open SSL を利用できる環境の方は不要です。
[cer 形式の証明書を pem 形式に変換する](https://qiita.com/ts-suzuki/items/dafe873e20b542a82ff8#cer-%E5%BD%A2%E5%BC%8F%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92-pem-%E5%BD%A2%E5%BC%8F%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B) の手順にお進みください。

## Visual C++ 再配布パッケージをダウンロード

OpenSSL を利用するには、先に「Visual C++ 2017再配布パッケージ」をインストールする必要があります。
インストールしておかないと、OpenSSL 実行時にエラーが発生します。
下記サイトからダウンロードできます。

https://docs.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170

ページ中央部の表から、32bit 版 Windows OS なら「X86」、64bit 版 Windows OS なら「X64」の Link をクリックしてダウンロードします。

## Visual C++ 再配布パッケージをインストール

インストーラを実行します。

![1658373217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/7819ddac-42dd-c064-896e-0155125e84cf.png)
![1658373239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/f19cbfb1-3092-aca2-add8-d80d2172e637.png)

## OpenSSL をダウンロード

下記サイトからダウンロードできます。

https://slproweb.com/products/Win32OpenSSL.html

今回の変換作業だけであれば Light で大丈夫です。
![1658372662.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/e7d5e664-de76-e79f-9dec-87228fdc8bfd.png)

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

インストーラを実行してインストールします。

![1658372887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/1d4e3d1e-7fce-5e61-3551-d55e3686b2b0.png)
![1658372911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/17a96002-8bd2-e1f3-9140-0b9ac7a6a532.png)
![1658372937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/85fbcce7-cd39-c514-a7e9-1dd621b697f3.png)
![1658372975.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/f85c19f7-492e-5f8c-776a-5cc22bcb4f7c.png)
![1658372995.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/0eca52e3-652f-cb4c-7d57-2648d0054844.png)
![1658373049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/d4ee90c2-913e-99f5-9b2d-8f23667f4144.png)

これで準備完了です。

# cer 形式の証明書を pem 形式に変換する

OpenSSL を実行するため、コマンドプロンプトを起動します。
![1658382395.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/e2028787-a467-4963-5416-df28ddcc137d.png)

コマンドプロンプトを起動すると、通常はログインユーザーのフォルダが指定されています。
![1658383228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/0bec0394-7510-49e3-9d3a-7f8a7b939cd8.png)

この状態から以下のコマンドを実行します。
`"../../Program Files\OpenSSL-Win64\bin\openssl.exe" x509 -inform der -in "Desktop\LINE WORKS.cer" -out "Desktop\LINE WORKS.pem"`
![1658383338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/221c923d-4140-7923-6c1c-163f44caa3f1.png)

pem 形式の証明書ファイルが作成されます。
![1658383483.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/af1caf27-60f6-2bf4-e051-9b3a642fe35e.png)

以上です。

# 最後に
以下のサイトの記事を参考にさせていただきました。感謝。

https://atmarkit.itmedia.co.jp/ait/articles/1601/29/news043.html

https://qiita.com/KIchiyanagi/items/2b1a99a5d7579417cc8e
パスワード無しでLinuxユーザー作成&ユーザー切り替えして詰んだ話


## 概要
①ユーザA作成
②su コマンドでユーザ切り替え
③元のユーザーに切り替えたりsudoコマンド等を使おうとする → パスワード求められるので無理
④③をできるようにユーザAを設定するにはルートユーザーになる必要がある → wheelグループでもないし、パスワードないので詰み
⑤shutdownしてec2-userで鍵で認証して入り直してパスワード設定して対処

詳細に入ろうと思ったのですが言いたいことは概要で終わってしましました。どんなエラーが発生したか書きますね

## 挑戦と失敗
### ユーザAからパスワードを設定しようとする
```
[user-a@ip-10-0-1-98 dir-b]$ passw d user-a
passwd: Only root can specify a user name.
```

### ec2ユーザに戻ろうとする（ sudoつかう

```
[user-a@ip-10-0-1-98 dir-b]$ sudo su- - ec2-user

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for user-a: 
#パスワード設定してないから無理。仮に設定してもwheelグループ入ってないから無理
```
### 別のユーザに切り替えようとする（ sudo使わない
```
[user-a@ip-10-0-1-98 dir-b]$ su - user-b
Password: 
※user-bのパスワードなくて詰み。user-bのパスワード使えば切り替えはできる
```
空間図形「京都工芸繊維大学２０２２年後期第４問」をsympy でやってみた。

オリジナル

https://mathmathmass.exblog.jp/32057357/

上と同じです。大学入試数学問題集成＞【4】

https://mathexamtest.web.fc2.com/2022/202210550/2022105500200mj.html#top-0204

# sympyで
z=0は、直角2等辺三角形にしました。任意xy座標でも(面積条件あり)できる?はずです。やろうともしませんでした。
varだとsimplifyが効かなかったので、symbol positive=True, real=Trueにしました。
面積は、z=0に投影して、Polygon.areaです。

```python
from sympy import *
a, h, t = symbols('a h t ', positive=True, real=True)
def myCrosstoP(P1,P2):
    return myMtoP(myPtoM(P1).cross(myPtoM(P2)))
def myPtoM(myPoint3D):
    return Matrix([myPoint3D.x,myPoint3D.y,myPoint3D.z])
def myMtoP(myMatrix):
    return Point3D(myMatrix[0],myMatrix[1],myMatrix[2])
def myP3DtoP2D(Pt3D):
    return Point(Pt3D.x,Pt3D.y)
P=Point(0,0,2*h)
R=Point(0,0,0)
S=Point(sqrt(2*a),0,0)
Q=Point(0,sqrt(2*a),0)
A=(R+S)/2
B=(S+Q)/2
C=(Q+R)/2
L=(P+Q)/2
M=(P+R)/2
N=(P+S)/2
UVW = Plane(Point3D(0, 0, t), Point(sqrt(2*a),0,t),Point(0,sqrt(2*a),t))
U=UVW.intersection(Line(P,Q))[0]
V=UVW.intersection(Line(P,R))[0]
W=UVW.intersection(Line(P,S))[0]
UVW_area=Rational(1,2)*sqrt(myCrosstoP(U-V,W-V).x**2+myCrosstoP(U-V,W-V).y**2+myCrosstoP(U-V,W-V).z**2).simplify()
print("#(1)",UVW_area)
Dz0=myP3DtoP2D(UVW.intersection(Line(M,A))[0])
Ez0=myP3DtoP2D(UVW.intersection(Line(N,A))[0])
Fz0=myP3DtoP2D(UVW.intersection(Line(N,B))[0])
Gz0=myP3DtoP2D(UVW.intersection(Line(L,B))[0])
Hz0=myP3DtoP2D(UVW.intersection(Line(L,C))[0])
Iz0=myP3DtoP2D(UVW.intersection(Line(M,C))[0])
DEFGHI_area=Polygon(Dz0,Ez0,Fz0,Gz0,Hz0,Iz0).area
print("#(2)",DEFGHI_area)
print("#(3)",integrate(t*DEFGHI_area,(t,0,h)))
#(1) a*(2*h - t)**2/(4*h**2)
#(2) a/4 + a*t/(2*h) - a*t**2/(2*h**2)
#(3) a*h**2/6
```

# 感想

空間図形が大の苦手？で，恥ずかしながら手が出せませんでした。
それで、ここは、T氏様の丸コピーです。
空間図形は、sympyとFreeCADの組み合わせがいいと思います。pythonでやらないと、無理な気がしました。
空間図形は、FreeCADがいいですよー。断面を切ってくれるから。
CADなので実数ですけど、sympyを組み合わせれば,ルートも使えますし。
誰かやってくれると助かります。
TargetGroupのUnHealthyHostCountを監視するメトリクス

TargetGroupのUnHealthyHostCountをCloudWatchアラームで監視する場合、AZの概念の含まれないメトリクスを選んだほうが良い

[リファレンス](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html)の以下部分の、

> UnHealthyHostCount
> 異常と見なされるターゲットの数。
> 
> レポート条件: ヘルスチェックが有効になっている場合にレポートされます
> 
> 統計値: 最も有用な統計値は Average、Minimum、および Maximum です。
> 
> [Dimensions] (ディメンション):
> 
> TargetGroup, LoadBalancer
> 
> TargetGroup, AvailabilityZone, LoadBalancer


ここ。

> TargetGroup, LoadBalancer
> 
> TargetGroup, AvailabilityZone, LoadBalancer

下の方のAZを含むメトリクスだと、メトリクスで指定していないAZでターゲットが起動したときに、データが取れなくなる。
上の方のメトリクスを使えば、AZは気にしなくなるので、ターゲットがどのAZで起動していようと、データが取れなくなることはない。

CloudWatchアラームで、複合アラームを使わない場合、メトリクスとして指定できるのは1つなので、AZが含まれるメトリクスを指定してしまうと、対象でないAZでターゲットが起動したときにデータが取れない。

ECSでタスク1だと、タスクが起動するたびにAZが変わるので、タスク再起動時にデータが取れない状態になりうる。

CloudWatchで上記の下の方、AZを含まないメトリクスを指定する場合は以下をたどる

```
AWS名前空間
AWS/ApplicationELB
↓
メトリクス
AppELB 別、TG 別メトリクス
※ここでAZと表記があるものを避ける
↓
AppELB 別、TG 別メトリクス
↓
対象のALB/TargetGropの、UnHealthyHostCountを選択
```

そもそもECSの監視手法としてTargetGroupのUnHealthyHostCountを利用するのが適切か、検証が必要そう
同様に、起動中のタスク数、のチェックも有効なのかどうか。
Route53ヘルスチェックとかCloudWatch Synthetics使えばいいんだけどNW要件とかシステム的に無理とかだと工夫が必要
【クエリビルダ：拡張表現】クエリ結果の前の行の列を参照する

【**クエリ結果の現在の行の列を参照する**】では、**現在の行**の出力列を参照する方法をご紹介しました。
今回は、**前の行**の列を参照する構文を用いて、累積値を表示してみます。

[Sharperlight](https://sharperlight.jp/)アプリケーションメニューからクエリビルダを起動します。
モードには`詳細レポート`、製品は`SAP Business One`、Companyには`OEC Computers`、そしてテーブルには`Outgoing Payments`を選択します。

必須フィルターであるDocument Numberには`<ALL>`、Costomer/Vendor Codeには`V10000`を選択します。
次に、選択領域から**Canceled**フィールドをフィルター領域にドラッグ＆ドロップで設定します。そしてフィルター値には`N`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bf24a426-797a-7123-4c85-9bfa92a5b2ba.png)
これで、取引先コードV10000のキャンセルされていない伝票レコードが抽出できると思います。

出力するフィールドは以下のものを選択します。
- Customer/Vendor Name
- Posting Date
- Document Total

全てドラッグ＆ドロップもしくはダブルクリックで選択領域から選択できます。
出力領域のアイテムの**説明**を日本語化してみましょう。
出力領域の`Customer/Vendor Name`を選択し、右クリックメニューから**説明の変更**を選びます。エディタが表示されるので、**取引先**と記入し保存します。同じように`Posting Date`と`Document Total`も日本語化してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/37fe821a-d288-a02c-f12f-766c76f7ecaf.png)
では、本題に移ります。
出力領域で右クリックメニューから**拡張表現を追加**を選びます。
伝票額の累積列を作成するので、最初の行の伝票額はそのまま累積額として表示。2行目では1行目の累積額＋2行目の伝票額、3行目では2行目の累積額＋3行目の伝票額といったルールを作成します。
では、最初の行かどうかを返す関数を一覧から探します。検索テキストボックスに`Start`とタイプしましょう。条件付きフォルダの下に**Boolean flag to identify the Start of the Report / StartOfReport**が見つかると思います。それをダブルクリックで選択し、構文エディタに転送します。この関数StartOfReport関数は、クエリ結果の最初の行では真を返し、その他の行では偽を返します。
IIF構文を使用して以下のように記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c36773f4-29a0-f96c-4251-8559d5361651.png)
ここで一度OKボタンで保存を行います。
追加された拡張表現列の**説明**を`累積額`、**名前**を`Ruiseki`と変更しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/953bc160-f157-f862-003b-c5bb2a70c0f7.png)
ダブルクリックで再度拡張表現の編集ダイアログを開き、IIF文を完成させます。
真の時、つまり最初の行では、伝票額をそのまま使用したいので、関数一覧から**現在の行**フォルダの`伝票額{%DocTot}`を選択します。
偽の場合、つまり2行目以降は、前の行の累積額＋現在の行の伝票額なので、関数一覧から**前の行**フォルダの`累積額{%Previous:Ruiseki}`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/27f0cc1b-bd95-a58e-02b0-59f51bd574c5.png)
構文エディタに転送された`{%Previous:Ruiseki}`の後ろに`+`プラス記号を付与します。
その後ろには、現在の行の`伝票額{%DocTot}`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9372b6f6-876a-6adc-9830-d7744b9f642a.png)
これで完成です。OKボタンで保存し、プレビューボタンで結果を確認してみましょう。
累積額の計算が上手く行われていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/efa0f5c4-9c68-0c44-2c99-7d139c547313.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/214a1dea-2a8e-2a0f-2312-4e7a5c70103f.png)
いかがでしたか、これは一例なので目的に合わせて使用してみてください。
液晶テレビをRaspberry Pi4のモニタとして使う

## ラズパイのディスプレイ解像度を設定する

### 仕様・環境
+ 液晶テレビは、モニターとチューナー部が分かれていてユーティリティ性の高い Panasonicの19型テレビ**UN-19FB10D**
+ HDMI接続で外部ディスプレイとしても使える
+ 解像度が横1366×縦768、スペクト比は16：9
+ **Raspberry Pi4(8G)** モデル

*****

### 設定変更
+ 前提として、ラズパイをLinuxサーバーとして動かすので、シェルの操作ができれば十分 (基本的にリモートからSSHで作業）
+ そのまま接続すると上記の 1366 x 768 が認識されず、画面の端が切れてしまう

*****

### 設定
```diff_conf
$ sudo vi /boot/config.txt

 ... 省略

# uncomment to force a specific HDMI mode (this will force VGA)
- #hdmi_group=1
+ #hdmi_group=2

- #hdmi_mode=1
+ #hdmi_mode=39
```
+ hdmi_group=1 => 2 に変更
+ hdmi_mode=1 => 39 に変更

*****

### 変更ポイント

#### hdmi_group : 
この設定を変更することで、HDMIのアウトプットのグループを変更することができる。


| hdmi_group | result |
|:-:|:-:|
| 0 | Auto-detect from EDID |
| 1 |  CEA |
| 2 |  DMT |

+ **CEA** (Consumer Electronics Association) : テレビで一般的に使用されている規格
+ **DMT** (Display Monitor Timings) : モニターで一般的に使用されている規格

:::note warn
ポイント
**UN-19FB10D**の対応解像度（1366x768）はCEAのリストに含まれていませんでした。DMTの規格で作られている？のかもしれません。
詳しくはこちら → [ラズパイ公式ページ](https://www.raspberrypi.com/documentation/computers/config_txt.html#hdmi_group)
:::

#### hdmi_mode :
HDMIの出力フォーマット。フォーマットモード番号はCTAの仕様に基づく

These values are valid if **hdmi_group=2** (DMT):
|HDMI mode| Resolution | Frequency | Screen Aspect | Notes |
|:-:|:-:|:-:|:-:|:-:|
| 39 | 1360x768 | 60Hz | 16:9 |   |

*****

### グラフィカル環境で使う場合
+ GUI環境の場合は、上記に加えて以下の設定が必要
※上記を設定が完了していると 1360x768 を選択出来るようになっている。
![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699739/a1d77134-bb0a-81e4-cbfe-9669236e3da2.png)

*****

### まとめ

液晶テレビをモニターとして使えるようになると色々便利ですねー。仕事に飽きたら NetFlix / YouTubeも見れちゃいますし。😉
fatal: not a git repository (or any of the parent directories): .git ( git 管理下のディレクトでコマンド実行してる？ )

# 問題

以下のようなエラーが起きる場合

```
$ git remote add origin https://github.com/user/repository
fatal: not a git repository (or any of the parent directories): .git
```


```
$ git status
fatal: not a git repository (or any of the parent directories): .git
```

```
$ git branch
fatal: not a git repository (or any of the parent directories): .git
```


# 原因

そもそもコマンド実行しているのが git 管理下のディレクトリではないのでは？

# 対策

- `git init` するなどしてディレクトリのgit管理を始める
- もしくはgit管理下のディレクトリに移動してからコマンド実行する


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->