2.人工知能の危険性というと最初に上ってくるのがSingularityの問題ですね。誤解を恐れずに「えいやっ」とまとめると「AIが人間より賢くなってしまって、AI何をやっているか(処理)が人間には理解できなくなり、その結果(処理の)制御できなくなる」(注)ことだといえましょう。プログラミングをやっている人ならば、「賢いAIが自らを再帰的に賢く書き換える(創造的学習ですね)ことにより発生する知能の爆発」は極めて「起きそう(Likely)」に感じます。(上述(↑)のM3GANでも、最後に「M3GANが守るべき第1ユーザー」として設定された少女との戦いで、その少女がM3GANをシャットダウンするよう命令した時に、"I'm afraid it does not work."といった後に、第1ユーザーは"It’s ME.(「それは私よ。」)"と発言します(映画の1:32:04参照)が、将に「創造的学習」の賜物ではないでしょうか?私には印象深かったです。)
そんなプアーな開発環境でも、「作る喜び」は今と全く変わらず、次のような九九を表示するプログラムが走っただけで感動したものでした。(注) 10 DIM i,j
20 FOR i = 1 to 9
30 FOR j = 1 to 9
40 PRINT i * j;", ";
50 NEXT j
60 PRINT 70 NEXT i
80 END
注:当時は現在のインテリセンスのような機能は全くなく、タブもスペースも自分次第。また、(出自のFORTRANに因んで)可読性よりも余計な容量を採らないように、プログラムテキストの無駄なスペースやインデントは排除されるべきものでした。(私がインデントを多用するようになったのは、後に「構造化プログラミング」がはやってからです。)
using System; //using System.Windows; //Rectを使う為にこれを入れるとFormsの定義と抵触する
//using System.Windows.Controls;
using System.Windows.Forms; //Rectを使う為にこれを入れるとWindowsの定義と抵触する //解説:ここら辺で「ん?なんかおかしいぞ?」という感じはしたんですよね。
using System.Drawing;
using System.Reflection; //Assemblyを使う為
using System.Windows.Media; //解説:MediaPlayerクラスを宣言すると直ぐに「参照先がない」
using System.Windows.Media.Imaging; //というエラーになるので、Microsoft Learnで調べて追加しました。
namespace MPViewer
{ ///////////////////////////
//エントリーポイントクラス
///////////////////////////
class MainApp
{
[STAThread]
public static void Main()
{
Application.Run(new MPForm());
}
}
///////////////////////////
//MediaPlayerサンプルクラス
///////////////////////////
public partial class MPForm : Form
{ //コントロール
Button Btn1, Btn2, Btn3, Btn4, extBtn;
MediaPlayer mp = null;//解説:これはメソッドから参照できるように、です。
VideoDrawing vd = null;//解説:同じです。 //ファイル名
string fName;
public MPForm()
{
Assembly myOwn = Assembly.GetEntryAssembly();
this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location); //プログラムアイコンをフォームにつける
this.Load += new EventHandler(MPForm_Load);
this.Text = "MediaPlayerとMediaDrawing サンプル";
this.ClientSize = new Size(640, 480);
this.MinimumSize = new Size(480, 360);
this.BackColor = SystemColors.Window;
}
Windows Media PlayerのCOMオブジェクトを操作するためのWMPLibライブラリ(解説:InterOperativeベースなので入手しようともしませんでした。)は、通常、Interop.WMPLib.dllとして知られるInteropアセンブリに含まれています。これは、Windows Media PlayerのCOMオブジェクトとC#コードとの間の相互運用性を提供します。
ご存じの通り、このブログは2002年にVectorにリリースした、当時のフリーのC++コンパイラーの一つ、BCC(Borkand C++ Compiler 5.5)の開発環境としてリソースエディター、BCCSkeltonライブラリー、スケルトン作成ウィザードと各種ツールのパッケージであるBCCForm and BCCSkelton(含サンプルプログラム)を、20年後に定年退職した爺いがボケ防止のためにアップデート(含Unicode版のECCSkelton)して、その使い方解説の為にサンプルプログラムを紹介するものです。
元々はEmbarcadero C++ Builderの無償版(と言っても1年だけ)をダウンロードして使おうとしたのですが、メモリーエラー等トラブルがあった為、使い慣れた20年前の遺物である自分のBCCForm and BCCSkeltonを掘り返(ダウンロード)して使い始め、アップデートされたEmbarcadero C++ Compiler(bcc32c.exe)に対応させ、20年前は(Microsoft Visual C++とMFCにはできて)BCCではできなかった、
最初はC#で利用できるCOMを調べました。基本的にはWin32APIベースのCOMをInterOperabilityという手法でラッパーを作ることにより使えるようになるということはわかりましたが、断捨離するBCCForm and BCCSkeltonで既にラッパーをつくっているものを「いまさらなんかなー」とテンションが下がりました。「正直もう何年もたっているんだからC#用の洗練されたコントロールはないの?」とおもい、".NET"とか".NETFramework"とかで利用できる動画再生コントロールをつらつらとGoogleで探していました。
「メディア API MediaElementおよびMediaPlayerクラスは、オーディオまたはビデオのコンテンツを表示するために使用されます。これらのクラスは、対話式またはクロックで制御できます。これらのクラスは、Microsoft Windows Media Player 10 コントロールでメディアの再生に使用できます。どちらのクラスを使用するかは、シナリオによって決まります。 MediaElementは、レイアウトでサポートされている UIElement であり、多くのコントロールのコンテンツとして利用できます。また、Extensible Application Markup Language (XAML) とコードでも使用できます。それに対し、MediaPlayer は Drawing オブジェクト向けに設計されていて、レイアウトではサポートされていません。MediaPlayerを使用して読み込まれたメディアは、VideoDrawing を使用するか、DrawingContext を直接操作することでのみ表示できます。MediaPlayer は XAML では使用できません。」
おおっ、あるじゃん!
と思い、サンプルもMediaElementは(私の嫌いな)Xamlで
"<!-- This page shows a simple usage of MediaElement -->
現在「WindowsのPCでプログラミングしてみようか?」と思ったならば、(なーんと現在は)フリーのMicrosoft Visual Studio Community Editionをダウンロードして始めるのが最も効果的で効率的(の筈)です。しかし、私は(↑のような経緯を経験していることもありますが)Visual Studioを始めてダウンロードしてそれを目にした際に当惑しました。(注)
注:"Truth is stranger than fiction." in "Don Juan" by George Gordon Byron, 6th Baron Byron. (英国の作家、詩人バイロン男爵の「ドン・ジュアン(所謂ドン・ファン)」にある箴言(日本では「事実は小説より奇なり」と訳されている。)
ps. チンチロリン賭博をやる時は、小賢しい「確率」など考えず、「場の流れ」を感じなさい。ジークンドーの始祖、李小龍(Bruce Lee)もそういっています。