OmniAICreator/Qiita-1.07M huggingface dataset:
Flexboxの基礎を徹底的な理解のためにUAEの国旗を作ってみる

Flexboxを使ってUAE国旗を作る

![2finish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/ea1e01b5-99d1-e9fc-da5b-d00b31bf3b91.png)


目標：Flexboxの基礎を理解するため
テキストエディターはVSCode.
↓下記のFlexboxチートシートを参考
[Css Flexboxのチートシート] (https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)

～codeを書き始める前の準備～
・構成を考える！　何をどんな風に、どうやって作るのか？
　最初にある程度決めておくと後が楽になります。
　例　UAEの国旗を調べる
　　　```<div>```は何個必要なのか？
　　　```class```属性名はどうしようか？
　　　

・紙とペンで実際に枠を書いてみる（添付画像参照）
ここまで出来たらcodeを書いていきます♪ ※head部分は省略

組み立てのポイント！　
『あか』と『みどり、しろ、くろ』の向きが違うのでそれぞれに親要素をつけてあげる

```html
<div class="uae">
      <div class="uae7">
        <div class="uae1">あか</div>
      </div>
      <div class="uae6">
        <div class="uae2">みどり</div>
        <div class="uae3">しろ</div>
        <div class="uae4">くろ</div>
      </div>
      </div>
```
```css
  .uae {
  width: 450px;
  height: 300px;
  border: 1px solid black;
  }
  
  .uae1 {
    background-color: red; 
  }

 .uae2 {
    background-color: green;
  }

  .uae3 {
    border: 1px solid black;
  }

 .uae4 {
    background-color: black;
  }
```
上記の状態をブラウザで一旦確認

![2first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/36e49304-bbb6-0167-31e4-c125c9bab469.png)

上記のCSSにFlexboxをつける。
『.uae』と『.uae6』にそれぞれFlexboxをつける


```css
 .uae {
  width: 450px;
  height: 300px;
  border: 1px solid black;

  display: flex; ※
  flex-direction: row;　※
  }

 .uae6 {
   display: flex;　※
   flex-direction: column;　※
   }
  
```

結果　↓

![2second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/57fad66c-5e0c-5877-c6b5-b70f54872410.png)

『あか』と『みどり、しろ、くろ』が横並びになりました。
次に、Flexアイテム（子要素）にそれぞれFlexboxを付ける
理由としては、子要素の幅を調整するため



```css

   .uae7 {
     flex-grow: 1;※
   }

   .uae6 {
     display: flex;
     flex-direction: column;

     flex-grow: 4;　※
   }
  
  .uae1 {
    background-color: red; 
    height: 300px;　※
    flex-grow: 6;　※
  }

 .uae2 {
    background-color: green;

    flex-grow: 1;　※
  }

  .uae3 {
    background-color: white;

    flex-grow: 1; ※
  }

 .uae4 {
    background-color: black;

    flex-grow: 1;　※
  }
```

最後に、『あか、みどり、しろ、くろ』の文字を消して完成です

![2finish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/4a2137f2-9e03-2262-c9bd-fb677f904d60.png)

##　まとめ
今回気を付けた点、
```display: flex;```のFlexコンテナー（親要素）を２回、Flexアイテム（子要素）を使用したことです。
Flexアイテム（子要素）は、親要素に```display: flex;```が無いと反応しないので気をつけました。

また、Flexboxは動かしたいブロックの『親要素』に```display: flex;```を設定してあげる必要があります！
これを見落として『子要素』に```display: flex;```をつけてしまい上手に反応しなくて苦戦してしまう時があるので常に、『親要素』と『子要素』はどれなのか意識してあげると良いと思います。


今回は以上です
ありがとうございます！
SPSS ModelerでSORT+LIMITをSQLプッシュバックさせる

SPSS Modelerでソートノードの後にサンプリングノードで初めのn件のサンプリングをするとサンプリングノードがデフォルトではプッシュバックできません。これはデータ量が多い場合には大量データを取得することになりとても効率が悪いことがあります。
これを可能にする設定を紹介します。

■テスト環境
- Modeler 18.2.2
- Db2 Warehouse on Cloud

サンプルストリームと設定ファイルは以下です。

https://github.com/hkwd/spsssample/tree/master/20210419SORT%2BLIMIT

以下のように「ソート」をした後に、「初めのn件のサンプリング」を行うと、後半のサンプリングがSQLプッシュバックしません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f24a6661-01d5-d4d1-071e-c5efde799609.png)

プッシュバックされたSQL文は以下で、SORTは行われていますが、LIMIT(やFETCH FIRST N ROWS ONLY)は行われていません。

```sql
[2021-04-19 15:32:59] SQL をプレビュー中: 
SELECT T0."M_CD" AS C0,T0."UP_TIME" AS C1,T0.POWER AS C2,T0.TEMP AS C3,T0."ERR_CD" AS C4 
FROM "COND4N_E" T0 
ORDER BY 1 ASC,2 ASC
```

これはデフォルトではSORTをネストしたSQL文を有効にする設定を行います。

odbc-\<RDB名\>-custom-properties.cfgというファイルをつくり、sqlmx_sort_by, Yを書きます。

\<RDB名\>はdb2やbigquery、oracleなどRDBごとに決まっています。以下のマニュアルから探してください。

https://www.ibm.com/docs/ja/spss-modeler/18.2.2?topic=SS3RA7_18.2.2/modeler_mainhelp_client_ddita/clementine/database_sql_customization.html

```config:odbc-db2-custom-properties.cfg
sqlmx_sort_by, Y
```
ModelerクライアントとModeler Serverの導入ディレクトリのconfigフォルダーに置きます（例：C:\Program Files\IBM\SPSS\Modeler\18.2.2\config\odbc-db2-custom-properties.cfg)。
配置には管理者権限が必要です。置き換えたらModelerクライアントやModeler Serverを再起動してください。

再度実行するとSQLプッシュバックされるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ad0eeb8e-1ed7-871f-c41e-77edef4e2a9b.png)


```sql:SORT+LIMIT
[2021-04-19 15:48:14] SQL をプレビュー中: 
SELECT T0.C0 AS C0,T0.C1 AS C1,T0.C2 AS C2,T0.C3 AS C3,T0.C4 AS C4 
FROM (SELECT T0."M_CD" AS C0,T0."UP_TIME" AS C1,T0.POWER AS C2,T0.TEMP AS C3,T0."ERR_CD" AS C4 
FROM "COND4N_E" T0 
ORDER BY 1 ASC,2 ASC 
FETCH FIRST 10 ROWS ONLY) T0
```
CloudFormationテンプレートでLambdaのX-Ray設定（アクティブトレース設定）をONにする

1. ロール（`AWS::IAM::Role`）にマネージドポリシーを付与する
`"ManagedPolicyArns": ["arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess"]`

2. Lambda（`AWS::Lambda::Function`）にTracing Configを設定する
`"TracingConfig": { "Mode": "Active" }`
Sketchなどデザインデータのテキストオブジェクトのテキストとしてまとめて取得する方法

超ニッチなコーダーさん向けの内容です。MacのSketchなどのデザインに大量のテキストオブジェクトがあり、そのテキストを一つ一つコピペするのが面倒な時のTIPSです。

複数のテキストオブジェクトを選択してエディタにコピペしても上手くいきません。
Illustratorに貼り付けても、アウトライン化されたPDFデータとして貼り付けられて思い通りのテキストを取得できません。

完璧ではないですが以下の手順でテキスト取得できます。

1. Skecth上で取得したいテキストオブジェクトを複数選択してクリップボードにコピー
1. アプリ[プレビュー]を立ち上げ、[ファイル > クリップボードから新規作成]
1. 表示されたプレビュー上のPDFのテキストはドラックで選択できるので任意にコピー

これでテキストデータを取得できます。

試したのはSketchのみです。
もしかしたら他のツールでも使えるかもしれません。

## Mac PDFのテキストコピペで濁点や半濁点が分かれる問題
「プ ロ グ ラ ム」→「フ ゜ ロ ク ゛ ラ ム」 と分かれる問題です。
こちらのNFD→NFC変換ツールを使えば一発解決です。

http://tsuyobi.heteml.net/html/tools/nfd2nfc/

どこかの誰かの時間が効率化されますように。
勉強記録

