OmniAICreator/Qiita-1.07M huggingface dataset:
12時間制の正午の考察から、インド人が凄いと思うに至るまで

# 正午は、何時？
訳あって、12時間制の時間を取得するという処理が必要になった。
こんなの簡単だろうと思ったわけです。
要は、時間を12で割った余りを取得すればよいと・・・
```vb:Excel VBA
intHour = Hour(Now()) Mod 12
```
さて、確認のために Excel の条件書式で表示した内容と比べてみます。
時刻を12時間表記するには、以下の様に書式設定ます。
`yyyy/mm/dd AM/PM hh:mm:ss`

この書式を使って、`2022/06/10 00:00:00`を12時間制で表示すると`2022/06/10 AM 12:00:00`に・・・
？？？AM 12時？？？
あぁ、あれでしょ、日本と海外じゃ違うからね。
じゃあ、条件書式を`[$-ja-JP]yyyy/mm/dd AM/PM hh:mm:ss`にしてみたらどうよ。
`2022/06/10 午前 12:00:00`
・・・えー、マジですか・・・

私はテレビは持っていませんが(だから受信料は払ってませんが)、Echo Dot でNHKラジオのニュースは聞くんです。
ニュースの更新が追い付いていないのか、朝7時頃に聞くと、夜中のニュースが流れるのですが、その時のアナウンスは
>「午前0時になりました、NHKのニュースをお伝えします」

と言う感じで始まります。
ちなみにExcelでは24時間制で言う所の12時(正午)は`2022/06/10 午後 12:00:00`です。
**つまり、Excel上での12時間制表記には「午前0時」や「午後0時」は存在しない！？**
# ゼロを発見したインド人は凄い
いや、まぁ、Excel の12時間制で **0時** が出てこないのは、そういう理由じゃないでしょうね。
そも、ゼロを発見したのがインド人じゃないかもしれませんし・・・
# 余談
先ほど、商の余りを求めるのに`mod`を使いましたが、それと並んで便利な演算子が`\`(バックスラッシュ、日本語フォントだと￥)です。
整数の商を求めます。
以下の様に、時間の前に「AM・PM」や「午前・午後」を付けるのも、「\」を使えば簡単にできます。
```vb:Excel VBA
strHour = IIf(Hour(Now()) \ 12 = 1, "午後", "午前") & CStr(Hour(Now()) Mod 12)
```
バックスラッシュだと普段除算に使う「/」と形が似ているので、覚えやすいですよね。
日本語の「￥」はこういう時ちょっとどうかと思うけど・・・
# さらに余談
たかだか **12時間制の時間を取得する** だけで、「(24時間制の)0時と12時の時、どうするんですか？」と仕様を確認しなきゃいけないの、面倒。
その前に、何で24時間制にしなかったのかな、このシステム・・・
Demonstrator Design of Functional Cluster Execution Management, No.843, AUTOSAR 21-11 (320) AP

Demonstrator Design of Functional Cluster Execution Management, No.843, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/e846b8ee2898553e11814d5da0d44b07/26129?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

Specification of Execution Management, No.721, AUTOSAR 21-11 (21) AP

https://qiita.com/kaizen_nagoya/items/9b6b3b571889eea87081	


GTest/GMock 1.8.1
Boost 1.72.0



# 文書履歴(document history)
ver. 0.01 初稿 20220610
ArduinoでESP32を利用し、PS4コントローラと接続

## 概要
IPHONEのアプリでドローンを操縦する予定ですが、アプリの開発にまた時間がかかるので、先にゲームのコントローラーから操縦できるように作りたいと思います。

## 電路図
![IMG_3006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/ba3b395c-b271-ff76-a6a9-d0ce210f5fa9.jpeg)
| Arduino側 | Esp32側 |
|:-----------|------------:|
| ５V        | 5V        |
| GND        | GND      |
| TX         | U0R        |
| RX         | U0T      |

## ESP32のプログラム
ここでPS4-esp32ライブラリを利用して、コントローラの入力を取得できます。

https://github.com/aed3/PS4-esp32

PS4コントローラーをESP32に接続するとき、PS4コンソールのBluetooth MACアドレスを把握する必要があります。MACアドレスは sixaxispairtool 使用して取得できます。

まず、PS4コンソールと接続する前に、PS4コンソールのBluetooth MACアドレスを記入します。
```c:
void setup()
{
    Serial.begin(115200);
    PS4.attach(event);
    PS4.begin("1a:2b:3c:01:01:01"); //PS4コンソールのBluetooth MACアドレスを記入
    Serial.print("Ready.");
}
```

そして、文字列をArduinoに出力するため、文字列の前に { を入れって、文字列が終わる所に } を閉めます。
```c:
void event()
{
    if (PS4.event.button_down.right) Serial.print("{Right Button}");
    if (PS4.event.button_down.down) Serial.print("{Down Button}");
    if (PS4.event.button_down.up) Serial.print("{Up Button}");
    if (PS4.event.button_down.left) Serial.print("{Left Button}");

    if (PS4.event.button_down.square) Serial.print("{Square Button}");
    if (PS4.event.button_down.cross) Serial.print("{Cross Button}");
    if (PS4.event.button_down.circle) Serial.print("{Circle Button}");
    if (PS4.event.button_down.triangle) Serial.print("{Triangle Button}");

    if (PS4.event.button_down.upright) Serial.print("{Up Right}");
    if (PS4.event.button_down.downright) Serial.print("{Down Right}");
    if (PS4.event.button_down.upleft) Serial.print("{Up Left}");
    if (PS4.event.button_down.downleft) Serial.print("{Down Left}");

    if (PS4.event.button_down.l1) Serial.print("{L1 Button}");
    if (PS4.event.button_down.r1) Serial.print("{R1 Button}");

    if (PS4.event.button_down.share) Serial.print("{Share Button}");
    if (PS4.event.button_down.options) Serial.print("{Options Button}");
    if (PS4.event.button_down.l3) Serial.print("{L3 Button}");
    if (PS4.event.button_down.r3) Serial.print("{R3 Button}");
}


void loop() {

}
```
## Arduinoのプログラム
```c:
String text = "";
void setup() {
  Serial.begin(115200);
}

String detectString();

void loop() {
  if(Serial.available()){
    text = detectString();
    Serial.println(text);
  }
  //delay(1000);
}

String detectString(){
    while(Serial.read() != '{');
    return (Serial.readStringUntil('}'));
}

```
## 結果
イベント処理で、ボタンがクリックしたらメッセージを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/f55ec66f-5b48-65b2-66f6-c56ea3f14062.png)
Rust の C-unwind API

Rustのnightlyで "C-unwind" が利用できるようになった。

https://github.com/rust-lang/rfcs/pull/2945#issuecomment-1134003542

C++の関数AからRustの関数Bを呼び、BからC++の関数Cを呼ぶ。Cが例外を投げてAでキャッチしたときに、Bはどうなるか。
BはCが例外を投げることを知らないので、もしBにデストラクタが存在していた場合そのデストラクタが実行されることは保証されない。
そのため、これまではデストラクタが呼び出されないように気を付けてコードを書く必要があった。
例としてC++と書いたが、他の言語と相互運用する際も同様の問題がある。

今後は例外を投げる関数は "C-unwind" と宣言することで、Bのデストラクタが確実に呼ばれるようになる。
ただし全ての言語でできるという保証はなく、その言語がプラットフォームの提供する仕組みを利用している必要がある（~~longjmpを含む~~ 動かなかったので確認中）
また、 panic=unwind （デフォルト設定）でビルドする必要がある。

---

間違いがあったらコメントでご指摘ください。
あと、どの言語はどの機能で例外を実装しているかという表をどこかで見かけた気がするので、見かけたら教えてください。
Demonstrator Design of Functional Cluster Communication Management, No.842, AUTOSAR 21-11 (329) AP

 Demonstrator Design of Functional Cluster Communication Management, No.842, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/3cf96f34a70d566c09edc2d2c3d9bc92/26127?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)
GENIVI VSOMEIP 3.1.14.1 (https://github.com/GENIVI/vsomeip/tree/3.1.14.1)

BOOST 1.71.0 (https://www.boost.org/users/history/version_1_71_0.html)

OpenDDS 3.14 (https://github.com/objectcomputing/OpenDDS/releases/tag/DDS-3.14)

# 文書履歴(document history)
ver. 0.01 初稿 20220610
Qgisプラグインでのツールバーの追加と削除

# ツールバーの追加と削除
QGISプラグインでのツールバーの追加方法と削除方法についになります。

DockWidgetも然りだが詰ったので残しておきます。

## ツールバーの追加
ツールバーの追加はシンプルです。`iface`の`addToolBar`を使用することで簡単に追加できます。
引数にテキストを渡して新規作成か、ツールバーを渡すかの2つの方法になります。

```python
from qgis.utils import iface

