Google Code Prettify

2007年3月21日

emacs のフレームを仮想ディスクトップの上下左右に飛ばす

FVWM を使っていたころ、実画面のサイズの縦横が定数倍になった仮想ディスクトップとして使える機能があった。

blog20070321_metacity_desktop
当時から 1つの emacs プロセスで複数のフレームを、別々の画面に割り当てて使っていた。Ctrl+十字カーソルで画面を切替えることが出来るので、プログラムを開発するときに結構便利であった。

複数のフレームを配置するとき、何度かキーを叩きマウスぐりぐりするのが、相当面倒だった。

なので、emacs の 1つのキーシーケンスで、複数のフレーム生成して上下左右に飛ばすカスタマイズをしていた。

このカスタマイズが出来たので、 最終的には emacs の8フレーム、ターミナル、ブラウザを配置する形になった(右のイメージ)。

上のカスタマイズの肝は、仮想ディスクトップ上の geometry を指定すれば、任意の位置に配置することが出来ることだった。

FVWM は勿論 afterstep や sawfish の古いバージョンとかに共通した機能だったが、Gnome が標準で使っている metacity では仮想ディスクトップの実現方法がワークスペース?に変わってしまった。

幸いワークスペースは二次元的に配置が出来るので、以前と同様な使いかたが出来る。 唯一出来ないのは、emacs から別のワークスペースにフレームを飛ばすやりかたが分からなかった。

確か、特定のHints の値を変更すれば良かった気がするが、当時追っかけたら、 emacs から変更できる Hintsの型は 文字列だけだったような、そうでないような理由から面倒くさくて、ほったらかしにしていた。

完全に移行出来なかったが、最近 wmctl という外部プログラムを知って、取り組んでみたら上手くいった。

だいぶ幸せだ。

