未分類

今朝未明、AM03:00以降、何かありましたか?

に早速、読者の方からご連絡を頂けました。

本件、「江端ファイアウォール」に抵触しないと判断させて頂き、かつ、多くの方にも有用と判断致しましたので、そのまま転載させて頂きます。

(独自判断ですので、もし、抵触したと判断された場合は、深くお詫び申し上げた上で、本文を削除させて頂きます)

江端様
 
お世話になっております。
いつも楽しく江端様のブログを拝見しているいちファンです。
 
掲題ブログの件で何かの参考になればと思い、コメントさせていただきます。
 
私の所属する部署でも、2024/08/14 03:07にある夜間バッチ処理中に

WindowsUpdateによるサーバ再起動が実施され、同バッチ処理が中断して、トラブル対応する羽目になったという報告がありました。

 
対処した内容としては、以下の通りとの報告でした。
(自分で検証しておりませんので、その点はご了承くださいませ)

恒久対応としてAP・DBサーバ共に以下のグループポリシーを設定。
<設定内容>
自動更新の構成
変更前:「更新プログラムを自動的にインストールする」
※厳密には「未構成」でしたので、OSデフォルトの動作。

変更後:「自動ダウンロードとインストールを通知」
※インストールと再起動を自動実行しない構成に変更。

早速の情報のご提供と対策をご教示頂きまして、誠にありがとうございました。

今後とも、ご無理のない範囲で、ご支援頂けましたら幸甚と存じます。

-----

それにしても、「問答無用の再起動」は、やめて欲しいなぁ。

タスク見て、なんか変なプログラム(私のような24時間越えのシミュレーション)とかが走っていたら、思い留まる、とかの配慮の機能を入れて欲しい。

でも、最近の私は、マイクロソフト社を悪しざまに言うのは控えています。

『マイクロソフト社』を祭っている国内の宗教法人の神社をご存知の方がいらっしゃたら、教えて下さい。

ええ、もう、『Windows様あってこその私の人生です』。

もちろん、本気でそう思っていますよ。

-----

で、早速やってみました。

手順 1: グループポリシー管理ツールを開く

  1. 「スタート」メニューを開きます。
  2. 「検索」ボックスに「gpedit.msc」と入力し、Enterキーを押します。
    • これは「ローカル グループ ポリシー エディター」を開くコマンドです。

手順 2: 自動更新の設定を見つける

  1. 「ローカル グループ ポリシー エディター」で、以下の順に展開します:
    • 「コンピューターの構成」
    • 「管理用テンプレート」
    • 「Windows コンポーネント」
    • 「Windows Update」
    • 「エンドユーザエクスペリエンスの管理」(を選ぶ必要がある場合もあるみたい)
  2. 「Windows Update」を選択すると、右側のパネルに関連する設定項目が表示されます。

手順 3: 自動更新の構成を変更する

  1. 右側のパネルから「自動更新の構成」をダブルクリックします。

  2. 「自動更新の構成」ウィンドウが開いたら、以下の設定を行います:
    • 有効」を選択します。

    • オプションセクションで「2 - ダウンロードおよびインストールを通知」を選択します。

      (有効になっていなかっただけで、こっちはそのままでO.K.)

      • この設定により、更新プログラムは自動的にダウンロードされますが、インストールと再起動は通知され、手動で行うことになります。

手順 4: 設定を保存して終了する

  1. 「OK」ボタンをクリックして設定を保存します。
  2. 「ローカル グループ ポリシー エディター」を閉じます。

手順 5: ポリシーの適用を確認する

  1. 設定が正しく適用されていることを確認するために、コマンドプロンプトを管理者として開きます。
  2. gpupdate /force コマンドを実行して、グループポリシーを即時に適用します。

比較的簡単にできました。

以上

未分類

昨日の昼過ぎから走らせていたシミュレーションのロングランが止まっていました。

正確には、現在、3台のPC(シミュレータ本体用PCと、2台のDB用PC)が、全部ログイン状態に戻っていて、昨日からのシミュレーション結果が、全部パーになりました。

現状、ソースファイル等には影響はないようですが(一応、寝る前にコードのフルバックアップはしているので、そこも大丈夫かと)

