IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

スーパーエンジニアの独り言

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第77回 トリック劇場版2 (藤江一博) 2018年3月

『流星群』:

ある日の出来事です。
夕暮れ時に差し掛かろうとする時刻に晩御飯の買い出しを終えて帰路に着きました。
そのスーパーマーケットからの帰り道にある橋の上でふと空を見上げると、
白みがかった薄い青にオレンジが混ざりかけた曖昧な色合いを背景にして
光の線が描かれていくのを見かけました。
最初はUFOだと勘違い(狂喜乱舞)したのですが、たくさんの光の線が次々と描き出されていきます。
円盤の大襲来ではなくてどうやら流れ星です。大量の流れ星、流星群だと思います。
沢山の流れ星が光の輝きを強めたり弱めたりを繰り返しながら遠くへ去っていきます。
そんな流星群の想い出があった事すら覚えていないのに記憶の部屋から急に出てきました。

 

『ア・ムーン・シェイプト・プール』:

前回(『第76回 月光のムーンライト――――。』)からの続きで「ムーンライト」"Moonlight" と命名したプロジェクトについての回顧録です。

前回に記憶が曖昧ですと書いた部分について確認しようと魂のサルベージを行いました。一度整理して仕舞った引き出しを探して開けるという作業は思いの外、大変でした。
探す手掛りとして手帳にその頃書きなぐったメモを道標に記憶の糸を手繰っていきますと、完全に忘れていた出来事が次々と思い起こされてきました。かなりの量の過去の記憶と体験が引き出しの奥底に埃を被って潜んでいたのです。

「ムーンライト」"Moonlight" の話から更に時を遡ります。JavaOne に出展したいと危峰怪嶺(きほうかいれい)な相談を受ける少し前、二年前の事です。

