OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで四択問題を作成する方法解説【サンプルソースコードあり】

:::note warn
2020年10月20日に書いた記事です。
:::

今回はプログラミング言語のPHPを使用して四択問題を作成する方法を簡単に説明します！

最初に実際にどんなものを作るのかやソースコードを提示してから詳しく解説していきます。

## 今回作る四択問題のWeb画面

### 問題(index.php)

```html
<?php
  $question = array('apple','grape','peach','pear');
  $answer = $question[0];
  shuffle($question);
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>PHP四択問題</title>
  </head>
  <body>
    <h2><?php echo 'リンゴを英語で？' ?></h2>
      <form method="POST" action="answer.php">
        <?php foreach($question as $value){ ?>
        <input type="radio" name="question" value="<?php echo $value; ?>" /> <?php echo $value; ?><br>
        <?php } ?>
        <input type="hidden" name="answer" value="<?php echo $answer ?>">
        <input type="submit" value="回答する">
      </form>
  </body>
</html>
```

### 答え(answer.php) 

```html
<?php
  $question = $_POST['question'];
  $answer = $_POST['answer'];
    if($question == $answer){
	    $rs = "正解";
    }else{
	    $rs= "不正解";
  }
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>PHP四択問題結果</title>
  </head>
  <body>
    <h2>クイズ結果</h2>
    <?php echo $rs ?>
  </body>
</html>
```

## プログラム解説

### 問題(index.php)

```php
<?php
  $question = array('apple','grape','peach','pear');
  $answer = $question[0];
  shuffle($question);
?>
```

1. `$question`という変数配列に4つの選択肢を格納する。
2. `$answer`に正解の場所を指定する。(今回は0番目='apple')
3. shuffle関数を使い配列をシャッフルし要素の順番をランダムにする。`

```html
<form method="POST" action="answer.php">
   <?php foreach($question as $value){ ?>
   <input type="radio" name="question" value="<?php echo $value; ?>" /> <?php echo $value; ?><br>
   <?php } ?>
   <input type="hidden" name="answer" value="<?php echo $answer ?>">
   <input type="submit" value="回答する">
</form>
```

1. `<form method="" action=""></form>`を使いmethodでデータの送信形式を指定し、actionでデータの送信先を指定する。(今回は送信形式をPOST、データの送信先をanswer.phpに指定)
2. foreachで配列の要素の分だけ繰り返します。(今回は`$question`に4つ格納されているので4回繰り返される)なので`$question`を3つにしたら3択問題などを作ることができたりします。
3. type="radio"でラジオボタン作成、`$question`に選択した回答と`$answer`に答えを格納しデータを送信する
4. type="hidden"で正解の回答はHTMLで表示させないようにします。

### 答え(answer.php) 

```php
<?php
  $question = $_POST['question'];
  $answer = $_POST['answer'];
  if($question == $answer){
	  $rs = "正解";
  }else{
	  $rs= "不正解";
  }
?>
```

1. `$_POST`でindex.phpから送られてきたquestionとanswerの内容を受け取る。
2. questionとanswerの内容があっていれば正解、違うなら不正解。

ざっと解説させていただきました。結構単純なプログラムで四択問題を作成することができます。
Next13のAppDirectoryのポイントをまとめてみた

#### 

#### 環境変数について
- サーバーサイドのコンポーネントとしてファイルを作って処理をする場合
- 環境変数の値を従来の **NEXT_PUBLIC_〇〇** で呼び出すんじゃなくて **環境変数で定義した変数を呼び出す** ってやってもフロントからどんなAPIキーが飛んでるかバレずに済む
- リクエストヘッダーに外部にバレちゃ困るAPIキーを添えてリクエストしなきゃいけない時に便利

```.env.local
NEXT_PUBLIC_API_KEY=hogehoge
apikey=hogehoge

NEXT_PUBLIC_URL=https://fugafuga.com
url=https://fugafuga.com
```

```/src/app/page.tsx
async function fetchItem() {
  const response = await fetch(
    `${process.env.NEXT_PUBLIC_URL}/items`,
    {
      headers: new Headers({
        apikey: process.env.apikey as string,
      }),
    }
  )

  if (!response.ok) {
    throw new Error(response.statusText)
  }

  const items = await response.json()
  return items
}
```

:::note warn
なんで？
サーバーサイドコンポーネントであるため、クライアント側から送る処理ではないため
:::
よく利用するPHPUnitアサーション(assertion)についてまとめてみた

:::note warn
2022年10月1日に書いた記事です。
:::

公式ドキュメントではジャンル分けされていなくてパッと利用したくてもできなかったのでよく利用するPHPUnitアサーションについて簡単にまとめました。

現在利用しているテストの方法としては、細かな検証はprophecyのモック方式で行ってその結果をアサーションで検証している感じで運用しています。

## 等しいかどうか

### assertEquals()

予測値と実際の結果を比較して等しいかどうかを検証する際に利用します。

```php
assertEquals(mixed $expected, mixed $actual[, string $message = ''])
```

2つの変数`$expected`と`$actual`が等しくない場合にエラー`$message`を報告します。

assertNotEquals()はこのアサーションの逆で、同じ引数をとります。

### assertSame()

予測値と実際の結果を比較して同じ型・同じ値であるかどうかを検証する際に利用します。

```php
assertSame(mixed $expected, mixed $actual[, string $message = ''])
```

2つの変数`$expected`と`$actual`が同じ型・同じ値でない場合にエラー`$message`を報告します。
assertNotSame()はこのアサーションの逆で、同じ引数をとります。

※assertSame()の方が型まで検証されるのでよほどのことがない限りassertSame()を利用するのが良さそうです。

## 論理値の検証

### assertTrue()

trueかどうかを検証したい時に利用します。

```php
assertTrue(bool $condition[, string $message = ''])
```

`$condition`がfalseの場合にエラー`$message`を報告します。
assertNotTrue() はこのアサーションの逆で、同じ引数をとります。

### assertFalse()

falseかどうかを検証したい時に利用します。

```php
assertFalse(bool $condition[, string $msg = ''])
```

`$condition`がtrueの場合にエラー`$message`を報告します。
assertNotFalse() はこのアサーションの逆で、同じ引数をとります。

### assertIsBool()

bool型(trueかfalse)かどうかを検証したい時に利用します。

```php
assertIsBool($actual[, string = ''])
```

`$actual`の型が boolでない場合にエラー`$message`を報告します。
assertNotFalse()はこのアサーションの逆で、同じ引数をとります。

## 空かどうかの検証

### assertEmpty()

配列が空であるかどうか検証したい時に利用します。

```php
assertEmpty(mixed $actual[, string $message = ''])
```

`$actual`が空でない場合にエラー`$message`を報告します。
assertNotEmpty()はこのアサーションの逆で、同じ引数をとります。

### assertNull()

NULLであるか検証したい時に利用します。

```php
assertNull(mixed $variable[, string $message = ''])
```

`$variableが`NULL`でないときにエラー`$message`を報告します。
assertNotNull() はこのアサーションの逆で、同じ引数をとります。

## 数の検証

### assertCount()

配列の数を検証したい時に利用します。(以外に利用場面があります。)

```php
assertCount($expectedCount, $haystack[, string $message = ''])
```

`$haystack`の要素数が`$expectedCount`でない場合にエラー`$message`を報告します。
assertNotCount()はこのアサーションの逆で、同じ引数をとります。

## インスタンスの検証

### assertInstanceOf()

インスタンスかどうか検証したい場合に利用します。

```php
assertInstanceOf($expected, $actual[, $message = ''])
```

`$actual`が`$expected`のインスタンスでない場合にエラー`$message`を報告します。
assertNotInstanceOf()はこのアサーションの逆で、同じ引数をとります。

## 参考

- PHPUnit公式ドキュメントアサーションについて

https://phpunit.readthedocs.io/ja/latest/assertions.html

- PHPUnitのアサーションについて

https://iliiliiiliili.hatenablog.jp/entry/2019/02/17/210000
CMS

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


# The CMS Content can not preview error

+ [The CMS Content can not preview](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfCJq)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/181ae565-5dfd-2e44-fce7-7997e34f5150.png)


:::note
You need to create a CMS detail page for the content type you're creating content with.

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEdOPSA1
:::

# CMS コンテンツの詳細ページが見つかりません

+ [CMS コンテンツの詳細ページが見つかりません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R99Ly)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11be05be-0ecf-7941-8f2c-741ff9c03f84.png)


:::note
同じような質問が投稿されていますが、解決できてないようです。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000EnY7vSAF

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JeHBXSA3
:::

# Error Message : Something with that name already exists on the CMS backend. Use a different name for the workspace and try again.

+ [【未解決】CMS Images import Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erUM5)
Rollup helper 

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)



# Rollup helper flow fail: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY: Access to entity 'AggregateResult' denied: Entity is not api accessible.

