メインコンテンツまでスキップ

EC2 Instance Connect まとめ

· 約5分
ひかり
Main bloger

EC2 Instance Connect とは

EC2 Instance Connect は、AWS EC2 インスタンスへの SSH 接続を簡素化するためのサービス。

従来の SSH 接続方法では、インスタンスに公開鍵を事前に配置する必要があったが、 EC2 Instance Connect を使用すると、一時的な SSH 公開鍵をインスタンスに送信し、接続を確立する。(ただし、一部の AMI を除き Instance Connect のパッケージをインストールする必要がある)

インスタンスへの接続方法

インスタンスへの接続方法は何パターンか存在する。

① インターネットから直接 (インスタンス接続は関係ない)

インターネットから直接接続する方法は、インターネットゲートウェイを経由するか NAT ゲートウェイを経由する必要がある。また、パブリック IP アドレスが必要で閉域網に限定する場合は使えない。

ssh コマンドが使用可能なため、一番簡単である。

ssh <ユーザー名>@<パブリック IP アドレス>

② EC2 Instance Connect エンドポイントを経由した接続

AWS CLI を使用して、EC2 Instance Connect エンドポイントを使用して接続すれば、 パブリック IP アドレスは不要である。

また、その分の料金 (月数百円) を節約することができる。

AWS CLI を用いて、以下のようなコマンドで接続できるが、あらかじめキーペアをインポートして置き、インスタンスにキーペアを設定する必要がある。

具体的な接続方法は、例えば以下のコマンドから可能である。

aws ec2-instance-connect ssh --private-key-file .ssh/id_ed25519 --os-user <ユーザー名> --instance-id <インスタンス ID> --connection-type eice

※ただし、あらかじめアクセスキーを取得しておき、aws configure で設定しておく。

インターネットに接続したくないかつ公式ではない AMI を使用したいという場合にこの接続方法を使用するのが最も良い。

③ AWS マネジメントコンソールから Instance Connect 接続

Amazon Linux や Ubuntu は Instance Connect エンドポイントを作成しておけば、 マネジメントコンソール上からインスタンスに接続が可能である。

ただし、一部の AMI を除いて、Instance Connect のパッケージをインストールする必要がある。

詳しくは、https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html

④ その他の接続方法

セッションマネージャーからの接続

セッションマネージャー用にエンドポイントを 2 つ設置、加えてインスタンスにセッションマネージャーからの接続を許可する IAM ロールをアタッチする必要がある。

また、一部の AMI を除いて、Session Manager のパッケージのインストールが必要である。

EC2 シリアルコンソールからの接続

シリアルコンソールを用いると直接インスタンスへ接続が可能である。 パスワードが設定されていない場合はログインすらできないので注意である。

セキュリティ設定

ネットワーク ACL (インスタンスのあるサブネット)

デフォルトですべての通信が許可されているので、 デフォルトで使用する場合は特に設定は必要ない。

最低限必要な設定を以下に示す。

インバウンドルール

インバウンドルールは、SSH (22) を許可する必要がある。

インスタンスの SSH サーバーのポート番号が 22 であるため、これを許可する。

アウトバウンドルール

アウトバウンドルールは、カスタム TCP (1024-65535) を許可する必要がある。

1024-65535 は SSH 接続時にクライアント側が使用するポート範囲である。

セキュリティグループ (インスタンス)

インバウンドルール

インバウンドルールは、SSH (22) を許可する必要がある。

この設定は必ず必要である。

アウトバウンドルール

セキュリティグループは通信を記憶 (ステートフル) しているため、通常はアウトバウンドルールの設定は不要である。

セキュリティグループ (EC2 Instance Connect エンドポイント)

インバウンドルール

ステートフルのため不要である。

アウトバウンドルール

SSH (22) を許可する必要がある。

インスタンスの 22 番ポートに対し通信するため、これを許可する。

AWS で公式 Rocky Linux イメージを使う

· 約6分
ひかり
Main bloger

AMI の選び方

公式ページから AMI を入手します。

https://rockylinux.org/ja-JP/download

インスタンスに設定するアーキテクチャー (ARM (aarch64)) を選び、 Cloud Images の AWS AMI を選択。

alt text

バージョン番号でフィルターを掛け、条件にあったものを探す。

alt text

AMI ID はコピーできないので、デプロイボタンをクリックし、AWS コンソールからコピーする。

AMI ID で検索を掛けると、でてくる

alt text

所有者でフィルタリングしたほうが良いかも。

所有者 = 792107900819

alt text

事前準備

  • キーペアの登録
    • あらかじめ ssh-keygen -t ed25519 コマンドを実行て公開鍵を作成し、.ssh/id_ed25519.pub をキーペアにインポートしておく
  • AWS CLI の導入
    • CLI のインストール
    • アクセスキーの設定 (aws configure)

ネットワークを建てる

NAT ゲートウェイよりも、パブリック IP アドレスのほうが安いので、Elastic IP を作成。

図にするとこんな感じで建てる。

EC2 Instance Connect エンドポイントを作成

alt text

EC2 Instance Connect エンドポイントを作成することで AWS CLI からログインできる。

インスタンスを建てる

  • ping を要求を受け入れるため ICMP (エコー要求) を許可 (セキュリティグループ)
  • SSH 接続ができるようにこれを許可する (セキュリティグループ)
  • ムンバイリージョンと、arm64 が安い
  • vCPU あたり 1.5 GiB の RAM が必要 (最低でも t4g.medium)

というわけで、以下の条件で建てた。

  • ムンバイリージョン
  • アーキテクチャ: arm64
  • AMI: RHEL 8.10 (LVM, aarch64); ami-0415efd8380284dc4
  • インスタンスタイプ: t4g.medium
  • キーペア: PC で作った公開鍵 (.ssh/id_ed25519.pub)
  • ネットワーク: パブリックサブネット (インターネットゲートウェイへのルートが定義されているルートテーブルが関連付けされている)
  • セキュリティグループ: セキュリティグループを作成 (名前はデフォルト)
    • ssh, 0.0.0.0/0
    • カスタム ICMP - IPv4 (エコー要求), 0.0.0.0/0
  • ストレージ: 1x 10GiB, gp3

接続

PC のターミナルを開き、以下を実行。

aws ec2-instance-connect ssh --private-key-file .ssh/id_ed25519 --os-user rocky --instance-id i-*****************

Instance Connect パッケージのインストール

Rocky Linux の AMI イメージには、Instance Connect パッケージがなく、マネジメントコンソールからの接続ができない。 そのため、パッケージをインストールする。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html を参考にパッケージをダウンロード。

  • ※RHEL のパッケージを選択
  • ※OS のメジャーバージョンやアーキテクチャーが違うと正常に動作しないので注意

curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect.rhel8.rpm -o /tmp/ec2-instance-connect.rpm
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux.noarch.rpm -o /tmp/ec2-instance-connect-selinux.rpm
sudo dnf install -y /tmp/ec2-instance-connect.rpm /tmp/ec2-instance-connect-selinux.rpm

インストールが完了すると、マネコン上からアクセスできるようになる

alt text

CDK (typescript)

CDK 作ったので載せておく。参考までに。

keyName (キーペア) の名前は変えておく。

import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export interface RockyLinuxStackProps extends cdk.StackProps {
}

