OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHPのテンプレートで、Formヘルパーを使用せずにCSRFトークンを直接取得する方法

```php
<!-- csrfToken用の空のPOSTフォーム -->
<?= $this->Form->create(null, ['url' => '', 'type' => 'post']) ?>
<?= $this->Form->end() ?>
```

```javascript
var token = $('input[name=_csrfToken]').val();
```
関わっているプロジェクトのソースコードを見ると、上記のような記述が多数ありました。Formヘルパーのcreate()メソッドが自動的にinput:hiddenの値として出力するCSRFトークンを取得するために、このように書いているようです。

Ajaxリクエストを行う際には必ずしもForm要素を必要としませんが、CSRFトークン文字列を出力するためだけにForm::create()を記述するのはあまりスマートとは言えません。

https://book.cakephp.org/3/ja/controllers/components/csrf.html
公式ドキュメントを読んでみました。

> CsrfComponent はユーザーのブラウザーにクッキーを設定することで動作します。 フォームが Cake\View\Helper\FormHelper を用いて作成されている場合、 hidden フィールドに CSRF トークンが追加されます。 Controller.startup イベントの間、 もしリクエストが POST, PUT, DELETE, PATCH リクエストの場合は、 コンポーネントはリクエストデータとクッキーの値を比較します。

上記はドキュメント冒頭の記述ですが、ここにヒントが書いてあります。「クッキーを設定することで動作」とのことです。

```javascript
var token = "<?= $this->request->getCookie('csrfToken') ?>";
```

これでOKです。

```php
$token = $this->request->getParam('_csrfToken');
```

このようにも書いてますが、、、Requestオブジェクトが生成されるタイミングによるのでは？

もう少し公式ドキュメントが親切だといいな～と思います・・
リセットCSSのTypeScript版「ts-reset」を使用してみる

TypeScriptを使用しているとき、型の推論が意図通りではない部分があります。
そのような場合に役立つアプリケーションコードとして、ts-resetが挙げられます。

https://github.com/total-typescript/ts-reset

## ts-resetとは
ライブラリではなく、アプリケーションコードで使用するように設計されているようです。
インポートするだけで、TypeScriptの組み込み型付けを補正してくれます。

どういった推論になるのか、代表的なメソッドに絞って検証していきます。

## .filter(Boolean)
配列の各要素に対して実行するテスト関数で、`false`を返した要素を取り除きます。

### 実装前
推論結果に`undefined`が含まれています。
以下のコードで`undefined`は入らないことが決まっていますので、falsyな値を除いた型を返して欲しいです。
```ts
const filteredArray = [1, 'a', null, undefined].filter(Boolean)
// (string | number | null | undefined)[]
```

### 実装後
falsyな値はなくなり、残りの型の推論だけ行われていることが確認できます。
```ts
import '@total-typescript/ts-reset/dist/filter-boolean'

const filteredArray = [1, 'a', null, undefined].filter(Boolean)
// (string | number)[]
```

## JSON.parse
文字列をJSONとして解析し、文字列によって記述されているJavaScriptの値やオブジェクトを構築するメソッドです。

### 実装前
推論結果は`any`型になっており、なんでも受け付けてしまいます。
```ts
const json = JSON.stringify({
    name: 'John'
})

const parse = JSON.parse(json) // any
```

### 実装後
`unknown`型に推論されます。
これで型がより強固になり、型ガードを使用して型推論するようになっています。
```ts
import '@total-typescript/ts-reset/dist/json-parse'
...

type Props = {
    name: string
}

// エラー
const parse = JSON.parse(json) // unknown
console.log(parse.name) // 'parse' is of type 'unknown'

// 型ガード
function isParseProps(value: unknown): value is Props {
    return typeof value === 'object' && value !== null && 'name' in value
}
if (isParseProps(parse)) {
    console.log(parse.name) // parse: Props
}
```

## json()
fetch APIを使用している場合、`json()`メソッドを使用してデータを取得していきます。

### 実装前
`json()`使用後は型は`any`型になっています。
```ts
fetch('/')
    .then(res => res.json())
    .then(json => {
        console.log(json) // any
    })
```

### 実装後
`unknown`となります。
`JSON.parse()`と同じく、型ガードを使用して型推論するようになっています。

```ts
import "@total-typescript/ts-reset/dist/fetch";

fetch('/')
    .then(res => res.json())
    .then(json => {
        console.log(json) // unknown
    })
```

## includes on as const
`includes`メソッドは配列内に指定した値があるかを検査してくれます。
ここでは、定数に`as const`を使用した場合の挙動を見ていきます。

### 実装前
`as const`を使用したことで、テストする文字列の引数は`users`の中の値に絞られています。
以下のように、入力した値が`users`にあるか確認したい時には不都合です。

```ts
const users = ['a', 'b', 'c'] as const

const isUser = (input: string) => {
  // Argument of type 'string' is not assignable to parameter of type '"a" | "b" | "c"'
  if (users.includes(input)) {
    console.log(input)
  }
}
```

### 実装後
`as const`で**リテラル型として扱われていた型がstring型まで拡張**されています。
これにより、不都合な型の絞り込みを解消できます。

```ts
import '@total-typescript/ts-reset/dist/array-includes'

...
// string
if (users.includes(input)) {
  console.log(input);
}
...
```

## 個人的な使用感
組み込みTypeScriptでは届かない部分を補ってくれた印象です。個人的には`filter`メソッドの改善が嬉しいです。
使用頻度の高いメソッドに対して導入していき、型をより強固にする方法がいいかと感じます。

他にも対応しているメソッドがありますので、詳細はドキュメントから確認してください。

https://github.com/total-typescript/ts-reset

## 最後に
**GoQSystemでは一緒に働いてくれる仲間を募集中です！**
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=ac4a63ad2fae3d257d17
Salesforce Meetings


