bugfix このページをアンテナに追加 RSSフィード

20080425

[][]back garbage is ignored.

たぶん,不要なサービスを切っていたときだと思うが,

窓使いの憂鬱が正常に動作しなくなった.


ウィンドウ移動関連のキーマップがおかしい.

窓使いの憂鬱の「調査」を見てみると

 ******************** == NULL

という表示があった.***のところは覚えてない...

# メモを取り忘れてしまったのが残念


必要なサービスを切ってしまったかと思って,開始させたのだが回復しないので再起動.

起動後に「調査」を見てみると,

  loading: C:\home\.keymap_v1.0.mayu
  loading: C:\software\mayu\109.mayu
  loading: C:\software\mayu\104on109.mayu
C:\home\.keymap_v1.0.mayu(47) : warning: back garbage is ignored.
successfully loaded.

こんな警告が.

ばっくがべーっじいずいぐのあー?

なにいってんの?ぼくわかんない


どうやら,この前追加した文がよくなかったようだ.

 key *L9-C-S-A-Q	= &Toggle(Lock9)
 key L9-*		= &Default

窓使いが動いているときとそうでないときのモードチェンジができたらなあ

と思ったのだが,やっぱりマニュアルに書いてないことやっちゃダメだね


ここをコメントアウトしたら直った.

  loading: C:\home\.keymap_v1.0.mayu
  loading: C:\software\mayu\109.mayu
  loading: C:\software\mayu\104on109.mayu
successfully loaded.

窓使いの憂鬱って間違った構文が,すぐに反映されないときがありませんか?

20080423

[]変数にexternをつけるってどういうこと?

次のようなコードを書いてコンパイルしたときのお話.

/* src1.c */
#include <stdio.h>

int a;
int sub(int n) {
	printf(" sub::a: %d\n", a);
	printf(" sub::a: %p\n", &a);
	return n+1;
}

/* src2.c */
#include <stdio.h>

int a;
int main() {
	int x;
	x = sub(a);
	fprintf(stdout, "x: %d\n", x);
	printf("a: %p\n", &a);
	return 0;
}

まず,間違っていることに気づかず行っていたこと

グローバル変数は0で初期化されます.つまり,定義が同時に行われます.

extern記述子を使うことで,どこかで定義してあることを伝えられます.

つまり,externは同じグローバル変数を2回以上定義することをチェックする役割を持っているでしょうか.

# 実際は他のところで定義してあることの意思表示だけなのかもしれませんが

しかし,上のソースはコンパイルすることができ,実行も可能です.

では,aのアドレスは?


上で述べたように,グローバル変数は同時に初期化されるはずなので,

2つのソースにおけるaはそれぞれでメモリの割付が行われると思います.


しかし,表示されるaのアドレスは同じでした.

つまり,2回定義してしまっても,1回しか定義してないことになったわけです.


ということは、extern記述子は冗長な表現ってことになってしまうんでしょうか?

# externって他のソースファイルで定義してるから

# ここでは宣言のみですよってことだったと認識していたのですが.


と,ここまでのことを某掲示板で訊いてみたところ,

リンカがエラー出してない?

シンボルが重複してますよって


シンボルの重複はリンカの担当だから、ldの問題。

--allow-multiple-definitionあたりが渡ってないか?

最初,ldはgccから間接的に呼び出されていると認識していたので,ldのオプションはgccから渡せると勘違いしていました.

"--allow-multiple-definition"をgccのオプションとしてつけてみました。

するとこんなエラーが。

$ gcc --allow-multiple-definition src?.c
cc1: error: unrecognized command line option "-fallow-multiple-definition"
cc1: error: unrecognized command line option "-fallow-multiple-definition"

つけたオプションと違うオプションが認識されない、と出てきたのは謎ですが,

次は--fallow-multiple-definitionオプションをつけてコンパイルしてみました。

すると同じエラーメッセージがでてきました。

manやinfoコマンドでgccのオプションを調べてみると、上のオプションはgccには無いとのこと。

gcc経由では渡せないオプションだったのですね。


次にinfo ldで調べると,ldにはあるとのこと.そこで,

