2012年11月16日

いろいろ

08/10/24(Fri) 07:49
Winfastの画面をキャプチャして職場のPCで見ていい気になっていたが・・・
winfastはそれ自体にストリーミング機能があった・・・
ブラウザで見れるんだって・・・
ただしNATは超えられないようなのでPCを直につなぐ必要があるが・・・
後でやってみよう・・・
だいたい、こんなことをしようと思ったのは、Winfastのチラシにライブ放送機能があるというのを見たからで・・・
自分が使っているのにもそういうメニューがあるのは見ていて・・・
でもなぜかそれを使おうとはせず・・・
自分で作ろうとしていた・・・

08/10/24(Fri) 23:27
orb?
知らなかったよ。
なんか聞いたことはあったような気はしたけどね。
テレビなんかどこでも見れるしさ。
見なきゃ困る番組は録画するし。
ストリーミングなんかいらないよね、普通は。

08/10/25(Sat) 05:08
使ってみた。TVの設定がよくわからないがとりあえずアカウントを作ってorbのサイトにログインしてみる。テレビのメニューがあるのでクリックしてみるとNHKの小さな旅が映った!
左上に現在の時刻が表示されている。何が起きたのかよくわからない・・・
これはPCのTVをストリーミングしているのか?それなら、とorbを入れたPCのケーブルを抜いてみると再生が止まった。

08/10/25(Sat) 05:14
すごい・・・。確かにすごい技術だ。画像、動画も、共有できている。
自分で作ったサーバだのクライアントだののミニアプリが一気に色あせて見えた。

08/10/25(Sat) 06:01
orbについては別スレで語る。

08/10/31(Fri) 07:00
でもこれ、結構いいよ。我ながら。
まず、会社から自宅へ接続してストリーミングなんて、普通ブロックされるよね。2ちゃんねるも見れない今の職場でも当然ダメ。

あと、携帯での利用。orbですら携帯では見れない(かな?)。

画像の大きさとリフレッシュ頻度を変えることで、接続環境に対応できる。
たとえば、自宅のPCなら、画像は640x480で、リフレッシュ3秒でいける。
携帯では、320x240で10秒くらい。

野球中継の途中経過確認には十分。ニュース番組も何があったかくらいはつかめる。
最近のテレビは字幕が出まくるしね。


posted by delsoli at 18:40| delphi | 更新情報をチェックする

いろいろ、迷走

08/10/18(Sat) 09:04
MemoryStreamのなぞ

以前も疑問だったのだが、bitmapをSaveToStreamでMemoryStreamにsaveした後、LoadFromStreamで別のbitmapにloadすることができない。SaveToFileの場合はLoadFromFileができる。Streamとはメモリ上にあるだけでファイルと同様に扱えるのではないのか?

08/10/18(Sat) 09:15
解決。

Streamの場合、saveした後positionが書き込んだ最後の位置になっているので、0に戻す必要がある。ファイルの場合はその必要がないのにな・・・。なんか納得したようなしないような・・・。ポジションがどうの、という話は聞いたことはあったんだけど、この場合にそれが該当するとは気づかなかった・・・。ソースは2チャンネルである。クソッ!

08/10/19(Sun) 08:10
Indy10 UDPServerの sendbuffer

ビットマップファイルを用意して、それをストリームにloadし、そのストリームをbufferに読み込み、それをUDPServerでsendbufferしてみた。しかし、READするたびに例外が出て、sendbufferするもののmalformedパケットになってしまう。原因はsendbufferする前の、streamのreadで、bufサイズが設定されていないことであった。

procedure TForm1.Button6Click(Sender: TObject);
var
buf: TBytes;
BytesRead: Longint;
begin
SetLength(buf,4096);
MyStream.Position:=0;
MyStream.Read(Pointer(buf)^,4096);
IdUDPServer1.SendBuffer(Edit1.Text,MyPort,buf);
end;

このように、SetLengthでバッファサイズを設定しないとだめだ。ちなみに4096バイトをsendbufferしたら、ちゃんとフラグメントされて3つのパケットが送信された。感動。

08/10/19(Sun) 08:19
あとは、streamの終了判定をして全部送信し、受信側ではstreamに書き出し、imageにloadfromstreamをすれば、画像が表示されるはずだ。バッファのサイズはどれくらいが適当なんだろうか?小さすぎれば何度も読むことになるし、大きすぎれば無駄な通信が発生することになる。ちなみにFTPでアップロードした、640x480サイズのデスクトップをキャプチャしたJPGファイルのサイズは84KBだった。

08/10/19(Sun) 08:22
今気づいたんだが、codezineのサンプルでやった文字列の送受信は、ほぼip messenger的なアプリなんじゃないのか?

