- 投稿日:
Windows標準のリモートデスクトップを使うケース
確認環境
Env | Ver |
---|---|
Windows 10 Pro | 19042.985 |
やり方
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
にDWORDでDisableTaskOffload
を切り、1
を設定してOSを再起動- 適当な音声を再生し、停止したときに遅延がなければOK
備考
- DiscordやSlackがホストかクライアントでマイクをlistenしてると遅延が起きることがあるので切っておくと安定することがある
- 数時間起動してると徐々にずれてくるので、その場合は手間になるが定期的にRDPを繋ぎ直すと良い
- ZOOMなどの通話をする手前で繋ぎ直すと有効だが、通話が長時間に渡ると微妙になる
- 投稿日:
文字コードは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', 'ほんぶん!'),
);
- 投稿日:
ふとした気づき
今時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として


CLI として

辿り着いた結論
恐らくこれは動作環境が重要なのであって、多分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
- Kleopatoraを起動
- ファイル> New Pair Key
- 個人用のOpenPGP鍵ペアを生成
- 期限なし、パスフレーズは適当に
- Exportから
-----BEGIN PGP PUBLIC KEY BLOCK-----
の中身を全部GitHubのGPG keys/ Add new
に貼り付ける - 追加後にでてきた
Key ID
をgit config --global user.signingkey KeyID
としてcmd
に流す - 以下を流す(
gpg.program
はなくても動くが、あったほうが問題が起きない)
```bat
git config --global commit.gpgsign true
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
``` - 管理者権限で
cmd
を起動し次のシンボリックリンクを作成mklink /D %USERPROFILE%.gnupg %AppData%\GnuPG
- VSCodeで適当なリポジトリを作成
- なんか適当にコミットする
- GitHubに投げる
- GitHubのコミット履歴にverified signatureがついてたら成功
Linux
- Windows側のKleopatoraから公開鍵と秘密鍵をエクスポートして持ってくる
gpg --import FooBarpublic.asc
で公開鍵をインポートgpg -k
でインポートされていることを確認し、下記XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
相当の部分をコピペ
pub rsa3072 2021-01-17 [SC]
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid [ 不明 ] Foo Bar <foobar@example.com>
sub rsa3072 2021-01-17 [E]
gpg --edit-key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
trust
5
を選ぶquit
gpg -k
で信用度が[ 究極 ]
になっていることを確認gpg --import FooBarSECRET.asc
で秘密鍵をインポート- SSHで繋いでいる時でタイムアウトする場合、GUIプロンプトからの入力になっている可能性があるので、どうにかして入力
- XRDP経由なら
pkill gnome-session
を叩くと入れる
- Windowsの時と同様に次のコマンドを流す
git config --global user.signingkey KeyID
git config --global commit.gpgsign true
- VSCodeで適当なリポジトリを作成
- 何か適当にコミットする
- コミットがコケたらXRDPから入力する
- GitHubに投げる
- GitHubのコミット履歴にverified signatureがついてたら成功
CLIからやる場合でパスフレーズを何度も打ちたくないケース
以下の手順が参考になる
トラブルシュート
Key ID
を確認したい
以下のコマンドで確認可能
gpg --list-signatures
GPGキーを消したい
- 投稿日:
概要
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
の手前にある
- input_file_optionsも
-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がいるのかは正直良くわかってない
- file