$ gcc -c src?.c

でコンパイル直前まで終わらせて、出てきた中間ファイルをldでリンクしてみました.

$ ld --allow-multiple-definition src?.o
src1.o: In function `main':
src1.c:(.text+0x23): undefined reference to `stdout'
src1.c:(.text+0x3a): undefined reference to `fprintf'
src1.c:(.text+0x4e): undefined reference to `printf'
src2.o: In function `sub':
src2.c:(.text+0x17): undefined reference to `printf'
src2.c:(.text+0x2b): undefined reference to `printf'

どうやら,標準ライブラリ関数もリンクされてないようです.


この先のgccの詳細を-vオプションをつけて何をしているか調べてみました。

めちゃくちゃ長いので折り返しています.

$ gcc -v src?.o -o a.out 
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man
 --infodir=/usr/share/info --enable-shared --enable-threads=posix
 --enable-checking=release --with-system-zlib --enable-__cxa_atexit
 --disable-libunwind-exceptions --enable-libgcj-multifile
 --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk
 --disable-dssi --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre
 --with-cpu=generic --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 4.1.1 20070105 (Red Hat 4.1.1-51)
 /usr/libexec/gcc/i386-redhat-linux/4.1.1/collect2 --eh-frame-hdr -m elf_i386
 -dynamic-linker /lib/ld-linux.so.2 -o a.out /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crt1.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.1/crtbegin.o
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1 -L/usr/lib/gcc/i386-redhat-linux/4.1.1
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1/../../.. src1.o src2.o -lgcc --as-needed
 -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
 /usr/lib/gcc/i386-redhat-linux/4.1.1/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crtn.o

/usr/libexec/gcc/i386-redhat-linux/4.1.1/collect2というのはリンカです.

ldとは異なるようですが,次の結果により同じオプションが使えるみたいです.

どうやら--allow-multiple-definitionオプションは入っていないようです。


ldに対して,上の長いオプションをコピペして実行してみると,エラーメッセージなくリンクが済みました.

敢えて--allow-multiple-definitionをつけてリンクしてみましたが、

どちらにしても、グローバル変数aは同じアドレスのようです。

"--allow-multiple-definition"自体は多重定義を許すオプションなので,

デフォルトでフラグが立っていたってことなんでしょう.


すると,次のようなレスをいただきました.

-fno-common オプションをつけるといいらしい

試してみると,

$ gcc -fno-common src?.c
/tmp/ccuJF0uA.o:(.bss+0x0): multiple definition of `a'
/tmp/ccU9yxgD.o:(.bss+0x0): first defined here

晴れて求めていたエラーメッセージが出てきました.

ただし,これはgccのオプションです.

ldのオプションでは何かな,,,と調べてみると,どうやら"--warn-common"オプションがそのようでした.

上の長いコマンドにこのオプションをつけて実行してみると,

$ ld --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o
 /usr/lib/crti.o /usr/lib/gcc/i386-redhat-linux/4.1.1/crtbegin.o
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1 -L/usr/lib/gcc/i386-redhat-linux/4.1.1
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1/../../.. src1.o src2.o -lgcc --as-needed
 -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
 /usr/lib/gcc/i386-redhat-linux/4.1.1/crtend.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crtn.o -warn-common
src2.o: warning: multiple common of `a'
src1.o: warning: previous common is here

でましたね.


しかし,実は間違った認識をしていたことに気づく

bssという言葉を見かけました.

そういえば,以前エキスパートCプログラミング―知られざるCの深層 (Ascii books)

"グローバル変数はbss領域に確保されるため実行時に0で初期化される"

という旨の文章を読んだことがある...


ここで,ソースを次のように書き換えてみました.

#include <stdio.h> 

int a=0;
int main() {
        int x;
        x = sub(a);
        fprintf(stdout, "x: %d\n", x);
        printf("a: %p\n", &a);
        return 0;
}

つまり,src1.cのグローバル変数だけ明示的に定義してみました.

もちろんこれは実行でき,最初に述べたような実行結果になります.

ただ,src2.cも明示的に定義すると変わってきます.

#include <stdio.h>

int a=4;
int sub(int n) {
        printf(" sub::a: %d\n", a);
        printf(" sub::a: %p\n", &a);
        return n+1;
}

どっちのaが優先されるか調べるために定義の値を変えてみました.

コンパイル結果.

$ gcc src?.c
/tmp/cc4a7Yre.o:(.data+0x0): multiple definition of `a'
/tmp/ccwrP69I.o:(.bss+0x0): first defined here
collect2: ld はステータス 1 で終了しました

