68user's page 掲示板

Prev< No. 1016〜1026> Next  [最新発言に戻る] [過去ログ一覧]
No. 1016 # 68user 2000/07/27 (木) 02:42:45
根本的には何がまずいかと言うと、
    1. GC をセットしていない (その結果 core dump)
    2. Window がマッピングされる前に XtWindow を実行している
         (その結果 X Error)
だと思います。1は先に述べた通り。2は XtWindow の前に
XtRealizeWidget が必要なんでしょう。

で、そういえば一応 Xt の本を持ってたな〜と思い出したので読んでみると、
    a. Form ウィジェットの上に Simple ウィジェットを作成
    b. Simple ウィジェットに、Exposure イベントへの
         コールバック関数を設定
    c. XtAppMainLoop でイベント待ち
    d.コールバック関数が呼ばれて、その中で XDrawLine
という手順を踏んでました。

実際には何も試してませんが、上の通りにやってみては
いかがでしょう。なお、a は必須かどうかわかりません。
Label ウィジェットに直接 XDrawLine できるのかもしれません。

flock の件はまたまた後程。うーん、調べる時間がない…。

No. 1017 # gongo [E-mail] 2000/07/27 (木) 05:23:23
> 実際には何も試してませんが、上の通りにやってみては
> いかがでしょう。なお、a は必須かどうかわかりません。

ありがとうございます。いろいろ試してみます。

No. 1018 # 68user 2000/07/27 (木) 09:35:55
> a は必須かどうかわかりません。
必須ではありませんでした。以下のような感じで一応描画はできました。
正しいかどうかはわかりませんが。
    void repaint(){
        XDrawLine(XtDisplay(label),XtWindow(label),gc,0,0,100,100);
    }
    main(){
        ...
        XtAddEventHandler(label,ExposureMask,FALSE,repaint,NULL);
        XtRealizeWidget(toplevel);
        ...
    }
現実的には、Pixmap に書いておいて、Expose が発生するたびに
Pixmap から Window にコピーするのが効率的です。
# それ用の Widget が Xt にあったりするんだろうか。

うーん、やっぱり UNIX 使いとしては、基礎知識として、Xt は
抑えておかねばなぁ…。

No. 1019 # gao 2000/07/27 (木) 13:24:20
はじめまして。初心者にもわかりやすいUNIXのHPでよく利用させて頂いていま
す。早速ですが、質問があります。kinput2をバックグラウンドで起動した後、
netscapeを起動しようとすると以下のようなメッセージを残してすぐに落ちて
しまいました。どのようにすれば解消できるでしょうか?

% kinput2 -canna -jserver remotehost &
% netscape &
[2] Bus error netscape(core dumped)
(↑このメッセージを残してnetscapeが落ちます。)

No. 1020 # hsj 2000/07/27 (木) 14:17:21
@68userさん
すみません、ちょっと横から質問です。
>> では、DNSクライアントとnamedデーモンが、
>> UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。
>その通りです。
ぼく、ずっとUDPの「53」番(ゾーン転送のときはTCPも)だと思っていたんですが、
これは間違ってたんでしょうか?
#うーむ、心配になってきました・・・確認しよっと。

No. 1021 # gongo [E-mail] 2000/07/27 (木) 16:52:00
> 68user様
窓の表示とともにただ線を引くというのが
イベントなのかどうかわからなかったため、
今までイベント処理でやろうとは思っていませんでした。
これから試してみます。

No. 1022 # 68user 2000/07/27 (木) 19:51:17
> ずっとUDPの「53」番(ゾーン転送のときはTCPも)だと思っていたんですが、
うぅ、tcpdump で見ると確かに 53 でした。調べもせずに
いいかげんなことを言ってはいけない…。

なぜかとてもとても忙しいぞー。なんでだ。
なので、その他については明日に持ち越し。

No. 1023 # 68user 2000/07/28 (金) 01:20:21
現在 Xt の勉強中。

@gongoさん
> 窓の表示とともにただ線を引くというのが
> イベントなのかどうかわからなかったため、
ご存知かもしれませんが一応説明しておきますと、X では
ウィンドウの最初の map 時や、他のウィンドウに隠れていた
ものが露出した場合に Expose イベントが飛んできます。

