OmniAICreator/Qiita-1.07M huggingface dataset:
【Angular】*ngForで簡単にループする配列を変更する方法

# はじめに
HTMLは同じでも処理によってループさせる配列を変更したいことがあり、悩んだ末にこの方法にたどり着きました。
同じように悩む方の参考になればと思います。
※前提としてcomponentでどうしても配列を同じにすることができなかった場合を想定しています。

# バージョン
・Angular: 9.1.11
バージョンの確認方法については過去記事に記載しております。

https://qiita.com/Shogongon/items/81c8a26028c82892a5c4#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3

# 結論
*ngForの中で三項演算子を使用して配列を変更させています。
```tsx:judge.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-judge',
  templateUrl: './judge.component.html'
})
export class JudgeComponent {
  isNumber: boolean = true;
  numberArray: number[] = [1, 2, 3, 4, 5];
  stringArray: string[] = ["イチロウ","ジロウ","サブロウ","シロウ","ゴロウ"];

  constructor() { }
}
```
```html:judge.component.html
出力結果：
<div *ngFor="let element of (changeFlag? numberArray : stringArray);">
  {{ element }}
</div>

<!-- changeFlagがtrueの場合 -->
<!-- 
  出力結果：
  1
  2
  3
  4
  5
-->

<!-- changeFlagがfalseの場合 -->
<!-- 
  出力結果：
  イチロウ
  ジロウ
  サブロウ
  シロウ
  ゴロウ
-->
```

# *ngIfで書いた場合
この場合だと同じHTMLを二つ書かなければならない。
```html:judge.component.html
<div *ngIf="changeFlag; then thenBlock else elseBlock">出力結果：</div>
<ng-template #thenBlock>
  <div *ngFor="let element of numberArray;">
    {{ element }}
  </div>
</ng-template>
<ng-template #elseBlock>
  <div *ngFor="let element of stringArray;">
    {{ element }}
  </div>
</ng-template>
```

# おまけ
for...ofでも同じことができます。
```tsx:judge.component.ts
const changeFlag: boolean = true;
const numberArray: number[] = [1, 2, 3, 4, 5];
const stringArray: string[] = ["イチロウ","ジロウ","サブロウ","シロウ","ゴロウ"];

for(let element of (changeFlag? numberArray : stringArray)) {
  console.log(element);
}
// 1
// 2
// 3
// 4
// 5
```