+ [Rollup helper flow fail: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY: Access to entity 'AggregateResult' denied: Entity is not api accessible.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfDJz)

This issue is likely coming from still using the default running user for Rollup Helper, you should be able to avoid this issue by updating the running user to be an actual user from your environment.

To change the running user first go to Scheduled Jobs from setup and delete the old Rollup Batch Agent - Hourly.  Then go to the all Rollups page and click the gear icon button, in the top right of the screen, then click the change running user button. 

The bottom left of the screen should then be updated to say the rollups are running as the logged in user, and the Rollup Batch Agent Hourly will be recreated on the scheduled jobs page.

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000EABneSAH


that is correct the issue is likely due to the running user for Rollup Helper and that is how you can update it to be a user from your org with the correct permissions.
Laravelでassetの使い方・css,js,imgを呼び出す【PHP】固定ヘッダー

:::note warn
2020年10月1日に書いた記事です。
:::

Laravelのフレームワークでassetを指定してファイルを呼び出す方法を紹介します。

css, js, imgを外部ファイルにすることで共通部分を作ることができ同じコードを複数書くことが不要になります。

## 概要

今回は例として固定ヘッダーをつけてみたいと思います。

asset クラスは、css, js, imgを収集しグループ化し、表示するために役立つメソッドをまとめたクラスです。

要するに、publicディレクトリを返す関数です。

```
public ____ css
        |__ js
        |__ img
        |__ html
```

## phpでの読み込み方

呼び出したいところのresources/views/以下のphpファイルに記述することで読み込まれます。

```html
<!-- css -->
<link rel="stylesheet" href="{{ asset('/css/file.css') }}">
<!-- js -->
<script src="{{ asset('/js/file.js') }}"></script>
<!-- img -->
<img alt="文字表示" src="{{ asset('/img/file.png') }}">
```

## 固定ヘッダ例

固定表示はCSSの「position: fixed;」です。

### HTML
```html
<!DOCTYPE html>
<html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Progate</title>
    <link rel="stylesheet" href="{{ asset('/css/header.css') }}">
  </head>
<header class="site-header">
  <h1 class="site-logo"><img src="images/logo.png" alt="サンプル"></h1>
  <nav class="gnav">
    <ul class="gnav__menu">
        <li class="gnav__menu__item"><a href="">HTML</a></li>
        <li class="gnav__menu__item"><a href="">CSS</a></li>
        <li class="gnav__menu__item"><a href="">PHP</a></li>
        <li class="gnav__menu__item"><a href="">Ruby</a></li>
        <li class="gnav__menu__item"><a href="">Python</a></li>
    </ul>
  </nav>
</header>
  <div class="hero"><img src="images/hero.jpg" alt="hero"></div>
  <div class="content">
<!--省略-->
  </div>
<footer class="site-footer">
  <p class="copyright">サンプル</p>
</footer>
</html>
```

### css
```css
body{
    background: #ffab77;
}
.site-header{
    background: #fff;
    display: flex;
    padding: 60px 20px;
    position: fixed;
    justify-content: space-between;
    width: 100%;
}
.site-logo img{
    height: 20px;
    width: auto;
}
.gnav__menu{
    display: flex;
}
.gnav__menu__item{
    margin-left: 20px;
}
.gnav__menu__item a{
    color: #333;
    text-decoration: none;
}
.hero{
    max-height: 500px;
    overflow: hidden;
}
.hero img{
    height: auto;
    width: 100%;
}
.content{
    line-height: 1.6;
    margin: 0 auto;
    padding-top: 100px;
    width: 800px;
}
.content p{
    margin-bottom: 40px;
}
.site-footer{
    background: #333;
    padding: 80px 0;
}
.copyright{
    color: #fff;
    font-size: 12px;
    text-align: center;
}
```

参考にしたサイト

https://webdesignday.jp/inspiration/technique/css/4166/
↑JavaScriptを使った固定ヘッダーもあり参考になりました。
hEXルーターでEoIP(L2TPライク)

# hEXルーターでEoIP(Ethernet over IP)トンネルを実現
[MikroTik製hEXルーター](https://mikrotik.com/product/RB750Gr3)で、EoIP(Ethernet over IP)にて、Site-to-Site間で同一ネットワークセグメント実現したときのメモ。

## 同一ネットワークセグメントの実現方法
通常は、L2TPを用いて実現するのであるが、同社の[L2TP Wiki](https://wiki.mikrotik.com/wiki/Manual:Interface/L2TP)の”Site-to-Site L2TP”のサンプルでは、末端どうしが同一セグメントになっていない。同ページの他の情報をもとにトライしたが、L2TPを構築することができず、断念。そこで、EoIP(Ethernet over IP)を用いて実現することとした。

## ネットワークトポロジー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f049c3c1-3fb8-5f62-e425-5c35becb080c.png)
末端が同一ネットワークセグメントであり、DHCP ServerとClientとが存在する。ルーターどうしのネットワークは別セグメントである。

## 設定
物理ポートが５つあり、Port1をWAN側(10.1.1.0/24)、Port5をLAN側(172.16.0.0/24)、それ以外のPortをルーター設定用ネットワーク(192.168.88.0/24：デフォルトネットワーク)としている。下記サイトに従って設定できるところもあるが、ここでは、GUIベースで説明する。
- [Manual:Interface/EoIP](https://wiki.mikrotik.com/wiki/Manual:Interface/EoIP)

以下、Router2での設定例である。

### IPアドレス系
Addressesメニューから、WANであるPort1にIPアドレスを手順で設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b49cdd43-2c64-821f-1e1b-af7333513b11.png)

### EoIPトンネル
Interfacesメニューから、EoIPトンネルを設定する。対向IPアドレスであるRouter 1のIPアドレスが入力されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c4b01c00-c89c-01b8-18a2-dc5f1ebe3748.png)

### Bridge
新しいBridgeである”bridge1”を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1682316f-5406-9146-89e4-b91a1cb52887.png)

### 同一セグメントの対象とするPort５
所属Bridgeを”bridge1”に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f47f5f1c-d8df-9c8f-18fa-4150dce22c30.png)

### EoIPトンネルのBridge化
作成したEoIPトンネルを”bridge1”に所属させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f0817cae-c045-712f-2151-9717b3c4dcc5.png)

最終的なInterface状況は下記となる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c20ef60d-af84-a6f5-6190-5b4b583e83e1.jpeg", width=80%>

## 検証（ネットワークパケット）
Wiresharkで取得したRouter間のネットワークパケットは下記となる。
### DHCP
![DHCPのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/366d4bf8-da50-edb3-8843-6ea1a20c1d82.png)
MikrotikのEoIPはGREパケットとして解釈されている（赤枠）。GREパケット上のEthernetフレームが存在している（青枠）。

### ARP
![ARP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/44cdcb54-fd54-a362-5edd-294a3793ddea.png)
こちらのほうが、末端どうしで通信している様子がわかりやすいかもしれない。末端PC（DHCP Client）が、あらためて、通信先のMacアドレス(a4:12:42:07:96:7c)を取得している。

### ICMP
![ICMP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b4be7a1d-a5bf-c1c2-57be-aa58be5e43b1.png)
先程取得したMacアドレスを使って、ping(ICMP)が実行されている。

EOP
cscの作法 その363

# 概要
cscの作法、調べてみた。
opentkのgamewindow使ってみた。

# 環境
windows10 64bit

# 使用したライブラリー
OpenTk 3.3.0

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5b912b51-b4ea-cbf7-3355-7cf6a404ffef.png)

# サンプルコード

```


using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace App
{
	class Gwin: GameWindow {
		double counter = 0;
		public Gwin(int width, int height, GraphicsMode mode, string title): base(width, height, mode, title) {
			this.VSync = VSyncMode.On;
		}
		protected override void OnRenderFrame(FrameEventArgs e) {
			base.OnRenderFrame(e);
			counter += e.Time;
			GL.Rotate(counter / 5, 0, 0, 1);
			GL.Clear(ClearBufferMask.ColorBufferBit);
			GL.ClearColor(Color.CornflowerBlue);
			GL.Begin(PrimitiveType.Quads);
			GL.Color3(Color.Red);
			GL.Vertex2(0, 0);
			GL.Color3(Color.Blue);
			GL.Vertex2(0.9f, 0);
			GL.Color3(Color.Orange);
			GL.Vertex2(1, -0.9f);
			GL.Color3(Color.Green);
			GL.Vertex2(0, -1);
			GL.End();
			this.SwapBuffers();
		}
	}
	class Program {
		static void Main(string[] args) {
			Gwin window = new Gwin(500, 500, OpenTK.Graphics.GraphicsMode.Default, "Test");
			window.Run();
		}
	}
}





```

# コンパイル手順

```
>csc tk9.cs /reference:OpenTK.dll
```

