SVX日記

2004|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|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|

2005-02-10(Thu) namazuじゃらし作戦

  昨日、仕掛けたnamazuであるが、どーも調子が悪い。Google以上に検索ワードが引っかかってこない。いくらなんでもオカシイので追加調査である……と、その前に、squeeze.rbが生成するhtmlに本日のリンク元が入ってしまう問題を解消しよう。namazuに検索ワードとして登録させるのは、本文とツッコミだけで十分だ。これにはsqueeze.rbに1行追加すればいい。

290     begin
291         conf = TDiary::Config::new
292         conf.header = ''
293         conf.footer = ''
294         conf.show_comment = true
295         conf.hide_comment_form = true
296         conf.show_referer = false   # <オレサマ用追加>
297         def conf.bot?; true; end
298         output_path = "#{conf.data_path}/cache/html" unless output_path
299         Dir.mkdir(output_path, 0755) unless File.directory?(output_path)
300         TDiary::YATDiarySqueezeMain.new(output_path, all_data, compat, conf, suffix)
301     rescue

  よし、対策完了。しかし、相変わらずnamazuの検索精度は非常に悪い。こんなに悪いわけはない。イロイロ調べていると、どうもindex作成時のロケールが英語になっているらしい。英語は語の区切り目がスペースだから、そのつもりで日本語文書に対してindexを作成すると、マトモな検索ワードが抽出できないワケだ。それに対する対処は環境変数LANGをjaに設定してmknmzをやり直す……が、なんだ? エラーだ。PerlがNKF.pmが見つからないとかゴネる……そうか、んじゃ、

# apt-cache search nkf perl
namazu2 - Full text search engine (namazu binary and cgi)
namazu2-common - Full text search engine (Document files)
namazu2-index-tools - Full text search engine (Tools for index handling)
libnkf-perl - Network Kanji code conversion Filter for Perl
pkf - Perl Kanji code conversion Filter

  お。libnkf-perlっぽいな。apt-getにバンザイ三唱しつつ、インデックスを作り直す。

apt-get install libnkf-perl
export LANG=ja
mknmz -c /home/svx/diary/cache/html --output-dir=/home/svx/diary/index

  よっしゃ。で、忘れずにcron内のmknmzにもLANG設定を追加する。

5 3 * * * export LANG=ja; mknmz -c /home/svx/diary/cache/html --output-dir=/home/svx/diary/index

  オマケにnamazuの検索結果の表示画面の印象をSVX日記本体と合わせておこう。namazuのNMZ.head.jaのタグの直前にスタイルシートを設定するだけだ。

<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" href="/tdiary/theme/base.css" type="text/css" media="all">
<link rel="stylesheet" href="/tdiary/theme/default/default.css" title="default" type="text/css" media="all">

  以上の対処を加え、検索すると……バッチリである。もーそりゃ重箱の隅を削り取るイキオイで隅々までツブサに検索してくれる……が、namazuに説教くらった気分……ぐは。

  画像の説明

  それはそうと、今日はケーブルで神林長平原作「敵は海賊〜猫たちの饗宴〜」のアニメ版が放送されるのだった。かなり昔の作品だが、ちょうど観たくなった頃の放送なので異様に気合が入っている。5分前にはテレビの前にスタンバイである。しかし、しかしだッ!! その前にひとつ放送局のanimaxにヒトコト言っておきたいッ!! この番組紹介のテキトーさは、ナンダッ!!

  「ある日突然クビに言い渡された一級の刑事ラケルとアポロ。」

  二人の主人公の名前を、しかも両方とも間違えるなッ!! ラケルとアポロじゃないッ!! ラテルとアプロだっつーのッ!! まぁ、ラケルとアポロの方が一般的で実際に居そうな名前なんだろうが。しかしながら、徹底してラケルとアポロかと思えばサにあらず。ページ中には各々4回名前が登場するが、ラケル3箇所、アポロ3箇所、ラテル1箇所、アプロ1箇所……ギャグかよ。

  それはそうと、第一話「猫じゃらし作戦(前編)」を観終った感想であるが、ジュ、ジュビリー、オマエ青くてモヒカンなデブだったのか……元騎士のイメージのカケラもないな……。内容的には原作をベッタリそのまんま映像にしてるなぁ、という感じ。原作を知っている人は映像が新鮮で楽しめるかもしれんが、映像作品としてはどうなんだろ? もとがOVAだから対象はほぼ原作ファンに限られるだろうし、それでいいのか? 映像的に面白かったのは、ダダっ広いラジェンドラのコクピットと、緑の茂るカーリー内部。次回には出てくるだろうCDSの映像表現が楽しみだな。

  画像の説明

  あ、唐突だが、最後に。昨日は冷蔵庫にされたので今日は扇風機にされてみた。ブーン、ブーン。


