OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】備忘録 reduceを使って値を加工する


# 紹介する経緯
reduceの使い方を見ていると、配列の要素を全て足す処理など集計系の記事が多かったので、今回は実用的なreduceの使い方を紹介します。
(備忘録的な意味も含めて)

# reduceの簡単な説明

ここでは説明を省きますが、操作したい配列が空配列(要素数が0)の場合エラーが出ますので、第2引数の初期値は設定しておいた方が良いです。

+ **accumulator(前回の値)**
初期値はinitialValueで設定できます。
設定しない場合はarray[0]番目が初期値になる。

+ **currentValue(現在の値)**
 配列内で現在処理されている要素。

+ **currentIndex**
  配列内で現在処理されている要素のindex番号。

+ **array**
 現在操作されている配列

+ **initialValue**
  第2引数で初期値を設定できる。



```javascript:sample.js
array.reduce((accumulator, currentValue, currentIndex, array) => {
  return accumulator
}, initialValue)
```


# 実用的な使い方

電話番号、郵便番号等の値を配列として保持している場合など多いのではないでしょうか？
配列で値を保持していて、API側にpostする際にハイフン区切りの文字列として整形するなどあるあるだと思います。


```javascript:hoge.js
// 電話番号、郵便番号のなどの値を管理している配列
 const array = ["000","1234","9470"]; 

 const convert_value = array.reduce((prev, current) => {
   return prev || current ? `${prev}-${current}` : '';
 });
```

# 簡単な解説


+ **prev・・処理前の値(直前の処理結果)** 
+ **current・・現在の要素の値**


下記テーブルを使用し何をしているのかを可視化しました。



ループ回数|prev|current|retunされる値
|---|---|---|---|
|1|000|1234|000-1234|
|2|000-1234|9470|000-1234-9470|


下記コードにて、prev、currentのどちらかの値がtruthyの場合、**前回の値**と**現在の要素の値**でハイフン区切りにしています。
最終的には、**000-1234-9470**の文字列が返却されます。
```javascript:hoge.js
   return prev || current ? `${prev}-${current}` : '';
```

# 参考にさせていただいたサイト・記事
参考：[Array.prototype.reduce()：ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)	
参考：[reduceの使い方まとめ(Javascript、配列の合計など)](https://qiita.com/Rityado/items/104b1df6ec08737a736f)
テックキャンプ卒業後の感想

# テックキャンプ卒業後の感想
この度、テックキャンプ136期を無事卒業しましたので、感想を書きまとめてみました。

# 自己紹介
- 29歳未婚男
- 前職 自動車関係CADエンジニア
- 岐阜県の田舎在住
- 12月末にテックキャンプ卒業
- 2月の頭に内定を3社

# テックキャンプを選んだ理由
- コロナを機に現職の収入面や将来性への不安が強まった。
- 友人の勧め
- 補助金で実質15万円程度で受講ができる

# テックキャンプのメリット
- 完全未経験の立場からでも、アプリケーション作成からリリースまでの一連の流れが最短で学べる。
- 挫折せずに学習に専念できるよう背中を押してくれるライフコーチの存在
- 随時相談できるメンターさんの存在
- 卒業後、各企業ごとの選考管理や面接対策、添削まで対応してくれるキャリアアドバイザーの存在
- 卒業後もご縁と繋がる仲間の存在
- 卒業後1年間は復習振り返りができるカリキュラム]

# テックキャンプのデメリット
- ある期間からメンターさんの利用制限ができる
- 初期費用が高い

# 総括
私が思うメリット、デメリットをまとめてみました。個人的にテックキャンプはとてもお勧めできます。 
受講を考えている方は、カウンセリングを受けてみては如何でしょうか。
Pythonでディレクトリとファイルを作成する方法

# はじめに
Pythonでディレクトリを作成し
その直下にファイルを作成する方法をまとめた

# コード
```python
# testディレクトリに権限を付与
os.chmod('test', 0o777)

# testディレクトリの直下にsampleディレクトリを作成
os.makedirs('test/sample')
# sampleディレクトリ直下にhello.txtファイルを作成
with open('aaa/sample/hello.txt', 'w') as file:
    file.write('あいう')
```

os.chmodでディレクトリに権限を付与する処理で私の環境だと
0の後にoを付ける必要がありました。
権限の種類については、この記事を参考になりました。

https://qiita.com/lulucowcow/items/7e69e36e5559f896a66d


os.chmodでディレクトリに権限を付与する時はstatモジュールを使って下記のように設定できます
```pythony
# 権限の設定
permission = stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO
os.chmod('test', permission)
```
stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXOは、Unixシステムで使われるファイルのアクセス権のビットマスクのことです。
このビットマスクを使うことで、ユーザー（所有者）、グループ、その他のユーザーに対して、読み取り、書き込み、実行の権限を設定することができます。
【Rails】UUIDをプライマリーキーにする

## 概要

- ユーザーIDをUUIDにする必要性があったため、検証しました

## サマリー

- UUID型のデータ型を持つ、PostgreSQLにすると簡単に対応が可能
- mysqlではUUIDを生成するところから実装して、データベースにUUIDを入れるような運用になります

ということで、今回は、PostgreSQLで検証を進めます。

## 手順

Railsガイドによるマニュアル
[https://guides.rubyonrails.org/active_record_postgresql.html](https://guides.rubyonrails.org/active_record_postgresql.html)

こちらをベースに検証を進めました。

今回は、ユーザーテーブルに対して、プライマリーキーをUUIDにする、というケースで手順を記載します。

### ユーザーモデルの作成

```json
$ rails generate model User sub:string
```

※ column名は任意。今回は認証連携先のsubを格納する想定でsubとした。

### マイグレーションファイルの修正

上記コマンドで、生成したマイグレーションファイルを修正します

```ruby
class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
    create_table :users, id: :uuid do |t|
      t.string :sub

      t.timestamps
    end
  end
end
```

モデルファイルの変更は無し

### データベースをマイグレーション

```ruby
$ rails db:migrate
```

## コンソールでユーザー作成してUUIDを確かめる

```bash
irb(main):001:0> user = User.create
  TRANSACTION (9.5ms)  BEGIN
  User Create (14.4ms)  INSERT INTO "users" ("sub", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["sub", nil], ["created_at", "2023-02-07 03:24:45.240076"], ["updated_at", "2023-02-07 03:24:45.240076"]]
  TRANSACTION (14.5ms)  COMMIT                 
=>                                             
#<User:0x0000000107ba3760                 
...                                       
irb(main):002:0> user.id
=> "6a19eebc-72f1-4e13-9e47-75025a8276af"
```

このように、IDがUUIDになりました！
CloudFrontについて

## CloudFrontとは
HTMLファイルやCSS、画像、動画といった静的コンテンツをキャッシュし、オリジンサーバーの代わりに配信するCDNサービス。
エッジロケーション(データセンター)からコンテンツを配信する。
※世界中に200以上のエッジロケーションがあり、エンドユーザーに近いエッジロケーションからコンテンツを高層く配信する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/c65334dc-4544-71a0-d6f8-635466558037.png)
※エッジロケーションからはCloudFrontだけではなく様々なサービスが提供されている。

## CloudFrontのバックエンド
CloudFrontのバックエンドにあるコンテンツを保持するバックエンドサーバーをオリジンサーバーという。
オリジンサーバーとして、ELB、EC2、S3を利用することが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/e7d595e9-ac96-c347-a720-6b2620de324f.png)


## ディストリビューションとは
ドメインごとに割り当てられるCloudFrontの設定のことで、Amazon EC2でいうインスタンスのようなものです。

## OACについて
CloudFrontからS3へのアクセス制限としてOAC(Origin Access Control)があります。
OACを設定することによりCloudFront経由でしかS3にアクセスできないように制御が出来る。s3をパブリックアクセス可能にする必要がないためセキュアな構成になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/a0424626-6216-fb4b-a684-030022151391.png)


## ビヘイビア
キャッシュの設定をして、CloudFront (CDN) を効率的に使うための設計が可能。
キャッシュヒット率を上げる。



## オリジンサーバーの保護
オリジン側でCloudFrontからのアクセスのみに制限したい場合
**オリジンがS3の場合**
- OACを利用する。
**カスタムオリジンの場合**
- カスタムオリジンヘッダーを利用
CloudFrontとオリジン間で任意のヘッダーおよびヘッダー値を取り決め、オリジン側でヘッダー値のチェックを行うことで、カスタムオリジンはCloudFrontからの悪背うsのみに制御できる。
- IP制限
CloudFrontが利用するIPアドレスを確認して、セキュリティグループで制御する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/915affb8-7d37-1c0b-ef78-e3f98355c434.png)

