OmniAICreator/Qiita-1.07M huggingface dataset:
routes.rbのルーティングの設定を確認するには

ターミナルで以下を打つ。
```PHP:ターミナル
$ rails routes
```

```
Prefix Verb   URI Pattern                                                                                       Controller#Action
                                    root GET    /                                                                                                 static_pages#top
                                   users POST   /users(.:format)                                                                                  users#create
                                new_user GET    /users/new(.:format)                                                                              users#new
                                   login GET    /login(.:format)                                                                                  user_sessions#new
                                         POST   /login(.:format)                                                                                  user_sessions#create
                                  logout DELETE /logout(.:format)                                                                                 user_sessions#destroy
                          board_comments POST   /boards/:board_id/comments(.:format)                                                              comments#create
                            edit_comment GET    /comments/:id/edit(.:format)                                                                      comments#edit
                                 comment DELETE /comments/:id(.:format)                                                                           comments#destroy
                                  boards GET    /boards(.:format)                                                                                 boards#index
                                         POST   /boards(.:format)                                                                                 boards#create
                               new_board GET    /boards/new(.:format)                                                                             boards#new
                                   board GET    /boards/:id(.:format)                                                                             boards#show
           rails_postmark_inbound_emails POST   /rails/action_mailbox/postmark/inbound_emails(.:format)                                           action_mailbox/ingresses/postmark/inbound_emails#create
              rails_relay_inbound_emails POST   /rails/action_mailbox/relay/inbound_emails(.:format)                                              action_mailbox/ingresses/relay/inbound_emails#create
           rails_sendgrid_inbound_emails POST   /rails/action_mailbox/sendgrid/inbound_emails(.:format)                                           action_mailbox/ingresses/sendgrid/inbound_emails#create
     rails_mandrill_inbound_health_check GET    /rails/action_mailbox/mandrill/inbound_emails(.:format)                                           action_mailbox/ingresses/mandrill/inbound_emails#health_check

```
<a>タグ内で遷移させずにクリックイベントを実装する簡単な方法

どうもこんにちは、たくびー(@takubii)です。

Reactで`<a>`タグ内の特定の要素で遷移せずにクリックイベントを起こす実装したので方法を共有します。
特に難しいことはないのですが、備忘録として残します。

## 結論

`preventDefault()`を使うです。

リンク遷移したくない要素の関数の先頭で`preventDefault()`を宣言すればイベントの発生を抑制できるので、それを使用しました。

## 実装

簡単に実装例を記載します。

```jsx
export const MyComponent = () => {
  const handleClick = (e) => {
    e.preventDefault();
    // 何かの処理
  };

  return (
    <a href='/test'>
      <div>この部分はクリックすると/testに遷移する</div>
      <div onClick={(e) => handleClick(e)}>この部分はクリックしても遷移しない</div>
    </a>
  );
};
```

## 終わりに

簡単な内容ですがこの情報があなたのお役に立てたら幸いです。

ReactもJSですが、単純なクリックイベントの取得方法とかは忘れやすいのでこういった形で残しておこうと思います。

それではまた機会があればお会いしましょう。
GitButlerでgitのワークフローをめっちゃ便利にする

## tldr

