お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
OS::Windows技術::RDP

Windows標準のリモートデスクトップを使うケース

確認環境

Env Ver
Windows 10 Pro 19042.985

やり方

  1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersにDWORDでDisableTaskOffloadを切り、1を設定してOSを再起動
  2. 適当な音声を再生し、停止したときに遅延がなければOK

備考

  • DiscordやSlackがホストかクライアントでマイクをlistenしてると遅延が起きることがあるので切っておくと安定することがある
  • 数時間起動してると徐々にずれてくるので、その場合は手間になるが定期的にRDPを繋ぎ直すと良い
  • ZOOMなどの通話をする手前で繋ぎ直すと有効だが、通話が長時間に渡ると微妙になる
投稿日:
言語::Perl技術::sendmail

文字コードはiso-2022-jp

SMTPの設定例

export EMAIL_SENDER_TRANSPORT=SMTP
export EMAIL_SENDER_TRANSPORT_host=smtp.example.com
export EMAIL_SENDER_TRANSPORT_port=1025

サンプルコード

use strict;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);

my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'さぶじぇくと');
my $mail    = Email::MIME->create(
    'header' => [
        'From'    => Encode::encode('MIME-Header-ISO_2022_JP', 'foo@example.com'),
        'To'      => Encode::encode('MIME-Header-ISO_2022_JP', 'to@example.com'),
        'Subject' => $subject,
    ],
    'attributes' => {
        'content_type' => 'text/plain',
        'charset'      => 'ISO-2022-JP',
        'encoding'     => '7bit',
    },
    'body' => Encode::encode('iso-2022-jp', 'ほんぶん!'),
);
投稿日:
言語::PHP技術::CGI

ふとした気づき

今時CGIなんて言わない?知らない?そんなこたぁいいんですよ。
ふと思ったんですよ、CGIとCLIアプリって本質的に同じものなんじゃないかなって。
だってPHPってこんなふうに書いてブラウザでアクセスしたらいろはにほへとって出るじゃないですか?
そしてこれをphp index.phpみたいにして叩いてもいろはにほへとって出ますよね?

<?php

echo 'いろはにほへと';

そう、気付いてしまったのです。
実はCGIって本質的にはCLIアプリなのではないかと…。
むしろ何が違うんでしょう?

仕組みを調べてみることに

気になったのでどういう仕組で動いてるのか軽く調べるために、敢えてC言語でCGIを作ってみることに。
今までC言語でCGIとか狂人のやることって印象があったのですが、意外とやってみると大したことはないというか、まぁ大したものを作ってないから当たり前なんですが…。
これが何をしているかというと、環境変数を取ってきて標準出力に吐いてるだけなので、どっからどう見てもCLIアプリです。

#include <stdio.h>
// getenv
#include <stdlib.h>
// strcmp
#include <string.h>

/*
    get path for after hostname
*/
char* getPath(void) {
    char *path = getenv("REQUEST_URI");

    return path;
}

int main(void) {
    // put http header
    printf("Content-type: text/plain\n\n");
    char *path = getPath();

    // show current path
    printf("Current path: %s\n", path);
    // routing, required .htaccess to serve on apache
    if (strcmp(path, "/foo") == 0) {
        printf("hoge");
    } else if (strcmp(path, "/bar") == 0) {
        printf("piyo");
    } else {
        printf("fuga");
    }

    return 0;
}

実際に動かしてみたところ

CGIとして

image-1656167307118.png

image-1656167357025.png

CLI として

image-1656167365550.png

辿り着いた結論

恐らくこれは動作環境が重要なのであって、多分CGIとCLIアプリの作りとしては大きな違いはないのではないか?というのが辿り着いた結論です。
いやまぁ引数をargvから取るか環境変数から取るかは結構違う気もしますが、基本的に表示したいものを標準出力に吐く点は同じですし、別にCGIでTCPソケットを触るわけでもないので、同じようなものでは?と思った次第。
これは多分、 HTTPサーバーを通すことで標準出力がHTTPレスポンスに出力され、 Xサーバーを通すなら画面に、プリンタサーバーを通せば紙にといった具合に、どこのサーバーを通して標準出力をするかで出てくるところが変わるのでは?と感じました。(細かいことを言うともっと複雑らしい)
多分ApacheとかのHTTPサーバーはTCPソケットをいい感じにやってくれて、 HTTPヘッダを環境変数に入れてCGIスクリプトを起動といったところをしてくれているのではないかと思ったので、暇な時にTCP通信から始めるHTTPサーバーの実装でもやってみたいところですね…。