## 地域制限
地域指定によるアクセス制御が可能。
- 接続されるクライアントの地域情報をもとにエッジで判断
- BlacklistかWhitelistで指定可能
- ディストリビューション全体に対して適用
- 制限されたアクセスは403を応答

## WAF連携
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/7af761e6-8791-1ad8-e9a8-e0ec403e2ca1.png)

## Origin Group
プライマリオリジンがエラーになったときに、セカンダリオリジンにフェイルオーバーすることが出来る。
※Sorryページに振ることが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/f523885a-f81a-ddab-033d-d06b8fa2fd0e.png)

## 用語集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/835d959a-74e6-b12d-c895-f116a3ce0f09.png)
Leetcode 45. Jump Game II

https://leetcode.com/problems/jump-game-ii/description/

## アプローチ
### Brute force

```java
class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int jumps = 0;
        int curEnd = 0;
        int curFarthest = 0;

        for (int i = 0; i < n - 1; i++) {
            curFarthest = Math.max(curFarthest, i + nums[i]);
            if (i == curEnd) {
                jumps++;
                curEnd = curFarthest;
            }
        }
        return jumps;
    }
}
```

- [こちら](https://leetcode.com/problems/jump-game-ii/solutions/3160405/easy-java-solution-greedy-approach/?orderBy=hot&page=2)を参照しました
PostgreSQL接続時に「psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed:」エラーが出た時の解消

出力されたエラーは下記の2つ

1. 「**psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "ユーザー名" does not exist**」
2. 「**psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory   
Is the server running locally and accepting connections on that socket?**」

久々にPostgreSQLを使用することがあって、下記で接続しようとすると、上記の１番目のエラーが出力されてしまった。。。

```markdown
psql -U ユーザー名
```

 DB一覧を確認しようとしたところ、上記の２番目のエラーが出力されてしまった。。。

```markdown
psql -l
```

一旦Postgresがインストールされているか確認すると、インストールされている

```markdown
~ $ psql --version
psql (PostgreSQL) 14.6 (Homebrew)
```

起動できるかを確認すると起動できる

```markdown
~ $ brew services start postgresql
Warning: Use postgresql@14 instead of deprecated postgresql
==> Successfully started `postgresql@14` (label: homebrew.mxcl.postgresql@14)
```

と思ったら起動できていない。。。

```markdown
~ $ brew services list
postgresql@14 error
```

`cd /usr/local/var/log/postgresql@14.log`でログ内容を確認

```markdown
Reason: tried: '/usr/local/opt/icu4c/lib/libicui18n.72.dylib' (no such file)
```

以下のコマンドで`icu4c`のバージョンを確認したところ`69系`になっていた

```markdown
brew info icu4c
```

`icu4c`を`72系`にするためにHomebrewをアップグレードしてみる

```markdown
brew upgrade icu4c
```

再度、`icu4c`のバージョンを確認すると72系に変更されていた

```markdown
brew info icu4c
```

再度、DB一覧を確認したところ確認できた（※一覧はサンプルです）

```markdown
~ $ psql -l
                                          List of databases
      Name       |      Owner      | Encoding | Collate | Ctype |          Access privileges
-----------------+-----------------+----------+---------+-------+-------------------------------------
 postgres        | postgres        | UTF8     | C       | C     |
(7 rows)
```

ユーザー名で接続してみる（※上記の「Owner」名で接続）と、接続できた

```markdown
~ $ psql -U postgres
psql (14.6 (Homebrew))
Type "help" for help.

postgres=#
```

Roleの一覧を確認すると登録しているロール名を確認できた

```markdown
postgres=# \du
                                      List of roles
    Role name    |                         Attributes                         | Member of
-----------------+------------------------------------------------------------+-----------
 postgres        | Superuser, Create role, Create DB                          | {}
 
```
もっとスマートなやり方あると思いますが、自分はこれで解決しました。
精進します。。。

### 参考：
https://qiita.com/hirocueki2/items/327dc6e87005edf622ad

https://stackoverflow.com/questions/53828891/dyld-library-not-loaded-usr-local-opt-icu4c-lib-libicui18n-62-dylib-error-run
クラシックマウス　作ってみた　その5  OLED　

# はじめに
* 作成したクラシックマウスの各パーツの解説。
* 今回は「OLED　0.96インチ　128×64　SSD1306」と「フレーム、ホイールなど」
* 機体写真、動画などは「その1」をご参照。

# OLED　0.96インチ　128×64　SSD1306
マウスはディスプレイが無くても走るのですが、やはり機体の状況を把握するためにも、表示装置があったほうが便利です。手持ちのディスプレイの中から選んでみました。
プログラムサイズに余裕がないので、あまり大きなライブラリは使えないので、以下の選択になりました。
* 液晶ディスプレイとの比較
    * 手元にはAQM1602Y-RN-GBWもあったのですが、なぜか他のセンサーと同時に認識することができず、止む無くOLEDになりました。1602LCDはさすがに大きすぎて、マウスに載せる気になりませんでした。
* OLED
    * 手元にあるものから選んだので、どこで買ったか忘れてしまいました。AMAZONでたくさん売っているものと同じだと思います。
* ライブラリ
    * プログラムサイズの制約から、ライブラリの小さいSSD1306Asciiを選びました。
    * フォントが選べるのですが、サイズの小さい System5x7 にしています。小さくて読みにくいときはoled.set2X();で大きくしてoled.set1X();で元に戻せます。
    * スケッチ例は以下ご参照。
```
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiAvrI2c oled;

/////  以下SETUP内  ////////////
oled.begin(&Adafruit128x64, I2C_ADDRESS);
oled.setFont(System5x7);
oled.clear();
oled.println("oled start");
```
# フレーム、ホイールなど
設計図など書かずに、試作の積み重ねで作っています。センサーを交換したり、パーツの場所を変えたりしているので、あまり見栄えも良くありません。
走行しているときに　前後にバタつく感じがあるので、もう少しスムーズにしたいのですが、段差対策との兼ね合いが良くわからなくて試行錯誤しています。もっと前の方に重心をおけばよいのでしょうか。
* フレーム
    * モーターを載せる板にはプリント基板を使いました。大きさは50mm x 60mm。手元にあったものを使ったので、材質などはよくわかりません。タミヤのユニバーサルプレートを使おうと思っていたのですが、プリント基板は、値段も安く、穴も開いていて、薄く丈夫ですが、加工も可能なので、意外と良い感じでした。
    * モーターは両面テープで接着して、一応テグスを巻いて固定していますが、両面テープだけで十分かもしれません。
    * 裏面はカグスベールを貼っています。どの程度の高さにするのが良いかよくわからないのですが、試行錯誤しています。
    * プリント基板から支柱（スペーサー）を伸ばして、上段にArduino Unoを載せています。ここの板にはユニバーサルプレートを切断して使いました。さらにそこから支柱を伸ばし、ミニブレボを利用しててMPU6050を取り付けています。
    * バッテリーの置き場所も試行錯誤しています。最初2階に置いておいたのですが、下に置くほうが安定するかと思い、車体前方にアルミ板と両面テープを使って載せています。
    * VL53L0Xは高めの位置に来るように置いています。両面テープだけで固定したりしていて、あまりスマートでないので、改善の余地がありそうです。
* ホイール
    * 朱雀技研さんで入手した50mmホイールとタイヤを使っています。軸径はモーターに合わせて5mm。止めネジの穴のバリを削る必要があるかもしれないので、軸穴に入るような金属ヤスリも持っていたほうが良いです。
    * 最初はそのまま利用していたのですが、迷路の段差に引っかかることが多かったので、タイヤを少し大きくしました。ホイールに両面テープを適当に巻いて、その上からタイヤをはめているので、少し大きくなっています（実測で52mm）。どの程度段差対策になっているのかは、これから検証です。

以上
λProlog ELPI 便利帳

λProlog 便利帳
--------------------------


2023_02_08 @suharahiromichi

2023_02_12 @suharahiromichi


# 演算子と束縛子


|Math font      | Concrete syntax font  | Type          |
|:-------------:|:---------------------:|:-------------:|
| ∧             | & または ,            | o -> o -> o  |
| ∨             | ;                     | o -> o -> o  |
| ⊃             | =>                    | o -> o -> o   |
| ⇐             | :-                    | o -> o -> o   |
| λ            | \\                    | 束縛子      |
| ∀             | pi                    | (A -> o) -> o |
| ∃             | sigma                 | (A -> o) -> o | 


``not`` と ``!`` (カット)は、通常の述語である。


# 2項述語

| 述語 | Concrete syntax font | type | 同じ定義 |
|:----:|:--------:|:---------------------:|:---------:|
|      |  =       | A -> A -> o  | 
| lt_  |  <       | A -> A -> o  | i<、r<、s<
| gt_  | >        | A -> A -> o  | i>、r>、s>
| le_  | =<       | A -> A -> o  | i=<、r=<、s=<
| ge_  | >=       | A -> A -> o  | i>=、r>=、s>=
| calc | is       | A -> A -> o  | 

calc と (is) では、引数の順番が逆になる。



# calc (is) の演算子

整数
```
type (i-) int -> int -> int.
type (+) int -> int -> int.
type (i+) int -> int -> int.
type (*) int -> int -> int.
type (mod) int -> int -> int.
type (div) int -> int -> int.
type (~) int -> int.              (* opposite *)
type (i~) int -> int.             (* opposite *)
type abs int -> int.
type iabs int -> int.
type max int -> int -> int.
type min int -> int -> int.
```

## 浮動小数点数
```
type (r-) float -> float -> float.
type (+) float -> float -> float.
type (r+) float -> float -> float.
type (*) float -> float -> float.
type (/) float -> float -> float.
type (~) float -> float.          (* opposite *)
type (r~) float -> float.         (* opposite *)
type abs float -> float.
type rabs float -> float.
type max float -> float -> float.
type min float -> float -> float.
type sqrt float -> float.
type sin float -> float.
type cos float -> float.
type arctan float -> float.
type ln float -> float.

type floor float -> int.
type ceil float -> int.
type truncate float -> int.
type int_to_real int -> float.
```

## 文字列
```
type (^) string -> string -> string.
type size string -> int.
```

## 文字と整数の変換
```
type chr int -> string.
type rhc string -> int.
```

## 文字列と数値の変換
```
type string_to_int string -> int.
type int_to_string int -> string.
type real_to_string float -> string.
type substring string -> int -> int -> string.
```

# 組込述語

## ELPI

- elpi/src/builtin.elpi

(<) などのELPIの組込述語


- elpi/src/builtin_stdlib.elpi

std. のELPIの組込述語


- elpi/src/builtin_map.elpi

std.map. のELPIの組込述語


- elpi/src/builtin_set.elpi

std.set. のELPIの組込述語


## Coq-ELPI

- coq-elpi/elpi-builtin.elpi

(elpi/src/builtin.elpi と同じ)


- coq-elpi/coq-builtin.elpi


- elpi/coq-lib.elpi

- elpi/coq-HOAS.elpi

- elpi/elpi-ltac.elpi
- elpi/elpi_elaborator.elpi

- elpi/elpi-tactic-template.elpi
- elpi/elpi-command-template.elpi
- elpi/coq-elaborator.elpi

- elpi/coq-elpi-checker.elpi- elpi/elpi-reduction.elpi

以上
【Laravel】祝日を取得するライブラリ

Laravelで祝日を扱うことがあり、Yasumiというライブラリが便利でした。

https://github.com/azuyalabs/yasumi

## インストール
```
composer require azuyalabs/yasumi
```
## 使用例
```php
<?php
use \Yasumi\Yasumi;

// 日本の2023年の祝日を取得
$holidays = Yasumi::create('Japan', '2023');
$holidayArray = $holidays->getHolidayDates();
```

```php
// $holidayArrayの中身
array (
  'newYearsDay' => '2023-01-01',
  'substituteHoliday:newYearsDay' => '2023-01-02',
  'comingOfAgeDay' => '2023-01-09',
  'nationalFoundationDay' => '2023-02-11',
  'emperorsBirthday' => '2023-02-23',
  'vernalEquinoxDay' => '2023-03-21',
  'showaDay' => '2023-04-29',
  'constitutionMemorialDay' => '2023-05-03',
  'greeneryDay' => '2023-05-04',
  'childrensDay' => '2023-05-05',
  'marineDay' => '2023-07-17',
  'mountainDay' => '2023-08-11',
  'respectfortheAgedDay' => '2023-09-18',
  'autumnalEquinoxDay' => '2023-09-23',
  'sportsDay' => '2023-10-09',
  'cultureDay' => '2023-11-03',
  'laborThanksgivingDay' => '2023-11-23',
)
```

今回は、この配列の値をフロント側に渡し、「１ヶ月分の日付の表のうち、この配列に含まれる日付の場合はセルの色を変更する」という対応をしました。

他にもたくさん便利な使い方があるようです。
日本語で祝日の名前を取得できるのも便利ですね！

https://qiita.com/sola-msr/items/7901835b3bfe145de033
YouTubeAPIのレスポンス値を新規ファイルに書き込んで保存する

# はじめに
Pythonで、YouTubeAPIを使って遊んでいて
レスポンス結果をprintして、
これを見やすいように整形して...とすると大変だったことや
他の人に見せる時に（荒いですが）保存していたら楽だなと思い作成してみました

# 仕様
日時のファイル名のファイルを作成し
そこにAPIのレスポンスパラメータを書き込んで保存する

# コード
```python
import json
import requests
import datetime

# 現在日時を取得し、str型のYYYYmmddHHMMSS形式にします
date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

apiKey = 'ここにYouTubeAPIのKeyを設定'
channelId = 'ここにチャンネルIDを設定'

# APIリクエストを送信して、動画の一覧を取得
url = f"https://www.googleapis.com/youtube/v3/search?key={apiKey}&channelId={channelId}&part=snippet&order=date&maxResults=50"

# YouTubeAPIを叩いて、レスポンスパラメータを変数responseに格納
response = requests.get(url)

# レスポンスパラメータがjson形式なので、見やすいように整形する
strResponse = str(json.dumps(response.json(), indent=4))

# ファイル名が日付のファイルを書き込みモードで作成
file = open(f'{date}.txt', 'w')

# ファイルに書き込む
file.write(strResponse)

# ファイルを閉じる
file.close()
```

最後のファイルへ書き込みの処理はwithを使うと短く書けます
```
with open(f'{date}.txt', 'w') as file
  file.write(strResponse)
```

APIのレスポンスパラメータを見やすいように保存したり
管理できるようにする良い方法を探していきたいです。カイゼン
AWS AppFlow 「エラー処理」の設定について

# 概要

- AppFlowの設定にて「エラー処理」の設定にによる振る舞いの違いを簡単にまとめる。

![Edit_flow_-_フロー設定を編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/71c92d09-304f-b0ba-c3ef-e93c6ff2d8e7.png)

# 「現在のフロー実行を停止する」の場合

- 送信元のファイルなどに不備があり同期が出来ない場合、フローを失敗として終了する。
- 同期出来ない情報までの他の情報は同期される。
- 同期出来ない情報以降の他の情報は同期されない。
- 転送できなかったデータを書き込むバケットとフォルダを指定しておけば不備があった場合の詳細をファイルとして出力指定くれる。
- AppFlowのフローにはロールバック機能などはない。
- 簡単に説明する
    - 送信元のファイルがCSVでデータ部分が4行で構成されていたとする。
    - ３行目のデータに不備があり同期出来ない。
    - この場合本設定で同期を実行すると1行目と2行目までは同期される。
    - 3行目を同期しようとしてエラーとなりフローが失敗終了する。
    - 「転送できなかったデータを書き込む」の設定でバケット名とフォルダ名を指定しておけばレポートファイルを出力してくれる。
    - 4行目はデータに不備があろうがなかろうが、3行目で失敗終了しているので同期されない。
    - 逆に1行目と2行目は既に同期済みのため、フローが失敗終了したにも関わらず同期されている。

# 「フロー実行を無視して続行する」の場合

- 送信元のファイルなどに不備があり同期が出来ない場合でもフローは続行される。
- 同期出来ない情報までの他の情報は同期される。
- 同期出来ない情報の他の情報も同期される。
- 同期出来ない情報だけが同期されない。
- フローは動悸できない情報があっても失敗終了しない。
- 転送できなかったデータを書き込むバケットとフォルダを指定しておけば不備があった場合の詳細をファイルとして出力指定くれる。
- 簡単に説明する
    - 送信元のファイルがCSVでデータ部分が4行で構成されていたとする。
    - ３行目のデータに不備があり同期出来ない。
    - この場合本設定で同期を実行すると1行目と2行目と4行目は同期される。
    - 3行目を同期しようとして不備を発見してもフローは失敗終了しない。
    - 「転送できなかったデータを書き込む」の設定でバケット名とフォルダ名を指定しておけばレポートファイルを出力してくれる。
【WordPress】「Advanced Custom Fields」を使用して、繰り返しフィールドを表示

WordPressのプラグイン「Advanced Custom Fields」を使用して、繰り返しフィールドの表示方法を紹介します。
管理画面（固定ページなど）で決まった項目を繰り返し入力したい時に便利です。
また、管理画面内で並び替えも可能です。

:::note warn
「Advanced Custom Fields Pro」のみで提供されている機能です。
:::

1.フィールドグループを新規追加
-
「Advanced Custom Fields」の設定から「新規追加」ボタンをクリックして遷移したページにて、「フィールドを追加」ボタンをクリック。
![acf_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127879/6e15330c-3547-2549-0fa7-526ddf96cff2.png)

2.「繰り返しフィールド」を使う
-
①フィールドタイプで「繰り返しフィールド」を選択。
②サブフィールドの「フィールドを追加」ボタンをクリックして、任意のフィールドタイプを設定。
![acf_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127879/5eb88686-3d48-b730-97d5-de01f21f1a9c.png)

3.フィールドを表示するページに記述
-
繰り返しフィールドを表示するためにはループを使用します。
以下のコードをフィールドを表示するphpファイルに記述したら表示完了です！

（例）
リピーターフィールド名 → repeater_field_name
サブフィールド名 → sub_field_name
```
<?php if(have_rows('repeater_field_name')): ?>
<?php while(have_rows('repeater_field_name')): the_row(); ?>
<?php the_sub_field('sub_field_name'); ?>
<?php endwhile; ?>
<?php endif; ?>
```

:::note info
サブフィールドを表示するときは「the_field」ではなく、「the_sub_field」使う。
:::
【自作アプリ　収支アプリ】その２　〜画面レイアウト　DB周り〜

## 収支アプリ　途中経過

### 画面レイアウト
この１ヶ月強で作成した画面をまとめてみます。レイアウトしか載せることが出来ませんが、DB周りかなり苦戦したのでそれなりに時間がかかってしまいました。

（株式投資のアプリケーションなのに途中からおまけで作ろうとしていた固定費計算ページに力を入れてしまった。ただSELECT INESRT UPDATE DELETE の基本的な枠組みを作成することが出来たので株式投資計算ページも同じ容量で作成することが出来るので無駄な時間では無かったと確信。）
#### トップ画面
![トップ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/74e5d374-290d-0cab-a8a8-b27533cb0c9a.png)

#### ログイン画面
![ログイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/9027e643-adec-7f4f-cb89-47aaddcd4b5b.png)

#### 新規登録画面
![新規登録画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/e2997ecb-c066-291a-27e9-4d6cff285f62.png)

#### エラーメッセージ
![エラーメッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/e500a691-f8e7-9e39-cde7-d57252c074bd.png)

#### 固定費ページ１
![固定費ページ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/4b1126a1-0787-5aa0-6eaf-f50472168f6c.png)

#### 固定費ページ２
![固定費ページ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/e72668d8-499b-1bb5-a4fe-4e388d683550.png)


### まとめ
目標　：　3月末までには完璧なアプリケーションに育てていきたいと思っています。
正規表現

# 正規表現の練習
## ①参照URL:CodePen
https://codepen.io/codepen112233/pen/dyXmOOG
- 自分で編集できる。そしてすぐに反映されるため、いつでもどこでも練習ができる。

## ②参照URL:正規表現 オンライン教材
http://www2.otani.ac.jp/fkdsemi/seikihyogen/mondai.html
- 問題形式となっている。
- 問題を解きながら正規表現を覚えることができる。

# まとめ
- ②のオンライン教材(無料)を試しつつ、自分で気になった正規表現があれば①のCodePenを試してほしい。
- 他にも良いサンプルがあれば教えてほしい。
Miroでシステム化要件【画面イメージ／画面レイアウト】

## はじめに

オンラインホワイトボードツール「Miro」にはワイヤーフレームを作成する機能が備わっています。

このワイヤーフレーム作成機能を使って、システム化要件時に必要となる「画面イメージ／画面遷移図／画面レイアウト」を作成したところ、PowerPoint や Excel 等を使用するよりも容易に感じました。

本記事では「画面イメージ／画面レイアウト」と「Miro」での描き方について、ご紹介します。
「画面遷移図」については[こちら](https://qiita.com/tamaday/items/94af9158e79eec21a71e)です。


## 画面イメージ／画面レイアウトの違い

まずは、「画面イメージ」と「画面レイアウト」の役割の違いをまとめます。

| ドキュメント   | 役割                                                                                            |
| -------------- | ----------------------------------------------------------------------------------------------- |
| 画面イメージ   | UI(User Interface)の標準化<br> フォントや機能ごとに色を統一する等、操作性や視認性の向上を目指す |
| 画面レイアウト | 開発の規模感を把握する<br> テキストボックス、ボタン等を配置して画面項目数を把握する             |


## Miro のワイヤーフレーム機能

左端のツールバーから「その他のツール」を選択し、その中から「ワイヤーフレームライブラリ」を選択します。（画像１）
ドラッグ＆ドロップでメインツールバーに移動することもできます。

（画像１）
![miroSystemRequireimg_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/9e180c25-1a97-b381-b577-641f65c49c2b.png)

コンポーネントにはテキストボックス、ボタン、トグル、チェックボックス等が揃っています。（画像２）
そのまま貼り付けて使用するだけでなく、コンポーネント内へのアイコンの挿入、ボタンに有効／無効の状態を設定等、各コンポーネント独自の機能も存在します。

（画像２）
![miroSystemRequireimg_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/d5905d6f-2860-2773-f89b-ad02f59847dc.png)

特に便利だと思ったのは、デバイスタイプのワイヤーフレームです。

デバイスタイプのワイヤーフレームは内部に設置したコンポーネントを自動でグループ化し、一緒に移動・コピーすることができます。

標準では「スマートフォン」「タブレット」「ブラウザ」の 3 種類のコンポーネントに用意されている機能ですが、① 対象図を選択し、右上の「…」をクリックして、「Creat Frame」を選択する（画像３）又は ② フレームから選択する（画像４）ことで、同様の機能を持たせることが可能です。

（画像３）
![miroSystemRequireimg_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/28bdb9a6-83ee-0672-4954-3aef05bd5118.png)

（画像４）
![miroSystemRequireimg_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/2b429807-e6e9-45ac-c968-171c870ed216.png)

実際にこのような画面イメージや画面イメージレイアウトを作成することができました。
![miroSystemRequireimg_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/102b2d03-cf16-0425-f0b2-0d4d6bba20a7.png)

![miroSystemRequireimg_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/ebef88c1-f6e6-cd45-a292-362f9ec398f4.png)

## 公式サイト

Miro[（公式サイト）](https://miro.com/ja/)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。

## 関連した投稿

[Miroでシステム化要件【動く画面遷移図】](https://qiita.com/tamaday/items/94af9158e79eec21a71e)
[要件定義で使用するフロー図の違い](https://qiita.com/tamaday/items/d5bfd722e3390b5a669e)
[Miroでファイルをエクスポートする方法](https://qiita.com/tamaday/items/cd3bfd4cb1a15360fe63)
[Miroはまず何から始めたらいいのか？](https://qiita.com/tamaday/items/091116a575278bc1441e)
[Miroのボードは無料版だと全世界に公開される？](https://qiita.com/tamaday/items/82e7b9dfd70692488dd2)
BigQuery エクスポートをしている GA4 のプロパティを、別のプロパティに切り替えた際の作業ログ

# 作業実施の背景

ある Firebase プロジェクトに、GA4 プロパティ(プロパティA)が連携済みだとします。
とある事情で一度連携を解除し、別の GA4 プロパティ(プロパティB)を連携しました。

元々プロパティAは、BigQuery へデータをエクスポートしていたため、プロパティBでも BigQuery へのエクスポートを行ったのですが、プロパティIDが変わったため、別のデータセットが出来上がりました。

今後のことも考え、データソースは1つに集約させた方が良いと判断し、BigQuery に存在しているプロパティAのシャーディングテーブルを、プロパティBのシャーディングテーブルに移行することにしました。

この記事は、その際に行った作業内容を記述したものになります。
※あくまで一例であり、この手順が一番最適であるとは限りませんのでご注意ください。

## 前提

移行したいプロパティAのシャーディングテーブルは、`analytics_111111`データセットにあり、2021年1月1日〜2023年2月7日までのシャーディングテーブルが存在しています。
新しく作成したプロパティBのシャーディングは、`analytics_222222`データセットに存在にあり、2023年2月7日のシャーディングテーブルまで存在しています。

作業日は、2023年2月8日に行っています。

## 移行元であるプロパティAのシャーディングテーブルの日付部分を抽出

下記 SQL を実行して、移行したいシャーディングテーブルの期間を抽出します。

```sql
SELECT
REPLACE(STRING_AGG(CONCAT('"', partition_name,'"') ORDER BY partition_name ), ","," ")
FROM 
(
  SELECT 
  DISTINCT event_date AS partition_name 
  FROM 
  `project_id.analytics_111111.events_*`
  WHERE 
    _TABLE_SUFFIX BETWEEN '20210101' AND '20230206'
  ORDER BY PARSE_DATE("%Y%m%d", event_date)
)
```

## プロパティBのシャーディングテーブルにコピー

CLOUD SHELL を開き、コピー用のシェルスクリプト`bq_cp.sh`を作成します。
`tables`変数には、先程抽出したシャーディングテーブルの期間の文字列を渡してください。

```shell:bq_cp.sh
tables=("20210101" "20210102" ... "20230205" "20230206")
for val in ${tables[*]}; do
  bq cp -a analytics_111111.events_$val analytics_222222.events_$val
done
```

`$ /bin/sh bq_cp.sh`でシェルスクリプトを実行し、コピーが完了するのを待ちます。

## 最新のシャーディングテーブルの差分を埋める

切り替えた日のみ、`analytics_111111.events_20230207`と`analytics222222.events_20230207`にレコードが分散しているので、`analytics222222.events_20230207`に寄せます。

```sql
-- 新しいプロパティに対して、切り替えた日の一時テーブルを作成
CREATE TABLE `project_id.analytics_222222.tmp_events_20230207` 
AS 
SELECT * FROM `project_id.analytics_222222.events_20230207`;


-- 一時テーブルに、古いプロパティの切り替えた日のレコードを挿入
INSERT INTO `project_id.analytics_222222.tmp_events_20230207` (event_date, event_timestamp, event_name, event_params, event_previous_timestamp, event_value_in_usd, event_bundle_sequence_id, event_server_timestamp_offset, user_id, user_pseudo_id, privacy_info, user_properties, user_first_touch_timestamp, user_ltv, device, geo, app_info, traffic_source, stream_id, platform, event_dimensions, ecommerce, items)
SELECT 
  *
FROM 
  `project_id.analytics_111111.events_20230207`;


-- 新しいプロパティの切り替えた日のシャーディングテーブルを削除
DROP TABLE `project_id.analytics_222222.events_20230207`;


-- 一時テーブルを切り替えた日のシャーディングテーブルとして作成
CREATE TABLE `project_id.analytics_222222.events_20230207`
AS 
SELECT * FROM `project_id.analytics_222222.tmp_events_20230207`;


-- 一時テーブルを削除
DROP TABLE `project_id.analytics_222222.tmp_events_20230207`;
```


一通り確認し、問題なさそうであれば、プロパティAの`analytics_111111`データセットを削除すれば完了です。
Ruby scanメソッド

# scanメソッド
対象の要素から引数で指定した文字列を数え、配列として返します。

```ruby
def count_hi(str)
  puts str.scan("hi")
end
# 呼び出し例
count_hi('abc hi ho')
```

```ruby
hi
# ターミナル出力
```

scanの公式リファレンスです。<br>
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html

# scanメソッドを使ってプログラムを作成します

以下条件です。
- 条件1:対象となる文字列の中から、"is"という特定の文字列の数を取得すること
- 条件2:上記で取得した数を出力すること

```ruby
def count_hi(str)
  puts str.scan("is").length
end
# 呼び出し例（引数には対象となる文字列を指定します）
count_hi("This is a pen.")
```

```
2
# ターミナル出力
```

## 解説
今回は"is"という文字列がいくつあるかを返してもらえるように記述していきます。
scanメソッドは対象の文字列の中に"is"があるだけ"is"として返してきます。
isがいくつあるのか数を知りたいときは、lengthメソッド(.length)を付け加えます。
vscode ファイル名のtab height調整

デフォルトだと高すぎて貴重なスペースを無駄にしてしまう。
自分へのメモ的書いておく。
# cssをいじれる拡張をインストール

メジャーなのがvscode-custom-cssだそうで、自分はなぜかうまくいかなくてCustom VSCode UI CSSにした。

# vscode権限変更

自分の環境がubuntu。
```bash
sudo chown -R $(whoami) $(which code)
sudo chown -R $(whoami) /usr/share/code
```

# tab height をいじるcssファイル作成

```css
:root {
  --tab-height: 15px;
}

.editor-actions {
  height: var(--tab-height) !important;
  line-height: var(--tab-height) !important;
}

.tabs-container .tab {
  height: var(--tab-height) !important;
  line-height: var(--tab-height) !important;
}

.tabs-container .monaco-icon-label {
  height: var(--tab-height) !important;
  line-height: var(--tab-height) !important;
}

.tabs-container .monaco-icon-label:before {
  height: var(--tab-height) !important;
  line-height: var(--tab-height) !important;
}

.monaco-workbench .part.editor>.content .editor-group-container>.title .monaco-scrollable-element {
    height: var(--tab-height) !important;
}

```

# setting.jsonにて読み込む

```json
 "customvscodeuicss.css": "/PATH_TO_YOUR_CSS_FILE/custom.css",
```
F1押して-> customvscodeuicss: Reload Configuration で更新

以上
プルリクをマージした後のブランチにCommit＆Pushするとどうなるのか。

# プルリク（PR）をマージした後のブランチにPushするとどうなるのか。
表題の通りです。
普段は、対応通りにブランチを切って、PRがマージされたらブランチを消してるんです。

1. main　→　develop →　feature
で
feature → develop
でPRを出す。
1. 無事マージされてPRがクローズされる。
1. feature で更新があり、コミットとプッシュがなされる。
1. どうなる？？？？（表題の疑問）

## 結論
developで止まる。
mainに反映させたい場合はdevelopブランチからmainブランチに向けてPRを出して
それをマージすることで実現できる。

## 確認手順
1. 　Githubにリポジトリを用意する。
1. 　mainブランチを作成する。
1. 　mainブランチからdevelopブランチを作成して、PRをmainブランチに向けて出す。
1. 　PRをマージする。（delete branchしない）
1. 　developブランチからfeatureブランチを作成する。
1. 　feautreブランチからdevelopブランチに向けてPRを出す。
1. 　PRをマージする。
1. 　developブランチにfeatureブランチの内容がマージされる。（mainブランチには内容がマージされない）
【Xcode】検索機能をフル活用しよう

# はじめに
最近は忙しくて時間がないのでなるべく作業を効率化したいです。
最高に作業を効率化できるXcode検索コマンドを記事にします。

# 検索方法
### ファイル内検索
`command` + `F`

![スクリーンショット 2023-02-08 20.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e7ddb1bb-aaa9-e2bb-608f-a289223dfed4.png)

### プロジェクト内検索
`command` + `shift` + `F`

![スクリーンショット 2023-02-08 20.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e7974ef0-79c2-b39b-b2cd-16ee568b2f57.png)

### Open Quickly
`command` + `shift` + `O`

![スクリーンショット 2023-02-08 20.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/182db152-f51a-90b6-15d5-5f37c34f12f5.png)

# おわり
検索コマンドを覚えて爆速開発しましょう！
gzファイルとは

## gzファイルとは？
- gzipコマンドを用いて圧縮されたファイル形式のこと
- UnixOS系に搭載されている（故にWindowsではあまり見かけない）

### 特徴は？
- 高い圧縮率と高速な伸縮性があり広く用いられる
- Deflate形式を用いられている
- ファイルアーカイブ機能がないことから「tar」と用いられることも多い
   - その場合のファイル名は`tar.gz` `.tgz` `.tar.gzip`となる

## 作成コマンド
```
gzip ファイル名
```

## 解凍コマンド
```
gzip -d  ファイル名
```
Ruby if, elseを使ったプログラム

# if, elseを使ってプログラムを書きます。
あなたは警官です。aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
※問題文で登場したaとb二人の容疑者は、今回実装するpolice_troubleメソッドの引数として取り扱っていきます。

条件は以下の通りです。
- 条件1:第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
- 条件2:第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
- 条件3:第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること

```ruby
def police_trouble(a, b)
  if (a && b) || (!a && !b)
    puts "True"
  else
    puts "False"
  end
end
```

# 解説
この問題は、論理演算子を用いて作成していきます。<br>
下記参考までに。
```ruby
# aもbもtrueの場合にtrue 
a && b

# aかbのどちらかがtrueの場合にtrue
a || b 

# aがtrueの場合にfalse、aがfalseの場合にtrue
!a
```

今回、Trueで返される内容（条件1, 2）は論理演算子を使ってまとめて条件式を記述しました。

(a && b)→条件1の内容。
||→または
(!a && !b)　→条件2

elseはそれ以外は"False"を返すという条件式になります。
【GCP】kubectl よく使うコマンド集

# よく使うkubectlコマンドのまとめ・コマンド集
自分用のメモとして、Kubernetes上のサービスの運用時によく利用するコマンドをまとめています。

## コマンド一覧

### secret config の取得
```
kubectl get secret {secret名} -o yaml
```

#### (併せて使える) base64からのdecode処理
```
echo "{上記コマンドの実行結果のbase64でエンコードされたデータ}" | base64 --decode
```

### secret config の編集
```
kubectl edit secret {secret名}
```

### namespaceに該当する全てのpodのリスタート
```
kubectl -n {namespace名} rollout restart deploy
```

```
kubectl -n default rollout restart deploy
```

### 特定のrevisionにロールバック
```
kubectl rollout undo deployment/{deployment名} --to-revision={revision_id}
```

### スケールアップ/スケールダウン
```
kubectl scale --replicas={設定したいpod数} deployment {deployment名}
```

### 全ての”Evicted”ステータスのpodを削除
```
kubectl get pod | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
```

### 全ての"UnkonwnStatus"ステータスのpodを削除
```
kubectl get pod | grep ContainerStatusUnknown | awk '{print $1}' | xargs kubectl delete pod
```

### node poolを取得
```
kubectl get node
```

### node pool全体のCPU usage等を出力
```
kubectl describe nodes {cluster名}
```

### ingress更新
```
kubectl describe ingress {ingress名}
```

### Docker内でコマンドを実行する
```
kubectl exec {pod名} -it -c {deployment名} -- /bin/sh
```
C#で他フォームのコントロールを参照する

# 1. はじめに
* SplitContainerコントロール内のパネルにフォームをセットしたい
* SplitContainerコントロール内のフォーム間のデータを参照、更新したい

# 2. 子フォームを準備する
## 3.1. 新しいフォームを作成する
* Sub1, Sub2の2つのフォームを準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4b00eca5-202f-53c3-3d62-4aaa14055756.png)

## 3.2. コンストラクタに親フォームを受けるようにする
```csharp
namespace WinFormsApp1
{
    public partial class Sub1 : Form
    {
        // メインフォームのプライベート変数
        private Main _main;
        public Sub1(Main main)
        {
            InitializeComponent();

            // コンストラクタで変数にセット
            _main = main;
        }
    }
}
```

## 3.3. FormBorderStyleに```None```をセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/08523b0e-9882-1489-6aac-b4e052d83374.png)

* タイトルバーが非表示になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b9b5b176-7031-6f29-3bd3-c98797cc1aba.png)

## 3.4. 動作確認用にボタンを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/91c13e8d-e459-4921-9662-fd89ac2fcd7d.png)

```csharp
namespace WinFormsApp1
{
    public partial class Sub1 : Form
    {
        // メインフォームのプライベート変数
        private Main _main;
        public Sub1(Main main)
        {
            InitializeComponent();

            // コンストラクタで変数にセット
            _main = main;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _main.Text = "Sub1";
        }
    }
}
```

# 4. メインフォームの準備
## 4.1. SplitContainerを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/2d4ccca2-5241-54b2-8d15-af930ab63bc8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/23603a65-b4dc-cd8b-019e-f9abc684601f.png)

## 4.2. Loadイベントを修正して、子フォームに親フォームを渡すようにする
* SplitContainerにフォームをAddする場合、TopLevelプロパティを```false```にする必要がある

```csharp
namespace WinFormsApp1
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)
        {
            // 子フォームを作成
            Sub1 sub1 = new Sub1(this);
            Sub2 sub2 = new Sub2(this);

            // TopLevelプロパティにfalseをセット
            sub1.TopLevel = false;
            sub2.TopLevel = false;

            // パネルにセット
            splitContainer1.Panel1.Controls.Add(sub1);
            splitContainer1.Panel2.Controls.Add(sub2);

            // 子フォームを表示
            sub1.Show();
            sub2.Show();
        }
    }
}
```

## 4.3. 親フォームのコントロールにアクセスする場合
* コントロールのModifiersプロパティが```private```だとアクセスできないので、```public```等に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5732e521-faf8-e56a-4fc4-4eb42800bd02.png)

# 5. 操作確認
* 起動時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/28711b6b-e5ad-64c0-bea6-5e16e005b5da.png)

* ボタンクリック時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/41050256-02db-d18f-8802-1f484ea0252d.png)
* タイトルが```Sub1```に変更できた

# 6. 参考文献

https://hiropon-progra.com/csharp-form-in-form/

http://tukaenai-pg.cocolog-nifty.com/blog/2006/05/c__2de6.html
[AWS]VPCの作成からサブネットの配置まで

# VPCの概要と作成

### VPCとは?

　本来インフラを構築する際に自前でサーバーやネットワーク機器など準備する必要があります。しかし、AWSが提供するクラウドサービスは、これらのインフラ設備やインフラにかかるコストなどを抑えることができ、誰でも簡単にインフラを構築できるようになりました。AWSでネットワーク(インフラ管理者が主体となって管理する場所)を構築するのにVPCを使うことでAWSが管理するサーバーが仮想的なネットワークの構築を実現しています。

よってVPCは、AWS内に論理的に分離した領域をプロビジョニングして、利用者が独自に設定したネットワークを構築できるようになりました。




### VPCの作成

(AWSコンソール画面)
![スクリーンショット 2023-01-31 20.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/faa4ac66-9160-35ce-2902-d8c8ed6d4df1.png)


IPアドレス
=> ネットワーク上の機器が通信する時の宛先。IPアドレスにはネットワーク部(どのネットワーク)とホスト部(どのコンピュータ)で構成されている。

CIDR
=>IPアドレスのネットワーク部・ホスト部の桁数を自由に決めることができるようにした仕組み


<br>
<br>

(VPCイメージ図)
![AWS VPC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/13354afb-d4b9-2f98-ac0c-5f81b447cd34.jpeg)


# サブネットとアベイラビリティゾーン

VPCの中には、アベイラビリティゾーン一に１つ以上のサブネットを作成する必要があります。サブネットの役割は、外部に公開するリソース(パブリックサブネット)と公開してはいけないリソース(プライベートサブネット)とを分けることができ、これはネットーワークの管理をしやすくするメリットがあります。

また、AWSには世界中に展開されている拠点単位でクラウド領域が存在しており、その拠点をリージョンと言います。このリージョン中にはアベイラビリティゾーン(以下AZ)と呼ばれるデータセンター群が複数存在しており、AZ間は高速回線があるために低レイテンシーを実現しています。一般的なネットーワーク構築には、２つ以上の物理的に離れた所にあるAZ内にサブネットを配置することによって、耐障害性を高める仕組みを採用しています。

# サブネットの作成
今回のインフラの構成としては、東京リージョンにある２つのAZ間(1a, 1c)に公開用サブネット(public)と非公開用サブネット(private)を作成し、マルチAZ構成によって可用性の高いネットワーク構築を行います。

| サブネット | サブネット名 | AZ | CIDR |
| :---: | :---: | :---: | :---: |
| 公開サブネット① | sample-subnet-public01 | 1a |  10.0.0.0/20  |
| 公開サブネット② | sample-subnet-public02 | 1c |  10.0.16.0/20 |
| 非公開サブネット① | sample-subnet-private01 | 1a |  10.0.64.0/20 |
| 非公開サブネット② | sample-subnet-private02 | 1c |  10.0.80.0/20 |

(AWSコンソール画面)
![VPC public01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/9c134168-01ad-ec39-b7dd-3b11efab0b25.png)


上部の画像のように、先ほど作成した"sample-vpc"にサブネットを４つ作成します。

# インターネットゲートウェイの設定
VPC、サブネットを作成しましたがこのままでは、VPC内のリソースとインターネットの相互通信ができません。そのためインターネットゲートウェイ(IG)を作成して、VPCとインターネットを繋ぐ入り口を作成していきましょう。

インターネットゲートウェイは"sample-igw"という名前で作成し、VPCにアタッチするのも忘れずに。

(イメージ図)
![AWS VPC (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/45696acc-a85d-bddd-8e2b-49cd4321c124.jpeg)

# 参考
AWSではじめるインフラ構築入門 翔泳社出版


https://www.sbbit.jp/article/cont1/51188
gaugeのプラグインがIntellijで動かない(Specから定義ファイルに移動できない)

# はじめに

転職して社内で一番利用している技術として「gauge」があります。
このツール最高なのですが、人の環境でしか触ったことがなく、自分の環境で作成したところうまく動かなかったので記事にしました

社内でも多くのイシューがあったのでつまづきやすいようです

# 問題

```spec:display.spec
# 記事を表示する

## 適当なHTMLが表示される
* 記事ページを開く
* 記事ページにタイトル"タイトル"が表示されていること
```

このようなspecを書いたときに、Intellijのプラグインが適応されている場合に、`Ctrl+クリック`でテストの定義ファイルに移動できるはずなのですが、なぜか移動ができませんでした

```
移動先となる宣言が見つかりません
```

# 解決方法

`mavenプロジェクト`として取り込むことで解決しました

`pom.xml`を右クリックして`＋Mavenとして追加`からプロジェクト追加すると、動くようになりました

# おわりに

近々使用のPCに同じような環境を作るのでそこであらためて、記事にします

# 参考

https://qiita.com/kobake@github/items/71e3a57f971ba6771356
rendering_optionsが見つからない時の対処方法：Rails 7 + Devise + Turbo

:::note warn
**注意（2023/02/09追記）**
[こちらのDeviseのpull request](https://github.com/heartcombo/devise/pull/5548)はTurboに対応し、マージされてDevise 4.9.0がリリースされたらこの記事のパッチは不要になります。
:::

## Rails 7 + Devise + Turboを使うには
Rails 7のアプリでDeviseとTurboを使った時のパッチをいくつかのところで見かけました：

[【2023年版】Turboを有効化したままRails 7.0でDeviseを使う方法](https://qiita.com/jnchito/items/48db78c465493837c41f)
[Devise Auth Setup in Rails 7](https://betterprogramming.pub/devise-auth-setup-in-rails-7-44240aaed4be)
[How to use Devise with Hotwire & Turbo.js Discussion](https://gorails.com/forum/how-to-use-devise-with-hotwire-turbo-js-discussion#forum_post_17983)

こんな感じです：
```ruby:app/controllers/turbo_devise_controller.rb
class TurboDeviseController < ApplicationController
  class Responder < ActionController::Responder
    def to_turbo_stream
      controller.render(options.merge(formats: :html))
    rescue ActionView::MissingTemplate => error
      if get?
        raise error
      elsif has_errors? && default_action
        render rendering_options.merge(formats: :html, status: :unprocessable_entity)
      else
        redirect_to navigation_location
      end
    end
  end

  self.responder = Responder
  respond_to :html, :turbo_stream
end
```

僕の会社のアプリで同じコードを実装し、普通にDeviseを使っていたものの...

## エラー発生
いきなりCIが落ちる...

最後のコミットはコメントを消しただけなのに...

```
NameError: undefined local variable or method `rendering_options' for #<TurboDeviseController::Responder:0x00007f8ec49daaf8 ...
```

ということでIssueを作ったら先輩も同じ問題に遭遇し、原因は[responders](https://github.com/heartcombo/responders)というgemのv3.1.0とのこと。

ちょっと調べた結果、バグが見つかったので対処法を書いておきます。

## `rendering_options`の名前が変わった

`rendering_options`は[こちらのプルリク](https://github.com/heartcombo/responders/pull/176)で追加されましたが、[こちらのプルリクでは](https://github.com/heartcombo/responders/pull/223)その`rendering_options`が`error_rendering_options`に変わりました。それだけです！ということで、上のコードの`render`をこう書き換えたら動くはずです：
```ruby
render error_rendering_options.merge(formats: :html, status: :unprocessable_entity)
```

以上。
SAP BTP CLIを試してみた ~準備編~

## はじめに 
SAP BASIS 3年くらいやってます。
最近、BTPを触る機会が多くなってきた気がするのでコックピット上の操作だけではなく、CLIで色々できたら楽しいだろうなと思いました。
今後はベーシスとしてサブアカウント、ユーザ管理なども画面ポチポチではなくCLIベースでやっていきたいな。。。~~(なによりユーザ管理が面倒くさい)~~

## 準備
PC：Windows 11
Windows用のcliをダウンロードします。

btp cliは以下からダウンロードしました。
https://tools.hana.ondemand.com/#cloud

Help Portalからもダウンロードができます。
何故か(?)こちら側はファイル名にlatestと記載があります。
セットアップについてはこっちの方が詳しく書いていました。
https://help.sap.com/docs/btp/sap-btp-neo-environment/download-and-start-using-btp-cli-client

解凍して準備OK！

## ログインしてみた
CMDで実行してます。(ユーザ名、アカウント名は伏せています。)
~~~
C:\Users\BTP>btp login
SAP BTP command line interface (client v2.33.0)

CLI server URL [https://cpcli.cf.eu10.hana.ondemand.com]>
Connecting to CLI server at https://cpcli.cf.eu10.hana.ondemand.com...

User> User名 BTPコックピットにログインできるユーザID
Password>

Authentication successful

Current target:
  XXXXXXXX. (global account, subdomain: YYYYYYYY)

We stored your configuration file at: C:\Users\AppData\Roaming\SAP\btp\config.json

Tips:
    Commands are executed in the target, unless specified otherwise using a parameter. To change the target, use 'btp target'.
    To provide feedback about the btp CLI, use 'btp feedback' to open our survey.

OK
~~~

途中の[https://cpcli.cf.eu10.hana.ondemand.com] はbtp CLI serverだそうで、HelpPortalを見たところこれ以外指定はできない(?)みたいです。


createコマンドをヘルプで見てみます。
security/roleやrole-collectionはありますがuserが無いです。
CLIからユーザ登録などができるかはおいおい確認してみます。
~~~
C:\Users\BTP>btp --help create
SAP BTP command line interface (client v2.33.0)

Usage: btp [OPTIONS] ACTION GROUP/OBJECT PARAMS

Available "create" commands:
    btp create accounts/directory             Create a directory
    btp create accounts/environment-instance  Create an environment instance in a subaccount
    btp create accounts/resource-provider     Create a resource provider instance
    btp create accounts/subaccount            Create a subaccount
    btp create security/role                  Create a role
    btp create security/role-collection       Create a role collection
    btp create security/trust                 Establish trust from a global account or subaccount to an Identity Authentication tenant
    btp create services/binding               Create a service binding
    btp create services/instance              Create a service instance

Example of command-specific help:
    btp help create accounts/directory
~~~

## おわり
コマンドは以下のリファレンスに載っているので色々研究してみてbtp cliマスターになりたいです。短い記事ですがありがとうございました。

https://help.sap.com/docs/btp/btp-cli-command-reference/btp-cli-command-reference?q=space
ChatGTP で フォームHTML生成

　ChatGPTで、テーブルで表現した仕様から、Bootstrap5のフォームを生成してみました。

　下記のような、テーブルを spredsheets で作成し、

|ラベル|input type|choice|必須|
|:----|:----|:----|:----|
|名前|text| |○|
|フリガナ|text| |○|
|性別|radio|男性、女性|○|

ChatGPT に次のようにお願いすると
```
下記の入力項目の仕様で  bootstrap5 を利用したフォームのHTMLコードを生成して
ラベル	input type	choice	必須
名前	text		○
フリガナ	text		○
性別	radio	男性、女性	○
```


　HTMLを生成してくれました。オンラインのHTMLエディタで確認したところ、問題なく表示されています。

```html
<form>
  <div class="form-group">
    <label for="name">名前</label>
    <input type="text" class="form-control" id="name" required>
  </div>
  <div class="form-group">
    <label for="kana">フリガナ</label>
    <input type="text" class="form-control" id="kana" required>
  </div>
  <div class="form-group">
    <label for="gender">性別</label><br>
    <div class="form-check form-check-inline">
      <input class="form-check-input" type="radio" name="gender" id="male" value="male" required>
      <label class="form-check-label" for="male">男性</label>
    </div>
    <div class="form-check form-check-inline">
      <input class="form-check-input" type="radio" name="gender" id="female" value="female" required>
      <label class="form-check-label" for="female">女性</label>
    </div>
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
```

　仕様から、簡単にHTML画面を生成でき、プロトタイピングが捗りそうです。
Atom が 2023 年 2月以後 起動できなくなりました。

# 記事の概要

ファイル検索の速さから閲覧専用で利用していた Atom エディタを、2月になって起動しようとしたら異常終了してしまいました。

最終バージョンの v.1.63 にて脆弱性が見つかったとのことで、誤作動防止のために最新バージョンアプリの起動ができないようにされたとのことです。

不具合の詳細はこちらを参照のこと。 -> https://news.mynavi.jp/techplus/article/20230201-2581120/

この記事では、起動可能な旧バージョンの Atom インストールについて説明します。

## ダウンロードサイト

以下のURLからダウンロードできます。 

=> https://github.com/atom/atom/releases

v.1.60以前であれば起動できるようです。（ちなみにMacしか確認しておりません。）また、私はAtomのワークルーティンを変えたくないので使っているのですが、今後Atomはメンテナンスされませんので、ご利用は自己責任でお願いします。

# おわりに

atom.ioも閉鎖されていたのでどうやって旧バージョンを入手するか焦りました。この記事が私以外に焦っている人の手助けになれば幸いです。
docker push Retrying in 1 second EOF

エラーのためメモメモ
```bash
ec2-user:~/environment/app $ docker push 012345678901.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
The push refers to repository [012345678901.dkr.ecr.us-east-1.amazonaws.com/hello-world]
a600cfd4bd92: Retrying in 1 second 
3f1a2f7da418: Retrying in 1 second 
c5ae45af4700: Retrying in 1 second 
746a97ae2d81: Retrying in 1 second 
2d244e0816c6: Retrying in 1 second 
df330540e954: Waiting 
8a92cd794905: Waiting 
b2c122fc6a0b: Waiting 
EOF
```

`aws ecr create-repository --region us-east-1`でリージョンを統一しよう

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html
GOを使ってLaravelのSeederクラスを生成するプログラムを作った

最近、GOを学習しているのと、csvファイルのデータからLaravelのSeederを作成するタスクがあったので、Seederを作成するツールをGOを使って作ってみました。

## 作ったソース
ついでに、DBからデータを取得し、Seederを作成するプログラムも作りました。
使い方は、README.mdを参照してください。

https://github.com/murapon/generate_seeder_by_golang

## 参考にしたサイト
https://qiita.com/ikawaha/items/28186d965780fab5533d

https://chat.openai.com/chat
を使って、回答を得た。

スネークケースのファイル名をアッパーケースに変更する方法
![スクリーンショット 2023-02-08 17.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/358e0ba1-f95b-64c6-5903-526059b7780f.png)

テーブルのカラム名を取得する方法
![スクリーンショット 2023-02-08 18.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/c63120e8-8c1d-bc99-bb66-232159011b97.png)

SELECTの項目数が動的に変わるデータを取得する方法
![スクリーンショット 2023-02-08 18.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/2aff3c6b-42f9-175f-1201-4ebe4e29bde5.png)
colabでgithubする

# アクセストークンを生成する

- ここ ( https://github.com/settings/tokens ) からアクセストークンを取得する。
  - Generate new token (classic)
  - `repo` を選択

# クローンしてみる
- 設定
```python:@colab
token = '********' # 生成したトークン
repo = 'yam0u0/sample' # リポジトリ
user = 'yam0u0'
mail = '********@****.com'

! git config --global user.name {user}
! git config --global user.email {mail}
```

- クローン
```python:@colab
! git clone  https://{user}:{token}@github.com/{repo}.git
```

- ディレクトリを移動
```python:@colab
%cd sample
```

# プッシュしてみる
```python:@colab
! git add .
! git commit -m 'first commit'
! git push origin master
```

colabでgithubもなかなか使いづらい気もしますが、colab使いたいことは多いので。。
derbyへのprocedure registration

procedureを用意する。netbeansでsave and buildし、class fileを作成する
```java
public class ProcedureExample {
    public static void method(String pname) {
        try {
            Connection con = DriverManager.getConnection("jdbc:default:connection");
            String sql = "update firsttable set name = ? where id = 10";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1,pname);
            ps.executeUpdate();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
}
```
create jar from class file。
root dir(*注意)でjarを作ること。
```
jar cvf test.jar com/mycompany/mavenproject1/*.class
マニフェストが追加されました
com/mycompany/mavenproject1/Outer.classを追加中です(入=2625)(出=1377)(47%収縮されました)
com/mycompany/mavenproject1/ProcedureExample.classを追加中です(入=1178)(出=669)(43%収縮されました)
```
derbyでij起動&db connect後に以下を行う。
1. SQLJ.INSTALL_JARで、jarをサービスに登録　
2. SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYでclasspathにサービス登録
3. CREATE PROCEDUREでprocedure登録

```
java -jar %DERBY_HOME%/lib/derbyrun.jar ij
ijバージョン10.15
ij> CONNECT 'jdbc:derby://localhost:1527/data/Sample;create=true';
ij> call SQLJ.INSTALL_JAR('C:\Users\***\Downloads\db-derby-10.15.2.0-bin\db-derby-10.15.2.0-bin\test.jar','App.test',0);
文が実行されました。
ij> call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','App.test');
ij> CREATE PROCEDURE UPDATE_ITEM(IN NAME VARCHAR(20)) LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA EXTERNAL NAME 'com.mycompany.mavenproject1.ProcedureExample.method';
0行が挿入/更新/削除されました
```
SQLJ.INSTALL_JARで以下のエラーが発生した場合、
java.policyのgrantにAllPermissionを追加したらエラー解消。これでいいのかは?
```
ERROR 38000: 式の評価中に例外'java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\***\Downloads\db-derby-10.15.2.0-bin\db-derby-10.15.2.0-bin\test.jar" "read")'がスローされました。
ERROR XJ001: Java例外: 'access denied ("java.io.FilePermission" "C:\Users\***\Downloads\db-derby-10.15.2.0-bin\db-derby-10.15.2.0-bin\test.jar" "read"): java.security.AccessControlException'。

```
```
grant{
permission java.security.AllPermission;
};
```
C#のWindowsフォームで直線、四角形を配置する

# 1. はじめに
* Visual StudioのツールボックスにLineSquareのコントロールがなく困った
* 直線以外に四角形のコントロールも配置したい

# 2. 動作イメージ
* Laelコントロールで直線、四角を配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/22c2949b-0509-78ce-e630-39fe858bd7be.png)

# 3. 作成手順
## 3.1. Labelコントロールを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6556ba0d-1ea9-79d6-dc31-5f38f2056410.png)

## 3.2. Textプロパティを空白にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/533982ee-5d07-f048-7cf1-e93845004b04.png)

## 3.3. AutoSizeプロパティを```False```にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/11428702-834e-e0c4-e600-301aa8247e05.png)

## 3.4. BackColorプロパティを設定する
* 直線, 四角形の色を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/af843224-745f-fba3-81c0-87a5ecfc8e3f.png)

# 3.5. Sizeプロパティを設定する
* 直線, 四角形の長さ, 高さを調整する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4b71087d-633b-ce40-7e6c-b5b3665411b1.png)

# 4. 参考文献
https://atmarkit.itmedia.co.jp/ait/articles/0901/28/news154.html