export class RockyLinuxStack extends cdk.Stack {
public constructor(scope: cdk.App, id: string, props: RockyLinuxStackProps = {}) {
super(scope, id, props);

// Resources
const ec2dhcpOptions = new ec2.CfnDHCPOptions(this, 'EC2DHCPOptions', {
domainName: 'ap-south-1.compute.internal',
domainNameServers: [
'AmazonProvidedDNS',
],
tags: [
],
});
ec2dhcpOptions.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2InternetGateway = new ec2.CfnInternetGateway(this, 'EC2InternetGateway', {
tags: [
{
value: 'igw',
key: 'Name',
},
],
});
ec2InternetGateway.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2vpc = new ec2.CfnVPC(this, 'EC2VPC', {
cidrBlock: '10.0.0.0/16',
enableDnsSupport: true,
instanceTenancy: 'default',
enableDnsHostnames: true,
tags: [
{
value: 'vpc',
key: 'Name',
},
],
});
ec2vpc.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2VPCGatewayAttachment = new ec2.CfnVPCGatewayAttachment(this, 'EC2VPCGatewayAttachment', {
vpcId: ec2vpc.ref,
internetGatewayId: ec2InternetGateway.ref,
});
ec2VPCGatewayAttachment.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2NetworkAcl = new ec2.CfnNetworkAcl(this, 'EC2NetworkAcl', {
vpcId: ec2vpc.ref,
tags: [
],
});
ec2NetworkAcl.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2RouteTable = new ec2.CfnRouteTable(this, 'EC2RouteTable', {
vpcId: ec2vpc.ref,
});
ec2RouteTable.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2SecurityGroup = new ec2.CfnSecurityGroup(this, 'EC2SecurityGroup', {
groupDescription: 'launch-wizard-1 created 2025-04-27T00:11:58.641Z',
groupName: 'launch-wizard-1',
vpcId: ec2vpc.ref,
securityGroupIngress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'tcp',
fromPort: 22,
toPort: 22,
},
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'icmp',
fromPort: 8,
toPort: -1,
},
],
securityGroupEgress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: '-1',
fromPort: -1,
toPort: -1,
},
],
});
ec2SecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2Subnet = new ec2.CfnSubnet(this, 'EC2Subnet', {
vpcId: ec2vpc.ref,
mapPublicIpOnLaunch: false,
enableDns64: false,
availabilityZoneId: 'aps1-az1',
privateDnsNameOptionsOnLaunch: {
EnableResourceNameDnsARecord: false,
HostnameType: 'ip-name',
EnableResourceNameDnsAAAARecord: false,
},
cidrBlock: '10.0.0.0/20',
ipv6Native: false,
tags: [
{
value: 'subnet-public1-ap-south-1a',
key: 'Name',
},
],
});
ec2Subnet.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2InstanceConnectEndpoint = new ec2.CfnInstanceConnectEndpoint(this, 'EC2InstanceConnectEndpoint', {
preserveClientIp: false,
securityGroupIds: [
ec2SecurityGroup.attrGroupId,
],
subnetId: ec2Subnet.attrSubnetId,
});
ec2InstanceConnectEndpoint.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2vpcdhcpOptionsAssociation = new ec2.CfnVPCDHCPOptionsAssociation(this, 'EC2VPCDHCPOptionsAssociation', {
vpcId: ec2vpc.ref,
dhcpOptionsId: ec2dhcpOptions.ref,
});
ec2vpcdhcpOptionsAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2RouteHg = new ec2.CfnRoute(this, 'EC2RouteHG', {
routeTableId: ec2RouteTable.ref,
destinationCidrBlock: '0.0.0.0/0',
gatewayId: ec2InternetGateway.ref,
});
ec2RouteHg.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2SubnetNetworkAclAssociation = new ec2.CfnSubnetNetworkAclAssociation(this, 'EC2SubnetNetworkAclAssociation', {
networkAclId: ec2NetworkAcl.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetNetworkAclAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2SubnetRouteTableAssociation = new ec2.CfnSubnetRouteTableAssociation(this, 'EC2SubnetRouteTableAssociation', {
routeTableId: ec2RouteTable.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetRouteTableAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2Instance = new ec2.CfnInstance(this, 'EC2Instance', {
tenancy: 'default',
instanceInitiatedShutdownBehavior: 'stop',
cpuOptions: {
threadsPerCore: 1,
coreCount: 2,
},
blockDeviceMappings: [
{
ebs: {
volumeType: 'gp3',
iops: 3000,
volumeSize: 10,
encrypted: false,
deleteOnTermination: true,
},
deviceName: '/dev/sda1',
},
],
availabilityZone: 'ap-south-1a',
privateDnsNameOptions: {
enableResourceNameDnsARecord: false,
hostnameType: 'ip-name',
enableResourceNameDnsAaaaRecord: false,
},
ebsOptimized: true,
disableApiTermination: false,
keyName: 'hikari',
sourceDestCheck: true,
placementGroupName: '',
networkInterfaces: [
{
privateIpAddresses: [
{
privateIpAddress: '10.0.3.59',
primary: true,
},
],
secondaryPrivateIpAddressCount: 0,
deviceIndex: '0',
groupSet: [
ec2SecurityGroup.ref,
],
ipv6Addresses: [
],
subnetId: ec2Subnet.ref,
associatePublicIpAddress: true,
deleteOnTermination: true,
},
],
imageId: 'ami-0415efd8380284dc4',
instanceType: 't4g.medium',
monitoring: false,
tags: [
],
creditSpecification: {
cpuCredits: 'unlimited',
},
});
ec2Instance.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2ElasticIp = new ec2.CfnEIP(this, 'EC2ElasticIp', {
domain: 'vpc',
tags: [
{
key: 'Name',
value: 'elastic-ip',
},
],
});
ec2ElasticIp.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;

const ec2EipAssociation = new ec2.CfnEIPAssociation(this, 'EC2EipAssociation', {
eip: ec2ElasticIp.ref,
instanceId: ec2Instance.ref,
});
ec2EipAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
}
}

パソコンセットアップ時に入れておきたいフリーソフトまとめ

· 約1分
ひかり
Main bloger

※ここでいうフリーソフトは原則無料で使えるものであり、オープンソースソフトウェアとは別物です。

通話・チャット

画像編集

音声編集

音声合成

3D モデリング

配信

ベンチマーク・システム情報

開発ツール系

Hyper-V の Ubuntu にシリアルコンソールで接続する方法

· 約2分
ひかり
Main bloger

VM の設定

「名前付きパイプ」を選択し、パイプ名を「COM1」に設定

Hyper-V Serial Settings

Ubuntu の設定

GRUB の設定

sudo nano /etc/default/grub で GRUB の設定ファイルを開き、

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0,115200n8"

に変更する。

保存後、

sudo update-grub

で GRUB の設定を適用する。

シリアルポートの有効化

シリアルポートでログインできるようにサービスを設定する。

sudo systemctl enable [email protected]
sudo systemctl start [email protected]

接続

管理者権限で起動する

Tera Term から接続

Connect Serial port of Ubuntu on Hyper-V from Tera Term

PuTTY から接続

管理者権限で起動する

Serial lineSpeedConnection type:
\.\pipe\COM1115200Serial

に設定。

Connect Serial port of Ubuntu on Hyper-V from PuTTy

Connect Serial port of Ubuntu on Hyper-V from PuTTy

管理者権限で起動する

Connect Serial port of Ubuntu on Hyper-V from plink.exe on WindowsTerminal

[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
plink.exe -serial \\.\pipe\COM1 -sercfg 115200,8,n,1,N

Ctrl + C で終了

VOICEVOX の API を観察してみる

· 約4分
ひかり
Main bloger

VOICEVOX はエディターとエンジンとコアで構成されているとあります。

参考: 全体構成

エディターがアプリで、エンジンが http サーバー、コアが音声合成の処理を行うモジュールになっているらしいです。

つまり、エディターがエンジンに対して REST API (以下 API) を叩いているというわけですね。

というわけで、その API の内容を観察してみようという記事になります。

API のキャプチャーには Wireshark を用いました。

起動時の通信

http and tcp.port == 50021 でフィルターをかけてみた結果が、こちら。

起動時には以下の情報を読み取っているようです。

  • バージョン情報 /version
  • エンジンのマニフェスト情報 /engine_manifest
  • スピーカー情報 /speakers (ずんだもんなどのキャラクターリスト)
  • シンガー情報 /singers (〃)

スピーカー・シンガー取得後は各キャラクターの情報をより詳細に取得しているようですね。(/speaker_info?speaker_uuid=xxx, /singer_info?speaker_uuid=xxx)

音声合成リクエスト時の通信

では実際にずんだもんで音声合成のリクエストを送って、API を覗いてみました。

以下のような流れで音声が取得されているみたいです。

  1. /accent_phrases でアクセントの情報
  2. /synthesis?speaker=3 でずんだもんの声を合成

(2.) で送っているリクエストボディの内容は、以下のように (1.) のレスポンスと似たようなものになっています。

したがって、(1.) でアクセントを取得し、(2.) でアクセントから音声を合成するという流れのようです。

実際に API を叩いてみる

httpie というツールを用いて API を叩きました。

  1. スピーカー情報を取得

ずんだもん (ノーマル) の id は 3 であることがわかりました。

  1. アクセント情報を取得

ずんだもんなのだ でアクセント情報を取得してみました。 (スピーカー情報と異なり、POST リクエストで取得)

  1. 音声合成

以下のようなリクエストボディーを作成します。

{
"accent_phrases": </accent_phrases で取得したデータ>,
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}

httpie では wav が扱えないようなので、PowerShell でリクエストを送ります。

# URLとJSONデータを定義
$url = 'http://localhost:50021/synthesis?speaker=3'
$jsonBody = @"
{
"accent_phrases": [
{
"moras": [
{
"text": "ズ",
"consonant": "z",
"consonant_length": 0.12722788751125336,
"vowel": "u",
"vowel_length": 0.11318323761224747,
"pitch": 5.773037910461426
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.09306197613477707,
"pitch": 6.108947277069092
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.04249810427427292,
"vowel": "a",
"vowel_length": 0.09372275322675705,
"pitch": 6.09743070602417
},
{
"text": "モ",
"consonant": "m",
"consonant_length": 0.07012023776769638,
"vowel": "o",
"vowel_length": 0.1172478124499321,
"pitch": 5.932623386383057
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.06496299058198929,
"pitch": 5.745952129364014
},
{
"text": "ナ",
"consonant": "n",
"consonant_length": 0.038462959229946136,
"vowel": "a",
"vowel_length": 0.08576127141714096,
"pitch": 5.5794854164123535
}
],
"accent": 1,
"pause_mora": null,
"is_interrogative": false
},
{
"moras": [
{
"text": "ノ",
"consonant": "n",
"consonant_length": 0.05504273623228073,
"vowel": "o",
"vowel_length": 0.0903041884303093,
"pitch": 5.551316261291504
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.05024997144937515,
"vowel": "a",
"vowel_length": 0.20450790226459503,
"pitch": 5.633930206298828
}
],
"accent": 2,
"pause_mora": null,
"is_interrogative": false
}
],
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}
"@

# HTTPヘッダーを作成
$headers = @{
'Content-Type' = 'application/json'
}

# POSTリクエストを送信し、レスポンスを取得
$response = Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $jsonBody -OutFile "output.wav"

# 開いて再生
start output.wav

VOICEVOX: ずんだもん

以上!

0.248 (16) を 10 進数の分数にする問題の簡単な解き方 (基本情報技術者試験)

· 約1分
ひかり
Main bloger

「16 進数の少数 0.248 を 10 進数の分数で表したものはどれか。」の問題について簡単に解く方法を紹介します。

ポイント

16 進数の問題は 2 進数を使う

手順

  1. 16 進数を 2 進数に変換
    0.248(16) = 0.0010 0100 1000(2)

  2. 小数点をなくす
    0.0010 0100 1000(2) = 0.0010 0100 1000(2) × 0010 0000 0000(2) / 0010 0000 0000(2) = 0100 1001(2) / 0010 0000 0000(2)

  3. 2 進数を 10 進数に変換
    0100 1001(2) / 0010 0000 0000(2) = (64 + 8 + 1) / 512
    = 73 / 512

Matplotlib (Pyplot) でよく使うコードの例

· 約6分
ひかり
Main bloger

よく使うものを例としてコードとグラフを紹介します。

目次

グラフを作成

まず使用するライブラリを読み込んでおきます。

import matplotlib.pyplot as plt
import numpy as np

1 つのグラフ

fig, ax = plt.subplots()

2 x 3 のグラフ

fig, axs = plt.subplots(2, 3)

グラフをプロット

放物線のプロット

x = np.linspace(-1, 1, 201)
y = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y)

点で放物線をプロット

fig, ax = plt.subplots()

x = np.linspace(-1, 1, 21)
y = x ** 2

ax.plot(x, y, 'o')

色をオレンジに

fig, ax = plt.subplots()

x = np.linspace(-1, 1, 21)
y = x ** 2

ax.plot(x, y, color="tab:orange")

標準の色は以下の通り

文字列
tab:blue
オレンジtab:orange
tab:green
tab:red
tab:purple
tab:brown
ピンクtab:pink
グレーtab:gray
オリーブtab:olive
シアンtab:cyan

線の太さを 4 に設定

fig, ax = plt.subplots()

x = np.linspace(-1, 1, 21)
y = x ** 2

ax.plot(x, y, lw=4)

タイトルの設定

タイトルを Title に設定

fig, ax = plt.subplots()
ax.set_title("Title")

軸ラベルの設定

x 軸ラベルの設定

x 軸ラベルを Time (s) に設定

fig, ax = plt.subplots()
ax.set_xlabel("Time (s)")

y 軸ラベルの設定

y 軸ラベルを Distance (m) に設定

fig, ax = plt.subplots()
ax.set_ylabel("Distance (m)")

グラフの上端・下端を設定

上端を 100 に設定

fig, ax = plt.subplots()
ax.set_ylim(top=100)

下端を -100 に設定

fig, ax = plt.subplots()
ax.set_ylim(bottom=-100)

上端を 100、下端を -100 に設定

fig, ax = plt.subplots()
ax.set_ylim([-100, 100])

グラフの左端・右端を設定

左端を -100 に設定

fig, ax = plt.subplots()
ax.set_xlim(left=-100)

右端を 100 に設定

fig, ax = plt.subplots()
ax.set_xlim(right=100)

左端を -100、右端を 100 に設定

fig, ax = plt.subplots()
ax.set_xlim([-100, 100])

グリッドの表示

fig, ax = plt.subplots()
ax.grid()

縦のみグリッドを表示

fig, ax = plt.subplots()
ax.grid(axis="x")

横のみグリッドを表示

fig, ax = plt.subplots()
ax.grid(axis="y")

目盛りの設定

x 軸目盛りの設定

fig, ax = plt.subplots()
xticks = range(6)
ax.set_xticks(xticks)

x 軸目盛と目盛りラベルの設定

fig, ax = plt.subplots()
xticks = range(6)
ax.set_xticks(xticks, [f"{xtick}m" for xtick in xticks])

y 軸目盛りの設定

fig, ax = plt.subplots()
yticks = [i * 20 for i in range(6)]
ax.set_yticks(yticks)

y 軸目盛りと目盛りラベルの設定

fig, ax = plt.subplots()
yticks = [i * 20 for i in range(6)]
ax.set_yticks(yticks, [f"{ytick}%" for ytick in yticks])

目盛りの削除

x 軸目盛りの削除

fig, ax = plt.subplots()
ax.tick_params(bottom=False)

x 軸目盛りラベルの削除

fig, ax = plt.subplots()
ax.tick_params(labelbottom=False)

y 軸目盛の削除

fig, ax = plt.subplots()
ax.tick_params(left=False)

y 軸目盛りラベルの削除

fig, ax = plt.subplots()
ax.tick_params(labelleft=False)

目盛りの色の設定

x 軸目盛りの色を赤に設定

fig, ax = plt.subplots()
ax.tick_params(axis="x", color="tab:red")

x 軸目盛りラベルの色を赤に設定

fig, ax = plt.subplots()
ax.tick_params(axis="x", labelcolor="tab:red")

y 軸目盛りの色を赤に設定

fig, ax = plt.subplots()
ax.tick_params(axis="y", color="tab:red")

y 軸目盛りラベルの色を赤に設定

fig, ax = plt.subplots()
ax.tick_params(axis="y", labelcolor="tab:red")

グラフの間隔を調整

縦の感覚を 0.2、横の間隔を 0.3 に設定

fig, ax = plt.subplots(3, 3)
fig.subplots_adjust(hspace=0.2, wspace=0.3)

%Cpu22 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

間隔を自動に設定

fig, ax = plt.subplots(3, 3)
fig.tight_layout()

画像を保存

PNG 形式で保存

fig, ax = plt.subplots()
plt.savefig("graph.png")

SVG 形式で保存

fig, ax = plt.subplots()
plt.savefig("svg.png")

PDF 形式で保存

fig, ax = plt.subplots()
plt.savefig("svg.pdf")

graph.pdf

300 dpi で保存

fig, ax = plt.subplots()
plt.savefig("graph300.png", dpi=300)

よく使う dotnet コマンドまとめ

· 約1分
ひかり
Main bloger
コマンド機能
dotnet new新しいプロジェクトを作成
dotnet addパッケージを追加
dotnet removeパッケージを削除
dotnet publishディレクトリにアプリを発行
dotnet runプロジェクトを実行
dotnet slnソリューションファイルを扱う

dotnet new

dotnet new wpf

dotnet add

dotnet add package Microsoft.Web.WebView2

dotnet remove

dotnet remove package Microsoft.Web.WebView2