以上。
Docker + DjangoでMarkdownエディタを実装する

# 実装する内容
DockerでPythonのフレームワークであるDjnagoでMackdownエディタを実装する。

# 参考にした記事
https://yuki.world/django-markdown-implement/

# 助けていただいた方
ありがとうございました！！！！
@hokutoh 

# 前提条件
Dockerインストール済み
docker-compose コマンドを利用できること

この動画のレベルを理解できる方
https://www.youtube.com/watch?v=O037g3NOoXY&t=1279s

# 開発端末
MacBook Air M2チップ(macos Ventura 13.4)

# コード
ソースコードをGitHubにアップロードしておりますので、ご参照ください。
https://github.com/kazunobu2022/django-markdown

# Dockerfileの作成
なぜか、`# FROM --platform=linux/amd64 python:3.9`これを記述しないと
`docker-compose build --no-cache`実行時に`ERROR [5/6] RUN pip install -r requirements.txt`というエラーが出ます。なぜか分からないです(泣)わかる方がいれば教えてください。

``` :Dockerfile
# FROM --platform=linux/amd64 python:3.9
FROM python:3
ENV PYTHONUNBUFFERED 1
WORKDIR /code

RUN pip install --upgrade pip

# 依存パッケージをrequirements.txtに記述
ADD requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

# コマンド実行
```:コンテナの中に入る
docker compose run --rm web bash
```
```:アプリケーションの作成
python3 manage.py startapp markdown
```

# インストールパッケージをrequirements.txtに記述
```:requirements.txt
Django
# Markdownエディタ本体パッケージ
django-mdeditor
```

# settings.pyに以下を追記。
私は英語読めないので、日本語に変更してます。
```:settings.py
import os

INSTALLED_APPS = [
    'mdeditor', # 追加
    'markdown', #　　追加
]

# これはDjangoバージョン3.0以上の場合のみ記載すること
X_FRAME_OPTIONS = 'SAMEORIGIN'

# ファイルアップロード用
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/media/'

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'
```

# configのurls.pyに以下を追記
```:urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("mdeditor", include('mdeditor.urls')),
]
```

# models.pyに以下を追記
```:
from django.db import models
from mdeditor.fields import MDTextField # 追加

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = MDTextField() 
```

# コマンド実行
```:コンテナの中に入る
docker compose run --rm web bash
```
```:マイグレーションファイルにパッケージング
python3 manage.py makemigrations
```
```:変更点をデータベースに適用
python3 manage.py migrate
```
```:Djangoユーザー作成
python3 manage.py createsuperuser
```

ユーザー作成時、ユーザー名、メールアドレス、パスワードを求められますので各自返答してください。
次のエラーはPWの文字数が少なくて怒られていますが[y]で返答していただいて大丈夫です
![スクリーンショット 2023-06-17 7.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/44aed0ec-0800-de9a-1b67-434dab105d92.png)

```:コンテナ起動
docker-compose up
```

# 動作確認
`http://localhost:8000/admin/`でログイン
![スクリーンショット 2023-06-17 7.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/75d3931c-4bd3-5f73-791f-dffb76047678.png)


Articlesの追加をクリック
![スクリーンショット 2023-06-17 7.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/9ad78f78-e9d8-9dd4-66d2-ff6059fcad2a.png)

![スクリーンショット 2023-06-17 7.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/5be25a6a-44ff-6bb6-9e87-df2bf8a9c81f.png)
【WEBアプリ制作】2週間目～今後はiOS/Androidアプリ作成着手

# 制作過程

一旦、履歴書作成に必要な部分（氏名・住所・学歴・職歴・志望動機）
を入力フォームから入力してPDFで出力するところまでは完成した

入力フォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/178e2c7e-9812-b5fa-8306-779c5ab38cdf.png)

PDF出力画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/a0a9dbfc-0ef2-7fa6-bb7c-1b9c69ff3ab5.png)

# 今後について
レスポンシブ対応を全くしていなかった為、そこの対応するか検討
ただ、HTMLに直接CSS書き込んでしまっているため時間がかかりそうなのでしない可能性有

WEB版で細かいUI修正した後に、FlutterでiOS・Android版にて同じ機能を実装したアプリを作成予定
Flutterはソースコードの解析などはしたことあるものの実際に新規開発した経験はない為、7月中に完成目標とする。

アプリとWEB版完成したら本番環境構築してみようと思う。
点群から点を極力離して抽出する方法「spectral relaxation」の使い方を数式レベルから解説！

# 作ったwebアプリについて(宣伝)

左右に表れる２つの本から1つを選ぶことを繰り返すことで, 新しい本に出逢えるwebアプリを作りました.
宣伝です.

https://horinator.pages.dev/

↑web版

https://play.google.com/store/apps/details?id=dev.pages.horinator.twa&pli=1

↑androidアプリ版

https://qiita.com/tsukemono/items/a3c8717fab95d60bc13b

↑解説記事

このなかで, 出てくる本のラインナップを偏ったものにせず, 極力バラバラにするためにspectoral relaxationという手法を用いました.

この記事は｢[Novelty and Diversity in Top-N Recommendation -- Analysis and Evaluation](https://dl.acm.org/doi/10.1145/1944339.1944341)｣をベースに説明していきます.
よろしければ併せてどうぞ.

# 問題設定

リスト$\mathcal{I}$の要素$i$と$j$の間に距離$D_{ij}$が定められているとします.
そんなリスト$\mathcal{I}$から要素を$k$個取り出したい部分リスト${\mathcal{I}}{@k}$を作ったとします.
そのとき$\mathcal{I}_{@k}$内の要素間の距離$D$の合計や平均が大きくなるように, 部分リスト$\tilde{\mathcal{I}}
_{@k}$を作ることを考えます.

数式になおすと
```math
\tilde{\mathcal{I}}
_{@k}=\mathrm{argmax}_{\mathcal{I}_{@k}} \sum_{i\in\mathcal{I}_{@k}}\sum_{j\in\mathcal{I}_{@k}} D_{ij}
```
という式になります.

これを愚直に解く場合, $_{|\mathcal{I}|}C_k$通りのパターンを計算する必要があります.
仮に100個のリストから10個の点を選ぶ場合でも$10^{13}$通りの計算量が必要なため, 大規模では計算できないです.
なので, 近似を使うことでこれを素早く計算していく手法を紹介します.

# 計算
ここで, $x_i$が↓を満たすベクトル$x$を作ることで式をかっこよくできます.
```math
x_i=\begin{cases}1 & i\in\mathcal{I}_{@k} \\ 0 & i\notin\mathcal{I}_{@k}\end{cases}
```

```math
\tilde{x}= \mathrm{argmax}_{|x|^2=k} x^TDx
```
ここで, 近似として$x$の値域を実数全体がとれるように拡張します.
その場合, 束縛条件($|x|^2=k$)下での値の最大化なのでラグランジュの未定乗数法で解くことができます.
```math
0=\frac{\partial}{\partial x}\left\{
    x^T D x-\lambda (x^T x - n)
\right\}
=2 (D-\lambda)x
```
よって, $\lambda$は行列$D$の固有値, $x$は行列$D$の固有ベクトルとみなせます.

$x$が行列$D$の固有ベクトルのとき, $x^T D x$は固有値となるため, 最大固有値に対応した固有ベクトルが$\tilde{x}$となります.

最後に, $\tilde{x}$の要素の大小関係からtop kを取得しリスト$\mathcal{I}_{@k}$を作れば完成です.
この計算手法を用いることで$|\mathcal{I}|^3$程度の計算量で各要素が離れたリストを作ることができました.

距離$D$の合計を小さくしたい場合は, 同様に考えることで, 最小固有値に対応した固有ベクトルを求めればOKです.

# 実験

実際にうまくいくのかシミュレーションで実験してみました.
条件としては, 二次元上にランダムに点をたくさんサンプリングし, $D_{ij}$を点$i$と点$j$の距離とします.
そして, 先程の手法で点を20個サンプリングしました.

```python
# 標準正規分布に従って乱数を生成
N = 1000
rs = np.random.multivariate_normal([0,0], np.eye(2), N)
xs = rs[:,0]
ys = rs[:,1]

# 距離行列Dの作成
dx = xs.reshape((1,-1))-xs.reshape((-1,1))
dy = ys.reshape((1,-1))-ys.reshape((-1,1))
D = dx**2 + dy**2

# 最大固有値の固有ベクトル計算
e_vals, e_vecs = np.linalg.eigh(D)
itr = np.argmax(e_vals)
e_vec = e_vecs[:, itr]

# 値が大きい順にn個採用
# 固有ベクトルの符号的な問題から大きい順, 小さい順に20個点をとりその比較をした
n = 20
points_plus = np.argsort(e_vec)[:20]
points_minus = np.argsort(e_vec)[-20:]
if np.mean(D[points_plus,:][:,points_plus]) > np.mean(D[points_minus,:][:,points_minus]):
    points = points_plus
else:
    points = points_minus
```
その結果が↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/3ed3a142-d9bc-3bcc-cbc7-d1b19300e54d.png)
ちゃんと点同士の距離が遠くなっていることが確認できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/5795945a-6717-7ddb-931e-ad7ab0c75d4c.png)
たくさん実験してみました
横軸が粒子間の平均距離です.
青のデータがランダムに20個の点を選んだ場合.
オレンジのデータが先程の手法で点を選んだ場合です.
オレンジのデータのほうが平均距離が長いことが確かめられます.