+ [Don't have Salesforce Meetings in Set up](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgGkj)

設定でMeetingsを検索できない

:::note
To use Salesforce Meetings, an activity sync solution such as Einstein Activity Capture must be enabled. The Salesforce Meetings features that are available to sales reps depend on which sync product you use.
 
Review the Sync Requirements and Features for Salesforce Meetings
https://help.salesforce.com/s/articleView?id=sf.meetings_setup_sync.htm&type=5
:::
AndroidTV LeanbackのListRowPresenterのデフォルトpadding

# はじめに
AndroidTV開発で欠かせないLeanbackライブラリでUIを構築するときに、デフォルトでpaddingが設定されていることにより、うまく余白をコントロールできないことがありました。
今回はListRowPresenterのデフォルトpaddingのメモです。

# 本題
厳密には、ListRowPresenterのpaddingというよりは、ListRowPresenterが保持する `ListRowView` のレイアウトにスタイルが適用されています。
```java:ListRowView
public final class ListRowView extends LinearLayout {
    public ListRowView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        LayoutInflater inflater = LayoutInflater.from(context);
        inflater.inflate(R.layout.lb_list_row, this);
        ...
    }
}
```

以下が `R.layout.lb_list_row` の中身です。
HorizontalGridViewに `rowHorizontalGridStyle` を適用しています。

```xml:R.layout.lb_list_row
...
<androidx.leanback.widget.HorizontalGridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:lb="http://schemas.android.com/apk/res-auto"
    android:id="@+id/row_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    lb:rowHeight="wrap_content"
    style="?attr/rowHorizontalGridStyle"  <-- これ />
```

遡っていくと、以下のpaddingが設定されていました。

```xml:values
    <style name="Widget.Leanback.Row.HorizontalGridView">
        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>
        <item name="android:paddingStart">?attr/browsePaddingStart</item>
        <item name="android:paddingEnd">?attr/browsePaddingEnd</item>
        <item name="android:paddingBottom">@dimen/lb_browse_item_vertical_spacing</item>
        <item name="android:paddingTop">@dimen/lb_browse_item_vertical_spacing</item>
        <item name="android:horizontalSpacing">@dimen/lb_browse_item_horizontal_spacing</item>
        <item name="android:verticalSpacing">@dimen/lb_browse_item_vertical_spacing</item>
        <item name="focusOutFront">true</item>
    </style>
```

```xml:dimens
    <dimen name="lb_browse_padding_end">56dp</dimen>
    <dimen name="lb_browse_padding_start">56dp</dimen>
    <dimen name="lb_browse_item_horizontal_spacing">8dp</dimen>
    <dimen name="lb_browse_item_vertical_spacing">8dp</dimen>
```

# 結論

デフォルトで
- vertical方向に8dp
- horizontal方向に56dp
- grid間隔はどちらも8dp

ずつpaddingが設けられていました。

これを知っていると、カスタムでレイアウトを組みたい時に色々調整できそうです。
Swift @mainとは？エントリーポイント (entry point) とは？

エントリーポイント (entry point) とは、プログラムの開始点であり、プログラムが実行される際に最初に呼び出される場所を指します。

プログラムは、実行可能ファイルとしてコンパイルされ、コンピュータで実行されます。プログラムが実行される際には、最初にエントリーポイントが実行されます。エントリーポイントは、プログラムの機能に応じて異なります。

例えば、C言語の場合、エントリーポイントは main 関数です。main 関数は、プログラムの開始点であり、プログラムの最初の命令を実行します。Javaの場合は、main メソッドがエントリーポイントです。同様に、Pythonの場合は、__main__ モジュールがエントリーポイントとなります。

モダンなアプリケーション開発では、フレームワークやライブラリが提供するエントリーポイントも存在します。例えば、iOSアプリ開発では、@UIApplicationMain 属性を使用して、アプリケーションのエントリーポイントを示すことができます。同様に、SwiftUIアプリケーションでは、@main 属性を使用してエントリーポイントを示すことができます。

エントリーポイントは、プログラムの開始点であるため、プログラムの実行の流れを決定します。正しいエントリーポイントを設定することは、プログラムが正常に実行されるために非常に重要です。



@main は、Swift 5.3以降で導入された属性（attribute）であり、SwiftUIアプリケーションのエントリーポイントを示します。具体的には、@main 属性をつけた型の main 関数がアプリケーションのエントリーポイントとして自動的に設定されます。

SwiftUIは、宣言的な構文を使用してネイティブアプリケーションを構築するためのフレームワークであり、@main 属性は、SwiftUIアプリケーションを構築するときに使用されます。例えば、以下のようなコードで @main 属性を使用してアプリケーションをエントリーポイントとして指定できます。

```swift
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```



この例では、@main 属性を使って、MyApp 構造体をエントリーポイントとして指定しています。MyApp 構造体は、App プロトコルを適合させているので、アプリケーションの設定が可能です。var body: some Scene は、アプリケーションのメインウィンドウとそのコンテンツを定義します。この例では、WindowGroup と ContentView が定義されています。 WindowGroup は、アプリケーションのウィンドウを定義し、ContentView はウィンドウに表示されるビューを定義しています。

つまり、@main 属性は、SwiftUIアプリケーションのエントリーポイントを示すために使用され、アプリケーションのメインウィンドウとそのコンテンツを定義するために使用されます。
AdmobにiOS 十四 以降に具するよし

iOS 十四 以降の改めにより、AdMobの広告布令に名残のいづるがあり。以下は、iOS 十四 以降に具するためにAdMobに行ふべきことの概要なり。

SKAdNetworkの定め
iOS 十四から、AppleはSKAdNetworkと呼ばるる広告諱を用ゐぬ方式を導入せり。これにより、応用の広告演技を追跡するための新しきよしが要となる。AdMobの定めに、iOS 十四以降のSKAdNetwork 諱を加ふる要あり。
使用者の同意の得
iOS 十四では、使用者の我よすぎ守りを強むるために、応用が使用者の資料に繋ぐ際に、明示やうなる同意を得る要あり。AdMobには、使用者の同意がための消息を示す要あり。同意の得られぬついで、パーソナライズされし広告を触るべからず。
AdMob SDKの改め
iOS 十四以降に応ゆるために、最新のAdMob SDKを用ゐる要あり。最新版には、iOS 十四以降の働きに応ゆるための改め含まれたり。
試み
iOS 十四以降の改めは、広告の演技に名残を与ふる可能性のあるため、試みがせちなり。AdMobの試み道具用ゐ、iOS 十四以降に正常に動くことを見定めたまへ。
これらの手順を行ふことに、AdMobにiOS 十四以降に具すべし。ただし、Appleの原則や罫線の改めにもおどろかす要あり。AdMobは、最新のAppleの原則と罫線に準拠する要あり。
エンジニアに知って欲しいデータベースの 領域管理

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの 領域管理について更に詳しく調べてみましょう！
![インスタスライド_202302101.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1a6c312c-902a-6275-756c-c24dfc3018a5.gif)


# データベースの領域管理とは
データベースも低レベルでは、物理ファイルに格納される。

そのため、領域管理も重要となってきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/9d148345-c6d6-05fe-2d58-127a62bdec1e.png)

# ディスク上での管理
データベース作成時には、領域をサイズ単位で指定する。
（指定なしで自動拡張もできる）

当然、その領域が一杯になるとデータベース自体がエラーとなる。

そのため、領域監視は、運用で必須となる。

※自動拡張の時は、物理的にディスク容量がFULLになると当然エラーとなる。

# INDEXとデータの領域
INDEXとデータのディスクを別にする。

データ挿入時、INDEXとデータを作成する事になる。この時、ディスクが別であれば、

同時に書き込み処理が行われパフォーマンスが向上する。

# データの断片化

データの追加、削除の繰り替えしにより、領域内にデータの断片化が発生し、パフォーマンスに影響を与える可能性があるため、

定期的にメンテナンスが必要。

場合によっては、データのエクスポート、インポートをすれば一番キレイになる。

# まとめ
ーデータベースも領域管理が必要

ー領域がいっぱいになると挿入や更新ができなくなる

ーINDEXとデータは別ディスクが理想

ーデータの断片化対策でデータのメンテナンスが必要



# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
2023/2/28主にITとかセキュリティの記事

グローバルITリーダーの78%がXDRの必要性を実感するも、XDRの認識はあいまいであることが明らかに(2/26)
https://www.jiji.com/jc/article?k=000000024.000064764&g=prt

「致命的ウイルス製造」「核コード奪取」という暗い想像 [KWレポート 人工知能の影 (2)](2/26)
https://www.afpbb.com/articles/-/3452927?cx_part=top_category&cx_position=5

分散型IDが認証の課題を解決、「IDが分散している」とはどういうことか(2/27)
https://xtech.nikkei.com/atcl/nxt/column/18/02367/021700001/