なるほど.

つまり,

グローバル変数は宣言と同時に定義が行われる

というのは勘違いだったわけですね.


最後に,nmを使ってシンボルのリストを取得してみます.

まず,記事冒頭のソースです.

# グローバル変数を多重宣言し,明示的な初期化を行っていないもの

$ nm a.out 

       ~snip~

080482c4 T _init
08048330 T _start
08049658 B a
08048354 t call_gmon_start
08049654 b completed.5757
08049648 W data_start
         U fprintf@@GLIBC_2.0
080483b0 t frame_dummy
080483d4 T main
0804964c d p.5755
         U printf@@GLIBC_2.0
08049650 B stdout@@GLIBC_2.0
08048434 T sub

そして,片方を宣言のみ行い,もう片方にexternを用いたオブジェクトファイルです.

$ nm a.out 

       ~snip~

080482c4 T _init
08048330 T _start
08049650 D a
08048354 t call_gmon_start
08049658 b completed.5757
08049648 W data_start
         U fprintf@@GLIBC_2.0
080483b0 t frame_dummy
080483d4 T main
0804964c d p.5755
         U printf@@GLIBC_2.0
08049654 B stdout@@GLIBC_2.0
08048434 T sub

変数aがBからDになっています.

これは.bss領域から.data領域に移ったことを示します.

http://www.bookshelf.jp/texi/binutils/binutils-ja_2.html


結論

グローバル変数は明示的な初期化がされないと,

デフォルトでは多重宣言が許されてしまいます.


つまり次のようなコードが許されてしまいます.

/* src1.c */
#include <stdio.h>

int a;
int main() {
        int x;
        a = 5;
        x = sub(&a);
        fprintf(stdout, "x: %d\n", x);
        printf("a: %p\n", &a);
        return 0;
}

/* src2.c */
#include <stdio.h>

int a;
int sub(int *n) {
        a += 10;
        printf(" sub::a: %d\n", a);
        printf(" sub::a: %p\n", &a);
        return *n+a;
}

わざと,ポインタを渡して書き換えられてしまうようにしました.


src1.cのコーダーはsub()が10を足してくれることを期待して,15を待ってます.

src2.cでは,自らが宣言したaが0で初期化されることを期待して,

渡された変数に10を足して返しています.

しかし実際は30が返ってきてしまいます.


上のようなソースは意味のあるものではありませんが,それでも

2人で意思疎通を行わず,同じ名前のグローバル変数が宣言を知らず,

"初期化せずに"それぞれで使用してしまうと,相手先で変更されてしまいます.怖いですね.


通常は,部署などでは初期化するよう義務付けられているのでしょう.

でも,間違ってしまうことはあるでしょうし,

gccの--fno-commonオプションのフラグが立っているべきだと思うのですが...


ああ,でもグローバル変数はそもそも"定義されていない"のだから,

使い方が間違っている,ってことになるのか.


reference

http://pc11.2ch.net/test/read.cgi/tech/1206196600/637-665


http://www.kouno.jp/home/c_faq/c10.html#6

http://www.kouno.jp/home/c_faq/c1.html#7

http://rina.jpn.ph/~rance/c_language/p11.html


google:gcc "-Wall"

http://www.sra.co.jp/wingnut/ld/ld-ja_2.html

http://www.unixuser.org/~euske/doc/gccopts/index.html

info gcc / man gcc / info ld / man ld

http://www.oklab.org/language_c/gcc_manual.html


http://dbkun.cs.shinshu-u.ac.jp/cai/c2/text/e_10-01-02.html

http://dbkun.cs.shinshu-u.ac.jp/cai/c2/text/e_10-05-01.html