# [おまけ]ラグランジュの未定乗数法について

ある条件$g(x)=0$下での$f(x)$を最大化･最小化させる点$\tilde{x}$は
```math
\partial_x \{f(x)-\lambda g(x)\}=0
```
を満たすことが知られています.
ここででてくる$\lambda $のことをラグランジュの未定乗数と呼びます.
【Android Studio】タブを閉じるボタンの位置を左側にする方法

# はじめに
Android Studioのタブを閉じるボタンは、デフォルトでは右にあります。
しかし、macの標準アプリの多くは、タブの閉じるボタンが左にあります。
この記事では、Android Studioでタブの閉じるボタンを左にすることで、macの標準アプリと同じように操作する方法を紹介します。

# ゴール
Android Studioでタブを閉じるボタンの位置を左側にする

# 手順
## Android Studioの設定を開く
「コマンド + ,」を押して設定画面が開きます。

## 設定を編集する
設定画面を開いたら、検索ボックスに「tab」と検索し、
「Editor > General > Editor Tabs」を選択します。

「Close button position」を「Left」に変更し、「Apply」をクリックします。
すると、タブを閉じるボタンが左に移動します。
変更を確認できたら「OK」を押して設定画面を閉じます。
![スクリーンショット 2023-06-17 6.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/a88e43a7-4298-1afa-cef2-0883c69d7b3f.png)


# おわりに
Android Studioでタブを閉じるボタンの位置を左にする方法を紹介しました。
標準アプリをよく使う人は、Android Studioの操作が快適になるでしょう。
Markdown記法メモ

# メモ

はじめての記事なので練習も兼ねて書いています.

## 書き方

### 見出し

- `# hoge` で見出し. 
- \# の数は 1 ~ 6 個までで見出しの大きさが変えられる.

~~~ md:Example_headline.md
    # headline1
    ## headline2
    ### headline3
    #### headline4
    ##### headline5
    ###### headline6
    ####### headline7??
~~~

:::note
見出しの大きさは6段階まで(HTMLと同じ)
:::

### 本文の装飾

- `*text*` または `_text_` で斜体.
- `**text**` または `__text__` で太字.
- `***text***` または `___text___` で斜体かつ太字.
- `~~text~~` で訂正線.

~~~ md:Example_decoration.md
    hoge
    *hoge*, _hoge_
    **hoge**, __hoge__
    ***hoge***, ___hoge___
    ~~hogehogehoge~~
~~~

### 挿入(単純)

- アスタリスク「*」やハイフン「-」, アンダースコア「_」を3つ以上並べて罫線.
- 「>」で引用, 「>>」で二重引用.
- コメントアウトは `<!-- comment -->`.

~~~ md:Example_insert.md
    ***
    ---
    ___
    
    *********

    hogehoge.
    > hogehogehoge
    >> hogehoge
    > hogehoge
    > hogehoge
    <!-- hogehoge comment -->
~~~

### 箇条書き


## 参考文献, サイト

https://qiita.com/tbpgr/items/989c6badefff69377da7
tidyverseの経過を出力してくれるtidylogをアレンジする



# tidylogとは

tidylogという面白便利ツールがあります。
tidyverseはとっても便利ですが、今どこが実行されているか知りたい、実際どんな流れでどんな処理が行われているか知りたい、という場合にそれを出力してくれるのがtidylogです。

```r
install.packages('tidylog')
```

```r
library(tidylog)

data <- mtcars %>% 
  select(mpg, cyl, hp, am) %>% 
  filter(mpg > 15) %>% 
  mutate(mpg_round = round(mpg)) %>% 
  group_by(cyl, mpg_round, am) %>% 
  tally() %>% 
  filter(n >= 1)
```

`library(tidyverse)` の代わりに用いることで、`select()` でどの列を省いたかだとか、`filter()` で何行削ったかなどを教えてくれます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/39739a2a-1804-2747-29ed-c989391c2289.png)


# tidylogの出力をアレンジする
せっかくなので何時にどの処理が終わったか知りたいと思い、書いてみました。

```r
library("crayon") # 出力の文字色を変えるためのライブラリ

with_time <- function(x) {
    out = str_c(green$bold(  # 時刻を緑色で表示する
                  Sys.time() %>% as.POSIXct("Asia/Tokyo") %>% format("%Y-%m-%d %H:%M:%S$")
                ), " ", x)
    message(out)  # catでなくmessageを使うことで、順次出力されるようにする
}
options("tidylog.display" = list(with_time))  # 設定を適用
```

![tidylog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/93441589-24d2-b757-78d0-8d58e25e8c10.gif)


ポイントとしては、（１）関数の引数（ここではxにデフォで出力される内容）が入ってくること、（２）message関数を用いることで、各処理が終わったタイミングで出力してくれるようにすることです。

元の設定に戻す際は、`options("tidylog.display" = NULL)` とします。

# 参考
https://qiita.com/ando_roid/items/ae59cb8a17d3d28b9daa

https://cran.r-project.org/web/packages/tidylog/readme/README.html
Qiita始めました！！

# 自己紹介
初めましてhibichyとも申します。
経済学部3年生で、計量経済学を専攻しています。
主に統計的因果推論、統計的因果探索と、それのビジネス応用に関心があります。
因果推論に関する記事を投稿していきたいと思っています。


## 身分・職業
大学生・民間企業のインターン生・研究アシスタント

## 実績
- 統計検定2級優秀賞
- 経済モデルに関する共著報告書作成
- マナビDX2022修了
- 民間企業にて2年間リサーチ・データ解析業務に従事
- 研究アシスタント

## スキル
- Pythonによるデータ解析
- 統計学の基礎知識(2級程度)

## 目標
- 統計検定準一級合格（7月中）
- データサイエンスを軸に起業
- 会社から受託解析の仕事をいただく


## 最後に
最後まで見ていただき、ありがとうございました！
地道に続けていきたいと思いますので、応援よろしくお願いします。
電子工作1年生が今流行り？のフレキシブルLEDつかってみる！

## 1. フレキシブルLEDを買ってみた
電子工作を始めたばかりの非エンジニアです。
電子工作大好き。
Ｌチカは特に好き。
そんな私が最近Twitterでよく見かけるフレキシブルLEDを購入しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668122/9f8667f7-f43f-c4ee-2d17-588626fb3f9a.png)

https://akizukidenshi.com/catalog/g/gM-18006/

商品ページより引用
>CY-FRX3002-M2001はフィラメント形状のフレキシブルなLEDです。数十個のマイクロLEDダイオードを超柔軟な金属の裏面に接着し、保護用にカラフルなシリコンでコーティングしています。 LEDは並列に配置されているため、3Vの電圧で点灯させることができます。

とりあえずボタン電池で光らせてみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668122/cb330dd2-e7c1-9c6b-6a25-a9e6c43b6344.png" width="60%">
キレイー。

## 2. 製品説明書を読む
初心者なので商品ページにあった説明書をちゃんと読みます。

https://akizukidenshi.com/download/ds/ipixelled/CY-FRX3002-M2001.pdf

>* この柔軟なLEDフィラメントは、ハートや星の形にしたり、巻きつけて楽しさや暖かさを感じさせるものです。 
>* 両端に接続して3Vで電源を入れるだけです。陽極は金属製の端子に穴が少し開いています。

実物はかなり小さいですがよく見るとこんな感じでプラス側に穴が開いています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668122/85bb3451-ec37-2710-a666-518699e0b318.jpeg" width="80%">


なるほどなるほど


## 3. なんかつくってみる

obnizにつないで光らせてみました。
obnizとフレキシブルLEDを直接つないだら外れやすかったので、
動画撮影中だけマスキングテープを付けています。


https://twitter.com/am003004/status/1667382322847694849?s=20


<details><summary> 作成したコード</summary>

```js
const Obniz = require('obniz');
const obniz = new Obniz('******'); // Obniz_IDに自分のIDを入れます

obniz.onconnect = async function () {
    // LEDを利用
    const ledRed = obniz.wired("LED",{anode:0, cathode:1},);
    const ledYellow = obniz.wired("LED",{anode:3, cathode:4},);
    const ledBlue = obniz.wired("LED",{anode:6, cathode:7},);
   
    // ディスプレイ表示（初期画面）
    obniz.display.clear();
    obniz.display.print('LED_chika_chika');

    // スイッチの反応を常時監視
    // 「スイッチ状態が変化した瞬間に1回だけ実行される」ことに注意しましょう
    obniz.switch.onchange = function (state) {
        // スイッチの状態で角度を決め、最後に動かします
        if (state === 'push') {
            // スイッチが押されている状態
            console.log('pushed');
            ledYellow.off();
            ledBlue.off();
            ledRed.on();
        } else if (state === 'right') {
            // 右にスイッチを倒したとき
            console.log('right');
            ledRed.off();
            ledBlue.off();
            ledYellow.on();
        } else if (state === 'left') {
            // 左にスイッチを倒したとき
            console.log('left');
            ledRed.off();
            ledYellow.off();
            ledBlue.on();
        } else {
            // スイッチが押されていない状態
            console.log('released');
            ledRed.off();
            ledYellow.off();
            ledBlue.off();
        }
        
        obniz.display.clear();
        obniz.display.print(`Red_Yellow_Blue`);
       
    }
}


```
</details>

obnizのスイッチを押し込むと赤、右に入れると黄、左にいれると青のフレキシブルLEDが光るようにしました。
obnizで光らせるとかなりまぶしいですね。
フレキシブルLED色々作れそうです。

次はこれを使ってスイッチで色が変わるアクセサリーとかを作ってみたいです。
20分でまとめる備忘録　robloxでテキストボックス選択時にキーボード入力を止める方法

## 備忘録のきっかけ
テキストボックスから文字入力中、キーボードに割り当てられたジャンプ・ダッシュなどが反応して後ろでキャラクターが暴れる事象が発生するので、ボックスに入力中はこれを黙らせる方法を探した

## 実装例
```lua
local function onInputBegan(input, _gameProcessed)
	if UserInputService:GetFocusedTextBox() == nil　and input.UserInputType == Enum.UserInputType.Keyboard then
        print("sample")
	end
end

UserInputService.InputBegan:Connect(onInputBegan)
```
> If no TextBox is selected, this function will return nil.

テキストボックスを選択していない場合、GetFocusedTextBox()はboolでなくnilを返すのでnilチェックするので気を付ける。
設計的には入力中のテキストボックスが取れた方が、ここから入力文字列を取れるので便利そう。今回は選択中かが分かれば良いだけだったので関係はないが、今後使う可能性はありそう

## おわりに
入力系はこの時は受け付けたい・この場合は受け付けたくないケースが複雑になりがち。しっかり切り分ける仕組みを用意するのが肝心そう

## 参考
https://create.roblox.com/docs/reference/engine/classes/UserInputService#GetFocusedTextBox
WSLでUbuntu22.04を入れたら最初にすること

## はじめに
1年ほど使用していたUbuntu20.04の環境がカオスになってきたので、リセットついでにUbuntu22.04に移行した。そのときに行った各種セットアップの内容をまとめる。
## やったこと
- Python 3.9.16 のインストール
- Git の初期設定
- nvm のインストール
- aws cli のインストール
- serverless framework のインストール
- terraform のインストール(2023/06/21 追記)

## 解説
実際のセットアップ手順をまとめていく。

### Python 3.9.16 のインストール
Ubuntu 22.04 はデフォルトで 3.10.6 がインストールされている。しかし、このPythonはOS側でも使用するアプリケーションのため、迂闊にバージョンを上げたりパッケージをいじったりするのは少々危険。そのため、別途`/usr`配下にPythonをインストールする。
こちらのサイトを参考にインストールを行った。

https://www.python.jp/install/ubuntu/index.html

ちなみに、3.9.16 を選んだ理由は使い慣れていたことと、Lambdaで使用したかったから。~~深い理由はない~~


### Git の初期設定

Gitの設定は以下のサイトを参考に行った。
プロキシと認証情報のキャッシュ以外は設定した。

https://blog.katsubemakito.net/git/git-config-1st

https://blog.katsubemakito.net/git/git-secrets

https://qiita.com/ucan-lab/items/9b442e042988e2d7a35d

プロンプトにブランチ名を表示させたかったので、以下の記事を参考に設定を行った。

https://snowsystem.net/other/linux/ubuntu-git-branch/

設定すると、git配下のページに移動したときに現在のbranchが表示されるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1586001/b14be157-11df-4c7a-7239-211e7b95a997.png)

### nvm のインストール

node.jsを使用するなら必須級のアイテム。
導入後、最新の安定化バージョンをインストールした。
```bash
$ nvm install --lts
$ node -v
v18.16.0
$ npm -v
9.5.1
```

https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-22-04

https://github.com/nvm-sh/nvm

### aws cli のインストール
毎度おなじみ公式ページ。
ただし、デフォルトだと`unzip`が入っていないので、`apt install`で入れている。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

### serverless framework のインストール
lambdaにデプロイする際に使用するのでインストールする。
```
npm install -g serverless
```

### terraform のインストール(2023/06/21 追記)

こちらの公式サイトを参考にインストールしていく

https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli

```bash
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt-get install terraform
```

## まとめ
今回ディストリビューションをリセットしたときの手順を備忘録としてまとめた。
今までディストリビューションをリセットするたびにやり方を1から調べ直していたので、今後はだいぶ楽できる…はず。
現在はコンテナ上での開発が普及してきたので、ディストリビューション上での開発が行われること少ないかもしれない。しかし、ディストリビューションなどのローカル開発環境はコンテナにはない安心感がある。どちらが優れているとかはないので、双方いい感じの距離感を見つけて今後も付き合っていきたい。
Scratchでキャラクターそうさをしよう

## メインで動かすキャラクターのプログラミング
ここでは、Scratchでキャラクターをそうさするプログラミングをせつめいします。
全体を知りたい人は[ここ](https://qiita.com/aoki_kohei/items/684cc2f53566f981b7df)をみてね。

下の４つのプログラミングについて説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399223/37d5fe5a-52ae-0b2a-2e2b-a821fbf0445b.png)

#### ① まずはかくす
- ゲームがスタートした時に、タイトルがめんをだすから、まずはいったんかくしておきます
    - そうしないとずーーーーーーーーっといます。

#### ② キャラクターのそうさ
- キャラクターをスタートのいちにおきます。
(x:-200, y:-110)にしているけど、好きなところでもいいよ。
- ①でスタートの時にはかくしてたので、ひょうじさせます。
- スペースを押したら上に(yがふえる)、はなしたら下に(yがへる)
    - ずっとを入れないと１回だけで終わってしまいます
    - スペースキーが押された時に"y<100"を入れているのは、キャラクターががめんの上にいってしまわないようにしてます。
    - "y>-110"も同じく、キャラクターががめんの下にいってしまわないようにしてます。
    - そうじゃないと、ドヒューンととんでいってしまいます。

#### ③ キャラクターに動きをつける
- 1秒ごとにキャラクターがポーズをかえるようにしてます。
    - 動いているように見えるでしょ？

#### ④ ドラゴンに当たるとゲームオーバー
- ドラゴンに当たると、ゲーム終わったよーってメッセージを送ります。
- そして、キャラクターはかくれます。
Scratchでゲーム管理をしよう

ここでは、ゲームを管理するプログラミングについてせつめいします。
こちらはステージにプログラミングを行います。
全体をしりたい人は[ここ](https://qiita.com/aoki_kohei/items/684cc2f53566f981b7df)をみてね。

下の４つのプログラミングについてせつめいします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399223/4d1cdee4-05ea-36ba-db04-35b930422911.png)

#### ① ステージがめんの切り替えとゲームプレイかいしの合図
- まずは、ゲームおわりのへんすうをリセットします。
    - プログラミングの世界では、しょきかっていいます。
    - まえにプログラムを動かしていると、1になっている場合があるので、しっかりとリセットしておきましょう。
- はいけいがめんをスタートがめんにします。
- スタートがめんでスペースがおされると、ゲームをプレイするプレイがめんに切りかえます。
- ちょっと1秒だけ一休みして、ゲームかいしです。

#### ② ゲームプレイでの敵キャラを作る
- ゲームがはじまったら、、ゲーム開始のメッセージを送ります。
- ゲームが終わるまで、敵キャラのクローンを2びょうに１回作ります。
    - ここは２びょうじゃなくてもいいので、いろいろ変えて、ためしてみてね。

#### ③ てんすうをつけていこう
- ゲームが始まったら、まずは忘れずにてんすうをリセットします。
- あとは、ゲームが終わるまでてんすうを１ずつ増やしていきます。
    - 0.3びょうごとに増やしてますが、いろいろためしてみてください。

