怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

Canvas 要素のレスポンシブ対応

Canvas 要素の表示サイズは width 属性と height 属性に固定値を設定するため、そのままではレスポンシブ対応できない。

CSSwidthheight を指定しても、表示サイズに対する相対サイズで拡大/縮小されるだけで期待したとおりには動かない。

代わりに padding-top を使ってレスポンシブ対応してみる。

サンプル

次の HTML は Canvas 要素をレスポンシブ表示する。

ブラウザのウインドウ幅に合わせて、Canvas 要素も比率を保ったまま拡大/縮小される。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Canvas 要素のレスポンシブ対応</title>
</head>
<body>
  <div style="position: relative; padding-top: 56.25%;">
    <canvas width="640" height="360" style="position: absolute; top: 0; left: 0; width: 100%; height: auto; border: 1px solid red;"></canvas>
  </div>
  <script>
    document.addEventListener('DOMContentLoaded', function () {
      var canvas = document.querySelector('canvas');
      if (canvas.getContext) {
        var ctx = canvas.getContext('2d');
        ctx.fillRect(25, 25, 100,100);
      }
    });
  </script>
</body>
</html>

ポイント

まずは Canvas 要素の親要素に次のスタイルを設定する。

<div style="position: relative; padding-top: 56.25%;">

padding-top には、Canvas 要素の面積比を設定する。

今回は Canvas 要素の表示サイズを 640 × 360 (アスペクト比 16:9)とするため、その面積比である 56.25% を指定している。

もしアスペクト比が 4:3 なら 75% を、3:2 なら 66.66667% を設定する。

それ以外のアスペクト比なら、後述の式を使って計算で求めた比率を設定すればよい。


続けて Canvas 要素のスタイルを設定する。

<canvas width="640" height="360" style="position: absolute; top: 0; left: 0; width: 100%; height: auto; border: 1px solid red;"></canvas>

属性の widthheight には表示する内容の幅と高さを設定する。
(省略した場合、既定値の幅 300px、高さ 150px が設定される)

style 属性の position: absolute; top: 0; left: 0; により、親要素の左上と同じ位置に Canvas 要素が配置される。

同じく style 属性の width: 100%; height: auto; により、幅に合わせて高さが可変となる。

なお、サンプルでは border スタイルも設定しているが、これは確認しやすくする用途なので実際には指定しなくてよい。

面積比の求め方

padding-top に設定する面積比を計算で求める場合、次の計算式を使う。

面積比 = (高さ÷幅)×100

例1: 16:9 の面積比を求める

(9 ÷ 16) × 100 = 
0.5625 × 100 = 
56.25

例2: 幅 800px、高さ 581px の面積比を求める

(581 ÷ 800) × 100 =
0.72625 × 100 =
72.625

華よい

華よい 葡萄スパークリング

一言説明

ぶどうの芳醇で爽やかな果実味。
旬摘みぶどう果汁に、ぶどう果実の味わいがしみ込んだお酒を効かせて仕上げました。

栄養成分表示 (1缶あたり)

エネルギー133
たんぱく質0
脂質0
炭水化物17.5
糖質
食物繊維
塩分相当量0.175~0.35
アルコール度数 (量)3 (8.4)
プリン体

華よい 檸檬スパークリング

一言説明

レモンのほろ苦みが効いた豊かな果汁感。
まる搾りレモン果汁に、レモン果実の味わいがしみ込んだお酒を効かせて仕上げました。

栄養成分表示 (1缶あたり)

エネルギー126
たんぱく質0
脂質0
炭水化物15.4
糖質
食物繊維
塩分相当量0.21~0.385
アルコール度数 (量)3 (8.4)
プリン体

華よい 白桃スパークリング

一言説明

ももの華やかな香りと爽やかな果実味。
手摘み白桃果汁に、もも果実の味わいがしみ込んだお酒を効かせて仕上げました。

栄養成分表示 (1缶あたり)

エネルギー126
たんぱく質0
脂質0
炭水化物15.75
糖質
食物繊維
塩分相当量0.21~0.35
アルコール度数 (量)3 (8.4)
プリン体

アサヒ ザ・マスター

一言説明

本場ドイツの味わい深く、薫り高い味が楽しめるビール。
ドイツのビール醸造学の「マスター」が監修した。

栄養成分表示 (1缶あたり)

エネルギー164.5
たんぱく質1.05~2.45
脂質0
炭水化物11.55
糖質11.55
食物繊維0~1.05
塩分相当量0~0.105
アルコール度数 (量)5.5 (15.4)
プリン体