昨夜、勝手にWindows Updateが走ったという公算が高いのですが、そのような場合、事前通知(あるいはスタートメニューに表示)がされるものです。

『2台同時に』というのが、どうにもひっかかっています。

どなたか、本日未明から、現時点までの間に、"Windows Update"、"瞬電"、"その他"なんでも結構ですので、気がつかれた方で、かつ、私の為に時間を割て頂ける親切な方がいらっしゃったら、数行で結構ですので御一報頂けましたら幸いと存じます

よろしくお願い致します。

江端

未分類

コホート分析について調べていたのですが、チームから『良く分からん』と言われました(遠回しに)。

で、実際に、私自身も「よく分からんなぁ」と、困っていたのですが、以前この言葉を、何度も書いていたことを思い出しました。

で、昔、執筆したコラムを読み直して、思い出してきました。

我が国に新型コロナウィルスが上陸した当初、日本中でマスク有用/無用について論争が発生し、マスクの奪い合いが発生していました。

今は、WHOおよび各国政府が、感染症に対するマスクの有効性を宣言して、各種の研究や統計結果からも、マスクの有効性はもはや疑う余地はありませんが ―― あの当時は、本当に大変でした。

ダイヤモンド・プリンセス号集団感染という、人類史上例を見ない完全な"コホート"によって、これらの結果が得られたのですが ――

少なくとも「コホート」に関しては、私は、他の人に語るべき義務のある人間の一人でなければならないはずです。

そう思うと、『これは恥じ入るべきことだ』と落ち込んでいます。

 

未分類

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

未分類

今朝(深夜)にChatGPTと議論してグタグタな内容になっていました。

「アルジャーノンに花束を」について、以前から気になっていたことをChatGPTに質問してみた件

で、今朝、頭を整理して質問を完結に纏めました。(因みにLatexが面倒になったので、ChatGPTの回答のハードコピーを貼りつけるだけにしました(私が分かればいいので))。

ChatGPTの価値は、「回答」ではなく、「回答に至るプロセスで考えを纏めることができる」だなぁ、と実感しています。

ダニエルキイスの「アルジャーノンに花束を」に登場する、主人公の結論「人為的に誘発された知能は、その増大量に比例する速度で低下する」を以下の2つのケースで、それぞれ微分方程式で示して下さい

(1)人為的に誘発された知能が、時刻t=0において定数として与えられる場合
(2)人為的に誘発された知能が、時刻t=0から段階的に定量的(線形)に与え続けられる場合

ただし、t=∞において、知能は、人為的に誘発される前の知能に戻る、として下さい。

 

やっと、私の頭の中でイメージできる数式(一般解)が出てきました。ChatGPT様々です。

特に最後の式は、『人為的に知能を誘発する技術や薬剤の処方をし続けたとしても、いつかは必ず知能が元のレベルに戻る』という(物語の中の)現実を示す式として現われています(微分方程式の条件として加えているので当然だけど)。

『人為的に誘発された知性』によって、この式を導出してしまった主人公の絶望感に、深く共感できてしまいました。

後日、エクセルかGnuplotで、この「アルジャーノン=ゴードン効果」をグラフで示してみたいと思います。

-----

ちなみに、私、こちらのコラムの最初のページで、『有用性の観点で言えば、三角関数より微分方程式の方が、はるかに役に立つ』という論旨を展開しています。

ただ、問題は、『微分方程式の一般解を導く為には、三角関数が必要となる(今回のケースでは指数関数だけで済みましたが)』という点が、やっかいなのです。

って、たった今気がついたのですが、石丸さんって「あの石丸さん」?

ちょっとビックリしています。

未分類

太字が江端の質問です(Latexが上手く表示できませんが、後日何とかします)

Latex表示のテスト(ここから)

[math jax] $$ e = \lim_{n \to +\infty} \biggl( 1+\frac{1}{n} \biggl)^{n} $$

$$ e = \lim_{n \to +\infty} \biggl( 1+\frac{1}{n} \biggl)^{n} $$

Latex表示のテスト(ここまで)

アルジャーノンに花束に、「人為的に生成された知能は、その生成された量に比例して減少する」というようなセリフがありました。正確なセリフを教えて下さい。