#### ④ ゲームが終わったら、ゲーム終わりがめんに
- へんすうのゲームおわりを1にします。
    - これは、0より大きければなんでもいいです。
    - ゲームが終わったよってことをみんなに伝えます。
- はいけいがめんをゲーム終わりがめんにします。
Scratchで敵キャラをクローンしてそうさしよう

ここでは、Scratchで敵キャラをそうさするプログラミングをせつめいします。
全体を知りたい人は[ここ](https://qiita.com/aoki_kohei/items/684cc2f53566f981b7df)をみてね。

下の４つのプログラミングについてせつめいします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399223/6adb9aba-4d3e-f297-78de-52b7140070b7.png)

#### ① まずはかくす
- かくすの大事。

#### ② 敵キャラのそうさ
- クローンされたときというのは、新しく敵キャラが作られたときっていみです。
    - 敵キャラはステージのプログラミングでクローンします。
- 敵キャラは右から(x:250)から左に向かってくるようにします。
- yざひょうがらんすうなのは、上下どこから出てくるかわからないようにするためです。
    - らんすうっていうのは、-120から90までどれか１つ、すうじをとってくるよってことです。
        - ガラガラガラガラ、ポン、20です。
- xざひょうを-5ずつ変えるとだんだん左にいどうします。
- すると、左のはしっこ(x:250)にいっちゃうので、やくめを終えて、けします。
    - ここでけさないといっぱいクローンが作られて、動きがおもたくなっちゃうよ。

#### ③ キャラクターに動きをつける
- 1秒ごとにキャラクターがポーズをかえるようにしてます。
- 動いたほうがおもしろいよね。

#### ④ ゲームが終わった...
- あとかたずけしましょうね。
Scratchでアクションゲーム作ってみた

# ゲームについてのせつめい
作ったゲーム(うちゅうひこうしのぼうけん)
https://scratch.mit.edu/projects/865698760

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399223/f42126e3-0cb2-20d2-8489-1adc9ee53d18.png)


生き残るほどポイントがたまります。
ドラゴンがおそってくるので、うまくよけて長く生きのころう。

## 遊び方
犬のうちゅうひこうしにドラゴンが当たらないようによけよう。
スペースをおすと犬のうちゅうひこうしが上にあがり、はなすと下がります。

## プログラミングのかいせつ

小学生むけに書いてはいますが、むずかしい漢字があったら、パパかママにおしえてもらってね。

### 画面は３つ
- スタートがめん
- プレイがめん
- ゲーム終わりがめん

### 変数は２つ
- てんすう
    - 一定時間ごとにふえていきます
- ゲーム終わり
    - ゲームオーバーになったかどうかを管理します。
    - 0: まだ終わってないよ
    - 1(0より大きい): もう終わったよ

### ブロックていぎは１つ
- ゲームプレイ
    - ゲームをするところをまとめてます

### プログラミングする場所は3つ
- うちゅうひこうしのいぬ
    - いぬをそうさするプログラミングを書きます
    - ドラゴンに当たったらゲームオーバーにします
    - いぬを動いているように見せます
- ドラゴン
    - ドラゴンをたくさん作って、おそってくるところを作ります
    - ドラゴンが動いているように見せます
- ステージ 
    - がめんのきりかえを管理します
    - てんすうけいさんをします
    - ドラゴンのクローンを作ります
        - クローンっていうのは、同じものを作り出すっていみです