おまけ

取り敢えずPHPのCGIをCLIとして動かせるやつです。

<?php

echo $_SERVER['REQUEST_URI'];

確認環境

Windows

あらかじめgpgのパスをPATHに通しておくと良い
参考値:C:\Program Files (x86)\GnuPG\bin

Env Ver
Windows 10 Pro Build 19042.804
git 2.30.0.windows.1
VSCode 1.53.2
Kleopatra Gpg4win-3.1.15

Linux

Windows側からVSCodeのRemote - SSHで接続

Env Ver
Ubuntu Desktop 20.04.2
git 2.25.1
gpg 2.2.19

手順

Windows

  1. Kleopatoraを起動
  2. ファイル> New Pair Key
  3. 個人用のOpenPGP鍵ペアを生成
    1. 期限なし、パスフレーズは適当に
  4. Exportから -----BEGIN PGP PUBLIC KEY BLOCK----- の中身を全部GitHubの GPG keys/ Add new に貼り付ける
  5. 追加後にでてきた Key IDgit config --global user.signingkey KeyID として cmd に流す
  6. 以下を流す(gpg.program はなくても動くが、あったほうが問題が起きない)
    ```bat
    git config --global commit.gpgsign true
    git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
    ```
  7. 管理者権限で cmd を起動し次のシンボリックリンクを作成
    1. mklink /D %USERPROFILE%.gnupg %AppData%\GnuPG
  8. VSCodeで適当なリポジトリを作成
  9. なんか適当にコミットする
  10. GitHubに投げる
  11. GitHubのコミット履歴にverified signatureがついてたら成功

Linux

  1. Windows側のKleopatoraから公開鍵と秘密鍵をエクスポートして持ってくる
  2. gpg --import FooBarpublic.asc で公開鍵をインポート
  3. gpg -k でインポートされていることを確認し、下記XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX相当の部分をコピペ
pub rsa3072 2021-01-17 [SC]
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid [ 不明 ] Foo Bar <foobar@example.com>
sub rsa3072 2021-01-17 [E]
  1. gpg --edit-key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. trust
  3. 5を選ぶ
  4. quit
  5. gpg -kで信用度が[ 究極 ]になっていることを確認
  6. gpg --import FooBarSECRET.ascで秘密鍵をインポート
    1. SSHで繋いでいる時でタイムアウトする場合、GUIプロンプトからの入力になっている可能性があるので、どうにかして入力
    2. XRDP経由ならpkill gnome-sessionを叩くと入れる
  7. Windowsの時と同様に次のコマンドを流す
    1. git config --global user.signingkey KeyID
    2. git config --global commit.gpgsign true
  8. VSCodeで適当なリポジトリを作成
  9. 何か適当にコミットする
    1. コミットがコケたらXRDPから入力する
  10. GitHubに投げる
  11. GitHubのコミット履歴にverified signatureがついてたら成功
CLIからやる場合でパスフレーズを何度も打ちたくないケース

以下の手順が参考になる

WSL2のUbuntuでGPGキーのパスフレーズを記憶させる

トラブルシュート

Key IDを確認したい

以下のコマンドで確認可能

gpg --list-signatures

GPGキーを消したい

GPGキーの消し方

投稿日:
技術::ffmpegネットワーク::RTP

概要

Windows 10でffmpegを使ってWebCamの内容をRTPで送受信する事について調べたので、そのログ

送信するフォーマットはH.264, G.711

ffmpeg4.1を使用

基本

  • ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url}
    • -i の前にあるものがglobal_options
      • input_file_optionsも -i の手前にある
    • -i で入力を指定
      • ファイルパスやURL、デバイスIDなどを指定できる
      • https://www.ffmpeg.org/ffmpeg.html#Main-options
    • input_urlの後ろにあるものが出力
      • 但し解釈不能なコマンドはすべて出力として扱われる
      • https://ffmpeg.org/ffmpeg-all.html#Description