2003年末頃に Cisco の IP電話に付加価値を添えるためにアプリケーションとの連携を画策したことがありました。Cisco IP Phone とグループウェア(Neo Japan 社製品 desknet's デスクネッツ)を連携する試みです。
当時、この話を鈴木団長経由で持ち込んできたのが青山くんだったと思います。青山くんの同期である龍前さんが筆者の部隊に居たので話が通し易かったのかもしれません。龍前さんから筆者へとたどり着いたお話がたぶん面白そうな話だったので引き受けたのだと思います。
面子は先陣として龍前さんをフロントに配置して筆者がバックエンドを支える布陣で攻めるツーマンセルの戦列をとりました。シスコ製品関連については機材調達を含めて製品主幹である青山部隊に後方支援を頼んでいます。またもう片側の desknet's 関連はエンタープライズの製品主幹メンバーが担当されます。背後に専門の後方支援が二つの合計三組で役割を構成します。

この試み(相談事)を引き受けるにあたっては、システム構成のベースとなる基本機能の確認が先決だと考えていました。
そこで電話機側の Cisco CallManager について情報を集めようと考えましたが、洋書ですらも関連書籍がなくて全く情報がありません。当時はまだ日の目を浴びて僅かばかり経った製品だった様子です。情報はベンダーが公開している僅かな情報がホームページに掲載されているものです。
中身の不明な箱を開ける取っ掛かりとしてシスコが提供する CallManager の SDK (Software Development Kit) をダウンロードして弄り倒してみようと考えました。

SDK でのサンプルコードを片っ端から試していると、どうやら特定の XML (eXtensible Markup Language) を生成して送ると幾つかの操作が出来そうです。
Cisco CallManager で採用していたのは、Administrative XML Layer(AXL)という名称の SOAP (Simple Object Access Protocol) でした。送信できる機能として指定可能な項目をチェックする必要はありますが、これなら何とかなりそうです。そこで思いついたのは、 WebLogic に新規追加された Webサービス生成機能を使ってリクエストを送りつける方策です。

そしてもう一つ触っている時に驚いたのは IP電話の機器自体です。IP電話の内部でHTTP サーバーが動いていることを知ったのです。どうやら電話機と HTTP で直接会話できそうです。これで遠隔操作後にメッセージを電話機送信して画面に表示出来そうです。これは嬉しい発見でした。

面白い機能で早速色々試してみたのですが、 CallManager の SDK に幾つかの不具合がある様子です。想定していた動作が得られないのです。黎明期のSDK ですからしょうがないのですが、修正しないと何にも動きません。観念して SDK の内部を調査するしかないので問題箇所を見つけ出して修正を施したのです。 SDK に手を入れる作業は少し難航したように思いますが、何とか動くように改修が出来ました。

そうすると今度はもう一つ別の問題が浮上しました。まだIP電話がローカライズされていなくて英語しか表示できないことが解りました。IP電話自体に日本語フォントがないために、日本語データを送っても文字化けするだけの寂しい結果だったのです。

折角付いている IP電話の液晶に日本語を表示したいなと思っていたので諦めきれなくて、考えたのが文字を送る代わりに送付側で文字を画像に変換して送りつける作戦です。文字を入力すると画像に変換できるプログラムを実装して WebLogic 側のサーバーサイド・ロジックに自作の変換機能を組み込むことで文字を画像に変換したものを SOAP メッセージに添付して送ることで電話機の液晶にうまく表示が出来ました。液晶に日本語が出ることでインパクトという意味でも意義があったと達成感を味わうことが出来たのです。
完成した基本コンセプトのシステムを desknet's の GUI からコールして貰うために Neo Japan のエンジニアにご協力頂いて連携するためのフック部分を実装して頂きました。

こうして紆余曲折を経ながらも順調に当初のコンセプトを具現化できました。コンセプトを具現化して動作確認が出来る所まで到達できましたので、青山くんを中心としたメンバーの皆さんに後のお披露目はお任せしました。CallManager という大きな箱物をその都度調達するのは大変な労苦ですが、青山チームの尽力で何とか叶いました。

完成した PoC は、Java Technology Conference への出展を果たすことができました。青山くんと龍前さんの二人がこのイベントにアテンドして弊社の季刊誌に掲載されている写真が出て来ました。ブースを囲んだ二人の弾ける様な笑顔が眩しい写真です。この写真が筆者の曖昧な記憶を裏付ける証拠です。
更にその後、社内のポータルサイトに自席の IP Phone にログインできるポートレットもお目見えしました。きっと色々改造した成果でしょう。色々な所に露出して少なからず役に立つ形となったのは、メンバー各位ご尽力の賜物です。
参加させて頂いたことに改めて感謝しています。

 

『太陽とシスコムーン』:

前回の話にまで文脈を戻します。2005年中盤頃のお話しです。

"Sun Ray" と "Cisco IP Phone" の二つを組み合わせたシステムを創って JavaOne という祭典(イベント)に出展したいという相談が筆者に持ちかけられます。
この話が舞い込んだのも以前のIP電話に付加価値をつける PoC の成功体験があったからだと思い出しました。相談を持ち掛けてくれたのが青山くんだというのが間違いない証拠です。

しかし、IP電話の今度の相手役は "Sun Ray" です。グループウェアではなくシンクライアントというシステムです。どっちもよく知らないという意味では一緒なのですが、ちょっと格上の様な気がして少し腰が引けました。

引き受けるに当たって今度の PoC では何をゴールに設定するのかを共有しようと持ちかけました。
つまり、コンセプトです。何か途中で見知らぬプレイヤーが複数介入してきてそれにより様々な思惑が錯綜して霧散するのが怖かったので、最初に方向性を決めたかったのだと思います。

最初の会議で集ったメンバーからコンセプトの発案を問うて下記のような文言に集約しました。

「フリースペースのオフィスでは自由に使えるマシンと電話が
 机の上にずらりと並んでいます。
 空いている席に座って Sun Ray にスマートカードを挿入してログインを行います。
 ログインすると近くにある CISCO IP Phone が自動で同期して自分の電話として使えます。
 そのデスクですぐに作業が始められるのです。」

このコンセプトの動作要件としては、

  1. Sun Ray の端末にログインを行うと、端末の近くにあるIP電話にもログインする。
  2. また異なるカード及び別ユーザでログインを行うと、その異なる該当のユーザでIP電話にもログインする。

これを具現化出来るのか試みる方針としました。

まずはベースとなる基本構造を思案する必要がありますが、それ以前のプロジェクトの経験値から設計にマッピングの仕組みが必要であると直感しました。
その直感を軸にして大枠のアーキテクチャを設計しそのままプロトタイプ実装へと流れ込みました。
逆に両側にあるシステムの技術情報詳細をまったく知らなかったのですが、肝となる技術項目は想像出来ていました。
メンバー各位から機能把握のために機能デモを見せてもらい、両側それぞれのシステムでの大まかな情報を収集出来たからです。
今回は最初からメンバー皆の力量をあてにして猪突猛進で突き進んで行くという作戦です。

早速、最初のラフ・スケッチ(システム構成図)を起こしました(記憶が曖昧な箇所が多いのでその点はご容赦願います)。


PoCでの簡易な機能構成図。
* 機能構成 * 動作のシーケンスで記載を試みる。
カード挿入 + ログイン認証。(CDE起動) ┌─────┐ │Tadpole │SunRay Terminal └───┬─┘クライアント(端末+スマートカード・リーダ) ↑ │ │ │ │ │システム・ログイン要求 │ │ NOT HTTP│ │ │ ↓ ┌┴────┐SunRay Server Software │SRSS │ターミナル・サーバー └──┬──┘ │ │ │ │起動スクリプト組み込み │各ユーザの.dtprofile (call utaction ...) │ マッピングデータベース参照した後に │ MOONLIGHTにアクセスするサーブレットを呼び出す。 │ (現行はTOMCATにてリクエスト送信。) HTTP │ │ │HTTP リクエスト送出。 │リクエスト・パラメータは、全部で3つ。 │ 1. userid : SunRayのログインユーザID │ 2. macaddress : SunRay TerminalのMACアドレス │ 3. wannado : 動作の種類指定。ログインもしくはログアウト。 │ 値は"login","logout" 。 │ │ ↓ ┌─────┐MOONLIGHT │Mapping │ ┌─────┐ │ Process ├─────┤ Database │ └──┬──┘ └─────┘ │ │構成: │ TOMCAT + MySQL │ │機能: │ 対応するユーザIDと物理アドレスに変換。 │ (SunRay Terminal --> IP Phone) │ │処理: │ 詳細はソースコード参照の事。 │ │ HTTP │ │ │HTTP Request │必要なパラメータは、2つ。 │ 1. IP Phone のログインユーザID │ 2. IP Phone のMACアドレス │ (これ以外にCallManagerに要求を送信するために │ 必要な認証情報有。) │ │ ↓ ┌──────┐ │CallManager │IP Phone マネージャ └──┬───┘ │ NOT HTTP │ │ログイン処理。 │SCCP(CISCO独自プロトコル) ↓ ┌─────┐ │IP Phone │IP Phone Device └─────┘

Tadpole: Sun Ray Client Terminal SRSS: Sun Ray Server Software CM: Call Manager

このスケッチを元に各々で検証と実装を進めて行きました。

 

『トリック劇場版2』:

作戦は猪突猛進で突き進んで行く無策です。
これは、招集されたメンバーをあてに出来たからです。

Sun Ray 側には製品主幹であるプラットフォーム部隊の町村さんがいました。頼りになる存在です。
Sun Ray 側での技術要件を設定して貰うだけでなく、ログインイベントのタイミングで中核システム(ムーンライト・サーバー)を叩いてもらうフックを実装して貰います。
町村さんは、教育部に居た後輩の同期で顔見知りでありましたので信頼していました。

Cisco IP Phone には 管理サーバーである Cisco CallManager 経由でログインしますが、Cisco 製品主幹のネットワーク部隊から参加した濱本くんが担当しています。
彼には CallManager のお守りだけでなく、IP Phone にログインを行うサーブレット実装を触ってもらいたいと思いました。
筆者がシステム基本機能を実装した後に必要に応じて彼に変更を施して欲しかったからです。
濱本くんは、Java のことは全く知らなかったみたいなのですが、サンプルコードを書いてあげると直ぐに反応できました。
また筆者のささやかな知識を提供するとすぐに吸収している様に見えました。肝心な箇所だけですが、技術移譲はスムースに行えたと思います。その証拠に後日、彼は自力で改良を施していた様子を聞き及んでいます。
濱本くんを見ていて改めて感じたのは、素直な性格が何より成長出来る鍵だということです。やはり素直が一番です(最初に少し頼りなく思えたのは勘違いでした、すいません)。
天邪鬼(あまのじゃく)な筆者には、彼がとっても眩しく輝いているように見えて羨ましいと感じました。

そして基本構成の鍵となるのは、両サイドを結びつけるマッピング・システムです。

「Sun Ray の端末にログインを行うと、端末の近くにある IP電話にもログインする。」を実現するには、端末と電話を紐付けする仕掛けが必要だからです。
この仕掛けのタネが、Sun Ray と Cisco IP Phone を対応づけるマッピング情報を持ったデータベースを配置するのがこのシステムの「トリック」です(このトリックに、プロジェクト名を冠した「ムーンライト」"Moonlight" サーバーと命名してあります)。
マッピング・システムは、(もし製品化されたらと考慮して)どなたも簡易に配置出来るようにサーブレットエンジンとデータベースだけのシンプルな構成を念頭に製品の選択はオープンソースソフトウェア (Open Source Software, OSS) にして実装は筆者が行いました。

粛々と各々が実装進め各調整と導通テストを経て何とか動くというところまで行った頃だったと思います。
今度はシステムへの負荷テストも行いたいという話しが舞い込んできました。
このシステムで何十人と同時にログインしても大丈夫ですかといった問いだったのだと思います。もっともな話しです。
負荷テストに当たっては、同時に複数のログインを実行しなければならないため、それを模倣出来るテストコードが必要ですし、ログイン先は IP電話なので実際に負荷を測るには何台もの実機が必要であるという難題に突き当たりました。

そこでこれまた教育部時代の後輩でもある渡邊くんを召喚するに至りました。
彼は前の部隊で負荷テストを行うテストツールを担当していたのを思い出したのです。渡邊くんに懇願して重い腰を上げて協力を得ることに成功しました。
次は IP電話の確保ですが、これは主幹でもあった濱本くんに電話機を其処彼処(そこかしこ)から掻き集めて貰いました。
テストには、弊社検証施設の TSC の機材と場所をお借りして寒いマシン部屋の中で渡邊、濱本、筆者の三人が立ち会ってテストを行いました。
寒い部屋、立ち並ぶラックに詰め込まれたマシン、目の前には地べたに置かれた何十台もの電話機が虫の様に並べられています。
寒さで震えながらテストが終わるのを待っている大の男三人は、奇しくも皆、教育部出身者という奇妙な光景です。

こうして PoC は、無事投了出来ました。
コンセプトを具現化するだけでなく想定される負荷を掛けてもちゃんと動きますということまで確認出来たと思います。もしその先のマッピング・システムへの登録管理アプリケーションまで創っていたらですが、売り物(製品)になったかとも思います。

青山くんから聴いた後日譚では、札幌を含めたいくつかのイベントへの出展を行った様です。それらイベント後には用賀の日本サン・マイクロシステムズのショールームに長らく展示されていたそうです。メンバーにとって非常に名誉な事であります。

 

『ムーンライト――――。』:

少し話は遡りまして、相談を持ちかけられてから手は動いていないものの具現化のイメージが整い、逃げないでやろうかなと腹を据えていた初期段階の頃です。
この話しを持ちかけられたメンバー達にこのプロジェクトに名前(コードネーム)を付けましょうと持ちかけると、色々な名前を出してくれました。
皆が名前を付けることで簡単に呼ぶことが出来て、名前を呼ぶたびに愛着が湧くと思ったからです。
これは前回の PoC で名称を付けなかったことを反省していましたので、同じ轍を踏まないために何らかの命名がしたかったのです。

当初の会議で参加メンバーの一人だった濱本くんが「ゼフィランサス(ZEPHYRANTHES)でどうでしょうか?」と言うのです。
命名の由来は「ガンダム試作一号機」(RX-78GP01のコードネームです。ガンダムネタですいません)という提案です。
個人的にガンダムネタは嫌いじゃないですし「試作」の「一号機」という意味で今回のプロトタイプの名前として良くマッチすると思うのです。
でもメンバーには「ガンダム」を知らない人もいるでしょうし、名前からイメージ出来ることが無さそうで意味不明になって求心力を失いそうだったので、小気味良く却下させて頂いた様に思います。
本当は後々に相棒となる彼に命名させたかったのですが、名前が呼び起こすイメージは大事だと考えたからです。
そこで別の候補を探そうとご案内すると他のメンバーからも名称案を複数候補が挙がってきたために投票形式にしましょうよ、という流れの雰囲気になってしまいました。
時間が掛かりそうな何だかとても面倒な心持ちになったように思いますし、このままでは皆の折角の意気込みが霧散しそうだと勘ぐりました。早く決めた方が良いのではと一存で決断しました。
改めて適した名前を筆者が考えることにして付けたコードネームが、「ヴェロニカ(ベロニカ)」じゃなくて「ムーンライト(月光)」です。

理由は、「太陽光」 "Sun Ray" に反射するが如く輝くシスコを「ムーンライト(月光)」"Moonlight" と表現しました。

「月光 ... 太陽光線を反射し、CISCOに生命の影を出現させます。」

これが、コードネーム MOONLIGHT(ムーンライト)の謳い文句です。ちょっと安直かなとも思いましたが、名は体を現すということでピッタリだとおもい込みました。それと "Moonlight" には「こっそり働く」或いは「アルバイトをする」という隠語の意味もあります。別件でも仕事を掛け持ちしていた筆者の命名の裏の意味でもあります。

色々聞いておきながら実質的には独断のゴリ押しで決めた感じです。
愛着が湧く様に「皆さんの好きな名前にしてください。」と言っておきながらです。
皆さんの賛同を得られたのかは不明ですし、反感をかったのかも知れません。
あの頃を振り返ると傍若無人な音頭取りだったなぁと反省しきりです。
でも今でもあんまり変わっていないかとは思います。

 

『月光浴』:

振り返ってみると大きな仕事だけじゃなくて、いつも周りの方々に助けられているなと思い返すばかりです。
流れ星のように通り過ぎて行ってしまった方々に感謝の念ばかりが沸き起こります。

誰と一緒に仕事できるのかが、一番大切に考えていることだと書きましたが、
独りでは出来ないことも相棒が居れば身の丈より高い壁にも登ることが出来ます。

それは誰と一緒に喜びを分かち合えるのかという意味です。
一緒に逆境に直面して眉間に皺を寄せて時には涙を浮かべながら乗り越えた後に、
一緒に褒めて貰って腹を抱えて笑うことが出来るのが幸せなのだと思うからです。

 

「ひとりぼっちはつまらない。」

 

次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes