OmniAICreator/Qiita-1.07M huggingface dataset:
Windows11でマウスホイールの動きをMac方式に合わせる方法

# はじめに
自宅のPC環境はMacとWindows11両方あります。最近は複数デバイスを記憶させて切り替えられるキーボードとマウスがあり、これでMac/Win操作しています。

![スクリーンショット 2024-01-04 8.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/dcdce988-e74d-d201-fd82-5098fb941542.png)


この環境を作った際に、**マウスホイールの動きがWinとMacが逆**なのに気づき、揃えたいと思ったのですが、対応が意外と面倒だったので、その際の記録をここに書きたいと思います。


# Mac側をWinに揃える方法
これは簡単で、システム設定→マウス→ナチュラルなスクロールをオフにすれば良いです。(下図の上から2つ目の設定項目。これはオンになってますが)
![スクリーンショット 2024-01-02 16.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/51f28e2a-2734-1ce4-ced1-81a271c5806a.png)


ただし1点問題があり、トラックパッドの同様の設定とリンクしており、トラックパッド操作時にかなり違和感がでます。
![スクリーンショット 2024-01-02 16.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/887fbf75-83e3-7d85-4693-8f3f5c3e1448.png)

(もしかしたら、マウスとトラックパッドで別々に保存できる方法があるかもしれませんが。。)
→追記：[Scroll Reverser](https://pilotmoon.com/scrollreverser/)というMac用アプリで、マウスだけ逆にすることができました。

# Win側をMacに揃える方法
ということで、Win側をMacに揃えるための設定をしました。

マウスメーカーがカスタマイズできるアプリを提供しているものだと簡単ですが、そうでない場合は次のようにレジストリを編集する必要があります。

なお、[「Windows 10搭載PCを買ったら最初にやっておきたいこと【Macユーザー編】」](https://news.mynavi.jp/techplus/article/20210712-1907494/4)を参考にしています。これはWin10の記事ですが、私の環境のWin11も同様に対応できることを確認しました。

1. 設定→マウス→マウスの追加設定を押下してマウスのプロパティを表示
1. ハードウェアタブからプロパティを選択
1. 詳細タブを選択し、プロパティの項目をハードウェアIDを選択。ここで表示されるIDを確認できるようにしておく。
![スクリーンショット 2024-01-02 163458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/c2fae174-aa18-bf94-5c47-6aeae121d545.png)

1. レジストリエディターを開く。
1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HIDを開いて先のハードウェアIDのフォルダを探す。その中のDevice Parametersフォルダ内のFlipFlopWheelの値を0から1に変更して再起動

![スクリーンショット 2024-01-02 165325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/6fdbd766-5781-58d0-9915-92643ee59c8f.png)

![スクリーンショット 2024-01-02 165753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/e7d017a6-3fe3-4482-9fd1-2048dbfeaf53.png)
6. 再起動後にホイール操作が逆になっていたら完了！

# おわりに
MacとWinを同じような操作で統一するのは少し面倒ですが、一つのマウス＆キーボードで切り替えて操作できるとスッキリしていいので、色々試してみてください。

# 参考文献
- [「Windows 10搭載PCを買ったら最初にやっておきたいこと【Macユーザー編】」](https://news.mynavi.jp/techplus/article/20210712-1907494/4)
JavaScriptでかの有名な水の移し替えパズルを解く【反復深化深さ優先探索】

## 元ネタ

https://qiita.com/jerrywdlee/items/c7bbcbb6c68e37e7ef71

## 問題

水が5L入る容器と3L入る容器がある、この2つの容器だけを使って、
4Lの水を量るにはどうすれば良いですか？
水はいくらでも使えるものとします。

## ソース

```js
class 容器クラス {
    constructor(最大容量) {
        this.容量 = 0;
        this.最大容量 = 最大容量;
    }
    get 残り容量() {
        return this.最大容量 - this.容量;
    }
    水を入れる() {
        this.容量 = this.最大容量;
    }
    水を捨てる() {
        this.容量 = 0;
    }
    水を移す(dst容器) {
        const 移動する容量 = Math.min(this.容量, dst容器.残り容量);
        this.容量 -= 移動する容量;
        dst容器.容量 += 移動する容量;
    }
}

function 探索(容器A, 容器B, 残り操作回数, 操作内容配列 = []) {
    const old容器A容量 = 容器A.容量;
    const old容器B容量 = 容器B.容量;
    for (const 容器 of [容器A, 容器B]) {
        for (const 操作 of ["水を入れる", "水を捨てる", "水を移す"]) {
            let 操作内容 = "";
            switch (操作) {
                case "水を入れる":
                    if (容器.残り容量 === 0) {
                        break;
                    }
                    操作内容 = `${容器.最大容量}L容器を満タンにした。　　`;
                    容器.水を入れる();
                    break;
                case "水を捨てる":
                    if (容器.容量 === 0) {
                        break;
                    }
                    操作内容 = `${容器.最大容量}L容器を空っぽにした。　　`;
                    容器.水を捨てる();
                    break;
                case "水を移す":
                    if (容器.容量 === 0) {
                        break;
                    }
                    const dst容器 = [容器A, 容器B].filter(e => e !== 容器)[0];
                    if (
                        dst容器.残り容量 === 0 ||
                        容器.容量 + dst容器.残り容量 === dst容器.最大容量
                    ) {
                        break;
                    }
                    操作内容 = `${容器.最大容量}L容器から${dst容器.最大容量}L容器へ注いだ。`;
                    容器.水を移す(dst容器);
                    break;
            }
            操作内容 += `【${容器A.最大容量}L容器: ${容器A.容量}L, ${容器B.最大容量}L容器: ${容器B.容量}L】`;
            操作内容配列.push(操作内容);
            if (容器A.容量 === 4 || 容器B.容量 === 4) {
                return 操作内容配列;
            }
            if (残り操作回数 > 0) {
                const result = 探索(容器A, 容器B, 残り操作回数 - 1, 操作内容配列);
                if (result !== false) {
                    return result;
                }
            }
            容器A.容量 = old容器A容量;
            容器B.容量 = old容器B容量;
            操作内容配列.pop();
        }
    }
    return false;
}

for (let depth = 0; depth < 10000; depth++) {
    const result = 探索(new 容器クラス(3), new 容器クラス(5), depth);
    if (result !== false) {
        for (let i = 0; i < result.length; i++) {
            console.log(`${i + 1}: ${result[i]}`);
        }
        break;
    }
}
```

## 実行結果

```
1: 5L容器を満タンにした。　　【3L容器: 0L, 5L容器: 5L】
2: 5L容器から3L容器へ注いだ。【3L容器: 3L, 5L容器: 2L】
3: 3L容器を空っぽにした。　　【3L容器: 0L, 5L容器: 2L】
4: 5L容器から3L容器へ注いだ。【3L容器: 2L, 5L容器: 0L】
5: 5L容器を満タンにした。　　【3L容器: 2L, 5L容器: 5L】
6: 5L容器から3L容器へ注いだ。【3L容器: 3L, 5L容器: 4L】
```

## 別の方法

https://qiita.com/mogamoga1337/items/d7b97ad62568de154287
簡易構成図：NUXTとLaravelの関係性

良く忘れるので簡易構成図を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160387/5e894594-ce4b-5b5b-8589-c1a5006a7767.png)

## 次回アクション
・axiosについて
トリボナッチ数列 一般化を使って問題を解く

## トリボナッチ数列とは
最初の3つは 0, 1, 1 で、4つ目以降は"前3つを足したもの"
ex) 0 1 1 2 4 7 ...

## コード java
```java
class Solution {
    public int tribonacci(int n) {
        if(n ==0) return 0;
        if(n<3) return 1;
        int []array = new int [n+1];
        array[0]=0;
        array[1]=1;
        array[2]=1;
        
        for (int i=3; i <= n;i++){
            array[i]=array[i-1]+array[i-2]+array[i-3];
        }
        return array[n];
    }
}
```
実行時間:0ms
メモリー：40.38MB

### forループの初期化部分を省略
```java
class Solution {
    public int tribonacci(int n) {
        if(n ==0) return 0;
        if(n<3) return 1;
        int []array = new int [n+1];
        int i=3;
        array[0]=0;
        array[1]=1;
        array[2]=1;
        
        for (; i <= n;i++){
            array[i]=array[i-1]+array[i-2]+array[i-3];
        }
        return array[n];
    }
}
```
実行時間:0ms
メモリー：40.40MB

### 計算順番を変更
```java
class Solution {
    public int tribonacci(int n) {
        if(n ==0) return 0;
        if(n<3) return 1;
        int []array = new int [n+1];
        int i=3;
        array[0]=0;
        array[1]=1;
        array[2]=1;
        
        for (; i <= n;i++){
            array[i]=array[i-3]+array[i-2]+array[i-1];
        }
        return array[n];
    }
}
```
実行時間:0ms
メモリー：40.00MB

## 結果
計算対象の要素が最も小さい箇所から計算することにより、消費メモリーを抑えることができる
(備忘録/作成中) Nuxt.js SPA認証テスト

# 概要
・ 自己学習用途

# システム
laravel (v9.5.2)

## 構築手順
1. Laravel プロジェクトインストール
```
composer create-project "laravel/laravel=9.*" ProjectName --prefer-dist
```
2.mysqlにlaravel DBを作成
2.1.php artisan migrate 実行

3.jwt-authをインストール 
→エラー発生でインストール不可
→No4へ
```
composer require tymon/jwt-auth:^1.0.2

(エラー内容)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires tymon/jwt-auth 1.0.2 -> satisfiable by tymon/jwt-auth[1.0.2].
    - tymon/jwt-auth 1.0.2 requires php ^5.5.9|^7.0 -> your php version (8.2.12) does not satisfy that requirement.


Installation failed, reverting ./composer.json and ./composer.lock to their original content.

```




4.この記事が良さそう
https://stackoverflow.com/questions/65989426/i-have-project-created-by-laravel-8-and-i-use-jwt-for-my-api-now-i-cant-insta

4.1.以下"--ignore-platform-reqs"を付与し無事にインストール完了
```
composer require -w tymon/jwt-auth --ignore-platform-reqs
```

5.　LaravelServiceProvider実行

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

6.　キー生成
php artisan jwt:secret

7. Models/User.phpに

use Tymon\JWTAuth\Contracts\JWTSubject;追加

8.JWTSubjectをインプリ
Bef) class User extends Authenticatable
Aft) class User extends Authenticatable implements JWTSubject