2006-02-10(Fri) FT245AMテスト基板プチ進捗

  とりあえず

  画像の説明


2009-02-10(Tue) Fedora9、電子工作チューン外伝EX

   昨日、Qt-BSch3Vの使い勝手がイマイチだ、などとオープンソース物件に対して文句を付けてしまったが、文句を付けたからには、自分で改修してしまうのである。文句を付けるからにはそれくらいはする。それが、オープンソース物件を使う際の「掟」である。最近は、使わせてもらっておいて、貢献する気もなく、文句ばかり言うという「失礼な輩」が増えているが、それはエチケットに反する。Oh!X の頃からの「言い出しっぺの法則」というのは、現在も有効なのである。文句があるなら、おまえがやれ、なのである。

  つーわけで、Qt-Bsch3Vを改修するのである。改修項目は以下。

  • アクティブレイヤの切り替えがサクサクできるように、ショートカットを追加
  • お目々が痛くならないように、色を元祖BSchコンパチに
  • オブジェクトが、常にトップレイヤに配置されてしまうなど、いくつかのバグ修正

  画像の説明

  そんなこんなで書いたのが、上の図面。いやぁ、以前より、サクサクですわ。BSch3Vから、レイヤ設定ウィンドウが「ダイアログ」になってしまい、イチイチ閉じないと図面がイジれなくなってしまったのがイヤで、古いBSchを使い続けていたが、ショートカットキーの追加によって、それ以上の操作性になった。キャッホゥ。

  と、それはそうと、このQt-BSch3Vは、本家のページにてメンテナンス終了宣言が出されつつあるようだ。少し残念。しかし、別にソースが提供出されていれば、遠慮なく終了宣言もできるってもんである(例え、無料とはいえ)。私は、今回の改造を行ったことで、BSchのコードは、ほぼ好きにイジれる、つまり「オレのモノ」になってしまっており、オマケにQtの基本まで身についた。正直、メンテナンス終了も、全然、痛くはない。

  最近、オープンソースの利点のひとつに「気に入った環境が死ぬまで自由に使い倒せる」というのがあるんじゃないかと思い始めた。メンテが止まったって、OSが変わったって、少しの手間で、自分でどうにかできる。作者さんには超感謝である。

  つーわけで、次は、秋月のPICライタを「オレのモノ」にすべく、動き出すのである。では。

diff -U 3 qtbsch3v.org/application.cpp qtbsch3v/application.cpp
--- qtbsch3v.org/application.cpp	2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/application.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -449,13 +449,16 @@
     //statusBar()->addWidget( msg, 4 );
 
 
-	m_plabelX = new QLabel(" X:0000 ",statusBar());
-	m_plabelY = new QLabel(" Y:0000 ",statusBar());
+	m_plabelL = new QLabel(" L:0   ",statusBar());
+	m_plabelX = new QLabel(" X:0000   ",statusBar());
+	m_plabelY = new QLabel(" Y:0000   ",statusBar());
 	//QFont statusfont( "helvetica", 10 ) ;
+	m_plabelL->setFont( tipfont );
 	m_plabelX->setFont( tipfont );
 	m_plabelY->setFont( tipfont );
 	//m_plabelX->setAlignment(AlignCenter);
 	//m_plabelY->setAlignment(AlignCenter);
+	statusBar()->addWidget(m_plabelL,0,true);
 	statusBar()->addWidget(m_plabelX,0,true);
 	statusBar()->addWidget(m_plabelY,0,true);
 
@@ -818,6 +821,38 @@
 	case Qt::Key_C:
 		ToolCmnt();
 		break;
+
+	case Qt::Key_Z:
+		AscentLayer();
+		break;
+	case Qt::Key_X:
+		DescentLayer();
+		break;
+
+	case Qt::Key_0:
+		ActiveLayer(0);
+		break;
+	case Qt::Key_1:
+		ActiveLayer(1);
+		break;
+	case Qt::Key_2:
+		ActiveLayer(2);
+		break;
+	case Qt::Key_3:
+		ActiveLayer(3);
+		break;
+	case Qt::Key_4:
+		ActiveLayer(4);
+		break;
+	case Qt::Key_5:
+		ActiveLayer(5);
+		break;
+	case Qt::Key_6:
+		ActiveLayer(6);
+		break;
+	case Qt::Key_7:
+		ActiveLayer(7);
+		break;
 	}
 
 }