#DNSについて
##なんでDNS？
経緯は自粛期間中にLinuxの資格を取ろうと思ったのと
職場のリーダー的な人に「webサーバーたててみて」と言われたからである。
そしてDNSの設定がうまくいかず、毎日二時間くらいずっとBINDの設定とにらめっこをしていたからである。

##要点

- 覚えやすい英数字の名前とIPアドレスを一致させるのがDNS。

- DNSで使われるドメイン名はドメイン名前空間で管理されている。

- ドメイン名とはドメイン名前空間を下から順に書いたもの。

- ドメイン名の一番後ろをTLDという。

- 日本では3種類のドメイン名の方式がある。

- ドメイン名を省略せずにすべて書いた場合、完全修飾ドメイン名と呼ぶ.



###覚えやすい英数字の名前とIPアドレスを一致させるのがDNS
ドメイン名とIPアドレスの対応システムのこと。

>例えば、ryu.example.comが存在するとすると
>>example.com という組織（ドメイン）の
>>ryuというコンピュータ（ホスト名）となる。


つまり覚えにくいIPアドレス（192.168.1.1）をryu.example.comと紐づけること。

###DNSで使われるドメイン名はドメイン名前空間で管理されている。

ドメイン名前空間…
インターネットに接続された各ホストに関する情報を管理する木構造の空間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866514/6d7229ec-ef9c-fc55-898b-b6300aa03c08.png)
http://www5e.biglobe.ne.jp/aji/3min/62.html
###ドメイン名とはドメイン名前空間を下から順に書いたもの。

上の図から読み取ると、、、
www.3min.co.jp
ということになる
根の部分（root）は読まないらしい

###ドメイン名の一番後ろをTLDという。
トップレベルドメイン
jp とかcomとか



##疲れた　きょうはここまで
参照　http://www5e.biglobe.ne.jp/aji/3min/index.html
〜独学ダッシュボード〜【データサイエンス編】

###■前提
〜データサイエンティストを目指すことを決意したエンジニアの独学メモ〜
これまで独学をしようと試行錯誤してきましたが、あまり上手くいかなった。
とあるYouTubeを観て、目からウロコ。
独学が手段ではなく目的になっていた。


