68user's page 掲示板

Prev< No. 1111〜1127> Next  [最新発言に戻る] [過去ログ一覧]
No. 1111 # gongo [E-mail] 2000/08/23 (水) 15:57:01
@68user様

> じゃなくて、X の内部では RGB それぞれ16ビットだけど、
> 16ビット×3なんていちいち指定するのがめんどくさいだろうから、

ということは二桁で表現するというのは本来0から65535なものを
大雑把にわけているということでしょうか。だとしたら大雑把に
分けているやつぐらいカラーマップに必ずあってほしいものですが・・・。

> # X のソースを持ってるなら GetColor.c あたりを

こ、これってどこにあるのでしょうか。

> 取得できないんでしたっけ? もしできないとしたら XCreateColormap
> と XInstallColormap を使うんですかね (わかってない)。

確かプライベートカラーセルは取得できなかったような気がします。
XCreateColormap や XInstallColormap についてはまだちょっと
詳しいことがわかりませんので本を見てみます。

> ところで、gongo さんはカラーセルを使って何をしようと
> 思っておられるんですか?

色を正確なRGB値で自由自在に扱いたいと思っております。
そして最終的には色の探索をするようなプログラムを作りたいと考えております。

以前お見せしたプログラムでは中央に窓を1個、
周りに10個の窓を表示しました。
で、各窓にはいろいろな色の服を表示しました。

具体的には中央の窓の服をターゲットとして、
周りの10個の服からユーザーがターゲットに最も近いと思われる
1つの服を選び、それによってあるアルゴリズムを通して
10個の服の色のRGB値をターゲットの色に近づけるように
改善したいと考えております。

1.服の提示(各窓の描画)
2.ユーザーによる選択
3.あるアルゴリズムを通して10個の服の色のRGB値を改善

この1から3の操作を繰り返すことで、提示されている10個の服の色が
ターゲットの服の色に収束していくようにしたいと考えております。
また実験段階なのでターゲットを表示しますが、
最終的にはターゲットの表示をやめ、ユーザーが心に思い描いた色へ
収束するようなアプリケーションを作りたいと考えております。

ここで問題なのは正確なRGB値を入れてもその色がカラーマップにない場合です。
近い色で勝手に代用されてしまうと、3で用意したアルゴリズムでの有効性
(いかによりよい色へどのくらいの回数で収束するかなど)を確認したいのに
別のところで収束する要因がうまれてしまうことになってしまいかねないからです。

No. 1112 # gongo [E-mail] 2000/08/23 (水) 19:30:47
@68user様
カラーマップの内容を知るための例みたいなのが本に載っていたので
試してみました。以下のtmp[k]はXColor構造体です。
尚、この例はRGB各32階調カラーマップのカラーセル内の表示色値を得る
といったものだそうです。

-----------------------------------------------------------------------------
    cmap = DefaultColormap(dummy_dpy,dummy_screen);

    for(k=0; k<32; k++)
        {
            tmp[k].pixel = k | k << 5 | k << 10;
            tmp[k].pad = 0;
            tmp[k].flags = DoRed | DoGreen | DoBlue;
            XQueryColor(dummy_dpy,cmap,&tmp[k]);
        }
-----------------------------------------------------------------------------

で、結果的に

-----------------------------------------------------------------------------
Red=0 Green=0 Blue=0 Pixel=0
Red=2114 Green=2114 Blue=2114 Pixel=1057
Red=4228 Green=4228 Blue=4228 Pixel=2114
Red=6342 Green=6342 Blue=6342 Pixel=3171
〜省略〜
Red=61306 Green=61306 Blue=61306 Pixel=30653
Red=63420 Green=63420 Blue=63420 Pixel=31710
Red=65535 Green=65535 Blue=65535 Pixel=32767
-----------------------------------------------------------------------------

といったようにPixel値が32767まできました。
ということは私の環境では 32*32*32=32768色 が
カラーマップにエントリされているようです。
実際 Red=61306 Green=4228 Blue=6342 などのように
色を指定したところ、XAllocColorを通してもRGB値が
変化しませんでした。

