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-01-27(Thu) SVXコールドスクランブルdestiny

  意味不明なタイトルであるが、昨日、宿泊前夜であるにもかかわらず運良くホテルYRPがとれたので、本日もSVXで出撃なのである。

  画像の説明

  先週の出撃時ほどではないにせよ今日も寒いので、フロントガラスをちょっとガリガリし、やっぱりLCDディスプレイを朝焼けに染めながらいつもの出撃シーケンスをこなす。キャノピ、クリーン。テンプ、ライト。サイト、クリア。ジューク、スタート。ナビ、レディ。テイクオフ、0700。

  画像の説明

  首都高前半で30分ほどの軽い渋滞にハマりつつ、なんかリバーシブルな三つ首のトラックにちょっとウケつつ、首都高湾岸線に入り順調に走行……

  「ダシッ!!」

  画像の説明

  わっ!! なんだ、スゲェ音がしたぞ!? げ。フロントガラスにキズが入っている。どうやら飛び石のようだ。幸いヒビ状態ではないので放っておいて大丈夫だが……まったくツイてない。なんで石が飛んでるんだよ、スペースハリアーのドラゴンランドかよッ!! ……とほほ。

  ツイてないながらも道は順調。首都高湾岸線から見るフジテレビ、羽田空港、横浜ベイブリッジもすっかり見慣れた景色となった。今日は時間が早いので横浜横須賀道路に載らず、首都高湾岸線の終点である幸浦で降りてみる。現在8時半だから1時間で着けば定刻という計算。しかしながら横須賀の道に、先日感じた悪印象再びだ。路肩の狭い2車線道路に駐車車両が多いものだから「右側が走行車線、左側が追越車線」と化してしまっている。非常に名古屋っぽい危険な状態だ。オイラは名古屋人だから別に慣れているけど、ソッチがその気ならコッチも本気を出すぞ。必殺の名古屋走り(車線をマタいで走る)じゃ!! あぁ、イカンイカン。SVXに下品な走りは厳禁であった。

  そうこうするウチ、YRP到着。9時半キッカリじゃ。早速、仕事開始ではあるが、既にセッティングも完了しているため、昨日の日記に書いたとおり「見てて、落ちたら、上げる」という超絶知的作業にイキナリ突入である。よってCPU使用率100%で、個人的プログラミングにハゲむのである。がっはっは。

  といいうわけで、午前中はosziFOXの救出作業を行い、昼休みに昨日用意した「所さんの目がテン」を観て水銀について造詣を深め、午後もosziFOXの救出作業を行うのである。そりゃ、開発もススムってもんである。チョイチョイのチョイとくらぁ。あらよっと。当初の目的どおり、波形をザクザクと重ねられるようになったぞべらんめぇ。持ってきなッ

  画像の説明

  夕方、監視中のプログラムを走らせていた、片側のマシン(ThinkPadだ)の画面が突如として砂嵐となりアセる。担当者に聞くとスクリーンセーバだという回答なのだが……どーみてもビデオボードの暴走にしかみえない。一度サスペンドに入って出ると直る!? イカにRedhatといえどLinuxでサスペンドは危険のような……って、案の定だよッ!! 戻ってこない。アワてて再起動して環境を設定しなおす。ふはぁ〜、何とか復活。復活したトコロで定時になったので、すぽーんとホテルへ。

  定時に帰っているから、ホテルの夜長も長い。なので、やっぱり昨日用意したドラマ「スカイハイ」を観たりもしてしまう。別に釈由美子のファンではないが、このドラマはかなりヨイ。原作の漫画は読んだことがないが、新たな物語のスタイルを確立したといっても過言ではないと思う。個人的には刑事コロンボの「先に犯人を教えちゃうもんねスタイル」に匹敵する快挙だと思う。細かい話はオフィシャルサイトで確認して欲しいが、各話ともグイグイと引き込まれる話ばかりだ。今宵に観たのはシーズン1の終盤。怨みの門番であるイズコの正体が明かされつつある辺りである。くぅ〜、おもしれぇ。オヤスミ。