toolbar = iface.addToolBar("testToolBar")
```

```python
from PyQt5.QtWidgets import QToolBar
from qgis.utils import iface

toolbar = QToolBar("testToolBar")
iface.addToolBar(toolbar)
```

## ツールバーの削除
`QToolBar`の`deleteLater`での削除をおすすめします。
ですが、再使用はできないので注意が必要です。

```python
toolbar.deleteLater()
```

### `addToolBar`のテキスト渡しで追加した場合
`QMainWindow`から削除は可能ですが、基本的には`QToolBar.deleteLater`からの削除が良いです。

```python
from qgis.utils import iface

window = iface.mainWindow()
window.removeToolbar(toolbar)
```

## 所感
`add`があるなら、`remove`も準備してくれ…

## サンプルプラグインコード
```python
class SamplePlugin:
    def __init__(self, iface):
        self.iface = iface
        self.toolbar = None

    def initGui(self):
        self.toolbar = QToolBar('SampleToolbar')
        self.iface.addToolBar(self.toolbar)

    def unload(self):
        self.toolbar.deleteLater()
```

## 参考

https://stackoverflow.com/questions/69652034/remove-toolbar-from-qgis-toolbars-menu

https://api.qgis.org/api/classQgisInterface.html

https://doc.qt.io/qt-6/qtoolbar.html

https://doc.qt.io/qt-6/qobject.html#deleteLater
Demonstrator Design of Functional Cluster Log and Trace , No.861, AUTOSAR 21-11 (330) AP

Demonstrator Design of Functional Cluster Log and Trace , No.861, 2021-11

https://www.autosar.org/fileadmin/standards/adaptive/20-11/AUTOSAR_EXP_FCDesignLogAndTrace.pdf

R21-11, R22-11がダウンロードできないのは不明。

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|Logger|Class representing a DLT logger context. DLT protocol defines so called "contexts" which can be seen as logger instances within one application or process scope. Refer to the Logger class API chapter, for further detailed description.
|LogStream|Class representing a log message. A log message is always associated to a certain log context. To append data (log arguments) to the message, insert stream operators are to be used. All of the plain old data types are supported out of the box, but it can be extended to understand new/custom data types, simply by providing own operator<< implementations. Refer to the LogStream class API chapter, for further detailed description.

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

Specification of Log and Trace, No.853 , AUTOSAR 21-11 (28) AP

https://qiita.com/kaizen_nagoya/items/ad9b9f9c625ef399a3f7	

Genivi DLT daemon Master (commit hash e969bed805f7dba9d2fa35c56a7ace28efb67e4e)

Google Test 1.8.0


# 文書履歴(document history)
ver. 0.01 初稿 20220610
cloudformationのネスト表示 ってなに？

## 勉強前イメージ

グルーピング的な？
どうやってするかはわからん

## 調査

### まずcloudformationとは

AWS cloudformation はAWSの環境構築を自動化できるサービスです。
YAMLファイルを書いてデプロイすることで、環境を構築することが出来ます。
ネストされたスタックは他のスタックの一部として作成されます。

詳細は [こちら](https://qiita.com/miyuki_samitani/items/9f0ad8cb97403e0276db) になります。

### cloudformationのネスト とは

cloudformationのスタックを以下の図のように複数のスタックを連携させる方法です。
以下の図であれば、main stackは他のVPC,EC2,RDS stackから見たら親スタックになります。

![12022-06-10 cloudformationのネスト表示 とは - diagrams.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/90a92076-52e3-6827-31a6-c6219e148aa2.png)


また、以下のようなコードをmain stackに埋め込んで親子関係を記載します。

```
vpcstack:
  Type: "AWS::CloudFormation::Stack"
  Properties:
    TemplateURL: ./vpc.yaml

ec2stack:
  Type: "AWS::CloudFormation::Stack"
  Properties:
    TemplateURL: ./ec2.yaml
```

## 勉強後イメージ

親スタックにいろいろ紐付けられるって感じかー
1のスタックに2,3つけれるイメージだったけど
親スタックを起因に他のネストがくっつけられるのね。

## 参考

- [CloudFormationでスタックをネストし、EC2を起動させてみた
](https://dev.classmethod.jp/articles/cloudformation-nested-ec2/)
- [CloudFormationでネストされたスタックを作成してみる](https://dev.classmethod.jp/articles/create-own-verification-environment-using-cfn-nested-stacks/)
メディアを、スマホの時にタイトル→画像→テキストの順に並べたい

## やりたいこと

これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704882/a80f472f-6dbb-9f8a-b3a0-20f1e8ae701c.png)

スマホの時はこうしたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704882/55e8bc46-43cb-bab1-9489-c82568c3f476.png)

コードはこんな感じ。
```html
            <div class="media">
                <figure class="media__image">
                    <img src="hogehoge.jpg" alt="">
                </figure>
                <div class="media__body">
                    <h2 class="media__title">タイトル</h2>
                    <p class="media__text">hogehoge</p>
                </div><!-- /.media__body -->
            </div><!-- /.media -->
```

```css
.media {
    display: flex;
}

.media__image {
    width: 30%;
}
```

## 問題点
タイトルより画像の方が上に来るのならば、flex-directionを指定するだけでよいので問題ない。ただし今回の場合は画像が.media__bodyの中に割り込む形になるため少し悩んだ。

## 解決策
### display:contentsを使ってみる
display:contentsはそのタグ自体の存在をないもののように扱えるみたい。（厳密には違うのかもしれないけど）

```css
@media (max-width:700px) {
    .media {
        flex-direction: column;
    }
    .media__body {
        display: contents;
    }
    .media__title {
        order: -1;
    }
}
```
こうすることによって、htmlの方がこんなイメージになるのかな
```html
            <div class="media">
                <figure class="media__image">
                    <img src="hogehoge.jpg" alt="">
                </figure>
               <!-- 下の２つを囲んでいた.media__bodyが存在しないような振る舞いになる -->
                <h2 class="media__title">タイトル</h2>
                <p class="media__text">hogehoge</p>
            </div><!-- /.media -->
```
あとはorderで順番を変えれば良い。


## これってどうなのって話
見た目通りにはなるけど、普段あまり使わない display:contents を使っていいのかなっていうのがある。ブラウザごとに挙動が違ったりしないかな

https://caniuse.com/css-display-contents

（↑　対応してないものもいくつかある）

gridを使うっていうのも見かけるけど、それってタイトルが長くなったりした時もしっかり機能するの？

何かいい組み方があったら教えてください！！
Ubuntu 22.04 LTS ServerのIPを固定する

# 目次
[1.現在のIPアドレスを確認する](#現在のipアドレスを確認する)
[2.ファイルを作成する](#ファイルを作成する)
[3.ファイルを適応させる](#ファイルを適応させる)
[4.IPアドレスを再確認する](#ipアドレスを再確認する)

# 現在のIPアドレスを確認する 
まずは現在のIPアドレスを確認します。

下記のコマンドを実行し、インターフェース名を覚えておいてください。
**実行コマンド**
```
$ ip addr
```
**実行結果**
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:00:00::00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.32/24 brd 192.168.1.255 scope global dynamic noprefixroute enp2s0
       valid_lft 65105sec preferred_lft 65105sec
    inet6 2400:4052:63:db00:90b:d8c0:f9a3:174b/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 583507sec preferred_lft 64672sec
    inet6 2400:4052:63:db00:dc87:d41a:14c9:1ca2/64 scope link
       valid_lft forever preferred_lft forever
```
enp2s0というインターフェース名は設定で使用します。
※インターフェース名はお使いの環境によって異なります。

# ファイルを作成する
IPアドレスを固定するための設定ファイルを作成します。

下記のコマンド実行し、設定ファイルを作成してください。

 **実行コマンド**
```
$ sudo nano /etc/netplan/99_config.yaml
```
**記述内容**
```
network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:                              ← インターフェース名
      dhcp4: false
      dhcp6: false
      addresses: [192.168.1.100/24]      ← 固定したいIPアドレス
      routes:                            
        - to: default
          via: 192.168.1.1               ← ゲートウェイアドレス
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]    ← DNSサーバー
```
# ファイルを適応させる
下記のコマンド実行してください。
 **実行コマンド**
```
$ sudo netplan apply
```