### プログラミングのくわしいせつめいは下をみてね。
- [うちゅうひこうしのいぬ](https://qiita.com/aoki_kohei/items/9eec0a2cdc645a871bd2)
- [ドラゴン](https://qiita.com/aoki_kohei/items/98819b6560f756eccee9)
- [ステージ](https://qiita.com/aoki_kohei/items/98677cef57818c01f0d9)

### もし、もっとチャレンジしたい人は下のことをやってみるのもいいかも
- ライフをつける
    - 1回でやられるのではなく、３回当たったらやられるようにするには、、、
- 敵の種類を増やす
    - ドラゴン以外も作って、いっぱいクローンしてみると、、、
- こうげきする
    - こうげきしてドラゴンをたおせるようにするには、、、
- ほかにもいろいろチャレンジしてみてね！
4.キャラクターの動作付与

**4.キャラクターの動作付与**

前回はタイル（画像）を読み込みキャラクターを表示させたため、
キャラクターに動作を付けてあげようと思います。

・目次
1.２つのタイル（画像）を追加
2.タイルの切り替え実装
3.動作確認


<br>
<br>
<br>
<br>

**1.２つのタイル（画像）を追加**
　キャラクターに動作を付けるため、2つのタイルを追加する。


```main.c
#include <gb/gb.h> 
#include <stdint.h>  //ライブラリ参照
#include "tile.c"

UINT8 p_xy[2] = {0};// [x, y] が入る

void main(){
	set_sprite_data(0, 2, tile); //2個のタイルを登録
	set_sprite_tile(0, 0); // スプライト番号 0 にタイル 0を設定
	set_sprite_tile(1, 1); // スプライト番号 1 にタイル 1を設定

	//タイル0を表示する位置決め
	p_xy[0] = 10 << 3; //x軸160
	p_xy[1] = 10 << 3; //y軸16
	move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
	move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
	
	SHOW_SPRITES; // スプライトの表示を ON
```
◇解説
>set_sprite_data(0, <font color="Red">2</font>, tile); //2個のタイルを登録
→第2引数に2を指定して、2個のタイルを登録する

>set_sprite_tile(0, 0); // スプライト番号 0 にタイル 0を設定
→1つ目のタイルを登録（前回同様）

>set_sprite_tile(1, 1); // スプライト番号 1 にタイル 1を設定
→2つ目のタイルを登録

>move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
→1つ目のタイルを表示（前回同様）

>move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
→2つ目のタイルを表示

以上で2つのタイルが登録できた。
しかし、現状では2つのタイルが同じ場所に表示され、被って表示されるだけなので、
方向キーを一回入力するたびに
"1つ目のタイルを非表示にし、2つ目のタイルを表示させる"を繰り返す必要がある。

<br>
<br>
<br>

**2.タイルの切り替え実装**
２つのタイルを交互に切り替えるため、方向キーの入力度にフラグを切り替え、
タイルの表示、非表示を繰り返す。
（large_mapサンプルを元にしていますが、不要部分は端折って記載しています。　
　詳しくはサンプルをご確認ください。）


```main.c

uint8_t flag = 1;//歩き画像変更用フラグ 

void main(){
	move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
	//move_sprite(1, p_xy[0], p_xy[1]);
	
    while (TRUE) {
        if (joy & J_UP) {
            if(flag){
    			hide_sprite(0); // 0 番目のスプライトを削除
            	move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
            	flag = 0;
            } else{
    			hide_sprite(1); // 1 番目のスプライトを削除
            	move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
            	flag = 1;
            }
        }
    }
```
◇解説
>uint8_t flag = 1;//歩き画像変更用フラグ 
→切り替え用の変数追加

>//move_sprite(1, p_xy[0], p_xy[1]);
→2個目のタイル情報だが、最初から表示していると1個目のタイルと被るため定義しない
	
>while (TRUE) {
→While文でループ（large_mapサンプルを参照）

>if (joy & J_UP) {
→if文で方向キー入力を判定（large_mapサンプルを参照）

>if(flag){
→if文でflag変数の値を判定し真（=1）の場合を追加（初期値は1で設定している）

>hide_sprite(0); // 0 番目のスプライトを削除
→hide_sprite関数で1個目のタイルを削除

>move_sprite(1, p_xy[0], p_xy[1]); // 1 番目のスプライトを移動
→move_sprite関数で2個目のタイルを表示

>flag = 0;
→フラグ変数を0に更新
　※上記でフラグ変数を0に更新しているため、次に方向キー入力をした場合、else条件を通ることとなる。

>} else{
→if文でflag変数の値を判定し偽（=0）の場合を追加

>hide_sprite(1); // 1 番目のスプライトを削除
→hide_sprite関数で2個目のタイルを削除

>move_sprite(0, p_xy[0], p_xy[1]); // 0 番目のスプライトを移動
→move_sprite関数で1個目のタイルを表示

>flag = 1;
→フラグ変数を1に更新
　※上記でフラグ変数を1に更新しているため、次に方向キー入力をした場合、if条件を通ることとなる。
　　上記実装で方向キー入力のたびにフラグが1→0→1→0・・・と繰り返し、
　　1個目、2個目のタイルを表示非表示と切り替えることができる。
<br>
<br>
<br>

**3.動作確認**

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/749ecfd2-555d-0e7c-af94-c4bdc5097536.gif)


以上！次回はマップを作ろうかな？？
超便利！関数電卓でのN進数の計算と進数変換の仕方。

# はじめに
普段使い慣れない2進数や16進数での計算。２進数から10進数,10進数から16進数といったn進変換...。私はこれまで真面目に手計算していました。（計算ミスは多発しますし、何より時間と根気が必要な作業ですよね笑）

しかし、実はこれらの変換、関数電卓でできてしまうようなんです！

ネットに出ている情報も少なく、少しややこしかったので、自分なりにまとめたものを書き留めたいと思います。

# 実行環境
私はCASIOの関数電卓を使っていますが、他の関数電卓であっても基本的な操作自体はあまり変わらないと思います。

# 計算方法
### ① 計算モードを "BASE -N" モードに切り替える

<img width="360" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/aa681a4e-c5dc-64b0-586a-0ba9d6d882dc.png">

1. まずは、MODEボタンを押して、計算モード一覧を表示しす。
2. 今回はN進数の計算なので、4番の"BASE -N"を選択します。（**番号は機種によって異なる場合があるので注意しましょう。**）
参考程度に各モードのメソッドも以下に掲載しておきます。

| 計算モード | メソッド |
| --- | --- |
| 1. COMP | 一般計算 （デフォルトはこちら）|
| 2. COMPLX | 複素数計算 |
| 3. STAT | 統計計算 |
| 4. BASE-N | N進計算 （2進, 8進, 10進, 16進）|
| 5. EQN | 方程式の計算 (2元連立１次方程式など）|
| 6. TABLE | テーブル機能（グラフとか作れるらしい） |

### ② N進数に切り替える
N進数への切り替えは各進数、以下のボタンで実行できます。

| N進数 | ボタン |
| --- | --- |
| 2進数 | BIN |
| 8進数 | OCT |
| 10進数 | DEC |
| 16進数 | HEX |

<img width="280" alt="N進数変換ボタン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/9da64c56-cd6d-cc76-1553-bd97933827fa.png">

今回は２進数に切り替えてみました。ちゃんと表示がDecからBinに変わってますね♪

### ③ 計算結果をX進数に変換する
N進数で計算する環境が整ったので実際に計算してみましょう。（私の場合は２進数で"0101＋1001"を計算してみました。正しい結果が返ってきていることがわかります）

すでに予想がついている方もいらっしゃると思いますが、この計算結果をX進数へ変換する方法はとても簡単です。②と同じように変換したい進数のボタンを押すだけです♪　

<img width="540" alt="結果変換.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/dc2f9152-479a-f5e3-7b57-1958a3780688.png">
(2進→10進）

# 最後に
少しややこしいですが、手計算することを考えると断然速くて正確ですよね。これができれば、２進数も16進数ももう怖くない！
私も忘れたらこの記事を見返して慣れていこうと思います。この記事が少しでもみなさんの役に立ってくれたら嬉しいです。
【Momento】MOMENTO_AUTH_TOKENをデコードするスクリプトを書いてみた

## はじめに

この記事では 手を動かしながらMomentoが提供する初の真のサーバーレスキャッシュMomentoを学習していく記事です。主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば書き直していく予定です。

今回はMomentoではなく、Momento SDKのコードを読み、Momentoで利用するMOMENTO_AUTH_TOKENをデコードして中身を見てみました。

## そもそもMomentoとは

Momentoが提供する真のサーバーレスキャッシュサービスです。
Momentoの主な特徴としては以下のようなものがあります。

- 月50GB無料
- データの送受信に対して$0.5/GB
- メモリーインスタンスへの課金なし
- Elasticache for Redis と比較して60%低いコストで利用できる
- Pub/Sub型
- 様々なデータ型に対応
- 複数のプログラミング言語に対応※

Momentoを利用すると開発者への負担を減らしつつ可用性を向上させてキャッシュコストを削減できます。

※料金体系：https://jp.gomomento.com/pricing

### はじめかた

以下のURLから始めることができます。
https://docs.momentohq.com/getting-started

## Momento を操作するSDK

Momento にはキャッシュを操作する為のSDKがOSSで提供されており、中身は[全てGitHub](https://github.com/momentohq)で公開されています。さらに管理用インターフェイスには専用のCLI、`momento cli`があります。

今回はMomentoではなく、Momento SDKのコードを読み、Momentoで利用するMOMENTO_AUTH_TOKENをデコードして中身を見てみました。

## なぜ中身を見ようと思ったのか

理由は簡単です。
他のキャッシュサービスではリーダーエンドポイントとアクセストークンによる接続であることに対してMomentoは`AUTH_TOKEN`だけあれば、接続できるところです。

例えば、Redisの場合はリーダーエンドポイントとアクセストークンのセットでアクセスが可能です。
また、ものによってはIDとパスワードで認証することもあるでしょう。

少なくともキャッシュアクセスにはペアとなる文字列情報が必要になるというのが私の頭の中にあり、単一のトークンでアクセスできるということに違和感がありました。

リージョン情報は？ APIキーは？　キャッシュの識別は？
色々疑問に思ったのでSDKのソースを読んだところ、疑問が解決しました。

## MomentoのAuth Tokenをデコードしてみた

### 事前準備

[momento_auth_token_decoder - GitHub](https://github.com/ymd65536/momento_auth_token_decoder)をDesktop にCloneします。

```sh
cd ~/Desktop
git clone https://github.com/ymd65536/momento_auth_token_decoder.git
```

ディレクトリを変更します。

```sh
cd ./momento_auth_token_decoder
```

[getting started](https://docs.momentohq.com/getting-started)を参考にMomento のトークンを作成します。

環境変数`MOMENTO_AUTH_TOKEN`を作成して`YOUR_AUTH_TOKEN`を取得したMomento のトークンに置き換えます。

```sh
export MOMENTO_AUTH_TOKEN=YOUR_AUTH_TOKEN
```

## スクリプトの実行

環境変数にあるMomento のトークンをデコードします。

```sh
python ./example/decoder/main.py
```

```json
{
  "endpoint": "cell-{リージョン名}-1.prod.a.momentohq.com",
  "api_key": "キーの羅列"
}
```

※シークレット情報が含まれる為、一部書き換えています。

## まとめ

Momentoには以下のような特徴があることがわかりました。

- 低コストでアプリケーションにキャッシュを導入することができること
- サーバーレスキャッシュの為、インスタンスの管理が不要であること
- 接続には`MOMENTO_AUTH_TOKEN`が必要であること

そして、今回分かったこととして`MOMENTO_AUTH_TOKEN`はbase64でエンコードがなされており
デコードするとエンドポイントやAPIキーがわかることです。

実は実装をよく見るとエンドポイントにプレフィックスをつけていることもわかります。おそらく、Momentoにアクセスした後、どのキャッシュにアクセスするかを認識する為の識別だと思われます。

## 紹介

### 動画

https://www.youtube.com/watch?v=dZkpqxeb6fE

### 記事

[サーバレスキャッシュサービス Momento を AWS 環境で検証](https://qiita.com/yoshii0110/items/0736d0d267901d6dc0ab)
Ethereumの世界への一歩：JavaScriptエンジニアのためのSolidity入門

# Solidityとスマートコントラクト入門：JavaScriptエンジニアから見たBlockchainプログラミング

こんにちは！今日はJavaScriptの知識があるが、Solidityやスマートコントラクトについて詳しくないエンジニアのための入門です。今回は、EthereumのオンラインIDEであるRemixを使用します。

## 1. はじめに: Solidityとは何か？

Solidityは、Ethereumプラットフォーム上でスマートコントラクトを作成するためのプログラミング言語です。JavaScriptエンジニアにとっては、構文がCやJavaScriptに似ているため比較的親しみやすい言語と言えるでしょう。

## 2. スマートコントラクトとは何か？

スマートコントラクトは、ブロックチェーン上に公開された契約の一種です。これは自動的に実行され、すべての参加者が契約の条件を確認できます。JavaScriptエンジニアがWebアプリケーションのサーバーサイドロジックを書くのと似たような感じで、スマートコントラクトを書くことでブロックチェーンのロジックを制御できます。

## 3. Solidityの基本

まずは、シンプルなSolidityコードを見てみましょう。

```Solidity
pragma solidity ^0.8.0;

contract SimpleContract {
    uint256 public count;

    function incrementCount() public {
        count += 1;
    }
}
```
このコードは、数値を格納し、それを増やす機能を持つ非常にシンプルなスマートコントラクトを作成します。JavaScriptエンジニアから見ると、関数や変数の概念はすぐに理解できるでしょう。

## 4. Remix IDEでのコンパイルとデプロイ

Remixを使用すると、ブラウザ上でコードの編集からデプロイまで一貫して行うことができます。

1. Remix IDEのページ ([http://remix.ethereum.org/](http://remix.ethereum.org/)) を開きます。
2. FILE EXPLORERS タブの + Create New File をクリックし、新しいファイルを作成します。例えば SimpleContract.sol と名付けます。
3. 先ほどの SimpleContract コードをそのファイルに貼り付けます。
4. 左側のメニューから Solidity Compiler を選択し、 Compile SimpleContract.sol ボタンをクリックします。コンパイルが成功すると、下部にコンパイルの詳細が表示されます。
5. 次に、DEPLOY & RUN TRANSACTIONS タブを選択します。Environment を適切なものに設定した上で、Deploy ボタンをクリックします。これで、スマートコントラクトがEthereumネットワークにデプロイされます。

## 5. スマートコントラクトとのやり取り

Remix IDEを使用して、デプロイしたスマートコントラクトとのやり取りを行うことができます。

1. DEPLOY & RUN TRANSACTIONS タブの下部にある Deployed Contracts を見てみましょう。ここにはデプロイしたスマートコントラクトがリストされています。
2. SimpleContract の項目をクリックすると、スマートコントラクトのパブリック変数と関数が表示されます。
3. count 変数の横にある count ボタンをクリックすると、その値を取得できます。
4. incrementCount 関数の横にある incrementCount ボタンをクリックすると、カウントを増やすことができます。

## 6. まとめ

Remix IDEを使うと、Solidityのコードの書き方からデプロイ、そしてスマートコントラクトとのやり取りまでをブラウザ上で直感的に行うことができます。ここでは簡単な例を通じて、その基本的なフローを紹介しました。これが皆さんのブロックチェーンへの第一歩になれば幸いです。

それでは、Happy coding！
【VS Code】タブを閉じるボタンの位置を左側にする方法

# はじめに
macの標準アプリの多くは、タブの閉じるボタンが左にあります。しかし、VS Codeのタブの閉じるボタンは右にあります。この記事では、VS Codeでタブの閉じるボタンを左にすることで、macの標準アプリと同じように操作する方法を紹介します。

# 手順
## 設定を開く
VS Codeの左下にある歯車アイコンをクリックし、「設定」を選択します。

## 設定を編集する
設定画面を開いたら「Tab Action Location」を探し、「left」に変更します。すると、タブを閉じるボタンが左に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/d8f52895-7674-e882-07ad-18f306ec09a3.png)

# おわりに
VS Codeでタブを閉じるボタンの位置を左にする方法について紹介しました。
タブの閉じるボタンを左にすることで、macの標準アプリと同じように操作することができます。
標準アプリをよく使う人は、VS Codeの操作が快適になるでしょう。
2023年度人工知能学会全国大会（第37回）のデータを集計してみた

# 概要
+ [2023年度人工知能学会全国大会（第37回）](https://confit.atlas.jp/guide/event/jsai2023/tables)の人気講演を知りたかった。
+ 学会プログラム（Confitのシステム）から、「スケジュール登録数」と「いいね数」を手動で集計した（2023/6/12集計）。
## 一般セッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/b4e0a292-cee7-45f9-ef1e-bb2c0a479590.png)
+ 一番人気の高かったのは「ROCKET特徴量を用いた多変量時系列データ分類における変数重要度の導出」（2A5-GS-2-01）
※6/16に確認すると、「ニューラルネットワークに基づく時系列回帰モデルの解釈可能性の評価」[4E3-GS-2-01] の登録数（188）の方が高かった。
+ ROCKET特徴量とは？（アブストから抜粋）
“時系列データ分類問題に対する近年の成果にROCKETがある。ROCKETは単変量あるいは多変量の時系列データから高次元特徴量を算出するためのアルゴリズムであり、得られた特徴量（以下ROCKET特徴量と書く）をリッジ回帰モデルなどの説明変数として用いることで高い分類性能が得られることが知られている。”
+ 上記以外にも、時系列データ解析が複数件注目を集めている。
+ その他言語モデルについては、プロンプトの検討やロボットの指示な多分野の検討が注目を集めていた。
+ Bayesian NetworkやLiNGAMなど、因果推論に着目した講演も散見された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/f6715bc0-273a-e01c-381e-738f435bd6f6.png)
## オーガナイズドセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/a6f24e95-c2c2-93cd-9ea7-2f1de4454113.png)
+ スケジュール登録数一位は、「行動条件付けVideoGPTの構築と検証」(1G4-OS-21a-02)であり、その他マルチモーダルに着眼した講演が注目を集めていた。
+ 概要（アブストから抜粋）
”本研究では，VQVAEとImage-GPTを用いたVideoGPTと呼ばれる動画予測モデルに行動条件付けを導入することで拡張した．”とのこと。
+ 大規模言語モデルや生成モデル、言語モデルを用いてドメイン知識を考慮した特徴量作成自動化など、現在ニュースで話題になっているような事例が多く見られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/aac108e4-4824-4b06-f11a-bdd3fffce2ed.png)

# その他
+ 講演動画が後から見直せるのは非常に良い。
講演者の方は大変だと思うが。。。
+ スケジュール登録数は、集計後も若干変わっていた。
+ 学会のシステムで集計結果を表示してほしい気もするが、スケジュール登録数が多い講演が良い講演を意味する訳ではなく、ただキャッチーなタイトルをつける人が現れる可能性もあるので、このままでもしょうがないか。
Access VBA SQL 処理を早くする方法

# SQL

### リンクテーブル

SQLServer などのリンクテーブルを使用している場合、そのテーブルとクエリの組み合わせによって処理が遅くなる。
SQLサーバーのストアドプロシージャを使うなどの対策をするとよい。

### SQLの問題
SQL の書き方に問題がある可能性がある。
* 文字列に対して部分一致で指定することによりインデックが効かなくなっている
* NOTや<>などの否定演算子を使っている
* IN句使っている → EXISTS句に置き換える
* IN句使っている → union all を使用する
* OR句を使っている → union all を使用する
#### VBA
* 無駄な繰り返しを使わない
* ADOよりDAOを使う

# 参考サイト
【MS Access】クエリが遅い原因と速度改善について１
https://www.depthbomb.net/?p=219#toc1
SQLが遅くなる原因
https://oreno-it.info/archives/292
【SQL】SELECT文のチューニング方法まとめ
https://oreno-it.info/archives/7
Java SE11 Silver インスタンスとメソッドで躓いたところ

Java初心者がインスタンスとメソッドの範囲でなかなか覚えられなかった事項をまとめました。

■アクセス修飾子
protected:同じパッケージまたはサブクラスから利用可
デフォルト:同じパッケージから利用可

■メソッド宣言とコンストラクタ
メソッド宣言では戻り値の型は必須
一方でコンストラクタでは戻り値の型は記述できない
（記述すると通常のメソッドとして解釈されるため）

■初期化子とコンストラクタ
初期化子はコンストラクタよりも先に実行される

■static初期化子
staticなクラス変数はstatic初期化子で初期化する
インスタンスを生成しなくても使えるため初期化子やコンストラクタでの初期化は不可

■thisとコンストラクタ
オーバーロードされた別のコンストラクタを呼び出す時はthis();を使用する
※自身のインスタンスを示すthisとは異なる
this();の前に処理は記述できない（最初に記述する必要がある）

■メソッドのシグニチャと例外
渡す引数とメソッドのシグニチャが一致しない場合はコンパイルエラーが起こる
（IllegalArgumentExceptionではない）
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #80

# 1. Amazon ECSのクラスターとは何ですか？
クラスターは、Amazon ECS内のタスクやサービスの論理的なグループ化です。これは、Amazon EC2インスタンスやAWS Fargateリソースのクラスター全体でコンテナ化されたアプリケーションを実行し、スケールさせることができるコンテナ管理サービスです。

# 2. Amazon ECSでクラスターを作成するにはどうすればいいですか？
Amazon ECSコンソール、AWS CLI、またはAWS SDKsを使用してクラスターを作成できます。クラスターを作成するには、クラスター名、起動タイプ（EC2またはFargate）、そしてクラスターが起動されるVPCとサブネットを指定する必要があります。

# 3. Amazon ECSクラスターのキャパシティプロバイダとは何ですか？
キャパシティプロバイダは、Amazon ECSクラスターのキャパシティを管理するための方法です。これらは、タスクとサービスに必要なキャパシティを定義し、需要に基づいて必要なリソースを自動的にプロビジョニングおよびスケーリングすることを可能にします。

# 4. Amazon ECSでクラスターを管理するにはどうすればいいですか？
Amazon ECSコンソール、AWS CLI、またはAWS SDKsを使用してAmazon ECSのクラスターを管理できます。クラスターのステータスを表示し、クラスターの設定を更新し、タスクとサービスのパフォーマンスを監視できます。

# 5. Amazon ECSで複数のアプリケーションに対して一つのクラスターを使用することはできますか？
はい、Amazon ECSで複数のアプリケーションに対して一つのクラスターを使用することができます。単一のクラスター内に複数のサービスやタスクを定義し、それぞれに独自の設定とリソース要件を持たせることができます。これにより、単一のクラスター内で複数のアプリケーションを管理し、リソースの利用を最適化することができます。