OmniAICreator/Qiita-1.07M huggingface dataset:
gitの重要性に身を持って確認できた

# 背景
railsアプリを個人開発していて、WEBPACK絡みでかなりハマり、gitの重要性が身に染みました。
gitがなかったらと思うとゾッとします…

# 使用したgitコマンド
##①revert

```terminal
$ git revert　<コミットID>
```
revertはコミットを打ち消すコマンドです。
特徴としては、コミットを消去するわけではなく、指定したコミットと逆のことをするコミットをこの一つのコマンドで作成します。
例えば、一旦追加した機能一度オフにして、後からもう一度追加したい場合などに便利です。

##②log

```
$ git log --oneline
```
revertするには、コミットIDが必要になります。カレントブランチのコミット一覧をこのコマンドで確認できます。
(Qボタンでエスケープできます。)


##③reset

```
$ git reset --hard　<コミットID>
```
指定したコミットIDを消去できます。問題のあったコミットを削除する際に便利です。


##④checkout 

```
$ git checkout -b ブランチ名
```
指定したブランチ名への切り替えと作成を同時に行ってくれます。

##⑤status 

```
$ git status
```
カレントブランチやワーキングツリー（ステージング前の変更されたファイル）、コミット待ち(ステージングされたもの)の情報を見ることができます。

# 反省点
これまでコミットの中身が滅茶苦茶でした。git revertする上で、これが本当に厄介でした。
それを踏まえて、今後は下記に注意してコミットする。
・コミットのメッセージとコード変更点は関連のあるものだけにする。
・機能実装と環境関係の変更を同じコミットに含めず、分ける。
・必ず、ブランチを切って作業する。
・切られたブランチ内のコミットもブランチと関連性のあるものだけにする。
.不具合がでている時はコミットしない。
rails viewについて復習する

##はじめに
ある程度プログラミングの理解が進んできたところで備忘録と復讐を兼ねて振り返ることにした。
viewからviewに移動するやり方を書いていく。

###link_toの使い方
rails routesコマンドを実行するとこんな感じで出てくると思う。
![rails routes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927542/bfd96a37-7bda-f7d6-0555-fdf0a6890076.png)
この画面からPrefixを確認することができる

```
link_to 'リンク名', 'Prefix名 + _path'
```
・viewヘルパーという
・htmlを自動で作成してくれる (href作成をしてくれる)

○リンク名
⇨viewに文字列として表示したことを記述

○'Prefix名 + path'
⇨rails routesのPrefixを使用する (pathが必要)


####【id付きURLパターン時の書き方】
・Prefixに紐づくURLパターンに着目
・URLパターンに :id のような一意に定められない変数が含まれることがある

・*一意に定められるとは要するに他に可能性があるかどうか。1パターンしかあり得ない場合は一意に定まるということになる。
・*(一意に定まる時は,上の記述のみでOK)
・*(一意に定まる時でもidを持たせても多分いけると思う)


・この場合,'Prefix + _path + (each do | | で生成した値)' と記述
・each do | | で生成した値は,インスタンス変数から生成
・*(インスタンス変数はcontrollerで生成ずみの前提)

私のポートフォリオで言うと

```
      <% @songs.each do |song| %>
        <table class="detail-table">
          <tbody>
            <tr>
              <th class="user-show-detail-song">アーティスト名</th>
              <th class="user-show-detail-value">曲名</td>
            </tr>
            <tr>
              <td class="user-show-detail-song"><%= song.artist %></td> 
              <td class="user-show-detail-value">
                <%= link_to song_path(song.id) do %>
                  <%= song.title %>
                <% end %>
              </td> 
            </tr>
          </tbody>
        </table>
       <% end %>
```

・このインスタンス名songには、インスタンス変数@songsの複数のキャッシュが格納されていく
・column名 =id となる値を URLパターンの :id へ変換
・urlの:idところに引数の:id を含んだ形で記述したことになる
systemdでslurmがエラーになる場合の対処方法