# IPアドレスを再確認する
最後に固定できたか確認してみましょう。

**実行コマンド**
```
$ ip addr
```
**実行結果**
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:00:00::00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute enp2s0
       valid_lft 65105sec preferred_lft 65105sec
    inet6 2400:4052:63:db00:90b:d8c0:f9a3:174b/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 583507sec preferred_lft 64672sec
    inet6 2400:4052:63:db00:dc87:d41a:14c9:1ca2/64 scope link
       valid_lft forever preferred_lft forever
```

これでIPアドレスを固定することができました！
【Xcode】Developer Mode disabledと表示されて実機ビルドができないとき 【Developer Mode】　

## はじめに
[@tsuzuki817](https://twitter.com/tsuzuki817)です🐸

iOS 16にしてから、実機ビルドをしようとしたら、以下のようなに`Developer Mode disabled`が表示されて実機ビルドができなかったので調べてみました。(iPadOS,watchOSでもなるらしい）

![Developer Mode disabled](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/3703fde2-d43a-2dcc-f429-7833e1a71efc.png)

表示されるアラート
```
The run destination iPhone is not valid for running the scheme MySwiftApp. iPhone does not have Developer Mode enabled. 
```


## 解決方法　→ デベロッパーモードを有効化する

1. `設定`アプリを開く
2. 中間ほどまでスクロールし`プライバシーとセキュリティ`をタップ
3. さらに最下部までスクロールし、`デベロッパモード`をタップ
4. `デベロッパーモード`のトグルスイッチをオンにすれば解決

![Developer Mode Toggle Switch](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/f5508086-4b33-acf2-8019-c1a9db5b5635.png)

> Apple製品向けのアプリを開発する場合、デベロッパーモードでは、アプリ開発に必要な機能を利用できます。デベロッパーモードがオンになっていると、デバイスのセキュリティが低下します。

なかなか怖いことが書いてありますが、オンにしないと実機ビルドができないのでオンにします。

オンにすると、再起動を求められるので`Restart`をタップして再起動します。
起動したら、もう一度Xcodeにつなげば`Developer Mode disabled`が消えて実機ビルドができるようになります。

## なぜこの機能が追加されたのか

iOS 16, watchOS 9 で追加されたDeveloper Modeは潜在的に有害なソフトウェアを不用意にデバイスにインストールすることから保護するために追加されたようです。

この機能は `App Store`からアプリケーションを購入したり、 `TestFlight`チームに参加したりする通常のインストール手法には影響を与えず、以下のような場合に焦点を当てています。

- `Xcode`で `Build and Run`
- `Apple Configurator`から `.ipa`ファイルをインストール

このときに、開発署名付きソフトウェアをインストールするリスクを認識させ使用者が開発者であることを明示的にするために行なっているそうです。

## Developer Mode（デベロッパーモード）を無効にしたい場合

先ほどと同じ手順で `Developer Mode`の画面まで行き、開発者モードのトグルスイッチをOFFにすれば良いです。
無効にするときも、有効にするときと同じようにデバイスの再起動が必要になります。

公式の解説
https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device

## おわりに

ユーザーをあらゆるセキュリティリスクから守るためにappleが導入した Developer Modeが原因でした。
セキュリティリスクにさらされながら開発する開発者に合掌🙏

# 宣伝
Picture In Pictureを使ったいつでもどこでも好きな画像を表示しておける個人アプリリリースしました！
ぜひダウンロードして使ってみてくださいね🐸
https://apps.apple.com/jp/app/pictin/id1625004229?platform=iphone
![スクリーンショット 2022-06-10 22.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/555ebd2b-530a-096d-3eb9-c85e11f4eae8.png)
🔰【初学者用】Railsのエラーメッセージを日本語化する

# はじめに
オリジナルアプリケーション実装時にエラーメッセージを日本語化したので、その方法をまとめます。

## 日本語化の設定
まずは日本語の設定から
```rails:config/application.rb
# 中略
module Pictweet
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # 日本語の言語設定
    config.i18n.default_locale = :ja #jaに変換
      # 省略
    end
end
```

## rails-i18n導入
日本語に対応するGemfileを導入します。
[登録されている日本語](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml "登録されている日本語")
```rails:Gemfile
#中略
gem 'rails-i18n'
```
忘れず`bundle install`

## devise.ja.ymlの作成
config/localesディレクトリにdevise.ja.ymlを作成
以下のURLのコードをコピーしてdevise.ja.ymlに貼り付けてください！
[divise.ja.yml](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml "divise.ja.yml")

:::note warn
警告
インデントミスに注意！！
:::

## ja.ymlの作成
config/localesディレクトリに、ja.ymlというファイルを作成
例:
```rails:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        nickname: ニックネーム
      tweet:
        text: テキスト
        image: 画像
```
↑このような形で書き込んでいきます。
この記述の場合、nickname・text・imageが日本語化されます。

:::note warn
警告
インデントミスに注意！！
:::


## 単体テストを日本語化していく
includeの中身を編集します。
```rails:spec/models/user_spec.rb
context '新規登録がうまくいかないとき' do
  it 'nicknameが空では登録できない' do
    @user.nickname = ''
    @user.valid?
    expect(@user.errors.full_messages).to include('ニックネームを入力してください')
  end    
```
### テストコード実装
テストコードを実装します。
```rails:ターミナル
bundle exec rspec spec/models/user_spec.rb 
```

これでOK！！！

### 終わりに
基本的なことですが、忘れないうちにアウトプット！
では、また明日！
Android Studioで使っているJDKをコマンドプロンプトでも使う(Windows)

Android Studioが入っていれば、JDKを改めて入れなくても良いそうなのと、
[Android Studioで使っているJDKをターミナルでも使う](https://qiita.com/tsumuchan/items/43a55789f1cf213611cc)にてMacでの方法は紹介されていたのですが、Windowsでの方法はすぐに見つけられなかったのでメモを残しておきます。

## JDKの場所を確認
Android Studioの `[File] > [Project Structure]` から確認する事が出来ます。
`JDK location`から確認できます。（↓キャプチャ）
![スクリーンショット 2022-06-10 215451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695130/57d08d42-973c-92a0-7e9c-474ba0f2359c.png)
私の場合
`C:\Program Files\Android\Android Studio\jre`
の部分です。
## pathを通す
システム環境変数へ、確認したJDK locationのpathにbinを追加した、
`C:\Program Files\Android\Android Studio\jre\bin`
を、システム環境変数のpathに追加してください。
*詳細は自分の環境に合わせて変更してください。
## まとめ
コマンドプロンプトから`java --version`等でpathが通った事が確認出来たら完了になります。
【Python】社内のTwitterボーナスの集計を楽にしたい（したかった）

## 初投稿です
初投稿です。緊張しながら書いてます。
ドキドキです。ドキドqiitaです。

# はじめに
結論から言うと、出来としては微妙です。
技術力的に足りない部分や
Twitter Apiのアカウントの制限もあります。
それとアドバイスなどありましたらコメントください。

## 目的
社内で行っているTwitterボーナスの集計を
Twitter APIを使って効率よく集計することが目的です。

ツイート数を集計する上で以下の条件があります

- コメントがないリツイートは含まない
- 他人へのツイートへのリプライは含まない
　- ただし自分へのツイートにぶら下げたリプライは含める

## 環境
Python 3.9.7

それとTwitter APIの開発者アカウントを申請済みであることが前提条件です。
申請する方法に関しては他の方がまとめているので参考にしてください。
https://qiita.com/taishi0202/items/092c267c0c6dc68347c5

### tweepyのインストール
先にTwitter APIを利用するためにtweepyというライブラリをインストールしておきます。
なくても可能らしいですが、あったほうがいいと思います。

```:ターミナル
pip install tweepy
```

## Tweetの集計
```py:getTweet.py
import tweepy

#用意しておいたAPIトークン
API_Key     = "******************"
API_Sec     = "******************"
Token       = "******************"
Token_Sec   = "******************"
BEARER      = "******************"

#API認証
client = tweepy.Client(bearer_token=BEARER, consumer_key=API_Key, consumer_secret=API_Sec, access_token=Token, access_token_secret=Token_Sec)
auth = tweepy.OAuthHandler(API_Key, API_Sec)
auth.set_access_token(Token, Token_Sec)
api = tweepy.API(auth)    


count=10 # 取得数（上限は200）
screen_name="cydas_ouchi" # ユーザ名(@以降)
since = "2022/04/01" # この日付から
until = "2022/05/01" # この日付まで

#ツイートの取得
tweets_data = api.user_timeline(screen_name=screen_name, count=count)