google:crtn.o

http://www.globe.to/~oka326/archive/elf_doc_sgml_ja/elf_doc-3.html

http://www.bookshelf.jp/texi/binutils/binutils-ja_2.html

20080417

[]sylera2のスキンをsylera3で使う

なんてsylera2のスキン全般がsylera3で使えるようになるっぽいこと書きましたが,

わたしが試したのはmoeweさんのところで配布されている,

「2ちゃんねるソフトウェア板 Sylera part4 の 153 氏」が作られたBathyScapheにおいてだけですので

あんまり参考にならないかもしれません.

とりあえず,スキンはこちら.

http://moewe.xrea.jp/down/sylera/skin.html


同じこと考えてた方がいるみたいです.

http://pc11.2ch.net/test/read.cgi/software/1191679559/419-420


とりあえず解決しました.

一応完成記念SS.

f:id:pneumaster:20080417194413p:image:w450


サイドバーのボタンのアイコンがいくつかありませんがご愛嬌.

# たぶん用意されてないんでしょう


とりあえずわたしがやったことを書いておきます.

o imagesディレクトリを作ってbmpを全部入れた

o dirskin.confを置いた(bmpと同じ位置に必要?)

o skin.confを置いた


もうちょっと詳しく書きます.

ディレクトリ構造はこんな感じ

sylrskin