ChatGPT

「アルジャーノンに花束を」(原題:Flowers for Algernon)で言及されているセリフは以下の通りです:

「人工的に高められた知能は、上昇した度合いに比例して急激に衰える。」

このセリフは、チャーリー・ゴードンが自身の知能の急激な向上と、その後の衰えについて理解する過程で述べられます。このフレーズは、彼が知能の一時的な向上と、その後の不可避な衰えを予見し、受け入れることの難しさを反映しています。

4o

「人工的に高められた知能は、上昇した度合いに比例して急激に衰える。」 を微分方程式で表現して下さい

ChatGPT

「人工的に高められた知能は、上昇した度合いに比例して急激に衰える」という文を微分方程式で表現する場合、知能のレベル I(t)I(t)I(t) が時間 ttt に対してどのように変化するかを考えます。この文の解釈に基づいて、知能の衰えがその知能レベルに比例することを意味します。つまり、知能の減少速度が現在の知能レベルに比例するという形で表現できます。

この考えに基づいて、知能の時間に対する微分方程式は以下のようになります:

$$ \frac{dI}{dt} = -kI $$

ここで:

$$\frac{dI}{dt}$$ は知能の時間に対する変化率(衰えの速度)です。
$$I(t)$$ は時間$$t$$ における知能レベルです。
$$k$$ は比例定数で、知能の衰えの速さを決定します。$$k$$ は正の定数です。

この微分方程式は、知能の衰えがその知能レベルに比例していることを示しています。解くことで、知能の時間経過に伴う変化を表す式を得ることができます。

解法

この微分方程式を解くと、知能 $$I(t)$$は指数関数的に減少することがわかります。

$$\frac{dI}{dt} = -kI$$

この方程式を分離変数法で解くと、

dII=−k dt\frac{dI}{I} = -k \, dtIdI​=−kdt

両辺を積分すると、

∫1I dI=−k∫dt\int \frac{1}{I} \, dI = -k \int dt∫I1​dI=−k∫dt

ln⁡∣I∣=−kt+C\ln |I| = -kt + Cln∣I∣=−kt+C

ここで CCC は積分定数です。両辺の指数を取ると、

∣I∣=e−kt+C|I| = e^{-kt + C}∣I∣=e−kt+C

I=Ce−ktI = Ce^{-kt}I=Ce−kt

この式は一般解を示しています。初期条件 I(0)=I0I(0) = I_0I(0)=I0​ を適用すると、

I0=Ce0I_0 = Ce^0I0​=Ce0

C=I0C = I_0C=I0​

したがって、知能の時間経過に伴う変化は次のようになります:

I(t)=I0e−ktI(t) = I_0 e^{-kt}I(t)=I0​e−kt

この解は、時間とともに知能が指数関数的に減少することを示しています。

4o

この方程式には「人工的に高められた知能」の内容が入っていないように思えます。

ChatGPT

ご指摘ありがとうございます。「人工的に高められた知能」の部分を考慮に入れて、さらに詳しいモデルを構築してみましょう。

「人工的に高められた知能」が徐々に減少するという現象を表現するために、知能の自然な状態を I0I_0I0​ とし、人工的に高められた知能を I(t)I(t)I(t) として、それが時間とともに減少していく過程を考慮します。

仮定と設定
I0I_0I0​ は元の知能レベル(自然な知能レベル)とします。
I(t)I(t)I(t) は時間 ttt における人工的に高められた知能レベルとします。
知能の減少速度は現在の知能レベルに比例し、知能の自然なレベルからの増分に対しても比例するものとします。

これを反映するために、次のような微分方程式を提案します:

dIdt=−k(I(t)−I0)\frac{dI}{dt} = -k (I(t) - I_0)dtdI​=−k(I(t)−I0​)

ここで:

dIdt\frac{dI}{dt}dtdI​ は知能の時間に対する変化率です。
I(t)I(t)I(t) は時間 ttt における知能レベルです。
I0I_0I0​ は元の知能レベル(自然な知能レベル)です。
kkk は比例定数です。
解法

この微分方程式を解くと、次のような形式の解が得られます。