if tweets_data != None:
    tweetCount = 0
    for tweet in tweets_data:

        #日付をYYYY/MM/DDに変換
        tweetDate = tweet.created_at.strftime('%Y/%m/%d')
        
        #指定した日付を超えたら終了
        if since > tweetDate: break
         #指定した日付までスキップ
        if until < tweetDate: continue

        #リプライ先の名前を取得
        reply_to_screen_name = tweet.in_reply_to_screen_name

        #リツイートの場合はカウントしない
        if 'RT @' in tweet.text[:4]: continue

        #リプライ先が自分のツイート以外ならカウントしない
        if reply_to_screen_name != None:
            if reply_to_screen_name != screen_name:
                continue

        #ツイート数をカウント
        tweetCount+=1 

#最後に取得した日付を比較
if tweetDate > since:
    print('取得数が足りません')
else:
    print(tweetCount)
```
取得に成功するとターミナルに
```:ターミナル
3
```
とツイート数が表示されます。

取得数が足りず指定した日付より前で処理が終了した場合は
```:ターミナル
取得数が足りません
```
と表示されます。

開発者アカウントの権限がElevated(申請すれば無料のやつ)なので
普通の検索で使えるsinceやuntilが使えないです。
なので無理やりそれっぽく実装しています。
```py:日付の判定
if since > tweetDate: break
if until < tweetDate: continue
```

リツイートには取得テキストデータの最初に`RT @`が付きますが
コメント付きのリツイートは、取得データの最初に`RT @`がつかないので
先頭の4文字にRT @がついているかどうかで判定しています。
```py:コメントなしリツイートの判定
if 'RT @' in tweet.text[:4]: continue
```

`tweet.in_reply_to_screen_name`でリプライ先を取得して
`screen_name`の名前と一致するかどうかで
自分へのリプライかどうかを判定しています。
```py:自分へのリプライかどうか判定
if reply_to_screen_name != None:
            if reply_to_screen_name != screen_name:
                continue
```

## 改善点
- そもそも最大取得数が200件のため、ツイート数が多い人は正確に集計できない。
- 最新のものから遡っていくため直近1ヶ月〜2ヶ月ぐらいしか遡れない。
`start_id`などの引数をうまく使えば昔のツイートも遡れる？
もっといい方法知っている方いたら教えてください。

## まとめ
改善点も多いですが、形には出来て良かったです。

またTwitter APIやPythonなど普段の業務では使わない技術に
触れることができたのは新鮮で楽しかったです。

あとずっと書こうと思っていたQiitaデビューできて嬉しいです。
なんならQiita書くことが目的になっていたような気もします。
【yocto】bitbake時の設定変数を確認する方法

# はじめに
- bitbake時、様々なファイルで設定がされていて、今の設定がよくわからんという人向け

# 方法
- bitbakeに-eオプションを付与する
~~~
bitbake -e recipe-name
~~~

# 例
- INHERITを見てみる
~~~
takeshi@X250:~/yocto/poky/build$ bitbake -e core-image-minimal | grep "INHERIT="
INHERIT=" poky-sanity uninative package_rpm buildstats image-mklibs image-prelink debian devshell sstate license remove-libtool blacklist sanity"
~~~

- INHERITにrm_workを追加したときに、その変化が確認できるかを見てみる
~~~
takeshi@X250:~/yocto/poky/build$ echo "INHERIT += \"rm_work\"" >> conf/local.conf 
takeshi@X250:~/yocto/poky/build$ bitbake -e core-image-minimal | grep "INHERIT="
INHERIT=" rm_work poky-sanity uninative package_rpm buildstats image-mklibs image-prelink debian devshell sstate license remove-libtool blacklist sanity"
~~~
会議など保存した音声ファイルの文字起こしをVOSKを使ってお手軽にやる

VOSKが流行っていたのでやってみました。
Google Colaboratoryで実施しましたが、Pythonだったら何でも大丈夫なはずです。

## 下準備する

```
!pip3 install vosk
!git clone https://github.com/alphacep/vosk-api.git
!wget https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip
!unzip vosk-model-small-ja-0.22.zip
!mv vosk-model-small-ja-0.22 model
```

## WAVファイルを準備する（アップロードする)

WAVファイルを準備する

16kHz,16bit,monoである必要あり。

以下の記事などを参考に
zoomで録画した動画からffmpeg, soxあたりで変換すると幸せになれました。

http://www.xucker.jpn.org/pc/ffmpeg_wav.html

https://qiita.com/mountcedar/items/a04ebc4f8c27c226bbff



## 以下を実行する

以下を参考に以下を実行する

https://github.com/alphacep/vosk-api/blob/v0.3.32/python/example/test_simple.py

経過はすっ飛ばして、最終的に出力されるテキストだけ表示するようにしました。
アップロードしたファイルをhogehoge.wavとしています。アップロードしたファイル名に変更してください。


```python
#!/usr/bin/env python3

from vosk import Model, KaldiRecognizer, SetLogLevel
import sys
import os
import wave
import json

SetLogLevel(0)

if not os.path.exists("model"):
    print ("Please download the model from https://alphacephei.com/vosk/models and unpack as 'model' in the current folder.")
    exit (1)

wf = wave.open("hogehoge.wav", "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
    print ("Audio file must be WAV format mono PCM.")
    exit (1)

model = Model("model")
rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True)

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        output = rec.Result()
        json_dict = json.loads(output)
        print(json_dict['text'])

print(json.loads(rec.FinalResult())['text'])
```
テスト68

```vb
'Excelファイルを開かずにExcelファイルに書き込みをする方法
Sub ExcelADO()
 
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim str As String

str = "C:\Users\User\Desktop\VBA練習\test.xlsx"

cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
         "Data Source=" & str & ";" & _
         "Extended Properties=""Excel 12.0;HDR=YES""")

strSQL = "Select * From [テスト1$];"

With rs
    .Source = strSQL
    .ActiveConnection = cn
    .LockType = adOpenDynamic
    .Open
End With


rs.MoveFirst
Do Until rs.EOF
    'ポイントはExcelファイルのシートの書式を文字列にしておくこと
    rs.Update "あ", "A"
    rs.Update "い", "B"
    rs.Update "う", "C"
    rs.Update "え", "D"
    rs.Update "お", "E"

    rs.MoveNext

Loop

'1万行の処理で約3秒...φ(-ω- )ｶｷｶｷ
Stop

rs.Close
Set rs = Nothing

cn.Close
Set cn = Nothing
    
End Sub
【Rails】テーブル内の特定の文字列を含む行の背景を変更する方法

# やりたいこと
　Railsで質問待ちアプリを作っている．ユーザが質問を登録したらテーブルに表示される．
　`post`テーブルに`situation`カラムが入っており，この値が`対応中`のときにテーブルの背景の色を変えたい．

# 結論
　色々試したが，最終的には以下のコードにたどり着いた．

```erb
<% if post.situation == "対応中" %>
  <tr style="background-color: #FACAC8;">  <%# 背景をピンクにする %>
<% else %>
  <tr> 
<% end %>
```


# 試したこと
　JavaScriptの`:content`を使う方法を試した．

## jQueryの導入

### 1. jquery-railsのインストール

```:Gemfile
gem 'jquery-rails'
```

```:ターミナル
bunsle install
```

### 2. application.jsの編集
　`//= require jquery`を追記する．このときに書く順番注意．

```
//= require jquery
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```


# ビューファイルの変更（テーブルの色を変える）

```erb
<script type="text/javascript">
   $('td:contains("対応中")').parent("tr").css("background-color", "#FACAC8");
</script>
```

　この方法では，最後に追加されたデータには色付けできなかった．（最後に追加されたデータ以外は正しく色が変わった）キャッシュの削除など色々試したができなかったため，`:content`を使わない方法にした．
TECH CAMP 5日目　~HTML,CSS,flexboxの闇~

# 学習内容
- HTML,CSS
　- flexbox
　- コメントアウト
- Ruby on Rails
　- ヘルパーメソッド(`form_with`,`link_to`,`text_field`,`submit`)
　- パラメーター(params)
　- キー
　- gem
　- ストロングパラメーター
　- プライベートメソッド
　- バリデーション
　