08/10/19(Sun) 11:33
なんとか画像を転送することができた・・・。だが、なぜか8KBほどのサイズまでしか送れない。あと、2台で動作確認してみようと思ったら、一部動かない機能が。無理もない、だってVistaで作ったファイルだからね。XPで動かなくても。

08/10/19(Sun) 11:34
ものすごく恥ずかしいけど、ソース載せときますね。

unit udpsUnit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdSocketHandle,IdGlobal,
IdUDPClient, ExtCtrls;

type
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
Button1: TButton;
IdUDPServer1: TIdUDPServer;
Memo1: TMemo;
Button2: TButton;
Edit1: TEdit;
Image1: TImage;
Button3: TButton;
Button6: TButton;
Image3: TImage;
Button7: TButton;
Memo2: TMemo;
FileOpenDialog1: TFileOpenDialog;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TIdBytes; ABinding: TIdSocketHandle);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyPort: Integer;
TxBuf, RxBuf: TIdBytes;
bmp: TBitMap;
MyStream: TMemoryStream;
RxStream: TMemoryStream;
MyBmp: String;
bufsize: Integer;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPServer1.Broadcast('Anybody there?',12345);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
IdUDPServer1.Send(Edit1.Text,12345,'Are you there?');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
// Image1.Picture.Assign(bmp);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
// bmp.SaveToStream(MyStream);
// Image1.Picture.Bitmap.SaveToStream(MyStream);
end;


procedure TForm1.Button6Click(Sender: TObject);
var
BytesRead: Longint;

begin
MyStream.Clear;

FileOpenDialog1.Execute;

bmp.LoadFromFile(FileOpenDialog1.FileName);
Image1.Picture.Assign(bmp);
Image1.Picture.Bitmap.SaveToStream(MyStream);


SetLength(TxBuf,bufsize);
SetLength(RxBuf,bufsize);

MyStream.Position:=0;

