2014/3/4

MingW-w64  プログラミング

仕事で久々にMingWを使わなければならなくなった。
で、相変わらず訳が分からん…
ちゃんとオーガナイズしてくれよ…
cygwinはもっと訳分からんかったし(数年前)。

とりあえず本家mingwよりもmingw-w64の方がいいのは何となく分かった。
でmingw-w64のダウンロードサイトに行ってみると、何かどれダウンロードしていいのか分からん。

そこで見つけたのが
Setting up a MinGW-w64 build environment
というページ。
とりあえずこれがいいみたいな感じなので、これに従ってインストールしてる。
0

2014/1/30

vim + javac + "エラー: この文字は、エンコーディングUTF8にマップできません"  プログラミング

FreeBSDでjavaのプログラムを書いてる。
で、xterm + vimで書いてるのだけど、何か

javac xxx.java -encoding UTF8

でコンパイルすると、「エラー: この文字は、エンコーディングUTF8にマップできません」とか言われる。なんでや。
ちゃんとLANGもja_JP.UTF-8になってるし、"-encoding UTF8"も付けてるで。

で、どういうことかと思ったんだが、ふとEclipseを開いてxxx.javaの日本語の部分を編集して、ちゃんとコンパイルが通ったのを確認してからもう一度vimで書いてみたら、エラーが出なくなった。

きっと最初にvimが正しいエンコーディング(UTF-8)で出力してなかったんかなと思う。
で、一旦ちゃんとしたUTF-8な日本語が混じった(Eclipseで編集された奴)のをvimで開いて、ようやっとvimが「ああ、これはUTF-8な日本語が入っているからちゃんとUTF-8でセーブせなあかんな」と判断したのではないかと思う。

完全に想像やけど。
0
タグ: ja_JP.UTF-8 vim java

2013/2/12

RTMFP + Group + 動画ストリーミング  プログラミング

RTMFP+Groupで複数ユーザーによるビデオチャットシステムを作ってみたが、遅延が結構ひどいことに…
まず遅延にムラがあって、1秒以内から10秒ぐらいまで。
以前に作ったRTMPでのサーバークライアント型では大体1秒かそれ以内だったので、それに比べると残念ながら使い物にならないようだ。
実はサーバークライアント形式もそれほど遅延もなく安定してるので、これでいいような気が…

やはりビデオチャットなどはNetStream.DIRECT_CONNECTIONSでやりましょうとのことのようだ。
0
タグ: Cumulus RTMFP AS3

2012/10/11

FlashでUSBカメラの画像をキャプチャーしよう  プログラミング

何か色々やってくうちに、Flashのプログラミングを始めてしまいました。 って言うか言語はActionScriptとか言うんやね。

で、初めてのActionScriptが↓。USBカメラから動画を拾ってしまおうというもの。Flashだとこんなに簡単にできるんやね。知らんかった。

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Video;
    import flash.media.Camera;
    import flash.events.StatusEvent;
    
    public class Main extends Sprite 
    {
        private var vid:Video;
        private var cam:Camera;
        
        public function Main():void 
        {
            if (stage)
                init();
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
            
            cam = Camera.getCamera();
            if (cam == null) {
                trace("Unable to locate available cameras."); 
            }
            else {
                trace("Found camera: " + cam.name); 
                cam.addEventListener(StatusEvent.STATUS, statusHandler);
            
                vid = new Video();
                vid.attachCamera(cam); 
            } 
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
        }
        
        private function statusHandler(event:StatusEvent):void { 
            if (cam.muted) { 
                trace("Unable to connect to active camera."); 
            } 
            else { 
                // Resize Video object to match camera settings and  
                // add the video to the display list. 
                vid.width = cam.width; 
                vid.height = cam.height; 
                addChild(vid); 
            } 

            // Remove the status event listener. 
            cam.removeEventListener(StatusEvent.STATUS, statusHandler); 
       }
    }
}

X11関係のプログラミングだと最後にmain loopを呼び出さないとダメだけど、これは勝手に呼び出されるのかね?
間違ってたらスマソ。
0
タグ: Flash ActionScript swf

2010/10/2

Ipoptのderivative checker  プログラミング

詳しいことは

http://www.coin-or.org/Ipopt/documentation/node53.html

などを見て頂くとして、Cの場合だと