2007-01-27(Sat) USB2.0を2.0口ほど増設する

  サーバのリプレースを考えつつも、なかなか進捗しない今日この頃だが、それにもワケというものがある。時間がないというのは最上位の理由だが、いったんサーバにサービスを提供させてしまうと停止することができなくなる、という副次的な理由も大きい。つまり、ソフトウェア的な移行作業を開始するということは、常時電源を入れた状態に移行するということで、それはハードウェア的にイジることができなくなるということも意味する。

  実は設置する場所も、イマイチ納得できていない。電話線からLANを引く以上、基本的にそこからあまり離れた場所に設置するわけにはいかないので、結局はそばにある電話台と本棚を兼ねた金属のラック以外にはありえないのだが、最近ヤンチャ度256%に差し掛かりつつある1歳2ヶ月のイッペイがこのラックを揺らしまくるのが心配の理由。ハードディスクのデリケートさを知らない素人はこれだから困る。だいたい、ラックを揺すって楽しいのだろうか。まったく大人気ないガキンチョである。

  まぁ、そっちはそう簡単に解決しないが、ハードウェア的な作業は済ませておくに限る。主にやりたいことは3つあって……

  • 前面のLCDパネルを制御するPICマイコンのファームの吸出し
  • マザー上にあるフロントUSB増設用ヘッダピンの活用
  • 内蔵スイッチング電源から外部への電源供給

  ……1番目は、すでに作業を終わらせている、ということで、今日は2番目USBジャックの増設を行うことにする。この作業に必要になる、ケース取り付け用のUSBポートは先週購入してある。

  まずは取り付け位置の確定だ……が、この筐体は前面パネル以外はすべて金属外装であることから、その加工は非常に困難。必然的に前面パネルに決定される。加工はドリルやヤスリほかでゴリゴリやるコトになるので、ややっこしいものは全部はずす。LCDパネルとか、その制御基板とか、LEDとか。

  で、前面パネルを本体に取り付けた状態でも、ケース取り付け用のUSBポートが他に干渉せず、ネジで固定できる場所を探す……結局、選択の余地はなかった……が、悪くない場所である。位置決めして、慎重に取り付け用のネジ穴4箇所を開ける。問題は、USBプラグを挿し込むための四角の穴を開ける作業だ。四角い穴を開ける機械なんぞは持っていないから、穴を3つつなげるように開けて、地道にヤスリでゴリゴリとやる。この時、注意しなければならない点は「極力、内側からゴリゴリする」ことだ。外側からゴリゴリやると、必ず数度はヤスリの先がスベって、盛大にキズを付けてしまうことになる。何度かやっての経験則だ。

  画像の説明

  というわけで、なんとか許せる程度には美しく加工することができた。あとは何も考えることなく、ジャックをネジ止めしてケースを元通り組み立てるだけ……だが、組み立てる前に1本の電源コネクタをほどき、引き出して筐体の裏に出しておく。実は、これは上述した3番目の項目への対応だったりする(手抜き)。

  画像の説明

  で、完成。ハデに正面をブチ抜いて増設した結果、ネジ穴がスパルタンな雰囲気を醸し出している。黒いネジを使ったほうがよかったかな。まぁ、いいか。性能に影響するワケじゃなし。

  画像の説明

  ちょっとオマヌケだが、横のポートから電源のみ搾取するデバイスを接続する場合、こんな感じになる。この2.5インチHDDは1ポートのみでも動くし、こんな状態で常用するつもりもないが、例の「ミラーリングバックアップメソッド」を実行する際、HDDによってはこんな接続形態にできることが有利になることもあるかもしれない。

  画像の説明

  さて、今度こそ、本格的にサーバ構築作業に入らねば……。


2008-01-27(Sun)

  とりあえず

  画像の説明

  画像の説明

  画像の説明

  コンパレータる。

  画像の説明


2009-01-27(Tue) Fedora9、端末チューン++

  最近、仕事が忙しさに比例して、開いている端末画面の数が増加の一途である。ウィンドウを3枚に、各々、タブが8個くらいが平均だ。Windowsを捨て、Linux上で仕事をするようになったからか、どうかはわからんけども、仕事中のストレスが減ったことは、確実に実感している事実である。

  で、ちょっと時間に余裕があったなら、もっとストレスを減らして、仕事の効率を上げるための作業を行い、やがてくる高負荷時のスループットを少しでも上げる算段をするのである。

  というわけで、以前にクローズボタンを「バカ」に改造した、gnome-terminalのタブを、さらに小改造するのであった。

  ちなみに、クローズボタンの「バカ」化は、個人的にかなり有用であった。なにせ、平均して一日に一度くらいは、ミスクリックしているからね。

  で、今回のお題は、タブの表示。gnome-terminalのタブには「ユーザ名@ホスト名:ディレクトリ名」が表示されるので、とても識別が容易なのだが、タブを8枚も開くと、ユーザ名しか見えなくなって困るのである。オイラ的には、せめてホスト名の頭が見えると助かるのだ。

  つーわけで「フォントを小さくする」というパッチを組むことにする。

  実は、ついでにクローズボタンを無くしてしまうことを試したのだが、どうもボタンは、タブの「柱」の役割をしているらしく、単純にクローズボタンをなくすと、タブの高さがペッタンコになってしまうようだ。そこで、プロファイル(画面色やフォント設定)を切り替えるボタンに流用するのである。ほれ、昔から「立ってる柱はボタンでも使え」というではないか。

  もー、面倒なので、手順だけ垂れ流す。ついでに、2.22.2にバージョンアップだ。