# 苦労したこと、改善
中央によっている縦に並ぶ２つの要素を追加したかった
```html
<div class="heading">
  <div class="title">SERVISE</div>
  <div class="lead">サービス内容</div>
</div>
```
```css
.heading{
display:flex;
flex-direction:column;
justify-content:center
```
このようにコーディングを行ったが実際は下記のようなコードでよかった
```css
.title{
text-align:center;
}
.lead{
text-align:center;
}
```
レイアウトを決めるときに真ん中に寄せたり縦並びにする=全部`display:flex;`やっとけばなんとかなる...
みたいな浅はかな考えでとりあえずでコーディングしていました。
改善：もっと簡単にできるシンプルな方法はないか？を考え固定概念にとらわれないようにしていきたいと思います。あとは、ウェブデザインに関する本がたくさん出ているので、いろんな人におすすめを聞いて自分に合った本で勉強していきたいと思います。トップページにtwitterのリンクあるので、おすすめの本あれば教えてください！！

# 今週の振り返り
今週設定した目標、「今週中に中間試験を実施」は達成しました。
計画していた進捗よりもだいぶ進んでいるので、この調子でいきたいと思います！
Demonstrator Design of Functional Cluster Persistency, No.859, AUTOSAR 21-11 (321) AP

 Demonstrator Design of Functional Cluster Persistency, No.859, 2021-11

https://www.autosar.org/fileadmin/standards/adaptive/20-11/AUTOSAR_EXP_FCDesignPersistency.pdf

21年版、22年版がダウンロードできない。なぜかは不明。

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|Key-Value Storage |Key-Value Storage is implemented by providing a class KeyValueStorage. Every instance of this class represents one Key-Value database, so an Application can use multiple instances of this class depending on the number of databases used. 
|File Storage| File access is implemented by providing the classes ReadAccessor and ReadWrite Accessor. The File Storage is accessed using the function OpenFileStorage. The single files inside of a File Storage are accessed using the methods OpenFileRead Only, OpenFileWriteOnly and OpenFileReadWrite provided by the class FileStorage.

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/a8f025aa-ab6b-a662-fe00-363fd04b6b11.png)
858	Specification of Persistency https://qiita.com/kaizen_nagoya/items/548a0b493419221bd76a	AP	24



# 文書履歴(document history)
ver. 0.01 初稿 20220610
Adaptive Platform Demonstrator Release Notes, No.865, AUTOSAR 21-11 (336) AP

Adaptive Platform Demonstrator Release Notes, No.865, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/b192e01b259ef3a12df6efc0ab9178a2/26136?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Adaptive Platform Release Overview
AUTOSAR_TR_AdaptivePlatformReleaseOverview
[2] Source of Adaptive Platform Demonstrator
AUTOSAR_SRC_AdaptivePlatformDemonstrator
[3] Testdata of Adaptive Platform Demonstrator
AUTOSAR_SRC_AdaptivePlatformDemonstratorTestdata



# 文書履歴(document history)
ver. 0.01 初稿 20220610
Demonstrator Design of Functional Cluster Update And Configuration Management, No.894, AUTOSAR 21-11 (332) AP

Demonstrator Design of Functional Cluster Update And Configuration Management, No.894, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/d42c9b2835e5156ed4a0322ef315d8b0/26135?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

AUTOSAR’s Adaptive Platform Demonstrator

Specification of Update and Configuration Management, No.888, AUTOSAR 21-11 (43) AP

https://qiita.com/kaizen_nagoya/items/2306d465f78f0f3e7146	AP	43

# 文書履歴(document history)
ver. 0.01 初稿 20220610
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
コレスポンデンス分析関するメモ

# 趣旨

コレスポンデンス分析についてのメモを以下に記します。

# コレスポンデンス分析