なので、X クライアントは Expose イベントが飛んでくるか
どうかを見張っていて、飛んできたら描画/再描画しなくては
いけません。これをしないと、ウィンドウ内が真っ白になります。
X サーバ側が再描画をしてはくれませんから (とりあえず
バッキングストアのことはおいとくとして)。

なお、最初の Expose が飛んでくる前 (Map する前) に描画
しようとすると、core 吐くか、X Protcol Error になった
ような記憶が。

# ↑Xlib のレイヤの話。Xt だけを使っているなら、
# イントリンシクスがよきにはからってくれます。
# http://X68000.startshop.co.jp/~68user/xprogram/xlib-1.html


@gaoさん
> kinput2をバックグラウンドで起動した後、 netscape を
> 起動しようとすると以下のようなメッセージを残してすぐに
> 落ちてしまいました。
> % kinput2 -canna -jserver remotehost &
canna の場合は、-cannaserver じゃなかったかなぁ。
-jserver は Wnn 用だったような。
# でも kterm などで漢字変換できているのなら、
# これでいいのかも。

> % netscape &
> [2] Bus error netscape(core dumped)
OS 名と、Netscape をどうやってインストールしたか、
X のリソース設定 (~/.Xdefaults の中身や xrdb -query の
結果) を書いて下さい。

というより、FreeBSD/NetBSD/OpenBSD/Linux あたりなら
日本語リソース付のパッケージが用意されているでしょうから、
それを使うのが簡単です。もしパッケージを使っているのに
こういう結果になるなら、変なリソース設定をしている
or リソース設定が足らない、あたりが怪しいかと。

No. 1024 # ちゃいぱ [URL] 2000/07/28 (金) 10:20:30
また、質問させてもらいます。

$aaa = 20000728;
$datedata=substr($aaa,0,4) . "/" . substr($aaa,4, 2) . "/" . substr($aaa,6, 2);
print "datedata=$datedata\n";

のように、20000728 を 2000/07/28のようにyyyy/mm/ddに変換していますが、
上記以外のスマートな方法を教えて下さい。

「perlでVBのFormat関数みたいのはないですか」って質問されたもので...。
よろしくお願い致します。

No. 1025 # Netboy 2000/07/28 (金) 12:46:58
スマートでないやり方です.
修飾子での簡単な型式変換をつけました.

print &format('20000728','yyyy mm dd',"yyyy/mm/dd\n");
print &format('20000728','y1 y2 mm dd',"'y2年mm月dd日\n");
print &format('20000726','yyy! m! d!',"m!月d!日\n");

$M{'m#07'}='July';
print &format('20000726','yyyy m# d!',"m# d!, yyyy\n");

sub format{
    local($src,$format,$template)=@_;
    local(@format,$ptr,$s,$d,$len);

    @format=split(/ /,$format);
    $ptr=0;
    foreach $s(@format){
                $len=length($s);
                $d=substr($src,$ptr,$len);

                if ($s=~/!/){$d+=0;}
                if ($s=~/#/){$d=$M{"$s$d"};}

    $template=~s/$s/$d/g;
                $ptr+=$len;
    }
    return $template;
}

No. 1026 # 68user 2000/07/28 (金) 13:54:57
> VBのFormat関数
というものを知らないので外しているかもしれませんが、普通は
    $date = 20000728;
    printf "%04d/%02d/%02d",$date=~m/^(\d\d\d\d)(\d\d)(\d\d)$/;

    $date = 20000728;
    $date =~ s|^(\d\d\d\d)(\d\d)(\d\d)$|$1/$2/$3|;
    printf $date
あたりかなぁ。

もし表示形式を指定できるようにするなら、date コマンドと同じ書式の
    http://www.jp.FreeBSD.org/cgi/mroff.cgi?subdir=man&man=strftime&dir=jpman-3.1.0%2Fman#toc0
にするかも。

Prev< No. 1016〜1026> Next  [最新発言に戻る] [過去ログ一覧]