@@ -964,6 +999,29 @@
 	g_cfg.setInt("VIEW","GRID",bGridOn);
 }
 
+void ApplicationWindow::AscentLayer()
+{
+	int n;
+	m_pXBSchView->setActiveLayer(n = (m_pXBSchView->activeLayer() - 1 + 8) % 8);
+	layerMove(n);
+	m_pXBSchView->RefreshView();
+}
+
+void ApplicationWindow::DescentLayer()
+{
+	int n;
+	m_pXBSchView->setActiveLayer(n = (m_pXBSchView->activeLayer() + 1) % 8);
+	layerMove(n);
+	m_pXBSchView->RefreshView();
+}
+
+void ApplicationWindow::ActiveLayer(int n)
+{
+	m_pXBSchView->setActiveLayer(n);
+	layerMove(n);
+	m_pXBSchView->RefreshView();
+}
+
 //TOOL
 void ApplicationWindow::ToolSelector()
 {
@@ -1036,12 +1094,18 @@
 
 
 //ビューでのカーソル位置の移動情報を受け取る
+void ApplicationWindow::layerMove(int l)
+{
+	char buff[16];
+	sprintf(buff," L:%d   ",l);
+	m_plabelL->setText(buff);
+}
 void ApplicationWindow::cursorMove(int x,int y)
 {
 	char buff[16];
-	sprintf(buff," X:%04d ",x);
+	sprintf(buff," X:%04d   ",x);
 	m_plabelX->setText(buff);
-	sprintf(buff," Y:%04d ",y);
+	sprintf(buff," Y:%04d   ",y);
 	m_plabelY->setText(buff);
 }
 
@@ -1352,13 +1416,15 @@
 
 void ApplicationWindow::SetupLayer()
 {
+	int n;
 	setlayerdlg dlg(this);
 	dlg.setVisibleLayer(m_pXBSchView->visibleLayer());
 	dlg.setActiveLayer(m_pXBSchView->activeLayer());
 	dlg.setDarkenNonActive(m_pXBSchView->darkenNonActiveLayer());
 	if(dlg.exec()){
 		m_pXBSchView->setVisibleLayer(dlg.visibleLayer());
-		m_pXBSchView->setActiveLayer(dlg.activeLayer());
+		m_pXBSchView->setActiveLayer(n = dlg.activeLayer());
+		layerMove(n);
 		bool darken = dlg.darkenNonActive();
 		m_pXBSchView->setDarkenNonActiveLayer(darken);
 		g_cfg.setInt("VIEW","DARKEN_NONACTIVE_LAYER",(darken ? 1 : 0));
diff -U 3 qtbsch3v.org/application.h qtbsch3v/application.h
--- qtbsch3v.org/application.h	2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/application.h	2009-02-09 22:58:58.000000000 +0900
@@ -95,6 +95,11 @@
 	void ViewZoomIn();
 	void ViewZoomOut();
 	void ViewGridOnOff();
+	//WALKLAYER
+	void AscentLayer();
+	void DescentLayer();
+	void ActiveLayer(int n);
+
 	//TOOL
 	void ToolSelector();
 	void ToolDrag();
@@ -119,6 +124,7 @@
     void aboutQt();
 
 	//ビューでのカーソル位置の移動情報を受け取る
+	void layerMove(int n);
 	void cursorMove(int x,int y);
 	void toolChange();
 	
@@ -140,6 +146,7 @@
 
     Q3ToolBar* toolbar;
     QString m_filename;
+	QLabel* m_plabelL;
 	QLabel* m_plabelX;
 	QLabel* m_plabelY;
 	
diff -U 3 qtbsch3v.org/componentview.cpp qtbsch3v/componentview.cpp
--- qtbsch3v.org/componentview.cpp	2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/componentview.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -39,7 +39,7 @@
 	m_cursorOffset = -1;
 	
 	QPalette palette;
-	palette.setColor(QPalette::Window,Qt::white);
+	palette.setColor(QPalette::Window,Qt::black);
 	setPalette(palette);
 	//m_drawframe = false;
 	//viewport()->setBackgroundColor(QColor("white"));
@@ -116,7 +116,7 @@
 
 void SComponentWidget::mousePressEvent( QMouseEvent * event )
 {
-	qDebug("SComponentWidget::mousePressEvent X=%d,Y=%d",event->x(),event->y());
+//	qDebug("SComponentWidget::mousePressEvent X=%d,Y=%d",event->x(),event->y());
 }
 
 
diff -U 3 qtbsch3v.org/drawcomponent.cpp qtbsch3v/drawcomponent.cpp
--- qtbsch3v.org/drawcomponent.cpp	2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawcomponent.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -57,11 +57,11 @@
 
 	QColor colText;
 	switch(nMode & 0xffff){
-	case DRAW_ON:	colText = QColor("blue");	break;
+	case DRAW_ON:	colText = QColor("yellow");	break;
 	case DRAW_MONO:	colText = Qt::color1;		break;
-	case DRAW_OFF:	colText = QColor("white");	break;
+	case DRAW_OFF:	colText = QColor("black");	break;
 	case DRAW_TEMP:	colText = QColor("red");	break;
-	case DRAW_DARK:	colText = QColor("orange");	break;
+	case DRAW_DARK:	colText = QColor("blue");	break;
 	}
 	SRect rc;
 	SSize sz;
diff -U 3 qtbsch3v.org/drawcomponentbase.cpp qtbsch3v/drawcomponentbase.cpp
--- qtbsch3v.org/drawcomponentbase.cpp	2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawcomponentbase.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -490,10 +490,10 @@
 	
 	
 	switch(nMode & 0xffff){
-	case DRAW_ON:	col = QColor("DarkGreen");	break;
+	case DRAW_ON:	col = QColor("yellow");		break;
 	case DRAW_MONO:	col = Qt::color1;			break;
-	case DRAW_OFF:	col = QColor("white");		break;
-	case DRAW_DARK:	col = QColor("orange");		break;
+	case DRAW_OFF:	col = QColor("black");		break;
+	case DRAW_DARK:	col = QColor("blue");		break;
 	case DRAW_TEMP:
 	default:
 		col = QColor("red");
@@ -596,15 +596,15 @@
 	switch(nMode & 0xffff){
 	case DRAW_ON:
 		if(nType & PIN_TYPE_ZLENG){
-			col = QColor("orange");
+			col = QColor("blue");
 		}else{		
-			col = QColor("DarkGreen");
+			col = QColor("yellow");
 		}
 		break;
 	case DRAW_MONO:	col = Qt::color1;			break;
-	case DRAW_OFF:	col = QColor("white");		break;
+	case DRAW_OFF:	col = QColor("black");		break;
 	case DRAW_TEMP:	col = QColor("red");		break;
-	case DRAW_DARK:	col = QColor("orange");		break;
+	case DRAW_DARK:	col = QColor("blue");		break;
 	default:		return;
 	}
 
@@ -826,10 +826,10 @@
 	
 	QColor colText;
 	switch(nMode & 0xffff){
-	case DRAW_ON:	colText = QColor("blue");	break;
+	case DRAW_ON:	colText = QColor("orange");	break;
 	case DRAW_MONO:	colText = Qt::color1;		break;
-	case DRAW_OFF:	colText = QColor("white");	break;
-	case DRAW_DARK:	colText = QColor("orange");	break;
+	case DRAW_OFF:	colText = QColor("black");	break;
+	case DRAW_DARK:	colText = QColor("blue");	break;
 	case DRAW_TEMP: colText = QColor("red");	break;
 		//	case DRAW_XOR:	colText = QColor("red");	break;
 	}
diff -U 3 qtbsch3v.org/drawobject.cpp qtbsch3v/drawobject.cpp
--- qtbsch3v.org/drawobject.cpp	2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawobject.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -140,10 +140,10 @@
 
 
 	switch(nMode & 0xffff){
-	case DRAW_ON:	col = QColor("darkCyan");	break;
+	case DRAW_ON:	col = QColor(0, 255, 0);	break;	// green
 	case DRAW_MONO:	col = Qt::color1;			break;
-	case DRAW_OFF:	col = QColor("white");		break;
-	case DRAW_DARK:	col = QColor("orange");		break;
+	case DRAW_OFF:	col = QColor("black");		break;
+	case DRAW_DARK:	col = QColor("blue");		break;
 	case DRAW_TEMP:	col = QColor("red");		break;
 	}
 	//p->setRasterOp(op);
@@ -202,10 +202,10 @@
 
 	
 	switch(nMode & 0xffff){
-	case DRAW_ON:	col = QColor("blue");	break;
+	case DRAW_ON:	col = QColor("cyan");	break;
 	case DRAW_MONO:	col = Qt::color1;		break;
-	case DRAW_OFF:	col = QColor("white");	break;
-	case DRAW_DARK:	col = QColor("orange");	break;
+	case DRAW_OFF:	col = QColor("black");	break;
+	case DRAW_DARK:	col = QColor("blue");	break;
 	case DRAW_TEMP:
 		col = QColor("red");
 		break;
@@ -270,10 +270,10 @@
 	QColor col;
 
 	switch(nMode & 0xffff){
-	case DRAW_ON:	col = QColor("blue");	break;
+	case DRAW_ON:	col = QColor("cyan");	break;
 	case DRAW_MONO:	col = Qt::color1;		break;
-	case DRAW_OFF:	col = QColor("white");	break;
-	case DRAW_DARK:	col = QColor("orange");	break;
+	case DRAW_OFF:	col = QColor("black");	break;
+	case DRAW_DARK:	col = QColor("blue");	break;
 	case DRAW_TEMP:	col = QColor("red");	break;
 	}
 	//p->setRasterOp(Qt::CopyROP);
@@ -308,20 +308,20 @@
 
 	switch(nMode & 0xffff){
 	case DRAW_ON:
-		colText = QColor("blue");
-		colFrame = QColor("DarkGreen");
+		colText = QColor("cyan");
+		colFrame = QColor("yellow");
 		break;
 	case DRAW_MONO:
 		colText = Qt::color1;
 		colFrame = Qt::color1;
 		break;
 	case DRAW_OFF:
-		colText = QColor("white");
-		colFrame = QColor("white");
+		colText = QColor("black");
+		colFrame = QColor("black");
 		break;
 	case DRAW_DARK:
-		colText = QColor("orange");
-		colFrame = QColor("orange");	
+		colText = QColor("blue");
+		colFrame = QColor("blue");
 		break;
 	case DRAW_TEMP:
 		colText = QColor("red");
@@ -459,11 +459,11 @@
 
 	switch(pObj->id()){
 	  case SXBSchObj::ID_WIRE:
-		col = QColor("darkCyan");
+		col = QColor(0, 255, 0);	// green
 		break;
 		
 	case SXBSchObj::ID_ENTRY:
-		col = QColor("darkCyan");
+		col = QColor(0, 255, 0);	// green
 		break;
 	case SXBSchObj::ID_DASH:
 #ifdef Q_WS_MACX
@@ -471,13 +471,13 @@
 #else
 		style = Qt::DotLine;
 #endif
-		col = QColor("black");
+		col = QColor("yellow");
 		break;
 	case SXBSchObj::ID_BUS:
 	case SXBSchObj::ID_BENTRY:
 		//style = Qt::DotLine;
 		width=3*m_viewScaleMul/m_viewScale;
-		col = QColor("darkGreen");
+		col = QColor("cyan");
 		break;
 	default:
 		return;
@@ -487,8 +487,8 @@
 	switch(nMode & 0xffff){
 	case DRAW_ON:		break;
 	case DRAW_MONO:		col = Qt::color1;		break;
-	case DRAW_OFF:		col = QColor("white");	break;
-	case DRAW_DARK:		col = QColor("orange");	break;
+	case DRAW_OFF:		col = QColor("black");	break;
+	case DRAW_DARK:		col = QColor("blue");	break;
 	case DRAW_TEMP:		col = QColor("red");	break;
 	
 	}
diff -U 3 qtbsch3v.org/stdafx.h qtbsch3v/stdafx.h
--- qtbsch3v.org/stdafx.h	2006-07-08 15:02:58.000000000 +0900
+++ qtbsch3v/stdafx.h	2009-02-10 23:31:18.000000000 +0900
@@ -1 +1,5 @@
 //dummy header file 
+#include <stdlib.h>
+#include <string.h>
+#define INT_MAX 65535
+#define INT_MIN -65535
diff -U 3 qtbsch3v.org/xbschdrawobject.cpp qtbsch3v/xbschdrawobject.cpp
--- qtbsch3v.org/xbschdrawobject.cpp	2006-07-08 15:02:59.000000000 +0900
+++ qtbsch3v/xbschdrawobject.cpp	2009-02-10 23:54:02.000000000 +0900
@@ -519,6 +519,7 @@
 	SRect srcClipSheet =SRect(rcClipSheet.left(),rcClipSheet.top(),rcClipSheet.width(),rcClipSheet.height());
 	painter.begin(&m_viewBuffer);
 	painter.setRenderHint(QPainter::TextAntialiasing);
+	painter.setBackgroundColor(QColor("black"));
 
 	painter.translate(-x,-y);
 	painter.eraseRect(clipx,clipy,clipw,cliph);
@@ -528,9 +529,9 @@
 	clipy -= y;
 //	painter.setClipRect(clipx,clipy,clipw,cliph);
 	SSize size=m_pDoc->SheetSize();
-	g_drawFrame(&painter,size,rcClip,QColor("black"),m_viewScale,m_viewScaleMul);
+	g_drawFrame(&painter,size,rcClip,QColor("yellow"),m_viewScale,m_viewScaleMul);
 	if(m_bDisplayGrid){
-		drawGrid(&painter,rcClipSheet,QColor("DarkGreen"));
+		drawGrid(&painter,rcClipSheet,QColor("red"));
 	}
 	drawMainXBSchObj(&painter,DRAW_ON,&srcClipSheet,m_fEditHighLight, m_viewScale,m_viewScaleMul);
 
diff -U 3 qtbsch3v.org/xbschfont.cpp qtbsch3v/xbschfont.cpp
--- qtbsch3v.org/xbschfont.cpp	2006-07-08 15:02:59.000000000 +0900
+++ qtbsch3v/xbschfont.cpp	2009-02-09 22:58:58.000000000 +0900
@@ -107,9 +107,9 @@
 	QColor col;
 	switch(nMode & 0xffff){
 	case DRAW_ON:	col = color;			break;
-	case DRAW_DARK:	col = QColor("orange");	break;
+	case DRAW_DARK:	col = QColor("blue");	break;
 	case DRAW_MONO:	col = Qt::color1;		break;
-	case DRAW_OFF:	col = QColor("white");	break;
+	case DRAW_OFF:	col = QColor("black");	break;
 	case DRAW_TEMP:	col = QColor("red");	break;
 	}
 
diff -U 3 qtbsch3v.org/xbschpattern.cpp qtbsch3v/xbschpattern.cpp
--- qtbsch3v.org/xbschpattern.cpp	2006-07-08 15:03:00.000000000 +0900
+++ qtbsch3v/xbschpattern.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -394,6 +394,10 @@
 		col = color;
 		break;
 
+	case DRAW_DARK:
+		col = color;
+		break;
+
 	}
 	
 	x=x*scaleMul / scale - scaleMul / (scale*2);
diff -U 3 qtbsch3v.org/xbschview.cpp qtbsch3v/xbschview.cpp
--- qtbsch3v.org/xbschview.cpp	2006-07-08 15:03:00.000000000 +0900
+++ qtbsch3v/xbschview.cpp	2009-02-10 23:31:18.000000000 +0900
@@ -1026,6 +1026,7 @@
 		//	pObj->setP1(ptSnap);
 		//	drawJunction(&painter,pObj,DRAW_ON);
 				pObj = m_pCursorObj->duplicate();
+				pObj->setLayer(m_pDoc->editLayer());
 				//drawXBSchObj(ppainter,pObj,DRAW_ON,NULL);
 				m_pDoc->addSelect(pObj);
 				m_pDoc->resetSelect();
@@ -1161,6 +1162,7 @@
 			pComment->setFontUnderline(dlg->font().underline());
 			pComment->setFontStrikeOut(dlg->font().strikeOut());
 			pComment->setSelection(SXBSchObj::SELECT_ALL);
+			pComment->setLayer(m_pDoc->editLayer());
 			m_pDoc->addSelect(pComment);
 			//g_cfg.setString("Font","Name",pComment->fontName());
 			//g_cfg.setInt("Font","Size",pComment->fontSize());
@@ -1195,6 +1197,7 @@
 			pLabel->setP1(SPoint(point.x(),point.y()));
 			pLabel->setText(dlg->text().latin1());
 			pLabel->setSelection(SXBSchObj::SELECT_ALL);
+			pLabel->setLayer(m_pDoc->editLayer());
 			m_pDoc->addSelect(pLabel);
 			delete dlg;
 			return true;
@@ -1223,6 +1226,7 @@
 			pTag->setText(pc);
 			pTag->setTagType(dlg->type());
 			pTag->setSelection(SXBSchObj::SELECT_ALL);
+			pTag->setLayer(m_pDoc->editLayer());
 			m_pDoc->addSelect(pTag);
 		//}
 		delete dlg;
@@ -1252,6 +1256,7 @@
 		pComp->setName(pCompInfoIndex->name());
 		pComp->setRefnum(pCompInfoIndex->number());
 		pComp->setSelection(SXBSchObj::SELECT_ALL);
+		pComp->setLayer(m_pDoc->editLayer());
 		m_pDoc->addSelect(pComp);
 		delete dlg;
 		return true;
@@ -1369,6 +1374,7 @@
 			}else{
 				pObj1->setP1(SPoint(ptStart.x(),ptStart.y()));
 				pObj1->setP2(SPoint(passPoint.x(),passPoint.y()));
+				pObj1->setLayer(m_pDoc->editLayer());
 //				drawXBSchObj(&painter,pObj1,DRAW_ON,NULL);
 				m_pDoc->addSelect(pObj1);
 				m_pDoc->resetSelect();
@@ -1380,6 +1386,7 @@
 			}else{
 				pObj2->setP1(SPoint(passPoint.x(),passPoint.y()));
 				pObj2->setP2(SPoint(ptEnd.x(),ptEnd.y()));
+				pObj2->setLayer(m_pDoc->editLayer());
 //				drawXBSchObj(&painter,pObj2,DRAW_ON,NULL);
 				m_pDoc->addSelect(pObj2);
 				m_pDoc->resetSelect();

2018-02-10(Sat) ドラレコのGPSで地図上に走行記録を

  車にドラレコを装着してから、ずっとチョロチョロと改良してきて、ようやく満足できるような図を書かせることができるようになった。

  画像の説明

  上記は、愛知県の知多半島にある農道「知多満作道」を走破した時の記録だ。巨大な図なので注意。

  <かきかけ>


2024-02-10(Sat) コンテナ上のリモートデスクトップ環境の実用化に成功・改

  前回「最後、言語とタイムゾーンの設定の問題」をクリアしたかように書いたが、よく見れば、左上のメニューも、ターミナルのメニューも、「Applications」や「File」などの表記のままであり正しく日本語化できてはいない。別に実用上は問題ないのだけれど、ロケールを正しく設定しているにもかかわらず、なんでなの? という気持ちは残る。

  画像の説明

  で、調べ始めて、最後には解決に至ったのだけれど、これが複雑怪奇。結論だけ知りたい人は、さっさと当エントリの最後にどうぞ。

  まず、ロケールの設定が不十分である可能性。あまり詳しくないが、様々な切り口で見ても問題が見当たらない。そもそも、メニューの中身の一部は日本語化しているしなぁ。それも意味わからんけど。

# localectl
System Locale: LANG=ja_JP.UTF-8
    VC Keymap: us
   X11 Layout: us
    X11 Model: pc105
 
# locale
LANG=ja_JP.UTF-8
LC_TIME="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=
 
# env | grep LANG
LANG=ja_JP.UTF-8

  気づけば、GUI環境でなく、CUI環境もヘンだ。lsの冒頭が「total」になっている。日本語環境なら「合計」になるはず。

# ls -l
total 12
-rw-r--r-- 1 root root 2162 11月 26 16:48 anaconda-post-nochroot.log
-rw-r--r-- 1 root root  150 11月 26 16:48 anaconda-post.log
-rw------- 1 root root 3533 11月 26 16:48 original-ks.cfg

  そこでフト、日本語化を含む、多言語化の方式について思い出した。多くのアプリケーションはgettextという共通の枠組みを使って、英語表記を望みの言語表記に置き換えている。その辞書に当たる「言語ファイル」が「.po」から作られる「.mo」ファイルだ。

# strace ls -l 2>&1 | grep '\.mo'
openat(AT_FDCWD, "/usr/share/locale/ja/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)
openat(AT_FDCWD, "/usr/share/locale/ja/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)

  ビンゴ。「ls」の実行時、探しに行っているものの見つかっていない。「言語ファイル」が入っていないことが原因だ。じゃ、その「言語ファイル」はどこに入っているのかというと「coreutils-common」パッケージだ。というか「言語ファイル」は、それを参照する「ls」コマンドと同じパッケージに入っている。つまり、各パッケージを横断して英語表記のままという症状が出ているということは、各パッケージの問題ではなくインストール機構の問題だということだ。

# rpm -qf /usr/share/locale/ja/LC_MESSAGES/coreutils.mo
coreutils-common-9.3-4.fc39.x86_64
 
# rpm -ql coreutils-common | grep ja
/usr/share/locale/ja/LC_MESSAGES/coreutils.mo
/usr/share/locale/ja/LC_TIME
/usr/share/locale/ja/LC_TIME/coreutils.mo

  しかし、この状況はヘンだ。「coreutils-common」パッケージは入っているのに「言語ファイル」だけ入っていない。パッケージの導入状態を検証する。

# rpm -qV coreutils-common

  何も出ない。ノーエラー。そんなアホな。冗長モードにする。

# rpm -qVv coreutils-common | grep ja
.........    /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
.........    /usr/share/locale/ja/LC_TIME (not installed)
.........    /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)

  「(not installed)」と出た。え。入ってないのにノーエラーってどんな状況よ。

  そこでフト、コンテナ環境の特性について思い当たる。コンテナはイメージ化して持ち運んだりするので、余計なファイルは極力含まれないほうが望ましく、特にサーバ用途に利用する場合に必要度の低い言語ファイル等を含めないような機構があるのではないかと。

  調べると、dnfには「tsflags」というパラメータがあり、これを指定するとドキュメント系のファイルのインストールがスキップされる仕組みがあるようだ。コンテナ内の「/etc/dnf/dnf.conf」を見ると、確かに「tsflags=nodocs」という記述がある。

  じゃ、コンテナビルドの序盤でこの記述をコメントアウトしてやればいい……試しに現状の環境でやってみる。

# rpm -qVv coreutils-common
.........    /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
.........    /usr/share/locale/ja/LC_TIME (not installed)
.........    /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)
 :
.........  d /usr/share/man/man1/ls.1.gz (not installed)
 
# diff /etc/dnf/dnf.conf.org /etc/dnf/dnf.conf
< tsflags=nodocs
> #tsflags=nodocs
 
# dnf reinstall coreutils-common
 
# rpm -qVv coreutils-common
.........    /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
.........    /usr/share/locale/ja/LC_TIME (not installed)
.........    /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)
 :
.........  d /usr/share/man/man1/ls.1.gz

  しかし効果なし。いや、ドキュメント系のファイルはインストールされたので、その効果はあったのだが「言語ファイル」は入らない。なんだよもぅ。

  挙げ句の果てには、coreutilsパッケージのソースをバラしてspecファイルの中身まで確認してみる……

# dnf download --source coreutils
# rpm2cpio coreutils-9.3-5.fc39.src.rpm | cpio -div
# view coreutils.spec 
 :
%find_lang %name
# Add the %%lang(xyz) ownership for the LC_TIME dirs as well...
grep LC_TIME %name.lang | cut -d'/' -f1-6 | sed -e 's/) /) %%dir /g' >>%name.lang
 : 
%files common -f %{name}.lang

  ……が収穫なし。いや、%filesって記述で言語ファイルを扱っているらしいけど、これは主にパッケージングに関係する記述で、インストーリングに関係する記述じゃないっぽいング。

  さすがにdnfのソースコードまでは追いたくない……ええいクソ、こうなったらstraceでdnfの挙動を絨毯爆撃じゃ。

# strace -o dnf.str dnf reinstall coreutils-common
# cat dnf.str | grep open | grep -v NOENT | less

  ……と、半ばヤケクソで見ていくと、妙なファイルを読み込んでいる様子に気づいた。中を見ると、ちょっとニオう内容。

openat(AT_FDCWD, "/etc/rpm/macros.image-language-conf", O_RDONLY) = 3
 
# cat /etc/rpm/macros.image-language-conf
%_install_langs en_US

  通常の環境にはこのファイルは存在していない。削除してreinstallしてみると……

# rm /etc/rpm/macros.image-language-conf
# dnf reinstall coreutils-common
# rpm -qVv coreutils-common
.........    /usr/share/locale/ja/LC_MESSAGES/coreutils.mo
.........    /usr/share/locale/ja/LC_TIME
.........    /usr/share/locale/ja/LC_TIME/coreutils.mo
 :
.........  d /usr/share/man/man1/ls.1.gz

  入ったーッ! ……つーか、そんなんわかるかーッ!

  画像の説明

  つうか、上記のファイルについてググってみても、どうも後付けっぽい理由で追加され、未だ完全に意図した挙動にはなっていないような雰囲気だ。ということは、この対処もテンポラリなものと考えておいたほうがいいことになるな。

  とはいえ、<かきかけ>