備忘録

備忘録

Laravelでコマンドを実行する方法

Ⅰ. はじめに

タイトルの通り「Laravelでコマンドを実行する方法」です。

Ⅱ. 手順

1. プロジェクトを新規作成する
composer create-project laravel/laravel TestProject --prefer-dist
2. コマンドを作成する
php artisan make:command SayHello
3. サンプルプログラムを書く

TestProject/app/Console/Commands/SayHello.php

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class SayHello extends Command {
  protected $signature = 'say:hello {name}';
  protected $description = 'Say hello to user';

  public function __construct() { parent::__construct(); }

  public function handle() {
    $name = $this->argument('name');
    // Log::debug("Hello {$name}");
    echo("Hello {$name}");
    return 0;
  }
}

実行結果

$ php artisan say:hello tanaka
Hello tanaka

その他

タスクスケジュール実行する方法

FAQ

Q. 以下のようなエラーが表示されます
The stream or file "/var/www/laravel/storage/logs/laravel-2022-01-01.log" could not be opened: failed to open stream: Permission denied

A. cronの実行権限を適切に設定する必要があります
例. www-dataとして実行する

* * * * * cd /var/www/html/MyWebSite/ && su -c "php artisan schedule:run >> /dev/null 2>&1" -s /bin/sh www-data

OpenSSLのセキュリティレベルを変更する方法

Ⅰ. はじめに

タイトルの通り「OpenSSLのセキュリティレベルを変更する方法」です。

以下のようなエラーが出力された場合に本記事内容を実行すると解決します。

cURL error 35: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
58: could not load PEM client certificate,
OpenSSL error error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak,
(no key found, wrong pass phrase, or wrong file format?)

(証明書の署名アルゴリズムを変更する事も検討すべきです)

Ⅱ. 手順

1. openssl.cnfを編集する
vim /etc/ssl/openssl.cnf
# 一行目に以下を追加
openssl_conf = openssl_init

# ファイル末尾に以下を追加
[openssl_init]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT@SECLEVEL=1
2. OSを再起動する
reboot -f

systemdを利用して一定時間ごとに任意のコマンドを実行する方法

Ⅰ. はじめに

タイトルの通り「systemdを利用して一定時間ごとに任意のコマンドを実行する方法」です。

Ⅱ. やり方

1. 一時的なスケジュールを作成する
# 「『5秒ごとに"echo hello"を実行するスケジュール』を『1秒後に開始する』」スケジュールを作成する
# タイマー精度100ms
systemd-run --unit=Hello --on-active=1s --on-unit-active=5s --timer-property=AccuracySec=100ms echo hello
2. 作成されたか確認する
systemctl list-timers
3. ログを確認する
journalctl -fu Hello
4. 一時的なスケジュールを削除する
systemctl stop Hello.timer

実行結果

$ journalctl -fu Hello
Dec 13 10:16:03 localhost systemd[1]: Started /usr/bin/echo hello.
Dec 13 10:16:03 localhost echo[1069]: hello
Dec 13 10:16:03 localhost systemd[1]: Hello.service: Succeeded.
Dec 13 10:16:08 localhost systemd[1]: Started /usr/bin/echo hello.
Dec 13 10:16:08 localhost echo[1080]: hello
Dec 13 10:16:08 localhost systemd[1]: Hello.service: Succeeded.
Dec 13 10:16:13 localhost systemd[1]: Started /usr/bin/echo hello.
Dec 13 10:16:13 localhost echo[1092]: hello
Dec 13 10:16:13 localhost systemd[1]: Hello.service: Succeeded.

留意点

OSを再起動すると一時的なスケジュールが削除されます
恒久的な方法はこちら

CPU使用率メモリ使用量を制限してコマンドを実行する方法

Ⅰ. はじめに

タイトルの通り「CPU使用率メモリ使用率を制限してコマンドを実行する方法」です。

Ⅱ. やり方

# CPU使用率制限
systemd-run --user --wait -p CPUQuota=30% stress --cpu 1 --timeout 10s

# メモリ使用量制限
systemd-run --user --wait -p MemoryLimit=4G YOUR_COMMAND

実行結果

stressコマンドは本来CPU使用率が100%になるが約30%に収まっている。
f:id:kagasu:20211213185551p:plain

Webページの特定要素を画像として保存する方法

Ⅰ. はじめに

タイトルの通り「Webページの特定要素を画像として保存する方法」です。

方法

1. サンプルプログラムを書く

index.html

<!DOCTYPE html>
<html>
  <body>
    <button onClick="saveImage()">画像保存</button>

    <div id="test">
      <h1>Hello world!</h1>
      <table>
        <tr><td>a</td><td>b</td></tr>
        <tr><td>c</td><td>d</td></tr>
      </table>
    </div>

    <script>
      function saveImage() {
        // html2canvas(document.body).then(canvas => {
        html2canvas(document.querySelector("#test"), {
          logging: false
        }).then(canvas => { 
          const element = document.createElement('a')
          element.href = canvas.toDataURL()
          element.download = 'out.png'
          element.click()
        })
      }
    </script>

    <script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
  </body>
</html>

実行結果

out.png
f:id:kagasu:20211213180127p:plain