dIdt=−k(I(t)−I0)\frac{dI}{dt} = -k (I(t) - I_0)dtdI​=−k(I(t)−I0​)

まず、変数を分離します:

dII−I0=−k dt\frac{dI}{I - I_0} = -k \, dtI−I0​dI​=−kdt

両辺を積分します:

∫1I−I0 dI=−k∫dt\int \frac{1}{I - I_0} \, dI = -k \int dt∫I−I0​1​dI=−k∫dt

ln⁡∣I−I0∣=−kt+C\ln |I - I_0| = -kt + Cln∣I−I0​∣=−kt+C

ここで CCC は積分定数です。両辺の指数を取ると:

∣I−I0∣=e−kt+C|I - I_0| = e^{-kt + C}∣I−I0​∣=e−kt+C

I−I0=±eCe−ktI - I_0 = \pm e^C e^{-kt}I−I0​=±eCe−kt

積分定数 eCe^CeC を C′C'C′ と置き換えると:

I(t)=I0±C′e−ktI(t) = I_0 \pm C' e^{-kt}I(t)=I0​±C′e−kt

初期条件 I(0)=IinitialI(0) = I_{\text{initial}}I(0)=Iinitial​ を適用すると:

Iinitial=I0±C′I_{\text{initial}} = I_0 \pm C'Iinitial​=I0​±C′

したがって、定数 C′C'C′ は Iinitial−I0I_{\text{initial}} - I_0Iinitial​−I0​ となります。これにより、解は次のようになります:

I(t)=I0+(Iinitial−I0)e−ktI(t) = I_0 + (I_{\text{initial}} - I_0) e^{-kt}I(t)=I0​+(Iinitial​−I0​)e−kt

この式は、時間とともに知能が自然なレベル I0I_0I0​ に向かって指数関数的に減少する様子を示しています。

4o

これも変です。I_initial はI_0と同じ値なので、第二項の係数が0になりますよね。

ChatGPT

おっしゃる通りです。初期条件に関する考え方に誤りがありました。人工的に高められた知能が時間とともに減少する過程を適切にモデル化するためには、知能の初期値が自然な知能レベル I0I_0I0​ とは異なることを明確にする必要があります。ここでは、人工的に高められた知能レベル ImaxI_{\text{max}}Imax​ を導入し、その変化を考慮します。

次のような状況を考えます:

I0I_0I0​ は自然な知能レベル
ImaxI_{\text{max}}Imax​ は人工的に高められた知能レベルのピーク
I(t)I(t)I(t) は時間 ttt における知能レベル

人工的に高められた知能が時間とともに減少する過程を次のように表現します:

dIdt=−k(I(t)−I0)\frac{dI}{dt} = -k (I(t) - I_0)dtdI​=−k(I(t)−I0​)

初期条件として、I(0)=ImaxI(0) = I_{\text{max}}I(0)=Imax​ を考えます。

この微分方程式を解くと、

dIdt=−k(I(t)−I0)\frac{dI}{dt} = -k (I(t) - I_0)dtdI​=−k(I(t)−I0​)

変数分離して積分します:

dII−I0=−k dt\frac{dI}{I - I_0} = -k \, dtI−I0​dI​=−kdt

両辺を積分します:

∫1I−I0 dI=−k∫dt\int \frac{1}{I - I_0} \, dI = -k \int dt∫I−I0​1​dI=−k∫dt

ln⁡∣I−I0∣=−kt+C\ln |I - I_0| = -kt + Cln∣I−I0​∣=−kt+C

ここで CCC は積分定数です。両辺の指数を取ると:

∣I−I0∣=e−kt+C|I - I_0| = e^{-kt + C}∣I−I0​∣=e−kt+C

積分定数 eCe^CeC を C′C'C′ と置き換えると:

I−I0=C′e−ktI - I_0 = C' e^{-kt}I−I0​=C′e−kt

初期条件 I(0)=ImaxI(0) = I_{\text{max}}I(0)=Imax​ を適用すると:

Imax−I0=C′I_{\text{max}} - I_0 = C'Imax​−I0​=C′