` BathyScaphe

  + images

  | + bmp類

  | ` dirskin.conf  (*)

  + btndef.user

  + dir.conf

  + skin.conf  (*)

  ` toolbar0.user

(*)の付いているファイルは使えるスキンから持ってきました.

http://bnote.client.jp/skinmake/dir.html

こちらを参考にさせていただいています.


試してませんが,ディレクトリ構造はそんなに重要ではないような気がします.

imagesディレクトリ内にボタン画像のファイルを入れただけでは表示されませんでした.

dirskin.confで透過する色を指定する(と思う)のですが,

これが無い所為でボタンが見えなかったのですね.


もうひとつのskin.confは

sylrtool.exeのスキンのタブのところで使用するスキンを選ぶ時に

表示される名前を記述しているのでしょう.

配布されていた元のファイルには無かった所為で表示するタイトルも無いですものね.


------------

使ってみて感じたこと

文句を言うのもアレですが,safariの検索バーに似たものが張りぼてですw

カスタマイズできて面白かったのですが,

シンプルなデザインが好きなので,デフォルトスキンを使うことにします...


あ,そういえばわたしの環境ではtoolbar0.userでCmdShowRssbarを使うことができません.

RSSリーダーのモジュールをインストールする必要があるのでしょうか.

組み込みプラグインだと思ってたのですが...

20080416

[]TWのしたらばにある掲示板見てて思ったこと

http://jbbs.livedoor.jp/game/30348/

これがタイトルにある掲示板です.


何が疑問なのかというと,

なんでlivedoorのトップページ(http://www.livedoor.com/)には,

なぜしたらばへのリンクが無いのか,ということなのです.


したらばの歴史というか背景とかはよく知らない上で言いますが,

したらばはlivedoorの下にあるということでいいのですよね?

wikipedia:したらばJBBS

wikipedia:したらば掲示板


だったらトップページにリンクがあってもおかしくないんじゃないかな,と思うんです.

自社が持っている製品(?)だったら,推したいとは思いませんか?

いちポータルサイトとして,各々のサイトを平等に扱ってるってことなんでしょうか...


でも,,,

そもそも掲示板というもの自体はコミュニティとして有名なものですよね.

ちなみにYahooにはあります.

http://messages.yahoo.co.jp/index.html

f:id:pneumaster:20080416195522p:image:w200


と,ここまで書いて他のポータルサイトの掲示板設置状況ってどうなんだろうと思ってちょっと調べてみました.

wikipedia:ポータルサイト

で紹介されているものからいくつかを対象としてみました.

ポータルサイト名トップページサービス一覧/サイトマップgoogle検索結果
livedoorないある
Yahoo Japanある
gooないある
infoseekある
niftyないある
MSN Japanないないない
Exciteないないサービス終了の告知を記したページがヒット

# googleでは「ポータルサイト名 掲示板 OR BBS」で検索


一応livedoorにはあったみたいです.トップページではありませんが.

掲示板っていうシステム自体がはやりではないのでしょうか...


-------------

ところでlivedoorのトップページからカテゴリ検索でしたらば掲示板までどうやってたどり着くかっていうと.


トップ > 暮らし・趣味 > 住まい > 住環境 > 社会基盤・インフラ > 電話・通信 > インターネット > 掲示板 > スレッド型・総合掲示板 > したらば

トップ > コンピューター・インターネット > インターネット > 掲示板 > スレッド型・総合掲示板 > したらば


の2つがあるみたいです.深いですね.

googleでしたらばを検索にかけた方が速そうです.

20080415

[]syleraの前回終了時の状態を保存するの設定箇所

pref.jsの中の

user_pref("sylera.general.is_load_latest_session", false);

が該当箇所.第2引数をfalseで保存しない状態になる.


以上.


------------

突然syleraが起動しなくなったため,

何が原因かわからずプロファイルディレクトリの設定ファイルを

部分ずつコピーしつつ発見した.

次からまずここをいじってみよっと.

ツールバーのレイアウトなどの「ツール」→「カスタマイズ」で設定可能な項目は

sylrextensionディレクトリ内のファイルが該当.

うまくモジュール化されているなあ


そのとき便利だったvimのコマンド

:diffsplit {file}

で今開いていて選択されているバッファとfileとのdiffを行う

[]syleraの自動実行拡張で使えるgoogleAutoPager

Opera専用のものとかも混じってますが,とりあえず自分用にメモ

実行されない

syleraにデフォルトで入ってるGoogleAutoPager.js


firefoxで動かしているgoogleautopager.user.js ver 1.0 @ 2007-07-18


AutoPagerize_opera.js

http://d.hatena.ne.jp/os0x/20070828/1188324015


実行されるが機能しない

oAutoPagerize.js

http://d.hatena.ne.jp/os0x/20071202/oautopagerize

# ページの読み込みが終わらない...


正常に実行される

AutoPagerize_opera.user.js

http://d.hatena.ne.jp/os0x/20070828/1188324015



reference

http://d.hatena.ne.jp/gnarl/20070603/1180820465

http://d.hatena.ne.jp/os0x/searchdiary?word=%2a%5bAutoPagerize%5d

20080414

[]vimで矩形選択で一括編集

http://www.partty.org/session/goth/2008/04/13/12/36/28

を見てたら,自分の知らないvimの使い方が出てきた.

動画の最初の方の

hs-dcounterディレクトリの下のcountsというファイルを編集している部分.


lsコマンドで読み込んだfilesディレクトリ以下のファイル名に対して

それぞれの行の先頭にある"f"をC-vで矩形選択したあとに"1, "を入力することで

すべての行の"f"の前に"1, "が挿入されている.


これはどうしたらできるのか試してみたところ,

矩形選択後にIを入力することでできるらしい.


windowsのgvim7.1で試してみました.

# 下の画像では文字が表示されないので

# fotolifeのほうで見てください.


!!dir .

でディレクトリ内のファイルを取得

f:id:pneumaster:20080414055508p:image:w100

C-vで一部矩形選択

f:id:pneumaster:20080414060116p:image:w100

I入力で挿入モードに

f:id:pneumaster:20080414060114p:image:w100

タブを入力してみた

f:id:pneumaster:20080414060112p:image:w100

Escを入力しノーマルモードに戻ってみると...

f:id:pneumaster:20080414060109p:image:w100


"A"を入力すればバッファの最後にカーソルがいくので,

選択範囲の後ろを編集することも可能

"R"とか他のコマンドもたぶんできるんでしょう.

# 追記:"r"はできたけど"R"は行全体が消えちゃいました


矩形選択ってこんな風に使うのですね.

20080410

20080407


この日記のはてなブックマーク数 [about] [archive] [g] [b] [f] [git] [twit]


メモ
□ オブジェクト指向のこころ・練習問題回答
9章   10章

1960 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
最近のコメント

AX