ワールドクラフト

ワールドクラフト<モルト香る>メルツェン

一言説明

オクトーバーフェストで飲まれるドイツ発祥のラガータイプのビール。
まろやかで甘みのあるモルトの味わいと、心地良い余韻が特長。

栄養成分表示 (1缶あたり)

エネルギー164.5
たんぱく質1.4~2.45
脂質0
炭水化物12.95
糖質12.6
食物繊維0~0.7
塩分相当量0~0.07
アルコール度数 (量)5.5 (15.4)
プリン体

csh - 常駐シェルスクリプト

特定の処理を監視するため、シェルスクリプトを常駐させることになった。

常駐処理は無限ループと待機の組み合わせで実現できる。

まず while コマンドに真(0 以外)を指定して無限ループにする。
ループ内に常駐処理を書く。
その処理が終わったら sleep コマンドで一定時間待機する。

これでスクリプトを終わらせない限り、一定時間毎に処理させるようにできる。




サンプル

次のシェルスクリプトは、5分毎に処理を実行する。

#!/bin/csh

while (1)
    # 処理実行
    # TODO: ここにループで実行する処理を書く

    # 5分待機
    sleep 300
end



常駐シェルスクリプトの止め方

常駐シェルスクリプトは明示的に処理を止めるまでずっと動き続ける。

シェルスクリプトを停止するには、kill コマンドでプロセスを終了させる。

まずは ps コマンドで PID を取得する。
ps コマンドには -o オプションで表示形式を指定しておいたほうが見やすい。
プロセスID、コマンド、引数を出力 → ps -o pid,comm,args

それから kill -KILL 〈PID〉 でプロセスを終わらせる。

csh - ユーザー入力を読み取る

標準入力からの取得

標準入力を読み取るには $< を使う。

次の例は、ユーザー入力をシェル変数 val に格納し、その内容を出力する。

set val = $<
echo "Entered value: ${val}"

次のスクリプトは、ユーザー入力によって実行する処理を変える例である。

1 が入力されたら処理Aを、2 が入力されたら処理Bを、E が入力されたら処理を終える。

#!/bin/csh
top:
echo -n "1:処理A実行、2:処理B実行、E:終了 ? "
set mode = $<
if (${mode} == '1') then
    # ~~~処理Aのロジック~~~
endif
if (${mode} == '2') then
    # ~~~処理Bのロジック~~~
endif
if (${mode} == 'E') then
    # ~~~終了処理 ~~~
    exit
endif
# 未定義の値が入力されたらもう一度入力させる
echo '入力された選択肢は存在しません。再入力してください。'
goto top



ファイルを読み取る

< を使う。

command < filename

csh - ファイルのタイムスタンプの参照

ファイルのタイムスタンプは ls コマンド、または stat コマンドで参照できる。




ls コマンドでタイムスタンプを参照する

どのタイムスタンプを参照するかオプションで指定する。

-l: 最終変更日時

$ ls -l test.txt
-rw-rw-r--   1 test1    tstgrp     41701  4月  7日 2021年 test.txt

-u: 最終アクセス日時

$ ls -lu test.txt
-rw-rw-r--   1 test1    tstgrp     41701  8月  1日  13:15 test.txt

-c: 作成日時または最終ステータス変更日時(inode 情報の最終変更日時)

$ ls -lc test.txt
-rw-rw-r--   1 test1    tstgrp     41701  5月 11日 2023年 test.txt



stat コマンドでタイムスタンプを参照する

stat コマンドはファイルの情報を表示する。

次のイメージで表示され、その情報の中にタイムスタンプも含まれる。

$ stat test.txt
  File: test.txt
  Size: 41701           Blocks: 82         IO Block: 8192   通常ファイル
Device: e300000038h/123456789024d       Inode: 12345       Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  243/   test1)   Gid: (  202/  tstgrp)
Access: 2024-08-01 13:15:38.269705000 +0900
Modify: 2021-04-07 16:08:22.094390000 +0900
Change: 2023-05-11 16:07:02.821499000 +0900
 Birth: -

タイムスタンプに関連する表示は以下のとおり。

  • Access
    最終アクセス日時

  • Modify
    最終変更日時

  • Change
    最終ステータス変更日時(inode 情報の最終変更日時)

  • Birth
    作成日時。
    必ずしも表示されるわけではないので留意すること。
    例の場合は - が出ているので「不明」ということらしい。