したがって、定数 C′C'C′ は Imax−I0I_{\text{max}} - I_0Imax​−I0​ となります。これにより、解は次のようになります:

I(t)=I0+(Imax−I0)e−ktI(t) = I_0 + (I_{\text{max}} - I_0) e^{-kt}I(t)=I0​+(Imax​−I0​)e−kt

この式は、時間とともに知能が自然なレベル I0I_0I0​ に向かって指数関数的に減少する様子を正しく表しています。

4o

人工的に加えられた知性を定数とするのは不自然です。人工的に加えられた知性も時間関数で増えるものとして下さい。ここでは簡単にするために、人工的に加えられた知性は線形増加する、としていいです。

ChatGPT

ご指摘ありがとうございます。人工的に加えられた知性が時間とともに線形に増加する場合を考慮して、より適切なモデルを構築します。

仮定と設定
I0I_0I0​ は元の自然な知能レベルとします。
Ia(t)I_a(t)Ia​(t) は時間 ttt における人工的に加えられた知能の量で、線形に増加すると仮定します。具体的には、Ia(t)=atI_a(t) = atIa​(t)=at とします。
I(t)I(t)I(t) は時間 ttt における総合的な知能レベルで、自然な知能レベル I0I_0I0​ と人工的に加えられた知能 Ia(t)I_a(t)Ia​(t) の和です。

人工的に加えられた知能が時間とともに線形に増加し、総知能レベルが減少していく過程を次のように表現します:

I(t)=I0+Ia(t)I(t) = I_0 + I_a(t)I(t)=I0​+Ia​(t)

ここで Ia(t)=atI_a(t) = atIa​(t)=at です。知能の減少速度が現在の知能レベルに比例することを考慮すると、次の微分方程式になります:

dIdt=−kI(t)\frac{dI}{dt} = -kI(t)dtdI​=−kI(t)

この I(t)I(t)I(t) は自然な知能と人工的に加えられた知能の合計です:

I(t)=I0+atI(t) = I_0 + atI(t)=I0​+at

したがって、この関係を微分方程式に代入すると:

dIdt=−k(I0+at)\frac{dI}{dt} = -k (I_0 + at)dtdI​=−k(I0​+at)

しかし、上記の形では、線形増加する人工知能の影響をうまくモデル化できないため、以下のように考えます。実際に、人工的に加えられた知能 Ia(t)=atI_a(t) = atIa​(t)=at の効果を考慮しつつ、総合的な知能 I(t)I(t)I(t) の減少を考慮します。

微分方程式の構築

総合的な知能 I(t)I(t)I(t) が時間とともに減少する一方で、人工的に加えられた知能が線形に増加する場合を考えます。

知能の変化は次のようにモデル化できます:

dI(t)dt=ddt[I0+Ia(t)−βI(t)]\frac{dI(t)}{dt} = \frac{d}{dt}[I_0 + I_a(t) - \beta I(t)]dtdI(t)​=dtd​[I0​+Ia​(t)−βI(t)]

ここで Ia(t)=atI_a(t) = atIa​(t)=at は人工的に加えられた知能、β\betaβ は減少率です。

したがって、全体の知能レベル I(t)I(t)I(t) は以下のような微分方程式に従います:

dI(t)dt=a−βI(t)\frac{dI(t)}{dt} = a - \beta I(t)dtdI(t)​=a−βI(t)

解法

この微分方程式を解くと、総合的な知能 I(t)I(t)I(t) の時間に対する変化が得られます。

dI(t)dt=a−βI(t)\frac{dI(t)}{dt} = a - \beta I(t)dtdI(t)​=a−βI(t)

変数分離して積分します:

dI(t)a−βI(t)=dt\frac{dI(t)}{a - \beta I(t)} = dta−βI(t)dI(t)​=dt

積分すると:

∫1a−βI(t) dI=∫dt\int \frac{1}{a - \beta I(t)} \, dI = \int dt∫a−βI(t)1​dI=∫dt

−1βln⁡∣a−βI(t)∣=t+C-\frac{1}{\beta} \ln |a - \beta I(t)| = t + C−β1​ln∣a−βI(t)∣=t+C

両辺に −β-\beta−β を掛けて整理すると:

