ExternalInterfaceで送れるデータの限界&全ブラウザ対応のブラクラができた
最初はブラクラなんてつくる気無かったんですが。
今度ExternalInterfaceを使って最大kBオーダーのテキストをjavascript→Flashに渡すようなアプリをつくるかもしれなくて、
ExternalInterface.addCallbackの限界を試したかったんです。
その結果は、IE7、FF2ともに 33,554,432[Byte]まではokだった。
その2倍はNG。IE7,FF2ともにメモリが不足しています、っていってjsがエラーる。
へー。
そしたらExternalInterface.callでFlash→javascriptにどんだけ渡せるのか試したくなる。
16,777,216[Byte]まではok。その2倍はIE7,FF2ともにNG。Flash側でメモリが足りなくなるようで、
IE7,FF2ともに終了。
へーへー。
Opera9.*,Safari3(Windows)も死亡
macは試してない
しかし、意外とたくさん送れるもんだなぁ。
検証コードはこんな
actionscript3
PLAIN TEXT
Actionscript:
package {
import flash.display.Sprite;
import flash.system.Security;
import flash.external.ExternalInterface;
import flash.utils.setTimeout;
public class RPCClient extends Sprite{
private var debug :Boolean = true;
Security.allowDomain('*');
public function RPCClient(){
ExternalInterface.addCallback("xi_send", xi_send);
var message [...]
speex+portaudioを使ったechoアプリを書いてみた
マイク → speexエンコーダ → speexデコーダ → スピーカー
だけの。
speexエンコーダ、speexデコーダ無しだと問題ないところ、ありにすると、
なんか高音のノイズが入るのはなぜ?
speex-devのMLに質問中。。。
コードはこんな
PLAIN TEXT
C++:
#include "stdafx.h"
#include <queue>
#include <iostream>
#include <portaudio .h>
#include <speex /speex.h>
#include </speex><speex /speex_callbacks.h>
#define USE_SPEEX
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (256)
#define NUM_SECONDS (10)
//#define NUM_CHANNELS (2)
#define NUM_CHANNELS (1) // try mono first
/* #define DITHER_FLAG (paDitherOff) */
#define DITHER_FLAG (0) /**/
/* Select sample format. */
#define PA_SAMPLE_TYPE paFloat32
typedef float SAMPLE;
#define SAMPLE_SILENCE (0.0f)
#define PRINTF_S_FORMAT "%.8f"
typedef [...]
libjingleでportaudioを使ったmediaengineをつくった
置いておこう。
portaudioが、マイクからデータが取れたとき、スピーカーに音を流せるとき、にcallbackを呼んでくれる形なので、
・マイクから音をとってくるところ
・スピーカーに音を流すところ
にバッファを持っている。
覚えたてのC++のSTLの明示的cast、queueを使っています。
C++おもろいなー
libjingleが確保してくれたP2Pセッションに音声データを流すときに、
PLAIN TEXT
CODE:
network_interface_->SendPacket(const void*, size_t);
ってのを呼ぶんだけど、
queueをconst void*に変換するとこが気持ち悪い。こんなもんなのかなぁ
音声は生のwavを送っているので、遅延は
DirectAudioを使ってたらそこで50msくらい(らしい?)
+バッファ分の遅延、
+portaudioの遅延
+通信の遅延
くらいなのかな。なんか体感かなり遅延してるのは後で調べる。
portaudiomediaengine.cc
PLAIN TEXT
C++:
#include "talk/third_party/mediastreamer/mediastream.h"
#include <fcntl .h>
#include <iostream>
#include "talk/base/logging.h"
#include "talk/base/thread.h"
#include "talk/session/phone/codec.h"
#include "talk/session/phone/portaudiomediaengine.h"
#include <sstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <queue>
#include "portaudio.h"
#include <time .h>
using namespace cricket;
static int playbackCallback( const void *inputBuffer,
void *outputBuffer,
[...]
mysql/tritonnのinsertベンチマーク
tritonn使おうかな。
これがいい
Tritonnを使うとMySQLはどう変わるの?
従いまして、MySQLにこのパッチを適用した場合、変わるのは基本的にはMyISAMのFULLTEXTインデックスの振る舞いのみで、後はこれまでと同様となっています。またこの図をご覧頂くとお分かりになるかと思いますが、MySQLへアクセスするアプリケーションから見ると、MySQLの上位層がSennaを隠蔽しているため、アプリケーション側で特にSennaを意識する必要はありません。
MATCH/AGAINSTを使ったSELECTでちょっぱやになる代わりに、
気になるのは、
INSERT時にどれだけ遅くなるのか?
実データに近い環境で計測してみる
test table
+--------------+---------------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra [...]
Firebugのconsole.logが動かないなぁ
as3から
ExternalInterface.call('console.log', obj);
って呼んでるのがたまにスルーされるなーと困ってた@Firebug1.2
http://getfirebug.com/releases/
http://getfirebug.com/releases/firebug/1.3/firebug-1.3.0a4.xpi
1.3.0a4でok
クロスプラットフォームな音声IO portaudioを試す
週末にもりもり更新されるブログです。
クロスプラットフォームとかほんとめんどくさいけどやってみるよ。
音声のとこもマイクからの入力とか再生とかプラットフォーム依存だよなーと思ってたらportaudioがよいかも。
PortAudio - portable cross-platform Audio API
自分と同じようにlibjingle使ってみてる人がいて
Libjingle for Mac OS X
Support for OS X was written several months ago, by defining a new sound card type in mediastreamer (a third-party framework included in libjingle), making use of the cross-platform PortAudio API to do interaction with the audio hardware. We never tested it, so we assumed [...]
libjingleのNAT越えの様子
またlibjingleいじり。
callサンプルはGIPS Media Engineが手に入らないし多分ただで商用アプリに使えなさそうだし、LinphoneもVisualC++環境ではコンパイルできないので、さくっとは動かない!
pcp(ファイル転送)サンプルの動きを見る。
コマンドラインオプションで -d をつけてpcpサンプルを動かすと、UDPホールパンチングの様子がログに流れる。
libjingleはLOG4Jっぽくログレベルを設定したりできていい感じ。
少しログ出力をカスタマイズしながら眺める。
基本的には、流れはこんな感じ。
自分のマシンの全てのローカルIP+STUNサーバから取得したグローバルIPと、
相手の同じ情報、の全ての組み合わせを、優先度つけながら試していく。
ローカルIP > STUNで得られたグローバルIP ( > リレーサーバのIP )
これがICEって仕組みかな?
Interactive Connectivity Establishment (ICE): A Protocol for Network
Address Translator (NAT) Traversal for Offer/Answer Protocols
PLAIN TEXT
CODE:
[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:192.168.174.1:2584|C-w|udp]: sendstun
[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:5.rem_hamachi:2586|C-w|udp]: sendstun
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.0.2:2580|C-w|udp]: sendstun
Error(port.cc:310): [J]Port[private-1:stun:Net[0:114.emobile]]: Received STUN response with bad username2
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.88.1:2582|C-w|udp]: sendstun
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.174.1:2584|C-w|udp]: sendstun
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:5.rem_loc_hamachi:2586|C-w|udp]: sendstun
[J]Conn[0:private-1:local:114.emobile:1116->private-1:stun:61.stun_global:2581|C-w|udp]: sendstun
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:stun:61.stun_global:2581|C-w|udp]: sendstun
[J]Conn[0:private-1:stun:114.emobile:1118->private-1:local:192.168.0.2:2580|C-w|udp]: sendstun
[J]Conn[0:private-1:stun:114.emobile:1118->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw
[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw
[J]Port[private-1:local:Net[0:114.emobile]]: got request, send response
[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:61.stun_global:2580|CRw|udp]: [...]
gist embed お試し
最新から拾ってきただけ