AddIpoptStrOption(nlp, "derivative_test", "first-order");

あるいは

AddIpoptStrOption(nlp, "derivative_test", "second-order");

でチェックできる。
何かconstraintsがおかしかったり、収束しなかったりしたらこれでチェック。

やっぱ収束するはずなのに、変なエラー(EXIT: Restoration Failed!か何か)がでて収束しなかったので、色々試したらやっぱプログラムミスだった。

ガーン。
0
タグ: Ipopt C

2010/9/2

cvxとIpoptとCPLEX  プログラミング

cvxのマニュアルによると、cvxにはSeDuMiとSDPT3の二つのコアソルバーがあるとのこと。
それはともかく、SeDuMiの方がよく"No sensible solution found." "Status: Failed"と言ってくる。

http://sedumi.ie.lehigh.edu/index.php?option=com_fireboard&Itemid=78&func=view&id=71&view=flat&catid=10によると、「まあよくあることだ、うまく解が見つけられなかっただけだ。」みたいなことをSeDuMiのチームの人が解答してるけど、これは参ったなあ…。
他人のアルゴリズムだし仕方ないか…。もっといいアルゴリズムを使いたかったら、自分で書け(探せ)ってことだろうし、仕方ない。

で、新しいアルゴリズムを探したり実装したりするのは無理(というか、仕事じゃないし…)なので、IpoptというAMPL, C++, Cに対応したConvex Optimizationのライブラリーをインストール。
しかしこれが一筋縄では行かない。
HSLとかいうところからFortranのファイルを拾ってきたりしなくちゃならないのだが、アカウントを作ってもらうのに暫く待たなくちゃならない。実のところ二日かかった。
で、いざログインして必要なファイルma57ad.fとmc19ad.fをダウンロードしようと思ったが、ない。
ma57ad.fは似たようなファイルがあるけど、その物がない。mc19ad.fに到っては似たようなものすらない。
がちょ〜ん。

ってな訳で本当はインターネットに落ちてるma57ad.fとmc19ad.fを見つけたのだけど、取り合えずインストールをしてみて(これも一苦労要ったけど)、使うのをやめようかと思った。(当然ライセンスの問題があるわけだし…)
しかもIpoptをCで使用しようとすると、最適化問題のobject関数、constraints以外に、object関数の偏微分関数、constraintsのJacobian、Hessian of the Lagrangianとかいちいち指定したりしなあかんと言う…。
途中まで計算してたけど、ほんと邪魔くさくなってきた…。

やっぱ最後はCPLEXか…。
不思議なのはhttp://spokutta.wordpress.com/2010/02/22/cplex-free-for-academic-use/にも紹介されてるけど、教育目的ならフルバージョンが無料とのことなんだが、実際IBMのサイトに行ってみると、どうやら「先生」はフルバージョンをゲットできるけど、「学生」は変数の数が300までとか、制限付きの物しかゲットできないらしい。(http://www.ampl.com/trial.html参照)変数300はちときつい。変数何万って使いたいしなあ…。

ってな訳で、最適化問題のソフトを使うにも、いい物を簡単に安くというのは難しいようです。CPLEXは先生にゲットしてもらおう…。

追記:
たまにma57ad.fとmc19ad.fを探してこのページにヒットする方がおられるようですが、ヒントとして、GoogleとYahoo.co.jpでそれぞれ検索してみてください。二つとも同じ検索エンジンではひっかかりません。

ちなみにダウンロードしたファイルそのままではIpoptのコンパイルは通りません。関数が重複するためですが、重複する関数(確かMetis, Mumps, Blasにあるもの)はコメントアウトするなりしてみて下さい。
1
タグ: 最適化 matlab

2008/1/23

MPICH2 で SOCKET BUFFER SIZE を変える  プログラミング

例えばたくさんのマシンを使用していて、たくさんのデータ交換をしている場合で、MPICH2 で原因不明のエラー(↓のようなエラー、しかもエラーメッセージが毎回変わる)が出ているとしたら…

[cli_1]: aborting job:
Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(294)............: Initialization failed
MPID_Init(93)....................: channel initialization failed
MPIDI_CH3_Init(35)...............:
MPIDI_CH3I_Progress_init(309)....:
MPIDU_Sock_listen(379)...........:
MPIDU_Socki_free_eventq_mem(1005): unable to set the send socket buffer size (size=262144,errno=55:(strerror() not found))
[cli_2]: aborting job:
Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(294)............: Initialization failed