9.関数追加
public function getJWTIdentifier()
{
return $this->getKey();
}


public function getJWTCustomClaims()
{
return [];
}

10.auth phpの修正
11.route api phpの編集
12. php artisan make:controller AuthControllerを実施
13. AuthControllerの中身の変更
14. Nuxt JSのフロントエンド作成

### テスト
・ログインをするとmysqlにデータ登録されている
箱根駅伝データ分析物語　#８-２：第100回大会予測結果【当日変更確定後】（復路）

![IMG_5375.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145067/be666358-4174-0595-cd4a-c9787e904206.jpeg)
Editor拡張による譜面エディタ作成のメモ

# はじめに
音ゲーを作っていて1番困ること...
譜面ファイル作成用エディタを用意することですかね。
またまた愚痴ですが情報が少なすぎる。
今回は僕が譜面エディタをunityのエディタ拡張で作る上でよく使ったもののメモです。
(これ以降使わない気がするけど)

### 文字の表示
``` c#:
GUILayout.Label("表示したい文字");
```
これを中央寄せにするには...
``` c#:
GUIStyle style = new GUIStyle();
style.alignment = TextAnchor.MiddleCenter;
GUILayout.Label("表示したい文字", style);
```

文字を横並びにするには...
``` c#:
using (new EditorGUILayout.HorizontalScope())
{
    GUILayout.Label("表示させたい文字1");
    GUILayout.Label("表示させたい文字2");
}
```

縦並びにするには...
``` c#:
using (new EditorGUILayout.VerticalScope())
{
    GUILayout.Label("表示させたい文字1");
    GUILayout.Label("表示させたい文字2");
}
```
### スクロールバーの位置
縦スクロールならwidthを、横スクロールならheightを設定します
``` c#:
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, GUILayout.Width(スクロールバーの位置), GUILayout.ExpandHeight(true));
{
    EditorGUILayout.LabelField(" ", GUILayout.Height(スクロールの大きさ));
}
EditorGUILayout.EndScrollView();
```

### 長方形の描画
``` c#:
Rect rect = new Rect(100,200,300,200);
EditorGUI.DrawRect(rect, Color.red);
```

### ウィンドウの作成
``` c#:
Rect rect = new Rect(
    100,
    100,
    200,
    300);
BeginWindows();//これがないとウィンドウは表示されません
rect = GUI.Window(0, DisplayWindow, "Dialog");
EndWindows();

void DisplayWindow(int id)
{
    //ここにGUI.DragWindow();を書くとウィンドウがドラッグ可能に
    GUILayout.LabelField("window!");
    GUI.DragWindow();//ドラッグ不可
}
```
***

- Handles.DrawLine()はOnGUI()内で呼び出されるメソッド内で使わずOnGUI()内で直接使う。
- 位置は左上が基準。右がxの+方向、下がyの+方向。



## 計算上の注意

### intの割り算の結果は切り捨て
``` c#:
int a = 5;
int b = 2;
float c = a / b;//2.5切り捨て2

c = (float)a / (float)b;//2.5切り捨て2
//a / bされた後floatに変換される
```
基本のことなのでしょうが今回エディターを作る上で初めて知りました。
計算する前にfloatに変換しましょう。

``` c#:
int a = 5;
int b = 2;
float _a = (float)a;
float _b = (float)b;
float c = _a / _b;//2.5
```

## おわりに
エディタ拡張をやることで色々と知る事が出来ました。何かの参考になれば幸いです。
Pythonで「辞書でキーを指定して値を取得する」の動作を確認してみた

# 概要

Pythonで「辞書でキーを指定して値を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/dictionary/index2.html

# 実装

以下のファイルを作成しました。
```sample.py
mydict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
print(mydict["DE"])
print(mydict["FR"])
print(mydict["JP"])

mydict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
#print(mydict["BR"])

mydict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
key1 = "JP"
print("キー：" + key1 + "、値：" + mydict[key1])
key2 = "FR"
print("キー：" + key2 + "、値：" + mydict[key2])

mydict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
print(mydict.get("DE"))
print(mydict.get("EN"))
print(mydict.get("EN", "NotFound"))

mydict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
key1 = "JP"
print("キー：" + key1 + "、値：" + mydict.get(key1, "NotFound"))
key2 = "FR"
print("キー：" + key2 + "、値：" + mydict.get(key2, "NotFound"))
key3 = "EN"
print("キー：" + key3 + "、値：" + mydict.get(key3, "NotFound"))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Germany
France
Japan
キー：JP、値：Japan
キー：FR、値：France
Germany
None
NotFound
キー：JP、値：Japan
キー：FR、値：France
キー：EN、値：NotFound
```

# まとめ

何かの役に立てばと。
MySQLとは？基礎知識はこちら