AWS上で営業支援システムを更改　ログイン障害ゼロ、処理速度6倍に コーセー(2/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/021700125/

スマホの通話を「加速度センサー」で盗聴
イヤースピーカーのわずかな振動を捉える　話者の性別は精度98％以上で的中(2/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/021600202/

送信ドメイン認証
なりすましメールを見抜く技術(2/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900032/021600054/

iOSとAndroidの寡占で「競争不十分」と公取委の調査、政府は規制に踏み切るか(2/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00086/00248/

半径1kmなら無線LAN通信が可能に、「IEEE802.11ah」とは(2/27)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/011100095/

給与のデジタル払い（Salary Payments via Digital Wallets）(2/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/022100135/

経営者は「DXで賃上げ」を語れ　生産性向上に人減らしは無用(2/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/021700132/
Transit Gatewayを作ってみる

# TransitGatewayとは
[AWSブラックベルト資料より抜粋して転載](https://d1.awsstatic.com/webinars/jp/pdf/services/20191113_AWS-BlackBelt_Transit_Gateway.pdf)

これが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/b13076ed-eab2-9ed4-acf2-1a8082eb8f1c.png)

こうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/e9559a37-17a2-3e11-b36e-182258c65bb7.png)


AWSを触ってたとはいえ、小さなWebシステムを細々と構築していた身なので、TransitGatewayは触ったことなかった。ただブラックベルト資料を見て思ったのは「これ、オンプレミスでいうコアスイッチじゃね？」ということ。

[ネットワークの階層設計：3階層ネットワーク（ネットワークエンジニアとして）](https://www.infraexpert.com/study/catalyst2.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/4d733942-493c-1c6b-fd8c-050c5c82c432.png)

そういう捉え方をすればすんなり理解できる。上図でいう1F、2F・・・の部分がAWSだとVPCに相当するイメージ。それを集約するコアスイッチ的な役割がTransitGatewayとなる。VPCピアリングで1対1もできるが、メッシュになるので、それよりもスイッチングはTransitに任せて集約しましょう、という話。

# 完成後のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/b89699a4-5c36-99e3-ab74-68be1b106da4.png)

## Transit Gatewayを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/88889dac-87fa-dfd8-5a16-32c018dd4dd1.png)

大本の本体（という表現が適切かは微妙だが）のTransitGatewayを作る。BGPルーティングをしているということで、CIDRブロック、ASNを決めて入力する。

## Transit Gateway アタッチメントを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/06d3ba16-af8a-0ac0-df32-7489fdb6c42f.png)
VPCとTransitGatewayを接続する接点として、TransitGatewayアタッチメントを作る。これはインスタンスでなく、エンドポイントに近いものであり、このアタッチメントに対してセキュリティグループは用意する必要がない。アタッチメントを作成、設定する際は、TransitGateway本体のID、接続するVPCのID、そのVPCの中でアタッチメントを配置するサブネット。これを指定する。事前にこの情報を整理、準備しておく。
このアタッチメントをVPC数分、繰り返し作成する。この図だと3個アタッチメントを作る。

## Transit Gateway ルートテーブル
TransitGatewayはコアスイッチみたいなものなので、やはりルートテーブルもある。細かく静的にルートを切ることも可能。ただ、今までエンタープライズ向けの構成を見ていて、あんまりコアスイッチに静的ルート入れてるのは見たことなく、動的ルーティングにしている環境が多かった（半径五メートルレベルの感想）。というわけで、TransitGatewayも動的ルーティングにして、特段ルートを切らない構成も可能。個人的に後者が楽で好き。詳細な手順はいろいろなサイトに記載があるため、ここでは割愛。
[むちゃくちゃわかりやすい素晴らしい手順（Transit Gatewayを利用してVPC間で通信してみた）](https://dev.classmethod.jp/articles/transit-gateway-vpc/)

## サブネット ルートテーブル
サブネットのルートテーブル。TransitGatewayアタッチメントを配置したサブネットのルートテーブルで、ルートを設定する。
例えば、VPC1のあるサブネットでは、VPC2とVPC3にTGWを経由して通信させたい場合、サブネットのルートテーブル送信先にVPC2-3のIP帯を記載し、ターゲットをTransitGatewayアタッチメントを指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229539/08cc93f0-b764-88cf-9eb6-7138cbaee4a0.png)

## ポイント
・TransitGatewayを使って複数VPCをまとめる場合、VPCのCIDRIP体系をしっかり作る。
　・・・各VPCで重複がないIP体系にする。
・TransitGatewayは静的ルート、動的ルートのどちらも切れる。
　・・・ただしTGWに静的ルートにすると、VPC追加時などにTGWのルートテーブルに追加、VPCのサブネットに追加と作業量と通信要件を考えることが倍増。


# 余談
タモリ俱楽部が本年3月末に終わってしまうという衝撃ニュースが駆け巡った。空耳アワーは毎度のように見ており、一回真面目に投稿しようかと思ったことがあった（[インド人](https://www.youtube.com/watch?v=53JQz0ON--o)という身もふたもない空耳、ハンカチぐらいはもらえたのでは？）。思っただけで終わってしまったことは非常に残念。このように人生の残り時間はあっという間。気になることがあったらすぐやるべき、という教訓も得た。
好きな空耳は多すぎるが、個人的に好きなものを張っておく。空耳アワーだけは半年に一回ぐらい深夜帯でやってほしい。
[洗うな！うそ！お茶の間へ](https://www.youtube.com/watch?v=C_ylX8vuoAM&t=46s)
[バニラあんた舐めろ](https://www.youtube.com/watch?v=mV7-XtPDKB0)
[じゃ せーので](https://www.youtube.com/watch?v=SOK2UK5D8xA)
Pythonで2次元座標系において、指定した座標から最も近い与えられた座表を特定する方法(備忘録)

本記事はPython初心者の筆者が備忘録として作成したものである。プログラムの流れとしては、(座標をインストールする関数)→(近傍点を探し出す関数)の2段階としている。
# まず2次元座標を考えよう
```Python
import pandas as pd
import csv
from matplotlib import pyplot as plt
import math

dict1 = dict(x=[1, 3,3, 6, 9,9,  10],y=[-1, 2,5, 3, 5,0, 9])
df = pd.DataFrame(data=dict1)

fig, ax = plt.subplots(figsize=(2,2))
ax.axis('off')
ax.axis('tight')
ax.table(cellText=df.values,
         colLabels=df.columns,
         loc='center',
         bbox=[0, 0, 1, 1])
plt.savefig('table.png')
```
このように座標系が出力できましたね。
![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916351/2c57b04a-9959-11a1-f9db-ffcd2e282701.png)
ではこの座標系をインストールしていきます。
# 二次元座標系において座標を与える
```Python
def install(): #楕円を構成する座標を読みとる
    points = []
    for i in range(len(df)): #行数分のループを繰り返す
        points.append({"x" : df.iloc[i, 0], "y" : df.iloc[i, 1]})
    return points
```
これでこの中から次の関数で設定した一番近い値を探索します。
```Python
def nearPoint(x, y, points):
    if not points:
        return {}

    closest_point = min(points, key=lambda point: math.sqrt((point["x"] - x) ** 2 + (point["y"] - y) ** 2))
    return {"x": closest_point["x"], "y": closest_point["y"]}
```
それでは結果を出力してみましょう。
```Python
print(nearPoint(3, 3, install()))
print(nearPoint(4, 7, install()))
print(nearPoint(1, 1, install()))
print(nearPoint(7, 8, install()))
```
結果がこちらになります。
{'x': 3, 'y': 2}
{'x': 3, 'y': 5}
{'x': 1, 'y': -1}
{'x': 10, 'y': 9}

全体のプログラムは以下になります。
```Python
import pandas as pd
import csv
from matplotlib import pyplot as plt
import math

dict1 = dict(x=[1, 3, 3, 6, 9, 9, 10],y=[-1, 2, 5, 3, 5, 0, 9])
df = pd.DataFrame(data=dict1)

def install():  # 楕円を構成する座標を読みとる
    points = []
    for i in range(len(df)):  # 行数分のループを繰り返す
        points.append({"x" : df.iloc[i,0], "y" : df.iloc[i,1]})
    return points

def nearPoint(x, y, points):
    if not points:
        return {}

    closest_point = min(points, key=lambda point: math.sqrt((point["x"] - x) ** 2 + (point["y"] - y) ** 2))
    return {"x": closest_point["x"], "y": closest_point["y"]}
```

# 追記
コメントにあるようにWolfMoon様にご提示していただいたコードですと、私が示したものよりもかなり計算速度が早いことがわかりました。(2023年03月01日検証)
【Dart】Listで要素を非破壊的に追加した結果を取得する方法

## 概要
DartでListに要素を追加する際に、addやinsertのメソッドが紹介されることが多いですが、
元のListに変更を加えず非破壊的に追加する方法は、どういう書き方があるかなと思い少し調べてみました。

## 前提
* 今回、使用したDartのバージョンは2.18.6です。

## 対応案
ChatGPTで調べたところ、以下の通り3つの案が挙げられました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/282ba306-2a07-35a2-7107-2f2a3669800b.png" width=550/>

個人的にはJavaScriptと同様の書き方で、スプレッド演算子を使う方法が良いかなと感じました。ちなみにスプレッド演算子は[Dart2.3の新機能2つの概要](https://doitu.info/blog/ca36ad41c3bc15939cc4b1488e00649e)の記事で紹介されているように、バージョン2.3で追加された機能になります。

## 実装サンプル
ChatGPTで紹介されたソースと同様ですが、スプレッド演算子を使う方法の実装サンプルです。

```dart
var list1 = [1, 2, 3];
var list2 = [...list1, 4];

print(list1); // [1, 2, 3]
print(list2); // [1, 2, 3, 4]
```
/28の全ホストにpingを打つワンライナーシェルスクリプト

# 個人用の備忘メモ
Linuxの知識を付けたかったのと、仕事で役立ちそうだなと思ってシェルワンライナーの本を読み始めました。どんな本かは以下のリンクからわかると思います。やっていて楽しいですよ！

https://engineers.ntt.com/entry/2022/12/04/071122


# やったこととちょこっと解説
題名の通り/28のホストへの到達性を確認したかったので、以下のワンライナーでログを取りました。「seqを使って第四オクテットを出力。xargsを使ってpingコマンドの引数に@で渡して、連続でpingを実行。出力はping.logを作って保存。」ということをしています。

``` ping1.sh
seq 49 63 | xargs -I@ ping 165.254.119.@ -c 3 > ping.log
```

xargsの引数はコマンドの部分も含めてスペースだけで区切って書けるので便利ではありますが、慣れていないと何をやっているのか読みづらい気はします。


# 他のやり方と失敗例
「seqとawsで実行したいコマンドを作り、bashに渡して実行する。」というやり方もできます。メタプログラミングというやつです。

``` ping2.sh
seq 49 63 | awk '{print "ping 165.254.119." $1 " -c 3"}' | bash > ping.log
```

以下は失敗例です。xargsでは$1などのフィールドの引数は使えないんでしたっけ。。pingが実行できませんでした。

``` ping3.sh
seq 49 63 | xargs ping 165.254.119.$1
```
DockerでReact+TypeScriptの環境を構築する

# はじめに
React+TypeScriptの環境構築をしている記事を参考にしてコンテナを作っても`tsc -v`が not found だったので少しカスタマイズしてみました。[GitHub](https://github.com/sakuagl/Docker-React-CRA)で公開しているので気軽に使ってみて下さい。
Dockerfile, docker-compose.ymlを書くのは初めてだったため、うまく書けているか不安です。もし、改善すべき点や問題点があればコメントで教えてください。


# 処置方法
pathがうまく通っていない可能性も考えましたが、調べるのが面倒だったので、明示的にTypeScriptをインストールすることにしました。


# ファイルの作成
### dockerfile
``` dockerfile
FROM node:18.14.1-alpine3.17
WORKDIR /usr/src/app
RUN npm install -g typescript
```

### docker-compose.yml
```docker-compose.yml
version: '3'

services:
  front:
    build: ./
    container_name: front
    volumes:
      - ./:/usr/src/app
    ports:
      - '3000:3000'
    command: sh -c 'cd react-app && yarn start'
    tty: true
    environment:
      - CHOKIDAR_USEPOLLING=true
```


# イメージの構築
Dockerイメージを構築するためのコマンドです。
```
docker-compose build
```


# React＋TypeScriptでプロジェクトを作成
Dockerコンテナ内で、Reactアプリケーションを作成するためのコマンドです。
このコマンドでは、Reactアプリケーションを作成するためのツールであるcreate-react-appを使用して、`react-app`という名前のプロジェクトを作成します。また、TypeScriptのテンプレートを使用しています。
```
docker-compose run --rm front sh -c 'npx create-react-app react-app --template typescript'
```


# コンテナの作成と起動
 Dockerコンテナを起動するためのコマンドです。
`-d`オプションを指定することで、バックグラウンドでコンテナを実行します。
これにより、Webアプリケーションが常に実行されるようになります。
```
docker-compose up -d
```


# ローカルホストに接続
ここまでの手順が完了したら、Webブラウザを開いて「 http://localhost:3000/ 」にアクセスしてください。
以下のようにデフォルトのページが起動すれば環境構築完了です。
![221098457-bc501e1b-8a7b-4b68-8f81-19a9b2ed1e5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705515/cf901b35-ea38-9f96-4b2e-1fec94f2b2f7.png)


# さいごに
今回はcreate-react-appを使いましたが、`vite`というツールの方がパフォーマンスが高いらしいですね。気が向いたらviteも使ってみようと思います。

https://blog.smartbank.co.jp/entry/2022/04/25/create-react-app-to-vite
【YouTube】海外の動画を高精度字幕で視聴しよう

### 動画作る側もそうだけど、見る側が字幕作ったら早くね！？

↓このファイルを使って、翻訳させたい動画のキャプションを生成してコピーする。（DeepL APIキーが必要）

https://colab.research.google.com/drive/1tuSGPYgu3Hxk4BElBnE_f4qvCxZe18oP?usp=sharing

<br>
<br>
↓このサイトのキャプション欄に先ほどコピーしたキャプションを貼り付ける。

https://custom-youtube-player.onrender.com/

#### おしまい

## 要改善点
・テストしてないのでわかんないですけど、1時間以上の動画の場合、サイトがうまく機能しない可能性があります。
・新しい動画を視聴するにはリロードしてから、キャプション貼り付け&実行しないと反映されないちょい手間設計なので、どうにかします。
・埋め込みできない動画の場合はキャプション生成を止める処理があるとよいかな。

## 最後に
ご意見・ご感想あると嬉しいです〜
ElmのListから任意の値を取得

# はじめに
Elmを勉強中に、以下みたいなことをしたいと思いました。
```javascript
const ageList = [{'age': 5, ...}, {'age': 16, ...}, {'age': 23, ...}]
const year16 = ageList.filter(age => age.age == 16)[0]
// year16 : {'age': 16, ...}
```
軽く探したのですがパッケージ等がなさそうだったので自分で書いてみたメモです

# 試行錯誤
elm/coreのListで実現できるか探したのですが、難しそうに思いました。
### List.map
https://package.elm-lang.org/packages/elm/core/latest/List#map

`aをbに変換する関数`と`aのList`を引数に取り、`各aに関数を適用した結果であるbのList`を返す関数です。
こちらは引数のListと返り値のListの数が同じになってしまう(はず)ので、今回の用途には適さないと思いました。

### List.filter
https://package.elm-lang.org/packages/elm/core/latest/List#filter

`aをboolに変換する関数`と`aのList`を引数に取り、`各aに関数を適用した結果trueだった値のみを集めたList`を返す関数です。
こちらは関数の部分をうまいことやれば実現できそうに思いましたが、肝心の関数の引数がaのみなので
a以外の値(今回の場合age)でboolの条件を作ることができなさそうだったので、今回の用途には適さないと思いました。


### List.map2
https://package.elm-lang.org/packages/elm/core/latest/List#map2

`aとbをresultに変換する関数`、`aのList`、`bのList`を引数に取り、`aとbに関数を適用した結果であるresultのList`を返す関数です。
こちらはList.mapと同じくList resultの要素数が基本的に引数のListと同じである点と、比較値のageがListではなく固定値なので
今回の用途には適さないと思いました。


# 実装
考え方としては、Listの先頭を取り出してageと比較し、==であれば返す、
/=であればListの先頭を削除したListを引数にして再帰的に呼び出す、ということをしています。
```elm
getDataThatMatchingYear : Int -> List Age -> Maybe Age
getDataThatMatchingYear age ageList =
    case List.head ageList of
        Just ageData ->
            if age == ageData.age then
                List.head ageList

            else
                getDataThatMatchingYear age (List.drop 1 ageList)

        Nothing ->
            Nothing
```
返り値はMaybeになるので、関数を呼び出した側で対応します。

# 以上
もし上記が簡単に実現できるパッケージや関数の組み合わせなどあれば教えて頂けますとありがたいです。
Houdiniのライセンスまわりの操作メモ【ライセンスの無効化と返却】

## 概要
仕事でHoudiniに触る機会があり、色々と操作をしていたところ、Houdini Apprentice（無償ライセンス）から有償ライセンスに変更する際に、手間が掛かったので対処した時に内容を残しておきます。個人的なメモなので実際に試す時は問題ない状況でお試しください。

## 無償ライセンスから有償ライセンスへの切り替え
有償ライセンスを適用しても何故か無償ライセンスが残ったままで有償ライセンスの方が使われなかった。GUIをいじくりまわしてもまったく解決する気配がなかったので調べたところ、CUIで操作することができることがわかり、実際に試して上手くいくことを確認しました。
- [参考ページ](https://support.indyzone.jp/hc/ja/articles/360021019891-Houdini%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E7%A7%BB%E8%A1%8C%E6%96%B9%E6%B3%95-%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3-)
```powershell
sesictrl -t license-id
```

上記で対象のライセンス（無償ライセンス）を無効化することができました。

## ライセンスの返却
私が試した時の環境が良くなかったのか、問題がある状態でライセンスがインストールされてしまいました。色々と設定を変えてみたが、ライセンスを1度返却した方が早そうという状況が見えてきたのでGUIから返却を試して上手くいきませんでした。GUIの作りに問題があるのか、問題が発生している際にはGUIでは何も解決できなくなる印象を持ちました。再び調べていく中でCUIでライセンスを返却する方法がわかったので試してみました。

- [参考ページ](https://www.sidefx.com/ja/faq/question/18/)

```powershell
sesictrl -d license-id
```

問題が発生してGUIでは操作不能だったライセンスを返却できました。`sesictrl`を使う方が安定してライセンスを操作ができそうという印象を持ちました。

## 備考

普段は趣味に没頭しています。

https://reins-rein-blog.netlify.app/
【C#】Math.NET Numericsで重回帰分析（MLR:Multiple Linear Regression）

# はじめに
前回、C#で数値計算用ライブラリ[Math.NET Numerics](https://numerics.mathdotnet.com/)[^1]を利用し、単純線形回帰を試しました。今回は重回帰を試してみます。

https://qiita.com/MonaiTakeshi/items/e36c6fc232230699ff03
# 参考文献
今回も以下の書籍を参考文献としました。

https://www.amazon.co.jp/dp/4062575574
# コード実装
## 説明変数及び目的変数準備
データは「18世帯における親子の身長」を利用します。説明変数は親の身長とし、父親の身長を **x0**、母親の身長を **x1** と定義します。息子の身長を目的変数 **y** と定義します。
単純線形回帰に利用した身長の単位はインチでしたが、今回の身長の単位は **cm** です。

```C#:
double[] x0 = new double[]
{
    170, 172, 170, 172, 170,
    180, 173, 163, 165, 167,
    165, 163, 167, 170, 165,
    163, 166,167,
};

double[] x1 = new double[]
{
    160, 160, 160, 161, 155,
    160, 160, 150, 155, 162,
    155, 159, 153, 150, 160,
    158, 158, 157,
};

double[] y = new double[]
{
    180, 179, 175, 174, 173,
    173, 173, 171, 170, 170,
    170, 168, 167, 167, 165,
    164, 162, 162,
};
```
## 回帰係数取得
`MathNet.Numerics.LinearRegression`の`MultipleRegression.QR`メソッドを使います。今回は引数としてジャグ配列を利用します。そのため、説明変数のジャグ配列を先に作成します。
```C#:
double[][] x = new double[x0.Count()][];
for (int i = 0; i < x.GetLength(0); i++)
{
    x[i] = new double[]{ x0[i], x1[i] };
}
```
作成したジャグ配列（説明変数） **x** と目的変数 **y**を`MultipleRegression.QR`メソッドへ渡します。このとき、interceptも取得したいため、第3引数にtrueを設定しました。
```C#:
var result = MultipleRegression.QR(x, y, true);
Console.WriteLine("intercept: " + result[0]);
Console.WriteLine("slope0: " + result[1]);
Console.WriteLine("slope1: " + result[2]);
```
```:output
intercept: 43.5829144993441
slope0: 0.597200754589679
slope1: 0.165966697534154
```
書籍内では、interceptをb0、slope0をb1、slope1をb2と記載されています。別の書籍では、K0, K1, K2と記載してあるものもあります。どの表記が一番適切なのかよくわかりませんが、ひとまず重回帰分析さえできればよいため横へ置いておきます。
## 推定値算出
取得した係数から以下の回帰式が得られます。

:::note info
**息子の身長 = 43.58 + 0.597 * （父親の身長） + 0.166 * （母親の身長）**
:::

では、今回利用したデータセットの1番目のデータを利用して推定値を算出してみます。父親の身長は170cm、母親の身長は160cmを代入します。書籍の内容に合わせて、小数点は丸めておきます。
```C#:
double fatherHeight = 170;
double motherHeight = 160;
double sonHeight = Math.Round(result[0], 2)
    + Math.Round(result[1], 3) * fatherHeight
    + Math.Round(result[2], 3) * motherHeight;
Console.WriteLine("sonHeight: " + sonHeight);
```
```:output
sonHeight: 171.63
```
# おまけ
上記のデータを利用して、**重相関係数**を求めてみます。`Correlation.Pearson`メソッドを使いました。
```C#:
double[] predictedValues = new double[x0.Count()];
for (int i = 0; i < predictedValues.Length; i++)
{
    predictedValues[i] = Math.Round(result[0], 2)
        + Math.Round(result[1], 3) * x0[i]
        + Math.Round(result[2], 3) * x1[i];
}

var multipleCorrelationCoefficient = Correlation.Pearson(predictedValues, y);
Console.WriteLine("Multiple Correlation Coefficient: " + multipleCorrelationCoefficient);
```
```:output
Multiple Correlation Coefficient: 0.551880210098969
```
[^1]:Math.NET Numericsのバージョンは **5.0.0** を利用。
VBA 分記要素をUTF-16E、HEXに分解（Decode）する関数

# 前々回くらいの関数と合わせて使う
isDiaCriticalMarkが必要。それは以下のリンクを参照のこと。
https://qiita.com/Q11Q/items/d983621915846f18a602
成功すれば返り値は配列となる。
文字数は判定できない。合成された文字を各要素に分解し、コードポイントに変換してHEXにする（UTF-16LE）
これもStackOverFlowの記事を参考にして作成した。
[excel - Splitting string by combining character groups - Stack Overflow](https://stackoverflow.com/questions/48819144/splitting-string-by-combining-character-groups)

```Vb
Function DiaCriticalMarkDecodeArray(str As String) As Variant
Dim i As Long
Dim strLen As Integer
Dim ar()
Dim unicodeLength As Integer
On Error GoTo Err_Handle
strLen = Len(str)
    Dim unicode() As String
    ReDim unicode(strLen)
    ReDim ar(1 To strLen)
If isDiaCriticalMark(str) = True Then
    unicodeLength = 0
    ' Split str into unicode()
    Dim char As Integer
    For i = 1 To strLen
        ar(i) = Right("0000" & Hex(AscW(Mid(str, i, 1))), 4)
    Next
DiaCriticalMarkDecodeArray = ar()
Exit Function
Else
DiaCriticalMarkDecodeArray = False
Exit Function
End If
Exit Function
Err_Handle:
If Err.Number <> 0 Then
Debug.Print "Err occur on UDF:DiaCriticalMarkDecodeArray", Err.Number, Err.Description
Err.Clear
DiaCriticalMarkDecodeArray = ""
End If
Exit Function
End Function
```
Azure Pipelinesの`steps.checkout`で`fatal: reference is not a tree`エラーに遭遇して解決した

# 状況

複数人が高頻度で変更をプッシュするブランチ(仮に`branch1`とする)を`steps.checkout`を使ってcheckoutしようとしていた。

# 問題のYaml

```yaml
resources:
  repositories:
  - repository: MyRepo
    type: github
    endpoint: someendpoint
    name: myorg/myrepo
    ref: branch1

steps:
- checkout: MyRepo
```

このパイプラインを実行すると、以下のようなエラーが表示された😢

> git checkout --progress --force 4808c4a0862a2c20ed832dbd1c8b2
fatal: reference is not a tree: 4808c4a0862a2c20ed832dbd1c8b2
##[warning]Git checkout failed on shallow repository, this might because of git fetch with depth '1' doesn't include the checkout commit '4808c4a0862a2c20ed832dbd1c8b2'. Please reference documentation (http://go.microsoft.com/fwlink/?LinkId=829603)
##[error]Git checkout failed with exit code: 128

# 解決方法

`steps.checkout`に`fetchDepth: 0`を指定する。

```yaml
steps:
- checkout: MyRepo
  fetchDepth: 0
```

# 参考URL

- https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/steps-checkout?view=azure-pipelines#shallow-fetch
コンシューマブルSaaS<Queue as a Service>

キューに追加するとcurlで1つずつ取得できるよ。最後まで読み込んだら空が帰るよ

<p class="codepen" data-height="703" data-default-tab="result" data-slug-hash="JjabmvY" data-user="04" style="height: 703px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/JjabmvY">
  コンシューマブルSaaS</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

レスポンスが空になるまでループ処理することで、分散処理が簡単にできるようになるよ

# ソースコード

```javascript
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";
import { Client } from "https://deno.land/x/postgres@v0.17.0/mod.ts";

const options = {
    headers: {
        "access-control-allow-origin": "*"
    }
}

const client = new Client({
  user: "postgres",
  database: "postgres",
  hostname: "YOUR_SUPABASE_HOST"
});
await client.connect();

const array = []

serve(async (req: Request) => {
  const url = new URL(req.url)
  if (url.pathname === '/') {
    if (req.method === 'POST') {
      const obj = await req.json()
      await client.queryArray('UPDATE item SET deleted_at = now() WHERE topic = $1', [obj.topic])
      const sql = 'INSERT INTO item (item_name, topic) VALUES ' + obj.lines.map((_, i) => `($${i*2+1},$${i*2+2})`).join(',')
      await client.queryArray(sql, obj.lines.flatMap(line => [line, obj.topic]))
      return new Response(array.join('\n'), options)
    } else {
      const topic = url.searchParams.get('topic')
      if (topic) {
        const { rows } = await client.queryArray('SELECT item_name FROM item WHERE topic = $1 AND deleted_at IS NULL', [topic])
        return new Response(rows.map(r => r[0]).join('\n'), options)
      }
      return new Response(array.join('\n'), options)
    }
  }
  const { rows } = await client.queryArray('select select_item($1)', [url.pathname.slice(1)])
  console.log(rows)
  return new Response(rows?.[0]?.[0], options)
});

```

Supabase(ポスグレ)のSQL

```sql

CREATE TABLE item (
  item_id SERIAL NOT NULL,
  item_name VARCHAR(255) NULL,
  topic VARCHAR(255) NULL,
  deleted_at TIMESTAMP NULL,
  created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (item_id));

CREATE OR REPLACE Function select_item(VARCHAR(255)) RETURNS VARCHAR
AS $$
DECLARE
  _item_id int;
  _item_name VARCHAR(255);
BEGIN
  SELECT item_id, item_name INTO _item_id, _item_name FROM item WHERE topic = $1 AND deleted_at IS NULL LIMIT 1;
  UPDATE item SET deleted_at = now() WHERE item_id = _item_id;
  RETURN _item_name;
END;
$$
LANGUAGE plpgsql;
```

プロシージャでやらないとSELECTとUPDATEの間で他のリクエストがSELECTすると同じ値がカエル🐸からプロシージャでしてる
FirebaseだとSELECTとUPDATEの間が長すぎて大量アクセスで同じ値を返すことがあった

以下でもいいかも

```sql
UPDATE item SET deleted_at = now() WHERE item_id = (SELECT item_id FROM item WHERE topic = $1 AND deleted_at IS NULL LIMIT 1) RETURNING item_name
```
Apacheの設定ファイルhttpd.confのBASIC認証とダイジェスト認証に関するディレクティブをまとめたもの

●Apacheの設定ファイルhttpd.confのBASIC認証とダイジェスト認証に関するディレクティブをまとめたもの
・AuthType　認証方式を指定。Basic認証の場合はBasic。ダイジェスト認証の場合はDigest。
・AuthName　認可領域名を指定。ここで指定した文字列は認証要求時にブラウザに送信され、画面に表示される。
・AuthUserFile　作成したパスワードファイル名を指定
・AuthGroupFile　作成したグループファイル名を指定
・Require　認証対象とするユーザまたはグループを指定


●BASIC認証を導入するための主な作業は以下のとおり。

・htpasswdコマンドを使用しパスワードファイルの作成およびユーザの登録を行う
パスワードファイル名は通常「.htpasswd」が使われる。設置場所は外部からアクセス出来ない場所を選びます。

●htpasswdコマンドの書式とオプション

htpasswd [オプション] ファイル名 ユーザ名

オプション
・-c　パスワードファイルの新規作成
・-D　ユーザを削除
Rails7でリロードしないとjQuery動かない問題

Rails7から、turbolink→turboにライブラリが更新・置換されている。

今まで書いていた`turbolink:load`では動かないので`turbo:load`と書く。

```
$(document).on('turbo:load',function(){
~~~JSの記述~~~
});
```


参考リンク

https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/turbo-drive#%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB%E6%99%82%E3%81%ABdomcontentloaded%E3%81%8C%E7%99%BA%E7%81%AB%E3%81%97%E3%81%AA%E3%81%84
Codewars Find the missing term in an Arithmetic Progression


https://www.codewars.com/kata/52de553ebb55d1fca3000371

```java
import java.util.Arrays;
public class Solution 
{
	public static int findMissing(int[] numbers)
	{
    
    Arrays.sort(numbers);
    int []temp = new int[numbers.length];
    for(int i = 1 ; i < numbers.length ; i++){
      
      
      temp[i - 1] = numbers[i] - numbers[i - 1];      
    }
    
    int min = Integer.MAX_VALUE;
    for(int t : temp){
      if(t == 0){
        continue;
      }
      
     min= Math.min(min, Math.abs(t));
    }
    
    if(min == Integer.MAX_VALUE){
      return numbers[0];
    }

    
   for(int i = 1 ; i < numbers.length ; i++){
    if (min != Math.abs(numbers[i] - numbers[i-1])){
          System.out.println( Math.abs(numbers[i]));
      return numbers[i] - min;
    } 
   }
    
    return 0;
	}
}
```
Codewars Perimeter of squares in a rectangle

https://www.codewars.com/kata/559a28007caad2ac4e000083

```java
import java.math.BigInteger;
public class SumFct {
	public static BigInteger perimeter(BigInteger n) {
        BigInteger[] arr = new BigInteger[n.intValue() + 1];

        arr[0] = BigInteger.ONE;
        arr[1] = BigInteger.ONE;
        BigInteger temp = BigInteger.ONE.add(BigInteger.ONE);
        for (int i = 2; i <= n.intValue(); i++) {
            arr[i] = arr[i - 1].add(arr[i - 2]);
            temp = temp.add(arr[i]);
        }

        return temp.multiply(BigInteger.valueOf(4L));
    
	}
}
```
【初心者向け】入れ子になったGameObjectのPositionとScaleの関係クイズ

Transformが持つpositionとlocalPosition、簡単な状況だとわかっていても、入れ子になったり、それぞれのScaleが異なったりするとだんだん混乱してきませんか？ちょっとしたクイズ形式にしたので考えてみてください。

# 問題
ぞれぞれScaleが10、5、1のCubeを3つ（Cube10、Cube5、Cube1）作って、Hierarchy上で入れ子構造にして、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/03617a5f-ec5b-a178-4e70-01bf656496f8.png" width=768 />

Cube5、Cube1のInspector上でPosition（LocalPosition）のzを1に変更します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/25ef2f56-9113-2e4a-1b60-ac593e169257.png" width=248 /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/63944f65-4c7d-f916-7e33-0270f3217f27.png" width=248 /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e76e4b06-9d89-aff8-547c-7830f435f599.png" width=248 />

さて、このときのCube1のWorldPosition（Cube1.transfrom.position）のzはいくつでしょうか？

# 答え
答え・・・の前に計算方法です。

先に答えだと問題を読んでいる途中で、答えまで目に入っってしまうかなと思い、この構成になっています。
特に理由は要らず答えという方は一番下までスクロールしてください。

## 計算方法
UnityEditorのInspectorに表示されているものは、localの値なので、それぞれworld座標に変換していきます。

### Cube5
まずCube５のWorldPositionを考えます。Cube5のWorldPositionは、Cube5のlocalPosition.zと親のCube1０のlossyScale.zの積になります。今回の場合は1.0*10.0=10なので、10です。
### Cube1
次にCube1のWorldPositionを考えます。Cube1のWorldPositionは、Cube1のlocalPosition.zと親のCube5のlossyScale.zの積にCube5のWolrdPosition.zを足したものになります。今回の場合は1.0*5.0+10=15なので、１５です。

## 本当に答え
15です。

# 補足
それぞれDebugログでzのpositionとscaleを出してみるとこんな感じになります。UnityEditorのInspectorで表示されている値がlocalであることがわかりますね。

```
-- Cube10 --
World(pos, scale): 0.0, 10.0
Local(pos, scale): 0.0, 10.0

-- Cube5 --
World(pos, scale): 10.0, 5.0
Local(pos, scale): 1.0, 0.5

-- Cube1 --
World(pos, scale): 15.0, 1.0
Local(pos, scale): 1.0, 0.2

```

## サンプルプログラム
[GitHub](https://github.com/machidyo/InstantiateTest)にプログラム、シーンなどを含め、あげてあります。良かったら手元で動かして試してみてください。

### ログの処理の抜粋
```C#
using UnityEngine;

public class PosScaleTest : MonoBehaviour
{
    [SerializeField] private GameObject cube10;
    [SerializeField] private GameObject cube5;
    [SerializeField] private GameObject cube1;

    void Start()
    {
        Log(cube10.transform);
        Log(cube5.transform);
        Log(cube1.transform);
    }

    private void Log(Transform trn)
    {
        Debug.Log($"-- {trn.gameObject.name} --");   
        Debug.Log($"World(pos, scale): {trn.position.z:F1}, {trn.lossyScale.z:F1}");   
        Debug.Log($"Local(pos, scale): {trn.localPosition.z:F1}, {trn.localScale.z:F1}");   
    }
}
```
C++ StudyRecord - 01 (namespace,Stream)

# 前置き
この記事は自らがC++学習を行う上でのメモ書き兼備忘録として記載しています。

書式のバリエーション・文章力は乏しく人様のタメにならないだろうと思いますが、
自分と同じくC++やオブジェクト指向言語を学習中の方々に見てもらうことで、
その方々のモチベーション維持・学習の共有などができれば幸いです。
（有識者様のご指摘もあればいいなという下心もあります）

あくまで主な目的は自分用ですので、
過度な期待はせずに温かい目で閲覧していただきますようお願い致します。

# namespaceとは
## namespaceの概要

namespace = 名前空間

全ての変数や関数はとある名前空間の上に存在する。
同じ名前空間上では同じ変数名は使用できないが、同じ変数名でもnamespaceが違えば使用することができる。大規模な開発では汎用的な変数名が重複することは容易に想像できるので、別々の名前空間を利用することで複雑な変数名の使用を避けることが可能。
![スクリーンショット 2023-02-27 23.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075058/e5c7d1ff-3139-4677-431b-641d0bd9ff0c.png)

# namespaceの利用
namespaceを使用する場合は**Using句**で指定することができる。

```test.cpp 
#include <iostream>
using namespace std;

int main()
{
  cout << "Hello C++" << endl;
  return 0;
}

```
※1行目のincludeはヘッダファイルというファイルの読み込みを行うためのキーワード

```:結果 
Hello C++
``` 
ここで使用されているstdとは**標準名前空間**と呼ばれており、
C++言語に元から備わっている名前空間です。

また、Using以外にも以下のように名前空間を指定することも可能です。

```test.cpp
#include <iostream>

int main()
{
  std::cout << "Hello C++" << std::endl;
  return 0;
}
```

## 入力と出力

* #### Cout
	コンソール出力を行う。
	連続して出力する場合は << で繋げる
	例）cout << “Hello” << “”World << endl(改行);
 
* #### Cin
	コンソール入力を受け付ける。
    
    ``` test.cpp
    #include <iostream>
    using namespace std;
    
    int main()
    {
      int hoge;
      cin >> hoge;
      cout << hoge << "が入力されました" << endl;
      return 0;
    }
    ```

    ```:結果
    2
    2が入力されました
    ```

# ストリームという概念
 **cout** と **cin** はストリームという概念を使用して入出力を行っています。
ストリームとは文字通り「流れ」のようなもので、そこに値を送ったり受け取ったりしています。

先ほどから出てくる不等号(>>,<<)は流れの向きのようなものを表しています。
```cpp:例
std::cout << "hello" << std::endl; //coutへ"Hello"という文字列を送る。
std::cin >> hoge //cinで受け取った値を変数hogeで受け取る
```
コンソールのみでなく、ファイルの読み書きもストリームに則って行われます。
Google検索結果からYahoo!のページをグレーアウトする拡張機能 Ver.1.0.0

# 目的
- Yahoo!のサービスがヨーロッパからアクセスできなくなった[^1]。
- 誤ってYahoo!のリンクを開くとアクセス制限の主旨が表示される。
- 誤って開く度にストレスを感じるので、Yahooのドメインのみ検索結果からグレイアウトまたは検索除外するChrome拡張機能を作成した。



# 特徴
- Yahoo.co.jp のみグレイアウトして、目立たなくする。
- VPN 等を使用する場合も考慮して、クリックしてページを開くことは可能。

# ソースコード
manifest.jsonの"content_scripts"の"matches"のリンクに当てはまるサイトを開いたときに、style.cssが実行される拡張機能です。

## manifest.json
```json

{
  "name": "Hide-YahooJP",
  "version": "1.0.0",
  "manifest_version": 3,
  "description": "Extension to grey out Yahoo! JP services in google search results",
  "content_scripts": [
    {
      "matches": [
        "*://www.google.com/search?*",
        "*://www.google.co.jp/search?*",
        "*://www.google.de/search?*",
        "*://www.google.com.au/search?*",
        "*://www.google.be/search?*",
        "*://www.google.com.br/search?*",
        "*://www.google.ca/search?*",
        "*://www.google.ch/search?*",
        "*://www.google.cn/search?*",
        "*://www.google.dk/search?*",
        "*://www.google.fi/search?*",
        "*://www.google.com.hk/search?*",
        "*://www.google.co.in/search?*",
        "*://www.google.it/search?*",
        "*://www.google.co.kr/search?*",
        "*://www.google.co.uk/search?*",
        "*://www.google.fr/search?*"
      ],
      "css": ["style.css"]
    }
  ],
  "icons": {
    "16": "/icons/icon16.png",
    "48": "/icons/icon48.png",
    "128": "/icons/icon128.png"
  }
}
```
content_scriptsを使って、特定のwebページでstyle.cssを実行するようにしている。Google検索のドメインは国ごとにあるため、代表的な国を抽出した。

## style.css
```css
div.v7W49e > div > div > div:has(a[ping*="yahoo.co.jp"]) * {
  color: rgba(80, 80, 80, 0.5) !important;
  text-decoration: none;
}
div.v7W49e > div > div > div:has(a[ping*="yahoo.co.jp"]) * img {
  filter: grayscale(100%);
}
```
yahoo.co.jpが含まれているときのみ全体をグレーに色を変更する。

# ソースコードと拡張機能へのリンク
[GitHub](https://github.com/zusizusi/hide-yahoo-chrome-extension)と[Chrome拡張機能ストア](https://chrome.google.com/webstore/detail/hide-yahoojp/caloeaaagnbmmcedgkapicoejbkpemme)で公開しています。



# 参考文献
[^1]:https://privacy.yahoo.co.jp/notice/globalaccess.html
- [Chrome拡張機能 manifest.json Ver.3の書き方](https://qiita.com/shiro1212/items/12f0a767494a7b2ab0b3)
- [Chrome拡張機能開発の始め方 2022 manifest v3](https://zenn.dev/naok_1207/articles/d3fe5c0f8ece5c)
- [Chrome拡張機能ManifestV3へ対応する方法（V2から](https://zenn.dev/katoaki/articles/4e7548b533d7b3)
- [広告ブロックするchrome拡張を自作してみた](https://okinotori.net/archives/274)
Cloud Storageの課金を有効にできない・・・

現在開発中のプロジェクトにて、画像の置き場が必要だったのでGoogle CloudのGCPを使うことに決めました。

Google Cloudにて新しいプロジェクトを作成して、Cloud Storageを有効化させるために、請求先アカウントを設定しようとしました。

ところが、読み込み画面だけが表示されて、何も進まない状況に陥りました。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/2d417aa2-cbb8-bf67-208b-309fd92fe048.png)

何も表示されないので、試しにChromeでコンソールを表示してみたところ、以下のようなエラーが表示されていました。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/c0f6c8f1-e6a2-acbc-bbe8-d4452d71f302.png)


```shell
ERROR Error: Ia`Error: fc`pm_quota_exceeded_dialog`
Error: fc`pm_quota_exceeded_dialog
```

調べてみると、Google Cloudにおける割り当ての上限に達しているようでした。

https://cloud.google.com/dialogflow/quotas?hl=ja

自分の状況からして、課金の割り当ての上限に達しているようなので、こちらのフォームからリクエストを送ることにしました。

https://support.google.com/code/contact/billing_quota_increase

送信が完了すると次のような画面に遷移されます。あとは、Google Cloudの担当者が対応してくれるのを待つだけです。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/ceff0eaf-755c-9fde-f37c-fa524b77fb69.png)

実際に、新しい割り当てが与えられると、以下のようなメールが届きます。
僕の場合はメールの送信から５分以内に届きました。メールが届いてから、1時間以内に実際に反映されるそうです。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/e47a4c51-76df-668a-3dbd-0070e9e31b42.png)

同じようにお困りの場合は、一度お問合せをしてみるとすぐに解決できるかもしれません。

## 追記

実は、このあと何度もCloud Storageの課金を有効化しようとしても有効化することができませんでした。
いろいろ調べた結果、問い合わせフォームにて**無料サービス**に対する割り当ての増加を申請してしまっていました。
Cloud Storageは**paid service**に該当するため、有料サービスに対する割り当ての申請を行う必要がありました。なので、再度申請をし直したところ、みごと解決しました。

![スクリーンショット 2023-02-28 0.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/c4183724-e407-2185-2ee7-a3f1e5f9c7bb.png)

みなさまも、ご利用になるサービスに合わせて対象のサービスをお選びになることをおすすめします。

## 参考にした記事

https://dev.classmethod.jp/articles/gcp-billing-quota-increase/
【JS・TS】矢印が２つあるアロー関数で高階関数

# はじめに

以下本を読んだときに、アロー関数について学びがあったので、記事にしました。

[https://www.oreilly.co.jp/books/9784873119380/](https://www.oreilly.co.jp/books/9784873119380/)

# 矢印が２つあるアロー関数を書いてみる

ここで言う矢印とは`⇒`になります。

以下のように、最初の矢印に関数を渡して、渡した関数に最後の矢印に値を渡すことで、高階関数を作ることができます。

```jsx
const increase = (num) => num + 1
const operateNums = (fun) => (num) => fun(num);
const result = operateNums(increase)(1)
console.log(result);
```

# 最後に

自分の目標として、月1で記事を投稿する事があったため、かなり簡単なものになってしまいました。

今回書いてみた関数だと、1つの矢印で`(クロージャー, 値) ⇒ {クロージャー(値)}` の方が簡潔であるため、矢印を2つにする意味がありません。

そのため、どうしたら矢印を2つ以上するとベストなのかを考える必要があります。
【Laravel】中間テーブルのカラムでデータを取得する

# 概要
`users`,`groups`,`user_group`（中間テーブル）があり、中間テーブルのカラムで条件を絞ってデータを取得したいみたいなことはよくあると思います。
今回は「グループに所属しているアクティブなユーザー」を取得するという条件で見ていきたいと思います。

| usersテーブル |
|:-:|
|  id |
|  name |
|  created_at |
|  updated_at |


| groupsテーブル |
|:-:|
|  id |
|  name |
|  created_at |
|  updated_at |

| user_groupテーブル |
|:-:|
|  user_id |
|  group_id |
|  is_active |
|  created_at |
|  updated_at |


# 結論
### `withPivot`をmodelに追加

```Group.php
class Group extends Model
{
    /**
     * グループに属するユーザー
     */
    public function users()
    {
        return $this->belongsToMany(User::class)
             ->withPivot('is_active');// 追加する
    }
}

```

```User.php
class User extends Model
{
    /**
     * ユーザーが所属するグループ
     */
    public function groups()
    {
        return $this->belongsToMany(Group::class)
            ->withPivot('is_active');// 今回は使用しないですが、追加しておきます
    }
}
```

### どうやって条件を絞るのか
条件をフィルタリングする際は`wherePivot`というもの使います。
```GroupController.php
$group = Group::find(1);

//グループに所属しているアクティブなユーザーを取得
$activeUsers = $group->users()->wherePivot('is_active', true)->get();

```

ちなみに`wherePivot`以外にも取得条件を指定できるのが用意されているので、かなり便利です。
| その他のフィルタリング |
|:-:|
| wherePivotIn |
| wherePivotNotIn  |
| wherePivotBetween |
| wherePivotNotBetween  |
| wherePivotNull  |
| wherePivotNotNull |

# 参考
https://readouble.com/laravel/9.x/ja/eloquent-relationships.html#many-to-many
会社員の確定申告

# はじめに

私は、会社で年末調整をしていますが、ふるさと納税と株式投資の損益通算で確定申告する必要があるので、来年の自分のためにこの記事を書きます。

# 環境

e-Taxで確定申告するための環境が整っていることを前提とします。

# 必要な物

- マイナンバーカード
- 給与所得の源泉徴収票
- 配偶者の源泉徴収票（配偶者（特別）控除がある場合）
- 寄付金受納証明証（寄付先寄付金額が確認できるもの）
- 特定口座年間取引報告書（マイナポータルの連携、xmlファイルを使うと便利）

# 手順

1. 「国税庁 確定申告書等作成コーナー」をクリック
1. 「作成開始」（前年のデータ、保存データが無い場合）をクリック
1. 「ICカードリーダライタを使用してe-Tax」をクリック
1. 「令和〇年分の申告書等の作成」の「所得税」をクリック
1. 「収入金額・所得金額の入力」画面で下記の内容を入力する
    - 総合課税所得
        - 給与所得（給与所得の源泉徴収票）
    - 分離課税の所得
        - 株式等の譲渡所得等（特定口座年間取引報告書）
        - 上場株式等に係る配当所得等（特定口座年間取引報告書）
1. 「所得控除の入力」画面で下記の内容を入力する
    - 社会保険料控除（給与所得の源泉徴収票）
    - 小規模企業共済等掛金控除（給与所得の源泉徴収票）
    - 生命保険料控除（給与所得の源泉徴収票）
    - 地震保険料控除（給与所得の源泉徴収票）
    - 寄付金控除（寄付金受納証明証 ※ふるさと納税）
    - 配偶者（特別）控除（配偶者の源泉徴収票）
    - 扶養控除


# さいごに

- e-Taxやマイナポータルがメンテナンスで使えないことがあるので、期限に余裕を持って申請することをおすすめします。

# リンク
https://www.e-tax.nta.go.jp/kojin.html
Git&GitLab:習うより慣れろ

【[自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/drafts/dee76f411cf2488b6873/edit)】

# 更新履歴
2024/02/29:ブランチの作成・変更にcheckoutではなくswitchを利用するように変更

# 概要
いつも行う手順を記載．
ツールなんだから，考えながらやるのではなく，頭を使わなくて出来る方法があればそれが一番．
タグ名・ブランチ名のちゃんとしたものは[独自ルール:多人数開発のためのGitLab・タグ・ブランチ](https://qiita.com/NeK/items/8c62c74335a77ecea7af)を参照のこと．

# 手順

1. 対象を適当なとこまで作成(個人差あり．プログラムなら中身ないmain関数つくるところからα版まで幅広いと思う)．
1. ある程度まで出来たらgit開始．
    
    ```bash
    git init
    ```
    
1. .gitignoreの準備
    * [独自ルール:gitignoreの利用](https://qiita.com/NeK/items/0006d1edbf3d4a5a0442)
1. gitlabにプロジェクト作成，remote add，最初のpush．プロジェクト作成時に"README.mdを作成しない"にチェックを入れて作成しないほうが吉．   
    
    ```bash
    git remote add origin ***(gitlabで提示されたURL)
    git add .
    git push -u origin main
    ```

1. ここまででmainブランチが作成されている状態．大きな方針としてmainブランチを直接編集するのではなく作業用のブランチを作成し編集，編集後に統合．

1. 新しいブランチを作成し(ex. develop-add_func)，編集作業開始．
    
    ```bash
    git switch -c develop-add_func
    
    あとは編集作業．．．
    ```
    
1. 作業が一段落したらコミット．
    
    ```bash
    git add .
    git commit -m "コメントはなんか書く癖をつけておく"
    ```
    
    ```bash:もしadd/commitしたくないファイルがある場合
    git add <add/commitしたいファイル>
    git commit -m "コメントはなんか書く癖をつけておく"
    git stash -u
    ```
    
6. mainブランチへ戻ってマージ(develpブランチの動作はもちろん確認しておくこと)．
    
    ```bash
    git switch main
    git pull
    git merge develop-add_func
    git push
    ```
    
7. 必要に応じてタグ付与．
    
    ```bash
    git tag -a 1.0.0 -m "1.0.0はバージョン．バージョン・メッセージはちゃんと書こう．"
    git push --tags
    ```
    
8. 続けて編集あればdevelopへ戻って作業再開．基本的には1ブランチ1作業なので，本当に一時的ついているならブランチを削除＆新しい編集用のブランチを作成．
    
    ```bash
    git switch develop-add_func
    git stash pop
    ```




# 最後に
## ちょっと前提
分からなければ読み飛ばして可．

* mainブランチは極力直接編集しない．いつでも使用できるようにしておく(プログラムならコンパイル・実行可にしておく)．
* 直接編集するのは他のブランチ．そのブランチの編集が一段落し使用できることを確認したらmainにmergeする．mergeの間隔としては，大きな変更ではなく小さな変更を心がける．
* 他の人との共同開発などもあるため，「知らないmainのアップデートがあるかも」を頭においておく．

## stash便利
分からなければ読み飛ばして可．

小さな変更の際に，「このファイルはとりあえず作ったけど次のmerge変更で本格的に使うから今回のmergeに入れたくない」や「ブランチのテスト用の本当に一時的なファイルだからcommitとして残したくない」など，add/commit/mergeの対象にしたくない場合に便利．

このベージでは，とりあえず`git stash -u`,`git stash pop`を使っているがちゃんとした使い方などは以下が参考になる．

- [【git stash】コミットはせずに変更を退避したいとき](https://qiita.com/chihiro/items/f373873d5c2dfbd03250)
- [【Git入門】git stashで作業を便利に退避する](https://tech-blog.rakus.co.jp/entry/20211012/git)
【Git】ブランチの削除方法

## ローカルブランチを削除する
削除したいブランチ以外のブランチに移動します。
```:ターミナル
$ git checkrout main
```

以下のコマンドを実行してローカルブランチを削除します。

```:ターミナル
$ git branch -d 削除するブランチ名
```

## リモートブランチを削除する
以下のコマンドでリモートブランチを削除できます。
```:ターミナル
$ git push リモート名 --delete 削除するブランチ名
```