# wget http://mirrors.nl.eu.kernel.org/fedora/updates/9/SRPMS.newkey/gnome-terminal-2.22.2-1.fc9.src.rpm
# rpm -ivh gnome-terminal-2.22.2-1.fc9.src.rpm
# rpmbuild -bp /usr/src/redhat/SPECS/gnome-terminal.spec 
# cd /usr/src/redhat/BUILD
# cp -r gnome-terminal-2.22.2 gnome-terminal-2.22.2.org
# cp -r gnome-terminal-2.22.2 gnome-terminal-2.22.2.my
# cd gnome-terminal-2.22.2.my
# vi src/terminal-window.c
 
※以下のdiffに相当するパッチを当てる
 
# cd -
# diff -r -U 3 gnome-terminal-2.22.2.org gnome-terminal-2.22.2.my > ../SOURCES/gnome-terminal-mytab.patch
# cat ../SOURCES/gnome-terminal-mytab.patch
diff -r -U 3 gnome-terminal-2.22.2.org/src/terminal-window.c gnome-terminal-2.22.2.my/src/terminal-window.c
--- gnome-terminal-2.22.2.org/src/terminal-window.c	2009-01-27 19:06:03.000000000 +0900
+++ gnome-terminal-2.22.2.my/src/terminal-window.c	2009-01-27 19:32:20.000000000 +0900
@@ -1367,14 +1367,24 @@
 }
 
 static void
-close_button_clicked_cb (GtkWidget *widget, GtkWidget *screen)
+close_button_clicked_cb (GtkWidget *widget, TerminalWindow *window)
 {
-  GtkWidget *notebook;
-  guint page_num;
+  GList *profiles;
+  GList *prof0;
+  GList *prof1;
 
-  notebook = gtk_widget_get_parent (GTK_WIDGET (screen));
-  page_num = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), screen);
-  gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), page_num);
+  profiles = terminal_profile_get_list ();
+  prof0 = profiles;
+  prof1 = profiles; prof1 = prof1->next;
+  while (prof0 != NULL)
+    {
+      if (prof0->data == terminal_screen_get_profile (window->priv->active_term))
+        break;
+      prof0 = prof0->next; prof1 = prof1->next;
+    }
+  terminal_screen_set_profile (window->priv->active_term, prof1 ? prof1->data : profiles->data);
+
+  g_list_free (profiles);
 }
 
 static void
@@ -1408,6 +1418,7 @@
 contruct_tab_label (TerminalWindow *window, TerminalScreen *screen)
 {
   GtkWidget *hbox, *label, *close_button, *image;
+  PangoAttrList* attrs = pango_attr_list_new ();
 
   hbox = gtk_hbox_new (FALSE, 4);
 
@@ -1416,6 +1427,10 @@
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
 
+  pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_SMALL));
+  gtk_label_set_attributes (GTK_LABEL (label), attrs);
+  pango_attr_list_unref (attrs);
+
   close_button = gtk_button_new ();
   gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
   gtk_button_set_focus_on_click (GTK_BUTTON (close_button), FALSE);