コレスポンデンス分析(対応分析)の具体的な計算方法の説明としては「対応分析は関係をどのように表現するのか(藤本一男,『津田塾大学紀要』第 52 号(2020 年)169-184 頁」が、具体的である。Appendix Aにアルゴリズムが記載されている。

このアルゴリズムは標準的なものであり他の文献でも同じアルゴリズムが見られる( 例えば以下：http://www.econ.upf.edu/~michael/stanford/caipA.pdf, https://ronri-rukeichi.hatenablog.com/entry/2018/05/01/021309 ,  https://elsur.jpn.org/mt/2018/05/002635.html)。

以下はMatlabでコードした例である。以下のコードはNにクロス集計表(各要素が該当件数)を与えて実行する。アルゴリズムのはじめにNを全件数で除して同時確立分布に変換する(文献によってはこの変換を行わない場合がある)。

分析結果を計算した列についての分析と行についての分析を重ね合わせてプロットする。

```matlab
[F, G, D ] = ca3( N );

plot( F(:,1), -F(:,2), 'o' );
hold on;
plot( G(:,1), -G(:,2), 'x' );
hold off;
    
function [F, G, D] = ca3( N )

P = N / ( sum( N,'all' ) ); % P is correspondence matrix
r = sum( P, 2 ); % r is row masses
c = sum( P, 1 ); % c is column masses
Dr = diag( r );
Dc = diag( c );
S = Dr^(-0.5)*(P-r*c)*Dc^(-0.5);
[U,D,V]=svds( S, 3 );
Phi = Dr^(-0.5)*U;
Gamma = Dc^(-0.5)*V;
F = Phi * D;
G = Gamma * D;

end
```

# 重ね合わせについて

コレスポンデンス分析には、列の分析と行の分析の重ね合わせについて議論があった。
https://tsuda.repo.nii.ac.jp/?action=repository_uri&item_id=114&file_id=22&file_no=1

ところが、両軸に主座標を用いるフレンチプロットではなく、対称バイプロットを用いることで、行と列の分析を重ね合わせが解釈可能になるという。
https://bob3.hatenablog.com/entry/2022/01/15/123412
https://bob3.hatenablog.com/entry/2022/01/22/180059

具体的には列の変数と行の変数の座標の内積をとると、その二つの事象の同時確率の(同時確率が全て等しいと仮定したときの)期待値からのずれを表すのだという。

上記matlabスクリプトの記号と文法を用いて計算すると
```matlab 
% 以下を関数ca3の終わりで計算する
I = Dr^(-1)*(P - r*c)*Dc^(-1);
F = Phi * D^(0.5); % 対称バイプロットの座標
G = Gamma * D^(0.5); %　対称バイプロットの座標
% このときErは0行列になる。
Er = I(j,i)-F(j,1)*G(i,1)+F(j,2)*G(i,2) 
```
上記でIの計算でDrとDcの逆数がかけられているのは、各列・各行のデータ数の不均衡を是正するためである。

# 主座標、標準座標、対称バイプロットで用いる座標の違い

主座標、標準座標、対称バイプロットの違いは、座標をもとめるときの特異値のかけ方である。上記matlabスクリプトの記号を用いれば、以下のとおりになる。

```matmab 
%関数ca3の最後で主座標、標準座標、対称バイプロットで用いる座標は
%以下に計算できる。
%主座標
F = Phi * D;
%標準座標
F = Phi;
%対称バイプロットで用いる座標
F = Phi * D^(0.5);
```

コレスポンデンス分析のソフトウェアには、主座標を用いてプロットするフレンチプロットを行う場合と、対称バイプロットを行う場合がある。フレンチプロットと対称バイプロットの結果は似たものになるが混乱しないようにしたい。
・・・・・・・・・・・・・・・・
Demonstrator Design of Functional Cluster Time Synchronization, No.905, AUTOSAR 21-11 (333) AP

Demonstrator Design of Functional Cluster Time Synchronization, No.905, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/5f94e83279aad5b6f2ae0f29d95d198c/26134?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

AUTOSAR’s Adaptive Platform Demonstrator.

Specification of Time Synchronization, No.880 , AUTOSAR 21-11 (55) AP

https://qiita.com/kaizen_nagoya/items/9c5e22713d3e4f8cac08	AP	55

# 文書履歴(document history)
ver. 0.01 初稿 20220610
基本情報（画像など、マルチメディアデータの表現方法）

まず、アナログとデジタルの言葉が出てきます。本だと下記のように記述してあります。

**アナログ**
写真や音声、動画など、自然界にある情報はいずれも連続した区切りのないアナログ情報
連続して変化する情報
**ディジタル**
秒単位や分単位で数値の書き換えが行われるのはディジタル時計。
ある範囲を規定の桁数で区切って数値化したものをディジタル情報。

と呼ぶそうです。下記でどのようなデータがあるか記述します。

## 画像データは点の情報を集めたもの
画像データの表し方はビットマップ方式というらしいです。
拡張子は.bmpです。見たことないです。。。

BMP（ビーエムピー）は、Microsoft Windows Bitmap Imageの略のようです。
最近、Windowsを使ったことがないので通りで見たことがないと思った。

jpg(jpeg),png,gifあたりはよく見ますね。

これは画像を細かいドットの集まりで表現します。

640×480ドットの画像データだった場合は、その画像を構成するドットの数は307,200個です。

ちなみにmacの解像度は

| mac機種   |   MacBook Air(M1, 2020)  |  13インチMacBook Pro(M2, 2022)
| :---: | :---:| :---: |
|   解像度  |  2560×1600 (227ppi)  |  2560×1600 (227ppi)  |

ドット数は4,096,000みたいですね。ぴえん。

ドットの集まりを絵にするためには、「そのドットは何色か」という情報が必要になります。
ドット一つ一つに色情報というデータがつくそうです。

```
２色　　
// 白か黒 １ドットにつき１ビット
16色　
// 特定の16色　１ドットにつきビット(2⁴=16)の情報量
256色 
// 特定の256色。もしくはグレースケールなどで構成される画像 1ビットにつき8ビット(2⁸=256)
65,536色　
// 特定の65,356色で構成される画像。１ビットにつき16ビット(2¹⁶=65,536)
16,777,216色 
// フルカラーの画像。１ビットにつき24ビット(2²⁴=16,777,216)の情報量が必要。
```

フルカラーは24ビットなんですね。

## 音声データは単位時間ごとに区切りを作る
アナログの波形データを、ディジタル化して数値表現する代表格はPCM（Pulse Code Modulation）方式と呼ぶらしいです。

16ビットのデータを、そのままの形式で符号化します。

**標本化（サンプリング）**
アナログデータを一定の時間単位で区切り、その時間ごとの信号レベルを標本として
抽出する処理が標本化（サンプリング）と呼びます。
[サンプリング](https://ja.wikipedia.org/wiki/%E6%A8%99%E6%9C%AC%E5%8C%96)
時間間隔を「標本化周波数」と呼び、Hz(ヘルツ)という単にで表します。
1秒間に1回が1Hzです。

CDのサンプリング周波数は44.1kHz(キロヘルツ）で1秒間に44.1 * 1000 = 44100回のデータを作ります。

**量子化**
信号レベルを何段階で表現するか定め、サンプリングしたデータをその段階数に当てはめて整数値に置き換える処理が量子化と呼ぶみたいです。
この数値の大きさを「量子化ビット数」と呼びます。
CDの量子化ビット数は１６ビットです。

**符号化**
量子化により求められた値を**符号化**で2進数のデータに変換します。

標本化→量子化→符号化の順番で処理ですね。

例題を作ってみます。

演奏時間3分の音楽をサンプリング周波数44.1kHzで量子化ビット数16ビット、PCM形式、ステレオでデジタル化したデータの容量をメガバイトで求めてみます。
１Mバイト = 1,000,000です。

1. 演奏時間3分 * 60 = 180秒
1. サンプリング周波数は1秒間に44.1 * 1000 = 44100回
1. ３分間で 180 * 44100 = 7,938,000回
1. 量子化ビット数16ビットは8ビット = 1のため、16ビットは2バイト
1. PCM形式の場合は２バイトのデータが、そのまま符号になります。
1. 1回のデータが２バイトの符号のため、2 * 7,938,000 = 15,876,000　の容量となります。
1. ステレオは２チャンネルのため、15,876,000 * 2 = 31,752,000
1. 1Mバイト = 1,000,000バイトなので31,752,000 = 31,752Mバイト

## まとめ
音楽家になりましょう。
[Swift]最初手こずる？R.swiftのインストール手順

## はじめに

R.swiftはStoryboardや画像などのリソースを、簡単に取得できるようにする便利なライブラリですが、CocoaPodsやSPMでインストールするだけでいいというわけではありません。

初回導入時に少々手こずったので残しておこうと思います。

## Pods

まずはPodfileに以下を追加し、pod install しましょう。

```ruby:Podfile
pod 'R.swift'

```

## Run Scriptの設定

Target > Build Phases を選択して Run Script を追加します。

`"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"`


## InputFiles,OutputFilesの設定

下記を共に設定します。
![スクリーンショット 2022-05-12 21.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/76188f64-6570-efc0-2cb7-a4ba651f7eaa.png)
### InputFiles
`$TEMP_DIR/rswift-lastrun`

### OutputFiles
`$SRCROOT/generated/R.generated.swift`


## 位置を変える

画像のように、Compile sourcesの上に持ってきます。

`※ここが忘れがちなので注意`
![スクリーンショット 2022-05-12 21.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/561db827-12ef-b563-9be2-4dc344901b6e.png)
## R.generated.swiftをプロジェクトに追加する

上記の作業を終えたら一回ビルドしてみましょう。

そうするとR.generated.swiftというファイルがプロジェクトのルートディレクトリに追加されているので、このファイルをプロジェクトに追加します。（そのままドラック）

![スクリーンショット 2022-05-12 21.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/c81848b5-6b0e-9e55-771c-d4c2180f1928.png)

※.gitignoreに以下を追加するのも忘れずに

`*.generated.swift`

## 使用できるか確認する

```swift:ViewController  
let vc = R.storyboard.main.FooViewController()

```
`R`と打って補完が出てくれば成功です。
Demonstrator Design of Functional Cluster State Management, No.1016, AUTOSAR 21-11 (335) AP

Demonstrator Design of Functional Cluster State Management, No.1016, 2021-11

https://researchmap.jp/multidatabases/multidatabase_contents/download/231120/5f94e83279aad5b6f2ae0f29d95d198c/26134?col_no=2&frame_id=576083

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

SWS_StateManagement

Specification of State Management, No.908, AUTOSAR 21-11 (44)  AP 

https://qiita.com/kaizen_nagoya/items/0800a8b906b04172d855	

# 文書履歴(document history)
ver. 0.01 初稿 20220610
ver. 0.02 加筆 20220727
５週目 spring2

9講　関心事分離とMVC出力　処理Controller　データ伝送Model　出力View=MVC　DispatcherServletが前で入力処理をしてモデル(結果貯蔵所)を作ってそれをコントローラーに伝達しコントローラーがそれを処理して再びモデルに伝達すればそれをモデルが再びビューに伝達

10講　関心事の分離とMVC出力　jspファイルを作り、値が出力される席さえ作っておけば、この中にモデルオブジェクトが持っている値が入る。 コントロールでメソッドの返還タイプ1.Stringビュー名返還2.voidリターン値なしurlの終端語がビュー名3.ModelAndViewを生成してModelで処理view指定して一度に返還

11講　スプリングMVC原理　媒介変数名を得る=1.ReflectionApiを利用した呼び出しJava8以上-parametersオプション　2.Classfile内で持ち帰り。コードは作られてたら、ビュー名だけを変えて値を表示する

12講　スプリングMVC原理　マーサードの媒介変数に勝手に値を入れて(パラメータ配列とarg配列を回りながら値を満たしていき、この値がモデルに入っていて)これをビューに渡せばビューが値を出力する？

13講　サブレットとJSP　JSPとはHTMLコードにJAVAコードを入れて動的ウェブページを生成するウェブアプリケーションツール。JSPとサブレットの違いは結果的に行うことは同じだが、JSPはHTML内部にJAVAソースコードが入ることによりHTMLコードを作成しやすい。

14講　リポジトリ　pageContext＝JSP内部でのみアクセス可能　appliction＝全体リポジトリすべてのクライアント共有。セッション＝クライアント別の個別リポジトリIDや買い物かごセッションはクッキーを利用して保存箱サーバーの負担が一番大きい。最小限のデータだけ保存request＝要請が処理される間だけ存在するため、他のページに移すことも楽でメモリ負担も少ない。

15講　WebServletでサブレットURLパターン　ファイル名>経路>拡張子>デフォルト。スプリング時には、すべての要請をデフォルトで連結されたDispacherServletが受信する。

16講　JSTL=タグライブラリ,Filter=共通して書かれたリクエスト前処理と応答後処理に使用　（ロギング、incodingなど)

17講 @RequestParam リクエストパラメータを繋げる時媒介変数に付けるアノテーション、request=true値を必須入力>例外処理をしなければならない。 必須入力でない場合はdefaultValue="1"を与えなければならない。

18講　@ModelAttibute適用対象をModelの属性で自動的に追加するアノテーション
返還タイプまたはコントローラーマーサードの媒介変数可能参照型に使われる。
コントロールで媒介変数が基本形やStringの場合は@RequestParamが省略参照型の場合は@ModelAttibuteが省略
WebDataBinder入力されたデータタイプを中間逆活路変換させるデータを検証>BindingResultに保存
スールホールの穴あけ

こんなホールは

![写真（2022-06-10 20.06）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/557abc13-7d70-83af-7c2d-221b1786df4e.jpeg)

ハンダ吸い取りだと面倒なので40年位前に買ったミニドリルで開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5f5819ae-c803-5382-1fea-1eb612991c2d.png)

0.6mmくらいの刃で、こんな感じになります。

![写真（2022-06-10 20.09）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/766014a2-f61e-9285-eb91-2820553491a1.jpeg)
突然「スマホアプリも認証サーバと連携して」と言われたら

### 1. はじめに

　上司やお客様から突然「スマホアプリも認証サーバ（Webベースのシングルサインオン系）と連携して」と言われた場合、どうしますか？　まずはWeb上で情報を探す、、、としても、シングルサインオンの分野はアプリ開発自体に比べると関わっている人が少なく、情報が中々見つけづらいものかなと思います。

　というところで本記事では、おすすめ実現案やら試してみた結果やらを書いてみます。
もし記事をお読みくださったら、認証系製品（認証サーバ＆クライアント側モジュール製品）のベンダ候補として、弊社（OSSTech株式会社）も加えていただけますと嬉しいです。


### 2. おすすめ実現案

　さて、、どんな感じでスマホアプリでも認証サーバと認証連携できるようにしましょうか。

　多くの場合、認証サーバ（シングルサインオンサーバ）は、複雑＆多様な認証を実施できるようなWebインタフェースを用意してくれてます。そして、スマホの方ではアプリ本体とブラウザとを連携する仕組みがあります。これら状況を踏まえ、『アプリ本体とブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』という実現案をおすすめします。
<font color="gray">（凄く凄く頑張れば、スマホアプリのコード内にて認証画面を実現して認証サーバとの通信を制御して…、なんてこともできるのかも知れませんが。。コスト的にもセキュリティ的にも、そちらはお勧めしません。）</font>

　『スマホアプリとブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』を図にすると、以下のようなイメージです。なお、弊社（OSSTech株式会社）で扱っている製品名も例示しています;-)

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316192/a310bfe9-f463-84bb-03fa-18f0c3855f50.png)