[GitButler](https://gitbutler.com/)のUIはこんなかんじ。

![](https://storage.googleapis.com/zenn-user-upload/1d16ebc08546-20240214.png)

### なにがいいの?

目玉となる機能は仮想ブランチで物理的なブランチを作成しなくてもgitの作業を柔軟に行えるようになります。たとえば現在の変更から複数の仮想ブランチに変更をドラッグして変更を構成できたりします。

コミットメッセージも自動で考えてくれたりします。

![](https://storage.googleapis.com/zenn-user-upload/370ea1bb51f0-20240214.png)

仮想ブランチの名前も自動的に決めてくれます。

![CleanShot 2024-02-14 at 19.15.52@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/943be974-956d-02da-300e-d3d250bbc2b5.png)


## なぜGitButlerなのか？

### 新しいGitクライアントの必要性
現代のソフトウェア開発では、GitHubが開発者のコラボレーションを変革しました。しかし、GitHubやGitLab、Bitbucketを使うには依然として、使いにくく、エラーが発生しやすいコマンドラインツールを使用する必要があります。これは、現代の開発者が使用するワークフローやプロセスに最適化されていません。

### GitButlerの革新性
GitButlerは、ソフトウェア開発プロセスの「エディタでのコーディングからGitHubでのコード共有まで」を再考します。なぜ不明瞭なコマンドや煩雑な手順に悩まされなければならないのでしょう？ソースコード管理(SCM)は、あなたのためにすべてを記録し、より有意義なコミットメッセージを提供し、チームが書いたコードに関するコンテキストをより簡単に提供するべきです。また、異なるデバイス間での作業の移行もシームレスに行えるべきです。

### GitButlerの目指すもの
GitButlerは、新しい種類のGitクライアントだけではなく、ソフトウェア開発におけるコード管理の全く新しい考え方を提案します。これは、ソフトウェア開発のあらゆるステップで開発者を支援する「コードコンシェルジュ」として機能します。目的は、開発者が作業の一瞬も失うことなく、コードの各行に必要なサポートとコンテキストを提供することです。

### まとめ

ソースコード管理は、40年前の概念を超えて、より賢く、より進んだ形で実現可能です。GitButlerは、単に新しいツールを提供するだけでなく、ソースコード管理の方法自体を変革しようとしています。これにより、開発者はもはや旧来の管理ツールの複雑さに悩まされることなく、より効率的に、そして何よりもクリエイティブに仕事に取り組むことができるようになります。

## GitButlerの主だった機能

### 1. **同時ブランチ管理**:

GitButlerは、複数のブランチを扱う革新的なアプローチを導入しています。開発者が複数のブランチで同時に作業できるようにし、Git自体が直接サポートしていない機能です。この機能は、複数のブランチの切り替えと管理にかかる複雑さと時間を大幅に削減します。

### 2. **仮想ブランチ**(Virtual Branches)
GitButlerのVirtual Branch機能は、複数のブランチで同時に作業し、それぞれを独立してコミットやスタッシュすることを可能にします。これにより、開発者は複数の仮想ブランチを同時に扱い、1つのファイルに3つの異なる変更がある場合、各変更を異なる仮想ブランチレーンにドラッグして、それぞれを独立してコミットおよびプッシュすることができます。この機能は、Gitの通常のブランチ操作とは異なり、仮想ブランチは縦のレーンに保持され、かんばんボードのように各ファイルや差分をレーン間でドラッグできるようになっています。詳細はGitButlerのドキュメントを参照してください。

### 3. **自動バージョニングとコミットドラフト作成**(Automatic Versioning and Commit Drafting):

GitButlerはコミットを作成するだけでなく、自動バージョニングを直接Git作業ディレクトリに組み込みながらコミットメッセージをドラフトします。この機能により、開発者はコーディングにもっと集中できるようになり、バージョニングが自動的に処理されることを知っています。

### 4. **既存のワークフローとの統合**:
既存のGitワークフローにシームレスに統合するように設計されたGitButlerは、現在の実践を中断することなく、むしろ強化します。開発タイムラインの重要な瞬間をブックマークするような機能は便利さと効率性の層を追加します。

### 5. **Butler Flow**:
GitButlerの仮想ブランチ機能によって促進される軽量な、ブランチベースのワークフロー。仮想ブランチが上流にマージされるまでローカルに適用され続けることを保証し、混乱とオーバーヘッドを減らします。

## なぜGitButlerを選ぶのか？

GitButlerは単なるツール以上のものです。日々の開発者が直面する微妙な問題と課題に対処するために作られました。ソースコードをより賢く管理し、コードの各行に対するサポートを提供することで、GitButlerはソフトウェア開発プロセスの一歩先を行くことを目指しています。

## GitButlerの始め方

GitButlerを始めることは簡単です。プラットフォームはダウンロード可能で、オープンベータバージョンがその機能の一端を垣間見ることができます。開発チームはまた、Discord上でコミュニティを育て、ユーザーが参加し、経験を共有し、サポートを得ることができます。
Session Managerを使ってEC2に接続するにはどのような経路が必要なのか

# はじめに
突然ですが、EC2インスタンスにアクセスするとき皆様はどのような方法でアクセスしていますか。
私は今までキーペアを使ってローカルPCからSSH接続をする方法が当たり前だと思っていましたが、AWSマネジメントコンソールから直接アクセスできることを知って驚きました！
AWS Systems Managerの機能の1つであるSession Managerを使うと、キーペアを使うSSH接続よりもセキュアな接続を実現できます。具体的には次のようなメリットがあります。
1. キーペアを使わないので、キーペアを紛失した際の情報漏洩を防ぐことができる
1. インバウンドルールでSSHポート(ポート番号22)を開ける必要がなくなる
1. プライベートサブネットにあるEC2インスタンスにも踏み台サーバーなしでアクセスができる
※これにはNat GatewayもしくはVPCエンドポイントが必要となる（詳細は後述）

本記事では、プライベートサブネットのEC2インスタンスにSession Managerを用いてマネジメントコンソールから接続するためのネットワーク経路についてご紹介します。

# 前提
今回はSession ManagerによるEC2接続の実装手順の中でも、ネットワーク経路にフォーカスしているので以下の手順は省略いたします。
* EC2インスタンスの起動
* アクセスするユーザーが使用するIAMユーザーの作成
* EC2に必要なIAMロールのアタッチ
# 接続経路の種類
今回はSession ManegerによるEC2接続 (以下ssm接続と記載)の実現に必要なネットワーク経路を2種類説明いたします。
ssm接続をするためには、プライベートサブネットからVPC外に出られる経路が必要になります。
ssm接続に必要な経路を作る方法は、NatGatewayを経由する方法と、Session manager用のVPCエンドポイントを経由する方法があります。
どちらを使うべきかはコストやセキュリティ要件を比較して、環境ごとに決めるのが良いかと思います。

### 1. NatGatewayを使用した経路
1つ目はNatGateway経由でssm接続をする方法です。
NatGatewayはプライベートIPアドレスをグローバルIPアドレスに変換する役割を持っています。こちらの構成では以下のメリットがあります。
* NatGateway1つでssm接続に必要な経路が作成される
* EC2をインターネットに出すことができる


![構成図-SSM接続（NAT）.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622083/73294bd8-4682-d253-ac41-21ba6e11cec0.png)




### 2. ssm接続用のVPCエンドポイントを使用した経路
2つ目はssmエンドポイント経由でssm接続をする方法です。
この方法では、EC2インスタンスがインターネットに出ないのでとてもセキュアなssm接続を実現することができます。メリットは以下の通りです。
* NatGatewayよりもセキュアな状態でssm接続ができる
* Nat Gatewayよりも料金が安い
![構成図-SSM接続（エンドポイント）のコピー.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622083/61e52474-e0fa-c563-1057-e71d76043001.png)


# おわりに
必要な条件は満たしているはずなのに疎通ができない…と思ったときは、ネットワーク経路を視覚的に見てみると原因がわかるかもしれません。私自身ssm接続をはじめ、図に起こした事で原因を発見したことが何度もあるので皆様も是非、図で状況を整理してみてください。
今回は初投稿ということもあり、ssm接続に必要なネットワーク経路に関する説明にとどまりましたが、今後は具体的な構築方法なども記載していきたいと思います。

[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)
JSのメモ

# JSのデータ型は2種類ある。
・プリミティブ型
・オブジェクト型

https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88

# プリミティブ型は7種類
・Null 
・Undefined 
・論理
・数値
・長整数
・文字、文字列 → ””で囲われた文字
・シンボル
　
# オブジェクト型はたくさんある。
・プリミティブ型以外のデータ型は全てオブジェクト型である。

https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction

オブジェクト型の例 
document
メソッド
プロパティ


documentはどこからでもアクセスできるグローバル

https://developer.mozilla.org/ja/docs/Web/API/Document

???
documentはDOMと関係があるらしいけどどんな関係なのかがよくわからない。
→DOMはブラウザの内部表現の（頭のなか）
→ブラウザ経由でDOMを操作できる。

DOMという抽象的な概念があってDOMを具体的に使うときにdocumentとなる。

https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model



メソッド
# getElementById()
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementById

・htmlの要素をgetElementById()で取得して、HTMLの要素を変数や代入を使って操作できる
# addEventListener()

https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener

引数
addEventListener("click"){}
clickを指定するとクリックした時にイベントが起きる。

addEventListener("dblclick")
dblclickを指定するとダブルクリックした時にイベントが起きる。


https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.html

addEventListenerとonclickの違い
条件
hogeとfooという文字列が出力されるプログラムを書いたら
foge
foo
と出力されるが、onclickはプロパティなので新しい文字列を書いたら更新される
結果、
fooのみが出力される


# HTMLelementは英語のhave

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement

innnerTextは指定されたidのテキストを変更できる。

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/innerText
プログラマーへの道 #8 メモ帳アプリを作る（プログラミング入門）のメモ

# 参考にした動画

<b>写経用</b>

https://www.youtube.com/watch?v=0R_1avhqAGw&list=PLYjErceFbIaMhPMP75k3YV6Ce7mwYKcZl&index=9

<b>本編</b>

https://www.youtube.com/watch?v=XL22GFVvH3o&list=PLYjErceFbIaMhPMP75k3YV6Ce7mwYKcZl&index=10

# HTMLの要素
```<h1></1h>```
```<input>```

# ```<h1></1h>```

HTMLの要素に属しているHTMLのタグ
HTML の見出し要素は6種類ある！
```<h1></1h>```のhはHeadingの略で、見出しを意味するタグ。 
```html
<html>
    <h1>だんご</1h>
    <h2>だんご</2h>
    <h3>だんご</3h>
    <h4>だんご</4h>
    <h5>だんご</5h>
    <h6>だんご</6h>
</html>
```
<b>ブラウザ</b>
![スクリーンショット 2023-05-22 19.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/dc6f814c-1a1a-28df-2c82-316bc3afe031.png)

https://developer.mozilla.org/ja/docs/Web/HTML/Element/Heading_Elements

https://html-coding.co.jp/annex/dictionary/html/hx/

# ```<input>```

```<input>```type属性は22種類ある！

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input
プログラマーへの道 #11 配列と繰り返し（プログラミング入門）のメモ

# 参考にした動画
https://youtu.be/hHFXsqLhgO4

# おみくじを作る編
<b>やりたいこと</b>
現在時刻の分の値を3で割った余り使っておみくじを判定する。

<b>使った道具</b>
new Date()
getTime()
new Date().getTime()

# 写経したコード
```html
<html>
	<body>
		<h1>おみくじ</h1>
		<button id="id-btn">おみくじをひく</button>
		<script>
			btn = document.getElementById("id-btn")
			btn.addEventListener("click",button)

			function button(){
				now = new Date().getTime()
				omikuji = now % 3

				if(omikuji == 0){
					alert("大吉")
				} else if(omikuji == 1){
					alert("中吉")
				} else {
					alert("小吉")
				}
			}
		</script>
	</body>
</html>

```

# new Date()
[Date mdn](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)
コンストラクタ属性

# getTime()
メソッド属性
[getTime() mdm](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)

# new Date().getTime()
![スクリーンショット 2023-05-26 17.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/c6026094-56e8-2bc8-e37f-519dc0051e94.png)


# 調べたこと
・[getTime()とgethour()の違い](https://crocro.com/write/manga_javascript/wiki.cgi?p=date)
・hour,minutes,secondのそれぞれ取得する方法
・[ミリ秒と秒の違い](https://e-words.jp/w/%E3%83%9F%E3%83%AA%E7%A7%92.html#:~:text=%E3%83%9F%E3%83%AA%E7%A7%92%20%E3%80%90millisecond%E3%80%91%20msec%20%2F,1%E7%A7%92%E3%81%AB%E7%9B%B8%E5%BD%93%E3%81%99%E3%82%8B%E3%80%82)
・[エポックタイム(Epoch time)・UNIXタイムスタンプ(UNIX timestamp)](https://e-words.jp/w/UNIX%E6%99%82%E9%96%93.html#:~:text=%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%EF%BC%88OS%EF%BC%89%E3%82%84%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3,%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E6%95%B4%E6%95%B0%E3%81%A7%E8%A1%A8%E3%81%99%E3%80%82)

# 時・分・秒をそれぞれ取得する方法
<b>やりたいこと</b>
・ボタンを押したら時・分・秒を出力する。
・数字が一桁の時は十の位の数字を0を出力する。
・ファビコンを🕰にする。

https://shu-naka-blog.com/html/favicon/

https://kantaro-cgi.com/webappli/multiicon-maker/

https://saruwakakun.com/font-family


<b>見た目![スクリーンショット 2023-05-26 19.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/95c48127-6b9a-822b-c8c5-9c89af3c04e6.png)
</b>
C言語で文字列の二次元配列を定義して要素を出力する方法。

# 参考にした問題
https://paiza.jp/works/mondai/array_primer/array_primer__string_output_step2

# 学んだこと
・定義した文字列の要素を全て出力する。

```C
#include <stdio.h>
int	main(void)
{
	char str[5][9] = {
		"good",
		"morning",
		"paiza",
		"813",
		"pa13",
	};
   
	for (int i = 0; i < 5; i++)
	{
	    printf("%s\n",str[i]);
	}

	return (0);
}

```
httpd(Apache)コンテナ備忘録

# ちょっと使うだけ

一時的に使うだけの場合は、`docker run`でコンテナを起動するだけで良い。このコマンドを実行すると、カレントディレクトリのファイルが`localhost:8080`で見えるようになる。

```bash
docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
```

# 継続的に使う場合

たとえば、次のようなディレクトリ構造にする

- root
    - html
    - app
        - Dockerfile
        - my-httpd.conf
    - docker-compose.yml


まず、設定ファイルをコンテナから取り出す。

```bash
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf
```

`dockerfile`を作成する。

```
FROM httpd:2.4
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf
```

`docker-compose.yml`を作成する。

```yaml
version: '3.7'
services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: my-apache-app
    volumes:
      - ./html:/usr/local/apache2/htdocs/
    environment:
      TZ: Asia/Tokyo
    ports:
      - 8080:80
```

# 参考
https://hub.docker.com/_/httpd
react-hook-formでyupResolverを使った時のmock化をちゃんとやる

# 背景
react-hook-formのuseFormでresolverに`yupResolver`を使っている。

# jestのカバレッジのStmtsが低い
テストパターンを網羅しているつもりなのにStmtsが100%にならない
![スクリーンショット 2024-02-14 18.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/07c22ae4-b742-1916-5c4e-9bf9b83ec9bd.png)

# yupResolverもモック化して解決
hook側のuseFormの記述
```react.js
export const schema = object({
  password: string().required('パスワードを入力してください').min(6, '6文字以上で入力してください'),
});
```
```react.js
const {
    register,
    getValues,
    formState: { errors, isValid },
    handleSubmit,
    reset,
  } = useForm<{ password?: string }>({
    defaultValues: { password: undefined },
    resolver: yupResolver(schema),
    mode: 'onChange',
  });
```
jestのテスト
```react.js
import { yupResolver } from '@hookform/resolvers/yup';
import { useForm } from 'react-hook-form';

jest.mock('react-hook-form');
jest.mock('@hookform/resolvers/yup');

describe('useTest', () => {
  const mockYupResolver = yupResolver as jest.Mock;
  beforeEach(() => {
    mockYupResolver.mockImplementation(() => {});
    (useForm as jest.Mock).mockReturnValue({
      register: jest.fn(),
      getValues: mockGetValues,
      formState: { errors: {}, isValid: true },
      handleSubmit: jest.fn(),
      reset: mockReset,
    });
  });

  it('should exec yupResolver', () => {
    const { result } = renderHook(() => useTest());
    // yupResolverが1回呼ばれていることを確認
    expect(mockYupResolver).toHaveBeenCalledTimes(1);
    // yupResolverがschemaを引数にしていることを確認
    expect(mockYupResolver).toHaveBeenCalledWith(schema);
  });
});
```

# 最後に
カバレッジが100%になってスッキリ！
グローバル変数

# 注意
Atcoderの[A - Five Integers](https://atcoder.jp/contests/abc268/tasks/abc268_a)のネタバレあり。
# ACしたコード
```C
#include <stdio.h>

int	array[101];                         //学んだこと1に記載
int	main(void)
{
	int a;

	for (int i = 0; i < 5; i++)
	{
		scanf("%d", &a);
		// printf("%d ",a);
		array[a]++;                     //学んだこと2に記載
	}
	int res = 0;
	for (int i = 0; i <= 100; i++)
	{
		if(k[i]){
			res++;
		}
	}
	printf("%d\n", res);
	return (0);
}
```
# 学んだこと1
main関数の <b>外</b> で変数を宣言すると0に初期化される。
このことを[グローバル変数](https://9cguide.appspot.com/12-02.html)という。

↑↓ 逆に

main関数の <b>中</b> で変数を宣言する事をローカル変数という。
# 学んだこと2
```C
array[a]++;     
``` 
int	array[101]をグローバル変数にしているので以下のような変数が用意される。
```C
array[0] == 0
array[1] == 0
array[2] == 0
array[3] == 0
array[4] == 0
```
1回目のループで
標準入力からint a

# 実行結果
```C
//テストケース1
//与えられる値
31_9_24_31_24
//実行結果
array[31]=1_array[9]=1_array[24]=1_array[31]=2_array[24]=2_

//テストケース2
//与えられる値
0_0_0_0_0
//実行結果
array[0]=1_array[0]=2_array[0]=3_array[0]=4_array[0]=5_
```
# 参考記事まとめ
[グローバル変数](https://9cguide.appspot.com/12-02.html)
[Sublime Text 4 for Windows] build system で複数コマンドを実行させたいときの書き方

Sublime Textのビルド（Ctrl-B）コマンドでPythonの仮想環境を指定して実行したい場合に仮想環境ごとにbuild systemを作成する必要があるらしいことはわかったが、"cmd"でのパスの書き方やactivateを叩いた後にスクリプトを実行させる場合にコマンドをつなげる「&」や「&&」などの接続詞の書き方などで躓いたのでメモっておく。

# ポイント
- pathの区切り文字である円マークというかバックスラッシュ「\」はエスケープする必要あり
- コマンドをつなげる「&」や「&&」などの接続詞もダブルクオーテーション「"」で括る必要があり、かつ前後をカンマ「,」で区切るべし

# サンプル
```JSON:Python-venv.sublime-build
{
    "shell": true,
    "cmd": ["C:\\Users\\Username\\Documents\\project\\.venv\\Scripts\\activate.bat", "&&", "python", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
}
```

# 参考
https://gist.github.com/zakisanf05/e08ada2c7886df73faa5
日付の列から2年後の列を作成する(SPSS Modeler データ加工逆引き1-18)

# 日付の列から2年後の列を作成する（日付の加算）

![スクリーンショット 2024-02-07 14.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/12dbb498-f52e-38f0-4037-427aed81ba41.png)

2023年12月にリリースしたModeler Ver18.5で追加した関数を利用します。
Ver18.4以前を利用する方は逆引き1-5を確認ください。

https://qiita.com/416nishimaki/items/85d42d7e54a42d426f3e


## 1.想定される利用目的
・入会日からN年後を特定し特徴量作成の材料にする
・部品が設備に取り付けられてから年後のチェックポイントを求め特徴量の材料にする

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/after_2_years.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-02-07 14.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/67104649-83f8-5145-90d1-033a330b329b.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2024-02-07 14.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/31e3fe29-a775-bf3e-86ec-23c5cc5fd419.png)


#### Ver18.5以降の方法

b.[フィールド作成]ノードを編集します。7日後を算出するため関数date_add_daysを利用します。

![スクリーンショット 2024-02-07 14.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1a7fd793-6994-024d-1fed-53c8b091b062.png)

[プレビュー]します。

![スクリーンショット 2024-02-07 14.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/24c5edee-8485-367d-b769-8f911ef3ea10.png)

c.[フィールド作成]ノードを編集します。6ヶ月後を算出するため関数date_add_monthsを利用します。

![スクリーンショット 2024-02-07 14.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/38e2136e-598e-7c48-104d-8313c2290b89.png)

[プレビュー]します。

![スクリーンショット 2024-02-07 14.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/239a9022-3c15-db64-12d7-785df50bc022.png)

d.[フィールド作成]ノードを編集します。２年後を算出するため関数date_add_yearsを利用します。

![スクリーンショット 2024-02-07 14.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fef03259-0e50-e052-1dba-32104afc1af6.png)


[プレビュー]します。

![スクリーンショット 2024-02-07 14.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8c78442c-4d45-0bb2-028b-352957cbfb91.png)


#### 注意事項

Ver18.4以前にはdate_add関数が存在しないため、逆引き1-5の手順を参照ください。

## 4.参考情報

#### 日付の加算減算

https://qiita.com/kawada2017/items/c41f443e5246d331bea1#9m-%E6%97%A5%E4%BB%98%E3%81%AE%E5%8A%A0%E7%AE%97%E6%B8%9B%E7%AE%97modeler%E7%89%88

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
SSHの鍵ペアは一個作って使い回すもの？　それともサーバーごとに？　端末ごとに？ 踏み台機にはどうする？

ご意見ある方どしどしコメントください。ディスカッションしてより良い提言にしていきましょう。

一言で述べると
---

- **セキュリティを重視するなら、アクセスするサーバー群が共通する端末マシン群ごとに一個作るとよい。**
- **それでも、踏み台機に置くための鍵ペアを別途作る必要はごく薄い**

鍵ペアのセキュリティリスク
---
鍵ペア・公開鍵認証方式についてはご理解されていることを前提に進めます。

鍵ペアのセキュリティリスクは、秘密鍵が漏洩した場合に発生します。  
この漏洩の脅威は単にssh認証を突破されてしまうという点だけではありません。漏洩後に鍵ペアを無効化するのが容易ではないという点にあります。

WebのTLSのために用意されているような統一規格の公開鍵配布・証明基盤はsshにはありません。  
もちろん社内システムにおいてはActive DirectoryやLDAP、STNSを使って公開鍵を配布・管理することもできるのですが、あくまで組織ごとにやっている施策であって統一的なものではありません。  
認証局があって統一的に公開鍵を配布・管理しているのであれば、秘密鍵が漏洩したときすぐにその鍵ペアを無効なものだと広報できます。ところがそういうものがないsshの世界だと、各所に登録した公開鍵をすべて無効化する網羅的な方法がない、これが大変なのです。  
組織内のマシンはすべて公開鍵管理できていたとしても、GitHubに、VPSサービスに、その他クラウドサービスに登録したことはないでしょうか。わかりませんね。

我々の向き合うべきリスク課題は、「秘密鍵漏洩は止めにくい出血なのでいざというときの出血量を減らす」こととわかりました。

端末ごとに変える意味はない
---
たとえば会社内で2台のPCを使っているとします。  
同時に使っているのではなく、マシンを交換したときの先代と現役の2台のことと考えてもよいです。

端末ごとに違う鍵ペアを作ろうということにして、交換後の新マシンで新たにssh-keygenしたとしましょう。  
すると、業務で入るサーバーに新しい公開鍵を入れて回ることになります。GitHubその他のクラウドサービスにもですね。  
たぶん交換初日に全部はできなくて、交換後仕事をしながら「あっここにも入れなくちゃだった」が何度も出てくると思います。なにしろ、どこに配ったかわからないのが公開鍵ですからね。

すると、だいたいのログイン先では旧公開鍵と新公開鍵の両方が登録されていることになります。  
何を意味するかというと、旧秘密鍵と新秘密鍵のどちらが漏洩しても「止めにくい出血」が同じ範囲で発生するのは変わらないってことです。

漏洩して困るデータを複数持ってしまうことのリスクまで勘案するなら、端末ごとに鍵ペアをわける意義はないと言えます。  
新マシンには旧マシンのid_rsa, id_rsa.pubをコピーしてくるのがよいでしょうとなりました。

個人用マシンと会社マシンで違う鍵ペアを使う意味はある
---
個人用マシンと会社マシンで、同じ接続先に同じユーザーとしてログインする可能性はありますか？  
まあ、GitHubくらいはありえるかもしれませんが、それ以外はほぼ別々でしょう。

そうすると、個人用と会社用とで鍵ペアをわけることで、それぞれの秘密鍵が漏洩したときの出血範囲はほぼ重なっておらず、漏洩一回あたりの被害と対応工数を絞ることができます。

この、被害範囲を狭めるという考え方からいけば「個人用と会社用でわける」というよりは、**接続先が共通するマシン群ごとに**わけるのがよいのだと言えましょう。個人用と会社用では当然に接続先が共通しないからわけるのだという理屈に。

踏み台機に置く鍵ペアは？
---
踏み台を利用したssh接続をする場合、ProxyCommand方式を使うなら、もしくは手動でsshコマンドを2回打つならば踏み台機にも秘密鍵を置かないといけません。  
これを、ローカルマシンからコピーして良いのか、別のものを作るべきなのか。

踏み台機なしでアクセスする接続先と踏み台機を通して接続する先は異なるので、「アクセス先サーバー群が共通しない」よって別々という考え方もできますが、そこまでする必要はなさそうに思います。

ひとつは、ssh踏み台接続にはProxyJump方式を使うことが増えてきましたから、結局踏み台の向こう側のサーバーにもローカルマシンの公開鍵を登録することになり、「共通するアクセス先群」になってしまうであろうこと。  
もうひとつは、そうでなくても漏洩時のリスク範囲がたいして変わらない点です。

まず、ローカルマシンの秘密鍵だけが漏洩した場合というのはありえません。踏み台機の秘密鍵もそれで取得されてしまいますから速やかに両方の漏洩となります。  
つぎに、踏み台機の秘密鍵だけが漏洩したときのリスクというのはかなりのエッジケースです。「踏み台機に誰かしらユーザーとしてログインできる攻撃者」に漏洩した場合に問題になるわけですから、これは組織内の悪意ある同僚の存在が前提になります。そんなものを前提にしだしたら、やるべきセキュリティ対策はもっと膨大な項目にわたり、踏み台機に置く鍵ペアはという小さな問題どころではなくなります。

あわせると、踏み台機にはローカルマシンからコピーしてきた鍵ペアを置いておくので十分という結論です。別のものを作って、ProxyJumpとProxyCommandで認証結果が異なってしまうのは単に不便なだけです。

まとめ
---
上記の議論をまとめますと、最初に挙げたとおり以下のようになります。

- **セキュリティを重視するなら、アクセスするサーバー群が共通する端末マシン群ごとに一個作るとよい。**
- **それでも、踏み台機に置くための鍵ペアを別途作る必要はごく薄い**
「ウタシパノ 仲良く暮さん モヨヤッカ ネイタパクノ アウタリオピッタ」はUniversal Dependenciesで書けるのか

バチェラー八重子『[若きウタリに](https://dl.ndl.go.jp/pid/1875591/1/13)』(竹柏會、1931年4月)の「ウタシパノ 仲良く暮さん モヨヤッカ ネイタパクノ アウタリオピッタ」を、手作業で係り受け解析してみた。

```
# text = ウタシパノ 仲良く暮さん モヨヤッカ ネイタパクノ アウタリオピッタ
1	ウタシパノ	utaspa-no	ADV	副詞	_	3	advmod	_	_
2	仲良く	仲良く	ADV	副詞	_	3	advmod	_	SpaceAfter=No
3	暮さ	暮らす	VERB	動詞-一般	_	5	advcl	_	SpaceAfter=No
4	ん	む	AUX	助動詞	_	3	aux	_	_
5	モヨ	moyo	VERB	自動詞	_	11	advcl	_	SpaceAfter=No
6	ヤッカ	yakka	SCONJ	接続助詞	_	5	mark	_	_
7	ネイ	ney	NOUN	位置名詞	_	11	obl	_	SpaceAfter=No
8	タ	ta	ADP	格助詞	_	7	case	_	SpaceAfter=No
9	パクノ	pakno	SCONJ	後置副詞	_	7	case	_	_
10	ア	a=	PART	人称接辞	_	11	det	_	SpaceAfter=No
11	ウタリ	utari	NOUN	名詞	_	0	root	_	SpaceAfter=No
12	オピッタ	opitta	SCONJ	後置副詞	_	11	case	_	_
```

[2023年2月21日の日記](https://srad.jp/~yasuoka/journal/660229/)にも書いたが、私(安岡孝一)自身は「オピッタ」を後置副詞だとみなしていることもあって、何とかUniversal Dependenciesで書ける気がする。可視化すると、こんな感じ。

![a=utari_opitta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/0c559536-fe59-4541-f2eb-b4a26c6d1da2.png)

ただ、自動解析は難しそうだ。さて、どうしようかな。
第2回金融データ活用チャレンジ  企業の成長期？　企業の衰退期？

# 概要
・SIGNATEで2024年1月18日～2024年2月15日のコンペ「第2回 金融データ活用チャレンジ」について新たに特徴量を作成してみた
・地域金融機関に勤務　前回の第1回金融データ活用チャレンジにも参加　今後、データ分析の重要性は増々高まっていくことをぼんやりと想定
・自身が金融機関に勤めていることから金融目線で投稿してみました　初めての投稿であり読みづらければ申し訳ないです
・今回は企業向けローンの返済可否予測　企業向けローンは地域の産業活性化という視点からも非常に重要なものと感じている
・データは金融機関が重視している財務データの指標が少ないことから、財務データに代わる指標の必要性を感じていた
・一般的に企業のライフサイクルには「導入期」、「成長期」、「成熟期」、「衰退期」の４つのライフサイクルがある。「成長期」はローン返済が不可となる確率は低く、「衰退期」はローン返済が不可となる確率が高い
・企業のライフサイクルから「成長期」と「衰退期」がわかれば有効な特徴量となると考え特に雇用に着目した

# 企業のライフサイクル


![1076812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712830/006c68a9-f639-3339-1c99-13cdb1f2a79b.png)

### 導入期：
企業が設立され、事業を開始する段階。
主要な焦点はアイデアの検討、市場調査、製品またはサービスの開発、資金調達など。
成功の鍵は市場のニーズに合った製品やサービスを提供し、事業の基盤を築くこと。

### 成長期：
企業が市場で存在感を増し、売上高や従業員数が拡大する段階。
成長の課題には組織の拡大、効率の向上、新規市場進出などが含まれる。
成功の鍵は市場での競争力を保ちながら持続可能な成長を実現すること。

### 成熟期：
企業が市場で確立され、成長が安定する段階。
主要な焦点は収益の最大化、市場シェアの保持、製品やサービスの最適化など。
成功の鍵は効率的な運営、ブランドの維持、顧客ロイヤルティの構築など。

### 衰退期：
企業が市場での地位を失い、収益が減少する段階。
衰退を逆転するためには、製品の刷新、新しい市場への進出、組織の再構築などが必要。
成功の鍵は柔軟性を持った対応と、変革的な戦略の採用。


# 特徴量策定にあたっての仮説

### ■　企業の成長期局面

　・創出される雇用が多ければ多いほど売上増加等の企業の業容拡大につながる
 
:::note info
　成長期時期はローン返済不可となる可能性は低い？
:::

### ■　企業の衰退期局面

  ・維持される雇用が少なければ少ないほど売上減少、事業縮小などのマイナル要因

:::note info
衰退時期はローン返済不可となる可能性は高い？
:::

 # ベースとなる特徴量

### ■　NoEmp
 ・融資を受ける前の従業員数

### ■CreateJob
 ・企業が融資資金を使用して創出すると予想される雇用の数

### ■RetainedJob
 ・融資を受けたことで企業が維持すると予想される雇用の数

::: note
 「業容が拡大している」「業容が縮小している」ということを雇用の特徴量を使い表現できれば有効ではないか？
:::

 # 追加した特徴量

### ■成長期指標

```python:qiita.py
train['Expansion'] = train['NoEmp'] + train['CreateJob']
test['Expansion'] = test['NoEmp'] + test['CreateJob']
```
Expansion = 　NoEmp(融資を受ける前の従業員数）
＋CreateJob(企業が融資資金を使用して創出すると予想される雇用の数）

将来の従業員数であり成長していることを示す指標

### ■衰退期指標

```python:qiita.py
train['Decline'] = train['NoEmp'] - train['RetainedJob']
test['Decline'] = test['NoEmp'] - test['RetainedJob']
```
　Decline = NoEmp(融資を受ける前の従業員数）
－RetainedJob(融資を受けたことで企業が維持すると予想される雇用の数）

従業員の減少数であり大きければ衰退しているを示す指標

# 検証

チュートリアルのコードにて検証（LightGBM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712830/4cde0638-6d32-a28f-43ba-5b3c6d327428.png)


少しだけ増加したが、思ったよりも増加しなかったという印象
決定木系のモデルには相性がいいと実感

### 相関について可視化
MIS_STATUS との関係についてヒートマップを作成

```python:qiita.py
import seaborn as sns
temp = train[['RetainedJob','NoEmp','CreateJob','MIS_Status']]
temp['Expansion'] = temp['NoEmp'] + temp['CreateJob']
temp['Decline'] = temp['NoEmp'] - temp['RetainedJob']
sns.heatmap(temp.corr(),annot = True)
```

![seaborn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712830/a7998f51-c728-6303-8d69-6af74a53bee4.png)



# 課題・理解できない点

NoEmp →　融資を受ける前の従業員数
RetainedJob →　融資を受けたことで企業が維持すると予想される雇用の数

:::note warn
維持される従業員より現在の従業員数が多くなるはずでは？
:::

train データ42,307件のうち8,620件が現在の従業員数より維持される雇用数が多い

データによっては現在の従業員数より維持される雇用のほうが132人も多い
解釈相違？・データ相違？・CreateJobも併せて考慮？

# 最後に
第２回金融データ活用チャレンジ楽しみながら参加させてもらっています
生成データであり実務面とリンクしないとの意見がありますが、確かにドメイン知識（業界知識）があれば分析の切り口が見つけやすいということはあると思います
ただ最も大切なことはEDA（探索的データ分析）の試行錯誤であり、生成データであってもその姿勢は変わらないと考えています
第３回も変わらず挑戦するので開催を楽しみにしています
クレジットカード決済の導入

# はじめに
プログラミング初心者です。現在フリマアプリ作成、終盤の商品購入機能実装中。
初心者ですので、お手柔らかに。

# PayJPの導入
#### 実装に入る前に
railsには標準でturboというアプリを高速化する機能が備わっており、JavaScriptの実装に不具合をきたすため、機能をオフにします。
#### payjp.js
PAY.JPを使用するためのJavaScriptのライブラリのこと。
読み込めるようにするために、こちらを記述
app/views/layouts/application.html.erb
```html
<script type="text/javascript" src="https://js.pay.jp/v2/pay.js"></script>
```
#### JavaScriptの実装
card.jsファイルを作り、読み込める操作をしていきます。
PAY.JPの公開鍵をファイル内に記述します。

# トークン化の処理
#### typeの説明
card：カード番号入力欄、有効期限入力欄、CVC入力欄の順に横に並んだフォーム
cardNumber：カード番号入力欄
cardExpiry：有効期限入力欄
cardCvc：CVC入力欄

#### element.create()
このメソッドを使用し、フォームを生成します。

#### mountメソッド
id属性を指定し、elementが情報を持ったフォームと置き換えます。

以上を踏まえて、
```js
const elements = payjp.elements();
const numberElement = elements.create('cardNumber');

numberElement.mount('#number-form');
```
こんな感じです。
#### createTokenメソッド
戻り値としてトークンを取得できます。
```js
const pay = () => {
  const payjp = Payjp('pk_test_***********************')// PAY.JPテスト公開鍵
  const elements = payjp.elements();
  const numberElement = elements.create('cardNumber');
  const expiryElement = elements.create('cardExpiry');
  const cvcElement = elements.create('cardCvc');

  numberElement.mount('#number-form');
  expiryElement.mount('#expiry-form');
  cvcElement.mount('#cvc-form');

  const form = document.getElementById('charge-form')
  form.addEventListener("submit", (e) => {
    payjp.createToken(numberElement).then(function (response) {
      if (response.error) {
      } else {
        const token = response.id;
        console.log(token)
      }
    });
    e.preventDefault();
  });
};

window.addEventListener("turbo:load", pay);
```
これで実際にフォームを入力するとコンソール上にトークンが生成されます。

#### 本日のエラー
一つ目は、mountメソッドを記述してトークンの生成確認をしたが、コンソール上にトークンが表示されないものでした。
原因はフォームをビューで作ってしまっていたことでした。（f.text_field~~のように）
JavaScriptでフォームを用意する記述をしているのでこれは<div>に置き換えてOKでした。
[Swift] 浮動小数点数の２乗の和（とか）

# はじめ
浮動小数点数の配列の要素をすべて２乗して足し合わせるとき通常は
```swift
let array: [Double] = [0.0, 1.2, 1.3, 1.5, 1.6, 1.9, 2.4, 4.7]
let s0 = array.reduce(0.0) { r, e in r + e * e }
```
としますね。

ですが、Swiftには浮動小数点数に二つの浮動小数点数を掛けたものを加える、というちょっと変わった関数が備わっています。
これを使うと次のようになります。
```swift
let array: [Double] = [0.0, 1.2, 1.3, 1.5, 1.6, 1.9, 2.4, 4.7]
let s1 = array.reduce(0.0) { r, e in r.addingProduct(e, e) }
```

[Appleのドキュメント addingProduct(_:_:)](https://developer.apple.com/documentation/swift/floatingpoint/addingproduct(_:_:)-3z17c)

mutableなaddProductもあります。
[Appleのドキュメント addProduct(_:_:)](https://developer.apple.com/documentation/swift/floatingpoint/addproduct(_:_:))
## なにがうれしいのか

### 精度がいい
先の二つの計算結果を見てみると以下のようになっています
 ```
 s0 = 39.400000000000006
 s1 = 39.4
 ```
普通に２乗して足し合したものには浮動小数点数でおなじみのゴミがついていますが、`addingProduct`を使った場合はそれがありません。

### 速い？
実はこの`addingproduct`はfma（fused multiply-add)という演算で最近のCPUにはほとんど実装されている演算です。
なのでたいていの場合は速いです。
精度が高いのもこのおかげですね。

# おわり
この二つの数を掛け合わせたものを足すという`fma`はやみくもに作られたものではなく、いろいろな分野で現れる計算なので知っておくといいかもしれません。
スマホのコンパスと現代的な環境

1.スマホのコンパス
iPhoneに古くから存在するコンパスアプリ、これがandroidスマホには無い。そのため、androidでも使えることを目指したコンパスアプリを開発する。
アプリの形態は、配布のコストを考え、ネイティブアプリではなくWebアプリとして実装する。

https://github.com/fresh-egg-company/compass

2.現代的な環境の感想
今回、初めてGithubでソースを公開し、markdownでREADMEを書いた。現代的な環境というのは、本当にブラウザで何もかも済んでしまうのだなぁ、としみじみ思った。もはや、Visual Studio Codeがブラウザ上で動いてしまえば、PCやMacを使わなくても、iPadやAndroidタブレットで開発ができてしまう。かつてプログラムを作るために100万円近い投資をしてPCを購入していたことを思い出すと、デジタル技術の変化のスピードは恐ろしいものだ、と実感する。
FileファサードのallFilesメソッドは隠しファイルを取得するかどうかを指定できる

ディレクトリのファイルパス一覧を取得しようとしたときに、どうしてもあるファイルパスのみ取得できなかったので、調べてみました。
ドキュメントが不十分で分かりにくかったので、備忘録のため書き残します。

# 目次
- [allFilesメソッドについて](#allFilesメソッドについて)
- [allFilesメソッドの引数について](#allFilesメソッドの引数について)
- [内部実装について](#内部実装について)

## allFilesメソッドについて
「与えられたディレクトリからすべてのファイルを取得する（再帰的に）」メソッドです。
つまり、引数で渡したディレクトリのサブディレクトリまで全部ファイルパスを取ってくるよというメソッドです。
https://laravel.com/api/10.x/Illuminate/Filesystem/Filesystem.html#method_allFiles

## allFilesメソッドの引数について
第1引数は、ディレクトリのパスをstringで渡します。
第2引数は、ドットから始まる隠しファイルまでパスを返すかどうかをboolで指定します。

## 内部実装について
実際の内部実装も貼っておきます。
~~~php:vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
   /**
     * Get all of the files from the given directory (recursive).
     *
     * @param  string  $directory
     * @param  bool  $hidden
     * @return \Symfony\Component\Finder\SplFileInfo[]
     */
    public function allFiles($directory, $hidden = false)
    {
        return iterator_to_array(
            Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->sortByName(),
            false
        );
    }
~~~
~~~php:vendor/symfony/finder/Finder.php
    /**
     * Excludes "hidden" directories and files (starting with a dot).
     *
     * This option is enabled by default.
     *
     * @return $this
     *
     * @see ExcludeDirectoryFilterIterator
     */
    public function ignoreDotFiles(bool $ignoreDotFiles): static
    {
        if ($ignoreDotFiles) {
            $this->ignore |= static::IGNORE_DOT_FILES;
        } else {
            $this->ignore &= ~static::IGNORE_DOT_FILES;
        }

        return $this;
    }
~~~
「Excludes "hidden" directories and files (starting with a dot)」、すなわち「$ignoreDotFilesがtrueならドットから始まるファイルは除外しますよ、ただしこの処理はデフォルトでは無効ですよ。」と言っています。
もし隠しファイルのパスまで欲しい場合は、allFilesメソッドの第2引数にtrueを指定しなければいけないようです。
AWSのPython sdkを使ってKMSの暗号化複号化を試した

# やりたいこと
AWSのマネコンじゃなく、プログラムでKMSの暗号化をやりたい

# 前提
・Pythonインストール済み
・AWS-CLIインストール済み
・ローカル上、AWSのアクセス情報設定済み

# やり方
さっそくですが、調べた結果を共有します～
今回はすでにKMSにあるKeyIdを使うため、プログラム上はKeyを作成せずに直接暗号化・複号化をします

```ruby:
import boto3
import base64

# AWS KMS クライアントの初期化
kms_client = boto3.client('kms')

# 暗号化する平文データ
plaintext = "password"

# 暗号化
response = kms_client.encrypt(
    KeyId='arn:aws:kms:ap-northeast-1:xxxxx:key/xxxxxx',  # 実際のキー ID に置き換えてください
    Plaintext=plaintext.encode()
)
# これがまだbyte (byte64)形式
ciphertext_blob = response['CiphertextBlob']

# byte (byte64)をstrにする
ciphertext_blob = base64.b64encode(ciphertext_blob).decode('utf-8')

# 結果の表示
print(f"Encrypted text: {ciphertext_blob}")

# 復号化
# まずstrをbyte (byte64)に戻す
decrypt_response = kms_client.decrypt(
    CiphertextBlob=base64.b64decode(ciphertext_blob)
)
decrypted_text = decrypt_response['Plaintext'].decode()

# 結果の表示
print(f"Decrypted text: {decrypted_text}")
```

# 終わりに
業務上、Pythonでの暗号化・複号化をいろいろ試し、FernetやCryptoを使ってみたが、最後お客様から「KMSでやりたい～」となったので、慌ててKMSを調査に入り、無事期日内で実装できてよかった！

今回を機に、暗号化複号化の仕組みについて理解が深まって個人的にはいい経験だったので、調べた内容をブログとして残したいと思った！
[Ruby]シンボルと文字列の違いを爆速で理解する

## はじめに
実務で、rubyを触った際に、シンボルが出てきて何だっけこれ？となったのでその違いをまとめます

## シンボルとは
任意の文字列と一対一に対応するオブジェクトのこと。
文字列の代わりに用いることができるが、必ずしも文字列と同じ振る舞いをするわけではない。

```シンボル.rb
:apple
:japan
:ruby_is_fun
```

## 違いは
- 文字列はStringクラスのオブジェクト

- シンボルはSymbolクラスのオブジェクト

これです。


また、シンボルは
- 文字列よりも高速に処理できること
- 全く同じシンボルであるということ

です。

## 同じオブジェクトかどうかを調べてみる

object_idを使って、調べてみると

```.rb
:apple.object_id #=> 1143388
:apple.object_id #=> 1143388
:apple.object_id #=> 1143388

'apple'.object_id #=> 703212292
'apple'.object_id #=> 703211292
'apple'.object_id #=> 703211290
```

文字列は3つとも異なるIDですね
シンボルがいいのかな

## 終わりに
シンボルはイミュータブル（不変）なオブジェクトみたいです。
これを機に、シンボルを多用していきたいです。
【備忘】boto3・SESでメール送信

## はじめに
boto3を利用してSESでメール送信処理を実行することが多々あり、
備忘録として記録します！

htmlのテンプレートを使用して送信します。



## コード
```python:ses.py
ses_client = boto3.client("ses")

# 諸々設定
sender_name = "送信者"
from_email = "from@email.com"
to_email = "to@email.com"
bcc_email = "bcc@email.com"
mail_subject = "メールタイトル"
mail_content = EMAIL_CONTENT

response = ses_client.send_email(
    Source='%s <%s>'%(Header(sender_name.encode('iso-2022-jp'),'iso-2022-jp').encode(),from_email),
    Destination={
        "ToAddresses": [
            to_email,
        ],
        'BccAddresses': [
            bcc_email,
        ]
    },
    Message={
        "Subject": {
            "Data": mail_subject,
            "Charset": "UTF-8"
        },
        "Body": {
            "Html": {
                "Data": mail_content,
                "Charset": "UTF-8"
            }
        }
    }
)
logger.info("response: {}".format(response))

```
linuxにrubyをインストールする

# 最初の手順
https://github.com/rbenv/rbenv/tree/master

しかしこの間のエラーメッセージもあった。が夢中になりすぎて忘れすぎた。

# エラーメッセージを読む
```
...
In file included from vm_core.h:83:0,
                 from iseq.h:14,
                 from ast.c:6:
thread_pthread.h:108:43: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
     RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
                                           ^
In file included from iseq.h:14:0,
                 from ast.c:6:
vm_core.h: In function ‘rb_current_execution_context’:
vm_core.h:1870:34: error: ‘ruby_current_ec’ undeclared (first use in this function)
     rb_execution_context_t *ec = ruby_current_ec;
                                  ^
...
```
# 解法
```
yum list | grep gcc
yum install llvm-toolset-7-clang
yum install centos-release-scl
yum install devtoolset-7-gcc.x86_64 && yum install devtoolset-7-gcc-c++.x86_64
# or yum install devtoolset-7-toolchain
scl enable devtoolset-7 bash
```
# 出典
https://blog.cloud-mes.com/2022/11/25/fix-vm-core-dot-h-error-ruby-current-ec-undeclared-when-install-ruby-3-dot-1-3-or-3-dot-0-5/#:~:text=yum%20list%20%7C,successully%20install%20ruby!

https://qiita.com/scivola/items/6a299a2ff70983cf7187

# 気づき
二つの記事によりgccのバージョンが古いことが原因らしい。
しかし
エラーメッセージからgccのバージョンが古いことが読み取ることができなかった。

```
openssl:
Could not be configured.It will not be installed.
/tmp/ruby-build.20240213044807.17394.v0kXDa/ruby-3.1.4/ext/openssl/extconf.rb:100: OpenSSL library could not be found.
you might want to use --with-openssl-dir=<dir> option to specify the prefix where openssl is installed.
Check ext/openssl/mkmf.log for more details.
readline:
Could not be configured.It will not be installed.
/tmp/ruby-build.20240213044807.17394.v0kXDa/ruby-3.1.4/ext/readline/extconf.rb:62: Neither readline nor libedit was found
Check ext/readline/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.
make[1]: *** [note] エラー１
make[1]: ディレクトリ　'/tmp/ruby-build.20240213044807.17394.v0kXDa/ruby-3.1.4'から出ます
make: *** [build-ext] エラー２
external command failed with status 2
```
### 気づき
なぜインストールすることを気づいたのかは忘れた。

# opensslをインストールする
```
yum install openssl-devel -y
```
# 出典
https://serverok.in/centos-error-checking-for-openssl-library-not-found

# 感想
もっとエラーメッセージやコンパイラの関連を理解したい。
リンクの記事を探してくれたことに感謝します。
laravel $request->hasと$request->filledの違い

こんにちは、Copilotです。$request->filledとは、LaravelのRequestクラスのメソッドの一つです。このメソッドは、リクエストに指定したキーの値が存在し、空でないことを確認するために使われます12。例えば、以下のようなコードで使うことができます。

PHP

if ($request->filled('memo')) {
    // memoが入力されている場合の処理
}
AI で生成されたコード。ご確認のうえ、慎重にご使用ください。FAQ で詳細を確認。
この場合、memoという名前のフォームに何か入力されているときに、if文の中の処理が実行されます。逆に、memoが空文字やnullの場合は、処理がスキップされます。$request->filledは、$request->hasと似ていますが、$request->hasは空文字やnullでもtrueを返します3。$request->filledは、入力値が非空であることを厳密にチェックするメソッドです。Laravelでフォームの入力値を扱うときに便利なメソッドですね。😊
Xdebugのダウンロード

以下はcurlを使用してXdebugをダウンロードする手順です：

Xdebugのダウンロード:
curlコマンドを使用して、Xdebugの圧縮ファイルをダウンロードします。
```
bash

curl -O https://xdebug.org/files/xdebug-3.X.X.tgz
```
Xdebugの解凍:
ダウンロードしたXdebugの圧縮ファイルを解凍します。

```bash

tar -zxvf xdebug-3.X.X.tgz
```
Xdebugのビルドとインストール:
解凍したディレクトリに移動し、Xdebugをビルドしてインストールします。
```
bash

cd xdebug-3.X.X
phpize
./configure
make
sudo make install
```
php.iniファイルの設定:
Xdebugを有効にするために、php.iniファイルを編集します。
```
ini

[Xdebug]
zend_extension=/path/to/xdebug.so  ; xdebug.soのパスを指定します
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
```
上記のzend_extensionの値には、ビルドしたXdebugの.soファイルのパスを指定します。

Webサーバーの再起動:
PHPの設定を変更した後は、Webサーバーを再起動して変更を反映させます。
```
bash

sudo systemctl restart httpd
```
これでXdebugがインストールされ、PHP 8の環境で使用できるはずです。
コイン獲得ゲームをprocessingで制作した

# はじめに
こんばんは！ダンです。
Processingで「コイン獲得ゲーム」という名の2Dランゲームを作成したので共有します。
Github URL：https://github.com/tsuka1211/rungame


↓ゲーム中の画面
<img width="595" alt="スクリーンショット 2024-02-14 16 02 41" src="https://github.com/tsuka1211/rungame/assets/81535575/448fd9d6-ba9f-41f8-959c-f8e32c2e0020">

## タイトル画面
タイトル画面には「プレイボタン」と「説明書ボタン」を設置しました。
プレイボタンを押すとニックネーム入力画面に移動、
説明書ボタンを押すと説明書画面に移動します。
<img width="595" alt="スクリーンショット 2024-02-14 16 20 28" src="https://github.com/tsuka1211/rungame/assets/81535575/14e89381-bb0c-4ce0-b8f2-3d893b65bc13">

## ニックネーム入力画面
テキストボックスは半角英数字、全角英数字、ひらがな、カタカナ、漢字、記号全てに対応しています。
入力できる文字数は10文字までで、超えると警告文が表示され「次へ」が押せないようになっています。
ここで入力されたニックネームはリザルト画面で表示されます。
<img width="595" alt="スクリーンショット 2024-02-14 16 01 18" src="https://github.com/tsuka1211/rungame/assets/81535575/7c25d7d4-ae95-4828-9bd6-04bfcc803451">

## キャラクター選択画面
各キャラに独自のスキルとアビリティを設定しています。
マウスをそれぞれのキャラクターボタンに合わせると、キャラクターが走り出し、周りが緑色に変化します。
さらにクリックすると緑色→赤色に変化し、キャラクター決定ができます。
決定後のキャラクター変更は可能です。
<img width="595" alt="スクリーンショット 2024-02-14 16 01 26" src="https://github.com/tsuka1211/rungame/assets/81535575/20be5edd-27ea-4efc-b5de-ddb86273b562">

## プレイ中
キャラクターは左側で固定されて背面のステージが移動していく形になっています。
左クリックでキャラクターがジャンプし、着地する前にもう一度左クリックを押すともう一度ジャンプします。(空中ジャンプ)
1フレーム進むごとに1pt獲得、コインを取ると50pt獲得(黄色のコインは75pt)、敵を踏むと50pt獲得できます。
バリアがない状態で敵に当たる or コース外にドロップアウトでゲームオーバーです。
時間が経つにつれて移動速度が早くなっていくので、難易度が高くなっていくように設計しました。

<img width="595" alt="スクリーンショット 2024-02-14 16 01 56" src="https://github.com/tsuka1211/rungame/assets/81535575/ed147f6a-1c85-4918-a281-9271f55215ae">

## リザルト画面
プレイしたスコアとそれに対応したランクが表示され、Top20のそれぞれのニックネームと使用したキャラクターの色が表示されます。(ランクの上限 SSS)
<img width="595" alt="スクリーンショット 2024-02-14 16 03 20" src="https://github.com/tsuka1211/rungame/assets/81535575/1903ef08-ac75-4d89-85ec-825ee7862b38">

## ステージ
ステージには様々な敵や障害物を設置しました。
ステージは全15種類、最初の1ステージは初心者用ステージで固定、その後の9ステージは14ステージの中からランダムで配置され、1周するごとにステージが再抽選されます。
<img width="595" alt="スクリーンショット 2024-02-14 16 02 41" src="https://github.com/tsuka1211/rungame/assets/81535575/7fc00cea-8b44-4206-b17b-68befc298fb0">

# 終わりに
制作時間が結構かかりましたが、色々な人に好評で良かったです！
最後まで読んでいただきありがとうございました！
Atcoderのジャッジシステムの環境構築メモ

# 参考にした記事
https://prog-8.com/docs/python-env

https://qiita.com/NaokiOsako/items/dcbc0a91e1bbca8ee45d

https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd

https://qiita.com/seigot/items/ce9433e62bd2eea5a9ef

https://qiita.com/tonitoni415/items/23843eebf0b7cabdbd2d

https://qiita.com/EvtHorizonCoder/items/145724e16c1b57ab64eb#012--intel-%E3%83%81%E3%83%83%E3%83%97%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8-apple-%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AE%E4%B8%BB%E3%81%AA%E9%81%95%E3%81%84

http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/

https://docs.python.org/ja/3/
GAS : LINEに通知を定期的に送る

LINEに通知を定期的に送る。前もしたけど、備忘録

英語学習用

***

# LINE Notify

LINE Notifyを使用すると、簡単にLINEへの通知を設定できます。LINE Notifyを使う場合の基本的な手順は以下の通りです。

### LINE Notifyの設定手順

#### ステップ1: LINE Notifyに登録

1.  [LINE Notify](https://notify-bot.line.me/ja/)にアクセスし、「ログイン」をクリックしてLINEアカウントでログインします。
2.  「マイページ」にアクセスし、「トークンを発行する」をクリックします。

#### ステップ2: トークンの発行

1.  通知を送信したいLINEグループを選択するか、「1:1でLINE Notifyから通知を受け取る」を選択して「トークン名」を入力し、「発行する」をクリックします。
2.  発行されたトークンをコピーして、安全な場所に保存します。このトークンはAPIを通じてLINEにメッセージを送信するために使用します。

#### ステップ3: Google Apps ScriptからLINE Notifyへの通知送信

1.  Google Apps Scriptで新しいスクリプトを作成します。
2.  以下のスクリプトを使用して、先ほど保存したトークンとメッセージを設定します。

```javascript
function sendNotification() {
  var token = "YOUR_LINE_NOTIFY_TOKEN"; // ここにLINE Notifyトークンをセット
  var message = "What is today's English?";
  var options = {
    "method"  : "post",
    "payload" : "message=" + message,
    "headers" : {"Authorization" : "Bearer "+ token}
  };
  
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
```

#### ステップ4: トリガーの設定

1.  スクリプトエディタの左側にある「トリガー」アイコンをクリックします。
2.  「トリガーを追加」を選択し、`sendNotification`関数を定期的に実行するように設定します。例えば、毎日特定の時間に通知を送りたい場合は、「時間主導型」のトリガーを選択します。

この設定により、指定した時間に自動的に「What is today's English?」というメッセージがLINEに通知されます。LINE Notifyを使用する場合の利点は、設定が簡単で、LINE Developersでの複雑な設定やMessaging APIの知識が不要であることです

***

# GASでデプロイ不要

***

Google Apps Script（GAS）で作成したスクリプトをLINE Notifyと連携させる場合、基本的に「デプロイ」の手順は必要ありません。スクリプトは直接Google Apps Scriptのエディタから実行され、指定したトリガー（時間主導型など）によって自動的に実行されます。

しかし、もしスクリプトがWebアプリケーションとして機能し、外部からHTTPリクエストを受け取って何らかの処理（例：LINE Messaging APIを使ってLINEにメッセージを送信する）を行う場合は、そのスクリプトをWebアプリケーションとしてデプロイする必要があります。デプロイプロセスにより、スクリプトに外部からアクセスできるURLが生成されます。

LINE Notifyを使用して特定のメッセージをLINEに送信するだけのシンプルなスクリプトの場合、以下の手順で十分です。

1.  Google Apps Scriptでスクリプトを作成。
2.  必要に応じてトリガーを設定。

これらの手順後、スクリプトは自動的に実行され、特定の時間や条件に基づいてLINEに通知を送信します。このプロセスではWebアプリケーションとしてのデプロイは不要です。

***

# 今回こんな感じ

![](https://pbs.twimg.com/media/GGSDHgPbcAAj5HE?format=png\&name=small)
VS2022対応のAnkhSVNを入れると起動時にエラーがでる対策

## こんなエラーが出るようになった
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85010/3972a34a-587c-a6e9-d025-efa67fbe4f0f.png">

## 対策
古いバージョンのAnkhSVNがソリューションに書き込みしているのがらしい。
ソリューションファイルをメモ帳なんかで開いて下記を削除するとエラーが出なくなった。
~~~
GlobalSection(SubversionScc) = preSolution
	Svn-Managed = True
	Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection
~~~

## 感謝
 https://github.com/AmpScm/AnkhSVN/issues/49
シフトレジスタ （備忘）

とても何年かぶりに、プログラムを再開。
時間ができたので、arduinoというマイコンを触ってみた。
すぐに忘れてしまうので、備忘として。

シフトレジスタを使ってLチカ。
shiftOut()関数ってカッコよし。

```
void setup(){
DDRD =B00011100;
PORTD=B00000000;
}

byte br[]={
  B00000000,
  B01000000,
  B00100000,
  B00010000,
  B00001000,
  B00000000,
  B00001000,
  B00010000,
  B00100000,
  B01000000,
  B00000000,
  B11111111,
};

void loop(){
for(int i=0;i<sizeof(br)/sizeof(byte);i++){
shiftOut(4,2,LSBFIRST,br[i]);
PORTD=B00001000;
PORTD=B00000000;
delay(100);
}
}
```
D2pin : SRCLK
D3pin : RCLK
D4pin : SER
JupyterLabでipywidgetsのGUIオブジェクトが表示できない

# 発生したトラブル
- 人のソースコード(.ipynb)を触っていたら、うまく動かない
- ipywidgetsのオブジェクトがうまく表示されない
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510180/38743535-7473-d1d1-7a71-7445117291ea.png)


# 解決方法
バージョンを指定したらいけた
```sh
pip install jupyterlab==4.0.1 ipywidgets==8.0.3
```
参考：https://github.com/jupyter-widgets/ipywidgets/issues/3781

# 終わりに
- 解決に2時間くらいかかった。
sshは繋がるのにscpが繋がらない時の原因１例

## 結論
ssh でログインした際にログイン先の端末上で github のログインを自動で行うため、`ssh-add` を実行していたことで、 ssh はログインできても scp はログインできない状態になった。

ssh ログインした際に`ssh-add`を自動で実行し、パスワード入力からスタートするように`bashrc`で設定していた。
scpはsshでのログインが裏側で実行されているようで、その際、パスワード入力受付状態になっているため、ファイルのやりとりができなくなっていた。

filezilla などで scp を使った接続を行う場合もタイムアウトになってしまう。

珍しいシチュエーションだったが備忘録として記録。

## 参考
- [https://gallardolp570.hatenablog.com/entry/2014/11/17/205325](https://gallardolp570.hatenablog.com/entry/2014/11/17/205325)
freezedでxxx.g.dartが生成されなくてキレている人へ

# チェックポイント

# その１　必要なパッケージはちゃんと入ってる？

https://pub.dev/packages/freezed

![CleanShot 2024-02-14 at 16.20.57@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1657253/7c2c37d3-c806-0659-37a4-12380b0fc26f.png)


Readmeのinstallセクションで必要なパッケージが記載されている。Freezed単体だけでは動かないので注意。

あとちゃんと公式のドキュメントを見よう（俺な）


# その２　ファイル名をミスってないか？
![CleanShot 2024-02-14 at 16.21.58@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1657253/52dc2ba7-ddcc-c6a4-ad3b-00bb42ddd8e8.png)

partのファイル名とlib配下にあるファイル名が違ってると生成できないで。
アホ初歩的なミスだけど俺はやらかしたので書いておく

# その３　puspec.yamlのインデントがあっているか？
![CleanShot 2024-02-14 at 16.23.47@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1657253/ad531736-21c3-fb5e-3402-95d1e4464e8f.png)

ターミナルからパッケージをインストールした人は問題ないけど、
ファイルに直接入力した人は要注意。
インデントミスっててちゃんとインストールできてなかったりする。

# その４　.fromJsonをちゃんと書いてる？
例えば飯のAPIを叩きたいときにRestaurantクラスを書いたとする
```
  factory Restaurant.fromJson(Map<String, dynamic> json) =>
      _$RestaurantFromJson(json);
```
```
.fromJson//コレが必要なので注意
```
コレちゃんと書いてないと動かんよ。

# その５　ていうかpartを記述していない
![CleanShot 2024-02-14 at 16.28.37@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1657253/05c46d53-ad17-29eb-395d-67ad142b75a8.png)

赤枠の部分な。意外と忘れがち。

# その他
### ファイルがちゃんとlibとbinディレクトリの中にある？
特に何も指定しないとlib/かbin/配下のファイルだけが生成対象となるので注意。

### pubspec.lockを一旦削除
コレは俺のカンやけど、pubspec.lockを削除して再度
```
flutter pub get
```
すると治ることもある。

### ターミナルとエディタを再起動
これでも治ることがある。（困ったときは再起動ってやつやな）
サーバー上でpm2を用いて実行されるnode.jsアプリのmemory leakを簡単に調査する方法

## 前提

どうもメモリ使用量が増えつづける。memory leakをしている気がする。しかし手元のdev環境では再現しない。どうしても本番環境で調査しなければならない。そんなどうしようもない状況に追い込まれた人向けの記事です。基本的にやめておいたほうが良いと思います。heapdumpのnpmモジュールとか入れて、dumpのsnapshotを撮影して……みたいなのが非常に面倒くさい人向けでもあります。ssh接続ができてchromeが入っていれば、追加でインストールとか要りません。

## pm2にinspectの引数をつけてrestartする

```sh
pm2 restart NUM --node-args '--inspect'
```
これでdebuggerありで起動します。
注意点として、--inspectで起動するとメモリの使用量が如実に増えます。ぎりぎりのメモリでやりくりしているならやめておいたほうが良いです。
port変えたかったら変えてもいいです。

## ローカルとリモートをportforwardする

vscodeでサーバーとつないでportforwardingしても良いですが、一応下記コマンドで出来ます。
```sh
 ssh -NL 9229:example.com:9229 user@example.com
 ```
これでサーバー上の9229ポートをローカルで使えるようになりました。

## chrome inspectを起動

アドレスバーで```chrome://inspect```
あとはいつも通りです。基本設定でport9229入っている気もしますが、入っていないときはConfigure->localhost:9229としておくとtargetをinspectできるようになります。

あとは自分の好きなときに3点ヒープダンプ法などを用いて、増加している困ったオブジェクトを探し出すことができます。
Javaの演算子、new

# new演算子とは
new演算子とは、配列の宣言、インスタンスの生成等で用いられる演算子です。

Javaでは、変数名と変数の型宣言だけでは変数を使用できない場合があります。
オブジェクト指向のJavaはコードの再利用が出来るようになっている為です。

new演算子はクラスなどの枠組みからコードで使用する実体を呼び出す為に必要となります。

その為、クラスを扱う際に、宣言した変数がクラスなのか、インスタンスなのかを書き手が把握していないとエラーが発生してしまいます。