@@ -1429,7 +1444,7 @@
 
   g_signal_connect (G_OBJECT (close_button), "clicked",
 		    G_CALLBACK (close_button_clicked_cb),
-		    screen);
+		    window);
 
   sync_tab_label (screen, label);
   g_signal_connect (G_OBJECT (screen),
 
# cd ../SPECS/
# cp gnome-terminal.spec gnome-terminal-mytab.spec
# vi gnome-terminal-mytab.spec
 
※以下のdiffに相当するパッチを当てる
 
cnes-bs1furuta.cnes.nec.co.jp:/usr/src/redhat/SPECS # diff -c gnome-terminal.spec gnome-terminal-mytab.spec
*** gnome-terminal.spec	2008-05-29 01:13:05.000000000 +0900
--- gnome-terminal-mytab.spec	2009-01-27 19:35:10.000000000 +0900
***************
*** 11,21 ****
  Summary: GNOME Terminal
  Name: gnome-terminal
  Version: 2.22.2
! Release: 1%{?dist}
  URL: http://www.gnome.org/
  Source0: http://download.gnome.org/sources/gnome-terminal/2.22/gnome-terminal-%{version}.tar.bz2
  # Fix gnome.org Bug 338913 Terminal resized when switching tabs
  Patch2: gnome-terminal-2.15.0-338913-revert-336325.patch
  License: GPLv2+ and GFDL+
  Group: User Interface/Desktops
  
--- 11,22 ----
  Summary: GNOME Terminal
  Name: gnome-terminal
  Version: 2.22.2
! Release: 2%{?dist}
  URL: http://www.gnome.org/
  Source0: http://download.gnome.org/sources/gnome-terminal/2.22/gnome-terminal-%{version}.tar.bz2
  # Fix gnome.org Bug 338913 Terminal resized when switching tabs
  Patch2: gnome-terminal-2.15.0-338913-revert-336325.patch
+ Patch3: gnome-terminal-mytab.patch
  License: GPLv2+ and GFDL+
  Group: User Interface/Desktops
  
***************
*** 51,56 ****
--- 52,58 ----
  %prep
  %setup -q
  %patch2 -p1 -b .338913-revert-336325
+ %patch3 -p1
  
  %build
 
# rpmbuild -ba /usr/src/redhat/SPECS/gnome-terminal-mytab.spec
# cd ../RPMS/i386/
# rpm -Uvh gnome-terminal-2.22.2-2.fc9.i386.rpm

  2が揃って縁起がいいので、柏手をふたつ打ちつつ、一度、端末を終わらて、再起動しよう。

  さて、左が元の状態、右が改造後の状態である。情報量は倍増だ。よほど、タブを開きまくらない限り、ユーザ名とホスト名が識別可能だ。

  画像の説明 画像の説明

  しかし、Rubyに慣れると、Cは疲れる。ではまた。


2024-01-27(Sat) エアコンが好きすぎる、または、UIの考察

  「ロードスターのエアコンが好きすぎる」というと、なんだそりゃ、と言われそうではあるが、クルマ全体としてのデキもさることながら、とりわけエアコンもお気に入りなのである。どのようにエアコンが好きなのかといえば、その操作パネルである。美しすぎるのだ。その操作性もデザインも。

  自分はNR-Aグレードなのでオートエアコンでなくマニュアルであり、加飾も少ないが、そんな細かい違いはさておき、重要なのはその操作性である。同サイズの3つの円。円の周囲がダイヤルであり、円の中がボタンである。ただ、それだけだ。そして、それだけですべてが完結している。

  画像の説明

  ダイヤルは3つとも絶対位置で指示するタイプなので、それがそのまま表示器を兼ねている。ロータリーエンコーダ方式だと(温度は何度みたいな)表示器が必要になるし、操作の結果を目視確認する必要があるが、その点、絶対位置方式なら、チラと見て手を伸ばせば、必ずしも操作結果の目視確認が必要ない。

  ボタンはLEDというミニマムな表示器があるものの、3つともトグル動作であるから、こちらも、チラと見て手を伸ばせば、必ずしも操作結果の目視確認が必要ない。

  それぞれが大きくて十分に離れており、隣接していないので、手袋をしていても操作は容易で、操作ミスの起きる余地すらない。各表記にもまったく無駄がなくシンプルで明解。見たままの機能であり、全ての操作がワンアクションであり、操作の結果が見たまま残る。UI(ユーザインタフェース)とはかくありたい、と、訴えかけてくる美しい工業デザインなのである。

  最近は、タッチパネルでエアコン操作を行う車種もあるようだが、控えめに言っても最悪だと言えよう。コストダウンという面もあるのだろうが、すべて上記の逆を向いている。自動車において注視が必要になる操作を強いるUIは、間違いなく愚かな設計である。

  んが、調べると、3連ダイヤルによるエアコンの操作パネルは、別にNDロードスターに限らず、同じマツダのデミオもそうだし、ホンダのDC5インテグラや、トヨタのカローラアクシオも類似の操作形態のようだ。面白いのはNBロードスターで、機構の違いからくる差があるものの、配置のコンセプトが同じである。いや、逆だな。NDのパネルが、NBのコンセプトをさらに昇華させたものなんだな。まぁ、すべてのカーエアコンはこの操作に統一すべきだとは言わないが、これを採用しない理由も特段ない気がするんだがな。

  そういえば、自分はプログラマなので、UIを考えることもあるのだが、以前に作ったSwatterという在席表示システムも、気づけば上記の特徴を満たしていた。居場所、状態、コメントとも、操作の結果が見たまま残るデザインとなっている。

  画像の説明

  ちなみに、名前部分を押すと「在席」と「一時離席」がトグルしたり、名前部分をポイントすると、最終更新時刻がポップアップするという、隠し機能もある。これも敢えて意図したもので、「在席」と「一時離席」はプルダウンでも操作できるし、最終更新時刻の確認はそれほど重要でないからだ。知っていればより便利という程度なら学習すればいいことで、それよりは普段使いにおける見た目のシンプルさを優先するべきだと考えた結果である。

  と、そこでふと、デザイナは「デザイン 失敗」でググったりして参考にしたりしないのだろうか、と思いつき、ググってみると、やはりそれらしいページはいくつもあり、その中に以下のようなエレベータの操作パネルのデザインについて指摘しているページがあった。

  画像の説明

  そのページでは、主に「7階」のボタンが直感的でなく押し間違える、という点についての指摘で、その指摘はもっともであると思えるが、それ以外にも問題点は残っている思う。

  自分ならこうする。

  画像の説明

  まず「階」という同じ概念については、同じサイズのボタンを使うべきだ。で、離れた階ならば、ちょっと間隔を離すことでそれを表す。そして、自分なら2列になっているボタンも少し上下にズラすな。そうすることで、階の上下関係を自然に示すことができる。

  で、特に以前から「なんか他にやりようがあるだろ」と思っていたのが、開閉ボタンだ。「開」と「閉」とはあまりに似た文字だし、よくある「>|<」と「<|>」も全然スッと入ってこない。そこで「><」「( )」を提案する。「階」とは違う概念だから丸いボタンを使い、できればサイズも変えるといい。開く方は安全側なのだから、カドのない柔らかい印象にしている。また、左右の位置関係も、扉の右側にパネルがあるなら、扉の動きに合わせて右側に「( )」を配置すべきだ。加えて、子供が閉じ込められる場合を考慮すれば、開閉ボタンは低い位置に配置するのが適切だろう。

  もうひとつ考えてみた。「開」「閉」の文字をイジる。フザけているようだが、もともと「開」「閉」という文字は「門」という象形文字の延長なのであるから、それをさらに延長したまでである。これならば漢字の読めない外国の方でも、スッと理解できるんじゃないかと思う。

  画像の説明

  というわけで、巷には考えていなさすぎるデザインが溢れている。まぁ、人によって感じ方はあるが、要するに俺が考え抜いたUIこそ最強なのだ……という考えが「一番ダメ」だろう。セブンイレブンのコーヒーマシンがよい例である。あれこそが売れっ子デザイナ様の無残過ぎる晒し首だ。

  しかし、んじゃどうすればいいかといえば、おそらく人に意見を求めることが重要なのだと思うが、逆に人の意見を取り入れすぎても、無残なデザインになるような気もせんでもないな……うーむ。


2025-01-27(Mon) シン・DBusで数当てゲーム

 続いて、クライアントや通信キャプチャを試してみたい」というわけで、クライアントを書いてみた。「数当てゲーム」クライアントだ。

#!/usr/bin/env ruby
 
require 'bundler/setup'
require 'dbus'                                                  # bundle add ruby-dbus
 
bus         = DBus::SessionBus.instance
service     = bus['jp.itline.test.Kazuate']
object      = service['/jp/itline/test/Kazuate']
interface   = object['jp.itline.test.Kazuate']
interface_m = object['jp.itline.test.Kazuate.master']
 
puts(interface_m.range(100))
puts(interface.ready)
 
loop {
    print("\nguess> "); guess = $stdin.gets.to_i
    puts(res = interface.try(guess))
    res =~ /congra/i and break
}

  まんま、というほどに、まんま、だ。で、実行すれば、これまた、まんま、だ。

$ ./kazuate_cli.rb
Range is set.
I'm thinking of a number between 1 and 100.
 
guess> 50
Too low!
 
guess> 80
Too low!
 
guess> 90
Too high!
 
guess> 85
Congratulations!

  Linuxサーバにおける大概のトラブルはtcpdumpによる通信キャプチャで切り分けられるので、DBusに対する通信キャプチャも重要だ……と思ってたのが、基本的な使い方がわかったあたりで、当初の問題はDBusと関係なさそうだという雰囲気が見えてきてしまった。

$ dbus-monitor --session
$ dbus-monitor --session --profile

  というわけで、このふたつくらいで終了である。あしからず。