ln⁡∣a−βI(t)∣=−βt+C′\ln |a - \beta I(t)| = -\beta t + C'ln∣a−βI(t)∣=−βt+C′

ここで C′C'C′ は新たな積分定数です。指数を取ると:

∣a−βI(t)∣=e−βt+C′|a - \beta I(t)| = e^{-\beta t + C'}∣a−βI(t)∣=e−βt+C′

初期条件 I(0)=IinitialI(0) = I_{\text{initial}}I(0)=Iinitial​ を適用すると:

a−βIinitial=eC′a - \beta I_{\text{initial}} = e^{C'}a−βIinitial​=eC′

これを C′′C''C′′ と置き換えると:

a−βI(t)=C′′e−βta - \beta I(t) = C'' e^{-\beta t}a−βI(t)=C′′e−βt

したがって、総合的な知能レベル I(t)I(t)I(t) は次のように表現されます:

I(t)=aβ+(Iinitial−aβ)e−βtI(t) = \frac{a}{\beta} + \left(I_{\text{initial}} - \frac{a}{\beta}\right) e^{-\beta t}I(t)=βa​+(Iinitial​−βa​)e−βt

この解は、人工的に加えられた知能が線形に増加しつつ、全体の知能レベルが時間とともに減少する様子を示しています。

未分類

/*
  dummy_cam_0.2.c
  
  ■環境設定を行います。
  sudo apt-get update
  sudo apt-get install libgstrtspserver-1.0-dev

  export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH

  "192.168.1.11.mp4"というmp4ファイルを用意しておいて下さい。

 
  ■プログラムをコンパイルして実行するには、以下のコマンドを使用します:
  gcc -o dummy_cam_0.2 dummy_cam_0.2.c `pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0`

  ./dummy_cam_0.2 -r rtsp://127.0.0.1:8554/test -f 192.168.1.11.mp4

  ■また、ヘルプメッセージを表示するには、以下のコマンドを使用します:

  ./dummy_cam_0.2 -h

  ■稼動確認環境
   (車上) 192.168.101.30
   cam@cam-desktop:~/cpp/src$ ./dummy_cam_0.2
   cam@cam-desktop:~/cpp/src$ ./abc_vtp_0.1 -i 192.168.101.10 -p 38089 -r rtsp://127.0.0.1:8554/test

   (地上) 192.168.101.10
pt@pt-desktop:~/go/src$ more srt_rtsp_server_38089.sh 

#!/bin/bash
gst-launch-1.0 srtsrc uri=srt://:38089 keep-listening=true ! decodebin ! autovid
eosink

  
*/

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
#include <stdio.h>
#include <string.h>

void print_usage(const char *prog_name) {
    g_print("Usage: %s -r [RTSP_URL] -f [MP4_FILE]\n", prog_name);
    g_print("Default RTSP_URL: rtsp://127.0.0.1:8554/test\n");
    g_print("Default MP4_FILE: 192.168.1.11.mp4\n");
    g_print("Example: %s -r rtsp://127.0.0.1:8554/test -f 192.168.1.11.mp4\n", prog_name);
}

int main(int argc, char *argv[]) {
    GMainLoop *loop;
    GstRTSPServer *server;
    GstRTSPMountPoints *mounts;
    GstRTSPMediaFactory *factory;
    const char *default_url = "rtsp://127.0.0.1:8554/test";
    const char *default_mp4 = "192.168.1.11.mp4";
    const char *rtsp_url = default_url;
    const char *mp4_file = default_mp4;
    char path[256] = "/test";
    char service[6] = "8554";  // ポート番号のデフォルト値

    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-h") == 0) {
            print_usage(argv[0]);
            return 0;
        } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) {
            rtsp_url = argv[++i];
            // RTSP URLのポート番号とパス部分を抽出
            const char *url_port = strchr(rtsp_url + strlen("rtsp://"), ':');
            if (url_port != NULL) {
                url_port++;
                const char *url_path = strchr(url_port, '/');
                if (url_path != NULL) {
                    strncpy(path, url_path, sizeof(path) - 1);
                    path[sizeof(path) - 1] = '\0';  // Null terminatorを追加

                    int port_length = url_path - url_port;
                    if (port_length < sizeof(service)) {
                        strncpy(service, url_port, port_length);
                        service[port_length] = '\0';  // Null terminatorを追加
                    }
                }
            }
        } else if (strcmp(argv[i], "-f") == 0 && i + 1 < argc) {
            mp4_file = argv[++i];
        }
    }

    gst_init(&argc, &argv);

    loop = g_main_loop_new(NULL, FALSE);

    server = gst_rtsp_server_new();
    gst_rtsp_server_set_service(server, service);

    mounts = gst_rtsp_server_get_mount_points(server);

    factory = gst_rtsp_media_factory_new();
    char launch_string[512];
    snprintf(launch_string, sizeof(launch_string),
             "( filesrc location=%s ! qtdemux name=d d.video_0 ! queue ! rtph264pay pt=96 name=pay0 )",
             mp4_file);
    gst_rtsp_media_factory_set_launch(factory, launch_string);

    // ループ設定を追加
    //g_object_set(factory, "loop", TRUE, NULL);

    gst_rtsp_mount_points_add_factory(mounts, path, factory);

    g_object_unref(mounts);

    gst_rtsp_server_attach(server, NULL);

    g_print("Stream ready at %s with file %s\n", rtsp_url, mp4_file);
    g_main_loop_run(loop);

    return 0;
}