TrueColorということでカラーマップを書き換えられないので
この範囲内でうまくやりくりするしかないのでしょうか・・・。
XCreateColormap と XInstallColormap について
本を見てみましたが、まだよくわかりません。

No. 1113 # にゃ 2000/08/23 (水) 22:11:47
>あほらしくて泣きそうです。
なるほど。やはりopenの返り値は常にチェックすべきなのですね。(^_^;

しかし、こういうライブラリを作っておくと便利そうですね。
勉強になりました。

No. 1114 # 68user 2000/08/24 (木) 00:43:20
えっと、手短に返答をば。

@has
> {}でくくればいいなんて、なんか不思議な感じがします。
そうか、よく考えてみれば、変な仕様なんだな。
でも、ちょっと試してみましたが、next/last/redo が
そのまんま使えるわけでもないようで。


@gongo さん
> ということは二桁で表現するというのは本来0から65535なものを
> 大雑把にわけているということでしょうか。
です。ちと調べてみたところ、rgb:e/8/2 ってのは
    e は 14/15 なので、ffff の 14/15 = 61166
    8 は 8/15 なので、ffff の 8/15 = 34952
    2 は 2/15 なので、ffff の 2/15 = 8738
で、rgb = 61166/34952/8738 になるようです。

> 確かプライベートカラーセルは取得できなかったような気がします。
これはやはりできないようですね。

> こ、これってどこにあるのでしょうか。
例えば http://www.ring.gr.jp で「R6.4」などというキーワードで
探せば、http://ring.etl.go.jp/pub/X/opengroup/R6.4/tars/
行けます。

XFree86 など各種 X サーバというのは、(基本的には) これに X サーバの
実装を追加したものです。こっちのソースは例えばここ。
    http://ring.etl.go.jp/pub/XFree86/

> 近い色で勝手に代用されてしまうと、3で用意したアルゴリズムでの有効性
> (いかによりよい色へどのくらいの回数で収束するかなど)を確認したいのに
> 別のところで収束する要因がうまれてしまうことになってしまいかねないからです。
なるほど。でも、色が足りないのは根本的には仕方がないですよねぇ。


@にゃ さん
>なるほど。やはりopenの返り値は常にチェックすべきなのですね。(^_^;
ですね。ちなみにこれまでで一番はまったのは CGI やりはじめの頃。
    open(IN,"foo |");
ってのが動かない。理由は foo が core dump してたから、ってのです。
コマンドラインからは動くし、nobody 権限で動いていたから core が
できないので core 吐いてることがわからないという…。


@YAGI さん
> ロードアベレージ部の1分、5分、15分のところに表示される
> 0.09などといった値は何を基準に表示されるのでしょうか?
FreeBSD の w(1) から引用すると、
    平均負荷は、最近の1分、5分、15分間における実行キュー内の
    ジョブ数の平均値を表します。
です。すいませんが、わからなければ再度質問して下さい。
# これを説明し出すと長いんだわ、これが。

No. 1115 # gongo [E-mail] 2000/08/24 (木) 01:39:36
@68user様
いろいろありがとうございました。

>なるほど。でも、色が足りないのは根本的には仕方がないですよねぇ。

なので、カラーマップに存在する色だけを使って動くように
頑張ってみます。今後とも宜しくお願い致します。

No. 1116 # 68user 2000/08/24 (木) 02:17:51
>> なるほど。でも、色が足りないのは根本的には仕方がないですよねぇ。
> なので、カラーマップに存在する色だけを使って動くように
最初は TrueColor でも XCreateColormap/XInstallColormap で
いけるんじゃないか思いました。でも、手元のサンプルプログラムが
ことごとく動かないので、やっぱり TrueColor でもダメなのかと
あきらめかけました。ところが、X の設定を 8bpp (depth8) に
変えて PseudoColor にしても同じくサンプルプログラムが動きませんでした。

というわけで、サンプルプログラムがダメなのか、もともと
TrueColor だと不可能なのかはわかりませんでした。

ちなみに何をしたかったかと言うと、
    - netscape の起動時に -install オプションを付けると、
        マウスが netscape の中に入ったときだけカラーマップが
        変更され、netscape だけが色を独占できる
    - その代わり、netscape 以外の部分の色はちょっと変になる。
    - マウスを netscape から外すと、netscape の中の色が変になり、
        それ以外の色が正常に戻る
というようなやつです。

No. 1117 # gongo [E-mail] 2000/08/24 (木) 18:38:46
@68user様
> 最初は TrueColor でも XCreateColormap/XInstallColormap で
> いけるんじゃないか思いました。

私も本をみて XCreateColormap/XSetWindowColormap/XInstallColormap
といった感じで動かしてみようと思いましたが、うまくいきませんでした。
本の例をまねてXCreateColormapの2番目の引数(window)を
DefaultRootWindowにしたがまずかったのか、実行すると窓が画面左上に出て
動かせなくなってしまいました(ウィンドウマネージャが動いていない!?)。
窓の表示位置がおかしいのはともかくとして、肝心のRGB値がどうなったかというと
XAllocColorの後にやはり近い値に置き換えられたと思います。

しかも、プログラムを終了して、そのプログラムを書き換えようとmuleで
開いたらmuleが勝手に画面左上に行って動かせなくなってしまいました。
で、あわててXUninstallColormapをプログラムに書き加えて
再度実行したら元の状態に戻りました。
う〜ん、難しいです・・・。

それとちょっと思ったのですが、showrgbで表示される全ての色は本当に
カラーマップに存在するのでしょうか。結構数値が細かく変わっている
ところもあるので、本当にあるのかなぁと疑問に思いました。
それとも256*256*256を本当に表示できる環境を想定して
細かく用意されているのでしょうか。

No. 1118 # YAGI [E-mail] 2000/08/25 (金) 14:18:23
>68user様
レスありがとうございます。
大体のイメージは浮かぶ事が出来ました。
ただ、また質問となってしまうのですが、
その数値(0.01)はどれくらいの値になっていれば
高負荷がかかっているといえるのでしょうか?
やはり、1.00以上だと高負荷なのでしょうか?

No. 1119 # 68user 2000/08/25 (金) 21:55:26
以下の説明には多分何個・何十個もの嘘がありますが、「ここは
嘘かもしれない」と注釈を付け出すと、全部に注釈を付けるはめに
なるので、略。ツッコミは歓迎します。


まずは基礎知識。

プロセスにはいくつかの状態がありますが、簡略化して、以下の4つを考えます。

    実行状態   … まさに CPU がそのプロセスの処理をおこなっている状態
    実行可能状態 … CPU は同時に複数の処理をできないので、CPU が現在
                               実行しているプロセスの処理を終えるまで待っている状態
    入出力待ち  … ディスクに書き込む/読み込む命令を出した後、ディスク
                               コントローラからの「終わったよ」という知らせを
                               待っている状態
    sleep 状態  … sleep を使っているか、デバイスやソケットを見張っている
                               (listen や select や read している) が、まだデータが
                               届いていない) 状態

プロセスは必ず上記のうち1つの状態を取ります。


さて、本題。

load average というのは、ある瞬間の「実行可能状態のプロセスの個数」
の平均です。個数ですから整数なんですが、平均を取るので、0.12 などと
いった小数になります。

例えば
    0:00:00 の時点での実行可能状態のプロセス数が3
    0:00:01 の時点での実行可能状態のプロセス数が0
    0:00:02 の時点での実行可能状態のプロセス数が1
なら、load average は 4/3 = 1.33 です。これは3秒間だけプロセス数を
数えましたが、最近1分、5分、10分のそれぞれのプロセス数の平均を
取ったものが、top や uptime で表示される load average です。

つまり、
    - load average が 1 なら、常に CPU が何かしらの処理をしている。
        CPU が遊んでいる時間がない。
    - load average が 1 未満なら、実行可能状態のプロセスがない
        瞬間がある。その間、CPU は遊んでいる。
    - load average が 1 超なら、実行可能状態のプロセスが多く、
        待たされているプロセスがある。
ということです。

# あくまでも平均なので、本当はそうでない瞬間が多くあるでしょう。


だからといって、1 を閾値 (いきち) として負荷が低い/高いと
言っていいかというと、多分違うと思います。


なお、
    A.「変数を1ついじくって 1秒 sleep する」という処理を永遠に繰り返す
というプロセスと、
    B.「変数の内容を1増やし続ける」という処理を永遠に繰り返す
というプロセスでは、負荷が全く違います。

A は、実行可能状態から実行状態に移ると、変数を1ついじくって、
すぐに sleep 状態に入ります (実行可能状態でなくなる)。1秒経つと
再度 実行可能状態に移ります。

B は、実行可能状態から実行状態になると、変数の内容を1増やし
続けます。一定時間が経過すると、カーネルが強制的にプロセスを
実行状態から実行可能状態に戻します。

B のようなプロセスを実行すると、load average は大体 1 だけ
上がるはずです。なぜなら、B のプロセスは入出力待ちも sleep も
しないため、「常に実行可能状態になり得るプロセス」だからです。

たとえば C でもシェル上でもいいので、無限ループするだけの
プログラム
    % while (1)
    while ? end
を実行すると、load average が大体 1 上がり、もう1つ同じのを
実行すると さらに 1 上がるでしょう。

No. 1120 # CZ 2000/08/28 (月) 14:09:34
つかぬことをお聞きしますが,"リンク集のリンク集"のSSIはいつ動作するようになるのでしょうか。

No. 1121 # 68user 2000/08/28 (月) 17:04:12
おろ、いつのまにか止まってやがる (笑)。というか、SSI が効いてないのか…。
ウチに帰ったら直します。御指摘どうもです。

No. 1122 # 68user 2000/08/29 (火) 00:34:09
> SSI が効いてないのか…。
8/28 AM8:30 ごろから5時間ほど、SEGA BBS の過去ログの CGI に
199.172.149 あたりから怒涛のアクセスがあったようです。
apache のログを見ると、500 エラーが 9000件ほど記録されてました。
# トップページのカウンタも、壊れてもうた。

どうもそれ以来 apache の動作がおかしく、一部のページで SSI が
動作していないようです

CGI 側で同時起動の制限が必要なのかもしれませんね。

ま、こういうこともあるということで。

No. 1123 # とも [E-mail] 2000/08/29 (火) 06:18:52
皆様 始めまして。 ともと申します。
UNIX暦 3ヶ月の超初心者です。

スクリプトを書いておりますが、そのスクリプトのあるステップでどうしてもユーザーをスイッチしなくてはいけない事になってしまいました。
現在 su コマンドを使ってその部分だけわざわざパスワードを入れて、またスクリプトを実行するという 2スクリプト制になってます。
もしユーザーの変更も自動的にスクリプト上でできればとても楽なんですが、よい方法ありませんでしょうか?
当分はスクリプト自体にパスワードをハードコードしてもいいと思ってます。

どなたか お知恵をお貸しください!

とも

No. 1124 # 68user 2000/08/29 (火) 17:03:20
最も簡単なのは root 権限でスクリプトを動かし、適時 su で
特定のユーザ権限を得るか、su username command とすることです。

それが無理なら、suid なプログラムを作ればよいです。
    http://X68000.startshop.co.jp/~68user/unix/pickup?setuid

> 当分はスクリプト自体にパスワードをハードコードしてもいいと思ってます。
su は端末 (/dev/tty) からパスワードを読もうとするので、
標準入力などからデータを流し込むことは不可能です。

No. 1125 # 68user 2000/08/30 (水) 02:27:25
> 8/28 AM8:30 ごろから5時間ほど、SEGA BBS の過去ログの CGI に
> 199.172.149 あたりから怒涛のアクセスがあったようです。
今日も同じ時間帯に同じところから。うっとうしいのので、
SEGA BBS の CGI をしばらく止めます。

ところで、またカウンタが壊れました。/var/log/messages を
見るに、オープンしたファイル数が OS の最大値を越えたため
だと思われます。
# よく見ると、カウンタで open のエラーチェックを
# 全くしてなかった。そりゃ壊れるわな。

> su username command とすることです。
su username -c command でした。

No. 1127 # 戸川 [E-mail] 2000/08/31 (木) 15:38:36
シェルを創っているのですがSyslog(/var/log/messages) にログを出力したいのですがコマンドでできないのでしょうか?教えてください。
よろしくお願いします

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