## ubuntu20.04にslurmをいれてみたのだが、うまくいかない。
systemdでslurmを立ちあげた際にエラーが出たのですがその時の対処法を記載。
なお、インストール方法全体については下記にまとめてます。
[ジョブスケジューラーslurmをUbuntu20.04＠wls2にインストールして、テストする。](https://qiita.com/egoo/items/b21fb0c6ed828756c5f4)

お役に立てたら、LGTMよろしくお願いします。

## エラーを確認する

```bash
$ systemctl status slurmd.service
#実行結果
● slurmd.service - Slurm node daemon
    Active: failed (Result: exit-code)
    Process: 38766 ExecStart=/usr/local/sbin/slurmd -D $SLURMD_OPTIONS (code=exited, status=1/FAILURE)
```
failになってます。
Process欄に、/usr/local/sbin/slurmd -D $SLURMD_OPTIONSとコマンドがあるので、それを直で実行します

## エラーケース１

```bash
$ sudo /usr/local/sbin/slurmd -D $SLURMD_OPTIONS
#実行結果
slurmd: error: Node configuration differs from hardware: CPUs=1:6(hw) Boards=1:1(hw) SocketsPerBoard=1:1(hw) CoresPerSocket=6:6(hw) ThreadsPerCore=1:1(hw)
slurmd: CPU frequency setting not configured for this node
slurmd: error: cgroup namespace 'freezer' not mounted. aborting
slurmd: error: unable to create freezer cgroup namespace
slurmd: error: Couldnt load specified plugin name for proctrack/cgroup: Plugin init() callback failed
slurmd: error: cannot create proctrack context for proctrack/cgroup
slurmd: error: slurmd initialization failed
```
1行目で、ハードウエア情報と設定されている値が違う、と言っています。
CPUs=1:6(hw)　←物理CPU数のことかと思い、1と設定しましたが、6と設定しろと言っています。
ちなみに、このPCは1CPUに6コアある計算機です。
コメントに合わせて、/usr/local/etc/slurm.confの最終行を修正します。

## エラーケース２

```bash
$ sudo /usr/local/sbin/slurmd -D $SLURMD_OPTIONS
#実行結果
slurmd: CPU frequency setting not configured for this node
slurmd: error: cgroup namespace 'freezer' not mounted. aborting
slurmd: error: unable to create freezer cgroup namespace
slurmd: error: Couldnt load specified plugin name for proctrack/cgroup: Plugin init() callback failed
slurmd: error: cannot create proctrack context for proctrack/cgroup
slurmd: error: slurmd initialization failed
```
2～５行目で、proctrack/cgroupがエラーと言ってます。
[公式](https://slurm.schedmd.com/slurm.conf.html)を確認すると、X11だと ProctrackType=proctrack/linuxprocにしろ、と書いてあります。
これをもとに、
ProctrackType=proctrack/cgroup
を
ProctrackType=proctrack/linuxproc
に変更します。

## エラーケース3
上の二つはslurmdでしたが、slurmctld の場合。

```bash
$ systemctl status slurmctld.service
#実行結果
● slurmctld.service - Slurm controller daemon
     Loaded: loaded (/etc/systemd/system/slurmctld.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2021-01-0! 07:07:07 JST; 13s ago
    Process: 342025 ExecStart=/usr/local/sbin/slurmctld -D $SLURMCTLD_OPTIONS (code=exited, status=1/FAILURE)
```

直で実行してみる

```bash
$ sudo /usr/local/sbin/slurmctld -D $SLURMCTLD_O
#実行結果
slurmctld: fatal: Incorrect permissions on state save loc: /var/spool
```

アクセス権がないのが問題っぽい。
slurm.confのユーザーをroot以外にした場合に発生。
rootを有効にしてrootで実行でもよいのだが、極力避けたいので、
下記の記事を参考に、slurm.confの下記を書き換える。
http://www-fps.nifs.ac.jp/ito/memo/slurm01.html

```bash:slurm.conf
#SlurmdSpoolDir=/var/spool/slurmd
SlurmdSpoolDir=/tmp/slurmd

#StateSaveLocation=/var/spool
StateSaveLocation=/tmp
```

##slurm.confを修正した後
下記のコマンドで再起動 & 確認してください。

```bash
# 再起動
$ sudo systemctl restart  slurmd.service
$ sudo systemctl restart  slurmctld.service
# 確認
$ systemctl status slurmd.service
$ systemctl status slurmctld.service
```
[Android]Realmってなんか名前かっこいいから、良く分からないけども使ってみる

#Realmってかっこ良さそう！なんそれ？編
普通、クラスで宣言された文字や数値はアプリ（画面）を開く度に初期化されます。
なので、アプリで特定のデータを保存しようと思ったら、データベースを使う必要があります。
データベースは、アプリを利用している時だけでなく、消した後も保存されるのです。

そのデータベースの一種が、Realmというわけです。

ちなみに、今回使うRealmはローカルデータといってアプリ内でデータを保存することができるのですが、アプリ自体をアンインストールしてしまったら、保存されたデータを使うことはできないのでそこだけは注意です。
#Realm使っちゃう編
早速使ってみます。今回は、本当にシンプルに文字を保存して、それを取り出すだけのシンプルな実装でいきます。データベースと言っても、箱みたいなもんですね。それと、正確さに欠けている部分アリの自信があるので、優しく指摘してくれると幸いです。それと、Fragmentでの実装すまぬ。

######使うための準備
```gradle
//appの方ね
plugins {
    id "kotlin-android"
    id "kotlin-kapt"
    //kotlin-androidの後に書くように！(だった気がする)
    id "realm-android"
}
```
```gradle
//projectの方のね
    dependencies {
        classpath "io.realm:realm-gradle-plugin:6.0.2"
    }
```








#####Realm召喚

 ```kotlin
class MyApplication(): Application() {

    override fun onCreate() {
        super.onCreate()
        
        //ここでRealmを召喚！
        Realm.init(this)

        //箱に入れる値の種類を増やしたり、型を変更したりするときに、色々面倒なので。
        val realmConfigration = RealmConfiguration.Builder()
            .deleteRealmMigrationNeeded()
            .build()
        Realm.setDefaultConfiguration(realmConfigration)

    }
}

```

```kotlin
open class Text (
    //Realmにtextを入れるよ！の意
    @PrimaryKey var text: String = ""
): RealmObject()
```

```kotlin
class MyFragment: Fragment() {

    private lateinit var realm: Realm
    val kotlin : String = "小鳥ん"

    //・・・・省略

    //追加
    lifecycleScope.launch(Dispatchers.IO) {
    realm.beginTransaction()
    realm.insert(Text(kotlin))
    realm.commitTransaction()
    realm.close()
    
    //・・・・省略

    //中身取り出し
    val textBox = realm.where<Text>().findAll()?.last()?.text.toString()

  }
}
```

#お詫び編
今回は、自作ポートフォリオで無理やりRealmを使おうという魂胆でしたが、やっぱりRealm使う必要ないわ――と思い、ただ折角実装したのでどこか勿体ない気がし、じゃぁ記事に残そう！と思い、書こうと思いました。

この記事を見てRealmを実装しよう！と試みても中々思った挙動通りにいかなくて、イライラかと思います。
自分自身、兎に角最低限なものをシンプルに書いて、誰でも簡単に実装できるようにと思いましたが、やっぱり難しいですね。

よく、リファレンス等を参照して実装するときに、思った通りに行かないこと多々あって、色々いじくった挙句やっと実装出来たりすることがあります。
その際、もっと分かりやすく書けや！と心の中で叫びます。

しかし、普遍的な実装手順を書く難しさって、書いてみて分かるものがあります。
他のネット上の記事は、皆分かりやすいです笑。

この記事より1000倍は分かりやすい記事達（最初から出せや！）

https://qiita.com/nozaki-sankosc/items/35516da505ca4f0655ec

https://qiita.com/TaigaNatto/items/3093e570ac107e0ab221#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%85%A8%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80
[Rails Error] ActiveRecord::PendingMigrationErrorの解決方法

#エラーの原因
PendingMigration
移行保留中　＝　migrateし忘れていますよ〜

`rails db:create` のあと `rails db:migrate` し忘れている可能性があります。

#解決方法
以下を実行してデータベースにデータを反映させましょう。

```
$ rails db:migrate
```
AWSの「CloudWatch」とは？

今回はAWSのCloudWatchについて学習したことをアウトプットさせて頂きたいと思います。

##CloudWatch
CloudWAtchとは、簡単に説明するとAWSの監視マネージドサービスのことです。
AWSリソースの状態をチェックできるサービスになります。
例えば、EC2のCPU使用率が90%を越えた場合にアラートメールを送る事ができたりします。
また、アラート通知に合わせてアクションも簡単に設定することができます。

**CloudWatchには、①収集、②監視、③アクション、④分析の機能があります。**

- **①収集**
こちらはECSやRDSなどAWS各種サービスのCPU使用率をはじめとする様々なステータスを取り扱うことができる機能です。この収集する情報の事を**「メトリクス」**と呼びます。

- **②監視**
収集したステータスを監視しAlarmを設定します。
例えば、CPU使用率が90%を越えた場合だとアプリケーションが安定稼働しないため、
監視する機能も大切になります。
Alertが動く条件ラインの事を**「閾値」**と呼びます。

- **③アクション**
アラームが動いたら、それに基づいてアクションの設定ができます。
例えば、SNSトピックを発動させる設定ができたり、このSNSトピックにメール通知を行うができたりします。また、通知だけでなくEC2のAutoScalingを発動させたり、EC2アクションの変更（停止、削除、再起動）などを設定することも可能です。

- **④分析**
収集した情報をダッシュボードで可視化してグラフから分析する機能もあります。

###CloudWatchを使いべき理由
詳細は割愛しますが、以下のようなメリットがあります。

- 自動でメトリクスを収集できる
- 従量課金性
- 高解像度の監視が可能
- オンプレも監視が可能


###メトリクス
メトリクスをとは、上記でも少しだけ触れましたが、CloudWatchで収集した情報のことです。
メトリクスの種類には**標準メトリクス**と**カスタムメトリクス**の2種類があります。

**標準メトリクス**
予めAWSが用意したメトリクス
（例：CPU使用率、NWパフォーマンスなど）

**カスタムメトリクス**
ユーザーが設定したメトリクス（例：メモリ使用率など）
**※カスタムメトリクスを収集するには、まずCloudWatchエージェントをサーバーにインストールする必要があります。**
以下がカスタムメトリクスを設定する使用条件です。

- CloudWatchエージェントをEC2にインストールする<br>CloudWatchエージェントをAWSの公式のS3バケットに保存されているので、そちらからインストールを行います。

- EC2にIAMロールをアタッチする<br>EC2はそのままだとCloudWatchに情報を送信する権限を持っていないので、CloudWatchエージェントポリシーというようなIAMロールをアタッチする必要があります。

- 適切なネットワークルートを設定する<br>例えばEC2がPrivateサブネットに設置されていると、メトリクスを送りつけるルートがないとVPCエンドポイントを考慮して適切なネットワークルートを設定する必要があります。


アラート評価
３つの評価基準で構成されています。

- Period ・・・ 評価間隔
- Evaluation Period ・・・ 直近、何個のPeriodを評価対象とするか
- Datapoints to Alarm ・・・ 評価対象のうち、何個のPeriodが闘値を超過したか

###まとめ
AWSのCloudWatchとは、**AWSの監視マネージドサービスになります。**
機能としては、**①収集、②監視、③アクション、④分析**の４つの機能があります。
CloudWatchで収集した情報のことを**「メトリクス」**と呼びます。
メトリクスには、AWSで予め用意された**標準メトリクス**とユーザーが設定した**カスタムメトリクス**の2種類があります。
カスタムメトリクスを設定するためには、**CloudWatchエージェントをサーバーにインストール、EC2にIAMロールをアタッチ、適切なネットワークの設置**が必要になります。
メトリクスの内容をもとに発動するアクションを**Period(評価間隔)、Evaluation Period（直近、何個のPeriodを評価対象とするか）、Datapoints to Alarm(評価対象のうち、何個のPeriodが閾値を超過したか)**の３つの評価基準に沿って取り決めることで、ネットワークの障害を防止することができます。また収集した情報をグラフ形式で表示し、いつでも分析することができる大変重要なサービスの一つになります。


この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
【Python】scikit-learnを用いたSVM(Support Vector Machine)の実装 

#Purpose
Making a model to classify handwritten numbers (0~9) by SVM

#Env
- OS : Mac
- Module : scikit-learn
- Lang : Python


#Get character dataset from scikit-learn
You can get handwritten numbers (images) from scikit-learn.
You can check contents of the dataset.

```python
from sklearn import datasets

# Read handwritten dataset
digits = datasets.load_digits()

# You can check the image as you want with matplotlib
import matplotlib.pyplot as plt
plt.matshow(digits.images[0], cmap="Greys")
plt.show()
```
Sample (0 and 8)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/6196d041-0768-4928-1142-6302497a0b24.png" width=300><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/129207c2-7731-e87e-9eab-3870d4f5877d.png" width=300>

#From image to array
Since SVM can not directly read the images, therefore we need to convert each the image into array dataset. You can change the data to array by `[object].data`.

```python
# array of each image
X = digits.data
# label of each image
y = digits.target

# split train and test data
# Train data (even)
X_train, y_train = X[0::2], y[0::2]
# Test data (odd)
X_test, y_test = X[1::2], y[1::2]

# you can check the train data
print(X)
print(y)
```

Content of the Train data (arrays (image))
numbers in each array mean darkness of square. 
`black > gray > white`


```
[[ 0.  0.  5. ...  0.  0.  0.]
 [ 0.  0.  0. ... 10.  0.  0.]
 [ 0.  0.  0. ... 16.  9.  0.]
 ...
 [ 0.  0.  1. ...  6.  0.  0.]
 [ 0.  0.  2. ... 12.  0.  0.]
 [ 0.  0. 10. ... 12.  1.  0.]]
```

Content of the train data (label)

```
[0 1 2 ... 8 9 8]
```

#Make a model
Make a model with train data.

```python
# select SVM
from sklearn import svm
clf = svm.SVC(gamma=0.001)

# train the model with train data
clf.fit(X_train, y_train)
```

#Test
Evaluate the created model with test data.

Return accuracy

```python
accuracy = clf.score(X_test, y_test)
print(f"Accuracy:{accuracy}")
```

```
Accuracy:0.9866369710467706
```

Return prediction of each test data

```python
predicted = clf.predict(X_test)
```

```
[1 3 9 7 9 1 3 5 7 9 1 3 5 7 9..... 9 4 7 3 1 0 2 8 0...]
```

You can check detail (precision/recall/F-score)

```python:
import sklearn.metrics as metrics
print("classification report")
print(metrics.classification_report(y_test, predicted))
```

```
classification report
              precision    recall  f1-score   support

           0       1.00      0.99      0.99        88
           1       0.98      1.00      0.99        89
           2       1.00      1.00      1.00        91
           3       1.00      0.98      0.99        93
           4       0.99      1.00      0.99        88
           5       0.98      0.97      0.97        91
           6       0.99      1.00      0.99        90
           7       0.99      1.00      0.99        91
           8       0.97      0.97      0.97        86
           9       0.98      0.97      0.97        91

    accuracy                           0.99       898
   macro avg       0.99      0.99      0.99       898
weighted avg       0.99      0.99      0.99       898
```
このAppは、整合性を確認できなかったためインストールできません。

App Distributionで配布していたipaが以下のエラーを出力しインストールできなくなってしまった。

```
このAppは、整合性を確認できなかったためインストールできません。
```

正確には、インストールはできているのかもしれないが、アイコンをタップすると、このエラーが表示されアプリが起動できないという現象。

# 原因
distribution用証明書の期限が切れていたのが原因でした。証明書を更新して配布し直せば問題なく利用できます。

# すでにアプリがインストール済みの場合
はアプリアイコンをタップすると以下のメッセージが表示され、アプリが起動できません。
```
〜はもう利用できません
```
javasciptで非同期関数を処理する同期関数のテストをしたい

## はじめに
テストツールはjestです。

## テストしたいコード
```javascript
export let text = "hoge";
const asyncFunc = async () => {
  await new Promise((resolve) => {
    console.log(text);
    // hoge
    resolve();
  });
  text = "fuga";
  console.log(text);
  // fuga
};

const testFunc = () => {
  asyncFunc();
  console.log(text);
  // hoge
};
export default testFunc;
```

`testFunc`の中で非同期関数の`asyncFunc`が実行されています。

`testFunc`が実行されると、非同期で`text`の値が`hoge`から`fuga`に変わることをテストしたい。

## テストコード
失敗例

```javascript

test("testFunc", async () => {
  testFunc();
  expect(text).toBe("fuga");
});

```
このテストだと失敗します。
`text="fuga"`を実行している`asyncFunc`が非同期だからですね。

成功例

``` javascript

test("testFunc", async () => {
  testFunc();
  expect(text).not.toBe("fuga");
  return new Promise((resolve) => setImmediate(resolve)).then(() => {
    expect(text).toBe("fuga");
  });
});
```
これでテストが成功します。

Promiseを返すと、jestはPromiseが解決されるまで待機します。
つまり、`setImmediate`が終わった後に`expect(text).toBe("fuga")`が実行されているということになります。

## なぜ、setImmediateなのか
jestはNode.jsで動作しています。
Node.jsのイベントループでは、`setImmediate`が最後に実行されます。

Node.jsのイベントループについてはこちらを参照
https://blog.hiroppy.me/entry/nodejs-event-loop
コロナ禍でのVPNの容易な導入

最近SASEが流行っている中、ネットワーク屋さんとしてはSIG連携が流行ってますね。
CiscoのUmbrellaやPaloltoのPrismaaccessとか。
コロナ禍のテレワークでもこれらを使用することでセキュアにインターネットに接続できる他、
自社へも簡単に接続することができます。
今までは自社へのVPN構築するために認証基盤を作成したり、
ワンタイムパスワードなどの多要素認証の構築に四苦八苦してましたが、
簡単に多要素認証できてしまうことに驚きを隠せません。
これらのサブスクリプションのSASEサービスを利用することで、
イニシャルコストをおさえて、VPNを容易導入できると考えます。
プログラミングスクールの実態

#前置き
スクールを検討している方へ参考になれば幸いです。
特定の個人や団体に対する誹謗中傷はご遠慮ください。
一個人の意見なので鵜呑みにせず、自身で見極めてください。
#結論 スクールは行かない方が良いです 
##この記事で一貫して述べてることはスクールで得られるものが本当に７０、６０万の高額な受講料に見合った内容ですか？？という事です。
スクールでする学習内容より参考書やudemyなどを使った方がコスパが良いです。（就職するまで学習費に１０万かからないと思います。）分からないところはメンタなどを使えば良いと思います。現在自分で求人を探す人がほとんど。中にはスクールに頼って自分から動かない人もいるみたい。返金保証は複雑な条件を付けてるし保証されないのが実態。転職保証もスクールが紹介するところへ行かなければならない。
#そもそも論
そもそもプログラミングスクールの大半が学習塾のようなものではなく人材紹介ビジネスです。`受講料　＋　紹介料`で利益を出しています。現在未経験から入社するのが厳しく、ほとんど自分で探して就職する人が多い中、現在このビジネスが成り立っているのでしょうか？
#よくある反論１　
##未経験は最初の進め方など、どうしたらいいかわからない。１から自分で調べるよりからスクールのカリキュラムの通りやるほうが効率が良い。


###→完全に情弱です。
たしかに全くの初心者で１から自分で調べて試行錯誤してやるのは相当大変です。スクールのカリキュラムに沿ってやるのは楽でした。
しかし、`プログラミング　初心者　独学　勉強法`でググれば一時間もあればだいたいのロードマップは検索できるはずです。しかも独学で検索するとUdemyやTechpitなどのサイトも当然ででてくるはずです。
Qiitaで調べれば、大半のことは出てきます。分からないところは`MENTA`であったり`teratail`なども活用できます。

#よくある反論２　返金保証とか転職保証があるから。

###→複雑な条件があり、ほとんど保証されません。（かなり悪質）入る前に説明されることはない。本当に情弱の搾取です。
転職保証に関しては自分が興味のない企業の面接にも参加しないといけないため、双方によくないと思います。参加しないと保証対象外になるスクールもある。
#よくある反論３　転職の書類とかもスクール側が応募してくれる
###→おそらく受講料にこの転職サポートという名の人材派遣が含まれており、お金が非常にもったいないです。
本当に自分で行えるのでお金の無駄すぎる。自社を紹介してもらえるのなら素晴らしいですが、現在スクールからの紹介で自社に入社したひとなんているのでしょうか？？？
現在、自分で応募して就職している方が大半です。なかには自分で行動せず頼る人もいる。
#よくある反論４ チーム開発やコミュニティができる
###→Twitterで自分から募集したり積極的に行動すれば可能ではないですか？？
たしかにスクールを通じてコミュニティは広がりましたが、それは高額な受講料に見合ったものではないです。
Twitterでチーム開発の募集をしているひともいるので自分から行動すれば可能であると思います。





###
#最後に
スクールに入る前にカリキュラムが本当に高額な受講料に見合ったものであるか判断してください。
この記事をみればほとんどの人がスクールに通うのを躊躇すると思いますが、情弱（自分も含めて）の人はこの記事にたどり着かないと思いますが、Twitterなどで拡散してもらえるとありがたいです。
未経験からのAWS SAP合格記

#はじめに
AWS認定ソリューションアーキテクトプロフェッショナル（AWS SAP）に合格したので記録として残します。

#動機
業界未経験でインフラ系のSES企業に転職し、1年経ちました。
3ヶ月から半年で現場が変わる旨を伝えられていましたが、なんだかんだで1つの現場にずっと常駐しています。

AWSの有識者がいない現所属チームに貢献したい思いから取得したAWS SAAでしたが、
よりAWSの知識を身につけたいと考え、SAAの上位資格を取ろうと考えました。

#学習前のスキル
CCNAとAWS SAAを保有しています。
業務ではEC2とRDSを触る機会がおおいです。

#結果
AWS SAA取得には苦戦に苦戦し、5回も受験しました。。非常に辛かった。。（精神的にもお財布事情的にも）

今回は何が何でも1発で取得すると固く誓って勉強に励んだ結果、無事1発合格しました！！
1000点満点で750点以上で合格です。

####2021年2月
798/1000

#勉強方法
ネットにあふれる合格体験記を片っ端から読み漁り色々と試しましたが、とりわけ下記が役立ちました。

1. [サービス別資料 | AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
定番のBlackBeltです。勉強中、知らないサービスが出てきた際はまずはBlackBeltで概要を理解するよう努めました。
Youtube動画があるものはなるべく見るようにしていました。

2. [AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/aws-exam2/)
AWS SAAのときは全然利用しなかったのですが、とにかく問題に慣れたかったので購読しました。
解説をしっかりと読み込むだけではなく、参考サイトのリンクもすべて読みました。

3. [AWS ホワイトペーパーとガイド](https://aws.amazon.com/jp/whitepapers/?whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc&awsf.whitepapers-global-methodology=methodology%23well-arch-framework)
Well-Architectedフレームワークの資料を1通り読みました。AWSの考え方を知ることで、問題を解くときの手がかりを見つけ出すことができました。

1→2→3の順に有用だったと個人的に感じています。

#所感
試験中は頭が段々と回らなくなっていく感覚に襲われました。
1問1問がとにかく長く、英語の誤訳も散見。。
他の方の体験記を読み漁っていたので覚悟はしていましたが、想像以上に頭を使いました。

常識かもしれませんが、試験中はショートカットキーがめちゃくちゃ有用でした。
とにかく時間がないので使っていない方は是非！！

・ alt + f ：あとで見直す
・ alt + n ：次へ進む

#今後
残りのアソシエイト資格（SysOpsアドミニストレイターとデベロッパー）を取得してから、DevOpsエンジニアプロフェッショナルを取得したいと考えています。
AWSを使った仕事に今後も携わりたい気持ちが強いです。所属している会社はAWSに力を入れているわけではなく、たまたま派遣先でAWSを触る機会に恵まれました。
信じられないかもしれませんが、所属会社からは転職を前提に働くようにと入社前から説明を受けているので、転職を視野にスキルアップしていきたいです。
Nodeのバージョン管理ツールVOLTA⚡

## WindowsのNodeバージョン管理を探して三千里

みなさんWindowsのNodeのバージョン管理ってどうしてますか？

私はNodistを使っていたのですが、WSL環境と相性が悪い（npmのコンフィグが一部Windowsのパスと混在して壊れた）ので、ひとまずWinもLinuxも同じ管理ツールがないものか、と探していたところ、VOLTA⚡がRustで書かれていて早いしマルチプラットフォームだぞ、ということで使用してみました。

## VOLTA Install

新進気鋭なためか、MS開発の新進気鋭のパッケージ管理ツールWingetや毎度おなじみChocolateyには残念ながら対応していません。

そういうわけで[GitHubからインストールしよう](https://github.com/volta-cli/volta/releases)。.msiファイルで良いでしょう。

今回入れたバージョンは1.0.1。メジャー昇格おめでとう。みたいなタイミング。

## Node Install

他のNodeバージョン管理ツールに付いているような現在のNodeのリストをババーンと列挙するコマンドはないようです。

### NodeのLTSをインストールもしくは別バージョンからセット
```cmd
C:\>volta install node
```

### Nodeの最新版をインストールもしくは別バージョンからセット
```cmd
C:\>volta install node@latest
```

インストールしたい時とバージョンをセットしたい時、どちらもinstallで行うのがシンプルで漢らしい感あります。

## Yarnの最新版をインストールしたい
```cmd
C:\>volta install yarn@latest
```
npmやYarn、pnpmあたりのツールもinstallコマンドでインストール可能。

（npmはnodeと共にインストールされます）


### 現在インストール済みのNode（とツールチェイン）を確認するとき
```cmd
C:\>volta list all
```

### プロジェクトでバージョン指定するPin止め
```cmd
C:\Project>volta pin node@10.15
```
pinってのがモダンなツールっぽいおしゃれ感あります。

このコマンドを使用するとpackage.jsonにvolta向け設定が記載されます。

voltaを使用しているメンバーがこのプロジェクトをデプロイする際、自動で指定したバージョンがインストールされ、使用される仕組みです。自然な流れでいいですね。

この指定方法、そろそろNodeパッケージ管理ツール界隈で合わせてもらいたいよねー、とか思っちゃう今日この頃。

### インストールしちゃったnodeのアンインストール
```cmd
C:\Project>volta uninstall node
error: Uninstalling node is not supported yet.
```
helpには「The tool to uninstall, e.g. `node`, `npm`, `yarn`, or \<package\>」って書いてあるけど、現状アンインストールできないようです。

アンインストール手段はあって[GitHubでサポートされてました](https://github.com/volta-cli/volta/issues/855#issuecomment-713218171)。
サマって訳すと

> ~/.volta/tools/image/node/ (Windows上は%LOCALAPPDATA%\VOLTA\tools\image\node\)配下のバージョン番号ディレクトリーを消せばおk

という感じで。

### WebStormに設定する実体
（追記：2022/06/29）
WebStorm2022.1からVoltaの機能が強化され、pnpm等のツールパス `~/.volta/bin/pnpm` に対応しました。
下記のimage配下の実体への設定は不要になっています。

https://www.jetbrains.com/webstorm/whatsnew/2022-1/#:~:text=will%20work%2C%20too.-,Support%20for%20Volta,-In%20this%20release

（追記: 2021/02/13）
```
~\AppData\Local\Volta\tools\image\packages\pnpm\node_modules\pnpm
```

WebStormでpnpm等のパッケージ管理ツールのパスを設定するとき、自動で読み取ります。
また、WebStormはコマンドラインを自動生成するとき、bin/pnpm.jsを叩きます。そのため、自動で抽出してきたパスの場所がずれると、動作しません。

VOLTAが設定するグローバルなツールのパスは `~/.volta/bin/pnpm` です。
このファイルの中身はコマンドが書いてあり、実質的にはショートカット的な働きになっています。そして、このファイルの配下にはpnpm.jsは存在しないのです。

上記のパスはpnpmの例ですが、他のツールの場合もpackages配下を確認してください。

## まとめ
使用感としては軽快で扱いやすいです。

シンプルなコマンド体系ですが、逆に大量のコマンドを覚える必要はなく、VOLTAがやれることに集中できるという選択のためで、そういった面もまた扱いやすさになってますね。

気に入ったのでしばらくはWindowsもWSLもVOLTA使っていきます。

VOLTAの現場からは以上でーす。

## 参考
https://volta.sh/
https://github.com/volta-cli/volta
アプリケーションを動作させる

###.envの設定
以下のコマンドを実行する

```bash
$ cp .env.example .env
$ vi .env
```

.envファイルに下記の設定を行っていく。

|項目名|値|
|----|----|
|APP_NAME|アプリケーション名|
|APP_ENV|production|
|APP_DEBUG|false|
|APP_URL|実際のURL|
|DB_HOST|RDSデータベース詳細画面の[エンドポイント]|
|DB_DATABASE|作成したデータベース名|
|DB_USERNAME|作成したユーザー名|
|DB_PASSWORD|作成したパスワード|

最後にAPP_KEYを自動更新する

```bash
$ php artisan key:generate
```

問題なければ.envのAPP_KEYに値が入っている

###マイグレーションを実行

```bash
$ php artisan migration
```

途中の質問にYESでOK

完了したら指定したURLでアクセスできるか確認
Splunkクラスタ関連のコマンド

ざっと挙げてみました。

./splunk edit licenser-localslave -master_uri https://192.168.0.2:8089 -auth admin:takebashi
./splunk restart

./splunk edit cluster-config -mode master -replication_factor 3 -search_factor 2 -secret idxcluster -auth admin:password

./splunk edit cluster-config -mode slave -master_uri https://192.168.0.1:8089 -replication_port 8080 -secret idxcluster -auth admin:password 
./splunk enable listen 9997 -auth admin:password

./splunk edit cluster-config -mode searchhead -master_uri https://192.168.0.1:8089 -secret idxcluster -auth admin:password
Githubのリポジトリにプルリクテンプレートの入れよう

.gitのあるディレクトリに、`.github/PULL_REQUEST_TEMPLATE.md`ファイルを作成することで、github でプルリクテンプレートを設定することができます。

```.github/PULL_REQUEST_TEMPLATE.md
# 概要

# 対応

# 動作確認

# スクショ
### 変更前

### 変更後

# チェックシート
- [] テストが通っていること
- [] 動作確認済みであること

```

こんな感じで、テンプレートが表示されます。
とても便利ですね。
![スクリーンショット 2021-02-07 20.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/abdc7a1e-7235-3db5-79b4-656d2df85409.png)
Git stashを使って作業を一時避難させる！

# スタッシュして作業を一時避難させる

作業が途中でコミットしたくないけど、急遽作業しないといけなくなった (急なバグ修正など...)
そういうときに作業を一次避難させておくことができます。
それがstashと呼ばれる作業です。
*※stash とは隠すという意味*

それではstashの基本的な使い方を紹介していきます！


## 変更をstashする
```
// ワークツリーとステージを避難させる
git stash
```
変更をstash に一時格納。

ワークツリーとステージの変更をなかったことにすることで別作業を可能にする



## stashした作業を確認する

```
git stash list
```

全ての避難させた作業が表示される
stash@{} がスタッシュ名となっている



## stashした作業を復元する

```
// 最新の作業を復元する
git stash apply

// ステージの状況も復元する
git stash apply --index

// 特定の作業を復元する
git stash apply スタッシュ名
例
git stash apply stash@{1}
```


## stashした作業を削除する

``` 
// 最新の作業を削除する
git stash drop

// 特定の作業を削除する
git stash drop スタッシュ名

// 全作業を削除する
git stash clear
```
備忘録　PHP　クラス　インスタンス　プロパティ


```php:index.php
<?php
class Menu {   //Menuクラスを定義　クラス名は大文字で始める クラス（設計図）//
public $name //プロパティ（インスタンスが持つデータ）を定義//
  }

$fish = new Menu();  //インスタンス（実体）を生成　生成したインスタンスを変数$fishに代入　インスタンスの生成はクラスの外で行う//
$fish->name = 'FISH';  //プロパティに値をセット（プロパティ名に$は不要）//
echo $fish->name;  //セットした値にアクセス（$は不要）//
//結果:　FISH
?>
```
Visual Studio Code の Remote SSH でリモートマシンをコマンドライン指定で開く

# Visual Studio Code の Remote SSH でリモートマシンをコマンドライン指定で開く

[Visual Studio Code の Remote SSH で Linux 上のファイルを直接編集する](https://qiita.com/m-tmatma/items/f3cc666c2e667adab784) の記事でリモートマシンにあるファルダ/ファイルを編集する方法を紹介しました。

コマンドライン指定で直接 リモートマシンおよび、リモートマシン上のフォルダ/ファイルを開くことができるので紹介します。

## 前提知識

https://qiita.com/m-tmatma/items/f3cc666c2e667adab784 で記載しましたが、

`C:\Users\winuser\.ssh\config` に以下のような設定をしているはずです。

```
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host alias
    HostName hostname
    User user
    IdentityFile C:\Users\winuser\.ssh\id_rsa
````

この設定の `Host alias` の部分で指定している `alias` の部分が Vscode 状で見えるホスト名であり、この記事で指定する `<マシン名>` です。


## 方法1 (フォルダ/ファイルを指定せず、リモートマシンに接続するだけ)

```
code --remote ssh-remote+<マシン名> <パス>
```

## 方法2 (フォルダ/ファイルを指定して、リモートマシンのファルダ/ファイルを開く)

```
code --remote ssh-remote+<マシン名> <パス>
```

## 例1: マシン名 `testmachine`

```
code --remote ssh-remote+testmachine
```

## 例2: マシン名 `testmachine` パス `/home/user/`

```
code --remote ssh-remote+testmachine /home/user/
```


# 参考URL

https://github.com/microsoft/vscode-remote-release/issues/585
https://github.com/microsoft/vscode-remote-release/issues/585#issuecomment-536580102
SQL EXISTS句とは何ぞや？（基本情報）

スペック

筆者のスペック：新卒１年目Sier

・金融系のシステム開発に携わる
・言語：Java　Oracle　　Javascript
・フレームワーク：Spring
・他：UNIXなど...

現在は2021/2/27の基本情報試験に向けてお勉強中。。
休日は、地元の友人と野球・サッカーをするのが至福の時です。

本題：EXISTS句とはなにか？
基本情報の教材をみてもいまいちピンとこなかっため、ネットで調査しそれを自分なりにまとめました。

EXISTS句は、基本的に相関副問合せを用いる際に扱われ存在検査と呼ばれています。
副問合せに対し、レコードがあれば真、レコードがなければ偽を返すものです。
ちなみに、相関副問合せは主問合せで用いる表と副問合せで用いる表の結合条件が含まれるものをいいます。
（意味を文で表現するとようわかりません。。。）

実際にテーブルとSQL分を書いてみてわかりやすくしました。

User
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090133/1361d4a7-3a71-06bd-6806-2e4cbbf0824b.png)


Eva
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090133/138bd059-4660-2bf7-65c4-24942dc6d1f8.png)
Select User.userid, User.name from User Where Exists (Select * from Eva Where User.userid = Eva.eva-code)
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090133/e3c184c7-6f4b-5f43-51d1-b4dc76b80a17.png)

テーブルUserの１行目のuserid = S-101はEva.eva-codeに存在するため「真」となり抽出されます。
しかし、２行目のuserid = A-102はEva.eva-codeに存在しないため抽出されません。

以上が、EXISTS句の扱い方になります。勉強になりました。
Docker 学び始めました。

#【Docker 学び始めました。】

かめさんのUdemy [米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)で学習させていただいています。
いつもありがとうございます。

Dockerの超基本の備忘録です。

##Docker　基本コマンド

$ docker login　
　→ログインする。

$ docker pull < image >
　→pullする

$ docker run -it < image > bash
　→ホストからコンテナに入る。

　※ run = create + start
　( createは、コンテナを作る。ステータス = Created )
　( startは、コンテナを実行し、デフォルトコマンドを実行させる。)

　※ -it ( -i : インプット可能、-t : 表示が綺麗になる。 )

$ exit　
　→コンテナから出る。

$ docker ps -a 
　→ホストのにある全てのコンテナを表示する。

$ docker images 
　→ホストにあるイメージのリストを表示する。

$ docker restart　
　→コンテナを再度アップの状態にする。

$ docker exec -it < container > bash　
　→Dockerのあるコンテナに対して、bashのプログラムを実行する。

$ docker commit < container > < images >　
　→コンテナからイメージを作る。

$ docker tag < source > < target >
　→新しい名前にタグ付けをする。

　※Dockerイメージとリポジトリの名前を一致させたい時に使用する。

$ docker push < image >　
　→リポジトリにプッシュする。

$ docker rmi < image >　
　→イメージを削除する。

$ docker run --name < name > ubuntu
　→名前を付ける。起動させ続けるコンテナを立てる時などに使用。

##基本的にExitedしたコンテナには用はないので、定期的に削除する。

$ docker rm < container >
　→コンテナを削除する。

$ docker stop < container >
　→コンテナを止める。

$ docker system prune
　→コンテナを全部削除する。


##Docker コンテナを作って、1回きりで捨てる場合

$ docker run --rm < image >
　→コンテナをExit後に削除する。

 ※業務でもよく使うことになるかも。
Railsの並び替え機能のセキュリティを改善する。

##自己紹介
２回目のQiita記事投稿です。
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習しています。
現在はポートフォリオの作成中です。
知識を定着させるために、学びをアウトプットします。
また、これから学び始める方の参考になることを願っています。
***
##開発環境
- Ruby 3.0
- Ruby on Rails 6.0.3.4

#並び替え機能のセキュリティを改善する

初めての投稿で
**Railsで並び替え機能を実装する**という記事を投稿しました。
>Railsで並び替え機能を実装する
https://qiita.com/KON-ch/items/7b62fbbe308f6c5dcdec

この記事では、
下記の`sort_list`がViewに表示されることで
直接クエリを発行していました。

```rb
class Movie < ApplicationRecord

  scope :sort_movies, -> (sort) { order(sort[:sort]) }
  scope :sort_list, -> {
    {
      "並び替え" => "",
      "作成の古い順" => "updated_at ASC"
      "作成の新しい順" => "updated_at DESC"
    }
  }
```
これはデベロッパーツールなどを用いることで、
書き換えられた任意のクエリを発行することができます。
今回はこれを下記のように編集します。

```rb
class Movie < ApplicationRecord

  def sort_movies(sort)
    if sort[:sort] == "updated_at_asc"
      order("updated_at ASC")
    elsif sort[:sort] == "updated_at_desc"
      order("updated_at DESC")
    end
  end

  scope :sort_list, -> {
    {
      "並び替え" => "",
      "作成の古い順" => "updated_at_asc"
      "作成の新しい順" => "updated_at_desc"
    }
  }
```
このように`sort_list`では文字列として扱っています。
そして`sort_movies(sort)`で受け取り、
送られてきた文字列に対応した、クエリを発行しています。
`sort_list`を書き換えられたとしてもクエリは発行されません。

---
###その他
`else`で例外を指定しておくと、
任意の文字列にも対応できるようになります。
また並び替えの項目が増えた場合には
下記のように`when case`を使用することで
すっきりと書くことができます。

```rb
def sort_movies(sort)
  case sort[:sort]
  when 'updated_at_asc'
    order("updated_at ASC")
  when 'updated_at_desc'
    order("updated_at DESC")
  else
    order("updated_at DESC")
  end
end
```
以上で並び替え機能のセキュリティ改善は終了です。
Jupyter notebookで行番号を表示させる

#1. この記事は何？

Jupyter notebookで行番号を表示する方法を説明します。


#2. どうやってするの？

メニューバーのView -> Toggle Line Numberをクリックします。
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/acfe8f49-9e54-18e3-6fcb-b51359430940.jpeg)

下記の図のとおり、行番号が表示されました。
![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/599e7f81-bbb3-32fd-d15a-3c81d2c5771a.jpeg)
【Python】Workbook.copy_worksheetメソッドを使用してシートをコピーする。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、シートのコピーに関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

「原紙」と言う名前のシートを持つブック「議事録」があり、当日分のシートを作成したいとします。

# Workbook.copy_worksheetメソッド

```python
wb.copy_worksheet(シート)
```

渡すのはシート名ではなくて、オブジェクトです。
また、シート名は当日の日付を記述したいのでPythonの標準ライブラリであるdatetimeのdate.todayメソッドを使用します。

```python:copy_sheet.py
from datetime import date
from openpyxl import load_workbook

wb = load_workbook('議事録.xlsx')

# シートの選択を解除
for ws in wb.worksheets:
    ws.sheet_view.tabSelected = None

# 「原紙」のシートを取得
ws_template = wb['原紙']

# シートをコピー
ws_copy = wb.copy_worksheet(ws_template)

# 当日の日付を取得
today = date.today()

# シート名を当日日付にする
ws_copy.title = f'{today:%Y年%m月%d日}'

# シートを先頭へ移動
wb.move_sheet(ws_copy, offset=-wb.index(ws_copy))

# 先頭のシートを再度選択状態にする
wb.active = 0

# ブック名を変更して保存
wb.save('議事録_変更後.xlsx')
```
日付の記入って地味に手間なので自動化できると後々楽になりますね。
flexboxの便利な使い方【CSS】

今回はwebデザインのレイアウトを組む時に使えるflexboxの中でも僕がよく使う便利な使い方についてまとめてみました。
##基本的な記述
基本的には親要素に対して`display:flex;`を指定してあげればいいだけです。

```HTML.html
<div class="container">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
```

```CSS.css
.container{
  display:flex;
}
```

##親要素に対して指定するプロパティ

###justify-content
このプロパティでは親要素に空きスペースがあった場合に子要素をどこに配置するかを決めることができます。

```CSS.css
.container{
  display:flex;
  justify-content:flex-start;
}
```

・flex-start…行の開始位置から配置。左揃え。
・flex-end…行の終わりから配置。右揃え。
・center…中央揃え。
・space-between…最初と最後の子要素を両端に配置し他の要素を均等に配置。
・space-around…両端の要素を含め均等に配置。

##子要素に対して指定するプロパティ

###order
このプロパティでは子要素の順序を指定できます。

```CSS.css
.item1{order:0;}
.item2{order:-1;}
.item3{order:1;}
```

上記の場合だと2,1,3の順になります。

###flex-grow
このプロパティでは親要素に余ったスペースがある場合、指定した子要素が他の要素に比べてどれくらいの比率で伸びるのかを指定できます。

```CSS.css
.item1{}
.item2{flex-grow:2;}
.item3{}
```

上記の場合は2の要素だけ他の要素より二倍に伸ばされます。

##最後に
今回は僕がよく使う便利なflexboxのプロパティを紹介しましたがflexboxは他にも便利な使い方があるのでよかったら使ってみてください。拙い文章ですが読んでくれてありがとうございました。何かご指摘や質問があればコメントお願いします。
mapメソッドについて

rubyのmapメソッドというものがどういうものかがよくわからなかったため、リファレンスなどを参考にしながら自分なりにまとめてみました。

参考
[Ruby 3.0.0 リファレンスマニュアル：#collect](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/collect.html)
[UX MILK様：Rubyのmap, map!メソッドの使い方](https://uxmilk.jp/21695)
[Pikawara様：【Ruby】mapメソッドの基礎から応用をマスターして、効率的なコードを書けるようにしよう！](https://pikawaka.com/ruby/map)

## mapメソッドとは
配列の要素の数だけブロック内で処理を繰り返して新しい配列を返すメソッド

mapメソッドの基本

```ruby:ruby
配列.map( |変数| 実行したい処理)

#または
配列.map do |変数|
  実行したい処理
end
```

個人的には下の記述の方が見慣れています。
実際に数字を入れてみるとこのような感じになるの思います。

```ruby:ruby
num = [1, 2, 3, 4,]
n_num = num.map{ |n| n * 2 }

p n_num
# => [2, 4, 6, 8]

#または
num = [1, 2, 3, 4,]

n_num = num.map do |n|
  n * 2
end

p n_num
# => [2, 4, 6, 8]
```

下の書き方は新しい配列を返すためのからの入れ物が必要でコードが長くなるため上の書き方が一般的でしょうか。
そして、mapメソッドは配列だけでなくハッシュにも使用可能です。返り値は配列になります。

#### mapメソッドの省略した書き方

&:メソッド名と記述することで省略することができます。
ただし使用するためには条件があります。

1. ブロックの引数が1つである
1. ブロックで呼び出すメソッドに引数がないこと
1. ブロック引数に対して、メソッドを呼び出すこと以外の処理がない

```ruby:ruby
#通常の書き方
num = ["1", "2", "3", "4",]
n_num = num.map{ |n| n.to_i }

p n_num
# =>[1, 2, 3, 4]

#省略した書き方
num = ["1", "2", "3", "4",]
n_num = num.map(&:to_i)

p n_num
# =>[1, 2, 3, 4]

#複数行にわたる書き方
num = ["1", "2", "3", "4",]

n_num = num.map do |n|
   n.to_i
end

p n_num
# =>[1, 2, 3, 4]
```

基本部分の記述になります。

ハッシュにmapメソッドを使用した場合はどのように出力されるかなどは改めてまとめていきたいと思います。
mapメソッドと全く同じ動作をするメソッドでcollectメソッドというものもありますが、

+ mapメソッドは、データ構造を保ったまま、実行する処理に従い元のデータ構造を別データ構造に変換する

+ collectメソッドは、データ構造内の全ての要素に対して、実行する処理を繰り返し実行し、その結果を集めたもの

と考え方が違うみたいです。
scoopでgccがインストール出来ないのでdorado/nuwen-mingw-gccをインストールする

Windowsのpackage管理にscoopを使っているのですが最近以下のインストールコマンドでgccがインストール出来なくなっています。

```powershell
$ scoop install gcc
Installing 'gcc' (9.3.0-2) [64bit]
mingw-w64-x86_64-binutils-2.34-1-any.pkg.tar.xz (13.9 MB) [===================================================] 100%
Checking hash of mingw-w64-x86_64-binutils-2.34-1-any.pkg.tar.xz ... ok.
mingw-w64-x86_64-crt-git-8.0.0.5815.9517d302-1-any.pkg.tar.xz (3.1 MB) [======================================] 100%
Checking hash of mingw-w64-x86_64-crt-git-8.0.0.5815.9517d302-1-any.pkg.tar.xz ... ok.
The remote server returned an error: (404) Not Found.
URL http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-expat-2.2.9-1-any.pkg.tar.xz is not valid
```

> [Can't install gcc on Win 10, 64 bit. #4235 | Github ](https://github.com/lukesampson/scoop/issues/4235)

うーむ、どうやらリンクが切れているようです。

このままではcgoがbuild出来なくて困ったので代価として[dorado/nuwen-mingw-gcc](https://nuwen.net/mingw.html)を導入することにしました。
gccとリンカーもセットでインストールしておきます。

```powershell
$ scoop bucket add dorado https://github.com/chawyehsu/dorado
$ scoop install dorado/llvm-mingw dorado/nuwen-mingw-gcc
```

```powershell
$ gcc --version
gcc.exe (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

取り敢えずgccが使えるようになりました。
STM32F767のMbedでの時計,DS1307+で時刻表示(i2c)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

```c++

#include "mbed.h"
#include <stdio.h>
 
//Serial pc(USBTX, USBRX); // tx, rx
Serial pc(SERIAL_TX, SERIAL_RX);

#define ADDR     (0x68<<1) //  address

I2C i2c(I2C_SDA, I2C_SCL);

int  ch_i;      //文字列のループカウンター
char ch_b[8+1]; //文字列のバッファー
int  ch_y;      //一文字分の一時バッファー

void ch_input()
{
    ch_i=0;
    while(1) {
        ch_y = pc.getc();
        if(ch_y == 13){ch_b[ch_i]=0;pc.printf("\n\r");break;}
        ch_b[ch_i]=ch_y;ch_i++;
        pc.putc(ch_y);
        if(ch_i >= 8){ch_b[ch_i]=0;pc.printf("\n\r");break;}     
    } //while
} //ch_input

char ch_hex_b[3];

char *ch_hex(int l_num)
{
    ch_hex_b[0] = '0' + (l_num >> 4);
    ch_hex_b[1] = '0' + (l_num & 0xf);
    ch_hex_b[2] = 0;
    return(ch_hex_b);
}

int h;
int m;
int a;
int b;

int p_val;
char data_read[16];
char cmd[2]={0,0};
int ii;     //ループカウンタ

int main() {
    
///*INIT start *********  

    pc.printf("\n\r");  //改行
    
    pc.printf("H 0-23>");
    ch_input();         //文字列の入力
    h=atoi(ch_b);
 
    
    pc.printf("M 0-59>");
    ch_input();         //文字列の入力
    m=atoi(ch_b);
 
    a=(m/10)*16+(m%10);
    b=(h/10)*16+(h%10);

    data_read[0]=0;
    data_read[1]=0;
    data_read[2]=a;
    data_read[3]=b;
    data_read[4]=3;    
    data_read[5]=1;
    data_read[6]=1;
    data_read[7]=0x20;
    
    p_val = i2c.write(ADDR, cmd, 1);
    p_val = i2c.write(ADDR, data_read, 8);
    
//*/  //INIT end *********

    while(1){
           
        p_val = i2c.write(ADDR, cmd, 1);
        p_val = i2c.read(ADDR | 1, data_read, 7);
        
        ii=2;
        while(1){
            pc.printf("%s",ch_hex(data_read[ii]));
            ii--;
            if(ii==-1){break;}else{pc.printf(":");}
        }
        pc.printf("\n\r");
        
        wait(1);
    
    } //while
}


```

H 0-23>19
M 0-59>18
19:18:00
19:18:01
19:18:02
19:18:03
19:18:04
19:18:05

![i2c_time_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b2a6527d-e72b-457c-c995-e2513c0e9df5.jpeg)
Python + OpenCVで笑顔のリアルタイム検知

# 背景 #
オンラインハッカソンに参加した際に作成したアプリが入賞したので記念に載せておこうとおもった。
件のハッカソンでは、「難しい技術に挑戦しているか、新しい技術に挑戦しているか」が評価基準のひとつだったので、今回はOpenCVとPySimpleGUIに挑戦してみた。プログラムの全容は<a href="https://github.com/S8s8Max/smile_detecter">ここ</a>。

# 概要 #
<b>リアルタイムに笑顔を検知するアプリ</b>、を作成しました。


・笑顔の時だけ赤い長方形が表示され、その長方形のアスペクト比を笑顔の点数にしている。
・点数に定数を乗じたものを右側にリアルタイム描画している。
・py2appでmac用のスタンドアローンアプリになっている。

# コード #

OpenCVとPySimpleGUIではリアルタイムに処理をしたいので、基本的に

```sample.py
while True
    #何かしらの処理
　　if a:  #何かしらの条件
　　    break
```

という形になる。

実際のコードを抜粋すると、

```SmileDetector.py
def main():
  #省略
  while True:
    stage += 1

    event, values = win.read(timeout=1)
    if event in (None, "Quit"):
        break

    ret, frame = camera.read()

    image = frame[90:990, 0:-1]
    image_ = cv2.resize(image, (750,400), cv2.INTER_LANCZOS4)


    # -----------------  Process images here. ---------------- #
    gray = cv2.cvtColor(image_, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
    smile_value = 0

    for (x, y, w, h) in faces:
        cv2.rectangle(image_, (x, y), (x + w, y + h), (255, 0, 0), 2)
        face = image_[y:y + h, x:x + w]
        face_gray = gray[y:y + h, x:x + w]

        smiles = smile_cascade.detectMultiScale(face_gray, 1.8, 20)
        for (sx, sy, sw, sh) in smiles:
            cv2.rectangle(face, (sx, sy), ((sx + sw), (sy + sh)), (0, 0, 255), 2)
        
           #省略

    # ----------------- End of Image Processing ----------------- #  

```

こんな感じ。

while True で常に画面の情報を取り込みつつ、それに対して画像処理を加えていく。

OpenCV単体でリアルタイム画像処理をする場合も、PySimpleGUI単体でアプリを作る場合の両者とも、
while True: を使うので、その部分を一つにまとめることで実装できる。

# 終わりに #
入賞できて五千円以内の技術書が貰えることになった。嬉しかった。
このアプリをオンライン面接のバックで動かしておいて、笑えてるかどうかをチェックして面接を乗り越えたい。
C言語で文字列リテラルをポインタに代入したときと配列に代入した時の違い

# C言語で文字列リテラルをポインタに代入したときと配列に代入した時の違い
## 目的
次の2つの共通点と違いを理解する

```
char *s_pointer = "hoge";
char s_array[] = "hoge";
```

## 文字列リテラルと配列の初期化

文字列リテラルは配列の初期化と同義である。

```
char s_array[] = "hoge";
```
は次と同値

```
char s_array[5] = {'h', 'o', 'g', 'e', '\0'}; // \0は終端を表す
```
つまり`s_array`は配列
## ポインタに配列を代入する

ポインターへの配列の代入は`先頭要素のポインタ代入`を意味する。

```
char[] array;
char *p;
p = array; // p = &array[0]と同義
```

`ポインタ=配列`と`ポインタ=&配列[0]`は全く一緒という意味になる。
つまり`s_pointer`はあくまでポインタである。

## 共通点
`ポインタ[i]`はi個先のポインタを返し、`配列[i]`はi+1番目の要素のポインタを返す。
すなわちポインタが配列の先頭要素を指しているとき、`ポインタ[i]`と`配列[i]`は全く同じ結果となる。

## 違い
ポインタはポインタ、配列は配列なので`sizeof`の結果は異なる。

```
char *s_pointer = "hoge";
char s_array[] = "hoge";

printf("sizeof: %d\n", sizeof(s_pointer)); // 8
printf("sizeof: %d\n", sizeof(s_array)); // 5 charのサイズ(1)×要素数(5)
```

また`s_pointer`はポインタであり、インクリメントによって指す対象を変更できる

```
printf("%c\n", *s_pointer); // h
s_pointer++;
printf("%c\n", *s_pointer); // o
s_pointer += 2;
printf("%c\n", *s_pointer); // e
```

`s_array`は配列であり、このような扱いは不可能

```
s_array++ // コンパイルエラー
```
TyranoScriptで、複数単語からランダムに1つ選んで表示する

# 対象
対象読者は、TyranoScript初学者です。
V5で動作確認しました。

# 経緯
探して見つからなかったので、テクニックサンプルを参考に作りました。
マクロで実現しています。
即席なので改善の余地があると思います。

# マクロ定義
```javascript:macro
;rand word
  ;一時変数tf.randwordに結果が格納されます
  ;var属性に変数名を指定すると、そこにも結果を格納できます。var属性は省略可能です
  ;使用例：今日は[randword a="'赤','緑','青'" var="f.tobira"]の扉を選ぶぜ。選んだ扉は[emb exp="f.tobira"]だ
  [macro name="randword"]
    [iscript]
    var max   = eval("tf.a = [" + mp.a + "]; tf.a.length - 1")
    var min   = 0
    max = Number(max)
    min = Number(min)
    var rand    = min + Math.floor(Math.random() * (max - min + 1))
    tf.randword = tf.a[rand]
    if (mp['var']) eval(mp['var'] + ' = "' + tf.randword + '"')
    [endscript]
    [emb exp="tf.randword"]
    [endmacro]
```

# 使用例
上記マクロ定義を`first.ks`等で実行し、

```javascript:sample
今日は[randword a="'赤','緑','青'" var="f.tobira"]の扉を選ぶぜ[r]

;一時変数tf.randwordに結果が格納されます
何？[emb exp="tf.randword"]の扉を選ぶだって？[r]

; var属性に変数名を指定すると、結果を格納できます。var属性は省略可能です
選んだ扉は[emb exp="f.tobira"]だ[r]
```
を実行します。

# 補足
長い文章をランダムで選ぶ場合、複数行に書いたほうが読みやすいことがあります。
複数行に書きたい場合、変数を経由する手があります。

```javascript:sample2
[eval exp="tf.a0='燃え盛る太陽のような、何よりも熱く眩しく輝く赤'"]
[eval exp="tf.a1='生い茂った森林のような、どこまでも深く豊かな緑'"]
[eval exp="tf.a2='果てしない大空のような、雄大に澄み切った青'"]
今日は[randword a="tf.a0,tf.a1,tf.a2" var="f.tobira"]の扉を選ぶぜ。選んだ扉は[emb exp="f.tobira"]だ
```


# 備忘
まず以下を作成しました。のち、それをマクロ化し、機能の追加を行いました。

```javascript:getrandname_sample
;公式テクニックサンプル2の getrandname を使い、
;複数単語からランダムに1つ選んで表示する
;公式テクニックサンプル2 https://tyrano.jp/sample/sample2

[getrandname name="tf.a[{R}]" min="0" max="& tf.a = ['赤','緑','青'];tf.a.length - 1"]

今日は[emb exp="& tf.randname"]の扉を選ぶぜ
```

# 参考
[ティラノスクリプト公式 テクニックサンプル集②](https://tyrano.jp/sample/sample2)
Microfost Certificated: Azure Data Engineer Associateの勉強記事など

こんにちは、えいりんぐーです。

Microfost の Azure の認定資格である、Data Engineer Associate を取ろうかと思っているので、
先人の勉強録をまとめます。

意外と少なかったです。

# Data Engineer Associateについて
データエンジニア向けの資格ですね。
DP-200とDP-201の二つの試験をパスする必要があるみたいですが、
2021年2月23日以降は、[DP-203](https://docs.microsoft.com/ja-jp/learn/certifications/exams/dp-203)ひとつで大丈夫みたいです。
一つで済ませたいですね。

関連するものだと、データサイエンティストやAIエンジニアの資格もありますね。

# 先人の記事

[【覚書】DP-200、DP-201取得を目指して、1か月全力で勉強がんばる話。](https://qiita.com/abemaki/items/cd31595bb41e46663f8c)
Qiitaの記事です。
ほかの勉強記事へのリンクもあるので、手始めの概要をつかむのにちょうどいいです。

[【Microsoft Azure資格】Azure Data Engineer Associate (DP-200/201)を取得した話【2020年度最新】](https://www.simpletraveler.jp/2020/10/03/microsoftazure-certificate-report-azuredataengineerassociate/)
試験の概要や、本人の結果も共有されているので、大変参考になります。

[Azure の資格を全部とった話 #DP-100編](https://bigriver.jp/?p=5711)
こちらはデータサイエンティスト向けの資格の記事ですが、内容は近いと思われるので、参考までに。

[Azure アーキテクチャ センター](https://docs.microsoft.com/ja-jp/azure/architecture/)
こちらはAzure公式のクラウドアーキテクチャのサンプルです。
こういうときはこうする、というのが記載されているので、試験前にチェックするのがよさそうです。


---

現場からは以上です。
先人の肩に乗って精進しましょう。
MacBook Pro(M1)でPythonの開発環境を構築する

MacBook Pro(M1)でPythonのライブラリマネージャーを構築します。
pipを使ってインストールを試みましたが、matplotlib, numpyなどはエラーを吐いて失敗しました。
conda-forgeのディストリビューションの一つである[Miniforge](https://github.com/conda-forge/miniforge)がApple Siliconに対応してるのでこれを使用します。

#Homebrewのインストール
pythonやminiforgeはHomebrewから取ってこれるのでまずこれをインストールします。以前、記事を書いたのでこれからインストールする方は参考にしてください。

[__MacBook Pro(M1)にHomebrewをインストールする__](https://qiita.com/ren_nomura/items/2b0c30501792477bb594)

#Pythonのインストール
シンプルにこれだけです。

```bash

brew update && brew install python3 
```

#MiniForgeのインストール
これもbrewで一発です。

```bash

brew install miniforge
```

#Miniforgeの使い方
基本的にはTerminal上でcondaコマンドを使って動かして行きます。まず仮想環境の確認を行います。

```bash

conda info -e
```

デフォルトでbaseという仮想環境があると思います。
![Screen Shot 2021-02-07 at 17.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/f1b8b8bc-fca0-0c84-22d9-9a08691e8b06.png)

そのままbaseを使うことも出来ますが、今回は新たに仮想環境を作りましょう。packagesは適当に名前をつけたので好きな名前にしてください。(名前を変えた方は適宜packagesと読み替えてください)

```bash

conda create -n packages python=3.9
```
これでもう一度、以下を実行すると

```bash

conda info -e
```
ちゃんと仮想環境が作られています。
![Screen Shot 2021-02-07 at 18.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/b07d60ee-1e71-d26f-45c3-1b161a32770b.png)

仮想環境を使うには

```bash

conda activate packages
```
Terminalの左端に(packages)と出ていれば仮想環境に入れています。
Pythonのライブラリをインストールするには

```bash

conda install {インストールしたいライブラリ名}
```
例として、今回はmatplotlibを入れてみます。

```bash
conda install matplotlib
```
インストールしたライブラリを確認するには

```bash

conda list
```
ライブラリ名とバージョンインストール元が表示されています。
![Screen Shot 2021-02-07 at 18.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/983da668-aa3f-df04-91f1-2258b7ec250d.png)

最後に仮想環境から出るには

```bash
conda deactivate
```
以上、MacBook Pro(M1)でMiniforgeを使いPython開発環境を構築することができました。

お疲れ様です！
【Swift】SwiftUIファイルを作成し、プレビューを表示しようとすると "failed to build the scheme" というエラー

# どういうことか

プロジェクト新規作成にてSwiftUIを選択せずにStoryboardを選択して作成。
新しくSwiftUIファイルを作成したあとに表題のエラーがあった。

## もしかして

こちらをお忘れですか。

```terminal
$ pod install
```

解決しました。
Ubuntu18.04でopenframeworksをコンパイルしようとしたら躓いた話

タイトルの通り．どうやって解決したか，自分用の覚書程度にメモしておきます．
## 環境
Ubuntu18.04
gcc 7.5.0

## openframeworksビルド時のエラーと対処

https://openframeworks.cc/ja/setup/linux-install/
公式のインストールガイドにしたがってコンパイルしようと思ったら，

```
cd OF/scripts/linux
./compileOF.sh -j3
```
ここでエラーが．

```
/of_v0.11.0_linux64gcc6_release/libs/openFrameworks/app/ofAppGLFWWindow.cpp:13:10: fatal error: GLFW/glfw3.h: No such file or directory
 #include "GLFW/glfw3.h"
```
とりあえず`sudo apt-get install libglfw3-dev`でどうにかなるだろ，と思ったけどうまく行かず．

結論， https://tokoik.github.io/GLFWdraft.pdf の11ページを参考にソースからビルドしたらなぜか解決しました．

他にも
 
- FreeImage.h
- uriparser/Uri.h
- RtAudio.h
 
で`fatal error: hoge.h: No such file or directory`が出たけど，こいつらは`apt-get install libhoge-dev`で解消．


なぜglfw3.hだけapt-getで解決しなかったのか疑問だけど，とりあえず無事にコンパイルできましたということで．

## プロジェクトのコンパイル時のエラーと対処
晴れてOFをビルドできたということで，インストールガイドにあるようにexampleをコンパイルしようと思い，

```
cd OF/examples/graphics/polygonExample
make
```
をしたらエラーが．

```
/usr/bin/ld.gold: エラー: -lpugixml が見つかりません
```
これも
`sudo apt-get install libpugixml-dev`で解決．

あとは

```
make
make run
```
でサンプルが起動しました．めでたしめでたし．

## 学んだこと
OFの`./install_dependencies.sh`だけで全部入るとは限らない．エラーが出たらその都度個別に入れ直すべし．(その際，aptで入るものと，ソースコードからビルドしてインストールしないといけないものがある．)
Splunk CIDRMATCHをするルックアップテーブルの登録

略式ですが。。。

SplunkのGUIで、settings -> Licensingを選択

CSVファイルをアップロードする

下記を入力
Destination filename: My_CSV_File

<pre>
/splunk/etc/apps/search/default#　more transforms.conf 
[geo_us_states]
external_type = geo
filename = geo_us_states.kmz

[geo_countries]
external_type = geo
filename = geo_countries.kmz

[geo_attr_us_states]
filename = geo_attr_us_states.csv

[geo_attr_countries]
filename = geo_attr_countries.csv

[ip_address_lookup]
filename = My_CSV
match_type = CIDR(CIDR)
max_matches = 1
</pre>

このようにして使う。CIDRMATCHは、lookupの定義ファイルでなく、transforms.confを修正するのがポイント。

lookup ip_address_lookup CIDR as source_ip
YAMLを読めるようになる勉強ノード

ゼロからYAMLを読めるレベルまでの基礎知識をまとめました。
私と同じの初心者に共有します。

公式： https://yaml.org/

## YAML
YAMLとは、インデントを使って構造化されたデータを表現するためのフォーマットです。

**配列、ハッシュ、スカラーの書き方**と**記述タイプ**がわかれば、YAMLファイルを読めるようになります。

## YAMLの記述タイプ：
YAMLの書き方は二つあります。

- **ブロックスタイル** : データを複数行にわたって記述する
- **フロースタイル** :データを一行にまとめて記述する
 (「{}」 「[]」を使って構造を表す。「,」+半角スペースでデータを繋がる)

##Pythonで実行で例を実行した。(飛ばす可)
######環境
　Python： 3.7.5
　PyYamlモジュールを導入

######PyYaml は pip コマンドでインストール：

```
$ pip install pyyaml
```
######ファイル構造

```
-- yaml_dir
  - input.yaml
  - sample.py 
```

```python:sample.py
import yaml

f = open("input.yaml", "r+")
data = yaml.load(f)
print(data)
```
#YAMLの書き方
## コメント

```yaml:input.yaml
# コメント
- hello # コメント
```
######Pythonで実行結果：

```
['hello']
```

## 配列

```yaml:input.yaml
#　ブロックスタイルの書き方　（「-」+半角スペース）
- aaa
- bbb
- ccc
-
  - ddd
  - eee
 
# フロースタイルの書き方
[aaa, bbb, ccc, [ddd, eee]]
```
###### Pythonで実行結果：

```
['aaa', 'bbb', 'ccc', ['ddd', 'eee']]
```

##ハッシュ

```yaml:input.yaml
#　ブロックスタイルの書き方　（「：」+半角スペース）
A: aaa
B: bbb
C: ccc
D: 
  E: eee
  F: fff

# フロースタイルの書き方
{A: aaa, B: bbb, C: ccc, D: {E: eee, F: fff}}
```

###### Pythonで実行結果：

```
{'A': 'aaa', 'B': 'bbb', 'C': 'ccc', 'D': {'E': 'eee', 'F': 'fff'}}
```
## スカラー
YAML では、以下のデータ型を自動的に判別します。

- 整数
- 浮動小数点
- 真偽値 (true, yes, false, no)
- Null値 (null, ~)
- 日付 (yyyy-mm-dd)
- タイムスタンプ

これら以外は文字列として認識されます。また引用符「’」や二重引用符「”」で囲むと、強制的に文字列として認識されます。

```yaml:input.yaml
decimal1:  123                           # 整数 (10 進数)
decimal2:  1,234,567,890                 # 整数 (10 進数)
octal:     0644                          # 整数 (8 進数)
hexa:      0xFF                          # 整数 (16 進数)
float1:    0.05                          # 浮動小数点
bool1:     true                          # 真
bool2:     yes                           # 真
bool3:     on                            # 真
bool4:     false                         # 偽
bool5:     no                            # 偽
bool6:     off                           # 偽
null1:     ~                             # Null 値
null2:     null                          # Null 値
date:      2021-01-01                    # 日付
stamp:     2021-01-01 00:00:00 +09:00    # タイムスタンプ
str1:      'true'                        # 文字列
str2:      "2021"                        # 文字列
```
###### Pythonで実行結果：

```
{'decimal1': 123, 'decimal2': '1,234,567,890', 'octal': 420, 'hexa': 255, 'float1': 0.05, 'bool1': True, 'bool2': True, 'bool3': True, 'bool4': False, 'bool5': False, 'bool6': False, 'null1': None, 'null2': None, 'date': datetime.date(2021, 1, 1), 'stamp': datetime.datetime(2021, 1, 1, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'str1': 'true', 'str2': '2021'}
```