未分類

読者さんからのメールに返信しようとしたのですが、エラーリターンが連発しました。エラーメールの文面を解析したら、どうやら、これが原因だったようです。

Gmailへのメール送信がエラーになって返ってくる現象でお困りのお客様へ | さくらのサポート情報

そりゃ、まあ、kobore.netなんぞという弱小ドメインを、Googleが怪しいと思うのは当然かもしれませんが(と、ちょっと拗ねてみる)

-----

kobore.netのドメインでのメールアドレスは、普段使いしておらず、また、別メールに転送されており、運が悪いとそこでフィルタリングがかけられて、見落としすることが多々あります。(定期的にフォルダのチェックはしておりますが)。

江端からの返信がない場合、しばらくお待ち下さい。思い出したころに、返信を差し上げることがあります(もし、見逃してしまったら、大変申し訳ありません)。

 

未分類

/*
  gcc -o gst_videotestsrc_autovideosink gst_videotestsrc_autovideosink.c `pkg-config --cflags --libs gstreamer-1.0`

*/

#include <gst/gst.h>

int main(int argc, char *argv[]) {
    GstElement *pipeline, *source, *sink;
    GstBus *bus;
    GstMessage *msg;
    GError *error = NULL;

    /* Initialize GStreamer */
    gst_init(&argc, &argv);

    /* Create the elements */
    source = gst_element_factory_make("videotestsrc", "source");
    sink = gst_element_factory_make("autovideosink", "sink");

    /* Create the empty pipeline */
    pipeline = gst_pipeline_new("test-pipeline");

    if (!pipeline || !source || !sink) {
        g_printerr("Not all elements could be created.\n");
        return -1;
    }

    /* Build the pipeline */
    gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL);
    if (gst_element_link(source, sink) != TRUE) {
        g_printerr("Elements could not be linked.\n");
        gst_object_unref(pipeline);
        return -1;
    }

    /* Start playing */
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    /* Wait until error or EOS */
    bus = gst_element_get_bus(pipeline);
    msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

    /* Parse message */
    if (msg != NULL) {
        GError *err;
        gchar *debug_info;

        switch (GST_MESSAGE_TYPE(msg)) {
            case GST_MESSAGE_ERROR:
                gst_message_parse_error(msg, &err, &debug_info);
                g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message);
                g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none");
                g_clear_error(&err);
                g_free(debug_info);
                break;
            case GST_MESSAGE_EOS:
                g_print("End-Of-Stream reached.\n");
                break;
            default:
                /* We should not reach here because we only asked for ERRORs and EOS */
                g_printerr("Unexpected message received.\n");
                break;
        }
        gst_message_unref(msg);
    }

    /* Free resources */
    gst_object_unref(bus);
    gst_element_set_state(pipeline, GST_STATE_NULL);
    gst_object_unref(pipeline);
    return 0;
}