BytesRead:=MyStream.Read(Pointer(TxBuf)^,bufsize);
while BytesRead>0 do
begin
Memo1.Lines.Add('BytesRead: '+IntToStr(BytesRead));
if (BytesRead4096 do
begin
IdTCPClient1.IOHandler.ReadStream(sv,4096);
inc(FileSize,-4096);
end;
IdTCPClient1.IOHandler.ReadStream(sv,FileSize);
sFile.Free;
end;

08/10/21(Tue) 04:40
ファイルを送るときに、fileopendialogで選択しているのだが、そこをファイル名直接指定だとなぜか開けない。今日はこのくらいで。

08/10/21(Tue) 20:50
udpでだらだら送る方式からTCPを検討して、テキストは簡単だけどある程度の大きさの画像ファイルの転送は難しいな・・・と、今朝顔を洗っているときに、FTPでいいんじゃないかという気がしてきた。その名の通り、ファイルを転送するためのプロトコルである。
高速化したいならTFTPという手もある。さらに、それを多数のクライアントに対しておこなうのがHTTPなんじゃないか。

まあ、それらのコンポーネントを使わないにしても、バイナリファイルの扱いはソースを見ればわかるからそれをマネしてもいいし。

08/10/21(Tue) 20:52
htxp://www.ipc.hokusei.ac.jp/~z00104/delphi/exercise12.html
にあるけど、
socketstreamというものがあって、それを使えば、SaveToStream(socketstream)というように、
ファイルを保存する感覚で転送できるぞ!
受信側はloadfromstreamすればよい。
このsocketなんとかというコンポーネントは、indyが無い時代のコンポーネントである。
2.0からあったかな?もっと後かな?
わたしには歯が立たず、indyになってようやく使えるようになった。

ところで、このように自分でソケットをどうこうする通信というのは、TCPでもUDPでもないよね?
これはただのIPパケットということになるのか?

08/10/21(Tue) 23:01
FTPサーバを使ってみた・・・・が、複雑怪奇、さっぱりわからん。
とりあえず起動して、クライアントからつないで、パスワードもチェックせずにログインできた。
だが、ファイルの送受信をどうやるのか、さっぱりわからん。indyのサンプルを落としてきたがコンパイルできず意味不明なエラーになる。

08/10/22(Wed) 20:37
夕べはほとんど何もできなかった。FTPサーバ・クライアントのサンプルがコンパイルできない。とりあえず適当に、IdFTPServerのプロパティやメソッドをいじってみた。Windowsのコマンドプロンプトでftpコマンドを打つと、パスワードもいれずにログインできた。認証する処理を書かねばならないのだろう。とりあえず認証はいらない。だが、ログインした後、ディレクトリをリストしたり、ファイルを受け取ったりすることができない。putしてみたらエラーが表示されるが文字化けしていて、サーバー側にはエラーが出たりする。

しかし、やっぱり、ストリーミング的なものを作ってみたい。その手のソフトはいくらでもある。一体どうやってやっているんだろう?まずは、それらのソフトが送受信しているパケットをキャプチャして研究するところから始めるかな。気が遠くなる。


08/10/22(Wed) 21:16
とりあえずリモートデスクトップをキャプチャしてみたが、TCPですね。

08/10/22(Wed) 22:14
indyのFTPデモ。9のデモは、delphi7+indy9でコンパイルして実行できる。
indy10のデモは、serverがない。

9のデモを2007でコンパイルすると、TIdFTPServerThreadが未定義というエラーになる。その他にも未定義がある。

もうメンドクセエ、寝る。
posted by delsoli at 18:37| delphi | 更新情報をチェックする

パソコン監視

2008/02/10(Sun) 03:41
最近はいろんなアカウントをたくさん使うようになり、アカウント名やパスワードを入力することが多い。ほとんどの場合記憶させることができるが、モノによっては記憶できなかったり、同じサービスで複数アカウントを使用する場合があって、その場合は面倒である。そこで、リストを作ってそれをクリックするとクリップボードにコピーするものを作った。delphiではなく、VC++2008で。こないだ両方いれた後にシステムが不安定になって、delphiのせいかどうかはわからなかったがとりあえずアンインストールした。

delphiなら、リストからの選択もクリップボードへの格納もやったことがあるから、というかそういうものを作ったことがあるからすぐできるのだが、練習のためにVC++でやってみることにした。Windows Formアプリを選択してプロジェクトを作って、listboxを置いて、itemを編集する。ここまではdelphiと同じ。あとはlistboxのアイテムを選択したイベントでクリップボードにコピーすれば終わり。ヘルプやWEBを探してすぐにみつかった。

こうなってくると、もう言語なんかどうでもいい。ただ、あまり多様だと困る。
.NETのヘルプだと、basicとc#がメインで、サンプルはそれしかないものもある。
モノによってはC++, J#とかも載っている。.NETは開発言語がなんでもよいように独立して存在するフレームワークとしてつくられたのだろうが、それは便利かもしれないが、単純にアプリをつくりたい、という人にとっては、多様な言語が存在していることはかえって混乱の元になる。

2008/02/10(Sun) 04:10
同じものを別のPCのXPに入れてあるdelphi 2005で作ってみた。同じものをpascalで書いただけのものである。もっと進化させるとしたら、つねにクリップボードの履歴を保存するようにして、自動的にリストを更新して頻度の高いものが上に表示されたりできればいいな。

08/09/05(Fri) 20:35
basic
cobol
dbmagic
c
delphi(pascal)
vb(VBA)
java script
perl
php

phpは、自分のサイトの掲示板などで使用している。フリーの掲示板をさがしていて、よさそうなものがたまたまphpであっただけで、phpを勉強しようとかphpがいいとか考えて選んだわけではない。モノがよければソースなんかなくても、レンタルでもよかった。
そのうち、まずは色やフォントなどを変えるところから始まって、表示件数や入力可能文字数や行数などを変えたり、user agentをチェックしたりまでするようになって、最近ではこれ以外にプログラミングらしいことはほとんどしていない。delphiやvcは勉強のために自費で購入して、参考書も何冊か買って意気込んでいたが、今ではさっぱり使わなくなってしまった。アプリが皆WEB上で動くものになったからだろう。

08/09/26(Fri) 20:02
監視ツールのアイディア。携帯からメールを送る。監視対象のPCで、普通のメールクライアントのように、POPアクセスを定期的に実施して受信する。これはすでに経験済み。そして受信したら、デスクトップのキャプチャをとって、その送信元に対し、メールに添付して送信する。これが基本。

拡張機能として。メールのタイトルでも本文でもいいが、簡単な命令をできるようにする。たとえば「desktop」ならdesktopのキャプチャ。「CPU」ならcpu使用率や温度などの情報。「mem」なら空きメモリなどの情報。「hdd」なら空きディスク領域。「all」なら全部、とか。

キモは、普通のメールの送受信で監視すること。SNMPとかVPNとかいうものではない。

パフォーマンスは犠牲になるが、携帯電話でもネットカフェでもどこからでもいける。

08/09/26(Fri) 20:02
もうひとつの案は、あるサイトに定期的に情報をアップロードし続ける。こっちの方が簡単かな。見るだけなら簡単そうだ。ここまでできると、操作したくなる。多分、任意の文字列をコマンドラインで実行して結果を得るのは可能だろう。GUI操作までしようなんてことは考えない。ただWEBを見るだけでも高くて敬遠しがちなのに、PCの遠隔操作なんて、そういうソフトもあるようだが・・・。

shutdownやリブートくらいは多分楽勝・・・かな?
xpではできたが、vistaはその辺厳しくなってるかもしれない。

やっぱりメールが簡単でいい。文字数もかなり入るし、画像も、ウィンドウを特定すれば多分、文字が読めるくらいの画質は送れる。

デスクトップ監視については、一定間隔で自分のサイトに画像を転送して、リフレッシュさせてそれを見に行ったほうがいいかな

08/09/27(Sat) 02:12
Delphi2007 for Win32をインストールして、Update3をあてて、とりあえずFTPバージョンを作った。bitbltでデスクトップをキャプチャし、stretchbltで半分のサイズに縮小してjpgで保存して、それをFTPでアップロードする。携帯で見ても、文字まで読める。

08/09/27(Sat) 10:39
indyをダウンロードしようとしかけてできなかったので思い出したのだが、2007 ではindyコンポーネントが正式にVCLとして最初から組み込まれている。

08/09/27(Sat) 10:41
次は、いよいよ遠隔操作である。メールを受信してその内容により特定の動作をする。indyのサーバを使えば直接何かできそうな気もするが、NAT越えがめんどくさそうなので、とりあえずは、メールで。

08/10/18(Sat) 05:38
いま、あるものを作ろうとしている。イメージとしては、リモートデスクトップやVNCのようなもの。携帯でも使えればベター。操作は後回しでもいいから、とりあえず自宅のPCを監視したい。

とりあえずやってみたのは、デスクトップにTVを全画面表示させてキャプチャしてJPGで保存し、それをFTPで自分のサイトにアップロードすること。
5秒間隔でキャプチャ&アップロードし、HTMLファイルも5秒間隔でリフレッシュする。これなら、電波状況が最悪なときのワンセグ放送程度に、内容は把握できる。とびとびの静止画像だが、モザイクのようにならない分、ワンセグよりもいいくらいだ。
だが5秒だとちょっと遅い。ちなみに携帯だと、5秒のリフレッシュはきつくて、「表示できません」というエラーが出ることがあり、そうなるとリフレッシュがとまる。再度画面を手動で更新すると再度リフレッシュが始まる。携帯の場合は10秒くらいが限界のようだ。

以前連続キャプチャをやった時には、10フレーム/secくらいまでが限界だった。それでさらに通信を行うのだから、フレーム数はもっと下がるだろうと考えている。

だが、ディスクに書き込まずに直接相手に送信すればどうだろう?もしかしたらTCP/IP(UDP?)通信のほうが、ディスクアクセスよりは速かったりするのでは?

08/10/18(Sat) 05:41
bitbltした画像を、ファイルに保存するのではなく、そのまま相手に送る。
ファイル転送ならFTPが使えるが、自分側でも相手側でもファイルとして保存しなければならない。TFTPにしたら少しは速いかな?

08/10/18(Sat) 07:46
とりあえず、UDPの使い方から。CODEZINEにサンプルがあった。が、サンプルをそのまま貼り付けて動かないのがいつものこと。そこから苦闘が始まる。
今回の問題は、TIdUDPServerの、TUDPReadEventの引数の型が、サンプルと違っていたことである。
サンプルは2005年のもので、indy9を使っている。そしてDelphi2007は10だ。その違いだと思う。
indy10ではこうなっている。
TUDPReadEvent = procedure (Sender: TObject; AData: TIdBytes; ABinding: TIdSocketHandle) of object;
indy9では、ADataがTStreamだったようである。

そのため、受信したデータを表示させるところがサンプルどおりに行かなかった。
いろいろと調べた結果、以下のようにキャストするだけで解決した。
Memo1.Lines.Add(String(AData));

文字列の処理という基本的なところがわかっていない。
delphiにはstringという便利なものがあって、ポインタなども使わなくてもたいていのことはできる。

だが、APIやライブラリを使うときに、型の不一致で悩むことになる。

08/10/18(Sat) 07:48
さて、IndyのUDPの使い方自体はたいしたことはなかった。
次は、これをテキストでなく、画像でやってみる。1枚の絵を送って表示させることができれば、もう私のやりたいことはできたも同然である。

08/10/18(Sat) 08:20
いや、それだけではダメだ。画像ファイルの転送であれば、型なしファイルとして読み、一定のサイズごとにバッファにためて、それをUDPでsendbufferしてやればよいのだろう。

しかし、私がやろうとしているのは、bitbltで取得したbitmapを、ファイルに出力せずにそのまま相手に転送し、相手側もそれをファイルに保存することなくそのままbitmapとして表示することである。

・・・無理か?

08/10/18(Sat) 08:22
つまりそれって、「ストリーミング」だよね?動画配信とかと同じ事だよね?
posted by delsoli at 18:26| delphi | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。