(global-unset-key "\C-z")
(define-key global-map "\C-z51" 'moi::make-frame-3)
(define-key global-map "\C-z52" 'moi::make-frame-6)
(define-key global-map "\C-z50" 'moi::delete-frame-6)

(setq moi::desktop-max-x 4)

(defun moi::move-frame (frame x y)
  (let ((wid (frame-parameter (or frame (selected-frame)) 'outer-window-id))
     (desk (int-to-string (+ (* moi::desktop-max-x y) x))))
    (call-process
     "wmctrl" nil nil nil "-i"
     "-r" wid "-t" desk)))

(defun moi::make-frame (x y)
  (let* ((fpar (frame-parameters))
     (bw  
      (if (string-match "^20" emacs-version)
          (cdr (assoc 'border-width fpar))
        0))
     (left (+ x bw (eval (cdr (assoc 'left fpar)))))
     (top  (+ y bw (eval (cdr (assoc 'top fpar)))))
     (frame (make-frame)))
    (sleep-for 0.09)
    (modify-frame-parameters frame `((top + ,top) (left + ,left) ,(cons 'font "fontset-standard")))
    (sleep-for 0.09)
    frame))

(defun moi::make-frame2 (x y)
  (let ((frame (moi::make-frame 0 0)))
    (moi::move-frame frame (+ x 1) (+ y 2))
    frame))

(defvar moi::make-frame-6-alist nil)

(defun moi::make-frame-3 ()
  (interactive)
  (if (not moi::make-frame-6-alist)
      (setq moi::make-frame-6-alist
        (list
         (moi::make-frame2 1 0)
         (moi::make-frame2 0 1)
         (moi::make-frame2 1 1)
         ))))

(defun moi::make-frame-6 ()
  (interactive)
  (if (not moi::make-frame-6-alist)
      (setq moi::make-frame-6-alist
        (list
         (moi::make-frame2 1 0)
         (moi::make-frame2 -1 0)
         (moi::make-frame2 0 1)
         (moi::make-frame2 0 -1)
         ;;(moi::make-frame2 1 1)
         (moi::make-frame2 -1 1)
         (moi::make-frame2 1 -1)
         (moi::make-frame2 -1 -1)
         ))))

(defun moi::delete-frame-6 ()
  (interactive)
  (while moi::make-frame-6-alist
    (delete-frame (car moi::make-frame-6-alist))
    (setq moi::make-frame-6-alist (cdr moi::make-frame-6-alist))))

2007年3月18日

Pukiwiki の整形ルールの説明は正しいのか?

ここ最近、Pukiwiki ベースの文書を変換するRubyスクリプトを書いているが、Pukiwkiの整形ルールの言ってることがイマイチ正しくない。

例えば、インライン要素の一つである行末に~を書いた行末改行の説明には、「次の行の行頭書式は無効になり」とか記述があるが、そんなことは無いとか、、、等々(2007/03現在)。

だれも、本当の Pukiwiki が受け付ける書式の本当の姿は知らないのかぁ、、、。

ssh の警告?

いつからかは分からないけれども ssh で次のような警告が出ていたようだ。

Warning: No xauth data; using fake authentication data for X11 forwarding.

コンソールでは無視してたと思うが、emacs で M-x svn-status とかでリポジトリが svn+ssh://… の場合に警告として出てきて驚く。

FAQになっているらしく、

xauth generate :0 . trusted

で良いらしい。

2007年3月16日

Eclipse の更新時にミラーを選択するのが面倒

eclipse の更新時にミラーサイトを選択させるダイアログが出るが、今まで手動で選択してきた。とっても面倒だった。

が、設定にミラーを自動的に選択する項目があった。。。ちょっと幸せ

2007年3月15日

Debian/etch で Gnome Power Managerをつかってサスペンドする

Ubuntu で整理されたお陰かどうか分からないが、Power Manager が整理されつつある。そろそろ、Debian/etch でも使えるんでないかとやってみる。

apt-get install acpid acpi-support gnome-power-manager

すると、Gnomeの通知スペースにバッテリ状況を表す電源管理アイコンが表示される。またメニューに出てくる項目を選択すると サスペンド/ハイバネーションが出来るようになる。

で、メニューから選択すると、、、、なんかエラー表示がでて動かない。

エラーの理由が全く示されていないだけでなく、どこにも手掛かりになる情報が示されず、、、FAQのページを確認することを促される。

対処の方法が分かりませんって状態になってしまった。

どっかのログファイルにでも追加情報が出ているのかと思ったが、何もない。 なんとWin○○sっぽくなったのだろうか。

一晩調べてみて、熟考の結果うまく動くようになった。

従来の流れでは、

(acpiのイベント)
=> acpid でフック
=> イベント種別から /etc/acpid/events 以下の設定でスクリプトを選択
=> 大抵 /etc/acpid/suspend.sh が呼ばれる。

なので、 /etc/acpid/suspend.sh を自分のPCに合わせて変更する。

Gnome Power Manager を使う場合は、

(acpiのイベント)
=> acpid でフック
=> acpi-support パッケージにより、キーイベントに変換され、/dev/inputXに渡される。
=> Xサーバ君がキーイベントを受ける
=> gnome-power-manager がキーイベントを受け取り?、
    ディスクトップのユーザ設定に応じて処理を決めて、
    サスペンド/ハイバネーションの要求を dbus 経由でHALに出す。
=> HAL で、スクリプト
   /usr/lib/hal/scripts/linux/hal-system-power-suspend-linux を呼び出す
=> 上記のスクリプトから、acpi-support で作成された /etc/acpid/suspend.sh が呼ばれる

acpi-support を作ってくれる人が頑張ってる限り、なんもしなくても大丈夫なんだなぁ。

HAL側のサスペンド/ハイバネーションのインタフェースorg.freedesktop.Hal.Device.SystemPowerManagement を 呼び出す為には、rootユーザ権限かpowerdevグループ権限が必要である。これは、Debian特有っぽい。

gnome-power-manager がこいつの問題に引っかかって、うまくサスペンドしなかったらしい。 次のコマンドをユーザ権限でサスペンド出来なければ、権限の問題っす。

dbus-send --system --print-reply   --reply-timeout=2000 \
           --dest=org.freedesktop.Hal \
           /org/freedesktop/Hal/devices/computer \
           org.freedesktop.Hal.Device.SystemPowerManagement.Suspend

こいつは、FAQの2番目に上げられている。でも、FAQに載ってるメッセージは出てこないぞ、、、。

対処は、powerdev グループにユーザを追加して再起動。。。ちょっと快適

2007年3月14日

フォント名の冠の HG, HGP, HGS とは?

冠の数文字の英字が異なるだけのフォントが良くある。

HGP平成明朝体
HGS平成明朝体
HG平成明朝体

こいつの違いはなんだ?

リコーが販売しているフォント集とかOffice製品に含まれている。で、解答はFAQにもなっており、

HGP〜 =半角・全角プロポーショナルピッチ
HGS〜 =半角のみプロポーショナルピッチ仕様です。
HG〜 =固定ピッチ

だそうだ。

ついでに serif/sans-serif の違いはひげ付き/ひげ無しなので、 ブラウザに表示用にフォントに設定するとすれば、

serif = HGP/HGS の明朝体
sans-serif = HGP/HGS のゴシック体
monospace = HG のどれか

にすればよさげかなぁ。

AX300 と一緒に LocationFree を使う

ロケフリと騒いでいたあるポットキャストの番組を聞いて以来、耳を離れなくなって、買ってしまった。

で、ロケフリからAVマウスを使ってリモコンで機器を操作できるのだが、今使っている AX300 はリストに含まれていない。その場合、学習リモコンで覚えさせることができる。。。でも、十字キーの方向をワンアクション記憶させるのは出来なく、カーソルの左右移動が複数飛んでしまって、ちょっとダメぽ。

ただ、学習データはPSPの場合、メモリスティックの MSSONY¥LF¥RC_DATA に落とせてば使えるらしい。

まぁ、2011年まで使い切るかなぁ

2007年3月7日

Linux クライアントからIPSec Tunnel接続をする

昨日からの続きで、IPSec-VPNにLinuxクライアントで繋いでみる。

まぁ、Linuxでもやりたいことは、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じだけども、、、 参考なるそうなページを検索すれど、IPSec トランスポートモードだったり、ルータ間のIPSecトンネルだったり、PPTP使っていたりと、イマイチよさげな情報は無し。

基本から組み立てて行かねばなんないのかぁ。

IPSecとは AH + ESP + IPcomp + IKE だそうだが、使う側が理解すべきなのはもっとある。難解なのはウサギとカメの陰謀だと思う。

  • IPSec を利用する通信はどれかを Security Policy Database (SPD)で指定する。このとき transport/tunnel モード等も指定する。
  • IPsec を利用する通信のセキュリティパラメータをSecurity Association Database(SAD)で指定する。暗号化方法や鍵等が含まれる。
  • SPD は setkey ツールで指定する。
  • SAD は setkey ツールを使って手動で指定していできるが、大抵はIKEを利用する。racoonやisakmpd とかのIKEデーモンを使って自動的に指定する。
  • IKEを利用する場合は、事前共有鍵、PKI、Kerberosとかの認証とSAの種別を指定する。

順番に設定すれば良いのだが一番悩むのはIPSecを利用する通信をどう作るのか?

何?禅問答みたいなこと言っているのだろう?

俺もそう思う。

ルータ間の接続では、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータA:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:ルータB:192.168.2.1
<---->
Outer Domain:192.168.2.0/24

になっているので、ルータB 上を通過する通信 192.168.1.0/24 <=> 192.168.2.0/24 が発生させることはそんなに難しいことではない。ルータBがOuter Domainのデフォルトゲートウェイであれば良く、大抵そんなもんだ。

もう一つ心に留める必要があるIPSec Tunnelの挙動として、SPD にマッチした通信は勝手に横取りされて、トンネルで指定された端点間のIPSecのパケットとして流されてしまいます。そう!何処を流れるハズだったには関係なく!!

クライアントPCの場合を同様に考えると、通信を192.168.1.0/24 <=> 192.168.150.201/32 をいかに発生させるかが鍵だと思う(だれもそんなこと言っていないので間違ってるかも)。

ルータAにはRTX1100を使っているので、tunnel デバイスへのルーティングとかは設定してある。

ip route 192.168.150.201 gateway tunnel 1

クライアントPCで、考えられる設定は3種類です(もっとあるかも)。

  • iptunnel を使う方法
  • 疑似デバイス dummy を使う方法
  • ip alias を使う方法

iptunnel を使う方法

iptunnel add ipsec0 mode ipip remote 1.1.1.1
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

実際にはIPSecに横取りされるので、特に ipip 以外でも良く、対向の端点アドレスもなんでも良い。

こいつは良く例に上げられている。FreeBSD/NetBSDの場合 gif0 とか使っている。

疑似デバイス dummy を使う方法

modrpobe dummy
ip link set dummy0 name ipsec0
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

dummyは来るパケットを全部破棄する疑似デバイスで、昔SLIPとかで使っていたみたい。好き者が、ネットワーク検証とかで使っているのしか見たこと無いなぁ。

こいつを使っている例は見たことが無い。偶然出来ただけなのかも。

ip alias を使う方法

ifconfig eth0:1 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 gw 192.168.150.201

こいつを使っている例は見たことが無い。どこかに落とし穴があるかも。

上のどれでも良いと思う。というか推奨とか何処にも書いていない、、、、多分陰謀だ。

本当は、iptunnel の mode にipsec-tunnel とかがあって、SPDにtunnelモードの設定が追加された時点で自動的に追加されるのが親切な気がする。。。

そう言えば RTX1100から、VPN通信用のIPアドレスを動的に割り振れないので、固定して考えていたので3つ上げたが、正当な方法が別にありそうである。。。絶対陰謀だ。

取り敢えず、どれかの方法を決めたあとは簡単

/etc/ipsec-tools.conf で、SPDを作成

#!/usr/sbin/setkey -f
flush;
spdflush;

spdadd 192.168.150.201 192.168.1.0/24 any -P out ipsec
            esp/tunnel/YY.YY.YY.YY-XX.XX.XX.XX/require;

spdadd 192.168.1.0/24 192.168.150.201 any -P in ipsec
            esp/tunnel/XX.XX.XX.XX-YY.YY.YY.YY/require;

/etc/racoon/psk.txt に事前共有鍵を

XX.XX.XX.XX * (RTX1100と同じ文字列)

/etc/racoon/racoon.conf に、IKEデーモンの設定

path pre_shared_key "/etc/racoon/psk.txt"

remote XX.XX.XX.XX {
   exchange_mode aggressive;
   my_identifier fqdn "PCNAME"
   proposal {
       encryption_algorithm aes;
       hash_algorithm md5;
       authentication_method pre_shared_key;
      dh_group modp1024;
   }
}

sainfo anonymous {
    pfs_group modp1024;
    encryption_algorithm aes;
    authentication_algorithm hmac_md5;
}

てな具合で、クライアントPC から Develop Domain に ping を打つと、クライアントPCのログに、

racoon: INFO: initiate new phase 1 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: begin Aggressive mode.
racoon: NOTIFY: couldn't find the proper pskey, try to get one by the peer's address.
racoon: INFO: ISAKMP-SA established YY.YY.YY.YY[500]-XX.XX.XX.XX[500] spi:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
racoon: INFO: initiate new phase 2 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: IPsec-SA established: ESP/Tunnel XX.XX.XX.XX[0]->YY.YY.YY.YY[0] spi=xxxxxxxx(0xXXXXXXX)
racoon: INFO: IPsec-SA established: ESP/Tunnel YY.YY.YY.YY[0]->XX.XX.XX.XX[0] spi=xxxxxxxx(0xXXXXXXX)

が出れば、IPSec Tunnel のできあがり。

2007年3月5日

RTX1100 でIPSec-VPNを構築する

IPSecを使ってVPNを構築をしようとRTX1100を購入したのだが、買った満足感でそんな事をすっかり忘れて放置していた。だが、勿体ないお化けが出てきたので、RTシリーズの設定事例集を参考にIPSec-VPNを設定してみた。

VPNを構築する方法が多々あるようだが、

  • IPSec トランスポートモード
  • IPSec トンネルモード
  • L2TP over IPSec
  • PPTP
  • IP-IP
  • GRE
  • etc

で、今回構築してたのは IPSec トンネルモードっす。

現在のネットワーク構成は、次の通り。

  • ルータはPPPoEによりInternet に接続されている。
  • ルータの配下にはHome/Developのドメインがある。
  • ルータのWAN側には固定のIPアドレスが割り振られている。
  • Home ドメインには192.168.0.0/24 が、Develop ドメインには192.168.1.0/24 が割り振られている。
  • Home, Develop => Internet はルータ上のNAT変換により通信できる。
  • Home, Develop はルータ上で適当なフィルターを切ってある。

blog20070305-network-diagram

で、お外のPCからIPSecでDevelopドメインと疎通できれば良いのだが、 Home ドメインからからIPSec接続でDevelopドメインと疎通しても、 一応目的を達成できる。

クライアントに関しては、Windows とLinuxを考えている。 ついでに言うならば、Windows 用のものはNET-G Secure VPN Clientを既に購入している。ヤマハのVPNクライアントソフトは、こいつのOEM版らしいので、今ならばこいつを使うのも可だと思う。Windows 標準のIPSec では、IKE の mainモードしか対応してないっぽいので、動的IPを持つ場合はうまくいかないそうな。

やりたいことは、端点のクライアントPCに仮想IPアドレスとして192.168.150.201 を付与して、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じかなぁ。

ヤマハの設定例を参考にしてRTX側での設定は、

# インタフェースの設定
ip lan1 address 192.168.0.1/24
ip lan2 address 192.168.1.1/24

# PPPoEの設定
pp select 1
pppoe use lan3
... (ISPに応じた設定、固定IP XX.XX.XX.XX をもらう)
ip pp nat descriptor 1
pp enable 1

# NAT設定
nat descriptor type 1 masquerade
nat descriptor address inner 1 192.168.0.1-192.168.0.254 192.168.1.1-192.168.1.254 192.168.150.201
nat descriptor masquerade static 1 1 192.168.1.1 udp 500
nat descriptor masquerade static 1 2 192.168.1.1 esp

# IKE
ipsec auto refresh on
ipsec ike encryption 1 aes-cbc
ipsec ike group 1 modp1024
ipsec ike pre-shared-key 1 text *    (事前共有鍵)
ipsec ike remote address 1 any
ipsec ike remote name 1 PCNAME      (クライアントの名前)
ipsec sa policy 101 1 esp aes-cbc md5-hmac

# Tunnel 設定
tunnel select 1
ipsec tunnel 101
ip route 192.168.150.201 gateway tunnel 1
tunnel enable 1

ここでは、クライアントの名前を PCNAME で、仮想IPは 192.168.150.201 と考えている。 複数クライアントの同時接続を考えているならば、tunnel 設定を増やしていけば良い。

設定例を参考にパラメータを合わせれば、問題なくVPN接続は疎通する。 はまりポイントとしては、ルータ側のNAT処理の内側アドレスに対向アドレスを追加していないと、インターネットとの疎通が取れなくなる。これは、FAQにもなっており、クライアントソフトの設定でも回避できるそうなぁ。

2007年3月4日

知らぬ間に Raid が再構築!!

Linux のソフトウェアRAIDを使っているファイルサーバが、何故か負荷が高い気がしてたので、ログを見てみると

Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.
Mar  4 01:06:02 aquarius kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reconstruction.
Mar  4 01:06:02 aquarius kernel: md: using 128k window, over a total of 32009408 blocks.
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md3 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md3 has finished resync (they share one or more physical units)
Mar  4 01:14:28 aquarius kernel: md: md0: sync done.
Mar  4 01:14:28 aquarius kernel: md: syncing RAID array md3

って、何か知らんけど、RAID の再構築をなさっておられます!!

可なり焦ったけれども、良くログを見直すとその直前に cron スクリプトが動いてることを発見。

Mar  4 01:06:02 aquarius /USR/SBIN/CRON[27227]: (root) CMD ([ -x /usr/share/mdadm/checkarray ] && [ $(date +%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --all --quiet)
Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.

checkarray とは何ぞや、、、。

なんと、第一日曜日の1:06 に実行される checkarray が冗長性のあるRAIDをエラーチェックするそうな。 Linux君は大雑把なメッセージを吐くので、直ぐには再構築とチェックを区別できないそうな。

詳しく区別したい場合は、

# echo /sys/block/md3/md/sync_action
check

で確認でき、チェックを行っていますねぇ。 HDDが逝ってしまった訳では無いようです。

いつからそんな風になったんだぁ、、、。

2007年3月2日

イヤホンのケーブルの縛り方

イヤホンのケーブルがうねうねして絡まることが多かったが、縛り方のよさげなサイトとを見つけた

2007年3月1日

今更ながらIPv6のアドレス付けとは?

IPv6がぼちぼちコンシューマのサービスレベルまで落ちて来始めたので、再度勉強して見ようかと、ローカルマシン間(A,B)で ping を打ってみました。

A:~# ping6 fe80::222:XXXX:XXXX:XXXX
connect: Invalid argument

あれ、対向のPCのアドレスで間違いないのになぁ

B:~# ifconfig eth0 | grep inet6
inet6 addr: fe80::222:XXXX:XXXX:XXXX/64 Scope:Link

って、エラーだぁ、、、何故だろう。

色々な所で宣伝されているようにIPv6 アドレスは 128 bit であり、全ての機器に一意に割り振ってもまだ余るハズではなかったのか〜〜〜!

実は上の例ではAが複数NICを持ち、Linux の iputils のping6を使っている場合にエラーになる。ただ、inetutils の ping6 では普通に疎通する。実装によりけりである。

IPv6のリンクローカルアドレスと疎通する場合、送受信するインタフェースを指定しなければ一意に通信経路を指定することが出来ないので、追加でスコープ番号(インターフェース番号)を指定するらしい(1)。

分かっている人はチャンと理解して、こっそりほくそ笑んでいることなんだろう。ワシは今までほんと知らなかった。

# ping6 -I eth0 fe80::222:XXXX:XXXX:XXXX
or
# ping6 fe80::222:XXXX:XXXX:XXXX%eth0

実装によってはエラーになったりする、、、なんじゃい。

えっと、サイトローカルは廃止されたんかい、何処へ行けばいいの?

iPod nano を購入

今持っている一世代前の iPod は、Videoが見られなかったり、携帯電話と比べると手に収まりが悪かったり、と不満があった。 なので、今の世代のiPodかnanoを購入しようかと迷ったが、Nike+iPodが使える nano に決めて Apple Store 注文した。

配送業者: BAX GLOBAL PTE LTD

って、海外から配送されるみたい。直接のリンクはないが、お問い合わせ伝票番号からBAXのサイトで Shipment TRACKING してみると、台湾から香港経由で成田に上陸している模様、、、そこから日本の配送業者に送られるのかなぁ。

久しぶりの投稿

かなり期間が空いてしまったが、ブログを再開してみようと思う。 2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。 8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。 その...