###■きっかけ
以下のYouTubeを観て感銘を受けました。
[【前半】初心者向け！データサイエンスの独学ロードマップ](https://www.youtube.com/watch?v=_x1Wi1bO8s4&list=PLbRBqwUgf9iwTHN3ciyu5fqOBshbPrqb1&index=4&t=8s "【前半】初心者向け！データサイエンスの独学ロードマップ")
[【後半】初心者向け！データサイエンスの独学ロードマップ](https://www.youtube.com/watch?v=7d1rhloxPgQ&list=PLbRBqwUgf9iwTHN3ciyu5fqOBshbPrqb1&index=5 "【後半】初心者向け！データサイエンスの独学ロードマップ")
このYouTubeをきっかけにデータサイエンティストを目指すこととしました。


[AI・データ分析プロジェクトのすべて[ビジネス力×技術力＝価値創出] Kindle版](https://amzn.to/3dQDkze)
を購入し早速読了。
次は
[深層学習教科書 ディープラーニング G検定（ジェネラリスト） 公式テキスト Kindle版](https://amzn.to/2QTWCen)
を使って勉強を開始します。

###■自己紹介
私の状態
年齢：40代
職業：金融系エンジニア（要件定義・外部設計などの上流工程）
スキル：SQLは好物

###■更新情報

| 日付 | コンテンツ |
|:-:|:-:|
| 2021/04/25 | [独学〜【AI・データ分析プロジェクトのすべて】〜](https://qiita.com/MrSpockn/items/74d8a2bf3f57007204ac) |
|   |   |

###■最後に
私がデータサイエンティストへのスキルチェンジする様子を
このダッシュボードをとおして、記録していければと思っています。
ZoomのVideo SDK登録とサンプルアプリケーション実行

# 概要
Zoomがビデオ通話機能を切り出して[SDKとして提供を始めた](https://zoom.us/docs/en-us/video-sdk.html)ので、サンプルアプリケーションを動かすところまで実施。

# Developer登録
[公式ページ](https://zoom.us/docs/en-us/video-sdk.html)から、Buy Nowを選択。
![zoom.us_docs_en-us_video-sdk.html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/ad2eabc0-c408-2909-ba0f-e2c4e51ba1f7.png)

支払いプランを選択。
`Pay As You Go`だと、10,000時間まで無料で使用できて、それ以降は1分あたり0.48ドルの支払いになる。
もしくは年間134,400ドル払って1分あたり0.41ドルの支払いだが、お試しならば`Pay As You Go`だろう。

![zoom.us_buy_videosdk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/3843bbd5-29d6-b770-f0e9-44b5a8dfddc2.png)

ここで登録するメールアドレスは、通常のZoomの招待や参加などには使えないようなので、普段使っているZoom用アカウントがある場合は他のメールアドレスを用意したほうが良さそう。

![zoom.us_buy_videosdk (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/a3649f09-0c6a-5756-e7b9-7c3b0aa688b0.png)

そこからは、名前や住所、クレジットカード登録などを行ってアカウントを作成する。

![zoom.us_buy_signup (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/fba9a2d8-8218-d623-3b06-ac1f65a93649.png)


# サンプルアプリケーション実行
## アプリケーションの登録
[App Marketplace](https://marketplace.zoom.us/)から、右上の`Develop` -> `Build App`を選択。
![marketplace.zoom.us_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/790151b9-7b94-0abc-1425-4d0e23002378.png)

App TypeはVideo SDKなので、Video SDKのCreateを押下。
![marketplace.zoom.us_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/cf426f30-1954-eefc-4731-33629a23c49f.png)

アプリケーション名などは任意の名前を入力する。

## ダウンロード
登録が終わったら、`Download`をクリックしてサンプルアプリケーションのダウンロード実施。
![marketplace.zoom.us_ (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/8515f71a-1261-816e-b6e6-551b2256cd0f.png)

## 依存パッケージのインストール
ダウンロードしたzipを任意のディレクトリに解凍し、`Sample`ディレクトリに移動した後に依存パッケージのinstallを実行。

```
$ npm install
```

その後、`@zoomus`を`node_modules`にコピーする。

```
$ cp -R @zoomus node_modules
```

## SdkKeyの登録

`src/config/dev.ts`の中身を書き換える。

```
import { getExploreName } from '../utils/platform';

export const devConfig = {
  sdkKey: '',
  sdkSecret: '',
  topic: '',
  name: `${getExploreName()}-${Math.floor(Math.random() * 1000)}`,
  password: '',
  signature: '',
};
```

以下画面のApp Credentialsタブを押下して、SDK KeyとSDK Credentialを上記コードのsdkKeyとsdkSecretに貼り付ける。
また、topicは任意の文字を設定する。(`testtopic`とか)

![marketplace.zoom.us_ (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/8515f71a-1261-816e-b6e6-551b2256cd0f.png)

## 実行

Sampleディレクトリで以下コマンドを実行。

```
$ npm run start
```

勝手にブラウザが開いて、少し待つとアプリケーションが開始される。

![localhost_3000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/aae72e04-847c-322d-38a2-8f073ce7e804.png)

Audio, video and shareをクリックすると、audio, video, screen sharingが行える。

![localhost_3000_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149416/c833e727-413d-dc1d-94f4-04915ce068a7.png)
IDとNAMEをDBに登録する（MERGE文を使用する=UPDATEかINSERTかを勝手に判別してくれる）

```vb
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim textbox2_str As String = TextBox2.Text

        '数字以外の場合にエラー
        If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[^0-9]+") Then
            MsgBox("IDは数字で入力してください。")

            'ID欄が空白の場合にエラー
        ElseIf String.IsNullOrWhiteSpace(TextBox1.Text) Then
            MsgBox("IDを入力してください。")

            'NAME欄が空白の場合にエラー
        ElseIf String.IsNullOrWhiteSpace(TextBox2.Text) Then
            MsgBox("NAMEを入力してください。")

            'NAMEは25文字以上の場合にエラー
        ElseIf textbox2_str.Length > 25 Then
            MsgBox("NAMEは25文字以内で入力してください。")

        Else
            Dim id As Integer = TextBox1.Text
            Dim name As String = TextBox2.Text

            Dim strSQL As String
            Dim SQLDA As SqlClient.SqlDataAdapter
            Dim SQLDS As New DataSet()

            'SQLserverの接続先を記述(Windows認証)
            Dim cn As New SqlConnection(
            "Data Source=hoge;" +
            "Initial Catalog=DB名;" +
            "Integrated Security=True")

            strSQL = "select * from テーブル名"

            'insertするための変数宣言
            Dim cmd As New SqlCommand(
            "merge テーブル名 As target
            Using (values(@id, @name))As source (id,name)
            on target.id = source.id
            when matched then 
	        update set target.name = source.name
            when Not matched by target then
	        insert values(id, name);", cn)

            cmd.Parameters.Add(New SqlParameter("@id", id))
            cmd.Parameters.Add(New SqlParameter("@name", name))

            'SQLserverに接続
            cn.Open()

            cmd.ExecuteNonQuery()

            '実行内容が反映されたDataGridViewを表示する
            SQLDA = New SqlClient.SqlDataAdapter(strSQL, cn)
            SQLDA.Fill(SQLDS, "テーブル名")
            Me.DataGridView1.DataSource = SQLDS.Tables("テーブル名")

        End If

    End Sub
```
URLセッションとは

#■URLセッションとは
APIのデータを取得する際に使う
APIのデータを取得する方法みたいな物。



#■書き方

``` swift
func paseRequest(urlString: String) {

let url = URL(String:urlString)

let session = URLSession(configuration: .default)

let task = session.dataTask(with:url) {(data, response, error) in

    if let error != nil {
      print(error)
     return
    }
  
  if let safeData = data {
     paseJSON(data:safeData)   
   }
 }
task.resume()
}
```

#■1行づつ説明

APIのurlを引数に持たせて持ってくる。

``` swift
func paseRequest(urlString:String)
```

引数でもってきたurlStringを使いstruct URLに入れ込み変数urlに入れ込む

``` swift
let url = URL(string: urlString)
```

データの転送管理してくれるセッションをつくる

``` swift
let session = URLSession(configuration: .default)
```

セッションの機能を使ってエラー処理やデータの格納などをする。
クロージャを使っている。　関数の中に関数

``` swift
let task = session.dataTask(with:url) {(data, response, error) in

    if let error != nil {
      print(error)
     return
    }
  
  if let safeData = data {
     //データを機械に読みこむためにデコードする dataを引数として渡す
     paseJSON(data:safeData)   
   }
 }
```

■POINT★
クロージャは下記のメソッドを省略して書いてる。

``` swift
func handle(data: Data?, response: URLResponse?, error: Error?) {
  
}
```

taskを開始する。

``` swift
task.resume()
```

こんな感じです。



後はJSONデータをデコードするための
paseJSON(data:Data)メソッドを作ります。
他記事に記載してます。
【未経験でも１万５千円＋試験料だけでOK】AWS認定ソリューションアーキテクトアソシエイトを取得する方法

# かけた時間と合格率の関係について
最初に声を大にして言いたいんですが、よく「○○時間で合格した話」みたいな合格までの記録をつづったエントリがあるじゃないですか。
###あれ、無意味！！！！

読んでみたら普段AWS使ってるだとか、院生時代に使ってましたとか、前提がそもそも違うのにそっちのさじ加減で測った時間だけ書かれても何の参考になるんだ、という話です。（一つ一つの記事は全て面白く読ませていただきました。合格された皆さん素敵です）

よしんば自分と同じスタートラインだとしても、あんまり短い時間で合格してると凄いなというか焦るというか正直僻みの感情が湧いてくるだけなので、タイトルの合計期間の部分は脳内一括削除して必要な情報だけ得るのが精神安定上よろしい、というのが個人的ベストプラクティスです。

人生のステージをいくつか昇ると育児、近親者の介護、病気治療、相続問題、離婚調停などで継続的にまとまった学習時間を確保すること自体が難しくなりますしね。
# 時間はないが小銭はある
言いたいことをいってスッキリしたところで、時間ではなく合計金額を提示するというスタイルで、合格するまでの個人的な道のりをまとめたいと思います。
# 各学習にかけた金額と感想
以下、各学習にかけた金額と感想です。

| No | 教材 | 金額 |
|:-----------:|:-----------:|:------------:|
| 1       | Udemyハンズオン動画        | 2,300円         |
| 2     | インプレス黒本      | 2,618円       |
| 3     | Udemy模試      | 3,600円       |
| 4       | 公式模試        | 2,200円         |
| 5         | 公式模試2回目          | 2,200円           |
| 6       | 公式模試3回目       | 2,200円       |
| 7    | 本番     | 16,500円      |

#### 1. Udemyハンズオン動画（**2,300円**）
[米シリコンバレーDevOps監修！超AWS完全入門+本番運用向け上級編ベストプラクティスとTerraform](https://www.udemy.com/course/aws-nyumon-beginner-cloud-practitioner-ec2-vpc-rds-s3-elb-lambda-iam/) 
評価の高さと他の講座より短かかったので購入。
これを受講して始めて、クラウドとは何かを知り、AWSがただのホスティングサーバではないと気づく。
#### 2. インプレス黒本（**2,618円**）
[改訂新版 徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書[SAA-C02]対応](https://www.amazon.co.jp/dp/4295010650/ref=sspa_dk_detail_0?psc=1&pd_rd_i=4295010650p13NParams&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFGVlJHMEtGUk1FRDEmZW5jcnlwdGVkSWQ9QTA5NjI1NjQyUk1LNjJYS0NCNFpNJmVuY3J5cHRlZEFkSWQ9QUs5Uk8wWUcwM1ZKNyZ3aWRnZXROYW1lPXNwX2RldGFpbCZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=) 
以前Javaの試験を受けた時にインプレスの黒本を買って大変参考になったので、その時の好印象も手伝い購入。模試がダウンロード可能。
#### 3. udemy模試（**3,600円**）
[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/) 
６回分とボリュームがありコスパが良かったので購入。難しいけど買って良かった。全ての模試で8割以上とれるようになれば、本番が優しく感じられるはず。
#### 4. 公式模試（**2,200円**）
udemyの模試を１周終わったところでピアソンの模試を腕試しに受験。実際の翻訳の微妙さを味わうことができるので一度受けておくことをおすすめ。この時点で65％。合格ラインは72％なので落ち込む。その後udemy模試で72％以上取れるまで復習。
#### 5. 公式模試2回目（**2,200円**）
正解率が75%にあがり自信がつく。udemy模試をもう１周する。もう一度公式模試で合格点が取れれば本番受験すると決める。
#### 6. 公式模試3回目（**2,200円**）
ここでようやく公式模試は毎回同じ問題が出ていることに気づく←バカ
#### 7. 本番（**16,500円**）
会社の会議室を使わせてもらいオンライン受験しました。
当初終業後を考えましたが、常に誰かが残業してて常に物音がしている楽しい職場のため、始業前の時間に受験することを決意。
試験官の言語を英語にすると時差の関係でAM3時台とかテストセンターではありえない時間に受験ができます。自分は5時台に受験。
英語と聞くだけで尻込みする人も多いですが、試験官とのやりとりが始まったタイミングで「Would you write it down in chatbox ?」と宣言する or チャットに書けば、テキストでのコミュニケーションをしてくれます。あとはリーディングさえできれば、机を見せればいいんだな、とか両腕を見せればいいんだな、というのがわかるのでなんとかなります。
# 後書き
タイトルが怪しい求人広告みたいになってしまいました。
Nimのcgiをさくらのレンタルサーバで実行する

# 実施方針

- 共有サーバ上のため、サーバ内ではコンパイルせず、ローカルの仮想環境上のFreeBSDにてコンパイルしcgiをサーバにアップロード。

# 環境

- Windows10 Pro.
- 仮想実行環境：Hyper-v
- 仮想マシン：FreeBSD12.2
- さくらのレンタルサーバ（プレミアム）：
FreeBSD 11.2-RELEASE-p14 amd64


# 手順

## FreeBSDの仮想マシンを設定

- 以下の記事を参考に設定。
- [参考：WSL? FreeBSDが使いたいんだけど](https://qiita.com/tenomoto/items/47ea2a7884535ae3c612)

## FreeBSDに、pkgを利用してNimをインストール。


```sh
pkg update -f
sudo pkg install nim
```
- nimbleを使う場合は、gitが必要なので、pkgでgitをインストールする。

```sh
sudo pkg install git
```

## FreeBSDでnimのcgi用コードを作成.

- ただ、「test」と表示するだけのコード。

```nim
import cgi

writeContentType()
writeLine(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">")
writeLine(stdout, "<html><head><title>Test</title></head><body>")
writeLine(stdout, "test ")
writeLine(stdout, "</body></html>")
```

## C言語のバイナリをコンパイル

- NimのコードをCコードジェネレータでコンパイル。
- [参考:Nim コンパイラ ユーザガイド](https://nim-lang-081.osdn.jp/docs/nimc.html)

```sh
nim --o:test.cgi cc test.nim
```

## さくらのレンタルサーバにアップロード

- FTP経由で上記のバイナリを公開ディレクトリにアップロード。このとき「バイナリ」で転送することに注意する。


## cgiファイルのパーミッションを変更

- ファイルが実行できるよう、「755」、または、「705」にパーミンションを変更。

## 表示確認

- ブラウザで、以下のURLにアクセス。
- サンプルコードの「test」が表示されれば成功。

```txt
https://[アクセスドメイン]/test.cgi
```

## エラーについて

　ブラウザでアクセスした時に、InternalServerError(500)になる場合、以下のようなエラーログが管理画面から確認できます。

```txt
/home/XXXX/www/YYYY/test.cgi: Shared object has no run-time symbol table: /home/XXXX/www/YYYY/test.cgi

[cgi:error] [pid 24132] [client XXX.XXX.XXX.XXX:0] End of script output before headers: test.cgi

```

　いろいろな原因があると思いますが、私の場合、FTPの際にバイナリでの転送をしていないために起きていました。
参考までに。


## 最後に

　かなり端折って書きましたが、とりあえず、nimのコードでつくったcgiファイルをさくらのレンタルサーバで実行できることは確認しました。
　もっと簡単な方法があれば、コメントに書いてもらえると助かります。
　コーディング、デバッグ、デプロイまでをもっと簡単にできる方法を実験して、それができたらまた投稿したいと思います。
　もっと、Nimmerが増えることを期待しています。
JavaScript勉強メモ4章

# JavaScript勉強メモ4章


## まずはじめに  
- ブラウザ上でJavaScriptを実行できるサービスがあります。  
[ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO](https://paiza.io/projects/lCtNoBQ5l1i18mrpn27zIQ?language=javascript)を
試してみてください。

- たくさん出てくるconsole.log()は()の中身を表示してねってお願いです。このお願いをしないとpcは結果を教えてくれません。

## 4. JavaScriptの基本事項  

- 単語の間で空白・改行は自由  
セミコロン(;)は文末に入れると良い

- 予約語（もともと意味や機能が定義されている単語）は変数名・関数名に使用不可

- データの種類  
プリミティブ型：
  
  ```
   /*単一データ*/
  apple /*文字列*/
  3     /*数値*/
  ```

  オブジェクト型：

  ```
  /*複数のプリミティブ型またはオブジェクト型を持つデータ*/
  [apple, orange]           /*配列*/
  {width: 100, height: 80}  /*オブジェクト*/
  ```
- シンボル  
ユニークなプリミティブ型のデータらしい、オブジェクトのキーなどに使えそう？（勉強中）

- ラッパーオブジェクト  
いまいちわからない、プリミティブ型もオブジェクト用のメソッドが自動で使える仕組みはあるらしい。

- strictモード  
望ましくない記述をエラーにできる機能。ファイル全体に有効にするとき、ファイルの先頭に次を記述する。

  ```
  'use strict';
  ```
  特定の関数にのみ適用するとき、以下のように記述する。
  
  ```
  function myFunc(){
    'use strict';
    ・・・
    ・・・
    }
  ```

- 型変換のルール
  - 文字変換
  
  ```js
  num = 2
  console.log(typeof num)
  >>>number

  console.log(typeof String(num))
  console.log(typeof num.toString())
  >>>string
  ```

  - 数値への変換

  ```js
  str = "2"
  console.log(str)
  >>>string

  console.log(Number(str))
  >>>number
  ```

  - 理論値(true, false)への変換

  ```js
  if(0){
    console.log("0という値は真だよ");/*if文が真(true)ならこっち*/
  }else{
    console.log("0という値は偽だよ");/*偽(false)ならこっち*/
  }
  >>>"0という値は偽だよ"/*0は偽(false)だった*/
  ```

  if文を使わなくてもboolean()を使えば真偽が確かめられます。

  ```js
  console.log(Boolean(0));
  >>>false
  console.log(Boolean("false"));/* 文字列は""(空白)以外true*/ 
  >>>true
  console.log(Boolean(false));/*値としてのfalseはfalse*/
  >>>false
  ```
PHP初心者向け foreach文の知識

#はじめに
入社予定の会社がPHPを使用しており、入社までの勉強としてPHPで学んだことをアウトプットしてきたいと思っています。

今回はPHPのforeach文について、記事にしております。

#foreach文とは
配列や連想配列などのまとまったデータに対して、先頭の要素から順に繰り返し処理を行うための構文です。

#配列と連想配列とは
以下URLよりご確認できます。

https://wa3.i-3-i.info/word11931.html

#繰り返し処理であるforeach文と、while文・for文の違い
whileやforは任意の条件での反復処理が行いやすいのに対し、foreachは配列や連想配列に対しての反復処理が行いやすいという特徴があります。

foreach文では、配列の要素がある分だけ繰り返し処理したらループを抜けることができます。

#foreach文の書き方
書き方としては配列と連想配列で使う場合があります。

asの後ろの変数に、ループの度にデータが先頭から順に代入されていきます。
asの後ろの変数名は任意で決めることができます。

```（配列で使う場合）index.php
<?php

foreach ( $配列の変数 as $配列が順に格納される変数 ) {

// ループ処理をここへ記述

}
?>
```

```（連想配列で使う場合）index.php
<?php

foreach ($配列の変数 as $キー変数 => $キー名にリンクする配列に格納された値が格納される変数){
  //ループで実行される処理
}

?>
```

※「$キー変数 =>」は省略可能です。

#具体的な書き方の例①

```index.php
//配列の定義
    $subjects = array('算数', '理科', '国語');

//ループ処理
   foreach ($subjects as $subject) {
      echo $subject;
    }

//出力結果
算数理科国語
```

```index.php
//連想配列定義
$scores = array('算数' => 70, '理科' => 90, '国語' => 80);

//ループ処理
foreach ($scores as $key => $value){
  echo '{$key}は{$value}点です。';
}

//出力結果
算数は70点です。理科は90点です。国語は80点です。
```

##具体的な書き方の例②

```index.php
<?php
//配列の定義
$prices = array(100, 200, 300, 400);     

// 金額の合計値を入れるための変数を定義する。そのため0を$totalに代入しておく。
$total = 0;

//ループ処理           
foreach ($prices as $price) {            
 // 各金額（各配列の要素）を$totalに足していく            
 $total += $price;            
}            
echo '合計金額は'.$total.'円です。';
?>

//出力結果
合計金額は1000円です。
```

#参考記事

https://www.php.net/manual/ja/control-structures.foreach.php

以上です
セルをクリックしたら、TexBox内の値を削除する（TextBoxをクリア）


    'セルの一部がクリックされたときに発火する
    Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        TextBox1.Clear()
        TextBox2.Clear()

    End Sub
セルをクリック→TextBoxにセルの値を表示させたい。（が、発火条件を特定の列のみにしたい）

```
    Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        'インデックス0の列がクリックされた場合、textbox1にセルの値が表示される
        If DataGridView1.CurrentCell.ColumnIndex = 0 Then
            TextBox1.Text = DataGridView1.SelectedCells(0).Value
        End If

    End Sub
```
【2021年4月版】VisualStudio 2019 Community 版で Nuget が使えない？

# VisualStudio 2019 Community 版インストールしてみたのですが。

適当に新規プロジェクト作ってNugetからいろいろインストールしようとしてみたのですが・・・

パッケージが**見つからない** といわれてしまう。。。

設定を見てみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/b5db1cc8-014f-2ac5-cc96-b6fa59e6776b.png)

ん～。。。ローカルの"Offline Packages"ってのだけが対象になってますね。。。

ん？・・・最近の Visual Studio ってこういうものなのでしょうか？

# Nuget API のエンドポイントを設定する

とりあえず以下の Nuget 公式サイトに API のエンドポイントがありました。

https://docs.microsoft.com/en-us/nuget/nuget-org/overview-nuget-org#api-endpoint-for-nugetorg

> To use NuGet.org as a package repository with NuGet clients, you should use the following V3 API endpoint:
> `https://api.nuget.org/v3/index.json`

これをパッケージソースに追加してやればＯＫの模様です。

はい、以下のように設定いたしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/13238cda-ec79-50ac-2f9f-ba6a50575ff4.png)

# というわけでめでたく。

パッケージソース設定後、ソリューションのパッケージ管理を開くと…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/18942710-11f5-ace4-7aba-989efb0ccc70.png)


はい、めでたくパッケージを `nuget.org` から検索してくれるようになりました！

いや～よかったけど。。

えと・・・**最近の Visual Studio って、そういうもんなの？**
ChromebookのLinuxでgit initすると”Operation not permitted”とエラーメッセージが表示された場合

ChromebookのターミナルでLinux(Debian10.9)を使っているが、あるフォルダをgithubで管理しようとした際に、手間取ったことがあった。

ChromebookのLinuxでは、Chromebook側のディレクトリを共有フォルダにすることができ、`/mnt/chromeos`からアクセスできる。

この`/mnt/chromeos`以下にあるディレクトリをgitで管理しようとコマンド`git init`を実行すると下記のエラーメッセージが表示された。

```
error: chmod on /mnt/chromeos/xxx/xxx/xxx/.git/config.lock failed: Operation not permitted
fatal: could not set 'core.repositoryformatversion' to '0'
```

どうやら、Chromebook側のディレクトリをLinuxからgitで使うことはできないようだ。

当該ディレクトリをLinux側に移動させてから改めて`git init`すると、問題なく実行できた。
シミュレーターのローカルにデータを保存する

            do {
                let fileManager = FileManager.default
                let docs = try fileManager.url(for: .documentDirectory,
                                               in: .userDomainMask,
                                               appropriateFor: nil, create: false)
                let path = docs.appendingPathComponent("myFile.txt")
                let data = "Hello, world!".data(using: .utf8)!

                fileManager.createFile(atPath: path.path,
                                       contents: data, attributes: nil)
                let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
                print(documentDirPath)

            } catch {
                print(error)
            }

上記はコピペでオッケーです。
また配置場所はドキュメント配下に置いてます。


イメージはこんな感じ。

![スクリーンショット 2021-04-19 15.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/202aa64c-69fc-25a0-2143-2b1163ced6af.png)

printのやり方はiOS シミュレーターのフォルダの場所をprintしたいをみてください。

https://qiita.com/celcior0913/items/4c16f3670cff9bb5cf7f
pythonでgnuradio

#概要

pythonでgnuradioやってみた。
1ｋｈｚのサイン波を聞く。

#環境

windows 7 64bit
GNU Radio Companion 3.7.10.1
Python 2.7.10

#サンプルコード

```
from gnuradio import analog, audio, blocks, gr

class my_block(gr.top_block):
    def __init__(self):
        gr.top_block.__init__(self, "top0")
        self.samp_rate = samp_rate = 32000
        self.audio_sink_0 = audio.sink(samp_rate, '', True)
        self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 1000, 1, 0)
        self.connect((self.analog_sig_source_x_0, 0), (self.audio_sink_0, 0))

if __name__ == '__main__':
	try:
		my_block().run()
	except KeyboardInterrupt:
		pass


```

以上。
teratermマクロ作成時の備忘録



@iguruさんの「サクッと作るteratermマクロ入門」質が良くまとめてくれたため、メモしときます。

https://qiita.com/iguru/items/eed60bc1d969a6a0000c

TTL コマンドリファレンス
https://ttssh2.osdn.jp/manual/4/ja/macro/command/index.html
【Python】Nestしたdictで特定の文字列を含むValueを見つける

# TL;TD

* dictで特定の文字列を含むValueを見つけて、文字列加工を行いたかった
* 結果はそのValueまでの文字列が格納されたlistが出力される
    * dict-keyの場合はkey名、listの場合はindexが文字列に含まれる
* このままでは実際にValueにアクセスはできないので、実際にはdpathのモジュールを使用して値は取得する
    * https://pypi.org/project/dpath/

* こんな感じで指定の条件を満たすValueどこにあるか探す
    * list / str になるまで再帰的に処理を行う
* list内にdictが含まれる場合が考慮されてないので、そこは要改良


```python
def __get_dict_path_by_match_str_pattern(self, my_dict, pattern, path="", result=None):
        if result is None:
          result = []
        for key, value in my_dict.items():
            if isinstance(value, dict):
                self.__get_dict_path_by_match_str_pattern(value, pattern, "{}/{}".format(path, key), result)
            elif isinstance(value, (list, tuple)):
                result += ["{}/{}/{}".format(path, key, i) for i, v in enumerate(value) if pattern in v]
            elif isinstance(value, (str, int)):
                if pattern in value:
                    result.append("{}/{}".format(path, key))
            else:
                raise ValueError("Not support type {}. Value is {}".format(type(value), value))
        return result
```

### Ex. 

Valueに`"l"` を含む文字列を持つものを探す

input

```json
{
  "attr": {
    "types": {
      "tag": {
        "name": "Tom",
        "gender": "male"
      },
      "category": "employee"
    }
  }
}
```

output

```python
["/attr/types/tag/gender", "/attr/types/category/0"]
```

# 感想

* yieldとか使うともっと効率よく処理できそう。今度試そう
起動したタイミングで、テーブルの内容を表示させる

```
    Private Sub form1_load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim cn As New SqlConnection(
        "Data Source=hoge;" +
        "Initial Catalog=DB名;" +
        "Integrated Security=True")

        Dim strSQL As String
        Dim SQLDA As SqlClient.SqlDataAdapter
        Dim SQLDS As New DataSet()

        strSQL = "select * from dbo.EMPLOYEES"

        Try
            SQLDA = New SqlClient.SqlDataAdapter(strSQL, cn)
            SQLDA.Fill(SQLDS, "テーブル名")
            Me.DataGridView1.DataSource = SQLDS.Tables("テーブル名")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Sub
```
iOS シミュレーターのフォルダの場所をprintしたい

                let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
                print(documentDirPath)

上記を配置したい場所にてprintすればオッケーです。
kintone UI Component v1 でラジオボタンを設置する

今回はkintone UI Component v1でアプリにラジオボタンを設置します。

# アプリの準備
スペースフィールドを1つ設置します。

スペースの要素IDは`radio`としておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4431ef87-b0ec-24e2-04da-8f643d5cec56.png)


完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c353c520-1f79-e689-93af-dedad8086d35.png)


# kintone UI Component v1 の準備
`JavaScript / CSSでカスタマイズ` に
kintone UI Component v1 のCDNを追加しておきます。

CDN : `https://unpkg.com/kintone-ui-component/umd/kuc.min.js`

# JavaScript

↓コチラを参考にしつつ、スペースフィールドにラジオボタンを設置します。

https://kintone-ui-component.netlify.app/docs/components/desktop/radio-button


```js
// 詳細イベントでラジオボタン表示
kintone.events.on(["app.record.detail.show"], (event) => {
  // ラジオボタン設置用スペース
  const spRadio = kintone.app.record.getSpaceElement("radio");

  const radio = new Kuc.RadioButton({
    label: "ラジオボタン（kintone UI Component v1）",
    items: [
      {
        label: "りんご",
        value: "りんご",
      },
      {
        label: "みかん",
        value: "みかん",
      },
      {
        label: "ぶどう",
        value: "ぶどう",
      },
    ],
    itemLayout: "horizontal", // 横に並べるのでhorizontal
    visible: true,
    disabled: false,
    borderVisible: true,
  });
  spRadio.appendChild(radio);

  // ラジオボタン選択変更イベントでコンソールに表示
  radio.addEventListener("change", (event) => {
    console.log("変更前：", event.detail.oldValue);
    console.log("変更後：", event.detail.value);
  });

  return event;
});
```

コード全体はコチラ↓

https://gist.github.com/juridon/05dc6c346b1bfe9c42db07b61d7e528a

# 動作確認 ＆ まとめ

ラジオボタンの選択で、コンソールに変更前、変更後の値が表示されます。
![aaaaaaaaaaaa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/66ea16be-17f4-4809-186f-eae39d17886f.gif)

チェックボックス同様、前回値が取得できるので役に立ちそうです＾＾
是非試してみてください～✨
MySQLをローカル上にインストールできない。

####MySQLをローカル上にインストールできない
初めにMySQLをインストール
``brew instal mysql``
以下の様なエラーが発生

```
curl: (22) The requested URL returned error: 404
Error: Failed to download resource "openssl@1.1"
Download failed: https://ghcr.io/v2/homebrew/core/openssl%401.1-1.1.1k.big_sur.bottle.tar.gz
```
調べるとアップデートで解決するかもしれないと言うことで
ターミナルでHomebrewを先ずアップデート

```% brew update
Already up-to-date.
```

再度インストール

```
% mysql --version
mysql  Ver 8.0.23 for osx10.16 on x86_64 (Homebrew)
```

成功 ！

何かお気づきのことがありましたらアドバイスいただきたいです！よろしくお願いいたします！
日記つけるのに、いちいち日付書くの面倒くさくないですか？


# はじめに
googleドキュメントに日記を綴っているのですが、特にスマートフォン版で見出し(日付)を書くのがちょっと面倒くさい。
![for_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500333/e6e43e29-f497-63f8-5499-9adfbdf1dfcc.png)
# やること
スクリプトで見出しを追加しておく。具体的には、時間主導型のトリガーで、ドキュメントを開く前に見出しを追加しておく。
# コード(3行)
```
function addHeadDate() {
  // 「(年).(月).(日)」の文字列を作る。
  const title = 
  Utilities.formatDate(new Date(), "Asia/Tokyo", "YYYY.MM.dd");
  // 文書に文字列を追加。
  const head_date = 
  DocumentApp.getActiveDocument().getBody().appendParagraph(title);
  // 追加した文字を大きくする。
  head_date.setHeading(DocumentApp.ParagraphHeading.HEADING2);
}
```
参考:
[formatDate  |  Class Utilities  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/utilities/utilities#formatdatedate,-timezone,-format)
[Class Paragraph  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/document/paragraph)

実行してちゃんと動くか確かめる。
# トリガーを設定
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500333/5992599e-f097-ff5b-1734-20b6c024cb91.png)

# おわりに
スマホで見出しを書くのに、10秒前後かかっていたので、これで1年あたり10s×365=約1時間の時間を節約できるはず。うまうま。
wsl Ubuntu 18.0.4 LTS

#1. proxy設定(必要に応じて)
##terminal
```~/.bashrc
proxy=http://USERNAME:PASSWORD@PROXY_ADDRESS:PORT

#terminal
export http_proxy=$proxy
export https_proxy=$proxy
```

##apt
```/etc/apt/apt.conf.d/myproxy
Acquire::http::Proxy "http://USERNAME:PASSWORD@PROXY_ADDRESS:PORT";
Acquire::https::Proxy "http://USERNAME:PASSWORD@PROXY_ADDRESS:PORT";
```

#2. packages更新・導入
```
sudo apt update && sudo apt upgrade -y
sudo apt install gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev libncursesw5-dev
```

#3. git導入
```
sudo apt install git
```

必要があればproxy設定を追加

```~/.bashrc
git config --global $proxy
git config --global $proxy
```

#4. anyenv導入
##anyenv
### anyenv導入
```
git clone https://github.com/anyenv/anyenv ~/.anyenv

vim ~/.bashrc #以下を追記
```

```~/.bashrc
# anyenv setting
export PATH=${PATH}:${HOME}/.anyenv/bin
eval "$(anyenv init -)"
```

anyenvをセットアップ

```
exec $SHELL -l
anyenv install --init
```

nodenv,pyenvをインストール

```
anyenv install nodenv
anyenv install pyenv

exec $SHELL -l
```

### nodenv
```
nodenv install --list #available versionを確認
nodenv install 13.7.0 #13.7.0のインストール

nodenv global 13.7.0 #v.13.7.0を適用

exec $SHELL -l

node -v #versionを確認
```

必要があればproxy設定を追加

```~/.bashrc
#npm
npm config set proxy $proxy
npm config set https-proxy $proxy
```

##pyenv&pipenv
```
sudo apt install zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev -y
pyenv install --list #available versionを確認
pyenv install 3.6.10 #3.6.10のインストール

pyenv local 3.6.10 #カレントディレクトリに3.6.10を適用

#WSL再起動

python -V

pip install pipenv #pipenv導入
```

#docker系
##docker
```
sudo apt install -y docker.io
sudo usermod -aG docker $USER
```

一度wslを閉じ、wslを右クリックして"管理者として実行"

```
sudo cgroupfs-mount
sudo service docker start

service docker status #dockerが起動しているか確認
docker run hello-world
```

##docker-compose
WSL1ではインストール不可。
WSL2なら可能らしいが未検証。
[メモ]windowsでlaravel phpをデバッグするxdebugの設定

# 初めに
突然laravelアプリの改修をしてと頼まれ
何はともあれ環境構築をし、
「さて、debugをするか」というところでdebugできずに困ってしまったので
次同じようなことにならないように、メモ。

# Xdebugのダウンロード
phpinfo()で開いた画面をコピーして
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346005/504a361f-5f21-1755-1eea-b4df05d4edd0.png)

[こちらのサイトに貼り付ける](https://xdebug.org/wizard)

とダウンロードするxdebugのdllバージョンを教えてくれるので
php.iniに該当の設定をし、
[ここから同じのを探してダウンロード](https://xdebug.org/download)

php>extにダウンロードしたxdebug.dllを置く。

xdebugのデフォルトのportが9003に代わっているとかなんとかでなかなか動かず、
調べてためした結果
下記設定を追加し、webサーバーを再起動することでxdebugが使えるようになった。

```php.ini
; 追加
[xdebug]
zend_extension = C:\PHP\ext\php_xdebug-3.0.4-7.2-vc15-nts-x86_64.dll
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_port = 9000
```

以上。
SPSS Modelerで正規表現を使う

SPSS Modelerにはreplaceなどの文字列関数はありますが、正規表現に対応していません。

正規表現を使うには以下の方法が考えられます。

1. Rの拡張ノードを使う
2. RDBの正規表現関数を使う


以下のようにCOMPANYという列の文字列から「株式会社」という文字列を除去してCOMPANYSHORTという列を追加したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/672dd0c6-e345-294a-e4a4-6fee1c1ec438.png)

サンプルストリームとデータは以下です。

https://github.com/hkwd/spsssample/raw/master/20210419%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/210419regexp.str

https://github.com/hkwd/spsssample/blob/master/20210419%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/%E4%BC%9A%E7%A4%BE%E5%90%8D.csv

テスト環境
- Modeler 18.2.2
- Db2 Warehouse on Cloud


#1. Rの拡張ノードを使う

R拡張ノードでsubなどのRの正規表現関数を使います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/96caef8c-915e-b99a-b2b2-06289c8cb8b1.png)


```R:正規表現
#正規表現で「株式会社」を除去
COMPANYSHORT<-sub("株式会社","",modelerData$COMPANY)

#列の追加
modelerData<-cbind(modelerData,COMPANYSHORT)

#列定義
newcol<-c(fieldName="COMPANYSHORT",fieldLabel="",fieldStorage="string",fieldMeasure="",fieldFormat="",
fieldRole="")
modelerDataModel<-data.frame(modelerDataModel,newcol)
```

sub("株式会社","",modelerData$COMPANY)
で「株式会社」という文字列があったら除去しています。

参考

http://www.okadajp.org/RWiki/?R+%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#content_1_0




#2. RDBの正規表現関数を使う
R拡張ノードだとRDBで利用した場合SQLプッシュバックが効きません。
SQLプッシュバックを効かせたい場合は、RDBのREGEXP_REPLACEなどの正規表現関数を使います。以下のテストではDb2のSYSIBM.REGEXP_REPLACEを使いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/134b6004-a60d-39de-479a-d2665a30afe0.png)

```SQL:正規表現
SYSIBM.REGEXP_REPLACE(COMPANY,'株式会社','')
```
参考

https://www.ibm.com/docs/ja/db2/11.5?topic=functions-regexp-replace


https://qiita.com/SVC34/items/8da8fb62db5fd118024a


#3. 参考
Modelerのビルトイン関数でも＊のようなワイルドカードは使えます。

https://www.ibm.com/support/pages/%E6%9D%A1%E4%BB%B6%E6%8A%BD%E5%87%BA%E3%83%8E%E3%83%BC%E3%83%89%EF%BC%9A%E7%89%B9%E5%AE%9A%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E5%85%A5%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
【Codewars】Math.min()を使って配列の最小要素を取得する

## はじめに
Incrementsのnara_sakiです。Qiita広告の企画営業をしています。文系ビジネス職ですが「実際に自分でも手を動かしてみたい！」という思いから、JavaScriptを勉強しています。

現在は下記の方法で学習しています。

* インプット：[ドットインストール](https://dotinstall.com/)
* アウトプット：[Codewars](https://www.codewars.com/)

本記事では、Codewarsの問題と解答を書いていきます。なお、言語はJavaScriptを使っています。

## 問題
[Find the smallest integer in the array](https://www.codewars.com/kata/55a2d7ebe362935a210000b2/train/javascript)

問題（原文）

```
Given an array of integers your solution should find the smallest integer.

For example:

Given [34, 15, 88, 2] your solution will return 2
Given [34, -345, -1, 100] your solution will return -345
You can assume, for the purpose of this kata, that the supplied array will not be empty.
```

問題（日本語訳）

```
整数の配列の中で、一番小さい要素を取得してください。

例：[34, 15, 88, 2] →答えは2
例：[34, -345, -1, 100] →答えは-345

※今回配列は空になることはありません。
```

解答の大枠（Codewarsではあらかじめ下記の大枠が用意されています。必要箇所を埋めていきます）

```JS
class SmallestIntegerFinder {
  findSmallestInt(args) {
    
  }
}
```

## 解き方
複数の解き方がありますが、私は下記の手順で考えました。

1. Math.min()関数で要素の最小値を取得する
2. スプレッド構文を使い、配列(args)を展開する

### 1. Math.min()関数で要素の最小値を取得する
要素の最小値を取得するには、Math.min()関数を使うと良さそうです。[MDNのMath.min()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/min)を参照しました。
最初は下記のコードを書いたのですが、エラーになってしまいました（NaN(整数に変換できない)が返ってきてしまいました）。

```JS:エラー
class SmallestIntegerFinder {
  findSmallestInt(args) {
    return Math.min(args); // エラーになってしまう
  }
}
```

### 2. スプレッド構文を使い、配列(args)を展開する
1では、配列が展開されていなかったため、エラーになってしまいました。そこでスプレッド構文を使い、配列(args)を展開（[a, b, c, ...]の形にする）していきます。

配列を展開するには、スプレッド構文（...）を使います。具体的には、`return Math.min(args)`を`return Math.min(...args)`に変えます。

## 解答
1,2をまとめると、下記のコードで正解になります。

```JS:正解
class SmallestIntegerFinder {
  findSmallestInt(args) {
    return Math.min(...args); // スプレッド構文を使い配列を展開する
  }
}
```

## おわりに
スプレッド構文はドットインストールでも学習していたはずですが、こちらの問題を解いたことで自分の理解度が足りなかったことに気付かされました。初見には`...`の使い方が難しかったですね。あらためてインプット→アウトプットの重要性を実感します。引き続き学習を進めていきたいと思います。

## Codewarsとは
無料で利用できるプログラミング学習サイトです。@javacommonsさんの記事に詳しい説明が載っています。

https://qiita.com/javacommons/items/7c473cda7825ab99e08c

Codewarsは英語なので最初は少しとっつきにくいかもしれませんが、問題数が豊富であり、他の人の解答も見られてとても勉強になります。初学者の方におすすめです。
PHP: PHPMailer の使い方

こちらでは、 SwiftMailer を使いましたが、PHPMailer を使ってみました。

## ライブラリーのインストール

```bash
sudo apt install libphp-phpmailer
sudo apt install php-vlucas-phpdotenv
```

## プログラム

```php:phpmailer_ex01.php
#! /usr/bin/php

<?php
// ------------------------------------------------------------------
//	phpmailer_ex01.php
//
//				 	Apr/19/2021
//
// ------------------------------------------------------------------
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require_once '/usr/share/php/libphp-phpmailer/autoload.php';
require_once '/usr/share/php/Dotenv/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$from = $_ENV['FROM'];
$to = $_ENV['TO'];

date_default_timezone_set('Asia/Tokyo');
$today = date ("Y-m-d");
$now = date("Y年m月d日 H時i分s秒");


$mailer = new PHPMailer;

$mailer->IsSMTP();
$mailer->Host = $_ENV['SERVER'];
$mailer->SMTPAuth = true;
$mailer->Username = $_ENV['USR'];
$mailer->Password = $_ENV['PASSWORD'];
$mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mailer->Port = $_ENV['PORT'];

$mailer->CharSet = 'utf-8';

$str_out = "";
$str_out .= 'This is TEST.' . PHP_EOL;
$str_out .= 'こんにちは。' . PHP_EOL;
$str_out .= '晴れています。' . PHP_EOL;
$str_out .= $today . PHP_EOL;
$str_out .= $now . PHP_EOL;

$mailer->setFrom($from);
$mailer->addAddress($to);
$mailer->Subject = 'Test Apr/19/2021 ' . date ("H:i:s") ;
$mailer->Body = $str_out;

if(!$mailer->send()) {
	echo 'Email is not sent.\n';
	echo 'Email error: ' . $mailer->ErrorInfo;
} else {
	echo '*** Email has been sent. ***' . PHP_EOL;
}

// ------------------------------------------------------------------
?>
```

```text:.env
SERVER = 'hi-ho.mose-mail.jp'
PORT = 587
USR = '****@hi-ho.ne.jp'
PASSWORD = '****'
FROM = '****@hi-ho.ne.jp'
TO = 'sample@example.com'
```

## 確認したバージョン

```text
$ php --version
PHP 8.2.10-2ubuntu1 (cli) (built: Sep  5 2023 14:37:47) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10-2ubuntu1, Copyright (c), by Zend Technologies
```
【備忘録】Ubuntu20.04でx11vncセットアップ

# 参考記事

[Ubuntu18.04 LTSにVNCでリモートデスクトップ接続する](https://qiita.com/chyonevvi/items/3d907464d11b2f056ef6)
[Ubuntu 20.04 LTSでのx11vnc設定手順](https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html)



# 手順①　パッケージインストール

lightdmとx11vncをインストール。

```terminal:terminal
sudo apt install lightdm x11vnc
```

lightdmのインストール中にデスクトップマネージャーを選択する画面が出るので、gdmではなくlightdmを選択する。



# 手順②　パスワードファイルを作る

```terminal:terminal
sudo x11vnc -storepasswd /home/pi/.vnc/passwd
```


# 手順③　お試し起動

```terminal:terminal
sudo x11vnc -auth guess -display :0 -rfbauth /home/pi/.vnc/passwd -rfbport 5900 -forever -loop -xkb -noxdamage -repeat -shared
```

warningやerror等出ずに接続受付中のログが出れば、クライアントから接続。
ログイン画面が写ればOK。
Ctrl-cで停止。



# 手順④　自動起動設定

```terminal:terminal
sudo vim /etc/systemd/system/x11vnc.service
```

```systemd:/etc/systemd/system/x11vnc.service
[Unit]
Description=x11vnc (Remote access)
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /home/pi/.vnc/passwd -rfbport 5900 -forever -loop -xkb -noxdamage -repeat -shared
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=graphical.target
```

```terminal:terminal
sudo systemctl daemon-reload
sudo systemctl enable x11vnc
sudo systemctl start x11vnc
```

しばし待ってからクライアントから接続し、画面が写ればOK。
サーバーを再起動して、もう一度クライアントから接続・画面確認。写ればOK。



# その他

・ログイン画面でEnterを押すとうまくいかないという記述が散見されたが、現在はなさそう。パスワードだけ入力してEnterしたらログインできた。嬉しい。
複数の値を標準入力から受け取る方法

## はじめに
paizaのスキルチェックは、一度に複数の値が入力される問題だった。
一度に複数の値を受け取る方法が分からなかったので備忘録として残しています。

## 結論
splitメソッドを利用する事で複数の値を受け取ることができます。

```
apple orange　grape
```
例えば、上記の3つが標準入力される値とした場合、下記のように記述する事で

```
fruits = gets.split(' ')
p fruits
```

まとめて値を受け取ることができます。
※受け取った値は配列となっているので、数値を使用する場合は文字列から数値に変換する必要があります。

```
["apple", "orange", "grape"]
```
FlutterとFlutter2の共存

すでにFlutterの環境が構築されてる状態からfvmを導入してFlutterとFlutter2の環境を共存させるまで。

# fvmをインストール
## Dartをインストール
fvmはDartのパッケージなのでDartをインストールする。
[公式サイト](https://dart.dev/get-dart)

公式サイトにはFlutter 1.21以降にはDartが含まれてるのでインストール不要と書いてあるが、私の環境では?pubコマンドがなかったのでインストール。
後で素のFlutterは消しちゃうのでどっちにしてもインストールしたほうが良い。
基本は公式サイト通り。

```
$ brew tap dart-lang/dart
$ brew install dart
```

.zprofile等に下記を記載してコマンドへのパスを通す。

```
export PATH="$PATH":"$HOME/.pub-cache/bin"
```

## fvm自体をインストール
これも[公式](https://github.com/leoafarias/fvm)通り

```
$ pub global activate fvm
```

# Flutterを無効化
既存のFlutterを無効化(削除)しておく。
別にしなくてもいいがちゃんとfvmを経由してFlutterを使用してるのか否かをはっきりさせるため。

既存のFlutterへのパスが通ってると思うのでそちらを削除する。

```
export PATH=$PATH:/Users/XXXX/flutter_development/flutter/bin
```

様子を見てフォルダ自体削除しちゃっても良い。

# FlutterとFlutter2をインストール
fvmを使用してFlutterとFlutter2をインストールする。
Versionは使用したいVersionを指定する


```
$ fvm install 1.22.2
$ fvm install 2.0.4
```

それぞれの実態はfvmフォルダ配下にインスールされる。

```
$ ls -la ~/fvm/versions/
1.22.2
2.0.4
```

# Flutter、Flutter2を切り替える
既存のプロジェクトで別々のVersionを使用する方法。

各プロジェクト配下で使用したいVersionを指定する。

```
$ fvm use <version>
```

上記コマンドを打つとプロジェクト配下に.fvmが生成され、使用したいFlutterVersionへのシンボリックリンク等が生成される。

プロジェクト配下で指定されたFlutterを使用する場合は頭にfvmを付ければいい。

```
$ fvm flutter run
```

AndroidStudioであればプロジェクト毎にFlutterへのパスを設定してると思うので、生成された.fvm/flutter_sdkを指定する。
Terraformのディレクトリ構成を他記事を参考に考えてみる。

- 環境ごとにディレクトリを分けて、moduleを参照する
    - メリット
        - 再利用性が高い。
        - 可読性が高い。
        - 採用事例が多く、記事になっている。
    - デメリット
        - 本番環境と検証環境に差分が発生する可能性がある。


- 環境毎にディレクトリで分けず、workspaceを使う
    - メリット
        - 実装漏れを防ぐ。
        - 本番環境と検証環境を同一の構成にしかできないので環境による不具合をなくす。
    - デメリット
        - 環境毎にサブネットCIDRやインスタンスタイプなどパラメータの差分があるとき、条件分岐を書かなければならない。可読性に欠ける。これが煩わしいようで、環境ごとにディレクトリを分けてmoduleを参照する構成が多く採用されている印象。

以下、記事の構成が全体の見通しが良く、他プロジェクトでも再利用しやすそうなので採用してみる。しかしmoduleを２層にすることで実装コストが上がってしまう。

https://ohshige.hatenablog.com/entry/2020/12/09/190000

１．
複数プロジェクトを管理しているが、案件によって作りたいリソースは異なるのでプロジェクト毎に新しいものを作るようにする。

２．
```provider.tf```に関して、本番環境と検証環境で異なるproviderやバージョンを使うことは現状無いので、```dev/shared/provider.tf```と```prod/shared/provider.tf```で分ける必要がない。
```provider.tf```は一つだけを用意し、各コンポーネントのディレクトリ内からシンボリックリンクで参照する。

３．
ディレクトリ名を変更
project　    →　env
usecase　  →　component
elements　→　service


```
.
├── env
│   ├── shared
│   │ 　  └── provider.tf
│   ├── dev（tfstate管理）
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── aws.tf
│   │   ├── terraform.tf
│   │   ├── provider.tf -> ../../shared/provider.tf
│   └── prod（tfstate管理）
│                       ︙
├── component
│       ├── network
│       │       ├── main.tf
│       │       ├── outputs.tf
│       │       └── variables.tf
│       ├── cicd
│       ├── api
│       ├── db
│       ︙
└── service
        ├── vpc
        │    ├── main.tf
        │    ├── outputs.tf
        │    └── variables.tf
        ├── rds
        ├── s3
        ├── security_group
        ├── subnet
        ├── wafv2
        ︙
```
ブロックチェーン　ロードマップ

##キャリアベース

https://tomokazu-kozuma.com/explain-the-type-and-work-content-of-blockchain-engineers/

https://tomokazu-kozuma.com/about-job-change-and-job-offering-to-blockchain-engineer/

https://tomokazu-kozuma.com/recommended-books-for-efficiently-learning-blockchain/

https://tomokazu-kozuma.com/what-to-do-to-be-a-blockchain-engineer/

https://tomokazu-kozuma.com/
JS　配列内の連想配列の値を取得する

## はじめに
ES6の復習中に配列内の連想配列がうまく取得できず
苦戦したので己の戒めとして残します。
## 状況
こんな配列があります。

```
const items = [
  {id: 1, name: "靴", price: 3000},
  {id: 2, name: "服", price: 1000},
  {id: 3, name: "手袋", price: 100},
  {id: 4, name: "マスク", price: 50},
  {id: 5, name: "帽子", price: 800},
];
```

この時、keyのnameが「靴」である連想配列を探す
getShoesという関数を作る時は

```
const getShoes = items.find((item) => {
    return item.name === "靴"
  });
console.log(getShoes);

// 実行結果　{id: 1, name: "靴", price: 3000}
```

このような関数を定義します。

次に配列と、その中のkeyを指定して、一致する値があるか
どうかを探し、一致する連想配列を表示する
getAnyOne関数を作ります。

```
const getAnyOne = (array, element) => {
  return array.find((arr) => {
    const key = Object.keys(element)[0]
    return arr.key === element.key
  })
}
```

こんな感じで書きました。
さっそく帽子の連想配列を取得できるか試すために

```
console.log(getAnyOne(items, {name: "帽子"}));

```
と書きました。するとconsoleは

```
{id: 1, name: "靴", price: 3000}
```

何故か靴の連想配列を取得しています。どして？

## 問題の原因
今回getAnyOne関数のreturnする部分でキーを指定する際、
連想配列(arr).keyで指定しています。

しかしキーは今回keyという変数で定義しています。

変数で定義されたキーの値を取得する時は
" . "ではなく" [ ] "を使う必要があるそうです。

よって今回の場合

```
const getAnyOne = (array, element) => {
  return array.find((arr) => {
    const key = Object.keys(element)[0]

    return arr[key] === element[key]
  })
}
console.log(getAnyOne(items, {name: "帽子"}));
```

とすれば正しくnameが帽子の連想配列を取得することができます。

## おわりに
JS、というか何かしらのアプリを作ろうと思うと
ほぼ必ずといっていいほど配列を使用します。

しかしながらまだまだ配列のデータをうまく取得できないので、今後Reactもそうですがその前に前提のJSの知識をもっと深めないとなと反省しました。
（個人的にReact使ってても止まるのはJSの知識分野であることの方が多い）

ここまで読んでくださりありがとうございました！