.....

socket の buffer size が足りていないことが考えられます。

この場合は環境変数で以下のように MPICH2 で使用する socket buffer size を変えることができます。注意として、同時に OS の最大 socket buffer size も変える必要性が出てくる場合もあることです。FreeBSD のデフォルトの最大 socket buffer size は 256kB なのですが、MPICH2 でそれ以上の socket buffer size を使用する場合は、FreeBSD の方の設定も変えなくてはなりません。

・MPICH2 の socket buffer size を変える。
$ setenv MPICH_SOCKET_BUFFER_SIZE 524288
(sh 系は export MPICH_SOCKET_BUFFER_SIZE=524288 など)

・FreeBSD の最大 socket buffer size を 1MB に変える。(デフォルトは 256kB)
# sysctl -w kern.ipc.maxsockbuf=1048576

あるいは /etc/sysctl.conf に以下を書く
kern.ipc.maxsockbuf=1048576
0

2008/1/5

MPICH2 で mpdboot  プログラミング

メモ。

MPICH2 で mpd を rsh を使って全てのマシーンで起動する。

% mpdboot --rsh=rsh -n 4 -f ~/.mpd.hosts

-n 4 はマシン数。ここでは4台。
~/.mpd.hosts はマシン名が書かれたファイル。

machine1
machine2
machine3
machine4

の様にマシン名が書かれている。
0

2006/12/27

Winsock の recv での WSAEWOULDBLOCK の対処  プログラミング

うーん、Winsock 使ってて、ソケットが非ブロックモードでもないのに recv が -1 を返し、WSAEWOULDBLOCK のエラーがセットされてる時がある。
なんでやねん…。

よく調べてないので分からないけど、select を呼んで対処した。誰か他にいい方法教えてください。(相変わらず <pre> タグが使えないので見づらい)

/* Winsock's recv to handle WSAEWOULDBLOCK error */
int
MyRecv(SOCKET fd, char *msg, int size, int flags)
{
int ret;
int _errno = 0;

WSASetLastError(0);

/* Try to receive */
if ((ret = recv(fd, msg, size, flags)) < 0)
_errno = WSAGetLastError();

/* If error is WSAEWOULDBLOCK, then wait until socket gets ready */
if (_errno == WSAEWOULDBLOCK) {
fd_set rset;

/* Initialize */
FD_ZERO(&rset);

/* Set server fd */
FD_SET(fd, &rset);

/* We have to select...... */
if (select(0, &rset, NULL, NULL, NULL) < 0)
return -1;

if (!FD_ISSET(fd, &rset)) {
fprintf(stderr, "Error: MyRecv: select: fd not set. Impossible!!");
return -1;
}

/* Receive */
if ((ret = recv(fd, msg, size, flags)) < 0)
return -1;

WSASetLastError(0);
}
else if (_errno)
WSASetLastError(_errno);

return ret;
}

0

2006/11/3

select()  プログラミング

このあいだ Windows で select() を使おうと思って、色々調べていた。「Windows の select() は UNIX と同じなんかいな。」と。で、

select(0, &rset, NULL, NULL, NULL)

というのを見つけた。ん、select(0,.....) 最初の引数に 0?
普通は maxfd + 1(ここでいつもなんで "+ 1" なんやねんといつも思う)やのに 0 でいいんかいなと思って使ってみたけど、動いてる。

こんなんでええんかいなと思って FreeBSD でも使ってみると、やはり動いた。ちょっと??な気分だった。もう一回確認してみるけど、確か全部の File Descriptor を調べるためにマクロがあったはずやけど、それと同じ働きをするのかな?
訂正!! FreeBSD では動いていませんでした…。すいませんでした。Windows ですが、なんと select() の第一引数を無視しているとのこと。そうなんすか…

まあ max(x, y) を使っていちいち一番大きい fd を探すのも面倒なんやけど。( 0 だと65535 みたいな最大 fd 値までチェックするんやろうか)

どうでもいいけど Windows って、pipe() で開いた fd に select() 使えんのね…。っていうか、SOCKET と普通の File Descriptor って扱いが違うんやね…。ちょっと困るわ…。
0



teacup.ブログ “AutoPage”
AutoPage最新お知らせ