そもそも普通のWebアプリの認証連携とは…？については、[過去記事群](https://qiita.com/hoshino_osstech)（特に[こちら](https://qiita.com/hoshino_osstech/items/c8514f76f57b528da65d)）にて記していますので、必要に応じてお読みいただければ幸いでございます。


### 3. 試してみた

　理屈としては上記のような案で実現可能、、とは思いつつ実際試してみたことはなかったので、今回試してみました。
　スマホ上でのアプリ／ブラウザ連携にはいくつか方法があるようなので、いくつかメジャーなパターンと思われるものをピックアップして試してみます。結果はこんな感じです。

| # | 試したパターン                                        | FIDO2/WebAuthn対応 | ブラウザからアプリへの戻り方 | 備考 | 
|:---:|:---|:---|:---|:---|
| 1 | iOS x アプリ"上"ブラウザ（WKWebView）                | × | プログラム制御も可能 |  |
| 2 | iOS x アプリ"上"ブラウザ（SFSafariViewController）   | 〇 | Universal Linksが必要 |  |
| 3 | iOS x アプリ"外"ブラウザ（Safari）                   | 〇 | Universal Linksが必要 |  |
| 4 | Android x アプリ"上"ブラウザ（WebView）              | × | プログラム制御も可能 | もうあまり開発されてないようなので、基本的にWebViewではなくCustom Tabs使ったほうが良さそう |
| 5 | Android x アプリ"上"ブラウザ（Custom Tabs／Chrome） | 〇 | App Linksが必要 |  |
| 6 | Android x アプリ"外"ブラウザ（Chrome）              | 〇 | App Linksが必要 |  |

ざっくり纏めるとこんな感じ。
 * 最新の規格化された認証方式「FIDO2/WebAuthn」を利用したい場合、適切なパターンを選ぶ必要がある。
 * その場合、ブラウザからアプリへ戻る方法として、iOSならば Universal Links を、Androidであれば App Links を利用する必要がある。<font color="gray">（Deep Linkはセキュリティ面の懸念があるのでもう使うべきではありません。）</font>

　上記の通り、アプリ"上"ブラウザでもアプリ"外"ブラウザでも実現はできるのですが、、、個人的にはアプリ"外"の方をお勧めします。
　理由としては、アプリ"上"ブラウザの方はデザインや制御について検討・対応しないといけなかったり、ブラウザ部品の仕様追加や変更などあった場合に追従するのが大変そうなので。あと、アプリ"外"ブラウザにすると普通のWebアプリとCookie領域が同じになるのでシングルサインオンになる、という利点もあったりします。


### 4. おわりに

　というわけで、スマホアプリを認証サーバと連携するためのお勧め実現案と、実際に実現を試してみた結果を記してみました。結論としては、
 * お勧め実現案は『アプリ本体とブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』
 * アプリ／ブラウザ連携の方法は複数パターン考えられるけど、お勧めは『アプリ"外"ブラウザとの連携』

でした。
内積「静岡大学2022年後期ＭＡ・ＭＢ第３問」をsympy でやってみた

# オリジナル
b=sqrt(2),c=2,a=2

https://mathmathmass.exblog.jp/31529422/

# 解答の方針
sympyを勉強すると、内積、外心、外接円、余弦定理、ベクトルが同じ？だんだん区別がつかなくなりました。
ニワトリが先か、タマゴが先か状態です。
小問が4つで、それぞれ解法4通り?(T氏様の解答より)さらに、sympyのモジュール4パターン(思い付くところで),
sympyの解き方だけで　全部で4×4×4=約64通り。無理ですね？
そこで、sympyのモジュール4パターンで、解きやすい解法にしました。
もっと短くなるようアドバイスをお願い致します。

# (パターン1)sympyのベクトルモジュールで
T氏様の手順になるべく従っています。
(3)「外心から辺に垂線」
(4)２段階に分けた解答にしています。(参考と別解は使っていません。)
①点Aを原点にしました。
②iとjが消えました。
➂途中、iとjから、solveを使ってベクトルABとベクトルACの1次結合?に変換しました。
④値を最後に代入しました。subsの代入は、最初でも途中でもできるはずです。途中のチェックにも使えます。

```python
from sympy import *
from sympy.vector import CoordSys3D
var('ABx ABy ACx ACy AOx AOy s t r k u v ')
N = CoordSys3D('N')
AB = ABx*N.i+ABy*N.j
AC = ACx*N.i+ACy*N.j
# (1)(2)
my_ABAC =(Rational(1,2)*(AB.magnitude()**2+AC.magnitude()**2-(AC-AB).magnitude()**2)).expand()
my_Area = Rational(1,2)*sqrt(AB.magnitude()**2*AC.magnitude()**2-my_ABAC**2)
# (3)
AO = AOx*N.i+AOy*N.j
my_oxoy =solve([AB.dot(AO-Rational(1,2)*AB),AC.dot(AO-Rational(1,2)*AC)],[AOx,AOy])
AO =my_oxoy[AOx]*N.i+my_oxoy[AOy]*N.j
ans=solve([(s*AB+t*AC-AO).components[N.i],(s*AB+t*AC-AO).components[N.j]],[s,t])
s,t=ans[s],ans[t]
# (4)
AQ = (1-r)*AB+r*AC
AQ =((1-r)*AB+r*AC).subs({r:solve(AQ.dot(AB-AC),r)[0]})
AP=k*AQ
AP=solve(AO.magnitude()**2-(AP-AO).magnitude()**2,k)[1]*AQ
ans=solve([(u*AB+v*AC-AP).components[N.i],(u*AB+v*AC-AP).components[N.j]],[u,v])
u,v=ans[u],ans[v]
# 解答
mySubs={ABx:sqrt(2),ABy:0,ACx:sqrt(2)/2,ACy:sqrt(2*2-(sqrt(2)/2)**2)}
print("#(1)",my_ABAC.subs(mySubs))
print("#(2)",my_Area.subs(mySubs))
print("#(3)",s.subs(mySubs),t.subs(mySubs))
print("#(4)",u.subs(mySubs),v.subs(mySubs))
#(1) 1
#(2) sqrt(7)/2
#(3) 2/7 3/7
#(4) 15/14 5/14
```

# (パターン2)ijを使わない方法。
views数をふやすため、近日？公開予定です。
# (パターン3)
# (パターン4)sympyのgeometryで
こちらの方がイメージしやすいと思います。
①点Oを原点にしました。
②外接円の半径を先に計算して、二等辺三角形を配置し、各点の座標計算です。
➂後は垂線計算、交点計算です。

```python
from sympy import *
var('a b c s t u v')
def herons(a, b, c):
    s = (a+b+c) / 2
    return sqrt(s*(s-a)*(s-b)*(s-c))
b,c,a=sqrt(2),2,2
myS=herons(a,b,c).simplify()
myR=(a*b*c/4/myS).simplify()
myO=Point( 0.0,0.0)
myA=Point(-b/2,-sqrt(myR**2-(b/2)**2))
myB=Point( b/2,-sqrt(myR**2-(b/2)**2))
myC=Point( 0.0,myR)
myst=solve([((myO-myA)-(s*(myB-myA)+t*(myC-myA))).x,
            ((myO-myA)-(s*(myB-myA)+t*(myC-myA))).y],[s,t])
myQ = Line(myB, myC).projection(myA)
myP = Circle(myO, myR).intersection(Line(myA, myQ))[1]
myuv = solve([((myP - myA) - (u * (myB - myA) + v * (myC - myA))).x,
              ((myP - myA) - (v * (myB - myA) + v * (myC - myA))).y], [u, v])
# 解答
print("#(1)",(myB-myA).dot(myC-myA))
print("#(2)",myS,Polygon(myA,myB,myC).area) # Polygonは、大きなお世話でした。
print("#(3)",myst[s],myst[t])
print("#(4)",myuv[u],myuv[v])
#(1) 1
#(2) sqrt(7)/2 sqrt(7)/2
#(3) 2/7 3/7
#(4) 15/14 5/14
```

# 参考

https://docs.sympy.org/latest/modules/vector/index.html

https://docs.sympy.org/latest/modules/vector/api/classes.html#sympy.vector.vector.Vector.dot

https://docs.sympy.org/latest/modules/geometry/points.html
5週目 spring1

南宮城の一行整理
1講　URLが遠隔プログラムを呼び出すと遠隔プログラムWASが必要だが、WASがトムキャットだ8080ポート@Controller@RequestMapping
2講　AWSという実際のサーバーにアップしてみよう。 サーバーにアップロードしないときはインスタンス中止を押しておく終了は押してはいけない
3講　HttpSevletRequest必要なものをメインメソッドに媒介変数宣言すると、トムキャットが勝手に入れてくれるHttpSevletResponseでブラウザに出力する。
4講　動的リソース　値が変わること。静的リソース　ファイル形態で値が変わらないこと。クライアント>サービス要請>サーバ>サービス応答>クライアント
5講　WAS　WebApplicitonService=サーバーにプログラムをインストールしてクライアントがプログラムを使用できるようにするWAS=トムキャットServlet=小さなサーバープログラム
6講　トムキャット設定ファイルconf/server.xml　サーバー設定ファイルconf/web.xml　トムキャットのすべてのサーバーWebapp設定ファイルWEB-INF/web.xml　webappの個別設定
7講　プロトコル=データ形式のルール　http=テキストベースのプロトコルであり、状態やクライアントを保存しないため、クッキーとセッションでセキュリティする。 404クライアントエラー505サーバエラー　get方式URLの後ろにデータ　Post方式ボディにデータが付く
8講　テキストファイル文字　バイナリファイル文字と数字　MIMEバイナリファイルを伝送するためにタイプを明示　Base64バイナリデータをテキストデータに変換する際に64進法で行われる。
グラムシュミットの直交化法

# グラムシュミットの直交化法
グラムシュミットの正規直交化法(Gram–Schmidt orthonormalization)とは基底Xを用いて正規直交行列Uを作る方法である。

以下では
https://manabitimes.jp/math/1149
基底Xを用いて正規直交行列Uを作るとは、以下の意味であるとする。
```math 
u_1 を x_1 の線形結合、\\
u_2 を x_1とx_2の線形結合、\\
u_3 を x_1, x_2, とx_3の線形結合。
```
ここで$u_i$は行列Uの列、$x_i$は行列Xの列である。
グラムシュミットの直交化法は、まさにこの条件で直交する正規ベクトルを順次計算する。

# グラムシュミットの直交化法のmatlabコード

以下のmatlabコードは正規乱数を用いて4x4の行列xを生成し、グラムシュミットの正規直交化法により正規直交行列を得る。結果が正規直交行列であることを確認するため、行列式の値が1であること、$uu'$が単位行列であることを数値計算により示す。

```matlab
N = 4;
x = randn( N );

u = gram( x );
det( u )
u*u'

%
% グラムシュミットの直交化法
%
function u = gram(x)
    u = zeros( size( x ) );
    for i = 1:size( x, 2 )
       tp = x( :,i );
       for j = 1:(i-1)
         tp = tp - tp'*u(:,j)*u(:,j);
       end
       u(:,i) = tp/norm(tp);    
    end
end

```
以上
WordPressでアニクラDJ用のアーティストサイトつくってみた。その4【about ページの制作】



## aboutページを作ろう！

今回は、自分がどういうDJなのかを、わかりやすく紹介するためのページを作成していきます。
イベントや、SNSから来てくれた方に伝わるようにすべく、やっていこうかと。

https://kaira-net.com/about/

![screencapture-kaira-net-about-2022-06-10-13_46_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115918/14fe0162-973f-8e93-1199-4063d88391ce.jpeg)


自己紹介のための内容を作成。ライティングしている中で、自己分析をしながら、まとめていくことが必要だと感じた。

## コンテンツ
- プロフィール
自分が何者であるか、説明するための内容。
- スキルチャート
DJのジャンル、イベント対応など固有のスキルをチャートで表現。
使用したプラグイン

https://ja.wordpress.org/plugins/ichart/

とっても使いやすい。csvファイルなどを使わず、管理画面上からショートコードまで作成してくれる。
ただ、細かなCSSなどは、管理画面側から調整できないのがデメリット。

### 作成してみて
WordPressを細かく使い込もうとすると、CSSやHTMLといったフロントエンドの実装スキルが絡んでくる。そうなってくると、Laravelを利用したり、フルスクラッチで作成した方が柔軟に作り込めるのではないか。

一旦、使えるレベルまでは、仕上げたつもり。今後、隙を見て修正していく予定。


## 次回
- blogページのレイアウト構成
- FAQページのレイアウト構成
- Contactページのレイアウト構成
【GAS】Google Apps Script GitHub アシスタントの導入方法

GASを複数の人で更新したり、更新頻度が高くなる場合はバージョンの管理が必要になってくるかと思います。
そのような時はGithubとGoogleAppsScript(Gas)を連携してバージョンの管理をするのがおすすめです。
そのため、今回はGASのバージョン管理をする拡張機能Google Apps Script GitHub アシスタントの導入方法について解説します。

# 必要なもの
Google Chrome
Google Apps Script GitHub アシスタント
GitHub

# 導入手順
## 1.Chrome拡張機能 「Google Apps Script GitHub アシスタント」の追加
Chromeウェブストアを開き「Chromeに追加」をクリック
https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja


権限を聞かれるので「拡張機能を追加」をクリック

「Chromeに追加」から「Chromeから削除します」に変更されていたら完了

## 2.Githubでaccess tokenを登録
以下URLからGithubにサインイン

ログイン後、右上のユーザーアイコンから「Settings」をクリック

画面左側にある「<>developer settings」をクリック

画面左側の「Personal access token」をクリック

Noteにtoken名を記入、Expirationでtokenの有効期限を設定する

Select scopesは、必要な権限ににチェックを入れる。
GAS GitHubアシスタントでは以下２つの権限が必要なので、それぞれをチェックします。
repo: リポジトリを操作する
gist: gistを作成する

「Generate token」をクリック

「Make sure to copy your personal access token now. You won’t be able to see it again!」が表示されていたら完了
※この表示の下にGithubのトークンが生成されているので、トークンをコピーしておく

## 3.Google Apps Script GitHub アシスタントでGithubの設定
パソコンで Chrome を開き、右上のアイコン 「⋮」 ＞ [その他のツール] ＞ [拡張機能] をクリック

下記の「詳細」ボタンをクリック

「拡張機能のオプション」の外部リンクのアイコン（□と↗️を足した下記ボタン）をクリック

下記ポップアップの記入欄にGithubのユーザー名と作成したGithub access tokenを記載

下記「GITHUB LOGIN」ボタンをクリック

「Logout」ボタンが出たら完了

## 4.GASでリポジトリのプル

自分のローカルからGASを開く
※Googleドライブの「新規」＞「その他」＞「Google Apps Script」

「Repository」タブから、使用したいリポジトリを選択

「↓」タブをクリック

「Pull」をクリック