結論

動作確認はしてないので注意

  • 送信側
    • ffmpeg -re -f dshow -i video="Hoge_Camera":audio="Hoge_MIC" -r 30 -c:v libx264 -an -f rtp rtp://224.0.0.255:1234 -c:a pcm_mulaw -vn -f rtp rtp://224.0.0.255:1235 -sdp_file stream.sdp
  • 受信側
    • ffplay -protocol_whitelist "file,udp,rtp" stream.sdp
      • ffplayをffmpegに変えてI/O出来るようにしてやるとファイルに落としたり再送したりできる

各オプションについて

  • -re
    • 本来のフレームレートで読み込む。指定しない場合は早送りになる?
    • ストリーミングを流したりするときに利用する、エンコードで使うと遅くなりそう
    • https://ffmpeg.org/ffmpeg.html#Advanced-options
  • -y
    • 出力ファイルの上書きを確認しない
    • https://www.ffmpeg.org/ffmpeg.html#Main-options
  • -f
    • I/Oフォーマットの指定
    • ffmpegは自動でフォーマットを検出する機能を持つが、それを無視する場合に使用する
    • https://ffmpeg.org/ffmpeg.html#Main-options
    • dshow
      • DirectShowデバイスを指定
      • https://www.ffmpeg.org/ffmpeg-devices.html#dshow
      • https://trac.ffmpeg.org/wiki/DirectShow
      • DirectShowデバイスの一覧
        • ffmpeg -list_devices true -f dshow -i dummy
          • https://www.ffmpeg.org/ffmpeg-devices.html#Examples-2
      • 入力デバイスの指定
        • TYPE=NAME[:TYPE=NAME]
        • http://ffmpeg.org/ffmpeg-devices.html#dshow
    • rtp
      • RTPを指定
  • -formats
    • -f オプションで指定できるフォーマットの一覧を表示
    • https://www.ffmpeg.org/ffmpeg.html#Generic-options
  • -r
    • フレームレートの設定
    • https://www.ffmpeg.org/ffmpeg.html#Video-Options
  • -c[:stream_specifier]
    • ストリームに対してコーデックを指定する
    • 例外的に -c copy はコーデックコピーとなる
    • https://www.ffmpeg.org/ffmpeg.html#Main-options
    • -c:v で動画の -c:a で音声のコーデックを指定できる
  • stream_specifier
    • 各種オプションで利用するストリーム識別子
    • 雑に書くと v が映像、a が音声
    • http://ffmpeg.org/ffmpeg.html#Stream-specifiers-1
  • -decoders
    • 利用可能なデコーダーの一覧
    • https://www.ffmpeg.org/ffmpeg.html#Generic-options
  • -an
    • 音声ストリームをブロックする
    • https://www.ffmpeg.org/ffmpeg.html#Audio-Options
    • 動画ストリームを切り出すのに利用
  • -vn
    • 動画ストリームをブロックする
    • https://www.ffmpeg.org/ffmpeg.html#Video-Options
    • 音声ストリームを切り出すのに利用
  • -sdp_file
    • SDPファイルを出力する
    • https://www.ffmpeg.org/ffmpeg.html#Advanced-options
    • -y オプションの有無に関わらず上書きされる
  • -protocol_whitelist "tcp, udp, ..."
    • カンマ区切りでプロトコルを指定することで、プロトコルを利用できるようになる
    • https://ffmpeg.org/ffmpeg-protocols.html#Protocol-Options
    • SDPファイルを用いてRTPストリームを受ける場合には "file,udp,rtp" を指定する
      • file
        • ローカルファイルへのアクセスプロトコル
        • https://ffmpeg.org/ffmpeg-protocols.html#file
      • udp
        • UDP
        • https://ffmpeg.org/ffmpeg-protocols.html#udp
      • rtp
        • RTP
        • https://ffmpeg.org/ffmpeg-protocols.html#rtp
      • なんでfileがいるのかは正直良くわかってない