# 参考文献
[Angular:NgForOf](https://angular.jp/api/common/NgForOf)
[Angular:NgIf](https://angular.jp/api/common/NgIf)
[mdn_web_docs:条件 (三項) 演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)
[TypeScript Deep Dive 日本語版:for...of](https://typescript-jp.gitbook.io/deep-dive/future-javascript/for...of)
DJI Mavic 2 Pro を自作Androidアプリで自動操縦させる(1)~Android Studioの環境構築~

# はじめに
ドローンをAndroidアプリを使って制御する機会があり、アウトプットの目的も含めて投稿させていただきます。
大学の研究室にあるDJIのMavic 2 Proが使えたので、このドローンを自由自在にアプリ上で操作できるようにすることが目的です。
まだまだ勉強中なので、これを通じていろいろなことを身につけていきたいです。

どなたかのお役に立てば幸いです。

# ドローン
使用するドローンはMavic 2 Proです。
[DJI Mavic 2のサイト](https://www.dji.com/jp/mavic-2)

# 環境
- Android Studio Chipmunk | 2021.2.1 Patch 1
- macOS 12.1

※作成したアプリはAndroidのGoogle Pixel 5にインストールし、ドローンのコントローラとして使用します。

# 環境構築
### AndroidStudioのインストール
ここからインストールしました。
<http://developer.android.com/sdk/index.html>

インストールの際には[このサイト](https://akira-watson.com/android/adt-mac.html)を参考にさせていただきました。

### DJI SDKのダウンロード
##### そもそもSDKとは
ソフトウェア開発キットの略
メーカーによって提供されるツール一式のこと

DJI SDKは、DJIのフライトコントローラを用いた開発をするために提供されているものです。
その中でも今回は、Mobile SDKを使用します。

Mobile SDKにはAndroid版とiOS版があります。
今回はAndroidでのアプリ開発を行うため、Android版を使用します。

##### ダウンロード
さっそくMobile SDK(Android版)をダウンロードしていきます。

1. [ここ](https://github.com/dji-sdk/Mobile-SDK-Android-V5)からDJIのMobile SDKをダウンロード
1. ダウンロードしたzipファイルを開く
1. 解凍したファイル（ファイル名：Mobile-SDK-Android-V5-dev-sdk-main）を ~/Library/Android/sdk に移動
1. AndroidStudioを開く
1. Tools/SDK Managerを選択
1. Android SDK Location(写真の赤枠)が ~/Library/Android/sdk であることを確認
1. Edit(赤枠の右)を選択し、FinishになるまでNextを選択
![スクリーンショット 2022-07-27 20.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/9e90009a-4a0e-81f0-004f-22078be6389f.png)

これでDJI Mobile SDKをAndroidStudioで使えるようになりました。

AndroidStudioの環境構築は以上です。
[次回](https://qiita.com/shiiiinnooooo/items/32f59f62fdc3ec3f98c0)からは、サンプルプログラムを動かしていきたいと思います。
cosθ の 計算方法(Python)


今回は[hmath](https://caleb7023.hmath.pro/)で使用されているcosθの計算方法をご紹介します。
## 計算式
[hmath](https://caleb7023.hmath.pro/)は次の数式でcosθを定義しています。
```math
\cos θ = {\frac{e^{θi}+e^{-θi}}{2}}
```
## プログラム
[hmath](https://caleb7023.hmath.pro/)内では次のプログラムで計算しています。
```ruby:cos.py
import hmath
def cos(θ):
    return (hmath.exp(θ * 1j) + hmath.exp(θ * -1j)) / 2
```
### 別の計算方法
[hmath](https://caleb7023.hmath.pro/)内では利用していませんが次の式でcosθを計算することもできます。
```math
\cos θ=\sum_{n=0}^{∞}{\frac{(-1)^n}{(2n)!}}θ^{2n}
```
上の式をコードにすると次のようになります。
```ruby:cos.py
import hmath
roop_time = 200 #これを大きくすると精度が上がるがオーバーフローに注意。
def cos(θ):
    ans = 0
    for n in range(roop_time):
        ans += (-1) ** n / hmath.factorial(2 * n) * θ ** (2 * n)
    return ans
```
最後まで見ていだきありがとうございました。
ぜひ活用してみてください。
TEXのためのgnuplot超基本(2分で読めます)

# はじめに
卒論に使う際のTEXの超基本を2分で読めるくらい短くさっと押さえておこう。


TEXで一番しんどいのは導入だが、以下の記事を使えば１分ほどで導入できる。

https://qiita.com/geek_shanshan/items/d2b6218bbd66e3f62497

# １変数関数をグラフに表す
コマンドプロンプトで

```
$ gnuplot
```

とすれば、gnuplotを開くことができる。
例えば、sin(x)を書いてみようか。

```

gnuplot> plot sin(x)

```

これだけで次のように書ける。
![スクリーンショット 2022-07-27 19.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481370/9198c59b-3961-2314-2fe3-64c3d658d4a6.png)


## TEXで使うために...
さて、TEXで画像を貼り付ける際はepsファイルにする必要があるので、そこも含めて見ていこう。

次のコードでファイル作成＋軸ラベルの名付け＋グラフ記述までできる。難しくないので一行一行実行してみてほしい。
途中でている数式は次のような複雑な関数を得るためのコードである。(sin(x)の例だけしかみてないと応用できないため。)
![スクリーンショット 2022-07-27 20.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481370/0044a67d-1e02-74f6-749e-1fae9fac4823.png)



```

gnuplot> set terminal postscript eps enhanced color
gnuplot> set output 'mx.eps'
gnuplot> set xlabel 't'
gnuplot> set ylabel 'my'
gnuplot> plot cos(x)/(sqrt(2)*cosh(0.1*x)+sinh(0.1*x)) with line

```

1行目：eps形式で出力するよ宣言。enhanced colorといれると紫色の線で出力される。コピペでおk
2行目： "set output 'ファイル名.eps' " でファイルが生成される。
3行目：横軸のラベルをどうするか。
4行目：縦軸のラベルをどうするか
5行目：複雑な関数でも地道に打ち込むべし。（物理学やるなら無次元化をお忘れなく）

# パラメータ表示をする(3次元)
次のように3次元の関数を書きたければ次のようにする。
plotするのは関数のみならず、datファイルでも良い！気にしなくて良いんだ！
以下では事前に作成してあったdatファイル(5000行、3列の数値データ)を使った。

```

gnuplot> set parametric
gnuplot> set output 'mxmymz.eps'
gnuplot> set xlabel "mx"
gnuplot> set ylabel "my"
gnuplot> set zlabel "mz"
gnuplot> set terminal postscript eps enhanced color
gnuplot> splot "mxmymz.dat" with line

```

1行目：パラメータ表示の時はコレを使う
7行目： ３次元の描写をしたければ **splot** を使う。
![スクリーンショット 2022-07-27 20.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481370/4bf5ca1e-7efa-60ca-9fd0-3cc3ab2f215c.png)

## 関数の時のパラメータ表示
上記ではdatファイルを使ったが、心配症の人のためにdatファイルではなく関数での書き方も一応みておこうか

（物理が気になる人。以下はLLG方程式の解析解のパラメータ表示である。）

```

gnuplot> set parametric
gnuplot> set output 'mxmymz.eps'
gnuplot> set xlabel "mx"
gnuplot> set ylabel "my"
gnuplot> set zlabel "mz"
gnuplot> set terminal postscript eps enhanced color
gnuplot> splot cos(u)/(sqrt(2)*cosh(0.1*u)+sinh(0.1*u)), sin(u)/(sqrt(2)*cosh(0.1*u)+sinh(0.1*u)), (1+sqrt(2)*tanh(0.1*u))/(sqrt(2)+tanh(0.1*u)) with line
```

datのやり方との違いは一番下の行だけである。
** splot 関数, 関数, 関数 with line ** でOK！

表示結果は...

![スクリーンショット 2022-07-28 16.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481370/516aca69-9635-9997-3f92-53f51f5e4ef6.png)

あれ。なにか短くない？
伸ばしてみようか。

実は、gnuplotは各点と点の間の線は自動で計算してくれているのだが、点が少なすぎるとこんな風にちゃんとしたデータが生じなくなってしまう。
次のようにしよう

```

gnuplot> set samples 5000
gnuplot> splot [0:1000] cos(u)/(sqrt(2)*cosh(0.1*u)+sinh(0.1*u)), sin(u)/(sqrt(2)*cosh(0.1*u)+sinh(0.1*u)), (1+sqrt(2)*tanh(0.1*u))/(sqrt(2)+tanh(0.1*u)) with line

```
lxdコンテナにデバイスを追加する

# シリアルデバイス

lxdシステムコンテナ内で**ft232h**というシリアルデバイスを使えるようにしていきます。

https://learn.adafruit.com/adafruit-ft232h-breakout/overview

**ubuntu2204-container-00**という名前のコンテナがあるとします。

```bash
$ lxc list
+--------------------------+---------+---------------------+-----------------------------------------------+-----------------+-----------+
|           NAME           |  STATE  |        IPV4         |                     IPV6                      |      TYPE       | SNAPSHOTS |
+--------------------------+---------+---------------------+-----------------------------------------------+-----------------+-----------+
| ubuntu2204-container-00  | RUNNING | 10.86.163.56 (eth0) | fd42:f181:9c81:dde3:216:3eff:fe02:c29a (eth0) | CONTAINER       | 0         |
+--------------------------+---------+---------------------+-----------------------------------------------+-----------------+-----------+
```

**lxc config device add \<instance\> \<name\> \<type\> [key=value]...** の形式で指定します。

```bash
$ lxc config device add ubuntu2204-container-00 ftdi unix-char source=/dev/ttyUSB0 path=/dev/ttyUSB0 gid=20
```

 **\<instance\>** にはデバイスを追加したいコンテナ名を指定します。 **\<name\>** にはわかりやすい任意の名前を付けます。 **\<type\>** には追加したいデバイスのデバイスタイプを指定します。ここではキャラクターデバイスを追加したいので**unix-char**を指定します。デバイスタイプは下記リンクを参考にしてください。

https://lxd-ja.readthedocs.io/ja/latest/instances/#devices

**source**には追加したいデバイスのホスト上のパスを指定します。**path**にはコンテナ内のパスを指定します。 **gid**デバイスの所有者のgidを指定します。ここではdialoutにしたいので20を指定します。そのたのオプションについては下記リンクを参考にしてください。

https://lxd-ja.readthedocs.io/ja/latest/instances/#type-unix-char


# USBデバイス

```bash
lxc config device add ubuntu2204-container-00 wio usb vendorid=2886 productid=002d mode=0666
```
Google Spread Sheetで管理するLINE BOTの作り方【その３】

# 概要

以前書いた記事の詳細解説版、その③です。なぜその①②を先に書いていないかには触れないでいただけると助かります。

https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca

# 今回やったこと

「スプレッドシート」のシート「debug」に、書き込む関数をつくります。

※下の画像みたいに書き込みをしてくれる関数です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/4696bf2b-217d-3d4f-cd47-65f8ba87181d.png)

# ソースコード内容

```
/**
 * 引数で与えた内容から、SpreadSheetに記載する関数
 * ※あとから引数を増やして、書き込む内容を動的に変えられるようにする
 */
function debug()
{
  // 書き込むシート「debug」を取得
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug');
  // 日付Classをセット
  const date = new Date();

  // ユーザー名
  const userName = '（ユーザー名をあとから取得できるようにするよ）';
  // 書き込むテキスト
  const text = '（書き込むテキストをあとから取得できるようにするよ）';

  // シートに書き込む
  sheet.appendRow(
    [
      userName,
      text,
      Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')
    ]
  );

}
```

# ソースコードの全体像（前回のとの合体版）

```
/**
 * シートのID
 */
const SHEET_ID = '（スプレッドシートのURLから取得するID）';

/**
 * シート名
 */
const SHEET_NAME = 'faq';

/**
 * SpreadSheetからデータを取得する関数
 */
function getData ()
{
  // データを取得するシートをIDとシート名から取得
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
  // シートに記載したデータを取得
  const data = sheet.getDataRange().getValues();

  // 取得したデータをマッピング
  const dataMapping = data.map(function(row){
    return {
      key: row[0],
      value: row[1]
    }
  });

  // マッピングしたデータをログ表示
  Logger.log(dataMapping);
}

/**
 * 引数で与えた内容から、SpreadSheetに記載する関数
 */
function debug()
{
  // 書き込むシート「debug」を取得
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug');
  // 日付Classをセット
  const date = new Date();

  // ユーザー名
  const userName = '（ユーザー名をあとから取得できるようにするよ）';
  // 書き込むテキスト
  const text = '（書き込むテキストをあとから取得できるようにするよ）';

  // シートに書き込む
  sheet.appendRow(
    [
      userName,
      text,
      Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')
    ]
  );

}
```

# 終わり

是非写経だと思って動かしてみてほしいです！
Azure,M365 それぞれの問い合わせ窓口 と 問い合わせに必要な権限 について

# はじめに
Azure,M365に関してサポートリクエストを発行する際に少しハマったのでメモとして残しておきます。
Azure,M365それぞれ問い合わせ窓口と問い合わせに必要な権限が違いますので、それをまとめています。
(サポート リクエスト共同作成者 と サービス サポート管理者 の違いについての記事でもあります。)
なお、記事は2022/8月時点の情報になります。

# サポート窓口について
Azure(特にAzureADではないIaaS,PaaS)部分とM365はサポート窓口が分かれてまして
Azureに関する問い合わせは ヘルプとサポート or Azure ADの新しいサポートリクエスト から、
M365に関する問い合わせは Microsoft 365 管理センター - サポートの新規お問い合わせ より
問い合わせする形になります。

## Azureに関するサポート
こちらは基本有償となり契約が必要です。

　サポート プランの比較
　https://azure.microsoft.com/ja-jp/support/plans/

## M365に関するサポート
こちらは無償でも可能です。
Teamsとかの質問はここから投げれます。
(とはいえ、まったくライセンスを持っていない状況で問い合わせできるかは定かではありません。)

なお、AzureADに関しては上記二ついずれの窓口でも問い合わせでき、内容によっては、
ヘルプとサポート or Azure ADの新しいサポートリクエストから投げますと
上記の比較表に沿って、応答時間が設定されたり、高度なサポートを受けられます。

## 補足 オンプレミスサーバー
オンプレミスサーバーはまた問い合わせ窓口が違うので上記いずれに投げてもきっと断られます。
プロフェッショナル サポート や ユニファイドサポート がきっと必要になります。
ですので、AADCに関する質問は注意が必要です。
(なおオンプレミスサポートは本記事の範疇外)

# 問い合わせ権限について
Azureに関する問い合わせ と M365に関する問い合わせ では
問い合わせ窓口が異なるのと同様に、必要な権限も異なります。
(ここでハマって問い合わせするのに苦労しました・・・)

## Azureに関するサポート
ロールとしてサブスクリプション レベルで所有者、共同作成者、サポート リクエスト共同作成者が必要です。
上述した通り、技術的な質問にはサポート契約も必要になります。
クォータ制限に関する質問なら Basicサポート の範疇ですので無償で可能です。

#参考情報
https://docs.microsoft.com/ja-jp/azure/azure-portal/supportability/how-to-create-azure-support-request
Azure ロールベースのアクセス制御

## M365に関するサポート
ロールとしてRBACから サービス サポート管理者 が必要です。


#参考情報
https://docs.microsoft.com/ja-jp/microsoft-365/admin/add-users/about-admin-roles?view=o365-worldwide
よく使用される Microsoft 365 管理センターの役割

# ハマったポイント
最初、サービス サポート管理者の権限をPIMから取得して、
M365に関する質問を AzureADの 新しいサポート リクエストから投げようとしましたが、
Teams等M365製品のカテゴリがなく、そこはいったん無理やりカテゴリ設定し、
問い合わせを投げられるかチェックしてみようとしたところ、そもそも役割不足でできないことが判明しました。
Teams等M365製品のカテゴリがないのは窓口が違うからで、
役割不足なのは　サポート リクエスト共同作成者都下のロール がないから、というのが後でわかりました。
ということでその後、Microsoft 365 管理センター から無事問い合わせできました。

この経験から、本記事を記載しました。皆さんのお役に立てば幸いです。
(今回記載したような情報、日本語での google検索 では詳細情報を見つけられませんでした。)

なお、英語なら本情報に近しいものがredditに投稿されていたので共有しておきます。
https://www.reddit.com/r/Office365/comments/ro0xlz/pim_assignable_azuread_role_to_support_o365/
EventBridge とは

## 勉強前イメージ

cron的なもの？

## 調査

### EventBridge とは

イベントを通じてAWSのサービス、また独自で作成したアプリケーションなどを、他のAWSのサービスなどと接続します。
イベント駆動型のアプリケーションを簡単に構築することができます。
イベントというのは環境の変化のことで
例えばあるEC2が起動したとすると同時に他のアプリケーションを稼働させる必要があるアプリケーションがあったとすると
EC2の起動というイベントを通じて他のアプリケーションと接続させます。

### イベント駆動型アーキテクチャの方式

以下2つ方式があります。

- Pub/Sub型

Publish/Subscribe の略で、発生したイベントをメッセージで伝える仕組みになります。
`Publisher` : メッセージの送信元
`Subscriber` : メッセージの受信先

- イベントストリーミング型

イベントをログに書き込んで、そのログを検知して他のシステムと連携する方式です。

### EventBridgeのメリット

- アプリケーション同士の接続が容易

カスタムコードを記述せずともイベントの取り込みやフィルタリングが行なえます。

- SaaSのアプリケーションからデータを取り込むことができる

SaaSのアプリケーションからデータの取り込みが可能で
データをAWSに取り込んで、そのデータを使用してカスタマーサポートなどのワークフローを作ることもできます。

### EventBridgeのユースケース

- カスタマーサポート

カスタマーサポートのstatus変更をEventBridgeを通じて自動化して
ワークフローをトリガーにすることができます。

- ビジネス分析

データベースのアクセスや処理など見ることができるため、分析に役立ちます。

- モニタリング

アプリケーションのメトリクスをリアルタイムで取得することで
アプリケーションの変化に対応できます。

## 勉強後イメージ

確かにイベント駆動って感じの内容・・・
いろんなイベントを登録して連携できるのね。

## 参考

- [Amazon EventBridgeとは？](https://www.acrovision.jp/service/aws/?p=1543)
- [【徹底解説】Amazon EventBridgeとは？](https://www.sunnycloud.jp/column/20210802-01-2/)
HTML関連にはまった新卒1年目のお話

## ＊はじめに
みなさん、はじめまして！
<font color="DarkOrange">新卒一年目</font>の初投稿です:tulip:
簡単に自己紹介します。
- 学生時代は文系
- ゼミでは映像制作をしていた
- 学部が経営情報学部だったためプログラミング入門があった
- 授業はすごく簡単でintやStringの話などだった

こんな感じでほぼプログラミングに触ったことがない初心者です。
Qiitaに何か書きたいけど、技術的なことはまだまだ提供できるものではないなと思い何を書こうと悩んだところ、今回は新卒1年目・プログラミング初心者がOJT期間中にHTMLにはまった・楽しいなと感じた話についてみなさんにお伝えできればと思います。

## ＊私が作成したもの
以下の通り<font color="DarkOrange">レスポンシブデザイン</font>を用い、モバイルアプリ・webアプリ両方対応のレストランマップのデザインを作成しました。

```css:text.css
@media screen and ( max-width:767px )
```
このコードの下にモバイルアプリのデザインを記入すると対応してくれます。
## ＊苦労した点
まず苦労した点です。
CSSは触ったことがあるものの、JavaScriptを本格的に触ったのは初めてでした。
そのため、JavaScriptの書き方・動き方など知らないことばかりだったのでそこの知識をまず身につける必要がありました。
またレスポンシブデザインをはじめて知ったため、使い方も全く分からず先輩に聞いて実装しました。

## ＊私がはまった理由
苦労した点はあったものの、私がはまった理由です:heart_eyes:
OJTでグループアプリ開発を行っており、そこで初めて本格的にHTML,CSS,JavaScriptを触りました。
プログラミングは初心者レベルだし全然周りの人よりもできない。そんな風に思ったこともありました。
それはもちろんそうなんです。なぜならそんなに触れていないから。
これはもちろんまだまだ勉強する必要が大いにあります。
でもまずは好きなことを見つけてみよう！そう思いました。

私はもともとファッションデザイナーという夢を抱いたこともあったため、デザインとかするのは好き！だからデザインをやってみよう！と思いました。
が、上記の通り苦労したところもあったりなかなか思い通りにならないこともありました。
しかし、今回触ってみて思い通りにデザインできた時の達成感・満足感そして何より、楽しい！そう思いました。
また、プログラミングではまだまだ力不足な私もデザインでは役に立てているのかな～と思うことができました。
そこからやはり私はデザインしたりするのが好きだなと再確認し、もっと学びたいという意欲が芽生えました:seedling:


## ＊さいごに
今後私はもっともっとデザインについて学びたいと思っています。
そのためHTMLの資格取得に挑戦する予定です。
今回のOJTを通して、今後やりたいことがとても明確的に出てきて、とても良い時間だったなと感じました。（まだあと数日ありますが）
まだまだほかのことも勉強しなければならない新卒1年目ですが、自分の好きなことを自分と向き合いながら徐々に発見していきたいなと思います。
そして新卒1年目のエンジニアの皆さんが自分の好きなこと、得意な分野を発見できるように願っています。
最後まで読んでいただきありがとうございました:grin:
MacでMySQLが停止できない場合の解決法


アクティビティモニタを見てたら常時MySQLが起動しててメモリを使っていることが判明。

しかし**MySQLを何度停止しても、ゾンビのようによみがえって起動してくる現象**


### 思いあたる節がある
MySQL、homebrewでインストールした

# 解決方法

## 停止

```sh
❯ brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
```


## 再開
```sh
❯ brew services start mysql
```
【Swift】WKWebViewでUser-Agentを取得する

# 実装
```swift
// UserAgentの取得
func getUserAgent() -> String {
    webView.evaluateJavaScript("navigator.userAgent;") { (result, error) in
        guard let userAgent = result as? String else { return }
        return userAgent
    }
}
```

# おわり
WKWebViewを使いこなせれば実装の幅が広がる気がします。
ドクトリンのアノテーションについて

# doctrine を使う機会があったので備忘録として
アノテーションを使えるようにするにはdoctrine/annotationsというパッケージを追加でインストールする必要がある

# Column
アノテーションされたインスタンス変数を永続化するようにマークします。
この辺その内部に保存されている値は、インスタンス変数エンティティクラスのライフサイクルの一部としてデータベースに保存されそこからロードされる。

つまりデータベースのカラムとして、この値を用いてロードしたり保存したりする。

# Entity
PHP クラスをエンティティとしてマークするために必要なアノテーションです。
ドクトリンはエンティティとしてマークされた全てのクラスの永続化を管理する。つまりデータベースへの保存を管理する。

# table
アノテーションは エンティティ が永続するテーブルを記述する

エンティティとは実態のことで現実世界の対象物をオブジェクトとしてデータをモデル化したもの。
それに対してテーブルとはデータがひとたびモデル化されたらデータベースが作成されてエンティティはその後テーブルによって実体化する。

# ManyToMany
アノテーションされたインスタンス変数が、2つのエンティティ間の多対多の関係を保持することを定義します。
JoinTableは、2つの関連するエンティティのテーブルと名前を使用する合理的なデフォルト構成値を持つ、追加のオプションアノテーションです。


targetEntity: 両方のクラスが同じネームスペースにある場合、非限定クラス名を指定できます。

オプション
mappedByは、このリレーションの所有者側である targetEntity 上のプロパティ名を指定します。リレーションシップの逆側の必須属性です。
inversedBy属性は、関係の逆側となるエンティティのフィールドを指定する。
Google Map JavaScript APIのcustom markerの画像にスタイルを適用させたい

## やりたいこと
google map javascript apiのcustom markerで任意の画像をアイコンとして設定する際に、画像に対し自分で設定したstyleを適用させたい。
デザインを自由に指定するためにcustom overlaysを使う方法もあるが、markerでなんとかしたかった。

以下の方法で実現した。

## 1.それぞれのmarkerに固定の画像を使う場合
```javascript
marker = new google.maps.Marker(
  {
    map: map,
    position: latlng,
    icon: {
      url: 'gazo.png'
      scaledSize: new google.maps.Size(50, 50)
    },
  }
);
```

```css
img[src="gazo.png"]{
  border: 2px solid #939598;
  border-radius:50%;
}
```

## 2.markerごとに異なる画像を使う場合

```javascript
marker = new google.maps.Marker(
  {
    map: map,
    position: latlng,
    icon: {
      url: 'gazo.png(markerごとに違う画像)' + '#custom_marker', #ここでセレクタを設定する
      scaledSize: new google.maps.Size(50, 50)
    },
  }
);
```


```css
img[src$="#custom_marker"]{
  border: 2px solid #939598;
  border-radius:50%;
}
```


注意することは、マーカーの最適化。
デフォルトだとgoogle map api側でマーカーの最適化を行うかどうかを判断してくれる。
アイコンの量が少ない場合はおそらく問題ないが、アイコンの量が増えるなどするとapi側でマーカーの最適化が必要だと判断し、最適化されることによって設定したstyleが効かなくなる。

対処方法としては、markerを作る際に、optimaized: falseを指定すると最適化されないよう強制できる。(ただできればやりたくない)



## 参考
https://stackoverflow.com/questions/46416883/how-add-circle-shape-in-google-maps-custom-icon
https://developers.google.com/maps/documentation/javascript/markers
`python get-pip.py`実行時にエラー（This script does not work on Python 3.6 The minimum supported Python version is 3.7.Please use https://bootstrap.pypa.io/pip/3.6/get-pip.py instead.）

`python get-pip.py`実行時にエラー

```
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py
ERROR: This script does not work on Python 3.6 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/3.6/get-pip.py instead.
```

エラーログのうち、以下に素直に従うことで解決
> `Please use https://bootstrap.pypa.io/pip/3.6/get-pip.py instead.`

```
$ curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py
$ python get-pip.py
# OK
```

# 参考

https://www.bioerrorlog.work/entry/install-pip-pip3-ubuntu
ubuntu20.04環境でwebdavを利用する際のメモ

ubuntu20.04環境でwebdavを利用する際のメモ

## 手動でOKである場合

davfs2のインストール

```
sudo apt install -y davfs2
```

認証がない場合は以下の通りmountを実行する

```
mount -t davfs ストレージのURL /mnt
```

手動で使う場合は上記でOK、ただし

## 自動化したい場合

自動化する場合は以下のようにするとよい
> 認証が必要な場合は、認証の情報を/etc/davfs2/secretsに記述します。

```sh:/etc/davfs2/secrets
ストレージのURL ユーザ名 パスワード
```

proxy情報
> proxyを使います という設定は/etc/davfs2/davfs2.confに書く
```sh:/etc/davfs2/davfs2.conf
proxy YOUR.PROXY.HOST:PORT
```

# 参考
[Ubuntuでfstabを使ってwebdavを自動マウントする方法](https://www.orzs.tech/auto-mount-webdav-using-fstab-on-ubuntu/)
[webDavをmountする](https://kshimo69.hatenablog.com/entry/20110404/1301908188)
C++でSwiftのプロトコルみたいなインターフェースを作りたい

# ターゲット
C++がメインだけどSwiftのプロトコルなど便利機能に慣れちゃった人
テンプレート仮想クラスをどう使ったら良いかわからない人

# 作成例
数字を扱うクラス(Number)と足し算の実装を強要するプロトコル(Addable)を作ってみる

## 足し算のプロトコル
```C++
template <typename T>
class Addable
{
public:
	Addable() noexcept = default;
	virtual ~Addable() noexcept = default;

	virtual T& operator += (const T& r) = 0;
};
```

## 数字を扱うクラス
```C++
template <typename T>
class Number : public Addable<Number<T>>
{
public:
	Number() noexcept = default;
	Number(T value) : m_Value(value) {}
	~Number() noexcept override = default;

	operator T() const
	{
		return m_Value;
	}
	Number& operator += (const Number& r) override
	{
		m_Value += r.m_Value;
		return *this;
	}

private:
	T m_Value;
};

template <typename T>
Number<T> operator + (const Number<T>& l, const Number<T>& r)
{
	return Number<T>(l) += r;
}
```

## テスト用コード
```C++
#include <iostream>

int main()
{
	Number<int> var0{ 1 };
	Number<int> var1{ 5 };

	std::cout << var0 + var1 << std::endl;

	return 0;
}
```
2つの区間（Range）の重複を判定する方法


どうも、「病院なび」の開発チームメンバー甘利です。
今日は区間（Rangeクラス）の重なりの判定について説明します。

Rangeクラスを利用していると、それらが重なっているか？という判定をしたくなる時があります。
ActiveSupportを利用していれば .cover? メソッドを利用することができますが、
そうじゃない時はどうしたら良いでしょうか。

ふたつの閉区間を表すRangeオブジェクトの r1 と r2 があり、
r1, r2 の端をそれぞれ　r１_s, r1_e、r２_s r2_e　と表すとします。
さて、このふたつのRangeが重なっていることを判別するにはどうしたら良いでしょうか。

# 順当に考えてみる
ふたつのRangeの区間が重なっているとはどういうことかを書き出してみますと、
以下のいずれかが成り立つとき、とうことになります。
1. r1 の範囲に r２_s が含まれている
1. r1 の範囲に r２_e が含まれている
1. r2 の範囲に r1_s が含まれている
1. r2 の範囲に r1_e が含まれている

これをRubyのコードでそのまま書くとこうなります。
```
 r1.include?　r2.min ||
 r1.include?　r2.max ||
 r2.include?　r1.min ||
 r2.include?　r1.min 
```

うーん、これは書きたくないですね。

# 重なっていない状態を考えてみる。

考え方を少し変えてみます。重なっているときの条件ではなく、重なっていない時の条件を書き出し、
それを否定するという方法です。
重なっていない時の条件は以下のいずれかの時です。

1. r1_e よりも r2_s が大きい
1. r2_e よりも r1_s が大きい

これをRubyのコードでそのまま書くとこうなります。
```
 r1.max　< r2.min || r2.max　<　r1.min
```

つまり、重なっていない時はその逆なので
```
 ！（r1.max　< r2.min || r2.max　<　r1.min）
```

で、それをド・モルガン使って書き換えます。
https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87

```
　　　　　　　　!(r1.max　< r2.min　||　r2.max　<　r1.min)
　→ !(r1.max　< r2.min) && !(r2.max　<　r1.min)
　→ 　　　　r1.max　>= r2.min && r2.max　>=　r1.min
```

となります。これで完璧です！！！

# 試しに使ってみる。
上記のロジックをkasanaru?メソッドとして実装して試してみます。
(巷にあるメソッドと区別がつく様にあえて日本語、ローマ字表記で命名しています。)
```
irb(main):001:1* def kasanaru?(range1, range2)
irb(main):002:1*   range1.end >= range2.begin && range2.end >= range1.begin
irb(main):003:0> end
=> :kasanaru?
irb(main):004:0> kasanaru? (1..3), (4..6) 
=> false
irb(main):005:0> kasanaru? (1..3), (2..5) 
=> true
irb(main):006:0> kasanaru? (1..10), (2..5) 
=> true
irb(main):007:0> kasanaru? (3..4), (2..5) 
=> true
irb(main):008:0> kasanaru? (3..8), (1..4) 
=> true
```
いい感じです。
```
irb(main):009:0> kasanaru? (3..), (..4) 
(irb):2:in `kasanaru?': undefined method `>=' for nil:NilClass (NoMethodError)
        from (irb):9:in `<main>'                                                         
        from /usr/local/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>'
        from /usr/local/bin/irb:25:in `load'                                             
        from /usr/local/bin/irb:25:in `<main>'                                           
irb(main):010:0> 
```
(┐「ε:)_ｽﾞｺｰ、　調子のったらこれです。

# Beginless or Endress Range
RubyのRangeでは以下の様に始点、および終点を定義しない区間が定義できます。
以下はどちらも有効なRangeのリテラル表記です。
```
(..1)
(3..)
```
他の言語では最大値をつかって表現するのですが、Rubyではnilを端の値にすることで最大値を表現しています。
そのため、これらのRangeオブジェクトを先ほどのkasanaru?メソッドに与えると、nilとの比較が発生し、うまく動作しません。

これらも考慮するともう少し複雑な判定式を用意しないといけません（考えたくない。）

# まとめ
ということでまとめです。　両端のあるRangeオブジェクトどうしで、
区間が被っているかどうかを判定する時は以下の通りで良いと思います。
```
r1.max　>= r2.min && r2.max　>=　r1.min
```
begin or end less な区間なんて知りません。

以上です。
もし今回の記事が少しでも面白いと思った方は、LGTMをお願いします。
記事に対する鉞は叩き落としますが、マシュマロは大好物です。
【Node】人形使い（puppeteer）

Puppeteer は Chrome を制御するノードライブラリ。
RPA（ロボティクプロセスオートメーション）として、Webの定型作業を自動化・代行できる。
もちろん Webのテストを自動化することも可能。
# Get Start
## 初期化と Puppeteer インストール
```
# プロジェクトを初期化する。
% npm init -y
# インストール
% npm i puppeteer
```
## スクリプト作成
Googleのトップページのスクショを撮る簡単なサンプル。
index.js
```
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true // 画面表示 true:なし / false:あり
  });
  const page = await browser.newPage(); // ブラウザの新しいページを開く
  await page.goto('https://www.google.co.jp', { waitUntil: 'domcontentloaded' }); // ページ遷移
  await page.screenshot({ path: 'scsho.png' }); // 画面のスクショ
  await browser.close(); // ブラウザを閉じる
})();
```
headless: false にすると、実際の動きが確認できる。
## スクリプトの実行
scsho.png にスクショが保存される。
```
% node index.js
```
----
# よく使う機能
## セレクターの指定方法
セレクターにはいくつかの指定方法がある。
|セレクタ|要素|説明|
|:--|:--|:--|
|#id|&lt;input id="id"&gt;|この id を持つ要素に合致
|.class|&lt;input class="class"&gt;|この class を持つ要素に合致
|a[href^="index.html"]|&lt;a href="index.html"&gt;...&lt;/a&gt;|index.html 始まりの href を持つ a タグ| 
|input[name="login_id"]|&lt;input name="login_id"&gt;|name が login_id の input タグ| 

## ページ遷移
```
await page.goto(遷移先URL);
await page.goto(遷移先URL, { waitUntil: 'domcontentloaded' });
```
下はDOMの読み込み完了まで待たせる指定。

## ページ遷移待ち
```
await page.goto(遷移先URL);
// await page.waitForNavigation();
await page.waitForNavigation({ timeout: 60000, waitUntil: 'domcontentloaded' });
```
下はタイムアウト60秒でDOMの読み込み完了まで待たせる指定。
ただし、リアクタブルなサイトで、見た目が変わっても画面遷移がない場合は処理できない。

## 入力
```
await page.type(セレクタ, 文字列);
```

## クリック
ボタンもチェックボックスもラジオも。
```
await page.click(セレクタ);
```
## 値の取得
```
var value = await page.$eval(セレクタ, x => x.value);
```
## ミリ秒遅延
```
await page.waitforTimeout(2000); // 2秒待ち
```
WSLでCDK DeployするとSocket Errorが発生する


また、対処がわからず嵌ってしまったので記事に残しておきます。
CDK なんでこんなにつまづきポイントが多いんだろう。

## 環境
Windows10 + WSL2(Ubuntu18.04)
CDK 2.33.0
nodejs 16.16.0

## 問題

WSL環境でcdk deployするとS3バケットへのファイルのアップロード時にソケットエラーが発生します。
現在2つのテンプレートをお試し中で片方のテンプレートは100%発生します。
失敗しているのはCloudFrontとACM周りをごにょごにょするテンプレートです。

```
$cdk deploy 

[100%] fail: read ECONNRESET
❌  MyStaticSite failed: Error: Failed to publish one or more assets. See the error messages above for more information
```

[Re:Postの投稿. cdk-stck-failed-to-publish-one-or-more-assets-access-denied](https://repost.aws/questions/QUz6cfncJgSoabJMF4iQopYg/cdk-stck-failed-to-publish-one-or-more-assets-access-denied)
こちらの対処を試しましたが改善されず。（というかこの対処は的外れでは）

[WSL2 lost connection to the internet after a VPN MTU change](https://github.com/microsoft/WSL/issues/6264)
うーん。なんかWSL2のネットワーク怪しいんですよね。


## 対処
~~というわけで、、WSLのネットワークが怪しい。~~
~~＃こんな対処嫌なんですが、現状はこれ以外見つからないです。~~
~~WSLを捨ててwindowsのコマンドプロンプトでCDKを実行します。~~
~~まったく同じテンプレートを同じバージョンのCDK, nodejsでコマンドプロンプトから実行すれば何も問題なし。~~

と前回記載しました。約１ヶ月後、再び同じ問題に遭遇。結局Windowsのコマンドプロンプトでも問題事象は発生します。

ACMがus-east-1へのデプロイを要求するので、引きづられてCloudFrontもus-ueast-1へデプロイするようにしているのだけど、どうもこの辺が怪しいんじゃないかということがなんとなくわかってきて
ACMとCloudFrontのデプロイを分離したほうがいいよね？ってたどり着いたのが以下のリンク。
[AWS CDK（cdk-remote-stack）でACMとCloudFrontのクロスリージョン参照を実装する @ ClassMethodさん](https://dev.classmethod.jp/articles/cdk-remote-stack-for-acm-and-cloudfront/)
ACMとCloudFrontを分離することでこの問題は解決しました。WSL2を捨てなくてすみそうです。ちゃんちゃん。


##　愚痴

~~Docker on WSL2環境では、samのローカルテストがDocker on Docker on WSL2 するのでこの環境を諦め。~~
~~WSL2では、ネットワーク周りが怪しいので諦め。~~
~~Windowsの開発者は、どうしてこんなにハマりポイントがあるの・・。~~
基本情報（仮想記憶管理パート１）

**仮想記憶**とは主記憶や補助記憶の存在を隠蔽することで、広大なメモリ空間を自由に扱えるようにするものです。
仮想記憶は主記憶装置と補助記憶装置を合わせて作ったメモリ空間ですが、プログラムからは大量の主記憶装置があるように見えています。

## 仮想記憶の制約
「なぜ仮想記憶にすると物理的な制約から解放されるのか」をみていきます。

![スクリーンショット 2022-07-27 12.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/3a47e3ff-be5e-fefa-7513-6a011dc80a1b.png)

実記憶だと空き容量があるのに、ロードできるスペースがないためメモリコンパクションをしない限り、まとまったスペースができません。

一方で仮想記憶の場合は物理的な実態というものがありません。

![スクリーンショット 2022-07-27 12.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/976ffd44-6b31-a554-c192-ae3f74df9c06.png)

仮想アドレス空間として持つことができますが、実際のデータをどこに保存するかというと
実記憶上に保存することができます。

意味がないと思われるかもしれませんが、仮想記憶は **実記憶などの物理的な存在を隠蔽して、仮想空間にマッピング（対応付けや割り当てという意味）** をする技術です。

仮想アドレスから実アドレスへの変換処理は、メモリ変換ユニットというハードウェアが担当します。この仕組みを**動的アドレス変換機構**と呼びます。

![スクリーンショット 2022-07-27 12.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/71694a2c-fd19-9018-b218-349b16adc59d.png)

仮想記憶に置かれたデータは、実際にはその裏で実記憶へと記憶されます。ただ、実記憶の置き場所が仮に16MBしかない場合はそれを超えるプログラムはロードできないことになってしまいます。

![スクリーンショット 2022-07-27 12.55.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/e6125a95-619c-eb03-596e-6891c9639979.png)
実記憶が厳しいならば、補助記憶装置もメモリの一部とみなすことで、実記憶の容量よりも大きなサイズの記憶空間を提供できる仕組みになっています。

仮想記憶 ＝ 主記憶として使うことのできる見かけ上の容量を拡大させる仕組みという使われ方で問題が出題されているようです。

## まとめ
仮想記憶に関して仮想化技術につながり、コンテナにも繋がっていくので簡単にまとめられそうならまとめようと思います。
Flask-Limiterインターフェースのアクセス周波数制限


# Flask-Limiterインターフェースのアクセス周波数制限

flask-limiter-サードパーティの周波数制御プラグイン
ドキュメント：[FlaskLIMITER](https://flask-limiter.readthedocs.io/en/stable/)
フラスコリミッターは、クライアントのアクセスレートを制限するフラスコ拡張機能です。アクセス（速度）制限をカスタマイズして、制限をトリガーするリクエストを除外できます。通常、クローラーを制限するために使用されます。


## 実現方法

``` python

# -*- coding: utf-8 -*-
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,
    # 1日に何回、1時間に何回、1分に何回
    default_limits=["20 per day", "2 per hour", "1 per minute"],
    # 保存場所は、保存するRedisを選択できます
    storage_uri="redis://:123456@127.0.0.1:6379/0"
)

# アドレスには、1分に1回しかアクセスできません
@app.route("/slow")
@limiter.limit("1 per minute")
def slow():
    return "24"


# アドレスをグローバル構成に移動default_limits
@app.route("/fast")
def fast():
    return "42"

# アドレスpingスルー
@app.route("/ping")
@limiter.exempt
def ping():
    return "PONG"


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)
```
- redisを保存場所として使用する場合、redisでリミッターキャッシュを作成するには、対応するサポートライブラリをインストールする必要があることに注意する必要があります。Flask-Limiterは自動的にインストールされないため、手動でpipinstallflask-redisをインストールする必要があります。
Arduino IDE ユーザーのためのPlatformIO導入案内

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> さぶん！

# この記事のターゲット

- Arduino IDEでArduinoやESP32系、Teensyなどを使える。
- ライブラリの導入などもできる。
- PlatformIOは導入が面倒そうなのでなるべく避けたい。

### PlatformIOのよいところ
- ESP32DevkitCの書き込み速度がすごく早くなる
- VSCodeの環境がそのまま使えるので、スクリプトが非常に書きやすい。

### PlatformIOのよくないところ
- 快適なので一度覚えるとArduino IDEがダルく感じられる。

# ArduinoIDEとPlatformIOの違うところ

基本的に**ArduinoIDE用のスクリプトはPlatformIOでも使えます**が、いくつか違う点があります。
その差分をあらかじめ把握しておけば、PlatformIOをすんなり導入できるかもしれません。

#### ファイルの開き方が違う
Arduino IDEは.inoファイルをそのまま開けます。
PlatformIOではプロジェクトのディレクトリを開きます。
また、PlatformIOは、まずVSCodeを開き、アリマークのアイコンを開き、その画面からプロジェクトを開くという手順になります。

#### ファイル名とディレクトリ構造が違う
Arduino IDEは　ファイル名 / ファイル名.ino というディレクトリ構造。
PlatformIOは　プロジェクト名 / src / main.cpp というディレクトリ構造。
main.cppにArduinoIDEでいうファイル名.inoの中身（コード）をコピペすればOKです。

#### \<Arduino.h\> が必要

上記でコピペしたファイルの先頭に、\<Arduino.h\> を入れる必要がある場合がほとんどです。これを入れるとArduino用のスケッチが動くようになります。

#### 変数・関数の出現順が厳密になる
Arduino IDEは、関数の設定などを最後に書いてもビルドが通ります。
PlatformIOは、関数や変数は、使用する前に宣言される必要があります。
（拡張子.hのヘッダファイルを用意して関数の宣言を済ませておくことで、拡張子.cppで使用する関数の定義をコードの後半に持ってくることができます）

#### ライブラリを入れるディレクトリが違う
Arduino IDEは、よくわからないところにライブラリが入ります。
PlatformIOは　プロジェクト名 / lib / ライブラリ名 / src / ライブラリ.cpp, ライブラリ.h というディレクトリ構造になります。
プロジェクトごとにライブラリが入るのでむしろわかりやすいです。

#### 書き込み方法が違う
Arduino IDEは、シリアルポートと正しく選ぶ必要があります。
PlatformIOはは、自動で正しいポートが選択されます。（たぶん）

#### シリアルモニタ表示が違う
Arduino IDEは、メニューから選び、シリアルモニタの速度設定などもあります。
PlatformIOは、画面したのコンセントマークからシリアルモニタを開きます。

#### 環境設定が違う
Arduino IDEは、メニューからプルダウンで各種設定をします。
PlatformIOは、platformio.iniというファイルに通信速度や導入ライブラリの設定を書き込みます（ものによっては自動で書き込まれます）。

#### Teensyduinoが必要なのは同じ
Arduino IDEでTeensyを使う際にはTeensyduinoが必要です。
PlatformIOでもTeensyduinoが必要ですが、ArduinoIDEで導入済みであればOKです。

# ほかにもいろいろあるけれど
取り急ぎ、自分ばPlatformIOに移行する際に知りたかった情報をまとめておきました。
具体的な操作方法やインストール方法については他の検索結果記事をご参照ください！
また、次のArduinoIDEはUIがVScodeそっくりになるという噂もあります。でももしそうだとしたら、やはり早めにPlatformIOに移行しておいて損はないと思います。
Octave で図を描く基本

# Octave で図を描く基本

## 1.　`plot()`


```matlab
x = 0:pi/100:2*pi;
plot(x, sin(x), "linewidth", 0.5, "marker", "*")
hold on
plot(x, cos(x), "linestyle", "--", "color", [0.8 0.5 0.2])
title("sin() and cos()")
xlabel("x")
ylabel("f(x)")
xlim([0, 2*pi])
ylim([-1.5, 1.5])
legend("sin(x)", "cos(x")
set(gca, "fontsize", 18) %   一括して変更するとき
set(gca, "tickdir", "out") % ティックマークを外側に描く
legend("boxoff") %           凡例の外枠を描かない
box off  % default is on     図の外枠を描かない
grid off % default is off    グリッドを描かない
print fig.pdf %              pdf で保存
```


    
![output_1_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/4cb8e5f0-0703-28de-af14-671658367bb6.png)

    


## 2.　`plot()` のプロパティと値

色，ラインスタイル，マーカースタイルは `fmt`(format) として指定できる。ex. "or--"
### 2.1.　色

プロパティ | 値
:---|:---
"color"           | [0, 1] の 3 個の数値（RGB トリプレット）<br>"k", "r", "g", "y", "m", "c", "w"<br>"blue", "black", "cyan", "green"<br>"magenta","red", "white", "yellow"


### 2.2.　ライン スタイル

プロパティ | 値
:---|:---
"linestyle"       | "-", "--", ":", "-.", "none"
"linewidth"       | デフォルトは 1

### 2.3.　マーカー スタイル

プロパティ | 値
:---|:---
"marker"          | "+", "o", "*", ".", "x", "s", "d", "^", "v", ">", "<", "p", h", "none"
"markerfacecolor" | "color" で指定できるもの
"markeredgecolor" | "auto"（デフォルト） の場合は<br>"markerfacecolor" で指定したものと同じ
"markersize"      | デフォルトは 1

## 3.　保存

pdf ファイルで保存するときは `print fig.pdf` のようにすればよい。
【rails6】バッチ処理の際のfind_eachについて備忘録


今回は、railsのバッチ処理でループ処理を実行する際には``find_each``を使用することをおすすめされたので備忘録として書き留めておきます。

## find_eachとは
``find_each``とは、配列に対してループ処理を行うeachメソッドの派生版であり、取得するレコードを小分けにしてループ処理を行うことができます。
例えば、articlesテーブルに10,000個のレコードがあるとします。
```ruby
articles = Article.all
articles.find_each(batch_size: 100) do |article|
  article.update!(title: 'article_test')
end
```
のように書くことによって、「articlesテーブルのtitleカラムの中身を'article_title'にする」というループ処理を、10,000個のレコードを100個ずつ取得し100回に分けて実行することができます。

## find_eachとeachの違い
二つのメソッドの違いは単純で、
``each``=> 配列全てを一度にループ処理にかける
``find_each``=> 配列を分割して順番に（直列処理で）ループ処理にかける
となります。この、<b>直列処理</b>というのが重要になってきます。

## find_eachのメリット
find_eachのメリットを理解するためには、``CPU``と``メモリ``という概念を理解しなければいけません。
### CPUとは
CPUとは、コンピュータが制御や演算を行い動作命令を出す、言わば<b>「パソコンの脳みそ」</b>のような存在です。
CPUの性能が良いほど、処理速度が速いということなので複雑な処理もスムーズに行えるということになります。
### メモリとは
メモリとは、CPUがデータを処理する際に、その作業データを一時的に保存しておく領域になります。
つまり、CPUの性能が良くても、メモリの容量が少ない場合は大量のデータを扱うような作業ができないというようなことが起こり得ます。

## つまり
バッチ処理を行う際、メモリ容量の許容範囲を超えるような大量のデータを扱う場合は、OOM(Out Of Memory)エラーが出てしまうため、工夫が必要となります。
それを解決してくれるのが``find_each``ということになります。前述した通り、find_eachは作業データを指定した単位で分割して直列的に処理してくれるので、OOMにならないように分割単位を設定することで、安全にバッチ処理を実行することができます。

## まとめ
大量のデータをバッチで処理する時には、OOMにならないようにデータを分割処理することができるfind_eachメソッドを使おう。
［個人用］いくつかの用語整理

---
- **Iterable**
反復可能なオブジェクト。配列はiterableの代表的な例。
---
- **List**
配列の限界のために作られたデータ型。配列はサイズを決めなければならないが、サイズが予想できない場合が多いため、Listはサイズの指定なしで使えるよう作られた。Listはインタフェース（親クラス）、ArrayListはListの代表的な継承しクラスだ。
---
- **Mustacheの繰り返し文**
```
{{#article}} {{!articleを繰り返す}}
        <tr>
            <th>{{id}}</th> {{!articleのfield}}
            <td>{{title}}</td> {{!articleのfield}}
            <td>{{{content}}}</td> {{!articleのfield}} 
        </tr>
    {{/article}}
```
---
- **HTMLのaタッグ**
Hyperlinkをかけるタッグ
---
- **HTTP Redirect**
特定のHTTPアドレスに入ると、パスを別のアドレスに変更して接続させるWebサーバーの機能
---
- **@Getter**
Privateでカプセル化された変数にアクセスして見るため使用するAnnotation
---
- **Bootstrap**
-ウェブサイトを簡単に作成できるようにするHTML、CSS、JSフレームワークで、各種レイアウト、ボタンなどのデザインを提供する
---
- **Bootstrap btn primary**
青いボタンを出力する
ソース：[Bootstrap theme](http://bootstrapk.com/examples/theme/)
---
- **HTML input name**
inputタグとは、ユーザーから情報を受け取ることができるタグ
(1) type : type属性（text, image, submit, buttonなど）の設定で、さまざまな入力形式を使用
(2) value : 入力タグの初期値を指し、変更可能
(3) name : nameはinput要素の名前を指し、変更可能

```
<input type="button" value="Submit" name="Submit"/>
```
![submit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2662678/b0a880cc-2438-b40a-2dfb-c88e638aa553.png)

---
- **掲示板の投稿のUpdate（修正）ロジック**
Get requestで修正したい投稿を読み、Post requestで投稿をUpdate
Get requestとPost requestについては次の投稿で。
---
Firebaseにログイベントを送る（Android編）

# はじめに
アプリ開発を行う際にどのような機能を最も使われているかなどの解析を行う際にFirebaseのEventがとても便利だったので記事を残します。
基本的に公式のドキュメントを読むと手順が一番わかりやすいと思いますがざっくり読みたい人向けにまとめてみます。

### 何ができるか
イベントを発行した場所（機能、ページ、ダイアログ表示など）が何件ユーザーが訪れたのか
イベントが発行された時間帯の確認
発行したユーザーの情報

他にもあると思いますがよく使う範囲では上記のようなデータを取得、解析することができます。

# 公式ドキュメント
https://firebase.google.com/docs/analytics/events?hl=ja&platform=android

https://firebase.google.com/docs/analytics/debugview?hl=ja

# イベントの発行手順
下記のコードを指定箇所に仕込みイベントを発行できます
```kotlin
FirebaseAnalytics.getInstance(context).logEvent(EVENT_INFO)
```

EVENT_INFOの中には解析用のイベントの名前を入れたり、Bundleにパラメーターと紐づける値（画面名やエラーコード等）を必要に応じて入れることで確認することができます。

# 確認方法
イベント発行を入れたビルドの作成後、下記を実行します。
```terminal
$ adb shell setprop debug.firebase.analytics.app PACKAGE_NAME
```

Firebaseを開きdebugViewを開くとビルドが入ったデバイス情報が追加されているはずなので選択をするとリアルタイムでイベントの発行、イベント詳細を確認することができます。

最後確認が終えたら
```terminal
$ adb shell setprop debug.firebase.analytics.app .none.
```
を実行して接続がFirebaseと切れたことを確認しましょう。
AWS Session Managerを使用したSSHログイン

# AWS System Managerとは
EC2インスタンスやオンプレミスサーバー、仮想マシン (VM) などを管理できます。
Session Managerを使用すると安全にノードの管理が実現でき、インバウンドポートを開いたり、踏み台ホストを維持したり、SSHキーの管理したりする必要がなくなります。

## Session Managerのメリット
* IAM ポリシーを使用してマネージドノードの一元化アクセス制御
* インバウンドポートを開いたり、踏み台ホストやSSH キーを管理したりする必要がなくなる
* コンソールと CLI からワンクリックでマネージドノードへアクセス
* ログ記録と監査のセッションアクティビティ

## Session Managerの導入

1. **SSM Agentのインストール**
EC2インスタンスにssm-agentがインストールされている必要があります。Amazon Linuxを使用している場合は最初から入っていますが、入っていない場合は以下を参照してインストールを行ってください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html
2. **ロールの作成しインスタンスにアタッチ**
AmazonEC2RoleforSSMというデフォルトポリシーを付与したIAMロールを作成し、対象のEC2インスタンスにアタッチをして再起動を行ってください。
3. **EC2のインスタンスIDを確認**
```
aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, PrivateIpAddress, InstanceName: (.Tags[] | select(.Key==\"Name\").Value)}'

{
  "InstanceId": "i-xxxxxxxxxxxxxxxxx",
  "PrivateIpAddress": "10.x.xx.xxx",
  "InstanceName": "production"
}
{
  "InstanceId": "i-xxxxxxxxxxxxxxxxx",
  "PrivateIpAddress": "10.x.xx.xxx",
  "InstanceName": "staging"
}
{
  "InstanceId": "i-xxxxxxxxxxxxxxxxx",
  "PrivateIpAddress": "10.x.xx.xxx",
  "InstanceName": "develop"
}
```
※1. AWSコマンドが使用できること
※2. jqコマンドが使用できること
4. **SSHログイン**
_~/.ssh/configに以下を記載_
```
# SSMでのSSH
Host i-* mi-*
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```
_sshを行う(3で取得したログインしたいインスタンスIDを指定する)_
```
ssh i-xxxxxxxxxxxxxxxxx
```
RHEL8でユーザー作成、そのユーザーのみでrootにsuできるようにしてrootのsshログイン禁止

必要になったのでメモ。


某環境でVMもらうとpublic IPとrootのパスワードだけ来るので、初期安心設定メモ。

1.  rootになれるユーザーでsshログイン
1.  suでrootになっていろいろ実行

とするように設定。その他にrootにsuせずsudoのみでをコマンドを実行する設定する方法もありますが、本投稿ではそこまではやりません。気になる方はググってください。
一時期のみ使うマイVM設定って感じです。

確認した環境: RHEL8
```shell-session
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.6 (Ootpa)
```

なお以下コマンド実行例は最初にプロンプト`#`または`$`がついてますので、それは抜かして実行お願いします。

# 1. rootになれるユーザー作成
最初はしょうがないのでrootでsshログインして実施します。

```shell-session
ssh root@<VMのIPアドレス>
```


wheelというgroupのidのみrootにsuできるようにします。
wheelというgroupがあるか確認。
```shell-session
# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:
(・・・以下続く)
```
`wheel:x:10:`があります!　group idは10ですね。

このwheelというgroupでユーザーを作成します。
ここでは`adm001`というidを作ります。ここお好みidで作ってください。
意識高いシステムはuidの数字に決まりがあって指定したりしますが、ここでは空いてるのを自動で使うこととします。
```shell-session
# adduser adm001 -g wheel
# 
```
エラーがなければ、特に出力もなく、終わります。

確認は/etc/passwdにidがあればOKです。またgroup idはwheelの10で設定されてますね。
```shell-session
# cat /etc/passwd | grep adm001
adm001:x:1000:10::/home/adm001:/bin/bash
# 
```

パスワードを設定しないと、sshログインできないので、パスワードを設定します。
```shell-session
# passwd adm001
ユーザー adm001 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
# 
```

これでユーザー作成は完了です。
念の為、rootは一旦exitして、作成したidでsshログインできるか確認します。
```shell-session
# exit
ログアウト
Connection to xxx.xxx.xxx.xxx closed.
~:$ ssh adm001@<VMのIPアドレス>
adm001@xxx.xxx.xxx.xxx's password:
[adm001@xxx ~]$
```
無事入れたら、exitで抜けて、再度rootでsshログインします。
```shell-session
$ exit
ログアウト
Connection to xxx.xxx.xxx.xxx closed.
~:$ ssh root@<VMのIPアドレス>
root@xxx.xxx.xxx.xxx's password:
# 
```


# 2. wheelグループのユーザーのみrootにsuできるようにする
`/etc/pam.d/su`を編集します。
以下のような行があるので、`#auth`の先頭の`#`を削除、その行の最後に`root_only`をつける。
2番目の単語は`required`の方です。似た行があるので注意。
```
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
```

編集後:
```
# Uncomment the following line to require a user to be in the "wheel" group.
auth		required	pam_wheel.so use_uid root_only
```

参考情報：
- `root_only`をつけるとwheelグルーブ以外のuserはrootへのsuのみできないようになります。
- `root_only`をつけないとwheelグルーブ以外のuserは全てのsuができないようになります。
- 2番目の単語を`sufficient`にしてしまうと、wheelグルーブのuserはパスワードなしでrootにsuできます。

# 3. rootのsshログイン禁止
`/etc/ssh/sshd_config`を編集します。
```
PermitRootLogin yes
```
を
```
PermitRootLogin no
```
に変更して保存します。もし先頭に`#`がついていたら削除してください。

その後、以下のコマンドでsshd設定ファイルを再読み込みします：
```
# systemctl reload sshd
```
これでrootでsshログインできなくななりました！
exitしたら、rootでsshログインできないので、wheelグループのuseridでログイン後、必要に応じてrootにsuしてください。

以上です。

# 4. 追記

結局rootでログインはできないけど、不正ログイン試行が多すぎるのとおひとりさまサーバーだったためssh鍵認証にしてしまいました。事情によりUSサーバーだったので国内ipのみ制限とか難しかったためです。以下の投稿を参考にさせていただき実施しました：
[SSH公開鍵認証で接続するまで](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)

多い!!!!!
```
最終ログイン: 2022/07/28 (木) 08:19:54 CDT日時 pts/0
最後の失敗ログイン: 2022/07/28 (木) 19:16:40 CDT xxx.xxx.xxx.xxから開始日時 ssh:notty
最後の正しいログインの後に 3599 回の失敗ログインの試行があります
```
ハードディスク以外の補助記憶装置

# 補助記憶装置の種類
ハードディスク以外にも```光ディスク、光磁気ディスク、磁気テープ、フロッピーディスク、メモリ、USB```がある。
これら駆動装置から記憶媒体を取り外せるものを```リムーバブルメディア```と言う。
ハードディスクと比べると```アクセス速度は遅い。```
用途としてはバックアップや、配布

# 光ディスク
レーザー光線によってデータの読み書きが行われる。
光ディスク装置には種類がある。
## CD
* 記憶容量は６５０MBと７００MB
* 価格は安価
* 安価な割に大容量
* 再生専用型、一度だけ書き込み追記型、何度でも書き換えができる型が存在する。

### CD-ROM
* 読み込み専用
* 製造段階でピットという微小なへこみを無数に作る

### CD-R
* 一度だけ書き込める
* 有機色素が塗られている。
* ピット作成はレーザー光線で焦がす

### CD-RW
* 何度でも書き換えができる。
* 材料は相変化金属
* レーザー光線の照射で結晶化、非結晶化させその違いによってデータを記録する

## DVD
CDと同じ光ディスク装置。
CDよりも波長の短い赤色レーザで記録するため、ピットの高密度化が可能となって、より大容量を実現しています。

### DVD-ROM
再生専用型のDVD

### DVD-R
追記型のDVD（一度だけ書き込める)

### DVD-RW,DVD-RAM
書き換え可能のDVD

## 気づき
```-ROM```は読み込み（再生)だけ
```-R```は一度だけ記録(追記）できる
```-RW```は書き直しができる

確かにそうだな。
これから買うときは気をつけて買おう。

# 光磁気ディスク
* レーザー光線と時期によってデータの読み書きを行う。
* フロッピーディスクの後継として一時は使われていた。光ディスクの大容量低価格化により世間で見かけなくなった。
* 書き込み時はレーザー光線で記録面を熱して磁器を使って記録する。
* 読み込み時はレーザー光線を使って読み取る。

## 気づき
光磁器ディスクは記録面をレーザー光線で熱するらしいがディスクは何度まで熱くなるのだろうか？
どうやって磁気で記録するのだろうか？

記録方法
磁気変調方式（MFM方式）では、以下の手順でデータが記録される。

* メディアの磁性層に高出力のレーザ光を照射して、磁性が失われる温度（キュリー温度：ISO規格のMOでは摂氏150 - 180度）以上にまで瞬時に加熱する
* レーザで照射された部分が、レーザ光から離れて磁性を記録保持できる温度まで冷え始めた所で、電磁石により記録層と垂直方向の磁界を与える
* 磁性体が十分に冷えて、磁性が完全に保持される
出典　https://ja.wikipedia.org/wiki/%E5%85%89%E7%A3%81%E6%B0%97%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF#:~:text=%5B%E7%B7%A8%E9%9B%86%5D-,%E7%A3%81%E6%B0%97,-%E5%A4%89%E8%AA%BF%E6%96%B9%E5%BC%8F%EF%BC%88MFM

熱そうだな。　冷やして記録が保持されるのか。 すごいな。

# 磁気テープ
* テープ状のフィルムに磁器を使って読み書きを行う。
* 磁気テープの中でもブロック毎にスタート、ストップすることをせず、連続してデータの読み書きをする補助記憶装置を```ストリーマ```と言う。
* アクセス速度は遅い。
* 容量が大きくて安価なのでバックアップ用途に使う。

## 気づき
オーディオテープは磁気テープに分類されるのかあの薄いものが磁気テープだったのか。
それも知らずに磁気テープを引き伸ばしていた。
今では畏れ多いな。
磁気はすごいな。

## フラッシュメモリ
* EEPROMの一種
* メモリカード（SDカード),USBメモリが入る。
* コンパクト
* 低価格
* デジタルカメラや携帯電話などの記録メディアに利用される。

## SSD(Solid State Drive)
* フラッシュメモリを記憶媒体としている。
* 省電力
* 耐衝撃
* シークやサーチといった待ち時間がない。
* 書き込み上限がある。
* ハードディスクに比べてビットあたりの単価も高い。
* 上２つのの理由により完全な置き換えになっていない。使用用途で分かれる。

### 気づき
今使っているパソコンもSSDだが書き込み回数に上限があるとはどう言うことだろうか？
いきなり書き込めなくなる状況が来るのだろうか？
アクセス時間の高速化の工夫がされているのか。
リムーバブルメディアではなく一体化することで速くなるんだな。

一般的に寿命は5年程度と言われています。
出典https://www.4900.co.jp/smarticle/23890/#1SSD%E3%81%AE%E5%AF%BF%E5%91%BD%E3%81%AF5%E5%B9%B4%E7%A8%8B%E5%BA%A6

あと2年くらいか。　頑張ろう。

## 問題を解いた時の気づき
* DRAMはリフレッシュ動作が必要なメモリにで、主記憶装置に使われる。
* 紫外線を利用してデータを消去し、書き換えることができるメモリはEPROM
* SRAMはデータ読み出しが早いメモリでCPUと主記憶装置の性能差を埋めるキャッシュメモリによく使われる。
* SSDの中にはフラッシュメモリが入っているために揮発性は無い。
* 磁気ディスクは記録部分書き換えはできない。途中から読んだり書き込んだりできないため。
* 磁気ディスクは書き込み時の記録密度は変更できない。磁気ディスクの書き込み速度より高速。
* ストリーマの書き込みヘッドは一つしかない。
クラウドについて

![クラウド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/ffb89b50-bd03-1112-75eb-4a7d9ce9e28e.jpeg)
## クラウド（クラウド・コンピューティング）とは
1. ユーザーがインフラ、ソフトウェアを持たなくても、インターネットを通じ、サービスを必要な時に必要な分だけ利用する考え方
1. ハードウェアを購入したり、ソフトウェアをインストールしなくても利用できるサービス＝クラウドサービス

＊クラウドではないとは
ソフトウェアをPCへインストールする必要があり、インストールしたPCのみで利用可能な状態

## クラウドサービスの代表例(Gmail)
パソコンにソフトウェアをインストールしてなくても、クラウドサービスのアカウントさえ持っていれば、Google Chromeのブラウザを通してメールを利用できる
→ 「ユーザーがソフトウェアを持たなくても、インターネットを通じ、サービスを必要な時に必要な分だけ利用する」考えと合致するため、Gmailはクラウドサービスである。





## クラウドサービス(SaaS,PaaS,IaaS)の責任範囲の違い
|   |IaaS  |PaaS  |SaaS  |
|--:|:-:|:-:|:-:|
|**データ**|○|○|○|
|**アプリケーション**|○|○|●|
|**ミドルウェア**|○|●|●|
|**オペレーティングシステム**|○|●|●|
|**仮想ネットワーク**|○|●|●|
|**ハイパーバイザー**|●|●|●|
|**ハードウェア**|●|●|●|
|**物理ネットワーク**|●|●|●|
|**ファシリティ**|●|●|●|

○利用者の責任範囲　　●クラウド事業者の責任範囲

- ミドルウェア：OSとアプリケーションの中間に存在するソフトウェア
- ハイパーバイザー：仮想マシンを動かすためのソフト
- ファシリティ：施設、設備、建物





## クラウドサービス(SaaS,PaaS,IaaS)の定義の違い

### 1. SaaS (Software as a Service)
サービス利用者：エンドユーザー
ソフトウェアをインターネット経由で提供するクラウドサービス　例）Gmail、GoogleMap、Yahooメール
→ アプリやソフトウェアをダウンロードすることなく、ブラウザを経由して利用できる
→ 会員登録をすれば（ユーザーアカウントが準備できれば）すぐに使うことができる。





### 2. PaaS (Platform as a Service)
サービス利用者：アプリケーションエンジニア
クラウドにあるプラットフォームが利用でき、企業ユーザーがプラットフォーム上で開発を行う。例）データセンター、アプリを起動するためのネットワーク、サーバーシステム、OS
＝クラウドにあるアプリケーション開発に必要な機能を利用するサービス。

メリット
ゼロベースで機能開発をすることなく、自社サービスで利用するための機能開発に注力できる。





### 3. IaaS (Infrastructure as a Service)
サービス利用者：インフラエンジニア
クラウドにあるサーバ（CPU・メモリ・ストレージ）やネットワーク機器などのコンピューティングリソースを利用するサービス。 例）AWS,GCP,Microsoft Azure
＝ハードウェアを保有することなく、特定の機能を持つ機器を利用できるサービス

メリット
経年劣化によるハードウェアの交換を自社で行う必要はなく、クラウド事業者に委ねることで管理が必要ない。
ハードウェアを稼働させるための電気料金や保管する設備や施設などのランニングコストが削減できる。






## 参考資料
https://www.itmanage.co.jp/column/saas-paas-iaas/
https://altus.gmocloud.com/suggest/cloud/
https://wa3.i-3-i.info/word178.html
https://wa3.i-3-i.info/word12196.html
https://wa3.i-3-i.info/word16322.html
Linuxコマンドに関する知識

## Linuxのディレクトリ構造
![ディレクトリ構造.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/c0082d07-3161-58c5-7cb8-8b060baa0ba6.jpeg)

## Linuxディストリビューション
![Linuxディストリビューション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/305bd7a9-471b-32a6-bccb-c30be104db3b.jpeg)

## yumとは
![yum.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/5d95e83d-e9ec-98a9-dce4-f567a4e02028.jpeg)

## ユーザー権限
![ユーザー権限.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3543ad73-4d32-97f5-2a54-439b3debbbca.jpeg)

## パーミッション
![パーミッション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/e5acdfdd-6440-3bb5-a102-ec723b9f6e89.jpeg)

## SSHとSFTP
![SSHとSFTP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/d31850cf-8246-aa0a-b923-e6457a45ae26.jpeg)

## Inコマンド と cpコマンド
![Inコマンドとcpコマンド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/df5e80ea-6a2e-9f62-ee45-377266112178.jpeg)

## ドキュメントルート
![ドキュメントルート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/e1981b2b-c1e0-ceb2-5e0f-7a5ca3bf1ee6.jpeg)

## サーバーの状態を把握するコマンド
![サーバーコマンド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/20c29147-e7cb-4158-cc84-bd98cdd2bc32.jpeg)


## 参考資料
https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332
https://kitsune.blog/yum-summary
https://eng-entrance.com/linux_command_ls
https://qiita.com/pyon_kiti_jp/items/a44ac6e9229ba7b90c6b
https://blog.denet.co.jp/vmstat/
https://www.sejuku.net/blog/50251
https://atmarkit.itmedia.co.jp/fnetwork/netcom/netstat/netstat.html
https://it-kyujin.jp/article/detail/1636/
https://eng-entrance.com/linux-command-kill
https://wa3.i-3-i.info/word11027.html
phpのモジュール追加

# やりたいこと
phpのモジュール追加
基本的に全部yumで入れた

# 環境
・CentOS7.3
・php5.4

# 使用できるモジュール一覧
下記コマンドで確認できる
```
# php -m
```

# php-pear
DB接続とかでよく使うっぽい

# php-pgsql
phpでpostgresqlの関数等を使う
https://www.php.net/manual/ja/book.pgsql.php

# php-mbstring
phpでマルチバイト文字を使用できるようにする拡張モジュール
vue-codemirrorでtabが効かない（入らない）時の解決法

# 起こった問題
vue-codemirrorを使ってコードエディタをWebアプリに組み込もうとした。  
エディタ内でTabキーを押すと、本来はインデントが入るはずなのに入らず、エディタからフォーカスが外れてしまった。
# 実行環境
OS：macOS Monterey
エディタ：Visual Studio Code
npmバージョン：8.1.0
Vue CLIバージョン：5.0.4
vue-codemirrorバージョン：6.0.1
# 解決法
@codemirror/viewと@codemirror/commandsのパッケージを導入して、
indentWithTabを使う
# 前提
すでにvue-codemirrorを利用している方に向けて書いている。
まだ使っていない場合は、以下を参照するとよい。
https://github.com/surmon-china/vue-codemirror
# 詳細な手順
npmを使って、各パッケージをインストールする
```zsh.
npm install @codemirror/view
```
```zsh.
npm install @codemirror/commands
```
vueのscript内で以下のようにインポートする
```coding.vue
//すでにimport済み（のはず）
import { Codemirror } from "vue-codemirror";
import { cpp } from "@codemirror/lang-cpp";
import { oneDark } from "@codemirror/theme-one-dark";

//追加する
import { keymap } from "@codemirror/view";
import { indentWithTab } from "@codemirror/commands";
```
vueのdata部分に、以下のように設定を書く
```coding.vue
extensions: [cpp(), oneDark, keymap.of([indentWithTab])]
```
保存して、アプリを起動すれば、インデントができるようになっているはず。

# 参考文献
https://codemirror.net/examples/tab/
https://www.npmjs.com/package/@codemirror/view
https://www.npmjs.com/package/@codemirror/commands
sinθ の 計算方法(Python)

今回は[hmath](https://caleb7023.hmath.pro/)で使用されているsinθの計算方法をご紹介します。
## 計算式
[hmath](https://caleb7023.hmath.pro/)は次の数式でsinθを定義しています。
```math
\sin θ = {\frac{e^{θi}-e^{-θi}}{2i}}
```
## プログラム
[hmath](https://caleb7023.hmath.pro/)内では次のプログラムで計算しています。
```ruby:sin.py
import hmath
def sin(θ):
    return (hmath.exp(θ * 1j) - hmath.exp(θ * -1j)) / 2j
```
### 別の計算方法
[hmath](https://caleb7023.hmath.pro/)内では利用していませんが次の式でsinθを計算することもできます。
```math
\sin θ=\sum_{n=0}^{∞}{\frac{(-1)^n}{(2n+1)!}}θ^{2n+1}
```
上の式をコードにすると次のようになります。
```ruby:sin.py
import hmath
roop_time = 200 #これを大きくすると精度が上がるがオーバーフローに注意。
def sin(θ):
    ans = 0
    for n in range(roop_time):
        ans += (-1) ** n / hmath.factorial(2 * n + 1) * θ ** (2 * n + 1)
    return ans
```
最後まで見ていだきありがとうございました。
ぜひ活用してみてください。