<font color="Grey">*[What is MySQL? Get the basics here](https://aiven.io/blog/what-is-mysql)の翻訳です。*</font>

2022年2月23日

# MySQLとは？基礎知識はこちら

MySQL は伝統的なオープンソースリレーショナルデータベースで、多くの定評あるアプリケーションと相性がよい。MySQL の機能と使用例について詳しく説明します。

MySQLは、オープンソースデータベースのエコシステムにおいて長い間重要な位置を占めており、世界的な大企業や急成長を遂げている企業の多くが、ビジネスクリティカルなシステムに採用しています。MySQL を使い始める方法をお探しの方は、このブログ記事に MySQL の機能と一般的な使用事例の概要が掲載されていますので、ぜひご一読ください！


## MySQL とは


MySQL はオープンソースのリレーショナルデータベース管理システム（DBMS）です。MySQL は Oracle Corporation によって開発、サポート、配布されており、活発なコミュニティが形成されています。MySQL の主な機能には次のようなものがあります：


* 移植性：MySQL は [さまざまなプラットフォーム](https://www.mysql.com/support/supportedplatforms/database.html) で動作し、CMake を使用して設定されます。
* [さまざまなストレージエンジン](https://dev.mysql.com/doc/refman/8.0/en/storage-engines) の上で動作し、新しいエンジンを比較的簡単に追加して、社内データベースに SQL インタフェースを提供することができます。
* インメモリハッシュテーブルはテンポラリテーブルとして使用される。
* JSONや空間型を含む多くの[データ型](https://dev.mysql.com/doc/refman/8.0/en/data-types)
* クエリの SELECT リストと WHERE 句で演算子と関数をフルサポート。
* SQLのGROUP BY句とORDER BY句、グループ関数を完全にサポート。
* 柔軟性とセキュリティ
* MySQL には多くの言語で記述されたクライアントとユーティリティが含まれている。


## MySQL の主な使用例は?


MySQL は最も広く採用されているリレーショナル・データベース管理システムで、ミッションクリティカルなアプリケーション、ダイナミックなウェブサイト、ソフトウェア、ハードウェア、アプライアンスの組み込みデータベースとして使用できます。ここでは、最も一般的な使用例をいくつか紹介します：


* オンライントランザクション処理（OLTP）** - MySQL は、シンプルな SQL エンジンを必要とするあらゆるアプリケーションや、トラフィック量の多い Web サイトの両方で役立ちます。MySQLはACID原則を遵守しており、ANSI/ISO標準SQLの拡張により、大量のデータベースをサポートしています。
* LAMPスタック** - MySQLのシンプルなプログラミング構文により、LAMPスタック（Linux、Apache、MySQL、PHP/Python/Perl）上で動作する高性能アプリケーションと互換性があります。
* 顧客データ、カタログ、トランザクションの管理に適しています。
* MySQLは可用性が高いため、トランザクションをリアルタイムで分析し、トレンドや異常な動作を分析することで、不正行為を防止することができます。


これらは、MySQL を使用できる状況のほんの一例にすぎません。MySQLは非常に人気の高いデータベース管理システムであり、オープンソースであるため、拡張機能やコミュニティによるサポートが充実しています。これらにより、MySQL は多くのユースケースに柔軟に対応できるツールとなっています。


## MySQL を始めるには?


Aiven for MySQL™を使用すれば比較的簡単です。新しいアプリケーションを構築する場合でも、既存のアプリケーションのためのモダンなプラットフォームをお探しの場合でも、Aiven for MySQL™は親しみやすく拡張性の高い製品です。ここでは、その始め方をご紹介します：


* [Aiven Console](https://console.aiven.io/)にログイン(または[サインアップ](https://console.aiven.io/signup)して30日間のトライアルをお試しください!)
* [以下の手順](https://developer.aiven.io/docs/platform/howto/create_new_service)で新しいAivenサービスを作成します。
* リスト内のサービス名をクリックし、「概要」ページに移動します。必要であれば、私たちの[利用可能なパラメータのリスト](https://developer.aiven.io/docs/products/mysql/reference/advanced-params)を使用してサービスを設定することができます。
* サービスが稼動すると、ランプが緑色に変わり、インジケータに" RUNNING "と表示されます。


これで終了です！次のステップを開発者ポータルで調べることができます。<https://developer.aiven.io/docs/products/mysql/>にハウツーとリソースの広範なリストがあります。


## まとめ


この紹介がお役に立ち、MySQL を使い始める準備が整ったことを願っています。ツールの詳細については、以下のリソースまたは [MySQL 公式ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/) を参照してください。


* [MySQL 入門ガイド](https://developer.aiven.io/docs/products/mysql/get-started)
* MySQLとPostgreSQLの違いについては、こちらの[ブログ記事](https://aiven.io/blog/postgresql-vs-mysql-the-aiven-championships)をご覧ください。
* [MySQL のバックアップとリストアに関するオープンソースのソリューション MyHoard](https://aiven.io/blog/introducing-myhoard-your-single-solution-to-mysql-backups-and-restoration) と [GitHub リポジトリ](https://github.com/aiven/myhoard) をご覧ください。


最後に、お好みのクラウドにデプロイ可能なフルマネージド・サービスをお試しください。[30日間のトライアルから](https://console.aiven.io/signup)、あなたのユースケースに合うかどうか試してみてください。また、MySQLには活発なコミュニティがあり、お客様のご質問にお答えすることができます。
【JavaScript】Canvasのバグを疑ってしまう興味深い現象


## 何が言いたいのか

PCとスマホでCanvasの表示が変わる現象があった。

## 何を表示したいのか

Canvasいっぱいに
```
🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓
🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓
🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓
🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓🌓
```

といった感じに表示したい。

## const emoji = "🌓";

### PC

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/cdeedf25-4254-f46c-184f-2015eb0d6cc3.png">

### スマホ

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/d7d2f4d5-a97c-2501-dbb2-4011a1a29e15.png">

## const emoji = "🌗";

### PC

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/ac07c1cf-bcbf-771a-4489-bda08d02ab38.png">

### スマホ

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/348bf07f-e56f-9c01-d9d9-e023fc807950.png">

## ソース

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
  canvas {
    border: solid 1px black;
  }
  </style>
</head>
<body>
  <canvas></canvas>
  <script src="main.js"></script>
</body>
</html>
```

```js
const canvas = document.querySelector("canvas");
const context = canvas.getContext("2d");

canvas.width = 1000;
canvas.height = 1000;

context.fillStyle = "#fff";
context.fillRect(0, 0, canvas.width, canvas.height);

const size = 1;
context.font = `400 ${size}px 'ＭＳ Ｐゴシック', '游ゴシック', YuGothic, 'メイリオ', Meiryo, 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', Verdana, Roboto, 'Droid Sans', sans-serif`;
context.textBaseline = "top";
context.textAlign = "left";

const emoji = "🌓";
// const emoji = "🌗";
const text = emoji.repeat(Math.ceil(canvas.width / size));

for (let y = 0; y < canvas.height; y += size) {
    context.fillText(text, 0, y);
}
```

## 環境

PC：Windows11のChrome
スマホ：iPhoneX（iOS17.1.2）のChrome

## 終わりに

~~多分、負荷を減らすための処理が走っている。~~
この現象を回避する手段はないと思われる。

コメ欄でスマホが一色になる理由が書いてあります。
Boyer–Moore majority vote algorithm(過半数判定アルゴリズム)

## 何をするアルゴリズムか
時間計算量O(n)と空間計算量O(1)で、配列やリスト内の「多数派」の要素を見つけるためのアルゴリズムです。ここで「多数派」とは、配列のサイズの半分を超える回数出現する要素を指します。例えば、`[3,2,3]`の`3`であるとか、`[1,2,2,2,3]`の`2`とか。

## どうやって調べるのか
`[3,3,4,2,4,4,2,4,4]`を例にとって示します。

### 変数の初期化
このアルゴリズムでは`candidate`(解となる数の候補)と`count`という2つの変数を用います。まずはこれを初期化します。

```
candidate = None
count = 0
```

### 配列の走査
ここでは配列の各要素に対して以下の操作を行います。

1. 各要素に対して、countが0ならば、その要素を新たなcandidateとし、countを1にする。
2. もし現在の要素がcandidateと同じならば、countを1増やす。
3. 現在の要素がcandidateと異なる場合、countを1減らす。

具体的に示すと以下のような感じ。

| Element | Candidate | Count | Action |
|---------|-----------|-------|--------|
| 3	| 3 | 1 | count 0 → 新しい candidateを3に設定 |
| 3	| 3	| 2	| 一致 → count 1増加 |
| 4	| 3	| 1	| 不一致 → count 1減少 |
| 2	| 3	| 0	| 不一致 → count 0 → 新しい candidateを2に | 
| 4	| 4	| 1	| count 0 → 新しい candidate 4 に設定 |
| 4	| 4	| 2	| 一致 → count 1増加 | 
| 2	| 4	| 1	| 不一致 → count 1減少| 
| 4	| 4	| 2	| 一致 → count 1増加 | 
| 4	| 4	| 3	| 一致 → count 1増加 |

### 結果
上記より、過半数を占めるのは`4`であるとわかりました。
尚、本当に過半数かどうか調べるにはもう一度配列を操作して出現回数を数える必要があります。

## pythonでの実装
```python
def BMMV(nums: list[int])-> int:
    candidate = 0
    count = 0
    for num in nums:
        if count == 0:
            candidate = num
        if candidate == num:
            count += 1
        else:
            count -= 1
```

## あとがき
過半数を占める数字がcount upする分を少数派は消しきれないので、多数派が生き残るという考えから作られているようです。なんとなく言わんとする所はわかるものの、特に腑に落ちる感じはしないですね。よく出来てるなと思います。

## 参考文献

https://qiita.com/mhiro216/items/52a11a001fb5f56c74c9

https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm
VS Code "シェル環境を解決できません"の原因が.bashrcファイルとは限らない

# はじめに

VSCodeで開発をしていると、"シェル環境を解決できません"というようなエラーが発生することがあります。

# 公式情報の問題点

公式情報(https://code.visualstudio.com/docs/supporting/faq#_resolving-shell-environment-fails ) によると、.bashrcファイルに処理に時間を要する処理が記述されていないか確認するように書かれています。しかし、この情報だけでは原因を特定できない場合があります。

私の場合、.bashrcファイルは試しに新しく作ったアカウントと一切内容が同じでした。そのため何が原因かわからず苦労しました。

# 結局何が原因だったか

試しに.profileファイルに書いてあるnohupでバックグラウンドプロセス(時間がかかる)を起動するコードをコメントアウトしたら、エラーが解決しました。

```diff_shell
- nohup /path/to/shellScript.sh &
+ # nohup /path/to/shellScript.sh &
```

.profileファイルにsleep 100を追記するだけで、エラーを再現することができます。

```
echo "sleep 100" >> ~/.profile
```

# エラーの回避方法
下のサイトを参考に、以下のように.profileファイルを書き換えたところうまく行きました。なぜこれでうまく行くのかはわかりませんでした。。。

https://oswald.hatenablog.com/entry/20090117/1232175381

```diff_shell
- nohup /path/to/shellScript.sh &
+ nohup /path/to/shellScript.sh >/dev/null 2>&1 &
```
Postgresqlインストール時に「E: 問題を解決することができません。壊れた変更禁止パッケージがあります。」

# 現象
[公式](https://www.postgresql.org/download/linux/ubuntu/)に従ってインストールのコマンドを流した際、以下のエラーに遭遇。

> sudo apt-get -y install postgresql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
 postgresql-common : 依存: libjson-perl しかし、インストールすることができません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

# 環境
OS: Ubuntu
バージョン: 22.04
アーキテクチャ: x86_64

# 原因
/etc/apt/sources.listの参照先がおかしくなっていた。

# 対処
/etc/apt/sources.listを以下にする。
(OSインストール時のsource.listに戻したかったが、それっぽいのが見つからなかったので以下で代用。)
https://gist.github.com/hakerdefo/9c99e140f543b5089e32176fe8721f5f

::: note alert
※sources.listを更新する前に、バックアップを取ること。
:::

```
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

deb http://archive.canonical.com/ubuntu/ jammy partner
# deb-src http://archive.canonical.com/ubuntu/ jammy partner
```

再び公式のコマンドを流し直してインストール完了。
2024/1/3主にITとかセキュリティの記事

2024年に増加することが確実なクラウドサービスやAIを悪用したサイバー攻撃にどう備えるべきか？(1/1)
https://gunosy.com/articles/eyxOf

ロイターやその他大手メディアに圧力をかけて記事を削除させるインドのベンチャーキャピタリスト「Appin」とは？(1/1)
https://gigazine.net/news/20240101-appin-venture-capitalis-campaign/

「ネコといっしょにインターネット」 猫好き垂涎のChrome拡張機能「ネッコサーフィン」がリリース(1/1)
https://news.infoseek.co.jp/article/maidonanews_15099805/?tpgnr=it

教育情報セキュリティポリシーに関するガイドライン2023年度改訂～クラウド環境のリスクを踏まえた運用がさらに重要に(1/1)
https://www.kknews.co.jp/post_ict/20240101_18a

楽天に続け！　各社が目指す共通IDによるエコシステム確立とロイヤルカスタマー拡大(1/1)
https://www.bcnretail.com/market/detail/20240101_389767.html

IT未経験者が令和5年秋期の情報処理安全確保支援士試験に一発合格した話(12/31)
https://qiita.com/C1CioVRZTpPXtIZ/items/3263551b86f73f6f91de

Webブラウザー拡張機能に潜む脅威(1/2)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/111900071/121800050/

意外に大きな変化だったWi-Fi 6(1/2)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900173/121800004/
iOSアプリの多言語対応：Xcode 15の新機能「String Catalogs」

#### はじめに
アプリを海外のユーザーにも利用してもらおうと思うと、多言語対応をしないといけません。iOSアプリでは「ローカライズ」と呼ばれるようです。

やり方をネット検索すると色々出てきますが、Xcode15以降はとても簡単に対応できるようになったようなので以下に手順を記載しておきます。

#### 手順
1. 対応言語のLocalizationを追加する。Project名を選択し、infoのタブのLocalizationの箇所の「＋」をクリックします。言語が選択できるので今回は「Japanese」を選択。
![](https://storage.googleapis.com/zenn-user-upload/3b9105494b81-20240102.png)

3. アプリモジュールのGroupで右クリックし、「New File」から「String Catalogs」を選択してファイルを追加。
![](https://storage.googleapis.com/zenn-user-upload/a3200e50b617-20240102.png)

4. 名前はLocalizableにしてcreateボタンを押す。
![](https://storage.googleapis.com/zenn-user-upload/8a9b8c7300f9-20240102.png)

5. 追加したLocalizableファイルでビルド（command + B）を押す。デフォルト言語の文字列リソースをkey-value形式で格納。
![](https://storage.googleapis.com/zenn-user-upload/dc19b0f1c7ac-20240102.png)

6. アプリ内の英語表記箇所が自動的に検出される
![](https://storage.googleapis.com/zenn-user-upload/182ec8902093-20240102.png)

7. ローカライズ対象言語（今回はJapanese）を選択し、訳を入力。
![](https://storage.googleapis.com/zenn-user-upload/1d1f2b1b09ab-20240102.png)

アプリ表示名のローカライズも、String Catalogsを使用して行うことができます。これはまた別の記事で記載しようと思います。

---

個人でアプリを開発しています。

https://apps.apple.com/jp/app/%E9%A7%85%E3%81%AE%E3%82%A8%E3%83%AC%E3%83%99%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97/id6472233345
MATLABによる標高データ活用

# 本記事について
アドベントカレンダーの内容をまとめたものになります。

また強い要望がありましたので[MATLAB EXPO 2024のライトニングトーク](https://blogs.mathworks.com/japan-community/2022/12/26/lightning-talk-2023/?from=jp)まで温めるつもりだったアプリも掲載します。

Gitに掲載してますのでご参考ください。
[DEM2GeoTIFF_Convert](https://github.com/HerniaBaby/DEM2GeoTIFF_Convert.git)

# はじめに(使用するデータ)

本件は[国土地理院の数値標高モデル](https://fgd.gsi.go.jp/download/menu.php)からDEMデータを取得し、それを1枚のGeoTiff画像に変換する物です。


EPSGコードなどが違うので他国のデータに応用する場合は注意が必要となります。


~~サンプルとして国土地理院のDEMデータを抜粋していますが規約に反する場合は消去します。~~　[利用規約](https://www.gsi.go.jp/LAW/2930-index.html)に基づきデータは入れておりません。あくまで画像のみとなっております。



# 概要と必要なToolbox
### DEMデータをGeoTiffに変換する
参考：[日本の標高データをMATLABで活用 - GeoTiff変換 -](https://qiita.com/Hernia_Baby/items/aa8f86f38e5f12f51c5b)

ここではDEMデータ(3次メッシュ情報)を1枚ずつGeoTiff変換しています。

![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/559e290f-a74e-8dd8-782f-24269f665f95.png)



**GeoTIFF_Convert.mlx**

```matlab
[~, pList] = matlab.codetools.requiredFilesAndProducts('GeoTIFF_Convert.mlx');
Tbox = string({pList.Name}');
Certain = cell2mat({pList.Certain}');

disp(Tbox(Certain))
```

```TextOutput
    "MATLAB"
    "Mapping Toolbox"
    "Parallel Computing Toolbox"
```

### 個々のGeoTiffファイル群を1枚に結合する

参考：[日本の標高データをMATLABで活用 - モザイク結合 -](https://qiita.com/Hernia_Baby/items/9ff238717a4e0e570648)

3次メッシュを2次メッシュとして1枚のGeoTiffファイルに結合するものです。


ここでも他国のデータを使うときはEPSGコード等の調整が必要です。

![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/def5d99f-e5ba-8122-bdf2-0df28c2c28a2.png)




**GeoTIFF_Merge.mlx**

```matlab
[~, pList] = matlab.codetools.requiredFilesAndProducts('GeoTIFF_Merge.mlx');
Tbox = string({pList.Name}');
Certain = cell2mat({pList.Certain}');

disp(Tbox(Certain))
```

```TextOutput
    "MATLAB"
    "Mapping Toolbox"
```

### アプリ (NEW !)

上記２つを組み合わせてアプリ化したものです。


waitbarをつけているため並列計算しておらず挙動は遅いので要注意です。

またオプションで補間機能を追加しています。

川(橋含)等の標高が-9999mなので周囲の高さで線形補間をかけられるようにしました。

![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/08988104-3f4f-510d-be1a-495b874ed46c.png)



**GeoTiff.mlapp**

```matlab
[~, pList] = matlab.codetools.requiredFilesAndProducts('GeoTiff.mlapp');
Tbox = string({pList.Name}');
Certain = cell2mat({pList.Certain}');

disp(Tbox(Certain))
```

```TextOutput
    "MATLAB"
    "Mapping Toolbox"
```

# そのほか

mdファイル作成は以下のコードを使っています。

```matlab
 export("README.mlx","README.md",EmbedImages=false, FigureFormat='png', Run=true);
```

# 最後に

Mapping Toolbox日本語化してください…
JavaScriptでインデックスソート

# JavaScriptでインデックスソート

インデックスソート必要になるたびに思い出しながら実装してるのでメモ

## インデックスソートとは？
``` javascript
var a = [2, 3, 1];
// ↓インデックスソートする
// > [2, 0, 1] と返ってくる
// a[2] = 1
// a[0] = 2
// a[1] = 3
// ソートした場合の参照インデックスを返してくれる
```
と返ってくるソートです

## ソースコード

``` javascript
    function argsort(x) {
        var tmp = [];
        for(var i = 0; i < x.length; i += 1) {
            tmp.push([i, x[i]]);
        }
        tmp.sort(function(a, b) {
            return a[1] - b[1];
        });
        
        var idxs = [];
        for(var i = 0; i < tmp.length; i += 1) {
            idxs.push(tmp[i][0]);
        }
        return idxs;
    }
```
Snowflake Extension for Visual Studio Codeで複数のアカウントを切り替える


## Snowflake Extension for Visual Studio Codeとは

Visual Studio Codeの拡張機能です。Snowflakeが公式に提供しています。  
Visual Studio Codeでクエリやコマンドを記述・実行することができるようになります。  

https://docs.snowflake.com/ja/user-guide/vscode-ext

## 本記事のサマリ

以下のどちらかを実施すればOK。  

- それぞれのアカウントに順番にサインインする
- SnowSQL構成ファイルに複数の接続を定義する

## 問題

Snowpark Container Services(SPCS) がPublic Preview(PuPr)になりましたが、サポートされるリージョンが限定されています。(2024年1月現在)  
普段の開発を行うリージョンまでそこに寄せたくはないので、普段の開発とSPCSの検証を別々のアカウントで行うことになります。  

ブラウザUIであるSnowsightでは気軽にアカウントを切り替えることができますが、Snowflake Extension for Visual Studio Codeでもアカウントを切り替えることができます。  

## それぞれのアカウントに順番にサインインする

それぞれのアカウントに順番にログインするのが1つ目の方法です。  
Snowflake Extension for Visual Studio Codeでは過去にログインしたアカウント・ユーザを覚えていてくれるので、サインイン・サインアウト・他のアカウントでサインイン、とすることでそれ以降はアカウントを切り替えられるようになります。

![Account switch](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/e1fc6eae-6691-70d3-5230-518ebf86224a.png)

## SnowSQL構成ファイルに複数の接続を定義する

[SnowSQL構成ファイル](https://docs.snowflake.com/ja/user-guide/snowsql-config#label-configuring-snowsql)に複数の接続を定義するのが2つ目の方法です。  

https://docs.snowflake.com/ja/user-guide/snowsql-config#label-configuring-snowsql

```[connections.myconnection]```のようなセクションを定義することで2つ以上の接続を定義することができます。  

以下が記載例です。```accountname```、```username```、```password```が必須項目です。  

```ini:.snowsql/config
[connections.japan]
accountname = xx12345.ap-northeast-1.aws
username = sakatoku
password = hogehoge
dbname = SNOWFLAKE
schemaname = INFORMATION_SCHEMA
warehousename = COMPUTE_WH
rolename = ACCOUNTADMIN

[connections.mumbai]
accountname = yy98765.ap-south-1.aws
username = sakatoku
password = fugafuga
dbname = SNOWFLAKE
schemaname = INFORMATION_SCHEMA
warehousename = COMPUTE_WH
rolename = ACCOUNTADMIN
```

:::note warn
SnowSQL構成ファイルではパスワードが平文で保存されます。
:::

Snowflake Extension for Visual Studio CodeではこのSnowSQL構成ファイルから接続構成をロードすることができます。  
拡張機能の設定でSnowSQL構成ファイルを指定してあげましょう。  

## おわりに

ブラウザUIであるSnowsightも完成度が高いのですが、データアプリケーションを開発するときはVisual Studio Codeとインテグレーションされると便利ですね。  
検証するときと開発するときは違うアカウントを使うことが多いので活用してきましょう。  

## 本記事について

本記事は[アウトプットガチ勢が作った高速記事作成フレームワーク](https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a)を参考にしています。  
高速アウトプットを身に着けたい！
watsonx.dataにDb2 on Cloudを接続する

# はじめに
本記事ではwatsonx.dataにDb2 on Cloud(以下､Db2)のデータベースを接続する手順をご説明します｡

# Db2 on CloudのDB接続情報取得
以下の記事を参照して､Db2の接続情報を取得してください｡
https://qiita.com/nishikyon/items/69fee851849e7ef7e163

# watsonx.dataへの接続
watsonx.dataのインフラストラクチャー・マネージャー画面を開きます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/1e8b5c8d-3f1d-aff3-f600-c81d577555cb.png)

画面右上「コンポーネントの追加」->「データベースの追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/9ff4bd6c-a852-c013-8fc8-96cd51266460.png)

「Db2 on CloudのDB接続情報取得」で取得した情報を入力します｡
"SSL接続"を"ON"にすることがポイントです｡
なお､"SSL接続"を"ON"にした場合､中段の「接続テスト」機能は2024/1/3現在SSL接続に対して未対応であるため非活性になります｡
|項目|入力内容|
|---|---|
|データベース・タイプ|"IBM Db2"|
|データベース名|「Db2 on CloudのDB接続情報取得」で取得したdatabase|
|表示名|任意の表示名|
|ホスト名|「Db2 on CloudのDB接続情報取得」で取得したhostname|
|ポート|「Db2 on CloudのDB接続情報取得」で取得したport|
|ユーザー名ト|「Db2 on CloudのDB接続情報取得」で取得したusername|
|パスワード|「Db2 on CloudのDB接続情報取得」で取得したpassword|
|SSL接続|"ON"|
|カタログ名|任意のカタログ名|

![スクリーンショット 2024-01-03 1.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/5865e4db-c083-e040-6fb6-5941391983b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/4c8db4fc-77c7-b780-b385-adb8f8d3bd65.png)

「レジスター」ボタンをクリックすると､データベースとカタログが追加されます｡
(画像右下「db2_catal...」部分(カタログ)と「bludb」部分(データベース))
![スクリーンショット 2024-01-03 1.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/87907a80-f9f7-c527-cdd7-f05f3b0dbf74.png)
Unityでボタンをクリックしたときのエフェクトを作成してみる

# はじめに
今回は3DゲームでボタンをクリックしたときにParticle Systemを使って演出を出すようにしてみます。
Particle Systemの細かい説明に関しては省いていますので、各々確認していただけますと幸いです。

# 作成
今回作成するのは下のようなエフェクトです。

![20240103_010251.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/2d9a53d5-dff9-eec6-1c04-c70e33c87026.gif)

では作成していきましょう。

1. まず、Canvasの設定を行います。初期設定では、Screen Space - Overlay になっていると思いますが、こちらをScreen Space - Camera にしましょう。こうしないとUIでエフェクトを上手く出せません。設定した後、Render Cameraにカメラをアタッチしておきましょう
![スクリーンショット 2024-01-03 010825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/dc1e15c0-d1b6-b3b8-da0c-924189039c6b.png)
1. 次にパーティクルの作成です。まずCanvasの子要素にParticle Systemを作成します。
1. パーティクルシステムの設定です。自分のやり方が完全な正解ではないため、各自アレンジしていただければと思います。
    * Main(Loopingはチェックを外すべきですね)。
        * Start LifeTimeは1にしてすぐに消えるように
        * Start Speedは200にしてはじけるように、現状だと止まらないためのちの設定で止まるようにします
        * 自分は毎回同じエフェクトを出すためにRandom Seedに固定値を入力しています。毎回違うエフェクトを求める場合はAuto Random Seedにチェックを入れましょう。
![スクリーンショット 2024-01-03 011212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/b4b4c106-cee6-75ee-0945-1a0c4ba4c2f4.png)
    * Emission
        * Rate over Timeを0にしてBurstsで生成するように
        * BurstsをTimeを0, Countを10にしてエフェクト生成時に10個の玉を同時に生成する
![スクリーンショット 2024-01-03 011646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/4d65f9f6-76ba-0c37-b8bc-9b8f6de7ce91.png)
    * Shape
        * ShapeはCircle（これが一番しっくりきた）
        * ModeをBurst Spreadにすることでほぼ等間隔で球を生成してくれる
![スクリーンショット 2024-01-03 011940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/f287a625-465e-2f34-8cf9-eef489f2ae06.png)
    * Limit Velocity over Lifetime
        * Speedを1, Dampenを0.4にして急激に速度を落とすように
        * Dampenは現在のエフェクトの速度がSpeed以上の場合、どれくらい速度を減衰させるかという値、この値が大きいほど急激に減速する
![スクリーンショット 2024-01-03 012154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/bc008479-ab84-8f4e-b021-3e9081c2feca.png)
    * Color over Lifetime
        * 最初数十フレームは255を維持、いったん半分くらいまで透明度を下げて、そこから徐々に0に変化させていく
        * こだわりではあるが、ずっと白ではなく最後のほうに赤黒い色にするといい感じになる（と信じている）。
![スクリーンショット 2024-01-03 012507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/88a3743e-3b82-7ab3-6a7b-ed13713d2b50.png)
![スクリーンショット 2024-01-03 012519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/845638e8-5a7b-c34a-19a5-6bba7d31e459.png)
    * Renderer
        * Render ModeはStretched Billboardにして伸びるように, Length Scaleの値を大きくするとより伸びるが、伸ばしすぎるとあまりよくない（今回に関しては）。
![スクリーンショット 2024-01-03 012747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/3e540545-c125-fb8f-7997-8d043bec3c7b.png)

上記設定で最初のようなエフェクトが作成できると思います。

# おわりに
ゲームの面白さはもちろん中身の部分にあると思いますが、こういった細かいエフェクトがあってこそ中身が引き立つと思うのでほかにもいろんなエフェクト作成に挑戦したいですね。
Rails:  JavaScript からコントローラの POST メソッドに対して非同期でリクエストを送信する

一定の時間が経過したら強制的に投稿するフォームを作成する。
questionsコントローラのsubmitメソッドに対し、選択した`choice_id`を送信する。

```html
<%= form_with(url: submit_questions_path, method: :post) do |form| %>

    <%= form.radio_button :choice_id, 1 %>
    <%= form.radio_button :choice_id, 2 %>
    <%= form.radio_button :choice_id, 3 %>

<%= form.submit '投稿' %>
```

もちろん、上記のフォームで選択をして投稿ボタンを押せば投稿ができる。
しかし今回は、一定の時間が経ったらjavascriptで強制的に投稿させる。
それをしてくれるjavascriptは以下。
viewにベタ打ちなどして記述する。

```javascript

var postAfterSeconds = 5;
setTimeout(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '<%= submit_questions_path %>', true);
    var csrfToken = document.querySelector('meta[name="csrf-token"]').content;
    xhr.setRequestHeader('X-CSRF-Token', csrfToken);

    // 送信するデータ
    var data = new FormData();
    data.append('choice_id', '0');
    xhr.send(data);
}, postAfterSeconds * 1000); // 秒をミリ秒に変換
```

railsにはCSRF攻撃から守る機能があるため、csrfTokenを設定しないとリクエストはブロックされる。
`var csrfToken = document.querySelector('meta[name="csrf-token"]').content;` で `application.html.erb`内header にある <% csrf-token %> を読み込み、` xhr.setRequestHeader('X-CSRF-Token', csrfToken)`で設定している。

<br>

POSTメソッド questions#submitはざっくり以下の挙動をする。

```ruby: questions_controller.rb

def submit
   choice = params[:choice_id]
   Choice.create(choice: choice)
   redirect_to questions_path
   #データ登録後にquestions/index viewを表示する
end

```
**ここで問題が発生**

javascriptでコントローラを呼び出しても`questions_path (questions/index)`にredirectしない。
なのでデータ登録を行なった後に遷移する処理をjavascriptで書く。


```javascript

var postAfterSeconds = 5;
setTimeout(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '<%= submit_questions_path %>', true);
    var csrfToken = document.querySelector('meta[name="csrf-token"]').content;
    xhr.setRequestHeader('X-CSRF-Token', csrfToken);

    // 送信するデータ
    var data = new FormData();
    data.append('choice_id', '0');

    //POST後に実行する処理を追加
    xhr.onreadystatechange = function() {
    　if (xhr.readyState == 4 && xhr.status == 200) {
      // ここにページ遷移の処理を追加
        window.location.href = '<%= questions_path %>';
  　　  }

    xhr.send(data);

}, postAfterSeconds * 1000); // 秒をミリ秒に変換
  
```

JavaScriptでコントローラのメソッドを読んでもコントローラ内のredirectやViewへの接続、ページ遷移は勝手にやってくれなかった。
これに対し今回、サーバーサイドでやりたい処理をコントローラに、ページ遷移をjavascriptに書くことで、所望の挙動を実現できた。

> もっと良い方法、またセキュリティ上の問題などがあれば、指摘いただけると幸いです。
グラフの橋(bridge)/関節点(articulation point) を探す (lowlink法)

ここでは、無向グラフを考えます。

連結グラフから
 1つの辺を取り除くと非連結グラフになるとき、その辺は橋(bridge)と呼ばれます
 1つの点を取り除くと非連結グラフになるとき、その点は関節点(articulation point)と呼ばれます。

この橋/関節点を探すアルゴリズムに lowlink があります。
lowlink ではグラフの各点に、2種類の番号付けを行います。

# 訪問順の番号付け (ord)

1つは、深さ優先探索(dfs)を行って訪問順につけた番号です。(これをord配列に記録することにします)
<img width="400" alt="深さ優先探索" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547341/be86e707-6dfe-763e-0958-b1f4a8ad35e6.jpeg">

深さ優先探索のときに通過した辺だけで作られるグラフは木になります。

木では、
どの辺を取り除いてもグラフは2つに分かれるので、すべての辺は橋です。
次数が1の点は取り除いてもグラフは連結したままですが、次数が2以上の点は、取り除くとその次数個のグラフに分かれるため関節点です。

# 閉路の最小値の番号付け (low)

木に使われなかった辺は、深さ優先探索のときに相手先がすでに訪問済みの辺で、この辺を木に追加すると閉路ができます。
深さ優先探索では、これ以上進むことができなくなったときに戻って別の枝に進むため、追加する辺が枝分かれした2つの枝を結ぶことはありません。追加する辺は、ある点と、そこからルート(根)の方向にさかのぼった点(直接の祖先)とを結びます。これを後退辺と呼びます。

<img width="350" alt="後退辺" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547341/8c0e103b-cb2d-666f-4b22-89426967b13e.jpeg">

low 配列は、最初 ord 配列と同じ値を設定します。
深さ優先探索の行きがけのときに後退辺が見つかると、その相手先の点の ord の値が自分の low の値より小さければ、その ord の値を自分の low の値にします。
深さ優先探索の帰りがけのときに、子の low の値が自分の low の値より小さければ、子の low の値を自分の low の値にします。

<img width="350" alt="low値" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547341/af140876-6f7b-267c-6bdc-8282b761c65d.jpeg">

このように求めた low には、
・ 閉路を構成する点でない場合は ord と同じ値
・ 閉路の一員の場合は、閉路を構成する点の中で一番小さな ord の値
が設定されることになります。

# 橋の判定

木ではすべての辺が橋でしたが、閉路(ループ)があるグラフでは、その閉路内の一つの辺を取り除いてもグラフは連結したままです。橋になるのは閉路に含まれない辺です。

注目する辺の両端の点のうち根(ルート) に近いほうを U, 遠いほうを V とします。深さ優先探索の到達順序では、
ord[U] < ord[V]
の関係になります。「U または U より根に近い点」と、「V または V より根から遠い点」とを結ぶ後退辺が存在する場合に限り、この辺は閉路内になります。U,V が閉路内の点のとき、low[U], low[V] はその閉路を構成する点の ord の最小値またはそれより小さい値になるため、
low[V] <= ord[U] < ord[V]
が成り立ちます。このとき辺は閉路内のため橋になりません。
これとは逆に、
ord[U] < low[V]
となる辺は、閉路には含まれないため橋になります。

つまり、根に近いほうの点の ord の値より、根から遠いほうの点の low の値が大きければ橋と判定できます。

# 関節点の判定

まず、次数が 1 の点は取り除いても連結グラフが非連結になることはありません。
そのため、子を持たない点と、ルートの次数が1の場合のルート点は関節点ではありません。
ルートの次数が2以上の場合、ルート点を取り除くとその次数個のグラフに分かれるため関節点です。
ルート以外では、注目している点をU, その子を V とします。
ord[U] < low[V]
であれば U,V を結ぶ辺を取り除くと非連結になるため、U は関節点です。

また、
ord[U] = low[V]
となるケースでは、U,V は閉路内の点ですが、閉路内で一番ルートに近い点が U であり、U を取り除くと閉路だった部分と U の親との連結が失われて非連結になるため U は関節点です。
以上をまとめると、
ord[U] <= low[V]
となる点Uは関節点になります。

ord[U] > low[V]
の場合は、親 U よりもルートに近い点を含んだ閉路のケースになるので、U を取り除いても 子V と U の親側との連結性は失われません。

関節点を取り除いたときに何個のグラフに分かれるのかを調べたいときは点U と子を結ぶ各辺 (ただし、後退辺は除く) について
ord[U] <= low[V]
がいくつの辺で成り立つかをカウントすれば、元のグラフと合わせて、(1 + カウント数) の個数のグラフに分かれることがわかります。
2024年最新版 - DjangoからGmailを送信

# 概要
2024年からGoogleでは「安全性の低いアプリへのアクセス」を許可することが
できなるくなるみたいですので、
これまでとは若干異なる方法でGmailを送信する機能を作成する必要があります。
この記事ではローカル環境から自身で用意したGmailから任意のアドレスへメールを送信する機能を実装します。

:::note info
バージョンなど
Django：3.2.6（4でも動作するかと）

OS：Mac OS

動作確認日：2024年1月2日
:::

# Googleアカウントの設定

Gmailを送信するためには、2段階認証をONにし、アプリパスワードを生成する必要があります。
アプリパスワードとは、Googleアカウントへログインする用のアカウントとは異なります。
https://myaccount.google.com/

上記のURLへ、メールを送信するアカウントでログインしてください。
ログイン後に、セキュリティタブから2段階認証を選択して、ONになっていない人は
Googleの指示に従い、ONにしてください。
![スクリーンショット 2024-01-03 0.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667355/46d5c5c0-8e83-5cba-457b-eb0c30087d7e.png)

ONにしたら、2段階認証プロセスをクリックして、下の方にスクロールすると
アプリパスワードという項目があります。
![スクリーンショット 2024-01-03 0.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667355/61740f99-7892-fe06-b3fb-d17657db5999.png)

アプリパスワードをクリックして、適当なアプリ名を作成すると、
画面上に16桁のアプリパスワードが生成されます。
生成されたパスワードは保存しておいてください。
![スクリーンショット 2024-01-03 0.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667355/eeec9649-894a-3860-e259-6616a2f7262b.png)

# Djangoの設定ファイルを修正
以下をsettings.pyへ追記。
先ほどコピーしたパスワードとメアドを設定します。その他の項目はそのままでOKです。

```python:settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '送信用のメールアドレス'
EMAIL_HOST_PASSWORD = 'アプリパスワード'
```

# Viewsの作成
send_mail()内は任意で変えてください。

```python:views.py
from django.shortcuts import render
from django.core.mail import send_mail

def send_email(request):
    send_mail(
        '件名',  # 件名
        'メールの本文',  # メッセージ
        'mbiclife0@gmail.com',  # 送信元のメールアドレス
        ['jjondayo@gmail.com'],  # 送信先のメールアドレスのリスト
        fail_silently=False,
    )
    return redirect('test')  # メール送信後に遷移するページ
```

# URLの設定
URLパターンに以下を追加します。
```python:urls.py
path('send_mail/', send_email, name='send_mail'),
```

# テンプレート作成
任意のテンプレートに以下を追加。
```html:index.html
<form action="{% url 'send_mail' %}" method="post">
    {% csrf_token %}
    <button type="submit">Mail</button>
</form>
```


これでメールを送ることができるはず、です。
【AWS】CloudFrontのざっくりとした仕組み

## 背景
CloudFrontに対する理解がレベル1からレベル2に上がったので備忘録します。

## 概要
以下を記載する。
-  CloudFrontの仕組み
    -  CDNとは
    -  CloudFrontの仕組み
-  今後調査したいこと

## CloudFrontの仕組み
CloudFrontを一言で言うと、「CDNを実現するためのAWSサービス」です。
なので、CloudFrontを理解するにはまずCDNを知る必要があります。

#### CDNとは（超簡潔ver）
CDNとは、Webコンテンツの配信を高速化するための仕組みです。
オリジンサーバーの情報を世界中のキャッシュサーバーが代わりに配信することで、配信を高速化します。
例えば、キャッシュサーバーがオリジンサーバーより物理的に近いことにより、配信が高速化されます（下図）
![CDNの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393766/65276af4-089b-b182-a1a0-84c2dcd27202.png)


他にもCDNによって配信を高速化できる理由はありますが、ここでは以上の説明に留めます。
（もっと知りたい方は[こちら](https://www.kagoya.jp/howto/it-glossary/web/cdn/)など参照）

#### CloudFrontの仕組み
前述の通り、CloudFrontは「CDNを実現するためのAWSサービス」です。
つまり、CloudFrontを使うことで、Webコンテンツの配信を高速化することができます。
どのようにしてCDNが実現されているのか、以下で簡単に説明します。

###### 前提
Webコンテンツ配信者はCloudFrontを利用するために、オリジンサーバーとCloudFrontの紐付けを行います。
その際、オリジンサーバーのドメインとは別に、CloudFrontからもドメインが発行されます（xxx.cloudfront.net)。
クライアントがWebコンテンツを閲覧する際は、xxx.cloudfront.netにアクセスし、Weｂコンテンツを閲覧します。

###### CloudFrontを用いたWebコンテンツ配信の流れ
以下の流れでWebコンテンツが配信されます（[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/HowCloudFrontWorks.html)参照）
1. クライアントはxxx.cloudfront.netへWebコンテンツをリクエストする
1. DNSは１のリクエストを受領し、最適なキャッシュサーバー（ex.物理的に近い）へルーティングする※1
1. キャッシュサーバーはクライアントにWebコンテンツを配信する※2  

このように、CloudFrontを用いると、エンドユーザーはキャッシュサーバーからWebコンテンツの配信を受けることができ、CDNが実現されていることがわかります。

※1…CloudFrontでは"キャッシュサーバー"ではなく"CloudFront POP"と呼ばれる。
※2…リクエストの内容がキャッシュサーバーにない場合、キャッシュサーバーはオリジンサーバーへデータを問い合わせる。


## 今後調査したいこと（自分用メモ）
前述の「DNSから最適なキャッシュサーバーへのルーティング」について追加調査を行たい
- クライアントは物理的位置に関わらずxxx.cloudfront.netへリクエストを飛ばすため、裏側で位置情報を元に最適なキャッシュサーバーを特定する処理があると推察できる
- 前述の説明ではまるでDNSがその処理を行っていると解釈できるが、ワイの認識ではDNSはそのような機能を持たない
- なので、どこで最適なキャッシュサーバーの特定が行われているのかが気になる
- 論点は以下と考えられる
    - DNSがクライアントに返却するのは何のIPアドレスか（キャッシュサーバーorその他）
    - Reqの流れはどうなっているか
        - クライアント → DNS → ??? → キャッシュサーバー
        - クライアント → DNS → クライアント → ??? → クライアント → キャッシュサーバー
        - クライアント → DNS → クライアント → ??? → キャッシュサーバー

※2024/01/08追記
↑の答えを見つけた。cloudfront内のdnsリゾルバが位置情報を使って最適なキャッシュサーバーのIPアドレスを返却するっぽい（[参考リンク](https://aws-community.com/aws-services-cloudfront/))
Solo で Website をお試しで作ってみた（公開はしてない）

Publickey に気になる記事があったので、せっかくなのでやってみました。

https://www.publickey1.jp/blog/23/mozillaaiwebsolo.html

# Website を作ってみる
まずは Solo のサイトにアクセスしてみます。
2023/01/02 時点で BETA 版です。

https://soloist.ai/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/2ce24a44-2951-d3c3-cbc3-7c78b9009817.png)

[Build Your Website]ボタンをクリック。

いくつか入力するところが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/1e01f59d-feba-a85b-a622-0910ff519310.png)

英語は苦手なので、Google 先生に翻訳してもらいましょう・・・。

| 質問 | 説明 |
|--|--|
|Have an existing website or link?（既存の Web サイトまたはリンクを持っているか？） |Provide a URL to a Yelp, Facebook or other page for your business (optional)（Yelp、Facebook、またはビジネスのその他のページへの URL を提供します (任意)） |
|What's your business about?（あなたのビジネスは何ですか？） |The more detail, the better the AI will compose suggestions（より詳細であればあるほど、AI はより適切に提案を作成します） |
|Business name（商号） |Need inspiration? Get suggestions with our Business Name Composer（インスピレーションが必要ですか? Business Name Composer で提案を得る） |
|Business location(optional)（事業所所在地(任意)） |None |

なるほど、それっぽいのを入力して、[Next]ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/6b499459-7730-9579-62da-2cf0d1ad4d59.png)

今度はフォントを選択です。
"Architectural" を選択して、[Next]ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/f84079a3-722d-5b87-4f9e-193694aec009.png)

次は色を選択します。
デザインって、難しいですよね。
こんなのどう？っていうのを選択して、[Next]ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/9a51e017-9233-dbde-0dc5-a2b006a7f56f.png)

初期に設定できるセクションを選択します。
一度見てみたいから、全部選択してみました。
いよいよ、[Compose your site]ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/91201638-da40-3ff5-6ba3-5ae6219bd42c.png)

どうなるんでしょうか・・・。

![solo_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/73066d7d-e0c5-5130-19c2-eb8b54fff7c1.png)

できたみたいです！
[Get Started]ボタンをクリック。

Business Name などは隠させてもらっていますが・・・
それっぽい Website ができあがりました。
凄いな。

![solo_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/167f94cc-5cb0-3beb-4ae2-3ff1e3a6a5d1.png)

最後に[Publish]ボタンを押したら、Website が公開されてしまうので、今は押さないでおきます。

# 感想
ポチポチやっているだけで、ちゃんとした Website が出来上がるのにびっくり。
元ネタの Website の作りがイマイチ（自分が作ったものなので仕方ない）じゃなかったら、もう少し情報がリッチになったのかな？

英語が混じってしまうところは否めないけど、正直気にならなかったですね。
[Edit this section]ボタンをクリックして、内容は編集できるので。

画像は [Unsplash](https://unsplash.com/ja) から持ってきているとのこと。
会社の何かの研修の際に使ったな・・・。

Section はドラッグで場所を変えられるのも面白い。

短時間でパッと Website を作りたい！って時に、漠然としたイメージから手軽に作成～公開までできるので、凄いなと思いました。
ベイズ統計モデリング 写経 1

``` r
print("hello world")
```

    ## [1] "hello world"

# ベクトル計算

``` r
c(1,2,3)*c(7,6,5)
```

    ## [1]  7 12 15

``` r
2*c(1,2,3)
```

    ## [1] 2 4 6

``` r
2+c(1,2,3)
```

    ## [1] 3 4 5

#コロンで配列を生成 コロン演算子が優先される。
(3,4,5,6)を生成してから2を足す

``` r
2+3:6
```

    ## [1] 5 6 7 8

カッコによって足し算が優先される

``` r
(2+3):6
```

    ## [1] 5 6

累乗はコロン演算子に優先する

``` r
1:2^3
```

    ## [1] 1 2 3 4 5 6 7 8

かっこによってベクトル生成が優先される

``` r
(1:3)^3
```

    ## [1]  1  8 27

# seq関数

``` r
seq(1,3,0.5)
```

    ## [1] 1.0 1.5 2.0 2.5 3.0

ベクトルの要素は終了値を超えない

``` r
seq(1,3,0.50001)
```

    ## [1] 1.00000 1.50001 2.00002 2.50003

seqは推測機能がある。 終了値を指定しない場合

``` r
seq(from=0, by=0.5, length.out = 7)
```

    ## [1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0

間隔を指定しない場合

``` r
seq(from=0, to=3, length.out = 7)
```

    ## [1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0

開始値を指定しない場合

``` r
seq(to=3, by= 0.5, length.out = 7)
```

    ## [1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0

# rep関数

``` r
ABC=c("A","B","C")
rep(ABC, 2)
```

    ## [1] "A" "B" "C" "A" "B" "C"

``` r
rep(ABC, times=2)
```

    ## [1] "A" "B" "C" "A" "B" "C"

``` r
rep(ABC, times = c(4,2,1))
```

    ## [1] "A" "A" "A" "A" "B" "B" "C"

``` r
rep(ABC, each=2)
```

    ## [1] "A" "A" "B" "B" "C" "C"

``` r
rep(ABC, each=2, length=10)
```

    ##  [1] "A" "A" "B" "B" "C" "C" "A" "A" "B" "B"

``` r
rep(ABC, each=2, times = 3)
```

    ##  [1] "A" "A" "B" "B" "C" "C" "A" "A" "B" "B" "C" "C" "A" "A" "B" "B" "C" "C"
応用情報技術者試験に合格するまでの道のりと情報共有

# 受験前の知識レベルと経歴
  ・SE8年目
  ・java開発経験
  ・TL経験あり。顧客折衝の経験あり。
  ・基本情報取得済み

## 合格するまでの流れ(期間)
| 年月| 内容 |
|:----------|:------------|
| 2023年1~2月       | 午前問題の学習        |
| 2023年3~4月       | 午後問題の学習        |
| 2023年4月         | 応用情報技術者試験 ⇒  <font color="blue">不合格</font>        |
| 2023年5月         | 不合格を予想し、午前問題の開始        |
| 2023年6~9月       | 午前問題と午後問題の学習               |
| 2023年10月　　| 応用情報技術者試験 ⇒ <font color="blue">不合格</font>    |
| 2024年3月         | 午前問題と午後問題の学習                |
| 2024年4月         | 応用情報技術者試験 ⇒ <font color="Red">合格</font>|

**試験結果**
　午前62.50点、午後66.00点
 　午後問題
　　(1)情報セキュリティ
　　(2)経営戦略
　　(7)組込みシステム開発
　　(8)情報システム開発
　　(11)システム監査
## 勉強方法
**午前問題**
過去問道場をひたすら繰り返す。年(春と秋)の5年分
 　リンク：[過去問道場(応用情報)](https://www.ap-siken.com/s/apkakomon.php)
**午後問題**
参考書「応用情報技術者 午後問題の重点対策」を繰り返す。4回ぐらい反復。
特に重点的に学習した問題
　・情報セキュリティ
　・経営戦略
　・システムアーキテクチャ
　・組込みシステム開発
　・情報システム開発
　・プロジェクトマネジメント
　・サービスマネジメント
　・システム監査
　**午後問題の選定方法**
　　過去問の選択問題を一通り解いてみて、
  　時間をかけずに解けそうな分野に絞りました。
 
## 感想
・午前問題の学習は、通勤時間(片道1時間)
・午後問題の学習は、仕事の帰宅後＆土日祝
と時間を決めて学習。
また、
午後問題の学習では、自分の得意分野と苦手分野が何かを意識しました。
私の場合、「システム監査」でも解きやすい内容と解きにくい内容がありました。

午後問題は問題の出題傾向を把握したことで、選択問題を選ぶ時間を短縮、
問題を解く時間に多く費やすことができました。
【CSS】子要素が特定の数の場合にのみスタイルを適用する方法

以下のように記述すると子要素が指定した数の場合にのみスタイルを適用できます。

```css
ul:has(> :nth-child(N):last-child) li {  }
```

子要素が２つの場合にのみスタイルを適用するには以下のように記述します。

```css
ul:has(> :nth-child(2):last-child) li {  }
```
去年の振り返りもまだだけど、2024年の目標を宣言する（睡眠時間確保）

## これは何のための記事？
個人的な今年の目標を宣言するための記事です。
※思いついてから30分で公開することを目指したのでざっくりです。あとで追記する予定です

## 結論（今年の目標）
睡眠時間８時間をキープする

※この記事における *"睡眠時間"* の定義は *"何も活動せずベッドで横になっているまとまった時間"* のこととします

## なぜこの目標にした？
去年の後半になってから頻繁に体調を崩し、仕事にも生活にも影響が出たから
（これまで数年に１回だった風邪を月1-2回ペースでひいていた）

- twitterの連続投稿が途切れた
- 勉強や運動の習慣も崩れた
- 仕事の生産性も落ちた

### 体調不良の原因
食事・睡眠・運動の３本柱のうち、２本が倒れた（睡眠と運動。食事の柱も傷んでいる）
この中でも基盤になるのが睡眠なので、今年は睡眠を立て直す

## どうやって達成する？
- <font color="Red">**こうやって記事で宣言する**</font>
- 作業終了時刻デッドラインを決める
- あらゆる手段を用いて生活の時短を進める
- Twitterで達成度を垂れ流す

### ルール
- 自分や家族の緊急事態に対応する必要があると判断したとき
- 仕事上の緊急事態に対応する必要があると判断し、それを他人から指示されたとき
※自分判断のみだと対応しがちなため、指示があった場合のみをノーカンの条件とする（自己判断による緊急対応はノーカンにしない）
Pythonの一言基礎用語集

# 用語集（terms）

##### 値(value)
・プログラム内で扱われるデータ。様々な[データ型](#データ型)が存在する。

##### データ型
|データ型|日本語|例|
|--|--|--|
|str|文字型|str = 'Hello World.'|
|int|整数型|int = 1|
|float|浮動小数点型|float = 1.0|
|bool|ブール型, 正誤|flg = True|
|datetime|日付型|date = datetime.datetime(2024,1,7,22,0,0)|
|list|リスト型, 配列|list = [0,1,2]|
|tuple|タプル型（変更不能）|tuple = (0,1,2)|
|dictionary|辞書型|dict = {'a':0, 'b':1, 'c':2}|

##### 変数
・[値](#値)を定義（格納）したもの。
```
a = value
```

##### 属性
・[オブジェクト](#オブジェクト)に付与されていて、"オブジェクト.属性名"で参照される[値](#値)

##### オブジェクト(object)
・[属性](#属性) or [値](#値)と、[メソッド](#メソッド)をもつデータ

##### クラス
・[オブジェクト](#オブジェクト)を作成するための処理の型
```
class ClassName:
    x = 0
    y = 0
    def MethodName(self, a, b):
        self.x = a
        self.y = b
```

##### 関数
・呼び出し時に[値](#値)を返す一連の文のこと

##### メソッド
・[クラス](#クラス)の中で定義された[関数](#関数)。第一引数にはselfを入れて自身の[インスタンス](#インスタンス)を参照させる。
```
class ClassName:
    x = 0
    y = 0
    def MethodName(self, a, b):
        self.x = a
        self.y = b
```

##### 引数（argument）
・[関数](#関数)や[メソッド](#メソッド)に渡す[値](#値)のこと

##### インスタンス
[クラス](#クラス)を代入した[変数](#変数)
```
instance = ClassName()
```

# 参考サイト
https://docs.python.org/ja/3/glossary.html